block_given?

ジャングル ブロック ナイ アルノハ jump ダケ。CC-BY-SA 3.0

モダンなEmacsを求めて (6) Rubyについて

今回のモダンなEmacsを求めてRubyの開発環境について。

rbenv.el

rbenvへの実行パスを通してくれたりする。

package-install rbenv

で入る。

(require 'rbenv)
(global-rbenv-mode)

rbenvを入れた場所の設定も必要。 brewで入れたのならbrew info rbenvで場所がわかる。 echo $RBENV_ROOTでもよい。

(setq rbenv-installation-dir "/usr/local/var/rbenv")

追加しておく。

electric-pair-mode

{と打つと}"と打つと"のように対応する文字を自動で入力する。 Emacs 24からはデフォルトで入っている。有効にする。

(electric-pair-mode t)

ブロック引数の|も自動で閉じてほしいので次のような設定を追加する

(add-to-list 'electric-pair-pairs '(?| . ?|))

electric-indent-mode

括弧を閉じたときなどいい感じでインデントしてくれる。 確認したところ既に有効になっていた。 特に設定していない。

有効になっているモードの確認方法

以下の式を評価すると確認できる。 とじ括弧のところでC-x eしよう。

(describe-mode)

electric-layout-mode

括弧を入力したときいい感じで改行を挿入してくれる。 ただし、以下のような設定が必要に見えた。 このモードtにしていてelectric-layout-rules設定していない人は何に使っているんだろう。

(add-to-list 'electric-layout-rules '(?{ . after))

ruby-block

endに対応する宣言の位置をハイライトしてくれる。 ハイライトの仕方をruby-block-hilight-toggleで設定できる。

(package-install ruby-block)
(require 'ruby-block)
(setq ruby-block-highlight-toggle t)

ruby-end

doclassdefなどに反応して自動でendを入力する。 package.elで入る。

(package-install ruby-end)
(require 'ruby-end)

inf-ruby

M-x inf-rubyirb/pryが起動。 Pryで使う設定はるびきちさんのブログを参考に設定する

(package-install inf-ruby)
(require 'inf-ruby)
(setq inf-ruby-default-implementation "pry")
(setq inf-ruby-eval-binding "Pry.toplevel_binding")
(add-hook 'inf-ruby-mode-hook 'ansi-color-for-comint-mode-on)
  • リージョンを選択してC-c C-rRubyのコードをpryで実行できる。
  • メソッド定義のendの位置でC-c C-xするとpryでメソッド定義を実行できる。

quickrun

SmartCompileとどっちがいいんだろう。

M-x package-install quickrun

する。helmに出ていて欲しいのでdefault-sourcesに追加しておく。

(custom-set-variables
 '(helm-mini-default-sources '(helm-source-buffers-list
                   helm-source-recentf
                   helm-source-buffer-not-found
                   helm-quickrun-source)))

Ruby以外も実行できるのがよさそう。

タグジャンプ

安定のtmm1さんプロダクト、ripper-tagsを使う。

gem installしたときに生成してくれるgem-ripper-tagsも合わせていれる。

プロジェクト内のファイルはguardを使おうと思う。 ~/.guard.rbを用意しておくとすべてのプロジェクトで勝手に読みこまれる。 詳しくはShared configurations · guard/guard Wikiを読んでほしい。

$ gem install guard guard-shell

これでguardは入った。次のような設定でプロジェクト内のファイルを監視する。

~/.guard.rb:

guard :shell do
  watch(%r{^(?:app|lib)/.+\.rb$}) { `ripper-tags -e -R -f TAGS` }
end

プロジェクトにGuardfileが無いとおこられないように~/.Guardfileも追加しておく。

$ touch ~/.Guardfile

あとは$ guardで起動すれば、自動でTAGSが更新される。

rcodetools

$ gem install rcodetools

どこにrcodetoolsが保存されているのか調べてinit-loaderが読める場所に置く

$ gem which ruby_toggle_file
$ cd /usr/local/var/rbenv/versions/2.1.4/lib/ruby/gems/2.1.0/gems/rcodetools-0.8.5.0
$ cp rcodetools.el ~/.emacs.d/inits/01_rcodetools.el

とりあえず便利そうなxmpを呼べるだけの最小限の設定をする。

(require 'rcodetools)
(define-key ruby-mode-map (kbd "C-c x") 'xmp)

もっと便利に使いたくなったらまた検索する。

robe

Dependenciesに書かれているpry/pry-docを入れる。

$ gem install pry pry-doc

packageをいれる

package-install robe

最小限の設定をする

(require 'robe)
(add-hook 'ruby-mode-hook 'robe-mode)

M-x robeまで入れると候補がいくつかでる。 使い方はあとで覚える。 rbenv.elを入れていない場合、rbenvで入れたrubyに入れたpryなどが使えず、エラーが発生する恐れがある。 あとGemfileにpry/pry-docが入っていないときは足しておくこと。

robeの補完を便利に使うためにはhelm-robeもいれる

設定は書かれている通りなのだが

package-install helm-robe

あとは

(require 'helm-robe)
(custom-set-variables '(robe-completing-read-func 'helm-robe-completing-read))

試してみたけどrobeをまず最初に入れるべきだと思った。すごく便利。

C-M-iすると補完が動く。C-M-dで定義が見れる。

まとめ

Emacsは副作用が強い薬みたいなもので、鎮痛剤依存症みたいに処方薬を服用してるつもりが、いつの間にか依存症になったりします。 新しく導入するのは1日1パッケージのみにとどめて30日毎日違うパッケージを服用するとよさそう。 わたしはRubyのためのEmacsの設定を調べるためにRubyを書くのを3日サボった。 用法用量を守って楽しいEmacsライフを。

参考

モダンなEmacsを求めて (5) helmをつかいはじめる

今回のモダンなEmacsを求めては超絶便利インクリメンタルサーチユーザーインターフェイスhelmについて。

前にEmacsを使っていたときはanythingを使っていた。最近はhelmが人気らしいので、helmを使う。

anything/helmがないEmacsとあるEmacsでは別のエディタと思うぐらい便利さが違う。

Helmを参考にすすめる。

導入

(package-install 'helm)で入る。

設定

(require 'helm-config)

これで最小限の設定が完了する。

M-x helm-miniで確認すると、開いているバッファの一覧からインクリメンタルにファイルを検索できることがわかるだろう。 推奨された設定を追加するとキーボードショートカットからHelmのメニューが開ける。

(global-set-key (kbd "C-c h") 'helm-mini)

ただしこのままだと、C− C-bなどでHelmが開いてくれない ドキュメントにあるように以下のような設定を追加すると、EmacsのだいたいのコマンドでHelmが動いてくれるようになる。

(helm-mode 1)

C-x C-bM-xを実行してHelmで絞り込みが出来るのを確認しよう。

まとめ

package-install helmhelmを導入した。 Helmをはじめるのに必要な最小限の設定をした

(require 'helm-config)
(helm-mode 1)
(global-set-key (kbd "C-c h") 'helm-mini)

参考

モダンなEmacsを求めて (4) package.elでインストールしていないパッケージを自動でインストールする

今回のモダンなEmacsを求めては、インストールしたいパッケージをリストに追加すると起動時に自動でインストールされるような仕組みをつくる。

前回、前々回でpackage.elinit-loaderの設定がすんでいるものとする。

全体像

~/.emacs.d/inits/00_packages.elに以下のような感じで書く。my/packagesでインストールしたいパッケージを定義する(この例の場合はruby-end)。定義したパッケージがインストールされていない場合、起動時に自動でインストールされる。

(require 'cl)
(defvar my/packages
  '(ruby-end))
(let ((not-installed (remove-if 'package-installed-p my/packages)))
  (when not-installed
    (package-refresh-contents)
    (dolist (package my/packages)
      (package-install  package))))

インストールしたいパッケージを定義する

(defvar my/packages
  '(ruby-end))

自分が定義した変数に接頭辞としてmy/をつけると、拡張機能の設定や、その他の設定と区別がしやすい。 defvarsetqと違って、初回のみ値を設定する。

(defvar hi 1)
hi
;; => 1
(defvar hi 2)
hi
;; => 1

(setq hola 1)
hola
;; => 1
(setq hola 2)
hola
;; => 2

インストールされていないパッケージを調べる

my/packagesの中から、まだインストールされていないパッケージを調べる。

EmacsLisp doesn’t come with a ‘filter’ function to keep elements that satisfy a conditional and remove elements that do not satisfy it. 

http://www.emacswiki.org/emacs/ElispCookbook#toc39

Elispには、リストの要素を調べ、条件によってフィルタリングするような関数はないらしい。 clremove-ifを使ってフィルタリングする。

フィルタした結果、インストールされていないパッケージがなければ空リスト(偽)になるため、何もしない。

もしもインストールされていないパッケージがある場合、package-refresh-contentsで最新のパッケージの情報を取得した後、mapcでそれぞれインストールする。

(require 'cl)
(let ((not-installed (remove-if 'package-installed-p my/packages)))
  (when not-installed
    (package-refresh-contents)
    (mapc 'package-install my/packages)))

戻り値は必要ないのでdolistしてもいいんだけど、書くことが増えるのでmapcした。

参考

モダンなEmacsを求めて (3) init-loaderで設定ファイルを分割する

今回のモダンなEmacsを求めては設定ファイルの分割管理について。

init-loader.elを使うと、~/.emacs.d/inits以下で分割した設定ファイルを管理できる。 ファイル名ベースで読み込む順番や、環境依存の設定ができるので、モダンなEmacsにはかかせないパッケージです。

前回の設定に追記します。 package.elの初期化が終わった後、package.elの機能を使いinit-loaderをインストールします。

(when (>= emacs-major-version 24)
  (require 'package)
  (add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
  (package-initialize)
  (unless (package-installed-p 'init-loader)
    (package-refresh-contents)
    (package-install 'init-loader))
  (require 'init-loader)
  (init-loader-load)
  )

init-loaderで読み込む順番

init-loaderでは、先頭2桁の文字の順に読み込まれる。

なので、効率よく管理するためには、先頭二桁をどのような役割に振るかが重要。 とりあえずこのような感じで設定しようと思う。

番号 説明
00 package.el等によるパッケージの導入を書く。パッケージを導入するために使う、requireしたり設定するのは別ファイルに書く。
01〜19 Emacs本体に元から備わっている機能に対する設定。
20〜98 Emacs拡張機能に対する設定。このなかでどう割り当てるかは別途考える。
99 キーバインドの設定。パッケージで導入した拡張機能に対してキーを割り当てることもあるので、すべてのEmacs拡張機能が読み込まれた後に実行する。

また、init-loaderによる管理を徹底するため、~/.emacs.d/init.elにはinit-loaderを読み込むための最低限の設定以外、書かない方針でいこうと思います。

くふう: インストールされていない場合のみ、パッケージのリストを更新する

package-refresh-contentsはパッケージのリストをウェブから取得する。

Download the ELPA archive description if needed.
This informs Emacs about the latest versions of all packages, and
makes them available for download.

package-refresh-contentsを毎回呼ぶと起動に時間がかかるので、 package-installed-pinit-loaderがインストールされているか調べ、 インストールされていない場合のみpackage-refresh-contentsを呼び、init-loaderを呼ぶようにした。

モダンなEmacsを求めて (2) モダンなパッケージ管理 package.el を使う

今回のモダンなEmacsを求めてEmacsのパッケージ管理について。

Emacsを便利につかうためカジュアルに機能拡張したい。

最近の、モダンな(バージョン24以降の)Emacsでは、ELPA(Emacs Lisp Package Archive)のためのパッケージ管理システムpackage.elが導入されている。 package.elを使うとELPAやMELPAで公開されているEmacsの便利機能をコマンド一発で手軽に追加できる。

package.elが同梱されていない、Emacs 24以下を使うことは、考えないようにする。

最低限の設定を~/.emacs/init.elに書く。昔は~/.emacsに書いていた。 設定ファイルが読み込まれる順番はFind Init - GNU Emacs Manualに詳しく書かれている。

(when (>= emacs-major-version 24)
  (require 'package)
  (package-initialize)
  (package-refresh-contents))
  )

MELPAも使いたい

package.elでは、デフォルトだとGNUが管理するELPAからしかパッケージをインストールできない。 MELPAを使うために設定を追加する。

Getting Startedに従いpackage-archivesのリストにmelpaを追加する。

(when (>= emacs-major-version 24)
  (require 'package)
  (add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
  (package-initialize)
  (package-refresh-contents))
  )

これでM-x package-installなどすればパッケージが入るようになった。

参考

モダンなEmacsを求めて (1) モダンなEmacsを使う OSX編

今回のモダンなEmacsを求めてはモダンなEmacsの導入方法について。

新しいEmacsでは、パッケージ管理などの便利な機能が使えるらしい。

Mac OX Mavericksにデフォルトで入っているEmacsのバージョンを確認する。

$ /usr/bin/emacs --version
GNU Emacs 22.1.1
Copyright (C) 2007 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.

古い。新しいEmacsbrewで入れる。 新しくインストールする際、GUI(Cocoa版)のEmacsも同時に入れたい。 なぜなら黒い画面以外からも使いたくなることがあるからだ。

そのため、--cocoaオプションをつけてインストールする。

$ brew update
$ brew install emacs --cocoa
$ emacs --version
GNU Emacs 24.4.1
Copyright (C) 2014 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.

新しめのEmacsが入った。

画面でも確認する。以下のコマンドを実行すると、Mac用のアプリがリンクされ、Launchpadに出てくるようになる。

$ brew linkapps

自分でビルドするのが面倒な人はGNU Emacs For Mac OS Xからダウンロードするといい。

モダンなEmacsを求めて

モチベーション

EmacsしてAtomを使っていたが非力なマシンではAtomが重かった。なのでEmacsに出戻る。

目次

モダンなEmacsを求めて調べたことを書いていく。