当前位置:  开发笔记 > 编程语言 > 正文

更智能的Vim恢复?

如何解决《更智能的Vim恢复?》经验,为你挑选了3个好方法。

当之前的Vim会话崩溃时,您会看到"交换文件......已经存在!" 对于在上一个会话中打开的每个文件.

你能让这个Vim恢复提示更聪明吗?(没有关闭恢复!)具体来说,我在考虑:

如果交换版本不包含未保存的更改且编辑过程不再运行,您是否可以让Vim自动删除交换文件?

您是否可以自动执行以新名称保存恢复文件的建议过程,将其与磁盘上的文件合并,然后删除旧的交换文件,以便最小化交互?特别是当交换版本和磁盘版本相同时,一切都应该是自动的.

我发现了SwapExists自动命令,但我不知道它是否可以帮助完成这些任务.



1> Chouser..:

我有vim将我的交换文件存储在一个本地目录中,在我的.vimrc中有这个:

set directory=~/.vim/swap,.

除了其他好处之外,这使得交换文件很容易一次找到.现在,当我的笔记本电脑失去电源或其他任何东西时,我开始备份一堆交换文件,我只是运行我的cleanswap脚本:

TMPDIR=$(mktemp -d) || exit 1
RECTXT="$TMPDIR/vim.recovery.$USER.txt"
RECFN="$TMPDIR/vim.recovery.$USER.fn"
trap 'rm -f "$RECTXT" "$RECFN"; rmdir "$TMPDIR"' 0 1 2 3 15
for q in ~/.vim/swap/.*sw? ~/.vim/swap/*; do
  [[ -f $q ]] || continue
  rm -f "$RECTXT" "$RECFN"
  vim -X -r "$q" \
      -c "w! $RECTXT" \
      -c "let fn=expand('%')" \
      -c "new $RECFN" \
      -c "exec setline( 1, fn )" \
      -c w\! \
      -c "qa"
  if [[ ! -f $RECFN ]]; then
    echo "nothing to recover from $q"
    rm -f "$q"
    continue
  fi
  CRNT="$(cat $RECFN)"
  if diff --strip-trailing-cr --brief "$CRNT" "$RECTXT"; then
      echo "removing redundant $q"
      echo "  for $CRNT"
      rm -f "$q"
  else
      echo $q contains changes
      vim -n -d "$CRNT" "$RECTXT"
      rm -i "$q" || exit
  fi
done

这将删除与真实文件保持同步的所有交换文件.任何不匹配的都会在vimdiff窗口中显示,因此我可以合并我未保存的更改.

--Chouser


为了使这个文件夹在具有相同名称的多个文件中更好地工作,请使用后缀`//`.示例:`set directory =〜/ .vim/swap //`.使用此选项,vim将使用每个文件的完整路径创建交换文件.
对于OSX上的任何人:找到Chouser的github(https://github.com/vim-scripts/cleanswap),这对我不起作用,所以我分叉并做了改进:https://github.com/ Kache/cleanswap

2> Jack Senecha..:

我刚刚发现了这个:

http://vimdoc.sourceforge.net/htmldoc/diff.html#:DiffOrig

我将DiffOrig命令复制并粘贴到我的.vimrc文件中,它就像一个魅力.这大大简化了交换文件的恢复.我不知道为什么默认情况下它不包含在VIM中.

这是匆忙之人的命令:

 command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
    \ | wincmd p | diffthis


是的,所以当提示出现时你点击"恢复",然后输入:DiffOrig.然后,当你完成后,你保存缓冲区.然后删除交换文件(因为它仍然会留下并且下次出错),只需输入:e,再次显示提示,然后点击"删除".

3> 小智..:

接受的答案是一个非常重要的用例.假设您创建了一个新的缓冲区并输入了2个小时而没有保存,那么您的笔记本电脑崩溃了.如果您运行建议的脚本,它将删除您的唯一记录,.swp交换文件.我不确定什么是正确的修复,但看起来diff命令最终在这种情况下将相同的文件与自身进行比较.下面编辑的版本会检查此案例,并为用户提供在某处保存文件的机会.

#!/bin/bash

SWAP_FILE_DIR=~/temp/vim_swp
IFS=$'\n'

TMPDIR=$(mktemp -d) || exit 1
RECTXT="$TMPDIR/vim.recovery.$USER.txt"
RECFN="$TMPDIR/vim.recovery.$USER.fn"
trap 'rm -f "$RECTXT" "$RECFN"; rmdir "$TMPDIR"' 0 1 2 3 15
for q in $SWAP_FILE_DIR/.*sw? $SWAP_FILE_DIR/*; do
  echo $q
  [[ -f $q ]] || continue
  rm -f "$RECTXT" "$RECFN"
  vim -X -r "$q" \
      -c "w! $RECTXT" \
      -c "let fn=expand('%')" \
      -c "new $RECFN" \
      -c "exec setline( 1, fn )" \
      -c w\! \
      -c "qa"
  if [[ ! -f $RECFN ]]; then
    echo "nothing to recover from $q"
    rm -f "$q"
    continue
  fi
  CRNT="$(cat $RECFN)"
  if [ "$CRNT" = "$RECTXT" ]; then
      echo "Can't find original file. Press enter to open vim so you can save the file. The swap file will be deleted afterward!"
      read
      vim "$CRNT"
      rm -f "$q"
  else if diff --strip-trailing-cr --brief "$CRNT" "$RECTXT"; then
      echo "Removing redundant $q"
      echo "  for $CRNT"
      rm -f "$q"
  else
      echo $q contains changes, or there may be no original saved file
      vim -n -d "$CRNT" "$RECTXT"
      rm -i "$q" || exit
  fi
  fi
done


无论是两小时还是两秒钟,默默地丢失数据是不可接受的,他绝对是正确的解决方案.没有必要屈尊俯就.
推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有