标签归档:vim

Linux vim vi 翻页跳转命令快捷键

以下组合若没有特殊说明,基本都是键位组合。

vim翻页

vim翻半页

  • ctr-d:向后翻半页
  • ctr-u:向前翻半页

vim整整页

  • ctr+f:向后翻整页
  • ctr+b:向前翻整页

vim跳转

vim跳首行

  • g+g
  • :1
    第二种方式需要输入:
    先按shift+:
    再输入1

vim跳尾行

  • shift+g
  • :$
    第二种方式需要输入:
    先按shift+:
    再输入$

References

如何调试 Vim 脚本

来源: 如何调试 Vim 脚本

使用 -D 参数可以开启 Debug 模式, 在 Debug 模式中可以使用 cont, next, interrupt, step, quit 等调试命令, 以及 breakadd, breakdel 来添加和移除断点。 使用 -u 来禁止加载任何配置文件,使用 :source 命令逐个加载。 使用 :set verbose:set verbosefile配置变量 可以设置日志级别和输出文件, -V 启动参数也可以起到同样的作用。

日志级别

在介绍 Debug 之前有必要先介绍如何查看运行日志,本文只介绍到日志级别的设置方法和日志文件的设置方法。 日志级别是由 verbose 配置变量 控制的。这是一个默认为零的数字,级别越高输出越详细。 verbose 非零时 Vim 就会在当前窗口显示日志信息,例如 :set verbose=20 就可以开启几乎所有日志。 这些级别的描述如下:

>= 1    读写 viminfo 文件时
>= 2    当 ":source" 一个文件时,通常是载入一个配置文件
>= 5    所有搜索到的 tag 文件和 include 文件
>= 8    执行到 autocommands 的文件
>= 9    每次执行到 autocommand 时
>= 12   每次执行到 function 时
>= 13   产生、捕获、结束处理、忽略一个异常时
>= 14   ":finally" 语句中等待的所有命令
>= 15   每一个执行到的 Ex 命令(截断到 200 字符)

更多 verbose 选项变量的信息可以参考 :help vbs。 日志级别也可以通过 -V 启动参数来设置。例如:

vim -V20 main.cpp

日志文件

如果你试过上述日志级别的设置方式会发现日志直接输出在当前屏幕,这会影响在当前 Vim 中的连贯操作。 我们可以通过 :set verbosefile 把日志输出到文件中。例如把它输出到 vim.log 文件:

set verbosefile=vim.log

然后在另一个 Shell 中 tail 这个文件,我们就可以一边使用 Vim 一边查看它的日志了:

tail -f vim.log

更多 verbosefile 选项变量的信息可以参考 :help verbosefile。 日志文件也可以通过 -V 启动参数来设置。例如设置级别为 20,输出文件名为 vim.log

vim -V20vim.log main.cpp

注意级别与文件名之间不能加空格,且文件名不得以数字开头(否则会被识别为级别的一部分)。

零配置启动

有时为了定位问题,我们可以禁止 Vim 自动加载配置文件和插件,手动地逐个加载 Vim 脚本。 需要先零配置启动 Vim,通常设置 -u 即可:

vim -u NONE main.cpp

如果你在使用 GVim 可能需要使用 -U,具体情况可参考 :help -UStackOverflow。 启动后使用 :source {filename} 命令来逐个加载 Vim 配置即可。

Debug 方法

在启动 Vim 时添加 -D 参数即可开启调试模式,Vim 会在第一行配置文件出中断并进入 Debug 模式:

vim -D main.cpp

中断后会进入 Debug 模式,你可以看到 > 提示符。此时你就可以输入 Debug 命令,操作方式和 gdb 非常类似:

  • cont: 继续执行直到下一个断点。
  • quit: 停止当前过程,继续执行到下一个断点。
  • step: 执行当前断点处的指令,执行完后仍然回到 Debug 模式。
  • next: 与 step 一样,但会直接执行完整个方法调用和文件引入(source)
  • interrupt: 停止当前过程,执行下一个命令前回到 Debug 模式。
  • finish: 执行完当前脚本或方法调用,回到 Debug 模式。

掌握 Debug 命令后下一个事情就是打断点,可以在函数和文件的相应行号处添加断点:

breakadd func [lineNumber] functionName
breakadd file [lineNumber] fileName
breakadd here

同样的语法可以用来移除断点,关键字从 breakadd 换为 breakdel

breakdel func [lineNumber] functionName
breakdel file [lineNumber] fileName
breakdel here

还可以按照编号移除 breakdel {number} 和移除全部 breakdel *。 更详细的参数和命令可以参考 :help debug

小技巧

上述日志和调试命令已经足够定位 Vim 脚本的问题了。 下面介绍几个小技巧可以方便一些场景下的操作:

像 Chrome 控制台一样,可以 Debug 某个命令:

:debug CommandName

也可以直接 debug 某个函数,不需要 Vim 先进入 Debug 模式:

:debug call Foo()

类似地,日志级别也可以在调用函数时进行设置:

:20verbose call Foo()

References

Vim 下大小写敏感的搜索-替换

来源: Vim 下大小写敏感的搜索/替换

Vim 中的搜索默认是大小写敏感的,即搜索 vim 不会匹配到 Vim。 这一点跟多数编辑器/IDE 都不同,因此 Vim 的默认设置其实很不顺手。 本文来分享一些个性化的配置方法,让 Vim 下的大小写敏感/不敏感用起来更加顺手。 比如当搜索词包含大写时应用大小写敏感搜索;其他情况应用大小写不敏感搜索。

TL;DR

以搜索词为 harttle 为例(省略了最后的回车):

  • 强制大小写不敏感搜索:/harttle\c
  • 强制大小写敏感搜索:/harttle\C
  • 强制大小写不敏感替换:s/harttle\c/Harttle
  • 强制大小写敏感替换:s/harttle\C/Harttle
  • 设置为大小写敏感::set ignorecase
  • 设置为大小写不敏感::set noignorecase
  • 设置为智能模式(有大写时敏感否则不敏感)::set smartcase
  • 设置为非智能模式::set nosmartcase

大小写敏感控制字符

正如在正则表达式有类似 i 这样的开关,Vim 也有特殊字符来控制大小写敏感。 在模式末尾加 \c 表示大小写不敏感,加 \C 表示大小写敏感。 例如:

" 大小写不敏感搜索,可以匹配:vim, Vim, VIM
/vim\c
<CR>
" 大小写敏感搜索,只可以匹配:Vim
/Vim\C
<CR>
" 把出现的所有 vim, Vim, VIM 等都替换为 Vim,在写文章时会经常会用到
:%s/vim\c/Vim/g

这一语法的优先级高于下文的 ignorecase, smartcase 等选项, 所以比较万能,在远程机器上、别人的电脑上,一般用这个操作。

ignorecase/smartcase

Vim 中的 ignorecase 用于设置大小写敏感,它将在所有搜索、替换命令中生效。 在 normal 模式中 :set ignorecase 设置为不敏感;:set noignorecase 设置为敏感。 ignorecase 属于选项变量,因此也可以通过 & 来设置,例如::let &ignorecase=1。 把冒号去掉后可以直接放到 .vimrc 文件里持久生效。

更多 Vim 变量赋值和引用的细节,可参考这篇文章:Vim 中的变量赋值、引用与作用域

开启 ignorecase 之后还可以把 smartcase 也打开(后者要求前者出于开启状态), Vim 会启用智能模式:

  • 在你输入的模式中包含大写时,启用大小写敏感模式;
  • 在你输入的模式中只有小写时,启用大小写不敏感模式。

例如:

:set ignorecase
:set smartcase

" 大小写不敏感,可以匹配:vim, Vim, VIM
/vim
<CR>
" 大小写敏感,只可以匹配 Vim
/Vim
<CR>"

当前词搜索

smartcase 只对输入的模式(pattern)生效,其他不需要输入 pattern 的搜索命令不生效。 比如 在 Vim 中优雅地查找和替换 中介绍过可以用 *(向后),#(向前),g*(不切词)等命令来搜索光标所在的词搜索光标所在的词。 为了让它们好使,可以先按下 * 来搜索一次,然后按下 /(向后)再按上箭头找到上次历史(这是一个具体的 pattern)再按回车搜索。同样地,按 ?(向前)也可以。

“展开光标所在词”是存在 Vim 命令的,因此我们可以把 *, # 映射掉来自动化上面的过程:

" respect to smartcase, expand the pattern
:nnoremap * /\<<C-R>=expand('<cword>')<CR>\><CR>
:nnoremap # ?\<<C-R>=expand('<cword>')<CR>\><CR>

这样下次按下 *# 时,Vim 就会展开光标处的词,分别应用 /? 进行搜索。 这样当光标处的词有大写时就用大小写敏感搜索,全小写时就用大小写不敏感搜索。 <C-R>= 用来插入计算表达式并插入到命令里,类似我们在 使用 Vim 寄存器 中介绍的 <C-R>" 可以把匿名寄存器(上次拷贝、剪切、删除)的内容插入到命令里。

References

Vim 使用系统剪切板

来源:Vim 使用系统剪切板

Vim 是运行在 Terminal 里的 Shell 程序,所以要把内容拷贝出来可以通过 Terminal,也可以通过 Vim 自己。不配置 Vim 剪切板时只能通过 Shell 来拷贝粘贴:

  • 通过 Shell 拷贝(比如在 iTerm 里按住 Alt 选取内容)会有问题:比如会包含 Vim 左侧行号、折行变成了换行。
  • 通过 Shell 粘贴有类似的问题:相比于 p 命令,在插入模式下 Ctrl+V 时 Vim 会把内容当作字符键入,触发 Vim 的所有处理键入的插件,比如自动补全、语法检查等。不仅会很慢,而且可能会破坏你的内容(比如粘贴一对括号,可能 Vim 会再帮你自动补全一个多余的右括号)。

所以完美的拷贝粘贴一定要通过 Vim 本身。Vim 中 p(paste)、d(delete)、y(yank)等拷贝粘贴操作使用的是 匿名寄存器 ""(unnamed register),本文就来解释怎么在 Mac/Windows/Linux 上把 Vim 的 匿名寄存器 映射到操作系统的剪切板。

TL; DR

  1. 确保你的 vim 支持剪切板,通过 vim --version | grep clipboard 检查。
  2. 确定你的剪切板寄存器是 "+(XA_SECONDARY)还是 "*(XA_PRIMARY)。
  3. 同步剪切板和匿名寄存器,在 ~/.vimrc 添加配置比如 set clipboard=unnamed

确保你的 Vim 支持剪切板

你的 Vim Build 没有支持 clipboard,那么无论怎样配置都不会生效。 可以用如下命令检查:

vim --version | grep clipboard

如果输出包含 +clipboard+xterm_clipboard 就支持,如果这两项都是 - 则不支持。例如我的 Vim 输出为(MacOS 上的 macvim):

+clipboard         +keymap            +printer           +vertsplit
+emacs_tags        -mouse_gpm         -sun_workshop      -xterm_clipboard

如果你的 Vim 不支持剪切板,则需要重新安装一个带 clipboard 的 Vim:

重新安装后再执行 vim --version 来查看 clipboard 是否支持。注意:如果安装到了其他路径你需要改 PATH 或重启 Terminal。

确定你的剪切板寄存器

Vim 有 48 个寄存器,y, d, p 等命令一般使用匿名寄存器 "", 支持剪切板的 Vim 会支持额外的选区寄存器 "*"+。 更多 Vim 寄存器的信息,可以参考这篇文章:Vim 寄存器完全手册

"*"+ 在 Mac 和 Windows 中,都是指系统剪切板(clipboard),例如 "*yy 即可复制当前行到剪切板。 其他程序中复制的内容也会被存储到这两个寄存器中。 在 X11 系统中(绝大多数带有桌面环境的 Linux 发行版),二者是有区别的:

  • "* 指 X11 中的 PRIMARY 选区,即鼠标选中区域。在桌面系统中可按鼠标中键粘贴。
  • "+ 指 X11 中的 CLIPBOARD 选区,即系统剪切板。在桌面系统中可按 Ctrl+V 粘贴。

上述哪个寄存器对应于你的剪切板和 Linux 发行版有关,在配置 Vim 前可以测试一下。 比如用 Vim 打开一个文件,在 normal 模式下(进入 Vim 后默认的模式)键入 gg"*yG, 来把当前文件内容拷贝到 "* 寄存器。键入 gg"+yG 拷贝到 "+ 寄存器。

到目前为止,你已经可以通过命令来拷贝粘贴内容了。接下来我们希望通过 Vim 配置, 让匿名寄存器和系统剪切板同步。

同步剪切板和匿名寄存器

以下配置可以让主选区寄存器 "* 和匿名寄存器 "" 保持同步(即共享剪切板), 一般适用于 Windows 和 MacOS,Linux 下的表现是共享 X11 剪切板、PRIMARY 选区(鼠标中键粘贴)。

set clipboard=unnamed

Vim 7.3.74 及以上支持了 unnamedplus:

set clipboard=unnamedplus

即让剪切板寄存器 "+ 和匿名寄存器 "" 保持同步, Linux 下一般对应于桌面系统的剪切板,比如 GNOME 的系统剪切板、以及 SECONDARY 选区(Ctrl+V 粘贴)。

不支持 clipboard 的情况

如果你的 Vim 不支持 clipboard 且没法升级或其他 clipboard 选项不好使的情况, 可以调用外部命令来实现拷贝粘贴,在 Vim 里直接调用,或设置快捷键调用。 比如 让 Tmux 远程 Vim 使用本地系统的剪切板

如果在 MacOS 下,可以用 pbcopy/pbpaste 命令来实现。

  • 拷贝一段文本:先按 v 进入 visual 模式选中后执行 :w !pbcopy。拷贝整个文件可以 :%w !pbcopy
  • 粘贴一段文本:把光标移动到要插入的行,执行 :r !pbpaste

如果在 Linux 下,可以借由 xclip 来实现。用 xclip -i -sel c 代替上面的 pbcopy,用 xclip -o -sel -c 代替上面的 pbpaste

References

Vim 寄存器完全手册

转载自 Vim 寄存器完全手册

常见文本编辑器都会提供剪切板来支持复制粘贴,Vim 也不例外。 不同的是 Vim 提供了 10 类共 48 个寄存器,提供无与伦比的寄存功能。 最常用的 y 操作将会拷贝到默认的匿名寄存器中,我们也可以指定具体拷贝到哪个寄存器中。

一般来讲,可以用 "{register}y 来拷贝到 {register} 中, 用 "{register}p 来粘贴 {register} 中的内容。例如: "ayy 可以拷贝当前行到寄存器 a 中,而 "ap 则可以粘贴寄存器 a 中的内容。

除了 a-z 26 个命名寄存器,Vim 还提供了很多特殊寄存器。合理地使用可以极大地提高效率。例如:

  • "+p 可以粘贴剪切板的内容,
  • ":p 可以粘贴上一个 Vim 命令(比如你刚刚费力拼写的正则表达式),
  • "/p 可以粘贴上一次搜索关键词(你猜的没错,正是 normal 模式下的 /foo 搜索命令)。

在 Vim 中可通过 :reg 来查看每个寄存器当前的值。

寄存器分类

Vim 提供了 10 类寄存器,可在 Vim 中通过 :help registers 查看帮助。

  1. 匿名寄存器 ""
  2. 编号寄存器 "0"9
  3. 小删除寄存器 "-
  4. 26 个命名寄存器 "a"z
  5. 3 个只读寄存器 ":, "., "%
  6. Buffer 交替文件寄存器 "#
  7. 表达式寄存器 "=
  8. 选区和拖放寄存器 "*, "+, "~
  9. 黑洞寄存器 "_
  10. 搜索模式寄存器 "/

1. 匿名寄存器

使用 d, c, s, x 等会删除字符的命令时,被删除字符会进入匿名寄存器 ""。 你可以认为 "" 寄存器是一个指针,指向刚才被存到的寄存器。

如何用 Vim 搭建 IDE ? 一文中提到,Mac 下可通过下列设置来让 Vim 共享系统剪切板, 就是这个原理:所有删除和拷贝操作默认都会到匿名寄存器。

set clipboard=unnamed

使用 y 命令未指定寄存器会存到 "0 寄存器中,同时 "" 会与该寄存器保有同样的值。 这意味着你使用 p"p 总会得到同样的结果。

2. 编号寄存器

编号寄存器从 "0"9 共 10 个,其中 "0 保存着拷贝来的字符串,"1"9 保存着删除掉的字符串。 删除操作符包括 s, c, d, x。 删除掉的字符串会被存到 "1 中,上次删除的则会被存到 "2 中。以此类推,Vim 会保存你最近的 9 次删除。

  • 只有整行整行的删除,和通过段落级别的移动指令(包括 %,(,),/,`,?,n,N,{,}) 的删除才会被放到 "1 中。
  • 当用户指定拷贝操作的寄存器时(如 "ap),"0 不会被写入;但删除操作一定会被写入到 "1 中。

"0 寄存器很有用,比如我们 copy 了一段文本然后用它替换另一段文本。 这时默认寄存器 "" 中的值就变成了被替换文本,如果还需要用 copy 的文本继续替换的话就需要 "0p 了。

3. 小删除寄存器

不足一行的小删除则会被放到小删除寄存器中("-),起作用的删除操作符也包括 s, c, d, x。 例如:

dw    # 删除一个词
d9l   # 删除9个字符
cb    # 向前更改一个词

"0 寄存器类似,当用户指定寄存器并进行删除时,"- 不会被写入。

4. 命名寄存器

命名寄存器有 "a"z 共 26 个,这些寄存器只有当我们指定时才会被使用。 其实我们在录制宏时,所有键盘操作会以字符串的形式存到寄存器中。 例如录制一个宏存到 "a 寄存器中,内容为更改当前行 cc,改为 foo 字符串:

qaccfoo

然后执行 :reg 来查看寄存器,可以发现 a 寄存器的值是 ccfoo

小技巧:当使用小写字母进行操作时会覆盖当前寄存器内容,当使用大写字母进行操作时,会追加当前寄存器内容。

5. 只读寄存器

只读寄存器共 3 个,它们的值是由 Vim 提供的,不允许改变:

  • ".:上次 insert 模式中插入的字符串。还记得吗? . 命令可以重复上次操作,而 ". 存储了上次插入。
  • "%:当前文件名,不是全路径,也不是纯文件名,而是从当前 Vim 的工作目录到该文件的路径。例如此时 Harttle 的 Vim 中,"%p 的结果为 _drafts/vim-registers.md
  • "::上次命令模式下键入的命令。正如 @a 可以执行 "a 寄存器中的宏一样,@: 可以执行上次命令。

6. 交替文件寄存器

交替文件寄存器 "# 存储着当前 Vim 窗口(Window)的交替文件。交替文件(alternate file)是指 Buffer 中的上一个文件,可通过 Ctrl+^ 来切换交替文件与当前文件。

Window 和 Buffer 有什么区别?参见 Vim 多文件编辑:窗口 一文。

7. 表达式寄存器

表达式寄存器 "= 主要用于计算 Vim 脚本的返回值,并插入到文本中。 当我们键入 "= 后光标会移动到命令行,此时我们可以输入任何 Vim 脚本的表达式。 例如 3+2,按下回车并且 p 则会得到 5

这在我们调试 Vim 脚本时非常有用,比如调用一个函数看它是否有正确的返回值。

8. 选择和拖放寄存器

选择和拖放寄存器包括 "*, "+, 和 "~,这三个寄存器的行为是和 GUI 相关的。

"*"+ 在 Mac 和 Windows 中,都是指系统剪切板(clipboard),例如 "*yy 即可复制当前行到系统剪切板。 其他程序中复制的内容也会被存储到这两个寄存器中。 在 X11 系统中(绝大多数带有桌面环境的 Linux 发行版),二者是有区别的:

  • "* 指 X11 中的 PRIMARY 选区,即鼠标选中区域。在桌面系统中可按鼠标中键粘贴。
  • "+ 指 X11 中的 CLIPBOARD 选区,即系统剪切板。在桌面系统中可按 Ctrl+V 粘贴。

上文所述的 Mac 下 set clipboard=unnamed 会使得系统剪切板寄存器 "* 和 Vim 默认的匿名寄存器 "" 始终保有同样的值,即 Vim 和系统共用剪切板。

有文本拖拽到 Vim 时,被拖拽的文本被存储在 "~ 中。Vim 默认的行为是将 "~ 中内容插入到光标所在位置。 当然你可以给 `

` 做键盘映射。 ## 9. 黑洞寄存器 黑洞寄存器 `”_`,所有删除或拷贝到黑洞寄存器的文本将会消失。 这是为了在删除文本的同时不影响任何寄存器的值,`”_` 通常用于 Vim 脚本中。 ## 10. 搜索寄存器 搜索寄存器 `”/` 用于存储上一次搜索的关键词。Vim 中如何进行搜索呢? 在 normal 模式下按下 `/` 即进入 search 模式,输入关键字并按下回车即可。 该寄存器是可写的,例如 `:let @/ = “harttle”` 将会把 `”harttle”` 写入该寄存器。 下次搜索时不输入搜索词直接回车便会搜索 `”harttle”`。 ## 命令行模式拷贝 值得一提的时,任何寄存器中的值都是可以拷贝到命令模式下的。 比如对于寄存器 `”a` 中的值,在 normal 模式下可以通过 `”ap` 来粘贴;在 command-line 模式下通过 `a` 来粘贴。这一操作存在风险,因为寄存器中的值可能是从网页中拷贝来的。 如果寄存器中的字符串存在 ` ` 字符或 “ 字符,则会时 Vim 回到 normal 模式, 并继续执行寄存器中的命令。为了防范 _剪切板劫持_,可以添加下列的 Vim 配置: “` inoremap + u”+gP “` > 该命令的解释请移步:[http://vim.wikia.com/wiki/Pasting_registers](http://vim.wikia.com/wiki/Pasting_registers) ## 扩展阅读 – 剪切板与 X11 选区:[http://stackoverflow.com/questions/11489428/how-to-make-vim-paste-from-and-copy-to-systems-clipboard](http://stackoverflow.com/questions/11489428/how-to-make-vim-paste-from-and-copy-to-systems-clipboard) – Vikia-Pasting Registers: [http://vim.wikia.com/wiki/Pasting_registers](http://vim.wikia.com/wiki/Pasting_registers) – Vim Help: `:help registers`, `:help quotestar`, `:help quoteplus` # References – [Vim 寄存器完全手册](https://harttle.land/2016/07/25/vim-registers.html)

Vim 宏录制和重放

TL;DR

  1. qa: 录制到寄存器 a 中,可使用 a-z 26 个命名寄存器
  2. 开始操作,做的所有操作都会录制下来,重放时自动操作;
  3. q: 结束录制
  4. @a 重放一次;
  5. 100@a 重放100次;

例子

在编辑某个文件的时候,可能会出现需要对某种特定的操作进行许多次的情况,以编辑下面的文件为例:

;=====================================================================================;This is a sample configuration file when upgrading XXX using InstallShield.;Author:        ini_always;Date:          8/24/2011;Last modified: 9/20/2011;Note: Install script does NOT verify whether the configuration file is in a "WELL";format, a WRONG format may lead to installation failure.;If more information is needed, please check the document for details.;=====================================================================================

这是一个 ini 类型的配置文件,可以看到每一行的最前面有一个逗号,现在如果需要将每行前面的逗号去掉,怎么办?在第一行行首按x,然后按j,然后按x…这样重复下去?确实,我最开始也是这样的,但如果这个文件有100行要这样修改呢?或者1000行?

好吧,少废话,进入正题。所谓宏,在vim里面是指某种特定顺序的一系列操作,我们可以录制自己的操作序列,然后重复这个序列多次,以简化某种重复的操作。vim宏有录制和播放的过程,录制就是你教给vim该怎么操作,播放就是vim照着你教的进行自动操作。因此,对于上面的文件处理,首先要进行宏录制:

1.把光标定位在第一行;

2.在normal模式下输入qa(当然也可以输入qb, qc, etc,这里的a, b, c是指寄存器名称,vim会把录制好的宏放在这个寄存器中)(PS:如果不知道什么是vim的寄存器,请自行放狗搜之);

3.正常情况下,vim的命令行会显示“开始录制”的字样,这时候,把光标定位到第一个字符(按或者|),再按x删除,按j跳到下一行;

4.normal模式下输入q,结束宏录制。

好了,经过以上步骤,我们定义了一个存储在寄存器a中的宏,它的操作序列是:0->x->j,也就是跳到行首,删除,跳到下一行。

现在,第一行已经删除了行首的逗号,而且光标也已经在第二行,现在,在normal模式下输入@a,以播放我们刚录制好的存在寄存器a中的宏。于是,第二行行首的逗号也被删除,光标停在了第三行。

这也不简单啊?你肯定会这样想,要删除100行,我还得输入100个@a,我还不如手动删除呢。呵呵,vim早就想到了,输入7@a,好了,剩下的7行全部搞定了。(PS:在命令前面加数字,就是代表要执行这个命令多少次)

当然,这个例子很简单,但也很典型。利用好vim的宏,可以使一些原本很无聊的工作要简单很多。

References

Vim 替换文本

在vim中查找和替换命令需要在末行模式下执行。

命令 功能
:%s/旧文本/新文本/g 全局替换。
:s/旧文本/新闻本/g 可视区域替换。
:%s/旧文本/新文本/gc 确认替换。(推荐使用)

 全局替换

:%s/旧文本/新文本/g命令:用新文本一次性替换文件中所有出现的旧文本。

可视区域替换

:s/旧文本/新闻本/g命令:必须先要在可视模式下,选中替换文字的范围,然后才能局部替换。

确认替换

:%s/旧文本/新文本/gc命令:把末尾的”g”改为”gc”在替换的时候,会有提示。(推荐使用)

  • ①、”y” –> yes替换。
  • ②、”n” –> no不替换。
  • ③、”a” –> all替换所有。
  • ④、”q” –> quit退出替换。
  • ⑤、”l” –> last最后一个,并把光标移动到首行。
  • ⑥、”^E” –> 向下滚屏。
  • ⑦、”^Y” –> 向上滚屏。

References

#Vim

Vim 对比文件差异 | Linux 下同屏查看文件差异并修改

在 windows 下有如 Beyond Compare 这样的文本对比工具,而在 Linux 其实预装了很好用的文本对比工具 → vimdiff

使用方法很简单:

vimdiff [options] file1 file2 [file3 [file4]]

比如这样:

vimdiff Release Release.new

效果是这样的:

https://imagehost-cdn.frytea.com/images/2021/11/08/2021-11-08-12-28-16e0dfc839621b06b8.png

可以使用 Ctrl + w + 方向键 # 切换到前/下/上/后一个窗格 切换窗格,使用 i 进行编辑,操作同多窗口 Vim ,使用起来很方便,效果很惊艳,效率很高。

参考文献

Vim安装插件管理器Vundle

安装vundle

$ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

默认安装在/.vim/bundle/vundle下;

配置说明:

插件有三种类型:

  1. Github上vim-scripts仓库的插件
  2. Github上非vim-scripts仓库的插件
  3. 不在Github上的插件 对于不同的插件,vundle自动管理和下载插件的时候,有不同的地址填写方法,有如下三类:
  1. 在Github上vim-scripts用户下的仓库,只需要写出repos(仓库)名称
  2. 在Github其他用户下的repos, 需要写出”用户名/repos名”
  3. 不在Github上的插件,需要写出git全路径

配置vundle插件:

可以在终端通过vim打开~/.vimrc文件,

$ vim ~/.vimrc

将以下加在.vimrc文件中,加入之后保存之后就可以使用vundle了。

添加的配置信息(样例)注:以后安装新插件就直接编辑vimrc,添加plugin就行了,在这里我们添加的plugin只是例子,你可以不安装这些插件,换上自己需要安装的插件。

set nocompatible              " 去除VI一致性,必须要添加
filetype off                  " 必须要添加

" 设置包括vundle和初始化相关的runtime path
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" 另一种选择, 指定一个vundle安装插件的路径
"call vundle#begin('~/some/path/here')

" 让vundle管理插件版本,必须
Plugin 'VundleVim/Vundle.vim'

" 以下范例用来支持不同格式的插件安装.
" 请将安装插件的命令放在vundle#begin和vundle#end之间.
" Github上的插件
" 格式为 Plugin '用户名/插件仓库名'
Plugin 'tpope/vim-fugitive'
" 来自 http://vim-scripts.org/vim/scripts.html 的插件
" Plugin '插件名称' 实际上是 Plugin 'vim-scripts/插件仓库名' 只是此处的用户名可以省略
Plugin 'L9'
" 由Git支持但不再github上的插件仓库 Plugin 'git clone 后面的地址'
Plugin 'git://git.wincent.com/command-t.git'
" 本地的Git仓库(例如自己的插件) Plugin 'file:///+本地插件仓库绝对路径'
Plugin 'file:///home/gmarik/path/to/plugin'
" 插件在仓库的子目录中.
" 正确指定路径用以设置runtimepath. 以下范例插件在sparkup/vim目录下
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
" 安装L9,如果已经安装过这个插件,可利用以下格式避免命名冲突
Plugin 'ascenator/L9', {'name': 'newL9'}

" 你的所有插件需要在下面这行之前
call vundle#end()            " 必须
filetype plugin indent on    " 必须 加载vim自带和插件相应的语法和文件类型相关脚本
" 忽视插件改变缩进,可以使用以下替代:
"filetype plugin on
"
" 常用的命令
" :PluginList       - 列出所有已配置的插件
" :PluginInstall     - 安装插件,追加 `!` 用以更新或使用 :PluginUpdate
" :PluginSearch foo - 搜索 foo ; 追加 `!` 清除本地缓存
" :PluginClean      - 清除未使用插件,需要确认; 追加 `!` 自动批准移除未使用插件
"
" 查阅 :h vundle 获取更多细节和wiki以及FAQ
" 将你自己对非插件片段放在这行之后

安装需要的插件

  1. 将想要安装的插件,按照地址填写方法,将地址填写在vundle#beginvundle#end之间就可以
  2. 保存之后,有两种方法安装插件。

(1) 运行 vim ,再运行 :PluginInstall

$vim
:PlugInstall

(2) 通过命令行直接安装 vim +PluginInstall +qall

vim +PluginInstall +qall

安装完成之后,插件就可以使用。

移除不需要的插件

  1. 编辑.vimrc文件移除的你要移除的插件所对应的plugin那一行。
  2. 保存退出当前的vim
  3. 重新打开vim,输入命令BundleClean

其他常用命令

  1. 更新插件BundleUpdate
  2. 列出所有插件BundleList
  3. 查找插件BundleSearch

参考文献