Permita que Terminal.app pase pulsaciones de teclas basadas en teclas de comando a programas de terminal

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

Ya he reasignado el enlace predeterminado de los terminales de Cmd+ Sa Ctrl+ Sa través de las Preferencias del sistema del teclado en OS X Lion, por lo que esto ha impedido que la propia aplicación Terminal interprete esa pulsación de tecla, por ejemplo, el cuadro de diálogo Guardar ya no aparece al pulsar Cmd+ S. Sin embargo, algo todavía está agarrando la entrada clave antes de que cualquier programa de terminal pueda hacerlo.

Por ejemplo, cuando se ejecuta bash escribiendo Cmd+ Sen el terminal X11.app, se obtiene lo siguiente:

$s

siendo impreso en la pantalla.

Cuando realizo el mismo Cmd+ Sen 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 llega a la terminal como se esperaba, ¿cómo permito que Cmd+ Spase?

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

Respuestas (2)

Tengo deseos similares a los tuyos. Lo resolví usando una nueva vinculación de tecla modificadora a nivel del sistema.

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

Así es como lo hice:

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

  3. Asignar controles prefijados que coincidan con los comandos de MacVim a los que esté más acostumbrado en la línea de comandos vim. Por ejemplo, para apoyar ⌘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 Terminal.app en sí mismo, poniéndolas en mayúsculas en Preferencias del Sistema. Por ejemplo, si aún desea ⌘Ncontrolar las pestañas de la Terminal, en lugar de asignarlas a vimlos archivos, intente:

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


Advertencias

Este enfoque tiene varias desventajas sutiles adicionales , que quiero resaltar para cualquiera que esté considerando tomarlo (como yo):

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

⌘WComportamiento alternativo

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

En lugar de asignar ⌘Wa 'Cerrar pestaña', como se indicó anteriormente; Personalmente mapeo eso ⇧⌘W(para retener la semántica de "cerrar inmediatamente esta pestaña"). Luego, en cualquier programa dado, mapeo ⌃Wa algún tipo de funcionalidad cerrar-guardar-salir.

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 en su lugar, y su Terminal configurada para 'Cerrar si el shell sale limpiamente', una serie de ⌘Ws primero cerrará vim y luego cerrará el shell por completo.

Además, ahora se puede conservar la funcionalidad adicional al salir de los programas: por ejemplo, vimpreguntará antes de salir si los archivos no se guardaron (al igual que MacVim); y zshpreguntará antes de salir si hay trabajos de fondo.


Posdata: no está directamente relacionado con su pregunta; pero también debería consultar el 'Modo Vim ubicuo' en Karabiner. Es "un poco excesivo" para mí usarlo todos los días, pero es una idea genial y sorprendentemente bien implementada.

Aquí hay un Karabiner private.xmlpara excluir ⌘␣: github.com/tekezo/Files/blob/master/Karabiner/…

no estoy seguro si esto se aplica, pero sttyusa ctrl-s para detener el terminal hasta que se reinicie con ctrl-q. Sería un poco receloso acerca de enviar ctrl-s a una terminal.

Intenté esto y no pareció tener ningún efecto cuando lo agregué a mt .bashrc, una versión ligeramente modificada de lo que se indica aquí vim.wikia.com/wiki/Map_Ctrl-S_to_save_current_or_new_files