有哪些好的 Linux 命令可以让命令行上的不同目录之间的切换更容易?
我经常不得不在具有长名称的不同目录之间切换,例如
cd foo/20100801-rev124-test2
ls
cd ../20100801-rev124-test1
ls
cd ../20100802-rev126-bar
Run Code Online (Sandbox Code Playgroud)
通常,我使用制表符完成,所以它是这样的:
cd ../2010080 Tab2 Tab-rev12 Tab6- Tabbar
但这很烦人,因为所有这些名称都非常相似,因此选项卡完成并没有真正节省多少工作。
在这种情况下,您使用什么技巧来减少打字?
顺便说一句,我使用pushd和popd有时,但在这里它不会帮助,因为我不访问的目录中给定的顺序。
更新:
有关一个不错的解决方案,请参阅我的其他相关问题的已接受答案。基本上,只需创建一个替代命令:cd
function cd2 { select a in $1*; do cd $a; break; done }
Run Code Online (Sandbox Code Playgroud)
它将一次列出所有可能的完成:
$ cd2 2010080
(1) 20100801-rev124-test2
(2) 20100801-rev124-test1
(3) 20100802-rev126-bar
Run Code Online (Sandbox Code Playgroud)
你可以通过输入它的号码来选择一个。
some_very_long_command_line --arg1 --arg2=555 --arg4 ... ... ... && <now Tab pressed>
(Now it works. I want to cancel before the following message)
Display all 6936 possibilities? (y or n)
Run Code Online (Sandbox Code Playgroud)
如何长时间搜索 Tab 完成,但不丢失命令?
如果只是按 Ctrl+C 它将中止,但也不会将命令保存到历史记录。
我\xe2\x80\x99m是tcsh的长期用户,但现在所有的酷孩子似乎都在使用bash或zsh(也就是说,git或其他东西的完成模式可用于bash和zsh,很少用于tcsh)。
\n\n我的问题是,两个 shell 都有关于路径制表符补全的行为,这让我发疯,而且 I\xe2\x80\x99m 很难找到如何将它们更改为我喜欢的方式。
\n\n这里\xe2\x80\x99s 是我\xe2\x80\x99m 过去在 tcsh 中所做的一些与其他人不同的操作的示例:
\n\n/u<TAB>完成到/usr/ /usr/ /usr/li<TAB>完成/usr/lib并列出lib/和libexec/ /usr/lib/ /usr/lib/在 bash 中,无论我点击多少次 tab,它都不会过去/usr/lib,需要我输入斜杠,而我不想这样做。
在 zsh 中,/usr/li<TAB>首先完成 to /usr/lib,然后另一个选项卡列出lib/和libexec/,第三次选项卡完成 to /usr/lib/,所有后续选项卡在/usr/lib/和 之间循环/usr/libexec/。我不知道如何度过这一点。我只想从/usr/li到/usr/lib,然后/usr/lib/,然后列出其内容。
对于Python来说也是如此。在 tcsh 中,我输入pyt<TAB>,它完成 …
在 Mac OS X 上,我知道可以使用默认应用程序从命令行打开文件,open使用open -a <application name>. 因此,
open movie.avi
open -a VLC movie.avi
open movie.avi -a VLC
Run Code Online (Sandbox Code Playgroud)
所有的工作。我唯一的抱怨是当我打字时
open movie.avi -a <TAB>
Run Code Online (Sandbox Code Playgroud)
它完成了计算机上存在的所有应用程序 - 例如在 zsh 中我得到
zsh: do you wish to see all 793 possibilities (200 lines)?
Run Code Online (Sandbox Code Playgroud)
— 虽然我希望它仅完成 Finder 的“打开方式”菜单会显示的少数应用程序。
那么有没有办法访问 Finder 知道的这个列表,并使我的 shell(zsh,但如果有帮助,我可以切换到 bash)知道该列表,这样选项卡完成将只显示那些应用程序?
我正在学习 zsh 更强大的制表符补全和扩展功能,当我在带有 Mx shell 的 emacs 下运行 zsh 时,它们似乎不起作用:
cat $PATH<TAB>在终端中展开 tab 变量,但在 shell 模式下它只会发出蜂鸣声。
我浏览了 emacs 环境,发现如下:
TAB(翻译自 )运行completion-at-point 命令,这是“minibuffer.el”中的一个交互式编译的Lisp 函数。
它绑定到 TAB, 。
(完成点)
对点周围的文本执行补全。完成方法由“completion-at-point-functions”确定。
Completion-at-point-functions 是“minibuffer.el”中定义的变量。它的值为(tags-completion-at-point-function)
所以我猜测我需要向完成点函数添加一个函数,但是是哪一个呢?
我需要 /mailman/lists 中的目录名称作为参数(不带任何斜线)以制表符完成作为“list_members”命令的参数,而不管我在文件系统中的哪个位置。
在 tcsh(在我们的旧服务器上),我写了一行来做我需要的:
complete list_members 'p,*,F:/mailman/lists,,' #tcsh
Run Code Online (Sandbox Code Playgroud)
bash 的实现似乎更复杂。如何使用 bash 实现相同的行为?
制表符补全需要上下文相关,以便我已经输入的参数的任何部分缩小搜索范围,就像标准的 bash 补全一样。例子:
list_members sys<TAB> #only shows names beginning with sys
Run Code Online (Sandbox Code Playgroud)
在查看示例后,我尝试了一些解决方案,但它们无法正常工作。
一个失败的例子:
function _listlists()
{
COMPREPLY=( $( compgen -C 'ls /mailman/lists' ) )
}
complete -F _listlists list_members
Run Code Online (Sandbox Code Playgroud)
这会产生错误:
-bash: compgen: warning: -C option may not work as you expect
Run Code Online (Sandbox Code Playgroud)
另一个失败的例子:
function _listlists()
{
cd /mailman/lists
COMPREPLY=( $( compgen -d ) )
cd -
}
complete -F _listlists list_members
Run Code Online (Sandbox Code Playgroud)
这显示了该目录的所有结果通过管道传输到“更多”,但它不响应我已经输入的部分参数。
谢谢。
我已经尝试了几个小时来使这个工作正常进行,但我觉得我还没有接近任何地方。
我试图通过从 Mac OS X 终端完成目录名称的制表符来缩短我们的工作流程。
我们有一个内部工具,我们称之为 ,它bob会自动在 git 子模块上运行命令。我想做的是让它自动完成子目录名称。问题是,这些子目录位于静态位置。
project directory
->public
->submodules
->a-module
->another-module
->other-module
->some-module
Run Code Online (Sandbox Code Playgroud)
命令从顶级项目目录运行,如下所示:
bob start bugfix anothermodule
Run Code Online (Sandbox Code Playgroud)
而不是必须完全输入“anothermodule”,这是我们目前所做的,我希望让标签自动完成工作。我们每天多次使用此工作流程,将其缩短几秒钟会很棒并且可以避免打字错误。
最终目标是:
bob start bugfix an<tab>
Run Code Online (Sandbox Code Playgroud)
会自动完成
bob start bugfix anothermodule
Run Code Online (Sandbox Code Playgroud)
我试过CDPATH但很快意识到这不是我想要的,因为这不是遵循cd命令,只是我的自定义命令。
我已经bash_completion安装,但一般来说我不太擅长 bash。提到这一点,以防万一它可以成为解决方案的一部分!
如果我在根终端中su,那么一切都很好:完成在任何地方都可以。
如果作为普通用户,我尝试使用sudo访问/root/目录,例如,如果我想打开/root/.selected_editor.
当我达到 /ro 完成时,它仍然正常并写入/root/,但随后它停止工作。如果我写完想要手动执行的 Linux Bash 命令,那么这个命令就可以正常工作。
root@Xfce:~# cat .se(lected_editor) ---> completion is OK
xxx@Xfce:~$ sudo cat /ro(ot/) ---> completion is still OK
xxx@Xfce:~$ sudo cat /root/.se( ) ---> completion has stopped working
Run Code Online (Sandbox Code Playgroud)
为了看看我是否可以列出里面的内容/root/,我尝试了 sudo ls -a /root/,并且我得到了正确的列表。然后我在另一台安装了 Debian 11 的笔记本电脑上尝试,它的行为完全一样。
系统:配备Debian 11 (Bullseye) 和Xfce 的笔记本电脑
我希望 bash 轮换匹配的文件名而不是列出它们,就像 vim 中的默认选项卡完成行为。有没有一个简单的命令来做到这一点?这与这个问题本质上是相反的。
Cygwin 中是否有配置选项,以便在 Bash 完成命令名称时,.exe忽略(不包括)文件名的后缀?
在 Cygwin 系统上的 Bash 中使用 Tab 补全来补全命令的名称时,.exe扩展名会附加到命令名称,例如,键入opens并按下Tab将命令补全到openssl.exe.
该命令运行良好(对于 MS Windows,.exe在运行命令时扩展是可选的)但问题是包_openssl()提供的完成功能bash-completion仅配置为提供openssl- 不是openssl.exe. 例如:
$ complete -p openssl openssl.exe
complete -o default -F _openssl openssl
bash: complete: openssl.exe: no completion specification
Run Code Online (Sandbox Code Playgroud)
尝试完成所有可执行命令的参数时存在相同的问题。
我目前将 Bash 与 Emacs 模式配置用于 Readline 编辑,因此我可以在开始键入命令的参数之前按下Esc后按两次Backspace以删除.exe后缀。理想情况下,我希望避免每次运行命令时都必须这样做。
我认为如果不修改 Cygwin DLL 或 Bash 命令完成 ( pcomplete.c)的源代码,这可能是不可能的。然而,我注意到,在Bash内建命令, …
tab-completion ×10
bash ×9
command-line ×4
zsh ×3
macos ×2
autocomplete ×1
cd ×1
cygwin ×1
debian ×1
emacs ×1
linux ×1
mailman ×1
readline ×1
tcsh ×1
vim ×1