vim编辑

不想你离开。 提交于 2019-12-04 16:29:27

 

建议大家参考网上的文章:正则表达式30分钟入门教程 其中W3Cschool版本是经作者授权后整理并转载;因为vim也支持正则表达式!

vim编辑器:文本编辑器

何为文本?一般指纯文本,没有任何额外元素,如ASCII text;Unicode;不像world文档一样含有颜色字体大小字体格式等等

文本编辑器又可以分俩类:

  • 行编辑器:比如sed
  • 全屏编辑器: 比如nano vi

vim模式化编辑器,有以下几种模式

  • 编辑模式:即命令模式,增删修改
  • 输入模式:即插入模式
  • 末行模式:内置命令行接口

那么如何使用vim打开文件?我们照例先man vim看看使用法则

vim - Vi IMproved, a programmers text editor 即Vi增强版,程序员文本编辑器;这就是强者的世界吗.jpg

vim [options] [file ..] 也可以直接vim后面跟文件

+# 打开文件后,光标处于第#行的行首
+/PATERN 打开文件后,直接让光标处于第一个被PATERN匹配到的行的行首
+ 打开后处于末行的行首

上面我们说过vim有三种模式,那么这三种模式相互间是否可以相互转换?如何转换?

模式转换:

1. 编辑模式:默认模式

编辑模式-->输入模式

i insert在光标所在处输入
a append在光标所在处后方输入
o 在光标所在处的下方打开新行
O 在光标所在处的上方输入
I 在光标所在行的行首输入
A 在光标所在行的行尾输入

2. 输入模式-->编辑模式

  • Esc

编辑模式-->末行模式

  • : 冒号

3. 末行模式-->编辑模式

  • Esc 或两次Esc

打开了文件就得有关闭文件的方式:

ZZ 保存并退出

:q 退出

:wq 保存并退出

:q! 不保存并强制退出

:x 保存并退出

:w /PATH/TO/FILE另存为

光标跳转:须处于编辑模式

(1)字符间跳转

  • h 向左跳转1个字符
  • l 向右跳转1个字符
  • j 向下跳转1个字符
  • k 向上跳转1个字符
  • #COMMAND 跳转由#指定的个数的字符

(2)单词间跳转

  • w 下一个单词的词首
  • b 当前或前一个单词的词首
  • e 当前或后一个单词的词尾

(3)行首行尾跳转

  • ^ 跳转至行首的第一个非空白字符
  • 0 跳转至行首,Tab不算
  • $ 跳转至行尾

(4)行间跳转

  • #G 跳转至由#指定的行
  • 1Ggg 跳转至第1
  • G 跳转至最后一行

(5)句间跳转

  • ) 下一句
  • ( 前一句

(6)段间跳转

  • } 下一段
  • { 上一段

翻屏操作:

  • CTRL+f 向文件尾部翻一屏
  • CTRL+b 向文件首部翻一屏
  • CTRL+d 向文件尾部翻半屏
  • CTRL+u 向文件首部翻半屏
  • enter 向文件尾部翻一行

vim的编辑命令:须处于编辑模式

(1)字符编辑

  • x 删除光标所在处的字符
  • #x 删除光标所在处起始往后#个字符
  • xp 交换光标所在处的字符及其后面的字符的位置

(2)替换命令replace

  • r rCHART替换光标所在处的字符

(3)删除命令:可结合光标跳转字符,实现范围删除;非常强大实用

  • d 删除命令;
  • dd 删除整行;同样支持组合

(4)粘贴命令

  • p 小写p,表示缓冲区中的内容如为整行则粘贴在当前光标所在行的下方;否则粘贴至当前光标所在处的后方
  • P 大写P,表示缓冲区中的内容如为整行则粘贴在当前光标所在行的上方;否则粘贴至当前光标所在处的前方

(5)复制命令yyank

  • y 复制,类似d命令
  • yy 复制整行

(6)改变命令cchange

  • 编辑模式-->输入模式,并实现删除操作

    • 类似d命令,同样支持组合

(7)其它编辑操作

可视化模式:类似Windows用鼠标选中并拖动来选择大片区域

  • v 小写v,按字符选定
  • V 大写V,按行选定

    二者均可组合`d` `p` `y` `c`等命令实现批量范围操作
    

撤销命令undo

  • u 撤销此前操作,默认最近50次操作
  • #u 撤销此前的#个操作

撤销此前撤销recovery

  • CTRL+r 撤销此前撤销的操作

重复执行前一个编辑操作

  • . 点号

vimtutorvim自带的练习教程,朋友们有空也可以上去练练.

我们再来讲讲vim的末行模式

`vim`末行模式:内嵌命令行接口

列举如下几项常用功能

(1).地址定界

start_post[,end_post]
  • # 特定的第#行,如5即第五行
  • . 点号,表示当前行
  • $ 最后一行
  • #,# 指定行范围,左侧为起始行,右侧为结束行,须配合d y c实现各种骚操作
  • #,+# 指定行范围,左侧为起始行绝对编号,右侧为相对左侧行号的偏移量,如3,+7,操作同上

    /PATTERN/ 从光标所在处起始向文件尾部第一次被模式所匹配到的行
    • .,$-1 当前行到最后一行
    • % 全文

  • /first/,$
  • /part1/,/part2/ 从光标所在处起始,由第一次part1匹配到的行开始至第一次由part2匹配到的行结束之间的所有行

    • 可通编辑命令一同使用,实现编辑操作

      • d y c
      • w /PATH/TO/SOMEFILE 将范围内的文本保存至指定的文件中
      • r /PATH/FROM/SOMEFILE 将指定的文件中的文本读取并插入至指定位置

(2).查找

/PATTERN 从当前光标所在处向文件尾部查找能够被当前模式匹配到的字符串

?PATTERN 从当前光标所在处向文件首部查找能够被当前模式匹配到的字符串

  • n 下一个,与命令方向相同
  • N 上一个,与命令方向相同

(3).查找并替换,s末行模式命令;

s/查找内容/替换为的内容/修饰符

  • 查找的内容: 可使用正则表达式
  • 替换为内容: 不可使用正则表达式,但可引用

    • 如要查找内容在模式中使用了分组符号,可在"替换为的内容"中使用后向引用
    • 直接引用查找模式匹配到的全部文本,需要使用&
  • 修饰符:

    • i 忽略大小写
    • g 全局替换;意味着一行中如果匹配多次,则全部替换

注意:可以使用其它常用字符代替/,如@ #

实例

:%s@\<s\([[:alpha:]]\+\)\>@S\1@g 将当前文本中所有以s开头的单词全部换成S开头

是不是感觉跟看天书一样?我们来一一解释!

%全文查找 
\<s锚定词首为s 
\([[:alpha:]]\+\)分组引用括号内的"匹配所有字符至少一次"详情请看上一章正则表达式 
\>锚定词尾 
\1引用前面括号内匹配到的字符次数1 
大写的S是要替换的字符

:%s@\<n[[:alpha:]]\+\>@&er@g 将当前文本中所有以n开头的单词后面全部加上er

参考上面的解释即可,&er表示引用的单词后面加er

:%s@^#@@g 将当前文本中所有以#号开头的行的#号全部删除掉,@@之间没有字符代表为空即删除

经过上面几条命令与解释,相信大家有所了解了吧?没有?请看以下练习题再次熟悉一下!

练习题1.复制/etc/grub2.cfg文件至/tmp目录下,用查找替换命令删除/tmp/grub2.cfg文件中以空白字符开头的行的空白字符

[sanxi@test-edu ~]$ sudo cp -v /etc/grub2.cfg /tmp/
‘/etc/grub2.cfg’ -> ‘/tmp/grub2.cfg’
[sanxi@test-edu ~]$ vim /tmp/grub2.cfg
:%s@^ \+@@g 全文查找行首锚定空白字符且重复次数至少为`1`替换为空即删除空白字符,全局;本人写的空格符最好不用 ,而是`[[:space:]]`

练习题2. 复制/etc/rc.d/init.d/functions文件至/tmp目录中,用查找替换命令为/tmp/fuctions文件的每个以空白字符开头的行的行首加上#

[sanxi@test-edu ~]$ sudo cp -v /etc/rc.d/init.d/functions /tmp/   
‘/etc/rc.d/init.d/functions’ -> ‘/tmp/functions’
[sanxi@test-edu ~]$ vim /tmp/functions
:%s@\(^ \)@&#\1@g  解释同上,建议使用[[:space:]]而不是 空格键打出来的空白字符
%s@^[[:space:]]@#&@g 因此,可以这样
    

练习题3. 为/tmp/grub2.cfg文件的前三行的行首加上#

练习题4. 将/etc/yum.repos.d/Centos-Base.repo文件中所有的enable=0替换为enable=1,所有gpgcheck=1

[sanxi@test-edu ~]$ sudo vim /etc/yum.repos.d/CentOS-Base.repo

大家还记不记得在Windows上我们可以非常轻松方便地同时打开多个文档同时显示多个窗口?其实vim也可以做到的,怎么做到呢,请看下面

vim的多文件功能

vim FILE1 FILE2......

vim在文件中切换可使用以下方式

  • :next 下一个
  • :prev 上一个
  • :first第一个
  • :last 最后一个

退出所有文件:

  • :wqall 保存所有文件并全部退出
  • :qall 退出所有文件
  • :wall 保存所有文件

vim的多窗口功能

  • -o 水平分割窗口
  • -O 垂直分割窗口

在窗口间切换:

  • CTRL+w 下一个
  • CTRL+w+ 向上箭头

单文件分割窗口

  • CTRL+w+s 水平分割
  • ctrl+w+V 垂直分割

定制vim的工作特性

末行模式下的设定,仅对当前vim进程有效

如想实现永久有效,可通过配置以下文件

  • 全局 /etc/vimrc
  • 用户 ~/.vimrc 该文件一般不存在,需要自行创建添加

1. 行号

  • set number,简写set nu 显示行号
  • set nonumber,简写set nonu 取消显示

2. 括号匹配高亮显示

  • 匹配 set showmanship,简写set sm,默认全局开启
  • 取消 set nosm

3. 自动缩进

  • 开启 set ai
  • 禁用 set noai

4. 高亮搜索,默认开启

  • 开启 set hlsearch
  • 禁用 set nohlsearch

5. 语法高亮,默认开启

  • 启动 syntax on
  • 禁用syntax off

6. 忽略大小写

  • 启用 set ic
  • 禁用 set noic

获取帮助:末行模式下

  • :help
  • :help subject

课外作业:如何设置tab键缩进4个字符

[sanxi@test-edu ~]$ vim .vimrc
set ts=4 #ts是tabstop的缩写
set noexpandtab #
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!