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.


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.


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


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"'

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

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)

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
}

Ini sempurna ... wohoo! Terima kasih. Saya tidak tahu banyak tentang hacking bash, tetapi saya sudah menyukainya ...
apil.tamang
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.