Emacsのカスタマイズ

LinuxのEmacsをカスタマイズするには,ホームディレクトリに.emacs.dというディ レクトリを作成し, その中のinit.elというファイルにいろいろなカスタマイズ を記述します. 設定には多様なものがありますが、ここでは筆者の特におすすめする設定を記述 しておきます.

emacsメモ

前提条件

  • 設定ファイルは.emacsじゃなくて.emacs.d/init.el。枠の中の内容はす べてinit.elに記述してあることを前提に記述しています。
  • 追加の機能はすべて~/.emacs.d/elisp/の中につっこむ。なければmkdirコマ ンドで作成してください。
  • RETはエンターキー、TABはタブキーの意味。
  • 操作とかは、C-h tでチュートリアルが出てくるからそれで覚えておくこと。

elisp

おまじない

;; 言語設定
(set-language-environment 'Japanese)
;; 文字コード設定
(prefer-coding-system 'utf-8)

パス通す

;; パスの設定
(setq load-path (cons "~/.emacs.d/elisp" load-path))

括弧の強調

;; 対応する括弧の強調
(show-paren-mode t)

外部とクリップボードを共有

;; 外部デバイスとクリップボードを共有
(setq x-select-enable-clipboard t)

改行するときに自動でインデント

  • C-mでもいいし、Enterするときも自動インデントするようになる
;; 改行でオートインデント
(global-set-key "\C-m" 'newline-and-indent)

BSやDel、文字入力で範囲選択した部分すべての文字を削除

;; BSやDel、文字入力でリージョン内の文字を削除
(delete-selection-mode 1)

C-k 1回で行全体を削除する

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

M-jを入力すると対応するカッコに飛ぶ

;; M-jを入力すると対応するカッコに飛ぶ
(global-set-key (kbd "M-j") 'match-paren)

(defun match-paren (arg)
  "Go to the matching paren if on a paren; otherwise insert %."
  (interactive "p")
  (cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1))
        ((looking-at "\\s\)") (forward-char 1) (backward-list 1))
        (t (self-insert-command (or arg 1)))))

インデント幅space4つに

;indent幅をtab=space4つに
;通常インデントをspace4つに
;; (setq tab-width 4)
;; (setq indent-tabs-mode nil)
(defun my-c-mode-hook ()
        (c-set-style "linux")
        (setq c-basic-offset 4)
        (setq tab-width c-basic-offset)
        (setq indent-tabs-mode nil)
        ;; (gtags-mode t) ;;gtagsという関数一覧機能を使いたい人はこれを有効にする。学校のmacには入っていない。
        ;; (gtags-make-complete-list)
        )
(add-hook 'c-mode-hook 'my-c-mode-hook)
(add-hook 'c++-mode-hook 'my-c-mode-hook)

キーバインド・内部シェルのlsオプション

;;;;;;;;;;;;;;;;;;;;;;;;
;; その他設定
;;;;;;;;;;;;;;;;;;;;;;;;
 
;; emacs内部シェルのlsオプション設定
(setq dired-listing-switches "-lh")

;; ウインドウ間移動のキーバインドにC-\を追加
(define-key global-map "\C-\\" 'other-window)

;; 分割ウインドウをShift+カーソルキーで移動
(windmove-default-keybindings)
(setq windmove-wrap-around t)

;; Ctrl + :でgoto line
(define-key global-map (kbd "C-:") 'goto-line)

 ;; Ctrl + Shift + 7でaddrev静的展開
(define-key global-map (kbd "C-'") 'expand-addrev)

;; Ctrl + hでdelete backward char
(define-key global-map (kbd "C-h") 'delete-backward-char)

auto-install

まずhttp://www.emacswiki.org/emacs/download/auto-install.elからauto-install.elを~/.emacs.d/elisp/の中に突っ込んでおく
init.elに以下の文を追加して、"M-x load-file RET ~/.emacs.d/init.el"でOK
(require 'auto-install)
(setq auto-install-directory "~/.emacs.d/elisp/")
(auto-install-update-emacswiki-package-name t)
(auto-install-compatibility-setup)

auto-complete

"M-x auto-install-batch RET auto-c TAB RET"
あとはソース出てきたらC-c C-cでコンパイルしてくれる
mini bufferにcompleted!とかでたらOK。
~/.emacs.d/elisp/にauto-complete-dicsというディレクトリを作成したのち、init.elに以下の文を追加して、M-x load-fileなんちゃらすれば終了
;auto-completeの設定
(require 'auto-complete)
(global-auto-complete-mode t)
;; 辞書保存
(setq ac-comphist-file "~/.emacs.d/elisp/auto-complete-dics/auto-dics")
(setq ac-dictionary-directories "~/.emacs.d/elisp/auto-complete-dics/")

anything

"M-x auto-install-batch RET anything"
インストールするファイル数多いからちょっとめんどう
completedしたら、init.elに以下の文を追加
;; 
;; anything --------------------------------------
;; 
(require 'anything)
(require 'anything-startup)
(require 'anything-config)
(require 'recentf)
(add-to-list 'anything-sources 'anything-c-source-emacs-commands)
(define-key global-map (kbd "C-^") 'anything) ;Ctrl-^で起動
;; 縦横切り替え
(defun my-anything-toggle-resplit-window ()
  (interactive)
  (when (anything-window)
    (save-selected-window
      (select-window (anything-window))
      (let ((before-height (window-height)))
        (delete-other-windows)
        (switch-to-buffer anything-current-buffer)
        (if (= (window-height) before-height)
            (split-window-vertically)
          (split-window-horizontally)))
      (select-window (next-window))
      (switch-to-buffer anything-buffer))))

(define-key anything-map "\C-j" 'my-anything-toggle-resplit-window)
;;バッファの一覧を取得
;;anything-c-source-buffers
;;バッファにマッチしなかった場合にバッファを作成
;;anything-c-source-buffer-not-found
;;カレントディレクトリにあるファイル一覧
;;anything-c-source-files-in-current-dir
;;最近開いたファイル一覧
;;anything-c-source-recentf
(setq recentf-max-saved-items 3000)
(recentf-mode 1)
これで、C-^でanythingがつかえるようになる。

また、縦分割の方が使いやすい!と言う人は、C-jで縦横分割をトグルする方法は以下。
ただ、初期設定で縦分割する方法はまだよくわかってないです。
(defun my-anything-toggle-resplit-window ()
  (interactive)
  (when (anything-window)
    (save-selected-window
      (select-window (anything-window))
      (let ((before-height (window-height)))
        (delete-other-windows)
        (switch-to-buffer anything-current-buffer)
        (if (= (window-height) before-height)
            (split-window-vertically)
          (split-window-horizontally)))
      (select-window (next-window))
      (switch-to-buffer anything-buffer))))

(define-key anything-map "\C-j" 'my-anything-toggle-resplit-window)

色設定

;; color設定
(require 'color-theme)
(color-theme-initialize)
(color-theme-bharadwaj-slate) ;;ここを自由に変えるとよい。M-x color-thee-selectで選べます。

カーソル位置を表示

;; カーソル位置を表示
(setq line-number-mode t)
(setq column-number-mode t)

同一ファイル名のバッファの名前をわかりやすくする

;; 同一ファイル名のバッファをわかりやすくする
(require 'uniquify)
(setq uniquify-buffer-name-style 'post-forward-angle-brackets)

jaspace

;; 全角空白、Tab、改行表示
(require 'jaspace)
(setq jaspace-alternate-jaspace-string "□")
(setq jaspace-alternate-eol-string "↓\n")
(setq jaspace-highlight-tabs t)
(setq jaspace-modes
      (append jaspace-modes
              '(scheme-mode php-mode yaml-mode js-mode ruby-mode text-mode fundamental-mode LaTeX-mode)))

GDBを使いやすくする

以下の設定を追加。

;;;;;;;;;;;;;;;;;;;;;;
;; GDB関連
;;;;;;;;;;;;;;;;;;;;;;

;; 有用なバッファを開くモード
(setq gdb-many-windows t)

;; 変数の上にマウスカーソルを置くと値を表示
(add-hook 'gdb-mode-hook '(lambda () (gud-tooltip-mode t)))
((lambda nil (gud-tooltip-mode t)))

;; I/O バッファを表示
(setq gdb-use-separate-io-buffer t)

;; t にすると mini buffer に値が表示される
(setq gud-tooltip-echo-area nil)

ansi-termとshell-pop

;; ansi-termの設定
(require 'term)
(defvar ansi-term-after-hook nil)
(add-hook 'ansi-term-after-hook
        (function
          (lambda ()
             (define-key term-raw-map "\C-x\C-v" '(lambda ()(interactive)(ansi-term "/bin/zsh")))
             (define-key term-raw-map "\C-c\C-c" 'my-term-line-char-switch))))

(defadvice ansi-term (after ansi-term-after-advice (arg))
  "run hook as after advice"
  (run-hooks 'ansi-term-after-hook))
(ad-activate 'ansi-term)

(defun my-term-line-char-switch()
  (interactive)
  (if (term-in-line-mode) (term-char-mode)
    (if (term-in-char-mode) (term-line-mode))))

(add-hook 'term-mode-hook
        (function
          (lambda ()
                (setq term-prompt-regexp "^[^#$%>\n]*[#$%>] *")
                (make-local-variable 'mouse-yank-at-point)
                (make-local-variable 'transient-mark-mode)
                (setq mouse-yank-at-point t)
                (setq transient-mark-mode t)
                (auto-fill-mode -1)
        (setq tab-width 4)
                (define-key term-mode-map "\C-i" 'term-dynamic-complete)
                (define-key term-mode-map "\C-m" 'term-send-input))))

;; キーマップの設定
(defvar my-shell-pop-key (kbd "C-t"))
(defvar my-ansi-term-toggle-mode-key (kbd "<f2>"))

;; ansi-termの設定
(defadvice ansi-term (after ansi-term-after-advice (arg))
  "run hook as after advice"
  (run-hooks 'ansi-term-after-hook))
(ad-activate 'ansi-term)

(defun my-term-switch-line-char ()
  "Switch `term-in-line-mode' and `term-in-char-mode' in `ansi-term'"
  (interactive)
  (cond
   ((term-in-line-mode)
    (term-char-mode)
    (hl-line-mode -1))
   ((term-in-char-mode)
    (term-line-mode)
    (hl-line-mode 1))))

(defadvice anything-c-kill-ring-action (around my-anything-kill-ring-term-advice activate)
  "In term-mode, use `term-send-raw-string' instead of `insert-for-yank'"
  (if (eq major-mode 'term-mode)
      (letf (((symbol-function 'insert-for-yank) (symbol-function 'term-send-raw-string)))
        ad-do-it)
    ad-do-it))

(defvar ansi-term-after-hook nil)
(add-hook 'ansi-term-after-hook
          (lambda ()
            ;; shell-pop
            (define-key term-raw-map my-shell-pop-key 'shell-pop)
            ;; これがないと M-x できなかったり
            (define-key term-raw-map (kbd "M-x") 'nil)
            ;; コピー, 貼り付け
            (define-key term-raw-map (kbd "C-k")
              (lambda (&optional arg) (interactive "P") (funcall 'kill-line arg) (term-send-raw)))
            (define-key term-raw-map (kbd "C-y") 'term-paste)
            (define-key term-raw-map (kbd "M-y") 'anything-show-kill-ring)
            ;; C-t で line-mode と char-mode を切り替える
            (define-key term-raw-map  my-ansi-term-toggle-mode-key 'my-term-switch-line-char)
            (define-key term-mode-map my-ansi-term-toggle-mode-key 'my-term-switch-line-char)
            ;; Tango!
            (setq ansi-term-color-vector
                  [unspecified
                   "#000000"           ; black
                   "#ff3c3c"           ; red
                   "#84dd27"           ; green
                   "#eab93d"           ; yellow
                   "#135ecc"           ; blue
                   "#f47006"           ; magenta
                   "#89b6e2"           ; cyan
                   "#ffffff"]          ; white
                  )
            ))


;; shell-popの設定
(require 'shell-pop)
 
(shell-pop-set-window-height 50)
(shell-pop-set-internal-mode "ansi-term")
(shell-pop-set-internal-mode-shell shell-file-name)

(global-set-key my-shell-pop-key 'shell-pop)

dsvn

いれたら以下をinit.elに追加
;dsvnの設定
(autoload 'svn-status "dsvn" "Run `svn status'." t)
(autoload 'svn-update "dsvn" "Run `svn update'." t)

magit

$ sudo aptitude install magit
して、init.elに以下を加えるだけ
(require 'magit)
gitが便利に使えそう。

anything-rcodetools

  1. rubyやgem等環境設定後
  2. $ gem install rcodetools fastri
    
  3. emacsでauto-install-from-emacswikiで、anything-rcodetools
  4. rubyのインストール先/.gem/ruby/1.8/gems/rcodetools-0.x.x/にあるrcodetools.elをロードパスの通った場所にコピー
    • rvmつかってるときは、~/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/gems/1.9/gems/rcodetools-0.8.5.0とかそのへん。
  5. ~/.emacs.d/init.elに以下を追加
  6. ;; rcodetools
    require 'rcodetools)
    (setq rct-find-tag-if-available nil)
    (defun make-ruby-scratch-buffer ()
      (with-current-buffer (get-buffer-create "*ruby scratch*")
        (ruby-mode)
        (current-buffer)))
    (defun ruby-scratch ()
      (interactive)
      (pop-to-buffer (make-ruby-scratch-buffer)))
    (defun ruby-mode-hook-rcodetools ()
      (define-key ruby-mode-map "\M-\C-i" 'rct-complete-symbol)
      (define-key ruby-mode-map "\C-c\C-t" 'ruby-toggle-buffer)
      (define-key ruby-mode-map "\C-c\C-d" 'xmp)
      (define-key ruby-mode-map "\C-c\C-f" 'rct-ri))
    (add-hook 'ruby-mode-hook 'ruby-mode-hook-rcodetools)
    (require 'anything-rcodetools)
    ;; Command to get all RI entries.
    (setq rct-get-all-methods-command "PAGER=cat fri -l")
    ;; See docs
    (define-key anything-map [(control ?;)] 'anything-execute-persistent-action)
    

メモ

cua-mode

  • CTRL-RETで選択後ESC-nで連番の挿入
;; 矩形選択 (C-RET)
(cua-mode t)
(setq cua-enable-cua-keys nil)

デフォルトフォントサイズの変更 [#cabbaa9c]

  1. scratchで
  2. (frame-parameter nil 'font)
    
  3. .Xresourcesに結果をはって、フォントサイズっぽいとこを変える
  4. emacs*font: (1ででた結果)
    
  5. これやってemacs再起動
  6. $ xrdb .Xresources
    

windows

  • インストール
emacsをちょっと便利につかう
を参考にしてみた
  • フォント
等幅のメイリオの作り方
MeiryoKe_console

はまったこと

emacs@cygwinで、auto-install-batchをやろうとするとsyntax error なんちゃらvoid: Usage: [#g3260fb6]

emacsがきちんとcygwinにインストールされてなかったようです。
cygwinのインストーラーから、emacs関連のものをすべてインストールしたら普通につかえました。