http://blog.csdn.net/pipisorry/article/details/23515091
vi /vim介绍
可以将 vim 视作 vi 的进阶版本,vim 可以用颜色或底线等方式来显示一些特殊的信息。 可以说vim 是个“程序编辑器”!甚至一些 Linux 基础配置文件内的语法,都能够用 vim 来检查! 简单的来说, vi 是老式的文书处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具,就连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个“程序开发工具”而不是文书处理软件~^_^。 因为 vim 里面加入了很多额外的功能,例如支持正则表达式的搜寻架构、多文件编辑、区块复制等等。
目前大部分的 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来使用。
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] | 屏幕“向上”移动半页 |
+ | 光标移动到非空白字符的下一列 |
- | 光标移动到非空白字符的上一列 |
n<space> | 那个 n 表示“数字”,例如 20 。按下数字后再按空白键,光标会向右移动这一列的 n 个字符。例如 20<space> 则光标会向后面移动 20 个字符距离。 |
0 或功能键[Home] | 这是数字“ 0 ”:移动到这一列的最前面字符处 (常用) |
$ 或功能键[End] | 移动到这一列的最后面字符处(常用) |
H | 光标移动到这个屏幕的最上方那一列的第一个字符 |
M | 光标移动到这个屏幕的中央那一列的第一个字符 |
L | 光标移动到这个屏幕的最下方那一列的第一个字符 |
G | 移动到这个文件的最后一列(常用) 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 !(常用)等价于%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 | 删除光标所在的那一整列,其实是剪切命令,之后可以粘贴的(常用) "*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 列。 (常用) "*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”。
vim 的额外功能
区块选择(Visual Block)
区块选择的按键意义
v | 字符选择,会将光标经过的地方反白选择! |
V | 列选择,会将光标经过的列反白选择! |
[Ctrl]+v | 区块选择,可以用长方形的方式选择数据。 有时鼠标模式不对,可能需要使用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+↓ 移动到下方窗口后,按下 :q 即可离开, 也可以按下 [ctrl]+w+q 啊! |
垂直分割窗口 ctrl+w v
切换窗口 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。
vim的复制和粘贴及与系统剪切板的交互
要与系统交互要安装sudo apt-get install -y vim-gnome。
显示所有寄存器内容::reg
其中注意两个特殊的寄存器:"* 和 "+。这两个寄存器是和系统相通的,前者关联系统选择缓冲区,后者关联系统剪切板。通过它们可以和其他程序进行数据交换。
备注:若寄存器列表里无"* 或 "+ 寄存器,则可能是由于没有安装vim的图形界面所致。Debian/Ubuntu下可以通过安装vim-gnome解决。
不同于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 里面的文本复制出来,往往会用鼠标选中,然后到需要粘贴的地方小点下鼠标中键或 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
其它
选项设置
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_481_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]
原文链接:https://www.f2er.com/bash/391449.html