如何在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.
相关产品推荐
相关产品推荐

