当前位置:K88软件开发文章中心编程工具Vim → 文章内容

Vimscript Potion段移动

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-24 10:54:17

tern = '\v(\n\n^\S|%^)' let flags = 'e' elseif a:type == 2 let pattern = 'two' let flags = '' endif if a:backwards let dir = '?' else let dir = '/' endif execute 'silent normal! ' . dir . pattern . dir . flags . "\r"endfunction我们这里改动了两处。首先,我们依照段移动的类型设置flags变量的值。 现在我们仅需处理第一种情况,所以设置了标记e。其次,我们在搜索字符串中连接dir和flags。这将依照我们搜索的方向加入?e或/e。保存文件,切换回Potion示例文件,并执行:set ft=potion来让改动生效。 现在尝试[[和]]来看看我们的成果吧!函数定义是时候处理我们对"段"的第二个定义了,幸运的是这个比起第一个简单多了。 重新说一下我们需要实现的定义:任何第一个字符为非空字符,包括一个等于号,并以冒号结尾的行。我们可以使用一个简单的正则表达式来查找这样的行。 修改函数中第二个let pattern = '...'成这样:let pattern = '\v^\S.*\=.*:$'这个正则表达式比上一个没那么吓人多了。我把指出它是怎么工作的任务作为你的练习 -- 它只是我们的定义的一个直白的翻译。保存文件,在factorial.pn处执行:set filetype=potion,然后试试新的][和[]映射。它们应该能如期工作。在这里我们不需要搜索标记,因为默认的移动到匹配处开头正是我们想要的。可视模式我们的段移动命令在normal模式下一切正常,但要让它们也能在visual模式下工作,我们还需要增加一些东西。 首先,把函数改成这样:function! s:NextSection(type, backwards, visual) if a:visual normal! gv endif if a:type == 1 let pattern = '\v(\n\n^\S|%^)' let flags = 'e' elseif a:type == 2 let pattern = '\v^\S.*\=.*:$' let flags = '' endif if a:backwards let dir = '?' else let dir = '/' endif execute 'silent normal! ' . dir . pattern . dir . flags . "\r"endfunctionTwo things have changed. First, the function takes an extra argument so it knows whether it's being called from visual mode or not. Second, if it's called from visual mode we run?gv?to restore the visual selection. 两个地方改变了。首先,函数接受的参数多了一个,这样它能知道自己是否是在visual模式下调用的。 其次,如果它是在visual模式下调用的,我们执行gv来恢复可视选择区域。为什么我们要这么做?来,让我展示给你看。 在visual模式下随意选择一些文本并执行下面命令::echom "hello"Vim将显示hello,但可视模式下选择的范围也随之清空!当用:执行一个ex模式下的命令,可视选择的范围总会被清空。?gv命令重新选择之前的可视选择范围,相当于撤销了清空。 这是个有用的命令,你会在日常工作中因此受益的。现在我们需要更新前面的映射,传递0给新的visual参数:noremap <script> <buffer> <silent> ]] \ :call <SID>NextSection(1, 0, 0)<cr>noremap <script> <buffer> <silent> [[ \ :call <SID>NextSection(1, 1, 0)<cr>noremap <script> <buffer> <silent> ][ \ :call <SID>NextSection(2, 0, 0)<cr>noremap <script> <buffer> <silent> [] \ :call <SID>NextSection(2, 1, 0)<cr>这里没什么是过于复杂的。现在让我们加上visual模式映射,作为最后一块拼图。vnoremap <script> <buffer> <silent> ]] \ :<c-u>call <SID>NextSection(1, 0, 1)<cr>vnoremap <script> <buffer> <silent> [[ \ :<c-u>call <SID>NextSection(1, 1, 1)<cr>vnoremap <script> <buffer> <silent> ][ \ :<c-u>call <SID>NextSection(2, 0, 1)<cr>vnoremap <script> <buffer> <silent> [] \ :<c-u>call <SID>NextSection(2, 1, 1)<cr>这些映射都设置visual参数的值为1,来告诉Vim在移动之前重新选择上一次的选择范围。 这里也用到了我们在Grep Operator那几章学到的<c-u>技巧。保存文件,在Potion文件中set ft=potion,大功告成!尝试一下你的新映射吧。 像v]]和d[]这样的命令现在应该可以正常地工作了。我们得到了什么?这是冗长的一章,尽管我们只实现了一些看上去简单的功能,但是你学到了(并充分地练习了)下列有用的知识:使用noremap而不是nnoremap来创建可以作为移动和动作使用的命令。在创建相关联的映射时,使用一个单一的接受多个参数的函数来简化你的工作。逐渐增强一个Vimscript函数的能力。动态地组建一个`execute 'normal! ...'字符串。结合正则表达式,使用简单的搜索来实现移动。使用特殊的正则符号,比如%^(文件开头) 。使用搜索标记来改变搜索的行为。实现不会改变可视选择范围的visual模式映射坚持下并完成练习(不过是阅读一些文档),然后赏自己一些冰激凌。你值得拥有!练习阅读:help search()。这是一个值得了解的函数,不过你也可以使用跟/和?列在一起的标记。阅读:help ordinary-atom来认识能在搜索模式(pattern)中用到的更多有趣的东西。

上一页  [1] [2] 


Vimscript Potion段移动