May 29, 2010

EmacsのX Windowフォントの設定方法(2)

次に、日本語とかASCIIとかの文字集合の単位で別々のフォントを設定してみる。
日本語と英語しか使わなくても、日本語文字の分しか無いフォントとか、ASCII文字の分しか無いフォントとかを使う場合、そういうことが必要になることがある。アラビア語とかハングルとか、日英以外の文字も表示したいのにフォントが自動的に読み込まれないような時も、必要になる。
Xftが有効なEmacs23を使う場合、fontconfigの設定が適切であれば、そのような事態はあまり起こらないような気がするし、起こってもEmacs側で対処するよりfontconfig側で直すべき話になるかも知れないが、筆者の環境ではEmacs22が現役であるので、そのような事態は基本的に発生するのである。

Emacsのフォントは文字セット(文字集合、charset)とフォント名の組で管理される。その文字セットとフォント名の組のリストをフォントセットと言う。文字セットは、JIS X 0208とかiso8859-1等の単位で指定するのが基本であるが、Emacs23では文字コードの範囲で指定することもできる。Emacsで定義されている文字セットは、M-x list-character-setsするとわかる。日本語文字とASCII文字に関係するのは以下のものである。
・ascii: 言うまでもなくASCII文字
・japanese-jisx0208: 日本語、大体第1〜2水準漢字を含む
・japanese-jisx0212: 大体第3〜4水準漢字
・japanese-jisx0213: JIS X0208 + JIS X0212
・katakana-jisx0201: 日本語のいわゆる半角カナ、Emacs23ではjisx0201
・unicode-bmp: Unicodeの基本面(0群0面、UCS-2で表現できる範囲)(Emacs23のみ)
半角カナを使わなければ、asciiとjapanese-jisx0208のフォントを設定すれば十分である。
フォントセットを意識せずにset-frame-fontとかで1つのフォントのみを指定してフォントを変更しても、裏では何らかのフォントセットが自動的に構成される。

現在使用されているフォントセットは、M-x describe-fontsetでcurrent frameを指定すると表示される。これの出力形式は、Emacs22と23とで全然異なる。Emacs22の方が単純でわかり易い。Emacs23の方がきめ細かな設定ができるので仕方ないのだろうが、非常にわかりづらい。困ったものである。Emacs22で実行すると、以下のような感じになる。

Fontset: -etl-*-medium-r-normal-*-16-*-*-*-*-*-fontset-16
CHARSET or CHAR RANGE FONT NAME
--------------------- ---------
ascii -etl-fixed-medium-r-normal--16-160-72-72-c-80-iso8859-1
[-ETL-fixed-bold-r-normal--16-160-72-72-C-80-ISO8859-1]
[-ETL-Fixed-Medium-R-Normal--16-160-72-72-C-80-ISO8859-1]
latin-iso8859-1 -etl-fixed-*-iso8859-1
latin-iso8859-2 -*-iso8859-2
latin-iso8859-3 -*-iso8859-3
(中略、以下抜粋)
katakana-jisx0201 -*-jisx0201-*
[-Shinonome-Gothic-Medium-R-Normal--16-150-75-75-C-80-JISX0201.1976-0]
japanese-jisx0208 -*-jisx0208.1990-*
japanese-jisx0212 -*-jisx0212-*
[-Misc-Fixed-Medium-R-Normal--16-150-75-75-C-160-JISX0212.1990-0]
japanese-jisx0213-1 -*-jisx0213.2000-1
[-Misc-Fixed-Medium-R-Normal--16-150-75-75-C-160-JISX0213.2000-1]
japanese-jisx0213-2 -*-jisx0213.2000-2
[-Misc-Fixed-Medium-R-Normal--16-150-75-75-C-160-JISX0213.2000-2]

文字セットの右側が指定したフォント名、[]内が実際にロードされたフォント名である。ちなみに、上の出力は、FreeBSD7.3でintlfontsというpackageをインストールして、intlfontsのdocに書かれている設定をそのまま使った状態である。

Emacs23だとこれを読み取るのは困難であるが、同じような意味の設定をすれば十分である。Emacs23だとiso10646とか"unicode-bmp"とかの名前もあって、これを使ってもまあ悪くない。

フォントセットの定義は、Xリソースでも.emacsでもできる。
今回は、Emacs23用に.emacsでやってみた。(筆者のXリソースはEmacs22に合わせている為)
まずは、フォントセットを定義せずに、自動的に作られたフォントセットのフォントを変更してみる。

(when (>= emacs-major-version 23)
(when window-system
;;(1)ASCIIフォント設定
(setq default-frame-alist
(append '(
(font . "Sazanami Mincho:style=Regular:size=22") ;ASCII文字のフォント
(width . 80) ;文字が大きいので、ついでにウィンドウサイズ変更
(height . 24)
)
default-frame-alist))

;;(2)最初のフレームのサイズ変更
(set-frame-size (selected-frame) 80 24)

;;(3)日本語フォント変更
(add-hook 'window-setup-hook
'(lambda ()
;;日本語→VLゴシック
(set-fontset-font (frame-parameter nil 'font)
'japanese-jisx0208
(font-spec :family "VL Gothic"))
;;全角カタカナのみ、さざなみ明朝に戻す
(set-fontset-font (frame-parameter nil 'font)
;;'(#x3041 . #x309f) ;ひらがな
'(#x30a0 . #x30ff) ;カタカナ
(font-spec :family "Sazanami Mincho"))
;;半角カナ→Kappaのイタリック体
(set-fontset-font (frame-parameter nil 'font)
'jisx0201
"-kappa-*-medium-i-*-*-20-*-*-*-*-*-jisx0201.1976-*")
))
))

結果

ASCIIフォントの設定はset-frame-font、現在のフォントセットの一部フォント変更は(set-fontset-font (frame-parameter nil 'font) ...)でできる((frame-parameter nil 'font)は現在のフレームのフォントセット名を返す)ので、それらを単に並べればできそうなものであるが、色々ややこしいことがあってそれではうまくいかなかったので、色々工夫してみた。
(1)のASCIIフォント設定は、default-frame-alistに登録するのでなくset-frame-fontを使うと、少なくとも筆者の環境では、.emacs実行後に(おそらくface設定の処理でdefault-frame-alist等のフォントに)また変えられてしまう。もし変えられなくても、C-x 5 2で開いたフレームにはフォント設定が引き継がれなくなってしまう。initial-frame-alistに登録するのでも同様の問題がある。
(2)のウィンドウサイズ変更は、せっかくdefault-frame-alistに書いても、筆者の環境では、最初のフレームについてはこの後default-frame-alistのwidthやheightが反映されない(fontは反映される)ので、仕方なく加えた。initial-frame-alistに登録してもだめだった。
(3)は、set-fontset-fontをすぐに実行すると、この時点ではまだdefault-frame-alistに登録したフォントに切り替わっていないため、無意味になってしまう(おそらくfontset-startupに対する設定になってしまう)ので、強引だがwindow-setup-hookに登録して後で実行させるようにした。

(face-set-after-frame-default)
(set-fontset-font ...)

とすれば、default-frame-alistのフォントに切り替わり、それに対するフォントセットも作られるようで、(3)と同じ結果が得られることを確認したが、どうせ後でdefault-frame-alistのフォントへの切替が発生するし、筆者がfaceの動作を理解していないので、今回は見送った。
なお、(1)でフォントサイズを22ドットとやたらでかくしているのは、さざなみフォントが20ドット以下だとアンチエイリアスされない(20ドット以下はビットマップフォントが内蔵されているため、TrueTypeでなくそちらが使われる)為である。同様に、東風フォントだと16ドット以下と20ドットがアンチエイリアスされない。
また、筆者の環境(FreeBSD 7.3のデフォルトのfontconfig)では、さざなみフォントの場合は(3)をしなくても日本語や半角カナが表示されない訳ではない。

さて、実際にフォントが切り替わってから現在のフレームのフォントセットに対して変更を加えるのは、set-fontset-fontだけで済むのである意味単純だが、あまり美しくない。上のように苦しくなってwindow-setup-hookのコールバックでフォントを切り替えるのでは敗北感すら漂う汚さである。そもそも、普通は先にフォントセットを定義してからフォントをそのフォントセットに切り替えるものである。Xのリソースでの設定ではそのようにしかできない。

そこで、次にフォントセットの定義をやってみる。フォントセットの定義は、create-fontset-from-ascii-fontしてからset-fontset-fontするのが定跡である。次のように書くと、上の例と同じ設定になる。

(when (>= emacs-major-version 23)
(when window-system
;;(4)フォントセット"fontset-test0"の定義
(create-fontset-from-ascii-font
"Sazanami Mincho:style=Regular:size=22" nil "test0")
;;日本語→VLゴシック
(set-fontset-font "fontset-test0"
'japanese-jisx0208
(font-spec :family "VL Gothic"))
;;全角カタカナのみ、さざなみ明朝に戻す
(set-fontset-font "fontset-test0"
'(#x30a0 . #x30ff) ;カタカナ
(font-spec :family "Sazanami Mincho"))
;;半角カナ→Kappaのイタリック体
(set-fontset-font "fontset-test0"
'jisx0201
"-kappa-*-medium-i-*-*-20-*-*-*-*-*-jisx0201.1976-*")

;;(5)フォント設定
(setq default-frame-alist
(append '(
(font . "fontset-test0")
(width . 80)
(height . 24)
)
default-frame-alist))

;;(2)最初のフレームのサイズ変更
(set-frame-size (selected-frame) 80 24)
))


(2)の部分は不満だが、かなりマシになった。

参考:Emacs InfoのDefining fontsetsの章

See more ...

Posted at 23:57 in UNIX | WriteBacks (0)
WriteBacks

May 23, 2010

EmacsのX Windowフォントの設定方法(1)

筆者は普段EmacsをX Windowで使わない。そもそもX Windowを使っていないからだ。使うのはFreeBSDやLinuxで動くEmacsだが、WindowsからTelnetやSSHでアクセスしているので、キャラクターベースである。マウスも使わ(え)ない。
昔はパソコンの性能に対してWindowsが重かったので、FreeBSD+X Windowを愛用していたが、その時はEmacsも重かったので、Emacsはktermやrxvtの中でしか使わなかった。
そのさらに昔、大学の研究室にはX Windowの端末があったので、X上のEmacsを使おうと思えば使えたのだが、Emacsを知ると同時にTelnetも知ってしまい、EmacsをXで使う利点よりも、コンピューターを遠隔操作することの魅力に取り憑かれてしまったので、やはりEmacsは文字ベースの端末で使っていた。
だから、X上のEmacsのカスタマイズというのはほとんどやったことがなかった。

時代は変わって、Windows上の仮想マシンでX Windowがスムーズに動くようになった。先月、訳あって、仮想マシンにFreeBSD 7.3をインストールした。XもEmacsもインストールした。ところで、筆者は昨年より再びEmacsを使い始め、今Emacsがマイブームなのである。そのため、XのEmacsのカスタマイズもやり始めている。大学の研究室でEmacsに出会ってからの1x年に渡る旧知の仲、しかも歳を重ねて英語もEmacs Lispもそれなりに読めるようになった今、もはや何もつまずくことはなかろうと高を括っていたら、フォントの設定にコテンパンにやられてしまった。何ゆえかくも複雑なのであろうか。

たかがフォントの設定に膨大な時間を費やしてしまったので、調べまくったことをここにメモしていくことにする。

●Emacs 22と23の違い
Xのフォントに関して、Emacsのバージョン22と23とでは大きな違いがある。バージョン23ではXftがサポートされ、アンチエイリアスされた滑らかなフォントが表示できるのである。また、フォント名として、あの長ったらしいXLFD名のみでなく、Xftの短い名前も使える。

・通常のビットマップフォントの例
(東雲ゴシック 16ドット)
-shinonome-gothic-medium-r-normal-*-16-150-75-75-c-160-jisx02081990-0
-shinonome-gothic-medium-r-normal-*-16-150-75-75-c-80-iso8859-1
(Ayuゴシック 20ドット)
-ayu-gothic-medium-r-normal-*-20-190-75-75-c-200-jisx02081990-0
ayu-gothic-medium-r-normal--20-190-75-75-c-100-iso8859-1

・アンチエイリアスされたTrueTypeフォントの例(M+2VM+IPAG circle 14pt)
M+2VM+IPAG circle
M+2VM+IPAG circle

しかしながら、その分ちょっと重い。

●Emacs23起動後のフォント変更方法
Shift+左クリックで開くポップアップメニューの"Change Buffer Font..."を選ぶと、フォント選択ダイアログが出てくる。
ダイアログの下半分のプレビューエリアには、Xのセレクションを使って、日本語をペーストすることもできる。(別プロセスのウィンドウの日本語文字列を左ボタンでドラッグして選択し、ここに中ボタンでペーストする等)

しかし、これで設定したフォントはバッファローカルであり、終了時に保存されないどころか、別のファイルを開くと引き継がれない。

●Emacs23のフォントの設定方法(X resourcesを使う場合)
Emacsのフォントの設定は.emacsの中にも書けるが、.emacsに書くには考慮することが色々あって結構難しい。それに対し、Xのリソースに登録する方法は、無難で手軽である。
例えば、~/.Xdefaultsに次のように記述する。

Emacs.font: M+2VM+IPAG circle

"M+2VM+IPAG circle"は、筆者のお気に入りのフォントの名前である。
M+2VM+IPAG circleにすると、ウィンドウサイズが横に広がりすぎるので、ウィンドウサイズも指定する。
Emacs.geometry: 40x32+30+0

ウィンドウサイズが40×32文字、表示位置が(30,0)という意味である。

フォントサイズを変更するには、フォントの高さをpt単位で指定する。
Emacs*attributeHeight: 140
設定する値は実際のpt数の10倍である。14ptなら140、10.5ptなら105とする。
"*"でごまかすのでなく、default faceのattributeHeightだけ指定すれば良いはずなのだが、書き方がわからなかった。("Emacs.default.attributeHeight: 140"では効かなかった)

万一、デフォルト起動でEmacsのXftが有効にならない場合は、

Emacs.FontBackend: xft

を含めておくと良いらしい。

余談だが、Xのリソース設定を~/.Xdefaultsに書いている場合は、アプリケーションの起動時に毎回自動的に読み込まれるので、ここに書いてEmacsを起動すると、設定したフォントで起動する。Xのセッション起動時に読み込まれる~/.Xresourcesに書いている場合は、追記した内容をすぐに反映させるには、次のコマンドを実行すると、Xのリソースに登録される。

xrdb -merge ~/.Xresources

●Emacs23のフォントの設定方法(.emacsに書く場合)
筆者の環境では、たまにEmacs23は重いと感じることがあるため、Emacs22をデフォルトにしている。そのため、XのリソースをEmacs23の設定にしたくない。そのような場合は、.emacsにてフォントを設定することもできる。

フレームのフォントの変更はset-frame-font、フレームのサイズの変更はset-frame-sizeでできる。また、ありがちな問題として、これらの設定はC-x 5 2で別のフレームを開いた時に引き継がれないということがあるので、こういうのはdefault-frame-alistに登録する必要がある。ついでにEmacsのバージョンもチェックするようにして、

(when (>= emacs-major-version 23)
(when window-system
(set-frame-font "M+2VM+IPAG circle") ;最初のフレームのフォント設定
(set-frame-size (selected-frame) 40 32) ;最初のフレームのサイズ
(setq default-frame-alist ;以後のフレームの設定
(append '(
(width . 40)
(height . 32)
(font . "M+2VM+IPAG circle")
) default-frame-alist))
))

でOKである。

筆者の環境では、ここでset-frame-fontをしなくても、この後の処理で最初のフレームのフォントがdefault-frame-alistに書いたフォントになることが確認できたので、set-frame-fontは外した。フレームのサイズについては、このように明示的にset-frame-sizeしないと変わらなかった。

フォントサイズの設定は、詳細を省くが

(set-face-attribute 'default nil :height 140)

のようにするとできる。これはフレームに対する設定ではなく、"default" faceに対する設定である。.emacsにこれを書いても、最初のフレームに関してはfaceの設定は済んだ後なので、最初のフレームについては、face設定の再読み込みが必要である。
(when (>= emacs-major-version 23)
(when window-system
;;(set-frame-font "M+2VM+IPAG circle") ;最初のフレームのフォント設定
(set-frame-size (selected-frame) 40 32) ;最初のフレームのサイズ
(setq default-frame-alist ;以後のフレームの設定
(append '(
(width . 40)
(height . 32)
(font . "M+2VM+IPAG circle")
) default-frame-alist))
(set-face-attribute 'default nil ;default faceの設定
:height 140 ;フォント高さ(/10pt)
)
(face-set-after-frame-default (selected-frame)) ;;最初のフレームのface再読み込み(NG)
))

…が、筆者の環境ではすぐにフォントサイズが戻ってしまった。Emacsの起動時には.emacsが実行された後も色々な処理が走るので、そのどこかで別の値に再設定されてしまうのだろう。その処理が特定できなかったので、今回はEmacs起動の最後の方で実行されるwindow-setup-hookに登録して乗り切ることにした。
(when (>= emacs-major-version 23)
(when window-system
;;(set-frame-font "M+2VM+IPAG circle") ;最初のフレームのフォント設定
(set-frame-size (selected-frame) 40 32) ;最初のフレームのサイズ
(setq default-frame-alist ;以後のフレームの設定
(append '(
(width . 40)
(height . 32)
(font . "M+2VM+IPAG circle")
) default-frame-alist))
(set-face-attribute 'default nil ;default faceの設定
:height 140 ;フォント高さ(/10pt)
)

;;最初のフレームのfaceの再読み込み(後処理)
(add-hook 'window-setup-hook
'(lambda ()
(face-set-after-frame-default (selected-frame)
))
))

See more ...

Posted at 22:39 in UNIX | WriteBacks (0)
WriteBacks

May 05, 2010

(FreeBSD 7.3) ApacheとTomcatを手早く連携させる

先月この玄箱のwebサーバーが起動しなくなって、復旧に時間がかかると思ったので、PC上の仮想マシンにFreeBSD 7.3をインストールして、代替のwebサーバーを構築し始めた。
幸いにして玄箱がすぐに復旧したので、FreeBSDは中途半端な状態で放ったらかしたが、せっかくなので、予備のサーバーとして最後まで構築することにした。

今回のは、動けばいいだけの環境なので、手間がかからないよう、可能な限りportsを使わず、packagesで統一することに決めた。portsを使い出すと、依存するライブラリのバージョンがpackagesと合わなくなって、以後何もかもportsでインストールしないといけなくなる恐れがあるからである。

このサーバーの代替をするには、HTTPサーバーの機能とJava servletを動かす機能が必要である。そう決めた。TomcatはHTTPサーバーの機能も持つので、全てTomcatに任せるという手もあるのだが、TomcatはJavaで動いており、決して軽くない。当然、通常のHTTPリクエストはApacheで処理し、TomcatはJava servletやJSPを動かすのみとしたい。

ApacheとTomcatがそれぞれ別々のポート(80と8080とか)でリクエストを待つと、外部に2つのポートを公開しないといけないことになるし、アクセスURLにポート番号を含めることが必要になり、美しくないことになる。当然、Apacheが一旦全てのHTTPリクエストを受けて、必要なもののみTomcatに転送するようにしたい。

それは、Apacheのmod_proxyを使えば実現できる。このwebサーバーでもそうやっている。
FreeBSD 7.3のインストーラー(sysinstall)のパッケージ一覧でmod_proxyを検索すると、"mod_proxy_html"と"mod_proxy_xml"が見つかるが、どちらをインストールしてもmod_proxyはインストールされない。mod_proxyはApacheの本体と共に配布されているので、mod_proxyという名前のpackageが無ければ、どこかに含まれているとすればApache本体であるが、packagesのどのApacheをインストールしてもmod_proxyは入らない。従って、mod_proxyを使うにはそのようにオプションを設定してapacheをコンパイルするしか無いようである。セキュリティホールになり得るmod_proxyが不必要に有効にならないようにという配慮であろうか。

mod_proxyを使う以外に方法はあるのだろうか。Apacheから一部のリクエストをTomcatに転送する方法としては、次の3つの方法が一般的らしい。(参考:http://dev.ariel-networks.com/Members/inoue/tomcat-apache
・mod_proxy_http
・mod_proxy_ajp
・mod_jk
上の2つはFreeBSD7.3のpackagesには無いが、mod_jkはある。従って、mod_jkしか選択肢が無い。mod_jkも無ければApacheをコンパイルするしか無いと諦めがついたのだが、あるから仕方がない。mod_proxyが無いと、mod_perlを使うhttpdを別に動かして連携することができないが、仕方がない。packagesにmod_jkがあるので、この代替サーバーでのmod_perlの使用は諦める。

結局、以下の手順で、FreeBSD 7.3のpackagesだけでApache+Tomcatの連携ができるようになった。
1. packagesの一覧からmod_jk-ap2-1.2.30_1を選択してインストールする。
 apacheが入ってなければ、それも自動的にインストールされる。
2. Tomcatはpackagesに4.xも5.5も6.0もあるが、どれでも良いので、インストール動くようにしておく。
3. /usr/local/etc/apache2/のworkers.properties.sampleをコピーしてworkers.propertiesという名前にし、以下の行を書き換える。

worker.list=localhost
worker.jsp-hostname.port=8180
worker.jsp-hostname.host=localhost

4. 同ディレクトリのmod_jk.conf.sampleをIncludes/mod_jk.confとしてコピーし、JkWorkersFileの%%APACHEETCDIR%%の所とJkMountの行を書き換える。
JkWorkersFile /usr/local/etc/apache2/workers.properties
JkMount /*.jsp localhost
JkMount /servlet/* localhost
(以下略)

このようにしてApacheを再起動すると、httpdが受けたhttp://(hostname)/*.jspや
http://(hostname)/servlet/*にマッチするURLのリクエストがTomcatに転送されるようになった。

See more ...

WriteBacks

May 03, 2010

(FreeBSD) Emacs+anthy.elのかなキー入力の設定

以前にFreeBSDで(ローマ字でない)かなキー入力の設定をして、たまにjvim+cannaやEmacs+cannaでかな入力をしていたのだが、先月訳あってFreeBSD 7.3を新規にインストールすると、何と7.2まであったcanna-serverがpackagesから無くなっていた。portsを使えば時間はかかってもトラブル無くインストールできるのだろうが、今回はなるべくインストール作業に時間と手間を掛けたくなかったので、この機会にpackagesだけでインストールできるEmacs+anthy.elに完全に乗り換えることにした。

ところが、使ってみるとanthy.elのかな入力モード(anthy-kana-map-mode)のデフォルトの設定は使いづらいことがわかった。特に、全角数字や全角記号を入力する手段が無い(全角のアルファベットは入力できる)のが個人的に支障がある。漢字変換の辞書として登録しようにも、半角記号は漢字変換の対象にならないし、そして全角記号を片っ端からanthy-conf.elのキーマップに登録すると動かなくなってしまったのである。
丁度、GW開始と同時にえげつない風邪をひいて(咳と痰で窒息死するかと思った)未だ蟄居を余儀なくされており、パソコンに向かえるくらいには回復したものの、これより難しいことに取り組めるほど頭が回らないので、この機会に色々調べてanthy.elをカスタマイズしてみた。

(1) X Windowのキーの設定
以前のエントリーに書いたように、X Windowのデフォルトの設定では「ろ」「を」「ー」キー識別に問題があるので、keysymを変更する。
~/.Xmodmapに以下の2行を加える。

keycode 211 = underscore underscore
keycode 19 = 0 bar kana_WA kana_WO

(2) Emacsの設定
後述のキーマップの設定は文字コードがJISでないといけないので、anthy.el関連の設定は.emacs.elとは別のファイルに書くことにした。また、以前のエントリーではシステムのanthy-conf.elのキーマップの設定を書き換えていたが、ここではkeysymの設定をホームディレクトリに置いてるので、これもホームディレクトリに置くことにした。

~/.emacs.elの記述

(load (concat (getenv "HOME") "/.anthy-conf.el"))

~/.anthy-conf.el(文字コード:JIS)

;;anthy.elの設定
(load-library "anthy")
(setq defualt-input-method "japanese-anthy")
;(global-set-key "\C-o" 'anthy-mode)

(anthy-kana-map-mode) ;かなキー入力モード

;;xmodmapの変更に合わせたキーバインド
(anthy-change-hiragana-map "_" "ろ")
(anthy-change-hiragana-map "|" "を")
(anthy-change-hiragana-map "\\" "ー")
(anthy-change-katakana-map "_" "ロ")
(anthy-change-katakana-map "|" "ヲ")
(anthy-change-katakana-map "\\" "ー")

;;Anthyのひらがなモードとカタカナモードのキーマップを同時に設定する関数
(defun anthy-load-bothkana-map (map)
(mapcar (lambda (x)
(let ((key (car x)) (str (cdr x)))
(anthy-change-hiragana-map key str)
(anthy-change-katakana-map key str))) map))

;;日本語でよく使う記号(ワンプッシュにする)
(anthy-load-bothkana-map '(("{" . "「") ("}" . "」") ("?" . "・")))

;;その他全角記号("Q"+キーにする)
;;=”@‘+*は元々Shiftとの組み合わせで出るので省略
(anthy-load-bothkana-map
'(
("Q0" . "0") ("Q1" . "1") ("Q2" . "2") ("Q3" . "3") ("Q4" . "4") ("Q5" . "5") ("Q6" . "6") ("Q7" . "7") ("Q8" . "8") ("Q9" . "9")
("Q-" . "-") ("Q^" . "^") ("Q\"" . "\")
("Q!" . "!") ("Q#" . "#") ("Q$" . "$") ("Q%" . "%") ("Q&" . "&") ("Q'" . "’") ("Q(" . "(") ("Q)" . ")")
("Q~" . "~") ("Q|" . "|")
("Q[" . "[") ("Q]" . "]") ("Q{" . "{") ("Q}" . "}")
("Q;" . ";") ("Q:" . ":")
("Q," . ",") ("Q." . ".") ("Q<" . "<") ("Q>" . ">") ("Q/" . "/") ("Q?" . "?")))

;;カタカナは設定数が多いとダメのようなので、_はひらがなのみ
(anthy-change-hiragana-map "Q_" "_")
;;(anthy-change-katakana-map)をこれ以上実行すると固まる(\C-gで抜けられる)
;;(anthy-change-katakana-map "Q_" "_")

;;かな/カナ/全角アルファベットの切り替えのカスタマイズ
(setq anthy-rkmap-keybind
'(
;; \C-j --> ひらがな <=> カタカナ
(("hiragana" . 10) . "katakana")
(("katakana" . 10) . "hiragana")
(("walphabet" . 10) . "hiragana")
;; \C-p --> ひらがな <=> カタカナ
(("hiragana" . 16) . "katakana")
(("katakana" . 16) . "hiragana")
(("walphabet" . 16) . "hiragana")
;; \C-q --> ひらがな <=> ABC
(("hiragana" . 17) . "walphabet")
(("katakana" . 17) . "walphabet")
(("walphabet" . 17) . "hiragana")
;; H --> ひらがな
(("katakana" . 72) . "hiragana")
(("walphabet" . 72) . "hiragana")
;; K --> カタカナ
(("hiragana" . 75) . "katakana")
(("walphabet" . 75) . "katakana")
;; L --> ABC
(("hiragana" . 76) . "walphabet")
(("katakana" . 76) . "walphabet")
))

コメントにも少し書いているが、anthy-change-katakana-mapを使ってカタカナモードのキーマップにあまり多く登録すると、Anthyの応答が無くてEmacsが固まってしまう。その時にCtrl-Gを押すと、Emacs上にSegmentation faultと表示される。その後も日本語入力ができない訳ではない。謎である。

(5) anthy.elの修正
anthy-9100hのanthy.elは、Emacs23で使うと起動や変換候補一覧表示にやたら時間がかかる、よく知られたバグがある。これはanthy.elを書き換えて直すしかない。
ついでに、anthy.elをロードすると毎回

old-style backquotes detected!

と出て鬱陶しいので、それも修正する。

59c59
< (if (string-match "^22\." emacs-version)
---
> (if (>= emacs-major-version 22)
164,168c165,169
< (` (progn
< (defvar (, var) (, default-value)
< (, (format "%s\n\(buffer local\)" documentation)))
< (make-variable-buffer-local '(, var))
< )))
---
> `(progn
> (defvar ,var ,default-value
> ,(format "%s\n\(buffer local\)" documentation))
> (make-variable-buffer-local ',var)
> ))

これをファイルに保存して
cd /usr/local/share/emacs/site-lisp/anthy
patch anthy.el < (ファイル名)

とすると、修正が反映される。

See more ...

Posted at 20:25 in UNIX | WriteBacks (0)
WriteBacks