:gomark ハック

マークへジャンプする ex コマンドがないなあと思って愚かにも作ってしまった。
:'a でできたのに。

--- ../src.orig/ex_docmd.c	Sat May  6 01:33:19 2006
+++ ex_docmd.c	Mon Sep 11 22:09:30 2006
@@ -202,6 +202,7 @@
 static void	ex_find __ARGS((exarg_T *eap));
 static void	ex_open __ARGS((exarg_T *eap));
 static void	ex_edit __ARGS((exarg_T *eap));
+static void	ex_gomark __ARGS((exarg_T *eap));
 #if !defined(FEAT_GUI) && !defined(FEAT_CLIENTSERVER)
 # define ex_drop		ex_ni
 #endif
@@ -6586,6 +6587,22 @@
     }
 
     ex_no_reprint = TRUE;
+}
+
+    static void
+ex_gomark(eap)
+    exarg_T	*eap;
+{
+    char_u buf[8];
+
+    if ((int)STRLEN(eap->arg) != 1)
+    {
+	EMSG("E666: Illegal mark");
+	return;
+    }
+    
+    sprintf(buf, "'%c", eap->arg[0]);
+    exec_normal_cmd(buf, REMAP_NONE, TRUE);
 }
 
 #ifdef FEAT_BYTEOFF
--- ../src.orig/ex_cmds.h	Fri Apr  7 18:44:46 2006
+++ ex_cmds.h	Mon Sep 11 21:32:52 2006
@@ -405,6 +405,8 @@
 			EXTRA|BANG|CMDWIN),
 EX(CMD_global,		"global",	ex_global,
 			RANGE|WHOLEFOLD|BANG|EXTRA|DFLALL|SBOXOK|CMDWIN),
+EX(CMD_gomark,		"gomark",	ex_gomark,
+			WORD1|NEEDARG|NOTRLCOM), 
 EX(CMD_goto,		"goto",		ex_goto,
 			RANGE|NOTADR|COUNT|TRLBAR|SBOXOK|CMDWIN),
 EX(CMD_grep,		"grep",		ex_make,

nv_gomark() などが normal.c で static だったので exec_normal_cmd() を使って楽してしまった。ノーマルモードコマンドよりは ex コマンドの方が作るのは難しいな。どこいっても eap と cap だらけで、しかもそのメンバのどれを使っているのかはっきりしないので嫌になる。
:'a のようなコマンドを打ったとき、これをパースしてアドレスを抽出しているのはどこだろう。