기본 상태 표시줄의 형식은 무엇입니까?

기본 상태 표시줄의 형식은 무엇입니까?

vim 상태 줄을 업데이트하는 방법을 읽었습니다.여기. 그리고 성공적으로 업데이트할 수 있습니다.

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

Vim의 기본 상태 표시줄은 다음과 같습니다:

   <file-name>                              line_num,col_num        %file

다음 작업을 어떻게 수행할 수 있나요?

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

나는 시도했다:

set statusline+=%y

하지만 이는 전체 상태 표시줄을 덮어쓰고 파일 유형( %y)만 표시합니다.

어떤 팁이 있나요?

답변1

@muru가 말했듯이 이것은 불가능해 보입니다.정확히statusline설정에서 지정할 수 없는 작업을 수행하는 렌더링 코드로 설정된 경우 기본 상태 표시줄을 시뮬레이션합니다 statusline. 그러나 매우 가까이 다가가는 것은 가능합니다. ruler활성화된 경우 기본 상태 표시줄의 합리적인 근사치 는 다음과 같습니다 .

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

주요 차이점은 행 및 열 번호의 위치입니다. 이는 [-]수정 불가능한 버퍼에도 나타납니다 . 기본 간격 논리를 에뮬레이트하는 것이 가능하다면 이를 수행할 방법을 찾지 못했습니다. 아마도 이것은 귀하의 목적에 충분히 가깝습니다.

:help statusline이 버전에는 미리보기 플래그가 없지만 이는 시도된 시뮬레이션의 기본 상태 표시줄과 매우 유사합니다 .

나는 그것의 분할 버전을 직접 사용하여 .vimrc눈금자가 있는 일반적인 vim 상태 줄처럼 보이는 것의 중간에 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%)

답변2

너무 길어요.

: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

따라서 %<기본적으로 버퍼 이름의 시작 부분이 잘리므로 first는 생략할 수 있습니다. 그런 다음 미리보기 플래그( )가 누락되었습니다 %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%)

답변3

코드는 빈 상태 문자열에 어떤 값도 설정하지 않으며 단지 일부 기본값으로 작동합니다. 바라보다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

관련 정보