Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8901

C# - VSCodeスニペットを読み込むツールを作ってみた

$
0
0

C# よく使うusing 名前空間 / (Windows)Form テンプレ作った (Visual Studio使わない人向け)
の続き。

読み込みのみ実装。書き込みもつくりたい。

環境

Windows10

仕様概要

VisualStudioCodeのスニペットのJsonは、標準のJsonではないようで1、全体を読み込むと例外を吐いてしまうため、一部のみを編集対象とすることにした。

Json内の
// %%kob58im-ToolBegin%%
// %%kob58im-ToolEnd%%
に囲まれた部分をJsonとして扱い、読み込みます。(複数ペアは不可)

画面キャプチャ

image.png

ソースコード

#define DEBUG
usingSystem;usingSystem.Drawing;usingSystem.IO;usingSystem.Text;usingSystem.Text.RegularExpressions;usingSystem.Windows.Forms;usingWindows.Data.Json;// to use JsonValue classpublicclassItemInfo{publicstringBody{get;set;}publicItemInfo(strings){Body=s;}}classVscodeSnippetEditor:Form{staticstringGetDefaultSnippetPath(){#if DEBUG
return(newFileInfo("csharp.json.txt")).FullName;#else
returnPath.Combine(Environment.GetEnvironmentVariable("appdata"),@"code\user\snippets\csharp.json");#endif
}TextBoxtxtName;TextBoxtxtPrefix;TextBoxtxtBody;TextBoxtxtDescription;SplitContainerspl;ListViewlsv;VscodeSnippetEditor(){ClientSize=newSize(800,600);spl=newSplitContainer();spl.Dock=DockStyle.Fill;spl.Orientation=Orientation.Horizontal;//Vertical;spl.SplitterDistance=400;Controls.Add(spl);lsv=newListView();lsv.View=View.Details;lsv.FullRowSelect=true;lsv.HideSelection=false;lsv.MultiSelect=false;lsv.GridLines=true;lsv.Columns.Add("Name",100,HorizontalAlignment.Left);lsv.Columns.Add("prefix",100,HorizontalAlignment.Left);lsv.Columns.Add("lines",50,HorizontalAlignment.Left);lsv.Columns.Add("body",250,HorizontalAlignment.Left);lsv.Columns.Add("description",300,HorizontalAlignment.Left);lsv.Dock=DockStyle.Fill;lsv.SelectedIndexChanged+=Lsv_SelectedIndexChanged;spl.Panel1.Controls.Add(lsv);txtName=newTextBox();txtName.Text=@"name";txtName.Location=newPoint(0,0);txtName.Width=200;spl.Panel2.Controls.Add(txtName);txtPrefix=newTextBox();txtPrefix.Text=@"prefix";txtPrefix.Location=newPoint(0,30);txtPrefix.Width=200;spl.Panel2.Controls.Add(txtPrefix);txtDescription=newTextBox();//txtDescription.Multiline = true;//txtDescription.ScrollBars = ScrollBars.Both;txtDescription.Text=@"description";txtDescription.Location=newPoint(0,60);txtDescription.Width=400;//txtDescription.Size = new Size(300, 100);spl.Panel2.Controls.Add(txtDescription);txtBody=newTextBox();txtBody.Multiline=true;txtBody.ScrollBars=ScrollBars.Both;txtBody.Text=@"body";txtBody.Location=newPoint(0,90);txtBody.Size=newSize(500,300);txtBody.Font=newFont("MS ゴシック",txtBody.Font.Size,txtBody.Font.Unit);spl.Panel2.Controls.Add(txtBody);Load+=(s,e)=>{MyResize();LoadSnippetToListView(GetDefaultSnippetPath());};Resize+=(s,e)=>{MyResize();};ResizeEnd+=(s,e)=>{MyResize();};spl.SplitterMoving+=(s,e)=>{MyResize();};spl.SplitterMoved+=(s,e)=>{MyResize();};}voidMyResize(){intw=spl.Panel2.ClientSize.Width;inth=spl.Panel2.ClientSize.Height-txtBody.Top;if(h<50){h=50;}txtBody.Size=newSize(w,h);}voidLsv_SelectedIndexChanged(objectsender,EventArgse){varindices=lsv.SelectedIndices;if(indices.Count!=1){return;}ListViewItemitem=lsv.Items[indices[0]];txtName.Text=GetNameFromItem(item);txtPrefix.Text=GetPrefixFromItem(item);txtBody.Text=GetBodyFromItem(item);txtDescription.Text=GetDescciptionFromItem(item);}// return bodystringReadAndSeparateSnippetText(strings,outstringhead,outstringtail){head=null;tail=null;RegexrBegin=newRegex(@"^[ \t]*//[ \t]*%%kob58im-ToolBegin%%",RegexOptions.Multiline);RegexrEnd=newRegex(@"^[ \t]*//[ \t]*%%kob58im-ToolEnd%%",RegexOptions.Multiline);MatchmBegin=rBegin.Match(s);if(!mBegin.Success){// unmatchreturnnull;}MatchmEnd=rEnd.Match(s);if(!mEnd.Success){// unmatchreturnnull;}intposEndOfBeginMark=mBegin.Groups[0].Captures[0].Index+mBegin.Groups[0].Captures[0].Length;intposStartOfEndMark=mEnd.Groups[0].Captures[0].Index;head=s.Substring(0,posEndOfBeginMark);tail=s.Substring(posStartOfEndMark);returns.Substring(posEndOfBeginMark,posStartOfEndMark-posEndOfBeginMark);}boolLoadSnippetToListView(stringpath){if(!File.Exists(path)){MessageBox.Show("Cannot find file: "+path);returnfalse;}strings;try{s=File.ReadAllText(path);}catch(IOExceptione){MessageBox.Show(e.ToString());returnfalse;}stringhead;stringtail;stringeditablePart=ReadAndSeparateSnippetText(s,outhead,outtail);JsonObjectjoRoot=JsonObject.Parse("{"+editablePart+"}");// int n = jo.Count; // オブジェクトの数lsv.BeginUpdate();try{foreach(stringnameinjoRoot.Keys){JsonValuejvItem=joRoot.GetNamedValue(name);if(jvItem.ValueType==JsonValueType.Object){JsonObjectjoItem=jvItem.GetObject();ListViewItemitem=MakeItemFromJson(name,joItem);lsv.Items.Add(item);}}}finally{lsv.EndUpdate();}returntrue;}ListViewItemMakeItemFromJson(stringname,JsonObjectjo){JsonValuejvPrefix;stringsPrefix=MakeItemPrefix(jo,outjvPrefix)??"";JsonValuejvDescription;stringsDescription=MakeItemDescription(jo,outjvDescription)??"";JsonValuejvBody;string[]sBody=MakeItemBody(jo,outjvBody)??newstring[]{""};returnMakeItem(name,sPrefix,sBody,sDescription);}ListViewItemMakeItem(stringname,stringprefix,string[]body,stringdescription){stringfirstLine="";if(body.Length>=1){firstLine=body[0];}varitem=newListViewItem(newstring[]{name,prefix,body.Length.ToString(),firstLine,description});item.Tag=newItemInfo(String.Join("\r\n",body));returnitem;}stringGetNameFromItem(ListViewItemitem){returnitem.SubItems[0].Text;}stringGetPrefixFromItem(ListViewItemitem){returnitem.SubItems[1].Text;}stringGetBodyFromItem(ListViewItemitem){return((ItemInfo)item.Tag).Body;}stringGetDescciptionFromItem(ListViewItemitem){returnitem.SubItems[4].Text;}stringMakeItemPrefix(JsonObjectjoItem,outJsonValuejv){try{jv=joItem.GetNamedValue("prefix");}catch(Exception){jv=null;returnnull;}if(jv.ValueType==JsonValueType.String){returnjv.GetString();}elseif(jv.ValueType==JsonValueType.Array){returnJoinJsonStringArray(", ",jv.GetArray());}else{returnnull;}}stringMakeItemDescription(JsonObjectjoItem,outJsonValuejv){try{jv=joItem.GetNamedValue("description");}catch(Exception){jv=JsonValue.CreateStringValue("");return"";}if(jv.ValueType==JsonValueType.String){returnjv.GetString();}else{return"";}}string[]MakeItemBody(JsonObjectjoItem,outJsonValuejv){try{jv=joItem.GetNamedValue("body");// 第2引数にデフォルト値として JsonValue.CreateNullValue() を入れようとしたが、なぜか無い..}catch(Exception){jv=null;returnnull;}if(jv.ValueType==JsonValueType.String){returnnewstring[]{jv.GetString()};}elseif(jv.ValueType==JsonValueType.Array){string[]t=JsonArrayToStringArray(jv.GetArray());if(t.Length==0){returnnewstring[]{""};}returnt;}else{returnnull;}}staticstringJoinJsonStringArray(stringsep,JsonArraya){varsb=newStringBuilder();boolfirstFlag=true;foreach(JsonValuejvChildina){if(firstFlag){firstFlag=false;}else{sb.Append(sep);}if(jvChild.ValueType==JsonValueType.String){sb.Append(jvChild.GetString());}}returnsb.ToString();}staticstring[]JsonArrayToStringArray(JsonArraya){vars=newstring[a.Count];for(inti=0;i<a.Count;i++){s[i]=a.GetStringAt((uint)i);}returns;}[STAThread]staticvoidMain(string[]args){Application.Run(newVscodeSnippetEditor());}}

コンパイル方法

cscのパスは通っている前提。

バッチファイル
csc /r:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Runtime.WindowsRuntime\v4.0_4.0.0.0__b77a5c561934e089\system.runtime.windowsruntime.dll ^
/r:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Runtime.InteropServices.WindowsRuntime\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Runtime.InteropServices.WindowsRuntime.dll ^
/r:C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Runtime\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Runtime.dll ^
"/r:C:\Program Files (x86)\Windows Kits\8.1\References\CommonConfiguration\Neutral\Annotated\Windows.winmd" %*

入力データ

csharp.json.txt
{//Placeyoursnippetsforcsharphere.Eachsnippetisdefinedunderasnippetnameandhasaprefix,bodyand//description.Theprefixiswhatisusedtotriggerthesnippetandthebodywillbeexpandedandinserted.Possiblevariablesare://$1,$2fortabstops,$0forthefinalcursorposition,and${1:label},${2:another}forplaceholders.Placeholderswiththe//sameidsareconnected.//Example:"click event":{"prefix":"Click",  "body":["Click  += (sender,e)=>{;};"],"description":"Event lambda expression"},"load event":{"prefix":"Load",   "body":["Load   += (sender,e)=>{;};"],"description":"Event lambda expression"},"resize event":{"prefix":"Resize", "body":["Resize += (sender,e)=>{;};"],"description":"Event lambda expression"},//%%kob58im-ToolBegin%%"label constructor":{"prefix":"label","body":["$1 lbl = new Label();","lbl.Text = @\"\";","lbl.TextAlign = ContentAlignment.MiddleLeft;","lbl.Location = new Point(,);","lbl.Size = new Size(,);","Controls.Add(lbl);"],"description":"label constructor"},"textbox constructor":{"prefix":"textbox","body":["$1 txt = new TextBox();","txt.Text = @\"\";","txt.Location = new Point(,);","txt.Width = ;","Controls.Add(txt);"],"description":"textbox constructor"},"multiline textbox constructor":{"prefix":"textboxm","body":["$1 txt = new TextBox();","txt.Multiline = true;","txt.ScrollBars = ScrollBars.Both;","txt.Text = @\"\";","txt.Location = new Point(,);","txt.Size = new Size(,);","Controls.Add(txt);"],"description":"multiline textbox constructor"},"listview constructor":{"prefix":["listview","hoge"],"body":["$1 lsv = new ListView();","lsv.View = View.Details;","lsv.FullRowSelect = true;","lsv.HideSelection = false;","lsv.MultiSelect = false;","lsv.GridLines = true;","lsv.Columns.Add(\"Item\",  100, HorizontalAlignment.Left);","lsv.Columns.Add(\"Value\", 400, HorizontalAlignment.Left);","lsv.Location = new Point(,);","lsv.Size = new Size(,);","//lsv.Dock = DockStyle.Fill;","Controls.Add(lsv);"],"description":"listview constructor"},"task":{"prefix":"Task","body":["Task.Run(() => {","","    // this.Invoke((MethodInvoker)(() => xxx.yyy = zzz)); // UI control","","});"],"description":"Task"},"using directive":{"prefix":"using","body":["using "],"description":"using directive"},"CSharp Template":{"prefix":"usingall","body":["using System;","using System.Collections;","using System.Collections.Generic;","using System.ComponentModel;","using System.Data;","using System.Diagnostics;","using System.Drawing;","using System.Drawing.Drawing2D;","using System.Drawing.Imaging;","using System.IO;","using System.Reflection;","using System.Runtime.InteropServices;","using System.Text;","using System.Text.RegularExpressions;","using System.Threading;","using System.Threading.Tasks;","using System.Windows.Forms;","","class XXXX : Form","{","    XXXX()","    {","        //Text = ;","        //ClientSize = new Size(,);","        //Controls.Add(xx);","    }","    ","    [STAThread]","    static void Main(string[] args)","    {","        Application.Run(new XXXX());","    }","}",""],"description":"Insert the template code"},"CSharp Template2":{"prefix":"usingconsole","body":["using System;","using System.Collections;","using System.Collections.Generic;","using System.IO;","using System.Text;","using System.Text.RegularExpressions;","","class XXXX","{","    [STAThread]","    static void Main(string[] args)","    {","        ;","    }","}",""],"description":"Insert the template code"}//%%kob58im-ToolEnd%%}

  1. //コメントとか 


Viewing all articles
Browse latest Browse all 8901

Trending Articles