vim编辑器

[TOC]

vi编辑器的模式

一般指令模式

用vi 打开一个文件就直接进入一般指令模式,在一般指令模式中可以进行删除、复制、贴上等等的动作.

<!--more-->
  • 移动光标方法

按键 说明
h(←) 向左移动一个字符
j(↓) 向下移动一个字符
k(↑) 向上移动一个字符
l(→) 向右移动一个字符
Ctrl+f 屏幕向下移动一页[PageDown]
Ctrl+b 屏幕向上移动一页[PageUp]
Ctrl+d 屏幕向下移动半页
Ctrl+u 屏幕向上移动半页
+ 光标移动到非空白字符的下一行
- 光标移动到非空白字符的上一行
n 按下数字再按空格键向后移动n个字符
0 移动到当前行最前字符处
$ 移动到当前行最后字符处
H 移动到屏幕最上行
M 移动到屏幕中央一行
L 移动到屏幕最下行
G 移动到文件最后一行
nG 移动到第n行
gg 移动到文件第一行(相当于1G)
n[Enter] 向下移动n行
  • 搜寻与取代

按键 说明
/word 向下搜索字符串
?word 向上搜索字符串
n 重复上面搜索动作
N 反向重复上面搜索动作
:n1,n2s/word1/word2/g 在n1到n2行之间寻找word1字符串, 并将该字符串取代为word2(n2可以换成$ 表示到最后一行)
:n1,n2s/word1/word2/gc 与上面区别在于替换前加入提示(c–>confirm)
  • 删除/复制/粘贴

按键 说明
x,X x向后删除一个字符;X向前删除一个字符
nx/X 连续 向后 / 向前 删除n个字符
dd 删除当前行
ndd 向下删除n行
d1G 删除光标所在行到第一行的所有数据
dG 删除光标所在行到最后一行的所有数据
d$ 删除该行光标所在行到最后一个字符
d0 删除该行光标所在行到第一个字符
yy 复制光标所在行
nyy 向下复制n行
y1G 复制光标所在行到第一行的所有数据
yG 复制光标所在行到最后一行的所有数据
y0 复制该行光标所在行到最后一个字符
y$ 复制该行光标所在行到第一个字符
p,P p已复制数据在光标下一行粘贴;P已复制数据在光标上一行粘贴
J 光标所在行与下一行合并成一行
c 重复删除多个数据
u 复原前一个动作
Ctrl+r 还原u命令之前动作
. 重复上一个动作

编辑模式

一般指令模式下,按iIoOaArR等任意一个字母后进入编辑模式. Esc返回一般模式.

按键 说明
i,I 进入插入模式(Insert mode): i 为“从目前光标所在处插入”, I 为“在目前所在行的第一个非空白字符处开始插入”。
a,A 进入插入模式(Insert mode):a 为“从目前光标所在的下一个字符处开始插入”, A 为“从光标所在行的最后一个字符处开始插入”。
o,O 进入插入模式(Insert mode):这是英文字母 o 的大小写。o 为“在目前光标所在的下一行处插入新的一行”; O 为在目前光标所在处的上一行插入新的一行!
r,R 进入取代模式(Replace mode):r只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字, 直到按下 ESC 为止;

命令行模式

一般模式下输入/?:任意一个符号即可进入到引模式. Esc返回一般模式.

按键 说明
:w 将编辑数据写入文件
:w! 将编辑文件强制写入文件(具体与权限有关)
:q 离开vim
:q! 不存储编辑数据,强制离开vim
:wq 保存编辑数据并离开vim
ZZ 大写Z,若文件没有修改则不存储离开;若文件有修改,则存储后离开
:w [filename] 将编辑数据存储为另一个新文件
:r [filename] 在编辑数据中读入另一个文件的数据.亦将filename文件内容加到光标所在行的后面.
:n1,n2 w [filename] 将n1到n2行的数据存储为另一个新文件
:! command 暂时离开vim到命令行执行commd命令
:set vim环境变更指令.如: :set nu显示行号; :set nonu取消行号

一般指令模式可与编辑模式及命令行界面切换, 但编辑模式与命令行界面之间不可相互切换.

vim 暂存盘

在使用vim编辑器时,vim会在与被编辑文件目录创建一个名为filename.swap的暂存文件,你对编辑的文件所有动作都会记录到这个文件内.如果vim的文件被不正常中断,导致暂存盘无法借由正常流程结束,所以暂存盘就不会消失.再次打开此文件时,vim会主动判断这个文件可能有的问题:

  • 可能其它人或程序在同时编辑这个文件
    由于 Linux 是多用户多任务的环境,因此很可能有很多人同时在编辑同一个文件。如果在多人共同编辑的情况下, 万一大家同时储存,那么这个文件的内容将会变的乱七八糟!为了避免这个问题,因此 vim 会出现这个警告窗口!

  • 在上次vim编辑过程中可能由于未知原因导致vim中断

在发现暂存盘后,会出现警告信息页面,有六个按钮可供操作,说明如下:

  • (O)pen Read-Only 打开此文件成为只读文件,可以用在你只是想要查阅该文件内容并不想要进行编辑行为时。
  • (E)dit anyway:还是用正常的方式打开你要编辑的那个文件, 并不会载入暂存盘的内容。不过很容易出现两个使用者互相改变对方的文件等问题!
  • (R)ecover:就是载入暂存盘的内容,用在你要救回之前未储存的工作。 不过当你救回来并且储存离开 vim 后,还是要手动自行删除那个暂存盘喔!
  • (D)elete it:你确定那个暂存盘是无用的!那么打开文件前会先将这个暂存盘删除! 这个动作其实是比较常做的!因为你可能不确定这个暂存盘是怎么来的,所以就删除掉他吧!
  • (Q)uit:按下 q 就离开 vim ,不会进行任何动作回到命令提示字符。
  • (A)bort:忽略这个编辑行为,与 quit 非常类似! 也会送你回到命令提示字符!

区块选择

按键意义:

按键 说明
v 字符选择,会将光标经过的地方反白选择
V 行选择,会将光标经过的行反白选择
Ctrl+v 矩形选择,可以用矩形的方式选择数据
y 将选中地方复制起来
p 将刚刚复制的区块,在光标所在处贴上
d 将选中地方删除

多文件编辑

vim后面接多个文件名打开多个文件,此时多个文件内可以各种模式内的命令.

如从一个文件内yy(复制)到另一个文件内pp(粘贴)

按键 说明
:n 编辑上一个文件
:N 编辑下一个文件
:files 列出目前vim打开的所有文件列表

多窗口

:sp {filename}

按键 说明
:sp [filename] 打开一个新窗口,如果有加 filename, 表示在新窗口打开一个新文件,否则表示两个窗口为同一个文件内容(同步显示)
Ctrl+w+j(↓) 按键的按法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键,然后再按下 j (或向下方向键),则光标可移动到下方的窗口。其它方向按键参考上面移动光标方法按键.
Ctrl+w+q 相当于:q离开

DOS与Linxu断行字符

在 Linux 下面的指令在开始执行时,他的判断依据是 “Enter”,而 Linux 的 Enter 为 LF 符号, 不过,由于 DOS 的断行符号是 CRLF ,也就是多了一个 ^M 的符号出来, 在这样的情况下,如果是一个 shell script 的程序文件,将可能造成“程序无法执行”的状态~ 因为他会误判程序所下达的指令内容.

解决方法是通过指令将文件转换成Linux字符即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$ dos2unix [-kn] file [newfile]
$ unix2dos [-kn] file [newfile]
选项与参数:
-k :保留该文件原本的 mtime 时间格式 (不更新文件上次内容经过修订的时间)
-n :保留原本的旧文件,将转换后的内容输出到新文件,如: dos2unix -n old new

#例一:将文件转换成dos断行符
$ ll man_db.conf
-rw-r--r--. 1 root root 5171 Jun 10 2014 man_db.conf

$ unix2dos -k man_db.conf
unix2dos: converting file man_db.conf to DOS format ...
# 屏幕会显示上述的讯息,说明断行转为 DOS 格式了!

$ ll man_db.conf
-rw-r--r--. 1 dmtsai dmtsai 5302 Jun 10 2014 man_db.conf
# 断行字符多了 ^M ,所以容量增加了!


#例二:将文件转换成Linux断行符,并保留新文件
$ dos2unix -k -n man_db.conf man_db.conf.linux
dos2unix: converting file man_db.conf to file man_db.conf.linux in Unix format ...

$ ll man_db.conf*
-rw-r--r--. 1 dmtsai dmtsai 5302 Jun 10 2014 man_db.conf
-rw-r--r--. 1 dmtsai dmtsai 5171 Jun 10 2014 man_db.conf.linux

$ file man_db.conf*
man_db.conf: ASCII text, with CRLF line terminators
# 很清楚说明是 CRLF 断行!

语系编码转换

1
2
3
4
5
6
7
8
9
$ iconv --list
$ iconv -f 原本编码 -t 新编码 filename [-o newfile]
选项与参数:
--list :列出 iconv 支持的语系数据
-f :from ,亦即来源之意,后接原本的编码格式;
-t :to ,亦即后来的新编码要是什么格式;
-o file:如果要保留原本的文件,那么使用 -o 新文件名,可以创建新编码文件。

#可以用file查看文件编码