◀一般トップへ
  • 2072 外部コマンドを使った文字列加工
    • 2184 RE: 外部コマンドを使った文字列加工
      • 2186 Re2: 外部コマンドを使った文字列加工
      • 2187 なんちゅぅエディタだ...
    • 2248 RE: お薦め clip
  • [2072] 外部コマンドを使った文字列加工 げんた 2002年07月01日 01:32

    外部コマンドを使った文字列変換機能のキーへの割り当てを試みてみました.

    ▼原理
    クリップボードのデータを外部コマンドで加工して貼り付ける.

    ▼Trial 1
    clip.exe http://members.tripod.co.jp/hishoh/arc/clip.html というクリップボードと標準入出力を組み合わせるツールを利用.

    以下のようなマクロを作る.
    S_Copy();
    S_ExecCommand( 'cmd.exe /c "clip p|perl test.pl|clip"', 0);
    S_Paste();

    clipはclip.exeに予めパスを通すか,あるいはフルパス表記にします.
    test.plは適当に作ったperlスクリプト.
    $i=1;
    while(<>){
    printf( "%05d : %s", $i++, $_ );
    }
    行番号を振るだけの物です.

    結果は失敗.理由は2行目の実行結果を待たずにPasteが実行されてしまうので,加工結果が反映されないため.

    実行終了を待つためにPPAを使うことにした.
    ▼Trial 2

    以下のマクロを作る.
    S_Copy; // コピー
    Exec('cmd.exe', '/c "clip p|perl test.pl|clip"', True);
    S_Paste;

    保存時に拡張子をppaにするのを忘れずに.

    こちらは成功.キーに割り当てたら1キー変換ができるようになりました.

    しかし,難あり.
    ・コマンドプロンプトのウィンドウが開いてしまう.
    ・実行に数秒~数十秒かかる
    時間がかかるからウィンドウが出た方が実行中とわかっていいかも(笑)

    以上,やったままレポートでした.
    • [2184] RE: 外部コマンドを使った文字列加工 すい 2002年08月09日 20:21

      >以下のようなマクロを作る.
      >S_Copy();
      >S_ExecCommand( 'cmd.exe /c "clip p|perl test.pl|clip"', 0);
      >S_Paste();

      これ、もっと根本的な点でダメっぽいです。(*^~^*)

      S_Copy ですが、共通設定→編集→「コピーしたら選択解除」の設定状況によって
      動作が異なってしまいます。チェックが ON になっていると S_Copy 実行時、
      範囲選択が解除されてしまうため、その後、S_Paste で変更後の文字列が *追加*
      されてしまう、と。置換されるんじゃなく。

      まぁ、Copy → Cut にすれば、見た目解決しますけど、でもマクロの汎用性(?)
      とかの点から考えると、個人の設定状況によってここまで動作が変わってしまう
      というのはマズイかと。

      改良案1
       マクロでの S_Copy 自身は常に範囲選択解除しないようにする。
       キーボードマクロ記録時に

       ・コピーしたら選択解除 チェック OFF 時
        S_Copy(0); // コピー
        のみ出力する。

       ・コピーしたら選択解除 チェック ON 時
        S_Copy(0); // コピー
        S_CancelMode(0); // 各種モードの取り消し
        の2行を出力する。

      これだと CEditView_Command.cpp 内 void CEditView::Command_COPY() の末尾
      if( m_pShareData->m_Common.m_bCopyAndDisablSelection ){ /* コピーしたら選択解除 */
      /* テキストが選択されているか */
      if( IsTextSelected() ){
      /* 現在の選択範囲を非選択状態に戻す */
      DisableSelectArea( TRUE );
      }
      }
      を
      if( m_bExecutingKeyMacro == FALSE ){ /* キーボードマクロの実行中ではない */
      if( m_pShareData->m_Common.m_bCopyAndDisablSelection ){ /* コピーしたら選択解除 */
      /* テキストが選択されているか */
      if( IsTextSelected() ){
      /* 現在の選択範囲を非選択状態に戻す */
      HandleCommand( F_CANCEL_MODE, TRUE, 0, 0, 0, 0 ); // 各種モードの取り消し & キーボードマクロ登録
      }
      }
      }
      とでもすれば良いのかな?(未確認)

      改良案2
       S_Copy の機能を拡張する。
       ・S_Copy(0) だと範囲選択解除しない
       ・S_Copy(1) だと範囲選択解除する
       にするとか。
      • [2186] Re2: 外部コマンドを使った文字列加工 げんた 2002年08月10日 01:31

        >S_Copy ですが、共通設定→編集→「コピーしたら選択解除」の設定状況によって
        >動作が異なってしまいます。
        ぐぎゃぁ.知らんかった.
        選択状況やオプションによって振る舞いが変わるコマンドはやりにくい.
      • [2187] なんちゅぅエディタだ... げんた 2002年08月10日 02:01

        > S_Copy の機能を拡張する。
        Copyの引数によって選択解除を抑制できるようにしようと思ったのですが,じつは「折り返しに改行を付けてコピー」なんていう設定があるじゃないですか.これがONになっているとかなり悲惨なことになりそう.

        折り返しに改行を付けてコピーというコマンドがある(追加された)のだから,この設定は廃止してもいいように思います.
    • [2248] RE: お薦め clip すい 2002年08月29日 20:59

      >clip.exe http://members.tripod.co.jp/hishoh/arc/clip.html というクリップボードと標準入出力を組み合わせるツールを利用.
      >
      >以下のようなマクロを作る.
      >S_Copy();
      >S_ExecCommand( 'cmd.exe /c "clip p|perl test.pl|clip"', 0);
      >S_Paste();

      ようやく見つけました。

      いえ、実は私も以前からこれと同じような clip.exe を使っていて、
      そちらの方が より高機能で、より使い易いんですが、入手元を失念してしまっていて
      「これ、どっから手に入れたんだ~~」と、ずぅっと探し回っていたんですよ、実は。

      というわけで私が使っている clip.exe は こちら。
      → http://membres.lycos.fr/irori/

      特徴は、今、自分が入力側なのか出力側なのかを clip.exe 自身が自動的に判別して
      それに適した動作をしてくれること。なので、

      clip | sort | clip

      な感じで clip にオプションパラメータ不要、微妙に使い心地良し。
      もちろんオプションパラメータで動作を明示することも可能ですが、通常は使いません。

      で、ついでに、もうほんのちょっと高機能。クリップボードの現在のデータの末尾に
      標準入力からのデータを追記してくれる a オプション(append)あり。

      それでありながら exe のファイルサイズは、こちらの方が小さかったりするのです、微妙に(笑)。
      http://members.tripod.co.jp/hishoh/arc/clip.html の方とは違ってソースは付いて来ませんが。

      お薦めです。