ฉันจะรับความสูงและความกว้างที่แท้จริงของ Vim ได้อย่างไร


18

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

:echo winwidth('%') winheight('%') winwidth('%') * 1.0 / winheight('%')
104 51 2.039216

ภาพหน้าจอของพื้นที่บัฟเฟอร์มีขนาด 936x918 พิกเซลซึ่งแสดงอัตราส่วนภาพ1.019608เป็น ฉันคิดว่าฉันสามารถรับค่าจริงโดยใช้ขนาดของแบบอักษร แต่ได้อย่างไร

นี่คือการติดตามผลฉันจะทำให้ Vim ช่วยเปิดในแนวตั้งได้อย่างไร . ฉันพยายามที่จะปรับตัวเข้ากับวิธีการแก้ปัญหาของ Nobe4


3
ฉันไม่คิดว่าคุณจะได้มิติเป็นพิกเซลด้วยฟังก์ชัน Vim แบบธรรมดา สำหรับความช่วยเหลือในการเปิดแยกแนวตั้งผมไม่รำคาญกับการคำนวณอัตราส่วนฉันเพียงแค่แยกในแนวตั้งถ้าหน้าต่าง terminal cnoreabbrev h <C-r>=(&columns >= 160 && getcmdtype() ==# ':' && getcmdpos() == 1 ? 'vertical botright help' : 'h')<CR>กว้างพอที่:
Sato Katsura

1
@SatoKatsura จึงทำตามประเพณีที่กำหนดโดยนักพัฒนาเว็บส่วนใหญ่ที่ใช้ความกว้างของเอกสารเพื่อตรวจสอบว่าเป็นมือถือหรือไม่ :(
muru

1
ไม่ใช่เพราะฉันแค่ทำแบบนั้นกับตัวเองเท่านั้น ฉันเล่นโดยใช้อัตราส่วนกว้าง ๆ ชั่วครู่หนึ่งและพบว่าผลลัพธ์ไม่น่าพอใจ จากนั้นฉันจำได้ว่าฉันมีทางลัดสองทางสำหรับการเปิดเทอร์มินัลสำหรับขนาด "ปกติ" และสำหรับเทอร์มินัล "กว้าง" ดังนั้นเทอร์มินัลของฉันมักจะมีขนาดเท่ากัน แน่นอน YMMV
Sato Katsura

@SatoKatsura คำสั่งนั้นเป็นเวทมนตร์มืดที่ร้ายแรง ฉันประหลาดใจมากที่นอกเหนือจากการไม่รู้เกี่ยวกับ==#ผู้ปฏิบัติงานซึ่ง:hช่วยให้ชัดเจนฉันเข้าใจคำสั่งที่ผิดทั้งหมด นั่นทำให้ฉันเป็นกลุ่มผู้เชี่ยวชาญหรือไม่? ต้องเป็นอย่างนั้น ต้องออกไปอีก
Steven Lu

คำตอบ:


1

104 คอลัมน์ / 51 บรรทัด = 2.04

การคำนวณของคุณเบ้เนื่องจากอัตราส่วนกว้างยาวของแต่ละเซลล์เป็นแนวตั้ง

ตัวอย่างเช่นบน Terminal.app ที่มีฟอนต์ 23pt และการเว้นวรรคอักขระเริ่มต้นแต่ละเทอร์มินัลเซลล์มีความกว้าง 7px และความสูง 15px รวม728x765px :

(104 * 7) / (51 * 15) = 728/765 = 0.95


คุณไม่สามารถดึงขนาดแบบอักษรจากภายใน Vim โดยไม่ต้องเรียกใช้คำสั่งภายนอกหรือวิธีการสื่อสารกับเทอร์มินัลซึ่งอาจหนักมาก เห็นได้ชัดว่านี่คือความแตกต่างใน gvim 'guifont'ต้องขอบคุณ

หากคุณจัดการที่จะทำมันยังคงคุณต้องมีวิธีการหักขนาดของเซลล์ซึ่งอาจแตกต่างกันไปขึ้นอยู่กับโปรแกรมมินัลในกรณีที่ไม่มีมาตรฐาน ฉันตรวจสอบ iTerm 2 ซึ่งโชคดีที่มีผลลัพธ์เหมือนกัน


ดังนั้นฉันจะเลือกใช้โซลูชันคงที่ ฉันรับสินบนตรวจสอบความกว้างขั้นต่ำสุดกับตัวอย่างนี้คุณสามารถวางในplugin/help.vim:

function! Help(...)
  let l:topic = a:0 ? a:1 : ''
  if winwidth('%') >= 160 " Minimum width
    execute 'vertical botright help' l:topic
    execute 'vertical resize 78'
  else
    execute 'botright help' l:topic
  endif
endfunction

" Use :H to open a vertical or horizontal help split
command! -complete=help -nargs=? H call Help(<f-args>)

หากหน้าต่างมีขนาดใหญ่พอที่จะเก็บบัฟเฟอร์ 80 คอลัมน์ปัจจุบันการแบ่งวิธีใช้แบบแคบจะเปิดทางด้านขวามิฉะนั้นการแยกจะเปิดด้านล่าง :verticalคุณสามารถปรับแต่งทิศทางการแยกด้วย

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