C と C++ のコードの移動

English

ForgeKairos は、C と C++ の名前ベースのシンボル索引、呼び出しグラフのパネル、ホバーの型の中身、clangd の メモリを抑える設定を足す。言語サーバー全般は Zed の C と C++ の文書 を見る。

シンボル索引

C か C++ のファイルがあるプロジェクトでは、名前の索引を作る (symbol_index.enabled = "auto")。索引は コンパイルの情報を使わず、何も実行しない。信頼していないプロジェクトでも作る。関数とプロトタイプ、 #define、構造体・共用体・列挙・typedef、列挙の定数、大域変数、直接とメンバーの呼び出し、関数ポインターへの 代入、マクロの本体の中の呼び出しを持つ。

  • 索引はアプリのデータフォルダーに、プロジェクトのフォルダーごとに置く。計測ではソースのおよそ半分の 大きさだった。
  • 90 日使わなかった索引は消す。
  • 索引から来た結果には「名前一致」の印を付ける。同じ名前の無関係なシンボルに一致しうるからである。

定義へ移動

C と C++ では、言語サーバーが何も返さない・失敗する・symbol_index.language_server_timeout_ms (1500 ms) を超えるとき、定義へ移動に索引を使う。一致が 1 つならそこへ移動し、短く知らせる。複数なら一覧に出す。 コメントと文字列の中では使わない。F12、Ctrl+クリック、ホバーのリンクで効く。

シンボル検索

プロジェクトのシンボル検索 (ctrl-t) は、索引の答えを先に出し、言語サーバーの結果が届いたら重複を除いて 足す。ns::f のような C++ の修飾名でも検索できる。

呼び出しグラフのパネル

呼び出しグラフのパネルは、関数の呼び出し元か呼び出し先を木で出す。行を展開したときだけ、1 段ずつ 問い合わせる。既定では根はカーソルに追従せず、ユーザーが選ぶ。

操作Windows / LinuxmacOS
パネルのフォーカスの切り替えctrl-k ctrl-gcmd-k cmd-g
カーソル位置の関数の呼び出し元を出すctrl-k ctrl-shift-gcmd-k cmd-shift-g

パネルの中では、左で畳み、右で展開し、Space で呼び出し箇所を下見し、ctrl-c (cmd-c) で名前をコピーし、 alt-left / alt-right で根の履歴を移動する。呼び出し箇所が複数ある行で Enter を繰り返すと、次の箇所へ移る。

  • 索引の答えを先に出し、言語サーバーの答えは届いたら合わせる。
  • 再帰には印を付ける。関数ポインターを通した間接の呼び出しには候補を並べる。
  • 名前に定義が複数あるときは、根の候補を一覧にする。
  • call_graph_panel.excluded_callees にある呼び出し先 (printk、printf など) は最後の行で件数を出し、 求めに応じて表示する。

call_graph_panel の設定は 設定の一覧 を見る。

ホバーの型の中身

C と C++ で名前にホバーすると、言語サーバーのホバーの下に、その型の中身も出す。

  • 名前、種類、定義の場所
  • typedef の連鎖 (例: alias_t → outer_t → struct outer)
  • 構造体・共用体・クラスのメンバー (1 段ずつ展開できる)
  • 列挙の定数、マクロの本文
  • 同じ名前の定義の切り替え

中身は索引から名前で探したもので、言語サーバーが解決したものではない。symbol_index.hover_type_contents で切れる。

clangd のメモリ

設定効果
clangd.index_mode"full" (既定) はプロジェクト全体を裏で索引する。"light" は開いたファイルだけを索引し、メモリが最も少ない。参照、呼び出し階層、名前の変更は開いたファイルだけが対象になる。
clangd.max_workersclangd のスレッド数 (-j)。0 は clangd の既定。
clangd.memory_limit_mb30 秒ごとに測るメモリがこの MB を超えたら clangd を再起動する。10 分以内の 2 回目は知らせるだけ。0 は再起動しない。
  • 既定値では引数を足さない。lsp.clangd.binary.arguments に同じ種類の指定があれば、何も足さない。設定を 変えると clangd を再起動する。
  • memory_limit_mb と max_workers はユーザー設定からだけ読む。
  • メモリは clangd とその子プロセスすべての合計で測り、言語サーバーのメニューに出す。
  • メモリの上限の通知から、軽量モード (light) に切り替えられる。

AI のツール

内蔵のエージェントには call_hierarchy と type_layout、IDE サーバーで繋いだエージェントには getCallHierarchy と getTypeLayout がある (AI を参照)。どちらも読み取りだけ。エージェントに 見せないファイルの名前は返さない。

C と C++ の整形

C と C++ のファイル (.h を含む) は、GNU を基にした書式の clang-format で整形する: 括弧の前に空白、 120 桁、1 行のブロックや関数を作らない、case のラベルを字下げ、include を並べ替えない。「選択範囲をフォーマット」は 選んだ行だけを整形する。clang-format は、アプリのフォルダー、その bin フォルダー、足りないツールの通知から 入れたもの、PATH の順に探す。Windows のインストーラーは clang-format を同梱する。