如何在命令列中擴展相對路徑並使用製表符補全?

如何在命令列中擴展相對路徑並使用製表符補全?

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

相關內容