Mappatura o abbreviazione della modalità di inserimento sensibile al contesto


10

Sto pianificando di implementare alcune mappature di utilità per il mio plugin LaTeX per semplificare la digitazione della matematica. Ad esempio, voglio creare abbreviazioni simili a

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

E simili Voglio che (alcuni) dei mapping siano disponibili solo all'interno degli ambienti matematici e non all'esterno.

So di poter riconoscere gli ambienti matematici attraverso i gruppi di sintassi, ovvero texMathZoneEe texMathZoneX. Tuttavia, non so come usarlo per creare mappature o abbreviazioni sensibili al contesto.

Risposte:


5

Forse così:

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

Probabilmente sarebbe meglio usare le abbreviazioni buffer-local solo sui tipi di file tex anziché su un'abbreviazione globale che controlla 'filetype'.
Peter Rincker,

@Peter Rincker: Sì, è solo una prova di concetto. Può essere ottimizzato in molti modi, trovando gli ID numerici per texMathZoneEe in texMathZoneXanticipo.
lcd047,

3

Lh-brackets fornisce la Map4TheseContexts()funzione che si occupa di rilevare il contesto per fare cose diverse.

" 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 hai installato latex-suite, dovrai invece usare la sua IMAP()funzione per definire i tuoi nuovi mapping - questo perché latex-suite è piuttosto invadente per quanto riguarda i mapping.


Sto sviluppando il mio plugin LaTeX (vedi link nella domanda). Ho scoperto che la suite in lattice è molto complessa e invadente in generale. La funzionalità IMAP non è poi così male, anche se preferisco invece usare qualcosa come UltiSnips per snippet complessi.
Karl Yngve Lervåg,

1
IMAP()è stato interessante definire i mapping, ma i mapping sono più difficili da mantenere rispetto ai frammenti / modelli.
Luc Hermitte,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.