aboutsummaryrefslogtreecommitdiffstats
path: root/migemo-find.js
diff options
context:
space:
mode:
Diffstat (limited to 'migemo-find.js')
-rw-r--r--migemo-find.js89
1 files changed, 89 insertions, 0 deletions
diff --git a/migemo-find.js b/migemo-find.js
new file mode 100644
index 0000000..1aad6f9
--- /dev/null
+++ b/migemo-find.js
@@ -0,0 +1,89 @@
+var PLUGIN_INFO =
+<VimperatorPlugin>
+<name>{NAME}</name>
+<description>Replace default search to migemo.</description>
+<description lang="ja">標準の検索を XUL/Migemo に置き換えます</description>
+<minVersion>2.0pre</minVersion>
+<maxVersion>2.0</maxVersion>
+<updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/migemo-find.js</updateURL>
+<author mail="hotchpotch@gmail.com" homepage="http://d.hatena.ne.jp/secondlife/">Yuichi Tateno</author>
+<license>MIT</license>
+<version>0.0.1</version>
+<detail lang="ja"><![CDATA[
+標準の / などの検索を XUL/Migemo 検索に置き換えます。
+同等の機能を持つプラグインとして migemize_find がありますが、
+migemo-find.js は pIXMigemoFind が提供している XUL/Migemo のインターフェイスを直接利用しています。
+
+== ToDo ==
+
+- migemo 正規表現でマッチしたパターンすべてにきちんとハイライト
+-- 現状は最初にマッチした文字列のみハイライトされる
+
+]]></detail>
+</VimperatorPlugin>;
+
+liberator.plugins.migemoFind = (function() {
+ let p = function(m) Application.console.log(m);
+
+ let evalWithContext = function(func, context) {
+ let str;
+ let fstr = func.toString();
+ if (fstr.indexOf('function () {') == 0) {
+ str = fstr.replace(/.*?{([\s\S]+)}.*?/m, "$1");
+ } else {
+ str = '(' + fstr + ')()';
+ }
+ return liberator.eval(str, context);
+ }
+
+ var XMigemoFind;
+ try {
+ XMigemoFind = Cc['@piro.sakura.ne.jp/xmigemo/find;1']
+ .getService(Ci.pIXMigemoFind);
+ } catch(ex if ex instanceof TypeError){}
+
+ if (!XMigemoFind) {
+ liberator.echoerr("XUL/Migemo not found. You should be install XUL/Migemo.");
+ return;
+ }
+
+ search.migemo = XMigemoFind.wrappedJSObject;
+ search.migemo.target = window.gBrowser;
+
+ if (!search._find)
+ search._find = search.find;
+ if (!search._findAgain)
+ search._findAgain = search.findAgain;
+
+ let setFound = function(f) {
+ liberator.eval('found = ' + f.toString(), search._find);
+ }
+
+ if (!search.migemoFindEvnetListener) {
+ search.migemoFindEvnetListener = search.migemo.document.addEventListener('XMigemoFindProgress', function(ev) {
+ if (!ev.foundTerm) {
+ liberator.echoerr("E486: Pattern not found: " + ev.findTerm, commandline.FORCE_SINGLELINE);
+ setFound(false);
+ } else {
+ setFound(true);
+ }
+ }, false);
+ }
+
+ evalWithContext(function () {
+ search.find = function (str) {
+ search.migemo.find(false, str, options["linksearch"]);
+ searchString = searchPattern = search.migemo.lastFoundWord;
+ }
+ }, search._find);
+
+ evalWithContext(function () {
+ search.findAgain = function (reverse) {
+ let migemo = search.migemo;
+ (!reverse) ? migemo.findNext(options["linksearch"]) : migemo.findPrevious(options["linksearch"]);
+ }
+ }, search._findAgain);
+ return this;
+})();
+
+