ハイパーマッスルエンジニア

Vim、ShellScriptについてよく書く

俺よりiTerm使いこなしてるやつおる?

f:id:rasukarusan:20190413180124p:plain:w400

お前らはまだiTermの本当の力を知らない

純正Terminal、Hyper、Alacritty等を使ってるやつ、今すぐ捨ててiTermに乗り換えたほうが良い。
iTermから乗り換えた人も今一度iTermのことを知ってほしい。きっと知らない機能があるはず。

目次

Shell統合をさっさとしろ

これから色々と紹介していくが、とりあえずShell統合(Shell Integration)は済ましてこい。話はそれからだ。

www.iterm2.com

下記コマンドでインストールは一瞬で終わる。

curl -L https://iterm2.com/misc/install_shell_integration.sh | bash

また、気に入らなかったらインストール後に.zshrcに追記される1行を削除するだけで良いのでお手軽だ。

# 下記を削除またはコメントアウト
test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh"

Terminal上にファイルをドラッグアンドドロップしたらSSH先でも送信できるとかあるから、まじで入れたほうが良い。

Copy ModeでTerminal上を自由に動く

まずはこれ。
Terminalに出力された文字をコピーするとき、一々マウスカーソルでピッとコピーしてるやつなんていないと信じたい。
iTerm使ってるなら今すぐCmd+Shift+Cを押せ。Terminal上をVimライクに自由に動き回ることができてコピーが可能だ。

f:id:rasukarusan:20190413165650g:plain
CopyModeでTerminal上を自在に動く

tmuxでも出来るよってやつはとりあえず引っ込んでろ。

Toolbeltで痒い作業は行う

iTermには実は通常の画面の他に、もう一つ作業スペースが存在する。
それが「Toolbelt」。Cmd+Shift+BでToolebeltを表示できる。

f:id:rasukarusan:20190413165741g:plain
Toolbeltでノート、ジョブ、ペースト履歴を参照

Toolbeltでは、

  • ノート
  • ディレクトリ履歴
  • ペースト履歴
  • ジョブ
  • コマンド履歴
  • etc...

等々結構いろんなものを表示できる。詳しくはメニューを見てくれ。

f:id:rasukarusan:20190413165925p:plain:w400
Toolbeltで利用できる作業一覧

ただぶっちゃけ全部コマンド上で実現できることなので、あまり使っていない。
ビジュアル的にかっこいいから表示させている。

バッジ機能を利用してSSH先のホスト名を表示する

バッジって何やねんという方のために。

f:id:rasukarusan:20190413173317g:plain
SSHした時にiTerm上にホスト名を表示する

こんな感じで右上に自分の好きな文字列を表示することができる。iTerm上の設定なので、無論SSHした後でも有効。

バッジの設定方法は、Preferences > Profiles > Generalで以下の用に\(user.任意の名前)を設定する。

f:id:rasukarusan:20190413171939p:plain:w500
バッジの設定

その後.zshrcに以下を記載。

# Shell Integration済みであること
iterm2_print_user_vars() {
  iterm2_set_user_var 任意の名前 $(my_badge)
}
# バッジで表示する文字列を返す関数
function my_badge() {
    if [ "$USER" = "root" ];then 
        echo "rootだよ"
    else 
        echo "rootじゃないよ"
    fi
}

iTermを再起動すればバッジが表示される。
表示させたい文字列をShellスクリプトで設定できるからかなり応用は効くと思う。

が、もう少し気楽にバッジを設定したい。
そんなときは直接Shellで書き換えることも可能。

function badge() {
    printf "\e]1337;SetBadgeFormat=%s\a"\
    $(echo -n "$1" | base64)
}

f:id:rasukarusan:20190413173633g:plain
コマンドでバッジを設定する

SSHする時にバッジでホスト名を表示するのは上記を利用して、下記のような形でスクリプトにしている。

.zshrc

function badge() {
    printf "\e]1337;SetBadgeFormat=%s\a"\
    $(echo -n "$1" | base64)
}

function ssh_local() {
    local ssh_config=~/.ssh/config
    local server=$(cat $ssh_config | grep "Host " | sed "s/Host //g" | fzf)
    if [ -z "$server" ]; then
        return
    fi
    badge $server
    ssh $server
}

トリガーを利用して五感に訴える

トリガーはProfile > Advanceから設定できる。拾いたい文字列を正規表現で設定し、引っかかった場合にしたいActionを設定するという流れ。

f:id:rasukarusan:20190413170454p:plain:w500
トリガーの設定

f:id:rasukarusan:20190413170249g:plain
rootでログインしたときのみ赤くする

これの良いところはiTermで設定をするので、SSH先等で設定せずに済むところ。本番サーバーなどでzshrcの設定を入れられないようなところでも動作するのがGOOD。

あとは諸事情でデバッガが使えず、printfvar_dumpなど出力でしかデバッグできないときちょっと便利かもしれん。if文の中で「通ったよ」みたいなデバッグ文を仕込んで、それが表示されてるか目で確認するような想定ね。

f:id:rasukarusan:20190413170600g:plain
デバッグ文をトリガーに設定して後から確認しやすいように

ただ、Vimなどで開いた時も拾われてしまうので正規表現はきつめに設定すると良い。

f:id:rasukarusan:20190413175411p:plain
Vimで書いた文字列も認識されてしまうので少々使いづらい

また、色を変えるだけではなくコマンドも実行できる。

f:id:rasukarusan:20190413175234g:plain
トリガーで任意の文字列が出現したらコマンド実行

上記はActionに「Run Command」、「Regular Expression」にroot@を設定、Parametersには「(date; echo "rootになりました") >> ~/Desktop/hoge.txt」とセットし、「root@という文字列が出現した場合に設定したコマンドを実行する」という設定をした例。

このように特定の文字列が出現されたらコマンドを実行する、といったことも出来るので応用範囲は広い。広すぎて何に使えるかわからん。

マークを設置して飛びたい場所に飛ぶ

iTermはCmd+Shift+Mでマークを設置できる。マークを設置すると一番左にが表示される。
設置後はCmd+Shift+JまたはCmd+Shift+↑↓で設置箇所に移動することができる。
マークを削除したいときはCmd+Shift+KでOKだ。

f:id:rasukarusan:20190413170904g:plain
マークを設置して一瞬でジャンプする

インストールコマンドなど、長いコマンドを打つ前に設置しておけば、実行が終わった後移動して上から順に処理を追うことができる。

終わり

タイトル煽ってしまっているけど、シンプルにiTermに感動したので共有したかった。
普段自分がなんとなく使っているツールも一度は本気を出して調べると知らない機能が結構あるよね。
iTermはDocumentがシンプルに見えて実はとっても充実しているので、さすがNo.1。