zsh copiar y pegar como emacs

10

He notado que zsh tiene muchas cosas que veo en emacs. Puedo hacer una selección con ctrl + espacio y seleccionando una región. Puedo hacer copias como en emacs mientras permanezco dentro de zsh. En emacs, puedo usar el portapapeles de mi sistema (anteriormente se necesitaba una configuración adicional, pero ahora funciona de forma inmediata en emacs). En zsh parece que no puedo pegar desde mi portapapeles usando Cy y copiar de zsh a mi cliipboard del sistema tiene el mismo problema. ¿Hay alguna forma de evitar esto?

Silverrocker
fuente

Respuestas:

11

Zsh's tiene un portapapeles incorporado que no se comunica con otras aplicaciones. Como es muy programable, puede hacer que se comunique con unas pocas líneas en su ~/.zshrc. Necesitarás xclip o xsel . Consulte Pegar desde el portapapeles a zsh o bash shell habilitado para vi para obtener una prueba de concepto en modo vi. Aquí está el código correspondiente para el modo emacs (probablemente querrá hacer algo similar a otros 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

Esto utiliza el portapapeles X11 (normalmente se accede con Ctrl+ C/ Ctrl+ V); elimine la -bopción de usar la selección primaria X11 en su lugar (copia automática al seleccionar y pegue con el botón central del mouse).

Gilles 'SO- deja de ser malvado'
fuente
Si usa el modo vi, simplemente reemplace kill-regioncon vi-deletey yankcon vi-put-afteretc. De manera similar vi-yank, ajuste y otros. (No he encontrado una manera de hacerlo más centralmente)
olejorgenb
4

Había estado queriendo integrar el búfer de corte de Zsh con el portapapeles X. Probé el http://stchaz.free.fr/mouse.zsh mencionado anteriormente, pero descubrí que no me gustaba que todas mis operaciones de Zsh llenaran el portapapeles. Por ejemplo, a veces copiaría algo en un navegador y luego iría a un shell y editaría la línea de comando y luego pegaría. Pero a menudo, editar la línea de comando, por ejemplo, eliminar una palabra, modifica el búfer de corte Zsh. Para bien o para mal, X solo tiene un portapapeles, no un anillo de cierre, por lo que cuando una operación de edición de Zsh sobrescribe el portapapeles, lo que quería pegar se pierde: no puedo tirarlo (Cy My) como pude hacer en Zsh o Emacs.

Entonces, lo que hice fue crear nuevas combinaciones de teclas especiales para interactuar con el portapapeles X a través de zsh. Resulta que "^ Xw" y "^ Xy" no se utilizan tanto en Emacs como en Zsh, por lo que puedo obtener una interfaz coherente al vincularlos en ambas aplicaciones. De esta forma, las operaciones de edición normales, el búfer de corte y el anillo de cierre se quedan solos. Si quiero copiar algo en el portapapeles, configuro la región y hago "^ Xw" (o si ya la maté y la región está inactiva, puedo hacer "^ Xw" para copiar el búfer de corte). Pegar desde el portapapeles se hace con "^ 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
fuente
1

Es posible que desee echar un vistazo a http://stchaz.free.fr/mouse.zsh que, además de agregar compatibilidad con el mouse, también intenta interactuar con el Portapapeles X.

Stéphane Chazelas
fuente