Vim操作 - 图1

这里我就自己日常有使用过的 Vim 指令做一个总结,总共分成 21 点。

1、vim模式

模式之间的切换

  1. 正常模式(按EscCtrl+[进入) 左下角显示文件名或为空
  2. 插入模式(按i进入) 左下角显示--INSERT--
  3. 可视模式(按v进入) 左下角显示--VISUAL--

image.png

2、打开文件

2.1、命令行模式打开文件

  • 打开单个文件

    # 打开单个文件
    vim <file>
    
  • 打开多个文件

    # 同时打开多个文件
    vim file1 file2..
    

    打开多个文件之后进行切换
    可以在当前窗格内进行文件切换

    #文件间切换
    Ctrl+6     下一个文件
    :bn        下一个文件
    :bp        上一个文件
    

也可以进行切割多个窗格显示多个文件

#分割窗格
:split  #水平分割文件窗格
:vsplit #垂直分割文件窗格 

#在窗格间切换的方法
Ctrl+w+方向键        #切换到前/下/上/后一个窗格
Ctrl+w+h/j/k/l      #切换到前/下/上/后一个窗格
Ctrl+ww             #依次向后切换到下一个窗格中
  • 带命令模式打开文件

    # 以只读形式打开文件,但是仍然可以使用 :wq! 写入
    vim -R file 
    # 强制性关闭修改功能,无法使用 :wq! 写入
    vim -M file
    

    2.2、vim模式打开文件

    # 在vim窗口中打开一个新文件
    :open [file]       
    【举个例子】
    # 当前打开1.txt,做了一些编辑没保存
    # 放弃这些修改,并重新打开未修改的文件
    :open!         
    # 当前打开1.txt,做了一些编辑
    # 保存完毕
    :w
    # 直接打开2.txt编辑,省了退出:wq再重新vim 2.txt的步骤
    :open 2.txt
    
  • 远程打开

    # 打开远程文件,比如ftp或者share folder
    :e ftp://192.168.10.76/abc.txt
    :e \qadrive\test\1.txt
    

    3、插入命令

    i #在当前位置前插入
    I #在当前行首插入
    a #在当前位置后插入
    A #在当前行尾插入
    o #在当前行之后插入一行
    O #在当前行之前插入一行
    

    4、查找命令

    4.1、最简单的查找

    /text  #查找text,按n查找下一个,按shift+n查找前一个。
    ?text  #查找text,反向查找,按n健查找上一个,按shift+n查找下一个。
    # vim中有一些特殊字符在查找时需要转义  
    .*[]^%/?~$
    # 配置大小写忽略
    :set ignorecase   #忽略大小写的查找
    :set noignorecase  #不忽略大小写的查找
    

    4.2、快速查找

    ```bash

  • 向后(下)寻找游标所在处的单词

    向前(上)寻找游标所在处的单词

    以上两种查找,n,N 的继续查找命令依然可以适用

    <br />
    <a name="j0Z4k"></a>
    #### 4.3、精准查找:匹配单词查找
    如果文本中有这三个单词<br />`hello``hello world``hello Java`<br />那我使用 /hello ,这三个词都会匹配到。<br />有没有办法实现精准查找呢?你可以使用
    
    /hello>
    <a name="cErVH"></a>
    #### 4.4、精准查找:匹配行首、行末
    **例如:**文本文件中存在以下内容
    
    hellochina worldworld hellojava hellohellochina world
    那当我们只想要查找到每一行行首的【**hello**】时,就可以使用如下命令进行实现:
    ```bash
    # hello位于行首
    /^hello
    # world位于行末
    /world$
    

    5、替换命令

    ```bash ~ #反转游标字母大小写 ddp #交换光标所在行和其下紧邻的一行。 cc #替换整行(就是删除当前行,并在下一行插入)

r <字母> #将当前字符替换为所写字母 R <字母><字母>… #连续替换字母

替换一个单词,前提是游标处于单词第一个字母(可用b定位)

cw

shift+c #替换至行尾 shift+d #删除(剪切)至行尾

替换

:s/old/new/ #用old替换new,替换当前行的第一个匹配 :s/old/new/g #用old替换new,替换当前行的所有匹配 :%s/old/new/ #用old替换new,替换所有行的第一个匹配 :%s/old/new/g #用old替换new,替换整个文件的所有匹配

行数范围内替换

:10,20 s/^/ /g #在第10行至第20行每行前面加四个空格,用于缩进。

<a name="PcOjj"></a>
### 6、撤销与重做

u #撤销(Undo) shift+u #撤销对整行的操作 Ctrl + r #重做(Redo),即撤销的撤销

<a name="koVNY"></a>
### 7、删除命令
需要说明的是,vim 其实并没有单纯的删除命令,下面你理解为剪切更加准确。
<a name="3WRWB"></a>
#### 7.1、以字符为单位删除

删除当前字符

x dl

删除当前字符的后三个字符

3x

删除当前字符的前一个字符

shift+x dh

3+shift+x #删除当前光标向前三个字符

删除当前字符至行尾

shift+d d$

删除当前字符之前至行首

d^

<a name="NFO5e"></a>
#### 7.2、以单词为单位删除

dw #删除当前字符到单词尾 daw #删除当前字符所在单词

<a name="3nEEW"></a>
#### 7.3、以行为单位删除

dk #删除上一行 dd #删除当前行 dj #删除下一行

删除当前行至文档首部

dgg d1+shift+g

删除当前行至文档尾部

d+shift+g

删除当前行之前所有行(不包括当前行)

kdgg jd+shift+g

删除范围内的行

10d # 删除从当前行开始的10行 :1,10d # 删除1-10行 :11,$d # 删除11行及以后所有的行

删除所有行

:1,$d

删除两行之间的空行

shift+j

<a name="xl3WI"></a>
### 8、复制粘贴
<a name="WPf1h"></a>
#### 8.1、正常模式中使用y复制

复制游标所在的整行(3yy表示复制3行)

yy

复制至行首(不含光标所在处字符)

y0 y^

y$ #复制至行尾。含光标所在处字符 yw #复制一个单词 y2w #复制两个单词

y+shift+g #复制至文本末。 y1+shift+g #复制至文本开头

<a name="Ya48T"></a>
#### 8.2、正常模式中使用p粘贴

p:代表粘贴至光标后 shift+p:代表粘贴至光标前

<a name="GhAEE"></a>
### 9、剪切粘贴
```bash
#剪切当前行
dd
#剪切当前行并粘贴,可实现当前行和下一行调换位置
ddp
#剪切
#正常模式下按v(逐字)或V(逐行)进入可视模式
#然后用jklh命令移动即可选择某些行或字符,再按d即可剪切

#剪切当前行之后的n行。利用p命令可以对剪切的内容进行粘贴
ndd

#范围行剪切
:1,10d #将1-10行剪切
:1, 10 m 20 #将第1-10行移动到第20行之后

10、退出保存

#保存并退出
:wq #命令模式
shift+ZZ #正常模式

:q! #强制退出并忽略所有更改
:e! #放弃所有修改,并重新开原来文件
:sav new.txt  #另存为一个新文件,退出原文件的编辑且不会保存
:f new.txt    #新开一个文件,并且不保存,退出原文件的编辑且不会保存

11、移动命令

11.1、以字符为单位移动

h   #左移一个字符
j   #下移一个字符
k   #上移一个字符
l   #右移一个字符
#上面的移动和方向键相同
# 定位字符
f<字符>    #找到光标后的第一个字符
nf<字符>   #找到光标后第n个字符
shift+f<字符>   #反向查找

11.2、以单词为单位移动

w  #向前(右)移动一个单词(光标需要停在单词首部)
b  #向后(左)移动一个单词(光标需要停在单词首部)
e  #同w,光标停在单词尾部
ge #同b,光标停在单词尾部

11.3、以句为单位移动

(   #移动到句首
)   #移动到句尾

11.4、以行为单位移动

# 10指代所有数字,可任意指定
10h  #左移10个字符
10l  #右移10个字符
10k  #上移10行
10j  #下移10行
$    #移动到行尾 
3$   #移动到下面3行的行尾

11.5、跳转到文件的首尾

#移动到文件头
gg
[[
``(波浪号键,ESC下)
#移动到文件尾
shift+g
]]

11.6、其他移动方法

^   #移动到本行第一个非空白字符上。
0   #移动到本行第一个字符上(可以是空格)  
:<行号> #具体跳转

11.7、具名标记跳转

使用 **具名标记** 跳转,这个可以跨文件进行跳转

m<命名> #可以将此处标记为 a,使用 'a 进行跳转
:marks #可以查看所有的标记
:delm!#可以删除所有的标记

当在查看错误日志时,正常的步骤是,vim打开文件,然后使用 shift+g 再跳转到最后一行,这里有个更简单的操作可以在打开文件时立即跳到最后一行。只要在 vim 和 文件 中间加个 + 即可。

vim + test.log

当你想打开文件立即跳转到指定行时,可以这样

# 打开文件并跳转到 20 行
vim test.log  +20

当你使用 / 搜索定位跳转或者使用:行号 进行精准跳转时,有时我们想返回到上一次的位置,如何实现?
只要使用 Ctrl+o 即可返回上一次的位置

12、排版功能

12.1、缩进

:set shiftwidth?   查看缩进值
:set shiftwidth=4  设置缩进值为4
# 缩进相关 最好写到配置文件中  ~/.vimrc
:set tabstop=4
:set softtabstop=4
:set shiftwidth=4
:set expandtab
>>   向右缩进
<<   取消缩进

如何你要对代码进行缩进,还可以用 == 对当前行缩进,如果要对多行对待缩进,则使用 n==,这种方式要求你所编辑的文件的扩展名是被vim所识别的,比如.py文件。

12.2、排版

:ce   #居中
:le   #靠左
:ri   #靠右

13、注释命令

13.1、多行注释

进入命令行模式,按ctrl + v进入 visual block模式,然后按j, 或者k选中多行,把需要注释的行标记起来
按大写字母I,再插入注释符,例如//
按esc键就会全部注释了

13.2、取消多行注释

进入命令行模式,按ctrl + v进入 visual block模式,按字母l横向选中列的个数,例如 // 需要选中2列
按字母j,或者k选中注释符号
按d键就可全部取消注释

13.3、复杂注释

:3,5 s/^/#/g 注释第3-5行
:3,5 s/^#//g 解除3-5行的注释
:1,$ s/^/#/g 注释整个文档
:1,$ s/^#//g 取消注释整个文档
:%s/^/#/g 注释整个文档,此法更快
:%s/^#//g 取消注释整个文档

14、调整视野

"zz":命令会把当前行置为屏幕正中央,
"zt":命令会把当前行置于屏幕顶端
"zb":则把当前行置于屏幕底端.
Ctrl + e 向下滚动一行
Ctrl + y 向上滚动一行
Ctrl + d 向下滚动半屏
Ctrl + u 向上滚动半屏
Ctrl + f 向下滚动一屏
Ctrl + b 向上滚动一屏
【跳到指定行】:两种方法
可以先把行号打开
:set nu  打开行号
:20    跳到第20行
20G    跳到第20行

15、区域选择

要进行区域选择,要先进入可视模式
v   以字符为单位,上下左右选择
V   以行为单位,上下选择
选择后可进行操作
d   剪切/删除
y   复制
Ctrl+v   如果当前是V(大写)模式,就变成v(小写)
         如果当前是v(小写)模式,就变成普通模式。
         如果当前是普通模式,就进入v(小写)模式
利用这个,可以进行多行缩进。
ggVG   选择全文

16、窗口控制

16.1、新建窗口

# 打开两个文件分属两个窗口
vim -o 1.txt 2.txt
# 假设现在已经打开了1.txt
:sp 2.txt   开启一个横向的窗口,编辑2.txt
:vsp 2.txt  开启一个竖向的窗口,编辑2.txt
:split        将当前窗口再复制一个窗口出来,内容同步,游标可以不同
:split 2.txt  在新窗口打开2.txt的横向窗口
# 需要注意:内容同步,但是游标位置是独立的
Ctrl-w s    将当前窗口分成水平窗口
Ctrl-w v    将当前窗口分成竖直窗口
Ctrl-w q    等同:q 结束分割出来的视窗。
Ctrl-w q!   等同:q! 结束分割出来的视窗。
Ctrl-w o    打开一个视窗并且隐藏之前的所有视窗

16.2、窗口切换

,如下:

# 特别说明:Ctrl w <字母> 不需要同时按
Ctrl-w h   #切换到左边窗口
Ctrl-w l   #切换到右边窗口
Ctrl-w j   #切换到下边窗口
Ctrl-w k   #切换到上边窗口
# 特别说明:全屏模式下
:n    #切换下一个窗口
:N    #切换上一个窗口
:bp   #切换上一个窗口
# 特别说明:非全屏模式
:bn   #切换下一个窗口,就当前位置的窗口的内容变了,其他窗口不变
:bN   #切换上一个窗口,就当前位置的窗口的内容变了,其他窗口不变

16.3、窗口移动

# 特别说明:Ctrl w <字母> 不需要同时按
Ctrl-w +shift+j   #将当前视窗移至最下面
Ctrl-w +shift+k   #将当前视窗移最上面
Ctrl-w +shift+h   #将当前视窗移至最左边
Ctrl-w +shift+l(L)   #将当前视窗移至最右边
Ctrl+ww    #按顺序切换窗口

16.4、调整尺寸

# 友情提示:键盘切记不要处于中文状态
Ctrl-w +   #增加窗口高度
Ctrl-w -   #减少窗口高度

16.5、退出窗口


:close  # 关闭当前窗口
:close! # 强制关闭当前窗口
:q      #退出,不保存
:q!     #强制退出,不保存
:x      #保存退出
:wq     #保存退出
:wq!    #强制保存退出
:w <[路径/]文件名>        #另存为
:sav(esa) <[路径/]文件名>   #另存为
shift+zz #保存并退出。
:only    #关闭所有窗口,只保留当前窗口(前提:其他窗口内容有改变的话都要先保存)
:only!   #关闭所有窗口,只保留当前窗口
:qall #放弃所有操作并退出
:wall #保存所有,
:wqall #保存所有并退出。

17、文档加密

vim -x file_name
#然后输入密码:
#确认密码:
#即使不修改内容也要保存,不然密码设定不会生效
:wq

18、录制宏

#按q键加任意字母开始录制,
#再按q键结束录制(这意味着vim中的宏不可嵌套),
#使用的时候@加宏名,
#比如qa。。。q录制名为a的宏,@a使用这个宏。

19、执行命令


# 重复前一次命令
. 
# 执行shell命令
:!command
# 比如列出当前目录下文件
:!ls 

# 执行脚本
 #检查perl脚本语法,可以不用退出vim,非常方便。
:!perl -c script.pl

 #执行perl脚本,可以不用退出vim,非常方便。
:!perl script.pl

 #挂起vim,回到shell,按fg可以返回vim。
:suspend或Ctrl - Z

20、帮助命令

#在Unix/Linux系统上
vimtutor

# 普通模式下
键盘输入vim或F1

# 命令行模式下
:help     #显示整个帮助
:help xxx #显示xxx的帮助,比如 :help i, :help CTRL-[(即Ctrl+[的帮助)。
:help 'number' #Vim选项的帮助用单引号括起

#在Windows系统上
:help tutor

21、配置命令

21.1、显示当前设定

:set或者:se    #显示所有修改过的配置
:set all      #显示所有的设定值
:set option?  #显示option的设定值
:set nooption #取消当期设定值
:ver          #显示vim的所有信息(包括版本和参数等)

# 需要注意:全屏模式下
:args   #查看当前打开的文件列表,当前正在编辑的文件会用[]括起来

21.2、更改设定

:set nu   #显示行号

set autoindent(ai)   #设置自动缩进
set autowrite(aw)    #设置自动存档,默认未打开
set backup(bk)       #设置自动备份,默认未打开

set background=dark或light,  #设置背景风格
set cindent(cin)           #设置C语言风格缩进

:set ts=4         #设置tab键转换为4个空格
:set ff=unix      #修改文件dos文件为unix
:set shiftwidth?  #查看缩进值
:set shiftwidth=4 #设置缩进值为4
:set ignorecase  #忽略大小写的查找
:set noignorecase #不忽略大小写的查找

:set paste    #insert模式下,粘贴格式不会乱掉

#查看是否设置了ruler,在.vimrc中,使用set命令设制的选项都可以通过这个命令查看
:set ruler?  

#查看vim脚本文件的位置,比如.vimrc文件,语法文件及plugin等。
:scriptnames

# 显示非打印字符,如tab,空格,行尾等。如果tab无法显示,
#请确定用set lcs=tab:>-命令设置了.vimrc文件,
#并确保你的文件中的确有tab,
#如果开启了expendtab,那么tab将被扩展为空格。
:set list

:syntax        #列出已经定义的语法项
:syntax clear  #清除已定义的语法规则
:syntax case match   # 大小写敏感
:syntax case ignore  # 大小写无关

以上就是我使用 Vim 的一些使用总结,希望对你能有帮助。