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ę :w
część, 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 tee
polecenie i %
reprezentuje bieżącą zawartość bufora, prawda?
Ale nadal nie rozumiem, jak to działa.
27
tee
?%
reprezentuje nazwę bieżącego bufora, a nie jego zawartość.:w !sudo tee %
oznacza to, że potokuj bieżący bufor dosudo 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
źródło
Nie do końca!
!command
uruchamia polecenie jako polecenie filtru , które pobiera tekststdin
, coś robi i wysyła dostdout
.Za pomocą
w
, to pchnął zawartość pliku dostdin
zsudo tee %
.%
to specjalny rejestr w vimie, który przechowuje nazwę bieżącego pliku.Masz więc
sudo tee FILENAME
, co spowoduje wypchnięcietee
stdin
- zawartość pliku - do bieżącego pliku.źródło
:!command
jest filtrem (por.:h !
), chociaż:w !command
nie jest, po prostu wykonuje sięcommand
z bieżącym plikiem jakostdin
(por:h :w_c
.). To:w !sed /./d
znaczy : 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.