iTermをやめてVSCodeのターミナルに寄せる

背景

iTermをずいぶん長く使ってきたけど*1、VSCodeのターミナルが急速に進化しているので、乗り換えを検討した。

  • VSCodeが色々便利になってきた
    • 自分が使っている範囲だと、vimキーバインドも特に問題ない*2
    • 普段のコーディングはVSCode、コマンド操作くらいしかiTermは使っていない
    • 特にCopilot系の進化は目覚ましい、長い物には巻かれろというか長期的にはエコシステムに乗っておきたい
  • エディタだけでなく、ターミナルもそれに乗っかりたい
  • WrapなどAI系に特化したエディタもあるが、道具が増えるのはダルいので、VSCodeで巻き取りたい

担保したいこと

乗り換えにあたって、乗り換え後にも担保したいことが2つある。

1: ホットキーで一撃で呼び出せる

  • エンジニアなので、何はともあれブラウザと並んで一番使うアプリケーションであるターミナルはさっと呼び出せるようにしたい
    • iTermはこれが設定で簡単にできた
    • 自分はCtrl-iに割り当てており、一日に数百回は叩いていると思う

2: ウィンドウを透過させてターミナルと他のウィンドウを同時に眺められること

  • これは他の人にとってはそこまで重要じゃないかもしれないけど、自分にとっては割と重要
  • 自分は卓上だけではなく、膝の上にPC乗せて作業することなども多い
    • その場合、ディスプレイやMacProの1枚のみ
    • ターミナルのウィンドウ透過して見れると、コード以外のところにブラウザを置いといて、それを参照しながらコードを書くといったことができて便利
    • 外付けディスプレイのある/なしに関わらず一度に情報量が出るので、乗り換え後も担保したい

調査したこと & 解決方法

ホットキーで呼び出せるか => hammerspoonで割り当てで対応

ここは色々解決方法がありそうだが、hammerspoonでぶん殴って解決した。hammerspoon、日常生活ではそんなに使うことがないが、こういうときは道具箱に入れておくとすごく便利。アプリ名だとVSCodeで動かない場合があったので、bundleIDを使うことになったが、まあ許容範囲内であろう。hammerspoonで設定したので、SlackやChromeにもホットキーを簡単に割り当てられるようになったのは朗報かもしれない。

-- ホットキーの割り当て
-- アプリ名だとVSCodeで動かない場合があるため、bundleIDを使う
-- ref: https://github.com/Hammerspoon/hammerspoon/issues/2075
-- bundleIDは以下のコマンドで取得できる
-- lsappinfo info -only bundleid Finder

function toggleApp(key, modifiers, bundleID)
  hs.hotkey.bind(key, modifiers, function()
    local app = hs.application.get(bundleID)
    if app == nil then
      hs.application.launchOrFocusByBundleID(bundleID)
    elseif app:isFrontmost() then
      app:hide()
    else
      hs.application.launchOrFocusByBundleID(bundleID)
    end
  end)
end

toggleApp({"ctrl", "shift"}, "s", "com.tinyspeck.slackmacgap") -- Slack
toggleApp({"ctrl", "shift"}, "c", "com.google.Chrome")
toggleApp({"ctrl"}, "i", "com.microsoft.VSCode")

ターミナルの透過 => 無理そうなので、代替手段で対応

VSCodeの透過に対応している拡張が存在するが、Windowsでしか動かないようだ。結構調べたが、現状だとMacの場合は諦めるしかなさそう。ぐぬぬ...。

ウィンドウを透過させることでやりたかったことを整理すると、結局ターミナルなりコードを書くときにブラウザなどの情報を並べて見たい、ということであった。ならば「情報を横に並べて表示しやすいようにすれば解決するのでは」と思ってショートカットキーを割り当てることにした。

Macには 「ウインドウを画面左側に移動」という操作が存在しており、defaults writeでそれに対してキーボードショートカットを割り当てることができるようなので、それを使った。Unicodeになっているので、ちょっと分かりにくい。設定後、OSを再起動しないと反映されないことがあるかも。VSCode側で既存のキーバインドと被るので、そこは無効にしている。

# キーボード => ショートカット => アプリケーション
# 「ウインドウを画面左側に移動」をCtrl + Cmd + 左矢印キー
defaults write "Apple Global Domain" NSUserKeyEquivalents -dict-add "\U30a6\U30a4\U30f3\U30c9\U30a6\U3092\U753b\U9762\U53f3\U5074\U306b\U79fb\U52d5" "@^\U2192"
# 「ウインドウを画面右側に移動」をCtrl + Cmd + 右矢印キー
defaults write "Apple Global Domain" NSUserKeyEquivalents -dict-add "\U30a6\U30a4\U30f3\U30c9\U30a6\U3092\U753b\U9762\U5de6\U5074\U306b\U79fb\U52d5" "@^\U2190"
[
    ...,
    {
        "key": "ctrl+cmd+right",
        "command": "-workbench.action.moveEditorToNextGroup"
    },
    {
        "key": "ctrl+cmd+right",
        "command": "-workbench.action.terminal.resizePaneRight",
        "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
    },
    {
        "key": "ctrl+cmd+left",
        "command": "-workbench.action.terminal.resizePaneLeft",
        "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
    },
    {
        "key": "ctrl+cmd+left",
        "command": "-workbench.action.moveEditorToPreviousGroup"
    },
    ...,
]

ホットキーによるアプリケーションの呼び出しと、上記のショートカットキーで必要な情報をVSCodeのターミナルでもさっと並べてみれるようになったので満足。

メモ: ターミナル関係のキーバインド

tmuxっぽくしたい

tmuxを間に挟むとCopilotがうまく動いてくれないので、tmuxも一緒に捨てたい。とはいえ、いくつかターミナル開いて適当に行き来するときにキーボード以外の操作はしたくないので、tmuxっぽいキーバインドも設定した。コピーモードとかどうしようかなと思ったけど、そんなに使いこなせていなかった...。

[
    ...,
    // 新規ターミナル作成
    {
        "key": "ctrl+z c",
        "command": "workbench.action.terminal.new",
        "when": "terminalFocus"
    },
    // ターミナルの切り替え (next, previous)
    {
        "key": "ctrl+z n",
        "command": "workbench.action.terminal.focusNext",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+z p",
        "command": "workbench.action.terminal.focusPrevious",
        "when": "terminalFocus"
    },
    ...
]

その他キーバインド

  • ターミナルを出す / 引っ込める: Cmd-j
    • コード書くときとターミナル実行しているときの思考モードがあって、コード書いてるときは画面はコードだけ出したい
    • そうじゃないときはさっと引っこませたい
  • サイドバーの出し入れ: Cmd-b
    • 同様にCopilotとかExploreとかは常時出したくない、必要なときだけ出せるようにする

*1:多分10年は使ってる

*2:元々Emacs使いなので、あまり凝ったvimの使い方はしてないのもある