読者です 読者をやめる 読者になる 読者になる

Emacsのエンコーディング指定プラグマを挿入する

elisp

Emacsではエンコーディング方法や modeの指定をファイルごとに行う
ことができます。

 ;; -*- coding:utf-8 mode:cperl -*-

です。コメントは別にいらないみたいなんですけど、当然コンパイラ等には
見せたくないのでコメントアウトするのが普通です. ファイル名は拡張子
決めることができるんですが、エンコーディングをまれに間違うのが痛い。
バージョン 23.1を入れたら改善されるのかもしれないですが, Ruby等の言語
では同様の方法でエンコーディングを指定できるので, 挿入しておいて損は
ないでしょう。(modeについては拡張子がないファイルは便利ですね)


しかし "-*-"を二回も書くのが面倒くさいし, 書き方自体も忘れてしまう
こともあるので, 現在のバッファ名から拡張子を読み取って指定した
エンコーディングを埋めるものを書いてみた.

(defun insert-encoding-pragma (charset)
  "Insert encoding pragma for each programming language"
  (interactive "sInput encoding: ")
  (let* ((extension (insert-encoding-get-file-extension (buffer-name)))
         (comment-char (insert-encoding-get-comment-char extension))
         (pragma (concat comment-char "-*- coding:" charset " -*-")))
    (progn (beginning-of-line)
           (insert-string pragma))))

(defun insert-encoding-get-comment-char (extension)
  (let ((sharp-langs '("sh" "pl" "t" "pm" "rb" "py"))
        (slash-langs '("c" "h" "cpp"))
        (semicolon-langs '("gosh" "el" "scm" "lisp")))
    (cond ((member extension sharp-langs) "#")
          ((member extension slash-langs) "//")
          ((member extension semicolon-langs) ";;")
          (t ""))))

(defun insert-encoding-get-file-extension (filename)
  (if (string-match "\\.\\([a-zA-Z0-9]+\\)$" filename)
      (substring filename (match-beginning 1) (match-end 1))))

プラグマを挿入したい行に移動して insert-encoding-pragmaとすると,
エンコーディングを問われます。それに応じて挿入されます。

# sample.pl
#-*- coding:utf-8 -*-

;;; sample.el
;;-*- coding:utf-8 -*-

// sample.cpp
//-*- coding:euc-jp -*-

エンコーディングは補完できるようにした方がいいかな。あと対応する
ファイルタイプが普段書く言語ぐらいしかない. Rubyとか Pythonは書かない
ですが。comment-regionとかを参考にすればもうちょいマシになるのかな ?


てか Lispはやっぱり括弧が多いですね。括弧はエディタ任せで、インデントで
見るようになったのでね.メモ帳で書けと言われれば死にそうですが。