追加するために修正が必要な箇所を把握するのが目的なので、
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
:
src/proto/myecho.pro
:
作成した Ex コマンドを Vim に組み込む
src/proto.h
へ追加
19 行目から 123 行目までの # include
の並びに、
回作成した myecho.pro
を追加する。
include "myecho.pro" #
src/ex_cmds.h
へ
Ex コマンドを追加
117 行目からの EXCMD
マクロの並びに、今回追加するコマンドを追加する。
今回は末尾に追加した。
(CMD_myecho, "myecho", ex_myecho,
EXCMD|EX_NOTRLCOM|EX_EXPR_ARG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
EX_EXTRA), 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.c
と
myecho.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.hdiff --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_EXCMDdiff --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 件のコメント:
コメントを投稿