【问题标题】:How to handle first tab size on formatting?如何处理格式化的第一个标签大小?
【发布时间】:2013-10-01 08:45:45
【问题描述】:

我使用 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(new line) 时,新光标设置在 Main 下,但是我希望选项卡宽度为 1。

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

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

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

int? GetDesiredIndentation(ITextSnapshotLine currentLine)

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

【问题讨论】:

    标签: visual-studio-extensions


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢 Jason 的回答,我没有看到 ISmartIndetProvider 的原因,即使在最简单的情况下它也不起作用,但是您能否快速提示如何更改制表符缩进从代码中阻止并返回智能?
    • 该接口的存在是为了允许语言服务指定他们希望缩进如何工作。它并非旨在允许扩展覆盖语言服务的行为。更改特定语言缩进的 API 是 IVsTextManager.SetUserPreferences。你可能想在网上挖掘一下使用,API有点奇怪。
    • 我看到 Jason,我会检查是否关闭智能缩进,但我认为这不是我的情况,我需要缩进,但我需要将其设置到正确的位置...有没有自己设置当前位置的服务?
    • 您始终可以通过编辑器 API 明确设置插入符号的位置,但您会发现自己与现有的语言服务作斗争。除非您关闭自动缩进,否则您将与之抗争——以您正在做的方式改变逻辑是完全不支持的。
    • 感谢 Jason,能从 SO 中的 VS 团队就这样一个不寻常的问题得到回答真的很酷,老实说,我没想到我会得到答案..:)
    猜你喜欢
    • 2017-01-03
    • 1970-01-01
    • 2021-01-01
    • 2012-06-17
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    相关资源
    最近更新 更多