10

pushdおよびで可能な方法よりも、ディレクトリスタックを処理するためのより直感的な方法はありませpopdんか?

pushdと組み込みコマンドのCLIがpopd、ユーザーに気が遠くなるようなものを提示しているのを見つけました。dirsしかし同時に、組み込みコマンドによって提示されるディレクトリスタックを頻繁に使用したいと思います。

そのため、ユースケースを理解してから、次のユースケースを覚えるのにかなりの時間がかかりました。

  1. pushd-2つのディレクトリを上から切り替えます。
  2. pushd +1-トップディレクトリから2番目に変更します。
  3. pushd -0-トップディレクトリから一番下に移動します。
  4. popd +0-トップディレクトリから2番目に変更するトップをポップします。
  5. pushd -0; popd +1-トップディレクトリから一番下に移動し、前のトップをポップします。

それでも、ディレクトリスタックを操作するためだけに毎回入力する必要があるのは、私にとって大変なことです。これらの5つのユースケースをエイリアスするためのニーモニック名を思い付くことさえできません。

洞察はありますか?

4

3 に答える 3

6

最近、GNUリードラインライブラリのパワーと、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

だけを使用して、現在のディレクトリから他のディレクトリに切り替えることができますp <letter>。ここ<letter>で、はディレクトリ名の先頭です。(もちろん、複数の文字にすることもできます。)たとえば、;p mに切り替わります。に切り替わります。my_test_repop wwork

p cディレクトリから使用するworkと、スタック内の、で始まる次のディレクトリに切り替わります。cこの場合は、になりますcore。(コマンドのq一部はsed、最初の結果より多くを返すことを防ぎます。)configs代わりにdirに具体的に切り替えるために、またはを使用するか、またはもう一度使用することができp conます。p cp c

コマンドのは1dsed現在のディレクトリに切り替えないようにするためのものです。したがって、を使用してconfigsディレクトリとディレクトリを切り替えることができます。corep c

stdouttoのリダイレクトは、の実行ごとに/dev/nullの煩わしい(私にとっての)実行を防ぎます。(とにかく、現在のディレクトリがプロンプトに表示されます。)ただし、沈黙はしません。たとえば、実行すると、次のように表示されます。dirspushdstderrp q

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

ビルトインで補完

pushdこれは置き換えられません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

プロ

  • confで:プリミティブとショートカットの最小限のセット
  • 実行時:同上。インデックスのみを使用してください。ほとんどが読み取り専用で、変更されることはありません。
于 2017-11-20T16:08:14.230 に答える