接受输入内容
使用vscode.window.showInputBox
可以打开一个输入框, 让用户输入内容, 如下:
import * as vscode from "vscode";
export function activate(context: vscode.ExtensionContext) {
// 注册一个命令 learn-vscode-extends.input
const disposable = vscode.commands.registerCommand("learn-vscode-extends.input", () => {
// 打开一个 input
vscode.window.showInputBox({
ignoreFocusOut: true, // 当焦点移动到编辑器的另一部分或另一个窗口时, 保持输入框打开
password: false, // 为 true 就表示是密码类型
prompt: "请输入文本", // 文本输入提示
value: "hello world", // 默认值, 默认全部选中
valueSelection: [6, -1], // 指定选中的范围
}).then(value => {
if (!value || !value?.trim()) {
vscode.window.showErrorMessage("你输入的文本无效");
return;
};
vscode.window.showInformationMessage(`你输入的文本是: ${value.trim()}`);
})
});
context.subscriptions.push(disposable);
}
export function deactivate() { }
别忘了注册对应的命令, 效果如下:
快速选择
使用vscode.window.showQuickPick
可以打开一个快速选择列表, 如下:
import * as vscode from "vscode";
export function activate(context: vscode.ExtensionContext) {
// 注册一个命令 learn-vscode-extends.quickPick
const disposable = vscode.commands.registerCommand("learn-vscode-extends.quickPick", () => {
// 打开一个快速选择列表
vscode.window.showQuickPick(
// ["选项一", "选项二", "选项三"], // 简单的显示多个选项
[
{ // 对象的形式可以配置更多东西
label: "选项一",
description: "选项一描述$(bug)", // 可以指定官方提供的图标id https://code.visualstudio.com/api/references/icons-in-labels#icon-listing
detail: "选项一详细信息",
mate: { // 这里也可以放一些自定义的对象
script: "learn-vscode-extends.helloWrold"
},
},
{
label: "选项二",
description: "选项二描述",
detail: "选项二详细信息$(gear)",
}
],
{
title: "请选择一个选项", // 标题
placeHolder: "用户类型", // 占位符文本
canPickMany: false, // 是否可以多选
}
).then((res: vscode.QuickPickItem | undefined) => {
if (!res) return;
console.log(res); // 这里就是上面数组中对应的对象信息
})
});
context.subscriptions.push(disposable);
}
export function deactivate() { }
注册对应的命令, 效果如下:
WebView
使用vscode.window.createWebviewPanel
创建一些简单的页面内容, 效果类似于欢迎页, vscdoe的版本发行说明, 如下:
import * as vscode from "vscode";
import * as path from "path";
import * as fs from "fs";
export function activate(context: vscode.ExtensionContext) {
const disposable = vscode.commands.registerCommand("learn-vscode-extends.welcome", () => {
// 创建一个 weilcome
const panel = vscode.window.createWebviewPanel(
"weilcome", // webview面板的类型, 内部使用
"自定义欢迎页面标题", // table 标题
vscode.ViewColumn.One, // 显示在第一个编辑器
{
enableScripts: true, // 控制脚本是否在webview内容中启用, 默认为false(脚本禁用)
retainContextWhenHidden: true, // webview被隐藏时保持状态,避免被重置
}
);
// html文件路径
const hemlPath = path.resolve(
context.extensionPath, // 项目根路径
"./src/render/welcome.html"
);
// 读取html文本
const html = fs.readFileSync(hemlPath, "utf-8");
// 赋值html文本
panel.webview.html = html;
});
context.subscriptions.push(disposable);
}
export function deactivate() { }
对应目录(/src/render
)还需要创建一个welcome.html
文件, 如下;
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title></title>
</head>
<body>
<h1>欢迎页标题</h1>
<span>Hello WebviewView</span>
</body>
</html>
注册命令, 运行效果如下:
webview
还有更多设置和操作可以见官方webview
快捷键绑定
快捷键绑定需要在package.json
文件中的contributes.keybindings
配置, 如下:
// package.json
"activationEvents": [
"onCommand:learn-vscode-extends.keyboardTest"
],
"contributes": {
"commands": [
{
"command": "learn-vscode-extends.keyboardTest",
"title": "keyboardTest"
}
],
"keybindings": [
{
"command": "learn-vscode-extends.keyboardTest", // 快捷键触发的事件id
"key": "ctrl+f1", // windown 下的快捷键
"mac": "ctrl+f1", // mac 下的快捷键
"args": { // 通过快捷键触发时, 这个参数会被传递给对应命令注册的回调中
"text": "Hello World"
},
"when": "editorTextFocus" // 当编辑器聚焦时才会触发
// 了解 when 子句的更多请前往 https://code.visualstudio.com/api/references/when-clause-contexts
}
]
},
对应回调代码:
import * as vscode from "vscode";
export function activate(context: vscode.ExtensionContext) {
const disposable = vscode.commands.registerCommand("learn-vscode-extends.keyboardTest", (arg) => {
if (arg && typeof arg.text === "string") {
vscode.window.showInformationMessage("快捷键触发" + arg.text);
} else {
vscode.window.showInformationMessage("命令触发");
}
});
context.subscriptions.push(disposable);
}
export function deactivate() { }
运行, 按ctrl
+F1
(编辑器必须获取焦点), 因为绑定了效果如下: