You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在vimdiff中撤销dp(:diffput)操作?按u键无效应如何解决?

问题原因
  • dp(diff put)的执行逻辑是将当前激活窗口缓冲区的差异内容,写入另一侧diff窗口的对应缓冲区,修改的是非当前激活窗口的文件
  • Vim的默认撤销命令u仅作用于当前处于激活状态的窗口缓冲区,不会跨窗口操作其他缓冲区的撤销记录
  • 执行dp后你仍停留在原窗口,此时按u是尝试撤销当前窗口的改动,但当前窗口并未发生修改,因此会提示Already at oldest change
  • 而do(diff obtain)是将另一侧窗口的差异内容拉取到当前窗口缓冲区,修改的是当前激活的文件,所以直接按u即可正常撤销
解决办法

单次撤销误操作的dp

  • 切换到被修改的另一侧diff窗口,直接按u即可撤销刚才的dp改动,操作完成后可切回原窗口继续工作
  • 若你还未对任意文件执行保存操作,可在被修改的窗口执行:e!命令重载文件,直接回到本次diff打开时的原始状态,丢弃所有未保存改动
  • 若已经保存了被修改的文件,且该文件为Git跟踪文件,可在终端执行git checkout -- <被修改的文件路径>直接恢复到Git记录的原始版本

永久优化dp操作体验

你可以在.vimrc(Neovim对应init.vim或init.lua)中添加如下配置,让dp执行后自动跳转到被修改的窗口,后续需要撤销时直接按u即可:

" diff模式下映射dp,执行后自动跳转至被修改的窗口
autocmd FileType diff nnoremap <buffer> dp dp<C-w>p

内容的提问来源于stack exchange,提问作者H.B.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:54:01