vimコマンドを使用したBashのオートコンプリート


13

bashではvim、パスが2つのディレクトリよりも深いコマンドを発行すると、パスのオートコンプリートは最近機能しなくなりました(lsand などの他のコマンドで期待どおりに機能し続けますcd)。

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

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

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

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

古い投稿のbash-completionの問題について言及したこの投稿を読みましたが、2.1-5を実行しています。

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

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

この振る舞いの潜在的な原因に関する提案はありがたいことに受け取られます!


あなたの投稿.bashrc
ジル 'SO-悪であるのをやめる' 14

.bashrc要求された私の投稿へのリンク。
TheRogueWolf

原因が発見されたため、問題に関係のない.bashrc、.aliases、および.functionsへのリンクを削除しました。
TheRogueWolf 14

Debian 9でも同じ問題がありますが、一部のインストールではありませんがすべて:$
Philippe Gachoud

回答:


10

私はあなたのためにもう少し研究をしました、そして、ここに私が見つけたものです-オートコンプリートの鍵はbashコマンドcompleteです。以下をvim使用するためのルールを印刷できます。

complete -p vim

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

complete -r vim

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

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

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

それが役立つことを願っています:)


それでした。大変感謝します。complete -p vim返されたコマンドcomplete -F _filedir_xspec vimによって削除されたcomplete -r vim問題を解決し、コマンド。completeコマンドと-pスイッチによって返された情報を読みます。この振る舞いが変わった理由を少し戸惑ったので、それも調査します。
TheRogueWolf 14

3
結局のところ、bash-completionが犯人のようです。この_filedir_xspec関数は/usr/share/bash-completion/bash_completionディレクトリのみを補完します。アンインストールしbash-completioncomplete -r vim行を削除して.bashrc再起動したvimところ、期待どおりに動作するようになりました。
TheRogueWolf 14

3

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

Bashの完了は通常で設定され/etc/bash_completion.dます-あなたはおそらくvimそこに呼び出されたファイルを見つけるでしょう。これは、vimコマンドラインのオートコンプリートルールを含むファイルです。

次の2つのオプションがあります。

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

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


素晴らしい説明に感謝します:)私が調べてみたところ/etc/bash_completion.dhgファイルのみが存在します(Mercurial用)。非常に奇妙な。
TheRogueWolf 14

1
その後、他の場所にある必要があります。パッケージから、またはパッケージ/usr/share/bash-completion/からすべてのファイルを試すか、リストします(ArchLinuxでどのように呼び出されるかわかりません)。どこかにあるでしょう。vimbashbash-completion
MLu 14

1
bash-completionパッケージショーのファイルのリストに/usr/share/bash-completion/completionsは、多くのプログラムのルールが含まれていますが、ではありませんvimvimパッケージとともにインストールされたファイルを一覧表示しても、完了関連のファイルは表示されず、システム全体を検索してfind / -name vimも完了関連のファイルは表示されません。
TheRogueWolf 14

2

おそらく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

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


削除bash-completionvim動作のテスト、再インストールbash-completionおよびテストを試みましたが、両方の状況で同じ問題が発生しました。リストした行はに存在しません/etc/bash.bashrc。この行は、しかし、である[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
TheRogueWolf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.