
Gibt bash
es 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 vim
Folgendes 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 $PWD
vor dem Dateinamen ein und drücke dann, Tabum ihn zu erweitern. bash
Mö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 000
TAB, wird es 000
durch ersetzt /path/to/000-default
.
Erläuterung
Dies funktioniert so, dass complete -F _vim_complete_file vim
Bash angewiesen wird, die Funktion zu verwenden, _vim_complete_file
wenn Sie TABauf ein Argument drücken vim
.
Die Funktion wird dann compgen -A file
fü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, realpath
wodurch der vollständig qualifizierte Pfad generiert wird. Diese Liste wird als Array gespeichert, in COMPREPLY
dem 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 foo
bringt 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 oldfiles
und an :help oldfiles
.