vi 的使用
vi 共有三种模式:
- 一般指令模式(command mode)
- 编辑模式(insert mode):按下[i, I, o, O, a, A, r, R]其中一个便可以从一般指令模式进入编辑模式,进入后画面左下方会出现[INSERT] 或 [REPLSCE],按 Esc 键退出
- 指令列模式(command-line mode):在一般模式当中,输入[ : / ? ]三个中的任何一个按钮,就可以将光标移动到最底下那一列。在 这个模式当中, 可以提供你搜寻资料的动作,而读取、存盘、大量取代字符、离开 vi 、显示行号等等的动作则是在此模式中达成的。
按键说明
常用的移动光标的方法:
- h 或 向左箭头键(←) 光标向左移动一个字符
- j 或 向下箭头键(↓) 光标向下移动一个字符
- k 或 向上箭头键(↑) 光标向上移动一个字符
- l 或 向右箭头键(→) 光标向右移动一个字符
- 如向下移动 30 列,可以使用" 30j" 或 “30↓” 的组合按键, 亦即加上想要进行的次数(数字)后,按下动作
- [Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键
- [Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键
- 0 或功能键[Home] 这是数字『 0 』:移动到这一行的最前面字符
- $ 或功能键[End] 移动到这一列的最后面字符处
- G 移动到这个文件的最后一行第一个字符
- nG n 为数字。移动到这个文件的第 n 列。例如 20G 则会移动到这个文件的第 20 列
- gg 移动到这个文件的第一列,相当于 1G
- n n 为数字。光标向下移动 n 列
常用的搜索与取代命令:
- /word
向光标之下寻找一个名称为 word 的字符串。例如要在文件内搜寻 vbird 这个字符串, 就输入 /vbird 在按[Enter]键 - ?word 向光标之上寻找一个字符串名称为 word 的字符串
- :n1,n2s/word1/word2/g
n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2。例:在 100 到 200 行之间搜寻 vbird 并取代为 VBIRD 则: 『:100,200s/vbird/VBIRD/g』 - :1,$s/word1/word2/g 从第一列到最后一列寻找 word1 字符串,并将该字符串取代为 word2
- :1,$s/word1/word2/gc
从第一列到最后一列寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显 示提示字符给用户确认 (confirm) 是否需要取代
常用的删除、复制与粘贴命令:
- x, X
在一列字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字 符(相当于 [backspace] 亦即是退格键) - dd 删除游标所在的那一整行
- ndd n 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20 行
- yy 复制游标所在的那一行
- nyy n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行
- p, P
p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行。 举例来说,我目前光标在第 20 列,且已经复制了 10 列数据。则按下 p 后, 那 10 列数据会贴在原本 的 20 列之后,亦即由 21 列开始贴。如果是按下 P 那么原本的第 20 列会被推到变成 30 列。 - u 撤销前一次编辑操作
- [Ctrl]+r 撤销最近一次撤销操作
- . 重复上一个动作
一般指令模式切换到编辑模式的可用的按钮说明:
- i, I 进入插入模式(Insert mode) i 为 从目前光标所在处插入, I 为在 目前所在行的第一个非空格符处开始插入。
- a, A 进入插入模式(Insert mode) a 为 从目前光标所在的下一个字符处开始插入, A 为 从光标所在行的最后一个字符处开始插入
- o, O 进入插入模式(Insert mode) o 为 在目前光标所在的下一列处插入新的一列, O 为 在目前光标所在处的上一列插入新的一列
- r, R 进入取代模式(Replace mode) r 只会取代光标所在的那一个字符一次, R 会一直取代光标所在的文字,直到按下 ESC 为止 (覆盖原来的文字)
- [Esc] 退出编辑模式,回到一般指令模式中
指令列模式的储存、离开等指令:
- :w 将编辑的数据写入硬盘文件中
- :q 离开 vi (常用)
- :wq 储存后离开,若为 :wq! 则为强制储存后离开
vim 的暂存档、救援回复与开启时的警告讯息
vim 会在与被编辑的文件的目录下,再建立一个名为 .filename.swp 的文件,这个文件能在系统因为某些原因断线了导致你编辑的文件还没有储存时候发挥救援的功能。
当打开一个文件提示:
E325: ATTENTION
Found a swap file by the name
可能有两个原因:
- 可能有其他人或程序同时在编辑这个文件
- 在前一个 vim 的环境中,可能因为某些不知名原因导致 vim 中断 (crashed),这就是常见的不正常结束 vim 产生的后果。
提示信息下方有六个可选命令 [O]pen Read-Only, (E)dit anyway, ®ecover, (D)elete it, (Q)uit, (A)bort,具体意义如下:
- [O]pen Read-Only:打开此文件成为只读档, 可以用在你只是想要查阅该文件内容并不想要进行编辑行为时。
- (E)dit anyway:还是用正常的方式打开你要编辑的那个文件, 并不会载入暂存盘的内容。不过很容易出现两个使用者互相改变对方的文件等问题!
- ( R )ecover:就是加载暂存盘的内容,用在你要救回之前未储存的工作。 不过当你救回来并且储存离开 vim 后,还是要手动自行删除那个暂存档
- (D)elete it:你确定那个暂存档是无用的,那么开启文件前会先将这个暂存盘删除! 这个动作其实是比较常做的。因为你可能不确定这个暂存档是怎么来的,所以就删除掉他。
- (Q)uit:按下 q 就离开 vim ,不会进行任何动作回到命令提示字符。
- (A)bort:忽略这个编辑行为,感觉上与 quit 非常类似! 也会送你回到命令提示字符就是
vim 使用注意事项
中文编码的问题
编辑中文出现乱码,与下列信息有关:
- Linux 系统默认支持的语系数据:这与 /etc/locale.conf 有关
- 终端界面 (bash) 的语系: 这与 LANG, LC_ALL 这几个变数有关
- 文件原本的编码
- 开启终端机的软件,例如在 GNOME 底下的窗口接口
使用命令
[dmtsai@study ~]$ LANG=LANG=zh_CN.UTF-8
[dmtsai@study ~]$ export LC_ALL=LANG=zh_CN.UTF-8
DOS(Windows) 与 Linux 的断行字符
DOS 使用的断行字符为 ^M$ ,称为 CR 与 LF 两个符号。 而在 Linux 底下,则是仅有 LF ($) 这个断行符号,这个对于Linux的影响很大,因为Linux中指令在执行时判断依据为 Enter。
转换命令如下:
[dmtsai@study ~]$ dos2unix [-kn] file [newfile] dos => unix
[dmtsai@study ~]$ unix2dos [-kn] file [newfile] unix => dos
选项与参数:
-k :保留该文件原本的 mtime 时间格式 (不更新文件上次内容经过修订的时间)
-n :保留原本的旧档,将转换后的内容输出到新文件,如: dos2unix -n old new