• このエントリーをはてなブックマークに追加
ss-2010-02-20-01 on Flickr

はじめに

半年くらい前だったかに使い始めたAquamacs Emacsですが,Ctrl+nCtrl+pの押しっぱなしによるカーソルの上下移動がモッサリしていて,イライラさせられてきました.

そんなチリがそれなりに積もってきたとか,突然掃除を始めたくなるくらい崖っぷち的精神状態な今日この頃とか...そんな背景もあり,以前から存在だけは知っていながら触らずじまいだったCocoa Emacsをインストールして使ってみることにしました.

以下,それを機に新しく(話題的には新しくないかと)入れてみた拡張と,それを踏まえた.emacsの現状についての記録です.

かなり間が空いてますが,このエントリの「その後」的な位置づけにでもなりますかね.

なお,相変わらず,Emacs Lispは書けません.変更部分は,「雰囲気」で書いているため,(Emacs)Lispの観点からは外れているかもです.

インストール

MacPortsにある「emacs-app @23.1」を入れるのが簡単です.

% port search emacs
 
...
 
emacs-app @23.1 (aqua, editors)
The GNU Emacs text editor (Cocoa version)
 
...
 
% sudo port -d install emacs-app

ファイル置き場

以前のエントリから学習し,ホームディレクトリ下に「site-lisp」というディレクトリを掘って,そこへ拡張するためのEmacs Lispなファイルを置いています.

(setq load-path (cons "/Users/iwata/site-lisp/" load-path))
(setq load-path (cons "/Users/iwata/site-lisp/apel-10.7/" load-path))
(setq load-path (cons "/Users/iwata/site-lisp/elscreen-1.4.6/" load-path))

現状こんな感じです.

% ls -1 ~/site-lisp
apel-10.7
apel-10.7.tar.gz
elscreen-1.4.6
elscreen-1.4.6.tar.gz
espresso.el
espresso.elc
jaspace.el
jaspace.elc
js2-20090723b.el
js2.elc
yaml-mode-0.0.4.el
yaml-mode-0.0.4x.el
yaml-mode-0.0.4x.elc
yaml-mode.elc
zencoding-mode.el
zencoding-mode.elc
%

zencoding-mode

ss-2010-02-20-02 on Flickr

CSSライクに入力すると,それに対応したHTMLタグなテキストに変換される,というような,HTMLやCSSのコーディングを支援してくれるツール,とでもいいましょうか.そのEmacs Lispでの実装版です.

Partial support (“Expand Abbreviation” only)

TopStyle, Windows
Sublime Text, Windows
GEdit — external download, crossplatform
Dreamweaver CS4, Windows, Mac
UltraEdit, Windows
BBEdit/TextWrangler — external download, Mac
Emacs — non-official plugin

zen-coding – Project Hosting on Google Code

公式ではないんですね.

インストールの方法についてはどの拡張も同様なので,(ry 次のようなものを.emacsに追記します.

(require 'zencoding-mode)
(add-hook 'xml-mode-hook 'zencoding-mode)
(add-hook 'sgml-mode-hook 'zencoding-mode)
(add-hook 'html-mode-hook 'zencoding-mode)
(define-key zencoding-mode-keymap (kbd "<C-return>") nil)
(define-key zencoding-mode-keymap (kbd "<S-return>") 'zencoding-expand-line)

デフォルトではCtrl+Enterですが,個人的にShift+Enterとしています.

参考

espresso-mode

JavaScriptを書く際に重宝しているjs2-modeですが,インデントがなかなか残念です.

というのをどうにかして直せないかと探し回って対策を発見。

Editing JavaScript with Emacs ? js2-mode / Projects / Mishoo’s homepage
ほぼ丸パクリでかなり良い感じになりました。多謝。
js2-modeを使いやすくする – speg03の日記

js2-modeに加え,espresso-modeを入れてゴニョゴニョすることで,対策ができるようです.

...が,まだゴニョゴニョしてません>< ひとまずespresso-modeを入れるだけ入れておきました.今後調整,と.

(autoload #'espresso-mode "espresso" "Start espresso-mode" t)
(add-to-list 'auto-mode-alist '("\\.js$" . espresso-mode))
(add-to-list 'auto-mode-alist '("\\.json$" . espresso-mode))

参考

ElScreen,APEL

EmacsをGNU Screenっぽく操作できるようにしてくれます.これが動作するには,APELなるものが必要になるようなので,合わせて入れておきます.

そして次のような記述を加えます.

(setq elscreen-prefix-key "\C-t")
(setq elscreen-display-tab t)
(load "elscreen")
(define-key elscreen-map "\C-t" 'elscreen-toggle)
(define-key elscreen-map "t" 'elscreen-toggle)

個人的に,ターミナルのScreenで「prefix key」をCtrl+tとしているため,それに合わせています.(デフォルトではCtrl+zに設定されています.)

参考

細かな設定いくつか

フォント

Emacs23では,それ以前と比べてフォントの設定方法が異なるようです.現状こんな感じです.

(set-face-attribute 'default nil
		    :family "Monaco"
		    ;:height 120)
		    :height 90)
(set-fontset-font "fontset-default"
		  'japanese-jisx0208
		  '("Osaka" . "iso10646-1"))
(set-fontset-font "fontset-default"
		  'katakana-jisx0201
		  '("Osaka" . "iso10646-1"))
(setq face-font-rescale-alist
      '((".*Monaco-bold.*" . 1.0)
	(".*Monaco-medium.*" . 1.0)
	(".*Osaka-bold.*" . 1.2)
	(".*Osaka-medium.*" . 1.2)
	("-cdac$" . 1.4)))

commandキーとoptionキーを入れ替え

デフォルトでは,Aquamacs Emacs,というかその前使っていたCarbon Emacsですね,とは真逆の役割があてられているために混乱してしまいます.Aquamacs Emacsでは,「Preferences」でその割り当てを変更できたのですが,Cocoa Emacsでは,それをうまく見つけられませんでした.

.emacsでは次のようにすればOKみたいです.

(setq ns-command-modifier (quote meta))
(setq ns-alternate-modifier (quote super))

対応するカッコをハイライト

うっとうしいときもあるけど,やっぱりあった方が安心できます.

(show-paren-mode 1)

カーソルを点滅

現在位置を見失いにくくする手段の1つとして.

(blink-cursor-mode t)

スクロールバーを非表示に

どうせ使わないしw

(set-scroll-bar-mode nil)

*.psgi*.tなファイルもcperl-modeに

(setq auto-mode-alist (append '(("\\.psgi$" . cperl-mode)) auto-mode-alist))
(setq auto-mode-alist (append '(("\\.cgi$" . cperl-mode)) auto-mode-alist))
(setq auto-mode-alist (append '(("\\.pl$" . cperl-mode)) auto-mode-alist))
(setq auto-mode-alist (append '(("\\.t$" . cperl-mode)) auto-mode-alist))

*.mtなファイルもxml-modeに

xml-modeにフックされたzencoding-modeももれなくついてきます.

(setq auto-mode-alist (append '(("\\.mt$" . xml-mode)) auto-mode-alist))

参考

Cocoa Emacsの雑感

まだほんの数時間程度しか使っていませんが...

Aquamacs Emacsと比べると起動が速いですね.ストレスの原因となっていた,Ctrl+nCtrl+pの押しっぱなしによるカーソルの上下移動についてもサクサク快適です.

逆に気になるところとして,全角スペースや全角括弧,というか,Shiftキーを押しながらの場合,全角による入力できないっぽい,というのがあります.ちなみに,Google IMEを使用しています.他ではどうなんでしょうかね?

また,ベースのEmacsがバージョン23と(大きく?)変わったため,過去のEmacs Lispなファイルをそのまま利用できない場合もあります.バイトコンパイルするものについても警告がいくつも出たりします.(まぁelcなファイルはできるのでとりあえずはいいんですが...)

おわりに

以上,Cocoa Emacsを使い始めるにあたって,新たに入れた拡張や.emacsファイルの現状について触れてみました.

過去のEmacs Lispの互換性やらキーの入力やらと,気になる部分はいくつかありますが,まぁまずは「レスポンスの快適さ」という,よいところ(他にも必ずあるはず!)を見ていくことにします.

なお,今回のエントリは,このつぶやきが目に入り,「zen coding」というキーワードを検索してみたところからいろいろ始まってしまいましたw

zen codingを入れてみた。慣れたいなこれ。
Twitter / takayuki katsumata: zen codingを入れてみた。慣れたいなこれ。

.emacs全体

(setq load-path (cons "/Users/iwata/site-lisp/" load-path))
(setq load-path (cons "/Users/iwata/site-lisp/apel-10.7/" load-path))
(setq load-path (cons "/Users/iwata/site-lisp/elscreen-1.4.6/" load-path))
 
;;
(setq inhibit-startup-message t)
 
;;
;; key bindings
;;
;; ¥ではなく\を入力する
(define-key global-map [] "\\")
;;
(global-set-key "\C-m" 'newline-and-indent)
;; bind key Ctrl-H to 'Backspace'
(load "term/bobcat")
(when (fboundp 'terminal-init-bobcat) (terminal-init-bobcat))
;; 次の設定の場合,Ctrl-Sによるインクリメンタルサーチ時,
;; ミスしてCtrl-Hすると元のバッファの内容をBackspaceしてしまう
(global-set-key "\C-h" 'backward-delete-char)
 
;; ref: http://d.hatena.ne.jp/sugyan/20091227/1261860179
;; Command-Key and Option-Key
(setq ns-command-modifier (quote meta))
(setq ns-alternate-modifier (quote super))
 
;;
;; font
;; ref: http://d.hatena.ne.jp/tomoya/20090210/1234297520
;;
;(when (eq system-type 'darwin)
;  (setq my-font "-*-*-medium-r-normal--9-*-*-*-*-*-fontset-osaka")
;;;  (setq fixed-width-use-QuickDraw-for-ascii t)
;  (setq mac-allow-anti-aliasing t)
;  (if (= emacs-major-version 22)
;      (require 'carbon-font))
;  (set-default-font my-font)
;  (add-to-list 'default-frame-alist `(font . ,my-font))
;  (when (= emacs-major-version 23)
;    (set-fontset-font
;     (frame-parameter nil 'font)
;     'japanese-jisx0208
;     '("osaka" . "iso10646-1"))
;    (setq face-font-rescale-alist
;	  '(("^-apple-hiragino.*" . 1.2)
;	    (".*osaka-bold.*" . 1.2)
;  	    (".*osaka-medium.*" . 1.2)
;  	    (".*courier-bold-.*-mac-roman" . 1.0)
;  	    (".*monaco cy-bold-.*-mac-cyrillic" . 0.9)
;  	    (".*monaco-bold-.*-mac-roman" . 0.9)
;  	    ("-cdac$" . 1.3)))))
 
;;;
;;; ref: http://emacs.g.hatena.ne.jp/sakito/20100127
;;;
;;(create-fontset-from-ascii-font "Menlo-14:weight=normal:slant=normal" nil "menlokakugo")
;;(set-fontset-font "fontset-menlokakugo"
;;                  'unicode
;;                  (font-spec :family "Hiragino Kaku Gothic ProN" :size 16)
;;                  nil
;;                  'append)
;;(add-to-list 'default-frame-alist '(font . "fontset-menlokakugo"))
;(create-fontset-from-ascii-font "Osaka-9:weight=normal:slant=normal" nil "osaka")
;(set-fontset-font "fontset-osaka"
;                  'unicode
;                  (font-spec :family "Hiragino Kaku Gothic ProN" :size 12)
;                  nil
;                  'append)
;(add-to-list 'default-frame-alist '(font . "fontset-osaka"))
 
;;
;; ref: http://dodeka.net/~j2/wp/?p=457p
;;
(set-face-attribute 'default nil
		    :family "Monaco"
		    ;:height 120)
		    :height 90)
(set-fontset-font "fontset-default"
		  'japanese-jisx0208
		  '("Osaka" . "iso10646-1"))
(set-fontset-font "fontset-default"
		  'katakana-jisx0201
		  '("Osaka" . "iso10646-1"))
(setq face-font-rescale-alist
      '((".*Monaco-bold.*" . 1.0)
	(".*Monaco-medium.*" . 1.0)
	(".*Osaka-bold.*" . 1.2)
	(".*Osaka-medium.*" . 1.2)
	("-cdac$" . 1.4)))
 
 
 
;;
;; window geometry
;;
;(if window-system (progn
  (setq initial-frame-alist '((width . 198)(height . 68)(top . 0)(left . 2)))
  (set-background-color "Black")
  ;(set-foreground-color "White")
  (set-foreground-color "Gray92")
  (set-cursor-color "Yellow")
;))
 
;; title
(setq frame-title-format (format "%%f - Emacs@%s" (system-name)))
 
;; disable making backup files
(setq backup-inhibited t)
(setq make-backup-files nil)
 
 
;;
;; line cursor
;;
(defface hlline-face
  '((((class color)
      (background dark))
     ;;(:background "dark state gray"))
     (:background "gray10"
		  :underline "gray32"))
    (((class color)
      (background light))
     (:background "ForestGreen"
		  :underline nil))
    (t ()))
  "*Face used by hl-line.")
(setq hl-line-face 'hlline-face)
;;(setq hl-line-face 'underline)
(global-hl-line-mode)
 
 
;;
;; ref: http://d.hatena.ne.jp/sugyan/20091227/1261860179
;;
; カーソルの点滅
(blink-cursor-mode t)
; カーソルの位置が何文字目かを表示する
(column-number-mode t)
; スクロールバーを消す
(set-scroll-bar-mode nil)
 
;; ref: http://d.hatena.ne.jp/goryugo/20080724/1216830229
;; 括弧の対応をハイライト.
(show-paren-mode 1)
 
 
;;
;; cperl-mode
;;
(setq auto-mode-alist (append '(("\\.psgi$" . cperl-mode)) auto-mode-alist))
(setq auto-mode-alist (append '(("\\.cgi$" . cperl-mode)) auto-mode-alist))
(setq auto-mode-alist (append '(("\\.pl$" . cperl-mode)) auto-mode-alist))
(setq auto-mode-alist (append '(("\\.t$" . cperl-mode)) auto-mode-alist))
 
;;
;; xml-mode
;;
(setq auto-mode-alist (append '(("\\.html$" . xml-mode)) auto-mode-alist))
(setq auto-mode-alist (append '(("\\.tpl$" . xml-mode)) auto-mode-alist))
;; Text::MicroTemplate
(setq auto-mode-alist (append '(("\\.mt$" . xml-mode)) auto-mode-alist))
 
;;
;; zencoding-mode
;;
(require 'zencoding-mode)
(add-hook 'xml-mode-hook 'zencoding-mode)
(add-hook 'sgml-mode-hook 'zencoding-mode)
(add-hook 'html-mode-hook 'zencoding-mode)
(define-key zencoding-mode-keymap (kbd "<C-return>") nil)
(define-key zencoding-mode-keymap (kbd "<S-return>") 'zencoding-expand-line)
 
;;
;; yaml-mode
;;
(autoload 'yaml-mode "yaml-mode" nil t)
(add-to-list 'auto-mode-alist '("\\.yml$" . yaml-mode))
(add-to-list 'auto-mode-alist '("\\.yaml$" . yaml-mode))
 
;;
;; espresso-mode
(autoload #'espresso-mode "espresso" "Start espresso-mode" t)
(add-to-list 'auto-mode-alist '("\\.js$" . espresso-mode))
(add-to-list 'auto-mode-alist '("\\.json$" . espresso-mode))
 
;;
;; js2-mode
;;
(autoload 'js2-mode "js2" nil t)
(add-to-list 'auto-mode-alist '("\\.js$" . js2-mode))
(add-to-list 'auto-mode-alist '("\\.json$" . js2-mode))
;; http://8-p.info/emacs-javascript.html
;(setq-default c-basic-offset 4)
;
;(when (load "js2" t)
;  (setq js2-cleanup-whitespace nil
;	js2-mirror-mode nil
;	js2-bounce-indent-flag nil)
;
;  (defun indent-and-back-to-indentation ()
;    (interactive)
;    (indent-for-tab-command)
;    (let ((point-of-indentation
;	   (save-excursion
;	     (back-to-indentation)
;	     (point))))
;      (skip-chars-forward "\s " point-of-indentation)))
;
;      (define-key js2-mode-map "\C-i" 'indent-and-back-to-indentation)
;      (define-key js2-mode-map "\C-m" nil))
 
 
;;
;; jaspace-mode
;;
(require 'jaspace)
(add-hook 'fundamental-mode-hook 'jaspace-mode)
(add-hook 'js2-mode-hook 'jaspace-mode)
(add-hook 'yaml-mode-hook 'jaspace-mode)
(add-hook 'perl-mode-hook 'jaspace-mode)
(add-hook 'cperl-mode-hook 'jaspace-mode)
(add-hook 'python-mode-hook 'jaspace-mode)
(add-hook 'ruby-mode-hook 'jaspace-mode)
(add-hook 'php-mode-hook 'jaspace-mode)
(add-hook 'xml-mode-hook 'jaspace-mode)
(add-hook 'html-mode-hook 'jaspace-mode)
(add-hook 'sgml-mode-hook 'jaspace-mode)
(add-hook 'text-mode-hook 'jaspace-mode)
(add-hook 'tt-mode-hook 'jaspace-mode)
;(when (require 'jaspace nil t)
;  (when jaspace-modes (append jaspace-modes
;			      (list 'lisp-mode
;				    'yaml-mode
;				    'perl-mode
;				    'cperl-mode
;				    'js2-mode
;				    'javascript-mode
;				    'python-mode
;				    'ruby-mode
;				    'php-mode
;				    'xml-mode
;				    'html-mode
;				    'css-mode
;				    'text-mode
;				    'tt-mode
;				    'fundamental-mode
;				    ))))
 
(when (boundp 'jaspace-alternate-jaspace-string)
  (setq jaspace-alternate-jaspace-string "□"))
(when (boundp 'jaspace-highlight-tabs)
  (setq jaspace-highlight-tabs ?^))
; 以下の4行,emacs23にてエラーが出る
;(add-hook 'jaspace-mode-off-hook
;	  (lambda()
;	    (when (boundp 'show-trailing-whitespace)
;	      (setq show-trailing-whitespace nil)
(add-hook 'jaspace-mode-hook
	  (lambda()
	    (progn
	      (when (boundp 'show-trailing-whitespace)
		(setq show-trailing-whitespace t))
	      (face-spec-set 'jaspace-highlight-jaspace-face
			     '((((class color) (background light))
				(:foreground "blue"))
			       ;;(t (:foreground "green"))))
			       (t (:foreground "gray64"))))
	      (face-spec-set 'jaspace-highlight-tab-face
			     '((((class color) (background light))
				(:foreground "red"
					     :background "unspecified"
					     :strike-through nil
					     :underline t))
			       ;;(t (:foreground "purple"
			       (t (:foreground "gray32"
					       :background "unspecified"
					       :strike-through nil
					       :underline t))))
	      (face-spec-set 'trailing-whitespace
			     '((((class color) (background light))
				 (:foreground "red"
					      :background "unspecified"
					      :strike-through nil
					      :underline t))
			       (t (:foreground "purple"
			       ;;(t (:foreground "gray16"
						:background "unspecified"
						:strike-through nil
						:underline t)))))))
 
 
;;
;; elscreen
;;   ref: http://dev.ariel-networks.com/Members/matsuyama/pseudo-screen-on-emacs-with-elscreen-and-term
(setq elscreen-prefix-key "\C-t")
(setq elscreen-display-tab t)
(load "elscreen")
(define-key elscreen-map "\C-t" 'elscreen-toggle)
(define-key elscreen-map "t" 'elscreen-toggle)