前回はキーボードイベントで躓いていたミニ検索ウィンドウのミニけん。
① 1度目のEnterでは“検索”を開始してくれるが、2度目のEnterで、ヒットしたテキスト(選択範囲)で改行してしまう
②「次へ」や「前へ」のキーボードショートカットが効かない
といった問題があったのですが、こじらせたクマーさんの次のスクリプトを参考にさせていただいたところ、安定したと思います。
このスクリプトめちゃくちゃ楽しく使わせていただいてます。
わたしがやりたかったのが、キーボードショートカットを使って「次へ」「前へ」と検索をかけていきたかったのですが、これがどうもできなかった。
そこで、こじらせたクマーさんのスクリプトのキーボードショートカットの部分を参考に(というかコピー)させていただきました。
以下、コピーさせていただいた部分
// キーボードショートカット w.addEventListener("keydown",function(k){try{var isMac= $.os.indexOf("Mac")>=0;var cmdKey= isMac? k.metaKey: k.ctrlKey;if(k.keyName==="Enter"){// Cmd (Ctrl)+Shift+Enter → 前へif(cmdKey&& k.shiftKey){goPrev(); k.preventDefault();}// Cmd (Ctrl)+Enter → 次へ(適用なし) elseif(cmdKey){goNext(); k.preventDefault();}// Enter → 適用 & 次へ else{doSearch(); k.preventDefault();}}}catch(e){}});
全体のソースはこんな感じ
#target indesign#targetengine"persistentSearch"(function(){if(app.documents.length===0){alert("ドキュメントを開いてください");return;}var doc= app.activeDocument;var hits=[];var currentIndex=-1;// --- ダイアログ ---var w=newWindow("palette","ミニけん");// 検索文字入力欄var findGroup= w.add("group");var findField= findGroup.add("edittext",undefined,""); findField.characters=24; findField.active=true;// ボタン群var buttonGroup= w.add("group");var prevBtn= buttonGroup.add("button",undefined,"前へ");var findBtn= buttonGroup.add("button",undefined,"検索");var nextBtn= buttonGroup.add("button",undefined,"次へ");// --- 選択とページ移動 ---functionselectAndShow(obj){if(!obj)return; app.select(obj);try{var tf= obj.parentTextFrames[0];var pg= tf.parentPage;if(pg) app.layoutWindows[0].activePage= pg;}catch(e){} findField.active=true;}// --- 検索 ---functiondoSearch(){var txt= findField.text;if(!txt)return; app.findGrepPreferences= NothingEnum.nothing; app.findChangeGrepOptions.includeLockedLayersForFind=false; app.findChangeGrepOptions.includeHiddenLayers=false; app.findChangeGrepOptions.includeMasterPages=false; app.findChangeGrepOptions.includeFootnotes=false; app.findGrepPreferences.findWhat= txt; hits= doc.findGrep(); currentIndex=-1;if(hits.length>0){goNext();}else{alert("見つかりませんでした");}}// --- 次へ ---functiongoNext(){if(hits.length===0){alert("検索結果がありません");return;}if(currentIndex+1>= hits.length){alert("次は見つかりません"); currentIndex= hits.length-1;return;} currentIndex++;selectAndShow(hits[currentIndex]);}// --- 前へ ---functiongoPrev(){if(hits.length===0){alert("検索結果がありません");return;}if(currentIndex-1<0){alert("前は見つかりません"); currentIndex=0;return;} currentIndex--;selectAndShow(hits[currentIndex]);}// --- ボタンイベント --- findBtn.onClick= doSearch; nextBtn.onClick= goNext; prevBtn.onClick= goPrev;// キーボードショートカット w.addEventListener("keydown",function(k){try{var isMac= $.os.indexOf("Mac")>=0;var cmdKey= isMac? k.metaKey: k.ctrlKey;if(k.keyName==="Enter"){// Cmd (Ctrl)+Shift+Enter → 前へif(cmdKey&& k.shiftKey){goPrev(); k.preventDefault();}// Cmd (Ctrl)+Enter → 次へ(適用なし) elseif(cmdKey){goNext(); k.preventDefault();}// Enter → 適用 & 次へ else{doSearch(); k.preventDefault();}}}catch(e){}}); w.frameLocation=[10,10]; w.show();})();
これでEnterで検索、Ctrl+Enterで次へ、Ctrl+Shift+Enterで前へ移動してくれるようになりました。
(ミニけんがアクティブになっていないとCtrl+Enterでクイックアクセスが開いてしまうw)
とりあえずやりたいことはできたので、自分の中ではここで一区切りですが、ミニけんで次々とワードを検索していくと、ある時点で全く反応しなくなることがあるので、まだまだ配布できるものではないと思いました。その場合はスクリプトを一旦終了して(パレットを閉じる)再度実行すると動いてくれます。
というか、やっぱり標準機能を使った方がいいかも知れません…orz
2020年10月からInDesignのScriptの勉強を始めました。素人がコツコツと書いていきます。
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。