: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 のようなコマンドを打ったとき、これをパースしてアドレスを抽出しているのはどこだろう。