实用的vi小技巧(更新)

1、末行模式下s替换

  • 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 为 .,表示从当前行开始到最后一行也可以先用Ctrl+V选中需要操作的行

  • #:s/old/new/g:将当前行所有的old替换成new,

s是substitute,g是global:1,10s/old/new/g:将第1到第10行所有的old替换成new,如果不加最后的参数g,只会替换每行第一个需要替换的字符

2、多行拼接成一行

  • #shift+j(末行模式下)

3、录制一个宏

1.one
2.two
3.three
4.four

修改为

1)One
2)Two
3)Three
4)Four

命令操作:

  • #qa
  • #0f.
  • #r)
  • #w~
  • #j
  • #q

4、执行一个宏

  • #3@a,数字自己设置

5、查看寄存器a中的内容

  • #:reg a

6、修改一个记录的宏

  • #qA,vim也会记录操作,但是会追加到寄存器a原有的内容之后
  • #:put a 将宏粘贴到文档中,编辑好以后执行"add或者:d a
  • #:reg a

7、用精准的文本对象选择

光标在url的r上

var tpl = [
    '{title}'
]
  • #vi} 选取url
  • #va" 选取"{url}"
  • #vi> 选取
  • #vit 选取{title}
  • #vat 选取{title}
  • #va] 选取
操作文本块,单词,句子,段落
  • #iw 当前一个单词
  • #aw 当前一个单词和一个空格
  • #is 当前句子(空行)
  • #ip 当前段落

a和i的区别在于是否选取边界,a包含边界,t表示xml标签

8、删除一个单词

  • #daw,删除一个单词外加一个空格。
  • #diw,删除一个单词不加空格。
  • #ciw,删除一个单词并进入插入模式。
  • #caw,删除一个单词,外加一个空格并进入插入模式。

9、设置位置标记,以便快速跳转

  • $ ma(a=a~z),标记一个位置用a代替
  • $ 'a跳转到标记位置
  • 自动标记
  • #’’ 跳转到文件中上次跳转之前的位置
  • #’. 上次修改的地方
  • #’^ 上次插入的地方
  • #’[ 上次修改或插入的起始位置
  • #’] 上次修改或插入的结束位置
  • #’< 上次高亮选取的起始位置
  • #’> 上次高亮选取的结束位置

10、’:t’和’:m’命令复制和移动行

  • #:9copy. 将第九行复制到当前行

  • #:9t. 将第九行复制到当前行

  • #:m2 将选中的文本移动到第二行

  • #:m$ 将选中的文本移动到末行

  • #Vj选中 :m$ 将选中的文本移动到末行(不能超过文本的最大行)

11、大小写转换

  • #guu当前行转换为小写
  • #gUU当前行转换为大写
  • #g~~当前行大小写转换

12、插入模式下删除操作

  • #Crtl+h 删除前一个字符
  • #Crtl+w 删除前一个单词
  • #Crtl+u 删除至行首

13、插入模式返回普通模式

  • #Esc
  • #Ctrl+[
  • #Ctrl+o(从插入模式临时切换到普通模式,输入任何一次命令后切回插入模式)

14、不离开插入模式,粘贴寄存器中的文本

  • #Ctrl+r其中register是想要插入的寄存器的名字
  • #reg 查看寄存器的内容

15、对字符进行查找

  • #f, ;正向查找下一个(本行)
  • #F, ;反向查找下一个(本行)
  • #t, ;正向查找下一个(本行),查找字符的前一个字符上
  • #T, ;反向查找下一个(本行),查找字符的后一个字符上
  • #dt; 删除t查找的字符到;号之间的内容

16、表达式寄存器的使用

a、当成计算器

  • #Ctrl+r = 6*35+Enter (插入模式下)

17、用字符编码插入非常用字符

  • #Ctrl+v 065 插入A,vim接受的字符编码共3位数字,超过3位使用4位十六进制编码来输入
  • #Ctrl+v u00bf ,插入“¿”
  • 使用ga查看任意字符的编码

18、global命令

  • #:g/test/d 删除所有带test的行
  • #:g!/test/d 保留所有带test的行,等同于$ :v/test/d
  • #:g/test1/,/test2/d 删除test1到test2之间的行

19、实际行与屏幕行

有时候一行内容比较多的,编辑器会自动换行分成多行显示,而j,k移动只会识别实际行,让移动显得不顺手gj和gk可以实现屏幕行的移动

  • #j :向下移动一个实际行
  • #gj :向下移动一个屏幕行
  • #k :向上移动一个实际行
  • #gk :向上移动一个屏幕行
  • #0 :移动到实际行的行首
  • #g0 :移动到屏幕行的行首
  • #^ :移动到实际行的第一个飞空白字符
  • #g^ :移动到屏幕行的第一个飞空白字符
  • #$ :移动到实际行的行尾
  • #g$ :移动到屏幕行的行尾

20、基于单词移动

  • #w或W :光标右移一个字至字首

  • #b或B :光标左移一个字至字首

  • #e或E :光标右移一个字至字尾

21、用精准的文本对象选择选区

文本对象允许操作括号、被引用的文本、XML标签以及其他文本的常见结构,假设光标位于需要选取的内容内部,a和i的区别在于选不选取边界

  • #vi} :选取{}里面的内容,不包括{}
  • #va} :选取{}里面的内容,包括{}
文本对象 选择区域
a)或者ab 一对圆括号
a}或者aB 一对花括号
a] 一对方括号
a> 一对尖括号
a’ 一对单引号
a" 一对双引号
a` 一对反引号
at 一对XML标签

22、利用s命令删除行首,行尾的空格和tab键

#:%s/^\s+

#:%s/\s+$

其中

%s表示全局搜索

/为分隔符如例:s/a/b/g ;a 被查找的字符串(正则匹配);b 要替换成的文字;g 表示全局搜索替换(否则只处理找到的第一个结果)

^代表行首

\s代表空格和tab

+代表匹配一个或多个

$匹配行尾

23、对象选择调整起始位置(Shift+v,Crtl+v,v)

我们在使用Shift+v选择文本对象时,又是开始选择了一部分代码行,发现上面的注释也是需要的:
那这时候很多人会选择Esc重新选择
或者是先选中当前内容,做完相应操作再来把遗漏的部分选上,再操作。
这里分享一个vi命令:
#Shift+o

24、normal修改可视块区域

比如需要在每行的行首行尾加上;或者//,一行一行的添加会很麻烦,使用Shift+v选中修改区域进入末行模式
#: normal A;回车(在每行末尾加上;)
#: normal I//回车(在没开行首加上//)

25、grep查找xargs sed替换

  • #grep -rl c e n t e n t ∗ ∣ x a r g s s e d − i ′ s / centent *|xargs sed -i 's/ cententxargssedis/oldCentent/$newCentent/g’
  • -l参数只列出文件名
  • -i查找到并覆盖内容

26、回到上次修改的地方

切换到普通模式,

  • 输入 g; 来即可切换到上次修改的位置。

27、sh命令

  • :sh启动sh,从sh中返回可用exit或者ctrl+d

28、回退到上/下一次修改的位置

  • ctrl+o回到上一次修改的位置
  • ctrl+i撤销上一次跳转

29、更新

你可能感兴趣的:(实用的vi小技巧(更新))