标签: tab-completion

频繁更改目录时如何尽量减少打字?

有哪些好的 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

但这很烦人,因为所有这些名称都非常相似,因此选项卡完成并没有真正节省多少工作。

在这种情况下,您使用什么技巧来减少打字?

顺便说一句,我使用pushdpopd有时,但在这里它不会帮助,因为我不访问的目录中给定的顺序。

更新:

有关一个不错的解决方案,请参阅我的其他相关问题的已接受答案。基本上,只需创建一个替代命令: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)

你可以通过输入它的号码来选择一个。

linux cd bash command-line tab-completion

5
推荐指数
1
解决办法
1455
查看次数

如何在不丢失命令的情况下中止为选项卡完成构建列表?

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 它将中止,但也不会将命令保存到历史记录。

bash tab-completion

5
推荐指数
1
解决办法
365
查看次数

在 bash 或 zsh 中设置路径的制表符补全以类似于 tcsh

我\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
    \n
  • /u<TAB>完成到/usr/
  • \n
  • 然后选项卡列出的内容/usr/
  • \n
  • /usr/li<TAB>完成/usr/lib并列出lib/libexec/
  • \n
  • 第二次按 Tab 键完成/usr/lib/
  • \n
  • 第三次按 Tab 键会列出以下内容/usr/lib/
  • \n
\n\n

在 bash 中,无论我点击多少次 tab,它都不会过去/usr/lib,需要我输入斜杠,而我不想这样做。

\n\n

在 zsh 中,/usr/li<TAB>首先完成 to /usr/lib,然后另一个选项卡列出lib/libexec/,第三次选项卡完成 to /usr/lib/,所有后续选项卡在/usr/lib/和 之间循环/usr/libexec/。我不知道如何度过这一点。我只想从/usr/li/usr/lib,然后/usr/lib/,然后列出其内容。

\n\n

对于Python来说也是如此。在 tcsh 中,我输入pyt<TAB>,它完成 …

bash zsh tcsh tab-completion

5
推荐指数
1
解决办法
1830
查看次数

从命令行访问 Finder 的“打开方式”菜单(用于选项卡完成)

在 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)知道该列表,这样选项卡完成将只显示那些应用程序?

bash zsh command-line tab-completion macos

5
推荐指数
1
解决办法
1097
查看次数

zsh 完成功能在 emacs shell 中不起作用

我正在学习 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)

所以我猜测我需要向完成点函数添加一个函数,但是是哪一个呢?

zsh emacs tab-completion

5
推荐指数
1
解决办法
5078
查看次数

bash 完成:从定义的目录中列出目录名称?

我需要 /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)

这显示了该目录的所有结果通过管道传输到“更多”,但它不响应我已经输入的部分参数。

谢谢。

bash tab-completion mailman

5
推荐指数
1
解决办法
1716
查看次数

自定义命令的 Bash 自动完成子目录

我已经尝试了几个小时来使这个工作正常进行,但我觉得我还没有接近任何地方。

我试图通过从 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。提到这一点,以防万一它可以成为解决方案的一部分!

bash command-line autocomplete tab-completion macos

5
推荐指数
1
解决办法
1412
查看次数

完成后停止在 /root 目录中工作

如果我在根终端中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 的笔记本电脑

debian bash tab-completion

5
推荐指数
1
解决办法
1175
查看次数

如何让 bash 为文件名做类似 vim 的 tab 补全?

我希望 bash 轮换匹配的文件名而不是列出它们,就像 vim 中的默认选项卡完成行为。有没有一个简单的命令来做到这一点?这与这个问题本质上是相反的。

bash vim tab-completion

4
推荐指数
1
解决办法
2233
查看次数

由于“.exe”扩展名,Cygwin 中命令参数的选项卡完成失败

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内建命令, …

cygwin bash command-line readline tab-completion

4
推荐指数
1
解决办法
1954
查看次数

标签 统计

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