TL; DR
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
แม้ว่าโซลูชันที่แนะนำของฉันจะไม่แตกต่างจากคำตอบอื่น ๆ มากนัก แต่ฉันต้องการแบ่งปันคำอธิบายโดยละเอียดเพิ่มเติม
พฤติกรรมเดิม
อันดับแรกเรามาดูวิธีการvim
วาดเส้นสถานะ ฟังก์ชั่นที่มีความรับผิดชอบอยู่และwin_redr_status()
win_redr_ruler()
vim
ใช้เวลาบัฟเฟอร์ชื่อ , เพิ่มพื้นที่ถ้ามีธงใด ๆ ที่จะปฏิบัติตาม (เช่น[Help]
, [Preview]
, [+]
, [RO]
) แล้วมัน จะเพิ่ม ธง
โดยปกติจะจัดสรรเซลล์อักขระ 18 ตัวสำหรับไม้บรรทัด ถ้าส่วนของชื่อบัฟเฟอร์ไม่พอดีกับพื้นที่ว่างที่เหลือจะvim
ตัดส่วนทางซ้ายและเพิ่ม<
ที่จุดเริ่มต้น
หากมีที่ว่างสำหรับคีย์แมปมันจะเพิ่มในตอนท้าย (จัดชิดขวา)
ทีนี้เจ้าผู้ครองนคร ประกอบด้วย<row>,<col>-<virtcol>
ส่วนหนึ่งและตำแหน่งสัมพัทธ์(ชิดขวา)
นอกจากนี้ยังมีข้อ จำกัด ว่าเป็นส่วนหนึ่งที่มีชื่อบัฟเฟอร์จะต้องใช้เวลาอย่างน้อยครึ่งหนึ่งของความกว้าง
วิธีการแก้
ทีนี้ลองดูค่าที่เอกสารแนะนำ :
:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
ที่ไหน
%< - where to truncate the line if too long
%f - buffer name (path to a file, or something)
%h - help flag
%m - modified flag
%r - readonly flag
%= - separater between the left (buffer name) and the right (ruler) parts
%-14.(...%) - minimum field width == 14
%l - line
%c - column
%V - virtual column
%P - percentage
ดังนั้นก่อนอื่น%<
สามารถละเว้นได้เนื่องจากชื่อบัฟเฟอร์เริ่มต้นจะถูกตัดทอนที่จุดเริ่มต้น จากนั้นจะไม่มีการตั้งค่าสถานะตัวอย่าง ( %w
) นอกจากนี้เมื่อหน้าต่างมี18 * 2
ความกว้างน้อยกว่าตัวอักษรส่วนขวาใช้เวลามากกว่าครึ่งหนึ่งของบรรทัดสถานะ
ดังนั้นอย่างน้อยเราสามารถละเว้น%<
และเพิ่ม%w
:
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
เราสามารถไปต่อและตรวจสอบให้แน่ใจว่าส่วนที่ถูกต้องไม่ใช้เวลามากกว่าครึ่งหนึ่งของบรรทัดสถานะ:
set statusline=%!MyStatusLine()
function! MyStatusLine()
let l:w = min([14,winwidth(0)/2-3])
return '%f %h%w%m%r%=%-' . l:w . '.(%l,%c%V%) %P'
endfunction
แล้วเราสามารถทำให้มันขึ้นอยู่กับคุณสมบัติที่vim
ได้รับการรวบรวมกับ
if has("quickfix")
...
endif
แต่ฉันจะบอกว่ามันไม่ได้ใช้งานได้จริงและวิธีแก้ปัญหาก่อนหน้านี้ก็เพียงพอแล้วสำหรับจุดประสงค์และจุดประสงค์ อย่างไรก็ตามหากทางออกสุดท้ายไม่เหมาะกับคุณบอกฉันว่ามีอะไรผิดปกติและฉันจะพยายามหาวิธีที่ดีกว่า
ปัญหาเกี่ยวกับวิธีแก้ปัญหาที่แนะนำโดย Laurence Gonsalves คือถ้าไม่มีธงมีช่องว่างสองส่วนระหว่างด้านซ้ายและด้านขวา:
:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)