【问题标题】:How to set default color back when using vscode decorator?使用 vscode 装饰器时如何设置默认颜色?
【发布时间】:2020-09-29 10:30:51
【问题描述】:

我正在开发一个调用 let regEx = new RegExp(somePattern) 的扩展程序,然后执行以下操作

   while ((match = regEx.exec(text))) { 
      // This loop runs till there is no more match left in the entire text 
      // When match found It colored the selected text to red
   }

只要活动编辑器中发生某些活动,就会调用上述方法。问题是,当模式第一次匹配时,它会将文本颜色更改为红色,可以正常工作。

但是现在,如果我对原始文本进行更改以使正则表达式不再匹配,我想将颜色设置回其默认值。

我将如何处理这种情况?有没有内置 vscode 装饰器的方法来处理我的情况?

一种可能的解决方案:如果我运行另一个正则表达式,它将返回所有与正则表达式不匹配的文本,然后我可以在它们上应用默认颜色。但这种方法可行吗?我认为这不是一个性能友好的解决方案。欢迎任何帮助、建议、提示。

解释和期望:

// 邮箱:abc@test.com

在文本编辑器中,只要有人键入上述句子,正则表达式就会检测到 // 电子邮件:,因此它将文本的背景颜色更改为红色。

现在稍后,如果有人进行任何更改,例如: // 一些东西:abc@test.com

我想恢复为默认颜色,因为它不再匹配正则表达式。

目前,即使在将 // Email: 移除/更改为不同的文本后,仍会显示我之前设置的颜色。

实际代码:

while ((match = regEx.exec(text))) {
            const startPos = activeEditor.document.positionAt(match.index);
            const endPos = activeEditor.document.positionAt(match.index + match[0].length);

            /* Ranges */
            let singleRange: vscode.Range = new vscode.Range(startPos, endPos);
            ranges.push(singleRange);
        }
        activeEditor.setDecorations(fontColorDecorator, ranges);

【问题讨论】:

  • 据我说;您可以在每次对文档或特定文本(如果看起来)进行编辑时调用该方法
  • 此方法从 onDidChangeActiveTextEditor()、onDidChangeTextDocument() 中调用。
  • 显示你使用的代码到color the text red
  • 不要在每次编辑时重新创建装饰器,每次调用setDecorations时使用相同的装饰器

标签: visual-studio-code vscode-extensions


【解决方案1】:

你创建一个装饰类型

myDecoration = vscode.window.createTextEditorDecorationType(options);

onDidChangeActiveTextEditor() 回调函数外部执行此操作。

onDidChangeActiveTextEditor() 回调中 您计算应该需要修饰的范围并将它们添加到编辑器中

editor.setDecorations(myDecoration, arOfRanges);

来自文档setDecorations()

向文本编辑器添加一组装饰。如果给定的装饰类型已经存在一组装饰,它们将被替换。

下次您计算受影响的范围时,您可能会得到一个空数组,并且装饰会被删除或更新。

editor.setDecorations(myDecoration, []);

【讨论】:

  • 我已经用代码 sn-p 和图像更新了问题。请检查。
  • @ShahriarHossain 我稍微修改了答案
  • 谢谢。在 onDidChangeActiveTextEditor() 之外声明装饰器,onDidChangeTextDocument() 解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 2011-02-27
  • 2013-10-26
  • 2018-05-27
  • 2016-01-16
相关资源
最近更新 更多