web-dev-qa-db-ja.com

vimコマンドによるBashオートコンプリート

Bashでは、パスが2つのディレクトリよりも深いvimコマンドを発行すると、パスのオートコンプリートが最近機能しなくなりました(lscd)。

たとえば、ls .config/btsync/btと入力してTabキーを押すと、ls .config/btsync/btsync.confに展開されます。

vim .config/bt」と入力してTabキーを押すと、vim .config/btsync/に展開されます。

ただし、vim .config/btsync/btと入力してTabキーを押しても、何も起こりません(上記のlsの例のように、vim .config/btsync/btsync.confに展開されるはずです)。

自分のユーザーとして実行する場合とsuとして実行する場合に同じ問題が発生します。

私は この投稿 を読みましたが、これは古いバージョンのbash-completionの問題について言及していますが、2.1-5を実行しています。

更新:いくつかの追加テストの後、根本的な問題はbashがファイル名ではなく完全なディレクトリ名のみになることであることがわかりました。

更新:bash-completionが全体的な原因であることがわかりました。受け入れられた回答に関する2番目のコメントを参照してください。

この動作の潜在的な原因に関する提案はありがたく受け取られます!

13
TheRogueWolf

私はあなたのためにもう少し調査しました、そしてここに私が見つけたものがあります-自動補完の鍵はbashコマンドcompleteです。以下を使用して、vimのルールを印刷できます。

complete -p vim

同様に、これらの特定のルールを次のように削除できます。

complete -r vim

このコマンドは、デフォルトにリセットします。通常のパスとファイル名は、追加のロジックなしで補完されます。それはおそらくあなたが望んでいることです。

詳細については、help completeまたはman bashを確認し、completeコマンドに関するセクションを探してください(これはbashの組み込みなので、bashのマンページに記載されています)。

最後の1つのポイント-上記の変更は現在のbashセッションにのみ影響します。ログインするたびにcomplete -r vim~/.bashrcに追加した後にvimルールを削除する場合は、.

それが役に立てば幸い:)

10
MLu

デフォルトでは、bashはパスとファイル名のみをオートコンプリートします。ただし、メカニズムは拡張可能であり、bashは異なるプログラムに対して異なるオートコンプリートを実行するように教えることができます。たとえば、gitの場合、パス名だけでなく、サブコマンド名(クローン、コミット)とリビジョンをオートコンプリートできます。便利な場合もあれば、非常に煩わしい場合もあります。たとえば、gzip -d.gz拡張子を持たないファイル名のオートコンプリートを拒否する場合などです。

通常、bash補完は/etc/bash_completion.dで構成されます-おそらくvimというファイルがそこにあります。これは、vimコマンドラインのオートコンプリートルールを含むファイルです。

今、あなたは2つのオプションを持っています:

  1. とにかくユーザーが期待しているように、ファイルをオートコンプリートパスに修正します。
  2. ファイルを削除して、特別なvimルールを無効にし、デフォルトのパスのオートコンプリートのみを実行します。

そしてもちろん、将来のバージョンで修正されるように、問題の概要を示すバグレポートを提出してください:)

3
MLu

おそらくbash-completionを再インストールできますか:apt-get install --reinstall bash-completion

そして/etc/bash.bashrcファイルを見てみましょう:nano /etc/bash.bashrc

また、次の行がコメント解除されていることを確認してください。

if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
Elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi

次に、ターミナルセッションを再起動します。

2
Djidiouf