如何在命令行中扩展相对路径并使用制表符补全?

如何在命令行中扩展相对路径并使用制表符补全?

bash没有办法将相对路径扩展为绝对路径,也许可以使用制表符完成?

我问这个问题是因为有时我会搜索一个文件,找到它,然后vim它:

cd /etc
cd apache2
cd sites-available
vim 000-default

然后我会做一些其他事情并更改目录:

cd /tmp
ls
cd ~
ls

然后我会发现我需要再次编辑同一个文件,但是无法使用history,(或历史搜索),因为文件路径是相对的。

当前的解决方法

如果我知道我将经常重复使用某个文件,那么在找到它后,我将使用以下命令获取完整路径realpath

$ realpath 000-default
/etc/apache2/sites-available/000-default
(copy and paste path into next command:)
$ vi /etc/apache2/sites-available/000-default

注意事项

这仍然需要复制和粘贴。我相信应该有一种更简单的方法来获取文件的完整路径进入我的历史记录。我有什么选择?

我相信在将相对路径扩展为完整路径之前,我(不小心)按下了一些组合键。我知道在 bash 中你可以输入:

cd /etc
ls bash_*(control+x *)

并得到:

ls bash.bashrc bash_completion bash_completion.d

那么有没有一种方法可以将相对路径扩展为绝对路径,以便我可以使用该文件的完整路径保存对历史记录中文件的操作?

答案1

我找不到一个好的方法来做到这一点。

我所做的就是$PWD在文件名之前输入,然后按将Tab其展开。您bash可能需要按Ctrl+ Alt+e而不是Tab

例如

vi $PWD/000-default

然后

Ctrl+ Alt+e

然后

Enter

答案2

为此,您可以在 bash 中使用可编程制表符补全:

function _vim_complete_file() {
    IFS=$'\n' read -d '' -a FILES <<< "$( compgen -A file "${COMP_WORDS[$COMP_CWORD]}" )"
    IFS=$'\n' read -d '' -a COMPREPLY <<< "$( realpath "${FILES[@]}" )"
}

complete -F _vim_complete_file vim

现在,如果您输入vim 000TAB,它将替换000/path/to/000-default

解释
其工作方式是告诉 bash在您按下的参数时complete -F _vim_complete_file vim使用该函数。 然后,该函数将在您按 TAB 时光标所在的当前单词上运行。这将返回与其匹配的文件列表。 然后将该文件列表传递给生成完全限定的路径。该列表存储为一个数组,shell 在其中查找可用的补全。_vim_complete_fileTABvim
compgen -A file
realpathCOMPREPLY

答案3

您可能想要开始使用 Pushd 和 Popd,以便更容易返回到上一个目录:http://gnu.org/software/bash/manual/bashref.html#The-Directory-Stack

我看到你的评论cdargs(我认为是)。对于我经常使用的目录,我使用别名或函数。例如

alias cgi='pushd /path/to/apache/cgi-bin'

或者

docs() { pushd /path/to/apache/docroot/"$1"; }

如果有的话,第二种形式很有用家长子目录经常出现的目录,然后docs foo带我到/path/to/apache/docroot/foo.缺点是你会失去制表符补全功能,但这对我来说并没有那么困难。

答案4

如果您要在 Vim 中重新编辑,请查看:browse oldfiles:help oldfiles

相关内容