Soft wrap ที่ 80 ตัวอักษรใน Vim ในหน้าต่างที่มีความกว้างโดยพลการ


127

ฉันต้องการใช้ความสามารถในการห่อแบบนุ่มของ Vim ( :set wrap) เพื่อตัดโค้ดบางส่วนที่ 80 อักขระโดยไม่คำนึงถึงความกว้างของหน้าต่างจริงของฉัน

ฉันยังหาวิธีทำไม่ได้เลย - การห่อแบบอ่อนทั้งหมดดูเหมือนจะผูกติดกับความกว้างของหน้าต่าง

  • textwidthและwrapmarginทั้งคู่สำหรับการตัดแบบยาก (พวกเขาแทรกอักขระขึ้นบรรทัดใหม่ลงในไฟล์)
  • แนวตั้งแบ่งออกเป็นหลายหน้าต่างและใช้:vertical resize 80(อาจเป็น:set breakat=ไปได้เพื่อให้มีการแบ่งอักขระใด ๆ ) ในงานประเภทใดประเภทหนึ่ง (แม้ว่าจะแฮ็กนิดหน่อย) แต่จะแตกเมื่อใช้:set numberเนื่องจากหมายเลขบรรทัดจะใช้จำนวนคอลัมน์ที่แปรผัน (ขึ้นอยู่กับ ตามความยาวไฟล์) และเป็นส่วนหนึ่งของ 80

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

ตอนนี้การประมาณของฉันเป็นเพียงเพื่อให้/^.\{80}\zs.\+เป็นการค้นหาเริ่มต้นดังนั้นอย่างน้อยก็ไฮไลต์ ฉันคิดเกี่ยวกับการเพิ่ม:syntaxรายการสำหรับมัน แต่มันก็พังเมื่อมันทับซ้อนกับรายการไวยากรณ์อื่น ๆ ฉันจึงทิ้งความคิดนั้นไป


จริงๆแล้วคุณตั้งค่าการค้นหาเริ่มต้นอย่างไร
thethinman

คำตอบ:


37

คุณทำได้

  • กำหนดความกว้างขั้นต่ำขนาดใหญ่สำหรับคอลัมน์หมายเลขบรรทัดผ่าน:set numberwidth=6และ
  • จากนั้นคุณสามารถปรับขนาดหน้าต่างของคุณด้วย:set columns=86(หรือด้วยเมาส์) ให้มีขนาดที่เหมาะสม

หากคุณแก้ไขไฟล์ที่มีเป็นล้านบรรทัดคุณอาจประสบปัญหา แต่ก็ไม่น่าเป็นไปได้ คุณกำลังเสียพื้นที่หน้าจอ 6 คอลัมน์ด้วยวิธีนี้เช่นกัน ดังนั้นยังคงมีปัญหาทุกประเภท

คุณสามารถเน้นที่ผ่านมาคอลัมน์ที่ 80 โดยใช้:matchเช่นมันบอกว่าที่นี่และที่นี่

นอกเหนือจากนั้นฉันไม่เห็นวิธีใดที่จะทำสิ่งนี้ได้ ดูเหมือนว่ามันจะเป็นคุณสมบัติที่ดี


น่าเสียดายที่ vim ไม่ได้รักษาการตั้งค่าคอลัมน์ไว้หากมีการปรับขนาดหน้าต่าง สิ่งนี้นำไปสู่สถานการณ์ที่โชคร้ายกับตัวจัดการหน้าต่างที่ปูกระเบื้องซึ่งไม่มีวิธีใดที่ดีในการห่อหุ้มด้วยเสา 80 คอลัมน์หากหน้าต่างกว้างเกินไป
ความโน้มถ่วง

ใช้งานได้ แต่ไม่เหนียวเหนอะหนะ ฉันเดาว่าขั้นตอนต่อไปคือการตั้งค่า autocmd เพื่อให้คอลัมน์มีขนาดที่ต้องการใหม่สำหรับประเภทไฟล์ที่คุณต้องการ
xer0x

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

20

ลองสิ่งนี้:

set columns=80
autocmd VimResized * if (&columns > 80) | set columns=80 | endif
set wrap
set linebreak
set showbreak=+++

คุณสามารถลบif (&columns > 80) |ถ้าคุณเสมอต้องการ 80 คอลัมน์


บนเทอร์มินัล iTerm ของฉันทำให้หน้าต่างเล็กลง ฉันไม่แน่ใจว่าเป็นปัญหากับสภาพแวดล้อมของฉันหรือไม่ (ฉันเห็นว่าคุณกำลังทำอะไรบางอย่างด้วยการปรับขนาดอัตโนมัติ) แต่อย่างอื่นก็ไม่เป็นที่ต้องการ ขอบคุณสำหรับข้อเสนอแนะ
Sridhar Sarnobat

autocmd ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน (โดยใช้ guake terminal)
mzcarlos

ใช้งานได้อย่างมีเสน่ห์ด้วย Tmux + NeoVim ใน Alacritty
meh

16

ฉันไม่มีวิธีแก้ปัญหาสำหรับ soft wrap แต่สำหรับการทำเครื่องหมายคอลัมน์เนื่องจาก Vim 7.3 (เผยแพร่เมื่อ 2010-08-15) :set colorcolumn=80จะเน้นคอลัมน์ 80 สีจะขึ้นอยู่กับไฟล์ไวยากรณ์ของคุณ

ดูกลุ่มกังวลรูปแบบ 80 คอลัมน์:h colorcolumn ,


เครื่องหมายคำพูดไม่ใช่ URL ที่ถูกต้องดังนั้นจึงสมเหตุสมผล ชื่อ Anchor ไม่ควรมีอักขระ URL ที่ไม่ถูกต้องดังนั้นจึงไม่ควรแก้ไขข้อผิดพลาดของนักพัฒนาไซต์รายอื่น
Shadow Wizard is Ear For You

1
Shadow Wizard อ้างถึงการแก้ไขคำตอบของฉันก่อนหน้านี้ซึ่งฉันสงสัยเกี่ยวกับวิธีใส่เครื่องหมายคำพูดเดี่ยวใน URL โดยใช้ Markdown จากนั้นib แนะนำให้ใช้% 27 ซึ่งได้ผล ขอบคุณ ib.
ftvs

เพิ่งค้นพบวิธีการเน้นเฉพาะคอลัมน์ที่ผ่านมา 80 ~:let w:eighty_column_match = matchadd('ColorColumn', '\%81v.\+', 100)
rampion

colorwidthสิ่งที่เป็นประโยชน์สำหรับเหตุผลอื่น ๆ ดังนั้นฉันดีใจที่คุณโพสต์นี้
Sridhar Sarnobat

2

คุณลองแล้ว'linebreak'หรือยัง?

        *'linebreak'* *'lbr'* *'nolinebreak'* *'nolbr'*
  'linebreak' 'lbr' boolean (default off)
        local to window
        {not in Vi}
        {not available when compiled without the  |+linebreak|
        feature}
If on Vim will wrap long lines at a character in 'breakat' rather
than at the last character that fits on the screen.  Unlike
'wrapmargin' and 'textwidth', this does not insert <EOL>s in the file,
it only affects the way the file is displayed, not its contents.  The
value of 'showbreak' is used to put in front of wrapped lines.
This option is not used when the 'wrap' option is off or 'list' is on.
Note that <Tab> characters after an <EOL> are mostly not displayed
with the right amount of white space.

3
อืม ... แต่breakatเป็นแค่รูปแบบ (ไม่ใช่ความยาว) เลยไม่เห็นว่าจะใช้วิธีนี้บังคับ soft wrap ที่ 80 ได้อย่างไร ....
rampion

อืมฉันสงสัยว่าเป็นไปได้ไหมที่จะสร้างนิพจน์ทั่วไปที่จะจับคู่คำที่มีความยาวรวม (บวกช่องว่างระหว่าง) น้อยกว่าหรือเท่ากับ n ตัวอักษร
Shane Creighton-Young

@ ShaneCreighton-Young: ^.{,80}\bเหมาะสำหรับผู้ที่ใช้แท็บแบบนุ่ม / ขยาย โปรดทราบว่า perl regex ไม่ใช่ vim regex
Mark K Cowan

0

ไม่มีทางทำได้ดี เราสามารถตัดชั่วคราวsetlocal softwrapด้วยautocmdถ้าเราปรับเปลี่ยนคำตอบ @eborisch หากเราปรับขนาดทุกครั้งที่เราป้อนบัฟเฟอร์และเราปรับขนาดเป็นความยาวเฉพาะเมื่อsoftwrapตั้งค่าตัวแปรภายในเราจะได้พฤติกรรมที่ต้องการ

สมมติว่าเราต้องการ soft wrap เป็น 80 คอลัมน์เราสามารถเขียนสิ่งต่อไปนี้.vimrcได้

augroup softwrap
    autocmd VimResized * if (exists('b:softwrap') && &columns > 80) | set columns=80 | endif
    autocmd BufEnter * set columns=999
augroup END

ในการเปิดโหมดสำหรับบัฟเฟอร์เฉพาะให้ใช้คำสั่งต่อไปนี้:

let b:softwrap=1
set columns=80

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