Kontextsensitive Zuordnung oder Abkürzung für den Einfügemodus

10

Ich plane, einige Dienstprogrammzuordnungen für mein LaTeX-Plugin zu implementieren , um die Eingabe von Mathematik zu vereinfachen. Zum Beispiel möchte ich Abkürzungen ähnlich wie erstellen

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

Und ähnlich. Ich möchte, dass (einige) der Zuordnungen nur in mathematischen Umgebungen und nicht außerhalb verfügbar sind.

Ich weiß, dass ich mathematische Umgebungen durch die Syntaxgruppen erkennen kann, dh texMathZoneEund texMathZoneX. Ich weiß jedoch nicht, wie ich dies verwenden soll, um kontextsensitive Zuordnungen oder Abkürzungen zu erstellen.

Karl Yngve Lervåg
quelle

Antworten:

5

Vielleicht so:

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
quelle
Es wäre wahrscheinlich besser, pufferlokale Abkürzungen nur für Tex-Dateitypen zu verwenden, als eine globale Abkürzung, die überprüft wird 'filetype'.
Peter Rincker
@ Peter Rincker: Ja, es ist nur ein Proof of Concept. Es kann auf viele Arten optimiert werden, z. B. indem die numerischen IDs für texMathZoneEund im texMathZoneXVoraus ermittelt werden.
lcd047
3

lh-Klammern bieten die Map4TheseContexts()Funktion, mit der der Kontext erkannt wird, um verschiedene Aufgaben auszuführen.

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

Hinweis: Wenn Sie die Latex-Suite installiert haben, müssen Sie stattdessen ihre IMAP()Funktion verwenden, um Ihre neuen Zuordnungen zu definieren. Dies liegt daran, dass die Latex-Suite in Bezug auf Zuordnungen ziemlich aufdringlich ist.

Luc Hermitte
quelle
Ich entwickle mein eigenes LaTeX-Plugin (siehe Link in der Frage). Ich habe festgestellt, dass Latex-Suite im Allgemeinen viel zu komplex und aufdringlich ist. Die IMAP-Funktionalität ist nicht so schlecht, obwohl ich lieber etwas wie UltiSnips für komplexe Snippets verwende.
Karl Yngve Lervåg
1
IMAP()Es war interessant, Zuordnungen zu definieren, aber Zuordnungen sind schwieriger zu pflegen als Snippets / Vorlagen.
Luc Hermitte