My Vim Learning Notes

KEEP IT DOWN BEFORE YOU FORGOT IT!

Image credit: Baidu Image

4.1移动(基本)

3)屏幕移动

命令英文功能
Ctrl+bback向上翻页
Ctrl+fforward向下翻译
HHead屏幕顶部
LLow屏幕底部
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删除文本

命令英文功能
xcut删除光标报所在字符,或者(可视模式)选中的文字
d(+移动命令)delete删除移动命令对应的内容
dddelete删除光标所在行,可以ndd删除多行
Ddelete删除至行尾

提示

  • 删除命令可以和移动命令连用,以下是常见的组合命令:
  • 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复制
yycopy复制一行,可以nyy复制多行
ppaste粘贴
提示
  • 命令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字母比价时忽略字母的大小写
Next