当我在 vim 中 tab 时收到此错误。
回溯(最近一次调用):
文件“<字符串>”,第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
Run Code Online (Sandbox Code Playgroud)
和这个 .py 文件
if expand("%:e") == 'xml'
inoremap <expr> <tab> WriteFile()
endif
function! WriteFile()
python3 utils.write()
endfunction
Run Code Online (Sandbox Code Playgroud)
发生此问题的原因是您在计算映射表达式时不允许修改当前缓冲区。
更具体地参见:help :map-expression:
一定要小心副作用!在获取字符时对表达式进行求值,您很可能会导致该命令无法正常工作。因此,以下内容被阻止:
- 更改缓冲区文本(textlock)。
- 编辑另一个缓冲区。
- 命令
:normal。- 允许移动光标,但移动后会恢复。
如果您希望映射执行其中任何操作,请让返回的字符执行此操作。
您应该让函数返回要插入的字符,或者考虑使用带有<expr>显式:call.
对于前者,返回要插入的字符:
inoremap <expr> <tab> WriteFile()
function! WriteFile()
return py3eval('utils.write()')
endfunction
Run Code Online (Sandbox Code Playgroud)
和utils.py文件:
def write():
return 'some text'
Run Code Online (Sandbox Code Playgroud)
或者,使用非映射的替代方法<expr>:
inoremap <tab> <C-O>:call WriteFile()<CR>
Run Code Online (Sandbox Code Playgroud)
(后者可能会产生一些不需要的副作用,因为修改缓冲区后您将返回到插入模式,但您将返回到映射之前的相同位置。您可能需要考虑使用setpos()或类似的方法来移动如果需要,光标位于映射后。)