一括表示

− 野ざらし言 −

[2874] 行頭からカーソル位置までの文字列の取出し

としき 2008/08/30(Sat) 18:05
http://www.hinocatv.ne.jp/~toshiki/
たまにはVzネタでも。

ときどき行っている作業で、行頭からカーソル位置までの文字列を取得し、
コマンドラインに送り込む、というものがあります。私の行っている手順を
あえてキーボードマクロで表示すると、以下のようなものになります。

90 ^\ "" #H#54#E#u#<"grep -n "#m

コマンドラインで使うコマンドが常に一定ならそれなりなマクロを作ってし
まうのですが、実際には多くのコマンド及びオプションの組み合わせがあり、
全てを列挙するのはとても気が重いです。

さて、この手順を見てわかるとおり、これではリードオンリーファイルとい
うかビューモードで開いたファイルには適用できません。

ここで質問です。
ビューモードでも使える、行頭からカーソル位置までの文字列の取出し方法
で、簡単な、かつ、制限の少ない方法としてはどのようなものがあるでしょ
うか。条件として、キーボードマクロでも使用可能な方法、とします。
私自身では、もう頭が固くなっていて、うまい方法が思いつきません。
複雑な方法なら、いくつか思いつきますけど。

どなたか、ナイスなアイディアをお寄せ下さい。
 

[2875] Re: 行頭からカーソル位置までの文字列の取出し

めざら 2008/08/31(Sun) 06:29
[2874]へのコメント <mezala@nifty.com> http://homepage3.nifty.com/mezala/
 「キーボードマクロでも」という条件がキツすぎるような気がしますが,
むしろそれを逆手にとることもできますから,なんとか。

 キーボードマクロはコマンドキーだけでなくマクロキーも受け取ります。
このため,コマンドキーと同じキーが割り当ててあれば後優先の法則で実行
されたマクロ呼出が記録されます。(要するに,異なる環境ではキーボード
マクロは使えない場合もあるということです。)

 まず,デフォルトの VZ.DEF か,必ず読み込まれるインクルードマクロに
次のようなマクロを仕込みます。

18 ^QT ""
        &s #] mr[-,
        #H #54
        mr], #? .

 このマクロの機能は,カーソル位置から論理行頭までを削除バッファに格納
するというものになります。テキスト変更フラグ(mr)を一時的に編集モード
にしているため,ビューモードでも使えます。

 ただ,日常的には,通常の #H は ^[BS] を使うことになります。

 簡単で,かつ制限が少ないか? という判断は主観的なものなので, それは
お任せします。キーボードマクロでも使えるものという極端に強烈至極な制限
をクリアするには,キーアサイン制限で対抗(笑)するしかありません。だって
キーボードマクロなんて普通使わないでしょ。

 常用するなら,キーが決まっていてわかりやすいということが長所になると
思います。ただし,編集モード以外ではコマンドの #H が実行されます。

[2876] Re^2: 行頭からカーソル位置までの文字列の取出し

としき 2008/08/31(Sun) 23:06
[2875]へのコメント http://www.hinocatv.ne.jp/~toshiki/
なるほど、mr をいじれば編集が可能になるんだ。すっかり忘れていました。
とっても参考になりました。ありがとうございます。

>  「キーボードマクロでも」という条件がキツすぎるような気がしますが,

あるファイルを編集していて、何回か同じ事をやっていると、
「あ、これはキーボードマクロにした方がいいな」
とか思うことがあるんですよ。わざわざなにかのマクロをインクルードする
程の事もない、という場合。

>  簡単で,かつ制限が少ないか? という判断は主観的なものなので,

それはそうですよね。
ただ、マクロコードが4000バイトもあるようなマクロは決して簡単とは
思えません。制限については説明が足りなくて申し訳なかったと思いますが、
私が考えていたのは、例えば TC が50以上必要とかラインバッファのサイ
ズが2048固定とか、著しく例が不適切なような気もしますが、まぁそん
な事を考えていたのでした。

> キーボードマクロなんて普通使わないでしょ。

ごめんなさい、私は使いまくりです。
あるファイルを開いていて、3回ぐらい同じ動作を行って、さらに5回以上
同じ作業を行うと予測される場合には、サクッとキーボードマクロに登録し
てしまいます。明日も明後日も同じ作業をする、別のファイルでも同じ作業
をする、と想定される場合は、キーボードマクロを書き出してファイルに保
存しますが、大抵はファイル毎に異なった作業になる上、次の日はまた別の
作業の繰り返しとなることが多いので、保存マクロに昇格するものはほとん
どありません。えぇっと、旧ニフティのログ整理関係のマクロが2ファイル、
全部で10個弱と、唯一 vz.def まで昇格した辞書引きマクロぐらいではな
いかな。他にもあるのかもしれませんが、すっかり忘れているぐらいですか
ら、もしかしたら二度と使わないマクロばかりかも。
現在、1ヶ月に2〜3回扱うファイルがあり、毎回ほとんど同じ作業なので
キーボードマクロで処理しているのですが、バッチファイルで処理した方が
いいのかな、等と考えている最中。でも、バッチファイルを作るよりも先に
キーボードマクロの登録を行ってしまい、それであっという間に作業が終わ
ってしまうので、なかなかその先に進めていません。
 

[2878] Re^3: 行頭からカーソル位置までの文字列の取出し

文太 2008/09/06(Sat) 23:52
[2876]へのコメント
作り込めば作り込むほど使われない可能性が高いのだけど。
メニューが不得意らしいとしきさんへ捧げます。
ちゃんと20分かかりました。うーむ。
日常業務を楽に、願わくば。

=== Toshi_RT.def by Bunta ===;Toshiki's Routine
該当文字列をブロックで起動。コマンドラインに渡す。
コマンドはメニュー選択。
* Macro
50 ^^ "Toshi_RT"

        ?.
        o="c:\toshi_rt.tmp",            ;結果ファイル
        
        (mb==2)?? {&m("MOJI Block Only!").}
        ps[=pa, #G ps],
        f=wa+146,                       ;対象ファイル

        !01 (r<0)?.
        #E
        &?("%s $"%s$" %s >%s",pm+2,pa,f,o)
;       #m                              ;コマンドラインを書き換えるならここで。
;       #[                              ;3コメントアウツを取ると結果まで行く
;       mx[+, #O &?("%s",o) #m mx],     ;開けるところまでする

* P
1       "Toshi_RT",12,10
        "1 Grep -n"
        "2 Cgrep"
        "3 Ygrep"
        "4 "
        "5 "
        "6 "
        "7 "
        "8 "
        "9 "
        "0 "

*

追伸:めざらさんは、やっぱりすごい。あれをvz.defにあらかじめ入れておけ、
さすればキーボードマクロでも、と。すげえ、すげえ、さすがマクロ師。

[2879] Re^4: 行頭からカーソル位置までの文字列の取出し

としき 2008/09/07(Sun) 11:17
[2878]へのコメント http://www.hinocatv.ne.jp/~toshiki/
まぁ、わざわざ作っていただいたのですね。ありがとうございます。
そうか、文字ブロックという手もあるのですね。こちらの方が汎用性は高い
から、行の中央部分の文字列を取り出すのにも使えるのはいいですね。
ただ、他のマクロだの入力結果だので具合の良い位置にカーソルがくるよう
になっていて、それに依存して、そこから行頭までを取り出したい、なんて
いう場合、ブロックモードにしてカーソルを動かして、というのはちとアク
ションが増えてしまって嬉しくないかも。


> 作り込めば作り込むほど使われない可能性が高いのだけど。

確かにそうなんですよね。
キーボードマクロって、スクリプト言語でいうところのワンライナーと同じ
で、その場で使い捨てにするようなものがほとんどなので、今日は grep だ
けど明日は ping を使う、みたいな形になってしまって。



実はですねぇ、さっき、今朝10時ごろ、おそらく数週間ぶりに行うような
作業があったのですが、そこで気がついたのは、その作業、カーソル位置か
ら行末までの文字列をコマンドラインに送り込んでいたのですね。幸いなこ
とに、今回は編集可能な属性のファイルを扱っていたので、ごく普通にキー
ボードマクロで行末まで削除を使ってパッパと終わらせてしまいましたが。

で、つらつらと考えたのが、以下のマクロ。
私のメインマシンは PC-98 で、デフォルトでは [F11] から [F15] は使われ
ていない、という特徴をフルに使っております。

= mr
* M
77 [F12] "mr"
    mr~, .
*

これを vz.def に入れてみる事を考えております。
キーボードマクロで文字列を取得する前と後に1回ずつ、ちょっとアクショ
ンが増えてしまいますので、慣れるかどうか、という問題はありますが。
ただ、キーの位置が [DEL] や [BS] に近い、というメリットはあります。
これでしばらく行ってみようかと思っております。
 

[2881] Re^5: 行頭からカーソル位置までの文字列の取出し

めざら 2008/09/08(Mon) 22:56
[2879]へのコメント <mezala@nifty.com> http://homepage3.nifty.com/mezala/
 ふと思ったのですが,リードオンリーにしておいて,変更を気にしないで作業する
というのはナシなのでしょうか。
 変更を加えてあれば,むしろどこまで作業が済んだかわかるとも思うのですが。

 わたしの ^[DEL] (m.gann師のマクロに尾ひれを付けています)
19 ^[DEL] ""    ;Del -> (41)    ;[\] Copy, view too / csr ptr
        (ks&1)?{ &s #] mr[-,            ;pk14#11003 m.gann
                #l #54 mr], #?          ;#] mr[-, #l mr], #54
                (((mg..-3).-1)^=$80,    ;H_ear cursor ->$
                . }
        #l

 シフト起動で元の行には変更を加えず,復活先でカーソル位置を末尾にします。
復活先ではカーソルを行末に再移動することが多かったので。

[2882] Re^6: 行頭からカーソル位置までの文字列の取出し

としき 2008/09/09(Tue) 00:04
[2881]へのコメント http://www.hinocatv.ne.jp/~toshiki/
>  ふと思ったのですが,リードオンリーにしておいて,変更を気にしないで作業する
> というのはナシなのでしょうか。

アリだと思います。
ただ、例えば CD-ROM のファイルをいじる場合であっても、シームレスとい
うのかな、属性などに全く関係なく操作できるかどうかわからないもので。

>  わたしの ^[DEL] (m.gann師のマクロに尾ひれを付けています)

後日、じっくり読ませていただきます。
現在、メインマシンのHDDが大変なことになっていて、落ち着いてマクロ
を読み込める気分ではないもので。
 

↑ このページの先頭