Вставлення з буфера обміну до zsh або bash shell


15

Мені хотілося б мати змогу вставити з буфера обміну системи (або виділення тексту) у моєму підказку "vi-like" оболонки за допомогою клавіатури. Я зазвичай використовую zsh, а іноді і bash. В обох випадках у мене оболонка налаштована з подібною поведінкою ( bindkey -v/ set -o vi).

In vim, поведінка, яку я шукаю, доступна з послідовністю ключів "+p. Однак ця конкретна послідовність ключів не працює, як очікувалося, у вікні-підказці оболонки, що підтримується vi. Чи є якийсь спосіб ввімкнути цю чи подібну поведінку, використовуючи лише клавіатуру, залишаючись з vi-подібними клавіатурними зв’язками в запиті zsh або bash shell?

- редагувати -

Випадок використання: Я часто переміщуюся між Firefox за допомогою додатка Pentadactyl , емулятора терміналу та самого vim - використовуючи диспетчер вікон Xmonad із спеціальними клавішами для переміщення. Всі три програми мають vi-подібні клавіші, що дуже ефективно (для «пам’яті пальців»), тому було б ідеально передавати текст між ними, використовуючи лише синтаксис vim (або дуже подібний синтаксис).

Відповіді:


9

Zsh не підтримує нічого, крім внутрішніх регістрів, а bash взагалі не підтримує регістр, наскільки я знаю. За великим рахунком, оболонки підтримують команди vi, а не команди vim.

У zsh, ось доказ концепції доступу до вибору X з командного режиму. Для реального використання ви хочете детальніше розглянути ці методи. Я використовую xselпрограму, ви можете використовувати xclipзамість цього; див. Як скопіювати один екземпляр vim в інший за допомогою регістрів . Ви знайдете функції, які я використав у посібнику з zle .

vi-append-x-selection () { RBUFFER=$(xsel -o -p </dev/null)$RBUFFER; }
zle -N vi-append-x-selection
bindkey -a '^X' vi-append-x-selection
vi-yank-x-selection () { print -rn -- $CUTBUFFER | xsel -i -p; }
zle -N vi-yank-x-selection
bindkey -a '^Y' vi-yank-x-selection

Функція vi-append-x-selectionвставляє поточний вибір X після курсору (подібний до pабо P). Функція vi-yank-x-selectionкопіює останній убитий або пошкоджений текст у вибір X. zle -Nдекларує функції у вигляді віджетів zle (тобто команд видання). bindkey -aвстановлює прив’язки для режиму командування vi.


Це прекрасно спрацювало після встановлення xselта копіювання запропонованого коду з невеликою зміною до мого .zshrc (я вибрав "^ P" замість "^ X",
замінивши

4

Ось рішення для режиму zsh (vi), який обгортає оригінальні віджети, щоб буфер обміну завжди синхронізувався

Замініть xclipпотрібний інструмент буфера обміну.

function x11-clip-wrap-widgets() {
    # NB: Assume we are the first wrapper and that we only wrap native widgets
    # See zsh-autosuggestions.zsh for a more generic and more robust wrapper
    local copy_or_paste=$1
    shift

    for widget in $@; do
        # Ugh, zsh doesn't have closures
        if [[ $copy_or_paste == "copy" ]]; then
            eval "
            function _x11-clip-wrapped-$widget() {
                zle .$widget
                xclip -in -selection clipboard <<<\$CUTBUFFER
            }
            "
        else
            eval "
            function _x11-clip-wrapped-$widget() {
                CUTBUFFER=\$(xclip -out -selection clipboard)
                zle .$widget
            }
            "
        fi

        zle -N $widget _x11-clip-wrapped-$widget
    done
}


local copy_widgets=(
    vi-yank vi-yank-eol vi-delete vi-backward-kill-word vi-change-whole-line
)
local paste_widgets=(
    vi-put-{before,after}
)

# NB: can atm. only wrap native widgets
x11-clip-wrap-widgets copy $copy_widgets
x11-clip-wrap-widgets paste  $paste_widgets

Це працює як принадність у xterm-termite.
Ротарети

3

Вибір та буфер обміну - це різні речі під X Window, і IMHO "настільні середовища", як правило, роблять проблему ще більш каламутною, ніж це було.

Чи працює вставка shift? Для голих додатків X він зобов’язаний вставляти вибір, коли робиться таке прив'язка.


Вибір та буфер обміну відрізняються тут насправді не актуально, рішення, яке працює з одним, було б легко адаптуватися до іншого. Настільні середовища нічого не змінюють; їх поширення супроводжувалося зрушенням балансу сил від вибору та до буфера обміну.
Жил "ТАК - перестань бути злим"

shift-insert працює в моєму середовищі, і це, безумовно, добре знати, для використання в іншій системі. Однак я шукаю щось ближче до фактичних прив'язок клавіш vim для yank та / або вставки між терміналами, самим vim та іншими програмами
Dalker

1

Це рішення працює, якщо ви встановили oh-my-zshта включили vi-mode плагін.

Жиль xselі zleрішення на основі не працює для мене. Однак, оскільки я налаштував vim використовувати мій системний буфер обміну за замовчуванням ( set clipboard=unnamedplusin ~/.vimrc), я просто наберіть vв звичайному термінальному режимі, щоб відкрити поточну команду, vimі тоді я можу скопіювати її в X-буфер обміну за допомогою будь-якої vimкоманди yank.


Як це пов’язано із ZSH? Ви говорите про вбудований :termдоступний у нових версіях Neovim та Vim?
Дорон Бехар

@DoronBehar Якщо увімкнено режим vi в режимі zsh, ви можете ввести vв звичайному режимі для редагування поточно набраної команди всередині vim, а не в термінальному підказці.
joelostblom

Вам слід згадати той факт, що ви говорите про особливості Неовіма та Віма :termу своїй відповіді, інакше це зовсім не ясно.
Дорон Бехар

@DoronBehar Я не говорю :term. Однак я виявив, що функціонал, про який я маю на увазі , насправді забезпечується oh-my-zsh. Відповідно я оновив відповідь.
joelostblom
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.