Win: MSG コマンド

make ; msg $USER "owata"
という感じでビープ代わりに使えるかも。

ユーザーにメッセージを送信します。

MSG {ユーザー名 | セッション名 | セッションID | @ファイル名 | *}
    [/SERVER:サーバー名] [/TIME:秒] [/V] [/W] [メッセージ]

  ユーザー名          送信先のユーザー名を指定します。
  セッション名        セッション名を指定します。
  セッションID        セッション ID を指定します。
  @ファイル名         メッセージの送信先一覧のファイル (ユーザー名、
                      セッション名、セッション ID) を指定します。
  *                   指定されたサーバーのすべてのセッションにメッセージを
                      送信します。
  /SERVER:サーバー名  送信先のサーバーを指定します (既定値は現在のサーバー)。
  /TIME:秒            受信者の確認応答までの待ち時間を指定します。
  /V                  実行中に詳細情報を表示します。
  /W                  ユーザーからの応答を待ちます。通常 /V オプションと共に
                      指定します。
  メッセージ          送信するメッセージを指定します。指定しない場合は、入力
                      プロンプトが表示されるか、または stdin から読み取ります。

Cygwin 版 vim で Windows のクリップボードを使うハック

vim でヤンクすると同じテキストが Windowsクリップボードに入り、
"*p すると Windows クリップボードのテキストがプットされるハック。
ヤンクはともかく、プットは全ての場合に対応していないし、実際には
レジスタ* を使っていないのでかなり問題がある。
しかしこのあたりは複雑であまり手がつけられない。
vim は基本的な編集機能の部分ほど入り組んでいて変更が難しい気がする。
ops.c(Vim7.1)へのパッチ

--- ../src.orig/ops.c	2007-05-28 11:46:13.674622700 +0900
+++ ops.c	2007-06-06 17:17:57.831039800 +0900
@@ -826,7 +826,8 @@
 	    || regname == '"'
 	    || regname == '-'
 	    || regname == '_'
-#ifdef FEAT_CLIPBOARD
+//#ifdef FEAT_CLIPBOARD
+#if 1
 	    || regname == '*'
 	    || regname == '+'
 #endif
@@ -1351,7 +1352,29 @@
     }
     else				/* name or number register */
     {
-	get_yank_register(regname, FALSE);
+	if (regname == '*') {
+	    FILE* clip;
+	    char buf[10240] = {0};
+
+	    clip = fopen("/dev/clipboard", "r");
+	    if ( clip ) { 
+		int len;
+
+		len = fread(buf, 1, sizeof(buf)-1, clip);
+		buf[len] = 0;
+
+		get_yank_register('x', TRUE);
+		free_yank_all();
+		if (strchr(buf, '\n'))
+		    str_to_reg(y_current, MLINE, buf, strlen(buf), 0);
+		else
+		    str_to_reg(y_current, MCHAR, buf, strlen(buf), 0);
+
+		fclose(clip); 
+
+		regname = 'x';
+	    } 
+	}
+	else
+	    get_yank_register(regname, FALSE);
+
 	if (y_current->y_array == NULL)
 	    retval = FAIL;
 	else
@@ -3027,6 +3050,48 @@
 	curbuf->b_op_end.col = MAXCOL;
     }
 
+
+    {
+       FILE* clip;
+        int i;
+        char* buf = NULL;
+        int bufsize;
+
+        if (y_current->y_type == MCHAR) {
+            bufsize = strlen(y_current->y_array[0]) + 1;
+        }
+        else {
+            bufsize = 0;
+            for (i=0; i<y_current->y_size; i++) {
+                bufsize += strlen(y_current->y_array[i]) + 1;
+            }
+            bufsize += 1;
+        } 
+
+        buf = malloc(bufsize);
+
+        if (buf) {
+            if (y_current->y_type == MCHAR) {
+                strcpy(buf, y_current->y_array[0]);
+            }
+            else { 
+                buf[0] = 0;
+                for (i=0; i<y_current->y_size; i++) {
+                    strcat(buf, y_current->y_array[i]);
+                    strcat(buf, "\n");
+                }
+            } 
+
+            clip = fopen("/dev/clipboard", "w");
+            if ( clip ) { 
+                fwrite(buf, strlen(buf), 1, clip);
+                fclose(clip); 
+            }
+            free(buf);
+        }
+    }
+
+
 #ifdef FEAT_CLIPBOARD
     /*
      * If we were yanking to the '*' register, send result to clipboard.
@@ -3169,6 +3234,32 @@
     int		allocated = FALSE;
     long	cnt;
 
+#if 1
+    if (regname == '*')
+    {
+        FILE* clip;
+        char buf[10240] = {0};
+
+        clip = fopen("/dev/clipboard", "r");
+        if ( clip ) { 
+	    int len;
+
+	    len = fread(buf, 1, sizeof(buf)-1, clip);
+            buf[len] = 0;
+
+            get_yank_register('x', TRUE);
+            free_yank_all();
+            str_to_reg(y_current, MLINE, buf, strlen(buf), 0);
+
+            fclose(clip); 
+
+	    regname = 'x';
+        } 
+
+	goto DO_PASTE;
+    }
+#endif 
+
 #ifdef FEAT_CLIPBOARD
     /* Adjust register name for "unnamed" in 'clipboard'. */
     adjust_clip_reg(&regname);
@@ -3206,6 +3297,7 @@
 	    return;
     }
 
+DO_PASTE:
     if (insert_string != NULL)
     {
 	y_type = MCHAR;

追記:"*p が機能しないことを発見。直し方はまだ不明。
→2007/05/28: valid_yank_reg() を直せばいいよう。

[追記:2006-08-18]
コピーのとき、バッファ長を可変に変更した。
" 選択範囲の単語を置換

[追記:2007-06-06]
i_CTRL-R に対応。

テキストエディタ「単語単位で移動」の違い

hoge@moge,death/peso ff
というテキストの1桁目から「単語単位で移動」を繰り返したときのカーソル移動位置の違いを比較する。
秀丸:h→m→d→p→f
サクラエディタ:h→@→m→,→d→/→p→f
xyzzy:h→@→,→/→
meadow:h→@→,→/→
vim:h→@→m→,→d→/→p→f
VisualStudio:h→@→m→,→d→/→p→f
意外にもサクラ、VisualStudio と vim が同じ挙動である。
ところで vi の w の挙動はかなり複雑なのはご存知だろうか。例えば
hoge sage
というテキストの h の上で w をするとカーソルは s へ行くが、dw は s の前のスペース(含む)まで削除し、cw はスペースの手前の e までを変更になる。一貫性という観点から見れば美しくないが、これは最も利便がよく、かつ自然に感じられる挙動である。論理的な審美性よりも実用性を重視する vi の設計思想の好例だろう。

なお Visual Studio やサクラでも C-Delete はスペース(含む)までを削除する。しかしこちらは逆に「単語の末尾までを選択」というコマンドがないため不便に感じることがある。C-S-Right は「単語の末尾までを選択」という挙動にしてほしいというのは私だけだろうか。

xyzzy, meadow正規表現 [A-Za-z0-9][^A-Za-z0-9] で検索しているように見える。逆移動の M-b は [^A-Za-z0-9][A-Za-z0-9] 検索のようだ。まさに一貫しているが、「単語の末尾へ移動」というのと _ (アンダースコア)で止まってしまうのは使いづらくないだろうか。

使い勝手という面では、秀丸式の移動単位が大きすぎず、細かすぎずでベストなように思う。あらゆる点でバランスがとれ、そつのない秀丸らしい単語移動である。

単語移動1つとっても各エディタの個性が見て取れるものである。

[追記]
サクラエディタには「単語単位で移動するときに単語の両端に止まる」というオプションがある。すばらしい。


参考:
Vz Editorのようにカーソルを構文境界毎に移動させる
http://d.hatena.ne.jp/Rommy/20060818/1155852221