更新:此投诉与fish的旧版本有关——请参阅fish开发人员之一的以下评论,该评论描述了fish寻呼机行为的令人敬畏的改进,这些改进使此投诉无效。
鱼壳很酷——但是我讨厌tab completion的一个特性。
我经常——几乎像一个紧张的滴答声——在更改目录时键入路径时会碰到{tab}{tab}。这使我可以使用{tab}检查某个路径的内容,同时解决当前击键允许解决的路径消歧问题。这提供了一个很好的方法来快速发现最快的键组合,以到达文件系统中的某个位置,而无需花太多心思,也不必事先知道各个目录的内容。
另一方面,Fish以一种我认为非常烦人的方式解释{tab}{tab}。第一个{tab}列出了可能的补全,太好了。下一个选项卡是按下fish选择列表中的第一个完成,并将当前在行上输入的路径的最后一部分替换为完整的第一个完成,而不考虑消歧状态。随后的选项卡循环显示下一个可能性。它与windows命令shell的功能类似。
这比正常的猛击行为要糟糕得多。。。
考虑一个深度嵌套的目录结构foo/bar/baz/a/b/c/
其中一些foo、bar、baz是空目录。Bash tab completion允许我键入cd foo/{tab}{tab}{tab}{tab}{tab}{tab}{tab}——无需考虑我点击tab的次数,无需考虑点击tab之前对命令行条目当前状态的影响。
正常情况下,所有这些目录都不会是空的——但是上面的方法仍然可以很快地发现需要输入的最少字符数,以使其进入某个深度嵌套的路径。
使用bash行为:
cd some/unknown/dir/{tab}{tab}保证
(1)我看到目录dir的内容/
(2)到目前为止,从我的命令中可以明确表达的大部分内容已经完成,但没有更多。
点击上面的两个标签后,我可能会看到如下内容:
abc123型
巴123
巴兹123
bcd123号
mnop123型
可以执行以下操作:
一个{TAB}{TAB}(给出abc123,如果这是一个目录,则列出其内容)
m{tab}{tab}(给出mnop123,如果它的a目录列出了它的内容)
假设我想到达bcd123路径:
b——显示我打字太快了,现在只显示了3个选项,我很容易得出结论,我只需要按“c”就可以消除对目标的歧义
b{tab}{tab}c{tab}{tab}(获取所需的路径,如果是目录,则列出bcd123的内容)
鱼的模型更糟。b{tab}{tab}将完成到bar123,我必须按tab键未知次数才能获得所需的值,而且我无法将条目上下文恢复到目前为止我实际键入的字母(除了按backspace键一大堆次)。如果这个目录中有一大堆以ba开头的东西——我完全搞砸了。。。
一般来说,fish的模型更糟:
它不允许使用tab来完成嵌套路径——要对fish执行此操作,您需要在命令序列中的正确时间“/”——这需要精神反馈
在大目录中更难发现消歧序列
一般来说,在点击tab键之前需要“小心”,这会减少点击tab键的次数,降低tab键的实用性。。。
有人请告诉我,有一种方法可以改变鱼的行为,使其更像猛击。。。鱼很酷,但这种行为是不可用的——如果没有办法改变这一点,我将不得不回去痛击。。。
最佳答案
我赞扬你写了这篇详细和深思熟虑的文章,它值得同样详细和深思熟虑的回应!
标签完成行为已经在fish-top-of-tree(尚未发布)中被重写,并被称为“new pager”。您可以看到设计目标和讨论here。我在这封回信的底部写了一张便条,告诉你如何得到它。
贝壳是个人的,和任何个人的东西一样,合理化和合理化都没有任何价值:你要么喜欢,要么不喜欢,我们甚至可能没有意识到影响我们感觉的因素。所以我只能说试试,看看你的感受,然后(请)汇报。
我在YouTube上放了一个新寻呼机。注意事项:1。只要再输入2,菜单就被取消了。它“逐步展开”(需要几个选项卡才能完全显示),即使完成了大量的工作,也永远不会以模式接管你的屏幕,而且很容易搜索和导航。escape将始终忽略它,并将命令行放回您键入的内容。
让我单独谈谈你的担心:
“我必须按tab键无数次才能得到我想要的值”。使用新寻呼机时,所选项目将在菜单中突出显示。这听起来很小,但我个人认为这会有很大的不同:点击tab键的次数会变为已知的次数,而且由于你的手指在tab键上方,所以只需点击它几次通常比键入其他字母容易。也可以使用箭头键导航。
“我无法将条目上下文恢复到仅输入到目前为止实际键入的字母”。有了新的寻呼机,转义键就可以做到这一点。因为escape就在tab键的正上方,所以很容易按下。
“如果这个目录中有一大堆以ba开头的东西——我完全搞砸了。”。bash和老式寻呼机都不能很好地处理大量的完工作业。fish会让您进入这个模式分页环境,而bash会用“显示所有1002种可能性”模式来中断您的流程?(y或n)“迫使你停止正在做的事情并点击‘n’的对话框”。
我想你会喜欢这个新的传呼机如何处理这个问题的。最初,你得到一个简短的菜单,它在你的提示下填充了最多五行(不在上面,而不是替换)。此菜单是非模态的,可通过键入更多或单击escape来取消。如果再次按tab键,菜单将增大以显示更多的完成项,但仍然是非模态的。永远不会有不和谐的过渡。
“它不允许使用制表符来完成嵌套路径”对不起,我不确定您的意思是什么。bash和fish都会在tab完成目录时附加一个/when。
“在大目录下更难发现消歧序列”使用新的寻呼机,您可以点击escape,再键入一些,然后再次点击tab。或者你可以搜索菜单:把焦点放在菜单上,输入一些内容,然后过滤掉。请看上面的截图。
“一般来说,在点击tab键之前,你需要‘小心’,这会减少点击tab键的次数,并降低它的实用性”这是一个非常有效的点,新的寻呼机通过几种方式来解决这个问题。首先,它使用渐进式披露的概念,这意味着需要“工作”来输出大量数据。其次,它永远不会像旧的模态寻呼机那样“接管你的屏幕”。最后,您可以点击escape返回到您输入的内容,并且由于寻呼机出现在提示符下面,它不会像bash那样在您的滚动条中留下一些小东西。
如果您使用的是自制,则可以通过brew install fish --HEAD
从master安装。还有short little screencast。最后,你可以在nightly builds for Linux发表任何改进意见。