Контекстно-зависимое отображение или сокращение режима вставки

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
lcd047
источник
Вероятно, было бы лучше использовать локальные для буфера аббревиатуры только для типов файлов tex вместо глобальной аббревиатуры, которая проверяет 'filetype'.
Питер Ринкер
@ Питер Ринкер: Да, это просто доказательство концепции. Его можно оптимизировать многими способами, например, путем поиска числовых идентификаторов для texMathZoneEи texMathZoneXзаранее.
lcd047
3

lh-brackets предоставляет 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')

Примечание. Если вы установили latex-suite, вместо этого вам придется использовать его IMAP()функцию для определения ваших новых отображений - это потому, что latex-suite довольно навязчив в отношении отображений.

Люк Эрмитт
источник
Я разрабатываю свой собственный LaTeX-плагин (см. Ссылку в вопросе). Я обнаружил, что латекс-сьют - это сложный и навязчивый способ. Функциональность IMAP не так уж и плоха, хотя я предпочитаю вместо этого использовать что-то вроде UltiSnips для сложных фрагментов кода.
Карл Ингве Лервог
1
IMAP()Было интересно определить сопоставления, но их сложнее поддерживать, чем фрагменты / шаблоны.
Люк Эрмитт