仙豆のレシピ

ちょっとしたことでも書いていく姿勢で

zshで「!」をaliasしたい2

前に同じことをしようとして書いた .zshrc を少し改良した。
senz.hatenablog.com

前のやつだと

$ history
133 v
134 v
135 v
136 v

みたいになるし「↑」キーでも当然vしか戻らないので具合が悪かった。

よって以下に変更。

function v(){
    cmd=`fc -ln 1 | grep "^v." | tail -1 | sed -e "s|~|$HOME|"`
    print -Sr $cmd # add to history
    eval $cmd
}

zshaddhistory(){
    local line=${1%%$'\n'}
    local cmd=${line%% *}

    # if $cmd==v, don't add to history
    [[ ${cmd} != v ]]
}

ざっくり説明を書くと、

v()でvが入力されたときの挙動を指定。
まず前回と同様にhistoryのうちvから始まる最新のコマンドを取得し変数$cmdに代入。
print -Sr でhistoryに追加、その後実行。
(2021.08.14 追記:`r` オプションを追加。これはエスケープを無視するオプションで、Next.js の Dynamic Routes とかで `pages/post/[pid].js` みたいなファイル名を取り扱うときなどに必要だった。)

zshaddhistory()はコマンドが実行されてからhistoryに書き込まれる前に実行され、
偽が返るとhistoryに書き込まないというものらしい。
よってコマンドがvのときは偽を返すように設定。

なんかもっとうまいことやる方法ないのだろうか

bibtexでコンパイルがうまくいかないとき(ubuntu14.04)

忘れそうだからメモ。

適当に日本語環境入れたubuntu14.04で

bibtex paper.aux

すると

ry)
I couldn't open style file jplain.bst
ry)

みたいに出たので、

d.hatena.ne.jp

を参考に、今回の環境だと以下を.bashrcに追記した。

export BSTINPUTS=$BSTINPUTS:/usr/share/texlive/texmf-dist/pbibtex/bst/

texについて何もわかってない

zshで「!」をaliasしたい

コマンドラインで作業してて、

$ vim very_very_long_name_file.py

みたいなのを何度も打つことになるとシンドイ。なので

$ !v

をよく使ってたけど、!を打つのすらめんどくさい気がしてきたのでもういっそ

$ v

だけで!vと同じ動作をしてほしくなった。

じゃあといってzshrcに以下を書いてみたところ、動かなかった。

alias v=!v

シェルのこととか何もわからないけど、見る人が見れば当たり前なんだろうと思う。

とりあえずこれを力ずくで実現するためにzshrcに以下を書いたのでメモ。

alias v='$(fc -ln 1 | grep "^v." | tail -1 | sed -e "s|~|$HOME|")'

もっとスマートな方法がある気がするので知りたい。

一度きっちり勉強しなきゃならんなぁという感じ。

簡単な解説↓

fc -ln 1 : コマンドヒストリーを表示

grep "^v." : vから始まって2文字以上のコマンド(.を入れないと二回目からvがヒットしてしまう)

tail -1 : 該当するうち一番新しいもの

sed -e "s|~|$HOME|" : ~があるとうまく動かなかったので置換。仕組みを理解していない

TensorFlowでjacobianを計算する

https://github.com/tensorflow/tensorflow/issues/675

で議論されていたけど実際の方法は載ってなかったのでメモ。
(まー見りゃわかるという話なんだろうけど初学者の自分はけっこう考えたので)

続きを読む

ubuntu上のpythonでechoの-eオプションを実行させられなかった

前のやつubuntuなマシンで動かそうと思ったら動かなくて原因探った。

前のやつというのはGUI無い環境でもターミナル内に画像を表示するよってやつで、-eオプションつけたechoをpythonから呼んでいた。

なんか画像表示されないなーと思ったら、スクリプトの最後の

    subprocess.call(code,shell=True)

の部分に問題があった。

どうやらsubprocess.call(code,shell=True)は

sh -c "code"

と同義らしく、確かにコマンドラインでsh -c "echo -e a\tb"みたいなことしてもうまくいかない。

結局ubuntuでは/bin/sh -> dash になってて、dashではechoの-eオプションが使えないのではないか、それが原因ではなかろうかと推測された。

というわけで該当部分を

    subprocess.call(code.split(' '))

に修正したら治った。

…この辺まったく知らないしなんとかしなきゃならんなあ

Ubuntu16.04で任意のキーの入れ替え

久々に実機にlinux環境用意する必要に迫られてUbuntu16.04を入れた。で、キーを入れ替えようと思ってxmodmap〜〜wとかやったけどうまくいかなくて無理やり解決したのでメモ

続きを読む

コンソールに画像を表示する

前回のエントリでの予想どおり、くそ久々の投稿になってしまった。
まあ院試あったからしょうがないね。まさか後期までもつれ込むとはね。

というわけで、家にネット回線が無くて悲しいのでオフラインで遊んでたら謎なものができたのでメモ。
コンソールに無理やり画像を表示してみた。

続きを読む