My Vim Learning Notes
KEEP IT DOWN BEFORE YOU FORGOT IT!
4.1移动(基本)
3)屏幕移动
命令 | 英文 | 功能 |
---|---|---|
Ctrl+b | back | 向上翻页 |
Ctrl+f | forward | 向下翻译 |
H | Head | 屏幕顶部 |
L | Low | 屏幕底部 |
zz | 移动光标到屏幕中间,并将光标所在行一并移动 | |
zt | 移动光标到屏幕顶部,并将光标所在行一并移动top | |
zb | 移动光标到屏幕底部,并将光标所在行一并移动bottom |
4)快速定位 ‘.(单引号+点号)光标跳转到最后修改行 `.(1左边哪个键+点号)光标跳转到最后修改点 ‘"(单引号+双引号)光标跳转到上一次离开该文件时修改的行
- g;g,快速定位到上次编辑的行
- __gg#__跳到第#行
- __-__跳转到上一行行头__+__跳到下一行行头
- w移动光标到下一个单词(符号)首个字符
- e移动到光标下一个单词(符号)尾部字符
- ge移动到光标到上一个单词(字符)尾部字符
- b移动到光标上一个单词(符号)首个字符
- fa移动到下一个a单词处
- n
n是数字。光标向下移动行 - -,光标移动到非空白字符的下一行(上一行) (上述命令对应的大写W,E,gE,B能够对以空字符分割的字符串相应的移动,同时上述命令可以将计数前缀,如2w移动光标到后两个单词(符号)的首个字符) f w ; ;移动到下个 “* w"+ n
4.4删除文本
命令 | 英文 | 功能 |
---|---|---|
x | cut | 删除光标报所在字符,或者(可视模式)选中的文字 |
d(+移动命令) | delete | 删除移动命令对应的内容 |
dd | delete | 删除光标所在行,可以ndd删除多行 |
D | delete | 删除至行尾 |
提示
- 删除命令可以和移动命令连用,以下是常见的组合命令:
- dw#从光标位置删除至单词末尾;
- d0#从光标位置删除至行的起始位置;
- d}#从光标位置删除至段落结尾;
- ndd#从光标位置向下连续删除n行;
- d代码行G#从光标位置向下连续删除n行;
- d’a#从光标所在行删除到标记a之间的所有代码;
- d$#将光标至行尾的字符删除=拷入剪切板;
- ranged#行范围删除
- dG#删除光标所在行(包含本行)到最后所有行内容
- dgg#删除光标所在行(包含本行)到首行所有内容
- ggdG#删除所有行
- 命令p类似于图形界面的粘贴操作——CTRL+V
- __vi__中的文本缓冲区同样只有一个,如果后续做过复制、剪切操作,之前缓冲区中的内容会被替换
4.6复制、粘贴
vi中提供有一个被复制文本的缓冲区
复制命令会将选中的文字保存在缓冲区
删除命令删除的文字会被保存在缓冲区
在需要的位置,使用粘贴命令可以将缓冲区的文字插入到光标所在的位置
命令 | 英文 | 功能 |
---|---|---|
y(+移动命令) | copy | 复制 |
yy | copy | 复制一行,可以nyy复制多行 |
p | paste | 粘贴 |
提示 |
命令d,x类似于图形界面的剪切操作——CTRL+X
命令y类似于图形界面的复制操作——CTRL+C
命令p类似于图形界面的粘贴操作——CTRL+V
__vi__中的文本缓冲区同样只有一个,如果后续做过复制、剪切操作,之前缓冲区中的内容会被替换
y0-将光标只行首的字符拷入剪切板
y$-将光标至行尾的字符拷入剪切板
rangey-块拷入剪切板 注意
__vi__中的文本缓冲区和系统的剪切板不是同一个
所以在其他软件中使用__CTRL+C__复制的内容,不能在__vi__中通过__p__命令粘贴
可以在编辑模式下使用鼠标右键粘贴
##4.10查找并替换(一)
在vi中查找和提换命令需要在末行模式下执行
记忆命令格式:
:%s///g省略g则是只替换一个
1)全局替换
- 一次性替换文件中的所有出现的旧文件
- 命令格式如下
:%s/旧文本/旧文本/g 2)可视区域替换
- 先选中要替换文字的范围
- 命令格式如下:
:s/str1/str2–替换当前行第一个str1为str2 :s/str1/str2/g–“g"表示全局global :.,$s/str1/str2/g–".“表示当前行,“$"表示最后一行 :1,$s/str1/str2/g– :%s/str1/str2/g–全文替换 :%s/$/str/g–全文的行尾追加str :n1,n2s/str1/str2/g–从n1行到n2行之间进行全局替换
3)确认替换
- 如果把末尾的__g__改成__gc__在替换的时候,会有提示!推荐使用
- 命令格式如下:
:%s/旧文本/旧文本/gc 1.y-yes
2.n-no
3.a-all
4.q-quit
5.l-last
6.^E向下滚屏
7.^r向上滚屏
查找并替换(二)
演练2——利用可视块给多行代码增加注释
- 在可发中,可能会遇到一次性给多行代码增加注释的情况
在python中,要给代码增加注释,可以在代码前郑家一个#
要实现这个效果可以在命令模式下
1)移动到要添加注释的第一行代码,按^来到行首; 2)按__CTRL+v__进入可视块模式; 3)使用__j__向下连续选中要添加的代码行; 4)输入__I__进入编辑模式,并在行首插入,注意:一定要使用!; 5)输入__#__; 6)按下__ESC__返回到**命令模式**,返回之后__vi__会在之前选中的每一行代码前插入__#__
高效组合命令
1.ddp:交换光标所在行与下一行的位置,作用类似于末行模式下imj,i为本行行号,j为下一行行号 2.
指令备忘录
通用指令形式:<
startposition>``<
cmd>``<
endposition>
- a(append)__A__行末加入内容
- i(insert)__I__行首插入
- o(openaline)
- c(change)ciw(changeinnerword),caw(changearoundword)ct),(changeto”)")__cw__替换从光标所在位置到最后一个单词结尾的字符
- x删除光标所在位置后一字符;X删除光标所在位置前一个字符,可结合移动命令使用
- d(delete) d0 删到行头 d$ 删到行尾 d{ 删除从光标位置到段落起始位置 d} 删除从光标位置到段落结尾位置 dw(deleteword) diw(deleteinnerword) daw(deletearoundword) dta(deletetoa) dnl dnh 向右、向左删除n个字符(包含空格)
- ctrl+u(upward)ctrl+f(forward)
- y:(yank)ye yw y$ yta y2/word 拷贝两个word之间的字符
- p:(paste)
- m(mark)m+(a-z)
- J:合并两行:join合并多行
- 命令行模式下__#m#__,交换两行,:20,30m40,50交换20-30行和40,50行
- t:ta 跳到下一个a前,#ta:
- f:fa 跳到下一个a,大写意思相反;#fa:在当前行查找第#个出现的a
- * 匹配光标所在单词,移动到下一个匹配单词 # 跳到上一个匹配单词 ps: :%s/^ \s{4}//g其中,^\s{4}是正则表达式
大小写转换
~将光标下的字母改变大小写
3~将光标位置开始的3个字母改变其大小写
g~~改变当前行字母的大小写
U将可视模式下选择的字母全改成大写字母
u将可视模式下选择的字母全改成小写
gUU将当前行的字母改成大写
3gUU将从光标开始到下面3行字母改成大写
guu将当前行的字母全改成小写
gUw将光标下的单词改成大写。gUiw
guw将光标下的单词改成小写。guiw
##正则表达式和上下文相关替换
语法格式:
:g/pattern/s/old/new/g
将包含在pattern中的行所有old替换为new
自动提示:<
c-n>
,<
c-p>
在inset模式下,输入一个词的开头,使用<
c-n>
自动补齐功能就出现
##模式切换
__<
Ctrl>
+c__Gofromcommand-linemodetonormalmode
##vim编辑器配置方法 .vimrc文件中配置
setnu
setshowcmd
imap()()<
Left>
imap{}{}<
Left>
imat[][]<
Left>
##正则表达式
####6个字符元
+.*[^$
+其它字符与其自身匹配
####转义 +用反斜线可以取消特殊字符的特殊含义。
如:正则表达式end.只与字符串end.匹配
####单字符正则表达式
- 长的正则表达式由单字符正则表达式构成
- 非特殊字符与其自身匹配
- 转义字符()
- 圆点可以匹配任何一个字符(.)
####单字符正则表达式:定义集合
- 在一对方括号之间的字符为集合的内容,如:单字符正则表达式[abcd]与a或b,c,d匹配
- 圆点,星号反斜线在方括号内时,代表他们自己,如[*.]可以匹配3个单字符
- 用减号-定义一个区间如[a-d][A-Z][a-zA-Z0-9],[][]集合含左右中括号两个字符
- 减号在最后,则失去表示区间的意义[ad-]只与3个字符匹配
- 用^表示补集 ^在开头,则表示与集合内字符之外的任何字符匹配如:[^a-z]匹配任一非小写字母,[^][]匹配任一非中括号字符
- ^不在开头,则失去其表示补集的意义,如:[a-z^]能匹配27个字符
####单字符正则表达式的组合
- 如abc,[A-Z].[0-9].
- 单字符正则表达式后面跟*,匹配次单字符表达式的0次或者任意多次出现,如:12*4,与字符串1224,12224,14都是匹配的,与1234不匹配 例如,正则表达式[A-Z][0-9]*,此正则表达式中的*的作用的单字符正则表达式为[0-9],代表 [A-Z][A-Z][0-9][A-Z][0-9][0-9]等等,与A,A1,C45,D768匹配,与b64512,T56t不匹配。
例:正则表达式[Cc]hapter*[1-4]
- 在*号前有一个空格,允许数字1-4之前有多个或者0个空格,可匹配Chapter2,chapter3等等
- 例:正则表达式a[i]=b[j]***c[k]匹配字符串a[i]=b[j]*c[k],容许等号和星号两侧有空格
- 例:在vi中使用:,$s/[0-9]/xx/g会出错:,$s/[0-9]/xx/g ####锚点:$与^
- $在尾部时有特殊意义,否则与其自身匹配
- 例:123$匹配文件中行尾的123,不在行尾的123字符不匹配
- 例:$123与字符$132匹配
- 例:.$匹配行尾的任意字符
- ^在首部时有特殊意义,否则与其自身匹配
- 例:^printf匹配行首的printf字符穿,不在行首的printf串不匹配
- 例:Hel^lo与Hel^lo匹配(此时锚点^没有特殊意义)
- 例::10,50s/^//g删除10,50行的每行行首的4个空格
- PRE:扩展的正则表达式,PCRE:Perl-compatibleregularexpression
正则表达式处理命令
- grep/egrep/fgrep:在文件中查找字符串(筛选)
- sed:流编辑(加工)
- awk:逐行扫描近心给文本处理的一门语言(筛选加工)
grep
- 语法
- grep模式文件名列表
举例
- grepO_RDWR*.h
- ps-ef|grepliang
- ls-l/|grep'^d'|wc-l
- grep’[0-9]*‘shudu.c
- grep’[0-9][0-9]*‘shudu.c
- 选项
- -n显示时每行前面显示行号
- -v显示所有不包含模式的行
- -i字母比价时忽略字母的大小写