74810


お世話になっております。  
<https://jp.emeditor.com/forums/topic/%E5%A4%A7%E9%87%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%B8%80%E6%9C%AC%E5%8C%96/>

この質問よりさらに単純にした開き方で実質的な結合のような開き方が出来ますでしょうか？という質問です。

事例  
北海道旅行01.csv  
北海道旅行02.csv  
北海道旅行03.csv  
北海道旅行04.csv

EmEditorでファイル結合の処理が出来るのは上の質問でわかったのですが、単純にこのような複数のファイルをEmEditorに一括ドラッグ＆ドロップするだけで、01～04までをまとめた文章として開くことはできませんでしょうか？  
現在だとそのままドラッグ＆ドロップすると4つの画面で個々に開きますが、

01～04のファイルの文字をひとつの画面で順番に繋げて開くということです。  
たとえばshiftキーを押しながらドラッグ＆ドロップすると結合した文章で開くとかできたら良いです。

実質的に開くだけでファイル結合が出来たように開けるという機能です。  
保存はしてないで結合という言い方とは違うかも知れませんが、文章がくっついた状態でひとつのつながった文章として開けるという機能です。  
よろしくお願いいたします。


CC BY-SA 4.0
2021-03-19T13:10:23.720
74767
2021-03-28T11:01:09.950
2021-03-28T11:01:09.950
3060
43999
question
emeditor
EmEditorで結合処理無しで実質的に結合したように開くことはできますでしょうか？


マクロで実現するとすればこんな感じでしょうか、自動と手動前・後の 3パターンです。

### lljump.jsee

[code]

    #title = "前後の連番文書を開く"
    
    /*
    
        カーソル位置が文頭か文末だったとき、
        アクティブな文書のファイル名最後の数字を増減させたファイルを開く。
    
        カーソルが文頭だったとき 数字-1 の文末
        カーソルが文末だったとき 数字+1 の文頭
        文頭=文末の場合は文頭処理優先
    
        想定したパターンは
            '1',,,'9','10',,,
            '001',,,'009','010',,,
        数値の文字列長さが不揃いな物は想定していない。ex., '00001', '2', '03'
    
    */
        var topPrev = -1;
        var yPos = document.selection.GetActivePointY( eePosLogical );
        if( yPos != 1 ){
            if( yPos != document.GetLines() )   Quit();
            topPrev = 1;
        }
    
        var strName = document.Name;
        var baseName = strName.match( /^(.*)\.(.*?)$/ );
        var numMatch = baseName[1].match( /^(.*?)(\d+)([^\d]*?)$/ );    // ファイル名末尾の数字
        if( numMatch.length != 4 )  Quit();
        var num = 1 * numMatch[2];      // alert( 0 + "1" );    // Jscript だと 0 + "1" -> '01'
        if( num == 0 && topPrev == -1 ) Quit();     // 0 より前はブロック
        num = String( num + topPrev );
        while( num.length < numMatch[2].length ){
            num = "0" + num;
        }
    
        var fileName = numMatch[1] + num + numMatch[3] + "." + baseName[2];
        var filePath = document.Path + "\\" + fileName;
        var FSO = new ActiveXObject( "Scripting.FileSystemObject" );
        if( FSO.FileExists( filePath ) ){
            editor.OpenFile( filePath );
            editor.ExecuteCommandByID( (topPrev == -1)? 4169 : 4168 );  // EEID_BOTTOM (4169), EEID_TOP (4168)
            Quit();
        }
    
    // 先頭の "0" を一つだけ減らして再確認
        if( num.substr(0,1) != "0" )    Quit();
        num = num.substr(1);
        fileName = numMatch[1] + num + numMatch[3]  + "." + baseName[2];
        filePath = document.Path + "\\" + fileName;
        if( FSO.FileExists( filePath ) ){
            editor.OpenFile( filePath );
            editor.ExecuteCommandByID( (topPrev == -1)? 4169 : 4168 );
        }
    
    
[/code]

### lljump_pre.jsee

[code]

    #title = "連番-1 の文書を開く"
    
    /*
    
        アクティブな文書のファイル名最後の数字を1減させたファイル文末を開く。
    
        想定したパターンは
            '1',,,'9','10',,,
            '001',,,'009','010',,,
        数値の文字列長さが不揃いな物は想定していない。ex., '00001', '2', '03'
    
    */
    
        var strName = document.Name;
        var baseName = strName.match( /^(.*)\.(.*?)$/ );
        var numMatch = baseName[1].match( /^(.*?)(\d+)([^\d]*?)$/ );    // ファイル名末尾の数字
        if( numMatch.length != 4 )  Quit();
        var num = 1 * numMatch[2];
        if( num == 0 )  Quit();     // 0 より前はブロック
        num = String( num - 1 );
        while( num.length < numMatch[2].length ){
            num = "0" + num;
        }
    
        var fileName = numMatch[1] + num + numMatch[3] + "." + baseName[2];
        var filePath = document.Path + "\\" + fileName;
        var FSO = new ActiveXObject( "Scripting.FileSystemObject" );
        if( FSO.FileExists( filePath ) ){
            editor.OpenFile( filePath );
            document.selection.EndOfDocument();
            Quit();
        }
    
    // 先頭の "0" を一つだけ減らして再確認
        if( num.substr(0,1) != "0" )    Quit();
        num = num.substr(1);
        fileName = numMatch[1] + num + numMatch[3] + "." + baseName[2];
        filePath = document.Path + "\\" + fileName;
        if( FSO.FileExists( filePath ) ){
            editor.OpenFile( filePath );
            document.selection.EndOfDocument();
        }
    
[/code]

### lljump_succ.jsee

[code]

    #title = "連番+1 の文書を開く"
    
    /*
    
        アクティブな文書のファイル名最後の数字を 1増させたファイル文頭を開く。
    
        想定したパターンは
            '1',,,'9','10',,,
            '001',,,'009','010',,,
        数値の文字列長さが不揃いな物は想定していない。ex., '00001', '2', '03'
    
    */
    
        var strName = document.Name;
        var baseName = strName.match( /^(.*)\.(.*?)$/ );
        var numMatch = baseName[1].match( /^(.*?)(\d+)([^\d]*?)$/ );    // ファイル名末尾の数字
        if( numMatch.length != 4 )  Quit();
        var num = 1 * numMatch[2];
        num = String( num + 1 );
        while( num.length < numMatch[2].length ){
            num = "0" + num;
        }
    
        var fileName = numMatch[1] + num + numMatch[3] + "." + baseName[2];
        var filePath = document.Path + "\\" + fileName;
        var FSO = new ActiveXObject( "Scripting.FileSystemObject" );
        if( FSO.FileExists( filePath ) ){
            editor.OpenFile( filePath );
            document.selection.StartOfDocument();
            Quit();
        }
    
[/code]

lljump_pre.jsee, lljump_succ.jsee を実行するか 、  
カーソルを文末文頭へ移動させて、lljump.jsee を実行すれば期待する動作に近い応答をすると思います。  
ファイル名の末尾から見て最初の数字を対象にするので '旅行1日目.txt' でも可能です。

標準では割り当てられていない Ctrl+Shift+(PageUp,PageDown) に lljump_pre.jsee,
lljump_succ.jsee を割り当てると便利になるかと思います。

  * 現状未対応な物  
ゼロパディング以外のパターン `" 1",," 10", "__1",,"_10"`  
全角の数字、漢字の数字、1st,2nd など


CC BY-SA 4.0
2021-03-20T11:30:39.230
74784
2021-03-20T11:30:39.230
40304
74767
answer


ファイルを結合して開くマクロ

# connect.jsee

[code]

    #title = "連番結合"
    
    function regPat( re, pat ){ // EmEditor の Regex のパラメータ設定で Javascript の RegExp を使う
        if( pat instanceof RegExp ){
            var m = String( pat ).match( /^\/(.*)\/([igo]*)$/ );
            re.Pattern = m[1];
            re.Global = /g/.test( m[2] );
            re.OnlyWord = /o/.test( m[2] );
            re.IgnoreCase = /i/.test( m[2] );
            // re.SeparateCrLf = /s/.test( m[2] );
        } else { // ? String
            re.Pattern = pat;
        }
        return re;
    }
    
        var title = regPat( editor.regex, /.*\\(.*?)$/ ).Find( document.Path ); // ShiftJIS 対策に、Emeditorの regexを使う。
        title = (title == null)? "" : title.Item(1).Value;
    
        var strName = document.Name;
        var baseName = strName.match( /^(.*)\.(.*?)$/ );
        if( baseName == null ){ baseName = [ strName, "" ]; }
        var numMatch = baseName[1].match( /^(.*?)(\d+)([^\d]*?)$/ );    // ファイル名末尾の数字
        if( numMatch == null || numMatch.length != 4 )  Quit();
    
        var num = 1 * numMatch[2];
        var connectList = [ "\"" + strName + "\"" ];
        var FSO = new ActiveXObject( "Scripting.FileSystemObject" );
        var lastNum = "";
        while( true ){
            num += 1;
            var str = String( num );
            for( i = numMatch[2].length - str.length; i > 0; -- i ){ str = "0" + str; }
    
            var filePath = numMatch[1] + str + numMatch[3] + "." + baseName[2];
            if( ! FSO.FileExists( document.Path + "\\" + filePath ) )   break;
            lastNum = str;
            connectList.push( "\"" + filePath + "\"" );
        }
        if( connectList.length <= 1 ){
            alert( "連番の結合対象がありませんでした。 '" + filePath + "'" );
            Quit();
        }
    //  connectPath = title + numMatch[1] + numMatch[2] + "-" + lastNum + numMatch[3] + "結合." + baseName[2];
        connectPath = title + baseName[1] + "結合." + baseName[2];
    // 上の行をコメントアウトしてその上の行を有効にすれば、結合ファイル名のフォーマットは [開始番号]-[終了番号] になる。
    //  comStr = "copy /b /y " + connectList.join("+") + " \"" + connectPath + "\" & emeditor \"" + connectPath + "\"";
    //  (new ActiveXObject( "WScript.Shell" )).Run( "cmd /C " + comStr );
    
        var tmpBat = document.Path + "\\__temp_" + ProcessID + "_.bat";
    
        var fs = new ActiveXObject("ADODB.Stream");
        fs.type = 2;
        fs.charset = "utf-8";
        fs.open();
        fs.WriteText( "@Echo off & chcp 65001\r\n\r\ncd /d \"" + document.Path + "\"\r\n\r\n" );
        fs.WriteText( "copy /b /y " + connectList[0] + " + " + connectList[1] + " \"" + connectPath + "\"\r\n" );
        for( var i = 2; i < connectList.length; ++ i ){
            fs.WriteText( "copy /b /y \"" + connectPath + "\" + " + connectList[i] + " \"" + connectPath + "\"\r\n" );
        }
        fs.WriteText( "\r\nstart \"\" /MIN emeditor \"" +  connectPath + "\"\r\n" );
        fs.WriteText( "del \"%~0\"\r\n" );
    
        fs.Position = 0;
        fs.Type = 1;    // binmode
        fs.Position = 3;    // BOM skip
        var bytes = fs.Read();
        fs.Position = 0;
        fs.SetEOS();
        fs.Write( bytes );
    
        fs.SaveToFile( tmpBat, 2 );
        fs.Close();
    
        (new ActiveXObject( "WScript.Shell" )).Run( tmpBat );
    
[/code]

2021/03/26 更新

  * 長いパス名対策  
バッチファイル化とカレントパスへの相対化

  * 多数の結合ファイル対策  
copy コマンドを 1ファイル毎に分割


CC BY-SA 4.0
2021-03-22T03:27:54.577
74810
2021-03-26T11:39:37.770
2021-03-26T11:39:37.770
40304
40304
74767
answer