Colagem da área de transferência no shell zsh ou bash ativado para vi

15

Gostaria de poder colar da área de transferência do sistema (ou seleção de texto) no meu prompt de shell "vi-like" usando o teclado. Eu normalmente uso zsh e às vezes bash. Nos dois casos, eu tenho o shell configurado com um comportamento semelhante ao vi ( bindkey -v/ set -o vi).

No vim, o comportamento que estou procurando está disponível com a sequência de teclas "+p. Porém, essa sequência de teclas específica não funciona como esperado em um prompt de shell habilitado para vi. Existe alguma maneira de habilitar esse comportamento ou um comportamento semelhante, usando apenas o teclado, mantendo as combinações de teclas do tipo vi em um prompt do zsh ou do bash shell?

- editar -

Caso de uso: eu geralmente navego entre o Firefox com o complemento Pentadactyl , um emulador de terminal e o próprio vim - usando o gerenciador de janelas do Xmonad com chaves personalizadas para navegar. Todos os três programas têm combinações de teclas semelhantes a vi, o que é muito eficiente (para "memória digital"), portanto, seria ideal comunicar o texto entre eles usando a sintaxe vim (ou uma sintaxe muito semelhante).

Dalker
fonte

Respostas:

9

O Zsh não suporta nada além de registros internos, e o bash não suporta registro, tanto quanto eu sei. Em geral, os shells suportam comandos vi, não comandos vim.

No zsh, aqui está uma prova de conceito para acessar a seleção X no modo de comando. Para uso real, você gostaria de elaborar essas técnicas. Eu uso o xselprograma, você pode usar xclip; consulte Como copiar de uma instância do vim para outra usando registradores . Você encontrará os recursos que usei no manual do 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

A função vi-append-x-selectioninsere a seleção X atual após o cursor (semelhante a pou P). A função vi-yank-x-selectioncopia o último texto morto ou arrancado para a seleção X. zle -Ndeclara as funções como widgets zle (isto é, comandos de edição). bindkey -adefine ligações para o modo de comando vi.

Gilles 'SO- parar de ser mau'
fonte
Isso funcionou perfeitamente depois de instalar xsele copiar o código sugerido com uma pequena modificação no meu .zshrc (eu escolhi '^ P' em vez de '^ X', substituindo o comportamento original de '^ P')
Dalker
4

Aqui está uma solução para o zsh (modo vi) que agrupa os widgets originais para que a área de transferência esteja sempre sincronizada

Substitua xclippor sua ferramenta preferida da área de transferência.

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
fonte
Isso funciona como um encanto xterm-termite.
Rotareti 29/01/19
3

Seleção e área de transferência são coisas diferentes no X Window, e os "ambientes de desktop" do IMHO tendem a tornar o problema ainda mais obscuro do que era.

Shift-insert funciona para você? Em aplicativos X bare, é possível colar a seleção quando essa ligação é feita.

AProgrammer
fonte
A seleção e a área de transferência diferentes não são realmente relevantes aqui, uma solução que funcione com uma seria fácil de se adaptar à outra. Os ambientes de desktop não mudam nada; sua expansão acompanhou uma mudança no equilíbrio de poder da seleção e na direção da área de transferência.
Gilles 'SO- stop be evil' em
shift-insert funciona no meu ambiente e é definitivamente bom saber, para uso em um sistema diferente. Eu estou olhando no entanto, para algo mais próximo de keybindings vim reais para arrancar e / ou colar entre terminais, vim a si mesmo e outros programas
Dalker
1

Esta solução funciona se você instalou oh-my-zshe ativou o vi-mode plug - in.

Gilles' xsele zlesolução baseada não funcionou para mim. No entanto, desde que eu tenha configurado vim a usar a minha prancheta sistema por padrão ( set clipboard=unnamedplusem ~/.vimrc), eu simplesmente digitar vno modo normal terminal para abrir o comando atual em vime então eu posso copiá-lo para o X-prancheta com qualquer um dos vimcomandos arranco.

joelostblom
fonte
Como isso está relacionado ao ZSH? Você está falando sobre o incorporado :termdisponível nas novas versões do Neovim e Vim?
Doron Behar
@DoronBehar Se você tiver o modo vi ativado no zsh, poderá digitar vno modo normal para editar o comando atualmente digitado no vim, em vez de no prompt do terminal.
Joelostblom
Você deve mencionar o fato de que você está falando sobre Neovim do e do Vim :termrecurso na sua resposta, caso contrário, não é de todo claro.
Doron Behar
@DoronBehar Não estou falando :term. No entanto, descobri que a funcionalidade a que estou me referindo é realmente fornecida por oh-my-zsh. Eu atualizei a resposta de acordo.
Joelostblom 27/08/18