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

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

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

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


はじめに

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

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

statuslineを​隠す方​法

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

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

:h laststatus
1234567891011121314151617181920212223
							*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を​設定する​ことで、​ステータスラインをだけにします。

12345
vim.opt.fillchars = {
  stl = '─',
  stlnc = '─',
}
vim.opt.statusline = '─'
:h fillchars
12345678910111213141516171819202122232425262728293031323334353637
						*'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の​背景色と​同じに​してみます。

12345678910111213141516171819

```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,
})

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

123456789101112131415161718192021222324
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駅伝の​ネタが​できて​正直美味しい。