Ich möchte etwas in einer Shell einrichten, um eine IDE-ähnliche Erfahrung zu machen, bei der ich nur die Shell verwende (kein X). Am nächsten komme ich dem mit tmux, mit vim in einem Fenster und der Befehlszeile im anderen. Auf diese Weise kann ich von vim aus .w !bash
eine Zeile ausführen.
Dies ist für mich jedoch nicht zufriedenstellend, da die Umgebung zwischen separat ausgeführten Befehlen nicht erhalten bleibt.
Wenn ich ausführe:
var1=FOO
und dann
echo $var1
Jede Verwendung .w !bash
wird FOO
nicht wiederholt.
Was ich wirklich tun möchte, ist, eine Textdatei in einem Fenster durchzugehen und eine Verknüpfung zu verwenden, um im Rahmen dieser Terminalsitzung eine Zeile an das Terminal im anderen Fenster zu senden. Welche Kombination von Tools ist dafür die richtige? Ich verstehe, dass Emacs mit seinem eigenen Terminalemulator so konfiguriert werden kann, dass es so etwas macht, aber ich hätte gerne eine Lösung, die mit den Standardtools funktioniert (wie beispielsweise einem Installationsprogramm).
Bearbeiten: tmux-Auswählen-Kopieren-Einfügen ist nicht so schlimm, aber trotzdem ein wenig umständlich.
Antwort1
Eine Prototyplösung mit und sh
schnellem Proof of Concept.vim
tmux
Ihr .w !bash
wird ausgeführt bash
und sendet die aktuelle Zeile an seinen Standard-DIN. Ersetzen wir es bash
durch ein Skript, das eine Zeile von seinem Standard-DIN in einen anderen Bereich in einfügt tmux
.
Dies ist das grundlegende Skript:
#!/bin/sh
pane="$(tmux list-panes -F '#{pane_active} #D' | awk '$1==0 {print $2;exit}')"
IFS= read -r line
tmux send-keys -l -t "$pane" "$line"
tmux send-keys -t "$pane" 'C-j'
Der Ablauf, kurze Erklärung:
- Identifizieren Sie einen Bereich, der nicht aktiv ist.
- Lesen Sie eine Zeile von stdin.
- Senden Sie die Zeile an den Bereich, als ob sie eingegeben worden wäre.
- EnterAn den Bereich senden .
Speichern Sie es unter trun
, machen Sie es ausführbar und erreichbar über $PATH
. Wenn Sie nun zwei Bereiche haben und in einem davon tmux
ausführen , eine Zeile eingeben und drücken , wird die Zeile in den anderen Bereich eingefügt.trun
Enter
Anstelle vim
von .w !bash
„invoke“ .w !trun
sollte es funktionieren. Binden Sie dies für einen einfachen Zugriff an eine Taste.
Anmerkungen:
- Das Skript prüft nicht, ob genau zwei Bereiche vorhanden sind.
- Dem Skript ist es egal, was im Zielbereich ausgeführt wird. Es sendet lediglich Schlüssel.