25

您如何设置 Z shell,以便键入 cd - 为您提供以前访问过的路径的列表,然后 cd -1、-2、-3 等将带您进入目录?

4

3 回答 3

61

如果您setopt AUTO_PUSHD在您的.zshrcthencd中将自动执行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 完成列表,您可以使用+and-参数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

选项卡完整目录

我总是忘记执行以下操作的魔术序列,所以我更新了答案来解释这部分。

和只会带你到目录,你不能在堆栈中完成路径(即+什么都不给你)。要完成这项工作,您可以使用波浪号 ( )。-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/
于 2011-01-19T20:02:16.377 回答
7

如果您使用pushd而不是cd,那么您可以使用dirs和 cd 列出目录到旧目录popd。您还可以设置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更多详细信息,请参阅。

于 2010-10-21T12:19:30.307 回答
0

c-减号就是为这种要求而设计的。

它支持正则表达式匹配,使用 md5 哈希来避免pushd.

轻松转储和加载。

此 gif 显示了一些基本操作。

cminus 用法

您可以在https://github.com/whitebob/cminus上查看

于 2018-12-25T15:35:50.783 回答