VSCode扩展API:按住按键点击文本时触发命令的实现方法
实现按住按键点击文本触发命令的VSCode扩展方案
要实现这个需求,核心是同时跟踪按键状态和文本选择变化,具体步骤如下:
1. 维护全局按键状态
在扩展激活时,通过DOM事件监听记录当前按下的按键:
// 存储当前处于按下状态的按键 const pressedKeys = new Set<string>(); export function activate(context: vscode.ExtensionContext) { // 监听按键按下事件 const handleKeyDown = (e: KeyboardEvent) => { pressedKeys.add(e.key.toLowerCase()); }; // 监听按键释放事件 const handleKeyUp = (e: KeyboardEvent) => { pressedKeys.delete(e.key.toLowerCase()); }; window.addEventListener('keydown', handleKeyDown); window.addEventListener('keyup', handleKeyUp); // 扩展停用后移除监听,避免内存泄漏 context.subscriptions.push({ dispose: () => { window.removeEventListener('keydown', handleKeyDown); window.removeEventListener('keyup', handleKeyUp); } }); }
用
toLowerCase()是为了统一按键标识的大小写,避免因系统或输入方式导致的判断误差。
2. 监听选择变化并判断按键状态
利用vscode.window.onDidChangeTextEditorSelection事件,在点击文本触发选择变化时,检查目标按键是否处于按下状态:
context.subscriptions.push( vscode.window.onDidChangeTextEditorSelection((event) => { // 示例:判断是否同时按住了Ctrl和Shift const isCtrlPressed = pressedKeys.has('control'); const isShiftPressed = pressedKeys.has('shift'); if (isCtrlPressed && isShiftPressed) { const editor = event.textEditor; const selection = editor.selection; const selectedText = editor.document.getText(selection); // 仅当有选中文本时执行操作 if (selectedText) { // 执行自定义命令,传入选中文本 vscode.commands.executeCommand('yourExtension.targetCommand', selectedText); // 也可直接在这里处理选中文本逻辑 console.log('选中内容:', selectedText); } } }) );
3. 细节优化
- 若仅需点击单个字符触发,可判断
selection.isEmpty === false且选择范围的字符长度为1,或通过event.kind === vscode.SelectionChangeKind.Mouse筛选鼠标触发的选择变化。 - 适配不同系统:Mac上的Command键对应
e.key为meta,可通过process.platform判断系统后调整按键判断逻辑。
内容的提问来源于stack exchange,提问作者maris ancans
相关产品推荐
相关产品推荐

