วิธีการทำให้เป็นกลุ่มเพิ่มขึ้นบรรทัดใหม่โดยอัตโนมัติในตอนท้ายของไฟล์?


16

ปกติแล้วกลุ่มจะเขียน<EOL>สำหรับบรรทัดสุดท้ายเฉพาะเมื่อมีหนึ่งในไฟล์ต้นฉบับ

วิธีที่จะทำให้เป็นกลุ่มที่จะเขียนบรรทัดใหม่ในตอนท้ายของไฟล์ตลอดเวลา (เมื่อไฟล์ที่ไม่ได้เป็นแบบไบนารีและไม่มีอยู่แล้ว)

ฉันทดสอบeolตัวเลือกแล้ว แต่ใช้งานไม่ได้ตามที่คาดไว้

ดูเพิ่มเติม: รักษาจุดสิ้นสุดของบรรทัดที่หายไปที่ท้ายไฟล์ข้อความแต่ตรงกันข้าม และ: ทำไมไฟล์ควรลงท้ายด้วยการขึ้นบรรทัดใหม่

คำตอบ:


17

ข้อมูลพื้นฐาน

Vim ไม่แสดงบรรทัดใหม่ล่าสุดในบัฟเฟอร์ แต่จริง ๆ แล้ว vim จะวาง EOL ไว้ท้ายไฟล์เมื่อคุณเขียนเพราะมาตรฐานสำหรับไฟล์ข้อความในระบบ Unix คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่ ในระยะสั้นคุณไม่ต้องกังวลเกี่ยวกับการขาดบรรทัดใหม่ในตอนท้ายของไฟล์ในกลุ่ม

การทดลอง 1

คุณสามารถทำการทดลองขนาดเล็กนี้เพื่อตรวจสอบพฤติกรรมนี้ ใน terminal รัน:

$ vim test_test

ใส่ตัวอักษรและบันทึกไฟล์1:wq

คุณมีอักขระเพียงตัวเดียวในไฟล์ใช่มั้ย ไม่จริง :) ตอนนี้คุณมีไฟล์1และLFตัวละครอยู่แล้ว ตรวจสอบด้วยโปรแกรมอรรถประโยชน์ hexdump:

$ hexdump test_test
0000000 31 0a
0000002

31เป็นรหัส ASCII สำหรับตัวอักษร1และ0aเป็นรหัส ASCII สำหรับLFตัวอักษรที่ไม่ได้พิมพ์ซึ่งสำหรับ UNIX ซึ่งคุณอาจทราบโค้ดสำหรับจุดสิ้นสุดบรรทัดแล้ว

การทดลอง 2

แต่ถ้าเราจะเปิดไฟล์ที่ไม่มีeolสัญลักษณ์อยู่ท้ายไฟล์ ลองตรวจสอบด้วยนะ มาสร้างไฟล์ที่ไม่มี eol ตอนท้ายเช่นนี้

$ echo -n "1" > test_without_eol

จากนั้นลองดูข้างในอีกครั้งด้วย hexdump:

$ hexdump test_without_eol
000000 31
0000001

ดังนั้นจึงไม่มีeolตัวละครใด ๆที่นี่ ลองเปิดไฟล์นี้เป็นกลุ่ม:

$ vim test_without_eol

ที่ด้านล่างของเครื่องมือแก้ไขคุณจะเห็น:

"test_without_eol" [noeol] 1L, 1C

และถ้าคุณจะบันทึกeolตัวละครไฟล์นี้จะถูก putted โดยอัตโนมัติ

เราจะทำอย่างไรกับเรื่องนี้?

หากคุณต้องการเห็นจุดสิ้นสุดของไฟล์จริงๆ ลองใช้คำสั่งนี้:

:set listchars=eol:$

มันจะแสดงeolตัวละครทั้งหมดเป็น$สัญญาณ


ยิ่งใหญ่ ฉันมาถึงข้อสรุปเดียวกันหลังจากความสับสนของฉันเพราะเป็นกลุ่มที่ไม่ได้แสดงให้ฉันเห็นบรรทัดใหม่นี้จริง ๆ แต่มันก็มีหลังจากบันทึก
kenorb

1
@kenorb ตามวิธีที่คุณสามารถแสดงตัวละคร EOL ทั้งหมดโดยใช้ comand นี้:set listchars=eol:$
Alexander Myshov

"ไม่ได้แสดงบรรทัดใหม่นี้ให้ฉัน" - ใน Unix ไม่มีบรรทัด บรรทัดถูกกำหนดเป็น "จำนวนอักขระที่ไม่ใช่ LF สิ้นสุดในอักขระ LF" หากคุณคิดว่า LF ไม่ใช่ "ไปที่บรรทัดถัดไป" แต่เป็น "จุดสิ้นสุดของบรรทัด" สิ่งที่ Vim จะทำให้เข้าใจได้ง่ายขึ้น
Amadan

8

ที่เป็นกลุ่มเฉพาะละเว้น EOL ถ้าแฟ้มถูกเปิดเป็น'binary' และ'endofline'ตัวเลือกการตั้งค่า (เมื่อไฟล์ไบนารีไม่ได้มี EOL เมื่อเปิดหรือคุณอย่างชัดเจนตั้งค่าตัวเลือก) กล่าวอีกนัยหนึ่งเป็นกลุ่มเท่านั้นที่ให้เกียรติ EOL ที่ขาดหายไปสำหรับไฟล์ไบนารี สำหรับไฟล์ข้อความมันจะเขียนด้วย EOL (เพิ่ม) เสมอ (ที่ว่าทำไมคุณต้องแก้ปัญหาเช่นฉันPreserveNoEOL ปลั๊กอินที่จะเก็บไฟล์ข้อความได้โดยไม่ต้อง EOL.) :help 'endofline'คุณสามารถหารายละเอียดทั้งหมดได้ที่

ดังนั้นคุณจะต้องให้แน่ใจว่าจะเปิดไฟล์ในรูปแบบที่ไม่ใช่ไบนารีเพื่อให้ Vim เขียน EOL โดยอัตโนมัติ


5

ขณะที่อเล็กซานเดกล่าวเป็นกลุ่มไม่แสดง EOL ที่ EOF ที่ว่าทำไมมันจึงทำให้เกิดความสับสน (โดยเฉพาะอย่างยิ่งกับที่ว่างเปล่า / บรรทัดใหม่ว่างเปล่าซึ่งเป็นอีกสิ่งหนึ่ง) ดังนั้นมันจริงเขียนทุกเวลาในการบันทึกแฟ้ม

นี่คือการทดสอบง่ายๆว่าจะทดสอบได้อย่างไร:

$ 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

สังเกตว่า shell prompt ทำงานอย่างไรเมื่อไม่มี EOL (มันผสมกับบรรทัดถัดไป) เมื่อบันทึกไฟล์อีกครั้งด้วย Vim จะเป็นการเพิ่มไฟล์

การใช้wcเราสามารถนับบรรทัดคำและตัวอักษรก่อนการบันทึกและหลังเพื่อให้เราเห็นว่าการเปลี่ยนแปลงนั้นจริง

ทำไมสิ่งนี้จึงสำคัญ เพื่อให้ไฟล์ของเราตาม POSIX

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.