You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VSCode扩展侧边栏中实现输入栏?

在VSCode扩展侧边栏中添加输入栏的实现方案

要在VSCode扩展的侧边栏内嵌入输入栏,你可以使用Webview视图来实现——Webview允许你自定义HTML内容,完全支持输入框这类交互元素,比TreeView更灵活。以下是具体实现步骤和修改后的代码:

1. 注册侧边栏Webview视图

在activate函数中注册一个Webview视图提供者,用于在侧边栏展示自定义界面。

2. 编写Webview的HTML界面

在Webview中嵌入输入框和提交按钮,并通过VSCode的消息API将输入内容传递给扩展主逻辑。

3. 处理消息通信与请求逻辑

在扩展中监听Webview发来的输入消息,收到后调用axios发送请求,并将结果返回给Webview展示(可选)。

修改后的完整代码

import axios from "axios";
import * as vscode from "vscode";

export function activate(context: vscode.ExtensionContext) {
    console.log('Congratulations, your extension "cohere" is now active!');

    // 注册侧边栏Webview视图提供者
    const provider = new CohereWebviewProvider(context.extensionUri);
    context.subscriptions.push(
        vscode.window.registerWebviewViewProvider(
            "cohere.sidebarView", // 这个ID需要在package.json中配置
            provider
        )
    );
}

class CohereWebviewProvider implements vscode.WebviewViewProvider {
    constructor(private readonly _extensionUri: vscode.Uri) {}

    resolveWebviewView(
        webviewView: vscode.WebviewView,
        context: vscode.WebviewViewResolveContext,
        _token: vscode.CancellationToken
    ) {
        webviewView.webview.options = {
            // 允许加载本地资源和脚本
            enableScripts: true,
            localResourceRoots: [this._extensionUri]
        };

        // 设置Webview的HTML内容
        webviewView.webview.html = this._getHtmlForWebview(webviewView.webview);

        // 监听Webview发来的消息
        webviewView.webview.onDidReceiveMessage(async (data) => {
            switch (data.type) {
                case "submitMessage":
                    try {
                        const response = await axios.post(
                            "http://127.0.0.1:5000/cohere",
                            { message: data.message }
                        );
                        const output = JSON.stringify(response.data, null, 2);
                        console.log(output);
                        // 将结果返回给Webview展示
                        webviewView.webview.postMessage({
                            type: "showResult",
                            result: output
                        });
                    } catch (error) {
                        console.error(error);
                        webviewView.webview.postMessage({
                            type: "showError",
                            error: "请求失败,请检查服务是否运行"
                        });
                    }
                    break;
            }
        });
    }

    private _getHtmlForWebview(webview: vscode.Webview) {
        return `<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cohere 输入栏</title>
    <style>
        .container {
            padding: 16px;
            display: flex;
            flex-direction: column;
            gap: 8px;
        }
        #messageInput {
            padding: 8px;
            border: 1px solid #ccc;
            border-radius: 4px;
        }
        #submitBtn {
            padding: 8px 16px;
            background-color: #007acc;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        #submitBtn:hover {
            background-color: #005a9e;
        }
        #resultArea {
            margin-top: 12px;
            padding: 8px;
            border: 1px solid #eee;
            border-radius: 4px;
            white-space: pre-wrap;
            font-family: monospace;
        }
    </style>
</head>
<body>
    <div class="container">
        <input type="text" id="messageInput" placeholder="输入你的消息...">
        <button id="submitBtn">提交</button>
        <div id="resultArea"></div>
    </div>

    <script>
        const vscode = acquireVsCodeApi();
        
        // 监听提交按钮点击
        document.getElementById('submitBtn').addEventListener('click', () => {
            const input = document.getElementById('messageInput');
            const message = input.value.trim();
            if (message) {
                vscode.postMessage({
                    type: 'submitMessage',
                    message: message
                });
                input.value = '';
            }
        });

        // 监听扩展返回的消息
        window.addEventListener('message', event => {
            const data = event.data;
            const resultArea = document.getElementById('resultArea');
            switch (data.type) {
                case 'showResult':
                    resultArea.textContent = data.result;
                    resultArea.style.color = '#333';
                    break;
                case 'showError':
                    resultArea.textContent = data.error;
                    resultArea.style.color = '#d33';
                    break;
            }
        });
    </script>
</body>
</html>`;
    }
}

export function deactivate() {}

配置package.json

还需要在package.json中添加侧边栏视图的贡献点,让VSCode识别这个视图:

"contributes": {
    "views": {
        "explorer": [ // 可放在资源管理器侧边栏,或自定义侧边栏
            {
                "id": "cohere.sidebarView",
                "name": "Cohere 工具"
            }
        ]
    }
}

说明

  • 该方案通过Webview实现了完全自定义的侧边栏界面,不仅支持输入框,还能添加其他UI元素(比如结果展示区域);
  • Webview和扩展之间通过postMessage和onDidReceiveMessage进行双向通信,保证输入内容能传递到扩展逻辑中;
  • 样式可根据需求自定义,适配VSCode主题风格。

内容的提问来源于stack exchange,提问作者Ryan Seiyu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 06:00:19