zsh kopiuj i wklej jak emacs

10

Zauważyłem, że zsh ma wiele rzeczy, które widzę w emacs. Mogę dokonać wyboru za pomocą Ctrl + spacja i wybranie regionu. Mogę robić kopie tak jak w emacsie, gdy jestem w Zsh. W emacsie mogę korzystać ze schowka systemowego (wcześniej wymagała dodatkowej konfiguracji, ale teraz działa to natychmiast po emacsie). W Zsh nie mogę wkleić ze schowka za pomocą Cy, a kopiowanie z Zsh na mój system Cliipboard ma ten sam problem. Czy jest na to jakiś sposób?

Silverrocker
źródło

Odpowiedzi:

11

Zsh ma wbudowany schowek, który nie komunikuje się z innymi aplikacjami. Ponieważ jest bardzo skryptowalny, możesz sprawić, by komunikował się z kilkoma liniami w twoim ~/.zshrc. Będziesz potrzebował xclip lub xsel . Zobacz Wklejanie ze schowka do powłoki zsh lub bash z obsługą vi, aby sprawdzić poprawność koncepcji w trybie vi. Oto odpowiedni kod dla trybu emacs (prawdopodobnie będziesz chciał zrobić coś podobnego do innych kill-*widżetów).

x-copy-region-as-kill () {
  zle copy-region-as-kill
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-copy-region-as-kill
x-kill-region () {
  zle kill-region
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-kill-region
x-yank () {
  CUTBUFFER=$(xsel -o -b </dev/null)
  zle yank
}
zle -N x-yank
bindkey -e '\ew' x-copy-region-as-kill
bindkey -e '^W' x-kill-region
bindkey -e '^Y' x-yank

Wykorzystuje to schowek X11 (zwykle dostępny za pomocą Ctrl+ C/ Ctrl+ V); usuń -bopcję używania głównego wyboru X11 zamiast tego (automatyczne kopiowanie przy zaznaczeniu i wklej środkowym przyciskiem myszy).

Gilles „SO- przestań być zły”
źródło
Jeśli używasz trybu vi, wystarczy wymienić kill-regionze vi-deletei yankze vi-put-afteretc. Podobnie owinąć vi-yanki inni. (Nie znalazłem sposobu, aby zrobić to bardziej centralnie)
olejorgenb,
4

Chciałem zintegrować bufor cięcia Zsha ze schowkiem X. Próbowałem wyżej wspomnianego http://stchaz.free.fr/mouse.zsh, ale okazało się, że nie podobało mi się, że wszystkie moje operacje Zsh wypełniają schowek. Na przykład czasami kopiowałem coś w przeglądarce, a następnie przechodziłem do powłoki i edytowałem wiersz poleceń, a następnie wklejałem. Ale często edycja wiersza poleceń - na przykład usunięcie słowa - modyfikuje bufor cięcia Zsh. Na lepsze lub gorsze, X ma tylko schowek, a nie pierścień zabijania, więc gdy operacja edycji Zsh nadpisze schowek, rzecz, którą chciałem wkleić, zostaje utracona - nie mogę szarpać go (Cy My) tak, jak mogłem zrobić w Zsh lub Emacs.

Zamiast tego stworzyłem nowe specjalne skróty klawiszowe do interakcji ze schowkiem X poprzez Zsh. Okazuje się, że „^ Xw” i „^ Xy” są nieużywane zarówno w Emacsie, jak i Zsh, więc mogę uzyskać spójny interfejs, wiążąc je w obu aplikacjach. W ten sposób normalne operacje edycji, bufor odcinania i pierścień zabicia są pozostawione same sobie. Jeśli chcę skopiować coś do schowka, ustawiam region i robię „^ Xw” (lub jeśli już go zabiłem, a region jest nieaktywny, mogę po prostu zrobić „^ Xw”, aby skopiować bufor cięcia). Wklejanie ze schowka odbywa się za pomocą „^ Xy”.

# define commands to copy and paste x clipboard

# ^Xw - copy region, or cut buffer
# ^Xy - paste x clipboard

# in both cases, modifies CUTBUFFER

copy-to-xclip() {
    [[ "$REGION_ACTIVE" -ne 0 ]] && zle copy-region-as-kill
    print -rn -- $CUTBUFFER | xclip -selection clipboard -i
}

zle -N copy-to-xclip
bindkey "^Xw" copy-to-xclip

paste-xclip() {
    killring=("$CUTBUFFER" "${(@)killring[1,-2]}")
    CUTBUFFER=$(xclip -selection clipboard -o)
    zle yank
}

zle -N paste-xclip
bindkey "^Xy" paste-xclip
Metamorficzny
źródło