上下文相关插入模式映射或缩写


10

我正计划为我的LaTeX插件实现一些实用程序映射,以简化数学的输入。例如,我想创建类似于以下的缩写

`a : \alpha
`b : \beta
-> : \to
=> : \Rightarrow

和类似。我希望(某些)映射仅在数学环境内可用,而不在外部可用。

我知道我可以通过语法组(即texMathZoneE和)识别数学环境texMathZoneX。但是,我不知道如何使用它来进行上下文敏感的映射或缩写。

Answers:


5

也许像这样:

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

最好只在tex文件类型上使用局部于本地的缩写,而不是使用check的全局缩写'filetype'
彼得·林克

@Peter Rincker:是的,这只是概念的证明。它可以在许多方面,通过寻找数字ID的网络进行优化texMathZoneEtexMathZoneX事前。
lcd047

3

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()功能来定义新的映射-这是因为乳胶套件对映射的干扰很大。


我正在开发自己的LaTeX插件(请参阅问题中的链接)。我发现乳胶套件通常是使复杂和侵入性的方法。IMAP的功能还不错,尽管我更喜欢为复杂的片段使用UltiSnips之类的东西。
Karl YngveLervåg,2015年

1
IMAP()定义映射很有趣,但是映射比片段/模板更难维护。
卢克·赫米特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.