¿Copiar y marcar en Bash como en Emacs?

16

Me gustaría ser capaz de copiar y pegar texto en la línea de comandos en Bash utilizando las mismas asociaciones de teclas que Emacs usa por defecto (es decir, utilizando C-spacepara set-mark, M-wcopiar texto, C-y, M-ypara pegarlo, etc.).

La documentación de GNU Bash dice que Bash viene con algunas de estas asociaciones de teclas configuradas de manera predeterminada.

Por ejemplo, yanking ( C-y) funciona por defecto en mi terminal. Sin embargo, no puedo conseguir el set-marky copycomandos para el trabajo, y no parecen estar ligado a ninguna tecla por defecto.

Por lo general, la forma en que un usuario puede definir sus propias asociaciones de teclas es agregarlas .inputrc. Así que busqué y encontré las siguientes funciones bash en la documentación que supongo que pueden ayudarme a definir el comportamiento similar a Emacs que quiero (es decir, set-markcon C-spacey copycon M-w).

copy-region-as-kill ()

Copie el texto en la región en el búfer de muerte, para que pueda ser arrancado de inmediato. Por defecto, este comando no esta ligado.

y

set-mark (C-@)

Establece la marca en el punto. Si se proporciona un argumento numérico, la marca se establece en esa posición.

Si entiendo correctamente, lo anterior significa que copy-region-as-killno está vinculado a ninguna secuencia de teclado de forma predeterminada, mientras que set-markestá vinculado C-@de forma predeterminada.

Intenté C-@en mi terminal, pero no creo que se ejecute set-markporque no veo ningún texto resaltado cuando muevo el cursor. En cualquier caso, intenté agregar enlaces de teclado ( M-wy C-) a las funciones copy-region-as-killy set-marksuperiores en mi .inputrcy luego volver a cargarlo C-x C-r, pero esto no funcionó. Sé que mis otras entradas .inputrcfuncionan porque tengo otras combinaciones de teclas definidas por el usuario definidas en él.

¿Hay algo que estoy haciendo mal? ¿Me estoy perdiendo algo?

Amelio Vazquez-Reina
fuente
¿Qué versión bashy qué programa de terminal estás usando?
Mikel
Estoy usando GNU bash, versión 3.1.17 (1) -release (x86_64-redhat-linux-gnu) en gnome-terminal (también en Terminator)
Amelio Vazquez-Reina

Respuestas:

11

No resalta la selección, pero creo que funciona bien.

Intenta correr

$ bind -p | grep copy-region-as-kill

para asegurarse de que C-x C-rrealmente funcionó.

Debería decir:

"\ew": copy-region-as-kill

Después de eso, debería funcionar bien.

Ejemplo:

$ abc<C-Spc><C-a><M-w> def <C-y>

me da

$ abc def abc

Si alguna vez quieres saber dónde markestá, solo hazlo C-x C-x.

Ejemplo:

$ <C-Spc>abc<C-x><C-x>

volverá a colocar el cursor donde estableció la marca (el inicio de la línea).

Además, no creo que necesite agregar el set-markenlace. No lo hice

$ bind -p | grep set-mark
"\C-@": set-mark
"\e ": set-mark
# vi-set-mark (not bound)

(tenga en cuenta que la mayoría de los terminales envían C-@cuando C-Spcse presiona. Supongo que el suyo también lo hace).

Si todo esto falla:

  • ¿Funciona Ctrl+ Spaceen emacs -nwla misma terminal?
  • Cómo funcionan otros Alt/ Metaaccesos directos en bash?
Mikel
fuente
1
¡Gracias! Tenía "Mw" en lugar de "\ ew" en .inputrc. La falta de resaltado también me confundió. Gracias por el puntero al comando de enlace por cierto. ¡Ahora funciona de maravilla!
Amelio Vazquez-Reina
2
¡Bienvenido! Sí, tienes que escribir \eo \M-. Consulte la sintaxis del archivo init de readline .
Mikel
¡Qué gran respuesta! Gracias. Esto me aclaró problemas similares: D
ephsmith
set-mark y copy-region-as-kill funcionan en silencio, ¿puedo resaltar la región (como en emacs)?
mosh
4

También ato Cw para kill-region . Aquí mi .inputrc:

# Ver http://lists.gnu.org/archive/html/bug-bash/2009-03/msg00033.html
establecer bind-tty-special-chars fuera

# Definir mis combinaciones de teclas favoritas de Emacs.
"\ C- @": marca de ajuste
"\ Cw": kill-region
"\ Mw": copy-region-as-kill
"\ M- /" dabbrev-expand
gavenkoa
fuente