「
TAB/半角空白 トグル変換
」を編集中
2020年5月27日 (水) 18:39時点における
Sukemaru
(
トーク
|
投稿記録
)
による版
(ページを新規作成)
(差分) ← 古い版 |
最新版
(
差分
) |
新しい版 →
(
差分
)
ナビゲーションに移動
検索に移動
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
実行するごとに「TAB ⇔ 半角空白」の相互変換をします。 <br><br> [編集] メニュー >> [選択範囲の変換] サブメニューのコマンド「[[ヘルプ:編集#タブを空白に変換|タブを空白に変換]]」と「[[ヘルプ:編集#空白をタブに変換|空白をタブに変換]]」は # メニューの中をたどってコマンドを見つけるのが面倒 # 選択範囲がないと実行できない # 選択した範囲を無視して論理行全体が変換される # トリプルクリックや行番号のクリック(ドラッグ)で範囲選択した状態から実行すると、ひとつ下の行まで変換されてしまう などいろいろと使いづらい部分があります。 <br><br> このマクロでは、キャレット位置に TAB や連続する半角空白があるときは自動的に空白文字列を範囲選択して「TAB ⇔ 半角空白」変換します。<br> 連続実行した場合にはトグル式に相互変換しますので、ツールバーアイコンひとつでふたつの機能(+α)を利用できます。 <br> == 設定項目 == <br> ; <code>tabColumns</code> 「タブの桁数」(半角空白で何コ分の幅か)を数値で指定します。<br> [オプション] ダイアログの [基本] カテゴリの「タブの桁数」の設定値で指定してください。 : ''e.g.'' <code>tabColumns = 4</code> で「半角空白6コ」の選択範囲を変換すると「TAB1コ+半角空白2コ」になります。 * '''<code>tabColumns = 0</code>''' を指定すると「タブの桁数」を Mery から自動取得します。 : Mery ver 3 以降では <code>Document.IndentSize</code> プロパティでの取得を試行します。 取得できなかった場合や Mery ver 2.x では Mery.ini から読み込みます。 : [https://www.haijin-boys.com/software/mery/mery-2-8-7 EditorConfig] で <code>indent_size</code> をカスタマイズしている場合は、<code>indentSize = 0</code> に設定してください。 <br> ; <code>wholeLinesEnable</code> : 論理行全体の「TAB ⇔ 半角空白」変換を許可するかしないかの設定です。 : <code>wholeLinesEnable = true</code> のとき、選択範囲がなくキャレット位置に変換対象になる空白文字列がない場合や、選択範囲があっても変換対象になる空白文字列がない場合、は、論理行全体を選択範囲にして「TAB ⇔ 半角空白」の変換を試行します。 * Mery の標準コマンドの「タブを空白に変換」と「空白をタブに変換」で処理するので複数行の範囲選択状態からでも変換可能ですが、つねに論理行全体、論理行内のすべての TAB とすべての連続する半角空白が対象となります。 * 事前処理コードを入れてあるので、トリプルクリックや行番号のクリックまたはドラッグで行全体+末尾改行のある範囲選択状態から実行したときに、ひとつ下の行は変換対象になりません。 <br> == 使用上の注意 == <br> ; 優先ルール * 「TAB+半角空白」からの実行では、つねに「TAB ⇒ 半角空白」変換になります(再度実行すれば「半角空白 ⇒ TAB」変換になります)。 <br> * 選択範囲が複数行にまたがっている場合は、つねに論理行全体が変換対象になります。 * このマクロの設定項目 <code>tabColumns</code> の値と Mery の [オプション] の「タブの桁数」の設定値がことなると、行全体の「半角空白 ⇒ TAB」変換の可否判定や変換結果がうまくないかんじになる場合があります。 * マルチカーソル複数選択や矩形選択には非対応です。 回避処理は入れていませんので、意図したとおりの結果にならなかったときは Undo (Ctrl+Z) してください。 <br> ; キャレット位置または選択範囲内の「TAB ⇔ 半角空白」変換 * <code>wholeLines = false</code> のとき、選択範囲内に改行がある場合や、非空白文字(全角空白も含む)がある場合は変換しません。 * キャレット位置の空白文字列を変換するとき、行頭の TAB インデントから半角空白への変換では後ろの文字列がズレることはないようですが、行の途中の TAB を半角空白に変換した場合や、TAB の区切り位置からズレた連続する半角空白幅を TAB に変換した場合は、後ろの文字列の先頭位置がズレます。 <br> == ダウンロード == <br> ; 「[[ファイル:TAB/半角空白変換.zip]]」(アイコン入り) * 半角空白変換.js * マテリアルデザインっぽい専用アイコン * (オマケ)タブを空白に変換.js * (オマケ)空白をタブに変換.js <br> == ソースコード == <source lang="javascript"> #title = "TAB ⇔ 半角空白 トグル変換" #tooltip = "キャレット位置だけ TAB ⇔ 半角空白 の変換をする" #icon = "tabify[3].ico" /** * --------------------------------------------------------- * 「TAB/半角空白変換」マクロ * sukemaru, 2020/05/27 * --------------------------------------------------------- * キャレット位置または選択範囲内だけの TAB ⇔ 半角空白 変換可能 * * ※ 優先ルール: タブ+半角空白 からの変換のばあいは TAB ⇒ 半角空白 変換 * (再度実行すれば 半角空白 ⇒ TAB 変換) */ // ---------- ▼ 設定項目 ▼ ---------- // // ■ タブの桁数 var tabColumns = 0; // ※ Mery から自動取得するなら tabColumns = 0 にする // ■ 論理行全体(複数行可)の TAB ⇔ 半角空白 もおこなう var wholeLinesEnable = true; // true: する / false: しない // ---------- ▲ 設定項目 ▲ ---------- // var d = editor.ActiveDocument, s = d.selection; var sv = d.Saved; var isEmpty = s.IsEmpty; var pos = ( isEmpty ) ? s.GetActivePos() : -1; var ay = s.GetActivePointY( mePosLogical ); if ( d.ReadOnly ) { Status = " ドキュメントは書き換え禁止です。"; } else if ( ! tabColumns || ! ( tabColumns > 0 ) ) { // Mery ver 3 以降? if ( "IndentSize" in window.Document ) { tabColumns = d.IndentSize; } // Mery.ini から「タブの桁数」を取得する if ( ! tabColumns || ! ( tabColumns > 0 ) ) { tabColumns = GetIniOptionNum( "TabColumns" ) || 8; } } if ( isEmpty ) { s.SelectWord(); if ( s.GetActivePointY( mePosLogical ) != ay ) { s.SetActivePos( pos ); } } var act = s.GetActivePos(), anc = s.GetAnchorPos(); var bp = Math.min( act, anc ); var str = tmp = s.Text; if ( str && tabColumns > 0 && /^[\t ]+$/.test( str ) ) { // TAB ⇒ 半角空白(キャレット位置または選択範囲内のみ) if ( str.indexOf( "\t" ) > -1 ) { // Act1: 選択範囲を新規の空白行にして範囲選択 s.Text = "\n" + str + "\n"; s.CharLeft(); s.SetAnchorPos( bp + 1 ); // Act2: 「タブを半角空白に変換」した文字列を取得 s.Untabify(); tmp = s.Text; // Act1, Act2 を巻き戻して TAB ⇒ 半角空白 変換終了 d.Undo(); d.Undo(); s.Text = tmp; s.SetAnchorPos( s.GetActivePos() - tmp.length ); } // 半角空白 ⇒ TAB(キャレット位置または選択範囲内のみ) else if ( RegExp( "[ ]{" + tabColumns + "}", "" ).test( str ) ) { // Act1: 選択範囲を新規の空白行にして範囲選択 s.Text = "\n" + str + "\n"; s.CharLeft(); s.SetAnchorPos( bp + 1 ); // Act2: 「半角空白をタブに変換」した文字列を取得 s.Tabify(); tmp = s.Text; // Act1, Act2 を巻き戻して 半角空白 ⇒ TAB 変換終了 d.Undo(); d.Undo(); s.Text = tmp; s.SetAnchorPos( s.GetActivePos() - tmp.length ); } } // wholeLinesEnable = true のとき if ( str === s.Text && wholeLinesEnable ) { var ty = s.GetTopPointY( mePosLogical ); var bx = s.GetBottomPointX( mePosLogical ); var by = s.GetBottomPointY( mePosLogical ); // 選択範囲を拡張 if ( by != ty && bx === 1 ) { by -= 1; } s.SetActivePoint( mePosLogical, 1, by ); s.EndOfLine( false, mePosLogical ); s.SetAnchorPoint( mePosLogical, 1, ty ); str = s.Text; // TAB ⇒ 半角空白(行全体) if ( str.indexOf( "\t" ) > -1 ) { s.Untabify(); } // 半角空白 ⇒ TAB(行全体) else if ( RegExp( "[ ]{2}", "" ).test( str ) ) { s.Tabify(); if ( str === s.Text ) { d.Undo(); d.Saved = sv; } } // else { // s.Tabify(); // if ( str === s.Text ) { d.Undo(); d.Saved = sv; } // } if ( str === s.Text ) { if ( pos >= 0 ) { s.SetActivePos( pos ); } else { s.SetActivePos( act ); s.SetAnchorPos( anc ); } } else { s.CharRight( true ); } } /** * 関数 GetIniOptionNum( key ) * 引数で指定された設定項目の「値」を返す(※数値のみ) */ function GetIniOptionNum( key ) { var Fso = new ActiveXObject( "Scripting.FileSystemObject" ); // Mery.ini を探す var meryPath = editor.FullName; var mery = Fso.GetBaseName( meryPath ); var iniPath = meryPath.replace( /\.exe$/i, ".ini" ); if ( ! Fso.FileExists( iniPath ) ) { iniPath = new ActiveXObject( "WScript.Shell" ) .ExpandEnvironmentStrings( "%APPDATA%" ) + "\\Mery\\" + mery + ".ini"; } // Mery.ini を読み込んで項目 key の値を取得する var iniFile = Fso.OpenTextFile( iniPath, 1 ); var iniText = iniFile.ReadAll(); iniFile.Close(); Fso = null; var value = RegExp( "^" + key + "=(\\d*)$", "m" ).exec( iniText )[1]; return Number( value ); } </source> <br> == メモ == 前半部分は、行頭インデントの「ハード ⇔ ソフト」変換を目的として「Yes/No マクロ」への自家用追加コードとしてつくった簡易的な処理なので、行の途中にある空白文字列の「TAB ⇔ 半角空白」に使うには適していないとおもいます。<br> <code>Alert(Document.IndentSize);</code>で -1 が返ってくるファイルもあって、なんかモヤっとしてます...。
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク