简化的终端导航

简化的终端导航

我知道 IDE 是未来的潮流,但我总​​是发现自己vim在 Linux 终端中进行编码。老狗了新花样。

无论如何,在处理长包名称时,导航变得具有挑战性。例如,在我的终端中,我可以看到我当前的路径作为提示的一部分。有时我在这里:

/foo/bar/src/com/example/yomama/

我想要到达:

/foo/bar

我有一些漂亮的别名:

alias 1down="cd .."
alias 2down="cd ..;cd .."
alias 3down="cd ..;cd ..;cd .."
alias 4down="cd ..;cd ..;cd ..;cd .."
alias 5down="cd ..;cd ..;cd ..;cd ..;cd .."

所以如果我输入4down,砰!我在/foo/bar

我刚刚想到,因为我知道我当前的工作目录是:

/foo/bar/src/com/example/yomama/

我也可以从 / 向上 2 到达 /foo/bar。

因此,实现 2up 函数会很酷,因为更容易计算要上升的数量。在我开始为此编写 shell 脚本之前,我想知道是否有任何 shell 工具可以提供更优雅的解决方案。如果有人知道可以实现的一句话,那就加分了Nup

PS:我已经有了

alias bar = "cd /foo/bar"

我在这里寻找更通用的解决方案。

$PWDPPS:我一直认为在提示中添加可点击的内容会非常酷。所以我只需点击bar, 和cd即可/foo/bar。但也许我应该转向图形 IDE 并且闭嘴了;-)

编辑:

我对 Nup 的定义有些混乱。

Nup 应该将您带到 PWD 中从 root 开始的第 N 个路径位置。因此,如果您当前位于 /a/b/c/d/e/f/g/h/i,4up 将带您前往 /a/b/c/d。同样,5down 会得到 /a/b/c/d。

基本上,您可以导航路径,而无需费力地多次“cd ..”,或指定“cd /a/b/c/d”。

答案1

通过文件中的两个函数.bashrc,您可以使用目录堆栈进行某些导航

function down ()
{
  if [[ -z "$1" ]]
  then
   n=1
  else
   n=$1
  fi

  for ((i=0; i<$n; i++ ));
  do
      pushd .. > /dev/null
  done;
}
function up ()
{
  if [[ -z "$1" ]]
  then
   n=1
  else
   n=$1
  fi

  for ((i=0; i<$n; i++ ));
  do
      popd > /dev/null
  done;
#  dirs -c  # To clear directory on up motion
}

您可以分别在哪里使用down Nup N

使用示例:

~/tmp/bash/dir1/dir2/dir3$ down 4
~/tmp$ up 2
~/tmp/bash/dir1$ up 2
~/tmp/bash/dir1/dir2/dir3$ down 2
~/tmp/bash/dir1$ down 1
~/tmp/bash$ up 3
~/tmp/bash/dir1/dir2/dir3$

当然,up N在使用之前不能使用down N。可能会发生意外的事情,或者可能会出现错误消息。

答案2

这是我的方法,允许您来回移动,还可以返回到您之前所在的任何目录。当您发现自己来回导航到文件系统的不同部分时(在开发过程中相当常见),这尤其有价值)。

支持:

up # (go up any # of directories)
goback 
goback # (the # is optional to go back any #)
prev (go to the last dir you were in)

这还允许您 cd 进入系统上任何位置的目录,然后返回到上一个目录,因为它保存了您最后所在目录的位置。

笔记:滚动到最底部查看此内容的超级浓缩版本。

步骤1:编辑 (nano/vim) ~/.bashrc 并将以下内容添加到底部:

declare -a DIR_STACK

cd() {
    DIR_STACK+=("$PWD")
    builtin cd "$@" && pwd || { unset 'DIR_STACK[-1]'; return 1; }
}

up() {
    local count=${1:-1}
    for _ in $(seq 1 $count); do
        [[ $PWD != / ]] && DIR_STACK+=("$PWD") && builtin cd .. || { echo "Error: Reached root directory."; return 1; }
    done
    pwd
}

goback() {
    local count=${1:-1}
    while [[ ${#DIR_STACK[@]} -gt 1 && count -gt 0 ]]; do
        builtin cd "${DIR_STACK[-2]}"
        unset 'DIR_STACK[-1]' && ((count--))
    done
    [[ $count -eq 0 ]] && pwd || echo "Error: Cannot go back any further."
}

prev() {
    [[ -n $OLDPWD ]] && builtin cd - > /dev/null && pwd || echo "Error: No previous directory stored."
}

第2步。源~/.bashrc

步骤 3.它的工作原理如下:

[root@agent colors]# pwd
/etc/xdg/colors
[root@agent colors]# cd /
/
[root@agent /]# goback
/etc/xdg/colors
[root@agent colors]# cd ..
/etc/xdg
[root@agent xdg]# goback
/etc/xdg/colors
[root@agent colors]# cd ../../
/etc
[root@agent etc]# goback
/etc/xdg/colors
[root@agent colors]# up 2
/etc
[root@agent etc]# goback
/etc/xdg/colors
[root@agent colors]# cd ..
/etc/xdg
[root@agent xdg]# prev
/etc/xdg/colors
[root@agent colors]# cd /
/
[root@agent /]# goback 3
/etc/xdg/colors
[root@agent colors]# up 3
/
[root@agent /]# goback 3
/etc/xdg/colors

.bashrc 的精简版本(可读性较差):

declare -a DIR_STACK
cd() { DIR_STACK+=("$PWD"); builtin cd "$@" && pwd || { unset 'DIR_STACK[-1]'; return 1; }; }
up() { local count=${1:-1}; for _ in $(seq 1 $count); do [[ $PWD != / ]] && DIR_STACK+=("$PWD") && builtin cd .. || { echo "Error: Reached root directory."; return 1; }; done; pwd; }
goback() { local count=${1:-1}; while [[ ${#DIR_STACK[@]} -gt 1 && count -gt 0 ]]; do builtin cd "${DIR_STACK[-2]}"; unset 'DIR_STACK[-1]' && ((count--)); done; [[ $count -eq 0 ]] && pwd || echo "Error: Cannot go back any further."; }
prev() { [[ -n $OLDPWD ]] && builtin cd - > /dev/null && pwd || echo "Error: No previous directory stored."; }

答案3

这并不完全是您要求的答案,但您可能感兴趣的是午夜指挥官文件浏览器,它应该在任何 Linux 发行版存储库中可用。mc使用类似控制台 vim 的诅咒;它提供了两个面板的文件浏览界面底部有命令提示符;您可以使用箭头键导航目录并键入命令(要导航命令历史记录,请使用 ctrl-n 和 ctrl-p)。 Ctrl-o 向上和向下切换界面 - 当它打开时,您将处于同一目录中的普通子 shell 中。您可以从其中启动 vim,如果您EDITOR=vim在环境中设置并取消选中“选项”->“配置”中的“使用内部编辑”,则在突出显示文件的情况下按 F4 将会对其进行 vim。它非常值得学习使用,并且是我最喜欢的软件之一。

在 X 终端中,界面可以通过鼠标使用;如果您安装了,那么您也可以在 VT 中使用鼠标gpm

答案4

我感谢所有的评论和回复。今天早上我用面条想出了:

alias 1up='cd /$(echo $PWD | cut -f 2 -d /)'
alias 2up='cd /$(echo $PWD | cut -f 2,3 -d /)'
alias 3up='cd /$(echo $PWD | cut -f 2,3,4 -d /)'
alias 4up='cd /$(echo $PWD | cut -f 2,3,4,5 -d /)'
alias 5up='cd /$(echo $PWD | cut -f 2,3,4,5,6 -d /)'

请注意,单引号是必需的,这样 bash 就不会扩展别名中的 pwd。我可以为此编写一个函数,但我只需要 5up 和 5down 。

评论赞赏。我确实有一个愿望是使用纯 bash 来解析路径变量而不是使用 cut - 但我有真正的工作要做;-)

相关内容