Ubuntu下Vim使用Ctrlp插件输入p触发E21错误,无法理解报错含义
报错内容如下:
prt path <mru>={ files }=<buf> <-> /home/.... Error detected while processing function <SNR>48_NormalPasta: line 13: E21: Cannot make changes, 'modifiable' is off Press ENTER or type command to continue
报错原因
E21: Cannot make changes, 'modifiable' is off是Vim的内置报错,含义是尝试对标记为不可修改的缓冲区执行写入操作。
报错触发的<SNR>48_NormalPasta是Ctrlp插件的内部处理函数,负责处理Ctrlp唤起的搜索窗口内的字符输入逻辑。Ctrlp的搜索窗口默认会设置nomodifiable属性禁止直接修改,正常情况下用户输入的字符会被插件的映射逻辑转发到专用输入缓冲区,出现该报错一般是三种原因:
- 自定义Vim配置或者其他插件覆盖了Ctrlp搜索窗口下
p键的默认映射,导致输入p时直接触发了普通模式的写入操作,而非调用Ctrlp的字符处理逻辑 - 使用的Ctrlp插件版本过旧,存在官方已经修复的缓冲区操作bug
- 安装了和Ctrlp存在逻辑冲突的插件,比如针对普通模式做粘贴优化的pasta类插件,会在所有窗口劫持
p键的触发逻辑
解决方案
- 首先排查键位冲突:唤起Ctrlp搜索窗口后,按
Ctrl+O切换到普通模式,输入:imap p查看当前p键的插入模式映射,如果输出的映射不属于Ctrlp插件,就在对应插件的配置中关闭p键的全局绑定,或者在你的.vimrc中添加如下配置,强制Ctrlp专属窗口使用独立的键位映射:
augroup CtrlpFixKeymap autocmd! autocmd FileType ctrlp imap <buffer> p <c-u>call ctrlp#prompt#putchar('p')<CR> augroup END
- 升级Ctrlp插件到最新维护版本:如果当前使用的是已经停止维护的
kien/ctrlp.vim原版,建议切换到社区维护的ctrlpvim/ctrlp.vimfork版本,旧版本存在多个缓冲区属性操作的已知问题。 - 如果上述操作都无效,可以在
.vimrc中添加如下配置,临时允许Ctrlp窗口可修改,该配置仅作用于Ctrlp专属缓冲区,不会影响其他普通文件缓冲区的属性:
autocmd FileType ctrlp setlocal modifiable
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

