Vim: записывать обратно мой файл при каждом нажатии клавиши - PullRequest
12 голосов
/ 21 августа 2009

Я бы хотел, чтобы vim автоматически записывал свой файл как можно чаще. Идеальным было бы каждое нажатие клавиши.

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

Окончательный ответ (ответы, приведенные ниже, помогли сделать это)

" Choose your own statusline here
let g:pbstatusline="%F\ %y\ %l:%c\ %m"
set statusline=%F\ %y\ %l:%c\ %m

autocmd FileType tex setlocal autowriteall

" Save the file every 5 keypresses
autocmd FileType tex setlocal statusline=%!pb:WriteFileViaStatusLine()

" Save the file every time this event fires.
autocmd FileType tex :autocmd InsertLeave,CursorHold,CursorHoldI * call pb:WriteFileViaStatusLine("always")

" 1 optional param: "always" is only allowed value.
let s:writefilecounter = 0
function! pb:WriteFileViaStatusLine(...)
   if s:writefilecounter > 5 || (a:0 > 0 && a:1 == "always")
      if &buftype == ""
         write
      endif
      let s:writefilecounter = 0
   else
      let s:writefilecounter = s:writefilecounter + 1
   endif

   return g:pbstatusline
endfunction

Ответы [ 6 ]

10 голосов
/ 27 сентября 2014

Эти хаки больше не нужны. Vim может автоматически записывать файл на диск всякий раз, когда он изменяется. Просто добавьте это к своему $ MYVIMRC:

autocmd TextChanged,TextChangedI <buffer> write

Полагаю, вам нужен Vim 7.4. В отличие от autosave=1, это сохранит ваш файл , как только вы измените .

10 голосов
/ 22 августа 2009

Один хак - использовать вашу строку состояния:

function! WriteFile() 
  if &buftype == ""
    write
  endif
  return '%f %h%w%m%r%=%-14(%l,%c%V%) %(%P%)'
endfunction
setlocal statusline=%!WriteFile()
set laststatus=2

Пока строка состояния видна, она обновляется после каждого изменения в файле. При обновлении вызывается функция WriteFile(), которая записывает файл (и возвращает мое приближение в строке состояния по умолчанию). При laststatus=2 строка состояния отображается, даже когда открыто только одно окно.

Это сохранит текущий буфер сохраненным после каждого изменения.

6 голосов
/ 21 августа 2009

Существуют события autocmd CursorMoved и CursorMovedI, но я не думаю, что есть такие, которые применяются каждый раз, когда вы печатаете в режиме вставки.

Вы также могли бы, если бы вы были такими смелыми, перепривязать каждый печатный символ в режиме вставки для сохранения, а затем набрать символ.

4 голосов
/ 18 октября 2012

Если вы работаете в Linux, вы можете взглянуть на
http://www.charlietanksley.net/philtex/vim-live-latex-preview/

Он использует скрипты и MuPDF (облегченный просмотрщик PDF) для предварительного просмотра разметки латекса в реальном времени. Это очень быстрое и лучшее / простое решение, которое я нашел до сих пор.
Я использую его уже довольно давно, и он прекрасно работает!

3 голосов
/ 05 ноября 2010

Упс! Мне сообщили, что я забыл упомянуть, что это использование находится в списке TODO , и это «Скоро®». Я действительно хотел эту функцию несколько дней назад и обнаружил, что она еще не работает. Убирайся!

использовать параметр автосохранения в .vimrc (_vimrc для windows)

set autosave=4

Это сохранит ваш файл через 4 секунды после последнего изменения. Установка его в один позволит выполнить то, что вы ищете. Это будет автоматически и всегда работает. (Чем проще, тем лучше)

TODO ... очевидно, я не сохранил ГДЕ, где я нашел это, когда написал этот ответ давно. Спасибо @ sehe

0 голосов
/ 08 августа 2013

Я предлагаю использовать метод, который я описал аналогично Сохранять файл после каждого редактирования в vim вопрос:


CursorHold и CursorHoldI могут помочь. По документам:

|CursorHold|        the user doesn't press a key for a while
|CursorHoldI|       the user doesn't press a key for a while in Insert mode

Эти события запускаются только один раз после бездействия и зависят от переменной updatetime (по умолчанию: 4000 мс). Так что вы можете:

:au CursorHold <buffer> :update

Который будет обновлять текущий буферный файл (т.е. сохранять только в случае изменения) после 4 секунд бездействия по умолчанию в обычном режиме.

Добавьте автокоманду для CursorHoldI, если вы хотите получить то же поведение в режиме вставки.


Установка CursorHold, CursorHoldI событий вместе с очень короткими updatetime заставит vim сохранить файл сразу после редактирования.

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