Consentire a Terminal.app di passare le sequenze di tasti basate sui tasti di comando ai programmi terminali

3

Voglio consentire ai programmi in esecuzione nel terminale la possibilità di interpretare la scorciatoia da tastiera Cmd + S

Ho già rimappato il binding predefinito dei terminali di Cmd + S a Ctrl + S tramite il Tastiera Preferenze di sistema in OS X Lion, quindi questo ha impedito alla stessa App Terminal di interpretare quel tasto premuto, ad es la finestra di salvataggio non viene più visualizzata premendo Cmd + S . Tuttavia qualcosa sta ancora acquisendo l'input della chiave prima che un qualsiasi programma terminale possa.

Ad esempio, quando si esegue la scrittura bash Cmd + S nel terminale X11.app si ottiene:

$s

viene stampato sullo schermo.

Quando eseguo lo stesso Cmd + S nel Terminal.app non viene stampato nulla e il sistema operativo riproduce un suono di errore. Non sono veramente sicuro del motivo per cui il tasto non è come arrivare al terminale come previsto, come posso consentire a Cmd + S di passare attraverso.

Per maggiori informazioni su cosa / perché sto cercando di fare, vedi domanda Bind < Cmd-S > in Vim

    
posta MrDaniel 20.04.2012 - 19:07
fonte

2 risposte

2

Ho desideri simili ai tuoi. Ho risolto il problema utilizzando un modificatore a livello di sistema: re-bind del tasto.

(Naturalmente, questo è un casino, ma trovo che valga la pena mantenere il mio ibrido formato da MacVim di controlli OS-wide (salva, nuovo, copia, incolla) all'interno della riga di comando vim s.)

Ecco come l'ho fatto:

  1. Installa Karabiner , che è un molto , un programma molto potente (e una parte essenziale di
  2. di qualsiasi installazione di OS X di poweruser / programmatore, IMHO)
  3. Abilita "Command_L a Control_L (solo nel terminale)" :

  4. Map ^ -prefixed controlla i comandi di MacVim più utilizzati in linea di comando vim . Ad esempio, per supportare ⌘S ,

    noremap  <silent> <C-S>    :update<CR>
    vnoremap <silent> <C-S>    <C-C>:update<CR>
    inoremap <silent> <C-S>    <C-O>:update<CR>
    
  5. Ripristina le previste per la stessa app Terminal.app, inserendole in modo speciale in Preferenze di Sistema. Ad esempio, se vuoi ⌘N per controllare ancora le schede del Terminale, invece di mapparlo su vim file, prova:

    Ora, tutto ciò che non aggiungi in questo elenco, verrà passato da verbatim a riga di comando vim (e, naturalmente, qualsiasi altro programma da riga di comando che usi).

Avvertimenti

Questo approccio ha diversi ulteriori aspetti negativi, che voglio hilight per chiunque pensi di prenderlo (come faccio io):

  • ⌘␣ non verrà più mappato a Spotlight a livello di sistema. (Ho un numero aperto su Karabiner, e tornerò qui una volta che avrò una soluzione di stopgap.)
  • Per ragioni che non riesco a verificare, anche con le esclusioni ^ W impostate in Preferenze di Sistema, il comportamento di chiusura di Tab di Terminal.app cambia con questa impostazione: ⌘W chiuderà le singole schede in una finestra; ma se la scheda corrente è la scheda ultima , non chiude la finestra. Invece, non ha alcun effetto. Ho dovuto riprogrammare me stesso per usare ⇧⌘W per chiudere la finestra se è rimasta una sola scheda.
  • Se ti sei allenato a usare ^ V in MacVim per fare la selezione a blocchi, dovrai allenarti di nuovo ad usare l'alternativa , ^ Q (o, ora, ⌘Q ). Inoltre, dovrai aggiungere stty -ixon nello script di avvio della shell, come ^Q viene consumato di default per preformare una funzione di controllo shell arcaica (una senza utilizzo moderno).

Comportamento alternativo ⌘W

Oltre a quanto sopra, ho deciso di sovrascrivere ulteriormente ⌘W come chiave universale "chiudi questo", applicabile a più applicazioni.

Invece di mappare ⌘W in "Chiudi scheda", come sopra; Personalmente lo mapperò a ⇧⌘W (per mantenere la semantica "close close this tab"). Quindi, in ogni programma dato, mappo ^W in una sorta di chiusura -salva la funzionalità di uscita.

Ad esempio, nel mio .vimrc :

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

... o my .zshrc :

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

Con questi due snippet e il tuo Terminale configurato su "Chiudi se la shell esce in modo pulito", una serie di ⌘W s prima uscirà da vim e quindi chiuderà interamente la shell.

Inoltre, ora è possibile preservare la funzionalità on-exit aggiuntiva dei programmi: ad esempio, vim chiederà prima di uscire se i file non sono salvati (proprio come MacVim); e zsh chiederà prima di uscire se ci sono lavori in background.

Postscript: non direttamente relativo alla tua domanda; ma dovresti anche controllare 'Ubiquitous Vim Mode' in Karabiner. È "un po 'troppo" per me da usare tutti i giorni, ma è un'idea fantastica, e sorprendentemente ben implementata.

    
risposta data 17.02.2015 - 02:31
fonte
0

Non so se questo si applica, ma stty usa ctrl-s per fermare il terminale fino a che non viene riavviato con ctrl-q. Sarei un po 'diffidente nell'invio di ctrl-s a un terminale.

    
risposta data 20.04.2012 - 20:23
fonte

Leggi altre domande sui tag