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

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

2014年12月11日木曜日

org-export-as が吐く html の文字コードでハマる


1 org-export-as が吐く html の文字コードでハマる



org-googlecl (https://github.com/rileyrg/org-googlecl) でこのブログに記事を投稿するためにごにゅごにょやってたらハマった.

(ちなみに,org-googlecl は4年前から更新されてないみたいで,Org-mode のバージョンアップに合わせて自分で直さないと動かない)

僕の環境では, org-googlecl-blog というコマンドで blogger で投稿するようになってる.

このコマンドの中では,Org-mode のフォーマットを HTML に変換したあとに少し整形して googlecl のコマンドに渡すということをやってる.

この HTML に変換する処理を今は (org-export-as 'html nil t nil nil) という関数でやっているのだが,これがEUC-JP しか吐いてくれない.

EUC-JP だと googlecl さんがエンコードできねーと文句言うもんだからさて困った.



結論としては, org-googlecl-blog コマンドを叩く前に C-x RET c でコマンドを実行する際の文字コードを utf-8 に指定すればとりあえず utf-8 で HTML が吐かれるようになった.

なんか,釈然としないが,とりあえず今日はつかれたし,こんなことやってる場合ではないような気がするのでこれで置いとく.





--
My Emacs Files At GitHub

2013年2月10日日曜日

Org-mode内に書いたソースコードを実行する


はじめに




Org-modeでは,プログラムを記述して,その場で実行するOrg-babelという機能がある.

今回は,この使い方が判明したので,書いておく(忘れないために).









使い方




まず,Org-modeで以下のように書く.




#+BEGIN_SRC emacs-lisp
(+ 1 2)
#+END_SRC



そして,SRCブロック内で \C-c \C-c と打つと,以下のように出力される.




#+RESULTS:
: 3









困ったことが…




使い方は単純であるが,何も設定しないとEmacs-lisp以外のソースコードは実行できない.

この設定が今まで面倒で使っていなかった.




今回は,この使い方が判明したので,書いておく.









Emacs-lisp以外でOrg-babelを使うには




Emacsの設定ファイル( ~/.emacs.d/init.el ) などに以下の設定を書く.




(org-babel-do-load-languages
'org-babel-load-languages
'((emacs-lisp . t)
(C . t)))





この例では,C言語を追加している.












結果




結果は以下の通り.







#+BEGIN_SRC C
int main(){
printf("Hello Org-babel!\n");
return 0;
}
#+END_SRC

#+RESULTS:
: Hello Org-babel!









おわりに




Org-babelの使い方を書いた.

慣れてないせいか,言語によって実行するまでにどの程度書かないといけないのかがよくわからない.

javaとScalaはどうも実行できない…













--
My Emacs Files At GitHub

2013年1月27日日曜日

Org-modeでタスク管理する時に使いそうなキーバインド(主に計時関連)


タスクを管理するとき,タスクの処理に掛かる時間を管理することも重要である.

Org-modeでは,タスクにかかる時間をはかり,記録するための機能がある.

この機能を用いるためのキーバインドを表にしておく.

ただそれだけの記事.


キー内容
C-c C-x C-i計時開始
C-c C-x C-o計時終了
C-c C-x C-j計時中のツリーに移動
C-c C-x C-d各ツリーの合計所用時間を計算 (C-c C-c で表示を戻す)
C-c C-s作業予定日を設定
C-c C-x C-e努力目標時間を設定









--
My Emacs Files At GitHub

2012年12月22日土曜日

orgのバージョンを7.9.2にするとorg-googlecが使えなくなる件


Org-modeのバージョンが6.3くらいで古かったのでバージョンを上げた.
すると,Org-modeからこのブログに投稿するために使っているorg-googlecが使えなくなった.
今回は,この問題に対処する.

環境





OS
Mac OS X 10.7.5

Emacsバージョン
23.4.1

Org-modeバージョン
7.9.2







症状




http://tokikane-tec.blogspot.jp/2012/09/emacsblogger6970.html
で紹介した通り,
M-x org-googlecl-blog
を実行すると,以下のエラーメッセージが出力される.



let: Symbol's function definition is void: org-forward-same-level


どうやら, org-forward-same-level という関数がないらしい





原因




結論から言うと, Org-modeの関数名が変わってる のが原因.
具体的には, org-forward-same-level という関数の名前が org-forward-heading-same-level に変わった.
ちなみにこの関数は,今カーソルがあるネストのレベルと同じレベルの次の要素の先頭に移動する関数である.
そして,org-googlecは org-forward-same-level 内部で使っていた.
このために上記のようなエラーが出た,というわけである.





対処




関数の名前が変わったなら,呼び出す部分のソースコードを弄ればいい.
org-googlecl.elの



(org-forward-same-level 1 t)   


という行を



(org-forward-heading-same-level 1 t)   


と書き直す.
これで無事問題が解決する.





おわりに(余談)




どのバージョンを境に関数名が変わったかは不明である.

Org-modeは,結構,昔の環境のことを考えずに変更が加えられることがある.
以前もOrg-modeの参照で :- に置換するという(おせっかい)機能がついていて,はまった.
自分はいつも fig:hoge みたいな書き方をするので困った.

あとこういうのってgithubでpull requestを出して本家を直してもらう,というのがいいのだろうか?
今までpull requestを出したことがないので,よくわからない.










--
My Emacs Files At GitHub

2012年9月16日日曜日

Emacsからbloggerへ記事を投稿する




実行環境






  • Mac OS X 10.7.4


  • GNU Emacs 23.4.1






googleclのインストール




ターミナルで以下のコマンドを実行
sudo port install googlecl
Ubuntuならapt-get でできるかも(やってないけど)





googlecl.elのインストール




https://github.com/rileyrg/org-googlecl
からZIPをダウンロードし,適当なところに展開し,ファイルのパスをload-pathに追加する.






Emacsの設定




.emacs に以下の設定を追加する.
(require 'org-googlecl)
(setq googlecl-blogname "ブログの名前")
(setq googlecl-username "gmailのアドレス(hogehoge@gmeil.com)")





投稿方法




Emacs上で投稿したい記事(見出し)にカーソルを合わせ
M-x org-googlecl-blog
を実行する.
カーソルを合わせている見出しの部分木がブログとして認識される.





余分な行間への対策




以上の手順を踏めば投稿はできるのですが,行間が無駄に大きく見栄えが悪いです.
これは,(参考URL(2)曰く)出力結果のhtmlが余分に<p>タグを出力しているかららしいです.
ということで,googlecl.elを改造します.
googlecl.elの135行目あたりの

(with-temp-file tmpfile
(insert bhtml)
(goto-char (buffer-end 1))


(with-temp-file tmpfile
(insert (replace-regexp-in-string
"<p>\n*\\(\\(.*\n\\)+?\\)</p>"
"\\1" bhtml))
(goto-char (buffer-end 1)))
と書き換えます.
おそらく正規表現を用いて,出力結果のhtmlの<p>部分を変換してると思われます.





おわりに




この記事は上記の通りに行って投稿した記事です.
今後は,もう少し見栄えがよくなるようにしてみたいです.
あと,プレビューできないのも困るので,なにかいい方法があればいいな…と思ってます.






--
My Emacs Files At GitHub