我想在代码编辑器中更好地控制颜色。例如,我想将lambda运算符的颜色=>更改为与其他运算符不同。我还想如果有可能只更改扩展方法的颜色,同时保留其他方法的默认颜色(反之亦然),并在lambda关键字出现在lambda上下文中时更改它们的颜色。
使用一些简洁的VS扩展(或者甚至是默认的编辑器自定义选项)是否可以实现这一点?
编辑:我创建了这个类,并从答案中复制粘贴方法:
static class StringExtensionMethods
{
public static List<int> AllIndexesOf ( this string str, string value )
{
if ( String.IsNullOrEmpty ( value ) )
throw new ArgumentException ( "the string to find may not be empty", "value" );
List<int> indexes = new List<int> ( );
for ( int index = 0; ; index += value.Length )
{
index = str.IndexOf ( value, index );
if ( index == -1 )
return indexes;
indexes.Add ( index );
}
}
}
答案 0 :(得分:2)
自己编写这样的扩展程序非常容易。
首先,创建一个Extensibility - Visual Studio Extension项目。
然后,添加Editor Classifier item
。
这会将大量文件放入项目中,您需要一个名为EditorClassfier1.cs
(或类似)的文件。
在其中,您将找到GetClassificationSpans
方法。
该系统的工作原理是VS将使用MEF并在编辑器中发生变化时不断执行此方法。因此,您只需返回提供相关ClassificationSpan
的{{1}}个对象列表以及开始和结束位置。
我这么快就把它放在一起:
ClassificationType
结果(注意:背景突出显示是public IList<ClassificationSpan> GetClassificationSpans(SnapshotSpan span)
{
var result = new List<ClassificationSpan>();
foreach (var line in span.Snapshot.Lines.Where(x => x.GetText().Contains("=>")))
{
foreach (var idx in line.GetText().AllIndexesOf("=>"))
{
result.Add(new ClassificationSpan(new SnapshotSpan(line.Snapshot, new Span(line.Start.Position + idx, 2)), this.classificationType));
}
};
return result;
}
模板生成的样本,您可以根据需要控制它)。
要实现Editor Classifier
,请查看以下答案:
Finding ALL positions of a substring in a large string in C#
P.S。从默认设置更改的一个好主意是AllIndexesOf
类,默认情况下会IClassifierProvider
。可能最好将其更改为[ContentType("text")]
,因为此语法突出显示只对代码有意义。