Какая разница между: update и: w в Vim?

Я понял, что в gvim Control+S используется команда :update. Я всегда сохраняю с помощью Ctrl+S, поэтому я предполагаю, что :update - это еще один способ сказать "обновить изменения". Является ли :update в основном таким же, как write :w? У меня возникнут проблемы, если я заменил :update на :w!?

edit: Я хотел изменить :update на :w! becauase У меня есть файл с надписью "ready-only, пожалуйста, добавьте !". И я думал, что это единственное решение

Ответы

Ответ 1

:help :update довольно ясно:

Like ":write", but only write when the buffer has been modified.

Таким образом, файл будет записан только в том случае, если содержимое буфера фактически было изменено. Поэтому, если вы используете :update (или нажмите Ctrl + S в GVim), и в буфере нет несохраненных изменений, ничего не будет сделано.

Ответ 2

Вот еще один способ объяснить разницу между :write (ярлык :w) и :update (ярлык :up):

Всякий раз, когда мы вводим :w, VIM буквально записывает буфер в файл, независимо от того, пуст он пуст или нет. Этот СРЕДСТВА обновит временную метку файла до введенного времени :w, даже если содержимое файла НЕ действительно изменилось.

В то время как при :up, как и в справочном руководстве по vim, VIM будет ТОЛЬКО обновлять временную метку, когда файл был изменен.


Например, когда я открываю файл только для чтения, но я могу случайно (или обычно) набирать :w или :wq, и если мне действительно нужны временные метки файла (то есть последнее измененное время), тогда нет возврата назад. Следующие примеры (в оболочке BASH) показывают эффекты:

$ touch test.txt
$
$ stat test.txt
      File: `test.txt'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828498    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-15 22:30:52.159258193 +0800
Modify: 2014-03-15 22:30:52.159258193 +0800
Change: 2014-03-15 22:30:52.159258193 +0800

Теперь дайте VIM файлу и попробуйте :up и :w команду соответственно:

$ vim test.txt

Не редактируйте, просто введите :up, а затем :q

$ stat test.txt
  File: `test.txt'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828498    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-15 22:33:10.002269244 +0800  <--- Different!
Modify: 2014-03-15 22:30:52.159258193 +0800  <--- Didn't Change!
Change: 2014-03-15 22:30:52.159258193 +0800  <--- Didn't Change!

Как вы можете видеть, изменяется только время доступа, потому что мы читаем (Access) данные в файле. Но время изменения и изменения времени остается неизменным.


Теперь давайте снова vim и используем команду :w.

$ vim test.txt

Не редактируйте, но на этот раз введите :w, а затем :q

$ stat test.txt
  File: `test.txt'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 811h/2065d  Inode: 98828538    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  514/    rank)   Gid: (  514/    rank)
Access: 2014-03-15 22:40:26.728239153 +0800  <--- Different Again!
Modify: 2014-03-15 22:40:26.728239153 +0800  <--- Changed!
Change: 2014-03-15 22:40:26.728239153 +0800  <--- Changed!

Теперь мы можем видеть разницу между :up и :w! Данные файла изменены и статус файла также изменен, хотя в файле ничего не изменилось.


Итак, чтобы избежать этого, можно сопоставить команду :w с командой :up, используя :map :w :up.

Ответ 3

С помощью:

:[range]up[date][!] [++opt] [>>] [file]
                        Like ":write", but only write when the buffer has been
                        modified.  {not in Vi}

Ответ 4

:help :update говорит:

Подобно ": write", но записывать только при изменении буфера.