有没有类似于GNU readline的.Net库?

7

我正在考虑用C#编写控制台应用程序,并希望像GNU readline一样加入历史记录、自动完成和命令行编辑功能(不一定像那么复杂!)

是否有现有的.NET库提供这种类型的功能?我猜一个选项是使用Interop服务调用GNU readline。但是否有本地选项?


你考虑过使用PowerShell snap-in吗?目前我能想到的.NET世界中最“本地”的选项就是它了。 - Dirk Vollmar
也许只是我个人的看法,但当你开始考虑通过UI来增强用户体验时,你真的应该开始关注Windows Forms。 - Hans Passant
我不确定你的意思是什么?你是在建议我将我的应用程序编写为PowerShell插件吗?那不会只给我提供PowerShell的标准命令行编辑功能(即基本的Windows控制台功能加上漂亮的选项卡完成)吗?我需要更多的功能(历史搜索,单词删除等)。 - Paul Moore
nobugz - GUI应用程序很好,但我仍然希望允许用户进行命令行交互和命令行编辑。考虑PowerShell与PowerShell ISE之间的区别。个人而言,我讨厌ISE的命令行编辑设施,我更喜欢控制台版本,但我想要更多一点(因为控制台IO不可定制)。 - Paul Moore
4个回答

10

你可能会想要查看Miguel de Icaza的getline.cs(博客文章中的链接已经失效,代码现在可以在此处找到)。根据你实际所需的readline功能,这可能已经足够满足你的需求了。

好的一点是,它全部包含在一个文件中(因此称为getline.cs),并采用MIT X11许可证。

使用它非常容易。

如果你想尝试一下,只需下载该文件并编译即可:

C:\> csc.exe /d:DEMO getline.cs 
C:\> getline.exe
shell>

#ifdef DEMO 部分还展示了基本的 REPL:

var le = new LineEditor("whatever");
string s;

while ((s = le.Edit("my prompt> ", "")) != null)
{
    // User input from command line / prompt now in "s".
}

我尝试过来自CSharpRepl项目的getline库,但对于制表符补全的支持有限。此外,补全功能本身也很难实现。 也许只是我的能力有限... - Antonello
但是链接没有损坏 o.o - Hi-Angel

3

虽然这是一个老问题,但仍然与谷歌搜索结果相关。现在有一个好的选择https://github.com/tonerdo/readline。引用它的README:

ReadLine是一个纯C#编写的GNU Readline库。它可以作为内置Console.ReadLine()的替代品,并带有一些类似于Unix shell的终端功能,例如命令历史记录导航和标签自动完成。

它是跨平台的,在任何支持.NET的地方运行,目标是netstandard1.3,这意味着它可以与.NET Core以及完整的.NET Framework一起使用。

许可证

该项目使用MIT许可证。


非常感谢!在我看来,你的回答比被接受的回答更相关。 - Evgeniy
当然,不客气。最后我自己使用了Miguel在https://dev59.com/VUvSa4cB1Zd3GeqPcTLY#2756850中提到的库。 - Per Lundberg
有趣,好知道!很想知道为什么 tonerodo readline 对你来说效果不好?从我浅薄的理解来看,你在答案中提到的那个看起来更先进。 - Evgeniy
有趣,好知道!很想知道为什么 tonerodo readline 对你来说效果不好?从我浅薄的理解来看,你在答案中提到的那个看起来更先进。 - undefined
@Evgeniy,我觉得它已经没有维护了。Miguel的库也很好,因为它是“自包含”的;我可以将它复制到我的应用程序中并在没有外部依赖的情况下使用它。有关更多详细信息,请参阅我应用程序存储库中的此线程:https://github.com/perlang-org/perlang/issues/182#issuecomment-1039498915 - Per Lundberg
显示剩余2条评论

2
一个旨在模拟 RedLine 大部分功能的项目是 Deveel ReadLine,但我必须说它没有得到维护。上一次我在 .NET 和 Mono 上使用时,它的表现非常好,尽管在取消自动折叠的行时有一个小 Bug。

2

我所知道的唯一选择是Mono-Readline

它为GNU Readline库提供了.NET接口,但版本只有0.0.1,而且据我所知,它只能在Mono运行时上运行。

同时,你需要注意许可证问题......据我所知,任何链接GNU Readline库的内容都必须在GPL下发布。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接