newmo 技術ブログ

技術で地域をカラフルに

テキストエディタで愛用しているカスタムショートカットたち

こんにちは、newmo の 伊藤 です。

この記事では、筆者が特に工夫して設定しているテキストエディタのカスタムショートカットについて、周辺ツールの利用例を交えて紹介します。

記事で紹介する内容は、特定のテキストエディタには依存しないものとなっているので、アイディアや考え方はどのテキストエディタを使っている方にも参考にしていただけると思います。

目次

はじめに

筆者はテキストエディタに様々な設定を施すにあたり、

必要な情報・機能を、必要な時にのみ素早く表示・起動できるようにする

という点を常に心がけています。そのため、テキストエディタ内でデフォルトで表示されている情報は必要最小限となるように努めています。

この考えを踏まえて、筆者のテキストエディタは下の画像のようになっています。

ソースコード以外の「常に表示する必要最小限の情報」は次のように定めています:

  • テキストエディタで開いているファイルの名前
    • 編集中のファイルの可視化(ファイル名のハイライトを反転)
    • 未保存のファイルの可視化(ファイル名横の「+」マーク)
  • プロジェクト名
  • Git リポジトリでチェックアウトしているブランチの名前
  • Git リポジトリのステータス(リポジトリにコミットしていない変更があれば「X」マークを表示する)

これらの必要最小限の情報が、テキストエディタの最上部の 1 行に全て収まるように設定しています。

その他の情報や機能は、この記事で紹介するようなショートカットを用いて、必要なときに素早く呼び出せるように設定しています。

ファイルの列挙 → 絞り込み → 開く

,f というキーシーケンスのショートカットで、リポジトリ内のファイルを列挙して、ファイル名の部分一致検索で絞り込んで開いています。 列挙するファイルの条件は次のように定めています:

  • Git の管理下にあるファイル
  • Untracked なファイルも含む
  • Ignore されているファイルは含まない
  • Deleted なファイルは含まない
  • Submodule のパスは含まない

この条件を満たすために、次のコマンドでファイルの列挙を行っています:

$ git ls-files --cached --others --exclude-standard | grep -Fvxf <(git ls-files --deleted; git config --file .gitmodules --get-regexp path | awk '{print $2}') | sort

このコマンドでは git ls-files で Git の管理下にあるファイルを Untracked なものも含めて列挙し、続く grep -Fvxf コマンドで Deleted なファイルと Submodule のパスを篩い落としています(もっとシンプルな方法をご存じの方がいたら教えてほしいです 🙏)。

このコマンドで列挙したファイルを fzf というコマンドラインのファジーファインダーツールに渡して、インタラクティブにファイル名の部分一致検索を行い、選択したファイルを開くようにしています。

また、fzf が提供する「絞り込み中のファイルの内容をプレビュー表示する機能」を活用して、内容を確認しながら開くファイルを選択することもあります。

プレビュー内では <Control>-<Shift>-p<Control>-<Shift>-n のショートカットを用いて上・下にスクロールできるようにしています。

fzf のプレビュー画面では、 bat のようなコマンドラインのシンタックスハイライトツールを利用して選択中のファイルのシンタックスをハイライトすることができます。筆者は「テキストエディタで開いたときのハイライト」と「fzf のプレビューで開いたときのハイライト」を完全に一致させるために、bat ではなく tree-sitter ベースでシンタックスをハイライトする自作のツールを fzf と連携させています。

ファイルの全文検索 → 絞り込み → 開く

,g というキーシーケンスのショートカットで、リポジトリ内の全てのファイルに対して全文検索を実行して、内容を元に絞り込んで目的の箇所を開いています。

全文検索には ripgrep というコマンドラインの検索ツールを利用しています。この ripgrep と fzf を組み合わせて、リポジトリ内の全てのファイルに対して全文検索を実行し、目的の箇所を絞り込みながら開いています。

当該の箇所を開くときにカーソル位置を視認しやすくするために、開いた直後にカーソル行が点滅するようにしています。

また、fzf の「複数選択機能( --multi オプション)」を使って、複数の検索結果を <Tab> で選択して同時に複数のファイルを開けるようにもしています。

Language Server Protocol(LSP)関連

編集中のファイルが属しているディレクトリ内のシンボルの列挙 → 絞り込み → 開く

gl というキーシーケンスのショートカットで、編集中のファイルが属しているディレクトリ内に含まれるシンボルを全て列挙して、絞り込んで開いています。

例えば Go 言語における「パッケージ」のように、ソースコードのファイルが有意味な単位でディレクトリにまとめられることは多いです。そのため筆者は「編集中のファイルを含んでいるディレクトリに、他にはどのような関数・変数が含まれているのか」を確認したくなることが多々あります。

現在(バージョン 3.18)の LSP では「単一ファイル内のシンボルの列挙(textDocument/documentSymbol)」や「ワークスペース全体のシンボルの列挙(workspaceSymbol/resolve)」はサポートされていますが、「ディレクトリ内のシンボルの列挙」はサポートされていません。

そのため、

  1. 編集中のファイルが属しているディレクトリ内のファイルを列挙する
  2. 列挙したファイルの中で編集中のファイルと同じファイルタイプのものを列挙する
  3. 2 で列挙したそれぞれのファイルに対して LSP の textDocument/documentSymbol を実行する
  4. 3 の結果を合成して fzf に渡して絞り込めるようにする

という設定をテキストエディタに施して、ディレクトリ内のシンボルを列挙できるようにしています。

参照元の列挙 → 開く

gkr というキーシーケンスのショートカットで、カーソル位置にあるシンボルに対する参照元を LSP の textDocument/references を用いて列挙し、目的の箇所を開いています。

列挙した参照元は、ファイルの列挙や全文検索と同様に、fzf に渡して内容を適宜プレビューで確認しつつ開くようにしています。

関数の呼び出し元の列挙 → 開く

gy というキーシーケンスのショートカットで、カーソル位置にある関数に対する呼び出し元を LSP の callHierarchy/incomingCalls を用いて列挙し、目的の箇所を開いています。

呼び出し元が 1 箇所しか存在しない場合は、列挙せずに当該の箇所を直接開くように調整しています。

Git 関連

差分の閲覧

,m というキーシーケンスのショートカットで、「現在のブランチのワーキングディレクトリ及びインデックス」と「ベースブランチ(デフォルトブランチ)」とのマージベースからの差分を表示しています。

このショートカットでは、画面を以下のように 3 つに分割しています:

  • 上: 差分のあるファイル一覧
  • 左: ベースブランチの内容
  • 右: 現在のブランチの内容

ショートカットを起動すると上の画面のファイル一覧にフォーカスされ、そこからファイルを選択して d を入力すると右の画面の現在のブランチの状態にフォーカスされます。さらに、右の画面内で e を入力すると当該箇所を改めてテキストエディタで開くようにしています。

他人や AI コーディングエージェントが書いたコードは、この記事で紹介しているようなテキストエディタの機能を用いてレビューできると効率が良いので、この差分閲覧のショートカットを活用して手元の環境で差分を読んでいます。また、自分が今書いているコードを「レビューに出すとどのような差分になるか」という観点で反芻することが多いので、自分が書いたコードを読むためにも活用しています。

筆者は、自分が書いたコードの差分を表示する際に「まだ Git で管理していない Untracked な新規ファイルについては、作業中の未確定な状態なので git add することなく(Git のインデックスに影響を及ぼすことなく)差分だけを確認したい」と考えています。

これを達成するために、このショートカットが起動されたときに一時的な Git のインデックスファイルを作成(cp .git/index .git/tmp-index)し、この一時的なインデックスファイルを GIT_INDEX_FILE 環境変数で指定して git add と差分表示を実行することで、作業中の Git のインデックスに影響を及ぼすことなく差分だけを確認できるようにしています。

差分のハイライト

,x というキーシーケンスのショートカットで、編集中のファイルに対して Git での差分を可視化しています。必要なときにだけ表示できるように、差分のハイライトの表示は ,x のショートカットでトグルできるように設定しています。

このショートカットでも「差分の閲覧」で紹介した内容と同様に、一時的なインデックスファイルを作成して差分だけを確認できるようにしています。

このショートカットと「差分の閲覧」で紹介したショートカットを併用して、下のキャプチャのようにコードレビューに勤しんでいます。

Git クライアント(tig)の起動

,t というキーシーケンスのショートカットで、TUI ベースの Git クライアントである tig をテキストエディタ内で起動しています。tig は git の操作をコマンドラインでよりインタラクティブに実行できるツールです。

筆者は、Git のインデックスの操作を主に tig で実行しています。上のキャプチャでも実行しているように、ファイルの中の一部の差分をインデックスに追加する git add --patch 相当の操作をよりインタラクティブに実行できる、など tig によって細やかな操作の利便性が向上しています。

インデックスの操作の他にも、コミットの作成やコミット内容の表示、ブランチのプッシュなど、tig 自体の設定ファイルによる拡張も駆使して多くの Git の操作を tig 経由で実行しています。

プロジェクトの切り替え

,s というキーシーケンスのショートカットで、コンピューター上にあるプロジェクト(リポジトリ)を列挙し、切り替えたいプロジェクトを名前で絞り込んで開いています。

作業中に複数プロジェクトを扱う必要がある場合、tmux やターミナルで画面を分割して複数画面で開く、という方法も存在しますが、筆者は「認知的負荷を下げるために同時に表示される情報は最小限にしたい」という考えのもと単一の画面で素早くプロジェクトを切り替えられるようにしています。これによって視線や首を極力移動することなく複数プロジェクトを扱える、というメリットもあります。

他のプロジェクトに切り替える際は、現在編集中のプロジェクトで開いているファイルやカーソルの位置をテキストエディタの機能を使ってセッションとして保存して、次に同じプロジェクトを開くときに復元しています。

また、直前まで編集していたプロジェクトに素早く戻れるように、,l という別のキーシーケンスのショートカットで絞り込みなしで直前のプロジェクトに戻れるようにもしています。

シェルの起動

,z というキーシーケンスのショートカットで、テキストエディタ内でシェルを起動しています。

シェルの起動の待ち時間を最小化するために、テキストエディタが起動されたときにバックグラウンドでシェルのプロセスを起動しておき、このショートカットが入力されたときに画面に表示する、という設定にしています。

EasyMotion 形式でのカーソルの移動

,a というキーシーケンスのショートカットで、EasyMotion 形式でのカーソルの移動を実行しています。

このショートカットを起動すると、テキストエディタ内で表示されている単語の先頭が固有のアルファベットとともにハイライトされ、この固有のアルファベットをショートカットに続けて入力するとカーソルをその単語の場所に移動できるようになっています。これを用いることでテキストエディタ内の任意の位置に素早くカーソルを移動できるようにしています。

おわりに

この記事では、筆者が特に工夫しているテキストエディタのショートカットについて紹介しました。これらのショートカットは改良を重ねながら長年愛用しており、筆者の生活を支えています。

この記事で紹介した内容が、みなさまがテキストエディタの設定を見直すきっかけになれば幸いです。