функция autocmd всегда выполняется дважды

Я собрал следующую кучу удивительности:

if !exists("g:AsciidocAutoSave")
  let g:AsciidocAutoSave = 0
endif

fun! AsciidocRefresh()
  if g:AsciidocAutoSave == 1
    execute 'write'
    execute 'silent !asciidoc -b html5 -a icons "%"'
  endif
endf

fun! AsciidocFocusLost()
  augroup asciidocFocusLost
    autocmd FocusLost <buffer> call AsciidocRefresh()
  augroup END
endfun

augroup asciidocFileType
  autocmd FileType asciidoc :call AsciidocFocusLost()
augroup END

Единственная проблема: он сохраняется дважды каждый раз, когда vim теряет фокус в файле asciidoc.

Когда я ввожу :autocmd asciidocFileType в командную строку, она показывает:

---Auto-Commands---
asciidocFileType  FileType
    asciidoc   :call AsciidocFocusLost()
               :call AsciidocFocusLost()

То же самое с :autocmd asciidocFocusLost и AsciidocRefresh().

Зачем это дублирование?


person Profpatsch    schedule 24.04.2013    source источник


Ответы (2)


Я не могу точно сказать, почему вы получили эти дубликаты (несколько источников?), но канонический способ предотвратить это — сначала очистить augroup:

augroup asciidocFileType
    autocmd!
    autocmd FileType asciidoc :call AsciidocFocusLost()
augroup END

Поскольку у вас есть только одно определение, вы также можете сделать это одной командой:

augroup asciidocFileType
    autocmd! FileType asciidoc :call AsciidocFocusLost()
augroup END
person Ingo Karkat    schedule 24.04.2013
comment
Спасибо. Тем временем я нашел трюк с !, что сделало ненужными даже augroups. Но я думаю, что я не единственный с подобной проблемой, так что вопрос не совсем лишний. - person Profpatsch; 24.04.2013
comment
В ! важны авгруппы; в противном случае вы также можете очистить другие, такие же автокоманды события + шаблона (из других плагинов)! :augroup ограничивает поляну вашей собственной группой. - person Ingo Karkat; 25.04.2013

Ответ @ingo-karkat отличный, но я думаю, что знаю, почему вы получаете вдвое больше autocmd и как чтобы предотвратить это естественным образом:

В некоторых дистрибутивах vim/Neovim по умолчанию установлено, что filetype plugin indent равно on. Протестируйте его для neovim с env XDG_CONFIG_HOME=/dev/null nvim -c 'filetype' или для vim с env HOME=/dev/null vim -c filetype

Если выход

filetype detection:ON  plugin:ON  indent:ON

Тогда вам не нужно добавлять filetype * on в ваш vimrc.

person Doron Behar    schedule 16.03.2018