Чи можливо зробити Vim автоматичним збереженням файлів?


32

Деякі текстові редактори та текстові редактори час від часу автоматично зберігають файли, які ми редагуємо, що дуже зручно для виживання від неприємних збоїв тощо.

Чи є спосіб зробити так, щоб Vim автоматично зберігав наші файли через певний інтервал?

Відповіді:


30

Не існує вбудованого варіанта, хоча :help 'autosave'(у todo.txt) посилається на опис того, що може зробити така опція.

Одним із можливих способів реалізації цього є використання CursorHoldподії автокоманди. Ця подія запускається, коли користувач не натискає клавішу протягом 'updatetime'мілісекунд.

autocmd CursorHold * update

:updateКоманда зберігає тільки буфер , якщо він буде змінений. Якщо ви також хотіли, щоб це сталося під час активного режиму вставки, CursorHoldIйого можна додати до списку подій.

autocmd CursorHold,CursorHoldI * update

Інша альтернатива - це 'autowrite'варіант, який дозволить зберегти буфер перед виконанням зовнішньої команди (корисно для збереження перед запуском :make) або переключення на інший буфер.


Як ви можете помітити, чи працює він?
nilon

@nilon Він повинен надрукувати на рядок стану, що він збережений, так само, як якщо б ви натиснули: w себе.
MaudPieTheRocktorate

12

Vim має функцію автоматичного збереження, але вона зберігає її у файлі "відновлення".

Під час редагування документа, наприклад, MyFile.txtvim створить файл відновлення .MyFile.txt.swp. Якщо ваша система повинна вийти з ладу або ваш сеанс повинен загинути, ви можете знову підключитися та відновитись з місця, де ви зупинилися, ввівши:

vim -r MyFile.txt

Це відкриє файл для редагування та відновить останні зміни, які ви внесли до нього.

Потім можна зберегти відновлену версію звичайним способом :w.

На жаль, коли ви вийдете з vim, він залишить .MyFile.txt.swpнавколо, і вам потрібно його видалити вручну:

rm .MyFile.txt.swp

Див. "Сторінка" Відновлення "Сторінка також Розділ 11


1
При виході з Vim правильно (тобто з :wqабо :q!або ZZабо і т.д.), файли підкачки повинні бути автоматично видалені.
Doorknob

4
@Doorknob не коли ви виходите після відновлення ... ;-)
rolfl

8

Я зробив плагін vim-autosave, який використовує функцію Vim 8 Таймери, щоб періодично зберігати ваші буфери.


Woah, Vim 8 плагінів вже виходять. Чудово виглядає, християнин!
thameera

Спасибі, Крістіан. Це виглядає перспективно. Цікаво, чи підтримує плагін нові / незбережені файли. Я не можу знайти відповідь у документації на плагіни. Мій комп’ютер вирішив перезапустити вчора ввечері, і у мене було кілька швидких приміток про нові буфери. Vim не створював і не зберігав SWP-файли.
JAponte

Ні, на даний момент він не підтримує нові / збережені файли. Якщо ви цього хочете, продовжуйте і створюйте забаганку.
Крістіан Брабандт

2

Я змушую свого Vim зберігати все щоразу, коли фокус втрачається.

autocmd FocusLost <your-patterns-here> silent! wall

Мої візерунки досить довгі, і я використовую їх у декількох autocmds, але для повноти це виглядає так:

if exists(':keeppatterns')
    let s:keeppatterns = 'keeppatterns '
else
    let s:keeppatterns = ''
endif

augroup AutoSaveGroup
    " :help file-pattern has some info,
    " but some of it is is buried in the PATTERNS section of usr_40.txt
    let s:autoPattern = "*.{c,h,[ch]pp,[acjt]s,inl,cg,cgfx,fx,py,bat,cmd,jam,vim,yml,yaml,vsprops,erb,rb,html,htm},SCons*,*vimrc"

    autocmd!
    execute "autocmd FocusLost"     s:autoPattern   "silent! wall"
    execute "autocmd BufWritePre"   s:autoPattern   s:keeppatterns . 'call FixFormatting(expand("<afile>"))'

    execute "autocmd FileChangedRO" s:autoPattern "silent !p4 edit %:p"
    execute "autocmd FileChangedRO" s:autoPattern "write!"

    autocmd FocusLost   *.txt   silent! wall
augroup END

1

Як вказували інші, vim має файл swap (.swp), який буде створений там, де колись є ваш вихідний файл, але у вашому .vimrc-файлі ви можете встановити каталог .swp.

Вам потрібно буде створити каталог із, mkdirа потім встановити .vimrc у цьому місці.

set backup " make backup files
set backupdir=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp

1

ВІМ-робочий простір плагін має досить настроюється Автосохранение функція , яка може задовольнити ваші потреби. За замовчуванням він дозволяє автоматично зберігати під час сеансу робочої області (його головна особливість), але ви можете встановити його завжди автоматично зберігати, якщо це все, що ви шукаєте ( let g:workspace_autosave_always = 1).


1

Спробуйте зберегти буфер при кожному зміні тексту:

autocmd TextChanged,TextChangedI <buffer> silent write

Це працює для мене.

Джерело

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.