Как я могу сделать 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
).
Ответы
Ответ 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