В :w !sudo tee %
...
%
означает «текущий файл»
Как указал eugene y , %
действительно означает «текущее имя файла». Другое использование для этого в Vim находится в командах замещения. Например, :%s/foo/bar
означает « в текущем файле , замените вхождения foo
на bar
». Если вы выделите какой-нибудь текст перед вводом :s
, вы увидите, что выделенные строки заменят %
в качестве диапазона замены.
:w
не обновляет ваш файл
Одна запутанная часть этого трюка заключается в том, что вы можете подумать, что :w
изменяет ваш файл, но это не так. Если вы откроете и измените file1.txt
, а затем запустите :w file2.txt
, это будет «сохранить как»; file1.txt
не будет изменен, но текущее содержимое буфера будет отправлено на file2.txt
.
Вместо file2.txt
вы можете заменить команду оболочки для получения содержимого буфера . Например, :w !cat
будет просто отображать содержимое.
Если Vim не запускался с доступом sudo, его :w
не может изменить защищенный файл, но если он передает содержимое буфера в оболочку, команда в оболочке может быть запущенным с sudo . В этом случае мы используем tee
.
Понимание тройник
Что касается tee
, представьте команду tee
как Т-образную трубу в обычной ситуации с bash-трубопроводами: она направляет вывод в указанные файлы и также отправляет ее на стандартный вывод, который может быть захвачен следующей переданной командой.
Например, в ps -ax | tee processes.txt | grep 'foo'
список процессов будет записан в текстовый файл и , переданный в grep
.
+-----------+ tee +------------+
| | -------- | |
| ps -ax | -------- | grep 'foo' |
| | || | |
+-----------+ || +------------+
||
+---------------+
| |
| processes.txt |
| |
+---------------+
(Диаграмма, созданная с помощью Asciiflow .)
Для получения дополнительной информации см. Справочную страницу tee
.
Ти как хак
В ситуации, которую описывает ваш вопрос, использование tee
- это хак, потому что мы игнорируем половину того, что он делает . sudo tee
записывает в наш файл, а также отправляет содержимое буфера на стандартный вывод, но мы игнорируем стандартный вывод . В этом случае нам не нужно ничего передавать другой переданной команде; мы просто используем tee
в качестве альтернативного способа записи файла, чтобы мы могли вызвать его с помощью sudo
.
Упростить этот трюк
Вы можете добавить это к своему .vimrc
, чтобы сделать этот трюк простым в использовании: просто наберите :w!!
.
" Allow saving of files as sudo when I forgot to start vim using sudo.
cmap w!! w !sudo tee > /dev/null %
> /dev/null
part явно отбрасывает стандартный вывод, поскольку, как я уже сказал, нам не нужно ничего передавать другой переданной команде.