Colando da área de transferência para shell zsh ou bash habilitado para vi

14

Gostaria de poder colar da área de transferência do sistema (ou seleção de texto) no meu shell "vi-like" usando o teclado. Eu costumo usar zsh e às vezes bater. Em ambos os casos, eu tenho o shell configurado com o comportamento do tipo vi ( bindkey -v / set -o vi ).

No vim, o comportamento que estou procurando está disponível com a seqüência de teclas "+p . Essa seqüência de teclas específica não funciona como esperado em um prompt do shell habilitado para o VI. Existe alguma maneira de ativar isso ou um comportamento semelhante, usando apenas o teclado, permanecendo com atalhos de teclado do tipo vi em um prompt de shell zsh ou bash?

- editar -

Caso de uso: Eu costumo navegar entre o Firefox com o addon Pentadactyl , um emulador de terminal e o próprio vim - usando o Xmonad gerenciador de janelas com teclas personalizadas para se movimentar. Todos os três programas possuem atalhos de teclado semelhantes ao vi, o que é muito eficiente (para "memória digital"), então seria ideal comunicar o texto entre eles usando a sintaxe vim (ou uma sintaxe muito similar) apenas.

    
por Dalker 30.11.2011 / 11:42

4 respostas

8

O Zsh não suporta nada além de registradores internos, e o bash não suporta o 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 sobre essas técnicas. Eu uso o programa xsel , você pode usar xclip ; consulte Como copiar de uma instância 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-selection insere a seleção X atual após o cursor (semelhante a p ou P ). A função vi-yank-x-selection copia o último texto morto ou arrancado para a seleção X. zle -N declara as funções como widgets zle (ou seja, comandos de edição). bindkey -a define ligações para o modo de comando do VI.

    
por 01.12.2011 / 02:38
4

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

Substitua xclip pela 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
    
por 05.09.2017 / 18:28
3

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

O shift-insert funciona para você? Em aplicativos X vazios, ele está vinculado a colar a seleção quando essa ligação é feita.

    
por 30.11.2011 / 13:18
1

Esta solução funciona se você instalou oh-my-zsh e ativou o vi-mode plugin.

A solução baseada em xsel e zle de Gilles não funcionou para mim. No entanto, como configurei o vim para usar a área de transferência do sistema por padrão ( set clipboard=unnamedplus in ~/.vimrc ), simplesmente digite v no modo normal do terminal para abrir o comando atual em vim e Eu posso copiá-lo para a área de transferência X com qualquer um dos comandos vim yank.

    
por 09.03.2016 / 03:36