Linux vim 随记
命令模式
三种命令模式
vim的三种命令模式:
- 命令模式:用于输入命令,简单更改
- 插入模式:用于插入文本,修改文本
- 末行模式:用于输入命令,视化操作,查找替换等
三种模式之间的切换方式:
- 命令模式进入到插入模式:输入文本插入命令(i,I,a,A,o,O)
- 插入模式退出到命令模式:ESC
- 命令模式进入到末行模式:冒号:
- 末行模式退出到命令模式:Enter或者ESC.
vim命令集合:http://www.cnblogs.com/kzloser/archive/2012/09/12/2681111.html
图释指令
光标移动-------------
按行移动:
按字符移动:
插入命令-------------
常用命令-------------
普通模式下命令
复制,删除,粘贴
- 粘贴: 把 vim 中缓存区的数据,粘贴到光标附近(即 p 为光标后, P为光标前)
- 删除: 把 vim 中选中的删除数据先拷贝到缓冲区并覆盖原有数据,然后删除选中数据
- 复制: 把 vim 中选中的数据拷贝的缓冲区并覆盖原有数据
例子:
现在有数据如下:aaaaabbbbbcccccdddddfffff
假设我们的光标在第一个 b 这个位置, 在一般模式下输入 5x (即输入删除 5 个 b 的操作) 后结果为:
aaaaacccccdddddfffff
然后在按下 p (即在光标位置处后面粘贴缓冲区的数据),结果为:
aaaaacbbbbbccccdddddfffff
删除某区域内容:
可以重复的:
[d]+[num]+[ h / j / k / l / w / b / e / ( / ) / { / } / $ / G / /word / ?word / tc / Tc / fc / Fc / `c ]
- d: 表示删除操作
- 重复操作次数: num 表示操作重复次数
- 操作区域选择:
- h 删除光标前一个字符
- l 删除光标所在处的字符
- j 删除本行与下一行
- k 删除本行与上一行
- w 删除光标开始到下一个单词词首处
- b 删除光标开始到上一个单词词首处
- e 删除光标开始到这个单词的结尾处
- ( 删除光标开始到句子结束处
- ) 删除光标开始到句子开始处
- { 删除光标开始到段落开始处
- } 删除光标开始到段落结束处
- $ 删除从光标开始处到行尾处
- G 删除从光标所在行到行尾处
- /word 删除从光标开始处到下个 word 字符串,不含 word ( word 指代任意字符串 )
- ?word 删除从光标开始处到上个 word 字符串,不含 word ( word 指代任意字符串 )
- tc 删除从光标开始处到下个 c 字符处,不含 c ( c 指代任意字符 )
- Tc 删除从光标开始处到上个 c 字符处,不含 c ( c 指代任意字符 )
- fc 删除从光标开始处到下个 c 字符处,含 c ( c 指代任意字符 )
- Fc 删除从光标开始处到上个 c 字符处,含 c ( c 指代任意字符 )
- `c 删除从光标开始到标记 c 这个位置
不可重复的:
[d]+[ 0 / ^ / H / L ]
- d: 表示删除操作
- 操作区域选择:
- d0 删除从光标所在处到某一行的开始位置
- d^ 删除到某一行的第一个字符位置(不包括空格或TAB字符)
- dL 删除直到屏幕上最后一行的内容
- dH 删除直到屏幕上第一行的内容
复制某区域内容:
可以重复的:
[y]+[num]+[ h / j / k / l / w / b / e / ( / ) / { / } / $ / G / /word / ?word / tc / Tc / fc / Fc / `c ]
含义用法如删除类似
不可重复的:
[y]+[ 0 / ^ / H / L ]
含义用法如删除类似
多加介绍个与上面用法相似的操作:
改变某区域内容:
可以重复的:
[c]+[num]+[ h / j / k / l / w / b / e / ( / ) / { / } / $ / G / /word / ?word / tc / Tc / fc / Fc / `c ]
含义用法如删除类似
不可重复的:
[c]+[ 0 / ^ / H / L ]
含义用法如删除类似
操作的组合
v 字符选择
操作流程:
v + 移动光标按键+ 数据操作键
- v 开始选择字符的标志
- 移动光标按键 移动光标确定选择区域(此处可以为多个移动光标的键值,但不能为组合键:如 [Ctrl]+[p] 等等)
- 数据操作键 对选择区域内的数据内容进行操作
例子[删除选择的字符区间 vwd(vwx)] :
现在有数据如下:
aaaaabbbbb ccccc
按下 v 键时(标志开始选择区域的操作):
aaaaa|bbbbb ccccc
按下 w 键时(选择操作区域,当然这里的 w 是可以换成 llllll [ 即六个小写的 L ]):
aaaaabbbbb ccccc
按下 d/x 键时(对数据进行操作,即删除所选择区域中的数据):
aaaaaccccc
V 列选择
操作流程:
V + 移动光标按键+ 数据操作键
- V 开始选择字符的标志
- 移动光标按键 移动光标确定选择区域(此处可以为多个移动光标的键值或者没有键值当没有键值的时候操作区域为光标所在行,但不能为组合键:如 [Ctrl]+[p] 等等)
- 数据操作键 对选择区域内的数据内容进行操作
例子[删除本行和下行数据 Vjd(Vjx)] :
现在有数据如下:
aaaaa
bbbbb
ccccc
按下 V 键时(标志开始选择区域的操作):
aaaaa
bbbbb
ccccc
按下 j 键时(选择操作区域):
aaaaa
bbbbb
ccccc
按下 d/x 键时(对数据进行操作,即删除所选择区域中的数据):
ccccc
字符串搜索
搜索字符串中的特殊字符
- ^ (行开始指示符)
当脱字符( 即 ^ ),作为搜索字符串的第一个字符时, vim 将每行的开始字符与搜索字符串进行匹配. - . (任意字符指示符)
句点( 即 . )可以与任意字符匹配,它可以出现在搜索字符串中的任意位置.当要查找句点符号时候可以用转义字符 . 来查找句点符号 - < (字符开始指示符)
这两个字符与单词的开始匹配 - > (字符结束指示符)
这两个字符与单词的结束匹配 - * (0个或者过个出现)
这个字符时一个修饰符,它与某个字符的 0 次或者多次出现相匹配 - [] (定义字符类)
单个字符匹配的区间(这里想要了解的更详细的话可以参考 正则表达式 )例如 ds[ab] 代表的是 dsa 与 dsb
示例------
句子:
being kind to yourself in everyday life is one of the best things you can do for yourself.
life will become lighter and your relationships will most likely improve
搜索字符串 | 描述 | 结果(以单词为单位) |
/you | 查找字符串 you 的下一次出现的位置 | yourself, you, yourself, your |
/<you> | 查找单词 you 的下一次出现的位置 | you |
/^be | 查找以 be 开始的下一行 | being ... |
/^[a-z][a-z] | 查找以两个字符开头开始的下一行 | being ... , life ... |
/<th | 查找以 th 开头的单词 | the thing |
/[a-m]e> | 查找以 [a-m]e 为结尾的单词 | life, the, life, become |
命令行的命令
字符替换
语法格式:
[range]s/{pattern}/{string}/[flag] [count]
格式说明:
- range 表示行数
- %表示所有行
- n1,n2 表示由 n1 行到 n2 行之间
- s 表示substitution,替换的意思
- pattern 表示被替换的字符串
- string 表示替换的字符串
- flag 表示标志,取值g,i,c等
- g 表示global,全部
- i 表示ignore,忽略大小写
- c 表示confirm,一个一个交互确认替换
- count 表示从当前行到接下来的第几行,表示范围
例子:
(1). 全部替换
参数g实现全部替换,否则只替换一个
:%s/{old-pattern}/new-text/g
(2). 行内替换
%代表所有行,去掉%表示当前行,只替换当前行
:s/{old-pattern}/new-text/g
(3). 指定行范围替换
对1到10行的结果替换
:1,10s/{old-pattern}/new-text/g
(4). 可视模式替换
如果你觉得数行数比较麻烦,可以使用可视模式,首先进入可视模式,然后选择行
列,最后输入:自动进入:'<,'>
后面加上s/{old-pattern}/new-text/g,则只替换选择区域的结果
:'<,'>s/{old-pattern}/new-text/g
(5). 整词替换,而不是部分匹配的单词
对单词匹配模式外包一个<和>
:s/<blog>/weibo/g //替换blog,但是cnblog,blogs则不会替换
(6). 多项替换
同时对多个匹配都替换成某一字符串
:%s/(good|nice)/awesome/g //good和nice都将被替换成awesome
(7). 确认式替换
参数c让替换进行交互请求,需要你选择y,n,a,l,q
选择说明:
- y 替换且跳转到下一个匹配结果
- n 不替换且跳转到下一个匹配结果
- a 替换所有并退出交互模式
- l 替换当前并退出交互模式
- q 退出交互模式
:s/{old-pattern}/new-text/gc
(8). 行首插入行号
把行首^替换成行号,可自定义具体形式
:%s/^/=line(".")/g
录制
这个其实很简单,但也是很强大的功能,作用是记录你的操作,并把操作过程记录起来.然后可以用 @@ 来调用出来你刚刚记录的操作集合,从而简化了复杂操作的过程
过程:
- q //标志开始录制
- x //x 是这个录制的寄存器,x 可以是其它字符
- 操作过程
- q //标志录制结束,现在dd这个操作被定义到了 @x 这个命令里了
图释:
Linux Vim 分屏功能
分屏启动Vim
使用大写的o参数来上下分屏。
vim -on file1 file2 ...使用小写的O参数来左右分屏。
vim -On file1 file2 ...注释: n是数字,表示分成几个屏。
关闭分屏
关闭当前窗口。
Ctrl+W c关闭当前窗口,如果只剩最后一个了,则退出Vim。
Ctrl+W q
分屏
上下分割当前打开的文件。
Ctrl+W s上下分割,并打开一个新的文件。
:sp filename左右分割当前打开的文件。
Ctrl+W v左右分割,并打开一个新的文件。
:vsp filename
移动光标
Vi中的光标键是h, j, k, l,要在各个屏间切换,只需要先按一下Ctrl+W
把光标移到右边的屏。
Ctrl+W l把光标移到左边的屏中。
Ctrl+W h把光标移到上边的屏中。
Ctrl+W k把光标移到下边的屏中。
Ctrl+W j把光标移到下一个的屏中。.
Ctrl+W w
移动分屏
这个功能还是使用了Vim的光标键,只不过都是大写。当然了,如果你的分屏很乱很复杂的话,这个功能可能会出现一些非常奇怪的症状。
向右移动。
Ctrl+W L向左移动
Ctrl+W H向上移动
Ctrl+W K向下移动
Ctrl+W J
屏幕尺寸
下面是改变尺寸的一些操作,主要是高度,对于宽度你可以使用Ctrl+W <或是>,但这可能需要最新的版本才支持。
让所有的屏都有一样的高度。
Ctrl+W =增加高度。
Ctrl+W +减少高度。
linux:vim 替换命令
vi/vim 中可以使用 :s 命令来替换字符串。以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询。
:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
n 为数字,若 n 为 .,表示从当前行开始到最后一行
:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/
* ************************************
1.:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
:s/vivian/sky/g 替换当前行所有 vivian 为 sky
2. :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
(n 为数字,若 n 为 .,表示从当前行开始到最后一行)
3. :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
4. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
5. 删除文本中的^M
问题描述:对于换行,window下用回车换行(0A0D)来表示,Linux下是回车(0A)来表示。这样,将window上的文件拷到unix上用时,总会有个^M.请写个用在unix下的过滤windows文件的换行符(0D)的shell或c程序。
· 使用命令:cat filename1 | tr -d “^V^M” >newfile;
· 使用命令:sed -e “s/^V^M//” filename >outputfilename。需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M。你必须要手工进行输入,而不是粘贴。
· 在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令:%s/^V^M//。
· :%s/^M$//g
如果上述方法无用,则正确的解决办法是:
· tr -d "r" <src >dest
· tr -d "5" dest
· strings A>B
6. 其它
利用 :s 命令可以实现字符串的替换。具体的用法包括:
:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1
:g/str1/s//str2/g 功能同上
从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索
字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。