欢迎来到我的博客园

Linux vim 详解

Linux vim 编辑工具介绍

在linux上我们编辑脚本的时候都绕不过vim工具,vim内设的各种功能是vim具有非常强大的编辑能力,让我们快速的完成各种编辑任务。

vim和vi 区别

vi是vim的基础版本。vim是vi的升级强化版本。

vi的安装包是: vim-minimal-7.4.629-7.el7.x86_64

vim的安装包是: vim-enhanced-7.4.629-8.el7_9.x86_64 vim-common-7.4.629-8.el7_9.x86_64
 
从安装包的名字我们就可以看出来,vim的是vi的加强版本。
 

vim 模式

普通模式: 在普通模式中我们可以进行光标的移动,可以增删行,也可以重复执行。
命令模式 :在命令模式中我们可以进行文件内容的保存,搜索,替换,退出,显示行号,等操作。
插入模式: 在插入模式中,我们可以进行我们正常的文本输入。同时我们可以选择在上一行,或下一行,在行首,行尾,进行插入文件内容。
可视模式: 在可视模式中我们可以按块进行操作。可视模式分为字符文本,行文本和块文本三种模式
 
我们键盘每个按键对应的命令如下:将按分类逐个说明:
 

 

vim 光标的移动(motion)

当我们在普通模式的时候,我们想移动光标我们需要使用一些命令,通常我们可以使用键盘的上下左右键来移动光标,但由于键盘的设置,上下左右键在另一半边,我们去找上下左右键就很麻烦。
在vim中我们可以按字符移动光标,也可以按字符串方式移动光标。
1 按字符串方式移动光标(其实j k也是按行移动了)
于是vim自己设定了一个控制光标上下左右的方式。就是我们键盘的hjkl四个键,其中 hl在两边,控制光标的左右移动,使用 h向左移动光标,使用l光标向右移动。 而jk在中间,控制光标的上下移动,j在左边控制光标向上移动,k在右边控制光标向下移动。
                  j ↑
      ←h              l→
                 k↓
 
2 按字符串移动光标
另外vim还有以字符串移动的一些按键,例如w ,e ,b三个 键以及ge组合键。
w 会移动到后一个字符串的起始。自己的第一个字符会被排除。
e 会移动到当前字符串的末尾,不会停止在空行上。
b 会移动到前一个字符串的起始。
假定: 当前文本内容。
Monday Tuesday Wednesday

Thursday Friday Saturday

w命令实验(w移动到下一个字符串的起始位置,当前字符串第一个字符被排除)
   假如当前光标在Friday F处,按下w键后,F是当前字符串的第一个字符串,会被排除掉,所以光标会移动到下一个字符串Saturday首字母处
   假如当前光标在Saturday S处,按下w键后,由于Saturday已经是本文将的最后一个字符串,光标会移动到Saturday文件末尾y的位置
   假如当前光标在Wednesday W处,按下w键后,Wednesday 是本行的最后一个字符串,光标会移动到下一空行起始位置。

e命令实验(e移动到当前字符串的末尾位置,当前字符串最后字符算在内,如果已经处于末尾,会跳转到下一个字符串的末尾)
   假如当前位置在Friday F处,按下e键后,当前字符串是Friday,末尾的y不会被排除掉,光标会移动到Friday的y的位置。
   假如当前光标在Wednesday y处,按下e键后,由于e命令不会停止空行上,所以光标会移动到Thursday 的y的位置上。

b命令实验 (b移动到当前字符串的起始位置,当前字符串首字符算在内,如果已经处于起始位置,会跳转到下一个字符串的起始位置)
   假如当前位置在Friday y处,按下b键后,当前光标处于是Friday的末尾y的位置,所以光标会移动到Friday的y的位置。
   假如当前位置在Thursday T处,按下b键后,当前光标处于是Thursday 的起始的位置,所以光标会移动到上一空行起始的位置。
   
ge命令实验 (ge命令会跳转到前一个字符的末尾位置)
   假如当前位置在Friday r处,按下ge键后,当前光标处于是Friday的r的位置,所以光标会移动到上一个字符串Thursday的末尾位置y。
   假如当前位置在Thursday r处,按下ge键后,当前光标处于是Thursday 的r的位置,而Thursday是本行的第一个字符串,所以光标会移动到上一空行的位置。

  

vim各种模式的切换

普通模式:   通常我们使用 Esc 键进入或回退到普通模式
命令模式:使用冒号:或斜杠/进入到命令模式
插入模式:使用 a A o O i I 等命令进入到插入模式
可视模式:使用v或V,或Ctrl+v进入可视模式
 

vim 编辑模式

当我哦们在普通模式的时候,我们使用 i I ,a A,o O可以进入对应的编辑模式

i  在当前光标位置前一字符位置进入插入模式

I  在当前行行首位置进入插入模式

a 在当前光标后以字符的位置进入插入模式

A 在当前行行尾位置进入插入模式

o 在当前行新建下一行进入插入模式

O 在当前行新建上一行进入插入模式 

 

[num]s命令删除n个字符后进入插入模式

[num]S命令删除n行文本后进入插入模式

[num]c{motion} 删除{motion}文本后执行插入操作

[num]cc 删除{motion}文本后执行插入操作

 

 

 

 

 Vim普通模式

vim删除字符命令

当我们在普通模式的时候我们可以用x或X命令来删除字符。但是注意删掉的这些字符会被放入到缓存中,当我们使用p的时候会在当前光标处复制删掉的内容。

[num]x 表示删除当前字符,或删除当前字符以及后面的num-1个字符,删除的字符会被放入缓存器中。使用p来进行复制删掉的内容。x等于dl

[num]X 表示删除当前字符,或删除当前字符以及前面的num-1个字符,删除的字符会被放入缓存器中。使用p来进行复制删掉的内容。x等于dh

 

例如 :  字符串abcdefghijklmn 当前光标位置在g字符上
          x 删除当前字符 [g]
          5x 删除从当前位置开始的5个字符[ghijk]
          X 删除前一个字符 [f] 
          5X 删除前面5个字符 [bcdef]

  

 

删除字符串命令

 通过dw/de 或db/dge命令我们可以实现向后删除字符串的操作。

向后删除字符串

[num]dw  从光标开始向后删除num个字符串到下一个字符串起始位置,光标前的字符串不会被删除

[num]de  从光标开始向后删除到num个字符串末尾,光标前的字符串不会被删除,空行不算在内。

向前删除字符串

[num]db 从光标前一位置向前删除num个字符串,光标以及之后的字符串不会被删除,空行会被当做一个字符串

[num]dge 从光标前一位置向前删除到第num个字符串末尾,光标以及之后的字符串不会被删除。空行不算在内。

删除整个字符串

[num]daw 删除包括当前字符串在内的num个字符串,空格会删掉,空格不算字符串。

[num]diw 删除包括当前字符串在内的num个字符串,空格不会删掉,空格也算字符串。

删除到行首或行尾

d0 删除光标前到行首的所有字符(不包括当前光标的字符)

d$ 删除光标前到行尾的所有字符(包括当前光标的字符)

 

dw和de类似,都是在当前光标开始向后删除num个字符串,不同的是对应空行的处理方式不一样,w都会把空行当做一个字符串,e不会算在内.

例如:当前文本内容如下当前光标在Monday的d字符上
Monday Tuesday Wednesday

Thursday Friday Saturday

Sunday Monday

演示如下:
     6dw 会删除day Tuesday Wednesday 空行 Thursday Friday                                       dw 空行算字符串
     6de 会删除day Tuesday Wednesday 空行 Thursday Friday Saturday    第二个空行不会删掉           de空行不算字符串

     7dw 会删掉day Tuesday Wednesday 空行 Thursday Friday Saturday               dw 空行算在内
     7de  会删掉day Tuesday Wednesday 空行 Thursday Friday Saturday 空行 Sunday   de 空行不算在内
 

  

db和dge类似 ,都是在当前光标开始前一位置向前删除num个字符串。不同的是对应空行的处理方式不一样,w都会把空行当做一个字符串,e不会算在内.

 

例如:当前文本内容如下。当前光标第三行的Monday的d字符上
Monday Tuesday Wednesday

Thursday Friday Saturday

Sunday Monday

演示如下:
     3db 会删除Monday 的d字符往前的3个字符串,所以Mon(第一个),Sunday(第二个),空行(第三个)会被删除
     3dge 会删除Monday 的d字符往前的3个字符串的末尾   所以y Mond(第一个),空行Sunda(第二个),Saturday的y(第三个)会被删除

     2db 会删除Monday 的d字符往前的w个字符串到行首,所以Mon(第一个),Sunday(第二个)会被删除
     2dge 会删除Monday 的d字符往前的2个字符串的末尾   所以y Mond(第一个) ,然后空行 Sunda(第二个)会被删除。  
  

  

 daw和diw类似,都是删除整个单词,不同的是diw不会删除最后一个空格,而daw会将所有空格删掉。

例如:当前文本内容如下。光标停在 Wednesday的W位置
Monday Tuesday Wednesday Thursday Friday Saturday Sunday

实验如下:
     3daw 会删除Wednesday【space】Thursday【space】Friday【space】。
     3diw 会删除Wednesday【space】Thursday。
     4daw 会删除Wednesday【space】Thursday【space】Friday【space】Saturday【space】。
     4diw  会删除Wednesday【space】Thursday【space】。

  

删除到行首或行尾

d0 删除光标前到行首的所有字符(不包括当前光标的字符)

d$ 删除光标前到行尾的所有字符(包括当前光标的字符)

例如:当前文本内容如下。光标停在 Wednesday的n位置
Monday Tuesday Wednesday Thursday Friday Saturday Sunday

实验如下:
     d0  会将当前光标之前到行首的所有字符删掉。Monday Tuesday Wed会被删掉
     d$  会将当前光标都行尾的所有字符都删掉。nesday Thursday Friday Saturday Sunday会被删掉

  

vim 删除行命令

当我们在普通模式的时候,我们可以使用dd命令来删除当前行,也可以使用D来删除当前光标到末尾的内容。

[num]dd dd命令会删除当的行,向后删除,如果有数字接着dd,例如5dd 则表示删除当前行及后面4行文本内容

[num]D命令删除当前光标到行末尾,如果有数字5D这表示删掉当前光标到末尾已经后面的4行文本内容

dG 从当前行到文件末尾全部删除

dgg或d1G 从当前行到文件起始全部删除 

 

[num]dd和[num]D实验如下:

例如: 
当前文档有如下7行文本,当前光标在星期三的n字符上。
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
演示如下:
     dd 会删除Wednesday这一行
     3dd会删除Wednesday ,Thursday,Friday这三行
     D 会删除Wednesday中的nesday只留下Wed三个字符
     3D会删除nesday ,以及Thursday,Friday这两行

  

dG和dgg/d1G实验如下:

例如: 
当前文档有如下7行文本,当前光标在星期三的n字符上。
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
演示如下:
       dG 会删除星期三这行到文件末尾。Wednesday Thursday Friday Saturday Sunday都会被删除掉
       dgg/d1G 会删除星期三这行到文件起始。Monday Tuesday Wednesday都会被删掉。

  

vim合并行命令

当我们需要合并两行的内容是我们可以使用J或gJ的命令来合并当前行和后一行。也可以搭配[num]使用。

[num]J命令 删除当前行的换行符,然后合并后面的行,并用空格分开。

[num]gJ 命令删除当前行的换行符,然后合并后面的行,但是不会用空格分开。

例如: 
当前文档有如下7行文本,当前光标在星期三的n字符上。
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
演示如下:
       J/1J /2J 命令 Wednesday【space】Thursday这两行会合并为一行,并用空格分开
       3J 命令Wednesday【space】Thursday【space】Friday这3行会合并为一行,并用空格分开

       gJ/1gJ/2gJ 命令 WednesdayThursday这两行会合并为一行,但是中间没有空格
       3gJ 命令WednesdayThursdayFriday这3行会合并为一行,但是中间没有空格

  

 vim 重复命令

当我们执行过一条命令修改过内容后,如果想重复执行,我们不需要重行敲一遍命令,. 点号会直接重复上一次的修改命令。

. 点号只会重复修改内容的命令其他的命令不会重复执行。

.点号重复命令实验
当前文本有7行内如,光标停在第一行Monday的M处。
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
当我们执行 3J 就是合并3行文件内容之后文件内容变为如下情况。
Monday Tuesday Wednesday
Thursday
Friday
Saturday
Sunday
这时如果我们重复执行命令.键按下之后会变成,会重复执行3J命令
Monday Tuesday Wednesday Thursday Friday
Saturday
Sunday
在按一次.键,依然重复执行3J命令
Monday Tuesday Wednesday Thursday Friday Saturday Sunday

  

vim撤销操作

撤销操作也就是回滚操作就是取消上一次的操作,当我们修改数据后发现不行我们预想的结果,我们可以使用u键来进行撤销。

撤销命令实验:
当前文件内容如下:光标停在Monday的M位置
Monday Tuesday Wednesday Thursday Friday Saturday Sunday
此时我想删除 Monday Tuesday Wednesday三个日期,我执行了三次daw命令,结果如下
Thursday Friday Saturday Sunday
然后我发现我删除了错误的日期,我想恢复到原来的状态,第一次使用u命令还原一次,Wednesday被恢复了
Wednesday Thursday Friday Saturday Sunday
第二次使用u命令还原一次,Tuesday 被恢复了
Tuesday Wednesday Thursday Friday Saturday Sunday
第三次使用u命令还原一次,Monday 被恢复了,此时数据已经完全恢复回来了
Monday Tuesday Wednesday Thursday Friday Saturday Sunday

  

vim复制和粘贴命令

复制命令

[num]y命令 复制一个或多个字符,yank的缩写。。。

[num]yy命令 复制一行或多行文本。

粘贴命令,其实put 命令是将缓冲器里的内容拿出来放到光标前或后面,缓冲器里的内容,可以是通过y命令复制来的,但是我们执行过 [num]x ,[num]dd dw等其他删除命令后,删除的内容也会放在缓冲器中。

[num]p命令 在当前光标后粘贴字符和行,put的缩写。注意行的粘贴只会在下一行粘贴,不会从当前光标开始。

[num]P命令 在当前光标前粘贴字符和行。

 

复制粘贴命令实验如下:
当前文本内容:光标在Monday的d上
Monday 
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
此时执行3y(复制三个字符day),然后移动到行尾使用p命令,结果如下
Monday day 
然后移动到行尾使用3p,结果如下:复制了3次day,加上第一次一共4个day字符串。
Monday daydaydayday

删除粘贴命令实验如下:光标在Monday的d上
Monday 
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
此时执行3x(就是删除了3个字符day),然后移动到行首执行p命令,结果如下:可以看到删掉的内容确实在缓冲区中。
Mdayon

还原文件内容为初始状态,然后移动光标到第2行,执行2dd命令,就是删除两行文本,然后向右移动光标到Thursday的s光标处。执行p命令,可以看到删除的2行文本在下一行复制出来,同时光标移动到了Tuesday的行首T位置。
Monday
Thursday
Tuesday
Wednesday
Friday
Saturday
Sunday

  

vim的替换字符命令

r命令是替换字符的命令,每次只能替换一个字符。

vim替换字符命令实验
当前文本内容为:
Tuesday 光标在T位置
此时我们按下r键,然后输入X文件内容会变为
Xuesday

向右移动光标然后 按下.重复执行键,文件内容变为
XXesday

  

 

posted @ 2022-07-23 12:23  panzq  阅读(923)  评论(0编辑  收藏  举报