Author Archives: AKIYAMA

2021-08-04

ivy-switch-bufferでブックマーク内のファイルをブックマーク名で検索できるようにする

Ivyでは ivy-use-virtual-bufferst にすると ivy-switch-buffer (C-x b) で(recentfや)ブックマーク内のファイルが選べるようになりますが、候補として登録されるのはあくまでファイル名(ivy-virtual-abbreviate を設定するとディレクトリパスも含めることは出来る)だけでブックマーク名は登録されません。なのでいくら分かりやすいブックマーク名を付けていても ivy-switch-buffer でそれを元にファイルを検索することは出来ません。なのでそれを出来るようにしてみました。

(require 'ivy)

(defun my-ivy-bookmark-name-filename-list ()
  "Return bookmark (name . filename) list as virtual buffer format."
  (delq nil
        (mapcar (lambda (record)
                  (when record
                    (let ((name (bookmark-name-from-full-record record))
                          (filename (bookmark-get-filename record)))
                      (when (and name filename)
                        (cons
                         (propertize
                          (format "*bookmark:%s" name)
                          'face 'ivy-virtual)
                         filename)))))
                bookmark-alist)))

(defun my-ivy-bookmark-append-advice (orig-fun)
  (let ((result-orig (funcall orig-fun))
        (my-virtual-list (my-ivy-bookmark-name-filename-list)))
    (setq ivy--virtual-buffers (append ivy--virtual-buffers my-virtual-list))
    (append result-orig (mapcar #'car my-virtual-list))))

(advice-add 'ivy--virtual-buffers :around 'my-ivy-bookmark-append-advice)
;;(advice-remove 'ivy--virtual-buffers 'my-ivy-bookmark-append-advice)

ivy-switch-buffer が扱うのはあくまでバッファ名です。現実にあるバッファの名前を選んでそこへ切り替えます。なのでrecentfやブックマークのファイル名はバッファ名ではないので「仮想バッファ」の名前として扱うことで無理矢理処理しています。仮想バッファ名リストを生成する関数が ivy--virtual-buffers です。その関数は、 ivy--virtual-buffers という変数(関数と同じ名前でややこしいですが)に仮想バッファ名とファイル名の対応表を構築した上で仮想バッファ名のリストを返します。

なので ivy--virtual-buffers 関数にadviceをかけて仮想バッファを付け足すのが上のコードです。

ivy-switch-bufferで選べる候補が気に入らないという方はこのようなやり方で候補を追加してみてはいかがでしょうか。

ちなみに、 *scratch* が無くても常に *scratch* を選べるようにするには my-ivy-bookmark-append-advice が返すリストに一つ付け加えるだけです。

(defun my-ivy-bookmark-append-advice (orig-fun)
  (let ((result-orig (funcall orig-fun))
        (my-virtual-list (my-ivy-bookmark-name-filename-list)))
    (setq ivy--virtual-buffers (append ivy--virtual-buffers my-virtual-list))
    (append result-orig (mapcar #'car my-virtual-list) '("*scratch*"))))

こうしておくと、もし知らないうちに *scratch* を閉じてしまっていても *scratch* というバッファ名を選べて新しくバッファを作成することが出来ます。

2021-08-04

WindowsでflycheckがNULというファイルを作ってしまう問題

以前flycheckを試したときにNULというファイルが出来て消すのが大変だったのでflymakeでいいやーと思ったことがあったのですが、最近また調べたところ対処法を書いているサイトを見つけました。

Emacs Flycheck

下記の記述だと、Windowsで、gcc によっては、同じディレクトリに "NUL" というファイルが生成されることがある。

:command ("gcc" "-c" "-I../../inc" "-I." "-O1" "-Wall" source "-o" null-device)

その場合、下記のように temporary-file-name を指定すると回避できる

:command ("gcc" "-c" "-I../../inc" "-I." "-O1" "-Wall" source "-o" temporary-file-name)

checker定義内の 'null-device は同名の変数null-deviceの値で置き換えられて、Windowsだと "NUL" になります。これをCygwinやMSYS2/MinGWのgccが受け取るとコンパイルが成功したときにそのままNULというファイルを出力してしまうのが原因のようです。

同じようにcheckerを再定義すれば良いのかなと思ったのですが、flycheck.elを見てみると沢山のcheckerが定義されていてその中でnull-deviceも沢山使われていました。

そもそもcheckerを再定義するのも面倒ですし、かといってnull-deviceの値を書き替えるのも(他にどこで使われているのか分からないので)怖いですし、手っ取り早くadviceでnull-deviceをtemporary-file-nameに置き換えてしまうことにしました。

;;; Windowsでnull-deviceを使わないようにする。
;; null-deviceはNULなので、CygwinやMinGWだとNULというファイルを作ってしまう。
;; flycheck-command-wrapper-function でNULを置き換えても良いのだが
;; flycheck-substitute-argument でやった方が確実だし簡単。
(when (locate-library "flycheck")
  (with-eval-after-load 'flycheck
    (defun my-flycheck-substitute-argument (old-func arg checker &optional rest)
      (when (eq arg 'null-device)
        (setq arg 'temporary-file-name))

      (apply old-func arg checker rest))
    (advice-add 'flycheck-substitute-argument :around 'my-flycheck-substitute-argument)))

最近はLSPの方でエラー箇所を検出してしまうので必要ないのかもしれませんけどまたNULファイルが出来ると面倒なので念のため。

2021-08-03

2021年夏の新番組

最近は1話が月末まで遅れることが多くなってきましたね。

初評 テレビ開始 テレビCh 作品名 ネット配信
06/29(火) 25:34 日テレ ワンダーエッグ・プライオリティ 特別編  
07/01(木) 22:00 MX ピーチボーイリバーサイド dアニメ
07/01(木) 22:30 MX SCARLET NEXUS dアニメ
07/01(木) 23:30 MX ひぐらしのなく頃に 卒  
07/02(金) 24:00 MX ヴァニタスの手記 第1クール Amazon
07/02(金) 24:30 MX 100万の命の上に俺は立っている 第2シーズン  
07/02(金) 25:05 MX ぶらどらぶ(VLADLOVE) ※ネットでは既に配信済 dアニメ
07/02(金) 25:25 TBS系 乙女ゲームの破滅フラグしかない悪役令嬢に転生してしまった…X (第2期) dアニメ
07/02(金) 25:50 TBS系 俺、つしま Youtube
× 07/02(金) 26:25 TBS カノジョも彼女 ABEMA
× 07/03(土) 22:00 MX ぼくたちのリメイク ABEMA
07/03(土) 23:30 MX 魔法科高校の優等生 dアニメ
× 07/03(土) 25:00 MX かげきしょうじょ!! dアニメ
07/03(土) 25:30 MX 現実主義勇者の王国再建記 FOD
07/03(土) 25:30 テレ朝 RE-MAIN dアニメ
07/04(日) 21:30 MX 天官賜福 -吹替版- dアニメ
07/04(日) 22:00 MX 死神坊ちゃんと黒メイド dアニメ
07/04(日) 22:30 MX アイドリッシュセブン Third BEAT! (第3期) 第1クール  
07/04(日) 23:00 MX ゲッターロボ アーク dアニメ
× 07/04(日) 24:00 MX 探偵はもう、死んでいる。 dアニメ
07/04(日) 25:00 MX 指先から本気の熱情2-恋人は消防士- dアニメ
× 07/05(月) 25:30 テレ東 うらみちお兄さん dアニメ
07/05(月) 26:00 テレ東 精霊幻想記 ABEMA
07/06(火) 23:00 MX 転生したらスライムだった件 第2期 第2部 dアニメ
07/07(水) 07:05 テレ東 KICK&SLIDE  
07/07(水) 22:00 MX チート薬師のスローライフ~異世界に作ろうドラッグストア~ dアニメ
07/07(水) 22:30 MX TSUKIPRO THE ANIMATION 2  
07/07(水) 23:00 MX 月が導く異世界道中 dアニメ
07/07(水) 24:00 MX 小林さんちのメイドラゴンS (第2期) dアニメ
07/08(木) 24:00 MX 白い砂のアクアトープ ABEMA
07/08(木) ~ Netflix BIOHAZARD(バイオハザード):Infinite Darkness Netflix
07/09(金) 22:30 MX 迷宮ブラックカンパニー dアニメ
× 07/10(土) 22:30 MX D_CIDE TRAUMEREI dアニメ
07/11(日) 19:00 Eテレ ラブライブ!スーパースター!!  
07/11(日) テレ東 闇芝居 第9期 Paravi
× 07/12(月) 24:00 MX 出会って5秒でバトル dアニメ
× 07/14(水) 25:05 MX 女神寮の寮母くん。 dアニメ
07/14(水) 24:55 フジテレ NIGHT HEAD 2041 FOD
× 07/15(木) 24:30 MX Sonny Boy -サニーボーイ- dアニメ
07/18(日) 24:30 BS日テレ 戦乙女の食卓Ⅱ YouTube
07/20(火) ~ WEB配信 アサルトリリィふるーつ  
07/22(木) 24:55 フジテレ 平穏世代の韋駄天達 Amazon
07/31(土) 24:00 MX マギアレコード 魔法少女まどか☆マギカ外伝 2nd Season  
07/31(土) 26:00 テレ朝日 ジャヒー様はくじけない! dアニメ

今期は不作……凶作ですかね?