AdaNSISYAMLMakefileHaskellLuaErlangPascalMarkdownShellRubyTextJSONWin32PythonXMLPHPHTMLCJavaJavascriptWindowsC++C#
Typewriter.NET 文本编辑器






3.69/5 (7投票s)
如何编写您的记事本
引言
我想开发一个使用和学习都不需要太多精力的文本编辑器。 结果是几个简单的原则
- 编辑器无需鼠标即可工作(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 日第一次更改