Frage
Wenn eine vorherige Vim Sitzung abgestürzt ist, werden Sie mit der gegrüßt „Swap-Datei ... existiert bereits!“ für jede Datei, die offen in der vorherige Sitzung war.
Können Sie diese Vim Wiederherstellungsaufforderung smarter machen? (Ohne Abschalten Genesung!) Insbesondere denke ich an:
- Wenn die getauscht Version nicht gespeicherte Änderungen enthält und der Bearbeitungsprozess nicht mehr ausgeführt wird, können Sie machen Vim automatisch die Auslagerungsdatei gelöscht?
- Können Sie den vorgeschlagenen Prozess automatisieren, die wiederhergestellte Datei unter einem neuen Namen zu speichern, es mit Datei auf der Festplatte Zusammenführung und dann die alte Auslagerungsdatei zu löschen, so dass nur minimale Interaktion erforderlich ist? Vor allem, wenn die Swap-Version und die Disk-Version gleich ist, sollte alles automatisch.
Ich entdeckte die SwapExists
automatischen Befehl, aber ich weiß nicht, ob es sich bei diesen Aufgaben helfen können.
Lösung
Ich habe vim speichert meine Swap-Dateien in einem einzigen lokalen Verzeichnis, indem diese in meinem .vimrc mit:
set directory=~/.vim/swap,.
Neben anderen Vorteilen, macht dies die Swap-Dateien einfach auf einmal zu finden.
Nun, wenn mein Laptop mit Strom versorgt wird oder was auch immer und ich fange wieder nach oben mit einem Bündel von Swap-Dateien rumliegen, ich habe gerade meinen cleanswap
Skript ausführen:
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
Dadurch werden alle Swap-Dateien entfernen, die up-to-date mit den realen Dateien sind. Alle, die nicht übereinstimmen, werden in einem vimdiff Fenster gebracht, so kann ich in meiner ungesicherte Änderungen zusammenführen.
- Chouser
Andere Tipps
Ich habe gerade entdeckt dies:
http://vimdoc.sourceforge.net/htmldoc/diff.html#: DiffOrig
ich kopiert und eingefügt den DiffOrig Befehl in meine .vimrc Datei und es funktioniert wie ein Charme. Dies erleichtert erheblich die Wiederherstellung von Auslagerungsdateien. Ich habe keine Ahnung, warum es nicht standardmäßig in VIM enthalten ist.
Hier ist der Befehl für diejenigen, die in Eile sind:
command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
\ | wincmd p | diffthis
Die akzeptierte Antwort ist für einen sehr wichtigen Anwendungsfall gesprengt. Sagen wir, Sie, ohne jemals zu speichern, dann Ihren Laptop stürzt ab, einen neuen Puffer und Typ 2 Stunden erstellen. Wenn Sie die vorgeschlagene Skript ausführen wird es Ihre einzige Datensatz, die .swp Auslagerungsdatei löschen. Ich bin mir nicht sicher, was die richtige Lösung ist, aber es sieht aus wie der Befehl diff in diesem Fall selbst die gleiche Datei zu vergleichen landet. Die bearbeitete Version unter Kontrollen für diesen Fall und gibt dem Benutzer die Möglichkeit, die Datei irgendwo zu speichern.
#!/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
Große Spitze DiffOrig ist perfekt. Hier ist ein Bash-Skript Ich benutze es auf jeder Auslagerungsdatei im aktuellen Verzeichnis auszuführen:
#!/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
Wahrscheinlich etwas mehr Fehler verwenden könnte Überprüfung und unter Angabe aber bisher gearbeitet hat.
Ich bevorzuge es nicht mein VIM Arbeitsverzeichnis in der .vimrc gesetzt. Hier ist eine Modifikation von chouser Skript, das kopiert die Auslagerungsdateien auf den Swap-Pfad auf der Nachfrage nach Dubletten überprüft und diese dann in Einklang bringt. Dies wurde geschrieben gehetzt, stellen Sie sicher, es zu bewerten, bevor es in der Praxis setzen.
#!/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
Ich habe diese auf meinem .bashrc. Ich möchte entsprechende Gutschrift auf einen Teil dieses Codes geben, aber ich habe vergessen, wo ich es aus.
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 }
Ich betreibe nur diese auf die Wurzel meines Projekts und, wenn die Datei unterschiedlich ist, es vim diff öffnet. Dann wird die letzte Datei gespeichert werden soll gehalten werden. Um es perfekt machen würde ich nur das letzte anderes ersetzen müssen:
else echo "Backup file kept as:" $bakf
durch so etwas wie
else vim $bakf -c ":wq! $orif" && echo "Backup file kept and saved as:" $orif
aber ich habe nicht Zeit, um es richtig zu testen.
Hoffe, es hilft.
finden ./ -type f -name "* sw [klmnop]" -delete
Credit: @Shwaydogg https://superuser.com/ Fragen / 480.367 / was-the-einfach-Weg-to-delete-vim-swapfiles-ive-schon-gewonnenes von
Verzeichnis Navigieren erste