WSL2のEmacsでorg-modeのリンクをWindows側のEdgeで開く
作成日:
目次
WSL2に入れたEmacsでorg-modeを使う際、そのままだとorg-mode内のWebサイトへのリンクはWSL2内のlynx(テキストブラウザ)で開こうとする。これを、代わりにWindows側のブラウザで開くように設定したい。その方法を記録しておく。
方法
Windows側のEdgeにWSL側でパスを通す
そもそもWSL側からWindows側のEdgeを起動できないと話にならない。もちろんフルパスを入れれば起動できるのだが、簡単にするためにまずはWSL側のパスが通っている場所にEdgeの実行ファイルへのシンボリックリンクをつくる。
msedge.exe
は C:\Program Files (x86)\Microsoft\Edge\Application
にあるので、以下のようにする。シンボリックリンクを作る場所は /usr/local/bin
とする。
sudo ln -s /mnt/c/Program\ Files\ \(x86\)/Microsoft/Edge/Application/msedge.exe /usr/local/bin/msedge
これで、WSL側からWindows側のEdgeを簡単に呼べるようになる。
msedge "yahoo.co.jp"
なお、WSLには wslview
というコマンドがあり、これにURLを渡すことでもWindows側のEdgeで開いてくれるのだが、これをEmacsのブラウザに設定した場合は何故か画面が崩れるという問題が発生した。
Emacsの設定
https://www.emacswiki.org/emacs/BrowseUrl を参考に、init.elに設定を書く。org-modeのリンクについては普通のリンク向けのブラウザ設定だけではだめなようなので注意。
(setq browse-url-browser-function 'browse-url-generic
browse-url-generic-program "msedge")
(defadvice org-open-at-point (around org-open-at-point-choose-browser activate)
(let ((browse-url-browser-function
(cond ((equal (ad-get-arg 0) '(4))
'browse-url-generic)
((equal (ad-get-arg 0) '(16))
'choose-browser)
(t
(lambda (url &optional new)
(browse-url-generic url t)))
)))
おまけ:leaf.elの場合
私は leaf.el を使っているので以下のようにした。C-w
とM-w
のときにWindows側のクリップボードにも渡す設定も書いている。
(leaf wsl-settings
:custom ((browse-url-browser-function . 'browse-url-generic)
(browse-url-generic-program . "msedge"))
:config
;; org-modeで外部ブラウザでリンクを開くようにする設定
(defadvice org-open-at-point (around org-open-at-point-choose-browser activate)
(let ((browse-url-browser-function
(cond ((equal (ad-get-arg 0) '(4))
'browse-url-generic)
((equal (ad-get-arg 0) '(16))
'choose-browser)
(t
(lambda (url &optional new)
(browse-url-generic url t)))
)))
ad-do-it))
(leaf wsl-copy-setting
:doc "コピーしたものをクリップボードに渡す設定"
:init
(defun wsl-copy (start end)
(interactive "r")
(shell-command-on-region start end "clip.exe")
(kill-ring-save start end))
:bind (("M-w" . wsl-copy)))
(leaf wsl-cut-setting
:doc "切り取りしたものをクリップボードに渡す設定"
:init
(defun wsl-cut (start end)
(interactive "r")
(shell-command-on-region start end "clip.exe")
(kill-region start end))
:bind (("C-w" . wsl-cut)))
)