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.exeC:\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-wM-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)))
  )


© 神和電子 2017-2023