Làm cách nào tôi có thể ngăn Vim để lại quá nhiều tệp (như trao đổi, sao lưu, hoàn tác)?


13

Theo mặc định, vimđể lại các tệp hoán đổi trong thư mục dự án của tôi và trên các sự cố, nó để lại các tệp sao lưu.

Tôi có thể ngăn chặn điều này? Hay tôi cần cập nhật tất cả các .VCSignoretập tin dự án của mình ?

Câu trả lời:


16

Tập tin sao lưu

Theo mặc định, Vim không để lại các tập tin sao lưu. Chúng chỉ là các tệp tạm thời tồn tại trong khi Vim đang lưu bộ đệm vào đĩa. Như được mô tả trong :help backup-tablehành vi này có thể được kiểm soát bởi 'backup''writebackup'các tùy chọn:

'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

Hoán đổi tập tin

Đối với các tập tin trao đổi, có thể hữu ích để thu thập chúng trong một thư mục chuyên dụng. Điều này có thể được thực hiện với các 'directory'tùy chọn. Ví dụ

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

sẽ thêm $HOME/.vim/tmpvào phần đầu của danh sách các thư mục mà Vim sẽ cố gắng sử dụng khi tạo tệp hoán đổi. Việc theo dõi //làm cho Vim mã hóa toàn bộ tên đường dẫn vào tệp để không xảy ra xung đột với các tệp có tên tương tự từ các thư mục khác nhau.

Hãy cẩn thận : Điều này vô hiệu hóa khả năng Vim chú ý nếu nhiều người dùng đang cố chỉnh sửa cùng một tệp vì các tệp hoán đổi được lưu trữ ở các vị trí khác nhau.

Đoạn mã bên dưới (được điều chỉnh từ vprc của tpope ) cũng sẽ vô hiệu hóa tệp hoán đổi cho bộ đệm khi nó không được sửa đổi, theo cách đó nếu Vim / máy tính của bạn gặp sự cố khi bạn mở một loạt tệp, các tệp hoán đổi bị bỏ lại sẽ chỉ là cho các tập tin sửa đổi.

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

Caveat : Kể từ khi tập tin hoán đổi chỉ tồn tại khi bộ đệm được sửa đổi, điều này có ảnh hưởng tương tự như thiết lập 'directory'. Nếu bộ đệm không được sửa đổi, thì một Vim khác có thể bắt đầu chỉnh sửa nó mà không cần thông báo trước. Nếu Vim thứ hai lưu trước khi thay đổi thứ nhất thực hiện nhiều thay đổi, thì chúng sẽ không được chú ý cho đến khi người dùng cố lưu hoặc một cái gì đó kích hoạt Vim để kiểm tra xem tệp có bị sửa đổi hay không.


5

Tôi sử dụng .vimrctrên nhiều máy, kể cả máy chủ dùng chung. Tôi không nhất thiết muốn mọi người có thể xem các tệp mà tôi đang làm việc và tôi thích giữ thư mục nhà của mình tương đối sạch sẽ. Vì vậy, đây là giải pháp của tôi sẽ hoạt động tốt trên Linux và 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,

Lưu ý rằng điều này sẽ tạo một .tmpthư mục theo ~/.vimnếu nó không tồn tại. Đây sẽ là ngôi nhà mới của các tập tin trao đổi của bạn. Đối với các tệp hoàn tác, tôi cũng có phần sau đây .vimrc(khá giống nhau):

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

1

Đây là những gì tôi làm trong vimrc của mình:

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

Nó sẽ tạo /var/tmp/vim_<username>và sử dụng nó để lưu trữ tất cả các tệp liên quan đến vim. Giữ thư mục dự án của bạn sạch sẽ.

Sử dụng whoamiđảm bảo bạn có thể sử dụng vimrc trên toàn cầu (ví dụ: cho người dùng & root) trong khi vẫn sử dụng các thư mục riêng biệt; nếu bạn không cần điều này, bạn có thể thay thế nó bằng một thư mục được mã hóa cứng để khởi động nhanh hơn. Bạn cũng có thể sử dụng ~/.vim/thư mục, nhưng tôi thích sử dụng /var/tmpvì nó thường là một hệ thống tập tin riêng biệt.

Tôi sử dụng /var/tmp/tmpthường bị xóa khi khởi động lại. Bạn có thể không muốn thư mục này có thể ghi được trên thế giới, vì mọi người sau đó có thể đặt các tệp ở đó để thực hiện những việc có hại khi bạn mở tệp.


1
/var/tmpLuôn luôn có thể ghi được trên thế giới. Đây là một thư mục tạm thời của hệ thống. (Chà, bạn có thể thay đổi nó thành không, nhưng đó là một trong những điều mà các hệ thống giống Unix rất vui lòng cho phép bạn giữ các phần sau khi bạn phá vỡ nó). Nếu bạn có một người dùng khác trên hệ thống, anh ấy / cô ấy có thể tạo /var/tmp/vim_«your_username»với sự cho phép của sự lựa chọn của anh ấy / cô ấy. Và sau đó điền nó với các liên kết tượng trưng đến các tệp quan trọng của bạn, có thể sẽ bị phá hủy bởi các tempfiles vim.
derobert

@derobert Chỉ khi nó không tồn tại. Nếu bạn sử dụng nhiều người dùng trên toàn hệ thống và có nhiều người dùng này, bạn có thể muốn thêm việc tạo thư mục này vào adduserhoặc bất cứ điều gì bạn đang sử dụng để tạo người dùng. Trong mọi trường hợp, hầu hết mọi người sử dụng Vim trên các máy đáng tin cậy (nhưng nhận xét của bạn là tốt, như vậy).
Martin Tournoij

Đúng, chỉ khi nó không tồn tại. Mà, trong một thư mục tạm thời của hệ thống, sẽ xảy ra không thể đoán trước dựa trên khi những tempfiles đó được dọn sạch. Không chắc chắn tại sao bạn không đặt nó ở $HOMEđâu đó.
derobert

@derobert Vâng, /var/là một hệ thống tập tin khác. Lý thuyết là, nó sẽ ngăn chặn rất nhiều việc ghi vào /, /usrhoặc /home, dẫn đến việc phân mảnh ít hơn và có nguy cơ bị hỏng tệp trong trường hợp bị sập ... Đây cũng là lý do tại sao hộp thư và nội dung được bật /vartheo mặc định chứ không phải trong homedir ...
Martin Tournoij 3/215
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.