Mappage ou abréviation du mode d'insertion sensible au contexte

10

Je prévois d'implémenter des mappages d'utilitaires pour mon plugin LaTeX afin de simplifier la saisie des mathématiques. Par exemple, je veux créer des abréviations similaires à

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

Et similaire. Je souhaite que (certains) des mappages soient uniquement disponibles dans les environnements mathématiques, et non à l'extérieur.

Je sais que je peux reconnaître les environnements mathématiques à travers les groupes de syntaxe, ie texMathZoneEet texMathZoneX. Cependant, je ne sais pas comment utiliser ceci afin de faire des mappages ou des abréviations sensibles au contexte.

Karl Yngve Lervåg
la source

Réponses:

5

Peut-être comme ça:

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
la source
Il serait probablement préférable d'utiliser des abréviations locales de tampon sur des types de fichiers uniquement tex au lieu d'une abréviation globale qui vérifie 'filetype'.
Peter Rincker
@Peter Rincker: Oui, c'est juste une preuve de concept. Il peut être optimisé de plusieurs manières, par exemple en trouvant les identifiants numériques pour texMathZoneEet texMathZoneXavant.
lcd047
3

lh-brackets fournit la Map4TheseContexts()fonction qui s'occupe de détecter le contexte pour faire différentes choses.

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

Remarque: Si vous avez installé latex-suite, vous devrez plutôt utiliser sa IMAP()fonction pour définir vos nouveaux mappages - c'est parce que latex-suite est assez intrusif en ce qui concerne les mappages.

Luc Hermitte
la source
Je développe mon propre plugin LaTeX (voir le lien dans la question). J'ai trouvé que latex-suite est un moyen complexe et intrusif en général. La fonctionnalité IMAP n'est pas si mauvaise, même si je préfère utiliser quelque chose comme UltiSnips pour des extraits complexes.
Karl Yngve Lervåg
1
IMAP()était intéressant de définir des mappages, mais les mappages sont plus difficiles à maintenir que les extraits / modèles.
Luc Hermitte