0

我使用 ITextParagraphPropertiesFactoryService 类创建了一个扩展,以自定义方式与编辑器选项卡进行格式对比。一切正常,期待这样一个事实,当用户输入新行时,ITextParagraphPropertiesFactoryService 不会影响新行

为了简化问题,我创建了一个新的 MEF 项目,添加这样的格式提供程序

[Export(typeof(ITextParagraphPropertiesFactoryService))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
internal class ElasticTabstopsProvider : ITextParagraphPropertiesFactoryService
{
    /// <summary>
    /// Creates an ElasticTabstopsFormatters for
    /// the provided configuration.
    /// </summary>
    public TextParagraphProperties Create(IFormattedLineSource formattedLineSource, TextFormattingRunProperties textProperties, 
        IMappingSpan line, IMappingPoint lineStart, int lineSegment)
    {
        return new TextFormattingParagraphProperties(textProperties, 1);
    }
}

它会将我的编辑器中的所有选项卡宽度更改为 1。太好了!这就是我要的。但是现在当我按 Enter(新行)时,新光标设置在 Main 下,但是我希望制表符宽度为 1。

在此处输入图像描述

在我开始打字后,它会转到预期的位置。

在此处输入图像描述

问题是,如何设置新行空行标签大小?我尝试覆盖ISmartIndentProvider,但似乎 vs 忽略了该值。

调试器在方法中的断点处停止

int? GetDesiredIndentation(ITextSnapshotLine currentLine)

ISmartIndent,但无论我返回什么值,缩进都保持不变......

4

1 回答 1

1

您的 ISmartIndentProvider 的缩进被忽略至少有两个原因:

首先,在当前的 C# 和 VB 语言服务中,有很多地方我们明确设置插入符号位置以响应某些按键。输入就是其中之一。在您的场景中,我们很可能明确设置了位置。除了在“工具”>“选项”中禁用智能缩进之外,您无法覆盖它。既然您说您在 ISmartIndentProvider 中遇到了调试器,这可能就是这里的问题。

其次,如果您尝试为内容类型“文本”定义 ISmartIndentProvider,如果存在特定于语言的提供程序,则不会调用您的 ISmartIndentProvider。还有另一个“文本”提供者(它称为填充的旧语言服务)可能会赢得你的支持。

老实说,如果你想在不想自动缩进的地方做一些花哨的事情,那么你真的应该把它关掉以确保它不会妨碍你。

于 2013-10-01T00:45:45.217 回答