Bagaimana cara keluar dari file Ranger explorer kembali ke command prompt tetapi tetap direktori saat ini?

28

Saya menggunakan file explorer terminal Ranger dari dalam terminal linux.
Katakanlah saya mulai dari command prompt di direktori home dan meluncurkan ranger

user@/home/user $ ranger

ranger terbuka ..... dan dalam program ranger saya menjelajah ke:

/media/ubuntu/sdf675d7sf5sdfs7/some_directory

Jika saya menekan q untuk keluar dari ranger, saya kembali ke folder yang sama dengan tempat saya meluncurkan ranger. yaitu

user@/home/user $

Apakah mungkin untuk keluar dari ranger, dan tetap berada di direktori tempat saya bersama ranger, i.

user@/media/ubuntu/sdf675d7sf5sdfs7/some_directory $  
the_velour_fog
sumber

Jawaban:

29

Menurut manualnya

--choosedir=targetfile    
    Allows you to pick a directory with ranger. When you exit ranger, it will write the last visited directory into targetfile.

Jadi yang perlu Anda lakukan adalah membuat alias seperti ini:

alias ranger='ranger --choosedir=$HOME/.rangerdir; LASTDIR=`cat $HOME/.rangerdir`; cd "$LASTDIR"'

Dan menulis alias ini ke rc dari shell favorit Anda disarankan.

Gombai Sándor
sumber
2
wow itu cukup pintar, Tidak pernah terpikir oleh saya bahwa Anda dapat mengeluarkan perintah untuk suatu program, menghentikannya dengan ;dan kemudian menentukan lebih banyak perintah setelah titik koma yang - Saya anggap dijalankan pada titik yang Anda tutup ranger, terima kasih!
the_velour_fog
1
Sebaiknya gunakan .rangerdirsaja untuk membuatnya tersembunyi. Atau hapus di bagian akhir rm -d $HOME/rangerdir,.
Mateen Ulhaq
Ini bagus tetapi jika saya memahaminya dengan benar, ini berarti Anda memiliki perilaku itu secara permanen. Jika lebih baik jika ada cara untuk memiliki opsi untuk keluar ke direktori ranger saat ini ATAU direktori Anda ketika Anda mulai ranger.
neverfox
neverfox Setelah Anda membuat alias, terserah Anda jika Anda menawarkan pilihan direktori untuk masuk ke dalam alias itu. Seleksi dapat dilakukan sebelum biner dipanggil atau setelah selesai.
Gombai Sándor
Terima kasih atas solusi yang luar biasa ini! Saya kebetulan menggunakan cangkang ikan, jadi untuk mengatur alias saya, saya menggunakan fish_configdan menambahkan singkatan untuk ranger --choosedir="$HOME/.rangerdir"; cd (cat $HOME/.rangerdir)
rockzombie2
24

S

Jika Anda menekan S, itu membuka shell baru pada direktori saat ini.

Lalu jika Anda menekan Ctrl + Dshell, itu kembali ke ranger.

Solusi ini seringkali cukup baik.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
7

Saya menemukan solusi yang lebih mudah. Ketika Anda menginstal ranger, itu akan menempatkan skrip di folder bin Anda yang, jika dijalankan, akan memulai program. Tetapi jika Anda sumbernya, dengan

$ source ranger

itu akan meluncurkan ranger dan menjatuhkan Anda di folder yang terakhir dikunjungi ketika Anda keluar.

jadi jika Anda ingin perilaku ini secara default, lakukan saja

$ alias ranger = 'source ranger'

atau bahkan lebih baik memasukkannya ke file .bashrc Anda.

Untuk melihat dokumentasi dan implementasi untuk fitur ini, baca skrip ranger di folder bin Anda.

Ogino Knaus
sumber
Rupanya teknik ini (yang dapat disingkat menjadi hanya mengeksekusi . ranger) disebutkan dalam wiki
cjauvin
4

Untuk mendukung jawaban Gombai Sándor, saya sarankan untuk melakukan sedikit penyesuaian pada alias:

alias ranger='ranger --choosedir=$HOME/.rangerdir; LASTDIR=`cat $HOME/.rangerdir`; cd "$LASTDIR"'

Dengan mengubah "$ Home / rangerdir" menjadi "$ Home / .rangerdir" Anda membuat file yang dibuat oleh alias disembunyikan. hanya membuatnya jadi tidak mengganggu mengacaukan folder rumah. tidak ada bedanya fungsional dengan cara kerjanya.

dduxx
sumber
2

Saya menemukan pertanyaan serupa di tempat lain dengan jawaban yang lebih baik dibandingkan dengan Gambai dan varian yang diusulkan lainnya. Lebih baik sejak itu.

  1. itu akan menangani file yang dibuat dengan memasukkannya ke folder tmp sehingga dapat dihapus oleh sistem
  2. ini adalah kode yang lebih bersih (walaupun jawaban Gambai dapat dikonversi ke fungsi)

Ada fungsi di file shell yang sudah ada di git repo ranger:

https://github.com/ranger/ranger/blob/master/examples/bash_automatic_cd.sh

function ranger-cd {
    # create a temp file and store the name
    tempfile="$(mktemp -t tmp.XXXXXX)"

    # run ranger and ask it to output the last path into the
    # temp file
    ranger --choosedir="$tempfile" "${@:-$(pwd)}"

    # if the temp file exists read and the content of the temp
    # file was not equal to the current path
    test -f "$tempfile" &&
    if [ "$(cat -- "$tempfile")" != "$(echo -n `pwd`)" ]; then
        # change directory to the path in the temp file
        cd -- "$(cat "$tempfile")"
    fi

    # its not super necessary to have this line for deleting
    # the temp file since Linux should handle it on the next
    # boot
    rm -f -- "$tempfile"
}

Anda dapat meletakkan fungsi ini di ~/.zshrcfile shell rc (misalnya ) favorit Anda dan membuat alias dan / atau mengikatnya ke kombinasi tombol (sekali lagi keduanya bisa masuk dalam file rc):

alias nav=ranger-cd

dan / atau

# This will run the function by Ctrl+O through returning
# the string "ranger-cd" in addition to a new-line character
# to act as Enter key-press
bindkey -s "^o" "ranger-cd\n"

Disclaimer: yang bindkeybekerja di atas dalam zsh dan Anda harus mengubahnya berdasarkan shell pilihan Anda

Mehrad Mahmoudian
sumber
1

Terima kasih untuk Gombai untuk inspirasinya, tetapi pada Ubuntu 14.04 LTS saya menemukan solusinya tidak bekerja. Memodifikasinya sedikit dan menyimpan sebagai alias di .bashrc saya, berikut ini berfungsi dengan baik (setelah membuat rangerdirfile):

alias ranger='ranger --choosedir=$HOME/rangerdir;cd "$(cat $HOME/rangerdir)"'

Posting berikut di askubuntu membantu saya ketika saya mencoba mencari tahu mengapa berbagai solusi yang saya coba tidak berfungsi: /ubuntu/404141/why-cant-i-pipe-into-cd

Try431
sumber
1

bolehkah saya satu-up semua? melewati argumen lain mungkin berguna, jadi letakkan ini di shellrc Anda

function ranger () {
    /usr/bin/ranger --choosedir=$HOME/.rangerdir $@
    LASTDIR=`cat $HOME/.rangerdir` 
    cd $LASTDIR
    echo -n > $HOME/.rangerdir
}
Michael Kraume
sumber
0

Berikut cara yang lebih elegan dengan menulis pembungkus fungsi. Cukup gunakan perintah ranger, dan jika Anda ingin menyinkronkan direktori ubah kembali ke shell utama, berhenti ranger dengan modal Q.

(Kode di bawah ini adalah tes dengan Bash dan ZSH.)

function ranger {
  local IFS=$'\t\n'
  local tempfile="$(mktemp -t tmp.XXXXXX)"
  local ranger_cmd=(
    command
    ranger
    --cmd="map Q chain shell echo %d > \"$tempfile\"; quitall"
  )

  ${ranger_cmd[@]} "$@"
  if [[ -f "$tempfile" ]] && [[ "$(cat -- "$tempfile")" != "$PWD" ]]; then
    cd -- "$(cat -- "$tempfile")" || return
  fi
  command rm -f -- "$tempfile" 2>/dev/null
}

Ini akan memungkinkan Anda menyinkronkan kembali perubahan direktori sesuai permintaan . Gunakan :quntuk keluar secara normal, Quntuk keluar dan mengubah direktori Anda.

Simba
sumber
(1) Sepertinya Anda memiliki beberapa masalah dengan penawaran. (2) Apa yang Anda maksud dengan '' sesuai permintaan ''?
Scott