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

转载于:https://www.cnblogs.com/hrhguanli/p/5048543.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读《数学之美》

数学之美 数学的发展实际上是不断的抽象和概括的过程 目录 数学之美 第一章 第二章&#xff08;从规则到统计&#xff09; 第三章 统计语言模型 第四章 分词 第五章 隐马尔科夫模型 第六章 信息的度量和作用 第七章 贾里尼克和和现代语言处理 第八章 简单之美——布…

每天一个JavaScript实例-动态省份选择城市

<!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /> <title>每天一个JavaScript实例-动态省份选择城市</title> <script> var citystore new Array(); citys…

阅读源码那些事

方法 看spring的源码的时候如果我们一直追究所有的细节那会让我们会越陷越深&#xff0c;掉入细节的无底洞&#xff0c;稍不留神脑回路跟不上就会蒙圈。 因此&#xff0c;我们要学会找源码中的关键部分看&#xff0c;弄懂主要流程和本次看源码的目的的那部分就行。 等我们对…

Advanced C++ --- const function

上一篇介绍了const修饰的变量或者指针的含义&#xff0c;这篇我们介绍const修饰的函数以及函数参数含义。 首先我们看一个例子 class Dog{int age;string name; public:Dog(){age 3;name "dummy";}void setAge(const int &a){age a;a;} };int main(){Dog d;in…

slf4j、log4j日志报错排查

1、WARN Please initialize the log4j system properly 解法&#xff1a;只要在 src文件目录下建立配置文件log4j.properties即可 2、SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder" 解法&#xff1a;这是因为sl4j和log4j的不兼容导致的&#…

无刷新三级联动查询

JQuery中国省市区无刷新三级联动查询&#xff08;转&#xff09;&#xff1a;http://www.cnblogs.com/xiaoyu5062/archive/2012/07/30/2615359.html Ajax实现无刷新三联动下拉框&#xff08;转&#xff09;&#xff1a;http://singlepine.cnblogs.com/articles/257954.html js特…

java.lang.NoClassDefFoundError: org/apache/shiro/authc/AuthenticationToken

使用ieda构建web工程项目&#xff0c;启动tomcat报错&#xff1a; java.lang.NoClassDefFoundError: org/apache/shiro/authc/AuthenticationToken maven经过不断的clean&#xff0c;compile、package都没有作用&#xff0c;最后发现是因为compile后生成了jar包 于是手动在pom…

iOS屏幕尺寸和分辨率了解

1、截至目前为止&#xff0c;主流的iOS设备屏幕有以下几种&#xff1a; --------------- iPhone ---------- -------- iPad ------------ 2、iOS设备屏幕分辨率&#xff1a;&#xff08;ppi是像素密度单位【像素/英寸】&#xff0c;401ppi表示每英寸上有401个像素&#xff0…

“睡服”面试官系列第十七篇之Reflect(建议收藏学习)

目录 1. 概述 2. 静态方法 2.1Reflect.get(target, name, receiver) 2.2Reflect.set(target, name, value, receiver) 2.3Reflect.has(obj, name) 2.4Reflect.deleteProperty(obj, name) 2.5Reflect.construct(target, args) 2.6Reflect.getPrototypeOf(obj) 2.7Reflec…

java死锁检测

/*** author&#xff1a;cp* time&#xff1a;2021-2-24* Description: java死锁测试* 进程id查看命令&#xff1a;jsp 找到对应的进程id* 通过jstack 进程id 输出死锁信息** 如何定位死循环导致的其他线程阻塞等待&#xff1a;* linux下top命令查看cpu使用率较高的java进程&am…

div始终在底部

<style type"text/css">body{margin:0;padding:0; } html,body{height:100%;}div{width:100%;height:100px;background:#fc9;position:absolute;top:100%;margin-top:-100px}</style><div></div> 底部多高它的margin-top 就负多少。保证不留…

“睡服”面试官系列第十八篇之generator函数的语法(建议收藏学习)

目录 1简介 1.1基本概念 1.2yield 表达式 1.3与 Iterator 接口的关系 2. next 方法的参数 3. for...of 循环 4. Generator.prototype.throw() 5. Generator.prototype.return() 6. next()、throw()、return() 的共同点 7. yield* 表达式 8. 作为对象属性的 Generator…

微信撤回消息格式

<msg><fromusername>wxid_1zcdlm1cjhr522</fromusername><scene>0</scene><commenturl></commenturl><appmsg appid"" sdkver"0"><title>还好</title><des></des><action>…

MSSQL 2005数据库与SP4补丁安装

MSSQL 2005数据库与SP4补丁安装 Sql Server 2005 正确安装之前的win7配置&#xff1a; http://wenku.baidu.com/link?url6T3jzVnu2XY_sfqfe9ZqQ_6dUOdrZwHc83baWh6tgD2D4RBLnbFVoYn5hpq80v3G9ZmE1mQMzmSVWbm6VR26LlSGg3Pobl6B5VskugHjYF7 Sql Server 2005 的下载地址&#xff…

“睡服”面试官系列第十九篇之async函数(建议收藏学习)

目录 1. 含义 2. 基本用法 3. 语法 3.1返回 Promise 对象 3.2Promise 对象的状态变化 3.3await 命令 3.4错误处理 3.5使用注意点 4. async 函数的实现原理 5. 与其他异步处理方法的比较 6. 实例&#xff1a;按顺序完成异步操作 7. 异步遍历器 7.1异步遍历的接口 …