👁️

nvimのstatuslineいらなくない?―shellからnvimを叩く―

2021/10/29に公開

動機

私はよくわからないボタンがいっぱいあるIDEのようなUIが怖いので、VSCodeのZen Modeのような画面でプログラミングをしています。
before
画像下部、nvimのstatuslineを使いこなしておらずファイルに関するわずかな情報しか表示していませんでした。最上部のtmux windowタイトルも"nvim", "zsh"とプログラム名があるだけです。
不必要なスペースを省くため、ファイル情報をtmux windowタイトルに表示させnvim statuslineを非表示にしました。
after

laststatus=0設定でstatuslineを非表示した際にも行番号, 列番号が表示される場所はrulerというらしいです。こちらも変更可能です。

方法

vimのstatuslineはフォーマットをstatuslineに設定することで表示されるだけですが、nvimはフォーマットを渡すとレンダリングされた文字列を返してくれる関数nvim_eval_statuslineを持っています。さらにserver-clientで実装されているので簡単に接続して任意のvim scriptを実行できます。

以上をプラグインの形にしたものがこちらになります。
https://github.com/octaltree/nvim-status-bash

このプラグインを使い画像のwindowタイトルはこの設定で表示されています。

set -g automatic-rename on
set -g @nvim_status "%Y %f%{substitute(' ' .. (has('multi_byte')&&\&fileencoding!=''?&fileencoding:&encoding), ' utf-8', '', '')}%{substitute(' ' .. &fileformat, ' unix', '', '')}%{&bomb? ' bomb': ''}"
set -g window-status-current-format '#I:#{?#{m:#{pane_current_command},zsh},#(basename #{pane_current_path})/,#{?#{m:#{pane_current_command},nvim},#(`tmux show -vg @nvim_status_bin`/tmux_nvim_status #{pane_id} '@nvim_status'),#{pane_current_command}}}'
set -g window-status-format '#I:#{?#{m:#{pane_current_command},zsh},#(basename #{pane_current_path})/,#{?#{m:#{pane_current_command},nvim},#(`tmux show -vg @nvim_status_bin`/tmux_nvim_status #{pane_id} '@nvim_status'),#{pane_current_command}}}'

仰々しいですが、今いるwindowと他のwindowで設定を繰り返している、tmuxのフォーマットにおけるif式の記号量が多いだけなので内容はシンプルです。
if式の説明はこちらにお願いすることにします。私も大変参考にさせていただきました。
tmuxのwindow名がzshのときだけカレントディレクトリにする - Qiita

プラグインが提供するシェルスクリプトtmux_nvim_statusを叩いています。tmux_nvim_statusはwindowのアクティブなpaneのforegroundプロセスがnvimのときpidを取得して、シェルスクリプトnvim_eval_statuslineを使ってstatuslineを得ます。

nvim_eval_statuslineついでに任意のvim scriptを実行するnvim_execも用意しましたが、可搬性を求めないのであればneovim-remoteといった選択肢もあります。よろしければどうぞ。

お粗末様でした。

Discussion