更智能的Vim恢复?
当上一个Vim会话崩溃时,对于上一个会话中打开的每个文件,您都会收到“交换文件…已经存在!”的问候 你能让这个Vim恢复提示更智能吗?(不关闭恢复!)具体来说,我想到:更智能的Vim恢复?,vim,recovery,Vim,Recovery,当上一个Vim会话崩溃时,对于上一个会话中打开的每个文件,您都会收到“交换文件…已经存在!”的问候 你能让这个Vim恢复提示更智能吗?(不关闭恢复!)具体来说,我想到: 如果交换的版本不包含未保存的更改,并且编辑过程不再运行,您可以让Vim自动删除交换文件吗 您是否可以自动执行建议的过程,即以新名称保存恢复的文件,将其与磁盘上的文件合并,然后删除旧的交换文件,从而减少所需的交互?特别是当交换版本和磁盘版本相同时,一切都应该是自动的 我发现了SwapExists自动命令,但我不知道它是否有助于
- 如果交换的版本不包含未保存的更改,并且编辑过程不再运行,您可以让Vim自动删除交换文件吗
- 您是否可以自动执行建议的过程,即以新名称保存恢复的文件,将其与磁盘上的文件合并,然后删除旧的交换文件,从而减少所需的交互?特别是当交换版本和磁盘版本相同时,一切都应该是自动的
我发现了
SwapExists
自动命令,但我不知道它是否有助于完成这些任务。我让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我刚刚发现: 我将DiffOrig命令复制并粘贴到我的.vimrc文件中,它就像一个符咒。这大大简化了交换文件的恢复。我不知道为什么VIM中默认不包含它 这是给那些匆忙的人的命令:
command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
\ | wincmd p | diffthis
伟大的提示DiffOrig是完美的。下面是我用来在当前目录下的每个交换文件上运行它的bash脚本:
#!/bin/bash
swap_files=`find . -name "*.swp"`
for s in $swap_files ; do
orig_file=`echo $s | perl -pe 's!/\.([^/]*).swp$!/$1!' `
echo "Editing $orig_file"
sleep 1
vim -r $orig_file -c "DiffOrig"
echo -n " Ok to delete swap file? [y/n] "
read resp
if [ "$resp" == "y" ] ; then
echo " Deleting $s"
rm $s
fi
done
可能需要更多的错误检查和引用,但到目前为止已经奏效。对于一个非常重要的用例,已被接受的答案已经失效。假设你创建了一个新的缓冲区并输入了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
我不希望在.vimrc中设置我的VIM工作目录。这里是对chouser脚本的修改,该脚本根据需要将交换文件复制到交换路径,检查重复项,然后对其进行协调。这本书写得很匆忙,确保在投入实际使用之前对其进行评估
#!/bin/bash
if [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]; then
echo "Moves VIM swap files under <base-path> to ~/.vim/swap and reconciles differences"
echo "usage: $0 <base-path>"
exit 0
fi
if [ -z "$1" ] || [ ! -d "$1" ]; then
echo "directory path not provided or invalid, see $0 -h"
exit 1
fi
echo looking for duplicate file names in hierarchy
swaps="$(find $1 -name '.*.swp' | while read file; do echo $(basename $file); done | sort | uniq -c | egrep -v "^[[:space:]]*1")"
if [ -z "$swaps" ]; then
echo no duplicates found
files=$(find $1 -name '.*.swp')
if [ ! -d ~/.vim/swap ]; then mkdir ~/.vim/swap; fi
echo "moving files to swap space ~./vim/swap"
mv $files ~/.vim/swap
echo "executing reconciliation"
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
else
echo duplicates found, please address their swap reconciliation manually:
find $1 -name '.*.swp' | while read file; do echo $(basename $file); done | sort | uniq -c | egrep '^[[:space:]]*[2-9][0-9]*.*'
fi
#/bin/bash
如果[[“$1”==”-h”]| |[[“$1”==”-help”];然后
echo“将VIM交换文件移动到~/.VIM/swap下并协调差异”
echo“用法:$0”
出口0
fi
如果[-z“$1”]|[!-d“$1”];然后
echo“未提供目录路径或目录路径无效,请参阅$0-h”
出口1
fi
echo在层次结构中查找重复的文件名
swaps=“$(查找$1-name'.*.swp'|读取文件;执行echo$(basename$文件);完成|排序| uniq-c | egrep-v”^[[:space:]*1”)”
如果[-z“$swaps”];然后
未找到重复项
文件=$(查找$1-名称'.*.swp')
如果[!-d~/.vim/swap];然后mkdir~/.vim/swap;fi
echo“将文件移动到交换空间~./vim/swap”
mv$files~/.vim/swap
回应“执行和解”
TMPDIR=$(mktemp-d)| |退出1
RECTXT=“$TMPDIR/vim.recovery.$USER.txt”
RECFN=“$TMPDIR/vim.recovery.$USER.fn”
陷阱“rm-f”$recxt“$RECFN”;rmdir“$TMPDIR”0 1 2 3 15
对于q in~/.vim/swap/*sw?~/。vim/swap/*;做
[[-f$q].|继续
rm-f“$RECTXT”“$RECFN”
vim-X-r“$q”\
-c“w!$RECTXT”\
-c“设fn=展开('%')”\
-c“新的$RECFN”\
-c“执行设定行(1,fn)”\
-c w\\
-c“质量保证”
如果[!-f$RECFN]];然后
echo“无需从$q中恢复”
rm-f“$q”
持续
fi
CRNT=“$(类别$RECFN)”
如果diff—带尾随cr—简短的“$CRNT”“$RECTXT”;然后
echo“删除冗余$q”
echo“换$CRNT”
rm-f“$q”
其他的
echo$q包含更改
vim-n-d“$CRNT”“$RECTXT”
rm-i“$q”| |出口
fi
完成
其他的
发现重复回音,请手动处理其交换对账:
在读取文件时查找$1-名称“*.swp”;do echo$(basename$文件);完成|排序| uniq-c | egrep'^[:space:][2-9][0-9]*.'
fi
我的.bashrc文件中有这个。我想给这个代码的一部分适当的信用,但我忘了我从哪里得到它
mswpclean(){
for i in `find -L -name '*swp'`
do
swpf=$i
aux=${swpf//"/."/"/"}
orif=${aux//.swp/}
bakf=${aux//.swp/.sbak}
vim -r $swpf -c ":wq! $bakf" && rm $swpf
if cmp "$bakf" "$orif" -s
then rm $bakf && echo "Swap file was not different: Deleted" $swpf
else vimdiff $bakf $orif
fi
done
for i in `find -L -name '*sbak'`
do
bakf=$i
orif=${bakf//.sbak/}
if test $orif -nt $bakf
then rm $bakf && echo "Backup file deleted:" $bakf
else echo "Backup file kept as:" $bakf
fi
done }
我只是在我的项目的根目录上运行它,如果文件不同,它会打开vim diff。然后,保存最后一个文件。为了使其完美,我只需要替换最后一个:
else echo "Backup file kept as:" $bakf
大概是
else vim $bakf -c ":wq! $orif" && echo "Backup file kept and saved as:" $orif
但我没有时间对它进行适当的测试
希望有帮助。查找。/-键入f-名称“*sw[klmnop]”-删除
信用证:@Shwaydogg
首先导航到目录如果编辑两个同名文件,例如在SVN repository的两个分支中,当编辑多个同名文件时,Vim将在扩展名(.swp、*.swo、*.swn等)的字母表中向后移动。应注意,使用此方法将禁用“交换文件存在”功能。因此,您将*需要使用上面提供的
cleanswap
脚本。另请参阅@coppit的答案,它应该保存未写入的缓冲区?对于OSX上的任何人:找到Chouser的github For this(),这对我不起作用,因此,我对其进行了改进:要使此文件夹更好地处理多个同名文件,请使用后缀/
。示例:设置目录=~/.vim/swap/
。使用此选项,vim将使用每个文件的整个路径创建交换文件。键入两个小时而不保存?你应该改变储蓄的态度,而不是储蓄