ドキュメントを編集する拡張機能のコード解説
2. 拡張機能が起動したときに CodeLensProvider を起動する
CodeLensProvider では、provideCodeLenses と resolveCodeLens の 2 つの関数を用意する必要があります。
関数の中身は次の節で実装
3. ドキュメントを解析して、CodeLens を表示しよう
デバッグ実行で拡張機能を実行し、マークダウンファイルを開き、見出しの上に "add date" というコードレンズが表示されることを確認
見出しを表す正規表現(/^#+\s/g)とマッチする箇所にCodeLensを設定する
結果、正規表現に該当する行にCodeLensが表示される
CodeLensは1行目に表示されるかされないかのいずれか
"^"を指定しているので、1行目が#で始まっていたらCodeLensが表示される
#で始まるすべての行ではない
以下が怒られる(拡張機能のビルドはでき、「add date」は表示される)
new vscode.CodeLens(range, {title: "add date", tooltip: "add date"})
Argument of type '{ title: string; tooltip: string; }' is not assignable to parameter of type 'Command'.
第2引数はCommand
Command interfaceはtitleとcommandが必須
オブジェクトにcommandというキーがないために怒られている(指定すると怒られなくなる)
次のステップでcommandが指定される
4. コマンドを実行してドキュメントを編集しよう
デバッグ実行で拡張機能を実行し、マークダウンファイルを開き、見出しの上に "add date" というコードレンズが表示されることを確認
TextEditor.edit メソッド
このメソッド自体でドキュメントを編集するのではなく、メソッドに渡すコールバック関数でドキュメントの編集内容を登録します。
registerCommandで"markdown-date.addDate"コマンドを登録
CodeLensから呼び出す
コマンドパレットからは呼び出さないのでpackage.jsonは編集しない
呼び出し時に渡されるrange
VSCodeでmarkdownの1行目を# sとしたとき
start: 0行目の0文字
end: 0行目の2文字
textとして# の部分が取れている(空白は含まれるが、sは含まれない)
日付の挿入はeditBuilder.replace(range, text + today + " ");で実現
range(# というテキストに相当)を# 日付 で置き換えている
const today = dayjs().format("YYYY-MM-DD");