Подтвердить что ты не робот

Как я могу сделать Vos autosave файлы, когда он теряет фокус?

Я использую для своих редакторов автосохранение файлов, когда они теряют фокус. Недавно я переключился на 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.

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

Edit

Я уверен, что лучший способ сделать то, что я намеревался, используя BufLeave - сохранение буферов при переключении между ними, поэтому я не получаю "No write since the last change" - установить 'autowriteall'. Вопрос по-прежнему сохраняется, когда MacVim теряет фокус для других приложений (FocusLost).

4b9b3361

Ответ 1

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

autocmd BufLeave,FocusLost * silent! wall

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

Ответ 2

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

autocmd BufLeave,FocusLost * bufdo! call WriteFile()

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

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

Ответ 3

autocmd BufLeave,FocusLost * bufdo! call WriteFile()

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

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

Ответ 4

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

set updatetime=1000
autocmd CursorHoldI * silent w