■ emacs 全般で利用できる設定


【お知らせ】


<2019/04/03 追記>
helm-occur の require が必要になったようなので、追加しました。

<2018/08/30 追記>
helm で grep を利用した際、helm バッファの表示が乱れる場合があります。その場合は C-c C-u で画面が再描画されます。お試しください。

<2018/08/30 追記>
2015年末に以下のコミットで helm package から helm-do-grep の機能は削除されました。もし、helm-ag より helm-do-grep という方が居りましたら(grep コマンドしか使えないとか)、削除されたコードを復活させることにより helm-do-grep を利用することができます。なお、コードの復活を行わなくとも、<2018/08/29 追記> の方法で同様の機能の利用は可能です。ただし、利用がちょっと面倒です。

<2018/08/29 追記>
helm で grep を行うには、helm-ag を使わなくても helm-find-files の機能で行う方法があります。
本設定でのキーバインドの場合は、以下のとおりとなります。
  • C-x C-f で helm-find-files を起動した後、TAB または C-i でアクションに移動し、grep を選択
  • C-x C-f で helm-find-files を起動した後、C-s でカーソルのある箇所のファイルを検索(ディレクトリも指定可)
  • C-x C-f で helm-find-files を起動した後、C-u C-s でファイル種別を指定して検索

<2018/08/26 追記>
locate コマンドで and 検索ができることが分かったので、helm-locate-command の設定を見直しました。

<2018/08/21 追記>
helm については、以下のページを参照してください。

<2018/05/25 追記>
helm を使っていて、「Wrong type argument: window-live-p, nil」というメッセージが出力される場合の対策を追加しました。

<2016/06/03 追記>
helm-find-files で TAB補完が有効になるように設定しました。

<2016/04/17 追記>
以下の修正を行いました。
  • M-x で動作するコマンドを helm-M-x に変更した。
  • C-x C-f で動作するコマンドを helm-find-files に変更した。
  • helm-show-kill-ring のキーバインドを C-; y から C-; C-y に変更した。
  • find-file と execute-extended-command(M-x)が helm インタフェースを使うようにするために追加していた設定を削除した。

<2015/10/16 追記>
本設定からは外してしまいましたが、helm-swoop が helm-migemo-mode に対応したようです。
https://github.com/ShingoFukuyama/helm-swoop

<2015/10/02 追記>
helm 本体で helm-migemo-mode がサポートされたので、helm-migemo の設定箇所を削除しました。この対応で、helm-occur で migemo が利用できるようになっています。
http://qiita.com/ballforest/items/4db3d66df16d84a027d0
http://syohex.hatenablog.com/entry/2015/10/10/171926

【本題】



以下、helm を使うための設定(例)です。
(require 'helm-config)
(require 'helm-descbinds)
(require 'helm-occur)
(require 'helm-ag)

(helm-mode 1)
(helm-migemo-mode 1)

;; 画面更新するまでのタイムラグを設定する(デフォルトは 0.01)
(setq helm-input-idle-delay 0.2)

;; 表示する最大候補数を指定する(デフォルトで 100)
;; (setq helm-candidate-number-limit 500)

;; locateコマンドのパラメータを指定する
;; デフォルト値に設定してある -e オプションは性能がでないので削除している
(setq helm-locate-command "locate %s -A --regex %s")

;; tramp で remote-directory を開いているときに、helm-for-files を起動すると反応が悪い
;; 原因は helm-source-files-in-current-dir だったので、この情報源の指定を削除する
;; また、一部表示順を変更する
(setq helm-for-files-preferred-list
      '(helm-source-buffers-list
        helm-source-bookmarks
        helm-source-recentf
        helm-source-file-cache
        ;; helm-source-files-in-current-dir
        helm-source-locate))

;; 候補表示画面で改行しないようにする
;; (setq helm-truncate-lines t)

;; helm-source-buffers-list を詳細に表示しない
(setq helm-buffer-details-flag nil)

;; helm-source-buffers-list でバッファ名を表示する幅を調整する
(setq helm-buffer-max-length 50)

;; helm-follow-mode (C-c C-f で ON/OFF)の前回の状態を維持する
(setq helm-follow-mode-persistent t)

;; ミニバッファで C-k 入力時にカーソル以降を削除する(C-u C-k でも同様の動きをする)
(setq helm-delete-minibuffer-contents-from-point t)

;; 自動補完を無効にする
(setq helm-ff-auto-update-initial-value nil)

;; helm-ag で利用する ag コマンドの追加オプションを設定する
;; (setq helm-ag-command-option "")

;; helm-ag でカーソル位置のシンボルを初期検索文字列とする
;; (setq helm-ag-insert-at-point 'symbol)

;; C-h でバックスペースと同じように文字を削除できるようにする
;; (define-key helm-read-file-map (kbd "C-h") 'delete-backward-char)

;; TAB で補完する
;; (補完は C-j できるので、helm-select-action の利用を考えれば設定しない方がよいかもしれない)
(define-key helm-read-file-map (kbd "<tab>") 'helm-execute-persistent-action)
(define-key helm-find-files-map (kbd "<tab>") 'helm-execute-persistent-action)

;; C-o は IME変換用として使っているので、helm-next-source を C-l に変更する
(define-key helm-map (kbd "C-o") nil)
(define-key helm-map (kbd "C-l") 'helm-next-source)

;; http://d.hatena.ne.jp/sugyan/20120104/1325604433
;; プレフィックスキーを C-; に設定する
(custom-set-variables '(helm-command-prefix-key "C-;"))

;; キーバインドを設定する。コマンド起動後は、以下のキーが利用可能となる
;;  ・M-n     :カーソル位置の単語を検索パターンに追加
;;  ・C-z     :チラ見
;;  ・C-c C-f :helm-follow-mode の ON/OFF
(global-set-key (kbd "M-x")     'helm-M-x)
(define-key ctl-x-map (kbd "C-b") 'helm-for-files)
(define-key ctl-x-map (kbd "C-;") 'helm-for-files)
(define-key ctl-x-map (kbd "C-f") 'helm-find-files)
(define-key helm-command-map (kbd "C-;") 'helm-resume) ; C-u 付で起動すると、復元バッファを指定できる
(define-key helm-command-map (kbd "C-y") 'helm-show-kill-ring)
(define-key helm-command-map (kbd "o")   'helm-occur)
(define-key helm-command-map (kbd "C-s") 'helm-occur-from-isearch)
(define-key helm-command-map (kbd "C-g") 'helm-ag)
(define-key helm-command-map (kbd "M-g") 'helm-do-ag) ; C-u 付で起動すると、ファイルパターンを指定できる

;; helm-occurコマンドの起動時に helm--maybe-use-default-as-input(helmコマンドに :input パラメータが
;; 指定されていなければ、:default の値を使って表示を更新する)を設定する
(advice-add 'helm-occur
            :around (lambda (orig-fun &rest args)
                      (let ((helm--maybe-use-default-as-input t))
                        (apply orig-fun args))))

;; 情報源の設定を調整する
;; ・follow                 : helm 起動時点から helm-follow-mode を ON にする
;; ・requires-pattern       : 検索必要最低文字数を設定する
;; ・candidate-number-limit : 表示最大候補数を設定する

(defun helm-before-initialize-setup ()
  (helm-aif helm-source-locate
      (progn
        (helm-attrset 'requires-pattern 2 it)
        (helm-attrset 'candidate-number-limit 1000 it)
        ))
  (helm-aif helm-source-occur
      (progn
        (helm-attrset 'follow 1 it)
        ))
  (helm-aif helm-source-grep
      (progn
        (helm-attrset 'follow 1 it)
        (helm-attrset 'requires-pattern 2 it)
        (helm-attrset 'candidate-number-limit 1000 it)
        ))
  (helm-aif helm-source-grep-ag
      (progn
        (helm-attrset 'follow 1 it)
        (helm-attrset 'requires-pattern 2 it)
        (helm-attrset 'candidate-number-limit 1000 it)
        ))
  (helm-aif helm-ag-source ; for helm-ag package
      (progn
        (helm-attrset 'follow 1 it)
        (helm-attrset 'candidate-number-limit 1000 it)
        ))
  (helm-aif helm-source-do-ag ; for helm-ag package
      (progn
        (helm-attrset 'follow 1 it)
        (helm-attrset 'requires-pattern 2 it)
        (helm-attrset 'candidate-number-limit 1000 it)
        ))
  )

(add-hook 'helm-before-initialize-hook 'helm-before-initialize-setup)

NTEmacs を使っている場合は、以下も設定すると良いようです。
(require 'cl-lib)

;; w32-ime-buffer-switch-p を t にして helm を利用する場合に、ミニバッファで漢字を正常に
;; 使えるようにする対策(この設定がないと、ime が勝手に切り替わったりする)
(setq w32-ime-buffer-switch-p t)
(advice-add 'helm
            :around (lambda (orig-fun &rest args)
                      (let ((select-window-functions nil))
                        (apply orig-fun args))))

;; UNC や Tramp のパスに対して、helm-reduce-file-name が正しく機能しないことの対策
;; ( (helm-mode 1) として dired を動かした際に C-l(helm-find-files-up-one-level)
;;  が正しく機能するようにする対策)
(advice-add 'helm-reduce-file-name
            :override (lambda (&rest args)
                        (let ((fname (nth 0 args))
                              (level (nth 1 args)))
                          (while (> level 0)
                            (setq fname (expand-file-name (concat fname "/../")))
                            (setq level (1- level)))
                          fname)))

;; ffap を使っていて find-file-at-point を起動した場合に、カーソル位置の UNC が正しく
;; 取り込まれないことの対策
(advice-add 'helm-completing-read-default-1
            :around (lambda (orig-fun &rest args)
                      (when (listp (nth 4 args))
                        (setf (nth 4 args) (car (nth 4 args))))
                      (cl-letf (((symbol-function 'regexp-quote)
                                 (symbol-function 'identity)))
                        (apply orig-fun args))))

以下の設定は既に不要のものと思われます。一応、設定は残しておきます。
;; w32-symlinks を使っている場合に C-u 付きで helm-do-grep を起動すると、選択したファイルを
;; no conversion で開いてしまうことの対策
(advice-add 'find-file
            :around (lambda (orig-fun &rest args)
                      (let ((current-prefix-arg nil))
                        (apply orig-fun args))))

以下の設定は locate で and 検索(-A オプション)ができないと思っていたときに作成したものです。
ファイル名が並んだファイルを検索する場合には現在でも使えると思います。一応、設定は残しておきます。
;; helm-source-locate でワードの and 検索ができるようにする
;; ・locate を使えない場合は、「locate ''」の部分を「cat /tmp/all.filelist」に置き換えてください。
;;  そして、find 等を使って /tmp/all.filelist(ファイル名が並んだファイル)を作成してください。
;; ・helm の検索パターン入力ルールに従い、2つのスペースの並びを一つのスペースとして認識して検索
;;  します。また、「!検索パターン」(マッチしない)を指定可能です。
(setq helm-locate-command
      ;; (concat "locate_case=$(echo '%s' | sed 's/-//'); locate '' |"
      (concat "locate_case=$(echo '%s' | sed 's/-//'); cat /tmp/all.filelist |"
              "perl -ne \"$(echo '%s' |"
                           "sed -r -e 's/[\\\\ ] /__SpAcE__/g' "
                                  "-e 's/^ +//' "
                                  "-e 's/ +$//' "
                                  "-e 's_/_\\\\&_g' "
                                  "-e 's_ +_/'$locate_case' \\&\\& m/_g' "
                                  "-e 's_.*_$| = 1; print if (m/&/'$locate_case')_' "
                                  "-e 's_m/!_!m/_g' "
                                  "-e 's/__SpAcE__/ /g')\""))

helm を使っていると、次のメッセージが出力され、バッファ間の移動ができなくなる場合があります。
注)2018/09/08 時点で確認したところでは、現在の helm でこのメッセージは出なくなっているようです。
error in process sentinel: Wrong type argument: window-live-p, nil
その場合は、以下の設定をお試しください。
(advice-add 'select-window
            :around
            (lambda (orig-fun &rest args)
              (when (nth 0 args)
                (apply orig-fun args))))


<変更履歴>
  • 2013/07/06 recentf に登録された remote-file を helm から開けない問題の対策を追加した。
  • 2013/07/07 ミニバッファで漢字を使えるようにするための設定を追加した。
  • 2013/07/09 helm のコマンドで migemo を有効にする方法を見直した。
  • 2013/07/10 helm-occur(helm-c-occur ではない)系のコマンドが動かないことの対策を追加した。
  • 2013/07/10 キーバインドの追加、変更を行った。
  • 2013/07/12 helm の挙動を変える複数の変数の設定を追加した。
  • 2013/07/15 helm と elscreen を共存させるための設定を追加した。
  • 2013/07/16 helm と w32-symlinks を共存させるための設定を追加した。
  • 2013/07/17 helm-delete-minibuffer-contents-from-point の設定をすると action が表示されなくなることの対策を追加した。
  • 2013/07/24 UNC や Tramp のパスに対して、helm-reduce-file-name が正しく機能しないことの対策を追加した。
  • 2013/07/29 ffap が helm とうまく連携できていないことを対策した。
  • 2013/08/04 helm-source-locate でワードの and 検索ができるようにした。
  • 2013/08/22 helm package のバージョンアップで helm-occur が動くようになったので対策をコメント化した。
  • 2013/08/27 helm-occur 利用時に migemo マッチした箇所のハイライトに対応した。
  • 2013/08/30 ffap を使う場合の対策の方法を見直した。
  • 2013/09/10 helm-do-grep の case sensitive を切り替えられるようにオプションを追加した。
  • 2013/10/03 helm の 2013/9月末の改修で発生するようになった、dired のパス指定時に先頭が // で始まる UNCパスを入力すると rootパスの再指定と間違って認識されることの対策を追加した。
  • 2013/11/15 NTEmacs 依存とそうでない設定を分割した。
  • 2013/11/16 最新の helm で不要となった設定があったので、コメント化した。
  • 2013/11/16 helm で locate や grep を使うための情報源の表示件数を絞り(500件)、検索を高速化した。
  • 2014/04/18 helm-locate-command に渡るパラメータの作り方が変わったようなので(ワード区切りのスペースが「.*」に置き換えられている箇所がある)、その対策をした。
  • 2014/04/24 上記の対策に不具合があったので修正した。
  • 2014/11/12 all.filelist の利用についてのコメントを追記した。(機能に変更はなし。)
  • 2014/11/29 helm-locate-command の設定の見直しを行った。また、mozc を使う場合に mozc-candidate-dispatch の defadvice の適用が必要である旨のコメントを追記した。
  • 2014/12/01 helm-locate で、「!検索パターン」(マッチしない)が意味を成すように対応した。
  • 2014/12/02 helm-locate-command の設定の見直しを行った。
  • 2014/12/03 helm-locate-command の設定の箇所にコメントを追加した。(機能に変更はなし。)
  • 2014/12/04 helm-locate の検索で、helm の検索パターン入力ルールに従い2つのスペースの並びを一つのスペースとして認識して検索するようにした。
  • 2014/12/26 helm-swoop の機能を追加した。
  • 2015/04/01 helm のバージョンが上がり、いくつか意味のなくなった設定があったので削除した。
  • 2015/05/28 helm の最新バージョンでは、 helm-maybe-use-default-as-input変数 が helm--maybe-use-default-as-input という名前(-が一つ追加)に変更となった。この調整を行った。
  • 2015/09/01 helm をバージョンアップしたところ、helm-swoop と helm-occur が正常に動かなくなった。helm-migemo が原因であることが分かったので、関連箇所を削除またはコメント化した。
  • 2015/09/02 gnupack-11.00 の emacs バージョン 24.2 をサポートする記載を削除しました。
  • 2015/09/07 「ミニバッファに漢字を出す設定(MS-IME を使っている場合)」の設定が不要となったようなので削除した。
  • 2015/09/10 rubikichi 氏により、helm-migemo の対策が行われていたので、helm-migemo を復活させた。
  • 2015/09/10 advice を emacs-24.4 以降の書式に見直した。
  • 2015/09/15 2015/09/07 に削除した「ミニバッファに漢字を出す設定(MS-IME を使っている場合)」が実は必要な設定だったので復活した。
  • 2015/09/20 helm の advice の設定で、w32-ime-composition-window を (minibuffer-window) に設定(let)するのは不要になっていたようなので削除した。
  • 2015/10/07 helm-swoop が helm-migemo-mode に対応していないことと、本ページの設定を helm の基本機能のみにすることとしたことから、helm-swoop と helm-gtags の設定を削除した。
  • 2016/02/02 find-file と execute-extended-command(M-x)が helmインタフェースを使わないようになったので、使うように設定を変更した。
  • 2016/04/17 キーバインドに関する設定の見直しを行った。
  • 2016/04/17 helm-do-grep のキーバインド設定箇所をコメント化した。
  • 2016/04/28 ctl-x プレフィックスのキー設定の方法を見直した。
  • 2016/06/03 helm-find-files で TAB補完が有効になるように設定した。
  • 2018/05/25 helm を使っていて、「Wrong type argument: window-live-p, nil」というメッセージが出力される場合の対策を追加した。
  • 2018/08/26 locate コマンドで and 検索ができることが分かったので、helm-locate-command の設定を見直した。
  • 2018/08/30 helm-idle-delay 変数は廃止となっていたようなので、設定を削除した。
  • 2019/04/03 helm-occur の require が必要になったようなので、追加した。