vim编辑器

风尘

文章目录

  1. 1. vi编辑器的模式
    1. 1.1. 一般指令模式
    2. 1.2. 编辑模式
    3. 1.3. 命令行模式
  2. 2. vim 暂存盘
  3. 3. 区块选择
  4. 4. 多文件编辑
  5. 5. 多窗口
  6. 6. DOS与Linxu断行字符
  7. 7. 语系编码转换

[TOC]

vi编辑器的模式

一般指令模式

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

  • 移动光标方法

按键 说明
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 矩形选择,可以用矩形的方式选择数据(可以配合Ctrl+d、I、A、y、p、d等快捷键进行编辑)
y 将选中地方复制起来
p 将刚刚复制的区块,在光标所在处贴上
d 将选中地方删除

多文件编辑

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

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

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

多窗口

:sp {filename}

按键 说明
:sp [filename] 横向打开一个新窗口,如果有加 filename, 表示在新窗口打开一个新文件,否则表示两个窗口为同一个文件内容(同步显示)
:vsp [filename] 纵向打开一个新窗口,其它同上
Ctrl+w+j(↓) 按键的按法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键,然后再按下 j (或向下方向键或连按Ctrl+w),则光标可移动到下方的窗口。其它方向按键参考上面移动光标方法按键.
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查看文件编码