我知道 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"
我在这里寻找更通用的解决方案。
$PWD
PPS:我一直认为在提示中添加可点击的内容会非常酷。所以我只需点击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 N
和up 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 - 但我有真正的工作要做;-)