nvimのstatuslineいらなくない?―shellからnvimを叩く―
動機
私はよくわからないボタンがいっぱいあるIDEのようなUIが怖いので、VSCodeのZen Modeのような画面でプログラミングをしています。
画像下部、nvimのstatuslineを使いこなしておらずファイルに関するわずかな情報しか表示していませんでした。最上部のtmux windowタイトルも"nvim", "zsh"とプログラム名があるだけです。
不必要なスペースを省くため、ファイル情報をtmux windowタイトルに表示させnvim statuslineを非表示にしました。
laststatus=0
設定でstatuslineを非表示した際にも行番号, 列番号が表示される場所はrulerというらしいです。こちらも変更可能です。
方法
vimのstatuslineはフォーマットをstatuslineに設定することで表示されるだけですが、nvimはフォーマットを渡すとレンダリングされた文字列を返してくれる関数nvim_eval_statuslineを持っています。さらにserver-clientで実装されているので簡単に接続して任意のvim scriptを実行できます。
以上をプラグインの形にしたものがこちらになります。
このプラグインを使い画像の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