zshのtab補完について

このQ&Aのポイント
  • zshのtab補完についての問題と解決策について説明します。
  • 問題点として、"./"に続く補完で、実行権限なしのファイルが補完候補にならないことや、$PATHにある実行ファイルが補完候補になることが挙げられます。
  • 解決策として、zshの設定ファイルである.zshrcに特定のオプションを追加することで、問題を解決することができます。
回答を見る
  • ベストアンサー

zshのtab補完について

よろしくお願いします。 つい最近、tcshからzshに乗り換えて、設定をいろいろいじっているのですが、 Tabキーによる補完の動作で、デフォルト(?)だと使いづらいものがあり、 なんとかしたいのですが、設定方法がわからず困っています。 ご助言をお願い致します。 変更したいのは以下の2点の動作です。 ========================================================= (1) "./"に続く補完で、実行権限なしのファイルも補完候補にしたい。 ========================================================= > ls -l -rwxrwxrwx+ 1 username main.sh -rw-r--r--+ 1 username main2.sh > ./ma(ここでTabキー) 上記のようにtabキーを押すと、補完候補には実行権限のあるmain.shしか表示されず、 実行権限なしのmain2.shが候補になりません。 > chmod a+x main2.sh のように実行権限を付け直ければいいのですが、何度もやるのはさすがに面倒なので、 実行権限なしのファイルも補完候補になるようにzshで設定したいのです。 =============================================== (2) $PATHにある実行ファイルを補完候補にしない。 =============================================== > ls main.sh > sh ma(ここでTabキー) mac2unix make.exe makejvf manlint ......... main.sh ...... make makeinfo.exe ... 上記のように、例えばshコマンドに続く補完候補には、 当然のようにカレントディレクトリ内のファイルが来ると思っていたのですが、 $PATHにあるようなコマンドまで補完候補になってしまいます。 これはコマンドごとに補完候補を除外するしかないのでしょうか? 以上2点が困っている点なのですが、解決方法かもしくはヒントでも結構ですので、 ご教授お願いします。 --------------------------------------------------------------- (私の.zshrcに設定してある内容で、補完に関する項目は以下の内容です。) autoload -U compinit; compinit -u setopt list_packed compdef _files zsh "*.zsh" zstyle ':completion:*:vim:*' ignored-patterns '*?.o' '*?~' ---------------------------------------------------------------

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

(1) "./"に続く補完で、実行権限なしのファイルも補完候補にしたい。 でも、「./main2.sh」ではpermission deniedで実行できないから、補完されても意味無いですよね? ./main2.shと実行したいのなら、面堂でも chmod +x main2.sh 等と実行権限を設定することが必要です。 有効なものだけ候補に出す、というのは、理にかなった方法だと思います。 コマンドが入るべきところでは、候補にはなりませんが、ファイル名が入るべきところでは、./main2.sh もちゃんと候補になります。 % ./main[TAB] # では main1.sh # だけが候補 % cat ./main[TAB] # では main1.sh main2.sh # main2.shも候補になる (2) $PATHにある実行ファイルを補完候補にしない。 sh の引数として、PATH上のファイルを指定できるのは仕様ですから、候補として挙がっても間違いではありません。 sh ./ma[TAB] というように、相対パス、または絶対パスで書けば、PATHは探しにいきません。 あとは、shの補完設定を変更することでしょうか。

jshannon9
質問者

お礼

ご回答ありがとうございます。 やはり仕様の部分もあるのですね。 bashやtcshと違い、 かなり踏み込んで補完の自動判別がされるなぁと感じたのですが、 これは慣れれば、むしろ良い機能なのかもしれません。 ひとまずお礼までに。

関連するQ&A

  • Tabキー補完や↑キーのヒストリーを使いたい。

    Linux等では、Tabキーを押すことにより、パス名やファイル名の補完ができ、↑キーを押すとコマンドの履歴が表示されるのですが、Sorarisでも同様のことはできないのでしょうか? できる場合、その方法を教えて頂けないでしょうか?

  • 【Debian】apt-get install のファイル名をtabキーで補完できない?

    Debian Sarge(2.6.18-4-686)を利用し始めたばかりの学生です。 root権限になってパッケージのインストールの時にapt-get installで指定するファイル名をtabキーで補完できません。 一般ユーザですと、パッケージ候補などを表示してくれます。 シェルはデフォルトのbashを利用しており、調べた結果、補完動作を拡張させるために /etc/bash.bashrcで/etc/bash_completionを読み込む設定に変更してみましたが、apt-getの補完の様子は変わりませんでした。 この現象は、私のパソコンだけなのかセキュリティなどの理由でこのような設定になっているのか分からないのですが、 tabキーは便利なので補完できるように設定する方法がありましたら教えてください。 また、他のみなさんの環境ではroot権限でapt-getのtabキー補完は可能なのかどうか教えてください。 よろしくお願いします。

  • [cygwin]ファイル名の補完が効かないファイル

    よろしくお願いします。 windows7 professional edition (64bit)上で、cygwinを利用しています。 cygwinのシェルはtcshです。 ========================================================================= cygwinやlinuxの端末で、Tabキーによるファイル名やパスの補完(?: 入力省略)を よく利用するのですが、時々Tabキーによる補完が効かないファイルがあります。 実行ファイル(.exe)の名前の後にアスタリスク(*)が付いているファイルです。 http://www.seta.media.ryukoku.ac.jp/manual/ubuntu/faq/faq.html 上記のサイトによると、プログラムソースをコンパイルして作成した実行ファイルのことだと 書いてありますが、Tabキーの補完が効かないファイルもおそらくこの類だと思われます。 何とかしてこのような実行ファイルでもTabキーによる補完が効くように設定できないものでしょうか。 ============================================================================= 何か情報お持ちでしたらお願い致します。

  • WindowsでPATHにあるコマンドを補完?

    お世話になります。 Windowsのコマンドラインプロンプトでは、ある程度タイプして[TAB}キーを押下すると、カレントディレクトリにあるファイル名を補完してくれます。 たとえば xxxxYYY というファイルがあるディレクトリにおいて  C:\foo\> x[TAB] のようにタイプすると、xxxxYYYと補完されます。 LinuxやMacを含むUNIX系のコマンドライン環境では、カレントディレクトリだけでなく、PATHに入っているコマンドも補完してくれます。具体的に言うと、C:\myProgram\bin\xxxxYYY.exeというコマンドを、C:\fooという全然違うカレントディレクトリにあっても、  C:\foo\> x[TAB] で補完してくれます。 この、PATHにあるコマンド名の補完は、Windowsでも可能でしょうが。 具体的には、何らかのフリーウェアを常駐させる、レジストリを書き換えるなどによって、可能になるでしょうか。 私は20年以上DOS/Windowsを使い込んでいるのですが、この機能さえあれば本当に助かります。 Linuxを使え、WindowsでCygwinを使えというのはナシで、あくまでWindowsのcmdを使い続けるという前提でお願いします。 よろしくお願いいたします。

  • zshで圧縮ファイルが赤く表示されません。

    基本的なシェルの質問です。 tcshからzshに変更して色々.zshrcをいじくってみたんですが、tcshやbashではターミナル上で ls をしたらディレクトリは青、実行ファイルは緑、リンクは水、圧縮ファイルは赤、などなど色とりどりだったのですが、zshでは圧縮ファイルが赤く表示されません。ディレクトリは青く表示されるのでが。。。(そういえばjpgファイルとかに付いていた紫色も見当たらないです。) .zshrc 内で alias ls="ls -F --color=auto" と入力しているのですが、これ以外に何かしなくてはいけないのでしょうか?

  • zshがなくてrootでログインできなくなった

    Solarisの経験はある程度ありますが、Linuxは初心者です。 CentOS5.5をインストールして、passwdファイルを書き換え、デフォルトのシェルをzshにしました。 ログインし直そうとしたところ、てっきりデフォルトで入っていると思っていたzshがなかったようで、zshがないというメッセージが出力され、ログインできなくなってしまいました。 このような場合、Solarisはとりあえずshをシェルにしてログインまではさせてくれるのですが、CentOSの場合はログインすら許してくれないようです。こういうケースではどうしたらいいのでしょうか。 かなりいろいろと設定をしたあとですので、できれば再インストールは避けたいところなのです。 よろしくお願いいたします。

  • zshのワイルドカード展開について

    zshのワイルドカード展開について、初歩的な質問ですがよろしくお願いします。 ホームディレクトリの親ディレクトリ内に、"test1.txt"と"test2.txt"というファイルを作った上で、  > files=~/../te*.txt  > ls $files とやると  ls: ..../te*.txtにアクセスできません。 No such file or directory とエラー表示されてしまいます。 zshrcの設定が影響しているのかと思い、zshrcを一旦カラにしてみましたが、 結果は同じでした。 bash等だと、  > ls $files でワイルドカードが展開され、  test1.txt test2.txt と表示されるのですが、zshの場合はワイルドカードを展開させる方法が特殊なのでしょうか?

  • lsコマンドでforkできない

    Vine6.0の載ったマシン(node1とする)をlogin shellをzshにして使っています。 teratermなどを使って、node1にsshでログインし、lsコマンドを使用すると、 ls: fork failed: リソースが一時的に利用できません というメッセージが出て、lsが失敗します。zshをもう一度子シェルとして実行すると、 解決します。 他のコマンドは問題なく使えているので、lsが悪いのか、zshが悪いのかだと思うのですが、 理由はわかりますでしょうか? よろしくお願いします。

  • 検索して出た結果ファイル一覧の権限を一括変更

    1.ファイルを検索します。(カレントディレクトリに、BBB.sh とCCC.shを保存しております。) 2.検索されたファイルに対して一括でchmodを行いたいのです。 このBBB.shと、CCC.shの権限を666に コマンドだけで実行できないでしょうか? ・考えてみたコマンド ls -l | grep -e [BC] | chmod 655 →エラーになります。 多分、chmod 655の後ろに、ファイルが来ないためエラーになっていると思うのです。 ご教授お願いします。

  • Cygwin+GDBでターミナルの設定?

    Linux系ではないのですが、こちらには詳しい方がいらっしゃると思いますので、ここで質問させてください。 Cygwin環境でgdbを走らせてデバッグしようとしているのですが、gdb上ではTABキーによるコマンド補完や、↑キーによるコマンド履歴呼び出しができずに困っています。 bashを起動した状態のときは、bash上ではコマンド補完や履歴呼び出しはできています。 そこからgdbを起動すると補完や履歴呼び出しはできなくなります。 これは、ターミナルの設定の問題ですか?それともgdbの設定の問題ですか? 「・・・できなくなる」と書いてますが、全く利いていないわけではないようです。 gdb上で、↑キーを押すとその時点ではカーソルが上に移動するだけです。さらにもう一度↑キーを押してから(もちろん更にカーソルがもう一行上に移動する)ENTERを押すと、2つ前に入力したコマンドが実行されます。 また、同じくgdb上で、「d」とタイプしてからTABキーを2回押すと、カーソルがタブスペースの分だけ右へ2回移動するだけですが、ENTERを押すと「d」から始まるコマンドの一覧が出ます。 どうやら、ENTERを押すまではキー操作がgdbに伝わっておらず、ENTERと同時にgdbに渡されているようです。 それから、CTRL+Cで実行中のプログラムが停止しません。しばらくだんまりになったあと、gdb自体が終了します。これも、どうにかして、CTRL+Cで止まるようにしたいです。 関係ないかもしれませんが、bashのバージョンは4.1.10、gdbのバージョンは7.2です。 よろしくお願いします。