
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 000
TAB置き換えられます。000
/path/to/000-default
説明
この仕組みは、引数を押すたびに がcomplete -F _vim_complete_file vim
bash に 関数を使用するように指示する ものです。 関数は、Tab キーを押したときにカーソルが置かれていた現在の単語に対して実行されます。これにより、それに一致するファイルのリストが返されます。 次に、そのファイルのリストが に渡され、完全修飾パスが生成されます。このリストは配列として保存され、シェルはその中で利用可能な補完を検索します。_vim_complete_file
TABvim
compgen -A file
realpath
COMPREPLY
答え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
。