copie e cole o zsh como emacs

10

Percebi que o zsh tem muitas coisas que vejo no emacs. Posso fazer uma seleção com ctrl + space e selecionar uma região. Posso fazer cópias como no emacs enquanto permaneço dentro do zsh. No emacs, posso usar a área de transferência do sistema (anteriormente com algumas configurações adicionais necessárias, mas isso funciona imediatamente agora no emacs). No zsh, não consigo colar da minha área de transferência usando o Cy e copiar do zsh para o painel do meu sistema tem o mesmo problema. Existe uma maneira de contornar isso?

Silverrocker
fonte

Respostas:

11

O Zsh's possui uma área de transferência interna que não se comunica com outros aplicativos. Como é muito programável, você pode se comunicar com algumas linhas no seu ~/.zshrc. Você precisará do xclip ou xsel . Consulte Colar da área de transferência no zsh ou no bash shell ativado para vi para obter uma prova de conceito no modo vi. Aqui está o código correspondente ao 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

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

Gilles 'SO- parar de ser mau'
fonte
Se você usa o modo vi, basta substituir kill-regionpor vi-deletee yankcom vi-put-afteretc. Da mesma forma vi-yank, envolva e outros. (Eu não encontrei uma maneira de fazê-lo mais centralmente)
olejorgenb
4

Eu queria integrar o buffer de corte do Zsh à área de transferência do X. Tentei o http://stchaz.free.fr/mouse.zsh acima mencionado, mas descobri que não gostava de todas as minhas operações Zsh preencherem a área de transferência. Por exemplo, às vezes eu copiava algo em um navegador e, em seguida, acessava um shell, editava a linha de comando e colava. Mas frequentemente editar a linha de comando - excluindo uma palavra, por exemplo - modifica o buffer de corte Zsh. Para o bem ou para o mal, o X apenas possui uma área de transferência, não um anel de extermínio; portanto, quando uma operação de edição do Zsh sobrescreve a área de transferência, o que eu queria colar é perdido - não consigo puxar (Cy My) como pude faça no Zsh ou no Emacs.

Então, o que fiz foi criar novas combinações de teclas especiais para interagir com a área de transferência do X através do zsh. Acontece que "^ Xw" e "^ Xy" não são usados ​​no Emacs e no Zsh, para que eu possa obter uma interface consistente vinculando-os nos dois aplicativos. Dessa forma, as operações normais de edição, cutbuffer e kill ring são deixadas em paz. Se quiser copiar algo para a área de transferência, defino a região e faço "^ Xw" (ou se já o matei e a região está inativa, basta fazer "^ Xw" para copiar o buffer de corte). A colagem da área de transferência é feita 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
Metamórfico
fonte
1

Você pode dar uma olhada em http://stchaz.free.fr/mouse.zsh que, além de adicionar suporte ao mouse, também tenta interagir com a área de transferência do X.

Stéphane Chazelas
fonte