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.

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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.