相対パスを拡張し、コマンドラインでタブ補完を使用する方法は?

相対パスを拡張し、コマンドラインでタブ補完を使用する方法は?

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

説明する
どのように機能するかは、引数を押すときにbashにcomplete -F _vim_complete_file vim関数を使用するように指示することです。これにより、TABを押したときにカーソルがあった現在の単語で関数が実行されます。これにより、一致するファイルのリストが返されます。その後、このファイルのリストが渡され、完全修飾パスが生成されます。リストは、シェルが使用可能な完成を探す配列として保存されます。_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"; }

可能であれば、2番目のフォームが便利です。よく表示されるサブディレクトリを見つけたら、docs fooそこに移動してください/path/to/apache/docroot/foo。欠点は、タブ完成機能を失うことですが、私にとってはそれほど難しくありません。

答え4

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

関連情報