Wklejanie ze schowka do powłoki zsh lub bash z obsługą vi

15

Chciałbym mieć możliwość wklejenia ze schowka systemowego (lub zaznaczania tekstu) do mojego „podobnego do vi” polecenia powłoki za pomocą klawiatury. Zwykle używam zsh i czasami bash. W obu przypadkach mam powłokę skonfigurowaną z zachowaniem podobnym do vi ( bindkey -v/ set -o vi).

W vimie zachowanie, którego szukam, jest dostępne z sekwencją klawiszy "+p. Jednak ta szczególna sekwencja klawiszy nie działa zgodnie z oczekiwaniami w wierszu poleceń powłoki z obsługą vi. Czy jest jakiś sposób, aby włączyć to lub podobne zachowanie, używając tylko klawiatury, pozostając przy skrótach klawiszowych vi w wierszu poleceń powłoki zsh lub bash?

-- edytować --

Przypadek użycia: często nawiguję między Firefoksem z dodatkiem Pentadactyl , emulatorem terminala i samym vimem - używając menedżera okien Xmonada z niestandardowymi klawiszami do poruszania się. Wszystkie trzy programy mają podobne do vi skróty klawiszowe, co jest bardzo wydajne (dla „pamięci palców”), więc idealnie byłoby komunikować tekst między nimi tylko przy użyciu składni vim (lub bardzo podobnej).

Dalker
źródło

Odpowiedzi:

9

Zsh nie obsługuje nic poza rejestrami wewnętrznymi, a bash nie obsługuje rejestru w ogóle, o ile wiem. Ogólnie rzecz biorąc, powłoki obsługują polecenia vi, a nie polecenia vim.

W Zsh, oto dowód koncepcji dostępu do wyboru X z trybu poleceń. Do prawdziwego użytku chciałbyś rozwinąć te techniki. Korzystam z xselprogramu, możesz xclipzamiast tego użyć ; zobacz Jak kopiować z jednej instancji vima do drugiej za pomocą rejestrów . Funkcje, których użyłem w instrukcji 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

Funkcja vi-append-x-selectionwstawia bieżące zaznaczenie X za kursorem (podobnie do plub P). Funkcja vi-yank-x-selectionkopiuje ostatnio zabity lub szarpany tekst do zaznaczenia X. zle -Ndeklaruje funkcje jako widżety zle (tj. polecenia edycji). bindkey -austawia wiązania dla trybu komend vi.

Gilles „SO- przestań być zły”
źródło
xselDziała to doskonale po zainstalowaniu i skopiowaniu sugerowanego kodu z niewielką modyfikacją mojego .zshrc (wybrałem „^ P” zamiast „^ X”, zastępując oryginalne zachowanie „^ P”)
Dalker
4

Oto rozwiązanie dla zsh (tryb vi), które otacza oryginalne widżety, aby schowek był zawsze zsynchronizowany

Zamień xclipna preferowane narzędzie schowka.

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
olejorgenb
źródło
To działa jak urok xterm-termite.
Rotareti
3

Wybór i schowek to różne rzeczy w X Window, a „środowiska pulpitu” IMHO sprawiają, że problem jest jeszcze bardziej mętny niż był.

Czy wstawka zmiany biegów działa dla Ciebie? W aplikacjach typu X nie jest konieczne wklejenie zaznaczenia po utworzeniu takiego powiązania.

AProgrammer
źródło
Wybór i schowek różni się w tym przypadku, tak naprawdę nie ma znaczenia, rozwiązanie, które działa z jednym, byłoby łatwe do dostosowania do drugiego. Środowiska pulpitu nic nie zmieniają; ich rozprzestrzenienie towarzyszyło przesunięciu równowagi sił od wyboru w kierunku schowka.
Gilles „SO - przestań być zły”
shift-insert działa w moim środowisku i na pewno dobrze jest wiedzieć, do użytku w innym systemie. Szukam jednak czegoś bliższego faktycznym skrótom klawiszowym vim dla szarpnięcia i / lub wklejenia między terminalami, samego vima i innych programów
Dalker
1

To rozwiązanie działa, jeśli zainstalowałeś oh-my-zshi włączyłeś vi-mode wtyczkę.

Rozwiązanie Gillesa xseli zleoparte na mnie nie działało dla mnie. Ponieważ jednak skonfigurowałem vima do domyślnego używania mojego schowka systemowego ( set clipboard=unnamedplusin ~/.vimrc), po prostu wpisuję vterminalny tryb normalny, aby otworzyć bieżące polecenie, vima następnie mogę skopiować je do schowka X za pomocą dowolnego vimpolecenia yank.

joelostblom
źródło
Jak to się ma do ZSH? Czy mówisz o osadzeniu :termdostępnym w nowych wersjach Neovim i Vim?
Doron Behar,
@DoronBehar Jeśli masz włączony tryb vi w zsh, możesz pisać vw trybie normalnym, aby edytować aktualnie wpisane polecenie w vimie zamiast w wierszu poleceń terminalu.
joelostblom
Powinieneś wspomnieć o tym, że mówisz o funkcji Neovima i Vima :termw swojej odpowiedzi, w przeciwnym razie nie jest to wcale jasne.
Doron Behar
@DoronBehar Nie mówię :term. Odkryłem jednak, że funkcjonalność, o której mowa, jest faktycznie zapewniana przez oh-my-zsh. Odpowiednio zaktualizowałem odpowiedź.
joelostblom