Erlauben Sie der Terminal.app, auf Befehlstasten basierende Tastenanschläge an Terminalprogramme weiterzuleiten

Ich möchte Programmen, die im Terminal ausgeführt werden, die Möglichkeit geben, die Tastenkombination Cmd+ zu interpretieren S

Ich habe bereits die Standardbindung der Terminals von Cmd+ Szu Ctrl+ Süber die Tastatursystemeinstellungen in OS X Lion neu zugeordnet, sodass die Terminal-App selbst diesen Tastendruck nicht mehr interpretiert, z. B. wird der Speicherdialog nicht mehr angezeigt, wenn Cmd+ gedrückt wird S. Irgendetwas greift jedoch immer noch nach der Tasteneingabe, bevor es ein Terminalprogramm kann.

Wenn Sie beispielsweise bash ausführen, führt die Eingabe von Cmd+ Sim X11.app-Terminal zu Folgendem:

$s

auf dem Bildschirm gedruckt werden.

Wenn ich dasselbe Cmd+ Sin der Terminal.app ausführe, wird nichts gedruckt und das Betriebssystem spielt einen Fehlerton ab. Ich bin mir nicht wirklich sicher, warum der Tastendruck nicht wie erwartet zum Terminal gelangt, wie kann ich Cmd+ Spassieren lassen.

Weitere Informationen darüber, was / warum ich versuche, dies zu tun, finden Sie unter Frage Bind <Cmd-S> in Vim

Antworten (2)

Ich habe ähnliche Wünsche wie du. Ich habe es mit einer Neubindung der Modifikatortaste auf Systemebene gelöst.

(Natürlich ist das ein Durcheinander; aber ich finde es wert, meine MacVim-trainierte Mischung aus betriebssystemweiten Steuerelementen (Speichern, Neu, Kopieren, Einfügen) in Befehlszeilen zu pflegen vim.)

So habe ich es gemacht:

  1. Installieren Sie Karabiner , ein sehr , sehr leistungsfähiges Programm (und meiner Meinung nach ein wesentlicher Bestandteil der OS X-Installation eines jeden Powerusers / Programmierers).
  2. Aktivieren Sie „Command_L to Control_L (nur im Terminal)“ :

  3. Ordnen Sie -präfixierte Steuerelemente zu, die mit den MacVim-Befehlen übereinstimmen, an die Sie in der Befehlszeile am meisten gewöhnt sind vim. Zum Beispiel zur Unterstützung ⌘S,

    noremap  <silent> <C-S>    :update<CR>
    vnoremap <silent> <C-S>    <C-C>:update<CR>
    inoremap <silent> <C-S>    <C-O>:update<CR>
    
  4. Stellen Sie die erwarteten -Sequenzen für Terminal.app selbst wieder her, indem Sie sie in den Systemeinstellungen mit Sonderfällen versehen. Wenn Sie beispielsweise ⌘Nweiterhin Terminal-Registerkarten steuern möchten, anstatt sie Dateien zuzuordnen vim, versuchen Sie Folgendes:

    Alles, was Sie dieser Liste nicht hinzufügen, wird wörtlich an die Befehlszeile weitergegeben vim(und natürlich an jedes andere Befehlszeilenprogramm, das Sie verwenden).


Vorbehalte

Dieser Ansatz hat mehrere weitere subtile Nachteile, die ich für alle hervorheben möchte, die erwägen, ihn zu nehmen (wie ich es tue):

  • ⌘␣wird nicht mehr dem systemweiten Spotlight zugeordnet. (Ich habe ein offenes Problem mit Karabiner und werde hierher zurückkommen, sobald ich eine Notlösung habe.)
  • Aus Gründen, die ich nicht feststellen kann, selbst mit den ⌃Win den Systemeinstellungen eingerichteten Ausschlüssen, ändert sich das Tab-Schließverhalten von Terminal.app mit diesem Setup: ⌘Wschließt einzelne Tabs in einem Fenster; aber wenn die aktuelle Registerkarte die letzte Registerkarte ist, wird das Fenster nicht geschlossen. Stattdessen hat es keine Wirkung. Ich musste mich neu trainieren, um ⇧⌘Wdas Fenster zu schließen, wenn nur noch eine Registerkarte übrig ist.
  • Wenn Sie sich selbst beigebracht haben, ⌃Vin MacVim eine blockweise Auswahl zu verwenden, müssen Sie sich neu antrainieren, um die Alternative , ⌃Q(oder jetzt ⌘Q) zu verwenden. Außerdem müssen Sie stty -ixon das Startskript Ihrer Shell hinzufügen, da ⌃Qes standardmäßig verwendet wird, um eine archaische Shell-Steuerungsfunktion (eine ohne moderne Verwendung) auszuführen.

Alternatives ⌘WVerhalten

Zusätzlich zu dem oben Gesagten habe ich mich entschieden, ⌘Wals universelle „Schließen“-Taste, die auf mehrere Anwendungen anwendbar ist, weiter zu überschreiben.

Anstelle der Zuordnung ⌘Wzu „Tab schließen“ wie oben; Ich persönlich bilde das ab ⇧⌘W(um die Semantik „diese Registerkarte sofort schließen“ beizubehalten.) Dann bilde ich in jedem beliebigen Programm ⌃Weine Art Schließen-Speichern-Beenden-Funktionalität ab.

Zum Beispiel in meinem .vimrc:

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

… oder meine .zshrc:

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

Wenn diese beiden Schnipsel vorhanden sind und Ihr Terminal auf „Schließen, wenn die Shell sauber beendet wird“ konfiguriert ist, wird eine Reihe von ⌘Ws zuerst vim beenden und dann die Shell vollständig schließen.

Außerdem können jetzt zusätzliche Funktionen beim Beenden von Programmen beibehalten werden: zum Beispiel vimwird vor dem Beenden gefragt, ob Dateien nicht gespeichert sind (genau wie MacVim); und zshfragt vor dem Beenden, ob es Hintergrundjobs gibt.


Nachtrag: Nicht direkt auf Ihre Frage bezogen; aber Sie sollten sich auch den 'Ubiquitous Vim Mode' in Karabiner ansehen. Es ist „ein bisschen viel“ für mich, es jeden Tag zu benutzen, aber es ist eine sehr coole Idee und überraschend gut umgesetzt.

Hier ist ein Karabiner private.xmlzum Ausschließen von ⌘␣: github.com/tekezo/Files/blob/master/Karabiner/…

nicht sicher, ob dies zutrifft, aber sttyverwendet Strg-s, um das Terminal zu stoppen, bis es mit Strg-q neu gestartet wird. Ich wäre etwas misstrauisch, wenn ich Strg-s an ein Terminal senden würde.

Ich habe dies versucht und es schien keinen Effekt zu haben, als ich es zu mt .bashrc hinzufügte, einer leicht modifizierten Version dessen, was hier vim.wikia.com/wiki/Map_Ctrl-S_to_save_current_or_new_files angegeben ist