Poner en Debian 8.3
stty werase '^H'
o en Arch Linux 2/2016
stty werase '^?'
en .bashrc
(por ejemplo) marcas Ctrl: Backspaceelimina la última palabra en el terminal. Aún no es el mismo comportamiento que en las aplicaciones GUI modernos (por ejemplo Firefox): Borra el último espacio en blanco palabra Separado, y no la última palabra separados por espacios en blanco o caracteres como . : , ; " ' & / ( )
.
¿Es posible hacer que Ctrl- Backspacese comportan en el terminal similar a las aplicaciones GUI modernas? Además, ¿hay alguna forma de hacerlo Ctrl: Deleteeliminar la palabra inmediatamente antes del cursor?
bash
terminal
keyboard-shortcuts
line-editor
gatos lobo-revo
fuente
fuente
Respuestas:
Aquí hay dos editores de línea en juego: el editor de línea básico proporcionado por el núcleo (editor de línea tty en modo canónico) y el editor de línea de bash (implementado a través de la biblioteca readline). Ambos tienen un comando de borrar a la palabra anterior que está vinculado a Ctrl+ Wpor defecto. La clave se puede configurar para el editor de línea tty en modo canónico a través de
stty werase
; bash imita el enlace de teclas que encuentra en la configuración tty a menos que se anule en su propia configuración.La
werase
acción en el editor de líneas tty no se puede configurar. Siempre borra (ASCII) palabras delimitadas por espacios en blanco. Es raro interactuar con el editor de líneas tty: es lo que obtienes, por ejemplo, cuando escribescat
sin argumento. Si desea combinaciones de teclas sofisticadas allí, puede ejecutar el comando bajo una herramienta como rlwrap que usa readline.Bash proporciona dos comandos para eliminar la palabra anterior :
unix-word-rubout
( Ctrl+ wo según lo establecidostty werase
), ybackward-kill-word
(M-DEL
, es decir, Esc Backspace) que trata una palabra como una secuencia de caracteres alfanuméricos en la configuración regional actual y_
. Si desea Ctrl+ Backspacepara borrar la secuencia anterior de caracteres alfanuméricos, no establezcastty werase
y, en su lugar, coloque la siguiente línea en su.inputrc
:Tenga en cuenta que esto supone que su terminal envía el carácter Ctrl + H para Ctrl+ Backspace. Desafortunadamente, es una de esas claves sin enlace estándar (y Backspaceen particular es un desastre por razones históricas).
También hay un comando simétrico
kill-word
que está vinculado aM-d
( Alt+ D) de forma predeterminada. Para vincularlo a Ctrl+ Delete, primero debe averiguar qué secuencia de escape envía su terminal, luego agregar una línea correspondiente en su.inputrc
. Escriba Ctrl+ Vluego Ctrl+ Delete; esto insertará algo como^[[3;5~
donde la inicial^[
es una representación visual del carácter de escape. Entonces la unión esSi no está satisfecho con cualquiera de las definiciones de una palabra, puede proporcionar la suya propia en bash: vea el comportamiento confuso de las combinaciones de teclas de estilo emacs en bash
fuente
Ctrl+Del
funcionó bien. Sin embargo, no puedo irCtrl+Backspace
a trabajar. ParaCtrl+v, Ctrl+Backspace
mi terminal dice^?
. ¿Qué debo poner en el.inputrc
? Gracias"\C-?": backward-kill-word
o cualquier función de línea de lectura que desee. Pero solo puede definir un enlace para Ctrl + Retroceso que sea diferente del enlace para Retroceso si envían caracteres diferentes. Si su terminal envía^?
tanto Retroceso como Ctrl + Retroceso, la aplicación que se ejecuta en el terminal no tiene forma de distinguirlos. Algunos terminales se pueden configurar (por ejemplo, xterm, urxvt), otros (por ejemplo, emuladores de terminales basados en VTE) no.~/.inputrc
deshabilita el valor predeterminado/etc/inputrc
. para solucionar esto, debe incluir ese archivo:$include /etc/inputrc
(desde aquí )Tratar
alt+backspace
En el sistema operativo primario funciona como lo desea (como ctrl+ backspace)
fuente
El comportamiento del carácter WERASE en el procesamiento de terminal en modo cocinado está codificado , al menos en Linux:
Entonces las palabras son letras, dígitos y guiones bajos. Esta es la forma en que siempre estará en un terminal en Linux cuando una aplicación que realiza su propio procesamiento en modo cocinado no se está ejecutando.
La versión de readline (utilizada por bash y otros) parece ser un poco diferente a la versión del núcleo, pero también parece estar codificada :
Pero esto no parece coincidir con lo que
bash
realmente hace por mí:foo+bar^W
borra todo, no solobar
. Hay más información sobre eso aquí .fuente
backward-kill-word
(enlace predeterminadoM-DEL
) en lugar deunix-word-rubout
.