ターミナルから離れたくない…Tmux(&Neovim)の設定例🖊
この記事の概要
tmuxとneovimを組み合わせている様子…
こんにちは!食パン🍞と申します🏜
普段はフロントエンドを中心にパソコンをカタカタしている者です💻
私は普段のコーディング時のメインエディタとして、ターミナル環境下で、Neovimを用いています。
(Neo)Vimは、その独特な操作体系ゆえ慣れるまでがちょっぴり大変ですが、一度習熟すると非常に効率よくテキスト操作を行えるため、日々愛用しています。
また、開発作業の過程では、複数の画面を都度切り替えながらコーディングをしたり、複数のシェルを用いてコマンド操作を実行したくなる機会が多々あります。
例えば、
- Viteでフロント開発環境を立ち上げてリアルタイムでコード変更を確認したい
- docker composeで複数のコンテナを立ち上げつつターミナルでログを確認したい
- それはそれとしてNeovimも並行して使いたい
といった具合です。
そこで、ひとつのターミナル(端末)内で、擬似的に複数のシェルを立ち上げ管理することを可能にするターミナル・マルチプレクサツール(terminal multiplexer)、Tmuxを組み合わせています。
これにより、ターミナル環境から離れることなく、多くの開発作業を完結させることが可能になります🍞
本記事では、NeovimとTmuxを組み合わせて、ターミナル環境下で快適に開発作業を行うためのTmuxの設定の一例や、実際の作業イメージなどをごく簡単に示せたらと思います。
なお、今回の記事ではNeovimの個別のプラグイン設定などは省略しています。
Neovimの詳細な設定などが気になる方は、以前投稿しました、下記の記事などを参考いただければ幸いです。
TmuxとNeovimを組み合わせた作業フロー
作業の流れ(一例)
このGif画像では、おおむね、以下の作業をターミナル内で実施しています
(なお、この一連の作業ではキーボードのみに触れており、マウスは操作していません)
-
tmux
コマンドでTmuxの新規セッションを立ち上げる - 事前に設定しておいたFishシェルの関数
ide
を実行して、Tmuxの画面を3つのペイン(≒分割された画面のこと)に分割する - 右下のペインで
npm run dev
を実行し、Next.jsの開発環境を立ち上げる - 左下のペインでなんとなくディレクトリ構造をちらっと確認する
- 上半分のペインでNeovimを立ち上げる
-
Works.js
というファイルを開き、コードフォーマッターのPrettierを実行してコードを整える - ファイルの変更を保存する
- Tmuxで別のウィンドウを開く
- Git操作を効率よく行えるTigを起動し、変更差分を確認→ステージングする
-
git status
で、差分が正常にステージングされ、コミットする準備ができたことを確認する。
(以後、コミットしたりなんやかんやする作業に繋がっていく…)
大体いつもこんな感じで、ターミナル内で作業を完結させることが多いです🏜
ターミナルで作業を行うと、
- 楽しい
- かっこいい(※個人の感想です)
- ターミナル(≒自分が利用しているシェル)の挙動や設定に詳しくなる
- 常にコマンドで作業を行うため、CLIでの操作全般に対する抵抗感がなくなり、理解も深まる
- Tmuxなど複数のアプリを組み合わせることで、マウスをほとんど操作せずに作業を行うことが可能になる
- シェルを用いた作業が非常にやりやすい
といったメリット(?)があります。
以下、いくつかの要素について個別に補足を加えていきたいと思います。
Tmux
Tmuxを用いることで、複数の作業を一つのターミナル内で並行して行うことが可能になります。
インストール方法
基本的な操作方法や概念については、下記の記事がわかりやすく、参考になります。
Tmuxは.tmux.conf
と呼ばれる設定ファイルを編集することで、各種キーバインドや挙動などを自分好みにアレンジできます。
ターミナルでの開発作業を快適に行うために、私は.tmux.conf
を以下のように設定し、カスタマイズしています。
# prefixキーをC-qに変更
unbind C-b
set -g prefix C-g
# PaneをVim-likeに移動する
bind -r k select-pane -U
bind -r j select-pane -D
bind -r h select-pane -L
bind -r l select-pane -R
# ステータスバーの色を設定する
set -g status-bg "colour60"
set -g status-fg "colour236"
# window-status のフォーマットを指定する
setw -g window-status-format "#I:#W "
# カレントウィンドウの window-status のフォーマットを指定する
setw -g window-status-current-format "#[fg=colour254,bg=colour67] #I:#W"
# ステータスバーの右側の表示内容を空に設定
set -g status-right ""
#マウス操作を有効にする
set -g mouse on
#コピーモード時のキーバインドをVimに
setw -g mode-keys vi
# ヴィジュアルノーティフィケーションを無効にする
setw -g monitor-activity off
set -g visual-activity off
# ステータスバーを上部に表示する
set -g status-position top
# checkhealth回避用
set -g escape-time 10
set -g focus-events on
# tmuxのコピーモードからクリップボードにコピー
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xsel -bi"
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xsel -bi"
設定の補足
# prefixキーをC-gに変更
unbind C-b # デフォルトのプレフィックスを解除
set -g prefix C-g # Ctrl + gをプレフィックスに設定
Tmuxを操作する際は、まず最初にプレフィックスキーを入力し、その後にTmux固有のキーボードショートカットを打ち込みます。
例えば、
- プレフィックスキーとして、
Ctrl + b
を打ち込む - (Tmuxがキーボードショートカットを受け付けるようになる)
- Tmuxの各種キーボードショートカットを入力する
といった形です。
デフォルトのプレフィックスキーは、Ctrl + b
に設定されていますが、個人的には少し押しづらいためCtrl + g
に変更しています。
# PaneをVim-likeに移動する
bind -r k select-pane -U # プレフィックスキーを押した後に、kを押すと上のペインへ移動
bind -r j select-pane -D # プレフィックスキーを押した後に、を押すと下のペインへ移動
bind -r h select-pane -L # プレフィックスキーを押した後に、hを押すと左のペインへ移動
bind -r l select-pane -R # プレフィックスキーを押した後に、lを押すと右のペインへ移動
複数のペイン間を、Vimっぽく移動できるようにしています。
冒頭のGif画像では分割された複数のペイン間をカーソルが移動していますが、これらの移動はこのキーバインドによるものです。
特にVim使いの方は、Vimの感覚でTmuxのペイン間を簡単に移動できるようになるため、個人的にイチオシの設定です👀
# ステータスバーの色を設定する
set -g status-bg "colour60"
set -g status-fg "colour236"
# window-status のフォーマットを指定する
setw -g window-status-format "#I:#W "
# カレントウィンドウの window-status のフォーマットを指定する
setw -g window-status-current-format "#[fg=colour254,bg=colour67] #I:#W"
# ステータスバーの右側の表示内容を空に設定
set -g status-right ""
# ステータスバーを上部に表示する
set -g status-position top
ステータスバー(Gif画像では、ターミナル上部に表示される紫色のバー)の見た目などを設定しています。個人的にはシンプルで装飾の少ない表示が好みのため、いくつかの要素を非表示にしたりしつつ、色を調節しています。
#コピーモード時のキーバインドをVimに
setw -g mode-keys vi
# tmuxのコピーモードからクリップボードにコピー
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xsel -bi"
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xsel -bi"
Tmuxのコピーモード(Tmux上で文字列等をコピーできるモード)でのキーバインドは、デフォルトではEmacsスタイルになっています。
個人的にはVimっぽいキーバインドで統一したいため、setw -g mode-keys vi
とすることで、コピーモードのキーバインドをVi(m)スタイルに変更しています。
また、Tmuxのコピーモードでコピーした文字列を、システムのクリップボードで共有するための設定も記述しています(これを設定しておかないと、Tmux上でコピーした文字列がシステムのクリップボードに入らずちょっと不便です。)
参考:
以上の設定を行うことで、マウスを触らずにキーボードのみでペインを(Vimっぽいキーバインドで)自由に移動したり、文字列をコピーしたりすることが可能になります。
Tmuxの主要なキーバインドを覚えるまでがやや大変ですが、一度覚えてしまうとかなり効率良く作業できます👍
シェルの設定
Tmuxを使うようになると、なにかとコマンドを打ち込む機会も増えます。
私は普段、Fishシェルを用いているのですが、設定ファイルであるconfig.fish
にエイリアスなどを設定することで、少ない文字数で効率よくコマンドを打ち込めるようにしてます。
#一部のみ抜粋
if status is-interactive
set -g fish_greeting
#alias
alias tp='trash-put'
alias dstart='systemctl --user start docker-desktop'
alias dstop='systemctl --user stop docker-desktop'
alias dcon='docker container'
alias la='eza -la --icons'
alias ll='eza -l --icons'
alias lt='eza -T -L 3 -a -I "node_modules|.git|.cache" --icons'
alias t='tmux' #tmuxを起動
alias tse='tmux new -s' #tmuxの新規セッションを名前付きで開始
alias tki='tmux kill-server' #tmuxのセッションを削除
alias vim='nvim'
alias lg='lazygit'
alias g='git'
alias com='cz c'
end
また、複数のTmuxのペインを一発で展開するfish関数も作っています。
function ide
tmux split-window -v -p 25 #ウィンドウを垂直に分割し、新しいペインを作成
tmux split-window -h -p 50 #新しく作成されたペインをさらに水平に分割
end
Gif画像では、このide
関数で、3つのペイン(上・左下・右下)を展開しています。
シェルの設定(特にエイリアス)は、簡単に記述できる割に得られる恩恵が大きいため、Tmuxの設定を編集するついでに整備すると、日々の作業をかなり効率化できるとおもいます🤔
.gitconfigの設定
バージョン管理ツールのGitは、特段の設定なしでも扱うことができますが、.gitconfig
に設定を記述しカスタマイズすることで、より楽に各種Gitコマンドを用いることが可能です。
# 一部抜粋(1~2文字でコマンドを打てるようにエイリアスを設定)
[alias]
d = diff
su = status
b = branch
co = checkout
a = add
aa = add -A
cm = commit -m
# 現在いるブランチ名を取得してpushする
ps = "!git push origin $(git rev-parse --abbrev-ref @)"
cp = cherry-pick
# Gitのコミットログをグラフで表示する
ll = log --graph --date=relative --name-status --abbrev-commit
# # Gitのコミットログをグラフで表示する(シンプルに)
sl = log --graph --oneline --date=relative --abbrev-commit
df = difftool -y
mt = mergetool -y
先程のconfig.fish
上では、以下のように、
if status is-interactive
#alias
(省略)
# 'g'と打つと'git'になる
alias g='git'
end
g
と打つとgit
になるようにエイリアスを設定しています。
このため、コマンドラインで例えば、
$ g ll
と入力した場合、上記コマンドは、
$ git log --graph --date=relative --name-status --abbrev-commit
として展開されます。
ターミナル上で直接Gitコマンドを打ち込みたくなるタイミングは多々あるため、.gitconfig
にコマンドエイリアスを記述しておくと作業がかなり効率化できます👀
終わりに
ここまでの設定、
- ①Tmuxの設定
- ②シェルの設定
- ③
.gitconfig
の設定
をある程度整えれば、冒頭のGif画像のような作業フローが可能になります。
ターミナルでの作業を効率化したい方や、(Neo)vimをメインエディタとして扱ってみたい方、Tmuxの活用法が気になる方の参考になれば幸いです🍞
Discussion