• 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="zsze">$ zs ze "零长度匹配",在这两个中间的才作为匹配内容,

    这个语句就是仅仅匹配双引號中间的内容,

    这样不会把其它实用的地方替换掉了

    =i =是把后面的字符串当成表达式来对待,在这里就是的值

    方法二:

    这是用一步解决办法:

    :let i=0 | g/^$/=substitute(" id = "0">", "0", i,"")/| let i = i+1

    和上面的方法基本同样,就是替换右尖括号,只是这次是替换为substitute(" id = "0">", "0", i,"")

    这是一个替换函数,就是在id=0中查找第一个0,并替换为的值,最后一个參数是{flag},一般为空.

    08.08.19 我自己也写了一个,和上面的基本一样,就是不用substitute函数而已

    :let i = 1 | g/^$/=" id = " . i . ">"/ | let i += 1

    当中=表示后面是个表达式,小数点用以连接字符串的几个部分,中间用了的值

    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)就是指的这一部分,

    后面的一个*,表示第二个括号内的内容能够匹配次或次以上.

    第二个括号内部,@!是个"零长度匹配",表示前面第三层括号内的内容不能出现,

    小数点匹配除了换行符外的随意字符,

    第三层括号中面,就是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 . " " . 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

  • 相关阅读:
    微软同步框架入门之八使用WCF同步远程元数据
    使用Silverlight Toolkit TreeView树形控件
    使用Silverlight Toolkit绘制图表(上)柱状图
    Hello F#
    值类型和引用类型在hashtable里面性能比较分析1 GetHashCode()
    Fedora Core 6 完整下载信息
    IT从业者真的成了民工,悲哀呀
    俺也用一下mandriva,恩,KDE的效果的确不错
    我们的何时能赶上MS的脚步
    获得汉字字符串的首个拼音字母的缩写
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/5048543.html
Copyright © 2020-2023  润新知