【发布时间】:2016-03-09 04:59:51
【问题描述】:
我正在尝试为 VSCode 开发带有语言服务器的扩展。我试图弄清楚如何从扩展的语言服务器部分编写文本以记录日志。 console.log 什么也没产生
【问题讨论】:
标签: visual-studio-code vscode-extensions language-server-protocol
我正在尝试为 VSCode 开发带有语言服务器的扩展。我试图弄清楚如何从扩展的语言服务器部分编写文本以记录日志。 console.log 什么也没产生
【问题讨论】:
标签: visual-studio-code vscode-extensions language-server-protocol
在服务器端尝试使用 connection.console.log。
// Create a connection for the server. The connection uses
// stdin / stdout for message passing
let connection: IConnection = createConnection(process.stdin, process.stdout);
connection.console.log(`Console test.`);
在客户端的调试控制台中显示的消息。
对于客户端,简单的 console.log 对我来说效果很好。
【讨论】:
您必须在客户端扩展代码中的客户端选项上设置outputChannelName 属性:
let clientOptions: LanguageClientOptions = {
outputChannelName: 'XYZ Language Server',
};
完成后,您可以使用console.log(),它将显示在 VSCode 扩展输出面板中。
【讨论】:
语言服务器协议支持日志,使用通知window/logMessage从服务器发送日志消息,VS Code将在输出面板中显示服务器的日志,在与启动服务器的语言客户端对应的通道中。
【讨论】:
作为更新,您可以使用vscode.window.createOutputChannel 创建输出容器,然后使用appendLine 方法写入它。
//Create output channel
let orange = vscode.window.createOutputChannel("Orange");
//Write to output.
orange.appendLine("I am a banana.");
【讨论】:
Orange 频道。其他扩展似乎有办法自动切换频道。
orange.show();让输出通道显示出来。
只需打开 vscode 并转到菜单“帮助”->“切换开发者工具”,控制台就会显示在右侧窗口中。
【讨论】:
export let config: any = {};
export function getConfig() {
//debug
config.debug = workspace.getConfiguration().get('VBI.debug');
config.debugToChannel = workspace.getConfiguration().get('VBI.debugToChannel'); //Instead into dev-tools-console
return config;
}
/**
* @param cat Type String --> define Cathegory [info,warn,error]
* @param o Rest Parameter, Type Any --> Data to Log
*/
export let info = vscode.window.createOutputChannel("VBI-Info");
export function log(cat: string, ...o: any) {
function mapObject(obj: any) {
switch (typeof obj) {
case 'undefined':
return 'undefined';
case 'string':
return obj;
case 'number':
return obj.toString;
case 'object':
let ret: string = '';
for (const [key, value] of Object.entries(obj)) {
ret += (`${key}: ${value}\n`);
}
return ret;
default:
return obj; //function,symbol,boolean
}
}
if (config.debug) {
if (config.debugToChannel) {
switch (cat.toLowerCase()) {
case 'info':
info.appendLine('INFO:');
o.map((args: any) => {
info.appendLine('' + mapObject(args));
});
info.show();
return;
case 'warn':
info.appendLine('WARN:');
o.map((args: any) => {
info.appendLine('' + mapObject(args));
});
info.show();
return;
case 'error':
let err:string='';
info.appendLine('ERROR: ');
//err += mapObject(cat) + ": \r\n";
o.map((args: any) => {
err += mapObject(args);
});
info.appendLine(err);
vscode.window.showErrorMessage(err);//.replace(/(\r\n|\n|\r)/gm,"")
info.show();
return;
default:
info.appendLine('INFO-Other:');
info.appendLine(mapObject(cat));
o.map((args: any) => {
info.appendLine('' + mapObject(args));
});
info.show();
return;
}
}
else {
switch (cat.toLowerCase()) {
case 'info':
console.log('INFO:', o);
return;
case 'warn':
console.log('WARNING:', o);
return;
case 'error':
console.log('ERROR:', o);
return;
default:
console.log('log:',cat, o);
return;
}
}
}
}
测试:
import * as func from './functions';
import { config } from './functions';
func.getConfig();
let text = `debugToChannel:${config.debugToChannel}\n`;
func.log('info','vbi-format',text);
func.log('warn','vbi-format',text);
func.log('error','vbi-format',text);
【讨论】: