【簡単】Emacs基本的な設定ファイルの書き方【init.el】

  • このエントリーをはてなブックマークに追加
  • Pocket

こんにちは。iQeda [@iQeeeda] です。

Emacs をインストールしたものの、設定ファイルがよくわからない…
なんかエラーがでる! (もしくはエラーすら表示されない!)

その気持ち、すごくわかります。
エディターの設定なんかよりも、本当は早く開発に取り掛かりたいはず。

今回は Emacs 設定ファイル ~/.emacs.d/init.el をイジるときの心構えと、
僕が普段つかっている設定を公開します! (コピペで OK です)

Emacs はカスタマイズしてこそ威力を発揮する

Emacs は拡張性が高いエディターですが、デフォルト設定の使い勝手はよくありません。

最初は設定にこだわりすぎない方がいい

設定ファイルの書き方にはクセがあって、慣れていないと文法エラーをたくさん起こすでしょう。
なので、初心者は「最初から完璧な設定ファイルを目指さない方がいい」と思います。

初心者おすすめの Emacs 設定手順

  1. ネット上に公開されている他人の設定をコピペして試すこと
  2. 挙動が気に入らなくても「ちゃんと動いてるからいいか」ぐらいの気持ちでいること
  3. Emacs の基本操作に慣れてきた頃から少しずつ設定をイジること

Emacs Lisp について

設定ファイルやパッケージは Emacs Lisp という独自言語で書かれています。
先ほど説明したとおり「最初は文法なんて覚えず、誰かの設定をコピペするだけ」で OK です。

個人的 init.el 設定

Emacs の設定ファイルの場所について説明します。

  • ホームディレクトリに .emacs.d という隠しフォルダがなければ作成してください
  • .emacs.d の中に init.el というファイルがなければ作成してください
    • この init.el が設定ファイルとなります

それでは init.el に以下の設定を貼り付けてみてください。

~/.emacs.d/init.el
;;
;; パッケージ読み込み
;;

(require 'package)

;; HTTP
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
(add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/") t)
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t)
(add-to-list 'package-archives '("ELPA" . "http://tromey.com/elpa/") t)

(package-initialize)

;; フォントを Ricty Diminished (変更したい場合)
;; (add-to-list 'default-frame-alist '(font . "Ricty Diminished-14"))

;; フォントの行間を指定 (変更したい場合)
;; (setq-default line-spacing 0.2)

;;
;; Mac OS のクリップボードと同期する
;;

(defun copy-from-osx ()
 (shell-command-to-string "pbpaste"))

(defun paste-to-osx (text &optional push)
 (let ((process-connection-type nil))
     (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
       (process-send-string proc text)
       (process-send-eof proc))))

(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)

;; 時間も表示
(display-time)

;; emacs テーマ選択
(load-theme 'manoj-dark t)

;; "yes or no" の選択を "y or n" にする
(fset 'yes-or-no-p 'y-or-n-p)

;; alpha
(if window-system
    (progn
      (set-frame-parameter nil 'alpha 95)))

;; font
(add-to-list 'default-frame-alist '(font . "ricty-12"))

;; line number の表示
(require 'linum)
(global-linum-mode 1)

;; line number を分かりやすくする
(set-face-attribute 'linum nil
            :foreground "#a9a9a9"
            :background "#404040"
            :height 0.9)

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

;; 現在ポイントがある関数名をモードラインに表示
(which-function-mode 1)

;; 対応する括弧をハイライト
(show-paren-mode 1)

;; リージョンのハイライト
(transient-mark-mode 1)

;; current directory 表示
(let ((ls (member 'mode-line-buffer-identification
                  mode-line-format)))
  (setcdr ls
    (cons '(:eval (concat " ("
            (abbreviate-file-name default-directory)
            ")"))
          (cdr ls))))

;; ターミナルで起動したときにメニューを表示しない
(if (eq window-system 'x)
    (menu-bar-mode 1) (menu-bar-mode 0))
(menu-bar-mode nil)

;; buffer の最後でカーソルを動かそうとしても音をならなくする
(defun next-line (arg)
  (interactive "p")
  (condition-case nil
      (line-move arg)
    (end-of-buffer)))

;; active window move
(global-set-key (kbd "<c-left>")  'windmove-left)
(global-set-key (kbd "<c-down>")  'windmove-down)
(global-set-key (kbd "<c-up>")    'windmove-up)
(global-set-key (kbd "<c-right>") 'windmove-right)

;; rgrep の header message を消去
(defun delete-grep-header ()
  (save-excursion
    (with-current-buffer grep-last-buffer
      (goto-line 5)
      (narrow-to-region (point) (point-max)))))
(defadvice grep (after delete-grep-header activate) (delete-grep-header))
(defadvice rgrep (after delete-grep-header activate) (delete-grep-header))

;; "grep バッファに切り替える"
(defun my-switch-grep-buffer()
  (interactive)
    (if (get-buffer "*grep*")
            (pop-to-buffer "*grep*")
      (message "No grep buffer")))
(global-set-key (kbd "s-e") 'my-switch-grep-buffer)

;; 履歴参照
(defmacro with-suppressed-message (&rest body)
  "Suppress new messages temporarily in the echo area and the `*Messages*' buffer while BODY is evaluated."
  (declare (indent 0))
  (let ((message-log-max nil))
    `(with-temp-message (or (current-message) "") ,@body)))

;; Terminal 化
(setq shell-pop-shell-type '("eshell" "*eshell*" (lambda () (eshell))))
(global-set-key (kbd "C-c o") 'shell-pop)

;;
;; setq
;;

;; ⌘  キーを super として割り当てる
(setq mac-command-modifier 'super)

;; クリップボードへのコピー
(setq x-select-enable-clipboard t)

;; C-k で行全体を削除する
(setq kill-whole-line t)

;; スタートアップメッセージを表示させない
(setq inhibit-startup-message t)

;; エラー音をならなくする
(setq ring-bell-function 'ignore)

;; *.~  バックアップファイルを作らない
(setq make-backup-files nil)

;; .#*  バックアップファイルを作らない
(setq auto-save-default nil)

;; tabサイズ
(setq default-tab-width 4)

;; タイトルにフルパス表示
(setq frame-title-format "%f")

;; スタートアップメッセージを表示させない
(setq inhibit-startup-message 1)

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

;; スクロールは 1 行ごと
(setq mouse-wheel-scroll-amount '(1 ((shift) . 5)))

;; スクロールの加速をやめる
(setq mouse-wheel-progressive-speed nil)

;; 大文字・小文字を区別しない
(setq case-fold-search t)

;; rgrep 時などに新規に window を立ち上げる
(setq special-display-buffer-names '("*Help*" "*compilation*" "*interpretation*" "*grep*" ))

;;
;; define-key
;;

;; Contol H で 1 文字削除
;; (define-key global-map "\C-h" 'delete-backward-char)

;; 上記定義では Mini Buffer 内では削除できない可能性があるので以下を再定義
(keyboard-translate ?\C-h ?\C-?)
(global-set-key "\C-h" nil)

;; ヘルプの表示を M-? 変更
(define-key global-map "\M-?" 'help-for-help)

;; ファイル名検索
(define-key global-map [(super i)] 'find-name-dired)

;; ファイル内検索
(define-key global-map [(super f)] 'rgrep)

;;
;; put
;;

;; リージョンの大文字小文字変換
(put 'upcase-region 'disabled nil)
(put 'downcase-region 'disabled nil)
あくまでサンプルなので、要らない設定は削除したり ; でコメントアウトしてみてください。

init.el を保存して、Emacs を起動すると設定が色々と変わっているはずです。

init.el が読み込まれていないとき

Emacs の設定ファイルはいくつかありますが、基本的に ~/.emacs.d/init.el だけで十分です。
以下の設定ファイルが存在していないか確認してみてください。

  • ~.emacs
  • ~/.emacs.el

設定内容を確認して問題なさそうであれば、上記 2 ファイルは削除して OK です。

パッケージインストールについて

Emacs のパッケージインストール機能を使うと、更に init.el 内で機能拡張の設定ができます。
パッケージの使い方について、以下の記事で解説しています。

関連記事

Emacs ロードマップ

Emacs 操作方法

お仕事ください!

僕が代表を務める 株式会社 EeeeG では Web 制作・システム開発・マーケティング相談を行っています。
なにかお困りごとがあれば、Twitter DM や Web サイトからお気軽にご相談ください。

カテゴリ「Develop」の最新記事

最新記事

コメント

コメントを残す

*