vim 常用命令记录

开始学习想学很久(或者说是说了很久要学的)的 vim 文本编辑器。虽然说接触了很久,好像从大一开始接触 Linux 系统就不得不与其打交道,但是对于其了解程度一直都处在 "存活期"。所以终于想要进一步学习,进入感觉良好期,甚至是更快更好更强的阶段。于是记录一下一些有用的命令,顺便练一下手,没错本篇博客就是用 vim 写的(完全就是瞎折腾,还发现了不少我觉得是 bug 的问题)。

学习阶段

能用

所谓的存活期,就是能用,知道怎么编辑,怎么保存。(好像这种地步就已经领先一大批人了,当然我也停滞在这里很久了) 基本上我们只要知道,怎样编辑,怎样保存,就可以用它来作为能用的文本编辑器了。包括下面的内容

  • 模式
    • Normal 模式:用于执行命令或者跳转。文件需要在该模式进行保存。
    • Insert 模式:进行文本输入。按 i 进入,按 Esc 退出到 Normal 模式。
  • 命令
    • i: 在 Normal 模式下进行 Insert 模式
    • x:在 Normal 模式删除光标所在字符
    • :wq: 保存退出
    • dd: 删除当前行,并将内容保存到剪贴板
    • p:将剪贴板内容粘贴出来
    • hjkl:在 Normal 模式下左下上右 d 移动光标(也可以使用方向键)

好用

能用之后就可以通过学习一下好用且常用的快捷键来提高使用快感和效率。

  • 插入模式
    • a : 光标后插入字符
    • o :光标下一行插入空行
    • O :光标上一行插入空行
    • cw :光标后至行末的字符被替换成空白
  • 光标跳转
    • 0 :行首
    • ^ :行首第一个非空字符
    • $ :行末
    • g_:行末第一个非空字符
    • /pattern :搜索 pattern,支持正则表达式,n 可以到下一个
    • nG :跳转到第 n 行
    • G :跳转到最后一行
  • yy :复制当前行内容
  • u :撤回操作
  • ctrl + b / ctrl + f: 上一页/下一页
  • 复制粘贴多行
    • 将光标移动到要复制的文本开始的地方,按 v 进入可视模式
    • 将光标移动到要复制的文本的结束的地方,按 y 复制。 此时 vim 会自动将光标定位到选中文本的开始的地方,并退出可视模式。
    • 移动光标到文本结束的地方,按 p 粘贴。

暂时先稳固在这一个阶段,基本都够熟悉很久了。

配置

在 Windows 上面的配置文件位于 $HOME_vimrc

  • 设置行号: set number
  • vim-plug:vim 的插件管理系统

enable and append configs

syntax on
set background=dark
filetype plugin indent on

set showmatch          " Show matching brackets.
set ignorecase         " Do case insensitive matching
set smartcase          " Do smart case matching
set incsearch          " Incremental search
set hidden             " Hide buffers when they are abandoned

set number " 显示行号
set cursorline " 突出显示当前行
set tabstop=4

set smartindent " 开启新行时使用智能自动缩进
set backspace=indent,eol,start " 不设定在插入状态无法用退格键和 Delete 键删除回车符
set cmdheight=1 " 设定命令行的行数为 1

Issues on Powershell

在 Powershell 里面使用 vim 总是会有一些奇奇怪怪的问题。

编辑

  • 退格键(Backspace)和删除键(Delete)偶尔失灵。常见于删除换行符的时候,尤其是删除空行。空行还可以使用命令 dd 来删除当前行。但是如果是删除之间两行的换行符使两行合并成一行时,就很尴尬。找到的解决方法是在配置文件中添加下面的退格设置,暂时问题不再出现。
set nocp
set backspace=2
  • 在中文输入的时候,键盘上的某些字符输入无效,需要切成英文输出才能输入。如符号、`,中文的引号和双引号。暂时还不知道怎么解决,使用英文符号凑合一下 😂
  • 中文输入的时候莫名会多打一些字母出来。

Git 的提交问题

因为是 Windows 系统,我使用的是 Git on Bash, 它是内置了一个 MINGW 的类 Unix 终端,里面也自带了 vim。当我们设置 Git 的提交编辑器为 vim 时,它会默认打开内部自带的 vim,而不是在 Windows 系统安装的 vim。本来这也没什么,但是它似乎是还扫描到了我在 Windows 系统上面的 vim 的配置文件,这就出问题了。我在 Windows 上面的 vim 安装了 vim-plug 插件管理,安装方式是直接下载配置脚本到目录下的 autoload 目录中,而 Git Bash 自带的 vim 没有这个文件,自然无法识别配置文件中的插件配置项,导致每次调用都会出错。大概的提示就是说载入配置文件的时候在插件配置那里出错了。

问题其实可以转化为:如何将 Git Bash 里面使用的 vim 换成本地 Windows 系统上面的 vim。搜索看了很多网页,看到的方法基本都不可行,包括:

  • 设置 alias 让 vim 指向 Windows 系统的 vim alias vim "/c/Program\ Files \(x86\)/vim/vim82/vim.exe" (这里路径的空格和括号都需要转义)。这样在 Git Bash 命令行调用 vim 确实调用到了 Win 上面的 vim,但 git commit 还是调用回自身的 vim
  • 设置 git config 里面的编辑器选项。默认使用 vim 的话编辑器设置是直接设成了 vim,但有人说可以设成一个路径,指向想要指向的 vim 程序。尝试后连 vim 都打不开了,添加一些选项也无果。
  • 环境变量中设置 EDITOR 变量。

最终我选择的方法是移除了 Git Bash 里面的 vim 程序(其所在路径为 /usr/bin/vim.exe),然后添加一个软连接 ln -s '/path/to/your/vim' /usr/bin/vim。因为在 Git Bash 里面调用的 vim 实际上是在调用 /usr/bin/vim ,而这个路径时间上映射到了 Git 安装路径中的 /usr/bin/vim.exe 。我通过移除原有的 vim 程序,建立新的软链接调用目标的 vim 程序,问题解决。在 Git Bash 中调用 vim 和在 git commit 开启编辑器都能成功开启 Windows 的 vim 程序而没有出错。但是有一个小问题,就是原生提供的 Git Bash 开启不了 vim,提示不是 Cygwin 能运行的版本,不过我现在都是在 Windows Terminal 上面使用,而 Windows Terminal 上面使用没有问题。