หมายเลขบรรทัดเฉพาะการตั้งค่าข้อความความกว้าง


9

ฉันใช้ gvim เพื่อเขียนอีเมลและใช้tw=72เพื่อแบ่งบรรทัดยาว ๆ ตอนนี้ฉันยังแก้ไขส่วนหัวจดหมายพื้นฐานในเอกสารเดียวกันเช่นฉันกำลังเพิ่มผู้รับในจดหมายของฉัน ตอนนี้tw=72มันยังแบ่งทุกครั้งหลังจาก 72 ตัวอักษร

ฉันจะตั้งค่าtw=0ใน 4 บรรทัดแรก (นั่นคือส่วนหัว) และtw=72ส่วนที่เหลือของเอกสารได้อย่างไร

ตัวเลือกการจัดรูปแบบของฉันมีลักษณะเช่นนี้หากเกี่ยวข้อง:

set fo+=tcqn

textwidthถูกนำไปใช้กับบัฟเฟอร์ทั้งหมด
romainl

3
ยังเห็น: การป้องกันไม่ให้เป็นกลุ่มจากการทำลายการเชื่อมโยงกลางแท็กใน markdown คุณสามารถใช้วิธีการแก้ปัญหาที่คล้ายกันสำหรับอีเมลทั้งโดยตรวจสอบว่าline('.') < 5หรือโดยตรวจสอบว่าสายเริ่มต้นด้วยส่วนหัวของอีเมล (เช่นFrom: , To: ฯลฯ )
Martin Tournoij

@Carpetsmoker ขอบคุณมากนี่เป็นกุญแจสู่การแก้ปัญหา ฉันเพิ่มคำตอบแบบเต็มพร้อมกับการดัดแปลงที่จำเป็น
mxmehl

คำตอบ:


6

ขอบคุณที่ความคิดเห็นของ @ Carpetsmoker ในคำถามของฉันฉันสามารถแก้ปัญหานี้ได้อย่างที่ฉันต้องการ

ด้วยฟังก์ชั่นต่อไปนี้ใน. vimrc (หรือในกรณีของฉันในไฟล์พิเศษที่โหลดเมื่อแก้ไขอีเมลของฉันเท่านั้น), tw ถูกตั้งค่าเป็น 500 หากหมายเลขบรรทัดมีขนาดเล็กกว่า 5 มิฉะนั้นจะเป็น 72 ด้วยau CursorMovedIการตรวจสอบทุกครั้ง เคอร์เซอร์ย้าย

" Set tw to 500 if in the first 4 lines, else 500
au CursorMovedI * call ModifyTextWidth()   " execute when cursor has moved, use for all files
function! ModifyTextWidth()
    if line('.') < 5               " if line number smaller than 5
        setlocal textwidth=500     " use high tw setting
    else
        setlocal textwidth=72      " Otherwise use normal textwidth
    endif
endfunction

หากมีคนวางแผนที่จะใช้สิ่งนี้ให้พิจารณาแทนที่ wildcard au CursorMovedI *ด้วยเส้นทางที่คงที่หรือส่วนต่อท้ายของไฟล์


4

ทางเลือกที่มีประสิทธิภาพมากขึ้นที่จะตอบ mxmehl ของ

ถ้าคุณใช้filetype=mailเป็นกลุ่มจะเน้นส่วนหัวสำหรับคุณ:

ป้อนคำอธิบายรูปภาพที่นี่

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

ชื่อไวยากรณ์ของส่วนหัวที่มีmailHeaderKey, mailSubject, และmailHeaderEmail ฉันพบนี้โดยดูที่mailHeader/usr/share/vim/vim74/syntax/mail.vim

เหตุผลที่ฉันชอบโซลูชันนี้ก็คือมันไม่ได้ขึ้นอยู่กับหมายเลขบรรทัดโดยพลการ

augroup filetypes
    autocmd!

    autocmd FileType mail call s:mail()
augroup end

" Set up ft=mail
fun! s:mail()
    augroup ft_mail
        autocmd!
        autocmd CursorMoved,CursorMovedI *
            \  if index(["mailHeaderKey", "mailSubject", "mailHeaderEmail", "mailHeader"], synIDattr(synID(line('.'), col('.'), 1), 'name')) >= 0
            \|     setlocal textwidth=500
            \| else
            \|     setlocal textwidth=72
            \| endif
    augroup end
endfun

2

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

จากนั้นคุณสามารถใช้ต่อไปนี้:

augroup headerTw
   au!
   autocmd InsertEnter <buffer>
            \ if line('.') < 5 |
            \    setl tw=0 |
            \ endif
   autocmd InsertLeave <buffer>
            \ if line('.') < 5 |
            \    setl tw=72 |
            \ endif
augroup END

หากคุณต้องการใช้โดยไม่ต้องมีปลั๊กอินชนิดไฟล์คุณจะต้องแทนที่<buffer>ด้วยรูปแบบไฟล์

ความคิดคือการเปลี่ยน'textwidth'เมื่อคุณเข้าสู่โหมดแทรกและเรียกคืนเมื่อคุณออกจากมัน

หากคุณมักจะนำทางในข้อความในขณะที่อยู่ในโหมดแทรก (เช่น: ใช้ปุ่มลูกศร) คุณสามารถปรับปรุงได้ตามลิงก์ที่กล่าวถึงโดย @Carpetsmoke: ป้องกัน Vim ไม่ให้แตกลิงค์กลางแท็กใน markdown


0

ฉันไม่เชื่อว่าเป็นไปได้ อย่างไรก็ตามมีวิธีแก้ไขปัญหาสองสามอย่าง

  1. คุณสามารถเขียนส่วนหัวของคุณและจากนั้น :set tw=72เนื่องจากtwไม่ได้ใช้ย้อนหลังกับข้อความในบัฟเฟอร์ของคุณอยู่แล้ว

  2. คุณสามารถพิมพ์สิ่งทั้งหมดที่มี:set tw=0และจากนั้นเมื่อคุณทำเสร็จแล้วให้ย้ายไปเข้าแถวที่ 4 และ:set tw=72 gqGหรือหากคุณไม่รู้สึกอยากทำเองคุณสามารถถ่ายภาพมาโครหรือแมป ตัวอย่างเช่นทั้งสองอย่างนี้จะได้ผล:

    let @r=":set tw=72<cr>4GgqG:set tw=0<cr>"
    nnoremap <silent> <leader>r :set tw=72<cr>4GgqG:set tw=0<cr>
    

    ("r" สำหรับ "ฟอร์แมต")

    คุณสามารถตั้งค่าให้สิ่งนี้เกิดขึ้นโดยอัตโนมัติเมื่อคุณปิด vim โดยสมมติว่าคุณต้องการให้ฟอร์แมตใหม่เมื่อคุณปิด vim และมีไฟล์ประเภทที่คุณใช้สำหรับอีเมลเท่านั้น ตัวอย่างเช่นหากอีเมลทั้งหมดของคุณมี.emailส่วนขยายคุณสามารถทำได้:

    autocommand VimLeavePre *.email set tw=72 | exe "normal! 4GgqG" | w
    

    แน่นอนคุณต้องเปลี่ยน*.emailเป็นนามสกุลไฟล์ที่คุณใช้งานจริง หากคุณใช้สิ่งที่ชอบ.txtฉันจะไม่แนะนำเพราะมันจะยุ่งกับทุก .txtไฟล์ที่คุณมี

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