Wagomu no Akibako

statusline隠すとかっこよくなることに気づいてしまった...


この​記事はVim駅伝2024年8月26日(月)の​記事です。

前回の​記事は​ kawarimidollさんの​「Vimで​記号や​演算子を​サクッと​補完する」と​いう​記事でした。

次回の​記事は​ 8月28日(水) に​投稿される​予定です。


はじめに

気づいちゃいました…​statuslineを​隠したらかっこよくなる​ことに。

かっこよくないですか???

statuslineを​隠す方​法

※luaを​使っているので、​Vim scriptを​使っている方は​適宜読みかえてください。

まずはvim.opt.laststatus=0を​設定して​ステータスラインを​非表示にします。

:h laststatus
							*status-line*
ステータス行はウィンドウの分割に使われる。'laststatus' オプションは一番下のウィ
ンドウにステータス行を表示するかを設定する:
	'laststatus' = 0	常にステータス行を表示しない。
	'laststatus' = 1	ウィンドウが2つ以上ある場合に表示する。
	'laststatus' = 2	常にステータス行を表示する。

ステータス行の内容は 'statusline' オプションで変更できる。
このオプションはウィンドウについてローカルにすることもでき、そうすると各ウィン
ドウごとに異なるステータスラインを表示することができる。

通常、ステータス行は反転表示される。これは 'highlight' オプションの 's' キャラ
クタで変更できる。例えば、"sb" は太文字に設定する。ステータス行にハイライトを
使用しない場合("sn")、'^' がカレントウィンドウに使われ、'=' が他のウィンドウに
使われる。マウスがサポートされていて 'mouse' オプションでマウスが使用可能になっ
ている場合は、ステータス行をドラッグすることでウィンドウのリサイズを行える。

Note: ステータス行が反転表示されるはずが反転表示されなければ、'highlight' オプ
ションに 'si' が含まれているか確認すること。version 3.0 では、'si' がステータ
ス行の反転表示を意味していた。今は反転表示には 'sr' を使用し、'si' はイタリッ
ク表示を意味している!  イタリックを表示できない端末では、ステータス行は反転表
示となる。イタリック表示のための termcap コードがある場合にのみ、この問題が見
られる。

これで​一件落着と​思いきや、​まだです。
ステータスラインは​区切り線と​しての​役割も​持っている​ため:splitを​実行すると​ステータスラインが​見えてしまいます。

その​ため、​fillcharsと​statuslineを​設定する​ことで、​ステータスラインをだけにします。

vim.opt.fillchars = {
  stl = '─',
  stlnc = '─',
}
vim.opt.statusline = '─'
:h fillchars
						*'fillchars'* *'fcs'*
'fillchars' 'fcs'	文字列	(既定では "vert:|,fold:-,eob:~")
			グローバル/ウィンドウについてローカル |global-local|
	ウィンドウのステータス行、垂直分割の区切り、特殊行を埋める文字。
	これはコンマで区切られた項目のリストである。各項目には、名前、コロン、
	およびその項目の値がある: |E1511|

	  キーワード	既定値		変更の対象 ~
	  stl		' '		カレントウィンドウのステータス行
	  stlnc		' '		非カレントウィンドウのステータス行
	  vert		'|'		垂直分割の区切り |:vsplit|
	  fold		'-'		'foldtext' での空白部分
	  foldopen	'-'		折り畳みの先頭のマーク
	  foldclose	'+'		閉じられた折り畳みのマーク
	  foldsep	'|'		開いた折り畳みの中間文字
	  diff		'-'		'diff' での削除された行
	  eob		'~'		バッファ終端以降の空行
	  lastline	'@'		'display' が含む最終行/切り捨て

	指定されなかったキーワードについては、既定値が使われる。

	例: >
	    :set fillchars=stl:\ ,stlnc:\ ,vert:\|,fold:-,diff:-
<
	"stl", "stlnc", "foldopen", "foldclose", "foldsep" 項目に対しては1バイ
	トおよびマルチバイトの文字をサポートしている。しかし全角文字幅の文字は
	サポートしていない。|E1512|

	強調表示が行われるものおよびその属するグループ:
	  項目名	ハイライトグループ ~
	  stl		StatusLine		|hl-StatusLine|
	  stlnc		StatusLineNC		|hl-StatusLineNC|
	  vert		VertSplit		|hl-VertSplit|
	  fold		Folded			|hl-Folded|
	  diff		DiffDelete		|hl-DiffDelete|
	  eob		EndOfBuffer		|hl-EndOfBuffer|
	  lastline	NonText			|hl-NonText|

最後に、​ステータスラインの​背景色が​気に​なるので​VertSplitの​背景色と​同じに​してみます。


```lua
autocmd({'WinEnter', 'BufEnter', 'ColorScheme'}, {
  group = MyAuGroup,
  pattern = '*',
  callback = function()
    local bg = vim.fn.synIDattr(vim.fn.hlID("Normal"), "bg#")
    local fg = vim.fn.synIDattr(vim.fn.hlID("VertSplit"), "fg#")

    if bg ~= "" then
      vim.cmd("hi StatusLine ctermbg=NONE guibg=" .. bg .. " ctermfg=NONE guifg=" .. fg)
      vim.cmd("hi StatuslineNC ctermbg=NONE guibg=" .. bg .. " ctermfg=NONE guifg=" .. fg)
    else
      vim.cmd("hi StatusLine ctermbg=NONE guibg=NONE ctermfg=NONE guifg=" .. fg)
      vim.cmd("hi StatuslineNC ctermbg=NONE guibg=NONE ctermfg=NONE guifg=" .. fg)
    end
  end,
  once = true,
})

これで​ステータスラインを​かっこよく​隠すことができました!!!!!!!
最後に​全体の​コードを​載せて​おきます。

vim.opt.laststatus = 0
vim.opt.fillchars = {
  stl = '─',
  stlnc = '─',
}
vim.opt.statusline = '─'

autocmd({'WinEnter', 'BufEnter', 'ColorScheme'}, {
  group = MyAuGroup,
  pattern = '*',
  callback = function()
    local bg = vim.fn.synIDattr(vim.fn.hlID("Normal"), "bg#")
    local fg = vim.fn.synIDattr(vim.fn.hlID("VertSplit"), "fg#")

    if bg ~= "" then
      vim.cmd("hi StatusLine ctermbg=NONE guibg=" .. bg .. " ctermfg=NONE guifg=" .. fg)
      vim.cmd("hi StatuslineNC ctermbg=NONE guibg=" .. bg .. " ctermfg=NONE guifg=" .. fg)
    else
      vim.cmd("hi StatusLine ctermbg=NONE guibg=NONE ctermfg=NONE guifg=" .. fg)
      vim.cmd("hi StatuslineNC ctermbg=NONE guibg=NONE ctermfg=NONE guifg=" .. fg)
    end
  end,
  once = true,
})

おわりに

かっこいい​Neovimが​得られましたが、​実は​大きな​問題が​あります。​それは​ファイル名等の​バッファ固有の​情報が​全く​見えなくなると​いう​ことです。
この​問題に​対して​自作の​winbarを​作る​ことで​対処しているのですが、​まだ​完成していないためお披露目は​また​今度に​なりそうです。

ステータスラインを​消した​ことで​新たな​Vim駅伝の​ネタが​できて​正直美味しい。