Định dạng của dòng trạng thái mặc định là gì?


14

Tôi đọc về cách cập nhật trạng thái vim ở đây . Và tôi có thể cập nhật nó thành công.

Nhưng, tôi muốn giữ lại định dạng của dòng trạng thái vim mặc định và chỉ cần thêm một số thông tin khác vào nó, ví dụ như kích thước tệp, loại tệp, v.v.

Dòng trạng thái mặc định của Vim là:

   <file-name>                              line_num,col_num        %file

Làm thế nào tôi có thể làm như sau?

  1. Tôi muốn thêm thông tin sau tên tập tin
  2. Hiển thị định dạng hiện tại của dòng trạng thái ( :set statuslinekhông hiển thị gì)

Tôi đã thử:

set statusline+=%y

Nhưng điều này sẽ ghi đè lên toàn bộ dòng trạng thái và chỉ hiển thị loại tệp ( %y).

Có gợi ý nào không?


2
Nếu bạn quan tâm đến Vim, hãy kiểm tra Vi và Vim !
muru

Câu trả lời:


15

Giống như @muru đã nói, dường như không thể mô phỏng chính xác dòng trạng thái mặc định khi statuslineđược đặt làm mã để hiển thị, nó thực hiện những điều không thể được chỉ định trong statuslinecài đặt. Có thể nhận được khá gần, tuy nhiên. Dưới đây là một xấp xỉ hợp lý về cách dòng trạng thái mặc định trông khi rulerđược bật:

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

Sự khác biệt chính là vị trí của số dòng và số cột. Nếu có thể mô phỏng logic khoảng cách mặc định, tôi đã không thể tìm ra cách để làm điều đó. Có lẽ điều này sẽ đủ gần cho mục đích của bạn.

Tôi sử dụng một phiên bản phân tách của cái này .vimrcđể đặt thông tin dòng trạng thái Syntastic vào giữa dòng trông giống như dòng trạng thái vim bình thường với thước kẻ:

" 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

Mã không đặt bất kỳ giá trị nào thành một chuỗi trạng thái trống, mà chỉ hành động bằng cách sử dụng một số giá trị mặc định. Xem src/screen.c, chức năngwin_redr_status() . Các mục được hiển thị dựa trên các tính năng được biên dịch, do đó, để xây dựng lại trạng thái chính xác, người ta sẽ cần xem xét các tính năng được biên dịch. Có thể đơn giản hơn khi sử dụng dòng trạng thái ví dụ được đưa ra trong :h statusline:

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

Ký hiệu dấu chấm (.) Sau chiều rộng (14) có nghĩa là %-14.(%l,%c%V%)gì?
ShamÓA

4

tl; dr

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

Mặc dù giải pháp được đề xuất của tôi không khác nhiều so với các câu trả lời khác, tôi muốn chia sẻ một lời giải thích chi tiết hơn.

hành vi ban đầu

Trước tiên, hãy tìm hiểu làm thế nào để vimvẽ dòng trạng thái. Các chức năng chịu trách nhiệm là win_redr_status()win_redr_ruler().

vimmất bộ đệm tên , cho biết thêm một không gian nếu có bất kỳ cờ đi theo (như [Help], [Preview], [+], [RO]). Sau đó, thêm các cờ .

Thông thường nó phân bổ 18 ô ký tự cho thước. Nếu phần tên bộ đệm không khớp với phần còn lại của không gian có sẵn sẽ vim cắt nó từ bên trái và thêm <vào lúc bắt đầu.

Nếu có chỗ cho sơ đồ bàn phím , nó sẽ thêm nó vào cuối (căn lề phải).

Bây giờ, người cai trị. Nó bao gồm <row>,<col>-<virtcol> một phầnvị trí tương đối (căn phải).

Ngoài ra còn có một hạn chế rằng phần với tên đệm phải mất ít nhất một nửa của chiều rộng .

giải pháp

Bây giờ hãy lấy giá trị được đề xuất bởi các tài liệu :

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

Ở đâu

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

Vì vậy, đầu tiên %<có thể được bỏ qua, vì tên đệm mặc định được cắt ngắn ở đầu. Sau đó, nó thiếu cờ xem trước ( %w). Ngoài ra, khi cửa sổ 18 * 2rộng hơn ký tự, phần bên phải chiếm hơn một nửa dòng trạng thái.

Vì vậy, ít nhất chúng ta có thể bỏ qua %<và thêm %w:

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

Chúng ta có thể đi xa hơn và đảm bảo phần bên phải không chiếm quá một nửa dòng trạng thái:

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

Sau đó chúng ta có thể làm cho nó phụ thuộc vào các tính năng vimđược biên dịch với .

if has("quickfix")
    ...
endif

Nhưng tôi muốn nói rằng điều đó không thực tế và giải pháp trước đó sẽ đủ cho hầu hết các ý định và mục đích. Tuy nhiên, nếu giải pháp cuối cùng không hiệu quả với bạn, hãy cho tôi biết điều gì sai và tôi sẽ cố gắng đưa ra giải pháp tốt hơn.


Vấn đề với giải pháp được đề xuất bởi Laurence Gonsalves là nếu không có cờ, có hai khoảng trống giữa phần bên trái và phần bên phải:

:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.