Öffnen Sie eine Datei, die durch das Ergebnis eines Befehls in vim angegeben wurde

34

Fast jeden Tag mache ich Folgendes

  1. Führe einen Fund aus ( find -name somefile.txt)
  2. Öffnen Sie das Ergebnis in vim

Das Problem ist, dass ich das Ergebnis von kopieren und findin den vimBefehl einfügen muss . Gibt es eine Möglichkeit, dies zu vermeiden? Ich habe ein bisschen experimentiert ( find -name somefile.txt | vim), aber nichts gefunden, was funktioniert.

Danke im Voraus

riechen
quelle

Antworten:

31

Sie können die Befehlssubstitution verwenden:

vim $(find -name somefile.txt)

oder

find -name somefile.txt -exec vim {} \;
Dogbane
quelle
1
okay. Wenn dies erforderlich ist, suchen Sie -name somefile.txt | xargs vim
balki
3
Nein, das funktioniert nicht richtig und kann sogar Ihr Terminal durcheinander bringen! Sie können keine Pipe an xargs vim senden, da vim erwartet, dass Eingaben von einem interaktiven Terminal kommen.
Dogbane
1
Ein anonymer Benutzer merkt an, dass dies fehlschlägt, wenn der Dateiname Leerzeichen enthält
Michael Mrozek
4
Eine andere Alternative wäre vim `find -name somefile.txt`. @StuartPowers Alternativ können Sie verwenden, vim `!-1`wenn Sie diesen Fund bereits als vorherigen Befehl verwendet haben
Bernhard
1
@balki Um in diesem Szenario xargs zu verwenden, müssen Sie das Flag -o verwenden. Es befindet sich im man: -o Öffnen Sie stdin als / dev / tty im untergeordneten Prozess, bevor Sie den Befehl ausführen. Dies ist nützlich, wenn xargs eine interaktive Anwendung ausführen soll.
Davidmh
7

Versuche dies:

  1. starte vim
  2. Verwenden Sie in vim Folgendes:

:r!find /<path> -name 'expression'

Die Ergebnisse sollten in vim angezeigt werden, wenn die Suche abgeschlossen ist.

Oder

Versuchen:

find /<path> -name > results.txt
vim results.txt 
Karl
quelle
Meine Lösung funktioniert genauso, aber warum wird sie abgelehnt?
Balki
5

Wenn es Ihnen nichts ausmacht, den Befehl erneut Upauszuführen, drücken Sie und fügen Sie einen xargsBefehl hinzu. Oder verwenden Sie die Protokollersetzung und führen Sie sie aus

!! | xargs vim          # won't work with file names containing \'" or whitespace
!! | xargs -d \\n vim   # GNU only (Linux, Cygwin)

Es gibt eine einfache Möglichkeit, die Ausgabe eines Befehls zu speichern, die in ksh und zsh funktioniert, jedoch nicht in bash (dazu muss die Ausgabeseite einer Pipeline in der übergeordneten Shell ausgeführt werden). Rohr der Befehl in die Funktion K(zsh Definition unten), die k seine Ausgabe in der Variablen EEPs $K.

function K {
    K=("${(@f)$(tee /dev/fd/3)}") 3>&1;
}
find  |K
vim $K

Das automatische Speichern der Ausgabe jedes Befehls ist mit der Shell allein nicht möglich. Sie müssen den Befehl in einem emulierten Terminal ausführen. Sie können dies tun, indem Sie das scriptBSD-Dienstprogramm (das auf den meisten Unices, einschließlich Linux und Solaris, verfügbar ist) ausführen, wodurch die gesamte Ausgabe Ihrer Sitzung über eine Datei gespeichert wird ).

Gilles 'SO - hör auf böse zu sein'
quelle
2

Ich benutze gerne die Back Ticks (auf der gleichen Taste wie das ~)

> vim `find . -name somefile.txt`

Die hinteren Häkchen führen den Befehl innerhalb der Häkchen aus und die Ausgabe kann dann vom Befehl verwendet werden. Oben finden Sie alle Dateien somefile.txt, mit denen Sie :nextsich durch alle Dateien bewegen können.

Es ist sehr nützlich, wenn Sie den Befehl einige Male verfeinern, da Sie dann die Protokollersetzung verwenden können, um den Befehl für den Editor zu wiederholen.

> find . -name somefile.txt
./debug/somefile.txt
./somefile.txt
> vi `!!`
Martin York
quelle
2

Ich muss den Punkt hier verpasst haben, weil ich verwenden würde:

:find **/somefile.txt

(wenn ich wüsste, dass es nur einen in meinem gibt :echo &path ) oder wenn ich sie alle haben wollte:

:args **/somefile.txt

Bearbeiten: Whoa! Ok, also ich habe vermissen den Punkt - Sie finden die Liste wollen, nicht die eigentlichen Dateien geöffnet? Versuchen Sie (erneut, aus Vim heraus):

!!find . -name somefile.txt

-- mein Fehler :)

Barry Arthur
quelle
1

Wie @davidmh in den Kommentaren zeigte, können Sie xargsmit dem Flag verwenden, -owenn Sie eine interaktive Anwendung verwenden möchten.

find . -name somefile.txt | xargs -o vim

Wenn Sie dies nicht tun -o, werden Sie wahrscheinlich den Terminalstatus durcheinander bringen, nachdem Sie vim verlassen haben. Wenn Sie dies getan haben, sollten Sie in der Lage sein, Ihr Terminal mit dem folgenden Befehl zurückzusetzen:

reset
Durum
quelle
0

Ich habe eine Funktion geschrieben, pvimdie macht, was Sie wollen. Wenn mehrere Zeilen zu pvimihm geleitet werden, werden alle bis auf die erste ignoriert, es könnte jedoch erweitert werden, um mehrere Dateien in vim zu öffnen.

stu@sente ~ $ function pvim() { read -r somefile; exec < /dev/fd/1; vim "$somefile"; }
stu@sente ~ $ type pvim
pvim is a function
pvim ()
{
    read -r somefile;
    exec < /dev/fd/1;
    vi "$somefile"
}

Verwenden Sie es wie folgt:

stu@sente ~ $ find . -name "foo.txt" | pvim

Das wird die erste "foo.txt" in vim laden, als ob Sie Folgendes eingegeben hätten:

vim $(find . -name "foo.txt | head -n1")

sente
quelle
0

Hier ist eine einfachere xargsLösung als die bereits erwähnten:

find -name somefile.txt | xargs vim -p

Die -pOption teilt vimmit, dass jede Datei auf einer separaten Registerkarte geöffnet werden soll. Ich finde das praktischer als die Verwendung von Puffern.

Cory Klein
quelle
0

Ich fand, dass das Öffnen einer Datei mit Hilfe von locatein vim extrem bequem und viel schneller ist als find.

Der folgende Befehl durchsucht eine Datei, die app.pyin dem Pfad aufgerufen wird, der das Verzeichnis enthält MyPythonProject.

:args `locate '*MyPythonProject*app.py'`
Searene
quelle