« TeraTermで「~」が出ない Main WordPress: スマホ対応とソーシ... »

xyzzy:未保存バッファに自動でファイル名を紐づけたい

xyzzyで、新規バッファにずらずらーっとテキストのメモを作って行って、いざそれを保存しようとC-x C-s (save-buffer)すると、まだ未保存のバッファの場合は「ファイル名がありません」とのエラーダイアログが表示されてしまう。

そうすると、いちいちそのダイアログを閉じてから、別でメニューの「ファイル⇒名前を付けて保存」(これはsave-buffer-dialog に対応?)を選んでファイル名を指定しないといけなくなる。そうではなくて、「ファイル名がありません」と出てもいいが、その後にすぐにこのファイル保存ダイアログへ移行して欲しい。

また、ワードだとファイルに未保存の場合に「上書き保存」を選択したとしても、すぐに「名前を付けて保存」に切り替わったダイアログが出てきて、さらに作成中文書の1行目を抜いてきてファイル名の候補としてくれる。

このワードの機能がけっこう便利なので、xyzzyのバッファのファイル保存の際にも、自動でダイアログを表示してさらに1行目をファイル名の候補にしたりできるようにしたい。(通常のテキストファイルなら1行目を抜いてくる(+ファイル名用に使用文字をクリーニング)でもよさそうだが、通常のプログラムやスクリプトファイルだと「#!/bin/sh」などの記述(シバン/シェバン)が入るので、ヘッダを解析したりしてファイル名に適当そうな情報を抜いてくる必要もありそう。)

既にこのようなことを実現している.lスクリプトも、xyzzyならありそうなのだが、探し方が悪いのか見つけられなかった。フックとかもありそうなのだが、こちらも見つからない。

で、自前で何か設定できないかと、GitHub上のxyzzyのリポジトリ検索してみると、とりあえず、buffer.lmsgdef.hに記述があるらしい。buffer.lのほうの記述だと、メッセージの終わりに「。」が付いていて、探しているダイアログとは違うので、さらにmsgdef.hの定義のEno_file_name で検索してみると、下記にたどり着いた。

fileio.ccの該当箇所を見てみると、「lisp r = run_hook_until_success (Vsave_buffer_no_filenames_hook);」との記述が!

この「save_buffer_no_filenames_hook」のフックを使えばどうにかできるのかな??

とりあえず、ファイル保存ダイアログ表示(+1行目のファイル名候補)だけでも~。

下記の形でファイル名なしの際に確認ダイアログを表示するようにはできた!

(defun save-buffer-dialog-query ()
  (interactive)
  (if (yes-or-no-p "ファイル名を付けて保存しますか?") (save-buffer-dialog)))
(add-hook '*save-buffer-no-filenames-hook* #'save-buffer-dialog-query)


これを~/.xyzzyに記述し、M-x eval-buffer または M-x eval-region して有効化した。

ファイル名の初期候補の指定はまだ。

いちいち~/.xyzzyファイルにずらずらと追記しなくてもいいように単体のライブラリファイルにしたほうがいいかもしれない。

フック記述の参考サイト:

おまけ:
buffer.l を見てたら、ファイル内容がディスク上で更新されている際に出てくる「いちいちうざい」があった。

未だに、この選択肢の意味がよく分かってないし、選択してもxyzzyの挙動が変わるような感じがしないのだが、どういう指定なんだろう??

Leave a comment

Your comment