zsh その7
# プロンプト後に好きな色指定 PS1='$ %F{green}' # エンター押したら実行前に色をリセット preexec() { print -nP '%f' } あたりでどうだろう。 >>10 おーーいいかんじです。ありがとうございました。 PROMPTを途中で改行してる場合で、改行する前の行にRPROMPTを表示させる方法ってありますか? 例えば。 RPROMPT="%{$(echotc UP 1)%}right prompt text%{$(echotc DO 1)%}" きっと問題がある。 >>12 zle_highlight=(default:fg=green) 使ったことないんであんましらんけど。 echo 1*0 てやったら 10 100 110 120 130 140 150 て出るんですが、普通にそのまま出力させるにはどうすればよかですか? なにをいってるのかと思った。 echo '1*0' うちのzshじゃそのまま出る $ echo 1*0 1*0 何のオプションが効いてるんだろ >>17 setopt noglob かな。なんでそんなもん set してんのかしらんけど。 >>19 それだとワイルドカード自体効かなくなるから、 setopt nonomatch かと。 >>14 ありがとうございます。 いままでのRPROMPTをそのままつっこんでも今のところ特に問題なく動きました。 いろいろ確認してみましたが問題なさげです。 >>20 効かないからそのまま出るんだろって思ったけど、「なんで〜」に対する答か。 確かに noglob より nonomatch を設定していると考える方が自然だ。 >>21 よく考えたら PROMPT に含める方が一般的だったかも。 >>14 の方が簡単な気はするけど。 たびたびすいません。Emacs+multi-termだと崩れてました。 普段のkonsoleなら問題なかったのですが。 それは multi-term の問題では。 どう崩れるのかしらんけど。 bindkey で Ctrl+@ や Ctrl+- を設定したいんですが、 どうやればいいんでしょうか? "^@" や "^-" では駄目でした。 ^@ は普通それでいい。できないなら端末の問題かな。^- というコードはない。 xxd があればその入力にそれぞれ打ち込んでみるといい。 何か分かるかもしれない。 >>27 端末の問題ですか・・・puttyごった煮版ですがこれが悪いのかな。 @単発なら \@ でできたのですが、 ^\@ はやはり駄目でした。 \@ って bindkey \@ foo ってこと? @ なら bindkey @ foo でいいけど。 xxd がなければ ESC-x describe-key-briefly ^@ ってやれば一応入力キーは判るよ。 あと Ctrl-- も端末で適当なコードが入るようにすれば、それに bindkey して使えるよ。 putty でどうやるのかしらんけど。 そういえば今は setopt prompt_sp なんてあるんだな。今っつーか結構前からか。 unsetopt prompt_cr PROMPT_EOL_MARK='%B%S%#%s%b' PROMPT_EOL_MARK_LENGTH=1 PROMPT=$'%{$PROMPT_EOL_MARK\e[$[COLUMNS-PROMPT_EOL_MARK_LENGTH-2]C \r%}'$PROMPT とかいう設定はとっくに不要になってんだよなあ。 文字入力の補完はできますか? emacsのようにどこかに補完リストを作っておいて、 たとえば、 ssh lo[補完キー]と入力すると、 ssh longname.com と変換されるようにしたいのですが。 sshならデフォルトで~/.ssh/configをもとに補完してくれるはずだけどな できました。 すみません。なぜか出来ないと思い込んでいました。 使い始めたばかりの初心者なのだけれども、alias -g L='| $PAGER ' でヒストリに L のまま残るのが嫌。 ヒストリには | less と展開して残すか、Lに続けてtabを押したら | less と展開するようにはできないだろうか。 ls とか less hogehoge をヒストリに残さないようにするためにはどうしたらいいんだろ。 setopt hist_ignore_space alias ls=' ls' 使うヒトは当たり前のように開発版の4.3使っていて、 5は4.3のバージョンだけ付け替えたようなものだから 目立った変化がない。 まさか正式リリースで5.0になるとは…4.4だと思ってたのに まあ、linuxのカーネルが3.0になったからってなんてことはなかったのと一緒か。 4.3 って開発版だったっけ?そうだった気もするな >>46 少なくとも4系は4.xのxが偶数がリリース版だった、はず 5のリリースメールから引用 > Version 5.0.0 of zsh is the new stable release. There are many changes > since the last stable release series, 4.2, イカリャク Debianでは4.3系を長らく使ってるから開発版って認識は薄かったなぁ (zsh-betaってのもあるのにzshの方が4.3.10) macportsも、よくわかってないヒトがメンテしてるのかな。 zsh @4.2.7 (shells) zsh-devel @5.0.0 (shells) パッケージのdevelとかbetaってのはソフトウェア自体の安定版/開発版だのとはまた別の基準でつけられるものでしょ 安定性重視のシステムで安定パッケージと認められるためにはそれなりのテストや議論を経てこれなら大丈夫って認められる必要があるんじゃね、しらんけど hoge-develって、実行時には必要ないincludeファイルとかだけをまとめたパッケージだろ。 本体パッケージとバージョンは同じじゃないといけない、しらんけど 5が出る直前は zsh @4.2.7 (shells) zsh-devel @4.3.17 (shellls) だったね。 >>52 devel=正式以外含めた最新版だと思ってる人が多いとけど実際はその認識でも間違いはない感じ 名前通り開発する人が必要なものが追加されてる版、なのでバージョンも含めていろいろ試せるように最新なのが普通 商業用だったりディストリ毎のルールとかもあるから一概にはいえないけど zshって、コマンド内にコメント含められないの?bashだとできるのに。 ls -al#a みたいな。 setopt interactive_comments 対話環境(スクリプトではない、プロンプトが出る環境)でコメントを機能させる 非インタラクティブシェルとして起動するとき、aliasなどの設定ファイルを 読み込ませたいのですが、どうすればいいでしょうか? $HISTFILEを手動で編集した後 fc -Rしても変更が反映されない(削除した行がbck-i-searchに候補として出てくる)んだけど どうして? .zsh_history に日本語含んだコマンドは正常に保存されないの? そういうコマンドも履歴検索したいんだが. >>71 うそ,まじで.自分の手元では Windows7 64bit, zsh 4.3.12 (i686-pc-cygwin) Ubuntu12.04, zsh 4.3.17 (i686-pc-linux-gnu) のどちらでも無理だ. echo ほげ が echo ほぃ? みたいに .zsh_history に保存される.マルチバイトを考慮してない感じがする. >>72 MacOSX 10.7.5 zsh 5.0.0 (MacPortsからのインストール) lessやtailでみると echo ほぃ? になってるけど historyで確認すると echo ほげ となっているので, C-rではちゃんと下になるな >>72 Arch Linux (uname -r は 3.6.6-1-ARCH) zsh 5.0.0-3だけど, >>73 と同じく,lessでみるとecho ほぃ<B2>ぃ<A7>ってなってるけど, historyやC-p, M-pではちゃんと echo ほげぇ ってなってるよ. >>73 zsh 4.3 でも history コマンドなら日本語表示できるわ. zsh のバージョンを zsh-5.0.0 を試してみたら 73 と同じように C-r で日本語でも大丈夫だった. 理想的には .zsh_history 自体にきちんと保存して欲しいけど. おー、文字によって化けたり化けなかったりするんだねー。 まあ内部形式なのかもしれないし、これで正しいのかも。少し無理があるか。 .zsh_history は、0x80-0x9f の符号が現れると 0x83 をメタキャラクタとしてくっつける。 作者はこれを仕様と言ってるんで、ヒストリファイル を使う場合は手動で除去するしかないね。。。 (またはソースコードでこの部分をコメントアウトして コンパイルするか…) >>77 内部で設定されているエンコードかと思って 変換できないか確認してダメだったけど そういうことだったのね あーそうなんだ。 .zsh_history は 0x80-0x9f の符号を何として扱ってるんだろうね。 算術演算をする (( )) ですが、中でプロセス置換 `` や $() を使うと挙動に違いが出ます。 $ cat hoge 0]1 $ (( i = `cat hoge | cut -d] -f2` )) zsh: command not found: i $ (( i = $(cat hoge | cut -d] -f2) )) $ echo $i 1 zshでは``と$()は同一なものではないのですか?bashだと両者は同じになるのようですが。 >>80 知らんかったけど、backquoteじゃなくて、$() 使った方がいいよ、って言うてはるね backquoteはネストできん。などなど… ttp://zsh.sourceforge.net/Guide/zshguide05.html#l117 $() 使った方がいいと思うけど、それは別として↓の結果を見ると bash は ((...)) をとにかく arithmetic evaluation として解釈して、 zsh は arithmetic evaluation として解釈できるときだけしてるように見えるね。 % bash -c '(( echo [ ))' bash: ((: echo [ : syntax error: invalid arithmetic operator (error token is "[ ") % zsh -c '(( echo [ ))' [ `...` の中にあるんだから解釈できるとは思うけど置換前に判別してるのかね。 man には More precisely, `((...))' is equivalent to `let "..."'. ってあるしバグなんじゃない? >>80 ,81 ありがとうございます。 不思議なのが、[ と ] 以外の記号だと大丈夫なんですよね。 これはバグと思ったほうがいいかもですね。 % zsh -c '(( `echo "["|echo 1` ))' zsh:1: command not found: 1 % zsh -c '(( `echo "[]"|echo 1` ))' % zsh -c '(( `echo "("|echo 1` ))' zsh:1: command not found: 1 % zsh -c '(( `echo "()"|echo 1` ))' って感じで ( でも出るよ。 括弧の対応がとれてないとなるのかもね。多分それだけじゃないけど。 バグなら法則性を求めてもあんまりしかたない気はするけど。 /etc/z*を読み込まないようにする設定ってユーザ権限の範囲でできない? >>85 ~/.zshenv の中で setopt NO_GLOBAL_RCS すれば一番最初に読まれる zshenv 以外はスルーされるんじゃね zsh-5.0.0(4.3系でも一緒でした)で補完候補に日本語ファイルがある場合、 文字化けするんじゃなくて$'\202'$'\240'.txt の様に文字コードで表示されて しまうのですが、原因に心当たりがある方いらっしゃいましたらご教示下さい。 configureで--enable-multibyteされなかったとか? レスありがとうございます、環境をもうちょっと詳しく書きますね。 Androidでmultibyte-enableなzshを動かすべく、arm-linux上でstaticに ビルドし、正常動作するバイナリを作成しました。これをAndroidに持って 来ると一見普通に動いている様なんですが、補完候補の日本語がコード 表示されてしまうんです。原因何だと思いますか? 標準エラー出力のみをパイプに出力するには $ command 2>&1 >/dev/null | command2 とすればいいようですが、これの仕組みが分かりません。 なんで 2>&1 としてるのに標準エラー出力は/dev/nullに行かないのですか? >>93 何回目のFAQだよw 2>&1を実行している時点で標準出力(パイプ)が標準エラー出力にコピーされる。 (以後、2はパイプを指す) 次に、>/dev/null で標準出力が/dev/nullに変更されるが、 これはすでに2にコピー済みの標準エラー出力には関係ない。 >>93 zshのバグです。でも便利なのでずっと直されてません。 x="a b c"; for i in $x; do echo $i; done ってやると、ash/bash だと、 a b c って出ますが、zsh だと、 a b c となってしまいます。 ash/bashと同じ動きをさせるにはどうすればいいでしょうか? >>98 >>99 以外だと${=x} を使ってもおk >>94 それだと標準エラー出力も/dev/nullに流れてしまうことになり、 説明になってません。 >>95 なるほど、バグだったのですか。 こういうバグは直せないですよね。直すと既存のスクリプトが動かなくなりますし。 記憶が朧げだが、昔シェルスクリプト入門を謳ってネットで配布されていたテキストでも 同じ間違いをやらかしてなかったか おお、いつのまにか zsh 5.0.2 が。 数値記法の 1_000 ってそういえば ruby にそんなんあったな。すっかり忘れてたけど。 setopt 的でもあるのか。 >>94 もしかして >/dev/null よりも | が先に解釈されるんですか? というか一般的に、リダイレクトよりもパイプの解釈が優先されるのがシェルの仕様? >>107 リダイレクトは左から順に処理されるだけ. 普通のコマンドは 1 => /dev/stdout 2 => /dev/stderr だが,2>&1 は「2の出力先を1と同じにする」から 1 => /dev/stdout 2 => /dev/stdout (= 1) になって,>/dev/null は「1の出力先を /dev/null」にするから 1 => /dev/null 2 => /dev/stdout になる. >/dev/null で 1 と 2 が同時に /dev/null となることはない. パイプは /dev/stdout の出力が次のコマンドの /dev/stdin になるので, この場合は標準エラー出力だけパイプされる. ちなみに &> /dev/null とすると「1と2の出力先を(同時に) /dev/null にする」 ことができる.man bash で RIDIRECTION のところ読め. 書いてて思ったんだけど, command1 2>&1 >/dev/null | command2 じゃなくて command 2>/dev/stdout >/dev/null | command2 って書いても同じ意味だよね? 後者で書いたほうが わかりやすいと思うんだけど,環境によっては動かなかったり するのかな? read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる