利用者:Masme

提供: MeryWiki
移動先: 案内検索

マクロ「テキスト整形」の仕様変更について (2015/02/14)

モード R/RS 実行後、処理した範囲を選択し直すように

旧仕様では、コマンド実行後は範囲選択が 解 除 されました。↵
新仕様では、コマンド実行前に選択範囲を 記 憶 し、実行後に 復 元 します。↵
処理の結果、字数が 増 減 した場合は、選択範囲が 調 整 
されます。↵

↓ コマンド「空白文字を除去」実行

旧仕様では、コマンド実行後は範囲選択が解除されました。↵
新仕様では、コマンド実行前に選択範囲を記憶し、実行後に復元します。↵
処理の結果、字数が増減した場合は、選択範囲が調整
されます。↵

この変更により、コマンドの効果範囲が目視できるようになり、また、選択し直す手間なく別の処理に移ることができるようになります。

  • モード R では、選択範囲の始点終点の位置関係が維持されます。
  • モード RS では、選択範囲を行頭行末まで拡張した状態が記憶されます。始点は上端行頭、終点は下端行末となります。
  • コマンド実行中にカーソル位置を移動させる処理がある場合には対応できません。

モード RM の廃止

モード RM (一行ごとに処理) は、マクロ「テキスト変換」の関数タイプ replaceL に相当し、モード RS で実現可能な処理をより簡素に記述するために設けられた機能です。
しかし、以下のような難点が見受けられることから、廃止を考えるに至りました。

  • モード RS より簡素に記述できるとは必ずしも限らない。
  • モード RS で実現可能=代替可能であり、RM ならではの利点が無い。
  • モード R/RS に比べ処理が異質で、コマンドを作る際はそれを考慮しなければならない。
    ※異質=R/RS が「選択範囲の文字列」を対象に処理を行うのに対し、RM は「選択範囲の各行の文字列」を対象に処理を行う。
//※モード RM では「クロージャ」という仕組みを使用する必要があり難解
f.push(["各行行頭に文字列付加...","RM",(function(a){
  var p=null; return function(a){ if(!p){ if(!(p=Prompt("各行行頭に付加する文字列:",""))){Quit()} } return p+a } })()]);
//※モード RS で replace(正規表現) を使用するほうが簡素に記述できる
f.push(["各行行頭に文字列付加...","RS",function(a){
  var p=Prompt("各行行頭に付加する文字列:",""); if(!p)Quit(); return a.replace(/^/gm,p) }]);
//※モード RM でも、
f.push(["空白行を削除","RM",function(a){
  return a.match(/^[  \t]*$/)? null:a }]);
//※モード RS でも、必要な知識や字数がほぼ変わらない時がある
f.push(["空白行を削除","RS",function(a){
  return a.replace(/^[  \t]*$\n?/gm,"") }]);
//※モード RM なら正規表現に頼らず簡素に記述できるコマンドもあるが、
f.push(["インデント(半角空白2個)","RM",function(a){
  return "  "+a }]);
f.push(["インデント(半角空白2個)","RS",function(a){
  return a.replace(/^/gm,"  ") }]);
//※正規表現を利用したコマンドも数多くあり、利点になりづらい
f.push(["行頭 \/\/ を付加/削除","RM",function(a){
  return a.match(/^\/\/.*$/)? a.slice(2): "\/\/"+a }]);
f.push(["行頭 \/\/ を付加/削除","RS",function(a){
  return a.replace(/^(\/\/)?/gm,function(s){return s? "": "\/\/"}) }]);

モード CR の廃止、String.replaceBatch メソッドの追加

モード CR (連続置換) は、replace を連鎖させる記法(メソッドチェーン)をより簡素に記述するために設けられた機能です。

f.push(["コマンド名","R",function(a){
  return a.replace(/ABC/g,"DEF").replace(/\(1\)/g,"①").replace(/GHI/gi,"JKL") }]);
//↓簡素化
f.push(["コマンド名","CR",function(a){
  return [ ["ABC","DEF"],["(1)","①"],[/GHI/gi,"JKL"] ]}]);

しかし、モードの一種としたがゆえに、他のモードでは利用できない事、replace のような使い方ができない事が難点としてありました。
replaceBatch メソッドは、この難点を解消するために設けられる機能です。

//※モード R で利用する(基本形)
f.push(["コマンド名","R",function(a){
  return a.replaceBatch([ ["ABC","DEF"],["(1)","①"],[/GHI/gi,"JKL"] ]) }]);
//※モード RS で利用する(選択範囲を拡張)
f.push(["コマンド名","RS",function(a){
  return a.replaceBatch([ ["ABC","DEF"],["(1)","①"],[/GHI/gi,"JKL"] ]) }]);
//※モード F で利用する(▲非推奨)
f.push(["コマンド名","F",function(a){
  a.Text = a.Text.replaceBatch([ ["ABC","DEF"],["(1)","①"],[/GHI/gi,"JKL"] ]) }]);
//※replace のようにメソッドチェーンが可能
f.push(["コマンド名","R",function(a){
  return a.replace(省略).replaceBatch([ 省略 ]).replace(省略) }]);

モード CR → R (replaceBatch) への移行方法

基本的にモード CR を継承した機能であるため、手直しすることで移行が可能です。

f.push(["コマンド名","CR",function(a){
  return [ [検索1,置換1],[検索2,置換2],[検索3,置換3]… ]}]);

f.push(["コマンド名","R",function(a){
  return a.replaceBatch([ [検索1,置換1],[検索2,置換2],[検索3,置換3]… ]) }]);

変更点まとめ

機能 旧仕様 新仕様 備考
モード F 利用可 利用可 変更なし
モード R 利用可 利用可 選択範囲を維持・調整するように
モード RS 利用可 利用可 選択範囲を維持・調整するように
モード RM 利用可 廃止 モード RS に作り替え
モード CR 利用可 廃止 replaceBatch メソッドに移行
replaceBatch エラー 利用可 ※旧仕様ではコマンド実行時にエラーが発生する