Как я могу сделать Vim автоматически сохранять файлы, когда он теряет фокус? - PullRequest
31 голосов
/ 09 января 2011

Я привык, что мои редакторы автоматически сохраняют файлы, когда они теряют фокус. Я недавно переключился на MacVim, и я не могу воссоздать такое поведение. Я попробовал это:

autocmd BufLeave,FocusLost * wall

но если буфер не назван, когда окно или MacVim теряет фокус, я получаю сообщение об ошибке, подобное следующему:

Error detected while processing BufLeave Auto commands for "*":
E141: No file name for buffer 1

Я в замешательстве, потому что документация :wall гласит:

Write all changed buffers.  Buffers without a file
name or which are readonly are not written.

так что я ожидаю, что он пропустит безымянные буферы. Есть ли лучший способ сделать это?

Редактировать

Я почти уверен, что лучший способ сделать то, что я хотел, используя BufLeave - сохранять буферы при переключении между ними, поэтому я не получаю «Нет записи с момента последнего изменения» - это установить 'autowriteall'. Вопрос остается открытым, когда MacVim теряет фокус на другие приложения (FocusLost).

Ответы [ 4 ]

39 голосов
/ 09 января 2011

Вы не заботитесь об ошибках в этих обстоятельствах, так как вы ничего не можете с ними поделать, особенно когда теряете фокус.Так что просто проглотите их:

autocmd BufLeave,FocusLost * silent! wall

Намного проще, чем сложный танец, определить, где будет ошибкой, чтобы избежать ее.

3 голосов
/ 09 января 2011

Я подозреваю, что когда документы для wall говорят "без имени файла", они могут ссылаться на буферы с buftype = nofile. Одним из способов получить то, что вы хотите, было бы, чтобы autocmd вызывал bufdo простую функцию. Например, некоторый непроверенный код, чтобы дать идею:

autocmd BufLeave,FocusLost * bufdo! call WriteFile()

function WriteFile()
   if (&buftype=="") && (expand("%:r") > "") && (&readonly==0)
      write
   endif
endfunction

Я думаю, что стандартный способ получить что-то вроде этого автоматического сохранения буферов - установить параметр autosave в Vim.

0 голосов
/ 20 сентября 2013

просто поместите это в .vimrc

set updatetime=1000
autocmd CursorHoldI * silent w
0 голосов
/ 06 ноября 2012
autocmd BufLeave,FocusLost * bufdo! call WriteFile()

function WriteFile()
   if (&buftype=="") && (expand("%:r") > "") && (&readonly==0)
      write
   endif
endfunction

Этот метод имеет побочный эффект, который заключается в том, что вы можете открыть только один неиспользованный буфер.Если вы откроете второй, он будет автоматически синхронизирован с содержимым первого неиспользованного буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...