Chciałbym edytować zawartość w vimie, która została dynamicznie wygenerowana z wiersza poleceń bez posiadania pliku.
W przykładzie:
$ echo This is example. | vim /dev/stdin
$ cat /etc/hosts | vim /dev/stdin
ale nie działa z błędami:
Vim: Ostrzeżenie: Dane wejściowe nie pochodzą z terminala
Vim: Błąd odczytu danych wejściowych, wychodzenie ...
Czy można to osiągnąć?
command-line
invocation
unix
kenorb
źródło
źródło
:help stdin
... To niesamowite, jak szybko można znaleźć odpowiedzi, zadając pytanie dotyczące wbudowanej dokumentacji.Odpowiedzi:
Musisz użyć
-
zamiast nazwy pliku w wierszu poleceń:Powyższe polecenie otworzy nienazwany bufor wypełniony tekstem odczytanym ze standardowego wejścia.
źródło
-
for stdin jest standardem dla narzędzi wiersza poleceń;To jest po prostu fajna uwaga na temat
bash
ireadline
, ale jeśli ustawiszEDITOR
zmienną środowiskową navim
, naciśnięcie Ctrl+ x+ eotworzy bieżącą linięvim
. Ponadto, jeśli wpiszesz Meta(Alt/Opt/Esc)+ Ctrl+ e, bash wykona rozwinięcie w miejscu w bieżącym wierszu poleceń, tj .:z Meta(Alt/Opt/Esc)+ Ctrl+ estałoby się
z Ctrl+ x+ estałoby się
Zauważ, że po wyjściu z vima zawartość bufora vim jest wykonywana w wierszu poleceń.
Funkcje te stają się dla mnie bardzo przydatne, gdy chcę wykonywać polecenia wieloliniowe w trybie bash, takie jak pętle lub programy wymagające tutaj instrukcji, i zapewnia ciekawy sposób zapisania odrobiny historii wiersza poleceń do pliku do późniejszego wykorzystania.
Aby odpowiedzieć na oryginalne pytanie, możesz również napisać:
a następnie naciśnij Ctrl+ x+, eaby załadować
vim
. Ty też możesz mieći wykonaj Meta(Alt/Opt/Esc)+ Ctrl+, ea następnie Ctrl+ x+ e, co umieściłoby wszystkie pliki hosts w jednym wierszu i załadowało je
vim
(prawdopodobnie nie najlepsze wykorzystanie tych funkcji - jednak użyteczność tych metod można ekstrapolować z kilku omówionych przykładów tutaj).Zauważ, że zakładam, że
readline
ustawiony jestemacs
tryb. Jeślireadline
ustawiony jestvim
tryb, możesz łatwo odkryć odpowiednie powiązania za pomocą polecenia:i wyszukiwanie
edit-and-execute-command
lubshell-expand-line
, które były odpowiednio powiązane z powiązaniami Ctrl+ x+ ei Meta(Alt/Opt/Esc)+ Ctrl+ e.źródło
set -o vi
aby włączyć. Następnie możesz po prostu użyćv
mapowania w trybie normalnym, aby edytować bieżące polecenie w edytorze.shell-expand-line
usuń znaki nowej linii z rozwiniętego tekstu i 2.edit-and-execute-command
spróbuj wykonać polecenie zapisane w buforze , cokolwiek jest zapisane lub nie, po wyjściu z vi.W bashu użyteczne jest stosowanie podstawiania procesów przy użyciu
<(command)
składni, na przykład:Zobacz też:
źródło
bash
izsh
(a niesh
,ksh
,dash
,fish
,csh
,tcsh
, itd.)/proc/PID/fd/FD
. Jeśli napiszesz bufor i wyjdziesz, Vim nie narzeka, ale plik, do którego napisałeś, zostanie usunięty przez system operacyjny. Użycie-
jako nazwy pliku otwartego bufora nie wiąże się z żadnym plikiem, więc jeśli spróbujesz wyjść bez (dopóki nie użyjesz komendy huk lub podobnego), zapisanie Vima cię ostrzeże.vimdiff <(echo foo) <(echo bar)
.:next
i:prev
ponownie czyta strumień i nic nie dostaje. Warto również wspomnieć, że procesy nie są równoległe względem siebie - np.cat <(sleep 3; echo a) <(echo b)
Odbitki w kolejności - i podczas gdycat
przeploty zapisują i odczytują,vim
czeka na pliku, aby „zakończyć czytanie”, zanim wyświetli wszystko oprócz ramki zewnętrznej.Jeśli użycie potoku do nowego Vima nie jest wymagane, możesz użyć zdolności Vima do pobierania danych wyjściowych poleceń do bieżącego bufora, w połączeniu z posiadaniem bufora nieopartego na pliku (tak jak w przypadku
:new
edytowania nieistniejącego pliku):read!cat /etc/hosts
w trybie poleceń umieści dane wyjściowe w bieżącym buforze poniżej bieżącej pozycji kursora.Oprócz konieczności usuwania pustego pierwszego wiersza, który pozostaje, gdy jest to wykonywane w pustym buforze, działa to dobrze i jest szczególnie wygodne, jeśli Vim już działa.
źródło