FVWM и буфер обмена

В связи с переходом на 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] — это переменная окружения с путем к каталогу, где лежит скрипт

Ну и как это выглядит
screenshot

Все получилось достаточно просто и удобно (по крайней мере для меня)

FVWM и буфер обмена: 3 комментария

  1. годно, хотя при таком разрешении удобней боковая панель, вертикальное пространство дефицит
    кстати, ещё не видел ни одной хорошей темы с горизонтальной панелью, даже в новом fvwm-crystal (
    только крыска спасает

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *