Pemetaan atau penyisipan mode masukan konteks sensitif

10

Saya berencana untuk mengimplementasikan beberapa pemetaan utilitas untuk plugin LaTeX saya untuk menyederhanakan pengetikan matematika. Misalnya, saya ingin membuat singkatan yang mirip dengan

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

Dan serupa. Saya ingin (sebagian) pemetaan hanya tersedia di dalam lingkungan matematika, dan tidak di luar.

Saya tahu bahwa saya dapat mengenali lingkungan matematika melalui kelompok sintaks, yaitu texMathZoneEdan texMathZoneX. Namun, saya tidak tahu bagaimana menggunakan ini untuk membuat pemetaan atau singkatan yang peka konteks.

Karl Yngve Lervåg
sumber

Jawaban:

5

Mungkin seperti ini:

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
sumber
Mungkin akan lebih baik menggunakan singkatan buffer-lokal pada hanya tipe file tex daripada singkatan global yang memeriksa 'filetype'.
Peter Rincker
@ Peter Rincker: Ya, itu hanya bukti konsep. Itu dapat dioptimalkan dalam banyak cara, fi dengan menemukan ID numerik untuk texMathZoneEdan texMathZoneXsebelumnya.
lcd047
3

lh-kurung menyediakan Map4TheseContexts()fungsi yang berhati-hati dalam mendeteksi konteks untuk melakukan hal-hal yang berbeda.

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

Catatan: Jika Anda menginstal lateks-suite, Anda harus menggunakan IMAP()fungsinya untuk mendefinisikan pemetaan baru - ini karena lateks-suite cukup mengganggu dalam pemetaan.

Luc Hermitte
sumber
Saya sedang mengembangkan plugin LaTeX saya sendiri (lihat tautan di pertanyaan). Saya telah menemukan suite lateks adalah cara yang rumit dan mengganggu secara umum. Fungsionalitas IMAP tidak seburuk itu, walaupun saya lebih suka menggunakan sesuatu seperti UltiSnips untuk cuplikan yang kompleks.
Karl Yngve Lervåg
1
IMAP()menarik untuk mendefinisikan pemetaan, tetapi pemetaan lebih sulit dipertahankan daripada snippet / templat.
Luc Hermitte