tDiary-mode for xyzzy

Copyright (C) 2002,2003 Junichiro Kita
xyzzy porting : ハハハハ

NetInstaller用packages.l

フレーム版

はじめに

これは、きたさんが公開されている、Emacsen 上でただただしさん作の日記システム「tDiary」の日記編集を支援するモードを、私、ハハハハxyzzy用に移植したものです。

この tdiary-mode では、

  • xyzzy から直接 tDiary の日記を更新できます。
  • 既に記入済みの日記も HTTP で取得し、修正・更新できます。
  • Plugin タグの補完ができます。
  • 簡易的な HTML タグ編集機能を装備しています。

尚、移植に際してはなるべくオリジナルの動作を踏襲するようにしましたが、一部動作 OS の違い・作者の力不足などにより実現されていない機能もあります。ご容赦を…。

Information

tDiary-mode for xyzzy のサポートはこちらで行っています。

2005/07/23 に修正しました。1.15.10 です。

  • NetInstaller を用いてインストールしてください。
  • 1.15.07から、HTTPアクセス時のバッファ切り替えが発生しなくなっています。通信終了の確認にはステータスバーの表示を利用してください。

1.14.05 以前よりバージョンアップする方は注意事項がありますので履歴を参照してください。

使う前に

必要なもの

オリジナルには各種ライブラリが必要でしたが、tDiary-mode for xyzzy ではパッケージ化によりそれらのほとんどが名前空間の問題で移植困難となってしまいました(この辺りが力不足ってヤツです…)なのでパッケージ単体で動くようにしてあるため、特に他のライブラリは必要ありません。

環境としては当然のことながら xyzzy が必要ですので各自インストールしてください。また、実際の日記への追加・更新を行う場合はネットワークへ接続できる環境にあることが条件です。

NetInstallerがインストールに必要ですので事前に導入しておいてください。このツールを使用すると、tdiary-modeだけでなく、多くのライブラリを半自動的にインストール・アップデートすることができます。

インストール

NetInstallerにてインストールしてください(この際、byte-compileまで行われます)。サイトの登録はpackages.lで行います。

手動でのインストールも出来ます。このパッケージをディレクトリ付きで、XYZZYHOME(si:system-root)直下で解凍してください。

byte-compile したい場合は、tdiary/makefile.l をM-x load-libraryしてからM-x tdiary-makeを実行してください。

バージョンアップ

NetInstallerにてバージョンアップしてください。この際、byte-compileまで行われます。また、バージョンアップ内容によっては .xyzzy の記述に変更がある場合があります。

手動でバージョンアップをする際には、解凍したパッケージを既にインストールしてあるものに上書きするだけでOKです(バージョンによっては .xyzzy の記述に変更がある場合があります)

ただし、byte-compile を行っている場合には再コンパイルが必要です。tdiary/makefile.l をM-x load-libraryしたあと、M-x tdiary-make-cleanしてからM-x tdiary-makeを実行してください。

アンインストール

NetInstallerにてインストールした場合は必ずNetInstallerでアンインストールしてください。この際、byte-compileされたファイルも削除されます。

手動でアンインストールする場合は、site-lisp ディレクトリ下にある tdiary ディレクトリをディレクトリごと削除してください。

どちらも場合でも、.xyzzy に書かれている tdiary-mode 関連の設定までは自動で削除されませんので、各自手動で削除してください(削除しないと次回 xyzzy 起動時にエラーになります)

設定

tdiary-mode に関する最低限必要な設定は次の3行です。これを .xyzzy へ、必ずNetInstallerの設定の後に書いてください。

(in-package "tdiary")
(setf *tdiary-diary-list* '(("1stDiary" "http://www.example.com/tdiary/")))
(in-package "editor")

かっこ内は左から、「あなたの日記の識別子」「あなたの日記のURL」です。なお、識別子は今後あなたの日記を指定する時に入力を促されたり、ディレクトリ名になったりします。

設定の際には*tdiary-diary-list*のかっこの数に注意しましょう。

今後、tdiary-mode の設定を .xyzzy に記述する場合は必ず上記の in-package で囲んだ間に記述するようにしてください。

使い方

日記の追加

その日の日記を初めて書く場合や、既に記入済みの日記に追加する場合はM-x tdiary-newを使います。するとミニバッファに

Date: 20021206-!-  ←今日の日付

と表示されます(-!- はカーソルの位置を表します)必要なら日付を修正し、リターンキーを押してください。入力された日付と同じ名前のバッファが作成され、自動的に tdiary-mode になります。

日記の修正

既に更新済み(更新の手段は Web経由でも tdiary-mode 経由でもメール経由でも何でも構いません)の日記を編集して、内容の追加/修正を行う場合はM-x tdiary-replaceを使います。するとミニバッファに

Date: 20021206-!-

と表示されます。個々で入力した日付の日記をこれから修正することになります。tdiary-mode の場合と同様、必要なら日付を変更してリターンキーを押してください。すると今度は

User Name for 'あなたの日記の識別子': -!- 

と聞いてきます。Web から日記を更新する際に入力しているユーザ名を入力してリターンキーを押すと、さらに

Password Name for 'あなたの日記の識別子': -!- 

と聞いてきます。同様にパスワードを入力しましょう。パスワードは入力を隠すために '*' に置換されて表示されるので、後ろから誰かが覗き見していても大丈夫です。

数秒待つと、入力した日付のバッファが作成され日記の内容がバッファに展開されます。今度も自動的に tdiary-mode になります。

日記の更新 C-c C-c

日記を書き終わったらC-c C-cと入力しましょう。次の順に質問されるので、必要なら適宜修正しリターンを押して下さい。

  1. 編集モードを確認します。M-x tdiary-newした場合は 'append'、M-x tdiary-replaceした場合は 'replace' になっていると思います。適切なモードになっていることを確認してください。
  2. 更新対象の日付を確認してください。M-x tdiary-newもしくはM-x tdiary-replaceした際に入力した日付が表示されます。別の日の日記を更新したい場合は修正しましょう。
  3. その日のタイトルを入力します。タイトルを付けたくない場合は何も入力する必要ありません。またM-x tdiary-replaceした場合、すでにつけられていたタイトルが表示されているはずです。タイトルを変更する必要がなければリターンを押して下さい。
  4. M-x tdiary-newからの最初の更新の時には、ここで日記を更新するためのユーザ名とパスワード、そして protection key を入力してください(protection key は tDiaryの該当機能を使用していない、そもそもそれって何?という方は空で構いません)なお、入力したパスワード、 protection key は '*' に置き換えてミニバッファに表示されます。

あとはしばらく待つだけです。ミニバッファに 'SUCCESS' と表示されれば更新成功です。

なんらかの原因で更新に失敗した場合、ミニバッファに

tDiary POST: 403 - Forbidden

のようにエラーの原因が表示されます。

tdiary-mode の機能

tdiary-mode では次の機能が利用できます。括弧内はデフォルトのキーバインドです。尚、オリジナルと微妙に違っていますので気をつけてください。

尚、tdiary-mode での日記の書き方に関する仕様は tDiary の記述仕様に準じます。

html タグの補完 TAB

tdiary-mode では html タグの補完が出来ます。例えば

<te-!-

とだけ入力して TAB キーを押すと、

<textarea-!-

と補完されます。補完候補のタグが複数ある場合は候補バッファが開きます。このバッファはタグが完全に補完された直後にもう一度 TAB を押すか、'>'を入力してタグを閉じることによって自動的に閉まります。尚、補完は属性に対しても有効です。また、

<pre>ほげほげ<-!-

ここで '/' を入力した時に対応する開きタグがあると、

<pre>ほげほげ</pre>-!-

このように自動的に閉じタグが補完されます。補完対象となるタグは HTML のバージョンによって異なりますが、これは *tdiary-keyword-doctype* で指定します(後述)

Plugin タグの補完 C-RET

tdiary-mode では Plugin タグの補完ができます。Plugin のタグは

 <%=my '20021201#c01', 'そのツッコミ' %>

のような形を取ります。例としてこれを入力したいとします。まず、

こないだは my-!-

と入力してC-RETを押してみましょう。バッファには

昨日の <%=my ' %>

と入力され、ミニバッファには

a: -!-

というプロンプトが表示されたはずです。

そこで今度は 'my' の最初の引数 '20021201#c03' と入力しリターンキーを押しましょう。すると、バッファには

昨日の<%=my '20021201#c03', ' %>

と表示され、ミニバッファには

  str: -!-

と表示されます。 'my' の2番目の引数 'そのツッコミ' と入力してリターンキーを押します。これで 'my' Plugin の入力は完了です。

最終的にはバッファには

<%=my '20021201#c01', 'そのツッコミ' %>-!-

と入力されていると思います。

また、様々な状態からの Plugin の補完も可能です。

m-!-
<%=m-!-
<%=   m-!-   %>

これらの状態でC-RETを押してみましょう。バッファには

<%=my ' %>

と入力され、ミニバッファには

a: -!-

というプロンプトが表示されます。あとは上の例と同様です。


この Plugin 補完は、C-RETを押した時にカーソル直前の一語を評価します。ただし、Plugin タグ内でC-RETを押した時は、その直前の一語が Plugin タグ内の最初の一語である場合のみ評価されます。

評価の結果、該当する Plugin がない場合は、

<%=-!- %>

のように plugin タグのみが挿入されます。

C-RETを押した時に Plugin 名の候補が複数あれば、ミニバッファのプロンプトは表示せずバッファで Plugin タグの挿入と Plugin 名の補完が行われます。

補完実行時、Plugin 開始タグより前にある連続した半角空白及びタブは削除されます。また、Plugin タグ内での補完が実行された場合は、それ以前にPlugin タグ内に入力されていた文字列を全て削除しますのでご注意ください。

ユーザ設定の詳細はPlugin のユーザ設定を参照してください。

abbrev 風補完 M-RET

tdiary-mode では abbrev 風の補完(abbrev に Plugin タグ補完機能の一部を足したもの)を行うことが出来ます。例えば、

Yahoo はa-!-

と入力してM-RETを押してみましょう。バッファには

Yahooは<a href="

と入力され、ミニバッファには

URL: -!-

というプロンプトが表示されたはずです。

そこで 'http://www.yahoo.co.jp' と入力してリターンキーを押します。するとバッファには

Yahooは<a href="http://www.yahoo.co.jp/">-!-

と表示されます。これで補完は完了です。

尚、この機能は Plugin タグ補完と比べて以下の点が異なります。

  • カーソル直前の文字列を評価しますが、補完対象文字列と完全一致でなければなりません。
  • 評価の結果補完が行われない場合は、なにも挿入しません。
  • 補完は "" で囲まれた中だろうがタグ内だろうが構わず行われますので注意してください。
  • ユーザ設定を行う変数は Plugin タグ補完のそれとは異なっています。

ユーザ設定の詳細はabbrev 風補完のユーザ設定を参照してください。

タグ単位の削除 M-BS(M-C-h)

tdiary-mode では、タグ単位で文字を削除することが出来ます。

</p><pre>-!-

この時M-BSを押すと、

</p>-!-

カーソル直前のタグ1つを削除します。タグには Plugin タグも含みます。

尚、カーソル直前がタグではない場合は BS キーを押した時の動作と同様です。

複数行の結合・分割 C-c C-j

tdiary-mode では、複数行を一行に結合することが出来ます。

複数行のテキストの結合したい先頭の箇所でS-SPCを押してマークをセットします。そして終端にカーソルを移動し、

バナナ
りんご
みかん-!-

ここでC-c C-jとすると、

バナナ\nりんご\nみかん-!-

マーク位置からカーソル位置までの行が '\n' で結合され、1行にまとめられます。また、現在の状態のようにマーク位置とカーソル位置が同一行にある時にC-c C-jとすると、今度は逆に文字列が '\n' で分割されて複数の行に展開されます。

ol Plugin などのヒアドキュメントを使うような Plugin で使用するとよいでしょう。

キーワードの一括リンク置換 C-c C-p

tdiary-mode では、*tdiary-replink-file*にキーワードファイルが設定されていると、バッファ内のキーワードを一括して置換することが出来ます。主にリンクの置換に用いることになります

キーワードファイルには以下のようなデータが書き込まれているとします。

Yahoo          http://www.yahoo.co.jp/
google         http://www.google.co.jp/

1行の書式は以下の通りです。

キーワード文字列       URL

そして、バッファに以下のように入力します。

登録型は Yahoo 、ロボット型は google です。

ここで、C-c C-pとすると、

登録は<a href="http://www.yahoo.co.jp/">Yahoo</a>、ロボット型は<a href="htto://www.google.co.jp/">google</a>です。

と置換され、ミニバッファに

Use this replacement? (y or n) -!-

と表示されます。この置換結果を採用する時は 'y' を入力してください。 'n' を入力すると置換前に戻ります。

尚、バッファに入力する置換したいキーワードは必ず前後を半角空白で区切るようにしてください。その空白も含め、置換されます。ただし、"" や '' で囲まれた文字列内やタグ内の文字列は置換対象外です。

また、tdiary-mode 中にキーワードファイルを書き換えた場合はそれを反映させるためにM-x tdiary-rebuild-replace-linkを実行してください。キーワードファイルを開くのにはM-x tdiary-edit-replink-fileも利用出来ます。

リンクの表示 C-c C-l

tdiary-mode では、*tdiary-browser-function*が設定されていると、カーソル位置のリンクをブラウザで開くことが出来ます。

ただし、リンクと認識するのは "" で囲まれた文字列のみで、文字列先頭が 'http' 'https' 'ftp' の場合のみです。

日記の表示 C-c C-r

tdiary-mode では、*tdiary-browser-function*が設定されていると、日記の最新ページをブラウザで開くことが出来ます。

ただし、現在アクティブなバッファのサイトが確定している場合に限ります。

日付指定の日記表示 C-c C-d

tdiary-mode では、*tdiary-browser-function*が設定されていると、現在アクティブなバッファの日付のページをブラウザで開くことが出来ます。

ただし、そのバッファの日付が設定されている場合に限ります。

tdiary-mode の終了

tdiary-mode では、M-x tdiary-mode-quitで tdiary-mode 関連のバッファ全てを一括して閉じて終了することが出来ます。

その際、tdiary-mode のバッファで更新されたものがあると閉じる前にミニバッファに

This buffer is modified. Update? (y or n) -!-

と表示されます。 'y' を入力するとそのバッファをM-x tdiary-updateで更新しバッファを閉じます。

'n' を入力した場合、さらにミニバッファに

Delete this buffer? (y or n) -!-

と表示されます。バッファをそのまま破棄してもよい場合は 'y' を入力すればバッファを閉じます。'n' が入力された場合はバッファは閉じられず残ります。

カスタマイズ

ブラウザ機能を使いたいときにはどう設定すればいいの?

色々な設定方法がありますが、とりあえず2つ紹介します。

通常のウィンドウでブラウザを起動する場合:

(setf *tdiary-browser-function*
      (function (lambda (x)
                        (shell-execute x t))))

OHKUBO Hiroshi さん作のbrowserexなどのブラウザ機能を提供するパッケージを組み込んで xyzzy のバッファ内で起動する場合:

(setf *tdiary-browser-function*
      (when (find-package "browserex")
            (or (find-symbol "navigate" "browserex")
                (find-symbol "navigate" "user"))))

パスワードを覚えてほしい

*tdiary-passwd-file*にパスワードを保存するためのファイルを指定してM-x tdiary-passwd-file-saveしましょう。

例:

(setf *tdiary-passwd-file* "~/.tdiary-password")

パスワードファイルに保存されるパスワードは Base64 エンコードされているため、ぱっと見ではわからないようになっていますが、その気になれば何の苦労もなくデコード出来てしまいます。注意してください。

この機能は危険性を十分理解した上でご利用ください。

ついでに protection key も覚えてほしい

protection key は、tDiary2.0.2/2.1.2で追加された、CSRFというセキュリティホールへの対策の一環として導入された機能です(詳細はこちら

protection key はパスワードの一種であり、保存してもM-x tdiary-newでの動作にしか影響しないので通常はパスワードファイルには保存しません。ですがどうしても保存したい、ということであれば*tdiary-protection-key-save-p*に t を設定しましょう。パスワードファイルに Base64 エンコードされた状態で保存されます。

繰り返しますが、protection key はパスワードの一種なので、この機能の危険性を十分理解した上でご利用ください。

日記を更新したら自動的にブラウザで表示して欲しい

C-c C-c(M-x tdiary-update)は、日記の更新に成功すると*tdiary-browser-function*を呼び出しますので、*tdiary-browser-function* を設定するだけで表示することができます。

複数の日記を切り替えたい

*tdiary-diary-list*には複数の日記を登録することができます。

(setf *tdiary-diary-list* '(("日記1" "日記1のURL" nil)
                            ("日記2" "日記2のURL" nil)))

;;; proxy を使用したアクセスが必要な場合は最後の 'nil' を 't' にすること

M-x tdiary-newM-x tdiary-replaceを実行すると、*tdiary-diary-list*の最初の日記が選択されます。

編集する日記を選択するにはC-u M-x tdiary-newのように prefix argument 'C-u' を付けましょう。ミニバッファに

Select SITE: 日記1

と表示されていると思います。ここで編集したい日記の識別子を入力しましょう。日記の識別子は 'TAB' や 'SPACE' で補完できます。

あとは通常通り日記を書いてC-c C-c(M-x tdiary-update)しましょう。

ネットワークへ接続した途端固まって動かなくなってしまう

HTTP のアクセスにプロクシを使用しなければならない環境ではないでしょうか?その場合はプロクシ設定を行う必要があります。

(setf *http-proxy-server* "proxy.example.com") ←プロクシサーバアドレス
(setf *http-proxy-port*   "10080") ←プロクシポート番号

これで全ての日記へのアクセスがプロクシ経由となります。

プロクシを経由しないアクセスが必要な日記がある場合、*tdiry-diary-list*への登録時に

(setf *tdiary-diary-list* '(("日記の識別子" "日記のURL" nil)))

としてください。 nil は「プロクシを経由しない」 t は「プロクシを経由する」です。

index.rb とか update.rb の名前が違うんですけど…

プロバイダによっては CGI の拡張子が '.cgi' に決め打ちだったりします。そういう場合、

(setf *tdiary-diary-list*
      '(("日記の識別子" "日記のURL" t "index.cgi" "update.cgi")))

としてみましょう。

他のキーバインドにしたいんだけど

tdiary-mode に入ると*tdiary-mode-hook*というフックが呼び出されます。キーバインドの変更はこのフックに登録するのがよいでしょう。

設定例:

(add-hook '*tdiary-mode-hook*
          '(lambda ()
               (local-set-key #\C-TAB 'tdiary-plugin-completion)))

このように設定すると、C-TABで Plugin の補完が行えるようになります。

午前3時までの書き込みは前の日にしたいなあ

M-x tdiary-newM-x tdiary-replaceの時、日付の入力をしますが、デフォルトでは午前0時を基準とした現在の日付が表示されます。これをずらすには、

(setf *tdiary-hour-offset* -3)

などとします。単位は1時間です。

ここで設定した値分、tdiary-mode 内の時間が進みます。この例では-3時間進む、つまり3時間遅れるため、午前0時から午前3時までは前の日という事になります。

編集した日記をローカルに保存したい

*tdiary-text-save-p*を t にすると、C-c C-c(M-x tdiary-update)時に

*tdiary-text-directory*/日記の識別子/日付*tdiary-text-suffix*

というファイルに日記の内容が保存されます。

C-c C-c(M-x tdiary-update)時のモードが 'append' ならファイルに追加、'replace' ならファイルに上書きします。

*tdiary-text-directory*が nil の場合、ホームディレクトリを指定したことになります。*tdiary-text-suffix*はデフォルトでは ".td" です。

保存したファイルを開く時、自動的に tdiary-mode になってほしい

次のように設定します。

(pushnew '((concat *tdiary-text-suffix "$") . td:tdiary-mode)
           *auto-mode-alist* :test 'equal)

tdiary-mode で認識する HTML タグを別のバージョンにしたい

tdiary-mode では、HTML タグを 'HTML4.01 Transitional' の仕様に従って認識しています。

これを変更したい場合は、

(setf *tdiary-keyword-doctype* "HTML4.01 Strict")

のようにしてください。

指定出来る文字列は、*Scratch* バッファにて以下の式を評価する(最後の ')' の直後にカーソルを置いてC-j)と表示されます。

(mapcar #'car ed::*html-doctypes*)

※関係ないものも一部表示されます。

一括置換を a ではなく別のものにしたい

tDiary でのリンクは HTML の a タグを使う方法の他に、Plugin を使う方法もあるでしょう。

例えば tlink Plugin での置換を行いたい場合には、

(setf *tdiary-replink-format* "<%=tlink '~A' '~A' %>")

のようにしてください。

文字列は format 関数のフォーマット文字列を設定してください。最初の '~A' には URL が、2番目の '~A' にはキーワード文字列が代入されます。

日記の更新時にtDiaryの更新通知プラグインを使いたい

更新通知プラグインなど、tDiaryの編集ページでチェックボックスやリストボックスなどの設定が必要な機能では、tdiary-modeでの更新時にプラグイン固有のオプション送信が必要になります。

更新通知プラグインを利用して更新情報を送信したい場合は、

(setf *tdiary-option-values* '(("plugin_ping_send" . "true")))

としてください。

Plugin のユーザ設定

tdiary-mode の Plugin タグ補完機能は、ユーザが任意に拡張することが出来ます。

ユーザ設定の Plugin タグは、*tdiary-plugin-definition*にリストにして登録します。

設定例:

(setf *tdiary-plugin-definition* '(
      ("my" ("my '" (:p "a: ") "', '" (:p "str: ") "'"))
      ("fn" ("fn '" (:p "footnote: ") "'"))))

Plugin タグ設定の1つの要素は以下の書式を取ります。

( "補完対象文字列" ( <式> <式> ... ))

C-RETを入力すると、カーソル位置の直前の単語を補完対象文字列で補完し、マッチしたものがあれば式を先頭から順番に評価します。

式が文字列の場合、そのままバッファに入力します。

式がリストの場合はそのまま評価し、結果が文字列である場合はその文字列をバッファに入力します。

ただし、リストが以下の形式である場合には以下のような評価となります。

(:p)

ミニバッファにプロンプト 'Input: ' を表示し入力を促します。入力された文字列はそのままバッファに入力されます。

(:p "プロンプト文字列")

ミニバッファにプロンプト 'プロンプト文字列' を表示し入力を促します。入力された文字列はそのままバッファに入力されます。

もし、プロンプト文字列が文字列でなかったり nil であった場合には、'Input :' がプロンプト文字列として使用されます。

(:p "プロンプト文字列" 文字列リスト)

ミニバッファにプロンプト 'プロンプト文字列' を表示し入力を促します。入力された文字列はバッファに入力されますが、入力できる文字列は、文字列リストに存在するものに制限されます。

(:p "プロンプト文字列" "正規表現文字列")

ミニバッファにプロンプト 'プロンプト文字列' を表示し入力を促します。入力された文字列はバッファに入力されますが、入力できる文字列は正規表現文字列にマッチするものに制限されます。

例えば、 'my' Plugin の 'a: ' プロンプトでの入力を制限するには以下のように書くことが出来るでしょう。

("my" ("my '"
       (:p "a: " "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\\(#[c|p][0-9][0-9]\\)?")
       "', '"
       (:p "str: ")
       "'"))

abbrev 風補完のユーザ設定

tdiary-mode の abbrev 風補完機能は、ユーザが任意に設定することが出来ます。

ユーザ設定の補完リストは、*tdiary-abbrev-comp-definition*に登録します。

設定例:

(defvar *tdiary-abbrev-comp-definition* '(
    ("a" ("<a href=\"" (:p "URL: ") "\">"))
    ))

設定の1つの要素は以下の書式を取ります。

( "補完対象文字列" ( <式> <式> ... ))

M-RETを入力すると、カーソル位置の直前の文字列を評価し、補完対象文字列と完全一致でマッチしたものがあれば式を先頭から順番に評価します。

式の評価方法はPlugin のユーザ設定に記述されているものと等価です。

登録する際の注意点としては、

  • Plugin 補完機能のように、直前の文字列が補完文字列で補完されることはありません。
  • Plugin 補完機能のように、内部で自動的に挿入される文字列(Plugin タグ)はありませんので、補完したい文字列全てを設定に含めるようにしてください。

変数/関数一覧

全ての変数・関数はパッケージtdiary(td)に属しています。

変数

*tdiary-mode-hook* [nil]

tdiary-mode に入った際に実行されるフック。

*tdiary-diary-list* [nil]

日記の設定を行うための変数。設定はリストで行います。

リストの1要素は以下の3つの形式を取ります。

( "日記の識別子" "日記のURL" )
( "日記の識別子" "日記のURL" proxy を使うか?[t|nil] )
( "日記の識別子" "日記のURL" proxy を使うか?[t|nil]
  "index.rb の名称" "update.rb の名称" )

*tdiary-passwd-file* [nil]

パスワードを保存するファイル名。フルパスで指定します( '~' も使えます)

*tdiary-hour-offset* [0]

tdiary-mode が計算する現在日付を調整するためのオフセットを指定します。

*tdiary-option-values* [nil]

日記の更新時に、送信データへオプション及び値を追加します。設定はリスト及びconsで行います。

(("オプション名1" . "値1") ("オプション名2" . "値2"))

*tdiary-text-suffix* [".td"]

tdiary-mode のバッファの内容をテキストとしてファイルに保存する際の suffix。

*tdiary-text-directory* [nil]

テキストを保存するディレクトリ名。

*tdiary-text-save-p* [nil]

tdiary-mode のバッファの内容をテキストとしてファイルに保存するかどうかのフラグ。

*tdiary-text-save-p**tdiary-text-directory*が non-nil の場合、M-x tdiary-newは作成するバッファを

日付 + *tdiary-text-suffix*

というファイル名に関連づけます。

*tdiary-protection-key-save-p* [nil]

M-x tdiary-passwd-file-saveでパスワード等を保存する時、一緒に protection key も保存するかどうかのフラグ。

nilの場合は保存しませんが、M-x tdiary-replaceの時には本文を取得する際に一緒にキャッシュしますので問題はありません。M-x tdiary-newでtdiary-modeに突入した時には、最初のM-x tdiary-updateの時だけ入力を促されます。

*tdiary-browser-function* [nil]

「ブラウザで開く」機能を使用時及び日記更新後に呼び出される関数。関数は URL 1つを引数として取る。

*tdiary-keyword-doctype* ["HTML4.01 Transitional"]

tdiary-mode でタグの色づけをする際、基準となる HTML 仕様を指示するための変数。

ここで指定する仕様は HTML タグの補完にも影響します。

*tdiary-comp-highlight-attribute* ['(:bold t :forward 3)]

tdiary-mode で HTML の閉じタグを補完した際に、開始タグと閉じタグに色付け等を行う際に参照される設定です。

*tdiary-open-diary-when-load-file-p* [t]

tdiary-mode 突入時にバッファがファイルに visit していた時、そのファイルが tdiary-mode で保存したものであれば日記の設定をディレクトリに合わせて読み込むかどうかを指定するフラグです。

具体的には、バッファがテキストに保存される時のファイル名は

*tdiary-text-directory* /ユーザ名/日記の識別子/日付 + *tdiary-text-suffix*

となりますが、このファイルを開いた際に自動的に tdiary-mode になる設定を行っていると、ファイルを開いた時にそのディレクトリ名に合わせて日記の識別子から設定を読み込むことが出来ます。これを行うかどうかを指定します。

この値が non-nil の時、この動作が有効になります。

*tdiary-plugin-definition* [nil]

Plugin タグ補完機能のユーザ設定を登録する変数。

*tdiary-abbrev-comp-definition* [nil]

abbrev 風補完機能のユーザ設定を登録する変数。

*tdiary-replink-file* [nil]

キーワードの一括リンク置換機能で使うキーワードファイル名を設定する変数。

*tdiary-replink-format* ["<a href=\"~A\">~A</a>"]

キーワードの一括リンク置換機能で置換時に使われるフォーマット文字列を設定する変数。

*tdiary-replink-highlight-attribute* ['(:bold t :forward 3)]

キーワードの一括リンク置換機能で置換された文字列に色づけを行う際に参照される設定です。

*http-proxy-server* [nil]

日記へのアクセスに proxy を必要とする場合、この変数に proxy サーバ名を設定します。

*http-proxy-port* [nil]

日記へのアクセスに proxy を必要とする場合、この変数に proxy ポート番号を数値で設定します。

*http-response-timeout* [60]

HTTPアクセス時の応答タイムアウト時間を秒単位で指定します。

*http-wait-ack-time-interval* [.05]

HTTPアクセス時の通信状態監視間隔を秒単位で指定します。

関数

tdiary-update C-c C-c

日記を更新します。

tdiary-newC-c t n

新しい日記を書くためのバッファを開き、tdiary-mode にします。

tdiary-replaceC-c t r

日記を更新するためのバッファを開き、tdiary-mode にします。

tdiary-passwd-file-save

tdiary-mode 中に入力されたユーザ名、パスワード及び protection key を保存します。

保存はテキストファイルに行われます。

パスワードは Base64 エンコードして格納されますが、これは秘匿性を保証するものではありません。この機能はその危険性を十分理解上でご利用ください。

tdiary-mode

対象バッファを tdiary-mode にします。

tdiary-html-completion TAB

カーソル直前の不完全なタグを補完します。

tdiary-html-slash /

直前の閉じられていないタグを閉じるためのタグを挿入します

tdiary-backspace-tag M-C-h(M-BS)

カーソル直前にタグがあった場合、タグ全体を削除します。タグがない場合は一文字削除します。

tdiary-toggle-newline-and-n C-c C-j

S-SPCで設定したマークと現在のカーソル位置の間に改行が含まれている時、これを '\n' に置換して1行に結合します。含まれていない時は '\n' を改行に置換して複数行に展開します。

tdiary-plugin-completion C-RET

Plugin タグの補完を実行します。

tdiary-abbrev-completion M-RET

abbrev 風補完を実行します。

tdiary-replace-link C-c C-p

キーワードの一括リンク置換を実行します。

tdiary-rebuild-replace-link

一括リンク置換用のキーワードファイルを再読込します。*tdiary-replink-file*に存在するファイルを指定している時のみ有効です。

tdiary-mode 実行中にキーワードファイルを更新しそれを反映させたい場合に使用してください。

tdiary-edit-replink-file

一括リンク置換用のキーワードファイルを開きます。*tdiary-replink-file*に存在するファイルを指定している時のみ有効です。

tdiary-link-browse C-c C-l

カーソル位置が文字列であり、その文字列が URL だった時にその URL をブラウザで開きます。

この機能は*tdiary-browser-function*が設定されていないと機能しません。

tdiary-recent-browse C-c C-r

日記の最新ページをブラウザで開きます。

この機能は*tdiary-browser-function*が設定されていないと機能しません。

tdiary-diary-browse C-c C-d

バッファに設定されている日付の日記ページをブラウザで開きます。

この機能は*tdiary-browser-function*が設定されていないと機能しません。

tdiary-mode-quit

tdiary-mode に関連する全てのバッファを削除します。更新チェックがあります。

ライセンスなど

オリジナルの tdiary-mode は GPL のもとに配布されています。よって tdiary-mode for xyzzy も GPL とします。

tdiary-mode for xyzzy に関するお問い合わせはハハハハまでお願いします。

尚、tdiary-mode for xyzzy はオリジナルと機能こそ同じですが、コードは半分以上別物です。よって tdiary-mode for xyzzy に関する問い合わせは一切 Kitaj さんには送らないでください。信用問題に関わりますので宜しくお願いします。

謝辞など

まずは、tDiary の作者ただただしさんと、tdiary-mode の作者きたさんに感謝します。

丁度日記システムを探していた時に出会ったのが tDiary でした。それまでは TDS を使っていて機能的には問題なかったんですが、コードの "perl のオブジェクト指向型記述" というものが生理的に受け付けなくて…他を探していた時に、Ruby で書かれていてコードが見やすい tDiary と、この tdiary-mode を見つけました。特に、独自記述のファイルをアップしたり、 Web のフォームへ記入することによる更新に不満を感じていたので、「読み込み・修正・更新までを全てエディタで行える」tdiary-mode はまさに理想に適うものでした。

ただ、自分の環境が Windows メインで、Mule for Win や Meadow、Cygwin の emacs などは使ったことがあれどあまり Windows と親和性がいいとは言い難く、常用することはありませんでしたし、自分好みにカスタマイズすることもありませんでした。xyzzy は非常に Windows と相性のいい Emacs ライクなエディタですが(ただし現在常用はしていない)、マクロの記述言語は Emacs Lisp ではなく Common Lisp なので、tdiary-mode をそのままでは動かすことは出来ません。

だけど、使いたい、使ってみたい…なので、今回の移植に踏み切りました。

ただ、Emacs は大学時代の初期に使いましましたが、管理業務などを行う関係で vi を使うことが多く、ほとんど触らない状態になってしまいそのまま。 Common Lisp はおろか Emacs Lisp もやったことない、全然知らない…。ええ、覚えました。1週間で。死ぬかと思った…仕事もしてる身なので…。

なので、tdiary-mode への感謝は Lisp 修得のきっかけを作ってくれたことも含めて、になります。ありがたく使わせて頂きます。

そして、xyzzy の作者亀井哲弥さん。移植を通して xyzzy と付き合ってきましたが、知れば知るほどそのポテンシャルに驚くばかりでした。特にプロセス関係の機能が豊富で、Windows API も Lisp から利用可能になってて「なんでもできそう」な感じはちょっと他のエディタでは感じられません。おそらくこの tdiary-mode のような機能は他のエディタではほぼムリなんじゃないかと…Wz が出来そうだけどあれはスクリプトがほとんど C で簡単にテスト出来ないし、商用だし…。しかし、もう少し早く出会えていればなぁ…なんだかコミュニティーが冷えているような気がする…。

当然 Common Lisp を修得するきっかけにもなりました。ありがとうございました。

また、xyzzy の Common Lisp への移植を実行するためには当然 Lisp を覚えなければなりませんが、忙しい身のため「修得出来る」という確証がないとなかなか始められないものです。そういう意味で確証を与えてくれた、M.Hiroiさんとページのコンテンツに感謝します。Common Lisp をわかりやすく、個人的に大好きな数学的パズルを随所に織り込んだ講座は非常に興味を持って読み進めることが出来ました。書かれていることを xyzzy ですぐ試してみることができるのを活かして、講座内の全てのコードを打ち込んだりして…やっぱ動かすのが一番早く覚えますね。

最後に、その他の xyzzy のスクリプト作者の皆さんに感謝します。講座を終えたあとは移植に手を付けながら他のスクリプトを読んで、色々な作法的なことを学ばせてもらいました。パッケージ化はその最たるものです(そのせいでいらぬ苦労をした気もしますが…)。

それから、1つお詫びを…オリジナルでは HTML 関連の機能を他のメジャーモードに依存…というか、derived.el を用いて tdiary-mode を html-mode から継承させることで HTML 関係の機能を他のスクリプトに任せることが出来ましたが、今回パッケージ化を行った関係で derived.el のような機能を実現するのが困難になりました(もしかしたら可能なのかもしれないけど、今の私の技量では…)。なので HTML 関連の機能が貧弱になっています。申し訳ありません。オリジナルと同様な実装を実現してくださる方がいらっしゃいましたら、よろしくお願いします。私も今後頑張ってみますが…。

履歴

Ver.1.15.11(2005/07/24)
パスワードとprotection keyに空文字を入力した後の動作がおかしくなるバグを修正。
Ver.1.15.10(2005/07/23)
tDiaryのCSRF対策に正式対応。
Ver.1.15.09(2005/07/21)
tDiaryの脆弱性に関する報告(2005-07-20)tDiary 2.0.2/2.1.2リリースでのCSRF対策を受け、暫定的に対応(csrf_protection_method=1 のみ)
Ver.1.15.08(2004/12/27)
*tdiary-update-values* を追加。更新時にユーザ定義のオプション値を送信できるようになります。
Ver.1.15.07(2004/02/02)
HTTPアクセス時の挙動を変更。今までは表示バッファ切り替え処理が見えていましたが、これを見えないようにしています。通信終了の確認はステータスバーの表示で確認してください。
*http-response-timeout* と *http-wait-ack-time-interval* を追加・公開。
*tdiary-proxy-server*、*tdiary-proxy-port* をそれぞれ *http-proxy-server*、*http-proxy-port* へ。これはドキュメントの修正のみです。
Ver.1.15.06(2004/01/14)
*tdiary-plugin-definition* と *tdiary-abbrev-comp-definition* で、tdiary-mode が標準で持っている補完文字列と同一の名前の補完設定を行うと、標準のもので上書きされてしまっていたのを修正
Ver.1.15.05(2003/12/02)
*tdiary-text-save-p* が nil の状態でmulti-modeをtdiary-modeに対して設定し、コマンドからtdiary-modeに入ると、multi-modeのリージョンから抜ける時にいちいち日付を聞かれてウザかったので修正
Ver.1.15.04(2003/08/07)
実態参照文字列の処理不具合を再度修正、というか確認ミス…。
Ver.1.15.03(2003/08/06)
実態参照文字列の処理不具合を修正
Ver.1.15.02(2003/05/26)
tdiary-make-clean/tdiary-uninstall に site-lisp/ 直下の Lisp ファイルを削除してしまうバグがあったので、関数ごと削除しました。それに伴い、アンインストールの項を修正しました。
Ver.1.15.01(2003/05/25)
オリジナルの1.15に追従。
NetInstaller対応。今後のサポートはNetInstallerでインストールした場合を前提にします。
NetInstaller対応に伴い、autoload対応となりました。
tdiary-new/tdiary-replaceにグローバルショットカットキーを割り当てるようにしました(それぞれC-c t n/C-c t r
Ver.1.14.14(2003/04/15)
POSTする文字列をurl-encodeする時、事前にEUCに変換するように変更。今まではSJISでした。
url-encodeとの合わせ技で文字化けが発生することがありましたが、これで解消されると思います。
Ver.1.14.13(2003/02/11)
Ver.1.14.12 の修正にマズい部分があったので修正。
Ver.1.14.12(2003/01/03)
*tdiary-browser-function* の設定にクロージャを許していなかったのを修正。合わせてカスタマイズの項も追加しました。
Ver.1.14.11(2002/12/25)
キーワードを一括してリンク置換する機能で、置換前に戻した時に置換前の更新状態に戻すのを忘れていたため修正。
Ver.1.14.10(2002/12/23)
(新機能をいくつか追加したのでバージョン番号飛ばしました)
HTML タグ補完で属性名が補完出来なかったのを修正。
ただし DTD には従っていないのでタグごとに許容する属性名のチェックは全くしてません。
abbrev 風補完機能を追加。
キーワードを一括してリンク置換する機能を追加。
tdiary-mode を終了する機能(tdiary-mode-quit)を追加。
Ver.1.14.06(2002/12/20)
form の URLエンコード時に '+' をエスケープ対象から外していたのを修正
某匿名掲示板のシャイな方からの指摘によりパッケージ構成を変更。全て tdiary に収まるようにした。
http と expansion は削除されているので注意してください。
Ver.1.14.05(2002/12/16)
1.14.04 の修正がもう少し確実になるように修正。同症状になるレアケース発見のため。
Ver.1.14.04(2002/12/16)
'>' 入力時に「カレントウィンドウは削除できません」と出て以後 '>' が入力出来なくなるバグを修正…したつもりです。
Ver.1.14.03(2002/12/13)
*html-doctyps* が未定義になるバグを修正。
"html-kwd.l" って標準で require されると思ってたよ…。
Ver.1.14.02(2002/12/12)
パッケージング間違えてた…(死)
修正しました、ごめんなさい~!
Ver.1.14.01(2002/12/10)
なんとか初公開