10

pushd难道没有比and更直观的处理目录堆栈的方法popd吗?

我发现呈现给用户的 CLIpushdpopd内置命令令人难以置信。但与此同时,我希望经常使用dirs内置命令提供的目录堆栈。

所以我花了很长时间来弄清楚用例,然后记住以下几个:

  1. pushd- 从顶部切换两个目录。
  2. pushd +1- 从顶级目录更改为第二个。
  3. pushd -0- 从顶部目录更改到底部。
  4. popd +0- 从顶部目录弹出顶部更改为第二个。
  5. pushd -0; popd +1- 从顶部目录更改到底部并弹出前顶部。

仍然必须每次都键入它们来处理目录堆栈,这对我来说感觉很重。我什至无法想出助记名称来给这五个用例起别名。

有什么见解吗?

4

3 回答 3

6

最近,我发现了 GNU 的 readline 库的强大功能,以及它可以在 Bash 命令行上为用户提供的击键方面的快捷方式。

~/.inputrc因此,我在文件中定义了以下热键。GNU readline 的配置文件:

# "pushd" use case.
"\C-^": "\C-a\C-kpushd\C-m"

# "pushd +1" use case.
"\e<": "\C-a\C-kpushd +1\C-m"

# "popd +0" use case.
"\ex\e<": "\C-a\C-kpopd +0\C-m"

# "pushd -0" use case.
"\e>": "\C-a\C-kpushd -0\C-m"

# "pushd -0; popd +1" use case.
"\ex\e>": "\C-a\C-kpushd -0; popd +1\C-m"

我将上面的热键关联如下:

  1. <ctrl>-^-vim热键切换当前与前一个缓冲区。
  2. <alt>-<- 左移并携带。
  3. <alt>-x<- 左移和裁剪。
  4. <alt>->- 右移并进位。
  5. <alt>-x>- 右移和裁剪。

<ctrl>-ak击键将光标定位在行 (a) 的开头并删除 (k) 它。这很重要,因为当<ctrl-m>(enter) 被击中时,用户很有可能在句子中间按下热键。热键值会因当前用户输入而出现乱码,bash 无法执行它。

于 2012-11-15T16:02:00.587 回答
1

对于我自己的个人使用,我有几个我常用的目录,并希望能够在使用pushd. 我想出了以下功能.bashrc

p() {
  pushd +"$(($(dirs -p | sed -n '1d;s,.*/,,;/^'"$1"'/{=;q;}')-1))" >/dev/null
}

假设我有一个这样的目录堆栈:

$ dirs -v
 0  ~/repos/local_only/configs
 1  ~/repos/virtualization
 2  ~/repos/local_only/work
 3  ~/repos/core
 4  ~/repos/local_only/my_test_repo

我可以使用 just 从当前目录切换到任何其他目录p <letter>,其中<letter>是目录名称的开头。(当然,它可以不止一个字母。)例如,p m将切换为my_test_repo; p w将切换到work.

如果我p c从我的work目录中使用,它将切换到堆栈中以 开头的下一个目录c,在本例中为core. (命令的q一部分sed阻止它返回比第一个结果更多的结果。)要专门切换到configs目录,我可以使用p con, 或者只是p c然后再p c一次。

1d命令中的是sed让我永远不会切换到当前目录。因此,我可以使用 just在我的configs目录和我的目录之间切换。corep c

to的重定向stdout可以/dev/null防止dirs每次执行pushd. (无论如何,我的提示中都列出了当前目录。)但是我不会沉默——所以stderr如果我运行p q,例如,我会看到:

$ p q
-bash: pushd: +-1: directory stack index out of range

与内建互补

这不会取代pushdand popd; 它用于快速切换。要添加到目录堆栈,我仍然使用pushd <directory_name>. 如果我在特定目录中完成(例如,virtualization),我可以p v然后popd.


不太可能的错误:

这可能不适用于包含换行符的目录名称,但这对我的目的无关紧要。无论如何,它可能做的最糟糕的事情就是pushd您进入错误的目录。

于 2016-03-09T03:45:12.047 回答
0

这是我的工作流程:

0. CONF(假数据)

cd /tmp
mkdir -p foo/bar baz qux

1. 会议

dirs -v
cd foo/bar; pushd .; cd ../..
cd baz; pushd .; cd ..
cd qux; pushd .; cd ..

2. 运行

dirs -v
cd $(dirs +1) # switch to dir 1
cd $(dirs +2) # switch to dir 2
cd $(dirs +3) # switch to dir 3

在这里快速记录一下可能会更好地解释:https ://asciinema.org/a/148441

专业版

  • at conf:原始和快捷方式的最小集
  • 运行时:同上。只使用索引。大多是只读的,它们甚至永远不会改变。
于 2017-11-20T16:08:14.230 回答