📓
macOS で org-protocol を設定する
はじめに
今年はSpacemacs + org-mode でタスク管理、メモを取ろうと思っています。
org-protocol と org-catpture を使えばブラウザから素早くメモをとることができるのですが、
設定が大変だったので備忘録として残します。
動いている様子
環境
- macOS 10.15.7
- GNU Emacs 27.1
- Spacemacs developブランチ
設定
Emacs のインストール
brew tap d12frosted/emacs-plus
brew install emacs-plus@27 --with-spacemacs-icon
brew link emacs-plus@27
ln -s /usr/local/opt/emacs-plus@27/Emacs.app /Applications
システム環境設定 → ユーザとグループ → ログイン項目 で Emacs を起動するようにしておく。
EmacsClient.app を作成
- Script Editor を起動
- 下記コードを貼り付け
on emacsclient(input)
do shell script "/usr/local/bin/emacsclient -n -a \"/Applications/Emacs.app/Contents/MacOS/Emacs\" '" & input & "' && open -a Emacs"
end emacsclient
on open location input
emacsclient(input)
end open location
on open inputs
repeat with raw_input in inputs
set input to POSIX path of raw_input
emacsclient(input)
end repeat
end open
on run
do shell script emacsclient("")
tell application "Emacs" to activate
end run
- アプリケーションとして /Applications/EmacsClient.app に保存
- /Applications/Emacsclient.app/Contents/Info.plist を編集、key/string ペアの下に下記コードを追加
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>org-protocol handler</string>
<key>CFBundleURLSchemes</key>
<array>
<string>org-protocol</string>
</array>
</dict>
</array>
- 保存して、Finder で Emacsclient.app を1回起動しておく(関連付けされる?)
Spacemacsの設定
関連しそうなところのみ抜粋
設定場所は自信がないけど、とりあえず動いているのでヨシ
dotspacemacs-configuration-layers '(org)
dotspacemacs-enable-server t
(defun dotspacemacs/user-config ()
(require 'org-protocol)
(with-eval-after-load 'org
(add-to-list 'org-modules 'org-protocol)
(setq org-capture-templates
'(
("t" "Task" entry (file+headline "~/Dropbox/memo/org/gtd.org" "Inbox")
"* TODO %? \nCREATED: %U\n %i")
("T" "Task from protocol" entry (file+headline "~/Dropbox/memo/org/gtd.org" "Inbox")
"* TODO %? [[%:link][%:description]] \nCREATED: %U\n#+BEGIN_QUOTE\n%i\n#+END_QUOTE\n")
("L" "ReadItLater" entry (file+headline "~/Dropbox/memo/org/gtd.org" "ReadItLater")
"* TODO %? [[%:link][%:description]] \nCREATED: %U\n#+BEGIN_QUOTE\n%i\n#+END_QUOTE\n")
("m" "Memo" entry (file+headline org-default-notes-file "Memo")
"* %? %U %i")
("M" "Memo from protocol" entry (file+headline org-default-notes-file "Memo")
"* %? [[%:link][%:description]] \nCaptured On: %U\n#+BEGIN_QUOTE\n%i\n#+END_QUOTE\n")
))
)
)
参考までに、 https://github.com/hushin/dotfiles でファイル管理しています。
動作確認
org-protocol://capture?template=t
を開いて、 Emacsclient.app 経由で Emacs の org-capture が起動することを確認。
ブラウザの設定
- Surfingkeys を使って
ocm
とタイプしたらそのページをメモれるようにした- 関連: Surfingkeysについて昔書いた記事 Surfingkeys で快適ネットサーフィン(後編) - Qiita
// org
const escapeChars = ['(', ')', "'"]
const escapeForOrg = (text) => {
let _text = text
escapeChars.forEach((char) => {
_text = _text.replaceAll(char, escape(char))
})
return _text
}
const getUrl = (path, query) => {
const queryString = Object.entries(query)
.map(
([key, value]) =>
`${encodeURIComponent(key)}=${escapeForOrg(encodeURIComponent(value))}`
)
.join('&')
return [path, queryString].join('?')
}
const orgCapture = (template) => {
const url = getUrl('org-protocol://capture', {
template,
url: window.location.href,
title: document.title.replace(/\|/g, '-'),
body: window.getSelection(),
})
console.log(`orgCapture: ${url}`)
window.location.href = url
}
mapkey('ocm', '#14org-capture memo', () => {
orgCapture('M')
})
mapkey('oct', '#14org-capture todo', () => {
orgCapture('T')
})
mapkey('ocl', '#14org-capture read it later', () => {
orgCapture('L')
})
- 設定するのが面倒な人向け Org Capture Extension
おまけ: 試したこと・参考にしたもの
- Applescript Editor を 使って EmacsClient.app を作るところ
- emacsclient のパス指定が難しかった…
-
org-protocol.el – Intercept calls from emacsclient to trigger custom actions
- 公式ドキュメントに書かれている EmacsClient.app は動かなかった
-
xuchunyang/setup-org-protocol-on-mac: Setting Up org-protocol on Mac
- emacs-plus だと
/Applications/Emacs.app/Contents/MacOS/bin-x86_64-10_14/emacsclient
が存在しなかった -
/usr/local/bin/emacsclient
を指定すると GUI の方で org-protocol が開かなかった(気がする)
- emacs-plus だと
-
sprig/org-capture-extension: A Chrome and firefox extension facilitating org-capture in emacs
- ここにあるスクリプトをベースに、 パスを
/usr/local/bin/emacsclient
にしたら動いた
- ここにあるスクリプトをベースに、 パスを
- How to get org-protocol to work with spacemacs
- Emacs を
emacs-plus
ではなくemacs-mac
(railwaycat/homebrew-emacsmacport: Emacs mac port formulae for the Homebrew package manager ) を使ってみる-
emacs-mac
だと org-protocol には対応するものの、他のキーバインドはemacs-plus
に軍配があがるので諦めた
-
-
Chromeで外部アプリ起動時の確認画面を非表示にする方法 | アシアルブログ
-
defaults write com.google.Chrome ExternalProtocolDialogShowAlwaysOpenCheckbox -bool true
を実行して再起動してみたけど、変わらなかった
-
Discussion
おかげさまでorg-protocolの設定ができました。
M1 Macの場合
/usr/local/bin/emacsclient → /opt/homebrew/bin/emacsclient
と変更することで動作しました。