Vim: E523: здесь запрещено - PullRequest
       11

Vim: E523: здесь запрещено

2 голосов
/ 22 декабря 2019

Я получил эту ошибку, когда i tab в vim.

Трассировка (последний последний вызов):
Файл "", строка 1, в
Файл "utils.py", строка 15, в записи
current_buffer.append ('некоторый текст')
vim.error: Vim: E523: здесь не разрешено


У меня есть текущий файл .vim

if expand("%:e") == 'xml'                                                                                                                                                             
    inoremap <expr> <tab> WriteFile()                                                                                                                                                 
endif                                                                                                                                                                                 
function! WriteFile()                                                                                                                                                                 
    python3 utils.write()                                                                                                                                                             
endfunction 

и этот файл .py

import vim

def write():
    current_buffer = vim.current.buffer
    current_buffer.append('some text')

1 Ответ

2 голосов
/ 22 декабря 2019

Эта проблема возникает из-за того, что вы не можете изменять текущий буфер при оценке выражения для сопоставления.

См. :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.)

...