2005-05-03 [長年日記]

[Q3] スペルチェック (3)

エディットビュー上で修正する部分などを作りこむのはおいおい考えるとしても、外部のスペルチェッカを簡単に呼び出せると便利かもしれません。そんな機能を入れてみようかと思ったのですが、スクリプトでやれそうなので試しに書いてみました。

以下のスクリプトを保存してscriptsフォルダに適当なファイル名で(拡張子は.jsで)入れると、エディットビューの[Tool]-[Script]から呼び出せるようになります。ショートカットキーを割り当てておくと良いかもしれません。

この例では、ispellのwin32版を呼び出していますが、他のスペルチェッカやスペルチェック機能つきのエディタなどでも少しスクリプトに手を加えてやれば対処できそうです。

var ispell = "\"C:\\ispell\\ispell-w32\\bin\\ispell.exe\"";
var tempFile = "C:\\temp\\spellcheck.txt";

// テキストをすべて選択してクリップボードにいれ、
// クリップボード経由でテキストを取得する
editFrameWindow.invokeAction("EditSelectAll");
editFrameWindow.invokeAction("EditCopy");
var getClipboardMacro = macroParser.parse("@Clipboard()");
var inText = getClipboardMacro.evaluate(application.nothing, document.accounts(0));

// 取得したテキストを一時ファイルに書き込む
var fs = new ActiveXObject("Scripting.FileSystemObject");
try {
  var inFile = fs.OpenTextFile(tempFile, 2, true);
  try {
    inFile.Write(inText);
  }
  finally {
    inFile.Close();
  }

  // ispellを起動して終了するまで待つ
  var shell = new ActiveXObject("WScript.Shell");
  shell.Run(ispell + " -x \"" + tempFile + "\"", 5, true);

  // ispellが修正したファイルを読み込む
  var outText = null;
  var outFile = fs.OpenTextFile(tempFile, 1);
  try {
    outText = outFile.ReadAll();
  }
  finally {
    outFile.Close();
  }

  // クリップボードを経由してエディットビューに貼り付け
  var setClipboardMacro = macroParser.parse("@Clipboard($value)");
  setClipboardMacro.setVariable("value", outText);
  setClipboardMacro.evaluate(application.nothing, document.accounts(0));
  editFrameWindow.invokeAction("EditPaste");
}
finally {
  fs.DeleteFile(tempFile);
}
本日のツッコミ(全8件) [ツッコミを入れる]
# tsawa (2005-05-08 18:11)

1行目は、<br>var ispell = "C:\\ispell\\ispell-w32\\bin\\ispell.exe";<br>ですよね。何か走るようにはなりましたが、今ひとつ、何をチェックしてくれるのかわかりませんでした。

# snak (2005-05-09 02:58)

一行目はパスに空白文字が入っている可能性があるので""で括ってあります(二行目が括っていないのでバランスが悪いですね)。<br><br>正しく動いていれば、スペルミスがあると起動したispell内で修正ができます。スペルミスがなければすぐに終了します。<br><br>ispellのインストールが正しくできていない(特に環境変数ISPELLDICTDIRが正しく設定されていない)場合にもすぐに終了してしまうので、試しにわざとスペルミスをしてみると正しく動いているかどうか確かめられると思います。

# tsawa (2005-05-09 18:22)

READMEすら読んでいませんでした。失礼しました。なかなか便利に使えそうです。なお、1行目はやっぱり元のままでは動作しません。<br>ついでと言っては失礼ですが、ショートカットキーへの割り当て方法も教えていただけないでしょうか。

# tsawa (2005-05-09 18:28)

何度もすいません。Cの後ろの:(コロン)が抜けているだけでした。

# snak (2005-05-10 00:13)

:が抜けているのは直しておきました。失礼しました。

# snak (2005-05-10 05:15)

ショートカットキーへの割り付けは普通にkeymap.xmlを編集してください。アクションの名前は、ToolScript0からToolScript9までの10個が使えます。

# tsawa (2005-05-10 18:42)

どうもありがとうございます。EditWindowに設定してみましたが、一旦メニューからスクリプトを表示させないと、ショートカットが有効になりません。ちょっと残念です。

# snak (2005-05-11 05:01)

それはバグですね。BTSに登録しておきました。<br><http://q3.snak.org/bts/guest.cgi?project=Q3&action=view_report&id=902><br><br># 以前同じようなバグを直したのですが直し忘れたようです。


トップ «前の日記(2005-05-02) 最新 次の日記(2005-05-04)»