这篇文章主要总结了我在使用 Vim 过程中遇到的一些问题及解决方案,都是一些比较零碎的内容,如果要看 Vim 系统的内容可以参考之前的几篇文章。

查看 Vim 使用的配置

在 vim 中输入

:script 来查看 Vim 加载使用的配置

查看 Vim 的版本

:version 来查看 Vim 的版本

在有一次使用 Vim 的时候总是无法将 Vim 选中的内容和系统粘贴板用到一起 "+y"+p 根本无法使用,后来经过网上一查, 通过 :version 一查才知道原来本地安装的 Vim 版本根本没有把 clipboard 支持编译进去。所有有的时候遇到问题第一时间检查一下版本还是比较重要的。

查看 Vim 中所有的快捷键映射

使用 :map 来查看当前 Vim 配置中所有的快捷键映射。

列选

  1. 进入 Visual Block Mode Ctrl + V
  2. 选中编辑的列
  3. Shift + i 进入编辑模式 Insert Mode
  4. 输入编辑
  5. esc 两次

批量缩进代码

如果使用VS,或者IDE的同学应该都知道,如果要批量缩进代码,在这些IDE中都能够选择+tab键实现,而Vim中则不太一样,之前困扰我很久,现在终于有了解决方案。在之前的文章中已经提到了Vim的模式,现在我们要用到其中的一种—-选择模式。

批量缩进代码的方式如下:

  • 按下 v , 进入选择模式
  • j/k 移动光标选择需要缩进行
  • 按一次> 缩进一次,按 < 回缩

如果是需要选中的行数比较多可以使用 数字num+j 方法移动num行,对于有括号 { } 的方法,例如

function functionName(){
// a lot of code
}

则可以使用 % 进行括号匹配, 按下 v 进入选择模式,将光标移动到 { ,按下 % ,Vim自动找到匹配的括号并选择该函数,利用 > 即可缩进该函数。

那么,其实单行缩进就是两个大于号 >> , 回缩就是两个小于号 <<

不重启使vimrc文件生效

在学习阶段,我经常改动vimrc文件,而每一次改动就要重启一下Vim,甚是烦恼。偶然间看到Google Group中有人讨论一些无关紧要的问题,其中看到写了不重启使vimrc文件生效的代码,尝试一下确实可行,做一下记录:

在命令模式下运行
:so #MYVIMRC
去帮助查看so,其实so是source的缩写

当然你也可以在vimrc文件中加入

"编辑vimrc之后,重新加载
autocmd! bufwritepost _vimrc source $VIM/_vimr

这样每一次保存vimrc文件就自动加载vimrc文件,使之生效。而如果在vimrc文件中存在函数,可能会遇到vim警告“函数 已存在,请加!强制替换”,同样讨厌,虽然作为新手的我还不知道为什么出现这些警告,但总之解决方法就是把vimrc中的函数全部定义成 function! 这种形式。但其实那些警告不影响效果,不定义成 function! 也行,但是很烦人。

均匀插入空行

均匀的在行与行之间插入空行,原先的空行保留。

Vim 的 :g 命令就是为类似的任务设计的,给每一行运行单独的命令。使用如下命令完成目标:

:g/.\n\n\@!/norm o

正则匹配 /.\n\n\@!/ ,拆分成不同部分来解释:

  • . 匹配行中所有字符。(这个例子中用来排除空行)
  • \n 匹配行末尾
  • \n\@! 如果有连续两个换行则匹配失败

用命令 :h E59 查看 \@! 更多信息。我们使用 :g 命令正则匹配到符合规则的行之后,我们告诉Vim执行 norm o ,也就是 Normal Mode 下的 o 命令,也就是在当前行下插入空行。

总结来说,这行命令匹配所有下一行不是空行的行,然后在他们下面增加一行空行。通过这个例子,你也许想要查看一下vim的wiki Power of G 来学习一下 :g 命令,已经它的姐妹命令 :v

This note is taken from superuser

从 vim 中复制到粘贴板

使用 shift+v 选中几行内容之后,如果只使用y 无法复制到系统的粘贴板中,此时在选中的情况下输入 "+y , 即可将所选内容复制到粘贴板。注意需要输入的是:引号+加号+ 小写y。

而这样做需要输入三次,可以使用 map 绑定到喜欢的快捷键上,比如:

vmap <C-c> "+y

这一行配置的含义就是在可视模式下,Ctrl+c,就是将所选择内容复制到粘贴板。 但是需要注意的是如果运行 :echo has('clipboard') 返回的结果是0,那么这个方法就没用,因为该版本的 vim 在编译的时候没有将 +clipboard 加入。

同理,如果想要从系统粘贴板中粘贴内容到 vim 中,使用 "+y or "*y, 引号+加号+y,来从系统粘贴板中将内容粘贴到 vim 中。

NERDTree Tip

Vim 中极好用的文件管理插件,用了也有一些时间了,但是有些内容并没有仔细地看,今天突然有些需求就看了一下。常用的 NERDTree 命令有:

  • o 打开或关闭文件或目录
  • i 在水平分割的新窗口打开文件
  • s 在垂直分割的窗口中打开文件
  • t 在新标签页中打开文件
  • j/k 移动
  • J/K 到第一个或者最后一个节点
  • ? 帮助菜单

创建目录与文件

打开 NERDTree,在 NERDTree 中使用m 然后选择a,来创建文件或者文件夹,要创建文件夹只需要在输入的名字后面加上/

删除文件与目录

同理,在 NERDTree 中按下 m 会由很多选项可选,使用 d 就可以删除结点,也就是删除文件或者文件夹。

显示隐藏文件

在 NERDTree 中使用Shift+i 来显示隐藏文件。

vim 删除偶数行

使用命令:

:g/^/+d

:g 命令在所有匹配正则的行上执行

:g/LinesMatchThisRegex/ExecuteThisCommand

举例:

:g/hello/d

以上命令会删除所有包含 “hello” 的行

而与此同时 :%s 仅仅提供正则的搜索和替换,命令最后的 g 表示全局,整个文件中

:%s/hello/world/g

因此该命令会替换文中所有的 hello 为 world.

:%s 中的 s 表示替换 (substitute) , 而 % 表示整个 buffer. 因此 :%s 表示从整个文件 buffer 中替换, :%s 还可以指定行范围:

:10,15s/hello/world/g

搜索并替换10至15行中的 hello 为 world.

快速移动

在 vim 中移动 hjkl, 左下上右移动光标已经不用多说, wb,向后向前移动一个 word。

gg 移动到第一行, G 移动到最后一行,这是最基本的,也可以使用 nG 来移动到第 n 行。

翻页技能,使用 Ctrl D 向下移动半页, Ctrl U 向上移动半页

Ctrl B 向上翻页, Ctrl F 向下翻页

* 号用来向下查找整个单词

# 号用来将光标移动到上一个在光标下的字符,比如光标正在单词 String 上,使用 # 来向上查找上一个 String。

% 百分号用来在匹配的括号之间跳转。

fx 光标跳转到下一个 x 位置,可以用来快速跳转到下一个预期的字符 x

Fx 向前跳跃到字符 x 位置

tx til 下一个 x,光标在 x 前面

Tx 上一个 x

让vim支持系统粘贴板

sudo apt install vim-gnome

配置 leader

配置的 leader 要在 map 之前

let mapleader = “,”

let g:mapleader = “,”

参考配置