Jak mogę uniemożliwić Vimowi pozostawienie zbyt wielu plików (takich jak zamiana, tworzenie kopii zapasowych, cofanie)?

13

Domyślnie vimpozostawia pliki wymiany w moim katalogu projektu, aw razie awarii pozostawia pliki kopii zapasowej.

Czy mogę temu zapobiec? Czy muszę zaktualizować .VCSignoreplik wszystkich moich projektów ?

Martin Tournoij
źródło

Odpowiedzi:

16

Kopia zapasowa

Domyślnie Vim nie pozostawia plików kopii zapasowych. Są to tylko przejściowe pliki, które istnieją, gdy Vim zapisuje bufor na dysku. Jak opisano w :help backup-tabletym zachowaniu, można kontrolować za pomocą opcji 'backup'i 'writebackup':

'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

Zamień pliki

Jeśli chodzi o pliki wymiany, przydatne może być zebranie ich w dedykowanym katalogu. Można to zrobić za pomocą 'directory'opcji. Na przykład

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

doda $HOME/.vim/tmpdo nagłówka listy katalogów, których Vim spróbuje użyć podczas tworzenia pliku wymiany. Końcowe //powoduje, że Vim koduje całą nazwę ścieżki do pliku, więc nie ma kolizji z plikami o podobnych nazwach z różnych katalogów.

Zastrzeżenie : To skutecznie wyłącza zdolność Vima do zauważenia, czy wielu użytkowników próbuje edytować ten sam plik, ponieważ pliki wymiany są przechowywane w różnych lokalizacjach.

Poniższy fragment kodu (zaadaptowany z vimrc tpope'a ) również wyłączy plik wymiany dla bufora, gdy nie zostanie zmodyfikowany, w ten sposób, jeśli Vim / twój komputer ulegnie awarii, gdy masz otwartą wiązkę plików, pozostawione pliki wymiany będą tylko dla zmodyfikowanych plików.

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

Uwaga : Ponieważ plik wymiany istnieje tylko wtedy, gdy bufor jest modyfikowany, ma to podobny efekt jak ustawienie 'directory'. Jeśli bufor nie jest zmodyfikowany, inny Vim może rozpocząć edycję bez powiadomienia. Jeśli drugi Vim zapisze, zanim pierwszy wprowadzi więcej zmian, nie zostaną zauważeni, dopóki użytkownik nie spróbuje zapisać lub coś spowoduje, że Vim sprawdzi, czy plik jest zmodyfikowany.

jamessan
źródło
5

Używam mojego .vimrcna wielu komputerach, w tym na serwerach współdzielonych. Niekoniecznie chcę, aby ludzie mogli zobaczyć pliki, nad którymi pracuję, i lubię utrzymywać względnie czysty katalog domowy. To jest moje rozwiązanie, które działa dobrze w systemach Linux i 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,

Pamiętaj, że spowoduje to utworzenie .tmpkatalogu, ~/.vimjeśli jeszcze nie istnieje. To byłby nowy dom twoich plików wymiany. W przypadku plików cofania mam również następujące elementy .vimrc(które są dość podobne):

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
źródło
1

Oto co robię w moim vimrc:

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

Stworzy /var/tmp/vim_<username>i użyje tego do przechowywania wszystkich plików związanych z vimem. Utrzymywanie katalogu projektu w czystości.

Używanie whoamizapewnia, że ​​możesz używać vimrc globalnie (tj. Dla użytkownika i roota), wciąż korzystając z oddzielnych katalogów; jeśli nie jest to potrzebne, możesz zastąpić go katalogiem na stałe, aby przyspieszyć uruchomienie. Możesz także użyć ~/.vim/katalogu, ale lubię go używać, /var/tmpponieważ zwykle jest to oddzielny system plików.

Używam, /var/tmpponieważ /tmpczęsto jest czyszczony przy ponownym uruchomieniu. Prawdopodobnie nie chcesz, aby ten katalog był zapisywany na całym świecie, ponieważ ludzie mogliby tam umieszczać pliki, aby robić potencjalnie szkodliwe rzeczy po otwarciu pliku.

Martin Tournoij
źródło
1
/var/tmpjest zawsze dostępny do zapisu na całym świecie - jest to systemowy katalog tymczasowy. (Cóż, możesz to zmienić tak, aby nie było, ale to jedna z tych rzeczy, w których systemy uniksowe z przyjemnością pozwalają ci zachować elementy po ich zerwaniu). Jeśli masz innego użytkownika w systemie, on / ona może tworzyć /var/tmp/vim_«your_username»z uprawnieniami według własnego wyboru. A następnie wypełnij go dowiązaniami symbolicznymi do ważnych plików, które prawdopodobnie zostaną zniszczone przez pliki tymczasowe vim.
derobert
@derobert Tylko jeśli nie istnieje. Jeśli korzystasz z tego systemu i masz wielu użytkowników, prawdopodobnie chcesz dodać tworzenie tego katalogu adduserlub cokolwiek, czego używasz do tworzenia użytkowników. W każdym razie większość ludzi używa Vima na zaufanych komputerach (ale twój komentarz jest dobry jako taki).
Martin Tournoij
Prawidłowo, tylko jeśli nie istnieje. Które, będąc w systemowym katalogu tymczasowym, dzieje się nieprzewidywalnie w zależności od tego, kiedy pliki tymczasowe zostaną wyczyszczone. Nie jestem pewien, dlaczego nie umieścisz go $HOMEgdzieś.
derobert
@derobert Cóż, /var/to inny system plików. W teorii jest to, że będzie ona zapobiec dużo pisze /, /usralbo /home, co prowadzi do zmniejszenia fragmentacji i ryzyko uszkodzenia plików w przypadku awarii ... Jest to również dlaczego skrzynek pocztowych i rzeczy są na /vardomyślnie, a nie w homedir ...
Martin Tournoij