Làm cách nào để phát hiện xem các tập tin swp có chứa các thay đổi chưa được lưu không?


11

Khi chỉnh sửa mã nguồn bằng gvim (v.7.4.488), tôi muốn thực hiện một số thay đổi vcs (Tôi đang sử dụng git 2.1.4 từ dòng lệnh trong Ubuntu linux).

git --status

hiển thị những tập tin tôi đã thay đổi. Tuy nhiên, nó cũng hiển thị vim .*.swpcủa (các) bộ đệm hiện có thể nhìn thấy (cả hai nếu tệp chứa các thay đổi chưa được lưu và khi tệp được chỉnh sửa giống như .*.swp-file). Tất nhiên, git có thể bỏ qua các tệp này hoặc vim có thể lưu trữ các tệp hoán đổi ở một vị trí khác (xem vim.wikia hoặc câu hỏi này tại stackoverflow ). Nhưng tôi thích các .*.swp-files hiển thị git --statuskhi chúng chứa các thay đổi chưa được lưu, vì nó báo hiệu cho tôi rằng tôi đang thực hiện các tệp ở trạng thái khác với những gì tôi nghĩ chúng đang ở.

Làm cách nào tôi có thể tránh các lỗi tích cực của .*.swp-files hiển thị git --statuskhi tệp đã lưu giống với .*.swp-file, trong khi có thể thấy tệp đó để cam kết ở trạng thái khác với tệp tôi đang chỉnh sửa bằng vim?

  • Có thể chỉ có .*.swp-files, khi tệp trên đĩa và tệp trong vim khác nhau không?
  • Có cách nào khác để phát hiện các tập tin chưa được lưu?

Kết hợp các nhận xét của @elyashiv@VanLaser dẫn đến một phương pháp đơn giản hơn là phát hiện xem các tệp hoán đổi có ngụ ý các tệp chưa được lưu hay không:

  1. đừng để git bỏ qua các tập tin. *. sw [po];
  2. khi cam kết, nếu git --statustiết lộ bất kỳ .*.sw[po]-files nào làm :watrong vi; và,
  3. thêm và cam kết.

1
bạn có thể sử dụng :wađể đảm bảo không có bất kỳ tệp nào chưa được lưu.
elyashiv

2
thực sự, đó là "vệ sinh" nhiều hơn để đảm bảo tất cả các tệp của bạn được lưu trước bạn git commit...
VanLaser

Câu trả lời:


8

vim -rtại dòng lệnh sẽ liệt kê tất cả các tệp hoán đổi trong thư mục hiện tại và thư mục tạm thời, và liệu chúng có chứa bất kỳ thay đổi nào chưa được lưu hay không. Hãy tìm dòng mà nói modified: no/YES.

Tôi không biết làm thế nào để bảo Vim tìm trong một thư mục khác, vì vậy bạn sẽ cần thay đổi thành từng thư mục chứa tệp hoán đổi và chạy vim -r. Bạn có thể đưa ra một tập lệnh phân tích cú pháp đầu ra git statushoặc được sử dụng find -name '.*.sw[po]'và sau đó chạy vim -rtrong mỗi thư mục để hiển thị tất cả các tệp hoán đổi với các thay đổi chưa được lưu.

(Tôi sử dụng .*.sw[po]thay vì .*.swp, vì đôi khi .swocác tệp được tạo ngoài .swptệp, khi bạn chỉnh sửa tệp đã có tệp hoán đổi. Các .swntệp cũng có thể được tạo nếu bạn chỉnh sửa tệp có hai tệp hoán đổi hiện có, nhưng tôi không nghĩ Tôi đã từng thấy một thứ trong tự nhiên. Nếu bạn thực sự hoang tưởng, bạn có thể sử dụng .*.sw[a-p]hoặc đơn giản .*.sw?.)

Xem :help -rđể biết thêm một chút thông tin về -rtùy chọn hoặc :help recover.txtđể biết thêm thông tin về tên tập tin phục hồi và hoán đổi.


1
Chà, các tập tin hoán đổi của Vim là các tập tin ẩn (dẫn đầu .trong tên tệp) vì vậy mẫu đúng sẽ là .*.sw[a-p](mặc dù trong các trường hợp bệnh lý, bạn thực sự có thể tìm mọi cách .foo.saa). Điều đó cũng sẽ loại trừ các tệp Flash phù hợp, vì tôi nghi ngờ những tệp đó thường là một tệp ẩn.
jamessan

@jamessan Việc dẫn đầu .là bắt buộc trong shell toàn cầu, nhưng *.swphoạt động như một đối số find. Nhưng hàng đầu .làm cho mọi thứ đơn giản hơn. Cảm ơn!
Tiếng Litva

8
  • Có thể chỉ có .*.swp-files, khi tệp trên đĩa và tệp trong vim khác nhau không?

Đúng. Đoạn mã dưới đây (được điều chỉnh từ vprc của tpope ) sẽ vô hiệu hóa tệp hoán đổi cho bộ đệm khi nó không được sửa đổi, vì vậy các tệp hoán đổi chỉ tồn tại cho các tệp đã sửa đổi.

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

Hãy cẩn thận : Vì tệp hoán đổi chỉ tồn tại khi bộ đệm bị sửa đổi, bạn sẽ mất việc sử dụng tệp hoán đổi làm khóa tư vấn. 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 rằng nó đã mở. 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.

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.