В связи с переходом на gtk3 встал вопрос о менеджере буфера обмена. Всякие parcellite и клоны, мягко говоря, дерьмецо. Заточены в основном под gtk2. Да и хренова туча всякой дополнительной лабуды в них мне и в хер не уперлась. Пришлось воротить что-то свое. В принципе, все, что мне нужно – это хранить некую не очень большую историю и иметь возможность выбрать нужный кусок.
В результате родилось следующее. Небольшой скриптик, использующий xclip для управления буферами и fvwm для его периодического дергания и организации меню выбора нужного куска.
Сам скрипт
#! /bin/bash prog="$0" CLIPDIR="${XDG_CACHE_HOME:-$HOME/.cache}/clipboard" CLIPS="primary clipboard" SIZE=25 LENGTH=50 function clip_update { [[ -d $CLIPDIR ]] || mkdir -p $CLIPDIR for c in $CLIPS; do tmpfile=$(mktemp -q --tmpdir clip.XXXXXXXX) xclip -selection "$c" -o > $tmpfile if [[ -s $tmpfile ]]; then md5=$(md5sum $tmpfile | cut -f1 -d' ') [[ -e $CLIPDIR/$md5 ]] || mv -f $tmpfile $CLIPDIR/$md5 fi rm -f $tmpfile done # remove oldest pushd $CLIPDIR &> /dev/null rm -rf $(ls -1t | head -n -$SIZE) popd &> /dev/null } function clip_set { for c in $CLIPS; do xclip -selection "$c" -i "$CLIPDIR/$1" done } function clip_cleanup { [[ -d $CLIPDIR ]] || mkdir -p $CLIPDIR rm -rf $CLIPDIR/* for c in $CLIPS; do echo -n '' | xclip -selection "$c" -i done } function clip_menu { current=$(xclip -o | md5sum | cut -f1 -d' ') echo "DestroyMenu recreate ClipboardMenu" echo "AddToMenu ClipboardMenu Clipboard Title" for f in $(ls -t $CLIPDIR); do line="$(head -n 1 $CLIPDIR/$f)" lsize=${#line} fsize=$(stat --printf='%s' $CLIPDIR/$f) [[ $f == $current ]] && mline="*" || mline=" " if [[ $lsize -lt $fsize || $lsize -ge $LENGTH ]]; then mline+=$(printf '%q' "${line:0:$LENGTH}") mline+="..." else mline+=$(printf '%q' "$line") fi echo "AddToMenu ClipboardMenu \"$mline\" Exec exec $prog set $f" done echo "AddToMenu ClipboardMenu \"\" Nop" echo "AddToMenu ClipboardMenu \"&Clear clipboard%clear.png%\" Exec exec $prog clear" } case $1 in update) clip_update ;; set) clip_set $2 ;; clear) clip_cleanup ;; menu) clip_menu ;; *) exit 1 ;; esac
Интеграция с FVWM
Добавление периодической задачи
AddToFunc StartFunction Schedule Periodic 500 Exec exec $[FVWM_LIBDIR]/clipman.sh update
Добавление меню
AddToMenu ClipboardMenu DynamicPopupAction PipeRead "$[FVWM_LIBDIR]/clipman.sh menu"
Вызов меню по нажатию Ctrl+Alt+H
Key H A CM Menu ClipboardMenu Root c c
$[FVWM_LIBDIR]
– это переменная окружения с путем к каталогу, где лежит скрипт
Все получилось достаточно просто и удобно (по крайней мере для меня)
годно, хотя при таком разрешении удобней боковая панель, вертикальное пространство дефицит
кстати, ещё не видел ни одной хорошей темы с горизонтальной панелью, даже в новом fvwm-crystal (
только крыска спасает
http://i80.fastpic.ru/big/2016/0828/b0/88c9b303a702ad241c813cee99e5a1b0.png
панель вверху – привычка