タブ補完を使用してコマンドラインで相対パスを展開するにはどうすればよいですか?

タブ補完を使用してコマンドラインで相対パスを展開するにはどうすればよいですか?

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を押す必要がある場合があります。CtrlAlteTab

例えば

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

説明
この仕組みは、引数を押すたびに がcomplete -F _vim_complete_file vimbash に 関数を使用するように指示する ものです。 関数は、Tab キーを押したときにカーソルが置かれていた現在の単語に対して実行されます。これにより、それに一致するファイルのリストが返されます。 次に、そのファイルのリストが に渡され、完全修飾パスが生成されます。このリストは配列として保存され、シェルはその中で利用可能な補完を検索します。_vim_complete_fileTABvim
compgen -A file
realpathCOMPREPLY

答え3

以前のディレクトリに戻りやすくなるように、pushd と popd の使用を開始することをお勧めします。http://gnu.org/software/bash/manual/bashref.html#ディレクトリスタック

私はあなたのコメントを見ましたcdargs(これはこれ頻繁に使用するディレクトリには、エイリアスまたは関数を使用します。たとえば、

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

または

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

2番目の形式は、サブディレクトリが頻繁に存在するディレクトリに移動すると、docs fooに移動します/path/to/apache/docroot/foo。欠点はタブ補完が失われることですが、私にとってはそれほど面倒ではありませんでした。

答え4

Vim で再編集する場合は、:browse oldfilesと を確認してください:help oldfiles

関連情報