モダンな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
do
やclass
やdef
などに反応して自動でendを入力する。
package.el
で入る。
(package-install ruby-end)
(require 'ruby-end)
inf-ruby
M-x inf-ruby
でirb/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)
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-b
やM-x
を実行してHelmで絞り込みが出来るのを確認しよう。
まとめ
package-install helm
でhelm
を導入した。
Helmをはじめるのに必要な最小限の設定をした
(require 'helm-config) (helm-mode 1) (global-set-key (kbd "C-c h") 'helm-mini)
参考
モダンなEmacsを求めて (4) package.elでインストールしていないパッケージを自動でインストールする
今回のモダンなEmacsを求めては、インストールしたいパッケージをリストに追加すると起動時に自動でインストールされるような仕組みをつくる。
前回、前々回でpackage.el
、init-loader
の設定がすんでいるものとする。
- モダンなEmacsを求めて (3) init-loaderで設定ファイルを分割する - block_given?
- モダンなEmacsを求めて (2) モダンなパッケージ管理 package.el を使う - block_given?
全体像
~/.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/
をつけると、拡張機能の設定や、その他の設定と区別がしやすい。
defvar
はsetq
と違って、初回のみ値を設定する。
(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には、リストの要素を調べ、条件によってフィルタリングするような関数はないらしい。
cl
のremove-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-p
でinit-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.
古い。新しいEmacsをbrewで入れる。 新しくインストールする際、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を求めて調べたことを書いていく。
- モダンなEmacsを求めて (6) Rubyについて - block_given?
- モダンなEmacsを求めて (5) helmをつかいはじめる - block_given?
- モダンなEmacsを求めて (4) package.elでインストールしていないパッケージを自動でインストールする - block_given?
- モダンなEmacsを求めて (3) init-loaderで設定ファイルを分割する - block_given?
- モダンなEmacsを求めて (2) モダンなパッケージ管理 package.el を使う - block_given?
- モダンなEmacsを求めて (1) モダンなEmacsを使う OSX編 - block_given?