我在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')
发生此问题是因为在评估映射的表达式时不允许您修改当前缓冲区。
请参见:help :map-expression
,更具体地说:
要特别注意副作用!该表达式在获取字符,您很可能会使命令无法正常使用。因此,以下内容被阻止:
- 更改缓冲区文本(
:help :map-expression
)。- 编辑另一个缓冲区。
- textlock命令。
- 允许移动光标,但是之后将其恢复。
如果您希望映射执行任何这些操作,请让返回的字符执行那。
您应该具有要插入的字符的功能[[return,或者考虑使用具有显式: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>
或类似的操作,以便在映射后移动光标。)