http://blog.csdn.net/pipisorry/article/details/23515091
@H_301_4@vi /vim介绍
可以将 vim 视作 vi 的进阶版本,vim 可以用颜色或底线等方式来显示一些特殊的信息。 可以说vim 是个“程序编辑器”!甚至一些 Linux 基础配置文件内的语法,都能够用 vim 来检查! 简单的来说, vi 是老式的文书处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具,就连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个“程序开发工具”而不是文书处理软件~^_^。 因为 vim 里面加入了很多额外的功能,例如支持正则表达式的搜寻架构、多文件编辑、区块复制等等。
@H_301_4@目前大部分的 distributions 都以 vim 取代 vi 的功能了!如果你使用 vi 后,却看到画面的右下角有显示目前光标所在的行列号码,那么你的 vi 已经被 vim 所取代啰
vim的这些优势主要体现在以下几个方面
1、多级撤消
我们知道在vi里,按 u只能撤消上次命令,而在vim里可以无限制的撤消。
2、易用性
vi只能运行于unix中,而vim不仅可以运行于unix,windows,mac等多操作平台。
3、语法加亮
vim可以用不同的颜色来加亮你的代码。
4、可视化操作
就是说vim不仅可以在终端运行,也可以运行于x window、 mac os、 windows。
5、对vi的完全兼容
某些情况下,你可以把vim当成vi来使用。
@H_301_4@vi/vim命令及按键说明
进入vi的命令
vi filename :打开或新建文件,并将光标置于第一行首
vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename....filename :打开多个文件,依次进行编辑
一般模式可用的按钮说明
第一部份:一般指令模式可用的按钮说明,光标移动、复制贴上、搜寻取代等
移动光标的方法 | |
---|---|
h 或 向左方向键(←) | 光标向左移动一个字符 |
j 或 向下方向键(↓) | 光标向下移动一个字符 |
k 或 向上方向键(↑) | 光标向上移动一个字符 |
l 或 向右方向键(→) | 光标向右移动一个字符 |
如果你将右手放在键盘上的话,你会发现 hjkl 是排列在一起的,因此可以使用这四个按钮来移动光标。 如果想要进行多次移动的话,例如向下移动 30 列,可以使用 "30j" 或 "30↓" 的组合按键, 亦即加上想要进行的次数(数字)后,按下动作即可! |
|
[Ctrl] + [f] | 屏幕“向下”移动一页,相当于 [Page Down]按键 (常用) |
[Ctrl] + [b] | 屏幕“向上”移动一页,相当于 [Page Up] 按键 (常用) |
[Ctrl] + [d] | 屏幕“向下”移动半页 |
[Ctrl] + [u] | 屏幕“向上”移动半页 |
+ | 光标移动到非空白字符的下一列 |
- | 光标移动到非空白字符的上一列 |
@H_301_4@n<space> | 那个 n 表示“数字”,例如 20 。按下数字后再按空白键,光标会向右移动这一列的 n 个字符。例如 20<space> 则光标会向后面移动 20 个字符距离。 |
0 或功能键[Home] | 这是数字“ 0 ”:移动到这一列的最前面字符处 (常用) |
$ 或功能键[End] | 移动到这一列的最后面字符处(常用) |
H | 光标移动到这个屏幕的最上方那一列的第一个字符 |
M | 光标移动到这个屏幕的中央那一列的第一个字符 |
L | 光标移动到这个屏幕的最下方那一列的第一个字符 |
G | 移动到这个文件的最后一列(常用) @H_301_4@ctrl+g显示当前行 |
nG | n 为数字。移动到这个文件的第 n 列。例如 20G 则会移动到这个文件的第 20 列(可配合 :set nu) 等价于 :n |
gg | 移动到这个文件的第一列,相当于 1G 啊! (常用) |
n<Enter> | n 为数字。光标向下移动 n 列(常用) |
搜寻与取代(vim中输入/word后可以按enter结束输入,再按大小写Nn进入上下搜索) | |
/word | 向光标之下寻找一个名称为 word 的字串。例如要在文件内搜寻 vbird 这个字串,就输入 /vbird 即可! (常用) |
?word | 向光标之上寻找一个字串名称为 word 的字串。 |
n | 这个 n 是英文按键。代表“<u>重复前一个搜寻的动作</u>”。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字串,则按下 n 后, 会向下继续搜寻下一个名称为 vbird 的字串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字串! |
N | 这个 N 是英文按键。与 n 刚好相反,为“反向”进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示“向上”搜寻 vbird 。 |
使用 /word 配合 n 及 N 是非常有帮助的!可以让你重复的找到一些你搜寻的关键字! | |
: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 第1行到当前行 :s/word1/word2/g 仅当前行 去掉g就是在当前行中只对第一个匹配替换 |
:1,$s/word1/word2/g | 从第一列到最后一列寻找 word1 字串,并将该字串取代为 word2 !(常用)等价于@H_301_4@%s/word1/word2/g |
:1,$s/word1/word2/gc | 从第一列到最后一列寻找 word1 字串,并将该字串取代为 word2 !且在取代前显示提示字符给使用者确认 (confirm) 是否需要取代!(常用) Note: 分割符可以使用:代替/,而如~等特殊字符要在前面加\转义。 %s:\~/.bashrc:$envfilename:g |
删除、复制与贴上 | |
x,X | 在一列字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是倒退键) (常用) |
nx | n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, “10x”。 |
dd | 删除光标所在的那一整列,@H_301_4@其实是剪切命令,之后可以粘贴的(常用) @H_301_4@"*dd: 删除行并存入缓冲区* |
ndd | n 为数字。删除光标所在的向下 n 列,例如 20dd 则是删除 20 列 (常用) |
d1G | 删除光标所在到第一列的所有数据 |
dG | 删除光标所在到最后一列的所有数据 |
d$ | 删除光标所在处,到该列的最后一个字符 |
d0 | 那个是数字的 0 ,删除光标所在处,到该列的最前面一个字符 |
yy | 复制光标所在的那一列(常用) 等价于Y |
nyy | n 为数字。复制光标所在的向下 n 列,例如 20yy 则是复制 20 列(常用) |
y1G | 复制光标所在列到第一列的所有数据 |
yG | 复制光标所在列到最后一列的所有数据 |
y0 | 复制光标所在的那个字符到该列行首的所有数据 |
y$ | 复制光标所在的那个字符到该列行尾的所有数据 |
p,P | p 为将已复制的数据在光标下一列贴上,P 则为贴在光标上一列! 如果是通过y$复制的,粘贴是在当前光标处,而不是下一行! 举例来说,我目前光标在第 20 列,且已经复制了 10 列数据。则按下 p 后, 那 10 列数据会贴在原本的 20 列之后,亦即由 21 列开始贴。 但如果是按下 P 呢? 那么原本的第 20 列会被推到变成 30 列。 (常用) @H_301_4@"*p: 从缓冲区*粘贴; "+p 从剪切板+粘贴; 见后面解释 |
J | 将光标所在列与下一列的数据结合成同一列 |
c | 重复删除多个数据,例如向下删除 10 列,[ 10cj ] |
u | 复原前一个动作。(常用) |
[Ctrl]+r | 重做上一个动作。(常用) |
这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦! | |
. | 不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点“.”就好了! (常用) |
vi/vim三种模式及作用
- 一般指令模式 (command mode)
以 vi 打开一个文件就直接进入一般指令模式了(这是默认的模式,也简称为一般模式)。在这个模式中, 你可以使用“上下左右”按键来移动光标,你可以使用“删除字符”或“删除整列”来处理文件内容, 也可以使用“复制、贴上”来处理你的文件数据。
- 编辑模式 (insert mode)
在一般指令模式中可以进行删除、复制、贴上等等的动作,但是却无法编辑文件内容的! 要等到你按下“i,I,o,O,a,A,r,R”等任何一个字母之后才会进入编辑模式。注意了!通常在 Linux 中,按下这些按键时,在画面的左下方会出现“ INSERT 或 REPLACE ”的字样,此时才可以进行编辑。而如果要回到一般指令模式时, 则必须要按下“Esc”这个按键即可退出编辑模式。
- 命令行命令模式 (command-line mode)
在一般模式当中,输入“ : / ? ”三个中的任何一个按钮,就可以将光标移动到最下面那一列。在这个模式当中, 可以提供你“搜寻数据”的动作,而读取、存盘、大量取代字符、离开 vi 、显示行号等等的动作则是在此模式中达成的!
简单的说,我们可以将这三个模式想成下面的图示来表示:Note:vim 的三种模式只有一般模式可以与编辑、指令列模式切换,编辑模式不指令列模式间并不能切换
第二部份:一般指令模式切换到编辑模式的可用的按钮说明
进入插入或取代的编辑模式 | |
---|---|
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 为止;(常用) |
上面这些按键中,在 vi 画面的左下角处会出现“--INSERT--”或“--REPLACE--”的字样。 由名称就知道该动作了吧!! 特别注意的是,我们上面也提过了,你想要在文件里面输入字符时, 一定要在左下角处看到 INSERT 或 REPLACE 才能输入喔! |
|
[Esc] | 退出编辑模式,回到一般指令模式中(常用) |
第三部份:一般指令模式切换到命令行界面的可用按钮说明
命令行界面的储存、离开等指令 | |
---|---|
:w | 将编辑的数据写入硬盘文件中(常用) |
:w! | 若文件属性为“只读”时,强制写入该文件。不过,到底能不能写入, 还是跟你对该文件的文件权限有关啊! |
:q | 离开 vi (常用) |
:q! | 若曾修改过文件,又不想储存,使用 ! 为强制离开不储存盘案。 |
注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有“强制”的意思~ | |
:wq | 储存后离开,若为 :wq! 则为强制储存后离开 (常用) |
ZZ | 这是大写的 Z 喔!若文件没有更动,则不储存离开,若文件已经被更动过,则储存后离开! |
:w [filename] | 将编辑的数据储存成另一个文件(类似另存新文件) |
:r [filename] | 在编辑的数据中,读入另一个文件的数据。亦即将 “filename” 这个文件内容加到光标所在列后面 |
:n1,n2 w [filename] | 将 n1 到 n2 的内容储存成 filename 这个文件。 |
:! command | 暂时离开 vi 到命令行界面下执行 command 的显示结果!例如 “:! ls /home”即可在 vi 当中察看 /home 下面以 ls 输出的文件信息! |
vim 环境的变更 | |
:set nu | 显示行号,设置之后,会在每一列的字首显示该列的行号 |
:set nonu | 与 set nu 相反,为取消行号! |
vim中sudo保存无权限修改的文件
使用 vim 对某个文件进行编辑,编辑完之后,按ESC之后回到普通模式,再按:wq准备保存退出时,发现没有权限对该文件进行修改,我们在使用 vim 命令时忘记在前面加 sudo 了。我就经常出现这种问题,之前的做法是只能不保存强退,再加上 sudo 重新编辑。
可以在 vim 的普通模式下,按:w !sudo tee %,这样就可以 root 权限来保存文件了。
其它快捷键
:r filename 来读入某个文件的内容(整个文件内容)到vim当前打开的文件中
Note:
1. 在 vi 中,“数字”是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表去到第几个什么什么的意思。举例来说,要删除 50 列,则是用 “50dd” 对吧! 数字加在动作之前~那我要向下移动 20 列呢?那就是“20j”或者是“20↓”即可。
vim 常用指令示意图
vi/vim键盘图
VIM中常用的替换模式总结
1,简单替换表达式
替换命令可以在全文中用一个单词替换另一个单词::%s/four/4/g
“%” 范围前缀表示在所有行中执行替换。最后的 “g” 标记表示替换行中的所有匹配点。如果仅仅对当前行进行操作,那么只要去掉%即可
如果你有一个象“thirtyfour” 这样的单词,上面的命令会出错。这种情况下,这个单词会被替换成”thirty4″。要解决这个问题,用 “\<” 来指定匹配单词开头:
:%s/\<four/4/g
显然,这样在处理“fourty” 的时候还是会出错。用“\>” 来解决这个问题:
:%s/\<four\>/4/g
如果你在编码,你可能只想替换注释中的 “four”,而保留代码中的。由于这很难指定,可以在替换命令中加一个 “c” 标记,这样,Vim 会在每次替换前提示你:
:%s/\<four\>/4/gc
2,删除多余的空格
要删除这些每行后面多余的空格,可以执行如下命令:
:%s/\s\+$//
命令前面指明范围是 “%”,所以这会作用于整个文件。”substitute” 命令的匹配模式是
“\s\+$”。这表示行末($)前的一个或者多个(\+)空格(\s)。替换命令的 “to” 部分是空的:”//”。这样就会删除那些匹配的空白字符。
3,匹配重复性模式
星号项 “*” 规定在它前面的项可以重复任意次。因此:/a*
匹配 “a”,”aa”,”aaa”,等等。但也匹配 “” (空字串),因为零次也包含在内。星号 “*” 仅仅应用于那个紧邻在它前面的项。因此 “ab*” 匹配 “a”,”ab”,”abb”,”abbb”,等等。如要多次重复整个字符串,那么该字符串必须被组成一个项。组成一项的方法就是在它前面加 “ ”,后面加“ ”。因此这个命令:/ ab *
匹配: “ab”,”abab”,”ababab”,等等。而且也匹配 “”。
要避免匹配空字串,使用“\+”。这表示前面一项可以被匹配一次或多次。/ab\+
匹配 “ab”,”abb”,”abbb”,等等。它不匹配 后面没有跟随 “b” 的 “a”。
要匹配一个可选项,用“\=”。 例如:/folders\=匹配 “folder” 和 “folders”。
4,指定重复次数
要匹配某一项的特定次数重复,使用 “\{n,m}” 这样的形式。其中 “n” 和 “m” 都是数字。在它前面的那个项将被重复 “n” 到 “m” 次 (|inclusive| 包含 “n” 和 “m”)。例如:/ab\{3,5}
匹配 “abbb”,”abbbb” 以及 “abbbbb”。
当 “n” 省略时,被默认为零。当 “m” 省略时,被默认为无限大。当 “,m” 省略时,就表示重复正好 “n” 次。例如:
模式 匹配次数
\{,4} 0,1,2,3 或 4
\{3,} 3,4,5,等等
\{0,1} 0 或 1,同 \=
\{0,} 0 或 更多,同 *
\{1,} 1 或 更多,同 \+
\{3} 3
5,多选一匹配
在一个查找模式中,”或” 运算符是 “\|”。例如:/foo\|bar
这个命令匹配了 “foo” 或 “bar”。更多的抉择可以连在后面:/one\|two\|three
匹配 “one”,”two” 或 “three”。
如要匹配其多次重复,那么整个抉择结构须置于 “ ”和“ ” 之间:/ foo∥bar \+
这个命令匹配 “foo”,”foobar”,”foofoo”,”barfoobar”,等等。
再举个例子:
/end if∥while∥for 这个命令匹配 “endif”,”endwhile” 和 “endfor”。
@H_301_4@vim 的额外功能
区块选择(Visual Block)
区块选择的按键意义
v | 字符选择,会将光标经过的地方反白选择! |
@H_301_4@V | @H_301_4@列选择,会将光标经过的列反白选择! |
@H_301_4@[Ctrl]+v | @H_301_4@区块选择,可以用长方形的方式选择数据。 有时鼠标模式不对,可能需要使用ctrl+v再快速按shift(操作不好可能变成了ctrl+shift+v粘贴了),不知道有没其它解决方案 |
y | 将反白的地方复制起来 |
d | 将反白的地方删除掉 |
p | 将刚刚复制的区块,在光标所在处贴上! |
可视模式
标记文本
v
进入可视模式,单字符模式
V
进入可视模式,行模式
ctrl+v
进入可视模式,列模式 ,类似于UE的列模式
o
跳转光标到选中块的另一个端点
U
将选中块中的内容转成大写
O
跳转光标到块的另一个端点
aw
选中一个字
ab
选中括号中的所有内容,包括括号本身
aB
选中{}括号中的所有内容
ib
选中括号中的内容,不含括号
iB
选中{}中的内容,不含{}
对标记进行动作
>
块右移
<
块左移
y
复制块
d
删除块
~
切换块中内容的大小写
多文件编辑
(最好使用多标签tab,这样可以在不同窗口间通过快捷键切换)
多文件编辑的按键
:n | 编辑下一个文件 |
:N | 编辑上一个文件 |
:files | 列出目前这个 vim 的打开的所有文件 |
q ”来离开 vim 的多文件编辑。
多窗口功能
:sp {filename} filename 可有可无, 如果想要在新窗口启动另一个文件,就加入文件名
仅输入 :sp 时, 出现的则是同一个文件在两个窗口间!
多窗口情况下的按键功能
:sp [filename] | 打开一个新窗口,如果有加 filename, 表示在新窗口打开一个新文件,否则表示两个窗口为同一个文件内容(同步显示)。 |
[ctrl]+w+ j [ctrl]+w+↓ | 按键的按法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键,然后再按下 j (或向下方向键),则光标可移动到下方的窗口。 |
[ctrl]+w+ k [ctrl]+w+↑ | 同上,不过光标移动到上面的窗口。 |
[ctrl]+w+ q | 其实就是 :q 结束离开啦! 举例来说,如果我想要结束下方的窗口,那么利用 [ctrl]+w+↓ 移动到下方窗口后,按下 @H_301_4@:q 即可离开, 也可以按下 [ctrl]+w+q 啊! |
垂直分割窗口 ctrl+w v
切换窗口 @H_301_4@ctrl+w w
退出当前窗口(由于同时有多个文件,此命令不会影响其他窗口) ctrl+w
多标签编辑
用法
:tabnew [++opt选项] [+cmd] 文件 建立对指定文件新的tab(文件存在或不存在都可以)
vim -p * 就是编辑当前目录的所有文件,这样就可以使用gt在不同文件间切换了。使用vim *不能使用gt切换(不知道为啥)。
:tabc 关闭当前的tab
:tabo 关闭所有其他的tab
:tabs 查看所有打开的tab
:tabp 前一个
:tabn 后一个
标准模式下的tab间切换
gt,gT 可以直接在tab之间切换
其它命令:help table
Note: 加了插件NERDTree后还可以使用F2打开文件目录树,双击打开新的tab。
@H_301_4@vim的复制和粘贴及与系统剪切板的交互
要与系统交互要安装sudo apt-get install -y vim-gnome。
显示所有寄存器内容::reg
其中注意两个特殊的寄存器:@H_301_4@"* 和 "+。这两个寄存器是和系统相通的,前者关联系统选择缓冲区,后者关联系统剪切板。通过它们可以和其他程序进行数据交换。
备注:若寄存器列表里无"* 或 "+ 寄存器,则可能是由于没有安装vim的图形界面所致。Debian/Ubuntu下可以通过安装vim-gnome解决。
@H_301_4@不同于Windows,Linux系统里存在两个剪切板:一个叫做选择缓冲区(X11 selection buffer),另一个才是剪切板(clipboard)。选择缓冲区是实时的,当使用鼠标或键盘选择内容时,内容已经存在于选择缓冲区了,这或许就是选择缓冲区的由来吧。
鼠标的不同模式下的复制和粘贴
:set mouse=a时,vim中选择的同时不会选中行号,点击中键会复制到缓冲区(而不是剪切板),这时再点击鼠标中键可以粘贴在同一个vim中。
但是如果安装了vim-gnome,这时就存在"*寄存器,选择文字就可以复制到系统其它地方了!而且复制是不带行号的,彻底解决了vim中选择带行号的复制问题(lz推荐)
vim有一个可视模式(Visual Mode),在此模式下可以选择区域。可以在普通模式下键入v进入可视模式,也可以个性化一点,键入V进入行可视模式,或者键入Ctrl+v进入列可视模式。这时移动光标就可以选择内容了。注意这时被选内容已经实时保存于选择缓冲区了,当然你也可以键入”+y将此内容也保存到剪切板里,或者”ay将内容保存到标签为a的寄存器中。
vim不同文件间的交互
vim多tab打开文件后就可以使用vim在不同文件间复制粘贴了,是不是很皮皮!
Note: 还有一种vim复制粘贴方法,不过必须是同一个vim打开的。
复制内容到选择缓冲区。
带行号时,使用鼠标选择内容区域。
不要行号,使用 “*yny 复制n行或可视模式下选择。
与系统剪切板的交互
很多时候使用 Vim 编辑文本,总需要复制里面的东西出来,粘贴到其他地方,比如说网页,聊天窗口等等,而有些时候有需要从网页等地方复制文字过来粘贴到 Vim 正在编辑的文件里。这个两个过程应该怎么完成呢?
一般的解决方法
复制文本
当我们要将 Vim 里面的文本复制出来,往往会用@H_301_4@鼠标选中,然后到需要粘贴的地方小点下鼠标中键或 Shift + Insert,完成复制粘贴的过程。
但 Vim 设置显示行号,多窗口使用,或者使用 Tmux 这类有利于提高效率的工具的时候,这样选择未必行的通。
这时候,需要鼠标可以选中 Vim 单个窗口且不包含行号的文本,可以使用 :set mouse=a,让 Vim 支持鼠标选择,大概事情就可以解决,这样的感觉也挺爽的,赶紧把 set mouse=a 加入你的 .vimrc 文件:)
粘贴文本
当我们在其他地方选择文本后,想粘贴到 Vim,一般都会切换到插入模式点鼠标中键或 Shift + Insert,完成复制粘贴的过程。
但有些时候,比如说复制在网页一些代码,粘贴时有时会出现不对齐,前面未加注释代码却被加上注释,这样一些恼人的问题。
这时候,可以通过 :set paste 将 Vim 设置为粘贴模式后再进行粘贴,既然是两种模式,肯定是有区别的,:set nopaste 是返回正常模式。这么干毕竟不方便,可以通过 .vimrc 添加映射来解决这个问题,更是有 set pastetoggle= 这个方便的选项,若在 .vimrc 文件里添加 set pastetoggle=<F11>,则 F11 为粘贴模式的切换键。
比较 Vim 的方法
上述方法,大致可以解决问题,但很多同学并不喜欢用这种方式来复制粘贴,或是喜欢键盘操作的爽快,或是习惯了 Windows 下那套 Ctrl + c,Ctrl + v,通过系统剪切板来实现。还有,使用 VirtualBox 的时候,若设置剪切板互通,也是用到系统剪切板。
Vim 不是通过 Ctrl + c,Ctrl + x,Ctrl + v 来实现复制、剪切、粘贴的,而是通过 y,d,p 这些更为方便的键来实现各种复杂的文本操作。
对于和系统剪贴板的交互,又应该怎么用呢?遇到问题一般第一个寻找的是帮助文档,剪切板即是 Clipboard。
通过 :h clipboard 查看帮助, When using this register under X11,also see x11-selection. 若在 X11 中使用该寄存器,另见 x11-selection。
顺着思路 :h x11-selection,里面详细地介绍了 Vim 提供的使用 X11 主选择缓冲区和剪切板的方法,它们是通过 "* 和 "+ 两个寄存器来实现。
大致可以明白,在 Windows 上只能通过 Clipboard,而可爱的 X11 却还给了我们 Primary,所以有了选中即复制,鼠标中间即粘贴这么神奇的粘贴操作。
在 Vim 里,正常模式下,复制文本到 Clipboard,基本只是在前面加上 "+,其他一样,例如
复制当前行
"+yy 或 "+Y
复制当前行及向下二行
"+y2j
选择后复制
Vjj"+y
复制到 Primary 和复制到 Clipboard 差不多,这里就不再详述,而粘贴则是加 p,自然还有剪切 d。
[Vim 与系统剪切板交互 ]
[Vim 复制粘贴探秘*]
VIM 手册中关于mouse选项的说明
'mouse'字符串 (缺省为 ”“,GUI、MS-DOS 和 Win32 为 “a”) 全局 {Vi 无此功能}
允许使用鼠标。只可用于特定终端 (xterm、MS-DOS、Win32 |win32-mouse|、 QNX pterm 和带 gpm 的 Linux 控制台)。关于 GUI 里如何使用鼠标,见 |gui-mouse|。
鼠标可以为不同模式分别打开:
n 普通模式
v 可视模式
i 插入模式
c 命令行模式
h 编辑帮助文件时,所有前面的模式
a 所有前面的模式
r |hit-enter| 和 |more-prompt| 提示时
A 可视模式的自动选择
通常你会这样为所有四个模式打开鼠标:
:set mouse=a
如果鼠标没有打开,GUI 仍然使用鼠标进行无模式的选择。此行为不会移动文本光标。见 |mouse-using|。另见 |'clipboard'|。
注意: 在终端里打开鼠标时,如果能连接到 X 服务器,复制/粘贴会使用 * 寄存器。按住 Shift 键就仍然可以使用 xterm 对鼠标按钮的处理。
vim 的挑字补全功能
vim 环境设置与记录: ~/.vimrc,~/.viminfo
其他 vim 使用注意事项
中文编码问题
DOS 不 Linux 癿断行字符: dos2unix,unix2dos
语系编码转换: iconv
@H_301_4@其它
选项设置
all:列出所有选项设置情况
term:设置终端类型
ignorance:在搜索中忽略大小写
list:显示制表位(Ctrl+I)和行尾标志($)
number:显示行号
report:显示由面向行的命令修改过的数目
terse:显示简短的警告信息
warn:在转到别的文件时若没保存当前文件则显示NO write信息
nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符
nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
mesg:允许vi显示其他用户用write写到自己终端上的信息
寄存器操作
"?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
"?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字
ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。
宏命令(Macros)
高级一些的编辑器,都会包含宏功能,vim当然不能缺少了,在vim中使用宏是非常方便的:
:qx
开始记录宏,并将结果存入寄存器x
q 退出记录模式
@x 播放记录在x寄存器中的宏命令
稍微解释一下,当在normal模式下输入:qx后,你对文本的所有编辑动作将会被记录下来,再次输入q即退出了记录模式,然后输入@x对刚才记录下来的命令进行重复,此命令后可跟数字,表示要重复多少次,比如@x20
可以重复20次。这个在文本的批处理中是非常有用的。
同时编辑多个文件
在vim众多的插件中,有一个叫minibuffer的插件,就是下面所说的标签页功能了,可以支持同时编辑多个文件。
标签命令
:tabe fn
在一个新的标签页中编辑文件fn
gt 切换到下一个标签页
gT 切换到上一个标签页
:tabr 切换到第一个标签页
:tabl 切换到最后一个标签页
:tabm [N] 把当前tab移动到第N个tab之后
跟eclipse,ue等的标签页是一个意思!
其他
vim在保存之前不会对文件做实际的修改,只是加载到缓冲区中,对文件的编辑其实是对缓冲区的编辑,直到:w时才会存入物理文件。
:e file
把file加载到新的缓冲区中
:bn
跳转到下一个缓冲区
:bd
删除缓冲区(关闭文件)
:sp fn
分割窗口,并将fn加载到新的窗口中
”Ctrl + }“ 可以跳转到函数或变量的定义处,“Ctrl + o”可以返回上一个@R_602_404@面。
书签
ma
把当前位置存成标签a
`a
跳转到标签a处
文件处理相关命令
:set fileformat | 设置文件格式 |
:set endofline | 设置文件结束符 |
:set noendofline | 取消文件结束符 |
:set list | 进入List Mode |
:set nolist | 退出List Mode |
:%s/n//g | 删除换行符 |
:set textwidth | 设置行宽 |
:set textwidth | 设置行边距 |
:join | 合并多行 |
J | 合并两行 |
此外,关于ASCII字符,Linux下面有个简要的介绍:man ascii
^M 是ascii中的'r'回车符,是16进制的0x0D,8进制的015,十进制的13;
对于换行这个动作,unix下一般只有一个0x0A表示换行
windows下一般都是0x0D和0x0A两个字符。
^L 是ascii 0x0C 'f',换页控制符 。
设置文件编码
:set encoding=utf-8
:set fileencodings=ucs-bom,utf-8,cp936
:set fileencoding=gb2312
:set termencoding=utf-8
如何消除vi中的^M
我刚开始去用sed命令:
- sed 's/^M//g' file_old > file_new
执行后查看不成功,输出的文件,用vi打开,还是带^M。
后来到网上搜到了可以用的办法,用tr命令:
- tr -d "15" < myfile.txt > myfile_new.txt
可以把符号^M(即"15")去掉,并另存为新文件myfile_new.txt 。
vim显示空格、tab字符及多行注释
显示 TAB 键
- :set list TAB
显示为 ^I,$显示在每行的结尾,表示换行,Vim 可以用高亮显示空格和TAB。
Vim多行缩进技巧 关键字: vim indent
按v进入visual状态,选择多行,用>或<缩进或缩出
通常根据语言特征使用自动缩进排版:
在命令状态下对当前行用== (连按=两次),或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行。你可以试试把代码缩进任意打乱再用n==排版,相当于一般IDE里的code format。
使用gg=G可对整篇代码进行排版。
vim 多行注释
- :20,30 s/^/#/g 第20到30行用 # 注释掉。
- :20,30 s/^#//g 取消注释
- :4,10 s/^[^I ]+// 去掉行首的空白字符 用 . 表示当前行。
- :.,30 s/^/#/g 可以看到 vim 命令针对当前行,在前面加个范围就可以针对多行。
- :co 12 把当前行 copy 到行 12 的地方。
from:http://www.jb51.cc/article/p-btwkdhcl-bbo.html
vim学习网站[vim-adventure和openvim]