Why does Vim save files with a ~ extension?
Asked Answered
H

9

226

I've found that while using Vim on Windows Vim saves the file, a .ext.swp file that's deleted on closing the Vim window and a .ext~ file.

I assume the .ext.swp file is a session backup in case Vim crashes. What's the purpose of the .ext~ file however? Is this a permanent backup file? It's annoying as I'd like to copy all the files I'm working on to my host, without these duplicates. How can I turn this off or, if it's there for a good reason, hide the files?

Hannahhannan answered 3/3, 2009 at 17:56 Comment(3)
Do you have any file open simultaneously in more than one place, they will create a .ext.swp.Auriga
dirkgently: No, on here I can open a file in the only vim window and it will create the .swp file. I'm not too fussed about that as it's removed when I save/close the window.Hannahhannan
Related post - Why is vim leaving temporary file versions all over the place?Pomerleau
A
248

The *.ext~ file is a backup file, containing the file as it was before you edited it.

The *.ext.swp file is the swap file, which serves as a lock file and contains the undo/redo history as well as any other internal info Vim needs. In case of a crash you can re-open your file and Vim will restore its previous state from the swap file (which I find helpful, so I don't switch it off).

To switch off automatic creation of backup files, use (in your vimrc):

set nobackup
set nowritebackup

Where nowritebackup changes the default "save" behavior of Vim, which is:

  1. write buffer to new file
  2. delete the original file
  3. rename the new file

and makes Vim write the buffer to the original file (resulting in the risk of destroying it in case of an I/O error). But you prevent "jumping files" on the Windows desktop with it, which is the primary reason for me to have nowritebackup in place.

Anemia answered 3/3, 2009 at 18:4 Comment(6)
+1 For you prevent "jumping files" on the Windows desktop. Googled and found this answerZymosis
Actually - do I have to have both nobackup and nowritebackup? Is there a way to write a copy of the file as a backup, but not do this write/delete/rename stuff?Zymosis
@Merlyn: If you have backup (as opposed to nobackup), then Vim will create a backup (the *.ext~ file). This is completely unrelated to nowritebackup.Anemia
There is a table describing different behavior between combination of those switches: help backup-table. It turns out setting neither nobackup nor nowritebackup, but instead setting backupcopy=yes also solves the "jumping" problem. This may hurt perf, though, so to each their ownZymosis
Instead of turning off , backup to a directory set backupdir=~/.vim/backup in .vimrc or _vimrc on windowsBile
edit: make sure you have removed all instances of set backup in your vimrc or this wont workUnwelcome
C
257

I think the better solution is to place these lines in your vimrc file

set backupdir=~/vimtmp//,.
set directory=~/vimtmp//,.

The first line is for backup files, the second line for swap files. The double slash at the end ensures that there is no conflict in case of two files having the same name, see comments (at the time of this edit this option is only honored for swap files, not yet for backup files). The ,. allow vim to use the current directory if the former doesn't exist.

You have to create a directory in your home directory called vimtmp for this to work. Also, check that backups are enabled in your config (add set backup if not).

That way you get the benefit of both worlds, you don't have to see the files, but if something does get futzed you can go get your backup file from vimtmp. Don't forget to clean the directory out every now and then.

Contemplation answered 26/10, 2009 at 16:44 Comment(12)
+1 I actually have mine set to ~/.vim/tmp, but either way, this has saved my ass on more than one occasion.Bobolink
Why do you need ,. at the end of each line?Panada
@Panada Vim will use the first available dir, so in this case if ~/vimtmp doesn't exist it will use the current working directoryHydrus
This should be the default geez such a huge security hole when editing CMS config files.Hermitage
@SalmanPK In an ideal world you should not be editing configuration files directly on publicly accessible serversTisza
To also remove .un~ files you can add: "set undodir=~/vimtmp,."Rayraya
What happens if I edit /foo/bar/a.txt and /foo/baz/a.txt? As the basename is the same, will vim write two different backup file contents in the same backup file like ~/vimtmp/a.txt~?Xylotomous
Use two slashes at the end of the path. For instance, set backupdir=~/.vim/.backup// - the "//" at the end of the directory means that file names will be built from the complete path to the file with all path separators substituted to percent "%" sign. This will ensure file name uniqueness in the preserve directory.Rabblerousing
@Hacknightly, your answer should be included in the above.Rapturous
@Rabblerousing there is a known issue that currently prevents this solution from working.Figwort
And do not forget to also add set backup into your vimrc in order to get backups ON.Bracteate
I prefer using the $TMP or $TEMP directories in the case where you're setting up a new environment, then you know that those directories exist already usually as /tmp.Milla
A
248

The *.ext~ file is a backup file, containing the file as it was before you edited it.

The *.ext.swp file is the swap file, which serves as a lock file and contains the undo/redo history as well as any other internal info Vim needs. In case of a crash you can re-open your file and Vim will restore its previous state from the swap file (which I find helpful, so I don't switch it off).

To switch off automatic creation of backup files, use (in your vimrc):

set nobackup
set nowritebackup

Where nowritebackup changes the default "save" behavior of Vim, which is:

  1. write buffer to new file
  2. delete the original file
  3. rename the new file

and makes Vim write the buffer to the original file (resulting in the risk of destroying it in case of an I/O error). But you prevent "jumping files" on the Windows desktop with it, which is the primary reason for me to have nowritebackup in place.

Anemia answered 3/3, 2009 at 18:4 Comment(6)
+1 For you prevent "jumping files" on the Windows desktop. Googled and found this answerZymosis
Actually - do I have to have both nobackup and nowritebackup? Is there a way to write a copy of the file as a backup, but not do this write/delete/rename stuff?Zymosis
@Merlyn: If you have backup (as opposed to nobackup), then Vim will create a backup (the *.ext~ file). This is completely unrelated to nowritebackup.Anemia
There is a table describing different behavior between combination of those switches: help backup-table. It turns out setting neither nobackup nor nowritebackup, but instead setting backupcopy=yes also solves the "jumping" problem. This may hurt perf, though, so to each their ownZymosis
Instead of turning off , backup to a directory set backupdir=~/.vim/backup in .vimrc or _vimrc on windowsBile
edit: make sure you have removed all instances of set backup in your vimrc or this wont workUnwelcome
A
28

To turn off those files, just add these lines to .vimrc (vim configuration file on unix based OS):

set nobackup       #no backup files
set nowritebackup  #only in case you don't want a backup file while editing
set noswapfile     #no swap files
Arissa answered 3/3, 2009 at 18:4 Comment(0)
S
15

Put this line into your vimrc:

set nobk nowb noswf noudf " nobackup nowritebackup noswapfile noundofile


In that would be the:

C:\Program Files (x86)\vim\_vimrc

file for system-wide vim configuration for all users.

Setting the last one noundofile is important in Windows to prevent the creation of *~ tilda files after editing.


I wish Vim had that line included by default. Nobody likes ugly directories.

Let the user choose if and how she wants to enable advanced backup/undo file features first.

This is the most annoying part of Vim.

The next step might be setting up:

set noeb vb t_vb= " errorbells visualbell

to disable beeping in as well :-)

Shouldst answered 10/7, 2017 at 2:34 Comment(3)
Thank you so much for this! "noundofile" was the option that finally got rid of that god-awful litter. (And I agree 100% with everything else you've written in your post!)Hallowmas
@Hallowmas This undo file must be a recent thing. On older systems with older versions of Vim, I never saw any *.un~ files, but on my Windows 10 system I had to add noundofile to my _vimrc to get rid of the *.un~ files.Downtrend
Works for me. Also "noundofile" is key that few others mention.Emulous
P
14
:set nobackup 

will turn off backups. You can also set a backupdir if you still want those backup files but in a central folder. This way your working dir is not littered with ~ files.

You find more information on backups under :he backup.

Pottery answered 3/3, 2009 at 18:2 Comment(0)
L
14

And you can also set a different backup extension and where to save those backup (I prefer ~/.vimbackups on linux). I used to use "versioned" backups, via:

au BufWritePre * let &bex = '-' . strftime("%Y%m%d-%H%M%S") . '.vimbackup'

This sets a dynamic backup extension (ORIGINALFILENAME-YYYYMMDD-HHMMSS.vimbackup).

Landbert answered 3/3, 2009 at 22:13 Comment(2)
you might want to include how to set up the back up directory, i.e. putting set backupdir=~/.vimbackups in your ~/.vimrcFilemon
The vim help fully describes this technique. See :help backupextHebraism
I
6

You're correct that the .swp file is used by vim for locking and as a recovery file.

Try putting set nobackup in your vimrc if you don't want these files. See the Vim docs for various backup related options if you want the whole scoop, or want to have .bak files instead...

Im answered 3/3, 2009 at 18:3 Comment(1)
+1 for mentioning the purpose as a lock file. I didn't think of that.Anemia
F
5

The only option that worked for me was to put this line in my ~/.vimrc file

set noundofile

The other options referring to backup files did not prevent the creation of the temp files ending in ~ (tilde)

Firewater answered 6/4, 2017 at 15:18 Comment(1)
This finally worked for me. Why isn't this mentioned in other answers? This removes the: .<filename>.un~ files while the other options only remove the <filename>~ files.Eligible
R
0

I had to add set noundofile to ~_gvimrc

The "~" directory can be identified by changing the directory with the cd ~ command

Rayraya answered 1/3, 2018 at 19:44 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.