Czasami próbowałem wywołać Vima przy użyciu xargs
:
find . -name '*.java' | xargs vim
… Jaki rodzaj prac:
Gdy uruchamia się Vim, na krótko pojawia się następujące ostrzeżenie:
Vim: Warning: Input is not from a terminal
- Edycja działa -
:files
poprawnie wylicza wszystkie.java
pliki zgodnie z oczekiwaniami. - Mogę zapisać i zrezygnować.
Jednak po wyjściu z Vima mój terminal jest zablokowany:
- Cokolwiek napiszę w wierszu poleceń powłoki, nie jest powtarzane.
- Zwroty karetki w ogóle się nie pojawiają, a linie pojawiają się tylko czasami.
Trwa to do momentu wydania reset(1)
polecenia ponownego zainicjowania terminala.
Czy to błąd Vima, czy może istnieje bardziej satysfakcjonujące wyjaśnienie, dlaczego współpracuje on z terminalem w ten sposób? Widziałem, jak to się dzieje w Vimie do wersji 7.3 (wersja nie wydaje się mieć znaczenia) w Linuksie i różnych Uniksach.
Mam świadomość jednego obejścia, a mianowicie vim $(find . -name '*.java')
. Inne obejścia byłyby mile widziane, ale to nie jest moje główne pytanie.
terminal
invocation
unix
quit
200_sukces
źródło
źródło
xargs
używa manekinastdin
, z którego nie może korzystać Vim. wszystko później.Odpowiedzi:
Dzieje się tak, gdy vim jest wywoływany i jest podłączony do wyjścia poprzedniego potoku, zamiast terminala i otrzymuje inne nieoczekiwane dane wejściowe (takie jak NUL). To samo dzieje się po uruchomieniu:,
vim < /dev/null
więcreset
polecenie w tym przypadku pomaga. Wyjaśnia to dobrze grawitacja u administratora .Jeśli używasz
find
do przekazywania nazw plików do edycji, nie potrzebujeszxargs
, po prostu użyj-exec
na przykład:Jeśli chcesz użyć
xargs
, na Unix / macOS powinieneś użyć-o
parametru, takiego jak:lub:
Uwaga: Użycie
-print0
/-0
będzie obsługiwać nazwy plików z białymi spacjami.find
+ BSDxargs
W systemach Unix / macOS możesz wypróbować następujące obejście:
Możesz także użyć składni zastępowania poleceń , na przykład:
Alternatywnie użyj GNU
parallel
zamiastxargs
wymusić alokację tty, na przykład:Uwaga:
parallel
w systemach Unix / OSX nie będzie działać, ponieważ ma inne parametry i nie obsługuje tty.Wiele innych popularnych komend zapewnia alokację pseudo-tty a także (jak
-t
wssh
), więc sprawdzić o pomoc.Inną sugestią byłoby użycie:
ex
edytor wiersza poleceń do analizowania danych lub korzystania z trybu Ex, aby uzyskać więcej informacji, zobacz:Jak edytować pliki w sposób nieinteraktywny (np. W przygotowaniu)?
vipe
(potok poleceń Vima)użyj następującego prostego skryptu:
Związane z:
grep -l .. | xargs vim
generuje ostrzeżenie, dlaczego? [dup] w unix SEźródło
xargs
nie ma-J
. Wydaje się, że jest to opcja MacOS (BSD), która nie występuje w wersji GNU.Sugestia obejścia: użyj bufora jako nawigatora systemu plików
Użyj
vim -
polecenia, aby odczytać listę ścieżek ze standardowego wejścia. Vim:help --
wyjaśnia to: 1Następnie możesz użyć gflub, Ctrl-wCtrl-faby przejść do pliku odpowiednio w tym samym buforze lub w nowym podzielonym oknie.
Sugestia obejścia: lista argumentów
Innym świetnym sposobem jest użycie listy argumentów Vima.
:argadd **/*.java
Komenda będzie zapełnić listę argumentów Vim jest ze wszystkich plików znajdujących się wewnątrz java bieżącym katalogu rekurencyjnie. Następnie można użyć:next
i:prev
do poruszania się pomiędzy plikami.1 pierwszy
-
mówi Vimowi, że chcesz przeszukać pomoc dla opcji wiersza poleceń, drugi to tak naprawdę flaga wiersza poleceń, której szukasz. Przeczytaj:help help-context
więcej takich sztuczek.źródło
Poza tym
reset
możesz spróbować:co również powinno sprawić, że twój terminal będzie znów użyteczny.
Zobacz tutaj o wyjaśnienia. I jakoś można to uznać za niewłaściwe zachowanie, przynajmniej Neovim nie ma obecnie tego problemu.
źródło
reset
też powinienem.Powodem jest to, że
xargs
zestawystdin
do/dev/null
, natomiastvim
potrzebystdin
, aby być/dev/tty
.xargs
Rozwiązanie BSD (np. Mac):-o
ustawia processtdin
potomny xarg (vim
w tym przypadku) nadev/tty
.xargs
Rozwiązanie GNU (np. Linux):GNU
xargs
nie ma takiej-o
opcji. Zamiast tego będziesz musiał zastosować bardziej skomplikowane obejście. (Uwaga: bardzo ważne jest, aby mieć końcowyzero
ciąg, nie zapomnij go.)Możesz także ustawić go jako alias:
Szczegółowe objaśnienie rozwiązania GNU xargs
Podzielmy to krok po kroku:
1.
xargs
po prostu dołączastdin
koniec łańcucha, więcxargs
wykonamy to:2. Format dla
bash -c
tobash -c 'COMMAND_STRING' $0 $1 $2 etc
."$@"
rozwija się do parametrów pozycyjnych"$1", "$2"
itp. Nie zawiera „$ 0”, ponieważ jest to specjalny parametr dla nazwy skryptu, a nie parametr pozycyjny. Właśnie dlatego musimy dodać fikcyjny ciągzero
(może to być dowolny ciąg), aby zajął miejsce$0
. W przeciwnym razie stracisz pierwszy plik.Po rozwinięciu uzyskujesz
"$@"
:3.
bash -c
wykona COMMAND_STRING:</dev/tty
ustawiastdin
się/dev/tty
tak, żevim
mogą pracować w trybie interaktywnym.źródło
$0
Zastępczy (tutaj „zero”) jest kluczem.Nie znalazłem wszystkich tych odpowiedzi. Po zmaganiu się z problemem xargs najprostszym sposobem - dla mnie! - na wyszukiwanie i otwieranie w ogólnym polu jest:
Nie mam problemu korzystając
find
zxargs
agrep
, ale uważam, że składnia denerwujące. Jako codzienny programista, który używavim
terminala jako swojego IDE i stale przeszukuje pliki pod kątem właściwości, właśnie tego używałem.Jest czas i miejsce w
find . -path ./node_modules -prune -o -name '*.js' | xargs grep -i mySearchTerm
połączeniu z otwieraniem plików za pomocą vima i innymi metodami. Dla mnie to rzadko.Mam nadzieję, że to komuś pomoże.
źródło
$(...)
zamiast tego używać . Nie jest to tak ważne w wierszu poleceń, jak w skrypcie, ale myślę, że nadal lepiej jest używać tego w swoich odpowiedziach :) (odniesienia tutaj i tutaj )