つらねの日記

プログラムの進捗やゲームをプレイした感想などを書き連ねる日記。

fish shellでコマンドラインスタック

前置き

zshの便利な機能にコマンドラインスタック(buffer stack)というものがある。 入力途中のコマンドを一時的に退避出来るというものだ。 zshではAlt+qに割り当てられていて、長いシェルとか書いているときに、 ちょっと確認したいことがでてきちゃった時とかにとても重宝する。

on fish

でもfishにはないみたいだった。めっちゃ不便だ…… 積み重なるqの文字の山に我慢しきれなくなったので、作った。

gist.github.com

正確に言うと、絶対誰かやってるでしょって思ってcommandline stackとかbuffer stackで検索したけど、全然出てこなかったので、作った。

その後に、ふと以下の結果が得られたので、

% bindkey | grep q
"^V" quoted-insert
"^[\"" quote-region
"^['" quote-line
"^[q" push-line

push-lineで検索したところ、dedeibel/push-line.fish がみつかった。

fish_postexec functionを関数内で生成して終わったら消すとかいうかっこよすぎる感じだった。

試してみたら、最高という感じだったのだけれども、killingを汚す&C-wとかやっちゃうと当然そっちで上書きされちゃうっていう問題が発生した。 ので自分で作ってた部分と統合して改良した。 まあグローバル変数を汚すのもどうなのだという話はあるけれど。

複数行のコマンドをスタックしようとしたらtest -nのところで怒られたので、修正しないと駄目かも。あとすごい適当にrepaintを呼んでいるので、ちゃんと正確に理解して使いたい。

Happy Fishing!!!!

2017/09/28追記

複数行でもエラーが出ないように修正した。

余談

全く関係ないんですが、hatenaの記事を書くときにリアルタイムプレビューが出来るようになったのは割と革命的ですね。パソコンの性能か、若干動作が重くなるのは難点だけど。

You may not change the shell for 'pi'.

事件

ラズパイを買ったので色々設定していたら、突然ログインシェルを変更出来なくなった。

結論

/etc/shellsから現在のシェルを消すと何も出来なくなる

発端

最近fishがお気に入りなので、ラズパイにも入れようと思った。 ここに書いてある通りに入れてchshしてみたら、最新2.6に対してinstallされたのが、2.1だった。(chshして再ログインする前に動作させろという話もある。ついでに言うと割と時間がかかったので先にapt showで確認すれば良かった感が強い。)

しょうがないので手動で入れようという話になった。

進展

github.com 入れ方が全部README.mdに書いてあって、完全に神という感じ。 昔読まずにやっていたので、無いプログラムとか一杯あってくろうした記憶がある。 公式はちゃんと読もう。 どうせ編集とかはしないので、autoconfも入らなくなるし、Releaseの方をやれば良かった感は強い。

sudo apt-get install build-essential ncurses-dev libncurses5-dev gettext autoconf
autoreconf --no-recursive
./configure
make
sudo make install

事件

install出来たし、chshするぞと思ったが、その前に/etc/shellsを書き換えないといけないのだった。と言って/usr/bin/fish/usr/local/bin/fishに変えた。

いざ、chsh -s /usr/local/bin/fish!!!!!!!!!!

f:id:turane_gaku:20170621221532p:plain

すまない、何を言っているのかわからないのだが。

見る人が見たらわかるかもだけど、SHELLがbashなのはコピペとかするときに記法が割と違うので怒られるのが面倒なので、bash on fishしている。

解決

色々やっていたけど、何かが突然舞い降りて、/etc/shellsから/usr/bin/fishを上書きしたのがいかないんじゃないかっていう風に思って追加したら無事変えられるようになった。

vimperatorで/検索するときにエラーが出るやつ

まえおき

vimperator、firefox51?くらいからめちゃくちゃ調子が悪かった。 タブ系統が全滅している問題は解消されているっぽかったけど、/で検索するたびに、TypeError: findbar._setHighlightTimeout is not a function的なエラーが出るのがうざかった。 まあ、エラー出てるけどn押せば一応検索は出来るし、まぁいいかな感があって放置していた。 というか、/で入力しおわる度に何故かEnterキーを二回押さないといけないの不便すぎてアレ。

issue

github.com まさにこれっぽい。

-set hlsearch
+set nohls

vimperatorrcをこうしたら出なくなった。というかhlsじゃないのにハイライト表示されているので、 何のためのオプションだったんだという感じがある。

そのた

:messすると他にも色々出てたりしたので、それもちょっと直した。 StatusLineSecure, StatusLineExtended, StatusLineBrokenのハイライト三種盛りがnot foundとなっていたので、これもコメントアウトした。

vimppmが入っていないと怒られていたので手動で入れた。自動化するべきだと思う。 というか、caret-hint.jsしか入れてないし、結局使ってないので必要無いかもしれない。

fishを始めようとしたら詰った

自分用のメモ的なアレ

.config/fish/functions内のファイルが自動で読み込まれるっぽいので、 そのなかに今まで分離管理していたaliasとかoptionとかpromptとかを入れれば すっきりするなって思って、手始めに.config/fish/functions/alias.fishを作った。

そしたら無限に以下のエラーが画面を埋め尽した。

<E> fish: Could not autoload item 'alias', it is already being autoloaded. This is a circular dependency in the autoloading scripts, please remove it.

やばい。

なんか駄目っぽいので、やっぱ自動で読みこまれるわけじゃないのかと思って、 function内のファイルはそのままに、.config/fish/config.fishにaliasを書いていたら 悪化した。

やばい。

似たようなことで困っている人が全然いなかったので困った。 GitHubのissueとか見ても別にaliasが使えないとかはない。

なんとなく眺めていたら、typeとかaliasとかで調べろ的なのが書いてあって、 でもたぶんそれとは関係ないと思うけど、 function内にalias.fishを置いていることが原因なんじゃないかなって思って、 rmしたら案の定動くようになった。

こういうのって、大体とか付ければ大丈夫なんでしょって思って、 alias.fishにしたけど、_aliasという関数が定義されたことになるだけだった。 定義はされていて補完もされるけど、whichもtypeもfunctionsも何も返してはくれなかった。 別に支障はなかろうが、ちょっと気持ち悪いので、config.fishに書こうかな。

愉快な鬼ごっこの出現条件

まとめ

メインクエスト64章

なりゆき

グラブルを最近やっている。 シエテをお仲間に引き入れたくて、七星剣をちまちま強化していたのだけれど、 虚ろな魂が必要になった。

これの入手方法的なのを探すと、 霧に包まれた島、22章の愉快な鬼ごっこがいいよという記述を良くみる。 でも自分の22章を見てもそんなクエストはない。 まあとりあえず、必要分は少なかったので、他のクエストをやった。

でも流石におかしいと思って、調べてみればメインクエストが出現条件なんじゃないか みたいな分をみた。 でも、どこまで進めれば良いのかとか書いてない。

きれそう。

しょうがないので、ちょっと進めることにした。 今はメインクエスト半額だし、ちょうど良いし。 この前の半額で63章まで

と思って、64章をクリアしたらクエストが追加されました的な文章が出てきた。 みたら追加されてた。 これで虚ろな魂ゲットだぜ。

でもあと一個だけだったとかなんか悲しみの極みという感じだ…

新年とRubyとQuine

まえがき

新年あけましておめでとうございます。あまりにも寒すぎて、布団がもう一枚欲しくなる季節ですが、如何お過ごしでしょうか。

新年になるとよく交換されるものとして年賀状があります。今年はプログラマブルな年賀状のアイディアが突然舞いおりたので、いままでと趣旨を変えて、それを作って送ったのですが、よくよく考えると、これ見て喜べるのって、理解できる人だけなんじゃないかなというか、わからなかったらただの年間違ってんじゃないか?みたいなものだったので、今では反省してます。後悔はしていないので、公開もします。

年賀状

f:id:turane_gaku:20170102223357j:plain

見てわかる通りのAAである。これだけ見たら、完全に去年用の年賀状じゃんかと言われかねないが、この文字列はもちろん適当に並べているわけではなくて、ちゃんと意味のあるものなのである。

Quine

クワイン(英: Quine)は、コンピュータプログラムの一種で、自身のソースコードと完全に同じ文字列を出力するプログラムである。 クワイン (プログラミング) - Wikipedia

それをAAにしたり、色々な工夫を凝らしたりする文化がある。 以下のような本もあったりしてめっちゃ面白い。

mame.github.io

年賀状の文字列もこのQuineになっていて、実行するとその真の力を現わすようになっている。

実行結果

Before

gist.github.com

After

$ ruby nenga2016.rb
eval$s=%w(y=""<<32;c=y*2+"###(
c)"+y+"ghenar_tnxh".tr("a-z","
n-za-m")+y+"1k1".to_i(36).to_s
          +"      ##
          #"      ;o
  ="";j=-1;e="eval$s=%w("+($
  s*7);"000ov3ov3cn5cn5ijhij
  hi      jh      cz      xi
  y9      iy      lc      n5
  cn      5i      yl      iy
  lc    n5cn      5".scan(/0
  |.{3}/                  ){
  |n                      |q
  ="";0.upto(14){|i|2.times{
  q<<(n.to_i(36)[i]>0?y:e[j+
  =1                      ])
  };                      };
  o<<q.rstrip<<10};o[-7,6]="
  ).join";o<<c;puts(o)).join
  ###(c) turane_gaku 2017###

なんということでしょう。過去のものとなったは消えさり、新たにが現われました。

このを実行すると、に戻ったりはせずに、を生成する。時間は常に一方方向にしか流れないのだ。

あとがき

年賀状を印刷してから、shebangを上に書けば良かったなぁと思いました。 あと、年賀状を送った人達のなかで、Rubyを知らない人にはすまない、本当にすまない。

Quineを作るに当っては、ここがめっちゃわかりやすかった。初心者にも優しい。超絶技巧のソースコードは完全に超絶技巧すぎて辛かった。 d.hatena.ne.jp

Karabiner の windowname_only に和名を使うには

まえがき

Karabinerを愛してやまない皆さんこんにちは。便利ですよねKarabiner。 今回はKarabinerのFilter: Specify window name (window title)に平仮名や片仮名、漢字を使う方法を模索していきたいと思います。

結論

<windownamedef>
    <name>nihongo</name>
    <regex>日本語</regex>
</windownamedef>

<item>
    <windowname_only>nihongo</windowname_only>
    <autogen>
    ...
    </autogen>
</item>

文字化けで死んだ

KarabinerにはonlyというアプリIDのみならず、windowname_onlyという機能もある。 それによって、特殊な設定を施したいと思った。

しかして、そういった設定を行なうと思ったところ、windownameが日本語だった。 これ大丈夫なのかなぁと思いながらもやってみたところ、やっぱりだめだった。f:id:turane_gaku:20161225141702p:plain

そういえば、なんでこういった文字化け的なやつって、普段使わないような漢字な感じなんだろうなぁ。 別に三々手拍的に普段使うような漢字で化けても罰は当たらなわけじゃないですか?

文字コード的な話か?

無論、一番最初に疑ったのは文字コード的な話で、set fenc=utf-8を叩き直してみたり、xml宣言を<?xml version='1.0' encoding='UTF-8'?>にしてみたりした。 でもやっぱり駄目。どうしても謎の文字列によってエラーを吐いてしまう。

というかそもそも<name>で日本語を使えてる時点でその線はないんだよな。

Profilesで解決できるわけがなかった

検索技術が低いのか探せど探せど、あまりにも出てこないので、諦めてProfilesで解決することにしていた。 設定が一つだけ異なるProfileを用意することで、切り替えて使う方法である。

しかしながら、人間は面倒くさがる生き物でそれを切り替えることを忘れてしまう。 windownameが他のものになったときには、動作を逆に阻害するような設定だったので、腹立たしくなって、もういっそ無効にしてしまっていた。

サンタからの贈り物だ

ところで今日はクリスマスみたいですね。まあだからと言って何かが変わるわけではないのだけれど、(色々安くなっていたりはする)なんか良くわかんないけど、なんかこれ使うといいんじゃないかなって思って上手くいった。

ふとprivate.xml Reference Manual - Karabiner - Software for OS Xを見てみるとwindownamedefとかいう機能があるらしい。

今までは知らなくて、

You can use them without in private.xml.

な使い方しかやってなかったのだが、それをしてみたとたん、エラーもなくめっちゃ上手く動作するようになった。正規表現とか使ってないけど、regexを使っていてちょっともったいない気分である。

<windownamedef>
    <name>nihongo</name>
    <regex>日本語</regex>
</windownamedef>

<item>
    <windowname_only>nihongo</windowname_only>
    <autogen>
    ...
    </autogen>
</item>

おわりに

今回はKarabinerのwindowname_onlyを設定するときに、windownamedefを使うことで、日本語のwindownameを設定する方法も模索した。

今回の件から学ぶべきことは、ドキュメントはちゃんと読もうという話だ。 でもLanguage > Japaneseで期待させておいて、変わるのがメニューだけっていうのはあまりにも酷だと思う。