Senden von Befehlen an vm übergeordnete tmux-Sitzung

2837
leo

Ich habe ein Split-Window-Setup mit vim und Lynx in tmux. Ich versuche, ein Skript so zu erstellen, dass ich einen benutzerdefinierten Befehl an vim senden kann, mit dem das Skript, an dem ich gerade arbeite, gespeichert wird, der Fokus auf den Lynx-Bereich wechselt, die Lynx-Seite aktualisiert und dann wieder in den Vim-Bereich gewechselt wird.

Gibt es ein vorhandenes Skript, das dies tut? Wenn nicht, was wäre der beste Ansatz zum Erstellen dieses Skripts?

5

2 Antworten auf die Frage

11
Chris Johnsen

Sie können wahrscheinlich einen Vim- :!Befehl verwenden, tmux send-keysum einen Control-R an Ihren anderen Bereich zu senden . Da Sie send-keysTastatureingaben an jeden Bereich senden können (nicht nur an den aktiven), müssen Sie nicht einmal den aktiven Bereich hin und her wechseln.

Hier ist ein Vim-Mapping (Sie können es in Ihr .vimrcFeld einfügen oder es einfach in die :Eingabeaufforderung einfügen, um es auszuprobieren):

:map <Leader>rl :w<Bar>execute 'silent !tmux send-keys -t bottom C-r'<Bar>redraw!<C-M> 

Dies ordnet die \rlTastenfolge ( <Leader>Standardeinstellung \, kann jedoch angepasst werden) der folgenden Sequenz von Vim-Befehlen (getrennt durch <Bar>; siehe :help map_bar) zu:

  1. Schreibe den aktuellen Puffer in seine Datei.
  2. Führen Sie den Befehl tmux aus, um den Control-R an den unteren Bereich zu senden .
    Wir verwenden executehier, damit der nächste Vim-Befehl ( redraw) nicht Teil des :!Shell-Befehls ist.
    Wir verwenden den silentPräfixbefehl, um die Eingabeaufforderung "Press ENTER zum Fortfahren" zu vermeiden.
    Sie können weglassen, slientwenn Sie die Eingabeaufforderung oder die Ausgabe des :!Befehls anzeigen möchten (z. B. funktioniert der Befehl tmux nicht und Sie möchten sehen, ob er eine Fehlernachricht ausgibt ).
  3. Zeichne den Bildschirm neu.
    Dies geschieht normalerweise nach der Eingabeaufforderung „Press ENTER“, aber wir unterdrücken es mit silent.

Ich habe keinen Luchs, aber Control-R scheint der Reload-Schlüssel zu sein, der auf meiner Suche nach „Luchs reload“ basiert (z. B. „Dateien neu laden und Anzeige aktualisieren“ der Bedienungsanleitung).

Außerdem bottomkönnen Sie den Zielbereich auf andere Weise festlegen (suchen Sie in der tmux- Manpage nach „Zielbereich“ ):

  • .+1, .-1: nächstes, vorheriges Fenster in diesem Fenster
  • top, bottom, left, right, Und Kombinationen von top/ bottommit left/ right
    (dh bottom-left)
  • %42( tmux 1.5+): Eine mit %Präfix versehene Fensternummer aus der Umgebungsvariablen TMUX_PANE des Zielfensters

    Dieses letzte Formular kann nützlich sein, wenn sich Ihr Lynx-Fenster nicht immer in demselben Tmux- Fenster befindet wie Ihre Vim-Instanz. Speichern Sie vor dem Starten von Lynx den Wert von TMUX_PANE in einer temporären Datei und lesen Sie dann die Datei, um das Zielbereichsargument zu bilden:

    # before running Lynx (anytime really, but "before" is usually scriptable) echo "$TMUX_PANE" > /tmp/my-lynx-pane  # in the Vim :! command in the mapping: tmux send-keys -t "$(cat /tmp/my-lynx-pane)" C-r 
@ chris-johnsen, danke .. das funktioniert super. Könnten Sie den Unterschied zwischen Cntrl-r und Cntrl-M im obigen Befehl erklären? Stellt Cntrl-r ein "Enter" in einer Shell dar, während Cntrl-M dem Drücken von "Enter" im Ex-Modus ähnelt? Sind beide gleichbedeutend mit "E" "N" "T" "E" "R", wobei jeder Buchstabe im Exmodus oder in vimrc angegeben ist? alpha_989 vor 6 Jahren 0
2
user836295

Sie sollten mit dem Plugin tslime.vim beginnen, das mit einer manuell ausgewählten tmux-Sitzung interagiert und einen Puffer an diese sendet. Sie würden ein nahezu identisches Plugin schreiben. Anstatt einen Puffer zu senden, geben Sie jedoch Befehle aus (siehe man 1 tmux).

tslime.vim @ vimscripts