vim 상태 표시 줄을 업데이트하는 방법은 여기를 참조하십시오 . 그리고 나는 그것을 성공적으로 업데이트 할 수 있습니다.
그러나 기본 vim 상태 표시 줄의 형식을 유지하고 파일 크기, 파일 유형 등과 같은 정보를 추가하려고합니다.
Vim 기본 상태 줄은 다음과 같습니다.
<file-name> line_num,col_num %file
다음을 어떻게 할 수 있습니까?
- 파일 이름 뒤에 정보를 추가하고 싶습니다
- 상태 표시 줄의 현재 형식을
:set statusline
표시합니다 (아무것도 표시하지 않음)
나는 시도했다 :
set statusline+=%y
그러나 이것은 전체 상태 표시 줄을 덮어 쓰고 파일 유형 ( %y
) 만 표시합니다 .
힌트가 있습니까?
답변
@muru가 말했듯 이 렌더링에 대한 코드로 설정되어 있으면 설정에서 지정할 수없는 작업을 수행 하면 기본 상태 표시 줄 을 정확하게 시뮬레이션 할 수없는 것 같습니다 . 그러나 아주 가까워 질 수 있습니다. 다음은 기본 상태 표시 줄 이 활성화 되었을 때의 모양에 대한 합리적인 근사치입니다 .statusline
statusline
ruler
:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)
주요 차이점은 줄 번호와 열 번호의 위치입니다. 기본 간격 로직을 시뮬레이션 할 수 있다면,이를 수행 할 방법을 찾지 못했습니다. 아마도 이것은 당신의 목적에 충분히 가깝습니다.
나는 자체의 분할 버전을 사용하여 .vimrc
Syntastic 상태 표시 줄 정보를 눈금자가있는 일반 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%)