ウィンドウマネージャキーバインドから最後に使用したディレクトリと同じディレクトリで新しいターミナルを開くにはどうすればよいですか?


25

タイリングウィンドウマネージャーを使用しておりgnome-terminal、複数のタブからurxvtウィンドウマネージャーによって管理される複数のインスタンスに切り替えました。私が見逃している機能の1つは、最後の作業ディレクトリにデフォルト設定される新しいターミナルを開く機能です。

要するに:私は新しいurxvt(bashの)最後に使用された1の$ PWDデフォルトことを開くための方法が必要です。

私の頭に浮かぶ唯一の解決策はcd、次のようなものですべての現在のパスを保存することです:

echo $PWD > ~/.last_dir

この方法で新しい端末のパスを復元します。

cd `cat ~/.last_dir`

2番目のコマンドをソースにすることはできますが、.bashrcディレクトリが変更されるたびに最初のコマンドを実行する方法がわかりません:)

使用screentmux使用を伴わない簡単なソリューションは歓迎します。


tabbedperl拡張を使用していますurxvtか?
rozcietrzewiacz

いいえタブは、私はWMで管理される新しい端末を使用していないよ
ルカ

回答:


9

を使用し.last_dirた3つのソリューションがあります。次のecho $PWD > ~/.last_dirいずれかを配置できます。

  1. のラッパーになる特別な関数ではcd

    function cd_
    {
      [[ -d "$@" ]] || return 1
      echo "$@" > ~/.last_dir
      cd "$@"
    }

    これをに置き、新しい作業ディレクトリを保存するたびにcdの代わりに~/.bashrc使用しますcd_

  2. あなたの$PROMPT_COMMAND推奨されません):

    PROMPT_COMMAND="$PROMPT_COMMAND; pwd > ~/.last_dir"

    これを端末から直接テストするか、に配置でき~/.bashrcます。ただし、このソリューションでは、プロンプトが表示されるたびにディスク書き込みがトリガーされるため、問題が発生する可能性がありますが、一方で、.last_dirどのように到達しても現在のディレクトリが含まれます。

  3. カスタムで拡張スクリプトのperlのためrxvt。自分で作成したことはありませんが、ウェブ上でかなりの数の例を見つけることができます。


PROMPT_COMMANDそれは私が探していたものです。パフォーマンスに影響しないことを期待して、このソリューションを試します。
ルカ

まあ、それは率直に言って、かなり粗雑な方法です。個人的には、マイケルのソリューションが一番好きです:)
rozcietrzewiacz

1
端末の外で動作する必要がある場合、perl拡張方法が好きです。それはに何かをハッキングよりもきれいそうですPROMPT_COMMAND、すべての時間の中で最も乱用された環境変数の1
マイケルMrozek

$ PWDは初めて評価されるようです
ルカ

@neon Aaah ...ごめんなさい。問題は、PROMPT_COMMANDの引用方法にあります。(むしろ、どのよう$PWDに引用されていなかったのか。)これを修正させてください... それはそれを行うべきです。
rozcietrzewiacz

13

現在、このバージョンの#1ソリューションを使用しています

# save path on cd
function cd {
    builtin cd $@
    pwd > ~/.last_dir
}

# restore last saved path
if [ -f ~/.last_dir ]
    then cd `cat ~/.last_dir`
fi

私の中で .zshrc


私も#1ソリューションを使用していてtrap "[ -f ~/.last_dir ] && rm ~/.last_dir" EXIT、新しいタブを開いたときを除いて常に自宅で開始したい
-rkmax

auto_cdzsh の機能を使用している場合、これは機能しません。zshが提供するフックを使用できることがわかりました
jonleighton

12

これは実際には非常に簡単です。urxvt既存のurxvtウィンドウ内から実行する場合、新しいウィンドウは同じディレクトリにあります。私がしているdupにエイリアスurxvt &このような理由のために。ホットキーにバインドする場合は、bashのbindコマンドを使用できます。たとえば、それをバインドするにはF1

$ bind '"\e[11~": "urxvt &\n"'

ヒントをありがとう。ターミナルの子プロセスが状態を維持することは知っていましたが、キーをbashのコマンドにバインドできることを知りませんでした。これをWMから実行して、端末に焦点を合わせないようにします。
ルカ

私はすきです。ディスクへの書き込みは行われず、新しいターミナルを開こうとしているときにのみ実行されます。
rozcietrzewiacz

私が変更する唯一のことは( urxvt & ) &>/dev/null、単にバックグラウンド化する代わりに使用することです。
rozcietrzewiacz

このソリューションは優れた柔軟性を備えていますが、2つのバインディングを使用するのは好きではありません。1つはターミナルを起動し、もう1つは新しいものをフォークするためです。
ルカ


4

もちろん、それはの動作を変更するためcdの実用的なアプローチですが、より簡単な解決策を示したいと思います。では男性はbash(1)私は、インタラクティブな場合ことがわかっ出て、それが実行されます~/.bash_logout(存在する場合)。そのcdため、最後のパスの呼び出しごとにパスを保存する代わりに、終了時に保存できます。

~/.bash_logoutは非常に簡単です:

echo $PWD >~/.lastdir

そして、私のどこかに.bashrcこの行を入れました:

[ -r ~/.lastdir ] && cd $(<~/.lastdir)

1
終了.bash_logout時にのみ実行されることに注意してくださいlogin shells、それは常にそうではありません。
henfiber

1
または、bash終了時に最後のパスを保存します trap "echo $PWD > ~/.lastdir" EXIT"
。– henfiber

@henfiberコメントありがとうございます!この場合、シェルはログインシェルであると思うので、これは適切に動作します。一方、trapアプローチも素晴らしいです、私はそれが好きです!
-TrueY

2

多くの場合、複数の端末ウィンドウを一度に使用し、それぞれに複数のタブがあります。たとえば、ソースコード開発タブ用の1つのウィンドウ、ラテックスファイル用の1つのウィンドウ、R実行およびスクリプト用の1つのウィンドウなどです。 (これは以前は機能していましたが、新しいgnomeバージョンでは何らかの理由で機能しません)。次の汚い解決策は私のためにうまく機能します。これを.bashrcに入れました。

dirfilename="/tmp/.lastdir-$WINDOWID"
[ -r "$dirfilename" ] &&  {
    savdir=`cat $dirfilename`
    cd "$savdir"
}

function cd ()
{
    builtin cd "$@"
    echo $PWD > $dirfilename
}

これは完璧です...すごい!ありがとう。...私はbashのハッキングについて多くを知らないが、私は男はすでにそれを愛する
apil.tamang
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.