Vim文本编辑器 指令簿(二)
常常处理文本以及常常须要写代码的人,都会有自己比較常常使用的编辑器,本人喜欢用Vim。理由就是Vim编辑器灵活,而且能够达到纯键盘操作,使用纯熟情况下,根本不须要鼠标操作。听起来是不是非常酷的?只是别高兴太早,想达到那个境地必须的指令是须要学习+记忆+练习的。总结指令例如以下:
高级正則表達式
1./\s*\<\(return\|else\)\@!\w\+\s\+\w\+\s*([^)]*)\s*;\@!\s*$ 查找多由c语言中的函数
\< 零长度匹配,表示单词的開始
\@! 零长度匹配 表示要求他前面的内容不存在
2.要求是将
变成
方法一:
第一步,添加id="":
:g/^$/ id="">/g
第二步,添加数字:
:let i=0 | g/^$/\=i/| let i=i+1
这是用|号(逻辑或的符号,不是字母)连接的三个语句,
前后两个就是给i赋初值和递增,
id="\zs\ze">$ \zs 和\ze 是"零长度匹配",在这两个中间的才作为匹配内容,
这个语句就是仅仅匹配双引號中间的内容,
这样不会把其它实用的地方替换掉了
\=i \=是把后面的字符串当成表达式来对待,在这里就是i 的值
方法二:
这是用一步解决办法:
:let i=0 | g/^$/\=substitute(" id = \"0\">", "0", i,"")/| let i = i+1
和上面的方法基本同样,就是替换右尖括号,只是这次是替换为substitute("
id = \"0\">", "0", i,"")
这是一个替换函数,就是在id=0中查找第一个0,并替换为i 的值,最后一个參数是{flag},一般为空.
08.08.19 我自己也写了一个,和上面的基本一样,就是不用substitute函数而已
:let i = 1 | g/^$/\=" id = " . i . ">"/ | let i += 1
当中\=表示后面是个表达式,小数点用以连接字符串的几个部分,中间用了i 的值
3. 每行前面加上行号
法一:
:g/^/exec "s/^/".strpart(line(".")." ", 0, 4)
法二:
:%s/^/\=strpart(line(".")." ", 0, 4)/g
line()返回一个行数,特别的,
line(".")返回当前光标所在行的行数,其它的參数见:h
line()
g/^/exec是对全部行运行一个或多个命令,详细能够:h
exec 来查看,
每一个命令必须用字符串,也就是要放在双引號里面,多个命令间用空格切割.
在上面的样例中,后面仅仅有一个命令,可是这个命令是用小数点连起来的一个字符串
4.例如以下的赋值
firstline=1 //comment line 1
secondline=2
thirdline = 3//comment line 2
forthline= 4
fifthline =5
希望整理成
firstline = 1 //comment line 1
secondline = 2
thirdline = 3 //comment line 2
forthline = 4
fifthline = 5
以下是我写的语句,比較长,应该还有更好的写法,以后有改进再补充
:g/=/s#\v(.*)\=\s*(((//|/\*)@!.)*)\ze(//|/\*)?#\=strpart(submatch(1) . " ",0,13) . "= " .
strpart(submatch(2) . " ",0,10)# | s/\s*$//
前面紫色部分,查找全部包括等号的行,然后运行后面两个命令,
第一个命令是橘黄色的部分,第二个命令是蓝绿色部分,
第二个命令就是去掉行末的空格,这个不须要多解释,重点解释第一个命令
s#a#b#是一个替换的命令,这里用#做分隔符,是由于后面的表达式中有斜杆/,
假设用斜杆作为分隔符,则表达式中的斜杆须要转义,稍显累赘
\v表示后面的正則表達式中,除了字母和数字和下划线和斜杆,其它的都作为特殊字符对待,
有这个设置的优点,是后面能够省掉好几个用来转义的反斜杆,
像\(\)\+这些都能够简写成()+
\= 匹配一个等号
\s* 匹配0个或0个以上的空白符
加粗的部分是一个比較重要的地方,一共三层括号,最外层括号使这个括号内部的内容成为一个子匹配,
在后文中的submatch(2)就是指的这一部分,
后面的一个*号,表示第二个括号内的内容能够匹配0 次或0 次以上.
第二个括号内部,@!是个"零长度匹配",表示前面第三层括号内的内容不能出现,
小数点匹配除了换行符外的随意字符,
第三层括号中面,就是c语言凝视的两种形式,//和*.txt
而:argdo %s/hate/love/gc | update
是将參数列表中的全部文件的hate提换成love。并写入硬盘(假设没有|update,就不
会写入,但对应的替换也会被中断)
最后强调一点,使用替换命令的时候。一定记得备份,由于替换是直接写入硬盘滴哦……
专题:
1.模式行
:help modeline
:help 'modeline'
:help 'modelines'
模式一
// vim:ft=cpp tabstop=4
模式二
vim:set tw=78 ts=8 ft=help norl:sdfasdfasdgs
第一种形式中最后一设置项后的冒号或空格是可有可无的。
而另外一种形式中最后一设置项后一定要有冒号——无论冒号后有没有文字。
在设置项中假设要使用空格、制表符或冒号能够在前面加上转义符-`\‘。
其它须要转义符的情况见`:help option-backslash‘。
2.折叠
:help folding
:help foldmethod
:help fold-methods
:help
:set foldmethod=manual
:3,8fo
折叠方式:
1)`manual‘ 手工规则
手工规则下,折叠层级由折叠区域的嵌套关系计算。当我们手工指定一个折叠的区域后,Vim
对这个区域的開始行和结束行做记号,多个区域的開始行和结束行形成了嵌套关系。
假设一
个折叠区域不包括在其它区域之中,则其折叠层级为1;当这个区域直接包括于还有一个区域
时则其为折叠层级为还有一个区域的层级加1;依些类推。
2)`marker‘ 标记规则
当使用标记规则折叠时,层级的计算跟手工规则相似。除了它是依据文件里的标记来划分一
个折叠区域而不是手工指定。然后依据这些区域间的嵌套关系计算折叠层级。
详细使用的标
记通过`foldmarker‘设置。默认是使用'{{{,}}}'。
手工和标记类似
:set foldmethod=manual
:3,8fo 或着高亮选择第三至8行 后 输入指令zf
使用manual通常是暂时性的折叠。假设每次编辑特定文件都须要做相同折叠时时建议结合modeline使用其它折叠
规则。假设不得不使用manual方式时。你能够用:mksession保存包含折叠在内的一切当前编辑设置或者
用:mkview保存当前窗体
3)`indent‘ 缩进规则
行的缩进宽度除以`shiftwidth‘,并向下取整得到每一行的折叠层级。同一折叠层级及更高折
叠层级的连续行形成折叠。
而当中的更高折叠层级的行——假设有的话,形成嵌套的折叠。
4)`syntax‘ 语法规则
跟`marker‘差点儿相同。仅仅是所用的标记是在语法文件里定义的。而不是通过`foldmarker‘设置。
5)`diff‘ 差异规则
除了差异行及其前 后三行1外,其余行折叠(层级为1)。
6)`expr‘ 表达式规则
由用户指定折叠层级的计算方式。方法是对`foldexpr‘进行设置。
详细使用方法稍后说明。
:set foldmethod=expr
:set foldexpr=1
全部的行都被折叠 foldexpr将每行的折叠层级设置为1
v:lnum>=8&&v:lnum<=20?1:0
v:lnum>=8\ &&\ v:lnum<=20\ ?\ 1:0
三个在折叠的表达式比較经常使用几点:
v:lnum 内置变量。表示是“当前行的行号”。:help v:var 查看很多其它内置变量。
getline() 函数用以返回指定行的内容。
?: 三元条件语句。见:help expr1
v:lnum>=8&&v:lnum<=20?1:0
v:lnum>=8\ &&\ v:lnum<=20\ ?\ 1:0
:set foldexpr=(v:lnum>=8&&v:lnum<=20?1:0)
假设一行以@samp{#}開始,折叠。
:set foldexpr=getline(v:lnum)=~/^#/?1:0
以每5行为一组折叠
set v:lnum%5-1?
1:'>1'
用正則表達式@samp{.}推断当前行是否含有文字。
set foldexpr=getline(v:lnum)=~'.'?1:0
在文章的末尾增加
vim: ro: fdm=expr: fde=getline(v\:lnum)=~'.'?
1\:0:
foldtext=foldtext().v\:folddashes.getline(v\:folds
tart+1): foldcolumn=2
则每次打开文件会折叠(方式是空行之间的折叠在一起)
导出折叠的部分到笔记.txt
:folddoclosed .w! >>笔记.txt
假设folddoclosed 仅仅对当前关闭的折叠有效。要导出全部的折叠先使用指令zR
删除全部的marker用 :g/{{{/norm
zD
在'.vimrc'(windows中是'_vimrc')中增加,以下的内容:
" 依据邮件的后缀名进行相关的设置。假设打开的文件后缀名是
'.eml',则当成邮件处理。
autocmd! BufReadPre *.eml se fdm=expr
fde=v:lnum==1?1:getline(v:lnum)=~'^$'?
0:'='
fdt=Mailfdt(v:foldstart,v:foldend) ft=mail | syn on
" 定义函数,用来返回折叠的标题。
" 以折叠的第一和最后一行的行号为參数
func! Mailfdt(fst,fen)
let fst=a:fst
" 保存邮件的标题和发信人
let hfrom=''
let hsub=''
let tline=''
while a:fen!=fst
let tline=getline(fst)
" 推断当前行是否是我们感兴趣的行
" 假设是则保存
if tline=~'^From: '
let hfrom=tline
elseif tline=~'^Subject: '
let hsub=tline
endif
let fst=fst+1
endwhile
" 返回相关信息
if strlen(hfrom) || strlen(hsub)
return hsub . "\t\t\t" . hfrom
else
return getline(a:fst)
endif
endfunc
在增加上面的内容后,我们如今用Vim打开邮件(实际是以.eml作后缀名的文件)
看看,是不是清爽多了!
这是比較不经常使用但又可能比較实用的内容。使用:help查看相关信息。
v:foldstart 内置变量仅仅读变量记录仅仅前所在折叠的起始行号
v:foldend 内置变量结束行号,其余同上
foldlevel() 函数返回指定行的折叠层级
'foldlevel' 设置项仅仅有高于这个值的折叠层级才会进行折叠
'foldnestmax' 设置项指定最深的嵌套数
'foldignore' 设置项在 indent规则中以这个值開始的行的将依据前后行的值来设定折叠层级
:folddoclose 命令 对当前闭合的行执行命令
:folddoopen 命令 对未折叠的行或定义了折叠但未闭合的行执行命令
很多其它内容參考`:help vim-script‘
:help :folddoopen
:help :folddoclosed
3.
高效
1.移动速度
set hlsearch
*
使用fold 先所有关闭 移动到制定fold后再打开
2.Don't type it twice
使用CTR+n 自己主动填充 假设不正确 则 CTR+p 回到起点 敲入新的字符
再 CTR+n时
3.Fix it when it's wrong
:iabbrev teh the
:syntax keyword WordError teh
4.A file seldom comes alone
:!ctags -R .
:tag init
:tnext
:grep “\” **/*.h
:cnext
:make
gf goto file
语法高亮帮助文档
:help syntax.txt
:help 'tags'
:help tags-file-format
:help tags-and-searches
:tag keyword(跳转到与“keyword”匹配的标记处)
:tselect [keyword](显示与“keyword”匹配的标记列表,输入数字跳转到指定的标记)
:tjump [keyword](类似于“:tselect”,但当匹配项仅仅有一个时直接跳转至标记处而不再显
示列表)
:tn(跳转到下一个匹配的标记处)
:tp(跳转到上一个匹配的标记处)
Ctrl-](跳转到与光标下的keyword匹配的标记处。除“keyword”直接从光标位置自己主动获得外,功
能与“:tags”同样)
g](与“Ctrl-]”功能类似。但使用的命令是“:tselect”)
g Ctrl-](与“Ctrl-]”功能类似,但使用的命令是“:tjump”)
Ctrl-T(跳转回上次使用以上命令跳转前的位置)
gf 打开光标处的文件名称(必须将当前文件保存后才行)
1.vim 启动的时候使用 -o 或者 -O 选项。如: vim
[-O|-o] file1 file2 file3
-o 水平切割
-O 垂直切割
会自己主动依据文件的个数分成几行或者几列.
使用 "Ctrl + W" 键在多个窗体之间切换.
gi - incredibly handy
goes to Insert mode where you left it last time
Vim文本编辑器 指令簿(二)的更多相关文章
- Linux系统 vi/vim文本编辑器
Linux系统 vi/vim文本编辑器 (一)Vim/Vi简介 (二)Vim/Vi工作模式 (三)Vim/Vi基本使用 (四)Vim/Vi应用技巧 (一)Vim/Vi简介 Vim/Vi是一个功能强大的 ...
- Vim 文本编辑器的基本使用
Vim文本编辑器是Linux/Unix系统下最常用的工具之一,通过该工具可以很方便的建立.修改.编辑文档或者程序文件,其作用类似与windows系统下的记事本或者notepad++,因此熟练掌握该工具 ...
- 11 vim文本编辑器
和sed相比,sed为字处理器(行编辑器),将文本逐行放入到模式空间(也就是内存)中进行处理,并显示在屏幕上.而vim.vi以及nano都是全屏文本编辑器,而vim则是vi的加强版本,相对于vi,vi ...
- Vim文本编辑器详细用法
1 Vi.Vim文本编辑器 1.Vi.Vim Vi是Visual interface的简称. Vim是Vi的增强版,即Vi Improved.在后面的实例中将介绍Vim的使用. 为什么学vi? 1)所 ...
- Linux学习笔记(九)Vim文本编辑器的使用
Vim文本编辑器的使用 Vim的工作模式 1.命令模式 2.输入模式 3.编辑模式 进入Vim 1.使用Vim打开文件 2.直接进入指定位置 Vim基本命令 1.插入命令 2.光标移动命令 3.使用V ...
- 第十八章 vi/vim文本编辑器介绍
一.vi/vim文本编辑器介绍 1.含义: vi就是一个文本编辑器 2.为什么学习: 系统配置 编写脚本 vim就是vi的升级版 高级版 [root@jindada ~]# [root@jindada ...
- vim文本编辑器的基本使用
vim文本编辑器的基本使用 1. vi和vim的区别和联系 可以说vim是vi的增强版,在使用vim编辑文本时,可以根据字体颜色来判断编写程序的正确性. 2. vim文本编辑器的常用命令 1. 编辑指 ...
- (6.2)vim文本编辑器
vi / vim是Unix / Linux上最常用的文本编辑器而且功能非常强大. vim文本编辑器只有命令,没有菜单.
- Linux命令行下的vim文本编辑器
Linux命令行下的vim文本编辑器 下面这个网站的地址讲解的非成分清楚!!!! http://blog.csdn.net/niushuai666/article/details/7275406 学习 ...
随机推荐
- 结构体UT_LIST_ADD_LAST
使用 UT_LIST_ADD_LAST(list, buf_pool->free, (&block->page)); /****************************** ...
- bzoj3774
这算是最小割中比较难的吧 看到选取显然最小割 看到上下左右四个点我感觉肯定和染色相关 注意每个点的收益获得条件是[或],因此我们考虑拆点i', i,分别表示通过四周控制和控制本身的代价 连边s--&g ...
- [原]Unity3D深入浅出 - 认识开发环境中的自带的Package资源包
Character Controller:角色控制器 Glass Refraction(pro only):玻璃反射资源包 Image Effects :图像效果资源包 Light Cookies:光 ...
- UPC 2224 Boring Counting ★(山东省第四届ACM程序设计竞赛 tag:线段树)
[题意]给定一个长度为N的数列,M个询问区间[L,R]内大于等于A小于等于B的数的个数. [题目链接]http://acm.upc.edu.cn/problem.php?id=2224 省赛的时候脑抽 ...
- [Mac][$PATH]如何修改$PATH变量
从 stackoverflow 找到的方法 http://stackoverflow.com/questions/7703041/editing-path-variable-on-mac 首先打开终端 ...
- 【 D3.js 进阶系列 】 进阶总结
进阶系列的文章从去年10月开始写的,晃眼又是4个多月了,想在年前总结一下. 首先恭祝大家新年快乐.今年是羊年吧.前段时间和朋友聊天,聊到十二生肖里为什么没猫,我张口就道:不是因为十二生肖开会的时候猫迟 ...
- 分布式存储Memcache替代Session方案
PHP自带的Session实际是在服务器中为每个客户建立独立的文件存放各自的信息. 在不做处理的情况下,很容易被客户端伪造.并且由于采用文件形式,所以存在着IO 读写的瓶颈.一般当用户在线达到1000 ...
- Java [Leetcode 258]Add Digits
题目描述: Given a non-negative integer num, repeatedly add all its digits until the result has only one ...
- MEX文件编写和调试
作者kaien,2010/02/16 以前我写过一篇文章,详细的介绍过MEX的格式,语法,编译,调试等.可惜记不清放在哪里了.而最近又用到MEX编程,所以只能重新温习一番.时间有限,只记下简要流程和注 ...
- JMX学习笔记(三)-MXBean
在MBean中有只要遵循以下两个规则,我们就可以在jconsole中动态的改变MBean中的属性值 1. JMX中要定义接口必须以xxxMBean的规范定义 2. 得有类实现xxxMBean接口 例如 ...