Kontekstowe mapowanie lub skrót trybu wstawiania

10

Planuję zaimplementować mapowania narzędzi dla mojej wtyczki LaTeX, aby uprościć pisanie matematyki. Na przykład chcę utworzyć skróty podobne do

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

I podobne. Chcę, aby niektóre z mapowań były dostępne tylko w środowiskach matematycznych, a nie na zewnątrz.

Wiem, że mogę rozpoznać środowisk matematycznych za pośrednictwem grup składniowych, czyli texMathZoneEi texMathZoneX. Nie wiem jednak, jak tego użyć, aby utworzyć kontekstowe odwzorowania lub skróty.

Karl Yngve Lervåg
źródło

Odpowiedzi:

5

Być może tak:

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
źródło
Prawdopodobnie lepiej byłoby używać lokalnych skrótów buforowych tylko dla typów plików tex zamiast globalnego skrótu, który to sprawdza 'filetype'.
Peter Rincker
@Peter Rincker: Tak, to tylko dowód koncepcji. Może być zoptymalizowany na wiele sposobów, fi poprzez znalezienie numerycznych identyfikatorów dla texMathZoneEi texMathZoneXwcześniej.
lcd047
3

lh-brackets zapewnia Map4TheseContexts()funkcję, która zajmuje się wykrywaniem kontekstu w celu wykonywania różnych czynności.

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

Uwaga: Jeśli zainstalowałeś pakiet lateksowy, będziesz musiał zamiast tego użyć jego IMAP()funkcji do zdefiniowania nowych mapowań - dzieje się tak, ponieważ pakiet lateksowy jest dość uciążliwy w odniesieniu do mapowań.

Luc Hermitte
źródło
Tworzę własną wtyczkę LaTeX (patrz link w pytaniu). Odkryłem, że zestaw lateksowy jest sposobem na skomplikowanie i ingerencję w ogóle. Funkcjonalność IMAP nie jest taka zła, chociaż wolę zamiast tego używać czegoś takiego jak UltiSnips w przypadku złożonych fragmentów.
Karl Yngve Lervåg
1
IMAP()zdefiniowanie mapowań było interesujące, ale mapowania są trudniejsze w utrzymaniu niż fragmenty / szablony.
Luc Hermitte