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

Ben*_*Ben 9 bash shell tabs fish

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

鱼壳非常酷 - 但我讨厌完成标签的功能之一.

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

另一方面,Fish解释{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 ...

rid*_*ish 11

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

选项卡完成行为已在fish top-of-tree(尚未发布)中重写,并被称为"new pager".您可以在此处查看设计目标和讨论.我在本回复的底部写了一个注释,了解如何获取它.

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

我在YouTube上播放了一个关于新寻呼机的简短截屏视频.需要注意的事项:1.只需键入更多内容就可以解除菜单,2.它会逐渐"展开"(需要几个标签才能完全显示),即使有大量的完成情况,也不会以模态方式接管您的屏幕,并且易于搜索和导航,并且3. escape将始终关闭它并将命令行恢复到您键入的内容.

让我逐个解答你的问题:

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

"我无法将输入上下文恢复到我实际输入的字母".使用新的寻呼机,转义键就是这样做的.它很容易按下,因为逃脱就在手指上方的标签上方.

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

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

"它不允许使用tab来完成嵌套路径"很抱歉,我不确定你的意思.bash和fish都会附加一个/ when选项卡来完成一个目录.

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

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

如果您使用自制程序,则可以从主程序安装brew install fish --HEAD.还有适用于Linux夜间版本.最后,请随时在https://github.com/fish-shell/fish-shell/issues上打开一个问题,并提出改进建议.