(add-to-list 'load-path "~/.emacs.d/site-lisp/org-mode/lisp")
(add-to-list 'load-path "~/.emacs.d/site-lisp/org-mode/contrib/lisp")
(add-to-list 'auto-mode-alist '("\\.\\(org\\|org_archive\\|txt\\)$" . org-mode))
(add-to-list 'load-path "~/code/elisp/org-book-manager")
(add-hook 'org-mode-hook
'(lambda ()
(setq indent-tabs-mode nil)))
(require 'org-capture)
;; (require 'org-exp-bibtex)
;; (require 'org-latex)
(require 'org-colview)
(require 'org-habit)
(require 'org-id)
(el-get 'sync 'org-extension)
(require 'org-extension)
key | function |
---|---|
C-c l | org-store-link |
C-c a | org-agenda |
C-c b | org-isqitchb |
(define-key global-map "\C-cl" 'org-store-link)
(define-key global-map "\C-ca" 'org-agenda)
(define-key global-map "\C-cb" 'org-iswitchb)
(add-hook 'org-mode-hook
'(lambda ()
(setq fill-column 65)
(auto-fill-mode 1)))
(org-defkey org-mode-map "\M-h" 'backward-kill-word)
現在、org-modeが管理しているファイルは3つ.
- refile.org: INBOXファイル.org-captureでC-c C-cを実行した場合はここにリファイルされる.
- todo.org: タスク管理用ファイル.
- notes.org: メモ・ノート用ファイル.
- info.org: 使ってるサービスやその支払い情報等を管理。Dropboxで同期はしていない。
- work.org: 会社のタスクを管理
- trac.org: チケットのインポート用
- habit.org: 定期的に行うもの用
(setq org-agenda-files-dir "~/doc/")
(cond
(run-w32
(setq org-agenda-files-suffix '("refile.org" "todo.org" "notes.org" "work.org")))
((or run-mac (string= (system-name) "ubuntu"))
(setq org-agenda-files-dir "~/Documents/")
(setq org-agenda-files-suffix '("refile.org" "todo.org" "notes.org" "habit.org")))
(run-linux
(setq org-agenda-files-suffix '("refile.org" "todo.org" "notes.org"))))
(setq org-agenda-files (mapcar (lambda (f) (concat org-agenda-files-dir f))
org-agenda-files-suffix))
(defmacro work-in-turris (&rest body)
`(if (string= "turris" (system-name))
(cond ,body)
))
(defmacro work-in-macbook (&rest body)
`(if (string= "takaishi-no-MacBook-Air.local" (system-name))
(cond ,body)
))
(work-in-turris
(setq org-agenda-files (cons "~/work/work.org" org-agenda-files))
(setq org-agenda-files (cons "~/work/trac.org" org-agenda-files)))
;; (work-in-macbook
;; (setq org-agenda-files (cons "~/Documents/info.org" org-agenda-files)))
;; ウィークリー/デイリーアジェンダ(C-c a a)の初期表示をデイリーにする
(setq org-agenda-span 'day)
;; 時間表示が1桁の時、0をつける
(setq org-agenda-time-leading-zero t)
;; log-modeで表示するアイテム
(setq org-agenda-log-mode-items (quote (closed state)))
(setq org-agenda-prefix-format
'((agenda . " %i %-12:c%?-12t% s")
(timeline . " % s")
(todo . " %i %-30:c")
(tags . " %i %-12:c")
(search . " %i %-12:c")))
(setq org-agenda-custom-commands
`(("N" "Notes" tags "NOTE"
((org-agenda-overriding-header "Notes")
(org-tags-match-list-sublevels t)))
("r" "Tasks to Refile" tags "REFILE"
((org-agenda-overriding-header "Notes and Tasks to Refile")
(org-agenda-overriding-header "Tasks to Refile")))
("h" "Habits" tags-todo "STYLE=\"habit\""
((org-agenda-overriding-header "Habits")
(org-agenda-sorting-strategy
'(todo-state-down effort-up category-keep))))
("p" "Projects" tags-todo "-HOLD-CANCELLED/!"
((org-agenda-overriding-header "Projects")
(org-agenda-sorting-strategy
'(category-keep))))
("w" "Work" tags-todo "WORK")
(" " "Agenda"
((agenda " " nil)
(tags "REFILE"
((org-agenda-overriding-header "Tasks to Refile")
(org-tags-match-list-sublevels nil)))
(tags-todo "-CALCELED/!NEXT"
((org-agenda-overriding-header "Tasks to Next")))
,(work-in-turris
'(tags-todo "WORK"
((org-agenda-overriding-header "Task of ")
(org-tags-match-list-sublevels nil))))
,(work-in-turris
'(tags-todo "TRAC"
((org-agenda-overriding-header "Tickets")
(org-tags-match-list-sublevels nil))))))
))
タスクの状態は全部で4.
- TODO: 未開始のタスク
- NEXT: 開始したタスク
- DONE: 終了したタスク
- CANCELED: キャンセルしたタスク
- WAITING: 連絡待ち,作業待ちなどで待機しているタスク
(setq org-todo-keywords
(quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d!/!)")
(sequence "WAITING(w@/!)" "CANCELLED(c@/!)"))))
(setq org-todo-keyword-faces
(quote (("TODO" :foreground "red" :weight bold)
("NEXT" :foreground "cyan" :weight bold)
("DONE" :foreground "green" :weight bold)
("CANCELLED" :foreground "forest green" :weight bold))))
[*] --> TODO
TODO : t
TODO -right-> DONE
TODO -right-> NEXT
TODO -down-> CANCELED
TODO -down-> WAITING
STARTED : s
STARTED --> DONE
STARTED --> CANCELED
STARTED --> WAITING
CANCELED : c
WAITING : w
WAITING --> NEXT
WAITING --> DONE
DONE : d
DONE --> [*]
タスクの状態によって自動的にタグをセットする.
- 状態がCANCELLED: CANCELLEDタグをセット
- それ以外: CANCELLEDタグを外す
(setq org-todo-state-tags-triggers
(quote (("CANCELLED" ("CANCELLED" . t))
("WAITING" ("WAITING" . t))
("TODO" ("CANCELLED") ("WAITING"))
("NEXT" ("CANCELLED") ("WITING"))
("DONE" ("CANCELLED") ("WAIING")))))
(setq org-return-follows-link t)
(setq org-archive-mark-done nil)
(add-to-list 'org-modules 'org-habit)
(setq org-log-done 'time)
(setq org-log-into-drawer "LOGBOOK")
org-enforce-todo-dependenciesがtだと,タスクに依存関係が生まれ, 依存タスクを全て完了しないとタスクの完了ができなくなる.ORDEREDプ ロパティがない場合は,親タスクが子タスクの完了に依存する.ORDERED プロパティがtの場合は,子タスク間にも依存関係が生じ,上にあるタス クに依存する.ORDEREDプロパティをセットするには,”C-c C-x o”を使 う.
* TODO 親タスク(子タスクを全て完了しないと完了できない)
** TODO 子タスクA
** TODO 子タスクB
* TODO 親タスク(子タスクを全て完了しないと完了できない)
, :PROPERTIES:
, :ORDERED: t
, :END:
** TODO A
** TODO B(タスクAが完了しないと完了できない)
** TODO C(タスクAとタスクBが完了しないと完了できない)
(setq org-enforce-todo-dependencies t)
;; Emacsが再起動した時に測定中タスクの測定を再開する
(org-clock-persistence-insinuate)
;: 時間測定の履歴数
(setq org-clock-history-length 36)
;; ドロワーを分割する
(setq org-drawer (quote ("PROPERTIES" "LOGBOK")))
;; Emacsが再起動したときにタスクの時間計測を再開する
(setq org-clock-persist 'history)
;; タスクが完了した時に時間測定も停止する
(setq org-clock-out-when-done t)
;; Emacsが終了する時に測定中の計測と全ての測定履歴を保存する
(setq org-clock-persist t)
;; セレクションメニューから状態の変更を行えるようにする
(setq org-use-fast-todo-selection t)
(setq org-clock-in-resume t)
(setq org-clock-auto-clock-resolution (quote when-no-clock-is-running))
;; 測定した時間が0の場合消去する
(setq org-clock-out-remove-zero-time-clocks t)
;;アジェンダのclockreport用パラメータ
(setq org-agenda-clockreport-parameter-plist
'(:maxlevel 5 :block t :tstart t :tend t :emphasize t :link t :narrow 80 :indent t :formula nil :timestamp t :level 5 :tcolumns nil :formatter nil))
;; カラムビューで表示する項目
(setq org-columns-default-format "%80ITEM(Task) %10Effort(Effort){:} %10CLOCKSUM")
(setq org-clock-in-switch-to-state 'org-clock-in-to-started)
(defun org-clock-in-to-started (state)
(if (or (string= state "TODO")
(string= state "WAITING"))
"NEXT"))
C-c C-x C-iもしくはI(Agenda内のみ)
(setq bh/keep-clock-running nil)
(defun bh/clock-in-to-next (kw)
"Switch a task from TODO to NEXT when clocking in.
Skips capture tasks, projects, and subprojects.
Switch projects and subprojects from NEXT back to TODO"
(when (not (and (boundp 'org-capture-mode) org-capture-mode))
(cond
((and (member (org-get-todo-state) (list "TODO"))
(bh/is-task-p))
"NEXT")
((and (member (org-get-todo-state) (list "NEXT"))
(bh/is-project-p))
"TODO"))))
(defun bh/find-project-task ()
"Move point to the parent (project) task if any"
(save-restriction
(widen)
(let ((parent-task (save-excursion (org-back-to-heading 'invisible-ok) (point))))
(while (org-up-heading-safe)
(when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
(setq parent-task (point))))
(goto-char parent-task)
parent-task)))
(defun bh/punch-in (arg)
"Start continuous clocking and set the default task to the
selected task. If no task is selected set the Organization task
as the default task."
(interactive "p")
(setq bh/keep-clock-running t)
(ad-deactivate-regexp "is-set-effort-before-clock-in")
(remove-hook 'org-clock-in-hook 'org-pomodoro-start)
(if (equal major-mode 'org-agenda-mode)
;;
;; We're in the agenda
;;
(let* ((marker (org-get-at-bol 'org-hd-marker))
(tags (org-with-point-at marker (org-get-tags-at))))
(if (and (eq arg 4) tags)
(org-agenda-clock-in '(16))
(bh/clock-in-organization-task-as-default)))
;;
;; We are not in the agenda
;;
(save-restriction
(widen)
; Find the tags on the current task
(if (and (equal major-mode 'org-mode) (not (org-before-first-heading-p)) (eq arg 4))
(org-clock-in '(16))
(bh/clock-in-organization-task-as-default))))
(ad-activate-regexp "is-set-effort-before-clock-in")
(add-hook 'org-clock-in-hook 'org-pomodoro-start))
(defun bh/punch-out ()
(interactive)
(setq bh/keep-clock-running nil)
(when (org-clock-is-active)
(org-clock-out))
(org-agenda-remove-restriction-lock))
(defun bh/clock-in-default-task ()
(save-excursion
(org-with-point-at org-clock-default-task
(ad-deactivate-regexp "is-set-effort-before-clock-in")
(remove-hook 'org-clock-in-hook 'org-pomodoro-start)
(org-clock-in)
(ad-activate-regexp "is-set-effort-before-clock-in")
(add-hook 'org-clock-in-hook 'org-pomodoro-start))))
(defun bh/clock-in-parent-task ()
"Move point to the parent (project) task if any and clock in"
(let ((parent-task))
(save-excursion
(save-restriction
(widen)
(while (and (not parent-task) (org-up-heading-safe))
(when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
(setq parent-task (point))))
(if parent-task
(org-with-point-at parent-task
(org-clock-in))
(when bh/keep-clock-running
(bh/clock-in-default-task)))))))
(work-in-turris
(defvar bh/organization-task-id "6682f0b0-d6a6-43f2-82de-323a2e53fe93"))
(defun bh/clock-in-organization-task-as-default ()
(interactive)
(org-with-point-at (org-id-find bh/organization-task-id 'marker)
(ad-deactivate-regexp "is-set-effort-before-clock-in")
(remove-hook 'org-clock-in-hook 'org-pomodoro-start)
(org-clock-in '(16))
(ad-activate-regexp "is-set-effort-before-clock-in")
(add-hook 'org-clock-in-hook 'org-pomodoro-start)))
(defun bh/clock-out-maybe ()
(when (and bh/keep-clock-running
(not org-clock-clocking-in)
(marker-buffer org-clock-default-task)
(not org-clock-resolving-clocks-due-to-idleness))
(bh/clock-in-parent-task)))
(add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append)
;; (defadvice org-clock-in (before is-set-effort-before-clock-in)
;; (let ((effort (org-entry-get (point) "Effort")))
;; (unless effort
;; (error "[Error: Is not set a effort!]"))))
;; (ad-activate-regexp "is-set-effort-before-clock-in")
(define-key global-map "\C-cc" 'org-capture)
(setq org-completion-use-helm nil)
(setq org-refile-path
(if (or run-mac (string= (system-name) "ubuntu"))
"~/Documents/refile.org"
"~/doc/refile.org"))
(defun get-category-from-description (desc)
(if (string-match "#\\([0-9]+\\) .*" desc)
(match-string 1 desc)))
(setq org-capture-templates
`(("t" "todo" entry (file org-refile-path "")
"* TODO %?\n%U\n%a\n %i" :clock-in t :clock-resume t)
("p" "Phone call" entry (file "~/doc/refile.org")
"* PHONE %? :PHONE:\n%U" :clock-in t :clock-resume t)
("n" "note" entry (file org-refile-path "")
"* %? :NOTE:\n %u" :clock-in t :clock-resume t)
("j" "journal" entry (file+datetree "~/doc/diary.org")
"* %?\n%U\n %i" :clock-in t :clock-resume t)
("h" "Habit" entry (file "~/doc/refile.org")
"* NEXT %?\n%a\nSCHEDULED: %t .+d/3d\n:PROPERTIES:\n:STYLE: habit\n:REPEAT_TO_STATE: NEXT\n:END:\n")
;;("b" "Bookmark" entry (file+headline "~/trac.org" "Bugs of Trac")
("b" "Bookmark" entry (file+headline "~/work/trac.org" (let ((milestone (plist-get (plist-get org-store-link-plist :query) :milestone)))
(if (string= milestone "")
"その他"
milestone)))
"* TODO %:description
:PROPERTIES:
:ID: %(plist-get (plist-get org-store-link-plist :query) :ticket-id)
:CUSTOMER: %(plist-get (plist-get org-store-link-plist :query) :customer)
:MILESTONE: %(plist-get (plist-get org-store-link-plist :query) :milestone)
:TYPE: %(plist-get (plist-get org-store-link-plist :query) :type)
:CATEGORY: %(plist-get (plist-get org-store-link-plist :query) :milestone)
:URL: %:link
:END:
" :immediate-finish t)
("d" "daily report" entry (file+datetree "~/work/daily-report.org")
"* %?")
("w" "weekly report" entry (file+datetree "~/work/weekly-report.org")
"* %?")
))
(defun in-turris ()
(string= "turris" (system-name)))
(setq org-capture-templates-contexts
'(("d" (in-turris))
("w" (in-turris))))
key | context | ||||||||
---|---|---|---|---|---|---|---|---|---|
t | todo | entry | (file ~/doc/refile.org ) | * TODO %?\n%U\n%a\n %i | |||||
n | note | entry | (file ~/doc/refile.org ) | * %? :NOTE:\n %u | :clock-in | t | :clock-resume | t | |
j | journal | entry | (file+datetree ~/doc/diary.org) | * %?\n%U\n %i | :clock-in | t | :clock-resume | t | |
h | Habit | entry | (file ~/doc/refile.org) | * NEXT %?\n%a\nSCHEDULED: %t .+d/3d\n:PROPERTIES:\n:STYLE: habit\n:REPEAT_TO_STATE: NEXT\n:END:\n | |||||
d | daily report | entry | (file+datetree ~/doc/daily-report.org) | アリエル社内 | |||||
w | weekly report | entry | (file+datetree ~/doc/weekly-report.org) | アリエル社内 |
javascript:location.href='org-protocol://capture://b/'+encodeURIComponent(location.href)+'/'+encodeURIComponent(document.title)+'/'+encodeURIComponent(document.evaluate('descendant::a[@class="milestone"]',%20document,%20null,%20XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,%20null).snapshotItem(0).innerHTML)
(add-to-list 'org-modules 'org-timer)
(setq org-timer-default-timer 25)
(setq org-startup-indented t)
;; (add-to-list 'load-path "~/code/elisp/org-simple-presentation/")
;; (require 'org-simple-presentation-mode)
;; (add-to-list 'load-path "~/.emacs.d/site-lisp/emacs-calfw")
;; (require 'calfw)
;; (require 'calfw-org)
(add-to-list 'load-path "~/Dropbox/code/elisp/org-book")
(require 'org-book)
(setq *org-book-file* "~/Dropbox/doc/book.org")
(setq *org-book-amazon.rb-directory* "~/Dropbox/code/elisp/org-book")
(setq org-refile-targets (quote ((nil :maxlevel . 3)
(org-agenda-files :maxlevel . 3))))
(setq org-outline-path-complete-in-steps nil)
(setq org-refile-allow-creating-parent-nodes (quote confirm))
- nilでなければパスのようなリファイルターゲットを提供する.
- fileならファイル名からターゲットとして選択できる
(setq org-refile-use-outline-path 'file)
(setq org-export-latex-classes '())
(add-to-list 'org-export-latex-classes
;; ゼミの報告書用
'("seminar" "
\\documentclass[11pt]{jsarticle}
\\usepackage{seminar}
\\usepackage[utf8]{inputenc}
\\usepackage[T1]{fontenc}
\\usepackage{fixltx2e}
\\usepackage[dvipdfmx]{graphicx}
\\usepackage{longtable}
\\usepackage{float}
\\usepackage{wrapfig}
\\usepackage{soul}
\\usepackage{t1enc}
\\usepackage{textcomp}
\\usepackage{marvosym}
\\usepackage{wasysym}
\\usepackage{latexsym}
\\usepackage{amssymb}
\\usepackage{hyperref}
\\usepackage{ascmac}
"
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")))
(add-to-list 'org-export-latex-classes
'("resume"
"
\\documentclass[a4paper, 10pt, twocolumn]{jarticle}
\\usepackage{rise}
\\usepackage{hyperref}
\\usepackage{fancyheadings}
\\usepackage[dvipdfmx]{graphicx}
\\usepackage{amsmath}
\\setlength{\\textheight}{47\\baselineskip}
\\addtolength{\\textheight}{\\topskip}
\\setlength{\\voffset}{-0.5in}
\\setlength{\\headsep}{0.3in}
"
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
(add-to-list 'org-export-latex-classes
'("beamer"
"
\\documentclass[12pt]{beamer}
\\usetheme{Pittsburgh}
\\setbeamersize{text margin left=10pt,text margin right=10pt}
"
org-beamer-sectioning
))
(add-to-list 'org-export-latex-classes
'("slide2"
"\\documentclass[17pt,compress,dvipdfm]{beamer}"
org-beamer-sectioning
))
(setq org-export-latex-classes
(cons
'("thesis" "
\\documentclass{risepaper}
\\修論
\\usepackage{epsbox}
\\usepackage{makeidx}
\\usepackage[dvipdfmx]{graphicx}
\\usepackage[utf8]{inputenc}
\\usepackage[T1]{fontenc}
\\usepackage{hyperref}
\\usepackage{multirow}
\\usepackage{amsmath}
\\usepackage{listings, jlisting}
\\renewcommand{\\lstlistingname}{リスト}
\\lstset{language=bash,
basicstyle=\\ttfamily\\tiny,
commentstyle=\\textit,
classoffset=1,
keywordstyle=\\bfseries,
frame=tRBl,
framesep=5pt,
showstringspaces=false,
tabsize=2
}
\\makeindex
"
("\\chapter{%s}" . "\\chapter*{%s}")
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}"))
org-export-latex-classes))
(add-to-list 'org-export-latex-classes
'("jsarticle" "
\\documentclass[a4paper]{jsarticle}
\\usepackage[utf8]{inputenc}
\\usepackage[T1]{fontenc}
\\usepackage[dvipdfmx]{graphicx}
\\usepackage{longtable}
\\usepackage{hyperref}
"
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")))
(setq org-export-default-language "en"
org-export-html-extension "html"
org-export-with-timestamps nil
org-export-with-section-numbers nil
org-export-with-tags 'not-in-toc
org-export-skip-text-before-1st-heading nil
org-export-with-sub-superscripts '{}
org-export-with-LaTeX-fragments t
org-export-with-archived-trees nil
org-export-highlight-first-table-line t
org-export-latex-listings-w-names nil
org-export-html-style-include-default nil
org-export-htmlize-output-type 'css
org-startup-folded nil
org-publish-list-skipped-files t
org-publish-use-timestamps-flag t
org-export-babel-evaluate nil
org-confirm-babel-evaluate nil)
(setq org-publish-project-alist nil)
(add-to-list 'org-publish-project-alist
'("anor.in-doc"
:base-directory "~/Dropbox/org/private/www/anor.in/"
:base-extension "org"
:publishing-directory "/ssh:rtak@repl.info:/var/www/anor.in/"
:recursive t
:publishing-function org-publish-org-to-html
:headline-levels 4
:auto-preamble t
:auto-index t
:index-filename "sitemap.org"
:index-title "Sitemap"
:auto-sitemap t
:section-numbers nil
:table-of-contents nil
:plain-source t
:htmlized-source t
:makeindex t
:style-include-default nil
:style "<link rel=\"stylesheet\" type=\"text/css\" href=\"/style/style.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"/style/source.css\">"
:fb-button t
:google-analytics-tracking-code "UA-27642412-1"
))
(add-to-list 'org-publish-project-alist
'("anor.in-extra"
:base-directory "~/Dropbox/org/private/www/anor.in/"
:publishing-directory "/ssh:rtak@repl.info:/var/www/anor.in/"
:base-extension "css\\|pdf\\|png\\|jpg\\|gif\\|txt\\|js\\|scm"
:publishing-function org-publish-attachment
:recursive t))
(add-to-list 'org-publish-project-alist
'("anor.in"
:components ("anor.in-doc" "anor.in-extra")))
(setq org-publish-project-alist nil)
(add-to-list 'org-publish-project-alist
'("local.anor.in-doc"
:base-directory "~/Dropbox/org/private/www/anor.in/"
:base-extension "org"
:publishing-directory "/var/www/repl.info/"
:recursive t
:publishing-function org-publish-org-to-html
:headline-levels 4
:auto-preamble t
:auto-index t
:index-filename "sitemap.org"
:index-title "Sitemap"
:auto-sitemap t
:section-numbers nil
:table-of-contents nil
:plain-source t
:htmlized-source t
:makeindex t
:style-include-default nil
:style "<link rel=\"stylesheet\" type=\"text/css\" href=\"/style/style.css\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"/style/source.css\">"
:fb-button t
:google-analytics-tracking-code "UA-27642412-1"
))
(add-to-list 'org-publish-project-alist
'("local.anor.in-extra"
:base-directory "~/Dropbox/org/private/www/anor.in/"
:publishing-directory "/var/www/repl.info/"
:base-extension "css\\|pdf\\|png\\|jpg\\|gif\\|txt\\|js\\|scm"
:publishing-function org-publish-attachment
:recursive t))
(add-to-list 'org-publish-project-alist
'("local.anor.in"
:components ("local.anor.in-doc" "local.anor.in-extra")))
(add-to-list 'org-publish-project-alist
'("my-blog"
:base-directory "~/blog.repl.info/source/drafts"
:recursive t
:base-extension "org"
:publishing-directory "~/blog.repl.info/source/_posts"
:blog-publishing-directory "~/blog.repl.info/source/_posts"
:site-root "http://blog.repl.info/"
:jekyll-sanitize-permalinks t
:publishing-function org-publish-org-to-html
:section-numbers nil
:headline-levels 4
:table-of-contents t
:auto-index nil
:auto-preamble nil
:body-only t
:auto-postamble nil))
(add-to-list 'org-publish-project-alist
'("orgmode.jp-doc"
:base-directory "~/Dropbox/doc/private/www/orgmode.jp/"
:base-extension "org"
:publishing-directory "/ssh:rtak@repl.info:/var/www/orgmode.jp/"
:recursive t
:publishing-function org-html-publish-to-html
:headline-levels 4
:auto-preamble t
:auto-index t
:index-filename "sitemap.org"
:index-title "Sitemap"
:auto-sitemap t
:section-numbers nil
:table-of-contents nil
:plain-source t
:htmlized-source t
:makeindex t
:style "<link rel=\"stylesheet\" title=\"Standard\" href=\"/style\/style.css\" type=\"text/css\" />"
))
(add-to-list 'org-publish-project-alist
'("orgmode.jp-extra"
:base-directory "~/Dropbox/doc/private/www/orgmode.jp/"
:publishing-directory "/ssh:rtak@repl.info:/var/www/orgmode.jp/"
:base-extension "css\\|pdf\\|png\\|jpg\\|gif\\|txt\\|js\\|scm\\|texi\\|html"
:publishing-function org-publish-attachment
:recursive t))
(add-to-list 'org-publish-project-alist
'("orgmode.jp"
:components ("orgmode.jp-doc" "orgmode.jp-extra")))
;; (load "~/code/elisp/ob-blockdiag.el")
;; (org-babel-do-load-languages
;; 'org-babel-load-languages
;; '(;; other Babel languages
;; (plantuml . t)
;; (dot . t)
;; (ruby . t)
;; (blockdiag . t)))
;; (setq org-plantuml-jar-path
;; (expand-file-name "~/bin/plantuml.jar"))
;; (setq plantuml-jar-path (expand-file-name "~/bin/plantuml.jar"))
(require 'ob-dot)
C-c ’ (org-edit-speclal)でコードを別バッファに表示・編集できる. その際元バッファでorg-save-buffersが有効になっていると編集中に以下のメッセージがミニバッファに表示されて操作に支障が生じる.
(ファイル名) has changed since visited or saved. Save anyway? (yes or no)
これを解決するために,編集開始時にauto-save-buffersをオフにし,編集終了時にオンにすることにした.
;; C-c ' でコードの編集をする際,auto-save-buffersが有効になっていると衝突を起こす
;; 編集時に無効にし,編集が終わると有効にする
;;(defadvice org-edit-special (before turn-off-auto-save-buffers)
;; "turn-off-auto-revert-mode with org-edit-special."
;; (if auto-save-buffers-active-p
;; (auto-save-buffers-toggle)))
;;
;;(defadvice org-edit-src-exit (after turn-on-auto-save-buffers)
;; (unless auto-save-buffers-active-p
;; (auto-save-buffers-toggle)))
;;
;;(ad-activate-regexp "turn-off-auto-save-buffers")
;;(ad-activate-regexp "turn-on-auto-save-buffers")
global-highlight-changes-modeを使うと,バッファ内の更新した部分を 知ることができる.これを使って,各ヘッダのプロパティに最終更新時 刻を記録する.
(defun org-record-header-mtime ()
"If mode-name is 'Org', update modified heading's drawer :Modified:.
This function is global-highlight-changes-mode. "
(interactive)
(when (and (stringp mode-name)
(string= mode-name "Org") highlight-changes-mode)
(save-excursion
(goto-char (point-min))
(while (integerp (highlight-changes-next-change))
(org-touch-header)))
(highlight-changes-remove-highlight (point-min) (point-max))))
;; This function ports by Sacha's org-toodledo.el.
;; URL: http://github.com/sachac/org-toodledo
(defun org-touch-header ()
"Update the current task."
(interactive)
(let ((time (current-time)))
(org-entry-put (point) "MTIME" (format "%d" (float-time time)))
(org-entry-put (point) "MTIME-1" (format-time-string "<%Y-%m-%d %a %H:%M:%S>" time))))
(add-hook 'org-mode-hook '(lambda () (highlight-changes-mode t)))
;;(remove-hook 'org-mode-hook '(lambda () (global-highlight-changes-mode t)))
(add-hook 'after-save-hook 'org-record-header-mtime)
(add-hook 'after-save-hook '(lambda () (highlight-changes-remove-highlight (point-min) (point-max))))
;;(remove-hook 'after-save-hook '(highlight-changes-remove-highlight (point-min) (point-max)))
;;(remove-hook 'after-save-hook 'org-record-header-mtime)
Ported from dotfiles/elisp/ajd-org.el at master from aldrin/ajd - GitHub.
(defun org-publish-get-project-from-publish-filename (filename)
(let* ((path filename)
(prj org-publish-project-alist))
(loop for p in prj
when (and (string< (plist-get (cdr p) :publishing-directory) path)
(string= (plist-get (cdr p) :base-extension) "org"))
return p)))
(defun add-fb-stuff ()
"Adds Facebook OpenGraph Plugins."
(let* ((project (org-publish-get-project-from-publish-filename (buffer-file-name)))
(project-plist (cdr project)))
(when (plist-get project-plist :fb-button)
(let ((url (concat "http://repl.info/"
(replace-regexp-in-string (plist-get project-plist :publishing-directory)
""
(buffer-file-name)))))
(goto-char (point-min))
(search-forward "<body>")
(insert (concat
"<div class=\"fb-like\" data-href=\""
url
"\" data-send=\"false\" data-layout=\"button_count\" data-width=\"30\" data-show-faces=\"true\" data-font=\"arial\"></div>"))
(goto-char (point-min))
(search-forward "<body>")
(insert "<div id=\"fb-root\"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = \"//connect.facebook.net/ja_JP/all.js#xfbml=1\";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>")
(save-buffer)))))
(add-hook 'org-publish-after-export-hook 'add-fb-stuff)
Ported from dotfiles/elisp/ajd-org.el at master from aldrin/ajd - GitHub.
(setq add-google-analytics-suffix "']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<script type='text/javascript' src='https://apis.google.com/js/plusone.js'></script>
")
(defun add-google-analytics ()
"Adds Google Analytics Tracking code."
(let* ((project-plist (cdr (org-publish-get-project-from-publish-filename (buffer-file-name))))
(code (plist-get project-plist :google-analytics-tracking-code)))
(when code
(goto-char (point-min))
(re-search-forward "</head>")
(goto-char (match-beginning 0))
(insert (concat "
<script type='text/javascript'>
var _gaq = _gaq || [];
_gaq.push(['_setAccount', '" code add-google-analytics-suffix))
(save-buffer))))
(add-hook 'org-publish-after-export-hook 'add-google-analytics)
(setq org-mobile-directory "~/Dropbox/doc")
(setq org-directory "~/Dropbox/doc")
(setq org-mobile-inbox-for-pull "~/Dropbox/doc/from-mobile.org")
;; (add-to-list 'load-path "~/.emacs.d/el-get/o-blog")
;; (require 'o-blog)
The Pomodoro Technique is a time management method. It uses a timer to get down 25 minute called ‘1 pomodoro’. Datail is The Pomodoro Technique®.
(require 'org-timer)
(setq org-timer-default-timer 25)
(defun org-pomodoro-start ()
(if (not org-timer-current-timer)
(org-timer-set-timer '(16))))
(defun org-pomodoro-stop ()
(org-timer-cancel-timer))
(add-hook 'org-clock-in-hook 'org-pomodoro-start)
;; When a task is complete within 25 minutes, it cancel org-timer together.
(add-hook 'org-clock-out-hook 'org-pomodoro-stop)
(require 'org-protocol)
Thunderlinkという、MessageIDを指定してコマンドラインからメールを開くためのThunderbird用アドオンがある。 このアドオンを使って、org-modeからMessageIDを指定して開くための設定。
(org-add-link-type "thunderlink" 'org-thunderlink-open)
(defun org-thunderlink-open (path &optional new-window)
(let ((url (concat "thunderlink:" path)))
(if (string-match "^thunderlink://" url)
(progn
(start-process (concat "thunderbird " url) nil "thunderbird-bin" "-thunderlink" url)
t)
nil)
)
)
(org-add-link-type "octpress" 'org-octporess-open)
(defun org-octporess-open (path &optional new-window)
(let ((url (concat "[[" "../.." path "]]")))
(org-open-link-from-string url)))
(setq org-src-fontify-natively t)
(setq org-time-clocksum-format '(:hours "%d" :require-hours t :minutes ":%02d" :require-minutes t))
全て同じファイルにアーカイブするとファイルサイズが非常に大きくなるので、毎年ファイルを変えることにする。
(setq org-archive-location (concat "%s_archive_" (format-time-string "%Y" (current-time)) "::"))