この記事は公開から3年以上経過しています。
今回はVSCodeで指定したディレクトリ内のファイル(フォルダ)一覧を作成するVSCodeMacros拡張のマクロを作ってみたので紹介します。
マクロの動作イメージ
マクロのサンプルソースコード
const vscode = require('vscode');
const fs = require('fs');
const path = require('path');
/**
* マクロコンフィギュレーション
*/
module.exports.macroCommands = {
ShowFileList: {
no: 1,
func: listFiles,
},
};
/**
* ファイル一覧表示
*/
async function listFiles() {
let targetDirPath = '';
if (vscode.workspace.workspaceFolders !== undefined &&
vscode.workspace.workspaceFolders.length === 1) {
// 初期ディレクトリパスをターゲットディレクトリパスに設定
targetDirPath = vscode.workspace.workspaceFolders[0].uri.fsPath;
}
targetDirPath = await vscode.window.showInputBox({
placeHolder: 'Enter the directory path to show the file list.',
ignoreFocusOut: true,
value: targetDirPath
});
if (targetDirPath === undefined || targetDirPath.length === 0)
return;
if (!fs.existsSync(targetDirPath)) {
await vscode.window.showErrorMessage('Directory does not exist.');
}
let filePaths = [];
findFiles(targetDirPath, filePaths);
const sqlDoc = await vscode.workspace.openTextDocument({
language: 'plaintext',
content: filePaths.join('\r\n')
});
await vscode.window.showTextDocument(sqlDoc);
}
function findFiles(dirPath, files) {
let dirItems = fs.readdirSync(dirPath, {
withFileTypes: true
});
dirItems.sort((f1, f2) => {
// ファイル → ディレクトリ
const isDir1 = f1.isDirectory();
const isDir2 = f2.isDirectory();
if (!isDir1 && isDir2) return -1;
if (isDir1 && !isDir2) return 1;
// ファイル(ディレクトリ)名昇順
const lower1 = f1.name.toLowerCase();
const lower2 = f2.name.toLowerCase();
if (lower1 < lower2) return -1;
if (lower1 > lower2) return 1;
return 0;
});
dirItems.forEach(element => {
const fullPath = path.join(dirPath, element.name);
files.push(fullPath);
if (element.isDirectory()) {
findFiles(fullPath, files);
}
});
}
使い方
マクロ実行後に表示される入力ボックスにファイル一覧を作成したいディレクトリのパスを入力すると、そのディレクトリ内に存在するファイルとフォルダ(サブディレクトリを含む)の一覧を新しいエディタ上に表示します。
VSCodeで単一のフォルダを開いている場合は、入力ボックスの初期値になります。
※ファイル列挙は同期処理、エラーチェックは最低限です。
以上です。