Vim с Ultisnips и сопоставлением скобок (автопары), сопоставленными с одним и тем же ключом - PullRequest
1 голос
/ 21 января 2020

Я использую vim в основном для латекса. Основная причина, по которой я это делаю, на самом деле - Ultisnips, что значительно уменьшает количество символов, которые мне нужно набирать в латексе. Наряду с этим я использую автопары, которые соответствуют скобкам для меня. Одна небольшая проблема, с которой я столкнулся при этой настройке, заключается в том, что я не могу использовать табуляцию для того, чтобы развернуть фрагмент и выйти за пределы пары скобок - соответствующие параметры:

let g:UltiSnipsExpandTrigger = '<tab>'
let g:UltisnipsJumpForwardTrigger = '<tab>'
let g:AutoPairsShortcutJump = '<tab>'

Поведение, которое я хотел бы Например, расширить фрагмент, если он есть, в противном случае выпрыгнуть из скобки. Но это не работает по умолчанию. Могу ли я что-нибудь сделать, например, какое-то условное сопоставление клавиш?

Я пробовал другие решения, такие как, например, реализация сопоставления скобок в Ultisnips, но так и не с удовлетворительными результатами.

Да, я мог бы просто использовать другую клавишу, но использование табуляции для обоих было бы наиболее удобным.

1 Ответ

1 голос
/ 21 января 2020

Это можно сделать с помощью пользовательских функций , используя возвращаемые значения функций UltiSnips Trigger. Поскольку у вас все сопоставлено с одним и тем же ключом, я создам пример, используя комбинированную функцию UltiSnips ExpandSnippetOrJump, которая устанавливает глобальную переменную ulti_expand_or_jump_res в 0, если она не может ни раскрыть фрагмента, ни переходите к следующему.

Таким образом, вы определите функцию (с нахальным названием Ulti_Pairs()) с помощью:

function! Ulti_Pairs()
    call UltiSnips#ExpandSnippetOrJump()
    if g:ulti_expand_or_jump_res == 0
        call AutoPairsJump()
    endif
endfunction

Затем вы установите свое отображение (вы не должны после этого вам не понадобятся другие):

inoremap <Tab> <ESC>:call Ulti_Pairs()<CR>a

Итак, чтобы разобраться в том, что он делает, при нажатии Tab Vim вызовет вашу пользовательскую функцию, которая, в свою очередь, вызовет ExpandSnippetOrJump(). Если эта функция возвращает что-то еще, кроме 0 (то есть в UltiSnips есть что-то, что можно расширить или перейти), она больше ничего не сделает. Но при возвращаемом значении 0 он вызовет функцию AutoPairsJump().

...