Wie kann ich einen relativen Pfad in der Befehlszeile mit der Tab-Vervollständigung erweitern?

Wie kann ich einen relativen Pfad in der Befehlszeile mit der Tab-Vervollständigung erweitern?

Gibt bashes eine Möglichkeit, einen relativen Pfad in einen absoluten Pfad zu erweitern, möglicherweise mit der Tab-Vervollständigung?

Ich frage, weil ich manchmal nach einer Datei suche, sie finde und dann vimFolgendes passiert:

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

Dann werde ich noch ein paar andere Dinge erledigen und die Verzeichnisse wechseln:

cd /tmp
ls
cd ~
ls

Dann stelle ich fest, dass ich dieselbe Datei erneut bearbeiten muss, aber es ist nicht möglich history, (oder die Verlaufssuche) zu verwenden, da der Dateipfad relativ ist.

Aktuelle Problemumgehung

Wenn ich weiß, dass ich eine Datei häufig wiederverwenden werde, erfasse ich den vollständigen Pfad, nachdem ich sie gefunden habe, etwa mit realpath:

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

Vorbehalte

Dies erfordert immer noch Kopieren und Einfügen. Ich glaube, es sollte einen einfacheren Weg geben, den vollständigen Pfad einer Datei in meinen Verlauf zu bekommen. Welche Optionen habe ich?

Ich glaube, ich habe vorher (aus Versehen) eine Tastenkombination gedrückt, die einen relativen Pfad in einen vollständigen Pfad erweitert hat. Ich weiß, dass man in Bash Folgendes eingeben kann:

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

und bekomme:

ls bash.bashrc bash_completion bash_completion.d

Gibt es also eine Möglichkeit, einen relativen Pfad in einen absoluten Pfad zu erweitern, sodass ich Vorgänge an einer Datei in meinem Verlauf mit dem vollständigen Pfad dieser Datei speichern kann?

Antwort1

Ich finde keine gute Möglichkeit, das zu tun.

Ich gebe $PWDvor dem Dateinamen ein und drücke dann, Tabum ihn zu erweitern. bashMöglicherweise müssen Sie Ctrl+ Alt+ estatt drücken Tab.

z.B

vi $PWD/000-default

Dann

Ctrl+ Alt+e

Dann

Enter

Antwort2

Sie könnten hierfür die programmierbare Tab-Vervollständigung innerhalb von Bash verwenden:

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

Wenn Sie jetzt eingeben vim 000TAB, wird es 000durch ersetzt /path/to/000-default.

Erläuterung
Dies funktioniert so, dass complete -F _vim_complete_file vimBash angewiesen wird, die Funktion zu verwenden, _vim_complete_filewenn Sie TABauf ein Argument drücken vim.
Die Funktion wird dann compgen -A filefür das aktuelle Wort ausgeführt, auf dem sich der Cursor befand, als Sie die TAB-Taste drückten. Dies gibt eine Liste der entsprechenden Dateien zurück.
Diese Liste der Dateien wird dann an übergeben, realpathwodurch der vollständig qualifizierte Pfad generiert wird. Diese Liste wird als Array gespeichert, in COMPREPLYdem die Shell nach den verfügbaren Vervollständigungen sucht.

Antwort3

Möglicherweise möchten Sie pushd und popd verwenden, damit Sie leichter zu einem vorherigen Verzeichnis zurückkehren können:http://gnu.org/software/bash/manual/bashref.html#The-Directory-Stack

Ich habe Ihren Kommentar zu cdargs(von dem ich annehme, dass erDas). Für Verzeichnisse, die ich häufig benutze, verwende ich einen Alias ​​oder eine Funktion. Zum Beispiel

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

oder

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

Die 2. Form ist nützlich, wenn es eineElternteilVerzeichnis, in dem die Unterverzeichnisse häufig sind, und docs foobringt mich dann zu /path/to/apache/docroot/foo. Der Nachteil ist, dass die Tab-Vervollständigung verloren geht, aber für mich war es nicht so mühsam.

Antwort4

Wenn Sie in Vim erneut bearbeiten, sehen Sie sich :browse oldfilesund an :help oldfiles.

verwandte Informationen