Vim: tất cả các phần mở rộng hoán đổi có thể là gì?


32

Khi bạn đang chỉnh sửa một tệp trong vim, nó sẽ tạo ra một tệp hoán đổi có cùng tên với tệp hiện tại của bạn, nhưng có .swpphần mở rộng.

Nếu .swpđã được thực hiện, sau đó nó tạo ra một .swotrong một. Nếu điều đó đã được thực hiện, thì bạn nhận được .swa, v.v.

Tôi không thể tìm thấy bất kỳ tài liệu nào về thứ tự đặt tên dự phòng chính xác cho các tệp này, có ai có thể làm rõ theo quy ước nào các tiện ích mở rộng được chọn không?


Xem thêm: Vi và Vim
mèo

Câu trả lời:


44

Đoạn mã cụ thể mà bạn đang tìm kiếm (và nhận xét) nằm trong memline.c:

    /* 
     * Change the ".swp" extension to find another file that can be used. 
     * First decrement the last char: ".swo", ".swn", etc. 
     * If that still isn't enough decrement the last but one char: ".svz" 
     * Can happen when editing many "No Name" buffers. 
     */
    if (fname[n - 1] == 'a')        /* ".s?a" */
    {   
        if (fname[n - 2] == 'a')    /* ".saa": tried enough, give up */
        {   
            EMSG(_("E326: Too many swap files found"));
            vim_free(fname);
            fname = NULL;
            break;  
        }
        --fname[n - 2];             /* ".svz", ".suz", etc. */
        fname[n - 1] = 'z' + 1;
    }
    --fname[n - 1];                 /* ".swo", ".swn", etc. */

22

Thông tin từ đoạn mã nằm trong trợ giúp của Vim. Xem :h swap-file:

The name of the swap file is normally the same as the file you are editing,
with the extension ".swp".
- On Unix, a '.' is prepended to swap file names in the same directory as the
  edited file.  This avoids that the swap file shows up in a directory
  listing.
- On MS-DOS machines and when the 'shortname' option is on, any '.' in the
  original file name is replaced with '_'.
- If this file already exists (e.g., when you are recovering from a crash) a
  warning is given and another extension is used, ".swo", ".swn", etc.
- An existing file will never be overwritten.
- The swap file is deleted as soon as Vim stops editing the file.

Technical: The replacement of '.' with '_' is done to avoid problems with
       MS-DOS compatible filesystems (e.g., crossdos, multidos).  If Vim
       is able to detect that the file is on an MS-DOS-like filesystem, a
       flag is set that has the same effect as the 'shortname' option.
       This flag is reset when you start editing another file.

                            *E326*
       If the ".swp" file name already exists, the last character is
       decremented until there is no file with that name or ".saa" is
       reached.  In the last case, no swap file is created.

17

Trong mắt, dễ nói hơn một chút, regex-speak:

[._]*.s[a-v][a-z]
[._]*.sw[a-p]
[._]s[a-v][a-z]
[._]sw[a-p]

Nguồn cho việc này là tệp gitignore của Github cho Vim .


Điều này dường như khớp không chính xác từ ".swq" đến ".swz".
Tháp Eric

@EricTowers Nó phải chính xác ngay bây giờ.
rúp

2
Có lẽ quan trọng hơn ... Bạn đã đẩy bản vá tại git? :-)
Tháp Eric


9

đủ tốt .gitignore

Mặc dù các câu trả lời khác ở đây rõ ràng đầy đủ hơn về mặt kỹ thuật ở đây là một mục đủ tốt cho hầu hết .gitignorecác câu hỏi mà tôi thường quan tâm nhất về điều này:

# vim swap files
##################
*.sw[a-p]

Như bạn có thể thấy từ các câu trả lời khác vimcó thể tạo ra hàng trăm tên khác, nhưng bạn phải xếp chồng lên 16 tệp hoán đổi trước khi điều này thất bại. Bằng cách khái quát hóa cho một cái gì đó giống như *.s[a-z][a-z]có thể xuất hiện chính xác hơn, nó cũng sẽ phù hợp với nhiều tiện ích mở rộng hợp lệ , trong trường hợp .gitignorecó nghĩa là các tệp đó sẽ không được theo dõi git. Tôi chưa bao giờ quản lý để tạo 16 tệp hoán đổi cho cùng một tệp trong 20 năm sử dụng vimvì vậy tôi hy vọng bạn có thể quản lý để làm điều tương tự và điều này sẽ làm việc cho bạn.

phiên bản chặt chẽ hơn

Như đã chỉ ra trong các nhận xét, nhà phát triển Flash có thể có .swfcác tệp để bạn có thể thích

*.sw[g-p]

mà vẫn sẽ bỏ qua 10 tập tin trao đổi rất nhiều cho hầu hết mọi người. Điều đáng buồn duy nhất là bạn mất đi tính năng "hoán đổi".


2
Trừ khi tôi thiếu thứ gì đó, điều đó sẽ chỉ bắt được "swp" vì cái tiếp theo là "swo" chứ không phải "swq". Cá nhân, tôi sử dụng "* .sw [ap]" cho lý do bạn đưa ra và cũng vì nó đọc "hoán đổi" :)
JoL

1
Để tránh bỏ qua những thứ không phải là vim trao đổi tập tin như .sw2hoặc .sw$nên được theo dõi trong repo.
gà con

2
Hãy nhớ bao gồm các .swftập tin của bạn . Hoặc nâng cấp nhà phát triển Flash của bạn lên HTML5 :-)
Jan Fabry

3
Bạn có thể tránh hầu hết các tệp hợp pháp bị bắt bằng cách kiểm tra hàng đầu .hoặc _cũng được thêm vào.
IMSoP

2
Tôi phát hiện ra *.sw[a-p]bản thân mình. Tôi thích nó :)
Wayne Werner

1

Sự thay thế .gitignore này sẽ làm hài lòng tất cả mọi người. Dòng thứ hai phủ nhận bỏ qua '* .swf'.

*.sw[a-p]
!*.swf
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.