Stdout von mehreren befehlen in vim als tabs öffnen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
reox
Beiträge: 2529
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Stdout von mehreren befehlen in vim als tabs öffnen

Beitrag von reox » 09.07.2022 17:33:09

Angenommen ich habe ein paar files, sagen wir *.txt.
Nun will ich einen Programm aufrufen mit jeweils einem File als Argument und die Ausgabe ansehen. Dazu würde ich gerne jeweils eine Ausgabe einer Datei in einem vim tab öffnen.
Ein Workaround:

Code: Alles auswählen

for f in *.txt; do myprogram "$f" > "${f}.tmp"; done; vim -p *.tmp; rm *.tmp
geht das vielleicht auch noch eleganter, ganz ohne temporäre dateien?

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Stdout von mehreren befehlen in vim als tabs öffnen

Beitrag von Meillo » 09.07.2022 18:01:56

Wenn es nicht zu viele Dateien sind (denn vim unterstuetzt nur zehn mal `-c'), dann kannst du es in der Art machen:

Code: Alles auswählen

vim -c '0r!myprogram a.txt' -c 'tabnew' -c '0r!myprogram b.txt' -c tabnew -c '0r!myprogram c.txt'
Aber vielleicht waere ein anderes Programm, wie Debianmultitail, besser fuer die Aufgabe geeignet.
Use ed once in a while!

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Stdout von mehreren befehlen in vim als tabs öffnen

Beitrag von JTH » 09.07.2022 22:33:09

Wenn es um nur ein paar Dateien geht und es daher nicht viel Arbeit macht es zu Tippen: Ich benutze für die Aufgabe manchmal die Process Substitution der Bash (allerdings dann meist mit vimdiff zusammen):

Code: Alles auswählen

vim <(cmd datei1.txt | cmd2) <(cmd datei2.txt | cmd2)
Wäre ich grad nicht nur am Handy, würd ich das eben in einen vereinfachenden Shell-Wrapper verpacken, damit man das Kommando/die Pipeline nur einmal tippen muss.

Meillo hat geschrieben: ↑ zum Beitrag ↑
09.07.2022 18:01:56
Debianmultitail
Muss ich mir bei Gelegenheit mal angucken. Klingt praktisch für manche Anwendungsfälle, die ich im Moment hab :THX:
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Stdout von mehreren befehlen in vim als tabs öffnen

Beitrag von Meillo » 10.07.2022 08:37:35

JTH hat geschrieben: ↑ zum Beitrag ↑
09.07.2022 22:33:09
Ich benutze für die Aufgabe manchmal die Process Substitution der Bash (allerdings dann meist mit vimdiff zusammen):

Code: Alles auswählen

vim <(cmd datei1.txt | cmd2) <(cmd datei2.txt | cmd2)
Das ist natuerlich auch eine Moeglichkeit ... auf die ich bloss deshalb nicht komme, weil solche modernen Bash-Features voellig ausserhalb meiner Denkwelt liegen. :-D
Use ed once in a while!

Benutzeravatar
Livingston
Beiträge: 1816
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Stdout von mehreren befehlen in vim als tabs öffnen

Beitrag von Livingston » 10.07.2022 16:18:07

Meillo hat geschrieben: ↑ zum Beitrag ↑
10.07.2022 08:37:35
Das ist natuerlich auch eine Moeglichkeit ... auf die ich bloss deshalb nicht komme, weil solche modernen Bash-Features voellig ausserhalb meiner Denkwelt liegen. :-D
Ha, der ist gut! Ich habe erst vor ein paar Tagen mein Bücherregal ausgemistet und das Buch "Shell-Programmierung in Unix" (C&L-Verlag, 2001) wiederentdeckt. Dort wird bereits auf diese "bewährte Umleitungsmethode" hingewiesen, natürlich nicht ohne den Warnhinweis, dass die Original-Bourne-Shell das noch nicht beherrscht.
Ich muss mal schauen, ob ich noch Literatur finde, die das ganze als "neumodischen Kram" darbietet.
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

reox
Beiträge: 2529
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Stdout von mehreren befehlen in vim als tabs öffnen

Beitrag von reox » 11.07.2022 18:30:11

Process Substitution kenne ich auch, aber da fehlt mir die Möglichkeit das irgendwie in einer wildcard zu verwenden - klar iwi mit xargs und dann nach bash pipen wäre ne möglichkeit :D
Für den aktuellen Anwendungsfall wären es 19 dateien, da wird händisch tippen mühsam.

bei multitail ist mir nicht ganz klar, wie ich den input als argument eines programmes verwenden kann, oder wie müsste man das dann aufrufen? Leider kann multitail auch keine tabs, sondern nur splits.

Eine Variante die mir grad noch eingefallen ist, wäre wohl noch es mit tmux zu machen:

Code: Alles auswählen

tmux new-session -d -s mysession
for file in *.txt; do
    tmux new-window -d -n $file -t mysession "cmd $file | less"
done
tmux a
Da könnte man also extra auch noch in vim pipen - aber less tuts eigentlich auch.

uname
Beiträge: 12406
Registriert: 03.06.2008 09:33:02

Re: Stdout von mehreren befehlen in vim als tabs öffnen

Beitrag von uname » 12.07.2022 10:12:48

Vielleicht kannst du auch den Midnight Commander Debianmc verwenden. Leider verwende ich den viel zu selten. Ich denke durch Funktionstasten kannst du ähnlich schnell zwischen den Dateien wechseln wie bei Vim oder tmux.

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Stdout von mehreren befehlen in vim als tabs öffnen

Beitrag von Meillo » 12.07.2022 10:43:46

reox hat geschrieben: ↑ zum Beitrag ↑
11.07.2022 18:30:11
Process Substitution kenne ich auch, aber da fehlt mir die Möglichkeit das irgendwie in einer wildcard zu verwenden - klar iwi mit xargs und dann nach bash pipen wäre ne möglichkeit :D
Ja, so wuerde ich es machen: einen Befehl als String zusammenbauen und den dann an die Shell fuettern, egal ob mit `eval' oder `sh -c' oder `|sh'. Oder du baust die Kommandozeile in einem String zusammen und expandierst denn dann ohne Quotes, damit er wieder in Worte gesplittet wird.

Natuerlich ist das alles nicht ganz so schoen wie wenn du nur ueber Dateinamen iterieren musst ... was aber nur dann geht, wenn du fuer jeden Dateinamen einen separaten Befehl aufrufst (wie du das in deinen zwei Beispielen tust). Einen einzigen Befehl mit variablen Inhalten aufzurufen erfordert immer ein erneutes Parsen. Falls es dabei nur um statische Dateinamen geht, dann kannst du das recht sicher mit xargs tun. Wenn die Argumente aber wiederum Shell-Logik enthalten (wie diese Process Substitution), dann wirst du um ein erneutes Parsen des zusammengebauten Befehls nicht drumrum kommen. (Ja, eval ist moeglicherweise evil ... aber manchmal dennoch dein Freund. ;-) )
Use ed once in a while!

Antworten