Tech Racho エンジニアの「?」を「!」に。
  • 開発

tmux+Neovim:フォーカスの有無によるコンソール背景色出し分け

初めまして、今年の7月入社のmiyasonです。

自己紹介

Webチームに所属していて、Rails案件に携わっています。
趣味はキーボード回りの(主にハードウェアの)あれこれをすることで、
直近ではKinesis Advantageというキーボードの静音化をしました(ステムをgateron静音赤軸に交換したりoリング入れたり)。

今回は私がtmuxとNeovimでやっている背景色の設定について書きます。

動機

  • Tmuxやvimでペイン分割しすぎた時のペイン迷子にまつわるもやもやを解消したい。
  • ペインを移動しようとしたところvimじゃなくてtmuxのペインだった。
  • vimで:wqしたつもりが隣のtmuxのペインに:wq: command not foundと出ていた。
  • ctrl+dしたら隣のペインが消えた。

→フォーカスしてないペインの背景色をそれっぽく変えれば無くなるはず。

環境

  • WSL
  • wsltty
  • nvim 0.3.8
  • tmux 2.6

設定

.tmux.conf(抜粋)

フォーカスしているペインをcolour234,フォーカスしていないペインをcolour240に設定しています。
背景色を変えるとペインボーダーの色が結構浮くので、pane-border-stylepane-active-border-styleでペインボーダーの背景色を合わせるのがお勧めです。

# .tmux.conf
set-option -g focus-events on #Neovim側にフォーカス情報を渡すのに必要なようです。
#フォーカスしているペインの設定
setw -g window-active-style bg=colour234
#フォーカスしていないペインの設定
setw -g window-style bg=colour240
#ペインボーダーの設定(お好み)
#set -g pane-active-border-style fg=green,bg=colour240
#set -g pane-border-style fg=white,bg=colour240

init.vim(抜粋)

フォーカスしているペインに私が使っているatom-dark-256の背景色と同じ234を、フォーカスしていないペインに23を設定しています。

※colorscheme設定により*NCのハイライト設定が上書きされてしまう為、使用される場合はcolorscheme設定より下に貼り付けてください。

"init.vim
"フォーカスしていない時の背景色(23を好きな値・色に変更)
let g:InactiveBackGround = 'ctermbg=23'

"Neovim内でフォーカスしていないペインの背景色設定
execute ('hi NormalNC '.g:InactiveBackGround)
execute ('hi NontextNC '.g:InactiveBackGround)
execute ('hi SpecialkeyNC '.g:InactiveBackGround)
execute ('hi EndOfBufferNC '.g:InactiveBackGround)

"Neovim自体からフォーカスを外したりした際の切替設定
"(フォーカスした時の設定はcolorschemeに合わせて変更)
augroup ChangeBackGround
autocmd!
" フォーカスした時(colorscheme準拠に切替)
autocmd FocusGained * hi Normal ctermbg=234 " :hi Normalで取得した値
autocmd FocusGained * hi NonText ctermbg=234 " :hi NonTextで取得した値
autocmd FocusGained * hi SpecialKey ctermbg=234 " :hi SpecialKeyで取得した値
autocmd FocusGained * hi EndOfBuffer ctermbg=none " EndOfBufferの設定は恐らくclearなのでnoneを入れる
" フォーカスを外した時(フォーカスしていない時の背景色に切替)
autocmd FocusLost * execute('hi Normal '.g:InactiveBackGround)
autocmd FocusLost * execute('hi NonText '.g:InactiveBackGround)
autocmd FocusLost * execute('hi SpecialKey '.g:InactiveBackGround)
autocmd FocusLost * execute('hi EndOfBuffer '.g:InactiveBackGround)
augroup end

こんな感じで使っています。

所感

もやもやが解消されました。
更なるもやもや解消のために全てのctermbgを変更するようにしてもいいような気がしましたが、
見分けを付けるという観点では不要ですね。

参考

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。