Last modified: 2010/06/30 12:06:27
Emacsの設定をだらだら載せてます。
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リファレンス
設定
雑多な設定
;;; 対応する括弧を光らせる。 (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
