3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Qmemo

Last updated at Posted at 2022-06-03

qmemo

Emacs で作業中ちょっとしたメモをとりたいとき、サっと出してパっと書いてスっとしまえる、 そんな操作感を目指したメモです。

bs-show や which-key のように現在のウィンドウ構成を残したまま最下段に割り込むように開くので、 Mew を開いたまま書きたいとき等、他のウィンドウを参照しながら書きたいときに適しています。

基本的に remember の雰囲気をベースにしています。

インストール

ココから落として load-path を通してあるディレクトリに置き init.el の中で require します。
必要に応じて保存ファイル名やバインドの設定をします1

以下は参考です2

init.el
(require 'qmemo)
(global-set-key "\M-sm" 'qmemo) 
(global-set-key "\M-sp" 'qpick) 
(global-set-key "\M-sh" 'qhead) 

使い方

できるだけ開いているウィンドウを残したまま一番下に少しだけ開きます。
そこに何か書いたら C-c C-c すると保存され再び引っ込みます。

メモは変数 qmemo-file-name に指定されたファイルにプリペンドされていきます。
デフォルトは "~/.emacs.d/qmemo/2022-05" のような形式の年月名のファイル名になります。

キャンセルは C-c C-k または C-c C-q です。
後者はメモバッファを残したままウィンドウのみ閉じるので、次に開くと書いたものが残っています。

カスタマイズ

qmemo-window-height: ウィンドウの行数

デフォルト は 8 です。
mode line とミニバッファを合わせた数になるので、実際のメモウィンドウはここで設定した値 - 2 になります。

qmemo-file-name: 記録ファイル名

ここで設定したファイルにメモがプリペンドされていきます。
無ければ新規に作成されます。

デフォルトではファイルが大きくなりすぎるのを避けるため、 月イチで新しくするよう Emacs 起動時の日付を見て "西暦-月" という名前になるよう設定されています。
2022年5月なら "~/.emacs.d/qmemo/2022-05" となります。
サブディレクトリ qmemo は無ければ作られます。

qmemo-templete-format: メモのフォーマット

各メモはセーブ時に qmemo-templete-format で指定した書式でフォーマットされます。
デフォルト は "%l%d\n%p%b\n" とほぼ等価のリスト(後述)で以下のような体裁になります。
Android Orgzly と連携して使っているので、それに準じたフォーマットになっています。

qmemo-templete-format
* メモ body
:PROPERTIES:
:CREATED: [2022-01-09 Sun 13:46:15 +0900]
:BUFFER/FILE: [[c:/ ... /qmemo.org]]
:PERSON: fubuki@win11
:END:
メモ body

ヘッドライン行はメモ本体から1行目を切り出したもの、 続けて :PROPERTIES: から :END: の行までがプロパティ枠で日付と時間、 メモを開くときに居たバッファ・ファイル名(ファイルの紐付けがなければバッファ名)とユーザ@マシン名 がプロパティ形式で入り、メモ本体となります。

但し C-u C-c C-c と prefix 付でフィニッシュしたときは、ヘッドラインの次の行に SCHEDULED: <日付>\n が挿入されます。
これは Orgzly の予定案件である印をつけるためのものです。

calendar から qmemo を開くと prefix なしでポイントしている日付になります。

qmemo-templete-format で使える特別なキャラクタ

%s  変数 qmemo-system-name の値
%h  変数 qmemo-host-name の値
%u  変数 qmemo-user-name の値
%n  変数 qmemo-user-full-name の値
%l  変数 qmemo-leader の値
%d  メモの1行目(%bの1行目)の先頭32文字
%b  メモ本体
%m  変数 qmemo-user-mail-address の値
%U  qmemo-user-name@qmemo-system-name
%f  メモを起動したときのバッファ名か在ればそのファイル名
%p  プロパティ・ドロワ・テキスト (変数 `qmemo-properties-string-alist` を元に生成)
%D  現在の日時
%%  % そのもの
  • %D の日付の書式は qmemo-time-format で変更できます。関数 format-time-string の形式で指定します。
  • %d の長さは変数 qmemo-description-length で調整できます。
  • 文字列なので \n は改行コードとなります。
source.el
(setq qmemo-time-format "%F"
      qmemo-templete-format "%D %n <%m>\n\n%b\n")

等とすれば ChangeLog のような体裁になるといった具合です。

qmemo-templete-format でリストを使う

qmemo-templete-formatmode-line-format を簡易に模した作りにしてあるので、("" foo bar) などの 変数や文字列を列挙したリストでも指定でき、この要素が再帰的に評価され最終的にひとつの文字列として連結されます。
デフォルトでは Prefix を有効にするためこの書式で記述されています。
mode-line-format 同様変数の中では %LETTER は効力を失ないます。

リストのとき CAR がシンボル :eval なら CDR を評価しその他のシンボルの場合、評価して NON-NIL なら nth 1 を、 NIL なら nth 2 を評価します。 (COND THEN ELSE).
ELSE は省略できます。

このコンディション変数に利用できる qmemo-pre-prefixqmemo-post-prefix があります。
前者は qmemo 起動時の prefix で、後者はフィニッシュ時、つまり C-c C-c するときの prefix の値が入ります。

シンボルは CAR 以外の位置ならシンボルとして評価されますが tnil は無視されます。

検索

M-x qpick 等と起動してミニバッファにワードを入力する。

入力した正規表現に一致したメモ・ブロック3をメモ・ファイルから抽出し、クリエイトの新しい順でバッファに出力します。

対象のメモ・ファイルは qmemo-file-name のディクトリ部分を見て、その中のメモファイルすべてです。
但し qp-ignored-extensions に列挙された拡張子は対象外となります。

この動作を抑止したい場合変数 qmemo-dirnil にセットするとそのときの qmemo-file-name そのものからだけサーチします。

ベースのメジャーモードを軽い outline-mode にしてありますが、 変数 qp-base-modeorg-mode にするとプロパティ部分も折り畳みされます。
変更したい場合カスタマイズから変更するか qmemo を require するより前に記述するかして再起動してください。

参照

M-x qhead でカレントのメモ・ファイルの先頭ブロックの参照ができます。
プレフィクスでブロック数を指定します。
指定しない場合は最新 3 ブロックで、 0 を指定すると全ブロックになります。

無指定時のデフォルトは qhead-default で変更できます。

Orgzly との連携時の注意点

最初にメモを作ってから Orgzly でインポートすればいいだけですが、 ファイルを Dropbox に置いた場合注意が必要で 、 更新や同期のタイミングによっては整合性が崩れてエラーで Orgzly で読めなくなってしまいます4
そうならないようにするポイントとしては

  • Orgzly を自動同期にしない
  • Dropbox 自身が同期するタイムラグもあるので
    Windows なら C-c C-c 後 、タスクバーの Dropbox アイコンが同期中に青くなるので
    それが収まった(青が消えた)のを確認してから Orgzly で同期実行する
  • Orgzly から更新する場合も然りなので、一呼吸置いてから同期実行する
  • qmemo から更新して Orgzly で同期実行する前に Orgzly から追記しない
  • その逆の Orgzly で追記して同期実行する前に qmemo から追記しない

等です。
もしエラーが出るようになったら Orgzly から qmemo ファイルを「削除」(リモートは残す選択)してから「同期」を実行すると治るようです。
最後の更新は失なわれますが、 再度インポートしないでも自動的に現れます。

また Orgzly と連携する場合は、 必ずインポートしないといけないため、 qmemo-file-name は固定値にしたほうがいいかもしれません。

参考
(setq qmemo-file-name "~/../Dropbox/orgzly/qmemo.org")

テスト動作環境

  • GNU Emacs 29.0.50 (build 1, x86_64-w64-mingw32) of 2022-04-03
  • GNU Emacs 28.1 (build 1, x86_64-pc-cygwin, X toolkit, cairo version 1.17.4, Xaw3d scroll bars) of 2022-04-06

関連リンク

Changes

Revision: 1.29

  • fix: mapconcat のセパレータ引数を追加(省略可能なのは Emacs29 からだった).
  • add: 変数 `qmemo-create-lockfiles'. ファイルロック機能をディゼルブ.
  • change: write-region, write-file を file への結びつけを鑑みて配置調整.
  1. Tools menu にはデフォルトでバインドします(シンプルカルクの下)。

  2. ユーザ用に予約されていないバインドなので、これで慣れると将来困る可能性があります。

  3. メモ・ファイルの中の qmemo-leader で開始され、次の qmemo-leader 直前かファイル終端までの領域です。

  4. ファイルをローカルに置いてリモートにコピーする Dropbox の仕様のため

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?