Apa format dari status standar?

14

Saya membaca tentang cara memperbarui status vim di sini . Dan saya berhasil memperbaruinya.

Tapi, saya ingin mempertahankan format status vim default dan hanya menambahkan beberapa info lagi misalnya ukuran file, tipe file, dll.

Garis status default Vim adalah:

   <file-name>                              line_num,col_num        %file

Bagaimana saya bisa melakukan yang berikut?

  1. Saya ingin menambahkan info setelah nama file
  2. Tampilkan format statusline saat ini ( :set statuslinetidak menampilkan apa-apa)

Saya mencoba:

set statusline+=%y

Tapi ini menimpa seluruh statusline dan hanya menampilkan tipe file ( %y).

Ada petunjuk?

mtk
sumber
2
Jika Anda tertarik dengan Vim, lakukan checkout Vi dan Vim !
muru

Jawaban:

15

Seperti yang dikatakan @muru, sepertinya tidak mungkin untuk secara tepat mensimulasikan garis status default ketika statuslineditetapkan sebagai kode untuk rendering melakukan hal-hal yang tidak dapat ditentukan dalam statuslinepengaturan. Mungkin saja untuk menjadi cukup dekat. Berikut ini adalah perkiraan yang wajar tentang cara garis status default terlihat ketika rulerdiaktifkan:

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

Perbedaan utama adalah posisi nomor baris dan kolom. Jika mungkin untuk mensimulasikan logika penspasian default, saya belum dapat menemukan cara untuk melakukannya. Mungkin ini akan cukup dekat untuk keperluan Anda.

Saya menggunakan versi split ini di saya sendiri .vimrcuntuk menempatkan info baris status Syntastic di tengah apa yang tampak seperti baris status vim normal dengan penggaris:

" 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%)
Laurence Gonsalves
sumber
7

Kode tidak menetapkan nilai apa pun ke string status kosong, tetapi hanya bertindak menggunakan beberapa default. Lihat src/screen.c, berfungsiwin_redr_status() . Item yang ditampilkan berdasarkan pada fitur yang dikompilasi, oleh karena itu untuk merekonstruksi statusline yang tepat seseorang perlu melihat fitur yang dikompilasi. Mungkin lebih mudah untuk menggunakan contoh statusline yang diberikan dalam :h statusline:

Examples:
Emulate standard status line with 'ruler' set 
  :set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
muru
sumber
Apa arti simbol titik (.) Setelah lebar (14) %-14.(%l,%c%V%)?
Shamaoke
4

tl; dr

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

Meskipun solusi yang saya sarankan tidak jauh berbeda dari jawaban yang lain, saya ingin membagikan penjelasan yang lebih rinci.

perilaku asli

Pertama, mari kita cari tahu cara vimmenggambar garis status. Fungsi yang bertanggung jawab adalah win_redr_status()dan win_redr_ruler().

vimmengambil buffer nama , menambahkan ruang jika ada bendera untuk mengikuti (seperti [Help], [Preview], [+], [RO]). Kemudian ia menambahkan dengan bendera .

Biasanya itu mengalokasikan 18 sel karakter untuk penguasa. Jika bagian nama buffer tidak sesuai dengan sisa ruang yang tersedia, vim potong dari kiri dan tambahkan <di awal.

Jika ada ruang untuk keymap , itu menambahkannya di akhir (rata kanan).

Sekarang, penguasa. Ini terdiri dari <row>,<col>-<virtcol> bagian dan posisi relatif (rata kanan).

Ada juga batasan bahwa bagian dengan nama penyangga harus mengambil setidaknya setengah dari lebar .

larutan

Sekarang mari kita ambil nilai yang disarankan oleh dokumen :

:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

dimana

%< - 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

Jadi, pertama %<dapat dihilangkan, karena secara default nama buffer terpotong di awal. Kemudian, tidak ada bendera pratinjau ( %w). Juga, ketika 18 * 2lebar jendela kurang dari karakter, bagian kanan mengambil lebih dari setengah dari baris status.

Jadi, setidaknya kita dapat menghilangkan %<dan menambahkan %w:

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

Kita dapat melangkah lebih jauh dan memastikan bagian yang tepat tidak mengambil lebih dari setengah dari baris status:

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

Kemudian kita dapat membuatnya tergantung pada fitur vimyang dikompilasi .

if has("quickfix")
    ...
endif

Tetapi saya mengatakan bahwa itu tidak praktis, dan solusi sebelumnya akan cukup untuk sebagian besar maksud dan tujuan. Namun, jika solusi terakhir tidak berhasil untuk Anda, katakan padaku apa yang salah, dan saya akan mencoba untuk membuat yang lebih baik.


Masalah dengan solusi yang disarankan oleh Laurence Gonsalves adalah bahwa jika tidak ada bendera, ada dua ruang antara bagian kiri dan kanan:

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