Контекстне відображення в режимі вставки чи абревіатури


10

Я планую реалізувати деякі корисні відображення для мого плагіна LaTeX для спрощення введення математики. Наприклад, я хочу створити абревіатури, подібні до

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

І подібні. Я хочу (деякі) відображення бути доступними лише в математичних середовищах, а не зовні.

Я знаю, що я можу розпізнати математичні середовища через групи синтаксису, тобто texMathZoneEі texMathZoneX. Однак я не знаю, як це використовувати для того, щоб зробити контекстно-залежні відображення чи абревіатури.

Відповіді:


5

Можливо, так:

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

Напевно, було б краще використовувати буферно-локальні абревіатури лише для текстових файлів, а не глобальних абревіатур, що перевіряють 'filetype'.
Пітер Рінкер

@ Петер Рінкер: Так, це лише доказ концепції. Це може бути оптимізовано у багатьох відношеннях, Фі, знаходячи числові ідентифікатори texMathZoneEі texMathZoneXзаздалегідь.
lcd047

3

lh-дужки надають Map4TheseContexts()функцію, яка бере участь у виявленні контексту, щоб робити різні речі.

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

Примітка: Якщо ви встановили латексний набір, вам замість цього доведеться використовувати його IMAP()функцію для визначення нових відображень - це тому, що набір латексу досить нав'язливий щодо відображень.


Я розробляю власний плагін LaTeX (див. Посилання у питанні). Я знайшов, що латексний набір - це шлях до складного та нав'язливого загалом. Функціональність IMAP не така вже й погана, хоч я вважаю за краще використовувати щось на зразок UltiSnips для складних фрагментів.
Карл Інгве Лервег

1
IMAP()було цікаво визначити відображення, але відображення складніше у підтримці, ніж фрагменти / шаблони.
Люк Ермітт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.