【发布时间】:2011-04-28 13:21:24
【问题描述】:
您如何设置 Z shell,以便键入 cd - 为您提供以前访问过的路径列表,然后 cd -1、-2、-3 等将带您进入目录?
【问题讨论】:
-
不应该在 Unix 和 Linux 或超级用户上使用吗?
标签: shell autocomplete zsh zsh-completion
您如何设置 Z shell,以便键入 cd - 为您提供以前访问过的路径列表,然后 cd -1、-2、-3 等将带您进入目录?
【问题讨论】:
标签: shell autocomplete zsh zsh-completion
c-减号就是为这种需求而设计的。
它支持正则表达式匹配,使用md5哈希来避免pushd中的重复。
易于转储和加载。
这个 gif 展示了一些基本操作。
【讨论】:
如果您的.zshrc 中有setopt AUTO_PUSHD,那么cd 将自动对您更改到的每个目录执行pushd。以 ZyX 为例:
$ setopt AUTO_PUSHD
$ mkdir -p 1/2/3/4
$ cd 1
$ cd 2
$ cd 3
$ cd 4
您可以使用dirs查看目录列表:
$ dirs -v
0 ~/1/2/3/4
1 ~/1/2/3
2 ~/1/2
3 ~/1
4 ~
为了能够通过 Tab 完成列表,您可以使用 + 和 - 参数和 cd(<TAB> 表示您按 Tab 键):
$ cd +<TAB>
1 -- ~/1/2/3
2 -- ~/1/2
3 -- ~/1
4 -- ~
或者反过来:
$ cd -<TAB>
0 -- ~
1 -- ~/1
2 -- ~/1/2
3 -- ~/1/2/3
然后只需选择要转到该目录的号码:
$ cd +2
$ pwd
~/1/2
我总是忘记执行以下操作的魔术序列,所以我更新了答案来解释这部分。
+ 和 - 只会带你到目录,你不能用 tab 完成堆栈中的路径(即cd -2/<TAB> 什么都不给你)。要完成这项工作,您可以使用波浪号 (~)。
在3 中创建一些目录以使这个示例更好。
$ mkdir 3/foo 3/bar 3/baz
然后在堆栈中找到目录。
$ cd ~+<TAB>
1 -- ~/1/2/3/4
2 -- ~/1/2/3
3 -- ~/1
4 -- ~
然后在条目上使用制表符完成。
$ cd ~+2/<TAB>
4/ bar/ baz/ foo/
【讨论】:
vi ~+4/it.txt' would edit the file ~/1/it.txt'
如果您使用pushd 而不是cd,那么您可以使用dirs 列出目录并使用popd cd 到旧目录。您还可以设置autopush 选项以使cd 的行为与pushd -q 非常相似。这是一个例子:
setopt pushdsilent # Omit printing directory stack
setopt autopush # Make cd push directories onto stack
setopt pushdminus # Invert meanings of +N and -N arguments to pushd
mkdir -p 1/2/3/4
cd 1
cd 2
cd 3
cd 4
popd # Go to previous directory (3) and remove it from directory stack
pushd - # Go to previous directory (4)
pushd -2 # Go 2 directories back the directory stack (2)
请注意,pushd 不会从目录堆栈中删除任何内容,它只会旋转它。详情请见man zshbuiltins。
【讨论】: