Jak działa `: w! Sudo tee%`

27

Jeśli otworzysz plik, do którego nie masz uprawnień do zapisu w vimie, to zdecydujesz, że musisz go zmienić, możesz napisać zmiany bez wychodzenia z vima :w !sudo tee %
, ponieważ nie rozumiem, jak to może działać. Czy możesz to przeanalizować?
Rozumiem tę :wczęść, zapisuje bieżący bufor na dysk, zakładając, że już jest z nim związana nazwa pliku, prawda?
Rozumiem również, kto !wykonuje sudo teepolecenie i %reprezentuje bieżącą zawartość bufora, prawda?
Ale nadal nie rozumiem, jak to działa.

Ali
źródło

Odpowiedzi:

30

Struktura :w !cmdoznacza „zapisz bieżący bufor przesłany potokiem za pomocą polecenia”. Możesz to zrobić na przykład :w !cati przepuści bufor cat.

Teraz %jest nazwa pliku skojarzony z buforem

Tak :w !sudo tee %rurowy będzie zawartość bufora poprzez sudo tee FILENAME. To skutecznie zapisuje zawartość bufora do pliku.

Stephen Harris
źródło
A co to jest tee?
CodyBugstein
7

% reprezentuje nazwę bieżącego bufora, a nie jego zawartość.

:w !sudo tee %oznacza to, że potokuj bieżący bufor do sudo tee [currentfilename].

tee jest uruchamiany jako root, więc ma prawo zapisu, aby zapisać swoje standardowe wejście do pliku.

Zobacz także /programming/2600783/how-does-the-vim-write-with-sudo-trick-work

cas
źródło
2

Nie do końca!

!commanduruchamia polecenie jako polecenie filtru , które pobiera tekst stdin, coś robi i wysyła do stdout.

Za pomocą w, to pchnął zawartość pliku do stdinz sudo tee %. %to specjalny rejestr w vimie, który przechowuje nazwę bieżącego pliku.

Masz więc sudo tee FILENAME, co spowoduje wypchnięcie tee stdin- zawartość pliku - do bieżącego pliku.

Cuonglm
źródło
2
:!commandjest filtrem (por. :h !), chociaż :w !commandnie jest, po prostu wykonuje się commandz bieżącym plikiem jako stdin(por :h :w_c.). To :w !sed /./dznaczy : nie zmienia zawartości bieżącego bufora. Ale przepis jest rzeczywiście nie tak z innej przyczyny, %należy uciec: :exec 'w !sudo tee ' . shellescape(expand('%', 1)). Oryginalne polecenie nie działa z, powiedzmy, nazwami plików ze spacjami.
Satō Katsura