visual-studio-code - 更改 VSCode 扩展中代码的视觉表示
问题描述
我的问题: 有没有办法编写一个扩展来改变 vscode 显示的内容而不改变底层代码?Vscode 似乎有大量不同类型的扩展,我很难找到从哪里开始。
上下文: 我想尝试编写一个我已经有一段时间的想法的 vscode 扩展。(如果它已经存在,请告诉我。)
ASCII 中的“制表符”实际上是“水平制表”键。它最初是为了与“垂直制表”一起制作表格。您的打印机/终端将具有 HT 和 VT 字符可以前进到的列和行停止点。恢复 Tab 键的原始用途会很酷。换句话说,代码是这样写的:
On the disk:
#␉Comment␉Here␉for␉Columns␊
thing =␉"howdy",␉"doody",␉"mein froind",␉"!"␊
␉" I love",␉"what you've",␉"done with",␉"the place";␊
What's displayed (vertical line would be partly transparent):
# | Comment | Here | for | Columns
thing = | "howdy", | "doody", | "mein froind", | "!"
| " I love", | "what you've", | "done with", | "the place";
因此,通过查看后续行并尝试对齐水平制表符之后的任何内容,可以神奇地对齐制表符。Tab 不再代表宽度为 8 或 4 的列,而是灵活并与前面和后面的代码行对齐。
这意味着您不需要手动对齐任何东西。您也可以使用它,这样您的最大行长溢出会自动换行和自动对齐制表符。我可能会避免使用垂直制表符,因为大多数代码解释器可能无法正确忽略它。不过,大多数人应该忽略常规的水平制表符。
那么,这将是什么类型的扩展?如何显示与磁盘上不同的代码?提前谢谢。
解决方案
我找到了一种 hack-ish 方法来做到这一点。不理想,因为渲染不稳定。
创建一个装饰器类型的扩展。定义装饰类型时,设置字母间距(文本情况下为不透明度),基本上使匹配的内容不可见且无空格
const tabDecorationType = vscode.window.createTextEditorDecorationType({
letterSpacing: '-1em',
opacity: '0'
});
稍后设置装饰时,让您的 DecorationOptions 对象设置之前和之后的文本,以本质上为您的装饰提供新文本
const regEx = /\t/g;
const text = activeEditor.document.getText();
const tabs: vscode.DecorationOptions[] = [];
let match;
while (match = regEx.exec(text)) {
const startPos = activeEditor.document.positionAt(match.index);
const endPos = activeEditor.document.positionAt(match.index + 1);
const decoration: vscode.DecorationOptions = {
range: new vscode.Range(startPos, endPos),
renderOptions: {
after: {contentText: "| "},
before: {contentText: " "}, // <-- replace with correct number of spaces
}
};
tabs.push(decoration);
}
activeEditor.setDecorations(tabDecorationType, tabs);
你基本上已经替换了文本。(需要更多扫描才能为我想要的实现获得正确数量的空间,但这并不是问题的一部分。)这种实现并不是非常理想,因为装饰需要一秒钟的时间来渲染和更新。当代码扩充是文档格式的关键时,这使得代码扩充有点难看。
更新说明:描述符似乎对空格很挑剔。他们将删除描述符前后的所有空格,并删除所有换行符。这意味着您必须放入一些像“_”这样的字符,并使用“颜色”使描述符文本不可见,以获得一堆空白,并且您无法真正获得换行符......甚至更hack-ish,不太理想。
推荐阅读
- qt - 除了像 GTest 实现这样的可执行文件之外,在 CTest 中注册 QTest 上的测试
- dns - 从 Google 搜索结果中单击时域重定向不起作用
- emacs - 如何从 Org 模式表中提取一个值并在 Lisp sexp 中使用它?
- node.js - 使用 node.js 我需要压缩位于 file_system 上的文件
- python-3.x - 在 Pymc3 中向高斯过程添加协方差矩阵
- flutter - Setstate 在颤动中没有得到更新
- jquery - 将来自 Jquery 的 post 请求中的数组传递给 Laravel 存储控制器(使用 Guzzle)
- c# - 如何将 2 个或多个 Http 隧道(例如 ngrok)与 2 个或多个 .net 不同的应用程序(需要处理图形 api 的不同订阅)一起使用?
- macos - 使用 Applescript 批量拒绝 MacOS 日历事件
- excel - 在excel中突出显示工作表内和工作表之间的重复项