2013-09-30 86 views
0

我使用ITextParagraphPropertiesFactoryService类以自定义方式创建了扩展,即格式vs编辑器选项卡。一切都运行得很好,希望这样的事实,即当用户进入新的生产线,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键(新行)新光标主营下设,但是我希望标签宽度为1

enter image description here

我开始输入它关系到预期位置之后。

enter image description here

的问题是,我怎么可以设置新行空行标签的大小? 我尝试覆盖ISmartIndentProvider,但似乎与忽略该值。

Debuger停在断点方法

int? GetDesiredIndentation(ITextSnapshotLine currentLine) 
ISmartIndent

,但缩进保持不变,不管我回什么价值?

回答

1

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

首先,有很多地方使用当前的C#和VB语言服务,我们明确地设置插入位置以响应某些按键。 Enter是其中之一。在你的情况下,我们很可能明确地设置了这个位置。在“工具”>“选项”中禁用智能缩进功能之后,您无法重写该功能。既然你说你在ISmartIndentProvider中得到了一个调试器,那么这可能就是问题了。其次,如果您试图为内容类型“文本”定义ISmartIndentProvider,那么如果有语言特定的提供程序,则不会调用您的内容。另外还有另一家提供“文本”的提供商(它称之为提炼旧式语言服务),无论如何可能会赢得你的赞誉。老实说,如果你想要做一些你不想自动缩进的东西,那么你应该把它关掉,以确保它不会妨碍你的发展。

+0

感谢杰森的回答,比我没有看到ISmartIndetProvider的原因,它甚至在最简单的情况下也不起作用,但是您能否提供一个快速提示,以便如何更改制表符分割并返回到智能从代码? –

+0

该接口的存在是为了让语言服务能够指定他们希望缩进如何工作。它的目的不是允许扩展来覆盖语言服务的行为。更改特定语言的缩进的API是[IVsTextManager.SetUserPreferences](http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.textmanager.interop.ivstextmanager.setuserpreferences.aspx)。你可能想在网上挖掘使用,这些API有点奇怪。 –

+0

我看到杰森,我会检查关闭智能缩进,但我认为这不是我的情况,我需要注意,但我需要将它设置到正确的位置......有没有任何服务可以自己设置当前位置? –