zsh copia e cola como emacs

10

Tenho notado que o zsh tem muitas coisas que vejo no emacs. Eu posso fazer uma seleção com ctrl + space e selecionando uma região. Eu posso fazer cópias assim como no emacs enquanto eu fico dentro do zsh. No emacs eu posso usar minha área de transferência do sistema (anteriormente com algumas configurações adicionais necessárias, mas isso funciona imediatamente no emacs). Em zsh eu não consigo colar da minha área de transferência usando C-y e copiar de zsh para o meu sistema cliipboard tem o mesmo problema. Existe uma maneira de contornar isso?

    
por Silverrocker 15.10.2012 / 23:12

3 respostas

11

O Zsh's possui uma área de transferência interna que não se comunica com outros aplicativos. Como é muito legível, você pode fazer com que ele se comunique com algumas linhas no seu ~/.zshrc . Você precisará do xclip ou do xsel . Consulte Colando da área de transferência para o vi habilitado para zsh ou bash para uma prova de conceito no modo vi. Aqui está o código correspondente para o modo emacs (você provavelmente desejará fazer algo semelhante a outros kill-* widgets).

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

Isto usa a área de transferência X11 (normalmente acessada com Ctrl + C / Ctrl + V ); remova a opção -b para usar a seleção primária do X11 (cópia automática ao selecionar e cole com o botão do meio do mouse).

    
por 15.10.2012 / 23:44
3

Eu estava querendo integrar o buffer de corte do Zsh com a área de transferência do X. Eu tentei o link acima mencionado, mas achei que não gostava de ter todas as minhas operações Zsh preenchendo a área de transferência. Por exemplo, às vezes eu copiava algo em um navegador e depois ia para um shell, editava a linha de comando e depois colava. Mas, freqüentemente, editar a linha de comando - excluir uma palavra, por exemplo - modifica o buffer de corte do Zsh. Para melhor ou para pior, X tem apenas uma área de transferência, não um anel de kill, então quando uma operação de edição Zsh sobrescreve a área de transferência, a coisa que eu queria colar é perdida - não consigo arrancar (Cy My) fazer em Zsh ou Emacs.

Então, o que eu fiz foi criar novas combinações de teclas especiais para interagir com a área de transferência do X por meio do zsh. Acontece que "^ Xw" e "^ Xy" não são usados tanto no Emacs quanto no Zsh, então eu posso obter uma interface consistente ligando-os em ambos os aplicativos. Desta forma, as operações normais de edição, cutbuffer e kill ring são deixadas em paz. Se eu quiser copiar algo para a área de transferência, defino a região e faço "^ Xw" (ou se já a matei e a região estiver inativa, posso fazer "^ Xw" para copiar o buffer de corte). Colar da área de transferência é feito com "^ 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
    
por 01.08.2015 / 23:15
1

Você pode querer dar uma olhada no link que, além de adicionar suporte ao mouse, também tenta interagir com o X Área de Transferência.

    
por 15.10.2012 / 23:37

Tags