รูปแบบของสถานะเริ่มต้นคืออะไร


14

ฉันอ่านเกี่ยวกับวิธีการปรับปรุง statusline เป็นกลุ่มที่นี่ และฉันสามารถอัปเดตได้สำเร็จ

แต่ฉันต้องการที่จะรักษารูปแบบของสถานะเป็นกลุ่มเริ่มต้นและเพียงแค่เพิ่มข้อมูลเพิ่มเติมบางอย่างไปเช่นขนาดไฟล์ประเภทไฟล์ ฯลฯ

บรรทัดสถานะเริ่มต้นที่เป็นกลุ่มคือ:

   <file-name>                              line_num,col_num        %file

ฉันจะทำสิ่งต่อไปนี้ได้อย่างไร?

  1. ฉันต้องการเพิ่มข้อมูลหลังจากชื่อไฟล์
  2. แสดงรูปแบบสถานะปัจจุบัน ( :set statuslineไม่แสดงผลใด ๆ )

ฉันเหนื่อย:

set statusline+=%y

แต่สิ่งนี้จะเขียนทับทั้งสถานะและเพียงแค่แสดงประเภทไฟล์ ( %y)

คำใบ้ใด ๆ


2
หากคุณสนใจในกลุ่มทำเช็คเอาต์Vi และกลุ่ม !
muru

คำตอบ:


15

เช่นเดียวกับ @muru กล่าวว่าดูเหมือนจะเป็นไปไม่ได้ที่จะจำลองบรรทัดสถานะเริ่มต้นอย่างแน่นอนเมื่อstatuslineตั้งเป็นรหัสสำหรับการแสดงผลซึ่งเป็นสิ่งที่ไม่สามารถระบุได้ในการstatuslineตั้งค่า อย่างไรก็ตามมีความเป็นไปได้ที่จะเข้าใกล้ นี่คือการประมาณที่สมเหตุสมผลของวิธีที่บรรทัดสถานะเริ่มต้นดูเมื่อrulerเปิดใช้งาน:

:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)

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

ฉันใช้เวอร์ชันแยกนี้ใน.vimrcสถานที่ของฉันเองเพื่อวางข้อมูลบรรทัดสถานะ Syntastic ที่อยู่ตรงกลางของสิ่งที่ดูเหมือนว่าบรรทัดสถานะกลุ่มทั่วไปที่มีไม้บรรทัด:

" start of default statusline
set statusline=%f\ %h%w%m%r\ 
" NOTE: preceding line has a trailing space character

" Syntastic statusline
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

" end of default statusline (with ruler)
set statusline+=%=%(%l,%c%V\ %=\ %P%)

7

รหัสไม่ได้ตั้งค่าใด ๆ เป็นสตริงสถานะว่างเปล่า แต่เพียงดำเนินการโดยใช้ค่าเริ่มต้นบางอย่าง ดูฟังก์ชั่นsrc/screen.c win_redr_status()ไอเท็มที่แสดงนั้นขึ้นอยู่กับฟีเจอร์ที่คอมไพล์ดังนั้นในการสร้างไลน์สถานะที่แน่นอนใหม่นั้นจะต้องดูที่ฟีเจอร์ที่คอมไพล์มันอาจจะง่ายกว่าในการใช้ตัวอย่างสถานะไลน์ที่กำหนดใน:h statusline:

Examples:
Emulate standard status line with 'ruler' set 
  :set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

สัญลักษณ์จุด (.) หลังความกว้าง (14) หมายถึง%-14.(%l,%c%V%)อะไร
Shamaoke

5

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