Bagaimana saya bisa membuka terminal baru di direktori yang sama dengan yang terakhir digunakan dari keybind window manager?

25

Saya menggunakan manajer jendela ubin dan saya beralih dari gnome-terminaldengan banyak tab ke beberapa urxvtcontoh yang dikelola oleh manajer jendela. Salah satu fitur yang saya lewatkan adalah kemampuan untuk membuka terminal baru yang secara default ke direktori kerja yang terakhir.

Singkatnya: Saya perlu cara untuk membuka urxvt (bash) baru yang default ke $ PWD dari yang terakhir digunakan.

Satu-satunya solusi yang muncul di pikiran saya adalah untuk menyelamatkan jalan saat ini pada setiap orang cddengan sesuatu seperti ini:

echo $PWD > ~/.last_dir

dan kembalikan jalur pada terminal baru dengan cara ini:

cd `cat ~/.last_dir`

Saya dapat sumber perintah kedua .bashrctetapi saya tidak tahu bagaimana menjalankan yang pertama pada setiap perubahan direktori :)

Setiap solusi sederhana yang tidak melibatkan screenatau tmuxpenggunaan dipersilahkan.

Luca
sumber
Apakah Anda menggunakan tabbedekstensi perl " " dari urxvt?
rozcietrzewiacz
Tidak ada tab, saya menggunakan terminal baru yang dikelola oleh WM
Luca

Jawaban:

9

Saya melihat tiga solusi menggunakan .last_dir. Anda dapat menempatkan echo $PWD > ~/.last_dirkeduanya:

  1. Dalam fungsi khusus yang akan menjadi pembungkus untuk cd:

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

    Tempatkan ini di Anda ~/.bashrcdan kemudian gunakan cd_bukan cd setiap kali Anda ingin direktori kerja baru Anda disimpan.

  2. Dalam $PROMPT_COMMAND( tidak disarankan ):

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

    Anda dapat menguji ini langsung dari terminal atau menempatkannya di ~/.bashrc. Solusi ini, bagaimanapun, memicu penulisan disk setiap kali prompt muncul, yang dapat menyebabkan masalah - tetapi di sisi lain, .last_dirakan berisi direktori saat ini tidak peduli bagaimana Anda sampai di sana.

  3. Dalam skrip ekstensi perl khusus untuk rxvt. Saya belum pernah membuat sendiri, tetapi Anda dapat menemukan beberapa contoh di web.

rozcietrzewiacz
sumber
PROMPT_COMMAND itulah yang saya cari. Saya akan mencoba solusi ini dengan harapan itu tidak mempengaruhi kinerja.
Luca
Yah, itu cara yang agak kasar, terus terang. Secara pribadi, saya suka solusi terbaik Michael :)
rozcietrzewiacz
1
Saya suka cara ekstensi perl, jika perlu bekerja di luar terminal; tampaknya lebih bersih daripada meretas sesuatu PROMPT_COMMAND, salah satu variabel lingkungan yang paling banyak disalahgunakan sepanjang masa
Michael Mrozek
Tampaknya $ PWD hanya dievaluasi pertama kali
Luca
@neon Aaah ... Maaf. Masalahnya adalah dengan bagaimana PROMPT_COMMAND dikutip. (Atau lebih tepatnya, bagaimana $PWDitu tidak dikutip.) Biarkan saya memperbaiki ini ... Ada. Yang seharusnya melakukannya.
rozcietrzewiacz
13

Saat ini saya menggunakan versi solusi # 1 ini

# 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

di dalam saya .zshrc

Luca
sumber
Saya menggunakan solusi # 1 juga dan menambahkan trap "[ -f ~/.last_dir ] && rm ~/.last_dir" EXITsaya ingin mulai selalu di rumah saya kecuali ketika saya membuka tab baru
rkmax
Ini tidak berfungsi jika menggunakan auto_cdfitur zsh. Ternyata kita dapat menggunakan pengait yang zsh sediakan
jonleighton
12

Ini sebenarnya cukup sepele; jika Anda menjalankan urxvtdari dalam urxvtjendela yang ada , jendela baru akan berada di direktori yang sama. Saya telah dupalias urxvt &untuk alasan ini. Jika Anda ingin terikat dengan hotkey, Anda dapat menggunakan bindperintah bash . Misalnya, untuk mengikatnya ke F1:

$ bind '"\e[11~": "urxvt &\n"'
Michael Mrozek
sumber
Terima kasih atas tipnya. Saya tahu bahwa proses child terminal mempertahankan keadaan tetapi saya tidak tahu bahwa Anda dapat mengikat kunci ke perintah dalam bash. Saya ingin melakukan ini dari WM untuk menghindari memfokuskan terminal.
Luca
Aku suka itu. Tidak ada disk yang menulis dan eksekusi hanya terjadi ketika Anda akan membuka terminal baru.
rozcietrzewiacz
Satu-satunya hal yang saya ubah adalah menggunakan ( urxvt & ) &>/dev/nullbukan hanya latar belakang.
rozcietrzewiacz
Solusi ini hebat dan lebih fleksibel tetapi saya tidak suka menggunakan 2 binding, satu untuk meluncurkan terminal dan satu untuk garpu yang baru.
Luca
4

Cukup tambahkan . /etc/profile.d/vte.shAnda ~/.bashrcuntuk mendapatkan fitur yang sama

villa david
sumber
Namun, pekerjaan ini, mengapa repot-repot -1 ini?
Abdillah
Ini berfungsi, dan sepertinya itu adalah solusi yang lebih disukai di launchpad / dari gnome-terminal devs: bugs.launchpad.net/ubuntu/+source/gnome-terminal/+bug/1132700
Ajax
4

Tentu saja ini adalah pendekatan kerja untuk memodifikasi cdperilaku, tetapi saya ingin menunjukkan solusi yang lebih sederhana. Di man bash (1) saya menemukan bahwa jika sebuah interaktif keluar, ia berjalan ~/.bash_logoutjika ada. Jadi, alih-alih menyimpan jalur di setiap doa cdjalur terakhir dapat disimpan saat keluar.

Saya ~/.bash_logoutsangat sederhana:

echo $PWD >~/.lastdir

Dan di suatu tempat di saya .bashrcsaya menempatkan baris ini:

[ -r ~/.lastdir ] && cd $(<~/.lastdir)
Benar
sumber
1
Hanya perhatikan bahwa .bash_logoutberjalan hanya ketika login shellskeluar, itu tidak selalu terjadi.
henfiber
1
Atau, simpan jalur terakhir saat bashkeluar dengan: trap "echo $PWD > ~/.lastdir" EXIT"
henfiber
@henfiber Terima kasih atas komentar Anda! Saya pikir dalam hal ini shell adalah shell login, jadi ini akan berperilaku baik. Di sisi lain trappendekatannya juga bagus, saya suka!
Benar,
2

Sangat sering saya menggunakan beberapa terminal windows sekaligus, masing-masing dengan banyak tab di dalamnya. Sebagai contoh: satu jendela untuk tab pengembangan kode sumber, satu jendela untuk file lateks, satu jendela untuk eksekusi R dan skrip, dll. Dalam satu jendela, saya ingin terminal tab baru untuk mengubah ke direktori yang digunakan terakhir di jendela tertentu (Ini digunakan untuk bekerja di masa lalu, tetapi dengan versi gnome baru, entah bagaimana tidak). Solusi kotor berikut berfungsi dengan baik untuk saya. Saya telah memasukkan ini ke dalam .bashrc.

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

function cd ()
{
    builtin cd "$@"
    echo $PWD > $dirfilename
}
Bart
sumber
Ini sempurna ... wohoo! Terima kasih. Saya tidak tahu banyak tentang hacking bash, tetapi saya sudah menyukainya ...
apil.tamang