■ Windows Subsystem for Linux の emacs で利用できる設定


【お知らせ】


<2018/08/28 追記>
Cygwin での locate の利用については、こちらを参照ください。

【本題】


Ubuntu on WSL で locate を利用するための設定です。

Ubuntu の locate には以下で説明されているとおり、2つのパッケージがあります。
デフォルトでは、mlocate がインストールされていますが、mlocate の updatedb は複数の database root パスを指定できないため、使いづらいです。
このため、locate.findutils をインストールします。
$ sudo -E apt install locate
$ sudo update-alternatives --config locate # locate.findutils を有効にする

つぎに、locateを使うためのDBを以下のようなスクリプトを実行して作成します。updatedb のオプションは、適当に修正してください。

~/bin/updatedb.sh
#!/bin/sh

sudo updatedb \
    --localpaths='
/mnt/c/home
/mnt/d/home
/mnt/server/home
' \
    --findoptions='
-type d -name .git -prune -o
-type d -name .svn -prune -o
-path /mnt/c/home/tmp -prune -o
-path /mnt/d/home/tmp -prune
'

findoptions の設定の意味は、次のとおりです。

 一行目:ディレクトリ.git は含めない
 三行目:/mnt/c/home/tmp で始まるパスは含めない

これで、shell から locate <検索文字列> と入力して、検索が可能となります。
emacs からは、M-x locate で実行できます。

locate の検索に時間が掛かる場合は、データベース化するディレクトリの範囲を絞ってください。

検索結果は、dired のように、Enter や f が利用可能ですが、以下の設定を行っておくと、より便利に利用できます。
(require 'locate)

;; ファイルのあるディレクトリを explorer で開く
(define-key locate-mode-map (kbd "E")
  (lambda ()
    (interactive)
    (os-open-command (locate-get-dirname))))

;; ファイルのあるディレクトリを dired で開く
(define-key locate-mode-map (kbd "d")
  (lambda ()
    (interactive)
    (dired (locate-get-dirname))))

;; C-c l で locate を起動する
(global-set-key (kbd "C-c l") 'locate)
※ 上記の設定の os-open-command は、「dired を OS と連携して使うための設定」で紹介したものと同じものを利用しています。
 「dired を OS と連携して使うための設定」で行った W キーや find-file の設定も、locate の検索結果の画面で利用可能です。

locate は helm とも連携できます。
;; locateコマンドのパラメータを指定する
(setq helm-locate-command "locate %s -A --regex %s")
※ helm の設定については、以下を参照してください。


<変更履歴>
  • 2018/08/26 このページを作成した。