vim用法

vi是个文本编辑器。
vim是从vi发展出来的文本编辑器。

一、启动vim

(一)命令语法格式


vim [选项] [参数]

(二)选项

-- 在这以后只有文件名
-v Vi模式 (同 "vi")
-e Ex模式 (同 "ex")
-E改进的Ex模式
-s安静(批处理)模式 (只能与 "ex" 一起使用,也就是-es)
-d Diff模式 (同 "vimdiff")
-y容易模式 (同 "evim",无模式)
-R只读模式 (同 "view")
-Z限制模式 (同 "rvim")
-m不可修改(写入文件)
-M文本不可修改
-b二进制模式
-l Lisp模式
-C兼容传统的Vi: 'compatible'
-N不完全兼容传统的Vi: 'nocompatible'
-V[N][文件名] 显示详细信息 [级别N] [记录消息到指定的文件名]
-D调试模式
-n不使用交换文件,只使用内存
-r列出交换文件并退出
-r (跟文件名) 恢复崩溃的会话
-L同 -r
-A以Arabic模式启动
-H以Hebrew模式启动
-T <terminal> 设定终端类型为 <terminal>
--not-a-term跳过输入/输出不是终端的警告
--ttyfail如果输入或输出不是终端就退出
-u <vimrc> 使用 <vimrc> 替代任何 .vimrc
--noplugin不加载plugin脚本
-p[N] 打开N个标签页 (默认值: 每个文件一个)
-o[N] 打开N个窗口 (默认值: 每个文件一个)
-O[N] 同 -o但垂直分割
+ 启动后跳到文件末尾
+<lnum> 启动后跳到第 <lnum> 行
--cmd <command> 加载任何vimrc文件前执行 <command>
-c <command> 加载第一个文件后执行 <command>
-S <session> 加载第一个文件后执行文件 <session>
-s <scriptin> 从文件 <scriptin> 读入正常模式的命令
-w <scriptout> 将所有输入的命令追加到文件 <scriptout>
-W <scriptout> 将所有输入的命令写入到文件 <scriptout>
-x编辑加密的文件
--startuptime <文件> 将启动计时信息写入 <文件>
--log <文件> 尽早开始记录日志到 <文件>
-i <viminfo> 使用 <viminfo> 取代 .viminfo
--clean 'nocompatible', Vim默认选项, 不加载插件, 不读写viminfo
-h或 --help打印帮助(本信息)并退出
--version打印版本信息并退出

(三)参数


要编辑的文件

(四)举例用法


1.交互方式
vim file

2.非交互方式
(1)使用-s script
因为-s选项把script中的命令作为正常模式下的命令,所以想使用ex命令必须在前面加冒号。

cmds.vim内容:

:%s/foo/test/ge
:wq     #如果加q,执行完毕会退出。如果不加q,执行完毕会打开vim

用法:

vim file -s cmds.vim

(2)使用-c “command”
-c选项可以在加载文件之后自动执行Ex命令。

vim file -c "%s/foo/test/g"

利用竖线|组合多条Ex命令:
vim file -c "%s/foo/test/g | wq"

利用argdo命令,对多个文件分别执行ex命令:
vim -c "argdo source cmd.vim | w" -c "qa" A.html B.html C.html

二、vim有4种基本模式

分别是普通模式(normal mode),编辑模式(edit mode),可视模式(visual mode),命令行模式(command-line mode)。

编辑模式有两种:插入模式和替换模式。
其实还有一种模式叫ex模式,这种模式下一直显示一个冒号。因为基本用不到,所以忽略。

(一)普通模式


普通模式,也叫正常模式,一般模式,有时候也叫命令模式。

启动vim,便进入了普通模式。
此模式下敲击键盘动作会作为命令,而非输入字符。
比如我们此时按下i,并不会输入字符i,而是作为一个命令。
普通模式下的命令叫普通命令。

此模式下,按下如下键,切换到输入模式的插入模式。
a Na 在光标后添加文本 (N次)
A NA 在行末添加文本 (N次)
i Ni 在光标前插入文本 (N次)
I NI 在当前行首个非空白字符前(软行首)插入文本 (N次)
gI NgI 在第一列(硬行首)中插入文本 (N次)
o No 在当前行下方打开新行,添加文本 (N次)
O NO 在当前行上方打开新行,添加文本 (N次)


R 切换到输入模式中的替换模式

此模式下,按下如下键,切换到可视模式。
v
V
ctrl v

此模式下,按下冒号: 切换到命令行模式。

(二)编辑模式


也叫输入模式。
此模式下按下insert键,在插入模式和替换模式之间来回切换。
此模式下敲击键盘就是输入字符。

此模式下按esc切换到普通模式。

(三)可视模式


也叫选择模式。
此模式下,敲击键盘同样是当成命令,与普通模式唯一不同是移动命令在移动的同时选择文本,所以才叫做选择模式。

此模式按esc切换到普通模式。或者执行完普通命令切换到普通模式。

(四)命令行模式


也叫底行模式,底线模式。
在普通模式按下英文冒号,切换到命令行模式。
此模式,在底部出现一个输入行,所以才叫底行模式。
此模式下可以输入的命令叫做ex命令。

此模式下,按ESC键切换到普通模式。或者执行完ex命令切换到普通模式。

此模式下,输入下列命令进入输入模式:
:star[tinsert][!] 开始插入模式,当使用 [!] 时添加文本
:startr[eplace][!] 开始替换模式,当使用 [!] 时从行末开始

三、状态栏

状态栏可以显示当前模式,文件名,文件类型,文件编码,总行数,光标所在行号和列号。行号和列号都是从1开始。
特别说明一下状态栏中的列号。
列号,10-7就是第10个字节,第7列。UTF-8编码一个汉字3个字节,第四个汉字就在第10个字节上;VIM中字符分宽窄,汉字是宽字符,占2列,第四个汉字在第7列。

四、用法

(一)普通模式下的用法


在讲命令之前,先说几个术语:
空白字符:也叫whitespace,就只包括空格制表符换行符。
软行首:也就是一行的第一个非空白字符
硬行首:也就是一行的第一个字符,可以是空白字符
行首,默认是软行首。

word:一个word就是只由字母数字下划线组成的字符串,或者只由其他非空白字符组成的字符串,以空白字符为分隔符。空行也是一个word。
iskeyword选项指定了哪些字符是构成单词的字符。
默认是@,48-57,_,192-255,是由逗号分隔的字符列表,48-57是指ASCII 48到57之间的字符,也就是数字0到9,后面跟着的是下划线,再后面是扩展ASCII字符中192到255之间的字符。第一个字符 @ 代表的是isalpha() 函数“认证”为真的所有字符。

WORD:一个WORD就是只由非空白字符组成的字符串,由空白字符分隔。空行也是一个WORD。

句子:一个句子就是以.!?这三种字符结尾的后面必须跟着一个空白字符的字符串。在.!?与空白符之间可以有任意数量的)]"'字符。段落和节的分隔符也是句子的分隔符。

段落:A paragraph begins after each empty line, and also at each of a set of
paragraph macros, specified by the pairs of characters in the ‘paragraphs’
option. The default is “IPLPPPQPP TPHPLIPpLpItpplpipbp”, which corresponds to
the macros “.IP”, “.LP”, etc. (These are nroff macros, so the dot must be in
the first column). A section boundary is also a paragraph boundary.
Note that a blank line (only containing white space) is NOT a paragraph
boundary.
Also note that this does not include a ‘{’ or ‘}’ in the first column. When
the ‘{’ flag is in ‘cpoptions’ then ‘{’ in the first column is used as a
paragraph boundary posix.

节:A section begins after a form-feed () in the first column and at each of
a set of section macros, specified by the pairs of characters in the
‘sections’ option. The default is “SHNHH HUnhsh”, which defines a section to
start at the nroff macros “.SH”, “.NH”, “.H”, “.HU”, “.nh” and “.sh”.

The “]]” and “[[” commands stop at the ‘{’ in the first column. This is
useful to find the start of a function in a C program. To search for a ‘}’ in
the first column, the end of a C function, use “][” (forward) or “[]”
(backward). Note that the first character of the command determines the
search direction.

普通模式下命令分几类:


1.移动光标(motion)


(1)左右移动

向左移动一个字符     h/←/<backspace>
向右移动一个字符     l/→/<space>

向左移动n个字符     h/←/<backspace>前面加数字n,也就是nh/n←/n<backspace>
向右移动n个字符     l/→/<space>前面加数字n,也就是nl/n→/n<space>

移动到硬行首     数字0/home/|
移动到软行首     ^
移动到行尾     $/end

向右移动到某个字符,比如a     fa
向左移动到某个字符,比如a     Fa
向右移动到某个字符前一字符     ta
向左移动到某个字符后一字符     Ta
fFtT的下一个     ;

向左移动一个word     b/shift+←
向右移动一个word(词首)     w/shift+→
向右移动一个word(词尾)     e

向左移动一个WORD B/ctrl+←
向右移动一个WORD(词首)  W/ctrl+→
向右移动一个WORD(词尾)     E

移动到上一句首     (
移动到下一句首     )

移动到上一段首     {
移动到下一段尾     }

[( N[( 向后至第N个未闭合的 '('
[{ N[{ 向后至第N个未闭合的 '{'

]) N]) 向前至第N个未闭合的 ')'
]} N]} 向前至第N个未闭合的 '}'

[# N[# 向后至第N个未闭合的 "#if" 或 "#else"
]# N]# 向前至第N个未闭合的 "#else" 或 "#endif"
[* N[* 向后至第N个注释的开始 "/*"
]* N]* 向前至第N个注释的结束 "*/"

(2)上下移动

同列向上移动一行     k/↑
同列向下移动一行     j/↓

同列向上移动n行     k/↑前面加数字n,也就是nk/n↑
同列向下移动n行     j/↓前面加数字n,也就是nj/n↓

向上移动一行,到软行首     -
向下移动一行,到软行首     +/<enter>

向上移动n行,到软行首     n-
向下移动n行,到软行首     n+/n<enter>

向上移动一页     ctrl+b/<page up>
向下移动一页     ctrl+f/<page down>

向上移动半页     ctrl+u
向下移动半页     ctrl+d

(3)跳转

跳转第n列     n|
移动到屏幕顶行的行首     H
移动到屏幕中间一行的行首     M
移动到屏幕底行的行首     L

移动到文件第n行行首     nG
移动到文件第一行行首     1G/gg
移动到文件最后一行行首     G

添加标记a     ma
跳到标记a     `a
跳到标记a行首     'a

跳转成对符号(),{},[]     %

为了能跳转成对的html标签,需要使用matchit插件。
步骤:
第一步安装,matchit是默认安装的,只不过没有自动加载,在~/.vimrc中加入一行packadd! matchit,每次启动自动加载它
第二步开启文件类型检测和文件类型插件,在~/.vimrc中添加一行filetype plugin on,这样就自动加载ftplugin/html.vim插件,b:match_words就定义在这个文件中。
第三步重启vim,就可以使用%跳转标签了。

2.修改(change)

修改光标处字符     r
修改光标处字符进入插入模式     s
改变光标处字符的大小写     ~

修改光标到word尾     cw
修改光标到WORD尾     cW
向右修改光标到字符a     cfa
向左修改光标到字符a     cFa

向右修改光标到字符a前一个字符        cta

修改光标到word首     cb
修改光标到WORD首     cB

修改光标到行首     c0
修改光标到行尾     c$/C
修改整行     cc/S

修改光标到句首     c(
修改光标到句尾     c)

3.复制 (Yanking)


(1)复制字符

复制光标所在处的字符     yl
复制光标前一位置的字符     yh

复制光标处及后面共n个字符(包括光标处)     nyl
复制光标前面n个字符(不包括光标处字符)    nyh

复制光标处到行尾的所有字符(包括光标处)     y$
复制光标前一位置到硬行首的所有字符(不包括光标处字符)     y0
复制光标前一位置到软行首的所有字符(不包括光标处字符)     y^

复制双引号之内字符串     yi"

(2)复制单词

复制光标处到下一个单词词首前一位置(包括光标处)     yw
复制光标处到当前单词词尾(包括光标处)     ye     注:如果光标已经在词尾,那么会复制到下一单词的词尾
复制光标前一位置到词首(不包括光标处)     yb     注:如果光标已经在词首,那么会复制到上一单词的词首

复制光标处到下n个单词词首前一位置     ynw
复制光标处到下n-1个单词词尾     yne
复制光标前一位置到上n-1个单词词首     ynb

复制当前词     yiw

(3)复制行

复制光标所在行     yy
复制光标所在行及下面行共n行     nyy

复制光标所在行到第一行的所有行(包括光标行)    y1G
复制光标所在行到最后一行的所有行(包括光标行)     yG

y%     复制匹配符号范围内容。默认支持的符号对是(),{},[].这个在复制括号内内容时,很有用处。

4.剪切 (Deleting)


剪切就是删除,删除就是剪切。
(1)剪切字符

剪切光标处字符     x
剪切光标前一位置字符     X

剪切光标处及后面字符共n个字符     nx
剪切光标前面n个字符(不包括光标处)     nX

剪切光标处到行尾     d$
剪切光标前一位置到硬行首     d0
剪切光标前一位置到软行首     d^

(2)剪切单词

剪切光标到下一单词词首前一位置     dw
剪切光标到单词词尾     de
剪切光标前一位置到单词词首     db

剪切光标处单词     diw

(3)剪切行

剪切光标所在行     dd
剪切光标所在行及下面行共n行     ndd

剪切光标所在行到第一行(包括光标行)    d1G
剪切光标所在行到最后一行(包括光标行)    dG

D ND     删除至行尾 (及N - 1后续行)

5.粘贴 (Putting)

粘贴到光标后面     p
粘贴到光标前面     P

粘贴到光标后面,并将光标移动到粘贴部分的下一行行首     gp
粘贴到光标前面,并将光标移动到粘贴部分的下一行行首     gP

6.撤销 重做 重复

撤销前一个命令     u
重做撤销的命令     ctrl+r

重复前一个命令     .小数点

7.缩进

默认缩进宽度为8个空格

光标所在行增加缩进     >>
光标所在行减少缩进     <<
光标所在行及后面行共n行增加缩进   n>>或者>nj
光标所在行及后面行共n行减少缩进    n<<或者<nj
所有行增加缩进     gg>G
所有行减少缩进     gg<G
也可以进入可视化模式并选择多行,然后使用>命令增加缩进选中的行
也可以进入可视化模式并选择多行,然后使用<命令减少缩进选中的行

正确缩进当前行     ==
正确缩进光标所在行及后面行共n行     n==或者=nj

正确缩进所有行     gg=G
也可以进入可视化模式并选择多行,然后使用=命令缩进选中的行

8.查找

/pattern     向下查找匹配pattern的字符串
?pattern     向上查找匹配pattern的字符串

使用了查找命令之后,使用如下两个键快速查找:

n:按照同一方向继续查找
N:按照反方向查找

在模式中加入\c表示不区分大小写查找,\C表示区分大小写查找。例如:

/foo\c
将会查找所有的"foo","FOO","Foo"等字符串。
*     查找光标处word。例如当前为foo, 可以匹配foo bar中的foo,但不可匹配foobar中的foo。 这在查找函数名、变量名时非常有用。
g*     查找光标处word的字符序列,每次出现前后字符无要求。 即foo bar和foobar中的foo均可被匹配到。

9.合并行

把下一行合并到当前行     J
将文件所有行合并到一行     ggvGJ

gJ NgJ     同 "J",但不插入空格

(二)编辑模式用法


1.直接输入字符


通过输入法,直接输入对应的字符。
这种方式无法输入某些控制字符。

2.以字符码方式插入字符

CTRL-V digit

digit可以是5种形式:
十进制数,八进制数,十六进制数,bmp unicode码(十六进制数),unicode码(十六进制数)

第1个字符数值最多字符个数数值最大值例子
(none)十进制数3255CTRL-V 88
o或O八进制数3377 (255)CTRL-V o65
x或X十六进制数2ff (255)CTRL-V x65
u十六进制数4ffff (65535)CTRL-V u65ff
U十六进制数87fffffff (2147483647)CTRL-V U65ffaa88

3.使用digraph输入字符


digraph就是用两个字符代表一个字符。通常是用两个ascii字符代表一个非ascii字符。
比如,a!这两个字符代表à
(1)可以手动指定哪两个字符代表哪个字符
使用下面命令指定

:dig[raphs] {char1}{char2} {number}

char1和char2是要按下的字符
number是要代表的字符的unicode码的十进制数
如,

digraph oe 339

(2)使用digraph
有两种使用digraph的方法:

CTRL-K {char1} {char2}
{char1} <BS> {char2}

第一种总是可用;
第二种在’digraph’选项设置时可用。

如,

'B' <BS> 'B' will enter the broken '|' character (166)
'a' <BS> '>' will enter an 'a' with a circumflex (226)
CTRL-K '-' '-' will enter a soft hyphen (173)

通过CTRL-V方式或者CTRL-K方式可以很容易地插入控制字符(不可打印字符):

char digraph hex dec official name
^@ NU 0x00 0 NULL (NUL)
^A SH 0x01 1 START OF HEADING (SOH)
^B SX 0x02 2 START OF TEXT (STX)
^C EX 0x03 3 END OF TEXT (ETX)
^D ET 0x04 4 END OF TRANSMISSION (EOT)
^E EQ 0x05 5 ENQUIRY (ENQ)
^F AK 0x06 6 ACKNOWLEDGE (ACK)
^G BL 0x07 7 BELL (BEL)
^H BS 0x08 8 BACKSPACE (BS)
^I HT 0x09 9 CHARACTER TABULATION (HT)
^@ LF 0x0a 10 LINE FEED (LF)
^K VT 0x0b 11 LINE TABULATION (VT)
^L FF 0x0c 12 FORM FEED (FF)
^M CR 0x0d 13 CARRIAGE RETURN (CR)
^N SO 0x0e 14 SHIFT OUT (SO)
^O SI 0x0f 15 SHIFT IN (SI)
^P DL 0x10 16 DATALINK ESCAPE (DLE)
^Q D1 0x11 17 DEVICE CONTROL ONE (DC1)
^R D2 0x12 18 DEVICE CONTROL TWO (DC2)
^S D3 0x13 19 DEVICE CONTROL THREE (DC3)
^T D4 0x14 20 DEVICE CONTROL FOUR (DC4)
^U NK 0x15 21 NEGATIVE ACKNOWLEDGE (NAK)
^V SY 0x16 22 SYNCHRONOUS IDLE (SYN)
^W EB 0x17 23 END OF TRANSMISSION BLOCK (ETB)
^X CN 0x18 24 CANCEL (CAN)
^Y EM 0x19 25 END OF MEDIUM (EM)
^Z SB 0x1a 26 SUBSTITUTE (SUB)
^[ EC 0x1b 27 ESCAPE (ESC)
^\ FS 0x1c 28 FILE SEPARATOR (IS4)
^] GS 0x1d 29 GROUP SEPARATOR (IS3)
^^ RS 0x1e 30 RECORD SEPARATOR (IS2)
^_ US 0x1f 31 UNIT SEPARATOR (IS1)

第一列是控制字符在vim中的显示形式;
第二列是digraph表示形式,也就是ctrl-k输入形式;
第三列是字符码的十六进制数;
第四列是字符码的十进制数;
第五列是字符的官方名称;

比如,ctrl-v 30和ctrl-k rs都是输入RECORD SEPARATOR (IS2)字符,都会显示^^
ctrl-v 13和ctrl-k cr输入后都是显示^M

4.快捷键

<NL> 或 <CR> 或CTRL-M或CTRL-J开始新行
CTRL-E插入光标下方的字符
CTRL-Y插入光标上方的字符
CTRL-A插入前次插入的文本
CTRL-@ 插入前次插入的文本并结束插入模式
CTRL-R {register} 插入寄存器的内容
CTRL-N插入光标前标识符的后一个匹配
CTRL-P插入光标前标识符的前一个匹配
CTRL-X ... 以各种方式补全光标前的单词
<BS> 或CTRL-H删除光标前的一个字符
<Del> 删除光标下的一个字符
CTRL-W删除光标前的一个单词
CTRL-U删除当前行中所有的输入字符
CTRL-T在当前行首插入一个shiftwidth的缩进
CTRL-D从当前行首删除一个shiftwidth的缩进
0 CTRL-D删除当前行的所有缩进
^ CTRL-D删除当前行的所有缩进,恢复下一行的缩进

(三)可视模式下的用法

模式类型进入方式选择效果
字符文本v(小写)逐个字符选择文本
行文本V(大写)逐行选择文本
块文本Ctrl+v按照块的方式选择文本

1.普通模式下将光标移动到选择开始的位置。
2.进入可视模式
3.将光标移动到选择结束的位置。移动光标方法与命令模式下的一致
4.执行命令,各种命令与命令模式下的一致。

例子:
批量注释:
Ctrl + v 进入块选择模式,然后移动光标选中你要注释的行,再按大写的 I 进入行首插入模式输入注释符号如 // 或 #,输入完毕之后,按ESC,Vim 会自动将你选中的所有行首都加上注释。
取消注释:
Ctrl + v 进入块选择模式,选中你要删除的行首的注释符号,注意 // 要选中两个,选好之后按 d 即可删除注释。

(四)命令行模式下的用法


ex命令大体上分成几类:


1.设置vim的命令


(1)set命令

用来设置选项

:se[t] 显示所有改动过的选项
:se[t] all显示所有非termcap选项
:se[t] termcap显示所有termcap选项
:se[t] {option} 置位布尔选项 (开启) 显示字符串或数值选项的值
:se[t] no{option} 复位布尔选项 (关闭)
:se[t] inv{option} 反转布尔选项的值
:se[t] {option}={value} 设置字符串/数值选项的值为 {value}
:se[t] {option}+={value} 将 {value} 附加到字符串选项里,将 {value} 加到数值选项上
:se[t] {option}-={value} 从 {value} 从字符串选项里删除,从 数值选项里减去 {value}
:se[t] {option}? 显示 {option} 的值
:se[t] {option}& 重置 {option} 为其缺省值
:setl[ocal] 同 ":set",但对局部选项设定其局部值
:setg[lobal] 同 ":set",但对局部选项设定其全局值
:opt[ions] 打开一个新窗口,用来参看并设置选项, 选项以功能分组,有单行的解释,并有指 向帮助的链接

常用选项:

'number' 'nu' 行前显示行号
'highlight' 'hl' 设置若干场合下的高亮模式
'filetype' 'ft' 自动命令使用的文件类型https://www.topbyte.cn/vimdoc/doc/options.html#'filetype'
'cursorcolumn' 'cuc' 高亮光标所在屏幕列
'cursorline' 'cul' 高亮光标所在屏幕行
'compatible' 'cp' 尽可能做到与Vi兼容
'cindent' 'cin' c缩进
'autoindent' 'ai' 根据上一行决定新行的缩进
'autoread' 'ar' 有Vim之外的改动时自动重读文件
'matchpairs' 'mps' "%" 能匹配的字符对
'scrolljump' 'sj' 滚动所需的最少行数
'shiftwidth' 'sw' 缩进宽度。缩进宽度默认为8个空格,如set shiftwidth=4,设置缩进宽度为4个空格
'smartindent' 'si' 智能自动缩进
'smarttab' 'sta' 插入 <Tab> 时使用 'shiftwidth'
'tabstop' 'ts' <Tab> 在文件里使用的空格数。tab宽度,如set tabstop=4     Tab宽度设置为4个空格
'softtabstop' 'sts' 编辑时 <Tab> 使用的空格数
'expandtab' 'et' 键入 <Tab> 时使用空格。将Tab转换为空格
'list' 显示 <Tab> 和 <EOL>
'listchars' 'lcs' list模式下显示用的字符

Vim提供三种自动缩进的模式:autoindent、smartindent和cindent(其智能化程度依次递进)。
autoindent缩进形式中,新增加的行和前一行使用相同的缩进形式。
smartindent缩进模式中,每一行都和前一行有相同的缩进量,同时这种缩进模式能正确地识别出花括号:当前一行为开花括号“{”时,下一新行将自动增加缩进;当前一行为闭花括号“}”时,则下一新行将取消缩进。此外还将根据’cinwords’选项,来自动识别C语言关键字。如果一行是以“#”开头的注释,那么此行将不采用缩进格式。
cindent可以很好的识别出C和Java等结构化程序设计语言,并且能用C语言的缩进格式来处理程序的缩进结构。

例子:

" 显示控制字符
:set list
" 不显示控制字符
:set nolist
" 设置显示哪些控制字符
:set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<
(2) 语法高亮命令
:syn-on :syntax on开始使用语法高亮
:syn-off :syntax off停止使用语法高亮
:syn-keyword :syntax keyword {group-name} {keyword} .. 添加语法关键字项目
:syn-match :syntax match {group-name} {pattern} ... 加入语法匹配项目
:syn-region :syntax region {group-name} {pattern} ... 添加语法区域项目
:syn-sync :syntax sync [ccomment | lines {N} | ...] 设置语法高亮的同步方式
:syntax :syntax [list] 列出当前语法项目
:syn-clear :syntax clear清除所有语法信息
:highlight :highlight clear清除所有高亮信息
:highlight :highlight {group-name} {key}={arg} .. 为语法组 {group-name} 设置高亮
:filetype :filetype on开启文件类型检测,不启用语法高亮https://www.topbyte.cn/vimdoc/doc/filetype.html#:filetype
:filetype :filetype plugin indent on开启文件类型检测,包括自动缩进及设置

可以发现filetype有两层含义。一个是选项,简称ft;一个是命令,简称filet。

2.处理文件的命令


(1)保存退出等命令
w     保存文件
w!     强制保存,如果是只读文件也能进行保存动作
q     退出当前文件,前提是已经保存过了,如果没有保存Vim会提醒你的
q!     强行退出,也就是说无论已经保存过与否都退出,可能会丢失所做的修改
wq     保存并退出
wa     保存所有的文件(如果你打开了多个文件的话)
x     保存并退出。程序员最应该使用的命令。它与:wq的区别在于,如果文件没有修改x是不会修改文件的时间戳,因此就不需要重新编译。而wq命令,即使文件未修改也会修改时间戳,也即会触发重新编译
xa     保存并退出所有的文件,如果打开了多个文件话

w a-new-file     另存为a-new-file
[adress] w a-new-file     把[adress]所指定的范围的内容另存为a-new-file
[adress] w >> another-file     把[adress]所指定的范围的内容追加到another-file中
r file     把file文件中的内容读出来放到当前行下面
n r file     把file中的拷贝到第n行下面
/pattern/ r file     把file中的内容拷贝到第一个匹配pattern的行下面

e another-file     把another-file读入内存并开始编辑
e!     舍弃所有的未保存的修改,回到上一次文件所保存的状态

3.处理文本的命令


这种命令的格式是:

[地址][命令][参数]

地址(adress)表示指定的行
可以是以下形式:
不指定地址,表示光标所在行。
单地址。
(1)n 数字n,表示第n行
(2)$ 表示最后一行
(3).(句点) 表示当前行
(4)% 表示所有行
(5)/pattern/ pattern是正则表达式,表示匹配pattern的行
范围地址。
(1)m,n 表示第m行到第n行
(2)adress+n 从adress开始的向下n行
(3)adress-n 从adress开始的向上n行

(1)缩进命令
:>命令将对当前行增加缩进
:<则将对当前行减少缩进
(2)打印行号命令
:=     打印文件的总行数
:/pattern/=     打印匹配pattern的行号
(3)编辑命令
复制行到adress     co/t
剪切行到adress     m

复制行到剪贴板     y
剪切行到剪贴板     d

粘贴行从剪贴板     pu

格式:

[adress]co {adress2}     复制adress行到adress2后面
[adress]m {adress2}     剪切adress行到adress2后面
[adress]y     复制adress行到剪贴板
[adress]y {count}     复制adress后面count行到剪贴板
[adress]d     剪切adress行到剪贴板
[adress]d {count}     剪切adress后面count行到剪贴板
[adress]pu     粘贴剪贴板内容到adress后面
[adress]pu!     粘贴剪贴板内容到adress前面
(4)全局命令


使用:g命令,可以针对所有匹配模式的行执行操作。其命令格式为:

:[range]g/{pattern}/[command]

即针对在[range]范围内,所有匹配{pattern}模式的行,执行[command]命令。
命令:g!及其同义词:v,则可以针对所有不匹配模式的行执行操作。其命令格式为:

:[range]g!/{pattern}/[command]

即针对在[range]范围内,所有不匹配{pattern}条件的行,执行[command]命令。

如果没有指定[range],则针对文件中的所有行执行命令。也可以使用行地址,把全局搜索限定在指定的行或行范围内。
如果没有指定[command],则执行:print命令来显示行内容。

删除所有空行
:g/^\s*$/d

末尾加上<br>
:v/>$/s/$/<br>/g
(5)查找


我们已经介绍了在普通模式下的查找,这里我们介绍在底线模式下的查找。
实际上就是利用了全局命令。将全局命令的command限定于print。

格式:

g/{pattern}[/p]

例子:

g/\%20c
匹配第20列

g/\%20l
匹配第20行

g/混/s/1/上/g
把所有带“混”的行内的“1”替换成“上”
(6)替换


s[ubstitute]命令用于替换。与sed命令很相似

格式

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

对于[range]中的每一行,将匹配pattern的字符串替换成string。
当[range]和[count]省略时,只替换当前行。
当指定[count]时,替换从[range]最后一行开始的count行。

分隔符不一定是/,可以自己指定。

flags可以是以下标记:

1)g
s命令默认只替换一行中第一个匹配。如果要替换一行中所有匹配,可以g(global)标记:
:%s/from/to/g
2)p
p(print),是要求打印所做的改动
[p]     Print the line containing the last substitute.  :s_p
[#]     Like [p] and prepend the line number.  :s_#
[l]     Like [p] but print the text like :list.  :s_l
3)c
c(confirm),是要求在做出改动以前先询问
:1,$ s/Professor/Teacher/gc
replace with Teacher (y/n/a/q/l/^E/^Y)?
这时你可以做出以下回答:
•y Yes:执行这个替换
•n No:取消这个替换
•a All:执行所有替换而不要再询问
•q Quit:退出而不做任何改动
•l Last:替换完当前匹配点后退出
•CTRL-E向上翻滚一行
•CTRL-Y向下翻滚一行
4)i
i(ignorecase),是不区分大小写。
5)I
区分大小写
6)n
[n]     Report the number of matches, do not actually substitute.  The [c] flag is ignored.  The matches are reported as if 'report' is zero. Useful to count-items. If \= sub-replace-expression is used, the expression will be evaluated in the sandbox at every match.

示例:
<a href="/celebrity/1049850/">梅莉莎·罗森伯格</a>的a标签删除
可以在vim中:h non-greedy查看有关非贪婪匹配的词条,其中提到使用\{-}来代替*,使用替换命令,一个命令就搞定了之前的工作:

s/<a href.\{-}>\(.\{-}\)<\/a>/\1/g
删除p标签
:%s/<p>\(.\{-}\)<\/p>/\1<br>/g

删除h标签
:%s/<h[0-9]>\(.\{-}\)<\/h[0-9]>/\1<br>/g

替换换行为`<br>`
:%s/\n/<br>\r/g

末尾添加`<br>`
s/\(.$\)/\1<br>

所有不以>结尾的行,末尾加上`<br>`
v/>$/s/\(.$\)/\1<br>
格式化html
:%s/></>\r</g
把文件类型设为html,然后全选代码执行"="号
:filetype indent on
:set filetype=html
:set smartindent
gg=G
(7)合并行
把下一行合并到当前行
:j
合并所有行
:%j

4.其他命令

(1)查看帮助
:h[elp] 打开帮助窗口
(2)调用外部命令
:sh[ell] 开启一个shell
:!{command} 打开一个shell执行命令 {command}。如:! ls /home即离开vi并列出/home下文件列表
(3)重复上次命令
:@ 
(4)执行普通模式命令
:norm[al][!] {commands} 执行普通模式命令
(5)自动命令
autocommand特定事件发生时自动执行命令。
:autocmd :au列出所有自动命令
:autocmd :au {event} 列出针对事件 {event} 的所有自动命令
:autocmd :au {event} {pat} 列出针对事件 {event} 并匹配 {pat} 的所 有自动命令
:autocmd :au {event} {pat} {cmd} 加入针对事件 {event} 及匹配 {pat} 的新 自动命令
:autocmd :au! 清除所有自动命令
:autocmd :au! {event} 清除所有针对事件 {event} 的自动命令
:autocmd :au! * {pat} 清除所有匹配 {pat} 的自动命令
:autocmd :au! {event} {pat} 清除所有针对事件 {event} 及匹配 {pat} 的自动命令
:autocmd :au! {event} {pat} {cmd} 清除所有针对事件 {event} 及匹配 {pat} 的自动命令并输入新的
(6)批量运行EX命令:
:so[urce] 从文件里读取Vim或Ex命令

我们可以把EX命令写到一个脚本里面,然后加载运行它们;
方法:假如写在了batch.vim中, 然后用:source batch.vim执行这个脚本;

batch.vim

:v/<br.\{-}>$/s/\(.$\)/\1<br>
:%j
:%s/<code.\{-}>//g
:%s/<\/code>//g
:%s/<span.\{-}>//g
:%s/<\/span>//g
:%s/<p.\{-}>//g
:%s/<\/p>/<br>/g
:%s/<h[0-9].\{-}>//g
:%s/<\/h[0-9]>/<br>/g
:%s/<pre.\{-}>//g
:%s/<\/pre>/<br>/g
:%s/<div.\{-}>//g
:%s/<\/div>/<br>/g
:%s/style=\"overflow-y: hidden;\"//g
:%s/border=\"0\"/border=\"1\"/g
:%s/<br[^>]*>\(\s<br[^>]*>\)\+/<br> /g
%s/\([^\x00-\x7e]\+\) \([[:alnum:]]\+\)/\1\2/g
%s/\([[:alnum:]]\+\) \([^\x00-\x7e]\+\)/\1\2/g
:%s/>\s*</>\r</g
:w

五、常见问题

1.E212:无法打开并写入文件的解决办法


在编写配置文件时,常常忘记切换到root用户,导致文件编辑完毕,敲入:wq退出保存时,出现 E212:无法打开并写入文件的错误提示。这是由于在该目录下当前用户没有写权限导致。
解决办法如下:
(1)将文件保存到用户目录下,再改变所有者,然后移动到配置目录下,步骤如下:
1) 保存退出时用 :wq ! ~/tmp/file.conf
2)su切换到root用户,将file.conf改变属主,chown root file.conf
3)移动配置文件到目标目录,mv file.conf [pathname]

(2)第二种解决办法相对比较简便
保存文件时用 : w ! sudo tee %
tee用于读取输入文件,同时保存
%表示当前编辑文件
(不过这种方法有个要求就是当前编辑用户必须在sudoers这个文件中,这也是执行sudo命令的要求)

2.换行符的搜索/替换


换行在Vim中的行为很特殊也不够一致,需要单独讨论一下。首先区分一下\r和\n:

前者是回车(Carriage Return),在Vim中可通过ctrl-k cr或者ctrl-v 13输入,显示为^M。
后者是换行(New Line),在Vim中通过<CR>键输入,显示为回车并换行;
所以对于Windows风格换行(\r\n)在Vim中会在每行结尾显示^M。

搜索
在搜索模式(/)搜索换行时仍然应当使用\n字符,因为Vim的换行(Unix风格)确实是\n而不是\r\n。例如:

/foo\nbar

可以匹配到所有的:

foo
bar

替换
:s命令替换为换行(NL, \n)时,应当写 \r 而不是\n。 例如将所有逗号替换为换行:

:%s/,/\r/g
如果使用\n则目标会被替换为空字符NULL(显示为^@)

将DOS风格换行(\r\n)的文件转为Unix风格换行(\n)其实很简单,不需要手动查找替换:
:set fileformat=unix
:w

Excel等软件经常用CR(^M, \r)来换行,怎么把 \r换成 \n 呢?
:%s/<Ctrl-k>cr/\r/g

六、vim配置文件

Vim的全局配置一般在/etc/vim/vimrc或者/etc/vimrc,对所有用户生效。

用户个人的配置在~/.vimrc。

每次都要设置的选项,可以写在配置文件里。
双引号表示注释。

1.设置显示行号
vim .vimrc
添加一行set number
这样每次打开vim都会显示行号

2.设置搜索高亮
vim ~/.vimrc
添加一行set hlsearch

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值