gpt4 book ai didi

c# - Avalon 中的 BraceFolding 编辑

转载 作者:行者123 更新时间:2023-12-04 00:47:49 38 4
gpt4 key购买 nike

我使用 Daniel Grünwald 的 BraceFoldingStrategy:

public IEnumerable<NewFolding> CreateNewFoldings(ITextSource document)
{
List<NewFolding> newFoldings = new List<NewFolding>();

Stack<int> startOffsets = new Stack<int>();
int lastNewLineOffset = 0;
char openingBrace = this.OpeningBrace;
char closingBrace = this.ClosingBrace;
for (int i = 0; i < document.TextLength; i++) {
char c = document.GetCharAt(i);
if (c == openingBrace) {
startOffsets.Push(i);
} else if (c == closingBrace && startOffsets.Count > 0) {
int startOffset = startOffsets.Pop();
// don't fold if opening and closing brace are on the same line
if (startOffset < lastNewLineOffset) {
newFoldings.Add(new NewFolding(startOffset, i + 1));
}
} else if (c == '\n' || c == '\r') {
lastNewLineOffset = i + 1;
}
}
newFoldings.Sort((a,b) => a.StartOffset.CompareTo(b.StartOffset));
return newFoldings;
}

这按预期工作,但还有一个问题 enter image description here

在最后一个大括号上总是有一个最后一个 - 图标。我试图删除它,但是当我查看列表 newFoldings 时,我可以看到那里只有 3 个折叠。那么第四个来自哪里?

编辑

根据 Daniel Grünwald 的说法,问题是我必须使用不同的折叠管理器。但是我在初始化代码中找不到任何设置第二个 FoldingManager 的语句。也许有任何提示?

private void textEditor_Loaded(object sender, RoutedEventArgs e)
{
LoadSourceCode();
textEditor.Background = Brushes.Green;
textEditor.IsReadOnly = true;
textEditor.ShowLineNumbers = true;

using (Stream s = this.GetType().Assembly.GetManifestResourceStream("Prototype_Concept_2.View.Layouts.CustomHighlighting.xshd"))
{
using (XmlTextReader reader = new XmlTextReader(s))
{
textEditor.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance);
}
}

(textEditor.TextArea as IScrollInfo).ScrollOwner.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden;
(textEditor.TextArea as IScrollInfo).ScrollOwner.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden;

FoldingManager foldingManager = FoldingManager.Install(textEditor.TextArea);
BraceFoldingStrategy foldingStrategy = new BraceFoldingStrategy();
foldingStrategy.UpdateFoldings(foldingManager, textEditor.Document);

TextArea txt = textEditor.TextArea;
ObservableCollection<UIElement> margins = txt.LeftMargins;

foreach (UIElement margin in margins)
{
if ((margin as FoldingMargin) != null)
{
Contacts.AddPreviewContactDownHandler(margin as FoldingMargin, OnDown);
}
}

Main.Children.Remove(textEditor);
ScrollHost.Width = textEditor.Width;
ScrollHost.Height = textEditor.Height;
ScrollHost.Content = textEditor;
textEditor.Background = Brushes.Transparent;
ScrollHost.Background = Brushes.Transparent;
}

编辑2

我查看了当前安装的FoldingManager有3个折叠,但我仍然不知道第四个折叠定义在哪里。

最佳答案

根据我的经验,简单的 BraceFoldingStrategy 漏洞太多,无法真正发挥作用。有多个问题,例如缩进损坏(每次在 AvalonDock 中更改选项卡时我都会获得额外的折叠边距 - 这可能与您面临的问题完全相同),字符串中的大括号被解析为普通大括号(它甚至能够配对一个字符串 { with real }) 等等,所以我决定放弃它。

真正的代码折叠支持需要真正的词法(或更好的 - 句法)分析信息,如果可以的话使用它(你可以在 SharpDevelop 4.0 源代码中找到用法示例),但你必须能够访问你所使用的语言的解析器为此编写编辑器。

我认为代码折叠不是 IDE 最重要的功能,而且我个人很少使用它(仅用于具有区域/大型方法的非常大的文件)。

我知道这不是您希望得到的答案(如果帖子没有超过长度限制,我会将其作为评论发布)。不过,我会继续关注这个(并希望有人提供真正的答案)。

关于c# - Avalon 中的 BraceFolding 编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5246467/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com