Holen Sie sich Eingaben vom Editor (vim/nano/emacs/textmate?)

Holen Sie sich Eingaben vom Editor (vim/nano/emacs/textmate?)

Ich war nur neugierig, ob es eine Möglichkeit gibt, Eingaben nicht von, StdInsondern von zu erhalten $EDITOR– sei es von vim, nano, emacs oder sogar einem Nicht-Befehlszeileneditor (MacVim/TextMate). Was sind die Optionen/Workarounds/Best Practices?

Grundsätzlich würde ich mir einen Workflow wie bei - wünschen heredoc, allerdings stattdessen aus dem $editor heraus.

$ sort -nr << FOO | uniq -c 
pipe heredoc> foo 
pipe heredoc> bar
pipe heredoc> baz
pipe heredoc> foo
pipe heredoc> FOO
   2 foo
   1 baz
   1 bar

Antwort1

Der Befehl vipeim Paketmehrutilsermöglicht es Ihnen, $EDITOR mitten in einer Pipeline zu starten.
Sie können das gewünschte Verhalten folgendermaßen erreichen:

$ </dev/null vipe |sort -nr | uniq -c 

Antwort2

Ich schätze, Ihre einzige Chance, es mit jedem Editor zum Laufen zu bringen, ist die Verwendung temporärer Dateien:

FILE=$(mktemp); $EDITOR "$FILE"; <"$FILE" …command… ; rm "$FILE"

(Dadurch kann der Befehl jedoch erst gestartet werden, wenn eine vollständige Eingabe erfolgt ist.)

Sie können echo "# please insert your input bellow" >"$FILE"vor dem Aufruf auch $EDITOReinen Kommentar einfügen, der im Editor angezeigt wird. Stellen Sie sicher, dass er das Verhalten des Befehls nicht beeinflusst (oder bitten Sie den Benutzer, ihn explizit zu entfernen).

Antwort3

Emacs hat die Möglichkeit, die Shell in einem seiner Puffer auszuführen (MX-Shell verwenden). Die gestarteten Prozesse würden ihre Eingabe jedoch weiterhin von stdin erhalten, ihr stdin wäre einfach ein Pseudoterminal, dessen anderes Ende Emacs wäre.

Antwort4

In Emacs können Sie jeden beliebigen Befehl ausführen und den Inhalt eines der Emacs-Puffer (genauer gesagt des ausgewählten Bereichs) als Standardeingabe für die Anwendung bereitstellen.

Wenn beispielsweise der Inhalt Ihres Emacs-Puffers lautet lsund Sie ihn als Region markieren (mit C-SPC), führen Sie shell-command-on-region( M-|) aus und geben Sie als Befehl bash(vollständige Kombination: M-| command RET) ein. Er wird lsausgeführt bashund die Ausgabe wird als neuer Puffer geöffnet.

Wenn Sie C-u M-| command RET„in Region“ verwenden, ersetzt die Ausgabe den markierten Befehl in Ihrem aktuellen Puffer.

verwandte Informationen