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>
パーツと相対位置で構成されています(右揃え)。
また、バッファ名のある部分はwidthの少なくとも半分をとる必要があるという制限があります。
解決
ここで、ドキュメントによって提案された値を取得しましょう:
: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
しかし、それは実用的ではなく、ほとんどの意図と目的には以前の解決策で十分だと思います。ただし、最後の解決策がうまくいかない場合は、何が悪いのか教えてください。より良い解決策を考えてみます。
ローレンスゴンサルベスが提案した解決策の問題は、フラグがない場合、左と右の部分の間に2つのスペースがあることです。
:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)