Chinaunix首页 | 论坛 | 博客
  • 博客访问: 214763
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-09 10:55
个人简介

每天改变一点点,生活充满了惊喜。

文章分类

全部博文(42)

文章存档

2016年(8)

2015年(29)

2014年(5)

我的朋友

分类: LINUX

2015-11-29 13:07:02

Vim 中的命令又称为 Ex 命令,它继承之 Unix 早期的文本编辑器 ex。
Vim 中几乎所有的功能都有相应的Ex命令。但我们仅需关注命令行模式比普通模式操作更具优势的地方。

一般来说,普通模式命令操作当前字或行,Ex命令可以在任意位置执行,这意味着无需移动光标就可以作为修改,
而Ex命令最优秀的地方是它拥有在多行上同时执行的能力(Ex命令影响范围广且距离远)。

: 命令提示符
/ 查找提示符(查找提示符只是命令行模式的一种形式)

地址和范围的表示:
构建Ex命令地址及范围的符号:
1        文件的第一行
$        文件最后一行
0        虚拟行,位于文件第一行的上方。它主要用于对文件的开头进行操作。
.         光标所在行
'm      包含位置标记m的行
'<       高亮选区的起始行
>'       高亮选区的结束行
%       整个文件(: 1,$ 的简写形式)

用行号作为地址:
:1 print     打印第一行内容
用地址指定范围: 
:2,5 print     打印2到5行
:.,$ print     打印当前行到最后一行
:%s/{char1}/{char2}/     对整个文本做替换
用模式指定范围:
:/{char1}/,/{char2}/ print
用偏移量对地址做修正:
:/{char1}/+1,/{char2}/-1 print
:.,.+3 print     打印当前行即当前行后3行

Ex 命令:
set    
is for setting options
let     for assigning a value to a variable
pwd    
查看当前工作目录
cd        
切换当前工作目录

copy / co / t (co或t是copy简写形式)
:6 copy .    为第6行创建副本,放到当前行下方。
当然,普通命令行模式下的y和p命令也能完成相应的工作,但如果不想覆盖默认寄存器中的当前内容时,就可以使用copy命令了。
而且y和p命令需要跳转,当复制较远的行是,copy命令就显得更高效。

move / m
:2 move 0    第2行移动到行首
:'<,'> m $     结合可视化模式,'<,'>表示高亮选中部分,整个命令表示把高亮部分移至文档尾部。

autocmd
:au[tocmd] [group] {event} {pat} [nested] {cmd}
通过autocmd,在某个事件发生时,可以调用一条命令

搜索命名:
grep/vimgrep
grep 是 vim 对外部grep命令的一层封装,vimgrep是内部搜索命令。查询结果会保存在quickfix列表中,:cnext/:cprev 可以用来浏览。
vimgrep 的好处是可移植性,另外可以使用强大的VIM搜索模式。,当然会相对要慢些,因为文件要被读进内存。
:vim[grep][!] /{pattern}/[g][j] {file} ...  g表示每个匹配创建一条记录,j 是否跳转到第一个匹配处。
: 1 vimgrep pattern file 只查找第一个匹配(在只需检查是否存在匹配是很有用)
:vimgrep /myfunc/ **/*.c 递归查找目录下的.c文件

:gr[ep][!] [arguments] 
:grepgrp 用于定义调用的外部命令行,默认 grepprg=grep -n $* /dev/null
:grepformat 用来指示vim如何解析查找的输出,默认 grepformat=%f:%l:%m,%f:%l%m,%f  %l%m

命令行模式的高效编辑场景:
(1)在指定范围上执行普通命令(normal 命令)
:% normal A; 在文件的每行结尾加上;
或 先在普通模式下在1行执行 A;再执行     :2,$ normal .后面命令表示,在第2行道最后一行重复前面的命令。
还可以这样来注释代码:
:10,20 normal i//

运行Shell 命令 :!{cmd}
:shell    启动一个交互的shell 回话,执行完shell命令后,exit退出返回vim。
:read !{cmd}     把{cmd} 命令的输出读入当前缓冲区中。
:write !{cmd}    把缓冲区内容作为{cmd}的标准输入。

实例1(重命名文件):
$vim
:r !ls *.c
:%s/\(.*\).c/mv & \1.bla/
:w !sh

实例2 (排序):
:2,$ !sort -t ',' -k2

命令行模式其它
@:    重复上次的命令,:寄存器总是保持最后执行的命令行命令。
{C-r}{C-w}  用于插入光标下的单词  {C-r}{C-a}   插入光标下的字符串。
set history=200     Vim默认记录最后20条命令,修改为保存200条。
q:    打开命令行窗口,展示历史命令,也可以对命令进行编辑后再执行。q/ 对命令做查找。从命令行模式切换到命令行窗口。
set wildmode=longest,list    在 .vimrc 名设置自动补全格式 

-----------------------------------------------------------------------------------
参考:
《Vim 使用精巧》 《Practical Vim - edit text at the speed of thought》


阅读(1674) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~