ลากเส้นอัตโนมัติเมื่อเขียน markdown ใน VIM


11

บ่อยครั้งที่ฉันเขียน markdown ใน VIM และจะมีย่อหน้าใน markdown เหล่านั้น เพื่อช่วยในการแก้ไขของฉันฉันตั้งค่า Vim ของฉันเพื่อตัดบรรทัดบน 80 ตัวอักษร มันใช้งานได้ดีถ้าฉันพิมพ์ต่อไป แต่ปัญหาคือถ้าฉันต้องแก้ไขบางอย่างมันน่ารำคาญมาก

ตัวอย่าง (นำมาจากตรรกะคำสั่งแรกของวิกิพีเดีย):

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments. In first-order 
theories, predicates are often associated with sets. In interpreted higher-order 
theories, predicates may be interpreted as sets of sets.

จนถึงตอนนี้ดีมาก แต่เมื่อฉันแก้ไขบทความฉันอาจตัดสินใจที่จะเพิ่มบางอย่างตรงกลางพูด:

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments,
or in which one or both of predicate quantifiers or function quantifiers are permitted.
In first-order theories, predicates are often associated with sets. In interpreted higher-order
theories, predicates may be interpreted as sets of sets.

แจ้งให้ทราบล่วงหน้าบรรทัดที่ 3 เป็นสิ่งที่ฉันต้องการที่จะห่อ ถ้าฉันทำใน VIM ฉันจะต้องเข้าร่วมบรรทัดด้วยตนเองและพิมพ์ใหม่ทั้งย่อหน้า

ใครมีความคิดวิธีทำให้ VIM ทำโดยอัตโนมัติ

คำตอบ:


7

ง่ายยิ่งขึ้น: aแฟล็กสำหรับ'formatoptions'เปิดใช้งานการจัดรูปแบบย่อหน้าอัตโนมัติเมื่อใดก็ตามที่แทรกหรือลบข้อความ ดู:help fo-tableรายละเอียดเกี่ยวกับธงและ'formatoptions':help autoformat

:set formatoptions+=a

gqและgwจะจัดรูปแบบบรรทัดที่การเคลื่อนไหวต่อไปนี้เคลื่อนที่

Formatting is done with one of three methods:
                1. If 'formatexpr' is not empty the expression is
                   evaluated.  This can differ for each buffer.
                2. If 'formatprg' is not empty an external program
                   is used.
                3. Otherwise formatting is done internally.

                In the third case the 'textwidth' option controls the
                length of each formatted line

ความแตกต่างระหว่างทั้งสองคือgqจะทิ้งเคอร์เซอร์ไว้บนบรรทัดแรกที่ไม่ว่างเปล่าของบรรทัดที่จัดรูปแบบล่าสุด gwจะวางเคอร์เซอร์กลับตำแหน่งที่เริ่ม

คุณสามารถได้อย่างง่ายดายด้วยตนเอง rewrap ไปวรรคเคอร์เซอร์ของคุณอยู่ในขณะนี้ด้วยgwapหรือเอกสารทั้งหมดที่มีแต่ที่จะย้ายขอบคุณเคอร์เซอร์ไปยังชั้นนำgggwGgg

ด้วยการเติมข้อความอัตโนมัติคุณสามารถจัดรูปแบบได้โดยอัตโนมัติ นี่คือตัวอย่างที่จัดรูปแบบย่อหน้าปัจจุบันเมื่อออกจากโหมดแทรก:

augroup myformatting
    autocmd!
    autocmd InsertLeave * normal gwap<CR>
augroup END

มีข้อความเรียกอัตโนมัติอื่น ๆ ที่คุณอาจทำงานได้ดีขึ้นสำหรับคุณ :help autocmd-eventsคุณสามารถสำรวจตัวเลือกที่อยู่ภายใต้ สิ่งที่เกี่ยวข้องที่สุดอาจอยู่ภายใต้หัวข้อย่อย "หลากหลาย"


หนึ่งคำ: ยอดเยี่ยม!
Jason Hu

1

:help 'textwidth'ฉันจะมีลักษณะที่ มันจะแบ่งบรรทัดโดยอัตโนมัติเมื่อคุณพิมพ์ อย่างไรก็ตามวิธีนี้ใช้ไม่ได้หากคุณกำลังแก้ไขจุดกึ่งกลางบรรทัด

โดยส่วนตัวฉันชอบออกtextwidthไปดังนั้นฉันจึงสร้างฟังก์ชั่นที่จะเข้าร่วมอัตโนมัติและแบ่งย่อหน้า (โดยทั่วไปจัดรูปแบบอัตโนมัติเป็น 80 อักขระ) ดูเหมือนว่า:

function! ParagraphToEightyChars()
   while (len(getline(".")) > 80)
      normal! 0
      " Find the first white-space character before the 81st character.
      call search('\(\%81v.*\)\@<!\s\(.*\s.\{-}\%81v\)\@!', 'c', line('.'))
      " Replace it with a new line.
      exe "normal! r\<CR>"
      " If the next line has words, join it to avoid weird paragraph breaks.
      if (getline(line('.')+1) =~ '\w')
         normal! J
      endif
   endwhile
   " Trim any accidental trailing whitespace
   :s/\s\+$//e
endfunction

ฉันมีแผนที่เพื่อโทรหาเมื่อใดก็ตามที่ฉันต้องการ:

nnoremap <silent><A-J> :call ParagraphToEightyChars()<CR>

ฟังก์ชั่นนี้ใช้งานได้ดีกับformatoptions+=jrการจัดรูปแบบความคิดเห็นในโค้ดด้วย! เพียงวางเคอร์เซอร์ของคุณบนบรรทัดแรกที่ยาวเกิน 80 ตัวอักษรและเรียกใช้ฟังก์ชัน

(หมายเหตุ: ฉันไม่ได้ทำฟังก์ชั่นนี้โดยทั่วไปเพื่อทำความยาวนอกเหนือจาก 80 แต่ฉันคิดว่าคุณจะต้องเปลี่ยน 80 และ 81 หากคุณต้องการทำอย่างอื่น)

ดู:help 'textwidth'และ:help 'formatoptions'สำหรับข้อมูลเพิ่มเติม


ขอบคุณสำหรับการแบ่งปันของคุณ ขณะที่ฉันตรวจสอบการตั้งค่าของคุณมันไม่ได้จัดรูปแบบโดยอัตโนมัติในขณะที่ฉันพิมพ์ใช่ไหม ถ้าเป็นเช่นนั้นก็ยังคงเป็นวิธีการแก้ปัญหาไม่ได้ผลใช่ไหม?
Jason Hu

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

1

เพื่อความสมบูรณ์ฉันต้องการพูดถึงตัวเลือกปลั๊กอิน

ถ้าคุณใช้บางอย่างเช่นALEซึ่งรองรับการเรียกใช้บัฟเฟอร์ของคุณผ่าน beautifier เมื่อบันทึกคุณสามารถปล่อยให้Prettierจัดการ rewrapping รหัสของคุณได้

ฉันทำได้โดยใส่สิ่งนี้ใน~/.vim/ftplugin/markdown.vim:

let b:ale_fixers = ['prettier', 'remove_trailing_lines', 'trim_whitespace']
let b:ale_javascript_prettier_options = '--prose-wrap always'

... และนำไปใส่ใน~/.vimrc:

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