Эта проблема возникает из-за того, что вы не можете изменять текущий буфер при оценке выражения для сопоставления.
См. :help :map-expression
, более конкретно:
Будьте очень осторожны с побочными эффектами! Выражение вычисляется при получении символов, вы можете очень легко сделать команду неработоспособной. По этой причине блокируется следующее:
- Изменение текста буфера ( textlock ).
- Редактирование другого буфера.
:normal
команда. - Перемещение курсора разрешено, но впоследствии оно восстанавливается.
Если вы хотите, чтобы сопоставление выполняло любой из этих действий, пусть возвращаемые символы делают это.
У вас должна быть либо функция , возвращающая символов для вставки, либо рассмотрите возможность использования не <expr>
сопоставления с явным :call
.
Дляпервый, возвращающий вставляемые символы:
inoremap <expr> <tab> WriteFile()
function! WriteFile()
return py3eval('utils.write()')
endfunction
и файл utils.py
:
def write():
return 'some text'
или альтернативный подход использования отображения не <expr>
:
inoremap <tab> <C-O>:call WriteFile()<CR>
(У последнего могут быть некоторые нежелательные побочные эффекты, так как вы вернетесь в режим вставки после изменения буфера, но вы вернетесь в ту же позицию, в которой находились до сопоставления. Вы можетехотите рассмотреть возможность использования setpos()
или аналогичного для перемещения курсора после отображения, еслиEDED.)