Oleg Shilo:基于CS-Script的Notepad++插件

如果只是想写几句试验代码,Visual Studio显得有点大材小用。因此一些开发者会选择轻量级的编辑器,如Notepad++,来满足编写脚本的需要。Oleg Shilo向我们介绍了他的项目,一个优秀的基于CS-Script的Notepad++的插件

\

InfoQ:CS-Script是什么?它与普通的C#有什么区别?

\
\

Oleg:简单来说,CS-Script是一个基于CLR的运行时环境,可以执行用C#编写的脚本。值得注意的是,CS-Script并不是一个解释器,而是封装了微软或Mono C#编译器的shell。因此它与普通的C#没有什么不同。实际上,它的脚本引擎面向的也是ECMA兼容的“单纯功能”的C#,与用Visual Studio或MonoDevelop编译成程序集的C#没有什么区别。

\

描述CS-Script最简单的方式是:我们可以用C#编写算法,编译成程序集,然后直接执行该程序集,或在宿主应用程序中加载并执行。但CS-Script可以跳过编译阶段,而立即加载并执行代码,将C#代码当做脚本来处理。换句话说,运行时的C#脚本就是一个动态编译的程序集。

\

当然,实际情况要比这复杂得多,而且CS-Script提供了众多吸引眼球的特性:自定义JIT编译、省略类的语法、自动命名空间到程序集的映射、接口对齐等。

\

CS-Script现在已经9岁了,并且有一批用户。MediaPortalFlashDevelop就是基于CS-Script构建的。它还被用于AutoCAD插件、自动化和机器人、游戏和规则引擎。

\

CS-Script受到了Python的启发和影响。尽管它们面对的是完全不同的运行时范式,但CS-Script还是从Python借鉴了不少有用的想法,如多脚本执行、预编译等等。

\
\

InfoQ:为什么会为Notepad++创建一个插件?

\
\

Oleg:原因有很多。在Windows上开发的程序员很少有没听说过Notepad++的。对很多人来说,它是“必备”的源代码编辑器。能够获此殊荣,Notepad++是当之无愧的,因为它具有优秀的架构和近乎完美的实现。但除了这些赞誉,它还有一定的上升空间。

\

我认为Notepad++的“自动补全”功能还有点简陋,还不足以成为智能的代码辅助工具。它只是按文件类型分组的一些“高频词”而已。

\

我坚信这样一个很牛的编辑器应该变得更好。因此我决定为Notepad++实现一个C#的智能感知解决方案。

\

我想让Notepad++能拥有与Visual Studio同种级别的智能感知。同时还包括“转到定义”、“查找引用”、“显示方法信息”、“添加缺少的‘using’”和代码格式化。这就是这个插件诞生的缘由。智能感知相关的功能基于NRefactory,但插件的核心是CS-Script。并且由于插件使用了脚本引擎,因此可以在Notepad++中直接执行C#代码。

\

当实现完成后,我又催生了其他一些想法。因此又发布了另一个Notepad++插件(NppScript)。它使用C#脚本对Notepad++本身进行自动化。实际上每个这样的脚本自身,加上一些相关的插件特性(工具条图标、快捷键、菜单项),都可以看成是一个插件。下面的截图展示了这一想法。

\

(点击图像放大)

\

d4a1fee083ec479c6d0967299bb6151a.png

\
\

另一个原因是因为CS-Script。尽管有了Visual Studio扩展和Windows Explorer Shell扩展,我还是觉得CS-Script不够圆满,没有一个专门的富编辑器。我当然知道Visual Studio提供了无与伦比的“编辑能力”,但它也不是“银弹”。我想让C#和CS-Script用户拥有一个强大且轻量级的编辑器,不需要考虑任何部署和license的问题。

\

3年前我甚至认真地尝试着开发这样一款编辑器。我花了大量时间对SharpDevelop做反向工程,并且几乎完成了一个为C#量身定做的编辑器(代码名为UltraSharp)。它是一个基于编辑器的自定义的WinForm,包装了NRefactory 5预览版。但其性能和编辑功能都不能让人满意。因此我放弃了这个项目,转而专注于在Visual Studio中集成CS-Script。我虽然取得了成功,但仍旧心仪永久免费、性能卓越、轻量级的Notepad++。

\

对于这个插件,我还有一个不太明显但却强烈的动机。我们日常工作如此复杂。框架、工厂、模式、设计原则……我们几乎忘记了编程的乐趣。我不止一次地在文章中看到介绍批量重命名工具、下载器、目录同步工具或仅仅是又一个MP3文件标签组织工具。这些工具常常是为了引出全功能的应用程序开发(或部署方案),但在很多情况下,同样的工具可以仅用几行代码实现:

\
\
\foreach(string file in Directory.GetFiles(\".\
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值