可以更改鱼壳中的标签完成行为吗?

时间:2015-01-28 23:50:04

标签: bash shell tabs fish

更新此投诉涉及旧版本的鱼 - 请参阅以下评论,其中一位鱼类开发人员描述了鱼类传呼机行为的令人敬畏的改进,从而使此投诉无效。

鱼壳很酷 - 但是我讨厌制表完成的一个功能。

我经常 - 几乎像一个紧张的勾号 - 在更改目录时键入路径时会点击{tab} {tab}。这让我可以使用{tab}来检查某些路径的内容,同时解决当前击键允许解决的大部分路径消歧问题。这提供了一种很好的方法来快速发现最快的密钥组合,以便在没有经过深思熟虑的情况下到达文件系统中的某个位置,或者必须事先知道各种目录的内容。

另一方面,鱼在我认为是令人难以置信的令人讨厌的方式解释{tab} {tab}。第一个{tab}列出了可能的完成情况,这很棒。按下下一个选项卡,fish选择列表中的第一个完成并替换当前在该行上输入的路径的最后部分,并完成第一次完成 - 无论消除歧义状态如何。随后的标签循环了下一个可能性。它类似于windows命令shell的功能。

这远比正常的bash行为差得多......

考虑一个深层嵌套的目录结构foo / bar / baz / a / b / c /

foo,bar,baz中的一些是空目录。 Bash标签完成后,我可以输入cd foo / {tab} {tab} {tab} {tab} {tab} {tab} - 无需考虑我击中标签的次数,而无需考虑效果在命令行条目的当前状态下按Tab键之前。

正常情况下所有这些目录都不会为空 - 但上面的内容仍然可以很快发现我需要输入的最少数量的字符,以使其成为一些深层嵌套的路径。

使用bash行为: cd some / unknown / dir / {tab} {tab}保证

(1)我看到目录dir的内容/ (2)到目前为止,从我的命令中可以明确表达的内容已经完成,但不多了。

点击上面的两个标签后,我可能会看到如下内容:

ABC123 bar123 baz123 bcd123 mnop123

可以采取以下行动:

a {TAB} {TAB}(给我abc123,如果这是一个目录列出其内容)

m {tab} {tab}(给我mnop123,如果它的目录列出了其内容)

假设我想要到达路径bcd123: b - 告诉我我的打字太快了,现在只显示了3个选项我很容易得出结论我只需要点'c'来消除歧视我的目标

b {tab} {tab} c {tab} {tab}(获取我想要的路径,列出bcd123的内容,如果它是一个目录)

鱼的模型更糟糕。 b {tab} {tab}将完成到bar123,我必须按Tab键未知次数才能获得我想要的值,而且我无法将条目上下文恢复为仅仅是我的字母实际上输入到这一点(除了多次击退退格)。如果在这个目录中碰巧有一大堆以ba开头的事情怎么办 - 我完全搞砸了会发生什么......

一般来说,鱼的模型更糟糕:

  • 它不允许使用tab来完成嵌套路径 - 在命令序列中的正确时间使用'/'来执行此操作 - 这需要精神反馈
  • 在大型目录中发现消歧序列时要困难得多
  • 一般要求你在点击标签之前“小心点”,这会让你不那么频繁地击中它并降低它的实用性......

Somone请告诉我有一种方法可以改变鱼在这里的行为更像是bash ...鱼很酷但是这种行为无法使用 - 如果没有办法改变这个,我将不得不回到bash ...

1 个答案:

答案 0 :(得分:11)

我赞赏你撰写这篇详尽而深思熟虑的文章,并且应该得到同样详尽和深思熟虑的回应!

标签完成行为已在fish top-of-tree(尚未发布)中重写,并被称为“新寻呼机”。您可以看到设计目标和讨论here。我在本回复的底部写了一个注释,说明如何获得它。

贝壳是个人的,就像个人一样,理性化和理由是不值得的:你要么喜欢它,要么你不喜欢,我们甚至可能没有意识到影响我们感情的因素。所以我真的可以说是尝试一下,看看你的感受,并(请)报告回来。

我在YouTube上张贴了short little screencast新的寻呼机。需要注意的事项:1。只需键入更多内容就可以解除菜单,2。它会逐渐“展开”(需要一些标签才能完全可见),即使有大量的完成情况,也不会以模态方式接管您的屏幕,并且易于搜索和导航,并且3. escape将始终将其解除并将命令行恢复为您键入的内容。

让我逐一解答您的疑虑:

“我必须点击未知次数才能获得我想要的值”。使用新的寻呼机,所选项目将在菜单中突出显示。这听起来很小,但我个人认为这会产生很大的不同:点击标签的额外次数变为已知,并且因为你的手指超过标签,所以通常更容易点击它时间而不是键入其他字母。您也可以使用箭头键进行导航。

“我无法将条目上下文仅返回到我实际输入的字母”。使用新的寻呼机,转义键就是这样做的。它很容易按下,因为逃脱位于标签正上方,你的手指在哪里。

“如果在这个目录中碰巧有一大堆以ba开头的东西怎么办 - 我完全搞砸了会发生什么”。 bash和old-pager-fish都没有很好地处理大量的完井。 fish会让你进入这个模态分页环境,而bash会使用模式“显示所有1002种可能性?(y或n)”对话框来强制你停止正在进行的操作并点击'n'。

我想你会喜欢新的寻呼机如何处理这个问题。最初你得到一个简短的菜单,在你的提示符下面最多填充五行 (不在上面,而不是替换)。此菜单是非模态的,可以通过输入更多内容或点击转义来解除。如果再次按Tab键,菜单会增长以显示更多完成,但仍然是非模态的。从来没有一个不和谐的过渡。

“它不允许使用标签来完成嵌套路径”抱歉,我不确定你的意思。 bash和fish都会附加一个/ when标签来完成一个目录。

“在大型目录中发现消歧序列要困难得多”使用新的寻呼机,您可以点击转义,输入更多内容,然后再次选项卡。或者您可以搜索菜单:将焦点放在菜单中并键入内容,然后进行过滤。请参阅上面的截屏视频。

“一般要求你在点击标签之前'小心',这会让你不那么频繁地点击它并降低其效用”一个非常有效的点,新的寻呼机在几个方面解决了这个问题。首先,它使用渐进式披露的概念,这意味着输出大量数据需要“工作”。其次,它永远不会像旧的模态寻呼机一样“占据你的屏幕”。最后,你可以点击escape来回到你输入的内容,并且由于寻呼机出现在提示符下方,它不会像bash那样在你的回滚中留下一些小问题。

如果您使用自制程序,则可以通过brew install fish --HEAD从主程序安装。还有nightly builds for Linux。最后,请随时在https://github.com/fish-shell/fish-shell/issues打开一个问题,提出改进意见。