zsh その7
話題か。 >>258 の件で $HISTFILE に elapsed times が残るようになったのはいいんだけど、 実行中に別 zsh 起こしてその履歴使ったり history -D したりできなくなってしまった。(当然) とりあえず放置してるけど。 これでもいいような、そうでもないような。 share_history は前のまま実行前に追加するみたい。(elapsed times が残らない。) てか share_history って imported lines と local lines 分けてるんだね。 昔は違った気がするけど。 あと import タイミングが行編集終了時。最初、終了前に履歴辿って効いてないのかと思った。 zargs -r -- $HOME/.zshfunc/*(N:t) -- autoload で.zshfunc以下に定義してある関数を全部読みこもうとしたんだけど、 関数内でこいつを呼びだすと動かなくて ttyで呼びだすと動いてるっぽい。なんでだろう? CENTOS6.3でzshを立ち上げると、/bin/lsコマンドが /bin/ls: fork failed: リソースが一時的に利用できません といって動いてくれません。bashだと大丈夫。他のコマンドだと大丈夫。zshとlsでなんかもんだいあるんでしょうか? >>309 の件、自己解決しました。 .zshrcの中に変なaliasを定義していたのが原因でした。 >>308 それ tty でも動いてないんじゃない? あと zargs の意味ない気がするけど、-r のために使っているとか? あれ、確かにttyでも動いてないっすね。なんで以前は動いたと思ったんだろう。 zargs が subshell内で eval してるっぽいから意味ないんだと思う。 -r が目的なら () { (( $# )) && autoload $@ } $HOME/.zshfunc/*(N:t) でいいんじゃないか? setopt次第で "$@" かな。 exit 1 だけどエラーメッセージ出ないからいいよね? >>314 ほんとだ、()でかこってあった… > () { (( $# )) && autoload $@ } $HOME/.zshfunc/*(N:t) forで逃げてましたが使わせていただきます。ありがとうございます。 無名関数に引数を渡せるようになっていたとは知らんかった プロンプトに$LINENOを表示させてみようと思ったら上手く行かなかった、環境変数って読めない感じ? うまくいかないのがよくわからないけど普通に1とか2が出力されたよ どっかの設定がおかしいんじゃね >>319 は $LINENO と ${LINENO} が違うものだと思ってるのかよw >>317 はそうと知らずに$LINENOの後に続けてコロンとモディファイアになる文字を書いちゃったのかもね そういう場合は>>319 がいうように${LINENO}にすれば回避できる ${LINENO} とか中途半端な書き方せずに "$LINENO" と書くのがお勧め。 いや、 PS1=$LINENO とかやっても $LINENO の値が動的に変わるわけじゃないって話だろw ごめん。一般の変数の展開と勘違いした。 マニュアル読むと LINENO はスクリプトの中で使うだけみたいだな。 プロンプトの行番号の概念がはっきりしないんだけど、これはイメージどおり? PS1="%h $" %h, %!, ! だと履歴の番号になるみたい。 >>324 まあプロンプトにLINENOがあっても?だけど普通にログインシェルでも立ち上げてからの行数でるよ cd -[TAB] で表示されるディレクトリスタックをいじることってできますか? m〜n番目のエントリを削除、とかがしたいです dirsコマンドにはそれらしい方法はなさそうでした 現在の設定のままroot権限持つことって可能ですか? $ZDOTDIRを〜〜、ではなく現在のシェルで設定した変数を保持したままで、ということです。 sudoすれば良いだろ、というのはなしでお願いします いつの間にかipの補完ができなくなった ssh hoge@XXXのXXXが数字だと補完してくれない みんなできてる? IP補完なんてできるのか て、試したらできなかったわ >>329 できてるで % ssh foo@10.5.5.<tab> 10.5.5.1 10.5.5.2 10.5.5.3 10.5.5.4 % zsh --version zsh 5.0.5 (x86_64-apple-darwin13.0.0) _ssh は zsh 付属のやつっぽい >>329 _ssh ちょっと読んでみたけど ip アドレスは、.ssh/config に書いてあるやつしか補完されないっぽいな… function print_known_hosts (){ test -f /etc/hosts && sed -e 's/#.*//' /etc/hosts test -f $HOME/.ssh/known_hosts && tr ',' ' ' <$HOME/.ssh/known_hosts | cut -d ' ' -f1 | sed -e '/^|1|/d;s/^\[\(.*\)\]:[0-9][0-9]*$/\1/' test -f ~/.host.completion && cat ~/.host.completion } _cache_hosts=($(print_known_hosts | tr '[:blank:]' "\n" | sort -u)) ってやって.ssh/known_hostsに書いてあるやつは補完できるようにしてるわ あ、上記はもちろん.ssh/known_hostsがハッシュされてると動きませんあしからず zparseoptsを使ってオプション引数だけの入った配列を得る方法ってないですかね? オプション自体を手動で取り除くしかないですか? alias -g G='| grep' alias -g H='| head' alias -g T='| tail' などのグローバルエイリアスをしてる人多いと思いますが、 特定のコマンドの後ろに付ける場合は無視するようにはできませんか? 普段lsに--group-directories-firstオプションをつけてるんですが zshのglobをこれと同じソート順にしたいです どうすればいいですかね PROMPTの%(?,,)の構文の挙動がおかしくないですか? 試しに下記のようなコマンドを入力すると逆の結果を返しており、psvar[2]を見て判断しているように思えます。 precmd(){} psvar=( '0' '1' ) PROMPT='%? %1(?,success,error) %# ' sh -c 'exit 1' : これはバグでしょうか。それとも僕が何か勘違いしているのでしょうか zsh 5.0.5 (x86_64-unknown-linux-gnu) >337 使ってる人いるんですか,global alias alias 設定した文字(列)を引数に書いた瞬間に死亡する, という挙動のリスクが大きくて, たいしたことない利便性ではリスクに見合わない印象 クッソ便利で使うのが当たり前だと思ってたけど自分だけかな? 確かに気をつかないといけないけどさ・・・ まぁだから>>337 を書いたわけですが たった6文字ぐらい手で打てよ お前今にとんでもないトラブル起きるぞ % LD_LIBRARY_PATH= だとファイルリストが補完できるかと思うんですが、同じことを % env LD_LIBRARY_PATH= でもできるようにするにはどんな設定すればいいですかね? tab以外のキーに _complete_files をバインドして補完しても complete-files: no matches found: LD_LIBRARY_PATH=* とかなってしまいます。。。 編集子について質問させてください fullpathをチルダ付きpathに変換したいのですがうまくいきません $ echo '/Users/xxx/doc/aaa.txt' | read fn; echo ${fn:s/$HOME/~/} ご教示お願い致しますm(_ _)m >>345 すんません。自己解決しました ${fn/$HOME/'~'} でした。 補完絡みで質問です。 パッケージインストール直後や、~/bin等にスクリプト入れた直後だと補完に候補が出てこない(source .zshrcすればok)。 bashだと、直ぐ補完に反映されてるので何かオプションがありそうですが教え下さい。 >>348 オプションでは無いんですかね。 都度打つのが面倒なんで、、、 皆あまり気にならない? aliasにするか、cd辺りでrehashを自動化ってことなのかな。 そんなコマンドあったのか、今までexec zshして丸ごと入れ替えてた 補完に反映なら zstyle ':completion:*' rehash 1 か zstyle ':completion:*:commands' rehash 1 に絞ってもいいかもしれんが なんでそんなにしょっちゅうrehashが必要なんだろ。 gitで管理してるディレクトリの時だけ、 プロンプトにmasterとかサブブランチの情報が欲しい ググった奴コピペしたのは管理してないところでmasterになってて邪魔だった 管理外でmasterって出るってgitの出力使ってないじゃん どこから出力得てるんだ a=(1 2); b=(3 4 5); foo $a $b みたいな感じで foo にリストを引数として渡す場合には foo はどう書けば良かろうか? あ、a や b の要素数は可変で。 a と b を繋げたリストでよければ foo の中で c=($*) すればいいっぽいけど、別々に欲しい。 あれ local c=($*) したらエラーになるのはなんでだ? >>358 自分も昔ハマったことがあるが、local では配列の宣言と同時には代入ができないみたい 359 が言うように変数名を渡す方法が最初に思い付くけどもっと良い方法があるのかな? % a=(1 2); b=(3 4 5) % foo() {local A B; A=(${(P)1}); B=(${(P)2}); echo "$1[2] -> $A[2], $2[2] -> $B[2]"} % foo a b a[2] -> 2, b[2] -> 4 なるほど、名前自体を見て処理すれば良いのか、勉強になりました。 ちなみに bash だと local で宣言と同時に代入ができるみたい。なぜだ。 { for i in {1..10..2} で1,3,5,・・・,9と { } 増分 あれ、途中で変なふうに書き込んでしまいました。すいません {1..9..2}で、1,3,5,・・というふうに増分2で展開されますが、1,2,4,8,・・・というふうに 累乗的に増えていくようなものを表す方法ってありますか? {1..9**2}みたいな感じで書けたら便利なんですが・・・さすがに無理ですか? ない。forで使うならiを指数としてループの中で計算すればいいじゃん。 やはりさすがにないですか。ありがとです いずれはインクリメントを自由に設定できるようになることを期待 zshなら・・・zshならきっと 普通のプログラミング言語でもできなくね?と思ったが リスト内包表記があるのならできるか・・・ Bashで使えてたcocot がzshにした途端使えなくなった。なぜ? bashが脆弱性で大変なことになってるけどzshは大丈夫だよね? zshは↓で固まるけど、これで攻撃できる? echo hoge >file1 >file2 >/dev/stdout 固めてどうするの? そもそも、任意のコードが実行できるなら攻撃も糞もやりたい放題じゃん zshを使ってきた君たちへ 君たちが悪いわけじゃないんだよ 君たちが覚えたzshの将来が無かっただけ 当時の社会が悪かっただけ 君たち一人ひとりが悪いわけじゃないんだよ だから自分を責めないで 社会と向き合ってください そうすればきっと気が付くはず 君たちのzshの知識が無用なのだということに 君たちの存在自体が社会の足枷だということに 数値演算用の関数として function calc() { echo $(( $* )) } というのを作って使ってるんですが、 ( ) が入れ込んでたりすると zsh: bad pattern: と出てしまいます 引数全体を""で括ればいい話なんですが、そういうことやらずに引数の文字列をそのまま関数に渡すことってできないでしょうか? >>373 ""で括らずに引数の文字列をそのまま渡すのは無理 *や()のエスケープするか、素直に$(( ))を使ったら? https://github.com/Aso23/zsh_virsh_autocompletion/blob/master/_virsh をfpathに配置して autoload -U compinit compinit ってやるとvirshコマンドで補完が効くんですが compinitをcompinit -Cにすると補完が効かなくなってしまいます どうも上記のスクリプトの記述が悪いっぽいのですが どこを直したらいいか分かる方いませんか? http://wiki.fdiary.net/zsh/?FAQ%40zsh%A5%B9%A5%EC にbindkey表記が載っていますが、Ctrl+Shift+xやAlt+Ctrl+Shift+xに割り当てたいときはどう表記すればいいのでしょうか? asciiコード表を眺めて、文字コードとして存在するのかから考えよう >>376 遅レス&横レスですけど、できました? shift って bindkey では設定できないと思ってたけど キーバインドってなかなか自由自在にできなくてもどかしいですよね 個人的には ctrl-j と enter が区別できなくて等価に LF として扱われるのが辛い あ、ctrl-j と enter の件は端末側の話ですかね、すみません ググると、端末の入力モードをrawにすればキーコードが勝手に解釈されたりせずに ダイレクトに届くっていうけど、rawなんて使ったことないけどまともに使えるのかな・・・ >>376 Ctrl+Altって^[[ではなく^[^じゃなかった? 途中で変わったのかな じゃあ xterm -xrm '*modifyOtherKeys:2' にしようか echo $(A="A" && echo $A)みたいな代入文のシンタックスシュガーって存在する? 意図がわからないけど、こういう話ではなくて? 構文糖ではないけど。 echo ${:-A} Cのカンマ演算子みたいな感じかね。 できるかどうかは知らないけれど。 後上記の人の説明の補足をするならば、 例えば以下のようにした場合、変数Bに中身が設定されていなければ中身をA echo ${B:-A} として扱うという事であって実際に変数Bが作られるわけでは無いので注意。 数字でよければ echo $((++A)) 値1を持つ変数Aが作られる。だから>>363 とかは以下のようにもできる。 repeat 10 echo $(( 1 << ++A )) と、書き終わった後に試してみたら カンマ演算子が数値なら使えるみたいなのでこんな風にも書けた。 LANG=POSIX echo -e "\0$(( A=141, $A ))" わるいわるい上記を試したら全然出来なかった。 何度かやってたら偶然できてただけだった。 LANGの設定も意味ないし。 そっかそっか以下て出来た。 echo -e "\0$(( A=101, A ))" >>358 力技ではこんなのがある。 a=(a b c) b=$(printf "%c\0" $a |sed 's#\o0$##') # なんか変数に一度いれないと無理だね。 c () { echo $1 echo $1 |tr '\0' ' ' } c $b 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' などとすると良いでしょう。 read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる