web-dev-qa-db-ja.com

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

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

要するに:デフォルトで最後に使用したものの$ PWDになる新しいurxvt(bash)を開く方法が必要です。

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

echo $PWD > ~/.last_dir

次のようにして、新しい端末のパスを復元します。

cd `cat ~/.last_dir`

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

screenまたはtmuxの使用を含まない、より簡単なソリューションは大歓迎です。

26
Luca

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

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

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

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

  2. $Prompt_COMMAND非推奨):

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

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

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

9
rozcietrzewiacz

現在、このバージョンの#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

14
Luca

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

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

. /etc/profile.d/vte.sh~/.bashrcを追加するだけで、同じ機能を利用できます

4
david villa

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

ぼくの ~/.bash_logoutは非常にシンプルです。

echo $PWD >~/.lastdir

そして、私のどこかに.bashrc私はこの行を配置しました:

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

多くの場合、一度に複数のターミナルウィンドウを使用し、それぞれに複数のタブが含まれています。例:ソースコード開発タブ用の1つのウィンドウ、latexファイル用の1つのウィンドウ、R実行とスクリプト用の1つのウィンドウなど。 (これは以前は機能していましたが、新しいgnomeバージョンでは、どういうわけか機能しません)。次の汚い解決策は私にとってはうまくいきます。これを.bashrcに入れました。

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

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