LoginSignup
9
4

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-12-05

はじめに

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

前回の続きでもあります

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

成果物

先に成果物の dotfiles のリンクを

本編

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

iTerm2 の課題

課題1 設定の復元が難しい

僕の iTerm2 には

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

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

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

こういう <input type="range"> みたいな要素を何度も同じ値に調整するのは、人間のやることではない。
何かのファイルに値を入れて、それをアプリが反映してくれよ。
って感じですね
image.png

課題2 色々できすぎる

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

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

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

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

代わりのターミナル Alacritty

今回 Alacritty という比較的新しく、軽量なターミナルエミュレータを発見しました

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

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

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

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 は OS X で lua で書かれたスクリプトを実行してくれるアプリケーションです。

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

設定ファイル

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

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

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")
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 を用意して、

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 にディレクトリを作るとかそういうリッチな機能はついt(ry

dotfiles の課題

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

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

否!

clone はしない!!

README.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 が動かない!!!

動かないのでもう使わない!!!
知らん!!

$ brew bundle dump --force

これで動くからもういい!!!

brew-file の課題について

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

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

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

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

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

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

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

終わりに

$ 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 を買えるね!!

終わり!

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4