Last modified: 2010/06/30 12:06:27

Emacsの設定をだらだら載せてます。

My環境
elispリファレンス
設定
雑多な設定
フレーム設定
キーバインド
elispファイルの自動コンパイル
タブ化
モードラインに日時表示
カレンダーの祝日表示
スクリプトファイル保存時実行権限付加
更新時刻埋め込み
sudoでファイルを編集
キーボードマクロ
Org-mode
設定
remember-el
Muse
設定
使い方
JDE
設定
SLIME
設定
タブ設定
ParEdit
設定
使い方
困ったら
結果
psvn
ソース
キーバインド
メモ
ミニバッファで改行を扱う
navi2ch
eshell
複数起動
音楽再生(emms)
導入
設定
使い方

My環境

ライブラリは極力aptitudeで導入してます。

OS Ubuntu Linux 10.04
Emacsバージョン 23
初期設定ファイル ~/.emacs.el
個々の設定ファイル場所 ~/.emacs.d/conf/
個別導入のライブラリ場所 ~/.emacs.d/lib/

.emacs.el。

;;; aptにないelispはこの中に
(add-to-list 'load-path (expand-file-name "~/.emacs.d/lib/"))

;;; 各設定ファイルロード
;;; 一括コンパイル-> emacs -batch -f batch-byte-compile *.el
(mapc #'load (directory-files "~/.emacs.d/conf/" t "my-.*\.elc"))

term?関数でterminalからの起動かどうか判定してみました。 設定ファイルは~/.emacs.d/conf/my-hogehoge.el として配置するイメージ。

で、書いたら保存時にバイトコンパイルするようにして.elc生成する設定をしているのでelcをロードするようにしてます。

apacheも設定ファイルぼこぼこ分けるのがデフォみたいなのでトレンドに乗りました。

elispリファレンス

GNU Emacs Lisp リファレンスマニュアル

設定

雑多な設定

;;; 対応する括弧を光らせる。
(show-paren-mode 1)
;;; バックアップファイルを作らない
(setq backup-inhibited t)
;;; 終了時にオートセーブファイルを消す
(setq delete-auto-save-files t)
;;; カーソルの点滅を止める
(blink-cursor-mode 0)
;;; カーソルの位置が何文字目かを表示する
(column-number-mode t)
;;; 圧縮されたファイルも編集できるようにする
(auto-compression-mode t)
;;;領域に色を付ける
(transient-mark-mode 1)

;;; 起動時の画面をscratchにする
(setq inhibit-startup-message t) 

;;; 新規バッファはLISP
;(setq default-major-mode 'lisp-interaction-mode)
;これとPareditを組み合わせるとMewのメール送信が悲惨な事に

;;; 常にデバッグモード
;(setq debug-on-error t)

;;; クリップボードの文字コード設定
;;; Ubuntu10.04 emacs23になってから設定しないほうが文字化けしなくなった。。
;(set-clipboard-coding-system 'utf-8)
;(setq x-select-enable-clipboard t)
;(set-selection-coding-system 'compound-text-with-extensions)

(when window-system
  ; もろもろ非表示
  (menu-bar-mode 0)
  (tool-bar-mode 0)
  (scroll-bar-mode nil))

;;; デフォルトタブ幅
(setq-default tab-width 4)
(setq-default tab-stop-list
  '(0 4 8 12 16 20 24 28 32 36))

;; タブをスペースにする
(setq-default indent-tabs-mode nil)

;;; 同一ファイル名のバッファ名にはディレクトリを表示
(require 'uniquify)
(setq uniquify-buffer-name-style 'post-forward-angle-brackets)

;;; C-x C-f時、カーソル付近のファイル名orURLをミニバッファに持ってくる
(ffap-bindings)

;;; util
(defun concat-symbol (&rest args)
  (intern (mapconcat 'symbol-name args "")))

Ubuntu にしてからコピペで文字化けするようになったのでクリップボードの文字コードを設定するようにしました。

フレーム設定

(when window-system
  (setq default-frame-alist
        (append(list
                '(foreground-color . "black")
                '(background-color . "#f5f5d7")
                '(border-color . "black")
                '(mouse-color . "black")
                '(cursor-color . "pink")
                '(width . 60)
                '(height . 42))
               default-frame-alist)))

キーバインド

 ;; C-h をBackspaceとして割り当て
(keyboard-translate ?\C-h ?\C-?)

;; M-h 1つ前の単語削除
(global-set-key "\M-h" 'backward-kill-word)

;; C-x p 1つ前のウィンドウに移動
(global-set-key "\C-xp" (lambda () (interactive) (other-window -1)))
;;C-c o ブラウザー起動
(global-set-key "\C-co" 'browse-url-at-point)
;; 中クリック ブラウザー起動
;(global-set-key [mouse-2] 'browse-url-at-mouse)

;; カレントバッファでバッファリストを出す
(global-set-key "\C-x\C-b" 'buffer-menu)

;; 現在のカーソル行と次の行を連結させる
(global-set-key "\M-j" (lambda () (interactive) (join-line t)))

;; ウィンドウ最小化を無効
(global-set-key "\C-z" nil)

elispファイルの自動コンパイル

ファイル保存時、拡張子が.elの場合byte-compileする設定。 .emacsを特別扱いしたくない為に.emacs.elとして運用することに。

;;; 自動バイトコンパイル
(add-hook 'after-save-hook
          (lambda ()
            (let ((file (buffer-file-name)))
              (when (string-match ".*\\.el$" file)
                (save-excursion (byte-compile-file file))))))

タブ化

設定

(setq elscreen-prefix-key "\C-o")
(load "elscreen")

デフォルトではC-zがprefixキーに割り当てられてるのでC-oに設定してます。

使い方

C-o c タブ追加
C-o k タブ削除
C-o n 次のタブを表示
C-o p 前のタブを表示

C-o C-c とCtrlキー押したままでも効くようです。

モードラインに日時表示

曜日は英語表記が好き。

(setq display-time-string-forms
      '((let ((system-time-locale "C"))
          (format-time-string "%m/%d(%a)%H:%M"))))
(display-time)

カレンダーの祝日表示

M-x calendar の祝日表示機能。

japanese-holidays.el

どっかからjapanese-holidays.elを拾ってきてload-pathの通ってる場所に投入。

設定

(autoload 'calendar "calendar" nil t)

(eval-after-load "calendar"
  '(progn
    (require 'japanese-holidays)
    (setq calendar-mark-holidays-flag t)
    (setq calendar-holidays (append japanese-holidays))
    (setq calendar-weekend-marker 'diary)
    (add-hook 'today-visible-calendar-hook 'calendar-mark-weekend)
    (add-hook 'today-invisible-calendar-hook 'calendar-mark-weekend)))

スクリプトファイル保存時実行権限付加

;;; スクリプト保存時自動的に実行権限を付加
(defun make-file-executable ()
  "Make the file of this buffer executable, when it is a script source."
  (save-restriction
    (widen)
    (if (string= "#!" (buffer-substring-no-properties 1 (min 3 (point-max))))
        (let ((name (buffer-file-name)))
          (or (equal ?. (string-to-char (file-name-nondirectory name)))
              (let ((mode (file-modes name)))
                (set-file-modes name (logior mode (logand (/ mode 4) 73)))
                (message (concat "Wrote " name " (+x)"))))))))
(add-hook 'after-save-hook 'make-file-executable)

更新時刻埋め込み

ファイルの最初の方に Last modified:と書いておくと、

Last modified: 2009/06/07 12:00:00

という感じに埋め込む。

(autoload 'time-stamp "time-stamp" nil t)

(add-hook 'write-file-hooks 'time-stamp)
(eval-after-load "time-stamp"
  '(progn
     (setq time-stamp-start "Last modified:")
     (setq time-stamp-format " %04y/%02m/%02d %02H:%02M:%02S")
     (setq time-stamp-end "$")
     ;; 何行目まで置換対象とするか
     (setq time-stamp-count 3)))

sudoでファイルを編集

ファイルを開くときに C-x C-fの後、

/sudo::/etc/hosts
と打つとhostsをroot権限で編集できます。

キーボードマクロ

一連のキー操作を覚えさせ、繰り返し実行することが出来ます。

C-x ( 定義開始
C-x ) 定義終了
C-x e 上記で定義したマクロを実行

他にも色々あるけどとりあえずこれだけ覚えるだけでもいい感じかも。

Org-mode

EmacsでGTDと言ったらorg-modeみたいです。

設定

;; M-x gtd
(defun gtd()
  (interactive)
  (add-to-list 'auto-mode-alist '("\\.org$" . org-mode))
  (define-key global-map "\C-cl" 'org-store-link)
  (define-key global-map "\C-ca" 'org-agenda)
  (add-hook 'org-mode-hook 'turn-on-font-lock)
  (find-file "~/org/mygtd.org"))

;; 公開設定
;(require 'org-publish)
;(setq org-publish-project-alist
;     '(("strnet"
;        :base-directory "~/public_html/org/"
;        :publishing-directory "~/public_html"
;        :headline-level 3
;        :section-numbers nil
;        :table-of-contents nil
;        :publishing-function org-publish-org-to-html
;        :style "<link rel=stylesheet href=\"str.css\" type=\"text/css\">"
;        :timestamp nil
;        :author "Kazamai"
;        :email nil)
;       ("website" :components ("strnet"))))

gtd関数: ~/org/mygtd.orgを用意して、M-x gtd と打つと開くだけ。 org-publishでHTMLに変換できたりするらしいですが、Webサイト管理はmuseのが良さげなのでorg-modeはGTD管理のみ。

remember-el

上記を設定した上で、タスクが増えたときいちいちgtdを実行せずタスクを足す方法。

(autoload 'remember "remember" nil t)
(define-key global-map "\C-cr" 'remember)
(eval-after-load "remember"
  '(progn
     (setq org-directory "~/org/")
     (setq remember-annotation-functions '(org-remember-annotation))
     (setq remember-handler-functions '(org-remember-handler))
     (add-hook 'remember-mode-hook 'org-remember-apply-template)
     (setq org-remember-templates
           '(("Todo" ?t "* TODO %^{Brief Description}" "~/org/mygtd.org" "Tasks")))))
これで、emacs上で C-c r を実行し、ミニバッファにやることを書いてEnterを押した後、C-c C-c でmygtd.orgにTODOが追加される。

Muse

Webサイトの文書作成をより簡単にするやつ。 このサイトはMuseで出力しています。

設定

(autoload 'muse-mode "muse-mode" nil t)

(eval-after-load "muse-mode"
  '(progn
     (require 'muse-project)
     (require 'muse-html)
     (setq muse-html-encoding-default 'utf-8)
     (setq muse-html-src-allowed-modes
           '("apache" "awk" "c++" "c" "css" "dns"
             "emacs-lisp" "html" "java" "lisp" "muse"
             "org" "outline" "sh" "sql" "xml" "slime"))
     
     (muse-derive-style "strnet-base" "xhtml"
                        :author "Kazamai, Kou"
                        :style-sheet "strnet.css"
                        :header "~/.emacs.d/template/strnet/header.html"
                        :footer "~/.emacs.d/template/strnet/footer.html"
                        :base-url "http://www.strnet.com/")
     
     (add-to-list 'muse-project-alist
                  '("STR"
                    ("~/muse/" :default "index")
                    (:base "strnet-base" :path "/ssh:kazamai@kuru:~/public_html/")))))

;(setq muse-project-alist
;     `("STR"
;       (,@(muse-project-alist-dirs "~/muse") :default "index")
;       ,@(muse-project-alist-styles "~/muse"
;                                    "~/public_html/muse/"
;                                    "strnet-base")))

使い方

出力

muse文書を書いた後、C-c C-pで出力。

htmlize.el

どっかからhtmlize.elを拾ってきてload-pathの通ってる場所に投入。

ソースファイルのインポート

<include file="~/.emacs.d/conf/my-muse.el" markup="src" lang="emacs-lisp">
こんな感じでインポートできます。htmlizeが有効の場合色も付きます。

JDE

Javaの開発環境。

設定

(autoload 'jde "jde" nil t)

(add-to-list 'auto-mode-alist '("\\.java$" . jde-mode))
(autoload 'jde-mode "jde" nil t)

(c-add-style "java_str"
             '((c-basic-offset . 4)
               (c-comment-only-line-offset . 0)
               (indent-tabs-mode t)
               (c-hanging-comment-starter-p)
               (c-offsets-alist . 
                                ((topmost-intro-cont . +)
                                 (statement-block-intro . +)
                                 (knr-argdecl-intro . 0)
                                 (label . 0)
                                 (statement-case-open . +)
                                 (statement-cont . +)
                                 (arglist-intro . +)
                                 (arglist-close . 0)
                                 (access-label . 0)
                                 (inher-cont . c-lineup-java-inher)
                                 (func-decl-cont . c-lineup-java-throws)
                                 (substatement-open . 0)
                                 (inline-open . nil) ))))

(add-hook 'jde-mode-hook
    '(lambda ()
       (c-set-offset 'arglist-intro '+)
       (c-set-offset 'arglist-close 0)
       (c-set-style "java_str")
       (define-key jde-mode-map "\C-c\C-vc" 'jde-import-kill-extra-imports)
       ;; 動的文字補完時の大文字小文字を区別する
       (setq dabbrev-case-fold-search nil)))


Ubuntu Linuxで、/etc/emacs.d/site-start.dに初期ロードするファイルの定義があります。

JDE関係のライブラリは重いので、Java開発時のみロードしてもらうようファイルの一部を移動します。

cd /etc/emacs.d/site-start.d/
sudo mkdir ../tmp
sudo mv 50cedet-common.el 50eieio.el ../tmp/
sudo mv 51ede.el 51speedbar.el 52semantic.el ../tmp/
sudo mv 53cedet-contrib.el 53cogre.el 54jde.el 55ecb.el ../tmp/

SLIME

Common Lispの開発環境。

設定

slime, hyperspec, w3m-elを導入。

(require 'slime)

(add-to-list 'auto-mode-alist '("\\.cl$" . lisp-mode))
(add-to-list 'auto-mode-alist '("\\.lisp$" . lisp-mode))
(setq slime-net-coding-system 'utf-8-unix)
(add-hook 'lisp-mode-hook (lambda ()
                            (slime-mode t)
                            (show-paren-mode)))

(add-hook 'slime-mode-hook
          (lambda ()
            (setq lisp-indent-function 'common-lisp-indent-function)))
(add-hook 'inferior-lisp-mode-hook
          (lambda ()
            (slime-mode t)
            (show-paren-mode)))
(setq inferior-lisp-program "/usr/bin/sbcl")
;; Additional definitions by Pierpaolo Bernardi.
(defun cl-indent (sym indent)
  (put sym 'common-lisp-indent-function
       (if (symbolp indent)
           (get indent 'common-lisp-indent-function)
         indent)))

(cl-indent 'if '1)
(cl-indent 'generic-flet 'flet)
(cl-indent 'generic-labels 'labels)
(cl-indent 'with-accessors 'multiple-value-bind)
(cl-indent 'with-added-methods '((1 4 ((&whole 1))) (2 &body)))
(cl-indent 'with-condition-restarts '((1 4 ((&whole 1))) (2 &body)))
(cl-indent 'with-simple-restart '((1 4 ((&whole 1))) (2 &body)))

;; hyperspec
(require 'w3m-load)
(defadvice common-lisp-hyperspec
  (around hyperspec-lookup-w3m () activate)
  (let* ((window-configuration (current-window-configuration))
         (browse-url-browser-function
          `(lambda (url new-window)
             (w3m-browse-url url nil)
             (let ((hs-map (copy-keymap w3m-mode-map)))
               (define-key hs-map (kbd "q")
                 (lambda ()
                   (interactive)
                   (kill-buffer nil)
                   (set-window-configuration ,window-configuration)))
               (use-local-map hs-map)))))
    ad-do-it))

(define-key slime-mode-map "\C-ch" 'hyperspec-lookup)

タブ設定

ソース書いてる時にC-iだけでシンボル補完がしたかったので以下を追加。

(defun complete-symbol-or-indent ()
  "直前に英字があればシンボル補完、なければインデント"
  (interactive)
  (let ((p (point)))
    (if (and (> p (point-min))
             (string-match "[a-zA-Z]" (buffer-substring (1- p) p)))
        (slime-complete-symbol)
        (lisp-indent-line))))

(define-key slime-mode-map "\C-i" 'complete-symbol-or-indent)

ParEdit

Lispで一番打つのが多そうなカッコや、'[' '"'を補完してくれるやつ。

試験的に導入中。変にコピペとかしてカッコの数が合わないと悲惨な事になる。

設定

(mapc (lambda (mode)
    (let ((hook (intern (concat (symbol-name mode)
                    "-mode-hook"))))
      (add-hook hook (lambda () (paredit-mode +1)))))
      '(emacs-lisp lisp slime))

使い方

普通にS式を書くだけです。

')'を打つと次の行に行ってインデントもしてくれるので少し便利。

なので厳密に言うと')'の補完という使い方ではない気もする。

困ったら

C-q [word] で直接';'とか'('とか打てます。 C-q ; でコメントアウトとか。

それでもどうしようもない時はM-x paredit-mode でParEditをOffにしよう!

結果

リファクタリングとか改修が非常にやり辛いのでParEdit使うの止めました。

psvn

ソース

キーバインド

覚えられん

;; M-x svn-status: run 'svn -status -v'
;; M-x svn-examine (like pcl-cvs cvs-examine) is alias for svn-status
;;
;; and show the result in the svn-status-buffer-name buffer (normally: *svn-status*).
;; If svn-status-verbose is set to nil, only "svn status" without "-v"
;; is run. Currently you have to toggle this variable manually.
;; This buffer uses svn-status mode in which the following keys are defined:
;; g     - svn-status-update:               run 'svn status -v'
;; M-s   - svn-status-update:               run 'svn status -v'
;; C-u g - svn-status-update:               run 'svn status -vu'
;; =     - svn-status-show-svn-diff         run 'svn diff'
;; l     - svn-status-show-svn-log          run 'svn log'
;; i     - svn-status-info                  run 'svn info'
;; r     - svn-status-revert                run 'svn revert'
;; X v   - svn-status-resolved              run 'svn resolved'
;; U     - svn-status-update-cmd            run 'svn update'
;; M-u   - svn-status-update-cmd            run 'svn update'
;; c     - svn-status-commit                run 'svn commit'
;; a     - svn-status-add-file              run 'svn add --non-recursive'
;; A     - svn-status-add-file-recursively  run 'svn add'
;; +     - svn-status-make-directory        run 'svn mkdir'
;; R     - svn-status-mv                    run 'svn mv'
;; C     - svn-status-cp                    run 'svn cp'
;; D     - svn-status-rm                    run 'svn rm'
;; M-c   - svn-status-cleanup               run 'svn cleanup'
;; k     - svn-status-lock                  run 'svn lock'
;; K     - svn-status-unlock                run 'svn unlock'
;; b     - svn-status-blame                 run 'svn blame'
;; X e   - svn-status-export                run 'svn export'
;; RET   - svn-status-find-file-or-examine-directory
;; ^     - svn-status-examine-parent
;; ~     - svn-status-get-specific-revision
;; E     - svn-status-ediff-with-revision
;; X X   - svn-status-resolve-conflicts
;; s     - svn-status-show-process-buffer
;; h     - svn-status-pop-to-partner-buffer
;; e     - svn-status-toggle-edit-cmd-flag
;; ?     - svn-status-toggle-hide-unknown
;; _     - svn-status-toggle-hide-unmodified
;; m     - svn-status-set-user-mark
;; u     - svn-status-unset-user-mark
;; $     - svn-status-toggle-elide
;; w     - svn-status-copy-current-line-info
;; DEL   - svn-status-unset-user-mark-backwards
;; * !   - svn-status-unset-all-usermarks
;; * ?   - svn-status-mark-unknown
;; * A   - svn-status-mark-added
;; * M   - svn-status-mark-modified
;; * D   - svn-status-mark-deleted
;; * *   - svn-status-mark-changed
;; * .   - svn-status-mark-by-file-ext
;; * %   - svn-status-mark-filename-regexp
;; .     - svn-status-goto-root-or-return
;; f     - svn-status-find-file
;; o     - svn-status-find-file-other-window
;; C-o   - svn-status-find-file-other-window-noselect
;; v     - svn-status-view-file-other-window
;; I     - svn-status-parse-info
;; V     - svn-status-svnversion
;; P l   - svn-status-property-list
;; P s   - svn-status-property-set
;; P d   - svn-status-property-delete
;; P e   - svn-status-property-edit-one-entry
;; P i   - svn-status-property-ignore-file
;; P I   - svn-status-property-ignore-file-extension
;; P C-i - svn-status-property-edit-svn-ignore
;; P k   - svn-status-property-set-keyword-list
;; P K i - svn-status-property-set-keyword-id
;; P K d - svn-status-property-set-keyword-date
;; P y   - svn-status-property-set-eol-style
;; P x   - svn-status-property-set-executable
;; P m   - svn-status-property-set-mime-type
;; H     - svn-status-use-history
;; x     - svn-status-update-buffer
;; q     - svn-status-bury-buffer

;; C-x C-j - svn-status-dired-jump

;; The output in the buffer contains this header to ease reading
;; of svn output:
;;   FPH BASE CMTD Author   em File
;; F = Filemark
;; P = Property mark
;; H = History mark
;; BASE = local base revision
;; CMTD = last committed revision
;; Author = author of change
;; em = "**" or "(Update Available)" [see `svn-status-short-mod-flag-p']
;;      if file can be updated
;; File = path/filename

メモ

ミニバッファで改行を扱う

C-q C-jで改行が入る。

replace-string hoge[C-q C-j] hoge これでhogeの次の改行が取れる。

navi2ch

2chブラウザ。

導入手順

/etc/apt/sources.listに以下を追加。

deb http://navi2ch.sourceforge.net/debian ./
deb-src http://navi2ch.sourceforge.net/debian/source ./
その後以下を実行。
sudo aptitude update
sudo aptitude install navi2ch

eshell

複数起動

eshell上で、

eshell t
とする。

音楽再生(emms)

結構使いやすい音楽プレイヤー。 バックエンドはmplayerにしてます。

導入

sudo aptitude install mplayer emms

設定

(require 'emms-setup)

(emms-standard)
(emms-default-players)
(setq emms-repeat-playlist t)
;; mplayerで再生
(setq emms-player-list '(emms-player-mplayer))
(setq emms-source-file-default-directory "~/music/")
(setq emms-playlist-buffer-name "*emms*")

(define-key global-map "\C-cS" 'emms-stop)
(define-key global-map "\C-cP" 'emms-start)

使い方

M-x emms-play-file ファイルを再生
M-x emms-play-directory ディレクトリを追加
M-x emms-play-directory-tree ディレクトリ以下すべてを追加
playをaddに変えればプレイリスト追加になります。(emms-add-file等)

M-x emms-playlist-mode-go プレイリスト表示
プレイリストバッファでも操作が出来ます。
参考URL