Vim操作
命令格式
vim的命令采用下面的格式。
[OPERATOR][NUMBER][MOTION]
Operator是动词。
- d – Delete (等同于cut命令)
- c – Change
- y – Yank
- p – Insert last deleted text after cursor (put command)
- r – Replace
- v - 可视化选择
Motion表示操作的上下文。
- w – 直到下一个单词的起始位置前面。
- s - sentence
- p - paragraph
- t - tag
- b - block
- e – 直到当前单词的最后一个位置。
- $ – 直到当前行的最后一个位置。
- ) – 下一个句子的开始。
- ( – 当前句子的开始。
- } – 下一段的开始。
- { – 当前段的开始。
- ] – 下一段部分(section)的开始
[
– 当前部分(section)的开始H
– 当前屏幕的顶部行L
– 当前屏幕的最后一行
Count是可选的,表示command和motion的重复次数。
- i - inside
- a - around
- NUM: number (e.g.: 1, 2, 10)
实例
- dw 删除一个词
- d4w 删除四个词
- d$ 删除当前行
- dd 删除当前行(d$的快捷方式)
- d2$ 删除两行
- cis - Change inside sentence,删除当前句子,并进入insert模式
- yip - yank inside paragrah 复制当前段落
撤销命令
- u 撤销上个命令
移动光标
- h – Left
- k – Up
- l – Right
- j – Down
- ^ 移动到一行开头
- $ 移动到一行末尾
- ' ' (两次单引号)移动到光标上一次位置
- G 移动到文件最后一行
- 123 + G 跳到指定行
- gg 移动到文件第一行
- ctrl + g 查看当前文件总行数
- % 移动到当前代码区块的开始/结尾(匹配
()
,[]
,{}
)
插入文字
- i 当前位置前面
- a 当前位置后面
- o 当前行下方新增一行
- O 当前行上方新增一行
删除
- x 删除当前字符
搜索,替换
- :/cat 搜索光标位置后面
- :?dogs 搜索光标位置前面
- n 移动到下一个匹配
- N 移动到上一个匹配
- :s/cat/dog 只替换下一个
- :s/cat/dog/g 替换所有
执行shell命令
- :!ls -al
复制,粘贴,剪切
选择文本
- v+光标移动 (按字符选择)高亮选中所要的文本,然后进行各种操作(比如,d表示删除)。
- V (按行选择)
- v+选中的内容+c 更改选中的文字
复制:y(ank)
- y 用v命令选中文本后,用y进行复制
- yy 复制当前行,然后用p进行复制
- 5yy 复制从当前行开始的5行
- y_ 等同于yy
- Y 等同于yy
- yw 复制当前单词
- y$ 从当前位置复制到行尾
- y0 从当前位置复制到行首
- y^ 从当前位置复制到第一个非空白字符
- yG 从当前行复制到文件结束
- y20G 从当前行复制到第20行
- y?bar 复制至上一个出现bar的位置
粘贴
- p 在光标位置之后粘贴
- P 在光标位置之前粘贴
剪切
- v + 选中的内容 + d 剪切
剪贴板
(1) 简单复制和粘贴
vim提供12个剪贴板,它们的名字分别为vim有11个粘贴板,分别是0
、1
、2
、...
、9
、a
、“
。如果开启了系统剪贴板,则会另外多出两个:+
和*
。使用:reg
命令,可以查看各个粘贴板里的内容。
:reg
在vim中简单用y只是复制到“
(双引号)粘贴板里,同样用p粘贴的也是这个粘贴板里的内容。
(2)复制和粘贴到指定剪贴板
要将vim的内容复制到某个粘贴板,需要退出编辑模式,进入正常模式后,选择要复制的内容,然后按"Ny完成复制,其中N为粘贴板号(注意是按一下双引号,然后按粘贴板号,最后按y),例如要把内容复制到粘贴板a,选中内容后按"ay就可以了。
要将vim某个粘贴板里的内容粘贴进来,需要退出编辑模式,在正常模式按"Np,其中N为粘贴板号。比如,可以按"5p将5号粘贴板里的内容粘贴进来,也可以按"+p将系统全局粘贴板里的内容粘贴进来。
(3)系统剪贴板
Vim支持系统剪贴板,需要打开clipboard功能。使用下面的命令,检查当前版本的Vim,是否支持clipboard。
$ vim --version
如果不支持的话,需要安装图形化界面的vim(即gvim),或者重新编译vim。
$ sudo apt-get install gvim
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
Package gvim is a virtual package provided by:
vim-gtk 2:7.4.488-7
vim-gnome 2:7.4.488-7
vim-athena 2:7.4.488-7
You should explicitly select one to install.
E: Package 'gvim' has no installation candidate
$ sudo apt-get install vim-gnome
另一种方法,是安装vim-gui-common。
$ sudo apt-get install vim-gui-common
安装以后,可以用命令行界面,启动gvim,这时可用系统剪贴板。
$ gvim -v
星号(*
)和加号(+
)粘贴板是系统粘贴板。在windows系统下, * 和 + 剪贴板是相同的。对于 X11 系统, * 剪贴板存放选中或者高亮的内容, + 剪贴板存放复制或剪贴的内容。打开clipboard选项,可以访问 + 剪贴板;打开xterm_clipboard,可以访问 * 剪贴板。 * 剪贴板的一个作用是,在vim的一个窗口选中的内容,可以在vim的另一个窗口取出。
复制到系统剪贴板
"*y
"+y
"+2yy
– 复制两行{Visual}"+y
- copy the selected text into the system clipboard"+y{motion}
- copy the text specified by {motion} into the system clipboard:[range]yank +
- copy the text specified by[range]
into the system clipboard
剪切到系统剪贴板
"+dd
– 剪切一行
从系统剪贴板粘贴到vim
"*p
"+p
Shift+Insert
:put +
- Ex command puts contents of system clipboard on a new line<C-r>
+ - From insert mode (or commandline mode)
"+p
比 Ctrl-v 命令更好,它可以更快更可靠地处理大块文本的粘贴,也能够避免粘贴大量文本时,发生每行行首的自动缩进累积,因为Ctrl-v
是通过系统缓存的stream处理,一行一行地处理粘贴的文本。
多窗口
垂直切分窗口,Ctrl-w + s 或者使用下面的命令。
:split <文件名>
水平切分窗口,Ctrl-w + v 或者使用下面的命令。
:vsplit <文件名>
如果省略文件名,则打开的是当前文件。
切换窗口的命令。
- Ctrl-w + Ctrl-w
- Ctrl-w + direction key
vimrc文件配置
打开语法高亮
:syntax on
禁止使用箭头键。
nnoremap <Left> :echoe "Use h"<CR>
nnoremap <Right> :echoe "Use l"<CR>
nnoremap <Up> :echoe "Use k"<CR>
nnoremap <Down> :echoe "Use j"<CR>
在窗口间移动。
nnoremap <c-j> <c-w>j
nnoremap <c-k> <c-w>k
nnoremap <c-h> <c-w>h
nnoremap <c-l> <c-w>l
命令行模式
# 列出所有buffer
:ls
# 列出所有buffer(包括不可见buffer)
:ls!
# 在当前窗口打开一个新的文件,
# 新建一个buffer,原有文件成为不可见buffer
:e file1
# 新建一个未命名的buffer,然后将其存为 /tmp/foo
:enew
:w /tmp/foo
插件
dmw多窗口管理
网址:http://www.vim.org/scripts/script.php?script_id=4186
窗口按下面方式组织。
=================
| | S1 |
| |==========
| M | S2 |
| |==========
| | S3 |
=================
操作
- CTRL-N 在[M]区域创建一个新窗口,将以前的窗口都堆在[S]区域
- CTRL-C 关闭当前窗口
- CTRL-J 跳到下一个窗口(顺时针方向)
- CTRL-K 跳到前一个窗口(逆时针方向)
- CTRL-F 将当前窗口放入[M]区域,并将其他窗口放在[S]区域
提示行操作
- :w: write your changes to the file
- :q!: get out of vim (quit), but without saving your changes (!)
- :wq: write your changes and exit vim
- :saveas ~/some/path/: save your file to that locationvim
- ZZ: a faster way to do :wq
https://www.cnblogs.com/litterrondo/archive/2013/05/18/3085654.html
1.Vim的三种模式
vi/vim有三种执行模式:命令模式、插入模式和编辑模式。
使用vi/vim打开文件时默认进入命令模式,三种模式之间的切换如上图所示。
2. 插入命令
在命令模式下键入插入命令会进入到插入模式下,插入模式下可以输入文本。
i: 在光标前插入, I: 在光标所在行的行首插入
a:在光标后插入, A:在光标所在行行尾插入
o:在光标所在行上插入新行,O:在光标所在行下插入新行
3. 光标移动命令
在命令模式下键入,改变光标位置
h:光标左移, j:光标下移, k:光标上移, l:光标右移动
H:光标定位到屏幕最上面一行, M:光标移动到屏幕中央, L:光标移动到屏幕最下方
0: 光标移动到行首, $光标移动到行尾
4. 定位命令
在命令模式下键入,定位光标位置
gg:回到文件首行, G:回到文件尾行
:n和nG: 光标定位到文件第n行(:20或20G表示光标定位到第20行)
:set nu 或:set number显示行号, :set nonu 取消显示行号
5. 删除命令
在命令模式下键入,删除文件中的内容
x : 删除光标所在字符, nx:删除光标后n个字符
dd:删除光标所在行,ndd:删除光标所在行以后的n行
D:删除光标到行尾的内容
dG:删除光标所在行到文件末尾的内容
:n1,n2d:删除行n1到行n2的内容,包括第n1和n2行都被删除
6. 复制剪切粘贴命令
yy 或 Y: 复制当前行
nyy或nY:从当前行开始赋值n行
剪切使用dd和ndd,相当于删除
p:在光标所在行之后粘贴
P:在光标所在行之前粘贴
在命令模式下输入v进入visual模式,使用光标选定区域,之后d删除,或者y进行拷贝,再将光标移动到目标位置,p进行粘贴
7. 替换字符命令
命令模式下键入r,替换当前字符后回到命令模式
命令模式下键入R,一直替换知道通过<ESC>回到命令模式
u:取消上一步操作,只要未保存文件,就可以一直取消
8. 搜索和替换命令
命令模式下键入:/target, 查找文件中所有的target串,n:下一个target出现的地方(从前往后), N:下一个target出现的地方(从后往前)
:set ic :搜索忽略大小写
:%s/old/new/g 将全部old替换为new, 不许确认直接替换
:n1,n2s/old/new/g 将n1-n2行中出现的所有old替换为new, 不需确认直接替换
若将上述命令中的g变为c则是需要逐条确认的替换
9. 退出vi/vim
:q! 不保存退出
:wq 或ZZ 保存退出
:w 保存不退出(保存后,之前的操作不能通过u取消)
:w filename 当前内容另存为filename
10.函数跳转
详见博客:https://blog.csdn.net/ballack_linux/article/details/71036072
先使用命令:ctags -R . 在当前目录下创建关系目录,之后进入vim;或者ctags -R * 递归当前目录下所有子目录,并建立tag
在函数名所在行:Ctl+] 进入函数定义
之后Ctl+T (记忆:退的拼音tui)回退
10. 导入文件内容
:r filename 将filename的文件内容导入到当前编辑文件光标处,如:r /home/test.file 将test.file内容导入
11. vi命令模式下执行linux命令
:! shell命令,如:! date将执行date命令
12. 将shell命令的执行结果导入当前编辑文件
:r! shell命令,如:r!date,将date命令的执行输出写入到当前编辑文件
13. 定义快捷键
:map ^P I#<ESC>(其中^是在命令模式下ctrl+v输入的,表示ctrl键),该快捷键定义表示,当命令模式下键入ctrl + p键时,将在行首插入一个#符并回到命令模式
:map p I*<ESC>,当该快捷键定义后,命令模式下键入p,则会在行首插入一个*符并返回命令模式
:map ^B 0x, 该快捷键定以后,命令模式下键入ctrl + b, 会删除行首的字符
:unmap ^P 取消定义的ctrl+p快捷键
14. 别名
:ab test a_very_long_sentense
定义上述别名后,每次插入test回车后,test都将被替换为a_very_long_sentense
:unab test 取消别名
15. l连续注释行
使用命令:n1,n2s/^/#/g 将n1到n2的所有行行首添加字符#
使用命令:n1,n2s/^#//g将n1到n2之间的所有位于行首的#符去掉
16. 保存vi/vim设置
上述的快捷键设置、别名设置,若只是在vi/vim命令模式下设置,将只对本次编辑有效,下次在进入vi/vim,这些设置将不在可用。
保存vi/vim设置需要修改宿主目录下的文件.vimrc
root 宿主目录为 /root
普通用户的宿主目录通常为 /home/username/