カテゴリー「Emacs」の25件の記事

【Emacs】 リージョン内の行数と文字数をモードラインに表示する

Emacsでプログラムとかメールとか書いてる時に(あ、あとツイッターもかな?)指定範囲の行数やら文字数やらを知りたいって事がままあるわけです。そんな時はリージョンを設定して、「M-=」もしくは「M-x count-lines-region」とやるとリージョン範囲の行数と文字数が表示できるのやけど、毎度タイプするのも面倒やなぁって思ってたら、こんなすばらしいelispを作ってる方がいらっしゃいました。
早速、使わせて頂くと共に紹介しまする。

再発明日記
リージョン内の行数と文字数をモードラインに表示する(範囲指定している時だけ)

実際に表示してみた感じは・・・
Screenshotscratch1 おぉ〜。ええやん。モードラインの左側にご注目くださいな。
表示フォーマットは format の後ろを変更すれば変えられます。
オリジナルのままだとちょっと長かったので、linesやcharsを無くして、さらに固定長にしました。指定した行数以上を選択すると表示位置がずれるけど、まぁ余りそんな大きなリージョンを設定する事もないしね。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 行と桁の表示
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(line-number-mode t)
(column-number-mode t)
;; 選択範囲の情報表示
(defun count-lines-and-chars ()
  (if mark-active
      (format "[%3d:%4d]"
              (count-lines (region-beginning) (region-end))
              (- (region-end) (region-beginning)))
    ""))
(add-to-list 'default-mode-line-format
             '(:eval (count-lines-and-chars)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

という事で、最終的に上記のようにして使用しています。

【Emacs】 Emacs23.x + Wanderlustで機種依存文字対応

番外編として、メーラ(Wanderlust)使用時のメール文中の機種依存文字対応方法を記載します。cp5022x.elがロードされている事が前提で.wlに以下の記述をしまする。

;; iso-2022-jpをcp50220として扱う。
;; SEMI (cf. http://d.hatena.ne.jp/kiwanami/20091103/1257243524)
(add-to-list 'mime-charset-coding-system-alist
             '(iso-2022-jp . cp50220))

これでOutlookやらが送ってくる「charset=iso-2022-jp なのに丸付き数字とか書いちゃうよ〜ん」メールもちゃんと表示できるようになりました。

しっかしさぁ、いい加減こういう文字使う時はutf-8で送ろうよ。主流なMUAはutf-8対応してるんやし。

【Emacs】 Emacs23.xでフォント設定

さて、最後に英語/日本語フォント設定編です。
実はEmacsではこのフォント設定が一番の曲者。僕は職業柄、等幅フォントにこだわっていて、しかも英語/日本語混在字でも桁が合うように「全角文字幅=半角2文字分」という見た目にしたいわけです。しか〜し、これが中々大変。

というのも、フォントというのは元々デザインなわけで全ての等幅フォントが全ての文字サイズで桁合わせできるというわけではないのです。でもまぁ、TrueTypeフォントやったらフォントのレンダリング字に倍率を変える事で多少の調整が可能。せやけど、この調整も Try & Error で行う必要があるから、結構手間なわけですわ。

試行錯誤の結果、我が家の環境でバッチシやったのは以下の環境と設定です。

ディスプレイ     DELL 24インチ(1920x1200)
半角文字サイズ  8pt
英字フォント     さざなみゴシック
日本語フォント   Takaoゴシック

アンチエイリアシングも効いて、目に優しくて良い感じです。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; フォントの設定
;;01234567890123456789
;;あいうえおかきくけこ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(cond (window-system
       (set-face-attribute 'default nil
                           :family "さざなみゴシック"
                           :height 80)
       (set-fontset-font (frame-parameter nil 'font)
                         'japanese-jisx0208
                         '("Takaoゴシック" . "unicode-bmp")
                         )
       (set-fontset-font (frame-parameter nil 'font)
                         'katakana-jisx0201
                         '("Takaoゴシック" . "unicode-bmp")
                         )
       (setq face-font-rescale-alist
             '(
               (".*さざなみゴシック.*" . 1.0)
               (".*Takaoゴシック.*"    . 1.1)
               ))
       ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

全角半角文字の桁合わせはface-font-rescale-alistの倍率を変更すると変えられます。

ついでにフレームサイズ設定も付けてみました。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; initial frameのサイズ設定
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(cond (window-system
       (setq default-frame-alist
             (append (list
                      '(width  . 255)
                      '(height . 77)
                      '(top    . 50)
                      '(left   . 300)
                      )
                     initial-frame-alist))
       ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

見た目はこんな感じ
Screenshotemacs

日本語入力設定編へ)

文字コード編へ)

【Emacs】 Emacs23.xの文字コード設定(機種依存文字対応)

さて、お次は文字コード編。
世の中ではメールでも平気で機種依存文字を使う人が多いし、しかもそういうメールに限ってiso-2022-jpで送ってきたりする。それから、テキストファイルをwindowsと共有したりすると、どうしても機種依存文字が問題になるんよね...

ちゃんと文字コードを理解してから使ってくれれば良いのやけど、文字コードの種類も乱立してるし某M社なんかが訳の分からん独自仕様を標準化しようと押し付ける始末。さぁ大変!

とりあえず我が家では以下の設定にしました。
cp5022x.elというM社の独自拡張をサポートしたEmacs lispがあります。これを使うとiso-2022-jpで丸付き数字など機種依存文字を含んだcp50220というコードページが使用できるようになります。

あと、文字コードのプライオリティを変更しておく必要があるね。
という事で、基本的にutf-8なんやけど、eucやS-JIS拡張(CP932)、iso-2022-jpもちゃんと扱いたいというニーズから以下のような設定にしました。これでWindows(S-JIS拡張:CP932)との互換性も取れましたヨ

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 文字コード
;;  機種依存文字例:~①㈱©
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'cp5022x)
;; 各種文字コード設定
(set-default-coding-systems 'utf-8-emacs)
(setq default-file-name-coding-system 'utf-8-emacs)
;; charset と coding-system の優先度設定
(set-charset-priority 'ascii
                      'japanese-jisx0208
                      'latin-jisx0201
                      'katakana-jisx0201
                      'iso-8859-1
                      'cp1252
                      'unicode)
(set-coding-system-priority 'utf-8
                            'euc-jp
                            'iso-2022-jp
                            'cp932)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ほら、丸付き数字とか括弧株とかコピーライトとか表示できるでしょ?

Screenshotemacs2

日本語入力設定編へ)

フォント設定編へ)

【Emacs】 Emacs23.xの日本語入力関連設定

前回の記事で書いた通り、最近Emacsのバージョンを23.2.1にアップデートしました。フォント周りとか日本語入力関係とか、最新の環境に合わせて.emacsを書き換えたので、覚書しておきまする。

まずはターゲットの環境について

OS         ubuntu 11.04
日本語入力   mozc (Google日本語入力)
文字コード    utf-8が基本

こんな感じです。

ではまず日本語入力部分から。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 日本語入力の設定
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(set-language-environment "Japanese")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ibus-mode
(require 'ibus)
;; Turn on ibus-mode automatically after loading .emacs
(add-hook 'after-init-hook 'ibus-mode-on)
;; Use C-SPC for Set Mark command
(ibus-define-common-key ?\C-\s nil)
;; Use C-/ for Undo command
(ibus-define-common-key ?\C-/ nil)
;; Change cursor color depending on IBus status
(setq ibus-cursor-color '("limegreen" "white" "yellow"))
(global-set-key "\C-\\" 'ibus-toggle)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mozcを使うために以下のパッケージをパッケージマネージャでインストールしてまする。

mozc-utils-gui
mozc-server
ibus-mozc
emacs-mozc
emacs-mozc-bin

ibus-mode-onにする事で日本語入力がインラインで行えます。(便利便利!)
せやけど、一部のキーバインドが使えなくなるので、その無効化を指定。
さらに日本語入力時と通常入力時でカーソルの色を変えて分かりやすくしました。
これで一気に日本語入力が楽々になりましたよ。

ちなみにWindowsの場合、NTEmacs23.3を使うと日本語入力のインライン表示ができます。その時の設定は以下の通り。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq default-input-method "W32-IME")
(w32-ime-initialize)
(setq-default w32-ime-mode-line-state-indicator "[--]")
(setq w32-ime-mode-line-state-indicator-list '("[--]" "[あ]" "[--]"))
;;IME ON/OFF時のカーソルカラー
(add-hook 'input-method-activate-hook
          (lambda() (set-cursor-color "limegreen")))
(add-hook 'input-method-inactivate-hook
          (lambda() (set-cursor-color "grey")))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

カーソルの色変更などもLinuxと同じように設定できるヨ

入力時のインライン対応はこんな感じ。

Screenshotemacs1

文字コード編へ)

フォント設定編へ)

【emacs】 emacs-mozc.elのエラー

Emacs 23.2.1で日本語入力にmozcを使用しています。この辺の設定方法はググれば色々見つかると思うので割愛。

さて、問題はEmacs起動時にメッセージバッファに以下のエラーが表示される事やね。

Loading /etc/emacs/site-start.d/50emacs-mozc.el (source)...
Error while loading 50emacs-mozc: End of file during parsing: /etc/emacs/site-start.d/50emacs-mozc.el

これの対処は簡単。
って言うか、メッセージの通りemacs-mozc.elを見てみると分かる。
ファイル末尾の所、括弧の対応が取れてへ〜ん

-    (setq load-path (cons package-dir load-path))
+    (setq load-path (cons package-dir load-path))))

とまぁ、これだけですわ。
最後に括弧を2つ追加すればエラーが表示されなくなりました。ちゃんちゃん。

【Emacs】 フォント設定(日本語編)

Emacsのフォント設定やけど、Adamale Monoは英字フォントなので日本語フォントが適当に指定されてしまう。(自分の環境では明朝になってた)
まぁ見やすかったんでそのままにしていたのやけど、さすがにプログラム書くのに明朝はないわなぁ。
という事で、日本語フォントも設定してみましたよ。(無難にTakaoゴシックを選択)

(cond (window-system
       (set-default-font "Andale Mono-10")
       (set-fontset-font (frame-parameter nil 'font)
                         'japanese-jisx0208
                         '("Takaoゴシック" . "unicode-bmp")
                         )))

【Emacs】 フォント変更

ubuntu 10.04 LTS (Lucid) にしてから大分経つけど、色々な事があって環境整備をおろそかにしていました。
色々な事は、まぁ別の機会に書くとして久しぶりにEmacsネタ。

ubuntu 10.04にしてから Emacs が 23.1.1 になりました。
フォントのレンダリングも綺麗になって良いのやけど、以前の .emacs.el ではフォント設定がちゃんとできなくて(というか、該当フォントがなくなった)折角やから10.04標準のフォントで設定する事にしました。
色々試したのやけど、「Andale Mono」の10ポイントがよさそうなのでこれを使う事に。
(プログラマにとって等幅フォントは必須なのですわ)

.emacs.elに以下のように記述して完了。

(cond (window-system
       (set-default-font "Andale Mono-10")))

ついでにフレームサイズも変更。

(setq default-frame-alist
      (append (list
               '(width  . 210)
               '(height . 70)
               '(top    . 80)
               '(left   . 150))
              initial-frame-alist))

UXGAのワイド液晶やと、これくらいでちょうど良い位置になるんよねぇ。

【Emacs Tips】 compileコマンドの拡張

Emacsでプログラム書いてると、C-ccで compile できるんやけど、この時に*compilation*っていう特殊バッファが作成されます。でもって、通常は現状のwindowを上下半分に分割して下のwindowに*compilation*バッファが表示されるのやけど、実際コンパイルのログ表示にwindowの半分持ってかれるのはちょっと不便。もっと悪いのは、例えばフレームを左右2分割して2種類のソースファイルを編集している時に compile コマンドを実行すると、compileコマンドを実行したwindowと別のwindowが*compilation*バッファに切り替わってしまうのですわ。どういう事かと言うと...

Screenshotmule1cameracpp

こんな感じ。左のwindowでソースファイルを編集中に compile コマンドを実行すると右のwindowにログが表示されてしまうのですわ。でも右は別のソースとか表示してるからそのまま残しておきたい。あと、この*compilation*バッファを閉じるためには、C-x1とするか C-xo C-xk RET みたいにするしかないっすなぁ。これも不便。
ちゅー事で、*compilation*バッファを現在編集中のソースwindowを分割して表示するようにしたいなぁと思ったわけです。ついでに、*compilation*バッファも簡単に閉じれるようにしたいなぁと。そんなこんなでできたのが以下の関数ですわ。

             ;; 自前compilation関数 (windowを固定化する)
             (defun compilation-open ()
               "*compilation*バッファを表示するwindowをオープンする"
               (interactive)
               (let ((cur-window (selected-window))
                     (com-buffer (get-buffer compilation-buffer-name)))
                 (if (null com-buffer)
                     (setq com-buffer (get-buffer-create compilation-buffer-name)))
                 (let ((com-window (get-buffer-window com-buffer)))
                   (if com-window
                       (select-window com-window)
                     (select-window
                      (split-window (selected-window) (- (window-height) 15) nil)))
                   (switch-to-buffer (get-buffer compilation-buffer-name))
                   (select-window cur-window))))
             (defun compilation-close ()
               "*compilation*バッファを表示しているwindowをクローズする"
               (interactive)
               (let ((com-buffer (get-buffer compilation-buffer-name)))
                 (if com-buffer
                     (let ((com-window (get-buffer-window com-buffer)))
                       (if com-window
                           (delete-window com-window))))))
             (defun my-compile (command &optional comint)
               "*compilation*バッファの表示位置を固定化してcompileコマンドを実行する関数。"
               (interactive
                (list
                 (let ((command (eval compile-command)))
                   (if (or compilation-read-command current-prefix-arg)
                       (read-from-minibuffer "Compile command: "
                                             command nil nil
                                             (if (equal (car compile-history) command)
                                                 '(compile-history . 1)
                                               'compile-history))
                     command))
                 (consp current-prefix-arg)))
               (unless (equal command (eval compile-command))
                 (setq compile-command command))
               (save-some-buffers (not compilation-ask-about-save) nil)
               (setq compilation-directory default-directory)
               (compilation-open)
               (compilation-start command comint))

my-compileはcompile.elのcompileコマンドを持ってきて、compilation-startの前に*compilation*バッファを開くようにしています。ちょっと強引やけどね。ま、突貫工事で書いたコードやし・・・
動作のスクリーンショット貼っておきます。
Screenshotmule1cameracpp1
ほらね、こんな感じで左のwindowの下15行分にコンパイルログが表示されてますだ。もちろん、このwindowは*compilation*バッファやから、C-x`で次のエラー箇所にどんどん飛べますダ。あとこのコンパイルウィンドウもすぐに閉じれるようにcompilation-closeコマンドも用意しました。

設定方法

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; cc-modeに入るときに呼び出す hook の設定
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add-hook 'c-mode-common-hook
          '(lambda ()
             ;; 自前compilation関数 (windowを固定化する)
             (defun compilation-open ()
               "*compilation*バッファを表示するwindowをオープンする"
               (interactive)
               (let ((cur-window (selected-window))
                     (com-buffer (get-buffer compilation-buffer-name)))
                 (if (null com-buffer)
                     (setq com-buffer (get-buffer-create compilation-buffer-name)))
                 (let ((com-window (get-buffer-window com-buffer)))
                   (if com-window
                       (select-window com-window)
                     (select-window
                      (split-window (selected-window) (- (window-height) 15) nil)))
                   (switch-to-buffer (get-buffer compilation-buffer-name))
                   (select-window cur-window))))
             (defun compilation-close ()
               "*compilation*バッファを表示しているwindowをクローズする"
               (interactive)
               (let ((com-buffer (get-buffer compilation-buffer-name)))
                 (if com-buffer
                     (let ((com-window (get-buffer-window com-buffer)))
                       (if com-window
                           (delete-window com-window))))))
             (defun my-compile (command &optional comint)
               "*compilation*バッファの表示位置を固定化してcompileコマンドを実行する関数。"
               (interactive
                (list
                 (let ((command (eval compile-command)))
                   (if (or compilation-read-command current-prefix-arg)
                       (read-from-minibuffer "Compile command: "
                                             command nil nil
                                             (if (equal (car compile-history) command)
                                                 '(compile-history . 1)
                                               'compile-history))
                     command))
                 (consp current-prefix-arg)))
               (unless (equal command (eval compile-command))
                 (setq compile-command command))
               (save-some-buffers (not compilation-ask-about-save) nil)
               (setq compilation-directory default-directory)
               (compilation-open)
               (compilation-start command comint))
             ;; cc-modeの自前スタイル設定
             (c-add-style "personal" my-c-style t)
             (setq tab-width 4)
             (setq indent-tabs-mode nil)
             (setq completion-mode t)
             ;; compile-windowの設定
             (setq compilation-buffer-name "*compilation*")
             (setq compilation-scroll-output t)
             (setq compilation-read-command t)
             (setq compilation-ask-about-save nil)
             (setq compilation-window-height 10)
             (setq compile-command "make")
             ;; cc-mode内で定義されるキーバインド
             (define-key c-mode-base-map "\C-c\C-c"   'comment-region)
             (define-key c-mode-base-map "\C-c\C-M-c" 'uncomment-region)
             (define-key c-mode-base-map "\C-ce"      'c-macro-expand)
             (define-key c-mode-base-map "\C-cc"      'my-compile)
             (define-key c-mode-base-map "\C-c\M-c"   'compilation-close)
             (define-key c-mode-base-map "\C-cg"      'gdb)
             (define-key c-mode-base-map "\C-ct"      'toggle-source)
             ;; cc-modeに入る時に自動的にgtags-modeにする
             (gtags-mode t)
             ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

c-mode-common-hookでmy-compileコマンドとcompilation-open/compilation-closeコマンドを定義しています。ローカルマップでお好きにキーアサインしてくださいな。僕の環境では

C-cc (my-compile)
C-cM-c (compilation-close)

としました。これで、いつも通りC-ccでコンパイル、C-cM-cで*compilation*バッファをクローズできます。便利になりましたわ。もうちょっと綺麗に書きたいんやけど、まぁそれはそのうち。

【Emacs】 最終更新日時の自動埋め込み

Emacsでプログラムやドキュメントなんかを書いてると、最終更新日時を記述する事が多いです。でも最終更新日時を自分で手作業で更新するのもあんまり効率良くないし、面倒なわけですな。それにこんな作業を手作業で行うなんてナンセンスやから、自動ですべきやと思うわけですわ。

これもやはりMeadow memoを参考にして以下のように記述しました。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 最終更新日時の自動埋め込み
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 表示形式
(setq time-stamp-start "last updated : ")
;;(setq time-stamp-format "%04y/%02m/%02d-%02H:%02M:%02S")
;; 行端のデリミタ
(setq time-stamp-end "$")
(if (not (memq 'time-stamp write-file-hooks))
    (setq write-file-hooks
          (cons 'time-stamp write-file-hooks)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

これで、テキストファイルの初めの方に

last updated: $

と書いておくだけで、ファイルの保存時に自動的に最終更新日時が埋め込まれます。便利ですなぁ
time-stamp-format の設定を有効にすれば任意の形式で更新日時を埋め込めます。