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.

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

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ń.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.