65.9K
CodeProject 正在变化。 阅读更多。
Home

Typewriter.NET 文本编辑器

2018 年 11 月 9 日

CPOL

1分钟阅读

viewsIcon

12616

downloadIcon

633

如何编写您的记事本

引言

我想开发一个使用和学习都不需要太多精力的文本编辑器。 结果是几个简单的原则

  • 编辑器无需鼠标即可工作(vi 模式下也无需箭头)
  • 由于多个光标,不需要单调的操作

    vi 模式,宏

  • 允许光标在视线方向跳动(在 vi 模式下按空格键,在光标处按字符,然后显示字符)
  • 使用当前文件夹的简单概念而不是项目
  • 通过 Ctrl+Shift+P 轻松搜索如何做某事。 并在帮助中进行全文搜索
  • 只需在配置中添加一行即可添加外部编译器或构建脚本
  • 通过更改文本文件或从命令对话框设置值来进行设置(此类参数在配置中编写时没有值属性),这样就无需在界面中搜索它们

Using the Code

Typewriter.NET 对于开发自身非常有用。 构建和运行 Typewriter.NET

  • 在编辑器中将 *typewriter-net* 打开为当前文件夹 (F4)。
  • 按 F5。
  • 此快捷方式运行配置中的命令
    <item name="f5Command" 
    value="!c:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe /verbosity:m 
    /p:Configuration=Release /target:tw"/>

    此行允许自动完成

    <item name="omnisharpSln" value="."/>

创建您自己的命令

您需要更改 *Commander.cs* - 在命令列表中编写您的命令

	public void Init(MainForm mainForm, Settings settings, TempSettings tempSettings)
	{
		this.mainForm = mainForm;
		this.settings = settings;
		this.tempSettings = tempSettings;

		history = tempSettings.CommandHistory;
		commands.Add(new Command("help", "", "open/close tab with help text", DoHelp));
		...
		commands.Add(new Command("replb", "[{…}]command", "open REPL bottom", DoReplBottom));
	}

探索 enum 命令,它在每个光标处输入数字

	commands.Add(new Command("enum", "[n0] [step] [count]", "...", DoEnum));
	commands.Add(new Command("enum0", "[n0] [step] [count]", "...", DoEnum0));
	commands.Add(new Command("enumr", "[n0] [step] [count]", "...", DoEnumr));
	...
	private void DoEnum(string text)
	{
		ProcessEnum(text, EnumGenerator.Mode.Number);
	}
	
	private void DoEnum0(string text)
	{
		ProcessEnum(text, EnumGenerator.Mode.ZeroBeforeNumber);
	}
	
	private void DoEnumr(string text)
	{
		ProcessEnum(text, EnumGenerator.Mode.Roman);
	}
	
	private void ProcessEnum(string text, EnumGenerator.Mode mode)
	{
		...
		EnumGenerator generator = new EnumGenerator
                      (text, lastBuffer.Controller.SelectionsCount, mode);
		...
		lastBuffer.Controller.InsertTexts(generator.texts.ToArray());
	}

如何附加菜单项

您可以在 *MainForm.cs* 中附加公共项目

	private void BuildMenu()
	{
		keyMap = new KeyMap();
		doNothingKeyMap = new KeyMap();

		doNothingKeyMap.AddItem(new KeyItem(Keys.Escape, null, KeyAction.Nothing));
		doNothingKeyMap.AddItem(new KeyItem(Keys.Escape | Keys.Shift, null, KeyAction.Nothing));
		doNothingKeyMap.AddItem(new KeyItem(Keys.Control | Keys.J, null, KeyAction.Nothing));
		doNothingKeyMap.AddItem(new KeyItem(Keys.Control | Keys.K, null, KeyAction.Nothing));

		keyMap.AddItem(new KeyItem(Keys.Control | Keys.N, null, 
                                   new KeyAction("&File\\New", DoNew, null, false)));
		keyMap.AddItem(new KeyItem(Keys.Control | Keys.O, null, 
                                   new KeyAction("&File\\Open", DoOpen, null, false)));
		keyMap.AddItem(new KeyItem(Keys.None, null, new KeyAction("&File\\-", 
                                   null, null, false)));
		...
		keyMap.AddItem(new KeyItem(Keys.None, null, 
        new KeyAction("&?\\Kate syntax highlighting help…", DoOpenSyntaxHelp, null, false)));
	}
	...
	private bool DoOpenSyntaxHelp(Controller controller)
	{
		OpenDocument(Path.Combine(AppPath.StartupDir, "syntax/syntax.html"));
		return true;
	}

如果命令结果为真,则会阻止其他具有相同快捷键的操作对快捷方式做出反应。

自动完成实现

创建一个简单的自动完成示例

  • 创建您自己的 autocomplete 命令
    	commands.Add(new Command("simple-autocomplete", "", 
                                 "simple autocomplete", DoSimpleAutocomplete));
    	...	
    	public void DoSimpleAutocomplete(string text)
    	{
    		Buffer lastBuffer = mainForm.LastBuffer;
    		if (lastBuffer == null)
    		{
    			mainForm.Dialogs.ShowInfo("Error", "No buffer");
    			return;
    		}
    		Selection selection = lastBuffer.Controller.LastSelection;
    		Place place = lastBuffer.Controller.Lines.PlaceOf(selection.anchor);
    		string word = lastBuffer.Controller.GetLeftWord(place);
    		List<Variant> variants = new List<Variant>();
    		for (int i = 1; i <= 3; i++)
    		{
    			Variant variant = new Variant();
    			variant.CompletionText = "simple_" + i;
    			variant.DisplayText = "simple_" + i;
    			variants.Add(variant);
    		}
    		if (mainForm.LastFrame.AsFrame != null)
    			mainForm.LastFrame.AsFrame.ShowAutocomplete(variants, word);
    	}
  • 在 *config* 中的文本文件中为 autocomplete 设置快捷方式
    	<item name="ctrlSpaceCommand:*.txt" value="simple-autocomplete"/>

历史

  • 2018 年 11 月 5 日第一次更改
© . All rights reserved.