VIM ปิดใช้งานการขึ้นบรรทัดใหม่อัตโนมัติเมื่อสิ้นสุดไฟล์


251

ดังนั้นฉันทำงานในร้านค้า PHP และเราทุกคนใช้บรรณาธิการที่แตกต่างกันและเราทุกคนต้องทำงานบน windows ฉันใช้เสียงเรียกเข้าและทุกคนในร้านบ่นว่าทุกครั้งที่ฉันแก้ไขไฟล์จะมีบรรทัดใหม่ที่ด้านล่าง ฉันค้นหาไปรอบ ๆ แล้วพบว่านี่เป็นพฤติกรรมที่บันทึกไว้ของ vi & vim ... แต่ฉันสงสัยว่ามีวิธีปิดใช้งานคุณลักษณะนี้ไหม (มันจะดีที่สุดถ้าฉันสามารถปิดการใช้งานสำหรับนามสกุลไฟล์ที่เฉพาะเจาะจง)

หากใครรู้เรื่องนี้ก็คงจะดีมาก!


23
คุณควรจะบอกพวกเขาว่าพวกเขากำลังถูกโง่ - มีจริงเป็นเหตุผลว่าทำไมเป็นกลุ่มไม่ว่า: stackoverflow.com/questions/729692/... ฉันเดาว่ามันจะเกี่ยวข้องถ้าคุณกำลังปรับใช้บนเซิร์ฟเวอร์ที่มีลักษณะคล้ายยูนิกซ์
hdgarrood

5
วิธีปฏิบัติที่แนะนำอย่างเป็นทางการของ PHP คือละเว้น?>แท็กปิดล่าสุดเพียงด้วยเหตุผลนี้
Sebastián Grignoli

คำถามนี้อาจมาก่อน superuser ... แต่ควรมี
gcb

20
คำถามควรเป็น: เราจะบอกบรรณาธิการอื่น ๆ ทั้งหมดได้อย่างไรว่าผู้คนในร้านของคุณใช้เพื่อให้แน่ใจว่าบรรทัดสุดท้ายของไฟล์นั้นลงท้ายด้วย EOL ;-)
TJ Crowder

คำตอบ:


361

และสำหรับvim7.4+ คุณสามารถใช้ (ควรเป็น. vimrc ของคุณ) (ขอบคุณ罗泽轩สำหรับข่าวล่าสุด!):

:set nofixendofline

vimตอนนี้เกี่ยวกับรุ่นเก่า

แม้ว่าไฟล์นั้นจะถูกบันทึกด้วยบรรทัดใหม่ในตอนท้าย:

vim -b file และอีกครั้งในกลุ่ม:

:set noeol
:wq

เสร็จแล้ว

หรือคุณสามารถเปิดไฟล์ในกลุ่มด้วย :e ++bin file

อีกทางเลือกหนึ่ง:

:set binary
:set noeol
:wq

6
คุณยังสามารถเพิ่มset binaryและset noeolใน. vimrc ของคุณ
dryobs

17
ระวัง : การbinaryแทนที่expandtabซึ่งจะทำให้คุณได้รับแท็บตัวอักษรในแหล่งที่มาของคุณ
Ciro Santilli 郝海东冠状病六四事件法轮功

4
@CiroSantilli ขอบคุณ! ฉันได้รับการมองหาผลข้างเคียงของไบนารีถาวรและสงสัยว่าทำไมมันไม่เริ่มต้น! ตั้งแต่ฉันรักแท็บของฉันฉันคิดว่าฉันจะพิจารณาว่าประโยชน์เพิ่ม :)
GCB

11
ตอนนี้คุณสามารถเพิ่มset nofixendoflineเพื่อแก้ปัญหาใน Vim 7.4+
罗泽轩

1
@TrevorBoydSmith ใช่เพราะในอดีต POSIX (ฉันอาจจะผิดในมาตรฐานจริง) คาดว่าจะมีบรรทัดใหม่ที่ท้ายบรรทัดในไฟล์ข้อความ นั่นเป็นเหตุผลว่าทำไมโซลูชั่นส่วนใหญ่จึงจำเป็นต้องใช้เป็นไบนารี่ มันอาจจะสะดวกมากแล้วและย้อนหลังวันนี้นั่นเป็นสาเหตุที่ตอนนี้มีการตั้งค่าที่สะดวก เพียงเพิ่มลงใน vimrc ของคุณ มีปัญหาที่เลวร้ายยิ่งในการแก้ไขอื่น ๆ เลยล่ะค่ะ :) มี
GCB

23

เพิ่มคำสั่งต่อไปนี้ใน. vimrc ของคุณเพื่อเปิดตัวเลือกการสิ้นสุดของบรรทัด:

autocmd FileType php setlocal noeol binary fileformat=dos

อย่างไรก็ตาม PHP เองจะไม่สนใจจุดสิ้นสุดของบรรทัดสุดท้ายซึ่งไม่น่าเป็นปัญหา ฉันเกือบจะแน่ใจว่าในกรณีของคุณมีอย่างอื่นที่เพิ่มอักขระขึ้นบรรทัดใหม่ล่าสุดหรืออาจมีการปะปนกับประเภทสิ้นสุดบรรทัด windows / unix ( \nหรือ\r\nฯลฯ )

ปรับปรุง:

ทางเลือกอื่นอาจเป็นการเพิ่มบรรทัดนี้ใน. vimrc ของคุณ:

set fileformats+=dos

ฉันรู้ว่า php ไม่ได้แยกวิเคราะห์ผิด ... ฉันแสดงให้เพื่อนร่วมงานเห็น แต่ winmerge เห็นว่าพวกเขาแตกต่าง ... ฉันจะลองและบอกให้คุณรู้ว่ามันจะเป็นยังไง
Boushley

การทำเช่นนี้มีผลกระทบที่ต้องการของไม่มีบรรทัดสุดท้าย แต่มันก็แปลงไฟล์ให้เป็นจุดจบของบรรทัดยูนิกซ์ ... (แม้ในกล่องหน้าต่าง) ... ดังนั้นฉันจึงทำเช่นนั้นมาก่อนโดยเปลี่ยนเป็นโหมดไบนารี ... แต่แล้ว การจบบรรทัดไม่แสดงการเขียนในแผ่นจดบันทึก ... ทุกอย่างเป็นเพียงบรรทัดเดียว
Boushley

น่าเสียดายที่คำแนะนำเหล่านั้นไม่ทำงาน การเพิ่ม fileformat = dos ไปที่ autocmd ไม่มีผลใด ๆ และตั้งค่า filetype + = dos ยังคงเพิ่มการติดตาม \ n
Boushley

ขออภัยฉันเข้าใจผิดใช้ 'set filetypes + = dos' ไม่ใช่ 'set fileformats ... '
php มากเกินไป

17

มีวิธีอื่นในการเข้าถึงหากคุณใช้ Git สำหรับการควบคุมแหล่งที่มา แรงบันดาลใจจากคำตอบที่นี่ฉันเขียนตัวกรองของฉันเองเพื่อใช้ในไฟล์gitattributes

หากต้องการติดตั้งตัวกรองนี้ให้บันทึกเป็นส่วนnoeol_filterหนึ่งของคุณ$PATHทำให้สามารถใช้งานได้และเรียกใช้คำสั่งต่อไปนี้:

git config --global filter.noeol.clean noeol_filter
git config --global filter.noeol.smudge cat

ในการเริ่มใช้ตัวกรองเฉพาะสำหรับตัวคุณเองให้ใส่บรรทัดต่อไปนี้ใน$GIT_DIR/info/attributes:

*.php filter=noeol

สิ่งนี้จะทำให้แน่ใจว่าคุณไม่ได้ขึ้นบรรทัดใหม่ใด ๆ ที่ eof ใน.phpไฟล์ไม่ว่า Vim จะทำอะไร

และตอนนี้ตัวสคริปต์:

#!/usr/bin/python

# a filter that strips newline from last line of its stdin
# if the last line is empty, leave it as-is, to make the operation idempotent
# inspired by: /programming/1654021/how-can-i-delete-a-newline-if-it-is-the-last-character-in-a-file/1663283#1663283

import sys

if __name__ == '__main__':
    try:
        pline = sys.stdin.next()
    except StopIteration:
        # no input, nothing to do
        sys.exit(0)

    # spit out all but the last line
    for line in sys.stdin:
        sys.stdout.write(pline)
        pline = line

    # strip newline from last line before spitting it out
    if len(pline) > 2 and pline.endswith("\r\n"):
        sys.stdout.write(pline[:-2])
    elif len(pline) > 1 and pline.endswith("\n"):
        sys.stdout.write(pline[:-1])
    else:
        sys.stdout.write(pline)

นั่นเป็นทางออกที่ดี ... ถึงแม้ว่าฉันจะไม่ได้ใช้คอมไพล์ ฉันใช้ svn แม้ว่าฉันจะสงสัยว่าอาจมีวิธีการที่คล้ายกันนี้ ยังไงก็ตามผมได้ย้ายจากตำแหน่งนั้นและไม่ต้องกังวลเกี่ยวกับที่อีกต่อไป :)
Boushley

12

ฉันยังไม่ได้ลองตัวเลือกนี้ แต่ได้รับข้อมูลต่อไปนี้ในระบบวิธีใช้ vim (เช่น help eol):

'endofline' 'eol'   boolean (default on)
            local to buffer
            {not in Vi}

When writing a file and this option is off and the 'binary' option
is on, no <EOL> will be written for the last line in the file.  This
option is automatically set when starting to edit a new file, unless
the file does not have an <EOL> for the last line in the file, in
which case it is reset.  

โดยปกติคุณไม่จำเป็นต้องตั้งค่าหรือรีเซ็ตตัวเลือกนี้ เมื่อปิด 'binary' ค่าจะไม่ถูกใช้เมื่อเขียนไฟล์ เมื่อ 'binary' เปิดอยู่จะใช้เพื่อจดจำการมีอยู่ของ a สำหรับบรรทัดสุดท้ายในไฟล์ดังนั้นเมื่อคุณเขียนไฟล์คุณสามารถเก็บสถานการณ์จากไฟล์ต้นฉบับได้ แต่คุณสามารถเปลี่ยนได้ถ้าคุณต้องการ

คุณอาจสนใจคำตอบของคำถามก่อนหน้าเช่นกัน: " ทำไมไฟล์ควรลงท้ายด้วยการขึ้นบรรทัดใหม่ "


ฉันยังเจอการตั้งค่า eol ... แต่มันก็ไม่สำเร็จ มีตัวแปรมากกว่าหนึ่งตัวที่พิจารณาว่ามีอยู่แล้วที่ส่วนท้ายของไฟล์หรือไม่ นอกจากนี้ยังไม่มีผลกับไฟล์ข้อความ แต่มีเฉพาะในไฟล์ไบนารี
Boushley

3
ความช่วยเหลือเป็นกลุ่มยังกล่าวว่า "เมื่อ 'ไบนารี' ถูกปิดค่าจะไม่ถูกใช้เมื่อทำการเขียนไฟล์" เกี่ยวกับ
eol

1
+1 สำหรับคำตอบของ VonC สำหรับคำถามนั้นซึ่งเน้นว่า "newline" และ EOL กำลังทำแฟทต์ บรรณาธิการที่ต่ำกว่าแสดงบรรทัดใหม่ที่ไม่ถูกต้องเนื่องจาก EOL, vim ไม่ได้เพิ่ม "newline"!
ches

9

ฉันได้เพิ่มเคล็ดลับใน Vim wiki สำหรับปัญหาที่คล้ายกัน (แต่แตกต่างกัน):

http://vim.wikia.com/wiki/Do_not_auto-add_a_newline_at_EOF


5
“ กลุ่ม 7.4.785 เพิ่มfixeolตัวเลือกที่สามารถปิดการใช้งานเพื่อรักษา EOL ที่หายไปโดยอัตโนมัติเมื่อสิ้นสุดไฟล์ สคริปต์นี้ไม่จำเป็นสำหรับ Vim 7.4.785 และใหม่กว่า” (ที่มา: หน้า wiki เดียวกัน) ขอบคุณฉันไม่ทราบตัวเลือกใหม่นั้น
อาเมียร์

1
ฉันต้องตั้งค่าทั้งสองnoeolและnofixeolเพื่อให้ได้ผลลัพธ์ที่ต้องการ
selurvedu

8

ตกลงคุณกำลังอยู่บน Windows ทำให้สิ่งต่าง ๆ ซับซ้อน;)

ในฐานะที่เป็นตัวเลือก 'ไบนารี' จะรีเซ็ตตัวเลือก 'fileformat' (และการเขียนด้วยชุด 'ไบนารี' มักจะเขียนด้วยปลายสายยูนิกซ์) เอาค้อนขนาดใหญ่ออกมาจากภายนอก!

วิธีการเกี่ยวกับการกำหนด autocommand (: help autocommand) สำหรับเหตุการณ์ BufWritePost คำสั่งอัตโนมัตินี้จะดำเนินการหลังจากทุกครั้งที่คุณเขียนบัฟเฟอร์ทั้งหมด ในการเรียกใช้งานอัตโนมัตินี้จะเรียกเครื่องมือภายนอกขนาดเล็ก (php, perl หรือสคริปต์อื่น ๆ ) ที่ตัดบรรทัดใหม่สุดท้ายของไฟล์ที่เพิ่งเขียน

ดังนั้นสิ่งนี้จะมีลักษณะเช่นนี้และจะเข้าไปในไฟล์. vimrc ของคุณ:

autocmd!   "Remove all autocmds (for current group), see below"
autocmd BufWritePost *.php !your-script <afile>

อย่าลืมอ่านเอกสารที่เป็นกลุ่มทั้งหมดเกี่ยวกับการส่งข้อความอัตโนมัติหากนี่เป็นครั้งแรกที่คุณจัดการกับการส่งข้อความอัตโนมัติ มีข้อควรระวังบางประการเช่นแนะนำให้ลบ autocmds ทั้งหมดใน. vimrc ของคุณในกรณีที่. vimrc ของคุณอาจได้รับที่มาหลายครั้ง


ดี ... ฉันหวังว่าจะมีทางออกที่ดีกว่านี้ ... แต่มันใช้งานได้จริง!
Boushley

3
มันใช้งานได้ดี! เย้! อย่างไรก็ตามฉันมีคำถามหนึ่งข้อ ... มีวิธีทำไหมดังนั้นฉันจึงไม่ต้องกด Enter สองครั้งหลังจากบันทึกแต่ละครั้ง ฉันต้องกด Enter ในหน้าต่าง cmd ที่ผุดขึ้นมาแล้วอีกครั้งเพราะกลุ่มบอกฉันว่าสคริปต์กลับมาเรียบร้อยแล้ว ... มีวิธีไหนที่จะทำให้พวกเขาหายไปหมด?
Boushley

2
เพื่อหลีกเลี่ยงการ <กด Enter> silentแจ้งเพียงแค่คำนำหน้าคำสั่งด้วย silent !your-script <afile>เช่น
dash-tom-bang

6

ฉันได้นำคำแนะนำของ Blixtor ไปใช้กับการประมวลผล Perl และ Python ไม่ว่าจะเป็นการทำงานภายใน Vim (หากมีการรวบรวมด้วยการสนับสนุนภาษาดังกล่าว) หรือผ่านสคริปต์ Perl ภายนอก มันมีให้ในรูปแบบปลั๊กอิน PreserveNoEOLบน vim.org


ฉันไม่ได้ทดสอบอย่างละเอียด แต่ดูเหมือนว่าจะเป็นวิธีที่ดีกว่า
Boushley

ปลั๊กอินใช้งานได้ แต่หลังจากการติดตั้งฉันต้องใส่let g:PreserveNoEOL = 1ลงใน.vimrcไฟล์ของฉัน! ต้องเรียนรู้ vimscript เพื่อคิดออกจากคำอธิบายปลั๊กอิน! : D
DarthVanger

1
@DarthVanger: :help PreserveNoEOL-usageจะได้บอกคุณเช่นกัน RTFM :-)
Ingo Karkat

@IngoKarkat โอ้ขอโทษ กำลังมองหาอยู่ภายใต้การนี้และINSTALLATION CONFIGURATIONไม่ได้แจ้งให้ทราบล่วงหน้าUSAGEส่วนในรายละเอียดเพราะมันอยู่เหนือการติดตั้ง :)
DarthVanger

3

บางทีคุณอาจจะดูว่าทำไมพวกเขาถึงบ่น หากไฟล์ php มีการขึ้นบรรทัดใหม่หลังจากสิ้นสุดหรือไม่>, php จะส่งออกเป็นส่วนหนึ่งของหน้า นี่ไม่ใช่ปัญหาหากคุณพยายามส่งส่วนหัวหลังจากรวมไฟล์

อย่างไรก็ตาม,?> ที่ท้ายไฟล์ php เป็นทางเลือก ไม่สิ้นสุด?> ไม่มีปัญหากับการขึ้นบรรทัดใหม่ที่ท้ายไฟล์


2
คุณถูกต้อง แต่เราในฐานะร้านค้าตัดสินใจว่าจะดีกว่าที่จะมีตอนจบหรือไม่> ฉันรู้ว่าเราสามารถหยุดใช้มันได้ ... แต่ฉันต้องการปรับตัวแก้ไขให้เหมาะกับรูปแบบการเขียนของฉัน
Boushley

1
นอกจากนี้เพื่อให้คุณรู้ php จะแยกแท็กสิ้นสุดของคุณโดยอัตโนมัติเป็น?> หรือเป็น>> \ n (เพราะใน linux ไฟล์ที่ถูกต้องทั้งหมดควรลงท้ายด้วย \ n) ... ดังนั้นรหัสของฉันไม่ทำให้เกิดปัญหาเหล่านี้ ... พวกเขาไม่ชอบหน้าตา
Boushley


2

ฉันคิดว่าฉันพบทางออกที่ดีกว่าคำตอบที่ยอมรับแล้ว โซลูชันทางเลือกไม่ทำงานสำหรับฉันและฉันไม่ต้องการทำงานในโหมดไบนารีตลอดเวลา โชคดีที่นี้ดูเหมือนว่าจะได้งานทำและฉันยังไม่พบผลข้างเคียงที่น่ารังเกียจใด ๆ : รักษาที่ขาดหายไปในตอนท้ายของบรรทัดในตอนท้ายของไฟล์ข้อความ ฉันเพิ่งเพิ่มเนื้อหาทั้งหมดลงใน ~ / .vimrc ของฉัน


1

เป็นไปได้ไหมที่คุณจะใช้คำสั่งพิเศษเพื่อบันทึกไฟล์เหล่านี้?

หากคุณ: ตั้งค่า binary,: w และ: ตั้งค่าแบบ honinary ไฟล์จะถูกเขียนโดยไม่ต้องขึ้นบรรทัดใหม่หากไม่มีใครขึ้นต้นด้วย

ลำดับของคำสั่งนี้สามารถใส่ลงในคำสั่งที่ผู้ใช้กำหนดหรือการแมปแน่นอน


น่าเสียดายเพราะฉันทำงานกับ windows ถ้าฉันบันทึกในโหมดไบนารีมันบังคับให้บันทึกเป็นในโหมด unix แม้เมื่อฉัน: set binary: set fileformat = dos: w: set nobinary เมื่อฉันออกแล้วมันบันทึกไฟล์ในรูปแบบ unix ... ฉันไม่อยากจะเชื่อเลยว่าจะไม่มีวิธีใดที่จะปิดการทำงานนี้
Boushley

1

เริ่มต้นด้วยvimv7.4 คุณสามารถใช้

:set nofixendofline

มีข้อมูลบางอย่างเกี่ยวกับการเปลี่ยนแปลงที่อยู่ที่นี่: http://ftp.vim.org/vim/patches/7.4/7.4.785


0

ฉันพบว่าปลั๊กอิน vimscript นี้มีประโยชน์สำหรับสถานการณ์นี้

Plugin 'vim-scripts/PreserveNoEOL'

หรืออ่านเพิ่มเติมได้ที่GitHub

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