ラベル elisp の投稿を表示しています。 すべての投稿を表示
ラベル elisp の投稿を表示しています。 すべての投稿を表示

2017年1月12日木曜日

MobileOrg で Agenda ファイルを org-directry 以外の場所に置くと何が起こるか?   gblog

1.1 はじめに

何やらMobileOrgの同期がうまくいかないなぁ,と思ったときについカッとなってコードを読んだ時の簡単なメモです.

※以下,本文中では,Emacs のシンボル(関数や変数)は(シンボル)で書いてます


1.2 何が起きる?

  • (org-mobile-push) はうまくいく (Emacs –> MobileOrg アプリ)

    • (org-agenda-file) でファイルのフルパスを指定していれば.

  • (org-mobile-pull) はうまくいなかい (MobileOrg アプリ –> Emacs)

片方だけうまくいくおかげで,問題に気づくのにちょっと時間かかった.

1.3 なぜなのか?

1.3.1 org-mobile-pull の挙動

早い話が, (org-mobile-pull) は Agenda ファイルが (org-directory) 以下にあることを想定している


  • (org-mobile-pull) は独自のフォーマットで差分を読み込み,パースして,適用する.

    • Dropbox で同期していれば,MobileOrg アプリは差分情報を (org-mobile-directory)/(org-mobile-capture-file) に保存する

      • (org-mobile-directory) は設定が必要なので,init.el などで設定しているはず.

      • (org-mobile-capture-file) はデフォルトだと,"mobileorg.org"

    • (org-mobile-pull) 時に,(org-mobile-capture-file) から(org-mobile-inbox-for-pull) へコピーする

      • (org-mobile-index-for-pull) のデフォルト値は "~/org/from-mobile.org"

    • この差分を記述するフォーマットはともかく,変更箇所の記述方法が問題

      =~[[olp:<ファイル名>:H1/H2/H3][Head名]]~=
      
      となっている.

    • これを,(org-mobile-locate-entry) が実際のファイルパスとポジションに変換する.

      • このとき,ファイルパスは (org-directry) /<ファイル名>になる.

        • (org-directory) はデフォルトで "~/org"

1.3.2 org-mobile-push の挙動

じゃあ,push はどうなのよというと,実は Agenda ファイルが (org-directory) 以下になくても動くようになっている


  • (org-mobile-push) は.org ファイルを丸々転送している.

    • コピー元は, (org-agenda-files) からファイルパスごと 取ってくる

    • 暗号化しているときは,(org-mobile-capture-file) 経由で暗号化して転送するっぽい

    • でも,この時も .org は暗号化せずに転送しているように見えるけど,大丈夫か?(動かしたわけじゃないから実際はどうなのかわからないけども)


1.4 おわりに

Agenda ファイルはちゃんと,(org-directory) 以下に置きましょう.

どうしてもいやなら,MobileOrg か org-mobile.el を改造しましょう.

2015年1月21日水曜日

org-mobile-pull/push を自動実行する設定


1.1 はじめに

org-mobile でTODO 管理とかすると,PC からの入力がストレスレスで良いのだけど,なにせ,いちいちコマンド叩いて同期するのが面倒.

というわけで,自動的にorg-mobile-pull とかorg-mobile-push とかするようにしてみた.

まだ,この設定で動かした時間短い(30分ぐらい)ので,どこかおかしなところを見逃してる可能性ある.

だから,あんまり鵜呑みにしないようにお願いします.
(追記: 後述のcapture ファイル監視でのpullは動いてないっぽい... 2015/01/21 09:12)





1.2 やること



  • Emacs が開いている間,アイドル時間が一定時間以上でpull してpush
  • org-mobile-capture-file が変更されたらpull (追記: 下記の設定では動いてないぽい)

    • capture ファイルは,org-mobile で同期取るときに使う差分を保持する一時ファイルだったかな? とにかく,他のデバイスとかで編集するとこのファイルが更新されるっぽい.
  • ファイルをセーブするときにはpush
  • ファイルを開くときにはpull




1.3 参考にしたコード



以下のリンクにあるサンプルコードを参考にした

FAQ · matburt/mobileorg-android Wiki

やってることは


  • org-mobile に登録したファイルを保存すると,その後アイドル時間30秒経過するとpush を実行
  • 24時間に一回の頻度でpush
  • Emacs 起動時にpull
  • org-mobile が更新されたらpull




1.4 やってみる




1.4.1 コード





(defvar org-mobile-sync-timer nil
  "Timer that `org-mobile-sync-timer' used to reschedule itself, or nil.")
;;pullしてpush する関数
(defun org-mobile-sync nil
  (interactive)
  (org-mobile-pull)
  (org-mobile-push))

;;idle 時間が60秒経過すると自動でpullしてpush
(defun org-mobile-set-sync-timer nil
  (interactive)
  (setq org-mobile-sync-timer (run-with-idle-timer 10 60 t 'org-mobile-sync)))  ;;修正 2015/01/21 09:04


;;自動pull, push  を無効にする(一応用意してみたが使うかどうか...)
(defun org-mobile-clear-sync-timer nil
  (interactive)
  (cancel-timer org-mobile-sync-timer))

;;↓要修正  (追記:2015/01/21 09:11)
;;指定されたファイルを指定された時間で監視,更新されたらorg-mobile-pull を実行
(defun install-monitor (file secs)
  (run-with-timer
   0 secs
   (lambda (f p)
     (unless (< p (second (time-since (elt (file-attributes f) 5))))
       (org-mobile-pull)))
   file secs))

;; capture ファイルを5秒ごとに監視,更新されたらorg-mobile-pull 実行
(install-monitor (file-truename
                  (concat
                   (file-name-as-directory org-mobile-directory)
                   org-mobile-capture-file))
                 5)

;; org-mobile に登録したファイルを保存するとpush
(add-hook 'after-save-hook
          (lambda ()
            (when (eq major-mode 'org-mode)
              (dolist (file (org-mobile-files-alist))
                (if (string= (file-truename (expand-file-name (car file)))
                             (file-truename (buffer-file-name)))
                    (org-mobile-push)))
              )))

;; org-mobile に登録したファイルを開くとpull
(add-hook 'find-file-hook
          (lambda ()
            (when (eq major-mode 'org-mode)
              (dolist (file (org-mobile-files-alist))
                (if (string= (file-truename (expand-file-name (car file)))
                             (file-truename (buffer-file-name)))
                    (org-mobile-pull)))
              )))
(org-mobile-set-sync-timer)  ;; ←追記 2015/01/21 09:00


  • ファイルをセーブするときpushするコードは,元のコードから遅延を省いただけ.
  • capture ファイル変更でpull するコードは元コードそのまま






1.5 おわりに



とりあえず,これでしばらく使ってみる.

もしかしたら何か問題あるかも知れない.

問題が見つかって,気が向いたらこの記事直します.(無責任)






--
My Emacs Files At GitHub

2015年1月19日月曜日

Emacs Lisp を少し勉強した


1 Emacs Lisp を少し勉強した   gblog



Emacs Lisp のコードを読むときに知らなくて困った(多分)基本的な所をメモ.

困ったときに調べたものだけメモしているので,網羅はしてない.




1.1 コンスセル



「CARスロットおよびCDRスロットと呼ばれる 2つのポインタから成るオブジェクトです。」らしい.

「各スロットは、任意のLispオブジェクトを指すことができます。」

ドット記法とかで表現する.

(A . B) と書くと,A がCARスロット,B がCDR スロット



参考ページ:

GNU Emacs Lispリファレンスマニュアル: Cons Cell Type







1.2 cons obj1 obj2



obj1 とobj2 から成るコンスセルを作る関数.

(cons 1 2) => (1 . 2)





1.3 リスト



リストはコンスセルの入れ子構造.

(1 2 3) と表示する.

この実態は,CARスロットが1, CDR スロットが(2 3) のコンスセル.

2と3 が要素のリスト(2 3) の実態は CARスロットが2, CDR スロットが(3) のコンスセル

3だけが要素のリスト(3) の実態は CAR スロットが3, CDR スロットが空リストの()

ドット表記だと(1 . (2 . (3 . ())

(cons 1 (2 3)) => (1 2 3)

(cons 1 ()) => (1)

また,空リスト() はnil とも書く

つまり,

(cons 1 nil) => (1)





1.4 関数car, cdr



コンスセルのCAR スロットを取り出すのがcar 関数,CDR スロットを取り出すのがcdr 関数.

リストに適用すると,以下のような感じ.

(car '(0 1 2)) => 0

(cdr '(0 1 2)) => (1 2)





1.5 シングルクォートは何?



car やcdr の例では'(0 1 2) とリストの前に「'」がついている.

これは,リストを評価しないようにするためのものらしい.

リストを評価するとは,リストのCAR スロット(第一要素)を関数名,第二引数以降を関数の引数として,計算するということ.

Lisp は(0 1 2) とだけ書いて実行すると,0 を関数名,1 を第一引数,2 を第二引数として計算しようとするらしい.

これをせずに,リストとしてそのまま置いておくために,シングルクォートをつける.

関数名や変数名の前に「'」をつけるのも同じ理由のようである.



参考ページ:

Programming in Emacs Lisp: List Processing



また,別の説明で,おそらくより厳密な説明が以下のリンクにある.

Emacs Lisp

これをちゃんと理解するためには,シンボルというものを理解しないといけないらしい.

また,シンボルなるものの構造については以下のリンクが詳しいと思う.

GNU Emacs Lispリファレンスマニュアル: シンボル

このあたりの理解は今後の課題.





1.6 let



ローカル変数を定義して,最後のリストを評価する.



(let (ローカル変数の定義のリスト) フォーム1 … フォームn)



ローカル変数の定義のリストは以下の構文

((ローカル変数名1 初期値1) ローカル変数名2 … (ローカル変数名n 初期値n))

(ローカル変数名1 初期値1) と言うリストは,ローカル変数名1 が初期値1 で初期化することを示す.

一方,ローカル変数2 とだけ書いていると,ローカル変数2 はnil で初期化する.



フォームとは,Emacs Lisp のコードと思えばいいのかな?

let 全体の戻り値は,最後のフォーム(フォームn) の戻り値になる.



例:

(let ((x 3)) x) => 3

(let ((x 3) (y 2)) x y) => 2 ;; 最後のフォームがlet の戻り値になる

(let ((x 3) (y 2)) (+ x y)) => 5

(let ((x 3) y (z 4)) (list x y z)) => (3 nil 4) ;; (list x y z) はx y z を要素とするリストを返す






1.7 スペシャルフォーム(special form) とマクロ



普通,リストの形式で書いて実行すると,全てのリストが評価される.

しかし,例外があるらしく,それがspecial form というらしい.

先のlet はその一つ.

(let ((x 3) (y 2)) (+ x y)) の(x 3) はリストだが,これを関数として評価していない(したらx なんて関数はないとエラーが出るはず)

一方,一番後ろの(+ x y) は評価されている.

このように,let の引数に関しては,一番後ろしか評価しない,ということになっているようである.

他にも,値を変数に代入するsetq などがそうらしい.



また,スペシャルフォームという言葉を調べていると,マクロという言葉もよく見かける.

マクロは,ユーザー定義のスペシャルフォームらしい.

参考ページ:

スペシャルフォームとマクロ - by shigemk2






1.8 dolist



実は,このブログの内容は,dolist のサンプルコードがわからなくて調べだしたのがきっかけ.

つまり,今回のブログはここがゴール.



dolist もlet のようにスペシャルフォーム.

構文は以下.

(dolist (ローカル変数 リスト [戻り値]) フォーム1 … フォームn)



リストの要素を一つずつローカル変数に代入してフォーム1 からフォームn の処理を繰り返す

python とかでいうforeach 的なやつ.

戻り値を設定しないと,dolist の戻り値はnil になる.

また,戻り値に未定義の変数は使えないので,予め定義する必要がある.

例:

(let ((sum 0)) ;; 戻り値に使う変数を定義

(dolist (x '(1 2 3) sum)

(setq sum (+ x sum)))) => 6






--
My Emacs Files At GitHub

2014年12月11日木曜日

Org-mode で C-c C-e l 押下でLaTeXに\ エクスポートできなくなった時の話


1 Org-mode で C-c C-e l 押下でLaTeXにエクスポートできなくなった時の話   gblog



Org-mode で LaTeX へエクスポートしようと C-c C-e l 押下すると, Symbol's function definition is void: org-e-latex-export-to-latex とか言われたので場当たり的に対処

半年か一年か放ったらかしになっていた古いEmacs, Org-mode の設定で,Gentoo さんがバシバシアップデートしてくれるEmacs とOrg-mode を使えばやっぱり問題が起きるわけで.

とりあえず,対処療法的に問題が見つかったら潰している感じ.

今回は,Org-mode C-c C-e l でLaTeX をエクスポートしようとしたら, Symbol's function definition is void: org-e-latex-export-to-latex と言われたので対処.




1.1 環境



現環境



  • Emacs version: GNU Emacs 24.4.1


  • Org-mode version: Org-mode version 8.2.6



以前使ってた環境(うろ覚え)



  • Emacs version: GNU Emacs 23.4 くらいだったような気がする


  • Org-mode version: 7.9.3 くらいだったような気がする






1.2 org-e-latex-export-to-latex って何?



昔の Org-mode の Contrib の中にある関数らしい.

どうやら設定ファイルの中で古い Org-mode の Contrib を呼び出してるのがまずいらしい.






1.3 問題回避(解決したとは言ってない)



以前,org-md (Markdown へのエクスポートなどの機能を提供する) を試すために,org-mode/contrib/lisp をロードしていたが,正直全く使ってない.

なので,とりあえず今回は org-mode/contrib/lisp のロードをやめるようにした.

これで,=C-c C-e l l= でLaTeX へエクスポートされるようになった.






--
My Emacs Files At GitHub