キー入力の任意回数繰り返しの簡単な方法はありますか?

  1. Windows11(x64) Version 24H2 / Mery(x64) Version 3.7.13

    やりたいことは以下のようなEmacsのuniversal-argument (Ctrl-u) なんですが、現在のMeryで実行可能でしょうか。

    https://wiki.archlinux.jp/index.php/Emacs#.E5.89.8D.E7.BD.AE.E5.BC.95.E6.95.B0

    以下雑談

    Meryにも、一部のIDEのようなブラウザのアドレスバーのような形をした、一行ターミナル・ダム端末が欲しいです。
    今は、bashターミナルを開きシェルのリダイレクトにより、/dev/clipboardからgrepやsedなどの実行結果を/dev/clipboardに送り、Meryに貼り付けしているためにちょっと回りくどいです。

    出来れば、Emacsのように編集画面で数行のスクリプトやコンソールコマンドを書き、範囲選択してスクリプトエンジンやコマンドシェルにショートカットで送り、実行結果を編集画面で受け取れたらより手軽で便利だと思いました。

     |  enaka  |  返信
  2. > やりたいことは以下のようなEmacsのuniversal-argument (Ctrl-u) なんですが、現在のMeryで実行可能でしょうか。

    universal-argument とまではいきませんが、「繰り返し実行したい」ということであれば、[マクロ] メニューにある [オプションを指定して実行] が役に立つかもしれません。

    使い方は簡単で、ダイアログの中で [繰り返し回数を指定する] にチェックを入れて、実行したい回数を入力 → [実行] をクリックするだけです。

    こんなことができます:

    • マクロ ファイル: あらかじめ作っておいたマクロを実行
    • 記録したマクロ: [記録] で録った一時マクロを再生
    • クリップボード: クリップボードの内容をマクロとして実行
    • 1 行マクロ: その場で書いたマクロをサッと実行

    たとえば、[マクロ] の [記録/停止] を押して%を入力 → もう一度 [記録/停止] を押して記録を停止します。

    そのあとで [オプションを指定して実行] を開いて、回数に4を指定して実行すれば、記録した%の入力が4回繰り返されます。

    ちなみにこのダイアログはモーダルではないので、開いたままでもエディターで編集などが行えます。

    > 出来れば、Emacsのように編集画面で数行のスクリプトやコンソールコマンドを書き、範囲選択してスクリプトエンジンやコマンドシェルにショートカットで送り、実行結果を編集画面で受け取れたらより手軽で便利だと思いました。

    スクリプトエンジンでの実行であれば、「1 行マクロ」を使って、それに近いことができるかもしれません。

    以下のようにjs:を先頭に付けて書くと…

    js: for (var i = 0; i < 4; i++) document.selection.Text = "%";
    

    その場で簡単なマクロをすぐに実行できます。

    なお、Ver 3.7.13 では、繰り返し回数を指定して実行した際にマクロにエラーがある場合や、[検索に失敗したら中止する] の場合に繰り返しが停止しないという問題がありますが、これは次のバージョンで修正予定となっています。

    > Meryにも、一部のIDEのようなブラウザのアドレスバーのような形をした、一行ターミナル・ダム端末が欲しいです。

    「一行ターミナル」というのは、具体的なイメージがわかると嬉しいのですが、もし「コマンドを実行して、その結果を表示したい」みたいなことであれば、[外部ツール] を使えば、たとえばgrepの結果をエディターに表示するといったこともできます。

    bash のことはあまり詳しくないのですが、Windows ならこんな設定ができます。

    1. [ツール] → [外部ツール] → [外部ツールの設定] を開く
    2. [追加] を選択し、以下のように設定します
    • タイトル: Grep
    • コマンド: %WinDir%\System32\findstr
    • 引数: /n /s $(SelText)
    • アウトプット バーを使用する: オン

    次のようなテキストを選択して実行すると、結果がアウトプット バーに表示されます。。

    "検索文字列" "C:\Temp\*.txt"
    

    [アウトプット バーを使用する] の設定を変えると、結果をエディターに挿入することもできます。

    また、bash で同様のことができるかは分かりませんが、コマンド プロンプトや PowerShell の場合は、アウトプット バーを標準入力・標準出力として使用することもできます。

    もし具体的な用途やイメージがありましたら、それに合わせた設定方法をご案内できるかもしれません。

     |  Kuro  |  返信
  3. 回答ありがとうございます。

    > universal-argument とまではいきませんが、「繰り返し実行したい」ということであれば、[マクロ] メニューにある [オプションを指定して実行] が役に立つかもしれません。

    すばやく一度に、n行スクロールしたいとか、n回貼り付けしたいとか、n回文字列置換したいとか、そんな簡単な用途なのでダイアログが開くのは少し大げさで面倒です(贅沢の極み)。
    アウトプットバーのようにボトムに開いて実行後に閉じると嬉しいです。

    > > 出来れば、Emacsのように編集画面で数行のスクリプトやコンソールコマンドを書き、範囲選択してスクリプトエンジンやコマンドシェルにショートカットで送り、実行結果を編集画面で受け取れたらより手軽で便利だと思いました。

    :中略

    > bash のことはあまり詳しくないのですが、Windows ならこんな設定ができます。
    >
    > 1. [ツール] → [外部ツール] → [外部ツールの設定] を開く
    > 2. [追加] を選択し、以下のように設定します

    不勉強と調査不足で、こんな機能があったとは知りませんでした。早速、

     タイトル: Bash
     コマンド: C:\msys64\usr\bin\bash.exe
     引数: -l
     作業フォルダー: ${Dir}
     アウトプットバーを使用する: オン
     終了時に閉じる: オン
     入力: 選択テキスト
     出力: 選択範囲の後に挿入
     エンコード: UTF-8

    を登録してCtrl-Enterに割り当てたところ、ほぼ期待通りの動作が出来てしまいました。cmd.exeやpwsh.exeでも可能と思います。

     cd tmp ; cat ../atom4.v | grep -i JSR > grep.txt

    など、カレントディレクトリの変更やマルチステートメントやパイプやリダイレクトも正常に機能しました。正直驚愕です。
    出力先に、クリップボードも選択出来れば完璧でした。リダイレクトで > /dev/clipboard すればよいため、必須ではありませんがタイプする文字は少ないに限ります。

    前段階でカーソルがある段落や行全体を、ショートカットで選択出来れば尚好しですが、これはマクロで実現できますね。
    余談ですが、Mery組み込みの選択系コマンドが、カーソル位置からXXXまで選択、しかないのはなぜなんでしょうか。
    マクロで対応可能でタイムラグもほぼないとはいえ、段落選択や行選択すらないのは少し不思議です。

    > > Meryにも、一部のIDEのようなブラウザのアドレスバーのような形をした、一行ターミナル・ダム端末が欲しいです。
    >
    > 「一行ターミナル」というのは、具体的なイメージがわかると嬉しいのですが、もし「コマンドを実行して、その結果を表示したい」みたいなことであれば、[外部ツール] を使えば、たとえば`grep`の結果をエディターに表示するといったこともできます。

    :中略

    > もし具体的な用途やイメージがありましたら、それに合わせた設定方法をご案内できるかもしれません。

    ブラウザのアドレスバーぽい見た目の中で、bash.exeやcmd.exeやpwsh.exeが動いていて、
     cd tmp ; cat ../atom4.v | grep -i JSR

     w3m -dump https://ww.google.com

     date --date='TZ="America/Los_Angeles" 09:00 next Fri'

     cal --year

     expr 9 \* 9

     banner Hello World

    などを入力すると、結果を表示するのでなくクリップボードに格納するような、その場でちょっとしたコマンドを実行するものをイメージしていました。

     |  enaka  |  返信
  4. ご返信ありがとうございます。

    > すばやく一度に、n行スクロールしたいとか、n回貼り付けしたいとか、n回文字列置換したいとか、そんな簡単な用途なのでダイアログが開くのは少し大げさで面倒です(贅沢の極み)。
    > アウトプットバーのようにボトムに開いて実行後に閉じると嬉しいです。

    なるほど、確かにそのくらいの軽い操作で毎回ダイアログが出てくるのは、ちょっと大げさに感じてしまうかもしれませんね。

    とはいえ、こういった機能はどうしてもニーズが限られるため、標準機能として組み込むのは難しいところがあります。

    そのぶん、マクロなどでうまく補えれば…という感じです。

    たとえば、マクロのPromptを使って「回数 + コマンド (例:4 M-d)」のような形式で入力してもらうこともできます。(これも結局ダイアログですが…)

    あるいは、プラグインでツール バーに組み込むようにすれば、より自然なかたちでエディター内に溶け込んだ操作感にできるかもしれません。

    とはいえ、操作の繰り返し機能は確かに便利そうですし、実装するかどうかはさておき、今後の開発の参考にさせていただきますね。

    Bash の件、外部ツールでうまくいきそうとのことで安心しました。

    いただいた設定をこちらでも試してみましたが、Bash でも問題なく動作してそうですね。

    > 出力先に、クリップボードも選択出来れば完璧でした。リダイレクトで > /dev/clipboard すればよいため、必須ではありませんがタイプする文字は少ないに限ります。

    なるほど、わかります。そのひと手間が意外と気になりますよね。

    クリップボードへの出力も、簡単にできるようになれば便利そうなので、こちらも検討してみたいと思います。

    > 余談ですが、Mery組み込みの選択系コマンドが、カーソル位置からXXXまで選択、しかないのはなぜなんでしょうか。

    言われてみると、確かにそうですね…

    特に深い理由があるわけではなく、普段マウス操作が中心なので個人的に必要性を感じていなかったことと、これまでそういったご要望もなかったため、というのが正直なところです。

    でも、行選択のコマンドは、あっても良さそうですよね。こちらも検討してみます。

    > ブラウザのアドレスバーぽい見た目の中で、bash.exeやcmd.exeやpwsh.exeが動いていて、
    >  cd tmp ; cat …/atom4.v | grep -i JSR
    > などを入力すると、結果を表示するのでなくクリップボードに格納するような、その場でちょっとしたコマンドを実行するものをイメージしていました。

    なるほど。とりあえず外部ツール機能を使えば、それに近いことは実現できそうですね。

    すでにお気づきかもしれませんが、[終了時に閉じる] をオフにすると、アウトプット バー内で bash.exe を常駐させることができます。

    その状態であれば、アウトプット バーに直接コマンドを入力して実行することも可能です。

    ジョブを止めたい場合は、[ツール] → [外部ツール] → [ツール ジョブの中止] です。

    結果を受け取るタイミングはジョブの終了時になるので、クリップボードで受け渡すなどちょっと工夫がいるかもですが、うまく使えばご希望の動作に近いことができるかもしれません。

     |  Kuro  |  返信
  5. > > 余談ですが、Mery組み込みの選択系コマンドが、カーソル位置からXXXまで選択、しかないのはなぜなんでしょうか。
    >
    > 特に深い理由があるわけではなく、普段マウス操作が中心なので個人的に必要性を感じていなかったことと、これまでそういったご要望もなかったため、というのが正直なところです。

    nanoというコンソールのテキストエディタでも同様だったため、何か技術上の理由があるのかと興味本位でお聞きしました。
    自分はマウスは編集作業では志向の妨げになるためほぼ使いません。しかし、初代Macではカーソルキーがないだけでなくカーソル移動すらマウス以外ではできない、などの事例があるため慣れればそうでもないのでしょうね。

    > でも、行選択のコマンドは、あっても良さそうですよね。こちらも検討してみます。

    単語選択も欲しいです(ただの我儘)。前述のnanoでは、.nanorc設定ファイルで

    bind ^K "{prevword}{mark}{nextword}{cut}" all # カーソル位置の単語を切り取り
    bind ^A "{firstline}{mark}{lastline}" all # すべて選択

    のようにショートカットキーに複数の機能をアサインできます。
    Meryでもダイアログで設定できればベストですが、エクスポートしたキー設定ファイルを直接編集して、複数の機能を割り当てたキー設定をインポートできれば、マクロの必要が減ってよいかもしれません。

    > すでにお気づきかもしれませんが、[終了時に閉じる] をオフにすると、アウトプット バー内で bash.exe を常駐させることができます。
    >
    > その状態であれば、アウトプット バーに直接コマンドを入力して実行することも可能です。
    >
    > ジョブを止めたい場合は、[ツール] → [外部ツール] → [ツール ジョブの中止] です。

    以下の点で、一行端末としてはちょっと普段使いには不便でした。

    ・入力したコマンドの行編集ができない
    ・リダイレクトしないと出力を廃棄に設定してもアウトプットバーに出力する
    ・ツール ジョブの中止によりbashを殺してもアウトプットバーが閉じない

    アウトプットバーではなく、別タブで開けると便利かもしれません。

     |  enaka  |  返信
スポンサーリンク