Bagaimana saya bisa mencegah Vim meninggalkan terlalu banyak file (seperti swap, backup, undo)?

13

Secara default, vimmeninggalkan file swap di direktori proyek saya, dan pada crash itu meninggalkan file cadangan.

Bisakah saya mencegah ini? Atau apakah saya perlu memperbarui .VCSignorefile semua proyek saya ?

Martin Tournoij
sumber

Jawaban:

16

Cadangkan file

Secara default, Vim tidak meninggalkan file cadangan. Mereka hanyalah file sementara yang ada saat Vim menyimpan buffer ke disk. Seperti yang dijelaskan dalam :help backup-tableperilaku ini dapat dikontrol oleh 'backup'dan 'writebackup'opsi:

'backup' 'writebackup'  action  ~
   off       off    no backup made
   off       on     backup current file, deleted afterwards (default)
   on        off    delete old backup, backup current file
   on        on     delete old backup, backup current file

Tukar file

Sedangkan untuk swap file, dapat berguna untuk mengumpulkannya di direktori khusus. Ini bisa dilakukan dengan 'directory'opsi. Sebagai contoh

:set directory^=$HOME/.vim/tmp//

akan menambah $HOME/.vim/tmpke kepala daftar direktori yang akan coba digunakan Vim saat membuat file swap. Trailing //membuat Vim menyandikan seluruh nama jalur ke file sehingga tidak ada tabrakan dengan file yang bernama sama dari direktori yang berbeda.

Peringatan : Ini secara efektif menonaktifkan kemampuan Vim untuk memperhatikan jika banyak pengguna mencoba mengedit file yang sama karena file swap disimpan di lokasi yang berbeda.

Cuplikan di bawah ini (diadaptasi dari vimrc tpope ) juga akan menonaktifkan file swap untuk buffer ketika tidak dimodifikasi, dengan cara itu jika Vim / komputer Anda crash ketika Anda memiliki banyak file terbuka, file swap yang tertinggal hanya akan menjadi untuk file yang dimodifikasi.

autocmd CursorHold,BufWritePost,BufReadPost,BufLeave *
  \ if isdirectory(expand("<amatch>:h")) | let &swapfile = &modified | endif

Peringatan : Karena file swap hanya ada ketika buffer diubah, ini memiliki efek yang sama seperti pengaturan 'directory'. Jika buffer tidak dimodifikasi, maka Vim lain dapat mulai mengeditnya tanpa pemberitahuan. Jika Vim kedua disimpan sebelum yang pertama membuat lebih banyak perubahan, maka mereka tidak akan diketahui sampai pengguna mencoba untuk menyimpan atau sesuatu memicu Vim untuk memeriksa apakah file tersebut dimodifikasi.

jamessan
sumber
5

Saya menggunakan saya .vimrcdi beberapa mesin, termasuk server bersama. Saya tidak selalu ingin orang dapat melihat file yang sedang saya kerjakan dan saya suka menjaga direktori home saya relatif bersih. Jadi ini solusi saya yang akan bekerja di Linux dan Mac OS X.

" Sets central temp file location, to prevent local default behavior.
if isdirectory($HOME . '/.vim/.tmp') == 0
  :silent !mkdir -m 700 -p ~/.vim/.tmp > /dev/null 2>&1
endif

set backupdir=~/.vim/.tmp ",~/.local/tmp/vim,/var/tmp,/tmp,
set directory=~/.vim/.tmp ",~/.local/tmp/vim,/var/tmp,/tmp,

Perhatikan bahwa ini akan membuat .tmpdirektori di bawah ~/.vimjika belum ada. Ini akan menjadi rumah baru dari file swap Anda. Untuk file undo, saya juga memiliki yang berikut di .vimrc(yang sangat mirip):

if exists("+undofile")
  " undofile -- This allows you to use undos after exiting and 
  "             restarting. NOTE: only present in 7.3+
  "             :help undo-persistence
  if isdirectory( $HOME . '/.vim/.undo' ) == 0
    :silent !mkdir -m 700 -p ~/.vim/.undo > /dev/null 2>&1
  endif
  set undodir=~/.vim/.undo
  set undofile
endif
HAL 9001
sumber
1

Inilah yang saya lakukan di vimrc saya:

fun! MkdirIfNeeded(dir, flags, permissions)
    if !isdirectory(a:dir)
        call mkdir(a:dir, a:flags, a:permissions)
    endif
endfun

" Set (& create if needed) a temp directory to keep backup & swap files
if has('win32')
    let whoami = substitute(system("whoami /LOGONID"), '\n', '', '')
    let tmpdir = 'C:/tmp/vim_' . whoami
else
    let whoami = substitute(system("whoami"), '\n', '', '')
    let tmpdir = '/var/tmp/vim_' . whoami
endif
call MkdirIfNeeded(tmpdir, 'p', 0700)

let &backupdir = tmpdir
let &dir = tmpdir
let &undodir = tmpdir

Ini akan membuat /var/tmp/vim_<username>, dan menggunakan ini untuk menyimpan semua file terkait vim. Menjaga direktori proyek Anda bersih.

Menggunakan whoamimemastikan Anda dapat menggunakan vimrc secara global (mis. Untuk pengguna & root) saat masih menggunakan direktori terpisah; jika Anda tidak membutuhkan ini, Anda bisa menggantinya dengan direktori kode keras untuk memulai lebih cepat. Anda juga dapat menggunakan ~/.vim/direktori, tetapi saya suka menggunakannya /var/tmpkarena biasanya sistem file terpisah.

Saya menggunakan /var/tmpkarena /tmpsering dihapus saat reboot. Anda mungkin tidak ingin direktori ini dapat ditulis oleh dunia, karena orang kemudian dapat menempatkan file di sana untuk melakukan hal-hal yang berpotensi berbahaya ketika Anda membuka file.

Martin Tournoij
sumber
1
/var/tmpselalu dapat ditulis oleh dunia — ini adalah direktori temp sistem. (Yah, Anda bisa mengubahnya menjadi tidak, tapi itu salah satu hal di mana sistem Unix seperti senang membiarkan Anda menyimpan potongan setelah Anda memecahkannya). Jika Anda memiliki pengguna lain di sistem, ia dapat membuatnya /var/tmp/vim_«your_username»dengan izin pilihannya. Dan kemudian mengisinya dengan symlink ke file penting Anda, yang mungkin akan dihancurkan oleh vim tempfiles.
derobert
@derobert Hanya jika itu tidak ada. Jika Anda menggunakan seluruh sistem ini dan memiliki banyak pengguna, Anda mungkin ingin menambahkan pembuatan direktori ini adduseratau apa pun yang Anda gunakan untuk membuat pengguna. Bagaimanapun, kebanyakan orang menggunakan Vim pada mesin tepercaya (tetapi komentar Anda bagus, seperti itu).
Martin Tournoij
Benar, hanya jika itu tidak ada. Yang, berada di direktori sementara sistem, terjadi berdasarkan tak terduga ketika tempfile dibersihkan. Tidak yakin mengapa Anda tidak meletakkannya di $HOMEsuatu tempat.
derobert
@derobert Well, /var/adalah sistem file yang berbeda. Teorinya adalah, hal itu akan mencegah banyak penulisan pada /,, /usratau /home, yang mengarah pada fragmentasi & risiko korupsi file yang lebih kecil jika terjadi kerusakan ... Ini juga mengapa kotak surat dan barang-barang aktif /varsecara default, dan bukan di homedir ...
Martin Tournoij