Vim:E523: 这里不允许

Tik*_*iki 4 python vim-plugin

当我在 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)

fil*_*den 6

发生此问题的原因是您在计算映射表达式时不允许修改当前缓冲区。

更具体地参见: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()或类似的方法来移动如果需要,光标位于映射后。)