Làm thế nào để làm cho vim tự động thêm một dòng mới vào cuối tập tin?


16

Vim thường chỉ viết <EOL>cho dòng cuối cùng khi có một trong tệp gốc.

Làm cách nào để tạo vim để viết một dòng mới ở cuối tệp mọi lúc (khi tệp không phải là nhị phân và chưa có một dòng nào)?

Tôi đã thử nghiệm eoltùy chọn, nhưng nó không hoạt động như mong đợi.

Xem thêm: Bảo tồn phần cuối dòng bị thiếu ở cuối tệp văn bản , nhưng ngược lại. Và: Tại sao các tệp nên kết thúc bằng một dòng mới?

Câu trả lời:


17

Thông tin cơ bản

Vim không hiển thị dòng mới nhất trong bộ đệm nhưng thực tế vim luôn đặt EOL ở cuối tệp khi bạn viết nó, bởi vì nó là tiêu chuẩn cho các tệp văn bản trong các hệ thống Unix. Bạn có thể tìm thêm thông tin về điều này ở đây . Nói tóm lại, bạn không phải lo lắng về sự vắng mặt của một dòng mới ở cuối tập tin trong vim.

Thí nghiệm 1

Bạn có thể làm thí nghiệm nhỏ này để kiểm tra hành vi này. Trong thiết bị đầu cuối thực hiện:

$vim test_test

nhập ví dụ chỉ ký tự 1và lưu tập tin :w.

Bạn chỉ có một ký tự trong tập tin, phải không? Trên thực tế không :) Bây giờ bạn có trong tập tin 1LFnhân vật của bạn . Hãy kiểm tra nó, với tiện ích hexdump:

$hexdump test_test

đầu ra:

0000000 31 0a
0000002

31là mã ASCII cho ký tự 10alà mã ASCII cho ký tự không in LFmà đối với UNIX như bạn có thể đã biết mã ở cuối dòng.

Thí nghiệm 2

Nhưng điều gì sẽ xảy ra nếu chúng ta sẽ mở tệp không có eolký hiệu ở cuối tệp. Hãy cũng kiểm tra nó. Hãy tạo tập tin mà không có eol ở cuối, ví dụ như thế này:

$echo -n "1" > test_without_eol

và sau đó một lần nữa hãy nhìn vào bên trong nó với hexdump

$hexdup test_without_eol

đầu ra sẽ là:

000000 31
0000001

Vì vậy, không có bất kỳ eolnhân vật ở đây. Hãy mở tập tin này trong vim:

$vim test_without_eol

Ở dưới cùng của trình soạn thảo, bạn sẽ thấy:

"test_without_eol" [noeol] 1L, 1C

Và nếu bạn lưu eolký tự tệp này sẽ được tự động đưa vào.

Chúng ta có thể làm gì về điều này?

Nếu bạn thực sự cần phải xem cuối tập tin. Hãy thử sử dụng lệnh này:

:set listchars=eol:$

Nó sẽ hiển thị tất cả các eolký tự như là $dấu hiệu.


Tuyệt quá. Tôi đã đi đến kết luận tương tự sau sự nhầm lẫn của mình, vì Vim không thực sự cho tôi xem dòng mới này, nhưng nó đã ở đó sau khi lưu.
kenorb

1
@kenorb bằng cách bạn có thể hiển thị tất cả các trình duyệt EOL bằng cách sử dụng comand này:set listchars=eol:$
Alexander Myshov

"Không thực sự cho tôi thấy dòng mới này" - trong Unix, không có dòng nào. Một dòng được định nghĩa là "số lượng ký tự không phải là LF, chấm dứt trong một ký tự LF". Nếu bạn nghĩ về LF không phải là "đi đến dòng tiếp theo" mà là "cuối dòng", những gì Vim làm đột nhiên có ý nghĩa hơn nhiều.
Amadan

8

Vim chỉ bỏ qua các EOL nếu tập tin được mở ra như 'binary' các 'endofline'tùy chọn được thiết lập lại (khi tập tin nhị phân không có một EOL khi khai mạc, hoặc bạn thiết lập lại một cách rõ ràng tùy chọn). Nói cách khác, Vim chỉ vinh danh một EOL bị thiếu cho các tệp nhị phân. Đối với các tệp văn bản, nó luôn ghi bằng EOL (đã thêm). (Đó là lý do tại sao bạn cần các giải pháp như plugin PreserveNoEOL của tôi để giữ các tệp văn bản mà không có EOL.) Bạn có thể tìm thấy tất cả các chi tiết tại :help 'endofline'.

Vì vậy, bạn chỉ cần đảm bảo mở tệp dưới dạng không nhị phân để Vim tự động viết EOL.


5

Như Alexander đã đề cập, Vim không hiển thị EOL tại EOF, đó là lý do tại sao nó rất khó hiểu (đặc biệt là với dòng mới trống / trống là một thứ khác), do đó nó thực sự ghi lại mọi lúc khi lưu tệp.

Dưới đây là thử nghiệm đơn giản làm thế nào để kiểm tra nếu điều đó hoạt động:

$ printf foo > foo.txt
$ cat foo.txt
foo$ wc foo.txt
0 1 3 foo.txt
$ vim -cwq foo.txt
$ cat foo.txt
foo
$ wc foo.txt
1 1 4 foo.txt

Lưu ý cách shell shell hoạt động khi không có EOL (nó được trộn với dòng tiếp theo). Khi lưu lại tập tin với Vim, nó sẽ thêm nó.

Sử dụng wcchúng ta có thể đếm các dòng, từ và ký tự trước khi lưu và sau đó, vì vậy chúng ta có thể thấy rằng nó thực sự thay đổi.

Tại sao điều này rất quan trọng? Để giữ các tệp của chúng tôi tuân thủ POSIX .

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.