Vincular palabra de matar hacia atrás a Ctrl + w

23

Estoy tratando de cambiar del uso prolongado de Tcsh a la exploración reciente de Bash.

Me las arreglé para transferir todas mis características favoritas, excepto Ctrl + w, que trata los espacios y las barras como límites de palabras, muy probablemente hacia atrás-kill-word. En Bash, sin embargo, readline elimina todo el camino hasta el primer espacio, eliminando todas las barras entre ellas.

He intentado muchas combinaciones diferentes de \ Cw: backward-kill-word en .inputrc y .bashrc usando bind, pero no puedo hacer que funcione de la manera que quiero.

Curiosamente, a través de Putty de Windows en el trabajo puedo usar Alt + Retroceso, que también dice el manual es el enlace predeterminado, para producir el comportamiento exacto que quiero. Pero en Terminal.app en mis Mac en casa esto no funciona. Lo mismo ocurre con cualquier servidor FreeBSD o Linux en el que esté conectado desde Terminal.app.

Así que recurro al superusuario para obtener ayuda.

Stefan M
fuente

Respuestas:

40

readlineno se une Ctrl, Wya que es manejado por el controlador de terminal por defecto:

$ stty -a
(...) werase = ^W; (...)

Para deshabilitar esto, debe ejecutar (in ~/.bashrc):

stty werase undef
bind '"\C-w": backward-kill-word'

.inputrcno ayudará aquí ya que se lee cuando Ctrl- Wtodavía está asignado a werase.

También tenga en cuenta que las \C-wclaves de formato deben estar entre comillas dobles, como se indicó anteriormente.


Diferentes terminales pueden manejar Alt- de manera Backspacediferente.

  • Terminal PuTTY y GNOME (con configuración predeterminada) send 1b 7f( ESC DEL)
  • Xterm con metaSendsEscape: trueenvíos 1b 08( ESC BS).
  • Xterm sin metaSendsEscape envíos 88( HTSo BScon el bit más alto establecido).

Xterm tiene algunas configuraciones para controlar el comportamiento de la Altclave (llamada Metaen Xterm y X11 en general). Con metaSendsEscape, mantener presionado Altla tecla presionada con un ESC(hex 1b). Sin la configuración (modo predeterminado), Altestablecerá el bit más alto del carácter de entrada, lo que dará como resultado caracteres especiales. (Por ejemplo, Alt- Nresultados en ESC ny îrespectivamente).

Hasta donde puedo recordar, Terminal.app también tiene una configuración similar para controlar el comportamiento de Meta / Alt / whatever-Macs-use.

Gravedad
fuente
Esta no es solo la mejor respuesta, sino que también es extremadamente informativa, ¡gracias!
Stefan M
1
@shurane: La acción "borrar palabras" de borrado, como el borrado normal (Retroceso), la implementa el propio sistema operativo, en el controlador "dispositivo tty". Observe que están disponibles incluso en programas que solo leen ciegamente desde stdin, por ejemplo cat. En todos los Unixes, sttyse utiliza para controlar varios parámetros tty, incluidas estas teclas especiales. (Así es como se veía UNIX 7th Editionstty .)
Grawity
1
@shurane: Mientras tanto, readline es una biblioteca de espacio de usuario originalmente escrita para el shell bash (aunque ahora es utilizada por muchos programas). Es posible que las otras acciones se implementaron en readline para evitar hinchar el controlador tty (que ya tenía una cantidad considerable de indicadores y conmutadores, como se ve en sttyel manual). Además, bash fue originalmente diseñado para el sistema operativo GNU y solo más tarde portado a otros Unixes; Es mucho más fácil mantener las funciones de edición en una sola biblioteca que en varios núcleos muy diferentes.
Grawity
3
@shurane: Técnicamente, sin embargo, todas estas acciones, incluido el borrado de palabras, se implementan mediante readline ; cuando está activo, deshabilita completamente el control de Retroceso y Ctrl + W por parte del controlador del terminal. readline simplemente respeta la sttyconfiguración por simplicidad, pero puede ser anulada por la propia configuración de readline (como se describe en la respuesta de Matt Day).
Grawity
44
Esta es una gran respuesta para información, voto positivo. Sin embargo, debe tenerse en cuenta que esto deshabilita Ctrl-w para todos los programas a menos que usen readline, que probablemente no es lo que nadie quiere ..., así que intente la respuesta de @fjarlq.
0fnt
19

Grawity escribió que esto no se puede controlar en el .inputrcarchivo, pero eso es incorrecto.

Si está set bind-tty-special-chars offen su .inputrc, puede personalizar el comportamiento de los caracteres de terminal especiales.

Por ejemplo:

set bind-tty-special-chars off
Control-u: kill-whole-line
Control-w: backward-kill-word
fjarlq
fuente
2
Y esto tiene el beneficio de trabajar para todos los programas que el uso de readline-por ejemplo, python.
wchargin
3

Para el registro, la respuesta que se aplica a iTerm2 es establecer Alt- Backspace(o Opt ⌥- en Mac) para enviar códigos hexadecimales 0xb1y 0x7frealizar la backward-kill-wordacción que trata los caracteres no alfanuméricos como delimitadores.

Para la distinción, aquí está el comportamiento que estoy describiendo, en el cual la presión Opt ⌥- una vez cambia esto:

echo "/example/filepath/with_non-alpha.characters@blah:meh

a esto:

echo "/example/filepath/with_non-alpha.characters@blah:

Y las siguientes prensas de Opt ⌥- :

echo "/example/filepath/with_non-alpha.characters@

echo "/example/filepath/with_non-alpha.

echo "/example/filepath/with_non-

echo "/example/filepath/with_

echo "/example/filepath/

Así es como se ve la configuración en iTerm2: ingrese la descripción de la imagen aquí

Entonces, específico de Putty y Terminal, la respuesta de Grawity es excelente. Pero después de pasar una cantidad de tiempo vergonzosa buscando cómo aplicar la configuración en iTerm2, esta publicación de superusuario parece aparecer con mayor frecuencia, por lo que parecía responsable de proporcionar la información relevante que se aplica a iTerm2 como una respuesta adjunta a esta pregunta.

TCAllen07
fuente
Realmente me llevó mucho tiempo resolver esto, y esta solución funciona de hecho en OS X (con iTerm2) al iniciar sesión en un shell de bash remoto. ¡Gracias!
Martijn