zsh その7
autoload -Uz compinit
compinit -u
をコメントアウトするとすぐ起動する.
ホームディレクトリをNFSにしてるからかなぁ? >>282
http://my.opera.com/ymirlin/blog/2011/02/01/nfs-home-zsh
mkdir /tmp/hoge
chmod 700 /tmp/hoge
ln -s /tmp/hoge/.zcompdump $HOME
autoload -Uz compinit
compinit -u
というのはどうだろう sshからログインと同時に指定したシェルスクリプトを実行したいんだが
% ssh user@example "export INC='~/setup.zsh';zsh"
接続先の~/.zshrcには$INCが定義されてるならsource $INCするように書いてる
もっとシンプルに
% ssh user@example "~/setup.zsh"
setup.zsh実行後にzshを終了せず対話型になるみたいなことって出来ませんかね? >>285
setup.zshの最後にexec zshして、
ssh -t user@example setup.zshしたら? >>286
まあssh -tしわすれたときのために
[[ -t 0 ]] && exec zsh かな? 素早い返信ありがとうございます
exec zshだとsetup.zshで定義されるシェル変数や関数などが維持できないようです。。。
.zshrcに依存することにはなるが、.zshrcから適当なフラグを立てたうえでsource $INCすることでできました
% ssh user@example 'cat setup.zsh .zshrc'
#setup.zsh
if [ -z $FLAG ] ;then
export INC=setup.zsh
exec zsh
else
(省略)
fi
#.zshrc
if [ -n $INC ];then
export FLAG=true
source $INC
fi
% ssh -t user@example setup.zsh >>288
ああ、シェル変数やらはそうだろうね。
だったらexpect使ったら?
#!/usr/bin/expect
spawn "zsh"
expect "%"{ send "source hoge.zsh\n" }
interact
でやりたいことはできそうだけど >>289
おおおこれは便利だ
こっちでやってみます >>284
ありがとうございます!
やってみたら,なぜかマシンによってセキュリティチェックがあるのとないのがありますね. >>291
もしかしたら/tmpが0777のマシンと1777のマシンじゃないか? なんとなく言ってみるけどselinuxが悪さしてることってない? そういやmacはデフォルトのログインシェルがzshなんだっけ 10.2 まで tcsh
10.3 からいまのところ bash
zsh は5.0.2が入ってるけど、デフォルトログインシェルにはなってない。 あ、そうなんだスマソ
デフォルトでインストールされてるってだけか なんかCentOS4.5のzsh-4.2.0が.zshenvを読んでないっぽいんだけどなんで?
まあ管理権限ないから$HOMEにzsh-5.0.5入れたけど…… てか4.5とか古いなw
そっちに原因があったりして 研究室の鯖なかなか更新してくれないんだよね。
CentOS固有の問題なのかな? zsh-4.2.0なんて何年前だろ
とりあえず新しいのを自分でビルドしてユーザ領域に置いてみたら? 話題か。
>>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' にしようか