web-dev-qa-db-ja.com

zsh tab complete。 ./

重複ではありません:
ディレクトリ名を完成させたり、固定ディレクトリからスクリプトを実行したりする方法を探していません。私が解決しようとしている問題は、currentディレクトリwithoutを完了することです /


Zshにbashのように.から./までタブ補完してもらいたい。

Bashを使うと、 .TABTAB現在の作業ディレクトリ内のすべてのファイルを表示するには、最初に./まで完了し、次にそのディレクトリ内のすべてのコンテンツを表示します。回避したい理由 / とにかくそれは / 私のドイツ語キーボードでは、 TAB 2本の指でシフトするか、テンキーで遠くにあるので、/を入力するよりもbashに戻したいからです。私が達成したいこと、言い換えればbashが行うこと:

$ .               <TAB>
$ ./              <TAB>
foo.sh   somedir/
$ ./              <F><TAB>
$ ./foo.sh        <ENTER>

ヒットしたときにzsh/oh-my-zshを使用する .TAB.(ドットスペース)が表示されますが、これはまったく役に立ちません。

  • zstyle ':completion:*' special-dirs truesetopt auto_cd(oh-my-zshのデフォルト)と共に使用すると、../のオプションがさらに有効になるため、すでにオフにしています。 cdの完成に満足しています。
  • .には$PATHはなく、そのままにしておく必要があります。完了してもかまいません。 f<TAB>から./foo.shなど。

どのようにzshに.から./まで、またはローカルディレクトリのコンテンツをすぐに完了するように教えることができますか?または、関与しない効率的な方法でローカルスクリプトファイルを操作する別の方法があります /

11
zapl

素晴らしい挑戦です!コマンドラインでこれを試してください、それが機能する場合は〜/ .zshrcに追加してください

bindkey '^I' dotcomplete
zle -N dotcomplete
function dotcomplete() {                                        
  if [[ $BUFFER =~ ^'\.'$ ]]; then
    BUFFER='./'
    CURSOR=2
    zle list-choices
  else
    zle expand-or-complete
  fi
}                    

Tab(^ I)を押すたびに実行される関数を追加します。現在入力した行にドットのみが含まれている場合(^ =行の先頭、 '\。' =ドットのエスケープ、$ =行の終わり)、そのドットを./に置き換えてから、通常の完了。

ドットを現在のディレクトリとして扱うということは、あなたが要求することを正確に実行しません。しかし、保存したいキーストロークを保存します。

2
andrew lorien

あなたのf<TAB>オプション/回避策、私が提示します:

$ function f(){ local x=$1; shift; ./"$x" "$@"; }
$ f foo<TAB>

後のスペースに気づく f その最後の行で

1
Gedge