Permitir que Terminal.app pase pulsaciones de teclas basadas en comandos a programas de terminal

3

Quiero permitir que los programas que se ejecutan en el terminal puedan interpretar el atajo de teclado Cmd + S

Ya he vuelto a asignar el enlace predeterminado de los terminales de Cmd + S a Ctrl + S a través de Preferencias del sistema del teclado en OS X Lion, por lo que esto ha impedido que la aplicación de Terminal Server interprete esa pulsación de tecla, por ejemplo, el diálogo de guardar ya no aparece cuando se presiona Cmd + S . Sin embargo, algo sigue agarrando la entrada clave antes de que cualquier programa de terminal pueda.

Por ejemplo, cuando se ejecuta bash escribiendo Cmd + S en los resultados del terminal X11.app en:

$s

se está imprimiendo en la pantalla.

Cuando ejecuto el mismo Cmd + S en el Terminal.app, no se imprime nada y el sistema operativo reproduce un sonido de error. No estoy realmente seguro de por qué la pulsación de tecla no está llegando al terminal como se esperaba, ¿cómo permito que Cmd + S pase a través de.

Para obtener más información sobre qué / por qué estoy tratando de hacer esto, consulte la pregunta Enlace < Cmd-S > en Vim

    
pregunta MrDaniel 20.04.2012 - 19:07

2 respuestas

2

Tengo deseos similares a los tuyos. Lo resolví utilizando un enlace de modificador-clave a nivel del sistema.

(Por supuesto, esto es un desastre; pero me parece que vale la pena mantener mi híbrido entrenado en MacVim de los controles de todo el sistema operativo (guardar, nuevo, copiar, pegar) dentro de la línea de comandos vim s.)

Así es como lo hice:

  1. Instale Karabiner , que es un programa muy poderoso muy (y una parte esencial de instalación del OS X de cualquier poweruser / programador, IMHO)
  2. Habilite "Command_L to Control_L (solo en la Terminal)" :

  3. Asigne k -prefijados los controles que coincidan con los comandos de MacVim con los que esté más acostumbrado en la línea de comandos vim . Por ejemplo, para admitir ⌘S ,

    noremap  <silent> <C-S>    :update<CR>
    vnoremap <silent> <C-S>    <C-C>:update<CR>
    inoremap <silent> <C-S>    <C-O>:update<CR>
    
  4. Restaure las secuencias esperadas para el propio Terminal.app, encajándolas especialmente en Preferencias del sistema. Por ejemplo, si desea que ⌘N siga controlando las pestañas de la Terminal, en lugar de asignarlo a los archivos vim , intente:

    Ahora, cualquier cosa que no agregue en esta lista, se pasará literalmente a la línea de comando vim (y, por supuesto, a cualquier otro programa de línea de comandos que use).

Advertencias

Este enfoque tiene varias más desventajas sutiles, que quiero resaltar para cualquiera que esté considerando tomarlo (como lo hago):

  • ⌘␣ ya no se asignará al Spotlight de todo el sistema. (Tengo un número abierto en Karabiner, y volveré aquí una vez que tenga una solución provisional).
  • Por razones que no puedo determinar, incluso con las exclusiones ⌃W configuradas en Preferencias del sistema, el comportamiento de cierre de pestaña de Terminal.app cambia con esta configuración: ⌘W cerrará pestañas individuales en una ventana; pero si la pestaña actual es la pestaña última , no cerrará la ventana. En cambio, no tiene ningún efecto. Tuve que volver a entrenarme para usar ⇧⌘W para cerrar la ventana si solo queda una pestaña.
  • Si te has entrenado para usar ⌃V en MacVim para hacer una selección por bloques, entonces tendrás que volver a entrenarte para usar la alternativa , ⌃Q (o, ahora, ⌘Q ). Además, tendrá que agregar stty -ixon en el script de inicio de su shell, como Q se consume de forma predeterminada para realizar una función de control de shell arcaica (una sin uso moderno).

Comportamiento ⌘W alternativo

Además de lo anterior, decidí anular aún más ⌘W como una clave universal de 'cerrar esto', aplicable a múltiples aplicaciones.

En lugar de asignar ⌘W a ‘Cerrar pestaña, 'como se muestra arriba; Personalmente asigno eso a ⇧⌘W (para retener la semántica de "cerrar inmediatamente esta pestaña"). Luego, en cualquier programa dado, asigno ⌃W a algún tipo de cierre -save-quit funcionalidad.

Por ejemplo, en mi .vimrc :

noremap  <C-W>    :confirm quit<CR>
vnoremap <C-W>    <C-C>:confirm quit<CR>
inoremap <C-W>    <C-O>:confirm quit<CR>

... o mi .zshrc :

function close_tab { exit }
zle -N close_tab_widget close_tab
bindkey           '' close_tab_widget
bindkey -M vicmd  '' close_tab_widget

Con esos dos fragmentos de código en su lugar, y su Terminal configurada para 'Cerrar si el shell se sale limpiamente', una serie de ⌘W primero saldrá de vim y luego cerrará el shell por completo.

Además, ahora se puede conservar la funcionalidad de salida adicional de los programas: por ejemplo, vim preguntará antes de salir si los archivos no están guardados (como MacVim); y zsh preguntará antes de salir si hay trabajos en segundo plano.

Postscript: No directamente relacionado con su pregunta; pero también deberías revisar el ‘Modo Vim ubicuo’ en Karabiner. Es "un poco demasiado" para que lo use todos los días, pero es una idea muy buena y sorprendentemente bien implementada.

    
respondido por el ELLIOTTCABLE 17.02.2015 - 02:31
0

no estoy seguro de si esto se aplica, pero stty usa ctrl-s para detener el terminal hasta que se reinicie con ctrl-q. Estaría un poco preocupado acerca de enviar ctrl-s a un terminal.

    
respondido por el glenn jackman 20.04.2012 - 20:23

Lea otras preguntas en las etiquetas