Otwórz plik podany w wyniku polecenia w vimie

34

Prawie codziennie robię następujące rzeczy

  1. Uruchom wyszukiwanie ( find -name somefile.txt)
  2. Otwórz wynik w vim

Problem polega na tym, że muszę skopiować i wkleić wynik polecenia finddo vimpolecenia. Czy jest jakiś sposób na uniknięcie tego? Trochę eksperymentowałem ( find -name somefile.txt | vim), ale nie znalazłem niczego, co działa.

Z góry dziękuję

smauel
źródło

Odpowiedzi:

31

Możesz użyć podstawienia polecenia:

vim $(find -name somefile.txt)

lub

find -name somefile.txt -exec vim {} \;
dogbane
źródło
1
dobrze. Jeśli to jest potrzebne, znajdź -name somefile.txt | xargs vim
balki
3
Nie, to nie działa poprawnie i może nawet zepsuć terminal! Nie możesz potokować do varga xargsa, ponieważ vim oczekuje, że dane wejściowe będą pochodzić z terminala interaktywnego.
dogbane
1
Anonimowy użytkownik zauważa, że to się nie powiedzie, jeśli nazwa pliku ma spacje
Michael Mrozek
4
Inną alternatywą byłoby vim `find -name somefile.txt`. @StuartPowers Ewentualnie możesz użyć, vim `!-1`jeśli już używałeś tego znaleziska, gdybyś był poprzednim poleceniem
Bernhard
1
@balki, aby użyć xargs w tym scenariuszu, musisz użyć flagi -o, to jest w man: -o Ponownie otwórz stdin jako / dev / tty w procesie potomnym przed wykonaniem polecenia. Jest to przydatne, jeśli chcesz, aby xargs uruchamiał interaktywną aplikację.
davidmh
7

Spróbuj tego:

  1. rozpocznij vim
  2. vim, użyj następujących poleceń:

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

Wyniki powinny pojawić się w vimie po zakończeniu wyszukiwania.

Lub

Próbować:

find /<path> -name > results.txt
vim results.txt 
Karl
źródło
Moje rozwiązanie działa dokładnie tak samo, ale dlaczego zostało odrzucone?
balki 15.01.11
5

Jeśli nie masz nic przeciwko ponownemu uruchomieniu polecenia: naciśnij Upi dodaj xargspolecenie. Lub użyj podstawienia historii i uruchom

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

Istnieje lekki sposób zapisywania danych wyjściowych polecenia, które działa w ksh i zsh, ale nie w bash (wymaga strony wyjściowej potoku do wykonania w powłoce nadrzędnej). Rura komenda do funkcji K(zsh definicja poniżej), które k eeps swoje wyjście w zmiennej $K.

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

Automatyczne zapisywanie danych wyjściowych każdego polecenia nie jest tak naprawdę możliwe w przypadku samej powłoki, należy uruchomić polecenie w emulowanym terminalu. Możesz to zrobić, uruchamiając się w środku script(narzędzie BSD, ale dostępne na większości unikatów, w tym Linux i Solaris), który zapisuje wszystkie dane wyjściowe sesji za pomocą pliku (wciąż jest trochę wysiłku, aby niezawodnie wykryć ostatni monit w maszynie ).

Gilles „SO- przestań być zły”
źródło
2

Lubię używać tylnych tyknięć `(Jest na tym samym klawiszu co ~)

> vim `find . -name somefile.txt`

Tylne tiki wykonują polecenie wewnątrz tików, a następnie wyjście może zostać użyte przez komendę. Powyższe znajdzie wszystkie pliki somefile.txt, umożliwiając w ten sposób :nextprzechodzenie między wszystkimi plikami.

Jest to bardzo przydatne, jeśli spędzisz kilka prób dopracowania polecenia, ponieważ możesz następnie użyć podstawienia historii, aby powtórzyć polecenie edytora.

> find . -name somefile.txt
./debug/somefile.txt
./somefile.txt
> vi `!!`
Martin York
źródło
2

Musiałem pominąć tę kwestię, ponieważ użyłbym:

:find **/somefile.txt

(gdybym wiedział, że jest tylko jeden :echo &path ) lub, gdybym chciał je wszystkie:

:args **/somefile.txt

Edycja: Whoa! Ok, więc nie trafiłem w sedno - chcesz listę wyszukiwania, a nie otwarte pliki? Spróbuj (ponownie, z poziomu Vima):

!!find . -name somefile.txt

-- mój błąd :)

Barry Arthur
źródło
1

Jak wskazał @davidmh w komentarzach, możesz użyć xargsflagi, -ojeśli chcesz użyć interaktywnej aplikacji.

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

Jeśli nie użyjesz -o, prawdopodobnie zepsujesz stan terminala po opuszczeniu vima. Jeśli to zrobiłeś, powinieneś być w stanie zresetować terminal za pomocą następującego polecenia:

reset
durum
źródło
0

Napisałem funkcję, pvimktóra robi to, co chcesz. Jeśli do pvimniego podłączonych jest wiele linii , ignoruje wszystkie oprócz pierwszej, można go jednak rozszerzyć, aby otworzyć wiele plików w vimie.

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"
}

Użyj tego jak:

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

który załaduje pierwszy „foo.txt” do vima tak, jakbyś wpisał:

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

sente
źródło
0

Oto prostsze xargsrozwiązanie niż już wspomniane:

find -name somefile.txt | xargs vim -p

Ta -popcja mówi vimo otwarciu każdego pliku na osobnej karcie. Uważam to za wygodniejsze niż używanie buforów.

Cory Klein
źródło
0

Przekonałem się, że otwarcie pliku za pomocą programu locatein vim jest niezwykle wygodne i znacznie szybsze niż find.

Następujące polecenie wyszukuje plik wywołany app.pyw ścieżce zawierającej katalog MyPythonProject.

:args `locate '*MyPythonProject*app.py'`
Searene
źródło