$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

自分が入れたEmacs便利拡張・設定集 (2013年版)

年末emacs設定大掃除をして、これは捨てられないと思った設定書いてく - $shibayu36->blog;

昨年に引き続き、2013年の自分のemacs.dを振り返るのをやろうと思います。

今年はemacsでいろいろできるようにする、という方向よりも、emacsでの基本操作をどれだけ使いやすく出来るかということを中心にやって来ました。例えば

  • .emacs.dの管理をどうするか
  • コードリーディングや編集を速くするにはどうするか
  • gitとの連携をどうやって簡単にするか

この辺りについて1つずつまとめて行きたいと思います。

.emacs.dを管理する

.emacs.dの管理って難しいですよね。僕も関西Emacsに参加してから自分が最新のやり方についていけてないなと感じたので、今年はいろいろと見なおしてみました。

基本的なやり方としてはこんなかんじです。

  • 外部elispはpackage.elとel-getで管理
    • MELPAに存在するelispはpackage.elで管理する
    • 存在しないものはel-getのrecipeを自分で書いて、el-getで管理する
  • 自分用elispはこれまでどおりinit-loaderで管理
    • 公開していいものはgithubに管理
    • 公開しにくいものはDropboxに入れて読み込み

最近の自分のemacs.dの管理の詳しい方法については、 自分流の .emacs管理 - $shibayu36->blog; で書いています。またpackage.el + el-getの同時利用に関しては elispをpackageとel-get両方で管理する - $shibayu36->blog; を参照してください。

コードリーディングや編集を速くする

次はどうやってEmacsの編集操作を速く簡単にするかについてです。今年導入したのは以下の様なelispです

  • multiple-cursors, expand-region, smartrep
  • anzu
  • highlight-symbol, auto-highlight-symbol
  • anything-git-files
  • 選択範囲からisearch + helm-occur
  • flycheck

multiple-cursors, expand-region, smartrep

今年編集操作の中で一番自分の中でヒットしたのは、multiple-cusors, expand-region, smartrepのコンボ操作です。expand-regionでパパっとregionを広げて、multiple-cursors(とsmartphrepを組み合わせて)で同じ単語をさくっと選択し、編集するという感じですね。

expand-regionの紹介はexpand-region.elの紹介 - syohex’s diaryが分かりやすいです。

multiple-cursorsのヤバさは以下の動画が分かりやすいと思います。

設定例
(require 'expand-region)
(require 'multiple-cursors)
(require 'smartrep)

(global-set-key (kbd "C-,") 'er/expand-region)
(global-set-key (kbd "C-M-,") 'er/contract-region)

(global-set-key (kbd "<C-M-return>") 'mc/edit-lines)
(smartrep-define-key
 global-map "C-." '(("C-n" . 'mc/mark-next-like-this)
                    ("C-p" . 'mc/mark-previous-like-this)
                    ("*"   . 'mc/mark-all-like-this)))
同じ単語の一斉置換

expand-regionで単語選択をして、バッファ内のその単語をmultiple-cursorsで置換する例。

ここまではまだ置換でいいじゃんって感じですね。

ある単語にprefixを付ける

次は特定の単語にprefixをつけてみます。

これをやろうとすると置換だと結構めんどくなってきますね。

あと逆にprefix消すのも簡単です。

複数行の最後に特定文字を付ける

たまにやるやつです。もう置換だとできないです。

いろいろ便利ですね。

highlight-symbol, auto-highlight-symbol

これはコードリーディングを速くする系です。結構便利に使ってます。

  • auto-highlight-symbol : 現在位置のsymbolを自動でハイライトする
  • highlight-symbol : 現在位置のsymbolのハイライトをtoggleする

詳しくはEmacsでのテキストハイライトの話 - $shibayu36->blog;に書いてありますが、以下の様なことが出来ます。

自動でハイライトの例。

ハイライトをtoggleする例。

設定
(require 'auto-highlight-symbol-config)

(require 'highlight-symbol)
(setq highlight-symbol-colors '("DarkOrange" "DodgerBlue1" "DeepPink1")) ;; 使いたい色を設定、repeatしてくれる

;; 適宜keybindの設定
(global-set-key (kbd "<f3>") 'highlight-symbol-at-point)
(global-set-key (kbd "M-<f3>") 'highlight-symbol-remove-all)

anzu

anzuというのはid:syohexさんが作った、検索や置換を分かりやすくするやつです。

manga_osyoさんの vim-anzuを Emacs向けに portしたもので,Google Chromeの検索のように, 検索文字列が現在のバッファでいくつマッチするのかという情報と現在の位置をモードラインに表示するマイナーモードを提供します.

詳しくはanzu.elの紹介 - Qiitaにいろいろ書いてあります。

デモもこのURLから参照。

できることとして

  • 検索中に現在位置が何番目のwordか知る
  • 置換結果をpreviewしながら置換できる
    • もちろん$1とか使っても出来る

設定も簡単です。

(require 'anzu)

(global-anzu-mode +1)
(setq anzu-use-migemo t)
(setq anzu-search-threshold 1000)
(setq anzu-minimum-input-length 3)

(global-set-key (kbd "C-c r") 'anzu-query-replace)
(global-set-key (kbd "C-c R") 'anzu-query-replace-regexp)

anything-git-files

これはファイル選択を速くするための設定ですね。

anything-git-filesは現在開いているファイルが所属するgit repositoryのファイルをanythingで絞り込んで表示できるやつです。これはanything-git-project.elを少し手直ししてみた - $shibayu36->blog;でやっていたanything-git-project.elを、id:taraoさんがさらに良くしたものです。

やれることは

  • 現在のrepositoryのファイルを絞り込んで開くことが出来る
  • submoduleも表示可能
  • 速い

インストール方法や設定などはanythingでgitリポジトリ内のファイルの全列挙をきちんとやる - 貳佰伍拾陸夜日記にて解説されているので、そちらを参照してください。

選択範囲からisearch + helm-occur

バッファ内検索を良くするやつです。選択範囲のwordを初めから入れた状態で検索し、さらにhelm-occurでバッファ内のマッチ一覧を出したりしてくれます。

これもexpand-regionとかと連携すると便利ですね。

設定

選択範囲をisearchしてくれる設定。

;;; 選択範囲をisearch
(defadvice isearch-mode (around isearch-mode-default-string (forward &optional regexp op-fun recursive-edit word-p) activate)
  (if (and transient-mark-mode mark-active (not (eq (mark) (point))))
      (progn
        (isearch-update-ring (buffer-substring-no-properties (mark) (point)))
        (deactivate-mark)
        ad-do-it
        (if (not forward)
            (isearch-repeat-backward)
          (goto-char (mark))
          (isearch-repeat-forward)))
    ad-do-it))

検索wordをhelm-occurで一覧化してくれる設定。isearchの時にC-oを押すと一覧が出る。

(require 'helm)
(require 'helm-config)

(define-key isearch-mode-map (kbd "C-o") 'helm-occur-from-isearch)

gitとの連携

最近はほとんどのプロジェクトをgitで扱っているので、その連携を強めることで開発速度を上げることが出来ます。なので、その辺の拡張も導入したりしました。

helm-open-github

helm-open-githubid:syohexさんが作ったemacsからgithubの該当するページをopenしてくれるやつです。GitHubでの仕事を快適にするコマンドを紹介します - $shibayu36->blog;に書いてある内容をさらに進化してもらえて、かなり便利なツールになっています。詳しくはGitHub - emacsorphanage/helm-open-github: Utilities for opening github pageをどうぞ。

設定

requireしてkeybind決めるだけです。

(require 'helm-open-github)
(global-set-key (kbd "C-c o f") 'helm-open-github-from-file)
(global-set-key (kbd "C-c o c") 'helm-open-github-from-commit)
(global-set-key (kbd "C-c o i") 'helm-open-github-from-issues)
デモ

commit選択してgithubを開く

特定のファイルの行範囲を指定してgithubを開く

便利ですね。

git-gutter

こちらは現在Gitとして変更されている行を色表示したりするやつです。git-gutterとgit-gutter-fringeがあって、僕はfringeの方を使ってます。

https://github.com/syohex/emacs-git-gutter-fringeスクリーンショット

設定も以下のようにしておくだけで簡単です。

(require 'git-gutter-fringe)
(global-git-gutter-mode)

詳しくはhttps://github.com/syohex/emacs-git-gutterhttps://github.com/syohex/emacs-git-gutter-fringeをどうぞ。

その他基本設定

exec-path-from-shell

環境変数の引き継ぎみたいなのはemacsにとって非常に難しい問題です。去年まではshellenv.el(http://d.hatena.ne.jp/syohex/20111117/1321503477)を使っていたのですが、今年からはexec-path-from-shellを使うほうが良いです。設定も簡単です。

これでPATHとかGEM_PATHとかがシェルから引き継がれてちゃんと設定されるようになる。

(require 'exec-path-from-shell)
(let ((envs '("PATH" "GEM_PATH" "GEM_HOME" "GOPATH")))
  (exec-path-from-shell-copy-envs envs))

まとめ

さて役に立ちそうな拡張や設定はありましたでしょうか?たまには自分の設定を見なおしてみるのも良いですね。今年はまだ拡張を入れるくらいしか出来なかったので、来年は可能なら自分でもっと拡張を作ってみたいです。