コマンドライン周りを大きくリニューアルした一年でした！

## はじめに

今年は業務内容的に、コマンドライン操作が増えた一年でした。

その効率化を図るとめに、特にゴールデンウィークの期間、

terminal アプリの変更やプロンプト周りの強化、bash から zsh へ移行と、dotfiles の整備をも行った。

その中で自分が気に入った設定を共有する。

## 主に出てくるキーワード

+ [alacritty](https://github.com/alacritty/alacritty)
+ [navi](https://github.com/denisidoro/navi)
+ [tmux](https://github.com/tmux/tmux)
+ [starship](https://github.com/starship/starship)

## [Terminal] alacritty

こちらは GPU-Accelerated Terminal Emulator として、qiita でも多く取り上げられていた。

最初は速度を体感してみたくて入れたが、まぁ、劇的な差は体感では得ていなかった。(tool入れ過ぎが問題かも)

ただし、こちらの設定ファイルは　yaml 一枚で、とてもシンプルである。
端末関係なく、dotfiles で集中管理したい自分にとっては、すっきりしたツールと思った。

元々 iTerm2 使っていた頃も、分割画面といったショートカットを使っていなかったため、すんなりと乗り換えた。

## [Terminal Session] tmux

tmux、 おおよそ去年から少し使い出したが、iTerm2 時代、起動時の tmux 作動をしていなかったため、使ったり使わなかったりしていた。

alacritty は以下の形で、常に立ち上げ時に tmux 入るようにしていることで、使い慣れてきた。

```
shell:
  program: /bin/zsh
  args:
    - -l
    - -c
    - "tmux"
```

また、拾い物の設定だったため、ちゃんとできることを知っていなかった。

改めて覗いていくと、マウスモードはとても便利だと知った。 gif で表示していますが、マウスモードにしたら、ctrl +c を押さずに、なぞるだけで、その範囲がコピーされる。

これの何がいいかというと、今年は業務上、terraform といった cloud 系の操作が多かった。
permission error 的な情報が出て、検索するシーンが多かった。
この機能のおかげで、エラーが出た瞬間、キーボードから手を離れ、マウスからブラウザに貼り付けといったフローがスムーズになるということでした。

![tmux_mouse.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86000/f08380b0-b1e7-273e-5ab8-bb5b1b2cb0c0.gif)

## [cheatsheet] navi

今年は docker ももちろん、kubernetes 周りも多く触ってきた。

それによって、操作するコマンド量が大量になっている。

例えば、

`kubectl exec -it my-pod --container main-app -n my-namespace  -- /bin/bash`

docker の概念を覚えて、
オプションに慣れたとしても、
autocomplete を bash/zsh に登録したとしても、
上記を打ち込むのも苦痛でしかないよね。

でも navi を導入したら、kubessh とか、自分の定義次第、速やかに実行ができる。



```
% kubessh

# exec_con
kubectl exec -it <my-pod> --container <main-app> -n <my-namespace>  -- /bin/bash
```

(gif 例は環境が実行できる状態ではないため、`--print` 加えてコマンド組み立てモードにしている)
![kubessh2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86000/143a4386-6a5e-bd97-5cc9-e9c292251657.gif)


他にも、文字と英数字限定の乱数を速やかに指定することや、
terraform apply する時に、画面上の表示のみならず、常に一定のフォルダー配下に出力することや、
ansi escape code をログから取り除くワンライナーを速やかに呼び出す cheatsheet を持つようにしている。

```
% rand

# rand num
openssl rand -base64 <num> | tr -dc 'a-zA-Z0-9' | fold -w <num> | head -1

% terraform, tf

# foo init
GOOGLE_APPLICATION_CREDENTIALS=$HOME/credentials/foo.json terraform init

# foo plan
GOOGLE_APPLICATION_CREDENTIALS=$HOME/credentials/foo.json terraform plan

# foo apply
GOOGLE_APPLICATION_CREDENTIALS=$HOME/credentials/foo.json terraform apply 2>&1 |tee $HOME/infra/apply_log/<name>.log

% noansi

# noansi
cat <name>.log| sed $'s/\e\\[[0-9;:]*[a-zA-Z]//g]' |tee <name>_noansi.log
```

## [prompt] starship

冒頭にも書いたように、今年は bash から zsh へ乗り換えた。
乗り換えの理由の一つは、zsh のプロンプトツールの方がチョイスが多そうと思ってたから。
特に、今年は、クラウドの操作で、間違ったリージョンや、間違った gcp project 状態で操作するのを避けたいのが目的でした。

ただし、navi を活用する以前、コマンド history を強く依頼していたため、いきなり全部の zsh 操作になると、うまくコマンド打てない人間になってしまう。

最初は zsh 系の powerlevel10k を狙っていたが、できれば設定は一つに済ませたい気持ちで、辿り着いたのは starship でした。
starship は powershell, bash, zsh, fish とも使えるようになっている。

gif で示したように、kubernetes の context が prompt に表示されるようになる。

![kcontext2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86000/4ae8a9e4-3c88-3b99-fb5b-3d5e2ce25925.gif)

まぁ、最後にですが、コマンドラインに楽しみを増す意味で、絵文字を symobol に加えた。

しかも、v0.45 から、失敗したコマンドには異なるシンボルを設定できるようになっている。

```
[character]
success_symbol = "🍜➜"
error_symbol = "🤬➜"
```

![symbol.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86000/b274f19b-a21f-7a25-b0ff-3b4f482b1003.gif)

楽しいプロンプトをみて〜効率も上がるじゃないかなw

## まとめ

dotfile とかを仕上げるのは大変です。
「全部導入しないと損する」といったおすすめは普段全くしていないです。
下手して依存する状況も作ってしまう。

しかし、クラウドとかを中心に、コマンド操作が複雑になったり、
複数のバーチャルマシーンやプロジェクトにアクセスする業務シーンがあると、
適切な簡略化や、防御策を加えることで、後々面倒になることを避けると、私は思う。

この投稿でお役に立てるパターンがあると幸いです。