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.

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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.