기본 상태 표시 줄의 형식은 무엇입니까? 성공적으로 업데이트

vim 상태 표시 줄을 업데이트하는 방법은 여기를 참조하십시오 . 그리고 나는 그것을 성공적으로 업데이트 할 수 있습니다.

그러나 기본 vim 상태 표시 줄의 형식을 유지하고 파일 크기, 파일 유형 등과 같은 정보를 추가하려고합니다.

Vim 기본 상태 줄은 다음과 같습니다.

   <file-name>                              line_num,col_num        %file

다음을 어떻게 할 수 있습니까?

  1. 파일 이름 뒤에 정보를 추가하고 싶습니다
  2. 상태 표시 줄의 현재 형식을 :set statusline표시합니다 (아무것도 표시하지 않음)

나는 시도했다 :

set statusline+=%y

그러나 이것은 전체 상태 표시 줄을 덮어 쓰고 파일 유형 ( %y) 만 표시합니다 .

힌트가 있습니까?



답변

@muru가 말했듯 이 렌더링에 대한 코드로 설정되어 있으면 설정에서 지정할 수없는 작업을 수행 하면 기본 상태 표시 줄 을 정확하게 시뮬레이션 할 수없는 것 같습니다 . 그러나 아주 가까워 질 수 있습니다. 다음은 기본 상태 표시 줄 이 활성화 되었을 때의 모양에 대한 합리적인 근사치입니다 .statuslinestatuslineruler

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

주요 차이점은 줄 번호와 열 번호의 위치입니다. 기본 간격 로직을 시뮬레이션 할 수 있다면,이를 수행 할 방법을 찾지 못했습니다. 아마도 이것은 당신의 목적에 충분히 가깝습니다.

나는 자체의 분할 버전을 사용하여 .vimrcSyntastic 상태 표시 줄 정보를 눈금자가있는 일반 vim 상태 표시 줄의 중간에 배치합니다.

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


답변

이 코드는 값을 빈 상태 문자열로 설정하지 않지만 일부 기본값을 사용하여 작동합니다. 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


답변

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 잘리고< 시작 부분에 추가 됩니다.

keymap을 위한 공간이 있으면 끝에 추가됩니다 (오른쪽 정렬).

자, 통치자 이 구성 <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%)


답변