ฉันสามารถปรับข้อความเป็นกลุ่มได้หรือไม่


38

เหตุผลเดียวที่ฉันเคยแก้ไขไฟล์ข้อความใน Pico ^Jหรือนาโนและไม่อยู่ในกลุ่มที่เป็นคำสั่ง มันจะฟอร์แมตข้อความหนึ่งย่อหน้าโดยสร้างตัวแบ่งบรรทัดที่ตัวแบ่งคำเพื่อให้ข้อความลอยบนหน้าจอความกว้างคงที่ - จัดรูปแบบข้อความให้พอดีกับ 80 คอลัมน์ที่กำหนดไว้ล่วงหน้าสร้างการแบ่งบรรทัดระหว่างคำเท่านั้น ฟังก์ชั่นที่ จำกัด นั้นมีประโยชน์มากไม่ว่าจะจัดรูปแบบบล็อกความคิดเห็นที่มีความยาวไฟล์เอกสารหรือเพียงแค่แทนที่พารามิเตอร์บรรทัดที่ไม่มีที่สิ้นสุดด้วยสิ่งที่อ่านง่ายขึ้น

ฉันสามารถทำสิ่งนี้ใน Vim ได้ไหม?

คำตอบ:


37

คุณสามารถใช้ตัวดำเนินการgqหรือgwรวมกับคำสั่งการเคลื่อนไหว โดยค่าเริ่มต้นจะใช้fmtโปรแกรม (ใน Linux) เพื่อจัดรูปแบบข้อความที่กำหนด อย่างไรก็ตามเพื่อความรู้ที่ดีที่สุดของฉันมันไม่ได้ปรับบรรทัดดังนั้นคุณจะได้รับขอบขวาขาด

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

มีการกำหนดค่ามากมายที่สามารถทำได้ จะเริ่มต้นด้วยนี่คือบางส่วนช่วยเหลือที่เกี่ยวข้อง: :h gq, :h gw, :h fo(ตัวเลือกรูปแบบ) :h fp(โปรแกรมรูปแบบ) :h fo-table(คำอธิบายของตัวเลือกที่เป็นไปได้)


1
gq / gw เป็นวิธีที่จะไปแน่นอน เพื่อเพิ่มไปยังข้อความนี้คุณสามารถเปลี่ยนรูปแบบโปรแกรมให้เท่ากันเพื่อมีตัวเลือกเพิ่มเติม ชำระเงินvimcasts.org/episodes/formatting-text-with-par
Bambu

3
ตามค่าเริ่มต้น Vim จะไม่ใช้โปรแกรมภายนอกใด ๆ ถึงแม้ว่าคุณสามารถเลือกใช้งานได้โดยการตั้งค่า'formatprg'ตัวเลือก
jamessan

15

มี VimCast ที่ยอดเยี่ยมในหัวข้อนี้

http://vimcasts.org/episodes/formatting-text-with-par/

โดยทั่วไปคุณจะต้องติดตั้งpar:

$ brew install par
# or
$ sudo apt-get install par

จากนั้นเนื่องจากคุณต้องการให้มีการห่อคอลัมน์ใน 80 คอลัมน์:

:set formatprg=par\ -w80

ตอนนี้คุณสามารถใช้gqโอเปอเรเตอร์เช่นเดียวกับคำตอบอื่น ๆ (เช่นgqip) และมันจะใช้ Par แทน formatter ในตัวของ Vim

Par ค่อนข้างสูงและจะจัดรูปแบบความคิดเห็นเช่นนี้:

/* This is a long */
/* multiline comment */

11

จาก:help usr_25:

JUSTIFYING TEXT                                                                 

Vim has no built-in way of justifying text.  However, there is a neat macro     
package that does the job.  To use this package, execute the following          
command:                                                                        

        :runtime macros/justify.vim                                             

This Vim script file defines a new visual command "_j".  To justify a block of  
text, highlight the text in Visual mode and then execute "_j".

ดังนั้นสิ่งที่คุณต้องทำคือเรียกใช้

:ru macros/justify.vim

จากนั้นพิมพ์

_j

เพื่อปรับข้อความในไฟล์ทั้งหมด

(แน่นอนคุณสามารถเพิ่มru macros/justify.vimใน. vimrc ของคุณเพื่อให้คุณไม่ต้องพิมพ์ทุกครั้ง)

หมายเหตุ : สิ่งนี้จะไม่เพิ่มตัวแบ่งบรรทัดสำหรับคุณ gqคุณจะต้องเพิ่มเหล่านั้นด้วยตนเองด้วย สำหรับสิ่งนี้คุณต้องตั้งค่าtextwidth(ค่าเริ่มต้นคือ 0) เป็นค่าที่คุณต้องการผ่าน

set textwidth=80

และ - หากคุณต้องการ - การตัดข้อความอัตโนมัติโดยการตั้งค่าt-flag ผ่าน

set formatoptions+=t

หากคุณต้องการคุณสามารถตั้งค่าการจับคู่ใน. vimrc ของคุณเพื่อทำสิ่งต่าง ๆ ให้คุณ:

nnoremap <C-j> gggqG_j

สิ่งนี้จะย้ายไปที่จุดเริ่มต้นของไฟล์ ( gg) ตัดบรรทัดทั้งหมด ( gqจนกระทั่งG) และ_jทำให้ข้อความเป็นตัวพิมพ์ใหญ่


หากต้องการดูการจัดรูปแบบที่ใกล้ชิดโปรดดู: คู่มือผู้ใช้ VIM - การแก้ไขข้อความที่จัดรูปแบบ
Suuuehgi

ฉันเพิ่งพบ:set fo+=aตัวเลือกที่มีประโยชน์มากสำหรับการฟอร์แมตย่อหน้าใหม่โดยอัตโนมัติ ดู:help fo-tableตัวเลือกอื่น ๆ นอกจากนี้ยังมีวิดีโอสอนดีที่นี่
Suuuehgi

+1 สำหรับโซลูชันในตัวที่สมบูรณ์ การ_jแมปที่เพิ่มโดยมาโครดูเหมือนจะปรับไฟล์ทั้งหมดให้ฉันหรืออาจถูก จำกัด ด้วยการเลือกภาพ linewise
ches

5

ในขณะที่ความช่วยเหลือของนาโนเรียก^Jคำสั่ง "ปรับ" จริง ๆ แล้วมันไม่ปรับข้อความ แต่ฟอร์แมตข้อความที่ทำลายเส้นก่อนระยะขอบด้านขวาของหน้าจอ (หรือในคอลัมน์ที่กำหนดค่าได้บางอย่างฉันเดา)

คุณสามารถทำสิ่งเดียวกันใน VIM โดยการตั้งค่าตัวแปรtextwidthจาก:help 'textwidth':

ความกว้างสูงสุดของข้อความที่ถูกแทรก เส้นที่ยาวจะแตกหลังจากช่องว่างเพื่อให้ได้ความกว้างนี้ ค่าศูนย์ปิดใช้งานสิ่งนี้

กล่าวคือในขณะที่คุณกำลังพิมพ์ถ้าเส้นมีความยาวมากกว่าtextwidthตัวอักษร VIM textwidthจะตัดสายในพื้นที่แรกที่จะให้ความยาวสายน้อยกว่าหรือเท่ากับ

สำหรับการทำงานตัวเลือกที่จะต้องมีตัวอักษรformatoptions tดู:help 'formatoptions'และ:help fo-tableสำหรับตัวเลือกที่มีตัวอย่างเช่นคุณอาจสนใจcตัวเลือกในการจัดรูปแบบการทำงานกับความคิดเห็น

แก้ไข : คุณสามารถดำเนินการเดียวกันโดยไม่จำเป็นที่จะใส่tในformatoptionsการใช้คำสั่งมันรูปแบบข้อความระหว่างตำแหน่งเคอร์เซอร์ปัจจุบันและตำแหน่งของเคอร์เซอร์หลังจากที่gw{motion} คำสั่งยังสามารถใช้ได้ในโหมดภาพก็จัดรูปแบบข้อความที่เลือก{motion}gw


1
มันดีสำหรับการพิมพ์ ฉันสามารถใช้สิ่งนั้นกับข้อความที่มีอยู่แล้วได้หรือไม่?
เอสเอฟ

3

ที่นี่มีสองตัวเลือกง่าย ๆ :

  1. ด้วยกลุ่มข้อความที่เลือกพิมพ์ !fmt
  2. ด้วยเคอร์เซอร์ของคุณที่จุดเริ่มต้นของบล็อกพิมพ์ !}fmt

ทั้งสองอย่างนี้ส่งบล็อกข้อความไปยังยูนิกซ์fmtดูman fmtตัวเลือก คุณสามารถส่งผ่านอาร์กิวเมนต์ตัวเลือกจากกลุ่ม ยกตัวอย่างเช่นการจัดรูปแบบบล็อก 50 !}fmt -w 50ตัวอักษรกว้างชนิด


ขอโทษด้วยตอนนี้คงแล้ว
kaan

คุณสามารถจัดรูปแบบไฟล์ทั้งหมดของคุณโดยพิมพ์:%!fmtและเลิกทำด้วยไฟล์เดียวuหากคุณไม่ชอบผลลัพธ์
Wildcard

-1

ทำเครื่องหมายข้อความโดยใช้คำสั่ง visual แล้วใช้:

:!par 40j 

โดยที่ 40 คือความกว้างของคอลัมน์และjหมายถึงปรับให้เหมาะสม


2
ยินดีต้อนรับสู่เว็บไซต์ของเรา! คำถามของคุณมีคุณภาพต่ำในขณะนี้เนื่องจากไม่มีคำอธิบายเกี่ยวกับเครื่องมือที่คุณใช้ ( par) และสาเหตุที่โซลูชันของคุณใช้งานได้ คุณอาจต้องการเพิ่มรายละเอียดเพิ่มเติมเพื่อปรับปรุงคุณภาพของคำตอบและทำให้มีประโยชน์มากขึ้นสำหรับผู้อ่านในอนาคต
statox
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.