わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

句読点変換の関数

当雑記ではずいぶんと,本に書かれているのを打ち出して,引用しているのですが,あるときから,句読点を原文に合わせる習慣がつきました.
句読点は,「、。」「,。」「,.」の3種類です.「、.」は見かけません.それと,句点は「。」「.」,読点は「、」「,」を指しますが,「テン・マル」「カンマ・マル」「カンマ・ピリオド」で呼び慣れているので,読点を先に書いています*1
日常は,ATOKにせよGoogle日本語入力にせよ,「,.」を使用していて,そこそこ長い文章を打ち込むときだけ設定変更をしていたのですが,そのつど変更するのには,ちょっとしたこととはいえ,ストレスを感じていました.
こういうのは,「本を見ながらがしがし打ち込むフェーズ」と「句読点を調整するフェーズ」に分けたい…と考えまして,句読点変換のためのEmacs Lispを書きました.

定義した関数は,変換を行うreplace-punctuationと,変換する句読点を指定してreplace-punctuationを呼び出す,tenmaru,commamaru,commaperiodの3つです.キーバインドは特に考えておらず,M-x tenmaru,M-x commamaru,M-x commaperiodで充分でしょう(2回目以降は,M-x M-p RETでいいですし).
変換対象は,マークが有効ならその範囲(選択領域),無効ならバッファ全体としました.そういった範囲取得は,count-lines-regionに語数カウント機能をつけるにコードがあります.(interactive "r")を使うのが一般的だと思いますが,関数定義と呼び出しの見通しを良くしておきたいので,(interactive)と書き,replace-punctuationの中で,(b (if mark-active (region-beginning) (point-min)))などとして代入するようにしました.region-beginningは『Emacs Lispテクニックバイブル』p.119で知り,http://flex.ee.uec.ac.jp/texi/eljman/eljman_206.htmlで確認しました.
もう一つの工夫として,置換の前に,実行していいか,問い合わせをするようにしました*2.そのための関数は,あれこれ苦労して結局,y-or-n-pに行き着きました.

*1:昔話を.塾講師をしていたある日,英語の何かでこちらが「コンマ」と言ったのですが,タイミング良く女子生徒が「コンマを逆から言ってみて」と言い出しました.ああ他愛もないなあ,まあここは笑ったら思うツボなので,笑わんようにしよか,と思った次の瞬間に,同室の男子生徒が思うツボ状態でした.その一件以来,基本的に「カンマ」と呼ぶようにしています.

*2:間違って置換をしてしまっても,C-/ C-/すなわちアンドゥ2回で,変換前に戻ります.