none
Visual Studio2015の自動補正機能に関して RRS feed

  • 質問

  • Visual Studio2008のVisual Basic でStringを定義して、文字列を入力すると改行時、文末に自動でダブルクオテーションが入力されるのですが(文頭のダブルクオテーションは入力します)、Visual Studio2015では、自動入力されません。Visual Studio2015では、どのような設定を行えばよいのでしょうか?

    例えば

    Dim str as string

    str="ab

    と入力して、Enterを押すと

    str="ab"

    となる自動補正の機能の事です。

    よろしくお願いします。

    2016年9月3日 2:38

回答

  • VS2015 Up3 で試した限りですが、オプションで「自動かっこ挿入」にチェックが入っていれば入るようです

    正確に言えばEnter時ではなく「"」を入力すると「""」となり、カーソルは「”」の間にいる形です。

    消してしまうと自分で入力する必要があり、Enterなどで補正されません。


    2016年9月4日 2:04
  • 2015からは文字列を複数行に連続して記述できるようになったので、そのからみかも

    以下のような拡張機能を作ってやれば自動補完っぽい動作はさせられます。

    using System;
    using System.Diagnostics;
    using System.Globalization;
    using System.Runtime.InteropServices;
    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Shell;
    
    namespace Gekka.VisualStudio.Extention
    {
        [PackageRegistration(UseManagedResourcesOnly = true)]
        [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
        [Guid(GuidList.guidVSPackage1PkgString)]
        [ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string)]
        [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string)]
        public sealed class VB2015StringQuotationPackage : Package
        {
            private EnvDTE80.DTE2 dte;
            private EnvDTE80.Events2 event2;
            private EnvDTE80.TextDocumentKeyPressEvents keyPressEvents;
    
            protected override void Initialize()
            {
                base.Initialize();
    
                this.dte = (EnvDTE80.DTE2)GetService(typeof(EnvDTE.DTE));
                this.event2 = (EnvDTE80.Events2)this.dte.Events;
    
                this.keyPressEvents = this.event2.TextDocumentKeyPressEvents;
                this.keyPressEvents.AfterKeyPress += TextDocumentKeyPressEvents_AfterKeyPress;
            }
    
            void TextDocumentKeyPressEvents_AfterKeyPress(string Keypress, EnvDTE.TextSelection Selection, bool InStatementCompletion)
            {
                try
                {
    
                    if (Keypress == "\r" && Selection.Parent.Language == "Basic")
                    {
                        Selection.LineUp();
                        try
                        {
                            Selection.StartOfLine(EnvDTE.vsStartOfLineOptions.vsStartOfLineOptionsFirstText);
                            Selection.EndOfLine(true);
    
                            string text = Selection.Text;
                            if (text.Length > 0)
                            {
                                int q = 0;
                                foreach (char c in text)
                                {
                                    if (c == '\"')
                                    {
                                        q++;
                                    }
                                    else if (c == '\'')
                                    {
                                        if ((q & 1) == 0)
                                        {
                                            return;
                                        }
    
                                    }
                                }
    
                                if ((q & 1) == 1)
                                {
                                    Selection.MoveToPoint(Selection.BottomPoint);
                                    Selection.Insert("\"");
                                }
                            }
    
                        }
                        finally
                        {
                            Selection.LineDown();
                            Selection.StartOfLine(EnvDTE.vsStartOfLineOptions.vsStartOfLineOptionsFirstText);
    
                            //dte.ExecuteCommand("Edit.DocumentFormat");
                        }
    
                    }
                }
                catch
                {
                }
            }
        }
    }

    github , VSIX


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク csviy 2016年9月5日 0:32
    2016年9月4日 16:34

すべての返信

  • VS2015 Up3 で試した限りですが、オプションで「自動かっこ挿入」にチェックが入っていれば入るようです

    正確に言えばEnter時ではなく「"」を入力すると「""」となり、カーソルは「”」の間にいる形です。

    消してしまうと自分で入力する必要があり、Enterなどで補正されません。


    2016年9月4日 2:04
  • 2015からは文字列を複数行に連続して記述できるようになったので、そのからみかも

    以下のような拡張機能を作ってやれば自動補完っぽい動作はさせられます。

    using System;
    using System.Diagnostics;
    using System.Globalization;
    using System.Runtime.InteropServices;
    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Shell;
    
    namespace Gekka.VisualStudio.Extention
    {
        [PackageRegistration(UseManagedResourcesOnly = true)]
        [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
        [Guid(GuidList.guidVSPackage1PkgString)]
        [ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string)]
        [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string)]
        public sealed class VB2015StringQuotationPackage : Package
        {
            private EnvDTE80.DTE2 dte;
            private EnvDTE80.Events2 event2;
            private EnvDTE80.TextDocumentKeyPressEvents keyPressEvents;
    
            protected override void Initialize()
            {
                base.Initialize();
    
                this.dte = (EnvDTE80.DTE2)GetService(typeof(EnvDTE.DTE));
                this.event2 = (EnvDTE80.Events2)this.dte.Events;
    
                this.keyPressEvents = this.event2.TextDocumentKeyPressEvents;
                this.keyPressEvents.AfterKeyPress += TextDocumentKeyPressEvents_AfterKeyPress;
            }
    
            void TextDocumentKeyPressEvents_AfterKeyPress(string Keypress, EnvDTE.TextSelection Selection, bool InStatementCompletion)
            {
                try
                {
    
                    if (Keypress == "\r" && Selection.Parent.Language == "Basic")
                    {
                        Selection.LineUp();
                        try
                        {
                            Selection.StartOfLine(EnvDTE.vsStartOfLineOptions.vsStartOfLineOptionsFirstText);
                            Selection.EndOfLine(true);
    
                            string text = Selection.Text;
                            if (text.Length > 0)
                            {
                                int q = 0;
                                foreach (char c in text)
                                {
                                    if (c == '\"')
                                    {
                                        q++;
                                    }
                                    else if (c == '\'')
                                    {
                                        if ((q & 1) == 0)
                                        {
                                            return;
                                        }
    
                                    }
                                }
    
                                if ((q & 1) == 1)
                                {
                                    Selection.MoveToPoint(Selection.BottomPoint);
                                    Selection.Insert("\"");
                                }
                            }
    
                        }
                        finally
                        {
                            Selection.LineDown();
                            Selection.StartOfLine(EnvDTE.vsStartOfLineOptions.vsStartOfLineOptionsFirstText);
    
                            //dte.ExecuteCommand("Edit.DocumentFormat");
                        }
    
                    }
                }
                catch
                {
                }
            }
        }
    }

    github , VSIX


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク csviy 2016年9月5日 0:32
    2016年9月4日 16:34
  • ご回答ありがとうございます。

    その機能は確認できていたのですが、以前の機能は複数行(始まりのダブルクオテーションのみ)の貼り付けで自動的に張り付けたすべての行の文末にダブルクオテーションが付与され重宝していたもので。

    2016年9月5日 0:30
  • >2015からは文字列を複数行に連続して記述できるようになったので、そのからみかも

    これが理由なら納得です。

    ありがとうございました。

    2016年9月5日 0:31