Bağlama duyarlı ekleme modu eşleme veya kısaltma


10

Matematik yazmayı basitleştirmek için LaTeX eklentim için bazı yardımcı program eşleştirmeleri uygulamayı planlıyorum . Örneğin, benzer kısaltmalar oluşturmak istiyorum

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

Ve benzerleri. Eşlemelerin (bazılarının) yalnızca matematik ortamlarında olmasını ve dışarıda olmamasını istiyorum.

Sözdizimi grupları aracılığıyla matematik ortamlarını tanıyabildiğimi biliyorum, yani texMathZoneEve texMathZoneX. Ancak, içeriğe duyarlı eşlemeler veya kısaltmalar yapmak için bunu nasıl kullanacağımı bilmiyorum.

Yanıtlar:


5

Belki de şöyle:

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

Muhtemelen kontrol eden global bir kısaltma yerine yalnızca tex dosya türlerinde tampon-yerel kısaltmalar kullanmak daha iyi olacaktır 'filetype'.
Peter Rincker

@Peter Rincker: Evet, bu sadece bir kavram kanıtı. Önceden texMathZoneEve texMathZoneXöncesinde sayısal kimlikleri bularak birçok şekilde optimize edilebilir .
lcd047

3

lh-parantez , Map4TheseContexts()farklı şeyler yapmak için bağlamı algılamaya özen gösteren bir işlev sağlar .

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

Not: Lateks paketini kurduysanız, bunun yerine IMAP()yeni eşlemelerinizi tanımlamak için işlevini kullanmanız gerekir - bunun nedeni, lateks paketinin eşlemelerle ilgili olarak oldukça müdahaleci olmasıdır.


Kendi LaTeX eklentimi geliştiriyorum (sorudaki bağlantıya bakın). Lateks-suite genel olarak karmaşık ve müdahaleci bir yol olduğunu gördüm. Bunun yerine karmaşık snippet'ler için UltiSnips gibi bir şey kullanmayı tercih etsem de IMAP işlevselliği o kadar da kötü değil.
Karl Yngve Lervåg

1
IMAP()eşlemeleri tanımlamak ilginçti, ancak eşlemelerin bakımı snippet'lerden / şablonlardan daha zordur.
Luc Hermitte
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.