乐趣区

linux-vivim-的使用完整版

为什么要学 vim

linux 有大量的配置文件,所以 linux 的文本处理工具也是比较多的,常用的有
less vi head tail cat grep sed awk ....。其中编辑一些配置文件,及查看日志时,常用的工具就是 vimless,而且它两的快捷键又很相似,所以学会 vim 的使用还是挺必要的。

预期读者

运维,开发、及想对 linux 进阶的人。学 bash 的话,会 vim 还是方便点,不可能每次都要跑到 windows 上去编辑吧

开始学习

vi 的三种模式及切换

  • 一般模式
  • 编辑模式
  • 指令列模式
graph LR
A[一般模式] -- I/O/A/R--> B[编辑模式]
A -- 冒号 / 问号 / 正斜杠 --> C[指令列模式]
C -- ESC --> A
B -- ESC --> A

从一般模式切换到编辑模式各命令区别

  • i 在当前光标处插入
  • o 另起一行插入
  • a 后面一个字符插入
  • r 替换输入。这个在改单个字符很有用,因为它只替换一个字符又变回一般模式了

常用按键及功能

下面的指令是区分大小写的

移动游标的方法 (一般模式)
  • ↑→↓← 上右下左移动,5↓ 向下移动 5 行
  • ctrl + f 向下翻页,翻半页命令为 ctrl + d
  • ctrl + b 向上翻页,翻半页命令为 ctrl + u
  • 0 移动到一行的开头,移到到一行的结尾为 $
  • gg 到开头,G 移动到结尾 ,3G 移动到第 3 行
  • <enter> 游标向下移动一行,3<enter> 游标向下移动 3 行
删除,复制,粘贴 (一般模式)
  • x 向后删除一个字符,X 向前删除一个字符,3x 向后删除 3 个字符
  • dd 删除一行,3dd 删除 3 行
  • d$ 从当前光标位置删除到结尾,dG 从当前位置到最后一行全部删除
  • yy 复制当前行,3yy 复制 3 行
  • p 在下一行粘贴复制的东西,P 在上一行粘贴
  • u 撤回操作
  • . 重复上一次操作
查找与替换(一般模式)
  • /word 向下查找字符,?word 向上查找字符
  • n 重复前一个搜索的动作,按下 n 后,会继续找下一个匹配的字符
  • 1,5s/sanri/9420/g 搜索第 1 行到第 5 行的 sanri 字符串,替换成 9420
  • 1,$s/sanri/9420/g 搜索第 1 行到最后一行的 sanri 字符串,替换成 9420
选择文本 (一般模式)

v 然后使用方向键,相当于在 windows 按住鼠标拖动
V 光标经过的行会选择
ctrl +v 选择列模式
y 选择的文本复制
d 选择的文本删除

总结一下

从上面的命令来看在 vi 中,一些字母都是有着特别的含义的, 比如
$ 代表行结尾,0 代表行开头,G 代表最后一行,y 代表复制,d 代表删除行,x 代表删除字符、
数字一般表示重复做几次的意思,大小写代表的含义一般刚好相反、
翻页的快捷键刚好是英文的缩写
ctrl + f front page
ctrl + b back page
ctrl + d down page
ctrl + u up page

保存文件另存为(命令模式)
  • :w 保存文件,:w! 强制写文件(需要权限)
  • :q 退出,:q! 退出不保存
  • :wq 保存并退出,:wq! 强制保存并退出(需要权限)
  • :1,5 w [filename] 将第一行到第 5 行的数据写入新的文件
  • :! command 执行命令,在编辑文件的时候可以查看一些信息而不需要退出文件
  • :set nu 显示行号,:set nonu 不显示行号

练习一下

wget 'http://linux.vbird.org/linux_basic/0310vi/man.config'

  1. 使用 vi 开启目录下的 man.config 这个档案;
  2. 在 vi 中设定一下行号;
  3. 移动到第 58 行,向右移动 40 个字元,请问你看到的双引号内是什么目录?
  4. 移动到第一行,并且向下搜寻一下‘bzip2’这个字串,请问他在第几行?
  5. 接着下来,我要将 50 到 100 行之间的‘小写 man 字串’改为‘大写 MAN 字串’,并且一个一个挑选是否需要修改,如何下达指令?如果在挑选过程中一直按‘y’,结果会在最后一行出现改变了几个 man 呢?
  6. 修改完之后,突然反悔了,要全部复原,有哪些方法?

7. 我要复制 65 到 73 这九行的内容(含有 MANPATH_MAP),并且贴到最后一行之后;

  1. 21 到 42 行之间的开头为 # 符号的注解资料我不要了,要如何删除?
  2. 将这个档案另存成一个 man.test.config 的档名;
  3. 去到第 27 行,并且删除 15 个字元,结果出现的第一个单字是什么?
  4. 在第一行新增一行,该行内容输入‘I am a student…’;
  5. 储存后离开吧!

答案如下:

 vi man.config
 :set nu
 58G 40→ /dir/bin/foo
 gg /bzip2 118 行
 50,100s/man/MAN/gc  25 处修改,有 23 行有变动 
 u,或者不保存退出 :q!
 定位到 65 行 65G,复制 9 行 9yy,定位最后一行 G,粘贴 p 
 :21,42s/^#//g  // 里面是可以使用正则的
 :w man.test.config
 27G 15x  you
 定位到第一行 gg,i <enter> 然后输入内容
 :wq 

多文件编辑

vi 后面可以接多个文件,像这样
vi man.config test.txt

n 编辑下一个文件
N 编辑上一个文件
files 显示当前正在编辑的所有文件

多视窗编辑

可以支持在同一个窗口打开多个文件,使用 :sp [filename] 命令,像这样
:sp /etc/hosts
每一个窗口都有自己单独的模式和命令

[ctrl]+w+↓ 切换到下一个窗口
[ctrl]+w+↑ 切换到上一个窗口

编辑 vim 的配置文件 ~/.vimrc (简单配置)

每行一个配置 ” 是注释

可以使用命令 :set all 查看所有配置项,常用的配置项如下:
set nu 设置行号
set ts=4 设置按下一 tab 时,缩进 4 个空格的位置
set tabstop=4 设置显示的时候,一个 tab 占 4 个空格的宽度
set autoindent 自动缩进,这对于写代码很有用

上面的命令已经设置好了展示,退格和按下 tab 都是用以制表符为单位。如果需要使用空格来表示制表符则需要加以下几个配置
set expandtab 使用空格来表示缩进,而不是制表符
set softtabstop=4 退格的时候,如果遇到四个连续的空格,一次性删除,而不是一个一个的删

sanri-tools 工具

创作不易,希望可以推广下我的小工具,很实用的解决项目中的一些麻烦的事情,欢迎来 github 点星,fork
github 地址:https://gitee.com/sanri/sanri-tools-maven
博客地址:https://blog.csdn.net/sanri1993/article/details/98664034

退出移动版