如何退出Ranger文件浏览器回到命令提示符,但保留当前目录?


28

我正在从Linux终端中使用Ranger终端文件资源管理器
说我从主目录中的命令提示符开始并启动Ranger

user@/home/user $ ranger

护林员打开.....,在护林员程序中,我探索到:

/media/ubuntu/sdf675d7sf5sdfs7/some_directory

如果然后按q退出Ranger,我将退回到启动Ranger的同一文件夹。即

user@/home/user $

是否可以退出Ranger,并保留在我与Ranger所在的目录中,即i。

user@/media/ubuntu/sdf675d7sf5sdfs7/some_directory $  

Answers:


29

根据其手册

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

因此,您需要做的就是创建一个这样的别名:

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

并建议将此别名写入您喜欢的shell的rc中。


2
哇,这真是太聪明了,我从没想过可以向程序发出命令,以a终止;,然后在分号后指定更多命令,我假设您在关闭时运行ranger,谢谢!
the_velour_fog '16

1
考虑使用.rangerdir代替使其隐藏。或最后删除它rm -d $HOME/rangerdir
Mateen Ulhaq,

这很棒,但是如果我理解正确的话,那将意味着您永久拥有该行为。如果可以选择退出当前的护林员目录或启动护林员时所在的目录,那将是不错的选择。
neverfox

neverfox一旦创建了别名,是否提供要在该别名内进入的目录的选择将由您自己决定。选择可以在二进制文件调用之前或完成之后进行。
GombaiSándor18年

感谢您提供的出色解决方案!我碰巧正在使用fish_configranger --choosedir="$HOME/.rangerdir"; cd (cat $HOME/.rangerdir)
鱼壳


7

我找到了一个更简单的解决方案。当您安装Ranger时,它将在您的bin文件夹中放置一个脚本,如果执行该脚本,将启动该程序。但是,如果您采购它,

$源游侠

它将启动Ranger,并在您退出时将您放置在上次访问的文件夹中。

因此,如果您希望默认情况下执行此操作,请执行

$ alias ranger ='源游侠'

甚至最好将其放入您的.bashrc文件中。

要查看此功能的文档和实现,请阅读bin文件夹中的Ranger脚本。


显然. rangerWiki
cjauvin

4

为了支持GombaiSándor的回答,我建议对别名进行一些小的调整:

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

通过将“ $ Home / rangerdir”更改为“ $ Home / .rangerdir”,可以使别名创建的文件隐藏。只是这样做,所以它不会使主文件夹杂乱无章。它的工作方式没有任何功能上的差异。


2

Gambai及其建议的其他变体相比,我在其他地方偶然发现了一个类似的问题,并且答案更好。更好。

  1. 它将通过将创建的文件放入tmp文件夹中来处理该文件,以便系统可以将其删除
  2. 它是更干净的代码(尽管Gambai的答案可以转换为函数)

护林员的git repo中的shell文件中已经有一个函数:

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

您可以将此函数放入您喜欢的shell rc(例如~/.zshrc)文件中,然后创建别名和/或将其绑定到组合键(同样可以将其放入rc文件中):

alias nav=ranger-cd

和/或

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

免责声明:bindkey中ZSH以上工作,你应该根据你的首选shell更改


1

感谢Gombai的启发,但是在Ubuntu 14.04 LTS上,我发现该解决方案不太有效。稍加修改并将其另存为我的.bashrc中的别名,以下操作完美(在创建rangerdir文件之后):

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

当我试图弄清为什么我尝试的其他解决方案无法正常工作时,askubuntu上的以下帖子为我提供了帮助:https : //askubuntu.com/questions/404141/why-cant-i-pipe-in​​to-cd


1

我可以一个人吗?传递其他参数可能很有用,因此请将其放在您的shellrc中

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

0

通过编写函数包装,这是一种更为优雅的方法。只需使用命令ranger,如果您想将目录同步回主外壳,请使用capital退出Ranger Q

(以下代码是对Bash和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
}

这将让你同步备份目录变化的需求。用于:q正常退出,Q退出和更改目录。


(1)您似乎在报价方面遇到了一些问题。(2)“按需”是什么意思?
斯科特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.