Hatena::ブログ(Diary)

三等兵

2012-03-04

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

f:id:sandai:20120303014837p:image


日々事あるごとにダァダア言っとります。たとえばタンスの角に小指をぶつけりゃ、

「ダァ!!!」

扉を閉じるときに指を挟んで、

「ダァ!!!ダァ!!!」

猪木がイチ,ニ,サンと叫ぶものなら、

「ダァ-------!!!」

と言っとりますがあーーー!!!・・・という荒ぶる猪木の気分ではありませんが。


MacになってからCodaと付き合いだして疎遠になっていました。でもやっぱりEmacs使ってたときが一番捗ってたのでまたお付き合いを始めようかと。


・・・え?Emacsとの馴れ初めですか?気になります?気になります?そうですね、あれは、忘れもしない雪がしんしんと全く降ることがない初秋のある日のことでした。私は当時は日々事あるごとに「ヘァ!!!ヘァ!!!」とウルトラマンしていました。時々「フォッフォッフォ!!!」とバルタンもしてました。クセなんです。そして出会いました。


ピグモンと。

それからです。Emacsを使い出したのは。・・・いやーおはずかしい!!こんなロマンチックなことを言うのはおはずかしい!!ピピピグモンですからねっ!言葉にするのも恥ずかしいです!!あー恥ずかしくて顔からスペシューム光線でそう!ヘァ!!!ヘァ!!!クセなんです!ダァダァ!!!やばい止まらんダァダァ!!!だだだって、ロマンチックすぎますよね!ピピピピグモンですからねっ///

それからEmacsと疎遠になった理由として「あーのーひあのーときーあーのぉーばしょーでぅぇー」とかいう「Emacs vs Viラブストーリー feat. ピグモン」というピグモン無しには語れない任侠ドラマがあるんですが!聞きたいです!?聞きたいです!?

いえいえ!やぶさかでない!そこまで聞きたいとおっしゃるならこちらとてやぶさかでない!!しかしながらフォッフォッフォ!!いやーお恥ずかしい!これを言うのはお恥ずかしい!ヘァ!!!ヘァ!!!クセなんです!EmacsがあれになってViがVimとこうなってダァダァ!!!最終的にメモ帳親分と最終決戦になるんですけれどもね!あーいやお恥ずかしいのでここから先はまた次に考えましょう!こんな嘘はまた次に考えましょう!


というわけで、Emacsについていろいろさっぱり忘れたので入門も兼ねて復習しつつダァダァやっていきますが、たぶん例によって長くなります。


インストールと下準備

古いEmacsや設定ファイルを捨てて新たにMacとBoot Campで利用しているWindowsにインストールしまして、ありきたりですがその備忘録。

フォルダの構成はWEB+DB PRESS Vol.58にあるid:tomoyaさんのEmacs特集記事を参考にした内容となってます。買っててよかったWeb+DB。いくつかネットで見てきましたがこれで特集されている構成が一番シンプルで好きです。

Mac

パッチあててソースからビルドしたい人はそっちで。MacPortsやHomebrewであればこっちで。Homebrewの場合はターミナルから、

brew install emacs --cocoa

としてインストール。

たぶんMacは最初からEmacsがインストールされているはずです。Carbon Emacs22あたりです。今はCocoa Emacs23系が最新なので特別な理由がなければCocoaで良いと思います。

あとは、

  1. EmacsがインストールされたフォルダからEmacs.appをアプリケーションのフォルダなどに移動
    • Homebrewならインストールの過程でインストール先が記述されているはず。たぶん/usr/local/Cellarにある
    • 移動はお好みで
  2. ホームディレクトリに.emacs.dフォルダを作成し、elispフォルダとinit.elファイルを作成
    • ホームディレクトリの場所が分からない場合は、Emacsを立ち上げてC-x C-fで~/を入力して確認
    • というかユーザ名のフォルダのとこ
    • .emacs.dはもしかしたら自動で生成されているかも

そういえばMacはドットから始まるフォルダやファイルは不可視なんで可視化させてください。下記を参考にどうぞ。

Windows

他のOSやマカーは飛ばしてください。

Win系はgnupackのEmacsを利用するのが楽。

CygwinとEmacsを何もいじらずにすぐ利用できるパッケージが配布されています。便利ですね。w3mとか、zshやbashといったshellを使うのであればCygwinが必要みたいなのでそういったものを扱いたい場合はどうぞ。mingwは聞いたことあるけどそれはだめなのかな。

とにかくそんなのしるか!Emacsだけでいい!という人や、Cygwinはもうある!いらぬ!媚びぬ!省みぬ!というサウザーのフォロアー野郎は、

からgnupack for Emacsをダウンロードしてください。これはEmacsだけのシンプルなアーカイブです。ダウンロードして解凍したらEmacsのフォルダができるので好きな場所に置きましょう。迷ったらC:\が無難です。

Emacsをインストールできたら次にホームディレクトリなるものを設定します。

ホームディレクトリを設定するとそこに.emacs.dというフォルダが自動で生成されます。基本的にはこの.emacs.dフォルダの中にelispパッケージ(Emacsの機能を拡張する××××.elという拡張子を持つファイルのこと)をぶっこんでいく形になります。

Windowsはホームディレクトリが最初から設定されていないので環境変数をいじりましょう。Windows7の場合、

  1. デスクトップのコンピューターアイコンとかコンピュータウィンドウ上で右クリック
  2. コンテキストメニュー中のプロパティをクリック
  3. 開いたウィンドウの左から「システムの詳細設定」をクリック
  4. 詳細設定タブで「環境変数」をクリック

次に「ユーザ環境変数」で新規作成をして、

  • 変数名
    • HOME
  • 変数値
    • C:\Users\ユーザ名

ユーザ名の部分は自分のユーザ名にしてOKを押します。この変数値がホームディレクトリの場所になりますね。ホームディレクトリはどこでもいいんでC:\homeとかhomeフォルダ作ってしまっても問題ないと思います。

設定できたらPCを再起動します。再起動したら、

  • C:\Users\ユーザ名

の部分に.emacs.dフォルダが生成されていることを確認してください。できてなかったらemacsを起動しましょう。runemacs.exeで起動できます。そしたらきっと自動でできてるはずですが。

Windowsもドットから始まるフォルダやファイルは不可視なので設定していない人は可視化させましょう。下記を参考にどうぞ。

これでも.emacs.dフォルダが見つからなかったら、Emacsを立ち上げてC-x C-fで~/を入力してホームディレクトリの位置を確認してください。間違えていたら環境変数を直してまた再起動してください。

問題なければ.emacs.dフォルダがホームディレクトリに生成されているはずです。環境変数のパスが間違っていないのに自動でできないということであれば自分で.emacs.dフォルダを作ってください。

最後に.emacs.dフォルダ以下にelispフォルダとinit.elファイルを作成して終わり。

.emacs.dフォルダの構成
  • ~/(ホームディレクトリ)
    • .emacs.dフォルダ
      • elispフォルダ
      • init.elファイル

こんな感じです。あとはconfフォルダってのがあったんですが今はいらないです。

elispフォルダと~/.emacs.d/init.elファイルの役割

elispフォルダはelispパッケージ(Emacsの機能を拡張する××××.elという拡張子を持つファイルのこと)を格納するフォルダとして扱います。

~/.emacs.d/init.elファイルはEmacsの初期化ファイルです。初期化ファイルというのはEmacsの起動時に読み込まれるファイルのことで、ウィンドウの大きさであったりフォントの種類を設定が書かれていたりします。また、elispパッケージを読み込んでプログラミングにおける自動補完の機能や文法チェックの機能を取り入れるためになんやかんやといった設定を記述したりします。

~/.emacs.d/init.elはEmacsの設定や機能を統括する親玉です。Emacsが使いやすくなるもならないも~/.emacs.d/init.el次第なのです

フォルダの構成はWEB+DB PRESS Vol.58にあるid:tomoyaさんのEmacs特集記事で紹介してある構成です。パクったのです。

load-pathの設定

load-pathというものを設定します。これはWindowsもMacも同じです。下記のコードを~/.emacs.d/init.elの一番上に書いて保存してください。保存のキーバインドはC-x C-sです。controlキー(WindowsだとCtrlと表記されてるとこ)を押しながらxキーを押して、次にsキーを押します。

; -*- Mode: Emacs-Lisp ; Coding: utf-8 -*-
;; ------------------------------------------------------------------------
;; @ load-path

;; 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")

lispを知らない人はなんじゃこれって感じですが、「~/.emacs.d/elispにelispパッケージがあるんだからね!別にあんたのためにそうしてるわけじゃないんだからね!///」ってことをあんたのために示しています。"elisp"って部分がそれです。

なので、××××.elという拡張子のファイルは全部~/.emacs.d/elisp以下にぶっこんでおけばあんたは難しいことを考えなくてもいいのです。この設定法もWEB+DB PRESS Vol.58にあるid:tomoyaさんのEmacs特集記事からパクってます。

というわけで、あんたはWEB+DB PRESS Vol.58を買うか、それよりも最近出版されたWEB+DB PRESS総集編[Vol.1〜60]を買うかして、id:tomoyaさんに土下座する役割は私にまかせて、さあ、あんたはWEB+DBの本を買うんだ。たぶん、あんたのためだけに技術評論社が全力ツンデレ発売中。

Emacsを拡張する前の予備知識

もう流れは入門ですがいいや。

キーバインドの表記について

キーバインドはショートカットです。でもキーバインドという言い方をEmacsではするんです。

Emacsの記事でC-x C-cとかC-h vやM-x find-fileといったような表記を見かけたことがあると思います。これはタイプの仕方を表しています。

たとえば、先ほど出てきたC-x C-cというキーバインドはどのようにタイプするのかというと、controlキーを押しながらxキーを押して、xキーを離してからcキーを押しませう、ということを表しています。

C-h vでしたら、controlキーを押しながらhキーを押して、controlキーとhを離してからvキーを押すでおじゃる、ということを表しています。

M-x find-fileはMetaキー(Macはデフォルトだとoptionキーで、WindowsはAltキーです)を押しながらxキーを押して、それからミニバッファにfind-fileと記述してEnterキーで実行するでおま、ということを表しています。

CとかMは修飾キーと言われているもので、Emacsではこれらのキーを基本に操作します。主な修飾キーは次の3つ。

  • C
    • control(WindowsであればCtrlと表記されてるとこ)
  • M
    • option/Alt(MacはEmacs22ぐらいだとCommandキーがMetaキーかも)
  • S
    • shift

他にもいくつかありますがCやMがほとんどです。最初はcontrolキーのCとMetaキーのMさえ覚えておけば問題ないでしょう。

あとはタイプの仕方です。C-xといったように-で繋がっていればcontrolキーを押しながらxキーを押すことになりますし、C xのようにスペースがあればcontrolキーを押して、離してからxキーを押す、といった具合です。

コードの動作確認

~/.emacs.d/init.elに記述したコードの動作確認の方法は基本的には2つあります。

  • Emacsを再起動させるというごく一般的な方法。C-x C-cでEmacsが終了させて普通に起動する
    • ※M-x load-fileはなんかおかしかったのでおすすめしない
  • 設定のコードの末尾でC-x C-eとタイプして式を即座に反映させる方法。再起動させることなく、即その設定がEmacsに反映される

たとえば下記のようなコードを~/.emacs.d/init.elに書いて終わりの括弧の後ろでC-x C-eとタイプすると、ツールバーが非表示となります。

(tool-bar-mode -1)

こんな要領で~/.emacs.d/init.elの設定を確認しながらコードを書いていきましょう。

私は設定を確認するときは基本的にC-x C-eで確認していますが、うまくいかなかったり訳がわからなくなったら再起動します。困ったら再起動です。下っ端の手口です。

操作のキャンセル

途中で操作を間違えたりやめたりしたいときは、C-gやESC ESC ESCを利用します。ミスをしてしまったー!ってときはとりあえずC-gを入力して、何も変わらず困ったらESC ESC ESCをタイプしてください。これでなんとかなります。

もし、どのようにキャンセルしてもウィンドウが分割されたままで困ったら、C-x 0を押してください。ウィンドウが1つに戻ります。ウィンドウが1つに戻ったけどバッファがinit.elに戻らないよー!と困ったらC-x b init.elで戻れます。

これらの対処法を覚えておけばパニックになることもそうないかとは思いますが、それでもどうしようもできない!分からない!って状態になったときは一度Emacsを終了してください。下っ端の手口です。

チュートリアル

C-h tでEmacsのチュートリアルを行えます。扱いが不安な人はどうぞと言いたいところですがたぶん面倒だと思いますのでやめちゃいましょう。ロックに行きましょう。とりあえず、

  • ファイルを開く
    • C-x C-f(find-file)
  • ファイル(バッファ)の保存
    • C-x C-s(save-buffer)
  • コピー
    • M-w
  • カット
    • C-w
  • ペースト
    • C-y

だけ覚えれば最初はなんとかなると思います。あとはみんなが嫌いな根性とか慣れといったものが必要になってきますので、ロックに行きましょう。

Emacsの基本的な設定

それでは基本的な設定を~/.emacs.d/init.elに記入していきます。基本的な設定というのはツールバーやスクロールバーを消したり、使用するフォントであったりウィンドウ透過させたりといった部分のEmacsをいじっていく設定です。

イメージとしては、他のアプリケーションでいうところの「環境設定」だったり「オプション」で設定できるようなことをやっていきます。Emacsは~/.emacs.d/init.elに手書きでそういった設定も書いていきます。すげえなと思いつつもこれは長い間Emacsユーザーの間で口伝され続けてきた秘伝の設定をパクって書くだけです。みんなそんなもんです。

動作の確認はWindow7(32bit)とMac OS X Lionで扱うEmacs23.4で確認していますがWindowsは適当です。

あとコードは yesyes .emacs - 三等兵にまとめました。githubは怖いです。以前履歴地獄にあってから怖いです。もう少し場慣れしてから、「コードはgithubにおいておきました」的なセリフをブログで書く予定です。それっぽいから。

general

全般的なものからです。

;; ------------------------------------------------------------------------
;; @ general

;; common lisp
(require 'cl)

common lispの機能をエミュレート。とりあえず入れてます。

;; 文字コード
(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とMacで分けてます。他にも設定方法がありますがこれは確かWEB+DB PRESS Vol.58を参考にしたはず。

;; 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")))))  ;; 日本語

WindowsとMacで使用するフォントを使い分け。Windowsの日本語はメイリオがおすすめ。英数についてはConsolasやDejaVu Sans Monoもおすすめです。MacはRicty使用。プログラミング向けの人気なフォントですね。


この設定では英数と日本語だけ使い分けられるようにしています。ダブルクォーテーションで囲まれた部分を使いたいフォント名に変えてください。フォントはひらがなやカタカナまでの使い分けも可能です。気になるのであれば調べてみてください。大きさについてはheightの数値をいじればできます。

Emacsで使用できるフォントの一覧を見たいときはscratchバッファで、

(font-family-list)

と入力し、末尾でC-jを押せば見えます。scratchバッファはC-x b *scratch*で開けます。

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

Emacsを立ち上げると表示される最初の画面を非表示にします。こうするとscratchバッファが初期画面になるはずです。

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

scratchバッファの無駄なテキストを無くします。

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

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

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

ツールバーとスクロールバーを非表示。メニューバーはこのままだと表示されるようになっています。邪魔ならアンコメントしてください。;;(menu-bar-mode -1)のうち先頭の;;を外すだけです。

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

フルパスをタイトルバーに表示。

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

;; 行番号フォーマット
;;(setq linum-format "%4d")

左側に行番号が表示されます。foregroundで色、heightで大きさを指定可能。フォントの設定と合わせて適当な大きさに変えましょう。フォーマットはアンコメントすれば"%4d"に設定されます。よくみかける定番の設定値ですが私はデフォルトのままを利用してます。

;; 括弧の範囲内を強調表示
(show-paren-mode t)
(setq show-paren-delay 0)
(setq show-paren-style 'expression)

;; 括弧の範囲色
(set-face-background 'show-paren-match-face "#500")

括弧内を強調。背景が黒なので分かりやすい赤色にしています。"#500"のカラーコードをお好みの色に変えてください。

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

Emacsでは選択領域のことをリージョンと言いますがそれの色設定。#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))

タブはスペースに変換。あと意味あるかわかりませんがタブ幅も変更。

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

たとえばファイルを編集していて、そのファイルを保存せずにEmacsを終了しようとすると「保存してないけどとじちゃっていいのー?」的なことを聞かれます。そのときにyesとかnoとか打たなきゃけないんですが、そういった入力をyとnでできるようにしています。

;; 最近使ったファイルをメニューに表示
(recentf-mode t)

;; 最近使ったファイルの表示数
(setq recentf-max-menu-items 10)

;; 最近開いたファイルの保存数を増やす
(setq recentf-max-saved-items 3000)

利用したファイル履歴の設定。メニューバーから10個まで表示するようにしています。そして履歴の保存数を3000個にしています。

これは、メニューバーだと3000個のうち最新の10個までしか選べませんが、M-x recentf-open-fileでEmacsからそれ以前の履歴を閲覧できるようになります。

;; ミニバッファの履歴を保存する
(savehist-mode 1)

;; ミニバッファの履歴の保存数を増やす
(setq history-length 3000)

ミニバッファで入力した内容を保存するようにしてさらにその保存数を設定。(ミニバッファはC-x C-fでファイルを開くときに名前を入力する領域のことです)

たとえば、C-sで適当に文字列を入力して検索してみてください。そうして検索を適当にやめて(十字キーを適当に押したりEnterキー押したりして)再度C-sをタイプします。今度は文字列を入力するのではなくM-p(又はM-n)とタイプしてください。そうすると先ほど検索した文字列がミニバッファに表示されるはずです。

この履歴を保存する設定が上記のコードです。履歴を辿るのはM-nやM-pをタイプします。また、保存されるのはこのように検索の文字だけではなくcommandやfind-fileしたファイルパスなどもあります。

;; バックアップを残さない
(setq make-backup-files nil)

バックアップファイルが勝手に作成されるので削除します。

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

行間の設定です。なるべく多くの行数を一画面に表示したいので0にしています。

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

C-n(次の行に移動するキーバインド)や十字キーの下を押し続けたときに1行ずつスクロールするように設定。

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

フレーム(Windowsでいうところのウィンドウにあたります)の透明度を設定。0に近いほど透けていきます。お好みでどうぞ。

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

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

モードラインはウィンドウとミニバッファに挟まれた領域です。バッファ名だったり、(Emacs-Lisp)とか書かれているところですね。そこに行番号と列番号を表示するようにします。

;; C-Ret で矩形選択
;; 詳しいキーバインド操作:http://dev.ariel-networks.com/articles/emacs/part5/
(cua-mode t)
(setq cua-enable-cua-keys nil)

C-Ret(controlキーを押しながらEnterキー)で矩形選択が利用可能。矩形選択とは、


f:id:sandai:20120303022933p:image


こういったように列の途中から四角の形で選択領域を指定できます。この状態でC-dなどを押すと、


f:id:sandai:20120303022934p:image


選択した部分だけ消えました。このように特定の領域に対して何か処理をしたいときに矩形選択は大変便利です。

それから、cua-modeの他に矩形選択ができるsense-region.elというelispパッケージがあります。どちらを利用しても構いませんが、私はcua-modeで十分なのでこちらを利用しています。

ちなみに、矩形は読みをひらがなで表すと"くけい"となります。もし"たんけい"とこれまで読んできてしまった人。智謀と勇猛と腰痛を兼ね備えた私と同類です。よかったですね。

modeline

モードラインてのはここです。


f:id:sandai:20120303022936p:image


先ほどモードラインの列番号と行番号を表示するようにしましたが、もうちょっとここをいじります。

;; ------------------------------------------------------------------------
;; @ modeline

;; モードラインの割合表示を総行数表示
(defvar my-lines-page-mode t)
(defvar my-mode-line-format)

(when my-lines-page-mode
  (setq my-mode-line-format "%d")
  (if size-indication-mode
      (setq my-mode-line-format (concat my-mode-line-format " of %%I")))
  (cond ((and (eq line-number-mode t) (eq column-number-mode t))
         (setq my-mode-line-format (concat my-mode-line-format " (%%l,%%c)")))
        ((eq line-number-mode t)
         (setq my-mode-line-format (concat my-mode-line-format " L%%l")))
        ((eq column-number-mode t)
         (setq my-mode-line-format (concat my-mode-line-format " C%%c"))))

  (setq mode-line-position
        '(:eval (format my-mode-line-format
                        (count-lines (point-max) (point-min))))))

line-number-modeやcolumn-number-modeを壊さずにモードラインの割合表示を総行数表示にしています。


f:id:sandai:20120303022935p:image


わかりにくいですがパーセントではなく総行数になってますね。これは個人的な設定なのでスルーして結構です。

initial frame maximize

Emacsの起動時にフレームを最大化にするコードです。これも個人的なものです。必要なければ流してください。

;; ------------------------------------------------------------------------
;; @ initial frame maximize

;; 起動時にウィンドウ最大化
;; http://www.emacswiki.org/emacs/FullScreen#toc12
(defun jbr-init ()
  "Called from term-setup-hook after the default
   terminal setup is
   done or directly from startup if term-setup-hook not
   used.  The value
   0xF030 is the command for maximizing a window."
  (interactive)
  (w32-send-sys-command #xf030)
  (ecb-redraw-layout)
  (calendar))

(let ((ws window-system))
  (cond ((eq ws 'w32)
         (set-frame-position (selected-frame) 0 0)
         (setq term-setup-hook 'jbr-init)
         (setq window-setup-hook 'jbr-init))
        ((eq ws 'ns)
         ;; for MacBook Air(Late2010) 11inch display
         (set-frame-position (selected-frame) 0 0)
         (set-frame-size (selected-frame) 95 47))))

フルスクリーンではなく最大化です。EmacsのタイトルバーやWindowsで言うところのタスクバーが見えるやつですね。

ただし、Macはフレームの大きさを手動で最初から設定する必要がある原始的ハードコーディングです。MacBook airの11インチの人は同じ設定だと思うので何もしなくても大丈夫です。

自分のディスプレイに合わせる方法は、まず手動でフレーム(ウィンドウのことです)を画面いっぱい広げます。それからscratchバッファで、

;; 括弧の後ろでCtrl-jを押す
(frame-width)
(frame-height)

C-jで評価して値を出力します。次にその値をコードに当てはめます。

set-frame-size (selected-frame) 95 47))))

このコードのうち、95に自分のframe-widthの値を、47にもframe-heightの値を入れて終わりです。


また、最大化に関してはelispパッケージでも行うことができます。私は特に必要ないので利用していません。

key bind

少しだけ。

;; ------------------------------------------------------------------------
;; @ key bind

;; バックスラッシュ
(define-key global-map (kbd "M-|") "\\")

;; globalなC-zを無効化
(global-unset-key "\C-z")

ほとんどくいじっていません。標準のキーバインドさえ把握できていないので、これから自分のスタイルに合わせていくつかバインドしていけば良いかなと。ただしバックスラッシュ打てないのでそれだけ設定しています。

もうひとつ、C-zを無効化しています。C-zはEmacsをアイコン化する(Windowsでいう最小化みたいなもの)機能が割り当てられていますが、必要ないので何か別のコマンドを割り当てる予定です。

このへんはあんま意味ないので流してください。

基本的な設定は終わり

以上です。なんか内容の流れが入門的になってますがもうなんでもいいです。私はEmacsについてお下劣に書きたいのです。

ここにある設定はだいたい下記のページでも確認できるでしょう。その他の変更を加えたい場合は他の人の設定も参考にどうぞ。


elispパッケージでEmacsの機能を拡張する設定

ネットで配布されているパッケージをインストールしてEmacsの機能を拡張する設定を書いていきます。バカみたいに長いのでこっちにまとめてます。 yesyes .emacs - 三等兵

elispパッケージ導入の流れ

普通は以下のような感じで導入します。

  1. パッケージをダウンロード
  2. ~/.emacs.d/elisp/以下にパッケージをぶっこむ
  3. ~/.emacs.d/init.elにパッケージの読み込みと設定のスクリプトを記述
    • 必要であればバイトコンパイルする
  4. Emacs再起動
  5. パッケージの機能が有効となり扱える状態になる

Emacsの機能を拡張するにはEmacs Lispという言語で書かれたスクリプトのファイルを利用します。ここまでで何度か出てきていますが××××.elという拡張子のelファイルですね。そのelファイルのうちEmacsの機能を拡張するファイルをここではelispパッケージや単純に「パッケージ」などと呼んでいます。一般的には「ライブラリ」とか「拡張」とも呼ばれていますがそれと同じです。


最初にそのelispパッケージをインストールするための手順を番号を付けて示しましたが、バイトコンパイルという単語が出ています。バイトコンパイルとはelファイルの中身をEmacsが分かりやすい中間コードというものに変換し、elcという名前のファイルに保存することです。

Emacsは同名のelファイルとelcファイルがあった場合にelcファイルを優先して読み込みます。

elcファイルにするとEmacsの動作が速くなりますが、elファイルでもEmacsは読み込みます。よって必ずelcファイルにしなければならないというわけではありませんので、うっかり忘れてても問題はなかったりします。

とりあえず、基本的にはバイトコンパイルしておいて、何か問題があればelファイルのまま利用するといった感じで良いと思います。


それにしても最初に番号順に示したパッケージ導入の方法はちょっと面倒ですよね。そこで、もっと簡単にパッケージを導入できるauto-install.elをまずはインストールすることにします。

auto-install.el
;; ------------------------------------------------------------------------
;; @ auto-install.el

;; パッケージのインストールを自動化
;; http://www.emacswiki.org/emacs/auto-install.el
(when (require 'auto-install nil t)
  (setq auto-install-directory "~/.emacs.d/elisp/")
  (auto-install-update-emacswiki-package-name t)
  (auto-install-compatibility-setup))

先ほど述べた導入の流れのうち、

  1. elispパッケージをダウンロード
  2. ~/.emacs.d/elisp/以下にパッケージをぶっこむ
  3. ~/.emacs.d/init.elにパッケージの読み込みと設定のスクリプトを記述
    • 必要であればバイトコンパイルする

これらの部分をEmacsだけで簡単にできるようにします。

auto-install.elは先ほど述べた導入の手順でインストールする必要がありますが、これから登場するelispパッケージはだいたいauto-install.elを利用してインストールできます。便利ですね。

color-theme.el
;; ------------------------------------------------------------------------
;; @  color-theme.el

;; Emacsのカラーテーマ
;; http://code.google.com/p/gnuemacscolorthemetest/
(when (and (require 'color-theme nil t) (window-system))
  (color-theme-initialize)
  (color-theme-clarity))
  • 使い方
    • 後述
  • 機能
    • Emacsの見栄えをカスタマイズ
  • ダウンロード
  • インストール
    • ダウンロードして解凍したcolor-theme-6.6.0フォルダをelispフォルダにぶっこむ

Emacsの見栄えを変更できるパッケージです。以下の手順を踏んでカラーテーマを設定してください。

  1. まずはインストール
  2. 上記のコードを~/.emacs.d/init.elに記述したら再起動
  3. M-x color-theme-selectとタイプ
    • 予め設定されているカラーテーマの一覧が新しいバッファで表示される
  4. 名前の上にカーソル持って行ってEnterキーなどタイプしてカラーを確認
  5. 気に入ったカラーテーマがあればその名前を上記のコードのcolor-theme-clarityと名前を入れ替える
    • 正式な名前でないと反映されないので、~/.emacs.d/elisp/color-theme-6.6.0/color-theme.elの321行目を見て対応する名前を設定すると良い
    • 私が利用しているclarityはカラーテーマの一覧だとClarity and Beautyという名前だからcolor-theme-clarity-and-beautyかと思いきやcolor-theme-clarityだったりする

名前を捜すのがちょっと面倒ですが、それ以外は簡単に設定できるのでおすすめです。

redo+.el
;; ------------------------------------------------------------------------
;; @ redo+.el

;; redoできるようにする
;; http://www.emacswiki.org/emacs/redo+.el
(when (require 'redo+ nil t)
  (define-key global-map (kbd "C-_") 'redo))
  • 使い方
    • C-_でredo
  • 機能
    • redoする
  • インストール
    • M-x install-elisp-from-emacswiki redo+.el

Emacsにredoの機能を取り入れます。(define-key global-map (kbd "C-_") 'redo)のうち、"C-_"の部分を自分好みに変えてください。WindowsだとIMEを変換するキーバインド?かundoだったかもしれませんがMac中心なのでここにしてます。ちなみにundoはC-/に割り当てられてます。

menu-tree.el
;; ------------------------------------------------------------------------
;; @ menu-tree.el

;; メニューバー日本語化
;; http://www11.atwiki.jp/s-irie/pages/13.html
(if (and (= emacs-major-version 22)
         (eq window-system 'x))
    (setq menu-tree-coding-system 'utf-8))
(require 'menu-tree nil t)
  • 使い方
    • 特に無し
  • 機能
    • メニューを日本語化
  • インストール
    • M-x install-elisp-from-emacswiki menu-tree.el

日本人だから日本語になってるとすごく安心感を得てしまうのは、それはもう仕方がない。必要な人だけどうぞ。

tabbar.el
;; ------------------------------------------------------------------------
;; @ tabbar.el

;; タブ化
;; http://www.emacswiki.org/emacs/tabbar.el
;;(require 'cl)
(require 'tabbar nil t)

;; scratch buffer以外をまとめてタブに表示する
(setq tabbar-buffer-groups-function
      (lambda (b) (list "All Buffers")))
(setq tabbar-buffer-list-function
      (lambda ()
        (remove-if
         (lambda(buffer)
           (unless (string-match (buffer-name buffer)
                                 "\\(*scratch*\\|*Apropos*\\|*shell*\\|*eshell*\\|*Customize*\\)")
             (find (aref (buffer-name buffer) 0) " *"))
           )
         (buffer-list))))

;; tabbarを有効にする
(tabbar-mode 1)

;; ボタンをシンプルにする
(setq tabbar-home-button-enabled "")
(setq tabbar-scroll-right-button-enabled "")
(setq tabbar-scroll-left-button-enabled "")
(setq tabbar-scroll-right-button-disabled "")
(setq tabbar-scroll-left-button-disabled "")

;; Ctrl-Tab, Ctrl-Shift-Tab でタブを切り替える
(dolist (func '(tabbar-mode tabbar-forward-tab tabbar-forward-group tabbar-backward-tab tabbar-backward-group))
  (autoload func "tabbar" "Tabs at the top of buffers and easy control-tab navigation"))
(defmacro defun-prefix-alt (name on-no-prefix on-prefix &optional do-always)
  `(defun ,name (arg)
     (interactive "P")
     ,do-always
     (if (equal nil arg)
         ,on-no-prefix
       ,on-prefix)))
(defun-prefix-alt shk-tabbar-next (tabbar-forward-tab) (tabbar-forward-group) (tabbar-mode 1))
(defun-prefix-alt shk-tabbar-prev (tabbar-backward-tab) (tabbar-backward-group) (tabbar-mode 1))
(global-set-key [(control tab)] 'shk-tabbar-next)
(global-set-key [(control shift tab)] 'shk-tabbar-prev)

;; GUIで直接ファイルを開いた場合フレームを作成しない
(add-hook 'before-make-frame-hook
          (lambda ()
            (when (eq tabbar-mode t)
              (switch-to-buffer (buffer-name))
              (delete-this-frame))))
  • 使い方
    • Ctrl-Tab、Ctrl-Shift-Tab でタブ切り替え
  • 機能
    • バッファをタブ表示
  • インストール
    • M-x install-elisp-from-emacswiki tabbar.el

Emacsをタブ化します。バッファをタブで表示してくれるため個人的にはうれしい。elscreen.elという似たようなパッケージもあるのですが私はこちらを利用しています。

ほぼ設定コードをgnupackからパクッてます。ついでにGUIで操作する人のための設定もつけたしておきました。これでマウスで開いても二重にフレームが起動しないはずです。

multi-term.el
;; ------------------------------------------------------------------------
;; @ multi-term.el

;; 端末エミュレータ
;; http://www.emacswiki.org/emacs/multi-term.el
(when (require 'multi-term nil t)
  (setq multi-term-program "/usr/local/bin/zsh"))
  • 使い方
    • M-x multi-term
      • シェルが起動
  • 機能
    • Emacsでシェルが扱える
  • インストール
  • M-x install-elisp-from-emacswiki multi-term.el

ansi-termよりもmulti-termの方が機能が良いらしいので使っています。自分の環境で利用する場合はパスを変えてください。

あと日本語が文字化けするかもしれません。そのときはホームディレクトリの.zshrcに以下を記述して保存してください。

export LANG=ja_JP.UTF-8

Windowsではよくわからないのでeshellでやっていきます。

auto-async-byte-compile.el
;; ------------------------------------------------------------------------
;; @ auto-async-byte-compile.el

;; 自動コンパイル
;; http://www.emacswiki.org/emacs/auto-async-byte-compile.el
(when (require 'auto-async-byte-compile nil t)
  ;; 自動コンパイルを無効にするファイル名の正規表現
  (setq auto-async-byte-compile-exclude-files-regexp "init.el")
  (add-hook 'emacs-lisp-mode-hook 'enable-auto-async-byte-compile-mode))
  • 使い方
    • 特に無し
  • 機能
    • elファイルをいじって保存したときに自動でバイトコンパイルしてくれる
  • インストール
    • M-x install-elisp-from-emacswiki auto-async-byte-compile.el

自動でelファイルをバイトコンパイルしてくれます。これで忘れることもないですね。無効にするファイル名(ディレクトリも可)は適当にいじってください。

uniquify.el
;; ------------------------------------------------------------------------
;; @ uniquify.el

;; 同名バッファを分りやすくする
(require 'uniquify)
(setq uniquify-buffer-name-style 'forward)
(setq uniquify-buffer-name-style 'post-forward-angle-brackets)
(setq uniquify-ignore-buffers-re "*[^*]+*")
  • 使い方
    • 特に無し
  • 機能
    • バッファ名がかぶったときそれぞれ分かりやすいように表示する

同じバッファ名であれば分かりやすいようにバッファ名を自動で変えてくれます。ファイル名は変化しないので安心してください。あくまでもEmacsで表示されるバッファ名だけです。

uniquify.elは標準のパッケージだったので特にインストールする作業は必要ありませんでしたが、Emacsのバージョンによってはインストールが必要となるかもしれません。

auto-complete.el
;; ------------------------------------------------------------------------
;; @ auto-complete.el

;; 自動補完機能
;; https://github.com/m2ym/auto-complete
(when (require 'auto-complete-config nil t)
  (add-to-list 'ac-dictionary-directories "~/.emacs.d/ac-dict")
  (setq ac-ignore-case t)
  (ac-config-default))

Dreameweaverの入力補完みたいな機能をEmacsに提供します。かなり便利です。機能を全て把握していませんがとりあえず上記の設定で問題なく使っています。

eldoc.el/eldoc-extension.el
;; ------------------------------------------------------------------------
;; @ eldoc.el/eldoc-extension.el

;; カーソル付近にあるEmacs Lispの関数や変数のヘルプをエコーエリアに表示
;; http://www.emacswiki.org/emacs/eldoc-extension.el
(when (require 'eldoc-extension nil t)
  (add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode)
  (add-hook 'lisp-interaction-mode-hook 'turn-on-eldoc-mode)
  (add-hook 'ielm-mode-hook 'turn-on-eldoc-mode)
  (setq eldoc-idle-delay 0.2)
  (setq eldoc-minor-mode-string ""))
  • 使い方
    • ヘルプを確認したいEmacs Lispの関数や変数の知覚にカーソルを近づける
  • 機能
    • Emacs Lispの関数や変数のヘルプをエコーエリア(ミニバッファのところ)に表示する
  • インストール
    • M-x install-elisp-from-emacswiki eldoc-extension.el

エコーエリアにEmacs Lispのヘルプが表示されます。Emacs Lispをいじる人には大変便利。しかしながら結局癖でM-x aproposなど使って確認してしまうんですが。

c-eldoc.el
;; ------------------------------------------------------------------------
;; @ c-eldoc.el

;;カーソル付近にあるC言語の関数や変数のヘルプをエコーエリアに表示
(when (require 'c-eldoc nil t)
  (add-hook 'c-mode-hook
            (lambda ()
              (set (make-local-variable 'eldoc-idle-delay) 0.2)
              (set (make-local-variable 'eldoc-minor-mode-string) "")
              (c-turn-on-eldoc-mode))))
  • 使い方
    • ヘルプを確認したいC言語の関数や変数の知覚にカーソルを近づける
  • 機能
    • C言語の関数や変数のヘルプをエコーエリアに表示する
  • インストール
    • M-x install-elisp-from-emacswiki c-eldoc.el

eldoc.elのC言語版。

hideshow/fold-dwim.el
;; ------------------------------------------------------------------------
;; @ hideshow/fold-dwim.el

;; ブロックの折畳みと展開
;; http://www.dur.ac.uk/p.j.heslin/Software/Emacs/Download/fold-dwim.el
(when (require 'fold-dwim nil t)
  (require 'hideshow nil t)
  ;; 機能を利用するメジャーモード一覧
  (let ((hook))
    (dolist (hook
             '(emacs-lisp-mode-hook
               c-mode-common-hook
               python-mode-hook
               php-mode-hook
               ruby-mode-hook
               js2-mode-hook
               css-mode-hook
               apples-mode-hook))
      (add-hook hook 'hs-minor-mode))))
  • 使い方
    • M-x fold-dwim-toggle
      • 折畳みと展開を切り替える
    • M-x fold-dwim-show-all
      • 全てのコードブロックを展開
    • M-x fold-dwim-hide-all
      • 全てのコードブロックを折畳む
  • 機能
    • コードブロックを折り畳み/展開
  • インストール

コードブロックの折畳みと展開を行うことができます。

hs-minor-modeが有効のときに利用できるので、自動で有効になるように設定していないメジャーモードであればM-x hs-minor-modeなどとタイプするか、上記のコードにフックを追加してください。

実はhideshow.elという標準のコードブロックを折り畳み/展開するパッケージがありまして、それが使いにくいのでfold-dwim.elというパッケージを通してシンプルに利用できるようになってます。

そうすることで覚えれば良いコマンドは上記の3つだけです。

c/migemo.el
;; ------------------------------------------------------------------------
;; @ c/migemo.el

;; ローマ字で日本語をインクリメンタルサーチ
;; for Mac
(when (require 'migemo nil t)
  ;; cmigemoを使う
  (setq migemo-command "/usr/local/bin/cmigemo")
  ;; Migemoのコマンドラインオプション
  (setq migemo-options '("-q" "--emacs" "-i" "\a"))
  ;; Migemo辞書の場所
  (setq migemo-dictionary "/usr/local/share/migemo/utf-8/migemo-dict")
  ;; cmigemoで必須の設定
  (setq migemo-user-dictionary nil)
  (setq migemo-regex-dictionary nil)
  ;; キャッシュの設定
  (setq migemo-use-pattern-alist t)
  (setq migemo-use-frequent-pattern-alist t)
  (setq migemo-pattern-alist-length 1000)
  (setq migemo-coding-system 'utf-8-unix)
  ;; Migemoを起動する
  (migemo-init))

私はC言語で実装されているcmigemoを利用しています。migemoはRubyです。どちらを利用しても変わりありませんが上記のコードはMac用です。Windowsはめんどくさいので入れていませんが、

;; cmigemoを使う

(setq migemo-command "/usr/local/bin/cmigemo")

;; Migemo辞書の場所

(setq migemo-dictionary "/usr/local/share/migemo/utf-8/migemo-dict")

このあたりのパスを自分の環境に変えるだけかと思われます。

※gnupackは最初から入っているのでその設定をつかえば問題ありません。忘れてました。ありがとうございますid:itouhiroさん

migemoはローマ字で日本語も検索できるようになるパッケージです。たとえば、「ashita」で検索をかければ日本語の「明日」がヒットするようになります。便利。

color-moccur.el/moccur-edit.el
;; ------------------------------------------------------------------------
;; @ color-moccur.el/moccur-edit.el

;; バッファの検索結果をリストアップ(複数バッファ可)
;; http://www.emacswiki.org/emacs/color-moccur.el
;; http://www.emacswiki.org/emacs/moccur-edit.el
(when (and (require 'color-moccur nil t)
           (require 'moccur-edit nil t))
  ;; AND検索
  (setq moccur-split-word t)
  ;; ディレクトリ検索のときに除外するファイル
  (add-to-list 'dmoccur-exclusion-mask "\\.DS_Store")
  ;; Migemoを利用できる環境であればMigemoを使う
  (when (and (executable-find "cmigemo")
             (require 'migemo nil t))
    (setq moccur-use-migemo t)))
  • 使い方
    • M-x occur-by-moccur
      • カレントバッファに対して検索
    • M-x moccur
      • 複数のバッファに対して検索
    • r
      • リストアップされた内容の編集を開始できる
    • C-c C-c
      • 編集内容を確定する。確定しても保存はされていないので問題なければC-x C-sで保存
    • http://www.bookshelf.jp/soft/meadow_50.html#SEC746
  • 機能
    • color-moccur.el
      • バッファの検索結果をリストアップして表示。複数のバッファに対しても可能
    • moccur-edit.el
      • color-moccur.elでリストアップした検索結果を直接編集できるようになる
    • その他
  • インストール
    • M-x install-elisp-from-emacswiki color-moccur.el
    • M-x install-elisp-from-emacswiki moccur-edit.el

color-moccur.elはバッファでの検索結果をリストアップしてくれるパッケージです。moccur-edit.elはそのリストアップされた検索結果を編集できるパッケージです。まとめて記述していますがそれぞれパッケージとして別々の機能を提供します。

他にもgrepやgrep-findの機能も持つのですがあまり利用していません。ちょっと重いです。

wgrep.el
;; ------------------------------------------------------------------------
;; @ wgrep.el

;;grepから検索結果を直接編集
;; https://raw.github.com/mhayashi1120/Emacs-wgrep/master/wgrep.el
(require 'wgrep nil t)
  • 使い方
    • M-x grepやrgrepで得た検索結果(grepバッファ)で編集する
    • C-c C-p
      • 編集を開始する
    • C-x C-s/C-c C-c/C-c C-e
      • 編集内容を確定
    • C-c C-k
      • 編集した内容を破棄してwgrepを終了する
    • C-x C-q
      • wgrepを終了する
  • 機能
    • grepの検索結果を直接編集してバッファに反映させることができる
  • インストール
    • M-x install-elisp-from-emacswiki wgrep.el

同じようなパッケージとしてgrep-edit.elがありますが、私はwgrepというgrep-edit.elのfork版を利用しています。これはmoccur-edit.elと似たようなものと思ってください。grepした内容をgrepバッファで直接編集できます。M-x rgrepやM-x lgrepと併用すると便利でした。

anything.el
;; ------------------------------------------------------------------------
;; @ anything.el

;; 総合インタフェース
;; http://d.hatena.ne.jp/rubikitch/20100718/anything
(require 'anything-startup nil t)
  • 使い方
    • ヘルプで学ぶ
      • C-h m(anything-help)
      • M-x anything-execute-anything-command
  • 機能
    • 現代的なインタフェース
    • インクリメンタルに動作する強力な候補選択
    • 複数のコマンドがひとまとめにされている
    • その他いろいろ
  • インストール
    • M-x auto-install-batch anything

全てを把握するのは時間がかかるのでとりあえずインストールしておきましょう。いろいろな部分でインタフェースが改善されています。試しにC-x bでバッファを開いてみてください。以前より使いやすくなっているはずです。こういった改善が多数なされており、また多くの機能も提供しています。

最初に覚えておくと良いコマンドはM-x anything-for-filesです。適当にキーを割り当てておくと便利。あとM-x anything-aproposです。これだけで調べる作業が改善されるはずです。color-moccur.elをインストールしているのであればM-x anything-c-moccur-occur-by-moccurも良いです。インクリメンタルサーチがリストアップされます。

その他いろいろありますが、一度に覚えようとするとめんどくさいので、ある程度使い慣れてからヘルプやコードを読んで調べるのが良いと思います。

js2-mode.el
;; ------------------------------------------------------------------------
;; @ js2-mode.el

;; JavaScriptのメジャーモード
;; https://raw.github.com/mooz/js2-mode/master/js2-mode.el
(when (autoload-if-found 'js2-mode "js2-mode" nil t)
  (add-to-list 'auto-mode-alist '("\\.js$" . js2-mode)))

次のflymake.elでも同じような機能を持っていますがJavaScriptはjs2-mode.elを利用しています。これはid:moozさんがオリジナルのjs2-mode.elにおけるインデントの問題を改善したfork版です。

flymake.el
;; ------------------------------------------------------------------------
;; @ flymake.el

(when (require 'flymake nil t)
  ;; 下の一行はflymakeモードでエラー行に飛べるコマンドをキーに割り当ててるコードですが、
  ;; 個人的な理由でコメントアウトしてます。必要でしたらこのコメント削除して、アンコメントしてください
  ;;(define-key global-map (kbd "C-cd") 'flymake-display-err-menu-for-current-line)

  ;; C
  ;; http://d.hatena.ne.jp/nyaasan/20071216/p1
  (defun flymake-c-init ()
    (let* ((temp-file   (flymake-init-create-temp-buffer-copy
                         'flymake-create-temp-inplace))
           (local-file  (file-relative-name
                         temp-file
                         (file-name-directory buffer-file-name))))
      (list "gcc" (list "-Wall" "-Wextra" "-fsyntax-only" local-file))))
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.\\(c\\|h\\|y\\l\\)$" flymake-c-init))
  ;; C++
  (defun flymake-cc-init ()
    (let* ((temp-file   (flymake-init-create-temp-buffer-copy
                         'flymake-create-temp-inplace))
           (local-file  (file-relative-name
                         temp-file
                         (file-name-directory buffer-file-name))))
      (list "g++" (list "-Wall" "-Wextra" "-fsyntax-only" local-file))))
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.cpp$" flymake-cc-init))

  ;; Emacs Lisp
  ;; http://www.emacswiki.org/emacs/FlymakeElisp
  (defun flymake-elisp-init ()
    (unless (string-match "^ " (buffer-name))
      (let* ((temp-file   (flymake-init-create-temp-buffer-copy
                           'flymake-create-temp-inplace))
             (local-file  (file-relative-name
                           temp-file
                           (file-name-directory buffer-file-name))))
        (list
         (expand-file-name invocation-name invocation-directory)
         (list
          "-Q" "--batch" "--eval"
          (prin1-to-string
           (quote
            (dolist (file command-line-args-left)
              (with-temp-buffer
                (insert-file-contents file)
                (condition-case data
                    (scan-sexps (point-min) (point-max))
                  (scan-error
                   (goto-char(nth 2 data))
                   (princ (format "%s:%s: error: Unmatched bracket or quote\n"
                                  file (line-number-at-pos)))))))
            )
           )
          local-file)))))
  (add-to-list 'flymake-allowed-file-name-masks
               '("\\.el$" flymake-elisp-init))

  (add-hook 'emacs-lisp-mode-hook
            ;; workaround for (eq buffer-file-name nil)
            (function (lambda () (if buffer-file-name (flymake-mode)))))
  (add-hook 'c-mode-common-hook
            (lambda () (flymake-mode t)))
  (add-hook 'php-mode-hook
            (lambda () (flymake-mode t)))
  )

Emacs22系以上なら標準でインストールされているためrequireするだけで利用できます。ただしflymakeは設定がややこしいですね。さわりの情報だけだとなんともあれ。とりあえず今はC系とEmacs Lispだけ。PythonとRubyも入れようと思いましたがどの情報が良いのか判断するのに時間がかかりそうなのでまた今度です。


以上

なんかまずい部分とかミスってたらご指摘ください。flymakeで良い設定とかあったらぜひ教えてください。わからんです。

パッケージによっては機能を把握するためコードを読む必要性が出てきます。しかしコードは雰囲気というか関数名とかでイメージがつくのでなんとかなったりします。

Emacs Lispは案外と読みやすかったです。括弧は気になりません。それよりも見慣れない制御文とかdefadviceだのdefcustomといったキーワードです。なんじゃこりゃー状態でしたが、今は、そうです。無視できるようになりましたせいちょうした。

これから少しずつ覚えていけばいいですね。きっとね。たぶんね。大丈夫か。

Emacsのここが分からない><FAQ

あとはおまけ。自分がEmacsを使っていて疑問に思っていたことや分からなかったことを自分が質問して自分で調べて答えているという、自作自演の孤独的な悲劇を背景に持った涙なしでは語れないFAQ。

Q バッファって何?

よくある説明としては情報を容れる器と言われています。

るびきちさんの書籍を引用させてもらいます。

バッファとは、テキストを入れるための器です。あるいは、テキストを加工するためのまな板とも考えられます。p90

http://www.amazon.co.jp/exec/obidos/ASIN/4774148970/

又は、これまた雑誌から引用させていただきますが、

一般的なコンピュータ用語では、情報を一時的に蓄える記憶領域のことをバッファと呼びますが、Emacs ではメモリ上に作成されたオブジェクトのことをバッファと呼びます。もっと直感的に説明するならば、Emacs の編集画面に表示されているものすべてがバッファです。p68

http://www.amazon.co.jp/exec/obidos/ASIN/4774143243/

と言ったようにも表現されています。直感的にEmacsの編集画面に表示されているものと認識するのが楽かもしれません。

あるいは、言葉で説明できないけれどなんとなしの理解で良いのであれば、with-temp-bufferの扱いが分かると私は雰囲気をつかめました。気になる人は検索かけてみてください。

Q ミニバッファって何?

通常はEmacsの一番下にある一行の狭い領域の部分です。「あーしろこーしろ!」とか「結婚しろ!」とかEmacsと対話的に処理をするとこです。結婚は嘘です。あとこの領域はエコーエリアとも言いますが、同じ場所を共有しているだけでミニバッファとエコーエリアは別機能です。ややこしや。

Q *scratch*って何じゃ?

スタートアップを非表示にすると*scratch*が最初の表示画面になるはずです。それはscratchバッファと言って、なんでも書いていいところで適当なコードを試し書きをしたりします。適当にメモとか書けば良いみたいです。Emacsを終了させるとscratchバッファに書かれた内容は保存していなければ消えますので注意してください。

もし保存しておきたいのであれば、id:kitokitokiさんのscratch-log.elを利用すると良いと思います。

scratchバッファはelscreen.elやtabbar.elを導入していてもタブに表示されたりして最初は邪魔に思うかもしれませんが慣れてくるとよく利用することになるはずです。

あるいは、るびきちさんのopen-junk-file.elを利用しても良いと思います。

Q emacs.elだったり.emacsは~/.emacs.d/init.elとどう違うの?

全て同じ意味みたいです。~/.emacs.d/init.elだけではなく.emacsやemacs.elでもEmacsの設定は記述できるのです。

現在では.emacs.dにinit.elぶっこむのが一般的?のようですが、昔は.emacsだったりemacs.elだったりしたのでしょう。今でもネットではemacs.elの人を結構みかけますね。

時代が流れるごとに名前や設定のやり方が変わってきたのかなと勝手に解釈していますが真相は知りません。それから、だいたいEmacsを使い込んでいる人はこれらのことを.emacsと表記してます。~/.emacs.d/init.elも.emacs.elを利用している人も.emacsと書いてます。

Q Emacs Lispだのelispだのelispパッケージだのといった言葉が飛び交っていてわからんぞ?

この記事限定かもしれませんが。

  • Emacs Lisp(Elisp)
    • Emacsを拡張するプログラミング言語のこと。単純にelispと略されていることもある
  • elispパッケージ(elisp)
    • Emacsを拡張するファイル、ファイル群のこと。××××.elみたいに拡張子がelで、かつEmacsに機能を提供するものを指す。これも単純にelispと略されていることがある
  • elispファイル
    • 拡張に限らずファイルの拡張子がelである全てのファイルを指す

「elispパッケージ」という語の使われ方はあまりないですね。それらは「ライブラリ」や「拡張」、「パッケージ」などと使われていると思います。elispパッケージという単語はあくまでそれらの語を区別しやすいよう表現しただけです。

一般的なことも書いておきます。

ネットや書籍だと「elisp」という単語には大きく3通りの意味で利用されているケースがあって、Emacs Lispというプログラミング言語(処理系)の名前の略称を表すときと、Emacs Lispで書かれたコードそのものを指すときと、Emacsを拡張するelispパッケージを指すときなどがあります。ややこしや。

文章の流れで分別すれば混乱するようなことでもありませんのでそういうもんかなというぐらいの認識で良いと思います。

Q EmacsのオジキはVimの姐さんやViのご隠居と何かあったんすかね?仲が悪そうなんですけど?

おまがー!アンタッチャブルやで!にいさん、その話はアンタッチャブルなんやでぇ!


このへんで

やっと初心者出発点といったところでしょうか。

これからいろいろ学んで、カスタマイズして、なんじゃSKKだの手を出しながら、org-modeに感動しながら、Emacs育てていきながら最終的にはメジャーモードを書いて中道に達することを目的とします。釈迦を目指します。

なんとも長い道のりですが、これらを乗り越えてこそ真のEmacs教信者になれることでしょう。彷徨える子羊としてこの世に寄生するヘドロ以下のゲス野郎なあなたでも、Emacs教を信仰すれば幸せになれるのです。釈迦になれるのです。断食できます。すばらしい。

難しいことをする必要はありません。面倒なことを考える必要はありません。

ただEmacsを使い、恍惚とした表情で「小指いたいなー、Emacsってやっぱり小指痛くなるなー」と自己小指PRをしながら、時には「ミニバッファァァ!!!オレノミニバッファダァダァ!!」と限界突破を超えたミニバッファに対する異常な愛を示し、「anything.elは俺の人生のeverything」というセリフをつぶやくタイミングをいつも見計らいつつ、「っけね、scratchの大事なメモ消えちゃった///」と誰も聞いていないのに大声で話すようにして、scratchを最大限に活用してますアピールをすればいいのです。

Emacs教に入るのに必要なことはEmacsを使う、ただそれだけ。これだけEmacsに愛されます。あなたはEmacsから愛されるのです。そしてあなたもEmacsを愛することになるでしょう。

おお、なんと素晴らしい、なんと素晴らしいことでしょう!

さあ、今日からEmacsを使ってみようではありませんか。きっと霧の向こうに隠れた桃源郷をあなたは知ることになるでしょう!そこはEmacsを使う者だけが訪れることを許される地上の楽園。神々の住むこの世のものとは思えない甘美なる大地!主に土が甘い!

そこでは何も考えずただ小指を動かしていればいいのです。こんな幸せなことがあるでしょうか!ああ、おお、小指が動かしたい!意味もなく左右の小指を交互に動かしていたい!リズムに合わせて!私も、あなたも!フンフフンッ!!!

小指を動かしたい欲求を抑えることのない世界へ行きたい!!以前のように、小指をちぎっては投げ、ちぎっては投げという心細い生活とはおさらばしたいんだ!ピグモンを消費する日々はもうたくさんなんだ!だったら行くしかないだろう!小指の世界へ!さあ、みんなで奏でようじゃないか!小指の第一関節と第二関節でときめく虹色ハーモニーを!!!


おわり

私もよくわからん。


参考書籍

拡張は以下の書籍を参考にしました。ここで紹介した以外にえぐい拡張があるので興味のある人はどうぞ。私はついていけなかったです。

Emacsテクニックバイブル ~作業効率をカイゼンする200の技~
4774143278


一方こちらはEmacs lispを学ぶ書籍です。入門書というレベルではありませんが大変ありがたい書籍でした。

Emacs Lispテクニックバイブル
4774148970


あと何度も出てきていましたがこちらでも拡張が特集されてるので参考にしています。買ってて良かったWeb+DB。あと総集編おすすめ。PDFで見えるから検索できて楽。

WEB+DB PRESS Vol.58
4774143243


最後に、たまたま見つけた書籍もついでに紹介。3月7日発売だそうです。知っててよかった技術評論社。というかここにある書籍は全て技術評論社じゃないか。いつも身銭きってるからなんかくれ。Vimっぽいのくれ。

Emacs実践入門 ~思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)
4774150029


目次。

目次を見る限りではひと通りまとまっています。すばらし。開発環境書いてあるし。flymake書いてあるし。もっと早く気づくけばよかった。あででー失敗。

目次から察するに方向性と内容を関連書籍と住み分けてるというか補完してるといったあたりでしょうか。入門者にはよさげです。技評めー、Vimもちゃっかり出してきてるしー、そんなみえみえな二大エディタ囲い込みノルマンディー上陸パットン将軍ご乱心作戦で買うとでも思っているのかくまー

えー、著者は上記のWEB+DB PRESS Vol.58でも特集を書いていらっしゃる大竹 智也さん(id:tomoya)です。しかし金欠なので迷ってます。今は何かと懐が寒い時期です。でも最近フットヒーター買いました。足があったかい。春も足が冷えるので買って良かった。

あ 2012/03/04 20:48 糞サムいから死ね

ああああああああ 2013/05/10 02:33 Emacs初心者にはとてもありがたかったです

通りすがり通りすがり 2013/12/22 15:34 やりたいことがここにすべて書いてありました。とても助かりました!

若松久仁光若松久仁光 2015/10/23 17:57 Emacs24.5の設定をカスタマイズする時に役立つサイトの「一押し」!!
殆どの事をカスタマイズ出来る程の情報満載です。小生も「intial frame maximize」での「自分のディスプレーサイズを見付ける方法」、「tabbar.el」「Emacsのここが分からない><FAQ」等など 様々な点を参考にさせて頂きました。
今、Emacs24.5の設定を初心に還って見直している所です。
改めて再読し、とても参考に成ります。有難う御座います。若松久仁光拝

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証