Mapeamento ou abreviação do modo de inserção sensível ao contexto

10

Estou planejando implementar alguns mapeamentos de utilitários para o meu plugin LaTeX para simplificar a digitação da matemática. Por exemplo, eu quero criar abreviações semelhantes a

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

E similar. Quero (alguns) os mapeamentos disponíveis apenas dentro de ambientes matemáticos, e não fora.

Eu sei que posso reconhecer ambientes matemáticos através dos grupos de sintaxe, ie texMathZoneEe texMathZoneX. No entanto, não sei como usar isso para criar mapeamentos ou abreviações sensíveis ao contexto.

Karl Yngve Lervåg
fonte

Respostas:

5

Talvez assim:

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
lcd047
fonte
Provavelmente seria melhor usar abreviações de buffer-local em apenas tipos de arquivos tex em vez de uma abreviação global nessa verificação 'filetype'.
Peter Rincker 27/05
@ Peter Rincker: Sim, é apenas uma prova de conceito. Ele pode ser otimizado de várias maneiras, encontrando os IDs numéricos para texMathZoneEe com texMathZoneXantecedência.
lcd047 27/05
3

O lh-brackets fornece a Map4TheseContexts()função que cuida da detecção do contexto para fazer coisas diferentes.

" 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')

Nota: Se você instalou o latex-suite, terá que usar sua IMAP()função para definir seus novos mapeamentos - isso ocorre porque o latex-suite é bastante invasivo em relação a mapeamentos.

Luc Hermitte
fonte
Estou desenvolvendo meu próprio plugin LaTeX (veja o link na pergunta). Eu descobri que o látex-suite é uma maneira complexa e intrusiva em geral. A funcionalidade IMAP não é tão ruim, embora eu prefira usar algo como UltiSnips para trechos complexos.
Karl Yngve Lervåg
11
IMAP()foi interessante definir mapeamentos, mas é mais difícil mantê-los do que snippets / modelos.
Luc Hermitte 27/05