Озадачен решением ошибки рекурсии Vimscript - PullRequest
0 голосов
/ 04 мая 2018

Я хочу использовать gf для открытия имен файлов с гиперссылками в .org файлах (я использую плагин vim vim-orgmode ):

enter image description here

Я набираю gf, и файл должен открыться. Чтобы не проходить мимо первых двух [[, я создал следующий скрипт для выполнения этой работы:

function! GFOrg()
python << EOF
import vim  
try:
    filename=vim.eval("@%")
    if filename.endswith(".org"):
        line = vim.current.line
        linkstart=line.find("[[")
        if linkstart != -1:
            row, start = vim.current.window.cursor
            vim.current.window.cursor = row, linkstart+2
    vim.command("normal gf")
except Exception as e:
    print("Error: {}".format(e))
EOF
endfunction

Теперь, если я сопоставлю это с переопределением gf:

nnoremap gf :call GFOrg()<CR>

Я получаю ошибку рекурсии:

enter image description here

Но если я выйду и снова открою Vim (на самом деле MacVim) и использую gfgf в качестве своего сопоставления, я могу просто набрать gf (один раз), и он отлично работает:

nnoremap gfgf :call GFOrg()<CR>

Может кто-нибудь объяснить, почему мне не нужно дважды вводить gf, чтобы сопоставить его с вызовом, и почему это останавливает ошибку рекурсии?

1 Ответ

0 голосов
/ 05 мая 2018

Вы используете :normal для вызова gf, который снова вызовет ваше сопоставление, которое вызывает рекурсию. Вы должны использовать :normal!, чтобы избежать повторного отображения.

Это, как говорится, мы можем сделать лучше!

  • При локальном отображении буфера
  • Примените это отображение только для буфера 'filetype' из org

Добавить следующее к ~/.vim/after/ftplugin/org.vim:

nnoremap <buffer> gf :call search('\[\[.', 'bce', line('.'))<cr>gf 
...