Mapeo o abreviatura del modo de inserción sensible al contexto

10

Estoy planeando implementar algunas asignaciones de utilidades para mi complemento LaTeX para simplificar la escritura de las matemáticas. Por ejemplo, quiero crear abreviaturas similares a

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

Y similar Quiero que (algunas de) las asignaciones solo estén disponibles dentro de entornos matemáticos y no fuera.

Sé que puedo reconocer entornos matemáticos a través de los grupos de sintaxis, es decir, texMathZoneEy texMathZoneX. Sin embargo, no sé cómo usar esto para hacer mapeos o abreviaturas sensibles al contexto.

Karl Yngve Lervåg
fuente

Respuestas:

5

Quizás así:

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
fuente
Probablemente sería mejor usar abreviaciones locales en el búfer solo en los tipos de archivo tex en lugar de una abreviatura global que la comprobación 'filetype'.
Peter Rincker
@ Peter Rincker: Sí, es solo una prueba de concepto. Se puede optimizar de muchas maneras, fi encontrando las ID numéricas para texMathZoneEy de texMathZoneXantemano.
lcd047
3

lh-brackets proporciona la Map4TheseContexts()función que se encarga de detectar el contexto para hacer cosas 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: Si ha instalado latex-suite, tendrá que usar su IMAP()función para definir sus nuevas asignaciones; esto se debe a que latex-suite es bastante intrusivo con respecto a las asignaciones.

Luc Hermitte
fuente
Estoy desarrollando mi propio complemento LaTeX (ver enlace en la pregunta). He descubierto que latex-suite es muy complejo e intrusivo en general. La funcionalidad IMAP no es tan mala, aunque prefiero usar algo como UltiSnips para fragmentos complejos.
Karl Yngve Lervåg
1
IMAP()Fue interesante definir las asignaciones, pero las asignaciones son más difíciles de mantener que los fragmentos / plantillas.
Luc Hermitte