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)
みたいに出たので、
を参考に、今回の環境だと以下を.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(' '))
に修正したら治った。
…この辺まったく知らないしなんとかしなきゃならんなあ
コンソールに画像を表示する
前回のエントリでの予想どおり、くそ久々の投稿になってしまった。
まあ院試あったからしょうがないね。まさか後期までもつれ込むとはね。
というわけで、家にネット回線が無くて悲しいのでオフラインで遊んでたら謎なものができたのでメモ。
コンソールに無理やり画像を表示してみた。