terminal emulator の dotfiles 管理を完全に理解した

## はじめに

最近、Macbook Pro を注文し、この記事が投稿されるころには、PC のセットアップをすることがわかっています。
そのため、今使っているターミナルなどの開発環境を dotfiles に移植して、引っ越し作業を簡略化したいと考えています。

[前回](https://qiita.com/yasudanaoya/items/8b928cfadbf702108ba3)の続きでもあります

その過程の中で、ターミナルエディタの config について完全に理解をしてしまったので記事を書きます。

### 成果物

先に成果物の [dotfiles](https://github.com/yasudanaoya/dotfiles) のリンクを

## 本編

僕が MacOS を使うようになってから、ターミナルはずっと [iTerm2](https://github.com/gnachman/iTerm2) を使っていました。
理由は特になく、「最初に使って、設定が気に入ったから使い続けてる」という一番良くない理由です。

### iTerm2 の課題

#### 課題1 設定の復元が難しい
僕の iTerm2 には

- hotkey(ctrl key 2回入力) で全画面表示
- ターミナルの opacity 設定
- alt + ←, alt + → でそれぞれ単語移動

これくらいの設定が入っていました。

設定自体は3分くらいでできるのですが、透明感の微調整などめちゃくちゃ面倒でした。
また、config file を export して、新しい端末で import するってこともできたみたいなのですが、なんだかわからないけどできませんでした。

こういう `<input type="range">` みたいな要素を何度も同じ値に調整するのは、人間のやることではない。
何かのファイルに値を入れて、それをアプリが反映してくれよ。
って感じですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321282/3b2197db-f227-0b93-2060-dc9cc3e15a2e.png)

#### 課題2　色々できすぎる

iTerm2 ってめちゃくちゃリッチですよね
window のタブ管理に、分割、マウスアクションも大体できる。
この辺便利で使ってはいるのですが、多分使ってない機能もあるなと。

せっかく新しい PC にするのなら、無駄は省きたいというのが人の性。

大体、
**window のタブ管理も、分割も、全部 tmux でできるじゃねえか。**
と気づいてしまいました。

とすると、なんなら、これらの機能は要らない、むしろ邪魔ですよね
tmux で window 管理して、ターミナルエミュレータでも window 管理するなんて馬鹿げてる。

##### 代わりのターミナル Alacritty 

今回 [Alacritty](https://github.com/alacritty/alacritty) という比較的新しく、軽量なターミナルエミュレータを発見しました

これは、config を yaml で記載することができ、
ターミナルで表示する font, color, key bind まで、を管理することができます

また、タブ管理などのリッチな機能は何もありません。
そこにはターミナルエミュレータが存在するだけです。

実際に設定ファイルを編集していきます

```yaml:dotfiles/alacritty/alacritty.yml
window:
  decolations: buttonless
  startup_mode: SimpleFullscreen

background_opacity: 0.85

key_bindings:
  - { key: Right, mods: Alt, chars: "\x1BF" }
  - { key: Left,  mods: Alt, chars: "\x1BB" }
```

こんな感じで以下の機能は満たすことができます

- ターミナルの opacity 設定
- alt + ←, alt + → でそれぞれ単語移動

`hotkey(ctrl key 2回入力) で全画面表示` だけまだ満たせていません。

当然、 Alacritty には hotkey なんていうリッチな機能はありません（多分）

ではどうするのか

##### Hammerspoon の導入

[Hammerspoon](https://github.com/Hammerspoon/hammerspoon) は OS X で lua で書かれたスクリプトを実行してくれるアプリケーションです。

lua でスクリプトを書いて、それを dotfiles で管理すれば、差分も追えるし、何よりターミナルエミュレータ以外の hotkey をカスタマイズできるので、使われるシーンが広いです。

設定ファイル

```lua:dotfiles/hammerspoon/init.lua
hs.hotkey.bind({"ctrl"}, "p", function()
  local alacritty = hs.application.find('alacritty')
  if alacritty:isFrontmost() then
    alacritty:hide()
  else
    hs.application.launchOrFocus("/Applications/Alacritty.app")
  end
end)
```

control + p で、とりあえず、 Alacritty の表示制御ができるようになりました。

でも、僕がやりたいのは、control の duble tap なんですよね。

ということで探しました。

一つの gist にたどり着きました。
https://gist.github.com/asmagill/c38f75fff9d9ef43d1226329fc1436e4

今回はこちらをちょっと修正して、

```diff_lua:dotfiles/hammerspoon/init.lua
- alacritty = hs.application.find('alacritty')
-   if alacritty ~= nil and alacritty:isFrontmost() then
-     alacritty:hide()
-   else
-     hs.application.launchOrFocus("/Applications/Alacritty.app")
-     local alacritty = hs.application.find('alacritty')
-     alacritty.setFrontmost(alacritty)
-     alacritty.activate(alacritty)
-  end
+  ctrlDoublePress = require("ctrlDoublePress")
```

```diff_lua:dotfiles/hammerspoon/ctrlDoublePress.lua
module.action = function()
- alert("You double tapped ctrl!")
+ alacritty = hs.application.find('alacritty')
+   if alacritty ~= nil and alacritty:isFrontmost() then
+     alacritty:hide()
+   else
+     hs.application.launchOrFocus("/Applications/Alacritty.app")
+     local alacritty = hs.application.open('alacritty')
+     alacritty.setFrontmost(alacritty)
+     alacritty.activate(alacritty)
+  end
end
```
これで control の2回入力で Alacritty が動くようになりました。


#### 備考
書くまでもないですが、dotfiles 配下に `dotfiles.sh` を用意して、

```sh:dotfiles/dotfile.sh
XDG_CONFIG_HOME=$HOME/.config

echo 'terminal'
if [[ ! -e $HOME/.hammerspoon/init.lua ]]; then
  ln -s $PWD/hammerspoon/init.lua $HOME/.hammerspoon/init.lua
fi
if [[ ! -e $HOME/.hammerspoon/ctrlDoublePress.lua ]]; then
  ln -s $PWD/hammerspoon/ctrlDoublePress.lua $HOME/.hammerspoon/ctrlDoublePress.lua
fi

if [[ ! -e $XDG_CONFIG_HOME/alacritty ]]; then
  mkdir -p $XDG_CONFIG_HOME/alacritty
fi
if [[ ! -e $XDG_CONFIG_HOME/alacritty/alacritty.yml ]]; then
  ln -s $PWD/alacritty/alacritty.yml $XDG_CONFIG_HOME/alacritty/alacritty.yml
fi
```

こんな感じのことをしてます。

mkdir をしている理由は
Alacritty は入れたら勝手に home にディレクトリを作るとかそういうリッチな機能はついｔ（ry

### dotfiles の課題

#### 課題1 新しい mac には git が入ってないんじゃないの？？

新しい macbook には当然 git が入ってません。
ではどのように dotfiles を clone するのか。

否！

clone はしない！！

README.md に

```md:README.md
``sh
curl -sf https://raw.githubusercontent.com/yasudanaoya/dotfiles/main/dotfile.sh | sh -s
``

<!-- Qiita で md のコードブロックの中に ``` コードブロックの記号を入れるとうまく動かないので、バッククォーツ2つにしてます。。。 -->
```

と記載しておきます。

あとはこれを terminal で実行するだけ。

これを思いついた時、流石に自分を天才だと思いました。
多分動くはず

### その他の色々な課題

#### iTerm2 を卒業したことでタブ管理ができなくなった!!

tmux を入れることで解消!!!

#### editor の設定もなんとかしたい

VSCode が GitHub 連携できてなんかうまいこと言ってるので問題ない！！！
あと neovim も入れて、 vimrc もとい init.vim を dotfiles で管理してるので、問題ない!!!

#### なんか Big Sur にしてから brew-file が動かない!!!
動かないのでもう使わない！！！
知らん！！

```shell
$ brew bundle dump --force
```
これで動くからもういい！！！

##### brew-file の課題について

勢いだけですっ飛ばせない内容なので、ちょっと触れていきます。

元々 Brewfile の管理に僕は、 homebrew-file というアプリを使ってました。

homebrew-file は brew install/uninstall すると自動で Brewfile を編集してくれる便利な子だったのですが、

macOS のアップデートの影響で、どうやら mas の操作ができなくなっていることが影響です。

ちなみに mas とは、 AppStore のアプリを cli でインスコできるアプリです。
AppStore 経由なので、当然 apple ID でログインしないといけないのですが、そのログインができない issue が物凄い溜まってます。

https://github.com/mas-cli/mas/issues/438

mas にログインできないと何が困るかというと、homebrew-file が mas でインストールしたアプリの管理もできちゃうので、それがログイン情報がないので、コケる。って感じで負の連鎖が起こってます。

https://github.com/rcmdnk/homebrew-file/issues/110

なので、一旦は使わない方針にしました。

## 終わりに

```shell
$ tree -L 2 -a  
.
├── .gitconfig
├── .gitignore
├── .gitignore_global
├── .gitmodules
├── Brewfile
├── README.md
├── alacritty
│   └── alacritty.yml
├── dotfile.sh
├── hammerspoon
│   ├── ctrlDoublePress.lua
│   └── init.lua
├── images
│   └── wallpaper.jpeg
├── peco
│   └── config.json
├── settings.json
├── tmux
│   ├── installer.sh
│   └── tmux.conf
├── vim
│   ├── .vimrc
│   └── toml
└── zsh
    ├── .gitignore
    ├── .zcompdump
    ├── .zsh_history
    ├── .zsh_sessions
    ├── .zshenv
    ├── .zshrc
    └── submodules
# 一部の `.git/` とかは取り除いてます。
```

大体こんな感じになってます。

結構いい感じに dotfiles が育ってきていて、
terminal の設定や、hotkey までもが dotfiles で管理できて幸せって感じです。

これでいつでも新しい macbook を買えるね！！

終わり！