- 投稿日:2020-02-25T18:37:56+09:00
【fish 版】ターミナル起動時に tmux の既存セッションをアタッチ
この記事なに?
@ssh0 さんの [tmux] 端末起動時に自動で新規セッションを作成 or 既存セッションにアタッチ - Qiita
という記事で解説されていた zsh の設定を、 fish 版に書き直してみたので紹介します。
軽くググってみても fish + tmux という環境で、ターミナル起動時に tmux の既存セッションをアタッチする記事がなかったので、備忘録を兼ねて書いておくことにしました。実現したいこと
元記事で実現されていたのと同じ機能を fish で再現します。
- ターミナル起動時に tmux のセッションが無ければ新しくセッションを作る
- ターミナル起動時に tmux のセッションが残っていれば、セッションを選んでアタッチする
- セッション選択時、
esc
キーを押すと tmux は起動しない- tmux のセッションをアタッチするのは fish がログインシェルで起動されたときのみ
前提
- fish + tmux のターミナル環境を使っている
~/.config/fish/config.fish
がなにかの説明はしないので、わからない方は別途調べてください?- バージョン
- fish >= 3.1
- tmux >= 3.0
config.fish
早速ですが、完成品の
config.fish
です。function attach_tmux_session_if_needed set ID (tmux list-sessions) if test -z "$ID" tmux new-session return end set new_session "Create New Session" set ID (echo $ID\n$new_session | peco --on-cancel=error | cut -d: -f1) if test "$ID" = "$new_session" tmux new-session else if test -n "$ID" tmux attach-session -t "$ID" end end if test -z $TMUX && status --is-login attach_tmux_session_if_needed end1. ターミナル起動時に tmux のセッションが無ければ新しくセッションを作る
セッションが残っているかどうかは
tmux list-sessions
を実行すればわかります。
tmux list-sessions
の結果を代入したID
が0文字であれば、セッションは無いので、新しいセッションを作ります。fish は
=
で変数に代入できないので、代わりにset
コマンドを使います。
コマンドの実行結果を変数に入れるには、コマンドを()
で囲みます。set ID (tmux list-sessions) if test -z "$ID" tmux new-session return end2. ターミナル起動時に tmux のセッションが残っていれば、セッションを選んでアタッチする
if test -z "$sessions"
の条件を満たさなかったということは、セッションが残っているということなので、セッションをアタッチします。
まず、peco
でアタッチするセッション一覧をユーザに選ばせます。
fzf
を使っている方は適宜読み替えてください。
tmux list-sessions
の結果からセッションIDだけを切り出して、tmux attach-session
を実行しています。set ID (tmux list-sessions) # peco でセッションを選んでもらう set ID (echo $ID | peco | cut -d: -f1) #略... else if test -n "$ID" tmux attach-session -t "$ID" endあと、セッションが残っていても、新しくセッションを作れるように、
Create New Session
という文字列をセッション一覧の最後に入れてます。set new_session "Create New Session" set ID (echo $ID\n$new_session | peco | cut -d: -f1) if test "$ID" = "$new_session" # "Create New Session" を選ぶと新しくセッションを作る tmux new-session else if test -n "$ID" tmux attach-session -t "$ID" end3. セッション選択時、
esc
キーを押すと tmux は起動しないこれは
peco
を使ったときの実装ですが、peco
をキャンセルしたときの挙動をエラーにしておくと実現できます。
peco --on-cancel=error
と書くと、peco
をecs
キーでキャンセルしたとき、ID
の文字列が 0文字になります。
なので、esc
キーを押したときはelse if test -n "$ID"
を満たさなくなり、 tmux はセッションをアタッチしなくなります。set new_session "Create New Session" set ID (echo $ID\n$new_session | peco --on-cancel=error | cut -d: -f1) if test "$ID" = "$new_session" tmux new-session else if test -n "$ID" tmux attach-session -t "$ID" end4. tmux のセッションをアタッチするのは fish がログインシェルで起動されたときのみ
fish は
status
というコマンドで fish の実行状態を確認できます。
status
はいろいろな状態を判定できますが、今回はログインシェルとして起動しているか知りたいので、status --is-login
を使います。
よって、ターミナル起動時かつログインシェルとして fish が起動された、という条件は以下のように書きます。if test -z $TMUX && status --is-login attach_tmux_session_if_needed endまとめ
こんな感じで動きます。
新規セッションを作成
既存のセッションをアタッチ
- 投稿日:2020-02-25T12:13:43+09:00
docker-machineのデフォルトOS,shellを確認してみました
結果
ディストリビューション:Core linux
シェル:bash
ディストリビューションはコアリナックスというミニマムなものでした。
core linuxシェルは有名なbashでした。
状況
docker-machineで立ち上げた時linuxっぽいものが
動いているけどディストリビューションは何だろう?
という疑問が出てきたので確認してみました。以下docker、docker-machineが動く前提です。
確認した手順|コマンド
Verification.sh#verificationという名前の仮想マシンを作る $ docker-machine create verification #verificationにsshで入る $ docker-machine ssh verification #ここからはverification内でのコマンド実行 #ディストリビューションを確認するコマンド実行 $ cat /etc/issue Core Linux #シェルを確認 $ echo $SHELL /bin/bash備考
ディストリビューション(正確にはlinuxの系列)や
シェルの違いでコマンドが違ってくるので自分用備忘録として書きました。
- 投稿日:2020-02-25T11:27:15+09:00
Fish shellアップデート時のエラー対応
UbuntuのパッケージをアップデートしたらFish shellがエラーを吐くようになった
最近(2020/02/25)、Ubuntuのアップデートリクエストに従ってアップデートを行ったところ、Fish shellの起動時に次のようなエラーが発生するようになった。aptの履歴によるとfish shellが更新されている。
発生しているエラー
~/.config/fish/functions/fish_prompt.fish (line 162): Expected a string, but instead found a '&' git rev-parse --quiet --verify HEAD > /dev/null ^&1; or set empty 1 ^ from sourcing file ~/.config/fish/functions/fish_prompt.fish in command substitution source: Error while reading file '/home/dev-user/.config/fish/functions/fish_prompt.fish' Welcome to fish, the friendly interactive shellまた、エラーだけでなく、プロンプトも次のようにいつもと違う表示になっている。
dev-user@thinkpad /home/dev-user >
自分の環境の場合、$HOMEにいるときは「 > 」のようにシンプルに表示されるのが正しい。
環境
Ubuntu 18.04.4 LTS
fish-common:amd64 (3.0.2-1~bionic, 3.1.0-1~bionic)
fish:amd64 (3.0.2-1~bionic, 3.1.0-1~bionic)ThinkPad X1C 2017にUbuntuをデスクトップOSとしてネイティブインストールしています。
ターミナルソフトはterminator 1.91を使っています。応急処置
原因と思われる
~/.config/fish/functions/fish_prompt.fish
の162行目は次のようになっている。git rev-parse --quiet --verify HEAD > /dev/null ^&1; or set empty 1「^&1」の部分が問題の様子。
fishで「^」はエラー出力を表しているようなので(参照)、ディスクリプタの合成をやろうとしてミスしているのだろうと想像して次のように変更。git rev-parse --quiet --verify HEAD > /dev/null 2>&1; or set empty 1とりあいず、エラーは消えている。
解釈
今回はエラー出力を標準出力に合成し、その結果をnullに渡すことによってすべての出力を非表示にして対応した。試しに標準出力を消さないパターンに変更したところ、フォルダを移動するたびにgit rev-parse ~~のコマンドが実行され、HEADと差分があるgit管理下のディレクトリではリビジョンなのかハッシュ文字列のようなものが表示されるようになった。プロンプトにそんな表示が現れるのはおかしな状況のため、エラー出力も含めて非表示にするのが実装者の意図だったのだと想像して上記対応を行ったけれど、あくまでご利用は自己責任で。
- 投稿日:2020-02-25T10:59:38+09:00
ls よりも exa を使おう!モダンな Linux コマンド達を紹介
はじめに
最近 GitHub で Rust 製の Linux コマンドを実装しているリポジトリをよく見かけるようになりました。使ってみるとカラフルでとてもオシャレな表示を行うコマンドが多くて便利でしたので、見つけたコマンドを一気に紹介していきたいと思います。
exa
まずは
ls
コマンドの代替である exa の紹介です。上記の画像を見ると分かる通り、カラフルで見やすいですね。右図のようにディレクトリのツリー表示にも対応しています。さらに
--icons
オプションを付けると、ファイルタイプに応じたアイコン表示も可能です。
bat
続いて
cat
コマンドの代替である bat の紹介です。https://github.com/sharkdp/bat
ファイルの拡張子に応じてソースコードを色付けして表示してくれます。また
less
のようなページャの機能も持っており、行数の長いファイルを渡すと自動でページャモードで開いてくれます。
hexyl
hexyl はバイナリダンプコマンド
od
の代替コマンドです。bat
の開発者と同じ方が開発しています。https://github.com/sharkdp/hexyl
バイナリをダンプすること自体があまり多くないかもしれませんが C++ を使った低レイヤの開発をしていると、まれにバイナリの中をダンプしたくなることがあります。
fd
続いては
find
コマンドの代替である fd です。こちらもbat
と同じ方が開発しています。
fd
は検索速度の速さがウリの検索コマンドです。find
に比べるとかなり速いです。検索時に.gitignore
で指定されたディレクトリは自動で無視してくれる機能が付いています(無視しないようにすることもできます)。
procs
procs は
ps
の代替コマンドです。https://github.com/dalance/procs
--tree
を付けると親プロセス・子プロセスの関係をツリー表示してくれます。
ripgrep
ripgrep は
grep
の代替コマンドです。https://github.com/BurntSushi/ripgrep
コマンド名は
rg
となっています。fd
と同じく、速さがウリになっています。また Visual Studio Code のクイックオープン (Ctrl + P) でもripgrep
が使用されています。まとめ
CLI がカラフルだと視認性が向上するので、開発もしやすくなるのではないかと思います。ぜひお試しください。