SwissknifeというVSCode拡張機能の紹介
個人ブログを開発してたら拡張機能が欲しくなりました。
日付や Lorem Ipsum を挿入したり、VS Code のスクリーンショットを撮影したい。なんならある程度カスタマイズできたらいいなぁ。
調べたらいいかんじの拡張機能が提供されていたのでご紹介いたします。
対象者
- テキスト生成系の拡張機能を探してる人
- VS Code 使ってる
- npm 使える
- JavaScript なんとなくわかる
- Windows11
痒いところに手が届く機能がたくさん
Ctrl+Shift+9
を押すと Swissknife のコマンドパレットが開きます。
コマンドを選択してからEnter
を押して実行します。以下はコマンドの一部です。
好きに機能を追加できる
スクリプトを指定のフォルダーに置くことで機能を拡張できます。機能は Swissknife のコマンドパレットに追加されます。
指定のフォルダーは%APPDATA%\Code\User\globalStorage\luisfontes19.vscode-swissknife\scripts
です。
VS Code 上でCtrl+Shift+P -> Swissknife: Open Swissknife user scripts folder
と入力すると、自動で開きます。
VS Code API を使える
Swissknife にはNew Swissknife Script (JS)
およびNew Swissknife Script (TS)
コマンドがあります。
これらのコマンドで、Swissknife を拡張するためのテンプレートスクリプトを入力できます。
以下はテンプレートスクリプト内の一部コメントを、DeepL で日本語翻訳したものです。
拡張するときは、cb(コールバック)関数引数の
context
を通して、あなたを助けるいくつかのメソッドを提供します。
・insertRoutine(cb)
は コールバック関数で返された文字列をエディターのカーソル位置に挿入します。・
replaceRoutine(cb)
はコールバック関数で返された文字列をエディターに送信します。
テキストが選択されていなければすべてのコードを置き換えます。
複数のテキストが選択されていれば、それぞれのカーソル位置に送信し、
コールバック関数で返された文字列に変換します。・
informationRoutine(cb)
はコールバック関数で返された文字列をエディターに送信します。
テキストが選択されていなければ、文字列を一回送信します。
複数のテキストが選択されていれば、複数回文字列を送信し、
コールバック関数で返された文字列をインフォメーションボックスで表示します。・vscode はVS Code の API です。
・modules は、scripts および lib フォルダー内のすべての JS モジュールの配列です。
これを使って組み込みのスクリプトから関数を呼び出せます。
つまり、コードロジックを再利用できます。
使用例: context.modules.passwords.generateSecureCharCode()
exports.insertRoutineCallback = async (context) => {
return new Promise((resolve, reject) => {
resolve("カーソル位置に文字列を挿入");
});
};
exports.replaceRoutineCallback = async (data, context) => {
return new Promise((resolve, reject) => {
resolve(`
・範囲選択された文字列を置き換える
・選択がなければファイル全体を置き換える
・引数の data は範囲選択中の文字列
・選択がなければ引数の data は呼び出したファイルの全文
`);
});
};
exports.informationRoutineCallback = async (data, context) => {
return new Promise((resolve, reject) => {
resolve(`
・インフォメーションボックスで文字列を表示する
・引数は replaceRoutineCallback と一緒
`);
});
};
令和何年かを表示するコマンドを追加してみる(JS)
指定のフォルダーを VS Code で開き、scripts.js ファイルをつくります。ファイル名は何でもいいです。
以下は、今年が令和何年かをインフォメーションボックスで表示するコードです。
Object.defineProperty(exports, "__esModule", { value: true });
exports.showJPYear = async (context) => {
return new Promise((resolve, reject) => {
resolve(`今年は令和${new Date().getFullYear() - 2018}年です。`);
});
};
const scripts = [
{
title: "Show year in Japanese",
detail: "Show year in Japanese by information box.",
cb: (context) => context.informationRoutine(exports.showJPYear),
},
];
exports.default = scripts;
コマンド登録後にCtrl+Shfit+9 -> Show year in Japanese
と入力します。エディター右下にインフォメーションボックスが表示され、今年が令和何年かを教えてくれます。
令和何年かが表示される
ブラウザを検索するコマンドを追加してみる(TS)
TypeScript を使う場合は、コンパイルして JavaScript ファイルにする必要があります。
ここでは VS Code からブラウザ検索をするコマンドを追加します。以下は作業手順です。
ワークスペースをつくる
-
Ctrl+Shift+P -> Swissknife: Open Swissknife user scripts folder
と入力してフォルダーを開く - 開いたフォルダーを VS Code で開く
-
Ctrl+@
でターミナルを開く - 以下のコマンドを入力。フォルダー名の「swissknife-extension」は任意
mkdir swissknife-extension && cd swissknife-extension && npm init
{
"name": "swissknife-extension",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "MIT"
}
型定義ファイルをインストール
- 以下のコマンドを入力
npm i -D typescript @types/vscode && touch index.ts
-
Swissknife の型定義ファイル 🔗をダウンロード
-
ダウンロードした型定義ファイルを swissknife-extension フォルダー下に配置
-
コンパイル設定を tsconfig.json で定義するため、以下のコマンドを入力
tsconfig.json をつくる./node_modules/.bin/tsc --init
-
設定を更新
tsconfig.json{ + "files": ["index.ts"], "compilerOptions": { "target": "ES2016", + "lib": ["ES2022", "DOM"], "module": "commonjs", + "outDir": "../", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true } }
コードを書く
- index.ts を開き、
Ctrl+Shift+9 -> New Swissknife Script (TS)
と入力 - import を修正
- import { IScript, ISwissKnifeContext } from '../Interfaces';
+ import type { IScript, ISwissKnifeContext } from './Interfaces';
- 以下は、ブラウザ検索をするコード
import type { IScript, ISwissKnifeContext } from "./Interfaces";
export const webSearch = async (context: ISwissKnifeContext) => {
const pickedSearchEngines = await context.vscode.window.showQuickPick(
["google", "bing"],
{
title: "検索エンジン",
placeHolder: "検索エンジンを選択",
canPickMany: true,
}
);
const searchWord = await context.vscode.window.showInputBox({
title: "検索",
placeHolder: "検索する語句を入力してください",
prompt: "Insert a search word",
});
if (pickedSearchEngines && searchWord) {
pickedSearchEngines.forEach((searchEngine) => {
const terminal = context.vscode.window.activeTerminal;
const url = new URL("search", `https://www.${searchEngine}.com`);
url.searchParams.append("q", searchWord.trim());
if (terminal) {
terminal.sendText(`start ${url}`, true);
} else {
context.vscode.window
.createTerminal("search")
.sendText(`start ${url}`, true);
}
});
context.vscode.window.showInformationMessage("検索しました");
} else {
context.vscode.window.showErrorMessage("検索しませんでした");
}
};
const scripts: IScript[] = [
{
title: "Web Search",
detail: "Search web by selected engine and input word.",
cb: webSearch,
},
];
export default scripts;
コンパイルして指定のフォルダーに置く
- 以下のコマンドを入力
./node_modules/.bin/tsc --build
- 親階層に index.js ファイルが生成される
-
Ctrl+Shift+P -> Reload Swissknife scripts
と入力して、新コマンドを登録する
Ctrl+Shfit+9 -> Web Search
と入力します。エディター上に入力欄が表示され、進めるとブラウザ検索をしてくれます。
ブラウザ検索をする
Discussion