解决vim在终端ctrl+i无法跳转问题

总所周知,终端里使用vim只能Ctrl+o跳转到上一个位置,不能Ctrl+i跳转到下一个位置。因为xterm中tab和ctr+i都是一样,传递的键值是9,所以在vim中无法将tab和vim的ctr_i分离使用。

这篇文章来解决这个问题。ctrl+g用于显示正在编辑的文件名,文件大小和位置信息,今天就牺牲ctrl+g原有的功能来实现ctrl+i的功能。有了状态栏插件以后ctrl+g原本的功能可有可无。以下以ubuntu中为例子。

下载vim源码

github打不开,这里从gitee上面下载:https://gitee.com/mirrors/vim/tags

修改源码

下载完后,打开目录有以下文件:

jek:~/Downloads$ cd vim-v9.0.2020/
jek:~/Downloads/vim-v9.0.2020$ ls
ci         CONTRIBUTING.md  LICENSE   nsis     READMEdir  README.txt      runtime      src    uninstall.txt  vimtutor.com
configure  Filelist         Makefile  pixmaps  README.md  README_VIM9.md  SECURITY.md  tools  vimtutor.bat

找到src/nv_cmds.h文件,里面定义了按键与相应处理函数的映射。将Ctrl_G那一行的nv_ctrlg函数改成nv_pcmark函数后保存。

/*
 * Used when creating nv_cmdidxs.h.
 */
# define NVCMD(a, b, c, d)  a
static const int nv_cmds[] =

#endif // DO_DECLARE_NVCMD
{
    NVCMD(NUL,		nv_error,	0,			0),
    NVCMD(Ctrl_A,	nv_addsub,	0,			0),
    NVCMD(Ctrl_B,	nv_page,	NV_STS,			BACKWARD),
    NVCMD(Ctrl_C,	nv_esc,		0,			TRUE),
    NVCMD(Ctrl_D,	nv_halfpage,	0,			0),
    NVCMD(Ctrl_E,	nv_scroll_line,	0,			TRUE),
    NVCMD(Ctrl_F,	nv_page,	NV_STS,			FORWARD),
    /* NVCMD(Ctrl_G,	nv_ctrlg,	0,			0), */
    NVCMD(Ctrl_G,	nv_pcmark,	0,			0),
    NVCMD(Ctrl_H,	nv_ctrlh,	0,			0),
    NVCMD(Ctrl_I,	nv_pcmark,	0,			0),
    NVCMD(NL,		nv_down,	0,			FALSE),
    NVCMD(Ctrl_K,	nv_error,	0,			0),
    NVCMD(Ctrl_L,	nv_clear,	0,			0),
    NVCMD(CAR,		nv_down,	0,			TRUE),
    NVCMD(Ctrl_N,	nv_down,	NV_STS,			FALSE),
    NVCMD(Ctrl_O,	nv_ctrlo,	0,			0),
    NVCMD(Ctrl_P,	nv_up,		NV_STS,			FALSE),

编译vim

编译之前需安装依赖库,python之前已经安装了这里不再展示。

jek:~/Downloads/vim-v9.0.2020$ sudo apt install python3-dev
jek:~/Downloads/vim-v9.0.2020$ sudo apt install libncurses5-dev
jek:~/Downloads/vim-v9.0.2020$ sudo apt install libgtk2.0-dev libatk1.0-dev libcairo2-dev libx11-dev libxpm-dev libxt-dev  

只配置python3。

./configure --with-features=huge \
	 --enable-cscope \
	 --enable-fontset \
	 --enable-python3interp=yes \
	 --with-python3-config-dir=/usr/lib/python3.10/config-3.10m-x86_64-linux-gnu \
	 --with-python3-command=/usr/bin/python3 \
	 --enable-multibyte \
	 --enable-luainterp

# --with-features=huge:支持最大特性
# --enable-rubyinterp:打开对ruby编写的插件的支持
# --enable-pythoninterp:打开对python编写的插件的支持
# --enable-python3interp:打开对python3编写的插件的支持
# --enable-luainterp:打开对lua编写的插件的支持
# --enable-perlinterp:打开对perl编写的插件的支持
# --enable-multibyte:打开多字节支持,可以在Vim中输入中文
# --enable-cscope:打开对cscope的支持
# --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu/ 指定python 路径
# --with-python-config-dir=/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu/ 指定python3路径
# --prefix=/usr/local/vim:指定将要安装到的路径(自行创建)

不做上面这步,安装补全插件后会报以下错误:

YouCompleteMe unavailable: requires Vim compiled with Python (3.8.0+) support.

然后执行compile_config.sh

jek:~/Downloads/vim-v9.0.2020$ sh compile_config.sh

正式编译:

jek:~/Downloads/vim-v9.0.2020$ make
Starting make in the src directory.
If there are problems, cd to the src directory and run make there
cd src && make first
make[1]: Entering directory '/home/jek/Downloads/vim-v9.0.2020/src'
rm -f auto/config.status auto/config.cache config.log auto/config.log
rm -f auto/config.h auto/link.log auto/link.sed auto/config.mk
touch auto/config.h
cp config.mk.dist auto/config.mk
cd testdir; make -f Makefile clean
make[2]: Entering directory '/home/jek/Downloads/vim-v9.0.2020/src/testdir'
......
......

卸载vim

如果安装了vim先将vim删掉,~/.vimrc文件和~/.vim文件夹不需要删除。

sudo apt remove vim

安装vim

默认安装到/usr/local/share/vim/vim90/usr/local/bin目录下。

jek:~/Downloads/vim-v9.0.2020$ sudo make install

# 创建链接
jek:/usr/local/bin$ sudo ln /usr/local/bin/vim /usr/bin/vim

查看是否支持python3,有‘+’表示支持

jek:~/Downloads/vim-v9.0.2020$ vim --version |grep python
+cmdline_hist      +langmap           -python            +viminfo
+cmdline_info      +libcall           +python3           +virtualedit
Linking: gcc -L/usr/local/lib -Wl,--as-needed -o vim -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -l     pangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lharfbuzz -lfontconfig -lfreetype -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo -     lselinux -L/usr/lib/python3.10/config-3.10m-x86_64-linux-gnu -lpython3.10

也可以打开vim输入:echo has("python3"),结果为1就表示支持python3。

然后就可以使用vim了。至此,可以用ctrl+g代替原来的ctrl+i完成跳转到下一个位置的功能。

参考:

https://zhuanlan.zhihu.com/p/46701273
https://www.cnblogs.com/JoiT/p/build_from_source_for_linux_vim.html

posted @ 2023-11-10 23:04  仰望星空_22  阅读(147)  评论(0)    收藏  举报