SVX日記
2008-08-02(Sat) Fedora9、emacsチューン
と、いうわけで、さっさとfedora純正のemacs-22に見切りをつけ、別途配布されているemacs-23、またの名を「XftGnuEmacs」に乗り換えてしまうのである。
ご丁寧なことに、このサイトではFedora9用のRPMリポジトリまで紹介されている。そして、そのリポジトリは、RedHatのEmacsメンテナの方による提供だ。限りなくオフィシャルな印象で安心感がある。
なお、当初emacs-23.0.60-20080521.fc9.i386.rpmをインストールしたところ、起動時に「Pure space overflow」とかなんとかいわれてマトモに動かなかったが、どうやら、単純なパッケージ側の設定ミスだったようだ。オイラは関連サイトで情報を仕入れ、一部のパラメータを変更して解決したが、これはemacs-23.0.60-20080605.fc9で修正された模様。
ちょっと前まで、オイラはemacs-23.0.60-20080605.fc9.src.rpmからの自家ビルドを使っていた(出たばっかりの時はバイナリが置いてなかった)。今なら、バイナリが置いてあれば、それを入れて一発だろう。
$ emacs --font "VL Gothic-9" 3pull.txt
alias emacs='emacs --font "VL Gothic-9" --geometry 144x40+32'
ちなみに、使い慣れたOsakaを指定しようとしたところ、Windowsのttc形式なのが原因かどうかわからないが、指定が華麗にスルーされてしまった。VL Gothicの美しさはかなりのものなので不満はないが、使い慣れたOsakaが使えないのはちょっと残念……と、思ったら、これまた新しいemacs-23.0.60-20080716.fc9では、普通にOsakaフォントが使えるように修正されているようだ。ほんじゃ、遠慮なくOsakaで。
alias emacs='emacs --font "Osaka-mono-9" --geometry 72x40+32'
しかしVL Gothicに比べ、ジオメトリの幅値が倍で認識され、タブ幅もグダグダになる。これは、emacs-23.0.60-20080801.fc9でも直っていない。しばらくは、心静かに半分を指定して華麗にスルーする。
次は……と、配色だな。デフォルトの「白地に黒字」は、長時間作業するには目に痛すぎる。「黒地に白字」なら悪くないが、シンプルすぎる。例の、アンバーなプラズマディスプレイ風も、マトリックスなグリーンディスプレイ風も、Gnome端末に使ってしまっているし……
(set-cursor-color "#ffffff")
(set-foreground-color "white")
(set-background-color "blue")
最後にもうひとつ。emacsで日本語をバキバキ打つ場合、2通りのアプローチがある。ひとつは、適当な文字数毎に改行が入ったフォーマットで仕上げる方法。もうひとつは、1行は1行としてウィンドウ幅の位置での折り返し表示を活用して編集する方法だ。
前者の場合、emacsには「Ctrl+q」という段落整形コマンドがあるので、文章を打つ合間にプチプチとこれを手動で発行しながら編集すればいい。段落の幅は、.emacsに「(setq default-fill-column 64)」などと書いておくか、好みの位置にカーソルを移動して「Ctrl+x, f」を実行することで動的に設定することもできる。もちろん、禁則処理もバッチリ。オイラはメールを書く場合、こちらの方法を使っている。
後者の場合……実はちょっと困った事態が発生する。というのも、カーソルの上下移動が、表示行でなく、論理行で行われるからだ。例えば、長い1行が数十行に折り返し表示された状態になると、その行を編集する限り、カーソルの左右移動のみで長い行の中を移動しなければならなくなり、事実上のカーソルの上下移動が活用できなくなってしまう。オイラはブログを書く場合、こちらの方法で書く必要があるので、これはかなり困る。
さらに、左端に行番号を表示するマクロも導入する。やっぱり、これがあると便利。
;; .emacs
;;; uncomment this line to disable loading of "default.el" at startup
(setq inhibit-default-init t)
;; enable visual feedback on selections
(setq transient-mark-mode nil)
;; default to better frame titles
(setq frame-title-format
(concat "%b - emacs@" (system-name)))
;; default to unified diffs
(setq diff-switches "-u")
;; always end a file with a newline
;(setq require-final-newline 'query)
;;; uncomment for CJK utf-8 support for non-Asian users
;; (require 'un-define)
(global-set-key "\C-h" 'delete-backward-char)
(global-set-key "\C-z" 'scroll-down)
(global-set-key "\C-u" 'undo)
(global-set-key "\C-]" 'call-last-kbd-macro)
(setq inhibit-startup-message t)
(menu-bar-mode nil)
(column-number-mode t)
(setq blink-matching-paren nil)
(setq default-tab-width 4)
(setq default-fill-column 64)
(setq text-mode-hook 'turn-on-auto-fill)
(setq make-backup-files nil)
(setq auto-save-default nil)
;; ATOK X3 for Linux
(setq iiimcf-server-control-hostlist '("unix:/tmp/.iiim-mitsu/:0.0"))
(require 'iiimcf-sc)
(setq iiimcf-server-control-default-language "ja")
(setq iiimcf-server-control-default-input-method "atokx3")
(setq default-input-method 'iiim-server-control)
(define-key global-map "\C-j" (lambda ()
(interactive)
(if current-input-method (inactivate-input-method))
(toggle-input-method)))
(define-key global-map "\C-o" (lambda ()
(interactive)
(inactivate-input-method)))
(global-set-key [?\S- ] 'iiimcf-server-control-keyforward)
(setq iiimcf-UI-input-method-title-format "<ATOK:%s>")
(setq iiimcf-UI-preedit-use-face-p "window-system")
;;(iiimp-debug)
(set-cursor-color "#ffffff")
(set-foreground-color "white")
(set-background-color "darkblue")
(defvar keep-screen-column nil)
(defun screen-column ()
"get screen column"
(save-excursion
(let ((s-column (current-column)))
(vertical-motion 0)
(- s-column (current-column)))))
(defun move-beginning-of-screen-line ()
"move beginning of screen line"
(interactive)
(vertical-motion 0))
(defun move-end-of-screen-line ()
"move end of screen line"
(interactive)
(vertical-motion 1)
(backward-char 1))
(defun next-screen-line ()
"next screen line"
(interactive)
(if truncate-lines
(next-line 1)
(if (not (eq last-command 'next-screen-line))
(setq keep-screen-column (screen-column)))
(vertical-motion 1)
(move-to-column (+ (current-column) keep-screen-column))))
(defun previous-screen-line ()
"previous screen line"
(interactive)
(if truncate-lines
(previous-line 1)
(if (not (eq last-command 'next-screen-line))
(setq keep-screen-column (screen-column)))
(vertical-motion -1)
(move-to-column (+ (current-column) keep-screen-column)))
(setq this-command 'next-screen-line))
(global-set-key "\C-a" 'move-beginning-of-screen-line)
(global-set-key "\C-e" 'move-end-of-screen-line)
(global-set-key "\C-n" 'next-screen-line)
(global-set-key "\C-p" 'previous-screen-line)
(set-scroll-bar-mode nil)
(require 'wb-line-number)
(setq truncate-partial-width-windows nil)
(wb-line-number-toggle)