tasuwo blog

Emacsについて 02

| Comments

研究会とか諸々で忙しかったため,久しぶりの更新.Emacsの設定をしたので自分用にメモ.
やったことは…

  • 基本設定
  • Caskを導入してのパッケージ管理

1. インストール

emacsのインストール.前回やった.
homebrewでemacsをインストールしたため,インストール先は/usr/local/Cellarにある.Emacs.appをAppフォルダに移動しておく.

2. ディレクトリ構成

まず,ホームディレクトリがどこか確認する.Emacsを立ち上げてC-x C-f~/を指定すれば分かる.

ホームディレクトリに,設定を保存するための.emacs.dフォルダを作成する(自動生成されている場合もある).下記のサイトを参考にすると.

Emacs の基本設定

Emacs22以降は,~/.emacs.d/以下に設定ファイル群をまとめておくと便利だそう.このサイトはいろいろ作っているけど,よくわからないので最低限のものだけ作成する.とりあえず,initsフォルダとinit.elファイルを作成する.それぞれの役割は以下.

  • init.el
    • Emacsの初期化ファイル
    • ウインドウの大きさ,フォントの種類とか
    • elispパッケージの読み込みとか
  • inits
    • 各種設定ファイルをおく
    • init-loaderの項で説明する

3. 設定を書く

下記サイトをとりあえず参考に.

うわっ…私のEmacs、使いにくすぎ?だったら…カスタマイズシヤッセー!!ダァダァシエリイェッスッシェーショーヘイヘイ!!!

3.1 load-pathの設定

いろいろなライブラリを利用できた方が便利だ.EmacsのライブラリはEmacs Lispで記述されており,拡張子は.elである.M-x load-libraryを実行すると,load-pathに存在するライブラリが読み込まれる.
よって,このload parhを設定しておく必要がある.load pathは変数load-pathとして定義されているため,これを書き換えればよい.
初期化ファイルであるinit.elに,以下を追記する.

1
2
3
4
5
6
7
8
9
10
11
12
;; load-pathの追加関数
(defun add-to-load-path (&rest paths)
  (let (path)
    (dolist (path paths paths)
      (let ((default-directory (expand-file-name (concat user-emacs-directory path))))
        (add-to-list 'load-path default-directory)
        (if (fboundp 'normal-top-level-add-subdirs-to-load-path)
            (normal-top-level-add-subdirs-to-load-path))))))

;; load-pathに追加するフォルダ
;; 2つ以上フォルダを指定する場合の引数 => (add-to-load-path "elisp" "xxx" "xxx")
(add-to-load-path "elisp")

やり方はいろいろあると思うけど,関数として定義しておけば,追加が楽だ.

3.2 全体的な設定

途中フォントの設定があるが,Emacsで使用可能なフォント一覧は(font-family-list)をscratchバッファ実行すれば良い.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
;; 文字コード
;; WindowsとMacでわける
(set-language-environment "Japanese")
(let ((ws window-system))
  (cond ((eq ws 'w32)
         (prefer-coding-system 'utf-8-unix)
         (set-default-coding-systems 'utf-8-unix)
         (setq file-name-coding-system 'sjis)
         (setq locale-coding-system 'utf-8))
        ((eq ws 'ns)
         (require 'ucs-normalize)
         (prefer-coding-system 'utf-8-hfs)
         (setq file-name-coding-system 'utf-8-hfs)
         (setq locale-coding-system 'utf-8-hfs))))

;; Windowsで英数と日本語にMeiryoを指定
;; Macで英数と日本語にRictyを指定
(let ((ws window-system))
  (cond ((eq ws 'w32)
         (set-face-attribute 'default nil
                             :family "Meiryo"  ;; 英数
                             :height 100)
         (set-fontset-font nil 'japanese-jisx0208 (font-spec :family "Meiryo")))  ;; 日本語
        ((eq ws 'ns)
         (set-face-attribute 'default nil
                             :family "Ricty"  ;; 英数
                             :height 140)
         (set-fontset-font nil 'japanese-jisx0208 (font-spec :family "Ricty")))))  ;; 日本語

;; スタートアップ非表示
(setq inhibit-startup-screen t)

;; scratchの初期メッセージ消去
(setq initial-scratch-message "")

;; ツールバー非表示
(tool-bar-mode -1)

;; メニューバーを非表示
(menu-bar-mode -1)

;; スクロールバー非表示
(set-scroll-bar-mode nil)

;; 行番号表示
(global-linum-mode t)
(set-face-attribute 'linum nil
                    :foreground "#800"
                    :height 0.9)

;; タイトルバーにファイルのフルパス表示
(setq frame-title-format
      (format "%%f - Emacs@%s" (system-name)))

;; 選択領域の色
(set-face-background 'region "#555")

;; 行末の空白を強調表示
(setq-default show-trailing-whitespace t)
(set-face-background 'trailing-whitespace "#b14770")

;; タブをスペースで扱う
(setq-default indent-tabs-mode nil)

;; タブ幅
(custom-set-variables '(tab-width 4))

;; 行間
(setq-default line-spacing 0)

;; 1行ずつスクロール
(setq scroll-conservatively 35
      scroll-margin 0
      scroll-step 1)
(setq comint-scroll-show-maximum-output t) ;; shell-mode

;; フレームの透明度
(set-frame-parameter (selected-frame) 'alpha '(0.85))

;; モードラインに行番号表示
(line-number-mode t)

;; モードラインに列番号表示
(column-number-mode t)

;; yes or noをy or n
(fset 'yes-or-no-p 'y-or-n-p)

3.3 追記

上記のような設定をinit.elにだらだらと書いたら,init-loaderなるものを見つけたので,後述する.また,init.elに設定を追記したものの,ちゃんと機能しているかが不安というときは,式の後ろでC-x C-eを実行するとlisp式を評価できるので,これで確認すると良い.

4. パッケージ管理

Emacsのパッケージ管理が必要となるが,どうやらいろいろあるようだ.

  • package.elを使う
  • Cask,Palletを使う

後者の方が便利らしい.よくわからないのでとりあえずどちらも見ておく.

4.1 package.el

Emacsのパッケージは,リポジトリにまとまって公開されている.

  • GNU ELPA
    • 公式のリポジトリ
    • デフォルトではこれのみ利用可能
  • MELPA
    • 非公式のリポジトリ
    • リポジトリに変更があるたびに更新されるため,最新版をインストール可能

上記のようなリポジトリを登録したのちに,インストールしたいパッケージを指定する,という流れになる.リポジトリ情報はpackage-archives変数に格納されているので,新規に追加する場合はこれをいじる.以下が設定例.

1
2
3
4
5
6
7
(require 'package)

;; MELPAを追加
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/"))

;; 初期化
(package-initialize)

指定したパッケージをインストールするには,M-x package-installを実行する.更新はM-x package-refresh-contents

以上がパッケージをインストールする流れになるが,環境が変わった際にいちいちパッケージをインストールしなおすのは面倒.そこで,package.elにインストールすべきパッケージを記載しておき,これを実行すれば同様の環境が構築できるようにしておく.

(package-installed-p package-name)package-nameがインストール済みかどうか確認できるため,これがnilを返すようなパッケージについてインストールすれば,同様の環境が構築できる.package.elに必要なパッケージを記述し(例は省略),M-x eval-bufferを実行することでパッケージ群をインストールできる.便利.

package.el - Emacs JP

4.2 Cask

package.elは便利だなーと思ったけれど,最近だとCaskなるものを使うらしい.Caskは,ざっくりいうとパッケージ管理システム.パッケージの依存関係をみながらライブラリを管理してくれる,のかな?

package.elもライブラリの依存関係を考慮して必要ライブラリを一括でダウンロードできるが,個人の設定であるため~./emacs.dにダウンロードするのが前提.
よって,ライブラリ開発で利用するのには向かない.Caskは Cask ファイルに依存しているライブラリを記述することで,一括ダウンロードやPATHload-pathの調整をしてくれる.

4.2.1 Caskのインストール

1
$ brew install cask

4.2.2 Caskファイルの初期化

~/.emacs.d(設定ファイルが置かれた場所)でcask init
Caskというファイルができるため,今後このファイルでパッケージを管理する.
本ファイルには,すでにCaskオススメのパッケージが依存関係として記述されているので,これを好みに記述し直していけば良い.

4.2.3 Caskファイルの記述

source

パッケージリポジトリを指定する.
現状,gnu, melpa, marmalade, SC, orgが指定可能.

1
2
(source gnu)
(source melpa)

depends-on

インストールするパッケージをいろいろ書いていく.指定方法は以下が可能.

1
2
3
4
5
6
(depends-on "magit")
(depends-on "magit" "0.8.1")
(depends-on "magit" :git "https://github.com/magit/magit.git")
(depends-on "magit" :git "https://github.com/magit/magit.git" :ref "7j3bj4d")
(depends-on "magit" :git "https://github.com/magit/magit.git" :branch "next")
(depends-on "magit" :git "https://github.com/magit/magit.git" :files ("*.el" (:exclude "magit-svn.el")))

4.2.4 ライブラリのインストール

Caskに記述されたライブラリがインストールされる.

1
$ cask install

4.2.5 インストールされたパッケージにパスを通す

cask.elをロードし,cask-initializeを呼ぶ.こうすることで,load-path,autoloadの設定を読み込んでくれる.
init.elに以下を記述.

1
2
3
4
5
6
7
;; homebrewで導入したtool用のpathを追加
(add-to-list 'load-path "/usr/local/share/emacs/site-lisp")

;; ------------------------------------------------------------------------
;; @ Cask設定
(require 'cask "cask.el")
(cask-initialize)

4.2.6 おまけ

とりあえず初期設定のままでパッケージをインストールした.暇なときに以下のサイトを見たりしておく.

Cask init して入ってくるライブラリ一覧 - 亀岡的プログラマ日記

Cask
Cask とは何であるのか、および init.el が非常にシンプルになった件
Emacs Lispのテスト、依存性管理、CI
package.elから Caskに切り替えました

5. init-loaderによる設定ファイルの分割

init-loaderは,指定したディレクトリ内のelファイルを読み込んでくれるelisp.それだけではなく,ファイル名を見て環境に合わせて読み込んでくれたり,エラーのあるファイルをスルーしてくれたりする.他にも,環境依存な設定を分離できたりするので便利.

5.1 init-loaderインストール

Caskを導入したので,利用してパッケージをいれる.Caskファイルにinit-loaderを追加.

1
(depends-on "init-loader")

インストール

1
$ cask install

アップデート

1
$ cask update

5.2 設定ファイル記述

initsフォルダの中に設定ファイルを書いていく.ファイルは以下の設定に従って作成していく.

  • 環境に依存しない設定はファイル名の最初に2けたの数字をつける
    • 番号は優先度.00が最初,99が最後に読み込まれる
    • 同じ数字も可
  • 環境依存な設定は各環境のプレフィックスをファイル名の最初につける

プレフィックスは以下

環境 prefix
Meadow meadow
Carbon Emacs carbon-emacs
Cocoa Emacs cocoa-emacs
emacs -nw nw
Windows windows
Linux linux

5.3 設定の反映

inits.elに設定追記

1
2
3
4
5
;;; init-loader 設定
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'init-loader)
(setq init-loader-show-lod-after-init "error-only")
(init-loader-load "~/.emacs.d/inits")

C-x C-eで評価してエラーがないか確かめたら,一度終了してemacsコマンドでemacsを再起動.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
------- error log -------



------- init log -------

loaded /Users/hogehoge/.emacs.d/inits/00_hoge. 0.002511
loaded /Users/hogehoge/.emacs.d/inits/01_hoge. 0.00703
...

------- load path -------

/Users/hogehoge/.emacs.d/inits
...

エラーがなく,inits内のファイルが呼び出されていることが確認できる.設定ファイルの分け方はまた考える.

.emacs分割のすゝめ
emacs-jp/init-loader
モダンなEmacsを求めて (3) init-loaderで設定ファイルを分割する
init-loader.el と package.el を導入して快適 Emacs ライフ
自分流の .emacs管理

6. 最終的に

Caskとinit-loaderを導入した.
ので,次はどのパッケージを導入するか?設定(と,その分割)をどうするか?を考える.

設定については,どんなものがあるのかわからないし,いろんな人の.emacs.dを参考にする.

shibayu36/emacs
shomah4a/.emacs.d
catatsuy/dot.emacs.d
gongo/elfactory

6.1 導入パッケージ

下記サイトを参考にいくつか

Emacsパッケージ特集

  • init-loader
    • いわずもがな
  • auto-complete
    • 字句保管機能
    • バッファ内にある文字列を自動的に保管対象にする
    • tabを押して選択
  • popup
    • emacsでpopupメニューを使う.auto-completeで使われている.
      1
      2
      3
      
      (require 'auto-complete)
      (require 'auto-complete-config)    ; 必須ではないですが一応
      (global-auto-complete-mode t)
      
  • smartparens
    • 括弧やクォート等の自動挿入・管理
      1
      2
      
      (require 'smartparens-config)
      (smartparens-global-mode t)
      
  • rainbow-delimiters
    • 括弧の対応を色付けする
      1
      2
      3
      4
      5
      
      (require 'rainbow-delimiters)
      
      ;(add-hook 'clojure-mode-hook 'rainbow-delimiters-mode)
      (add-hook 'prog-mode-hook 'rainbow-delimiters-mode)
      ;(global-rainbow-delimiters-mode)
      
  • helm
    • 超絶便利らしいので勉強してみる
  • ace-jump-mode
    • 特定語句にジャンプする
    • 練習が必要そう

smartparens.el での括弧処理
rainbow-delimiters.elの括弧色付けをデフォルトより強調する方法
「Emacsのトラノマキ」連載第09回「auto-completeを使おう」(松山智大)

7. おわりに

設定は奥が深いようだ.使いながら欲しい機能を探すのがいいだろう.あとは今回設定した中でも,気に入らない設定が出てくるかもしれない.落ち着いたら,設定はgithubで公開したい.
自作OSの方は8日目くらいまで進んでいるのだけど,まとめが終わっていない.明日はそちらをまとめることを目標にする.

Comments