VimからEmacsに乗り換えたので便利機能紹介します

| 【33分で読めるよ!】 | コメント(11) | トラックバック(0)

「深町さん、最近どうですか?」
「最近? 寒いです」

 寒いです。寒いので春を待ちわびていると、ふとEmacsが使いたくなったので乗り換えてみました。

「Emacsどう?」
「まあ慣れましたけど、やっぱVimのほうが早いですよ」

 とか平気で言っちゃうEmacsenですが、そろそろ.emacs.elも固まってきたのでアップしようと思います。

バッファ移動が面倒

「Emacsって起動が遅いじゃないですかー」
「起動って一回しかしないよね」

 Emacsは一回起動したら滅多に落としません。Vimなら毎回Terminalから起動して、落としてを繰り返すので起動しっぱなしってのに最初は全然慣れませんでした。

 ずっと起動したままにするときの問題は、なんでもかんでもファイルを開いちゃってバッファ増えまくってどれがどれかわかんないーってなることです。えっ僕だけ?

 そんなときC-x bすると一個前のバッファには戻ってくれるんですが、このときに補完候補を表示させるようにすると便利です。

;; C-x bでミニバッファにバッファ候補を表示
(iswitchb-mode t)
(iswitchb-default-keybindings)

 バッファ一覧はC-x C-bでも出せるのですが、「別にそこまでじゃねぇよ」ってほどのときに便利です。

C-kで行全体を削除

 Vimのdd (行削除) に慣れた僕からすれば、C-kはぬるい。行全体削除するのにC-a C-k C-kって押さないといけない。めんどいので、行頭にいる場合は最後の改行もまとめて削除するようにします。

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

C-aでインデントを飛ばした行頭に移動

※追記 (@nfunato](http://twitter.com/nfunato)さんから、M-mでインデントを飛ばした行頭に移動できると教えてもらったため、この設定は無用です。

 Vimでのカーソル移動で、行頭に移動するときにキャレット(^)やI(行頭インサート)を常用していた僕にとって、C-aは曲者です。Vimでいう0の移動をします。行頭に移動したいときなんて行削除くらいしかないってのに…結局C-f連打するとかめんどい。

 ググると既にやっている方がいたのでそのまま流用しました。

;; \C-aでインデントを飛ばした行頭に移動
(defun beginning-of-indented-line (current-point)
  "インデント文字を飛ばした行頭に戻る。ただし、ポイントから行頭までの間にインデント文字しかない場合は、行頭に戻る。"
  (interactive "d")
  (if (string-match
       "^[ ¥t]+$"
       (save-excursion
         (buffer-substring-no-properties
          (progn (beginning-of-line) (point))
          current-point)))
      (beginning-of-line)
    (back-to-indentation)))

 C-aを押すたびに、行頭とインデントを含まない行頭を交互に移動します。

参考 : C-aで「行頭」と「インデントを飛ばした行頭」を行き来する Emacs23対応版 - なんとなく日記

ターミナルでファイルを編集したいとき

 ちょっとした設定ファイルを開くときなど、ターミナルで編集したいときにEmacsだとどうするんでしょう。emacs -nwするとターミナル上でEmacsを開いてくれますが、やっぱり起動は遅いです。そして結局 Vim を使うことに。。

 そんなときにemacsclientを使うといいです。ファイルを既に起動しているEmacs上で行い、編集が終わるとターミナルに結果が戻せます。

 使うにはEmacsでemacs-serverを起動する必要があるので、.emacs.elに追記します。

(if window-system (server-start))

 そして.zshrcに export EDITOR=emacsclient と書いておくといいです。

 まあぶっちゃけ Vim 使っちゃうときもありますけどね :)

elispのインストールを簡単にする

 エディタの拡張のインストールって意外と面倒なものです。ダウンロードして、解凍して、ディレクトリにつっこむ。そこでinstall-elisp.elという拡張を入れると、elispの導入をEmacs上でできます。※要インストール

;; elispのインストールを簡単に
(require 'install-elisp)
(setq install-elisp-repository-directory "~/.emacs.d/elisp")

 導入後、M-x install-elisp <URL> や、M-x install-elisp-from-emacswiki auto-complete.el などするだけで、ダウンロード、コンパイル、インストールのフローをEmacs上でできます。

※追記 : cametan_001さんから、install-elisp.elは古くて、今はauto-install.elだーと言われました。作者は同じrubikitchさんで、複数ファイルを同時にインストールできるようです。

参考 : auto-install.elでEmacsLispパッケージを自動インストール→anything.el関連を一括インストール - (rubikitch loves (Emacs Ruby CUI))

矩形選択を簡単にする

 Emacsになって一番嫌だったのが、矩形選択がものすごく大変だったことです。範囲選択してC-x r k? なんて冗長なんだ。しかも間違ってC-x C-rとか押しちゃって怒られると範囲選択しなおさないといけないし。Vimの矩形選択モードが懐かしい。

 そこでググると、sense-regionという拡張を作ってらっしゃる方がいました。するとどうやら切り取りや貼付けが同じキーバインドでできるらしい。

;; sense-region
;; 矩形選択を簡単に
(autoload 'sense-region-on "sense-region"
  "System to toggle region and rectangle." t nil)

 さらにこの拡張を入れるとC-Spaceを押すたびにインクリメンタルに選択する機能も入ります。こちらもとても便利です。

※追記 : @knuさんからsense-region.elは古いので標準添付のcua-modeを使うといい、というアドバイスをもらいました。早速使ってみましたが、事足りる以上にsense-regionではできなかった、矩形範囲前への挿入(C-x r tにあたる操作)もできるみたいです。

(cua-mode t)
(setq cua-enable-cua-keys nil) ;; 変なキーバインド禁止

 C-RETで選択→RETという流れで使います。あとcua-modeには連番挿入機能(M-n)もあります。

参考 : cua-mode - ぺっくブログミラー

参考 : Emacs Column Editing on Vimeo

EmacsでQuake風にshellを使う

 Qtで動くソフトウェアでQuakeというユーティリティがあります。これは指定キーを打つと画面の上部からぬるっとターミナルが出てくる便利ツールです。GtkではGuake、MacではVisorという名前で移植されています。

 これをEmacs上で実現する拡張がshell-popです。※要インストール

;; shell-pop
;; C-tでshellをポップアップ
(require 'shell-pop)
(shell-pop-set-internal-mode "ansi-term") ;; ansi-termを使うよ
(shell-pop-set-internal-mode-shell "/bin/zsh") ;; zshを使うよ
(defvar ansi-term-after-hook nil)
(add-hook 'ansi-term-after-hook
          '(lambda ()
             (define-key term-raw-map "\C-t" 'shell-pop)))
(defadvice ansi-term (after ansi-term-after-advice (org))
  "run hook as after advice"
  (run-hooks 'ansi-term-after-hook))
(ad-activate 'ansi-term)
(global-set-key "\C-t" 'shell-pop)

 これで好きなときにC-tを押せば、下にansi-termのウィンドウが表示されます。

参考 : shell-pop.elが便利 - Emacs/Lisp/Drill - Emacsグループ

EmacsでGNU Screen風のインターフェイスを

 Emacsは環境だ! というように、慣れてくるといろんな機能拡張を行って、2chもメールもTwitterもブログ投稿もEmacsでやるようになって、できればここから出たくないと思うようになります。

 ただ、するとバッファを開きすぎて面倒なことになります。「現在のウィンドウ分けのまま他のウィンドウ構成を開きたい…」それElScreenでできるよ。※要インストール

;; ElScreen
;; EmacsでGNU screen風のインターフェイスを使う
(setq elscreen-prefix-key "\C-z")
(require 'elscreen)
(if window-system
    (define-key elscreen-map "\C-z" 'iconify-or-deiconify-frame)
  (define-key elscreen-map "\C-z" 'suspend-emacs))

;; 以下は自動でスクリーンを生成する場合の設定
(defmacro elscreen-create-automatically (ad-do-it)
  `(if (not (elscreen-one-screen-p))
       ,ad-do-it
     (elscreen-create)
     (elscreen-notify-screen-modification 'force-immediately)
     (elscreen-message "New screen is automatically created")))

(defadvice elscreen-next (around elscreen-create-automatically activate)
  (elscreen-create-automatically ad-do-it))

(defadvice elscreen-previous (around elscreen-create-automatically activate)
  (elscreen-create-automatically ad-do-it))

(defadvice elscreen-toggle (around elscreen-create-automatically activate)
  (elscreen-create-automatically ad-do-it))

 あくまで”Screen風”なので、バッファまで分けてはくれません。

 僕は設定していないのですが、Screenをkillしたときにバッファも一緒にkillする設定をしている方もいたので参考までに。

参考 : emacsclient の雑多な設定 - gan2 の Ruby 勉強日記

Emacsでメモ・TODO管理

 ElScreenを僕に教えてくれた手嶋屋のYさんから、「howmも入れるといい」と言われたのですが、便利そうだけど機能が多すぎてどうにも…。ささっとメモ取れるようなのないかなぁと思って探していると org-mode というのを見つけました。※要インストール

;; org-mode
;; Emacsでメモ・TODO管理
(require 'org-install)
(define-key global-map "\C-cl" 'org-store-link)
(define-key global-map "\C-ca" 'org-agenda)
(define-key global-map "\C-cr" 'org-remember)
(setq org-startup-truncated nil)
(setq org-return-follows-link t)
(add-to-list 'auto-mode-alist '("\\.org$" . org-mode))
(org-remember-insinuate)
(setq org-directory "~/memo/")
(setq org-default-notes-file (concat org-directory "notes.org"))
(setq org-agenda-files '("~/memo/notes.org"))
(setq org-remember-templates
      '(("Todo" ?t "** TODO %?\n   %i\n   %a\n   %t" nil "Inbox")
        ("Bug" ?b "** TODO %?   :bug:\n   %i\n   %a\n   %t" nil "Inbox")
        ("Idea" ?i "** %?\n   %i\n   %a\n   %t" nil "New Ideas")))

 C-c rを押すとウィンドウが開いて、Todo / Bug / Idea を選択し、それに応じたorg-modeのバッファが開きます。

 それで適当にメモ。C-c C-cすると保存されます。

 org-modeはシンプルでありながら他にも便利な記法があり、GTD管理までできちゃうみたいです。

参考 : org-mode + remember-mode でEmacs内で瞬時にメモをする→コードリーディングに生かす・メモ検索する - (rubikitch loves (Emacs Ruby CUI))

参考 : OrgMode/OrgTutorial - org-modeのショートツアー

※追記 : 書き忘れましたが、org-modeで作成したメモを同期して閲覧・編集できるiPhoneアプリ「MobileOrg」というのもあります。WebDAVでしか同期できないのでサーバを持ってる人しか使えそうにないですが、使えると便利そうですね。DropboxでWebDAVがサポートされるといいんだけど…。

.emacs.el

 最後に僕の.emacs.elを晒しておきます。まだまだいくらでもリファクタリングできそうで自称Lisperとして恥ずかしいですが…

 beep音を消す、カーソル行をハイライト、フレームの透過、リアルタイム文法チェック(flymake)など、上では紹介しきれなかったtipsも入ってるので、Emacs使い始めの人には参考になるかもしれません。

 もっとこんな便利な機能があるよー、とか、こうするといいんじゃないか、とかあればコメントやTwitterなどで教えてもらえるとありがたいです。

※追記 : @mitsuhirowさんから、anything.elがおすすめだとアドバイスをもらいました。使ってみると「あー、上で紹介しておけばよかったな」と思うものだったので、使ってない人はぜひ調べてみてください。

※追記 : .emacs.elをリファクタリングしました。最新版はgistにあがっているので、もし参考にされる場合はこちらをどうぞ。

http://gist.github.com/gists/304391

;;====================
;; General
;;====================
;; load-pathを追加
(setq load-path (append
                 '("/usr/local/share/emacs/site-lisp"
                   "/opt/local/share/emacs/site-lisp"
                   "/opt/local/share/emacs/site-lisp/slime"
                   "/opt/local/share/emacs/site-lisp/apel"
                   "/opt/local/share/emacs/23.1/site-lisp/emu"
                   "/Applications/MacPorts/Emacs.app/Contents/Resources/site-lisp"
                   "~/.emacs.d/elisp")
                 load-path))

(setq exec-path (append
                 '("/opt/local/bin"
                   "/usr/bin" "/bin"
                   "/usr/sbin" "/sbin" "/usr/local/bin"
                   "/usr/X11/bin" "/opt/local/bin" "/opt/local/bin")
                 exec-path))

;; テキストエンコーディングとしてUTF-8を優先使用
(prefer-coding-system 'utf-8)

;; 起動時のメッセージを非表示
(setq inhibit-startup-message t)

;; zshを使う
(setq shell-file-name "/bin/zsh")

;; Tabの代わりにスペースでインデント
(setq-default indent-tabs-mode nil)
(setq-default tab-width 2 indent-tabs-mode nil)

;; shell-modeでpasswordを隠す
(add-hook 'comint-output-filter-functions 'comint-watch-for-password-prompt)

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

;; カーソル移動を物理行単位に
(require 'physical-line)
(setq-default physical-line-mode t)
;; dired-modeは論理行移動のままにする
(setq physical-line-ignoring-mode-list '(dired-mode))

;; Emacs serverを起動
(if window-system (server-start))

;; 終了してもカーソル位置を記録
(when (require 'session nil t)
  (setq session-initialize '(de-saveplace session keys menus places)
        session-globals-include '((kill-ring 50)
                                  (session-file-alist 500 t)
                                  (file-name-history 10000)))
  (setq session-globals-max-string 100000000)
  (setq history-length t)
  (add-hook 'after-init-hook 'session-initialize))

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

;; minibufferでC-wで前の単語を削除
(define-key minibuffer-local-completion-map "\C-w" 'backward-kill-word)

;; 改行コードを表示
(setq eol-mnemonic-dos "(CRLF)")
(setq eol-mnemonic-mac "(CR)")
(setq eol-mnemonic-unix "(LF)")

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

;; *scratch*を消さない
(defun my-make-scratch (&optional arg)
  (interactive)
  (progn
    ;; "*scratch*" を作成して buffer-list に放り込む
    (set-buffer (get-buffer-create "*scratch*"))
    (funcall initial-major-mode)
    (erase-buffer)
    (when (and initial-scratch-message (not inhibit-startup-message))
      (insert initial-scratch-message))
    (or arg (progn (setq arg 0)
                   (switch-to-buffer "*scratch*")))
    (cond ((= arg 0) (message "*scratch* is cleared up."))
          ((= arg 1) (message "another *scratch* is created")))))

(add-hook 'kill-buffer-query-functions
          ;; *scratch* バッファで kill-buffer したら内容を消去するだけにする
          (lambda ()
            (if (string= "*scratch*" (buffer-name))
                (progn (my-make-scratch 0) nil)
              t)))

(add-hook 'after-save-hook
          ;; *scratch* バッファの内容を保存したら *scratch* バッファを新しく作る
          (lambda ()
            (unless (member (get-buffer "*scratch*") (buffer-list))
              (my-make-scratch 1))))

;; C-x bでミニバッファにバッファ候補を表示
(iswitchb-mode t)
(iswitchb-default-keybindings)

;; beepを消す
(defun my-bell-function ()
  (unless (memq this-command
        '(isearch-abort abort-recursive-edit exit-minibuffer
              keyboard-quit mwheel-scroll down up next-line previous-line
              backward-char forward-char))
    (ding)))
(setq ring-bell-function 'my-bell-function)

;; \C-aでインデントを飛ばした行頭に移動
(defun beginning-of-indented-line (current-point)
  "インデント文字を飛ばした行頭に戻る。ただし、ポイントから行頭までの間にインデント文字しかない場合は、行頭に戻る。"
  (interactive "d")
  (if (string-match
       "^[ ¥t]+$"
       (save-excursion
         (buffer-substring-no-properties
          (progn (beginning-of-line) (point))
          current-point)))
      (beginning-of-line)
    (back-to-indentation)))

(defun beginning-of-visual-indented-line (current-point)
  "インデント文字を飛ばした行頭に戻る。ただし、ポイントから行頭までの間にインデント文 字しかない場合は、行頭に戻る。"
  (interactive "d")
  (let ((vhead-pos (save-excursion (progn (beginning-of-visual-line) (point))))
        (head-pos (save-excursion (progn (beginning-of-line) (point)))))
    (cond
     ;; 物理行の1行目にいる場合
     ((eq vhead-pos head-pos)
      (if (string-match
           "^[ ¥t]+$"
           (buffer-substring-no-properties vhead-pos current-point))
          (beginning-of-visual-line)
        (back-to-indentation)))
     ;; 物理行の2行目以降の先頭にいる場合
     ((eq vhead-pos current-point)
      (backward-char)
      (beginning-of-visual-indented-line (point)))
     ;; 物理行の2行目以降の途中にいる場合
     (t (beginning-of-visual-line)))))

(global-set-key "\C-a" 'beginning-of-visual-indented-line)
(global-set-key "\C-e" 'end-of-visual-line)

;;; for Mac
;; Command-Key and Option-Key
(setq ns-command-modifier (quote meta))
(setq ns-alternate-modifier (quote super))

;;; for Kayac Emacs
;; fullscreen
(global-set-key (kbd "M-") 'ns-toggle-fullscreen)

;;====================
;; Utilities
;;====================
;; install-elisp
;; elispのインストールを簡単に
(require 'install-elisp)
(setq install-elisp-repository-directory "~/.emacs.d/elisp")

;; sense-region
;; 矩形選択を簡単に
(autoload 'sense-region-on "sense-region"
  "System to toggle region and rectangle." t nil)

;; auto-complete
;; 補完候補を自動ポップアップ
(require 'auto-complete)
(global-auto-complete-mode t)
(setq ac-modes (cons 'js-mode ac-modes))

;; auto-insert
;; ファイル形式に応じて自動でテンプレート挿入
(add-hook 'find-file-hooks 'auto-insert)
(setq auto-insert-directory "~/.emacs.d/templates")
(setq auto-insert-alist
      '((perl-mode . "perl-template.pl")
        (html-mode . "html-template.html")
        ("base.css" . "base.css")
        (css-mode . "css-template.css")))

;; shell-pop
;; C-tでshellをポップアップ
(require 'shell-pop)
(shell-pop-set-internal-mode "ansi-term")
(shell-pop-set-internal-mode-shell "/bin/zsh")
(defvar ansi-term-after-hook nil)
(add-hook 'ansi-term-after-hook
          '(lambda ()
             (define-key term-raw-map "\C-t" 'shell-pop)))
(defadvice ansi-term (after ansi-term-after-advice (org))
  "run hook as after advice"
  (run-hooks 'ansi-term-after-hook))
(ad-activate 'ansi-term)
(global-set-key "\C-t" 'shell-pop)

;; ElScreen
;; EmacsでGNU screen風のインターフェイスを使う
(setq elscreen-prefix-key "\C-z")
(require 'elscreen)
(if window-system
    (define-key elscreen-map "\C-z" 'iconify-or-deiconify-frame)
  (define-key elscreen-map "\C-z" 'suspend-emacs))

(defmacro elscreen-create-automatically (ad-do-it)
  `(if (not (elscreen-one-screen-p))
       ,ad-do-it
     (elscreen-create)
     (elscreen-notify-screen-modification 'force-immediately)
     (elscreen-message "New screen is automatically created")))

(defadvice elscreen-next (around elscreen-create-automatically activate)
  (elscreen-create-automatically ad-do-it))

(defadvice elscreen-previous (around elscreen-create-automatically activate)
  (elscreen-create-automatically ad-do-it))

(defadvice elscreen-toggle (around elscreen-create-automatically activate)
  (elscreen-create-automatically ad-do-it))

;; dmacro
;; 2回同じ操作をすると自動でマクロ登録
(defconst *dmacro-key* "\C-q")
(global-set-key *dmacro-key* 'dmacro-exec)
(autoload 'dmacro-exec "dmacro" nil t)

;; global
;; 関数定義に飛ぶ (gtags)
(autoload 'gtags-mode "gtags" "" t)
(setq gtags-mode-hook
      '(lambda ()
         (local-set-key "\C-cf" 'gtags-find-tag)
         (local-set-key "\M-r" 'gtags-find-rtag)
         (local-set-key "\M-s" 'gtags-find-symbol)
         (local-set-key "\C-cp" 'gtags-pop-stack)))
(add-hook 'c-mode-common-hook
          '(lambda()
             (gtags-mode 1)
             (gtags-make-complete-list)))

;; w3m
(load "w3m")
(setq w3m-use-cookies t)
(setq browse-url-browser-function 'w3m-browse-url)

;; org-mode
;; Emacsでメモ・TODO管理
(require 'org-install)
(define-key global-map "\C-cl" 'org-store-link)
(define-key global-map "\C-ca" 'org-agenda)
(define-key global-map "\C-cr" 'org-remember)
(setq org-startup-truncated nil)
(setq org-return-follows-link t)
(add-to-list 'auto-mode-alist '("\\.org$" . org-mode))
(org-remember-insinuate)
(setq org-directory "~/memo/")
(setq org-default-notes-file (concat org-directory "notes.org"))
(setq org-agenda-files '("~/memo/notes.org"))
(setq org-remember-templates
      '(("Todo" ?t "** TODO %?\n   %i\n   %a\n   %t" nil "Inbox")
        ("Bug" ?b "** TODO %?   :bug:\n   %i\n   %a\n   %t" nil "Inbox")
        ("Idea" ?i "** %?\n   %i\n   %a\n   %t" nil "New Ideas")))

;;====================
;; Visual
;;====================
;; color-themeの設定
(require 'color-theme)
(color-theme-initialize)
(color-theme-arjen)

;; 余計なものを表示しない
(when window-system
  (tool-bar-mode 0) ;; ツールバー
  (toggle-scroll-bar nil)) ;; スクロールバー

;; キーワードのカラー表示を有効化
(global-font-lock-mode t)

;; 選択範囲をハイライト
(setq-default transient-mark-mode t)

;; バッファ一覧をまともに
(global-set-key "\C-x\C-b" 'bs-show)

;; 対応するカッコをハイライト
(show-paren-mode 1)

;; 全角空白、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)))

;; フォント設定
(when (and window-system (= emacs-major-version 23))
  (create-fontset-from-ascii-font
   "-apple-monaco-medium-normal-normal-*-12-*" nil "hirakaku12")

  (set-default-font "fontset-hirakaku12")
  (add-to-list 'default-frame-alist '(font . "fontset-hirakaku12"))

  (set-fontset-font
   "fontset-hirakaku12"
   'japanese-jisx0208
   "-apple-hiragino_kaku_gothic_pro-medium-normal-normal-*-14-*-iso10646-1")

  (set-fontset-font
   "fontset-hirakaku12"
   'jisx0201
   "-apple-hiragino_kaku_gothic_pro-medium-normal-normal-*-14-*-iso10646-1")

  (set-fontset-font
   "fontset-hirakaku12"
   'japanese-jisx0212
   "-apple-hiragino_kaku_gothic_pro-medium-normal-normal-*-14-*-iso10646-1")

  (set-fontset-font
   "fontset-hirakaku12"
   'katakana-jisx0201
   "-apple-hiragino_kaku_gothic_pro-medium-normal-normal-*-14-*-iso10646-1"))

;; カーソル行をハイライト
(defface hlline-face
  '((((class color)
      (background dark))
     (:background "dark slate gray"))
    (((class color)
      (background light))
     (:background "ForestGreen"))
    (t
     ()))
  "*Face used by hl-line.")
(setq hl-line-face 'hlline-face)
(global-hl-line-mode)

;; フレームを透過
(if window-system (set-frame-parameter nil 'alpha 80))

;;====================
;; Syntax
;;====================
;; lisp (slime)
(require 'slime-autoloads)
(setq slime-lisp-implementations
      `((sbcl ("/usr/local/bin/sbcl"))))
(add-hook 'lisp-mode-hook (lambda ()
                            (cond ((not (featurep 'slime))
                                   (require 'slime)
                                   (normal-mode)))))
(eval-after-load "slime"
  '(slime-setup '(slime-fancy slime-banner)))

;; php-mode
(autoload 'php-mode "php-mode")
(add-to-list 'auto-mode-alist '("\\.php\\'" . php-mode))
(setq php-mode-force-pear t)
(add-hook 'php-mode-hook
          '(lambda ()
             (require 'php-completion)
             (php-completion-mode t)
             (define-key php-mode-map (kbd "C-o") 'phpcmp-complete)
             (when (require 'auto-complete nil t)
               (make-variable-buffer-local 'ac-sources)
               (add-to-list 'ac-sources 'ac-source-php-completion)
               (auto-complete-mode t))))

(add-hook 'php-mode-hook
          '(lambda ()
             (setq c-basic-offset 2)
             (setq c-tab-width 2)
             (setq c-indent-level 2)
             (setq tab-width 2)
             (setq-default tab-width 2)
             (c-set-offset 'substatement-open 0)
             (c-set-offset 'block-open 0)
             (c-set-offset 'case-label '+)
             (c-set-offset 'statement-case-open 0)))

(require 'symfony)

;; ruby
(add-to-list 'auto-mode-alist '("\\.rb$" . ruby-mode))
(add-to-list 'interpreter-mode-alist '("ruby" . ruby-mode))
(autoload 'run-ruby "inf-ruby" "Run an inferior Ruby process")
(autoload 'inf-ruby-keys "inf-ruby"
  "Set local key defs for inf-ruby in ruby-mode")
(add-hook 'ruby-mode-hook '(lambda () (inf-ruby-keys)))

(require 'ruby-electric)
(add-hook 'ruby-mode-hook '(lambda () (ruby-electric-mode t)))
(require 'ruby-block)
(ruby-block-mode t)
(setq ruby-block-highlight-toggle t)

(autoload 'rubydb "rubydb3x"
  "run rubydb on program file in buffer *gud-file*.
the directory containing file becomes the initial working directory
and source-file directory for your debugger." t)

;; js2-mode
(add-to-list 'auto-mode-alist '("\\.js$" . js-mode))
(setq js-indent-level 2)

;; yaml-mode
(autoload 'yaml-mode "yaml-mode")
(add-to-list 'auto-mode-alist '("\\.ya?ml$" . yaml-mode))

;; css-mode
(autoload 'css-mode "css-mode")
(add-to-list 'auto-mode-alist '("\\.css$" . css-mode))
(setq cssm-indent-function #'cssm-c-style-indenter)

;; mmm-mode
(require 'mmm-auto)
(setq mmm-global-mode 'maybe)
(mmm-add-classes
 '((embedded-css
    :submode css-mode
    :front "<stype[^>] *>"
    :back "<style>")))
(mmm-add-mode-ext-class nil "\\.html\\'" 'embedded-css)

;; AUCTeX
(require 'tex-site)
(require 'tex-jp)
(setq TeX-default-mode 'japanese-latex-mode)
(setq japanese-LaTeX-command-default "platex")
(setq japanese-LaTeX-default-style "jarticle")
(setq kinsoku-limit 10)
(setq LaTeX-indent-level 4)
(setq LaTeX-item-indent 2)
(setq TeX-output-view-style '(("^dvi$" "." "pxdvi '%d'")))
(setq preview-image-type 'dvipng)
(add-hook 'LaTeX-mode-hook (function (lambda ()
                                       (add-to-list 'TeX-command-list
                                                    '("ptex" "%(PDF)ptex %`%S%(PDFout)%(mode)%' %t"
                                                      TeX-run-TeX nil (plain-tex-mode) :help "Run ASCII pTeX"))
                                       (add-to-list 'TeX-command-list
                                                    '("platex" "%(PDF)platex %`%S%(PDFout)%(mode)%' %t"
                                                      TeX-run-TeX nil (latex-mode) :help "Run ASCII pLaTeX"))
                                       (add-to-list 'TeX-command-list
                                                    '("pdfview" "okular '%s.pdf' " TeX-run-command t nil))
                                       (add-to-list 'TeX-command-list
                                                    '("pdfbuild" "dvipdfmx -V 4 '%s' " TeX-run-command t nil))
                                       )))

;; nxml-mode
(setq nxml-slash-auto-complete-flag t)
(add-to-list 'auto-mode-alist
             '("\.\(xml\|svg\|wsdl\|xslt\|wsdd\|xsl\|rng\|xhtml\)\'" . nxml-mode) nil)

;; git commit
(add-hook 'server-visit-hook
          (function (lambda ()
                      (if (string-match "COMMIT_EDITMSG" buffer-file-name)
                          (set-buffer-file-coding-system 'utf-8)))))

;;====================
;; Syntax Checking
;;====================
;; flymake
(when (require 'flymake nil t)
  (global-set-key "\C-cd" 'flymake-display-err-menu-for-current-line)
  ;; PHP
  (when (not (fboundp 'flymake-php-init))
    (defun flymake-php-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 "php" (list "-f" local-file "-l"))))
    (setq flymake-allowed-file-name-masks
          (append
           flymake-allowed-file-name-masks
           '(("\.php[345]?$" flymake-php-init))))
    (setq flymake-err-line-patterns
          (cons
           '("\(\(?:Parse error\|Fatal error\|Warning\): .*\) in \(.*\) on line \([0-9]+\)" 2 3 nil 1)
           flymake-err-line-patterns)))
  ;; JavaScript
  (when (not (fboundp 'flymake-javascript-init))
    (defun flymake-javascript-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 "/usr/local/bin/jsl" (list "-process" local-file))))
    (setq flymake-allowed-file-name-masks
          (append
           flymake-allowed-file-name-masks
           '(("\.json$" flymake-javascript-init)
             ("\.js$" flymake-javascript-init))))
    (setq flymake-err-line-patterns
          (cons
           '("\(.+\)(\([0-9]+\)): \(?:lint \)?\(\(?:Warning\|SyntaxError\):.+\)" 1 2 nil 3)
           flymake-err-line-patterns)))
  ;; Ruby
  (when (not (fboundp 'flymake-ruby-init))
    (defun flymake-ruby-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))))
        '("ruby" '("-c" local-file)))))
  (add-hook 'php-mode-hook
            '(lambda () (flymake-mode t)))
  (add-hook 'js-mode-hook
            (lambda () (flymake-mode t)))
  (add-hook 'ruby-mode-hook
            (lambda () (flymake-mode t))))

 なげぇよ!

トラックバック(0)

トラックバックURL: http://e-arrows.sakura.ne.jp/mt/mt-tb.cgi/136

コメント(11)

EmacsenはEmacsのとそのバリアントを表現する言葉だったりします。
Emacsen = Emacs + Meadow + xyzzy + ng + ...
みたいな。

コメントどもです!
Emacsenはソフトウェアを表す言葉だったんですね、てっきりVimmerみたいな言葉だと :p
ということはEmacs使いは普通にEmacserっていうのかな?

達人はプラグインのいれすぎで起動に5分もかかるらしいです。(Vim

コメントありがとうございます
Emacsのことかと思ったら、Vimの起動で5分ってw
そうするとEmacsみたいに起動しっぱなしにするんでしょうかねー

そういえば、Emacs userみたいな記述をよく見ますね。
検索してみるとEmacserという表現もあるみたいです。

EmacsenはEmacsのバリアントとWikipediaなどにも明記されているのですが、誤用も多いみたいなので、そのうちEmacs userという意味でも通じるようになるかもしれませんね。

.emacs内のmmm-modeのcss sub-modeの
:frontが"<stype[^>] *>"になってるんですが、
stypeじゃなくてstyleのtypoですよね。
一応ご連絡までに。

takano32さんもご指摘なさっているとおり、-enは語源的には単なる複数形です。
ox oxen
ほぼ亜種と言い換えられますが、、、。

vimからEmacsへの移行する人が増えるのはうれしい限りです。
最近はvimから入る人が増えていたような気がしていましたので。
特に若い人は。

ぼくもあら探しとかで突っ込んだつもりではなくて、次から間違いなければ、と思ってつっこんだので前向きにとらえていただければ幸い :-)

Emacs userっていうと、日本語でEmacs使いと呼ぶ感じでしょうね
でもやっぱEmacserのほうがかっこいいなぁ

> ぼくもあら探しとかで突っ込んだつもりではなくて、次から間違いなければ、と思ってつっこんだので前向きにとらえていただければ幸い :-)

指摘されなかったら知らずにそこかしこでEmacsenって使ってたと思います
ありがとうございます :)

stype…完全にtypoですねw
早速直しました ありがとうございますー

複数形なら、Emacsesと同じ意味とわかりやすいですね
「僕はEmacsesです」って言うとEmacs集合体ですって言ってるようでちょっと面白いかも

> vimからEmacsへの移行する人が増えるのはうれしい限りです。

もっとEmacsを使いこなせるように精進します!

コメントする

このブログ記事について このアーカイブについて

このページは、深町英太郎が2010年2月13日 21:45に書いたブログ記事です。

ひとつ前のブログ記事は「社内LTで「手嶋屋を愛する人たちへ」を発表しました」です。

次のブログ記事は「.emacs.elで定義しておくと便利なマクロ」です。

Ariel Labs
Name:深町英太郎
Age:23歳
Living:京都府
Company:はてな
Hatena Id:id:nitro_idiot
Facebook:eitarow.fukamachi
mixi:ID:6756132
Twitter:nitro_idiot
GitHub:fukamachi
LinkedIn:eitarowfukamachi

最近のコメント

Techonrati

Technorati search

» リンクしているブログ

Powered by Movable Type 4.23-ja