Pages

2013年10月14日月曜日

Emacsで英語の文章書くのに便利なgrammar.elを導入した

Emacswikiで grammar.el の紹介記事をみて、これはいいと思い導入しました。
英語の文章の間違ったところをハイライトして教えてくれる。ただインストー
ルするのにちょっと苦労したので記事として残しておこうとおもいます。
(僕がC++とかmakeに詳しくないだけかもしれないですが…)

Snapshot

Installation

Ubuntu12.02をつかっていますが、aptでインストールできるlink-grammarでは
間違った箇所のハイライトをよけいなところまでしていたので、最新のものを
インストールすることをおすすめします。

cd ~/
mkdir -p grammar
cd grammar
# download link-grammar
svn co http://svn.abisource.com/link-grammar/trunk link-gram

link-grammarのビルド
README をみるのが一番いいとおもいますが、一応自分の例を書いておきます。
(pacoについては ここ とか参考になるかもしれません。)

sh autogen.sh
CC=clang CXX=clang++ ./configure --disable-java-bindings && make
sudo paco -D make install
sudo ldconfig

僕はel-getを利用しているので下のように設定したあと

(push '(:name grammar
:type svn
:url "http://bcui-emacs.googlecode.com/svn/trunk/grammar")
el-get-sources)

M-x el-get-install grammarでインストールしました。

普通にsubversionでインストールするには下のような感じ


svn co http://bcui-emacs.googlecode.com/svn/trunk/grammar

grammar.elを使うにはgrammar.ccをコンパイルする必要がありますが、添付の
makefileではうまくコンパイルできませんでした。(僕は…)
なので以下のような感じでコンパイルしました。(autorg というところで
grammar.elをコンパイルしていたのでそれを参考にしました。)

#!/bin/bash # -*- coding: utf-8; mode: sh; -*-
# GRAMMAR_DIR=grammar.elがあるディレクトリを指定してください
GRAMMAR_DIR=${HOME}/.emacs.d/el-get/grammar
# LINK=link-grammarがあるディレクトリ指定してください
LINK=${HOME}/grammar/link-gram

if test -d ${GRAMMAR_DIR}; then
LG=${LINK}/link-grammar
LIBLINK=${LG}/.libs/liblink-grammar.a
cd ${GRAMMAR_DIR}
# clangがなければg++でも行けると思います(未確認)
clang++ -O3 grammar.cc -I${LINK} -I${LG} ${LIBLINK} -o grammar
fi

コンパイルが終わったらgrammar.elの設定

(require 'grammar)
(setq grammar-program-name "作成したgrammarへのパス")
;; 黒背景だとデフォルトの色はみずらかったので変更
(set-face-attribute 'grammar-error-face nil
:background "#Ff6347"
:foreground "#000000")
(define-key grammar-mode-map (kbd "C-M-g") nil)
(global-set-key (kbd "C-\]") 'grammar-check)

上の設定だとC-]でそのポイントより前の grammar チェックをおこなってくれ
ます。デフォルトだとC-M-gにgrammar-checkをバインドしてくれるので消しています。

下の設定はgrammar-modeの間は, '.?' を押したタイミングで
grammar-checkを呼び出すようにしています。書いてからきずいたけど
grammar-delay-commandってやつで設定するのがgrammar.elの普通の使い方の
気がしてきた。
でも英語の文章書いてて文が完結するのが".?"のタイミングだと思うからこ
れでいいや。(自分が後悔しないための必死の言い訳。。。)
ちなみにlink-grammarをインストールするとコマンドラインからlink-parser
コマンドも使えるようになってこれで、どんな感じにパースするかみれる。

(eval-when-compile (require 'cl))
(defconst my/grammar-default-sentence-end ".?\"!。ぁ-んァ-ン")
(defvar my/grammar-sentence-end-local nil)

(defun* my/grammar-check (&optional (sentence ""))
(interactive)
(unless (bound-and-true-p my/grammar-sentence-end-local)
(my/grammar-set-sentence-end))
(let ((sentence-end
(format "[%s%s]" my/grammar-sentence-end-local sentence)))
(grammar-check)))

(defun my/grammar-check-auto ()
(when (and (bound-and-true-p grammar-mode)
(not (bobp))
(case (char-before)
(46 t) ; dot
(63 t)) ; question
(case major-mode
(org-mode (not (org-in-src-block-p)))
(t t)))
(if (not (bound-and-true-p my/programming-mode)
(my/grammar-check)
(my/grammar-check-for-programming))))

(defun my/grammar-set-sentence-end ()
(setq-local my/grammar-sentence-end-local
(format "%s%s"
my/grammar-default-sentence-end
(replace-regexp-in-string " " "" comment-start))))

(defun my/grammar-check-for-programming ()
(lexical-let ((current-face (nth 1 (text-properties-at (1- (point))))))
(when (or (equal 'font-lock-string-face current-face)
(equal 'font-lock-comment-face current-face))
(my/grammar-check))))

(defadvice self-insert-command
(around ad-check-grammar-automatically activate)
ad-do-it
(my/grammar-check-auto))

プログラミングしている時の文字列の入力やコメントの入力時にも使えるように、
my/grammar-check-for-programming関数がありますが、そんなにつかってない
ので動作は期待しないでください。。。
もし使いたい場合は下のようにして、モードフックごとに
my/programming-mode変数が設定されるようにしてください。

(defvar programing-hooks
'(emacs-lisp-mode-hook
ruby-mode-hook))

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

終わり

とりあえずこんな感じでつかっています。三単現のsとか複数系とか自分の忘
れやすいところを気づかせてくれるので結構便利と思います。

Land of Lisp

0 件のコメント:

コメントを投稿