全角/半角 トグル変換

提供:MeryWiki
ナビゲーションに移動 検索に移動

選択範囲の文字列の 全角 ⇔ 半角 トグル変換
※ 全角文字と半角文字(英数カナ)が混在した文字列は、半角に統一します


  • 選択範囲がないときは、カーソル位置の単語を範囲選択して変換します(変換後に範囲選択を解除する)。
  • 「全角/半角変換」されなかったときは、編集履歴を巻き戻して「変更行」の強調表示や「未保存*」のフラグを残さないようにしてあります。


大文字/小文字の相互変換は >> 「大文字/小文字/頭文字 トグル変換」マクロ
全角または半角を指定しての変換は >> 「全角/半角変換」マクロ(※要 GetKeyState.exe
ひらがな/カタカナの相互変換は >> 「ひらがな/カタカナ変換」マクロ


マルチカーソル/複数選択範囲での動作[編集]

マルチカーソル/複数選択範囲 での推奨動作要件: Mery ver 3.0.1 以上

制限事項
  • 複数の選択範囲にたいして統一的に「半角化」または「全角化」を適用することはできません。
    それぞれの選択範囲ごとに「半角化/全角化」の変換方式が個別に適用されます(「全角英数カナ」の選択範囲と「半角英数カナ」の選択範囲がある場合、前者の選択範囲の文字列は「半角に変換」され、後者の選択範囲の文字列は「全角に変換」されます。 また、全角/半角の混在した選択範囲の場合は半角化します)。


  • すべての選択範囲が文字列を含んでいるか、またはすべてがゼロ幅選択範囲(キャレットのみ)でないと、正常に動作しません。
  • すべての選択範囲が文字列を含んでいれば正常に動作します (各選択範囲内の文字列を変換)。
  • すべての選択範囲がゼロ幅選択範囲(キャレットのみ)であれば正常に動作します (キャレット位置の単語を自動選択して変換)。
  • 文字列を含む選択範囲とゼロ幅選択範囲(キャレットのみ)が混在している場合は、文字列を含む選択範囲内だけを変換します (ゼロ幅選択範囲のキャレット位置の単語の自動選択/変換をしません)。


  • エディタが折り返し表示になっているとき、折り返しより後ろ(改行まで)の文字列は矩形選択範囲内の文字列とみなされません。
    また、同一論理行内で完結した矩形選択では変換しません。
    あらかじめ、変換の必用な部分だけを Ctrl+ドラッグ で複数選択範囲にするか「選択範囲を行に分ける」コマンド(右クリックメニュー用コマンド)を適用してから、このマクロを実行してください。
  • 矩形選択範囲から実行した場合も変換後に選択範囲を復帰しますが、矩形選択範囲ではなく、複数選択状態になります (文字幅が変わるため矩形選択ではズレてしまい、正常に復帰できない)。



ソースコード[編集]

ダウンロード
ファイル:全角/半角 トグル変換.zip」(アイコン入り)
  • 2019/05/20: 初版
  • 2020/07/03: Mery ver 3.0.1 以降の マルチカーソル(ゼロ幅選択範囲)と矩形選択範囲からの実行後にもキャレット位置や範囲選択の状態を復帰(矩形選択は複数選択で復帰)し、連続実行でトグル変換できるようにした
#title = "全角/半角変換"
#tooltip = "全角/半角 トグル変換"
#icon = "AA[4].ico"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",308

/**
 * ---------------------------------------------------------
 * 「全角/半角 トグル変換」マクロ
 * sukemaru, 2019/05/20 - 2020/07/03
 * ---------------------------------------------------------
 * 2020/07/03: Mery ver 3.0.1 以降の「マルチカーソル」のゼロ幅選択範囲の復帰に対応
 * 
 * 選択範囲の「全角 ⇔ 半角」トグル変換
 * 
 * 選択範囲がなければカーソル位置の単語を自動選択して変換
 * (変換後に範囲選択を解除する)
 * 
 * 変換されなかったときは「変更行」の強調表示や「未保存*」のフラグを残さない
 */

var sx = ScrollX,  sy = ScrollY;
var d = editor.ActiveDocument;
var s = d.selection;
var pos = -1;
var sv = d.Saved;
var sMode = s.Mode;

// 非選択時には単語を選択
if ( s.IsEmpty ) {
  pos = s.GetActivePos();
  /* マルチカーソル対応 */
  if ( sMode == 3 ) {
    var sCount = s.Count,  Sel = [];
    for ( var i = 0; i < sCount; i ++ ) {
      Sel.push( s.GetActivePos( i ) );
    }
    Sel.push( pos );
  }
  s.SelectWord();
}
var st = s.Text;

if ( d.ReadOnly ) {
  Status = " このドキュメントは書き換え禁止です。";
}

// 全角/半角変換
else if ( st ) {
  if ( sMode > 1 ) { BeginUndoGroup(); }
  s.ChangeWidth( meWidthHalfWidth );	// 半角に変換
  if ( s.Text === st ) {
    d.Undo();
    s.ChangeWidth( meWidthFullWidth );	// 全角に変換
    if ( s.Text === st ) {
      d.Undo();
      d.Saved = sv;
    }
  }
  if ( sMode > 1 ) { EndUndoGroup(); }
}

if ( pos > -1 ) {
  s.SetActivePos( pos );
  /* マルチカーソル対応 */
  if ( sMode === 3 ) {
    for ( var i = 0, len = sCount + 1; i < len; i ++ ) {
      s.AddPos( Sel[i] );
    }
  }
}
ScrollX = sx;  ScrollY = sy;

メモ[編集]

  • アルファベットや数字、記号、カタカナが混在していても使いやすいよう、「選択範囲なしのときは、カーソル位置の単語を自動選択する」仕様にしてあります。
    「行全体を自動選択する」仕様に変更したい場合は、ソースコード内の s.SelectWord(); の行を以下のように書き換えてください。
  s.SelectLine();


  • 変換実行前の文字列の構成から変換可能であるかを判別する前処理を仕込むのは複雑そうなので、「半角に変換」を実行 → 文字列に変更がなければ「全角に変換」を実行 → 文字列に変更がなければ UNDO する、という仕様にしてあります。
スポンサーリンク