header

2013年9月7日土曜日

英語環境で文字を大文字にキャピタライズする拡張auto-capitalize.elを導入し た & aspellの個人辞書からもキャピタライズするようにした


Emacsで文章を書くときはauto-fill-modeなど色々拡張があると思いますが、 auto-capitalize.el という自動でキャピタライズしてくれる拡張を見つけたので導入しました。
がSKKを起動したあとこの拡張を使うとエラーが出て動かなかったので,
コードを修正してGitHubに公開しました。
Googlingしたのですが、emacswiki版のものが最新のようだったのでそれからフォークしました。(もし最新版をご存知の方がいたら教えていただけると助かります)

機能

モードがオンの状態だと、、、


  • コメント行のはじめの文字を大文字にしてくれる
  • ドットの後の文字を大文字ににしてくれる
  • auto-capitalize-words 変数に登録した文字を大文字にしてくれる。
    例えばGitHubと登録してあったら

    github


    と打った直後にGitHubに変換してくれる。

インストール

自分がEl-Get環境がメインになってるのでそのインストール方法から

(push '(:name auto-capitalize
:type git
:url "https://github.com/yuutayamada/auto-capitalize-el.git"
:load-path "./")
el-get-sources)


上のコマンドを設定ファイルに書いてC-x C-eなどで評価したあとM-x el-get-install auto-capitalizeでインストールできます。
もう一つの方法として、gitからクローンする方法

# クローン
cd /path/to/install/directory
git clone https://github.com/yuutayamada/auto-capitalize-el.git

設定

これが正解というのはないかもしれませんが一応自分の設定をのせておきます。そんなに確認できていませんが、この記事を書いているorg-modeではうまく動いています。
ソースコードの中ではコメント部分にいる間だけキャピタライズして欲しいのでそれ用の関数を書きました。

(defvar programing-hooks
'(c-mode-hook
c++-mode-hook
coffee-mode-hook
cperl-mode-hook
css-mode-hook
emacs-lisp-mode-hook
lisp-mode-hook
sh-mode-hook
js2-mode-hook
jade-mode-hook
python-mode-hook
ruby-mode-hook))

(defvar my/programming-mode nil
"Use this variable to know whether current major-mode is mode for programming.
If it is non-nil mean the mode is mode for programming.")

(loop for hook in programing-hooks
do (add-hook hook
'(lambda ()
(setq-local my/programming-mode t))))

(defun my/switch-auto-capitalize-mode ()
(if my/programming-mode
(if (equal font-lock-comment-face
(nth 1 (text-properties-at (point))))
(turn-on-auto-capitalize-mode)
(turn-off-auto-capitalize-mode))))

(defadvice self-insert-command
(around ad-turn-on-auto-capitalize activate)
(unless (minibufferp)
(my/switch-auto-capitalize-mode))
ad-do-it)

;;(defvar my/aspell-words-capital-only (my/get-aspell-capital-words))

(setq auto-capitalize-words `("I"
;; ,@my/aspell-words-capital-only
))

(setq auto-capitalize-predicate
'(lambda ()
;; Prevent auto-capitalize if return nil
(and (not buffer-read-only)
(or (not skk-mode) skk-latin-mode))))

(add-hook 'text-mode-hook
'(lambda ()
(turn-on-auto-capitalize-mode)))


auto-capitalize-words変数にリスト上の文字列をしてすることでその文字が入力されたときは大文字にしてくれます。


例:
i -> I

ちょっとハック

上のコードの中でコメントアウトしてる部分が気なると思いますが、
ispell/aspellで登録した単語から大文字にしたらいいと思いコードを書いてみました。

(eval-when-compile (require 'cl))
(defun my/get-buffer-string-from (file)
(lexical-let* ((current (current-buffer))
(aspell-buffer (find-file-noselect file))
words)
(switch-to-buffer aspell-buffer)
(setq words (buffer-substring-no-properties (point-min) (point-max)))
(switch-to-buffer current)
words))

(defun my/get-aspell-capital-words ()
(loop with personal-dict = (my/get-buffer-string-from "~/.aspell.en.pws")
with words = (split-string personal-dict "\n")
with case-fold-search = nil
for word in words
if (string-match "[A-Z]" word)
collect word))


aspellの辞書の保存先は自分以外の環境はわからないので適当に変えてください。
上の関数を定義後コメントアウトしたところをコメントイン(この言い方でいいんですかね?)すればaspellの個人辞書の大文字の単語を含めることができます。
改行区切りのファイルなら他のaspellでなくても大丈夫だと思います。

感想

英語書くのが多い人はいいのではないかと思います。シフトキーを押す回数が気持ちへったきがします。auto-fill-modeのように標準で入ってもいいくらいだと思うのですがなんで入ってないんですかね?多分人名辞典かなんかからもっとインポートすればさらに便利になるのではないかと思います。

ダメなところ


  • 書いてる途中で気づいたのですが、El-Getなどのハイフンの入ったものはリストに登録してあってもうまくキャピタライズしてくれません。
  • コメント行では最初の文字をキャピタライズしてくれません。
    (誰かcomment-start変数をハックして僕にpull requiestを…)


使い始めて0.5日くらいですが今気になるのはこれくらいです。もし良かったら使ってみてください。


0 件のコメント:

コメントを投稿

Popular Posts

Blogger templates

Blogger news