zsh その7
hashでもいける。 typeset -A a a=(A a B b C c) printf "%s\n" ${(k)a}| while read do printf "$REPLY\0%s\0" $a[$REPLY] done |sed 's#\o0$##' |read b >>390 >>391 b は c "$( ... )" で消せるんじゃない? あと、↓ でもいいような。 c ${(pj:\0:)a} c ${(kvpj:\0:)a} 書いてみるものだね。プロ達が見たこと無い技を教えてくれた。 そんな簡単にできるんだ。あってると思います。 偉い人はいいよな、こっちなんて直すの面倒からまだそのまま使ってるけれど、 こういうのを実現するのに中間file使って、m4使ってやってたよ。 私の.zshenvは糞コードで埋め尽くされてるな。 まあ糞コードは好きだけどね。それshellで書けますけど的なね。 教えてくれてありがとう。 なるほどなるほど、psとpjがsplitとjoinのようだ。 typeset -A a a=( A a B b C 'c c' ) echo ${(k)a} # keyを出力する。 echo ${(kv)a} # keyも値も出力する。 b=${(pj:\0:)a} # 空白を区切りに\0で結合する。 echo $b echo ${(ps:\0:)b} # \0を区切りに分ける。 b=${(kvpj:\0:)a} typeset -A c c=( ${(ps:\0:)b} ) # 値に空白が含まれていても、マクロ的に処理されるわけでなく # 一つの値として処理される。こういう所が他のshellと違うよね。 あーごめんごめんjoinの説明がおかしいね。空白を区切りにしてるわけではなく 他と一緒で値を区切りにしてくれてると思う。 # 変数が空、または値がなければ、1として置き換える。 echo ${a:-1} echo $a a=2 echo ${a:-1} echo $a; unset a # 上記の判定で、変数宣言がされている場合は置き換えないのが以下。:が無いだけ。 typeset a echo ${a-1} a=2 echo ${a:-1} echo $a; unset a # 変数が空、または値がなければ、指定された変数aに1を代入する。 *1 echo ${a:=1} echo $a echo ${a:=2} # *2 echo $a # 上記に加え、脚注*2 変数aに値が入っていても、値を上書きして定義するのが以下。 echo ${a::=2} echo $a; unset a # 脚注*1 の判定で、変数宣言がされている場合は代入しないのが以下。:が無いだけ。 typeset a echo ${a=1} a=2 echo ${a=1} echo $a; unset a # 他にもあるけれど勉強はここまでにする。 --- 2ch.orig 2015-05-16 08:09:21.000000000 +0900 +++ 2ch.diff 2015-05-16 08:11:22.000000000 +0900 @@ -8,7 +8,7 @@ typeset a echo ${a-1} a=2 - echo ${a:-1} + echo ${a-1} echo $a; unset a あとそっか > b は c "$( ... )" で消せるんじゃない? 確かにその通りでした。 後言葉が変でまだ知らない人達に、混乱を招いてしまうかも。 変数が空 false 変数が無い true 変数宣言 false 変数定義 true しかし"$()"の動作が思ってるより不思議だ。いつか勉強しとこう。 ps:\0: は 0 でいいけど、逆(pj:\0:)がないんだよね。f F と違って。 うーん、この非対称性。 setopt hist_ignore_space alias fg=' fg' しててもCtrl-pを押したときはfgが出てきてしまうのですが、 出てこないようにするにはどうすればいいでしょうか? 根本的な解決ではないが、新しい機能をkeyへ割り当てる事で要求はこなせる。 ここではalternateとp keyの組み合わせに、新しい機能を割り当てようと思う。 これは設定によってpの先頭に^[をつけるとかは変わる部分だが、 大体その設定になっているだろうと思う。 履歴をさかのぼるのが^Pだとしたら、 bindkey -s '^[p' '^P^P' 見ての通り二回分履歴をさかのぼっているだけになる。 ちなみに^P^Pの後に\rを書けば即座に実行する事となる。 当然これは危険である。 cd hoge rm * cd ここで実行しまうと再帰的にショックを受ける事になる。 試したいのであれば、 bindkey -s '^[p' 'pwd\r' などとすると良いでしょう。 ん、以下をfileに書いて実行すると動くのは理解できるのだけれど、 一番最後の行の\を一つ無くして「eval echo \$$a[B][2]」とすると fileに書いて実行した時は動かないけれど、promptから打っていった場合動いてしまう。 typeset -A a a=(B b) eval $a[B]+=\( c d \) eval echo \$$a[B]\[2] なるほど、そもそも以下をfileから実行した場合とpromptから 打ち込んだ時の挙動が違ったからか。 a=(abc) echo a[1][1] scriptからだとこうしないと表示できない。 echo \[1] echo '[2]' echo "[3]" promptからだと大丈夫、さらに1だけ表示が違う。 echo [1] echo [2] echo [3] >>412 ありがとうございます。noglob設定したら確かに直りました、 確認した所1ってfileが転がってました。 しかしよくすぐ気付くものだと感心しますな、最初の配列はきっと特別なんだろうな、 何かしでかしてんだろうなと覚書してまたわ。 そっか、そもそもglobというのが頭の中からすっぽり消えてた。 恥ずかしながら。出直してきます。 zsh-5.0.8のprintfで-フラッグが効かないんだけど、他にもなる人いる? こんな感じ。 $ builtin printf '%-20s' 'hoge' hoge $ command printf '%-20' 'hoge' hoge zsh 5.0.7 (amd64-portbld-freebsd8.4) でもおなじ >>416 あれ、おかしいな?俺は5.0.7まで正常(左詰めされる)だったんだけど…。 ちょっとrevertしてみるわ。 やっぱり5.0.7だと大丈夫っぽい。 パッケージ作成時の設定も変わってないみたいなのになんでだろう。 $ zsh --version zsh 5.0.7 (x86_64-unknown-linux-gnu) $ zsh -c 'builtin printf "%-20s" "hoge"' hoge $ zsh -c 'command printf "%-20s" "hoge"' hoge とりあえずは5.0.7で様子見することにします。 ごめん、ちゃんと読んでなかった。うちでも、5.0.7だと正常(左詰めされる)でした。 zsh 5.0.8 (amd64-portbld-freebsd8.4) だと右詰になります。 >>419 どうもです。となるとzshのバグですかね。 どなたかzsh-usersに報告されてました。 http://www.zsh.org/mla/users/2015/msg00609.html というわけで、修正が来るまで?待つことにします。 お騒がせしました。 select ループで選択候補にナンバリングされるけれども、この表示方法は変えられないのかな 桁の変わり目に表示がずれるのがどうしても気になる ファイル選択に select を使うのもあまり便利とは言えないけど… こういうときは皆どうしてるのかな teeみたいなことをやるリダイレクトで ls > /tmp/ls.txt > /dev/sdtin ってできるけど、なぜ stdout じゃなくて stdin に流すのでしょうか? なんとなく stdout に流したくなるのですが /dev/stdoutに すると端末に表示されずに、/tmp/ls.txt にもう一度書きこまれるのでは? 端末に結びつけられていれば /dev/stdin でも /dev/stderr でもいいが どうせスペシャルデバイスを使うのなら /dev/tty の方がわかりやすいかもね zsh使うくらいなら最初からbashだけ使ってた方がいい。 将来、なんかの拍子にbashの仕事が入ってくるかもしれない。 その時にbash使ってましたアピールは大きい。 zsh使ってましたとか何のアピールにもならない。 もう一度言う、たとえ趣味でもbashを使え。 >>422 うちのzsh 5.0.8ではls.txtは作られても画面には何も表示されなかったんだが、オプションか何か? firewalldの補完ファイルどっかに落ちてない? >>422 ls > /dev/stdout > /tmp/ls.txt とか ls >&1 > /tmp/ls.txt でいいんじゃないかな 初心者で申し訳ないが#や$から左のホスト名とかユーザー名、ディレクトリはどこらへんいじれば変えられる? >>435 zsh プロンプト でググればやりかたが見つかる。 .zshrc に書くらしい。 vim .zshrcすると operation not permittedって出ます .の後にスペースを入れたように見えるけど実際には.を使ってたりする じゃあ俺、mkdir .zshrc して帰るから(鬼畜) じゃ俺はそれをrm -rf . zshrcで消しとくね (( )) 内の浮動小数変数のデフォルト型をdoubleにする設定ってないですか? zsh-5.0.8 → zsh-5.1.1(zsh-5.2 も同様) と上げたら、 menu-complete → reverse-menu-complete で reverse-menu-complete が確定→補完開始するようになった。(バグ?) zsh-5.0.8 は確定せずに候補選択の逆順移動をする。 zsh-5.0.8 と同じ動きにする方法ってある? >>448 setopt FORCE_FLOAT でどうでしょう。 と思ったら浮動小数変数のデフォルト型ですか。 何もしなくても double では? 表示の有効桁数のことですか? compinit するとなるようですね。もっというと zle -C reverse-menu-complete .reverse-menu-complete _main_complete でなる。(_main_complete でなくても。) zsh-5.0.8 でも compinit すると complete-word, menu-complete とかで 新しい補完を開始してしまう。 ので、reverse-menu-complete 以外は前から問題があったのかな? zle -C 前の reverse-menu-complete や .reverse-menu-complete なら 新しい補完を開始することはない。 が、menu completion 中以外について、 当然 _main_complete は呼ばれないし、なぜか compinit なしの補完もしない。 menu completion 中しか reverse-menu-complete を使ってないので 姑息ながら、とりあえず .reverse-menu-complete で凌ぐ。 seq 1 10 | echo `grep 5` `grep 3` bashだと5が表示されるけど、zshだと完全に固まるね(^Cも^Zも受け付けない) 5.2 では % seq 1 10 | echo `grep 5` `grep 3` grep: (標準入力): 入力/出力エラーです 3<eof> ← 入力 3 となる。けど % zsh % seq 1 10 | echo `grep 5` `grep 3` でなぜか固まるね。 ↓ は期待通りかな。 % zsh -c 'seq 1 10 | echo `grep 5` `grep 3`' 5<eof> ← 入力 3<eof> ← 入力 5 3 bash とは多分仕様が違うけど、 bash は POSIX compliant なのかな? 正しく動けば zsh の方が使い易そうだけど。 hist_find_no_dupsはどういう意味なんでしょうか? これを設定していても、Ctrl-pを繰り返し押したとき同じコマンドが何回も出てきます。 Ctrl-rで検索したとき一度出たものと重複するものをスキップしてくれますよ。 そういえば.zhistoryも日本語が文字化けしてた history-all等の方で取り出すのは文字化けしないから 困った事にはならなかったが bash_historyの方は化けないから 文字化けは他でもまた偶然直面しそうだ 直し方両方分からないし なんかzshがWindowsに対応とかニュースになってるらしいけどマジ? すごいよ。WindowsでUbuntuのバイナリ互換するんだもんな zshも動くよきっと >>459 ~/.zsh_historyのエンコーディングがLatin1っぽい >>465 nkf で utf-8 に変更しても駄目だったから zshから書き出すまでの方見ないと駄目かもしれない bashのcdでディレクトリだけ補完する、の下記設定は、zshだとどう書けばよいですか? complete -d cd 下記でできましたが、自分には不要な設定もたくさんついてくるので、cdのディレクトリ補完だけ単独で設定したいです。 autoload -Uz compinit; compinit man cdとするとzshではなくbashのビルトインの方が呼ばれるんですがどうしたらいいですか man zshbuiltinはちょっとめんどい zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' これで補完のとき大文字小文字を区別しないようにしているのですが、 Macで/us<Tab>とすると/Usersが先に出てきてしまいます。 これを/usrが先に出てくるようにしたいです。つまり 入力した文字列と大文字小文字が一致した候補がある場合はそちらを先にしたいのですが どうすればいいでしょうか? zstyle ':completion:*' matcher-list '' 'm:{a-z}={A-Z}' これじゃダメなんだね? 大文字小文字無視系の設定は、しばらく使ってみないと自分の好みの動作が判らんよな 楽をしようとしてるのに、縛りを少しきつくすると勝手に確定させられて「おいっ!」みたいなことがあるし 俺は最初oh-my-zsh使ってたけど今はantigenで落ち着いたな(´・ω・`) .zshrcにfunctionを書いているのですが、readでユーザ入力を待っている時に、ctrl+c、ctrl+d、esc、どれも押しても強制終了できません。 function hoge(){ .zshrcにfunctionを書いているのですが、readでユーザ入力を待っている時に、ctrl+c、ctrl+d、esc、どれも押しても強制終了できません。 ユーザ入力ができて、入力待ち中に強制キャンセルもできるようにするにはどのようにすればよいでしょうか? function hoge(){ # 入力待ち中に強制キャンセルが何も効かない。。 printf "input: " read string } >>483 function hoge(){ trap 'return 1' SIGINT printf "input: " read string } これでどうだろう >>484 ありがとうございます。 ctrl+cのあとにエンターを押せばtrapに補足されましたが、ctrl+cだけではキャンセルされませんでした。。 バージョンはこれでした。zsh 4.3.11 (x86_64-redhat-linux-gnu) テストで、 trap "echo aaa" SIGINT としたんですが、これ、関数が終わった後も、コマンドライン上でctrl+cすると aaa aaa aaa ... とtrapが発動するようになりますね。。 とりあえず、 read -k 1 str で1文字入力にすることで、ctrl+cが入力されるとそれでキャンセルされたように見えるのでこれで代用しようかな。 >>485 見当違いなアドバイスだが、readに-tつけては >>486 なるほど。 秒数待ちをするんですね。 そのアイデアはまったく考えてませんでした。 案の一つとして検討させていただきます。ありがとうございます。 ここ最近、履歴の共有ができなくなってしまいました inc_append_history と share_history は有効にしてます 何が悪さをしてるでしょうか? zshは5.2です function定義した中身を表示する方法はありますか? aliasはwhichで内容を確認できるのですが、functionはwhichで見れず。。 何か他の方法で見れないでしょうか? read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる