0. Vim的 可视模式 有三个不同的版本: character mode(按字符), line mode(按行), block mode(按区域). 

  • Character mode: v (lower-case)
  • Line mode: V (upper-case)
  • Block mode: Ctrl+v     用于操作表格类的数据

character mode 应用

如何从一个地方移动一段话到另外一个地方?

v ->  w或 nl 或 fn ->  d  ->  ngg -> p

将鼠标放置在这段话的第一个字符,然后 v,然后选择这段话到末尾,然后d,找到另外一个地方并按p粘贴即可,其中 nl是向右移n个字符,n为一个数字。 fn是向右寻找第一个n,n可以换成其他字符,ngg是快速切换到另外一个地方。  这个命令也可以 将 d 删除 改为 y 复制,即复制一段话到一个另外的地方。

如何直接修改一个语句?

v ->  w或 nl 或 fn ->  c  ->  输入你的新语句 -> esc

将鼠标放置在这段话的第一个字符,然后 v,然后选择这段话到末尾,然后c,输入你的语句,然后esc即可,其中 nl是向右移n个字符,n为一个数字。 fn是向右寻找第一个n,n可以换成其他字符。

line mode 应用

如何从一个地方移动 几行 到另外一个地方?

这个问题和上面的问题很同质,只不过是 操纵的 单元不同,第一个问题是操纵的是语句,这个问题是操纵的 完整的一行或几行。

shift + v  ->  ngg或nj或nk -> d或y -> ngg -> p

shift+v进入到line mode中,然后ngg为选中多行,也可以使nj向下移动,n为数字表示向下选中n行。然后删除或是复制,找到另外一个地方进行粘贴p

如何将某几行统一的快速左移和右移?

shift + v -> ngg或nj或nk ->  >       快速右移

shift + v -> ngg或nj或nk ->  <       快速左移

block mode 应用

可用于验证ansible yaml或k8s yaml等文件的缩进情况,提早发现问题

ctrl + v -> ngg或njjj或nk或nl或nh 选中

通过高亮情况来查看是否缩进正常,如果不使用这种方式单凭肉眼去看比较困难。

多行增加注释和多行取消注释

可参照本文第11个问题

多行自动缩进

可参照本文第12个问题

1. 如何在两个不同的文件之间进行复制和粘贴呢?

这是我们经常在Linux下的操作,通过实践我发现了一个非常好的方法。

1.  vim  a.txt  b.txt         //使用vim打开两个文件分别为 a.txt 和 b.txt,当然也可以是三个或者多个

2.   一共三个命令:   :n  :N   :files

:n  编辑下一个档案

:N 编辑上一个档案

:files 查看vim开启的多个文档

在 a.txt中进行复制,比如: 10yy 复制十行数据,然后 :n  切换到下一个档案,然后到b.txt的指定位置,执行p粘贴操作,最后保存退出即可。

问题:键盘复制 a.txt 从某2行到某20行,然后切换到第二个文件的30行进行粘贴:

步骤一: 2gg -> V -> 20gg -> y       注意: 这里是大写的V,按行来进行选择。如果是剪切,不用y,使用d,还要保存一下a.txt

步骤二:  :n                                     切换到下一个文件

步骤三:30gg -> p                           转到第30行,然后粘贴即可

问题:键盘复制 a.txt 全部复制,然后:N切换,最后粘贴即可。

全选(高亮显示):命令模式  gg  ->  V  ->  G    注意这里是大V,是按行来进行选择

全部复制:命令模式gg  ->  y  ->  G   

删除从当前行到最后一行:命令模式  d    -> G   删除内容包括当前行。

或  :7,$d     假设当前在第7行,删除第7行至最后一行,$代表最后一行        

删除当前行到第一行: 命令模式   d -> gg    删除内容包括当前行。

或   : 1, . d       删除第一行到当前行,  "." 代表当前行, "$"代表最后一行

全部删除:命令模式  gg  ->  V  ->  G -> d   注意这里是大V,是按行来进行选择

2. 有时候编写一个大的文件,需要在后面对照这个文件前面的数据,最笨的方法就是前后移动,然后进行查看。其实有一个方法,我们可以通过 :sp 命令进行分割窗口,使同一个文件有两个不同的窗口。

1.   vim  a.txt

然后输入 :sp  或者 :sp  b.txt

2. 具体操作如下:

:sp [filename]开启一个新窗口,如果有加 filename, 表示在新窗口开启一个新档案,否则表示两个窗口为同一个档案内容(同步显示)。
[ctrl]+w+ j
[ctrl]+w+↓
按键的按法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键,然后再按下 j (或向下箭头键),则光标可移动到下方的窗口。
[ctrl]+w+ k
[ctrl]+w+↑
同上,不过光标移动到上面的窗口。
[ctrl]+w+ q其实就是 :q 结束离开啦! 举例来说,如果我想要结束下方的窗口,那么利用 [ctrl]+w+↓ 移动到下方窗口后,按下 :q 即可离开, 也可以按下 [ctrl]+w+q 啊!

本文参考了鸟哥私房菜的内容。

当从windwos的文件上传到了Linux里面,导致很多看到了很多 ^M符号,如何替换呢?

使用vim打开这个文件:

#vi abc.txt

:1,$ s/^M//g

^M 输入方法: ctrl+V ,ctrl+M

点击回车即可。

3. 单个文件中的内容复制,打开命令模式:

:1,20 co 25                   //把本文件中的第1-20 行复制到25行下边

4.命令模式下,跳到指定行

ngg/nG (跳转到文件第n行,无需回车)  或者 :n (跳转到文件第n行,需要回车)

5.命令模式下,另起一行,并进入到编辑模式。

o    向下面另起一行

O   向上面另起一行

cw 替换从光标所在位置后到一个单词结尾的字符

^ 移动到本行第一个不是blank字符的位置(所谓blank字符就是空格,tab,换行,回车等),向上的箭头,Ctrl+6

u  恢复上一次改变(undo)

ctrl + r  重做(redo)

.  重复上一个命令

N<command>  重复某个命令N次,例如 3p  重复粘贴3次

6. 同一行的左右的快速移动

3h  :  同一行内 左移3个字符

3l   :  同一行内右移3个字符

w 或 W 下一个单词的开头

b  或 B  上一个单词的开头

e  下一个单词的结尾:如果当前光标所在的字符是最后一个,按e则是下一个单词的结尾,如果当前光标所在是这个单词的其他字符,按e则是这个单词的结尾。

* 和 #:  匹配光标当前所在的单词,例如将鼠标放置在plugin上,这样按下 * 或 # 则可以在 <plugin> xxxx xxxx </plugin> 之间进行快速移动。

*  移动光标到下一个匹配单词,但实际键盘的输入为  shift + 8

#  移动光标到上一个匹配单词,但实际键盘的输入为 shift + 3

 |   移动光标到第1列,这不是l ,是 竖线,需要使用shift + \ 来输入。

n|  移动光标到第n列

7. 如何复制第2行的某个字符串(假设长度为10)到第3行?

首先将光标移动到这个字符串的开头,然后 v ->  10l  -> y -> 3gg -> w -> p

v是可视化选择,10l左移10个字符,y是复制,3gg是切换到第三行,w是在第3行将光标移动到需要粘贴的位置,这里仅是示例而已,真实情况你可能需要多个w来移动到多个字符串,或20l向右移动20个字符,然后p是粘贴。

比如我们现在有四行java的代码

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

当我想从第一行中复制 import org.springframework.boot   然后粘贴到第二行作为引入配置然后再输入.autoconfigure.SpringBootApplication;   这样我可以不用写那些重复的代码,可以很省时省力,那我如何操作呢。

gg  ->  v  ->  fS -> y  ->  :put -> $ -> a

gg 首先让光标到一行,

v 进入视图模式,

fS 找到下一个S的字符处(即 SpringApplication),

:put  用于粘贴到第二行,这个命令有点陌生; 当然你也可以是  o -> esc -> p

$  进入第2行的行尾

a  然后可以使用键盘输入 autoconfigure.SpringBootApplication;等等了

如下几个命令的解释:

  • fa → 到下一个为a的字符处,你也可以fs到下一个为s的字符,只能搜字符不能搜字符串
  • t, → 到逗号前的第一个字符。逗号可以变成其它字符。
  • 3fa → 在当前行查找第三个出现的a。
  • F 和 T → 和 f 和 t 一样,只不过是相反方向。

综上: 同一行内 可以使用 w、  10l、 fX 来快速移动光标

8.将内容复制到系统的剪贴板

上述几个步骤都是复制到vim的寄存器,无法与外界进行交互。

vim --version | grep "clipboard"

clipboard前面有一个减号,说明不支持

打开vim输入:reg查看vim的寄存器

安装vim-gnome

8.从外部文件复制数据到vim的文件中会出现直接粘贴有时会不对齐,缩进不正确,尤其是yaml文件,多余的空格或缺少空格会导致整个yaml文件不能用。

解决方法:  :set paste 再按i或o进行粘贴,格式就会正确

也可以由paste状态转换为nopaste,  :set nopaste ,这样就恢复了原来的设置。

10.整体将代码进行左移和右移

shift + > + > (向右移动) ,shift + < + <(向左移动)  //  需要按两下 >>  <<

:10,15>
第10行至第15行向右整体移动
:20,80<
第20行至第80行反缩进

11.多行增加注释和多行删除注释

多行增加注释:

ctrl + v  ->  ngg  -> I(大写的i)  -> 输入//  -> esc

第一步首先 ctrl+v 进入到 visual block模式,第二步然后依次选择要增加注释的行,可以使用j向下移动选择,也可以使用  ngg瞬间移动到第n行,其中n为第几行; 第三步是 I (这是大写的i,insert插入的意思),然后根据你的编程语言来 输入 // 或 # 进行注释,第四部 按 esc键即可。

同理这个功能除了多行增加注释//,也能插入其他字符,比如你 输入 123,则在多行的前面增加了123

多行删除注释

ctrl + v ->  ngg  -> x -> .

第一步首先 ctrl+v 进入到 visual block模式,第二步然后依次选择要增加注释的行,可以使用j向下移动选择,也可以使用  ngg瞬间移动到第n行,其中n为第几行; 第三步是x 删除,然后根据你的编程语言来删除注释,每次只能删除一个字符,例如:如果是Java则需要进行第四步,如果是python则完成,第四步 按  .  重复操作一次即可。

12. 自动缩进

ctrl + v  -> ngg -> =

第一步首先 ctrl+v 进入到 visual block模式,第二步 ngg来选择你的整个函数,第三步 =

你会发现vim直接给你自动的进行了标准缩进,你无需手动修改。

13. 翻页

翻下一页,Ctrl+f键 ,f 的英文全拼为:forward

              也可以使用 pagedown键

翻上一页,Ctrl+b键,b 的英文全拼为:backward

               也可以使用pageup键

翻下半页,Ctrl+d键,d 的英文全拼为:down

翻上半页,Ctrl+u键,u 的英文全拼为:up  

14. 快速删除全局line中的某些字符

:g/<pattern>/d

g代表是global全局,d是删除, <pattern>代表正则表达式,整条语句是说 将文件中每行匹配到<pattern>的行进行删除操作。

:g!/<pattern>/d

如果是将不匹配的删除,可以在语句中增加!代表反义,即将不匹配的每一行进行删除操作。

  • :g/foo/d    将删除包括foo字符串的每一行
  • :g!/foo/d   将删除不包括foo字符串的每一行
  • :g/^#/d       将删除开头为 # 的行,例如将python代码中的注释删除
  • :g/^$/d       将删除 所有空行,这个模式 ^$ 匹配所有空行,缺点是删除不了有多个空格的行
  • :g/^\s*$/d 将删除包含开头 \s的空格的行,*代表匹配前面的子表达式0次或多次

所以如果你使用命令删除文件中所有的空行,最好使用最后一个命令。

15. 快速将多行变一行

当我写代码的时候,我写完了<groupId> ,我复制yy了这一行并粘贴p了,在第二行中添加/ ,于是这时候有两行<groupId>,  我使用O 再将 具体命名写上,比如 com.example  整体如下图所示:

<groupId>
    com.example
</groupId>

我想将这三行快速变为一行,这在java项目的pom.xml中非常常见,J是将下一行与当前行合并但保留空格,而gJ是将下一行与当前行合并但不保留空格

首先切换为visual line模式,然后3j选中这三行,最后J将其粘合为一行。

shift + v  ->  3j  -> J

或将光标放置在 <groupId>那一行直接 3J也是可以

<groupId> com.example </groupId>

这样我们既少写了代码又能快速合并为一行,简单又快捷。

也或者:

:1,3 join   或 :1,3 j

1,3 是指 第1行到第3行合并为一行

重点:   gJ是将下一行与本行合并,且无空格。

当你 <groupId>的左侧、com.example的左侧、</groupId>的左侧 都没有空格,也就是说定格书写,使用 3gJ可以将其合并为一行,且没有多余的空格。

如果你的 <groupId>的左侧、com.example的左侧、</groupId>的左侧 有空格或tab,使用3gJ可合并为一行,但多余的空格将会保存。

整体如何操作?

当你写第一行<groupId>时候,直接定格写,然后定格写 com.example,再定格写 </groupId>

在直接3gJ将其合并为一行且没有多余的空格,最后使用ngg切换到<dependency>行,按下shift + v,然后xgg选择到</dependency>选中,使用 = 将其对其缩进,这样简单又方便。

其中 ngg是<dependency>所在的第n行,xgg是</dependency>所在的第x行

16. 进入编辑模式多种快捷键

一般我们都会使用a/A、i/I、r/R、o/O来进入编辑模式

a: 在当前光标所在位置之后插入随后输入的文本

A: 直接到行尾再进入到编辑模式

i :在当前光标所在位置插入随后输入的文本,光标后的文本相应向右移动

I : 在光标所在行的行首插入随后输入的文本,行首是该行的第一个非空白字符,相当于光标移动到行首执行 i 命令

r : 在当前光标所在位置进行替换

R : 进入替换并光标向后移动依次进行替换,并直到esc退出替换

s : 删除当前光标所在的字符,并进入到编辑模式

cc : 删除当前光标所在的行,并进入到编辑模式

C  : 删除当前光标到行尾的所有字符,并进入到编辑模式

更详细的教程请参考: 简明 Vim 练级攻略 | 酷 壳 - CoolShell

更多推荐

我记不住的那些vim操作