Humanity

Edit the world by your favorite way

ハッシュ値を 比較するだけの スクリプト

curlwget はしないけど *1、単純にハッシュ値を比較するスクリプトがほしかったので書いてみた。
Windows の HashTab みたいに気軽に比較できるやつがほしかった。
ハッシュアルゴリズムは引数で与えられたやつからいい感じに検知する (長さ見てるだけ)。

$ check-hash --help
Usage:
  check-hash hash file

$ check-hash d41d8cd98f00b204e9800998ecf8427e -   # 標準入力を比較
[Success] The hashes are same (algo: MD5)

$ check-hash da39a3ee5e6b4b0d3255bfef95601890afd80709 ./file
[Error] The hashes are different! (in: DA39A3EE5E6B4B0D3255BFEF95601890AFD80709, out: C762DFC6E59A590ADA26F66CD087411C15FFA992, algo: SHA1)

MD5, SHA1, SHA224, SHA256, SHA384, SHA512 に対応してます。

github.com

*1:curlwget のラッパーコマンドにすると引数のパースがめんどい

Vim script で flatmap, fold

htsign.hateblo.jp

上記記事を見てブログに書き忘れてたことを思い出した。
以前からちょくちょく引き合いに出してたものの、Vim script での flatmap, fold 実装。
おそらく :for 使うより map() とか組み込み関数使う方が速いです。*1

gist.github.com

まぁ普通にここら辺の関数入ってほしいですね…*2

*1:次期メジャーバージョン Vim 9 だと VM が導入されるので分かりませんが

*2:似た PR はいくつかある

セッション管理プラグインを作った結果あまりうまく運用できてない

github.com

  • セッションの保存・復元 (プロジェクト等)
  • 異常終了時のセッションの復元

を目的としたセッション管理プラグインを作った。
コミットログ見れば分かるけど深夜の勢いで書いたので雑な部分もあるけど普通に使えるはず。
下の例と合わせて読み取ってもらえれば。
help 駆動で書いて妙に help は充実しているのでそちらも。

  • 現在のセッションに名前をつけて保存ができる (:ForgetMeNot save {name})
  • セッションに名前をつけたり開いた (:ForgetMeNot switch {project-name}) 後は1分ごとに自動更新される
  • 名前を付けなくても現在のセッションは instance/{pid} という名前でセッションが保存されている
    • 保存しなければ正常終了時に削除される
    • ただ Vim が落ちた場合は削除されないので :ForgetMeNot read instance/12345 すれば
  • セッション一覧は :ForgetMeNot list で見れる
    • (デフォルトで) 1分ごとに保存されるので、それより前の更新日で instance/... なセッションは異常終了したセッションとみなす (表示にも stale と付く)
  • (要追加設定) 異常終了したセッションがあれば Vim 起動時に開き直すこともできる (スワップ画面のように)

使用例

help から引用

    " Switch to a saved session (show sessions list and select one to switch)
    :ForgetMeNot switch

   " Name current session (don't forget when vim exit)
    :ForgetMeNot save my-big-project

   " Switch to the named session
    :ForgetMeNot switch my-big-project
   " Or read an instance session (e.g. stale session)
    :ForgetMeNot read instance/12345

   " List all sessions
    :ForgetMeNot list

   " Delete the session
    :ForgetMeNot delete my-big-project

セッションファイル自動更新の弊害

暫定で inputlist() 使ってる部分を popup で選ぶようにしたかったり Ex コマンドの補完も付けたいのだけど、ちょっとつまづいてしまった。
というのも、便利かと思って入れた自動更新が思いの外弊害をもたらしている。
以下 vim-jp slack でつぶやいた内容。

プロジェクトごとにセッションを保存する感じで行こうと思ったんだけど、ついプロジェクト開いてから別の操作しちゃって関係ないバッファが保存されちゃったり cwd も別のものになっちゃったりすることがあって厳しい。
プラグインに合わせるのもなんだかな…

で、皆どうしてるんだろうと気になったので質問してみたら thinca さんが唯一セッションヘビーユーザだった。
セッション (プロジェクト?) ごとに 1 Vim の運用方法らしい。

thinca:vim:  1:21 PM
セッションヘビーユーザーです。プロジェクトごとにセッション作ってます

tyru  2:04 PM
手動で作成ですか?プラグイン?

thinca:vim:  4:22 PM
@tyru 
おしょーさんの reanimate.vim 使ってます >セッション管理プラグイン

tyru  4:36 PM
@thinca プロジェクトことに手動でセッション保存する感じですかね

thinca:vim:  4:38 PM
初回作成時は手動です。2回目以降はロードしたセッションは自動で適時保存するようにしてます
4:39
1Vim1セッションで、1のVimで複数のセッションは開かない運用方法です。切り替えることはできます。

tyru  5:17 PM
なるほど。切り換えることはできますが運用が体に染み付いてないんですよね…
慣らしてった方が便利なのかなぁ
5:18
thinca さん1Vimで全部のプロジェクト開くスタイルだと思ってたけどそうじゃないんだな

thinca:vim:  5:19 PM
昔はそうだった
5:20
タブを多用しまくるので1Vim で複数プロジェクト開くのに限界が来た
5:22
一時期は起動する Vim は1つだけど作業切り替え時にセッション切り替えるようにしてて、しかしセッションの切り替えがただの Vim script のロードなわけで開いてるファイル数が多いと切り替え自体が遅いので1プロジェクトにつき tmux のセッション1つ切ってその中でそれぞれ Vim 立ち上げるスタイルになった。プロジェクト切り替える時は tmux のセッションを切り替える

便利なら運用方法を変えてもいいんだけど、それほどのメリットが (自分の直感的には) あまり見つかってないのでうーーーんという状況。
あとマルチプレクサは個人的に合わなかった (これはターミナルのタブで代用できるけど)。

他の人たちも現状復帰にたまに使うぐらいでそれ位の使い方が一番便利なのかな…という気持ちになってきた。
でも異常終了時のセッション復元できたりプロジェクトをさっと開けるのは便利だし、なによりせっかく凝った名前を付けたので便利なものにしていきたい気持ちはある。
まぁセッション管理プラグインで session ってつけると被りそうだったからなんだけど。

個人的にはできれば運用方法を変えずに導入できるプラグインがいい。
かつ自分特有の運用方法に合わせたものじゃなくすんなり導入できるといい (自分は大体プラグインを作る時そういう指針で作っている)。

あと一つ何か調整するだけで便利になりそうな気はしてる。
終了時だけ保存するようにしたらまた違うのかな?
結局忘れて関係ない状態で閉じそうだけど。
プロジェクトの状態を復元したいだけなのに終了時にプロンプトするのは流石にうっとうしいし。