2024年3月22日金曜日

Vim に Ex コマンドを追加してビルドする

追加するために修正が必要な箇所を把握するのが目的なので、 echo をそのまま呼び出す myecho コマンドを追加する。

前提

  • OS: Windows 11 Pro 23H2 ビルド 22631.3155
  • Docker Desktop: Version 4.28.0 (139021)
  • 使用イメージ: debian:bookworm-slim
  • ビルドする Vim のバージョン: v9.1.0196

ドキュメントの追加・更新はスコープ外とする。

コンテナ起動

docker run -it --rm debian:bookworm-slim

Vim をビルドできる環境を整える

必要なパッケージのインストール

apt update
apt install -y build-essential libncurses-dev vim git

※ Vim は、 Ex コマンド追加後のコマンドのインデックス作り直し処理で必要になる

作業用ディレクトリ作成

mkdir ~/work
cd ~/work

Vim のソースコード入手

v9.1.0196 の最新のコミットのみをダウンロード。

git clone -b v9.1.0196 --depth 1 https://github.com/vim/vim.git
cd vim

ビルド・実行

./configure
make -j16
src/vim

vim が起動した。 OK.

Ex コマンドの追加

Ex コマンドの実装ファイルを作成

引数をそのまま既存関数 ex_echo へ丸投げする ex_myecho 関数を作る。

src/myecho.c:

#include "vim.h"

void
ex_myecho(exarg_T *eap)
{
  ex_echo(eap);
}

src/proto/myecho.pro:

/* myecho.c */
void ex_myecho(exarg_T *eap);
/* vim: set ft=c : */

作成した Ex コマンドを Vim に組み込む

src/proto.h へ追加

19 行目から 123 行目までの # include の並びに、 回作成した myecho.pro を追加する。

# include "myecho.pro"

src/ex_cmds.h へ Ex コマンドを追加

117 行目からの EXCMD マクロの並びに、今回追加するコマンドを追加する。

今回は末尾に追加した。

EXCMD(CMD_myecho,   "myecho",       ex_myecho,
    EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
    ADDR_NONE),

フラグの意味は、このヘッダーファイルの先頭に記載されている。

今回は、 echo のモノをそのままコピペ。

Ex コマンドインデックスの更新

src ディレクトリへ移動し、 make cmdidxs コマンドを実行する。

以下のように、 Ex コマンドのインデックスが更新される。

diff --git a/src/ex_cmdidxs.h b/src/ex_cmdidxs.h
index 658f05e..26031d8 100644
--- a/src/ex_cmdidxs.h
+++ b/src/ex_cmdidxs.h
@@ -53,7 +53,7 @@ static const unsigned char cmdidxs2[26][26] =
   /* j */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0 },
   /* k */ {  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
   /* l */ {  3, 11, 15, 19, 20, 25, 28, 33,  0,  0,  0, 35, 38, 41, 45, 51,  0, 53, 62, 54, 55, 59, 61,  0,  0,  0 },
-  /* m */ {  1,  0,  0,  0,  7,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16 },
+  /* m */ {  1,  0,  0,  0,  7,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,288, 16 },
   /* n */ {  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  8, 10,  0,  0,  0,  0,  0, 17,  0,  0,  0,  0,  0 },
   /* o */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  5,  0,  0,  0,  0,  0,  0,  9,  0, 11,  0,  0,  0 },
   /* p */ {  1,  0,  3,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  9,  0,  0, 16, 17, 26,  0, 28,  0, 29,  0 },
@@ -69,4 +69,4 @@ static const unsigned char cmdidxs2[26][26] =
   /* z */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }
 };

-static const int command_count = 594;
+static const int command_count = 595;

ビルドスクリプトの更新

以下ビルドスクリプトに、 myecho.cmyecho.o(または myecho.obj) を追加する。

move. で検索かけて、ヤンク・ペースト、そのご myhello. に書き換える感じ。

  • src/Make_ami.mak
  • src/Make_cyg_ming.mak
  • src/Make_mvc.mak
  • src/Make_vms.mms
  • src/Makefile

ビルド

make distclean
./configure
make -j16

これで、 src/vim に出力されたバイナリを実行し、 :myecho "abcd" とすると、 abcd がエコーされる。

以上。

最終的な差分

差分.patch
diff --git a/src/Make_ami.mak b/src/Make_ami.mak
index 9e9ebe3..d99501a 100644
--- a/src/Make_ami.mak
+++ b/src/Make_ami.mak
@@ -138,6 +138,7 @@ SRC += \
        misc2.c \
        mouse.c \
        move.c \
+       myecho.c \
        normal.c \
        ops.c \
        option.c \
diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak
index 7afb6e0..b64eb93 100644
--- a/src/Make_cyg_ming.mak
+++ b/src/Make_cyg_ming.mak
@@ -821,6 +821,7 @@ OBJ = \
        $(OUTDIR)/misc2.o \
        $(OUTDIR)/mouse.o \
        $(OUTDIR)/move.o \
+       $(OUTDIR)/myecho.o \
        $(OUTDIR)/mbyte.o \
        $(OUTDIR)/normal.o \
        $(OUTDIR)/ops.o \
diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
index 4db2298..0aacd2b 100644
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -698,6 +698,7 @@ OBJ = \
        $(OUTDIR)\misc2.obj \
        $(OUTDIR)\mouse.obj \
        $(OUTDIR)\move.obj \
+       $(OUTDIR)\myecho.obj \
        $(OUTDIR)\normal.obj \
        $(OUTDIR)\ops.obj \
        $(OUTDIR)\option.obj \
@@ -1622,6 +1623,8 @@ $(OUTDIR)/mouse.obj:      $(OUTDIR) mouse.c  $(INCL)

 $(OUTDIR)/move.obj:    $(OUTDIR) move.c  $(INCL)

+$(OUTDIR)/myecho.obj:  $(OUTDIR) myecho.c  $(INCL)
+
 $(OUTDIR)/mbyte.obj:   $(OUTDIR) mbyte.c  $(INCL)

 $(OUTDIR)/netbeans.obj:        $(OUTDIR) netbeans.c $(NBDEBUG_SRC) $(INCL) version.h
@@ -1889,6 +1892,7 @@ proto.h: \
        proto/misc2.pro \
        proto/mouse.pro \
        proto/move.pro \
+       proto/myecho.pro \
        proto/mbyte.pro \
        proto/normal.pro \
        proto/ops.pro \
diff --git a/src/Make_vms.mms b/src/Make_vms.mms
index f050c9d..b15d7b0 100644
--- a/src/Make_vms.mms
+++ b/src/Make_vms.mms
@@ -396,6 +396,7 @@ SRC = \
        misc2.c \
        mouse.c \
        move.c \
+       myecho.c \
        normal.c \
        ops.c \
        option.c \
@@ -528,6 +529,7 @@ OBJ = \
        misc2.obj \
        mouse.obj \
        move.obj \
+       myecho.obj \
        normal.obj \
        ops.obj \
        option.obj \
@@ -1033,6 +1035,9 @@ mouse.obj : mouse.c vim.h [.auto]config.h feature.h os_unix.h   \
 move.obj : move.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h termdefs.h macros.h structs.h regexp.h gui.h beval.h \
  [.proto]gui_beval.pro option.h ex_cmds.h proto.h errors.h globals.h
+myecho.obj : myecho.c vim.h [.auto]config.h feature.h os_unix.h   \
+ ascii.h keymap.h termdefs.h macros.h structs.h regexp.h gui.h beval.h \
+ [.proto]gui_beval.pro option.h ex_cmds.h proto.h errors.h globals.h
 mbyte.obj : mbyte.c vim.h [.auto]config.h feature.h os_unix.h   \
  ascii.h keymap.h termdefs.h macros.h structs.h regexp.h gui.h beval.h \
  [.proto]gui_beval.pro option.h ex_cmds.h proto.h errors.h globals.h
diff --git a/src/Makefile b/src/Makefile
index 33903d3..18a714e 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1546,6 +1546,7 @@ BASIC_SRC = \
        misc2.c \
        mouse.c \
        move.c \
+       myecho.c \
        normal.c \
        ops.c \
        option.c \
@@ -1704,6 +1705,7 @@ OBJ_COMMON = \
        objects/misc2.o \
        objects/mouse.o \
        objects/move.o \
+       objects/myecho.o \
        objects/normal.o \
        objects/ops.o \
        objects/option.o \
@@ -1893,6 +1895,7 @@ PRO_AUTO = \
        misc2.pro \
        mouse.pro \
        move.pro \
+       myecho.pro \
        netbeans.pro \
        normal.pro \
        ops.pro \
@@ -3374,6 +3377,9 @@ objects/mouse.o: mouse.c
 objects/move.o: move.c
        $(CCC) -o $@ move.c

+objects/myecho.o: myecho.c
+       $(CCC) -o $@ myecho.c
+
 objects/mbyte.o: mbyte.c
        $(CCC) -o $@ mbyte.c

@@ -3999,6 +4005,11 @@ objects/move.o: move.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  proto/gui_beval.pro structs.h regexp.h gui.h libvterm/include/vterm.h \
  libvterm/include/vterm_keycodes.h alloc.h ex_cmds.h spell.h proto.h \
  globals.h errors.h
+objects/myecho.o: myecho.c vim.h protodef.h auto/config.h feature.h os_unix.h \
+ auto/osdef.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \
+ proto/gui_beval.pro structs.h regexp.h gui.h libvterm/include/vterm.h \
+ libvterm/include/vterm_keycodes.h alloc.h ex_cmds.h spell.h proto.h \
+ globals.h errors.h
 objects/normal.o: normal.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h termdefs.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h libvterm/include/vterm.h \
diff --git a/src/ex_cmdidxs.h b/src/ex_cmdidxs.h
index 658f05e..26031d8 100644
--- a/src/ex_cmdidxs.h
+++ b/src/ex_cmdidxs.h
@@ -53,7 +53,7 @@ static const unsigned char cmdidxs2[26][26] =
   /* j */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  0,  0 },
   /* k */ {  0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
   /* l */ {  3, 11, 15, 19, 20, 25, 28, 33,  0,  0,  0, 35, 38, 41, 45, 51,  0, 53, 62, 54, 55, 59, 61,  0,  0,  0 },
-  /* m */ {  1,  0,  0,  0,  7,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16 },
+  /* m */ {  1,  0,  0,  0,  7,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,288, 16 },
   /* n */ {  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  8, 10,  0,  0,  0,  0,  0, 17,  0,  0,  0,  0,  0 },
   /* o */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  5,  0,  0,  0,  0,  0,  0,  9,  0, 11,  0,  0,  0 },
   /* p */ {  1,  0,  3,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  9,  0,  0, 16, 17, 26,  0, 28,  0, 29,  0 },
@@ -69,4 +69,4 @@ static const unsigned char cmdidxs2[26][26] =
   /* z */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }
 };

-static const int command_count = 594;
+static const int command_count = 595;
diff --git a/src/ex_cmds.h b/src/ex_cmds.h
index bd26e81..0f9c1dc 100644
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -1904,6 +1904,10 @@ EXCMD(CMD_decrement,     "--",           ex_incdec,
        EX_EXTRA|EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
        ADDR_NONE),

+EXCMD(CMD_myecho,              "myecho",               ex_myecho,
+       EX_EXTRA|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
+       ADDR_NONE),
+
 #undef EXCMD

 #ifndef DO_DECLARE_EXCMD
diff --git a/src/proto.h b/src/proto.h
index 50802ce..656e210 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -121,6 +121,7 @@ extern int _stricoll(char *a, char *b);
 # ifdef FEAT_VIMINFO
 #  include "viminfo.pro"
 # endif
+# include "myecho.pro"

 // These prototypes cannot be produced automatically.
 int smsg(const char *, ...) ATTRIBUTE_COLD ATTRIBUTE_FORMAT_PRINTF(1, 2);

参考資料

0 件のコメント:

コメントを投稿