Как выполнить c Vim <Plug>команду в функции, когда режим вставки? - PullRequest
1 голос
/ 20 апреля 2020

Я попытался выполнить команду, поставив ниже

fun! DeoEnter()
    if pumvisible()
        if vsnip#available(1)
           " wanna exec function here, like `exe 'normal <Plug>(vsnip-jump-next)'`
        endif

        call UltiSnips#ExpandSnippetOrJump()
        if g:ulti_expand_or_jump_res > 0
            return ""
        endif

        return "\<C-y>"
    endif

    return "\n"
endfun
ino <CR> <C-R>=DeoEnter()<CR>

, однако команда фактически никогда не работала, потому что это нормальное отображение, но я хочу выполнить sh отображение вставки.

Я посмотрел документ, но написано только в обычном режиме. Есть ли хорошая идея?

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Поскольку ваша функция уже возвращает нажатия клавиш для выполнения в режиме вставки (через механизм <C-r>=...), вы можете сделать то же самое для этого.

Вы можете вернуть строку в двойных кавычках и использовать обратную косую черту для escape-последовательности клавиш (то же, что вы уже делаете для "\<C-y>" позже в этой функции.)

Таким образом, вы можете использовать \<Plug> для ввода <Plug> «ключа». Даже если это не настоящий ключ, он ведет себя так же, как и один.

Поскольку <Plug>(vsnip-jump-next) должен выполняться в обычном режиме, вы можете использовать <C-o>, что позволяет вам выполните одну команду в обычном режиме из режима вставки и вернитесь в режим вставки после ее завершения.

Таким образом, эта строка будет работать там:

return "\<C-o>\<Plug>(vsnip-jump-next)"

Собирая все вместе:

fun! DeoEnter()
    if pumvisible()
        if vsnip#available(1)
           return "\<C-o>\<Plug>(vsnip-jump-next)"
        endif

        call UltiSnips#ExpandSnippetOrJump()
        if g:ulti_expand_or_jump_res > 0
            return ""
        endif

        return "\<C-y>"
    endif

    return "\r"
endfun
ino <CR> <C-R>=DeoEnter()<CR>

Я также изменил последнюю строку вашей функции с return "\n" на return "\r", так как на самом деле это код, который будет генерировать клавиша "Enter". (Я полагаю, что "\n" тоже сработало бы, но "\r" более корректно в этом месте.) Вы также могли бы использовать return "\<CR>", что эквивалентно "\r", но более точно о том, что вы отправляете код для клавиши «Ввод», это даже лучше.

1 голос
/ 20 апреля 2020

Вы можете сделать что-то вроде:

ino <CR> :exe "a".DeoEnter()<CR>

Таким образом, результат функции DeoEnter будет введен в режиме вставки

...