Python Vim:E523:此处不允许

Python Vim:E523:此处不允许,python,vim-plugin,Python,Vim Plugin,我在vim中单击tab时收到此错误 回溯(最近一次呼叫最后一次): 写入文件“utils.py”,第15行 当前缓冲区.append('some text') vim.error:vim:E523:此处不允许使用 我有当前的.vim文件 if expand("%:e") == 'xml'

我在vim中单击tab时收到此错误

回溯(最近一次呼叫最后一次):

写入文件“utils.py”,第15行
当前缓冲区.append('some text')
vim.error:vim:E523:此处不允许使用


我有当前的.vim文件

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

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

具体见:

小心副作用!表达式是在 获取字符时,很可能会使命令无法正常工作。 因此,以下内容被阻止:

  • 更改缓冲区文本()
  • 编辑另一个缓冲区
  • :normal
    命令
  • 允许移动光标,但随后将恢复光标
如果希望映射执行这些操作,请让返回的字符执行 那个

您应该让函数返回要插入的字符,或者考虑使用非<代码> <代码>映射,使用显式<代码>:调用< /代码> ./p> 对于前者,返回要插入的字符:

inoremap <expr> <tab> WriteFile()
function! WriteFile()
    return py3eval('utils.write()')
endfunction
或者,使用非映射的替代方法:

inoremap <tab> <C-O>:call WriteFile()<CR>
inoremap:callwritefile()调用

(后者可能会有一些不必要的副作用,因为在修改缓冲区后,您将返回到插入模式,但是您将返回到映射之前的相同位置。您可能需要考虑使用<代码> SETPOSE()/代码>或类似于在映射之后移动光标,如果需要的话)。

inoremap <tab> <C-O>:call WriteFile()<CR>