[toc]
一、vim 操作技巧
1、vim中如何删除行?
dd:删除光标所在行,n dd删除指定的行数
删除命令:
x:删除光标后一个字符,相当于Del
X:删除光标前一个字符,相当于Backspace
dd:删除光标所在行,n dd删除指定的行数
D:删除光标后本行所有内容,包含光标所在字符
d0:删除光标前本行所有内容,不包含光标所在字符
dw.删除光标开始位置的字,包含光标所在字符</pre>
2、vim中命令如何撤销?
u:一步一步撤销
Ctr-r:反撤销
3、vim中如何选中多行(比如我想要多行缩进)
1、字母v,然后向下拖
2、文本行右移(shift+>)
4、vim中如何设置tab默认缩进四个空格?
1、vim ~/.vimrc
2、set ts=4
5、vim中文本如何左右移动(比如缩进)?
>>:文本行右移
<<:文本行左移
6、vim中复制粘贴命令?
yy复制当前行,nyy复制n行,yw复制单词
p:在光标所在位置向下新开除一行,粘贴
7、vim中的查找命令是什么?
1、比如要做world,直接末行模式下敲 /world 即可
2、n:下一个 N:上一个
8、vim中将整个文件中的abe替换为123(vim中的替换命令)?
1、末行模式下%s/abe/123/g
2、%表示整个文件,g是全局的意思,s是替换的意思
替换操作: r:替换当前字符 R:替换当前行光标后的字符查找命令::/:str查找 n:下一个 N:上一个 s.替换命令:把abc全部替换成123 末行模式下,将光标所在行的abc替换成123 :%s/abe/123/g
9、vim中,末行模式下,将第一行至第10行之间的abc替换成123?
1,10s/abc/123/g
10、vim中如何在vim中敲shell命令(比如我查看linux系统中是否存在某某文件)?
末行模式下,!感叹号加命令:!ls /etc
11、vim中重复上次命令的命令?
.:逗号,重复上一次操作的命令
替换操作:
r:替换当前字符
R:替换当前行光标后的字符查找命令::/:str查找
n:下一个 N:上一个
s.替换命令:把abc全部替换成123
末行模式下,将光标所在行的abc替换成123
:%s/abe/123/g
删除命令:
x:删除光标后一个字符,相当于Del
X:删除光标前一个字符,相当于Backspace
dd:删除光标所在行,n dd删除指定的行数
D:删除光标后本行所有内容,包含光标所在字符
d0:删除光标前本行所有内容,不包含光标所在字符
dw.删除光标开始位置的字,包含光标所在字符
撤销命令:
u:一步一步撤销
Ctr-r:反撤销:
重复命令:
.:重复上一次操作的命令
二、vim 修改光标效果
默认光标显示效果不好,想要修改,定制:
https://www.cnblogs.com/yzsatcnblogs/p/4277891.html
三、正则表达式
1、来源
https://blog.csdn.net/u014015972/article/details/50688837
2、替换
:1,10s/from/to/ 表示在第1到第10行(包含第1,第10行)之间搜索替换
:10s/from/to/ 表示只在第10行搜索替换
:%s/from/to/ 表示在所有行中搜索替换 :1,$s/from/to/g 同上,从第一行到最后一行,加上g表示全局
3、替换中的flag关键字
flags 有如下四个选项:
c confirm,每次替换前询问;
e error, 不显示错误;
g globle,不询问,整行替换。如果不加g选项,则只替换每行的第一个匹配到的字符串;
i ignore,忽略大小写
这些选项可以合并使用,如cgi表示不区分大小写,整行替换,替换前询问
4、正则表达式的元字符
. 匹配任意字符
[abc] 匹配方括号中的任意一个字符,可用-表示字符范围。如[a-z0-9]匹配小写字母和数字
[^abc] 匹配除方括号中字符之外的任意字符
\d 匹配阿拉伯数字,等同于[0-9]
\D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]
\x 匹配十六进制数字,等同于[0-9A-Fa-f]
\X 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]
\l 匹配[a-z]
\L 匹配[^a-z]
\u 匹配[A-Z]
\U 匹配[^A-Z]
\w 匹配单词字母,等同于[0-9A-Za-z_]
\W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]
\t 匹配<TAB>字符
\s 匹配空白字符,等同于[\t]
\S 匹配非空白字符,等同于[^\t]
5、一些普通字符需转意
* 匹配* 字符
. 匹配. 字符
\/ 匹配 / 字符
\ 匹配 \ 字符
\[ 匹配 [ 字符
\] 匹配 ] 字符
6、表示数量的元字符
* 匹配0-任意个
\+ 匹配1-任意个
\? 匹配0-1个
\{n,m} 匹配n-m个
\{n} 匹配n个
\{n,} 匹配n-任意个
\{,m} 匹配0-m个
7、表示位置的元字符
$ 匹配行尾
^ 匹配行首
\< 匹配单词词首
\> 匹配单词词尾
8、替换变量
在正则式中以\(和\)括起来的正则表达式,在后面使用的时候可以用\1、\2等变量来访问\(和\)中的内容
9、几个例子
删除行尾空格::%s/\s+$//g
删除行首多余空格:%s/^\s*// 或者 %s/^ *//
删除沒有內容的空行:%s/^$// 或者 g/^$/d
删除包含有空格组成的空行:%s/^\s*$// 或者 g/^\s*$/d
删除以空格或TAB开头到结尾的空行:%s/^[ |\t]*$// 或者 g/^[ |\t]*$/d
把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以有下列写法
将行中开头数字删除:
110:/home/user/a.c:194: first defined here
:%/^\d\+://g
替换命令可以在全文中用一个单词替换另一个单词:
:%s/four/4/g "%" 范围前缀表示在所有行中执行替换。
最后的 "g" 标记表示替换行中的所有匹配点。
如果仅仅对当前行进行操作,那么只要去掉%即可
如果你有一个象 "thirtyfour" 这样的单词,上面的命令会出错。
这种情况下,这个单词会被替换成"thirty4"。要解决这个问题,用 "\<" 来指定匹配单词开头:
:%s/\<four/4/g 显然,这样在处理 "fourty" 的时候还是会出错。
用 "\>" 来解决这个问题:
:%s/\<four\>/4/g
如果你在编码,你可能只想替换注释中的 "four",而保留代码中的。
由于这很难指定,可以在替换命令中加一个 "c" 标记,这样,Vim 会在每次替换前提示你:
:%s/\<four\>/4/gc
删除多余的空格:
要删除这些每行后面多余的空格,可以执行如下命令:
:%s/\s\+$//
命令前面指明范围是 "%",所以这会作用于整个文件。
"substitute" 命令的匹配模式是 "\s\+$"。这表示行末($)前的一个或者多个(\+)空格(\s).
替换命令的 "to" 部分是空的:"//"。这样就会删除那些匹配的空白字符。
匹配重复性模式:
星号项 "*" 规定在它前面的项可以重复任意次。因此:
/a* 匹配 "a","aa","aaa",等等。
但也匹配 "" (空字串),因为零次也包含在内。星号 "*" 仅仅应用于那个紧邻在它前面的项。
因此 "ab*" 匹配 "a","ab","abb","abbb",等等。
如要多次重复整个字符串,那么该字符串必须被组成一个项。
组成一项的方法就是在它前面加 "\(",后面加 "\)"。
因此这个命令:
/\(ab\)* 匹配: "ab","abab","ababab",等等。
而且也匹配 ""。要避免匹配空字串,使用 "\+"。
这表示前面一项可以被匹配一次或多次。
/ab\+ 匹配 "ab","abb","abbb",等等。它不匹配 后面没有跟随 "b" 的 "a"。
要匹配一个可选项,用 "\="。
例如:
/folders\= 匹配 "folder" 和 "folders"。
指定重复次数
要匹配某一项的特定次数重复,使用 "\{n,m}" 这样的形式。
其中 "n" 和 "m" 都是数字。
在它前面的那个项将被重复 "n" 到 "m" 次 (|inclusive| 包含 "n" 和 "m")。
例如:
/ab\{3,5} 匹配 "abbb","abbbb" 以及 "abbbbb"。
当 "n" 省略时,被默认为零。
当 "m" 省略时,被默认为无限大。
当 ",m" 省略时,就表示重复正好 "n" 次。
例如:
模式 匹配次数
\{,4} 0,1,2,3 或 4
\{3,} 3,4,5,等等
\{0,1} 0 或 1,同 \=
\{0,} 0 或 更多,同 *
\{1,} 1 或 更多,同 \+
\{3} 3
多选一匹配
在一个查找模式中,"或" 运算符是 "\|"。
例如:
/foo\|bar 这个命令匹配了 "foo" 或 "bar"。
更多的抉择可以连在后面:
/one\|two\|three 匹配 "one","two" 或 "three"。
如要匹配其多次重复,那么整个抉择结构须置于 "\(" 和 "\)" 之间:
/\(foo\|bar\)\+ 这个命令匹配 "foo","foobar","foofoo","barfoobar",等等。
再举个例子:
/end\(if\|while\|for\)
这个命令匹配 "endif","endwhile" 和 "endfor"。
四、shell脚本操作vim
1、开胃小菜(为啥不行,怎样调用?)
#! /bin/bash
vi abc.txt < EOF
i # 进入 insert 模式
Here is a document! # 输入文本内容
^[ # 意为按下ESC退出编辑模式
:wq # 保存退出
EOF
五、不区分大小写搜索
忽略大小写搜索:
:set ignorecase
恢复大小写敏感:
:set noignorecase
六、分屏操作
1、分屏启动
垂直大O:vim -On file_1 file_2 ...
水平小o:vim -on file_1 file_2 ...
n 表示数字:分几屏
2、关闭分屏
关闭当前窗口: ctrl+W c
ctrl+W q
3、分屏
上下:ctrl+W s
上下分屏,并打开新文件 :sp fileName
左右分割:ctrl+W v
左右分割,并打开新文件 :vsp fileName
4.移动光标是hjkl,在各屏间切换,只需按Ctrl+W
1.把光标移到右边 Ctrl+W l
2.把光标移到左边的屏中 Ctrl+W h
3.把光标移动到上边的屏中 Ctrl+W k
4.把光标移动到下面的屏中 Ctrl+W j
5.把光标移动到下一个屏中 Ctrl+W w
5.下面是改变尺寸的操作,主要是高度,对于宽度你可以使用Ctrl+W <或是>,但这可能需要最新的版本才支持。
1.让所有的屏都有一样的高度 Ctrl+W =
2.增加高度 Ctrl+W +
3.减少高度 Ctrl+W -
4.移动分屏
6.这个功能还是使用了Vim的光标键,只不过都是大写。当然了,如果你的分屏很乱很复杂的话,这个功能可能会出现一些非常奇怪的症状
1.向右移动 Ctrl+W L
2.向左移动 Ctrl+W H
3.向上移动 Ctrl+W K
4.向下移动 Ctrl+W J
七、vim打开文件乱码问题
转1. http://blog.sina.com.cn/s/blog_40e1ba640102wm26.html
2.http://www.cnblogs.com/joeyupdo/archive/2013/03/03/2941737.html
以下为copy链接2中的介绍
(1)encoding: Vim 内部使用的字符编码方式,包括 Vim 的 buffer (缓冲区)、菜单文本、消息文本等。用户手册上建议只在 .vimrc 中改变它的值,事实上似乎也只有在 .vimrc 中改变它的值才有意义
(2)fileencoding: Vim 中当前编辑的文件的字符编码方式,Vim 保存文件时也会将文件保存为这种字符编码方式 (不管是否新文件都如此),网上是这样介绍的,但是我这样做在.vimrc中定义为utf-8似乎没有作用,只能在打开vim文件时手动设置才会起效,不知道什么原因。
(3)fileencodings: Vim 启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将 Unicode 编码方式放到这个列表的最前面,将拉丁语系编码方式 latin1 放到最后面。
(4)termencoding: Vim 所工作的终端 (或者 Windows 的 Console 窗口) 的字符编码方式。这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效,而对 Console 模式的 Vim 而言就是 Windows 控制台的代码页,并且通常我们不需要改变它。
系统locale是utf-8(很多linux系统默认的locale形式),编辑的文档是GB2312或GBK形式的(Windows记事本
默认保存形式,大部分编辑器也默认保存为这个形式,所以最常见),终端类型utf-8(也就是假定客户端是putty类的unicode软件)
则vim打开文档后,encoding=utf-8(locale决定的),fileencoding=latin1(自动编码判断机制不准导致的),termencoding=空(默认无需转换term编码),显示文件为乱码。
解决方案1:首先要修正fileencoding为cp936或者euc-cn(二者一样的,只不过叫法不同),注意修正的方法不是:set
fileencoding=cp936,这只是将文件保存为cp936,正确的方法是重新以cp936的编码方式加载文件为:edit
++enc=cp936,可以简写为:e ++enc=cp936。
但是这样做,文件关闭后重新打开又要重新设置一遍。出现乱码归根结底的原因是vim不能识别该文件的编码方式,导致不能正常解码(不知道是不是叫解码,我的理解)。所以,我在.vimrc中设置了fileencodings,相当于告诉vim当以utf-8解码文件不成功时以这么几种方式尝试,set fileencoding=utf-8 set fileencodings=ucs-bom,utf-8,cp936,latin1. 这样打开正常了