我正计划为我的LaTeX插件实现一些实用程序映射,以简化数学的输入。例如,我想创建类似于以下的缩写
`a : \alpha
`b : \beta
-> : \to
=> : \Rightarrow
和类似。我希望(某些)映射仅在数学环境内可用,而不在外部可用。
我知道我可以通过语法组(即texMathZoneE
和)识别数学环境texMathZoneX
。但是,我不知道如何使用它来进行上下文敏感的映射或缩写。
我正计划为我的LaTeX插件实现一些实用程序映射,以简化数学的输入。例如,我想创建类似于以下的缩写
`a : \alpha
`b : \beta
-> : \to
=> : \Rightarrow
和类似。我希望(某些)映射仅在数学环境内可用,而不在外部可用。
我知道我可以通过语法组(即texMathZoneE
和)识别数学环境texMathZoneX
。但是,我不知道如何使用它来进行上下文敏感的映射或缩写。
Answers:
也许像这样:
let s:TeXmaps = {
\ '`a': '\alpha',
\ '`b': '\beta',
\ '->': '\to',
\ '=>': '\Rightarrow' }
function! <SID>IsTeXMath()
return &ft ==# 'tex' && match(map( synstack(line('.'), col('.')), 'synIDattr(v:val, "name")' ), '\m^texMathZone[EX]$') >= 0
endfunction
for s:k in keys(s:TeXmaps)
silent! exec 'inoremap <silent> ' . s:k . ' <C-r>=<SID>IsTeXMath()?' . string(s:TeXmaps[s:k]) . ':' . string(s:k) . '<CR>'
endfor
texMathZoneE
和texMathZoneX
事前。
lh-brackets提供了Map4TheseContexts()
可以检测上下文以执行不同操作的功能。
" To be defined in a tex ftplugin -> ~/.vim/ftplugin/tex/your-shortcuts.vim
:inoremap <buffer> <silent> `a <c-r>=Map4TheseContexts('`a', 'texMathZone', '\\alpha', '`a')<cr>
" or:
:inoremap <buffer> <silent> <expr> `a Map4TheseContexts('`a', 'texMathZone', '\\alpha', '`a')
注意:如果安装了乳胶套件,则必须使用其IMAP()
功能来定义新的映射-这是因为乳胶套件对映射的干扰很大。
IMAP()
定义映射很有趣,但是映射比片段/模板更难维护。
'filetype'
。