vim使用说明

vim使用说明。 Modified: 2023-07-04 20:24:23 Created: 2022-12-04 09:34:06 Tags: #vim #linux

vim 是 vi imporoved 的缩写,翻译过来是 vi 编辑器升版。本文主要从如下方面介绍 vim:

  • 安装 vim
  • 基本用法->用 vim 做最基本的编辑(在 vim 中活下来)
  • 第三方插件

本文介绍 vim,更多在具体细节,希望帮助大家快速记住一些东西,然后经过反复实践形成肌肉记忆,提升效率。本文目标不是研究 vim 的技术细节,研究诸如写 vimscript 的奇技淫巧。

1 安装 vim

通过包管理器安装,快捷方便;但是如果要添加某些功能,则需要从源代码编译安装。

1.1 使用包管理器

CentOS/Rocky Linux/Red Hat

sudo dnf install vim

Ubuntu/Debian

sudo apt install vim

1.2 源代码安装

git clone https://github.com/vim/vim.git
cd vim
./configure --with-features=huge --enable-python3interp=yes --prefix=/usr/local --with-python3-config-dir=/usr/lib64/python3.9/config-3.9-x86_64-linux-gnu
make -j8
sudo make install

如果中间有任何修改,需要清理掉中间结果后重新编译:

make clean distclean
make clean

安装好后,运行vim --version

vim --version输出
vim --version
    VIM - Vi IMproved 9.0 (2022 Jun 28, compiled Nov 28 2022 00:00:00)
    Included patches: 1-963
    Modified by <[email protected]>
    Compiled by <[email protected]>
    Huge version without GUI.  Features included (+) or not (-):
    +acl               +file_in_path      +mouse_urxvt       -tag_any_white
    +arabic            +find_in_path      +mouse_xterm       -tcl
    +autocmd           +float             +multi_byte        +termguicolors
    +autochdir         +folding           +multi_lang        +terminal
    -autoservername    -footer            -mzscheme          +terminfo
    -balloon_eval      +fork()            +netbeans_intg     +termresponse
    +balloon_eval_term +gettext           +num64             +textobjects
    -browse            -hangul_input      +packages          +textprop
    ++builtin_terms    +iconv             +path_extra        +timers
    +byte_offset       +insert_expand     +perl/dyn          +title
    +channel           +ipv6              +persistent_undo   -toolbar
    +cindent           +job               +popupwin          +user_commands
    -clientserver      +jumplist          +postscript        +vartabs
    -clipboard         +keymap            +printer           +vertsplit
    +cmdline_compl     +lambda            +profile           +vim9script
    +cmdline_hist      +langmap           -python            +viminfo
    +cmdline_info      +libcall           +python3/dyn       +virtualedit
    +comments          +linebreak         +quickfix          +visual
    +conceal           +lispindent        +reltime           +visualextra
    +cryptv            +listcmds          +rightleft         +vreplace
    +cscope            +localmap          +ruby/dyn          +wildignore
    +cursorbind        +lua/dyn           +scrollbind        +wildmenu
    +cursorshape       +menu              +signs             +windows
    +dialog_con        +mksession         +smartindent       +writebackup
    +diff              +modify_fname      +sodium            -X11
    +digraphs          +mouse             -sound             -xfontset
    -dnd               -mouseshape        +spell             -xim
    -ebcdic            +mouse_dec         +startuptime       -xpm
    +emacs_tags        +mouse_gpm         +statusline        -xsmp
    +eval              -mouse_jsbterm     -sun_workshop      -xterm_clipboard
    +ex_extra          +mouse_netterm     +syntax            -xterm_save
    +extra_search      +mouse_sgr         +tag_binary
    -farsi             -mouse_sysmouse    -tag_old_static
    system vimrc file: "/etc/vimrc"
        user vimrc file: "$HOME/.vimrc"
    2nd user vimrc file: "~/.vim/vimrc"
        user exrc file: "$HOME/.exrc"
        defaults file: "$VIMRUNTIME/defaults.vim"
    fall-back for $VIM: "/usr/share/vim"
    Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -DSYS_VIMRC_FILE=/etc/vimrc -D_REENTRANT -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
    Linking: gcc -Wl,--enable-new-dtags -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes -L/usr/local/lib -o vim -lm -lselinux -lncurses -lsodium -lacl -lattr -lgpm -Wl,--enable-new-dtags -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -fstack-protector-strong -L/usr/local/lib -L/usr/lib64/perl5/CORE -lperl -lpthread -lresolv -ldl -lm -lcrypt -lutil -lc

可以详细查看 vim 编译的详情。

2 基本使用 -> 在 vim 中活下来

在 linux 服务器上,有时候不得不面对漆黑的命令行。在 vim 没有额外配置下,开始使用 vim 就成了必备技能。 有一个关于 vim 的笑话是,stackoverflow 上点击率最高的问题是,如何从 vim 中退出。

2.1 在 vim 中活下来

直观思考,一个编辑器最重要的功能就是:

  • 打开/关闭文件
  • 添加/删除/修改字符
  • 保存或者放弃修改
vim path

这个path是文件或者文件夹,则有不同结果:

  • 文件 -> vim 普通界面
  • 文件夹 -> 通过上下箭头( )选择文件,通过Enter确认要编辑的文件

按键盘上的i键,进入INSERT mode(插入模式), 此时 vim 就是一个普通的编辑器。

  • 用键盘的上()下()左()右()或者h k l j 键来移动光标
  • 用翻页键PageUpPageDown在不同行之间移动
  • 用删除键BackSpace来删除前面一行的内容

所有编辑完成之后,按ESC退出插入模式,按: w q保存并关闭文件(w for write and q for quit).

到现在你已经学会了 vim,愉快滴用 vim 来提升你的工作效率吧。

3 更好地使用 vim

活下来肯定不是最终的目标,因为一些其他编辑器司空见惯的功能都还没有涉及到。而且 vim 不可能没有这些功能:

  • 选择
  • 复制
  • 粘贴
  • 替换
  • 选中多个对象

如果只使用 vim 的基本功能,就像只用一只手来操作键盘。为了更好地使用 vim,这里需要对 vim 进行一些深入了解:

  • 基本操作语法
  • vim 的三种模式
  • 光标移动
  • visual 模式

3.1 基本语法

vim 有多种模式,如:

  • Normal mode 普通模式
  • Insert mode 插入模式
  • Visual mode 视觉模型
  • Terminal mode 命令行模式

为啥一个编辑器有这么多种模式?还不是为了更好地编辑。

普通模式

普通模式就是把 vim 当成一个只读的阅读器,用于浏览整个文件。用 vim 打开一个文件,默认就是这个模式。这个模式下不牵涉到对内容的修改,所以可有更多的快捷键。

插入模式

插入模式,就涉及到对文件的编辑了。在普通模式下,按住i就可以切换到插入模式了。 此时再按快捷键,则只是修改编辑的文件。

视觉模式

命令模式就是在 vim 中输入命令,实现相关功能。当 vim 在普通模式的时候,输入:则进入命令行模式。此模式用于相关命令操作。

命令行模式

在 vim 中执行 shell 命令。

3.2 光标移动

通过键盘按键(而不是移动鼠标)来移动 vim 光标,这是 vim 高效的一个原因。

单字符移动

键盘的上()下()左()右()或者h k l j键可实现光标的字符移动。

h k l j是什么鬼?就是键盘上右手最熟悉的地方,并不是所有键盘都有显式的方向键,如果要使用方向键,则可能需要额外按住一些键,如shift。所以就选择了右手最熟悉的h k l j来实现。

单词移动

  • w 向右移动一个单词,word
  • b 向左移动一个单词,back

翻页

  • PageUp -> 往上翻一页
  • Ctrl + f -> 往前翻一页 forward
  • PageDown -> 往下翻一页
  • Ctrl + b -> 往后翻一页 back

行滚动

  • Ctrl + e -> 整体往上滚动一行
  • Ctrl + y -> 整体往下滚动一行

行位置调整

  • z t 光标位于顶部 t -> top
  • z z 光标位于中间 z -> 可能就是方便
  • z b 光标位于底部 b -> bottom

3.3 删除行

  • d d: 剪切掉当前行
  • p: 粘贴到光标下一行

4 vim 配置

主要目标是提升熟练程度。和一般的工具一样,vim 支持两种配置方式:

  • 使用配置命令进行配置
  • 使用配置文件进行配置

查看vim --version就可以看到配置文件的位置,如文件展示~/.vimrc拥有最高权限。单然,它的权限还是低于配置命令。这个也符合通常使用习惯,有什么临时修改就用命令来实现,而通过配置文件的方式,则可以实现永久修改。我的~/.vimrc配置如下:

set encoding=utf-8
set number # turn off via: set nonumber
syntax on
set autoindent
set tabstop=4
set expandtab
set wrap
set linebreak
set showmatch
set ruler
set background=dark
colorscheme iceberg
set list
set listchars=tab:>-

上面的每一条命令都可以 用: + 命令来实现,如: set number则开启行号,: set nonumber则关闭行号。

5 vim 第三方插件

5.1 原生包管理器

vim 的强大之处在于它拥有丰富的插件。在 vim8 之前,vim 第三方插件方式没有一个正式的官方实现。从 vim8 开始,vim 自己就带有一个插件管理器。从这里取得更多的信息。

原生包管理的方式就是将整个包文件夹放到某个固定文件夹中:

  • ~/.vim/pack/xxx/start/yyy
  • ~/.vim/pack/xxx/opt/yyy

其中放到start文件夹中的包会被自动加载,但是放到opt中的包需要通过packadd :yyy的方式加载。而且放到start文件夹中的包没有办法撤销载入。

5.2 常用插件

YouCompleteMe

这是一个自动补全的插件

mkdir -p ~/.vim/pack/plugins/start
cd ~/.vim/pack/plugins/start
git clone https://github.com/ycm-core/YouCompleteMe.git
cd YouCompleteMe
git submodule update --recursive --init
python3 ./install.py --all --verbose

nerdtree

这个用于 vim 的文件管理。

总结

本文介绍了 vim 的使用。包括 vim 的安装,vim 的最基本使用,以及一些常用快捷键的记忆方式。