Как мне заставить плагин VIM Matchit работать с ColdFusion и HTML? - PullRequest
4 голосов
/ 30 января 2010

Я пытался следовать инструкциям на вики-сайте Vim , чтобы плагин matchit работал с файлами ColdFusion (* .cfm), содержащими как ColdFusion, так и HTML-теги, работающие на MacVim.

У меня есть файл синтаксиса для ColdFusion (cf.vim), установленный в $ HOME / .vim / syntax / cf.vim, последняя версия matchit установлена ​​в .vim / plugin / matchit.vim, и я ' мы добавили следующий блок в конец конца matchit.vim:

au FileType html,jsp,php,cf if !exists("b:match_words") |

Я также добавил следующую строку в конец моего файла $ HOME / .vimrc:

filetype plugin on

Наконец, я добавил предложенный блок в конец cf.vim:

" Only do this when not done yet for this buffer
if exists("b:did_ftplugin")
  finish
endif

" Don't load another plugin for this buffer
let b:did_ftplugin = 1

if exists("loaded_matchit")
    let b:match_words = '<cfif\>.\{-}>\|<cfif\>.\{-}$:'
            \ . '<cfelseif\>.\{-}>\|<cfelseif\>.\{-}$:'
            \ . '<cfelse\>.\{-}>\|<cfelse\>.\{-}$:'
            \ . '<\/cfif>,'
        \ . '<cfloop\>.\{-}>\|<cfloop\>.\{-}$:'
            \ . '<\/cfloop\>.\{-}>,'
        \ . '<cfoutput\>.\{-}>\|<cfoutput\>.\{-}$:'
            \ . '<\/cfoutput\>.\{-}>,'
        \ . '<cftimer\>.\{-}>\|<cftimer\>.\{-}$:'
            \ . '<\/cftimer\>.\{-}>,'
        \ . '<!---:--->,'
        \ . '<cfquery\>.\{-}>\|<cfquery\>.\{-}$:<\/cfquery\>.\{-}>,'
        \ . '<cfscript>:<\/cfscript>'
    " Since we are counting things outside of comments only,
    " It is important we account comments accurately or match_words
    " will be wrong and therefore useless
    syntax sync fromstart

endif " exists("loaded_matchit")

Однако, когда я нажимаю клавишу%, чтобы перейти к соответствующему тегу, он работает только наполовину, в зависимости от расширения файла. Если файл имеет расширение .cfm, я могу перейти с <cfif> до </cfif>, но не с <body> до </body>, например. Ситуация обратная, если расширение - .html.

Однако, глядя на код для cf.vim, выясняется, что он должен работать с ColdFusion и тегами HTML, смешанными в одном файле:

" Inherit syntax rules from the standard HTML syntax file
if version < 600
  source <sfile>:p:h/html.vim
else
  runtime! syntax/html.vim
endif

В связанной заметке я добавил:

let b:match_ignorecase = 1

в $ HOME / .vimrc для отключения чувствительности к регистру, как указано в документации, но он все еще работает только с cfif, а не с CFIF, например.

1 Ответ

2 голосов
/ 31 января 2010

Я сделал нечто подобное для языка шаблонов django. Я только что добавил html-выражения в список b: match_words. Например. (Обратите внимание на первые три выражения, не похожие на django)

if exists("loaded_matchit")
    let b:match_ignorecase = 1
    let b:match_skip = 's:Comment'
    let b:match_words = '<:>,' .
    \ '<\@<=[ou]l\>[^>]*\%(>\|$\):<\@<=li\>:<\@<=/[ou]l>,' .
    \ '<\@<=dl\>[^>]*\%(>\|$\):<\@<=d[td]\>:<\@<=/dl>,' .
    \ '<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>,'  .-
    \ '{% *if .*%}:{% *else *%}:{% *endif *%},' .-
    \ '{% *ifequal .*%}:{% *else *%}:{% *endifequal *%},' .-
    \ '{% *ifnotequal .*%}:{% *else *%}:{% *endifnotequal *%},' .-
    \ '{% *ifchanged .*%}:{% *else *%}:{% *endifchanged *%},' .-
    \ '{% *for .*%}:{% *endfor *%},' .-
    \ '{% *with .*%}:{% *endwith *%},' .
    \ '{% *comment .*%}:{% *endcomment *%},' .
    \ '{% *block .*%}:{% *endblock *%},' .
    \ '{% *filter .*%}:{% *endfilter *%},' .
    \ '{% *spaceless .*%}:{% *endspaceless *%}'-
endif

Эти три выражения охватывают весь html / xml, так что, очевидно, кто бы ни придумал эти три, знает о vim regex гораздо больше, чем я.

Я бы предложил отправить ваш код сопровождающему vim.org cf.vim, если в файлах синтаксиса для холодного синтеза нет совпадений.

...