2014-02-26 6 views
3

Я использую Vim 7.4 (Mac OS) для редактирования и запуска сценариев Lua. Я сопоставил ключ в моем .vimrc, чтобы сохранить текущий буфер и запустить внешний скрипт.force vim для перезаписывания внешних изменений

Ключ карты в .vimrc:

map V :w!<CR> :!python "$HOME/tools/client/concli.py" --lua %<CR> 

Это хорошо, но каждый работает один раз в то время как файлы «прикоснулся» с помощью Xcode (касание командной оболочки). Затем, когда я нажимаю отображаемый ключ, vim предупреждает меня, что файл был изменен извне, и я должен подтвердить, чтобы написать ему.

Это довольно раздражает, так как файлы часто затрагиваются. Как я могу заставить vim перезаписать внешние изменения без подсказки? Я попробовал «w!» безуспешно.

Спасибо, Лоран

+0

в соответствии с этим: http://stackoverflow.com/questions/ 4300253/vim-only-show-file-has-changed-warning-if-content-is-different сообщение не должно отображаться, только если изменилась метка времени. Я думаю, что есть настоящие изменения, которые вы собираетесь перезаписать ... – eckes

+0

Немного смущает здесь. У вас открыт файл Vim. Некоторые внешние приложения (XCode) внесли изменения в файл. Вы хотите вернуться к предыдущему состоянию или Vim обновить текущий буфер до нового содержимого файла? – Rook

+0

@eckes нет реальных изменений. Файлы просто тронуты. Я могу воспроизвести проблему вручную (vi file; touch file в другом терминале: w -> vim попросить сохранить). Возможно, это связано с командой touch. –

ответ

4

Действительно, перезапись подтверждение не может быть выключен с :w! и :set autoread не помогает в этом случае ни. Что делает работу инструктирует Vim явно проверить изменения перед записью:

:checktime | w 
+0

Он работает, если я явно вводил команду в vim, но терпел неудачу, если она определена в команде карты (.vimrc): map V: checktime \ | w ... (Мне пришлось скрыться от трубы) –

+1

Эта карта работает для меня, и я не вижу причин, почему это не должно. Вы можете попробовать пользовательскую команду ': command V checktime | w'. –

+0

Спасибо, что работает!Я не знаю, почему мне пришлось использовать команду и передать команду оболочки, а также 'command V checktime | w | ! python "$ HOME/tools/client/concli.py" --lua% ', а затем' map r: V '' –

1

Я считаю

set autoread 

должны это сделать. Он сообщает Vim автоматически перечитывать файл, измененный за пределами Vim.

+0

Я попробовал, но не помог. –

+1

@LaurentZubiaur - Что-то изменилось? Я считаю, что это работает на этой стороне. – Rook

+0

да спасибо. Мне пришлось использовать 'checktime | w' в качестве команды. Пожалуйста, см. Мой комментарий к @IngoKarkat. –

0

Я видел это в списке рассылки. По-видимому, он вызывается, если файл изменил временную метку после вызова внешней команды оболочки.

function! ProcessFileChangedShell() 
    if v:fcs_reason == 'mode' || v:fcs_reason == 'time' 
     let v:fcs_choice = '' 
    else 
     let v:fcs_choice = 'ask' 
    endif 
endfunction 

autocmd FileChangedShell call ProcessFileChangedShell() 

Но это не всегда срабатывало для меня. (В зависимости от того, редактировал ли я файл с момента изменения, который в моем случае был внешним.)

Есть some more tricks on the VimTips wiki которые могут помочь.

0

Добавьте это в файл ~/.vimrc:

set autoread 
nnoremap <C-u> :checktime<CR> 

Теперь, когда вы хотите, чтобы перезагрузить Vim внешние изменения, просто нажмите :)

Смежные вопросы