Meadow で UTF-8(BOM 付き)を使う
そのときのまとめです。
まずは使えるように
以下のサイトなどに書いてあるのを参考させてもらって .emacs.el に記述を追加します。
http://memo358.blog18.fc2.com/blog-entry-19.html
; (set-language-environment "Japanese")よりも前に
(require 'un-define)
(require 'jisx0213)
新しくファイルを開いたときの文字コードも UTF-8 に
C-x C-f で新しくファイルを開いた場合の文字コードも UTF-8 にしたいので、
以下の行も .emacs.el に追加します。
(set-default-coding-systems 'sjis-dos)
(setq-default buffer-file-coding-system 'utf-8-ws-dos)
Windows ではファイル名やターミナルなどで使う他のコマンドが Shift-JIS だったりするので、
デフォルトは Shift-JIS で、ファイルを開いた時の文字コードで UTF-8(BOM) を指定する必要があります。
指定時の記述は utf-8 が BOM なしで、 utf-8-ws が BOM 付きです。
BOM
UTF-8 には BOM 付きと BOM なしとあって、この BOM というのは Byte Order Mark の略でエンディアンの違いによるバイト順を判定するためのバイトコードで、ファイルの先頭に付加されます。
ただ、UTF-16 とかの場合だとバイト順は重要なのですが、 UTF-8 は 1 バイトなので、バイト順というよりも UTF-8 を使っているという標識の意味でつけられます。
しかし、 英数字だけであれば ASCII コードと同じで、英語圏であれば変更してもソフトの対応が要らないというのが UTF-8 の売りでもあるので BOM なしという状態もあります。
この BOM ありなしはどちらも利点、欠点があって混在しているのですが、ソフトによっては BOM ついてないとエラーになるのもあれば、BOM ついているとエラーになるのもあったりといろいろやっかいなことを引き起こします。
VisualStudio2010 でも BOM なし UTF-8 で日本語使ってたりするとビルド時にワーニングがでてくるので、 ソースは BOM 付き UTF-8 にする必要があります。
Meadow が BOM を消しちゃうための対策
私が使っている Meadow が古いだけかもしれませんが、 Meadow では UTF-8 の対応が不十分です。
というのも、 BOM 付き UTF-8 のファイルをオープンした時、正常にファイル内容は読み取れているのですが、文字コードは BOM なし UTF-8 と判定してしまいます。
なのでこのファイルを Meadow で編集して保存すると BOM が取れています。
C-x [Return] f でファイルの文字コードを utf-8-ws にしてから保存すると BOM 付きで保存できるのですが、いちいち指定するのめんどくさいです。
そこで苦肉の策として C-x C-s でファイルを保存する際に自動的に文字コードを変更してから保存するように .emacs.el に次のコードを記述するようにしました。
(global-set-key "\C-x\C-s" '(lambda ()
(interactive)
(set-buffer-file-coding-system 'utf-8-ws-dos)
(save-buffer)))
(global-set-key "\C-x\C-S" 'save-buffer)
ここでは通常の保存も残しておきたかったので C-x C-S に変更しています。
これだと終了前やコンパイル前の y, n で聞かれる保存の場合には対応できていないので注意して下さい。
defadvice とか使えば、完全に保存する前に BOM 付きに変更できると思うので、文字コードは BOM 付き UTF-8 しか使わないという人は試してみるとどうでしょうか。
その場合は次のようなコードを追加します(ただし、ちゃんと試してないです)
(defadvice save-buffer-as-utf-8-ws (before save-buffer
activate compile)
(set-buffer-file-coding-system 'utf-8-ws-dos))
ブログでコードハイライトする
その方法を紹介します。
スクリプトをダウンロードする
コードに色を付けるにはコードハイライトの JavaScript を使う必要があります。
コードハイライト用のスクリプトはいろいろ公開されているのですが、私は対応している言語が多かった SHJS というのを使いました。
他にも SyntaxHighter というスクリプトが有名で試してみたのですが、こちらは何故かうまく色が付いてくれませんでした。 (^^;)
まず、以下のサイトから必要なファイルまたはコード一式をダウンロードしてきます。
http://shjs.sourceforge.net/index.html
自分のブログにファイルをアップロードする
ダウンロードしてきたファイルを自分のブログにアップロードします。このとき最低限必要なファイルは 2 つです。
- スタイルシード sh_style.css
- メインのスクリプト sh_main.js
後はハイライトしたい言語のスクリプト sh_xxxx.js をアップロードしておきます。
このとき後で使うのでアップロード先のパスをコピーしておいてください。
テンプレートを編集する
アップロードしたスタイルシートとスクリプトを呼び出せるように head タグ内に以下のような行を追加します。
<head>
:
<link type="text/css" rel="stylesheet" href="http://blog.../sh_style.css" >
<script type="text/javascript" src="http://blog.../sh_main.js"></script>
<script type="text/javascript" src="http://blog.../sh_cpp.js"></script>
<script type="text/javascript" src="http://blog.../sh_html.js"></script>
<script type="text/javascript" src="http://blog.../sh_ruby.js"></script>
:
</head>
あと、ページのロード時にスクリプトを実行するように body タグに onload="sh_highlightDocument();" の記述を追加しておきます。
<body id="pagetop" onload="sh_highlightDocument();">
これでコードに色をつけて表示することが可能になりました。
コードを書く
実際にブログ中にコードを書く場合には、クラス属性でコードを指定した pre タグ内に書きます。
<pre class="sh_xxx">
色を付けたいコード
</pre>
ここの sh_xxx は言語ごとに変わるところで、スクリプトのファイル名の .js の前の部分です。
ただし、 html ファイル内では <, >, & は使用できないので、コード中の文字はそれぞれ <, >, & に変換しておく必要があります。
コードハイライトを楽にする emacs-lisp
また、Emacs の手放せない私としては文章書くとき、ちょっと長い文章であれば Emacs で書いて貼り付けてます。ブログ書くときもいったん html-mode で書いて、ブラウザに貼り付けた後文字の修飾などやって書いています。
Emacs を使っていてめんどくさいことがあればどうするか。もちろん lisp を書きます。
そこで、貼り付けたときに自動で置換してくれる Emacs の lisp を作ったので、紹介します。
設定
後で拡張しやすいように minor mode で機能を作りました。
以下のファイルをダウンロードして、パスの通っているところにおいてください。
ex-html-mode.el
.emacs.el に以下のコードを追加すると html-mode にしたときに ex-html-mode にもなるようになります。
(autoload 'ex-html-mode "ex-html-mode" "Minor mode for html edit" t)
(add-hook 'html-mode-hook 'ex-html-mode)
特に html-mode でなくてもかまわないので、そのときは add-hook で変更して下さい。
使用
ex-html-mode にすると以下のキーで機能を呼び出せます。
- C-c C-y
- コードの貼り付け
- C-c C-q
- 選択領域のクオート
C-c C-y で貼り付けた場合、コードの言語を聞いてくるので指定するとコード指定した <pre> をつけて中身をクオートして貼り付けます。
言語に何も指定しないと pre とクオートのみ行います。
コードハイライトを変える
ex-html-mode のコードの貼り付けはデフォルトでは SHJS 用ですが、変えることも出来ます。
例えば SyntaxHighlighter を使う場合は .emacs.el に以下の行も書いておきます。
(setq ex-html-code-class-alist
'(("c", "cpp") ("cpp", "cpp") ("csharp", "csharp") ("java", "java")
("pascal", "pascal") ("python", "python") ("ruby", "ruby")
("js", "js") ("php", "php") ("css", "css") ("xml", "xml") ("html", "xml")))
(setq ex-html-code-class-format "name=\"code\" class=\"%s\"")