Vim功能可查找图案,替换和可视模式

时间:2018-07-27 15:40:26

标签: vim

因此,我使用Vim在工作中编写报告,报告基本上是我们反复编写的一堆“常见问题”,因此它们是模板化的。这些模板具有占位符块{==BLOCK==},以确保人们根据需要修改内容,因此,这是一个示例:

The test revealed that it was possible to access {==sensitive data==},
as shown in the examples below...

该块可能需要修改,也可以不修改。因此,我的想法是,我正在编辑常见问题,我看到有3或4个块,例如示例中的块,我想按下[leader] b,最后得到模板文本在可视模式下选择的第一个块,但周围没有{====}

我尝试了几件事,但是我没有走太远,有什么建议吗?

谢谢!

4 个答案:

答案 0 :(得分:2)

您可以定义以下功能:

function! VisualSelect()                                                 
    call search("==}")                                                      
    norm hvT=                                                             
endfunction                                                                 
nnoremap <leader>b :call VisualSelect()<cr> 
vnoremap <leader>b Ol<esc>:call VisualSelect()<cr>

这将直观地选择{====}之间的内容。重复输入<leader>b将选择下一个出现的地方。

答案 1 :(得分:0)

大多数模板/摘要扩展插件都支持此功能。

使用我的lh-brackets插件,您可以执行

:SetMarkers {== ==}

,然后使用vim的CTRL+J或gvim的META-DEL从一个占位符跳到下一个占位符。 lh-brackets不会加载/扩展模板。 mu-template将添加此层。

如果相反,您选择使用一种较为流行的代码段插件,则肯定会有一个选项可以更改占位符的语法,但我不知道。

穷人的解决方案如下:

nnoremap <c-j> <c-\><c-n>/{==.*==}<cr>v/==}/e<cr><c-g>
snoremap <c-j> <c-\><c-n>/{==.*==}<cr>v/==}/e<cr><c-g>

但是它不会处理恢复搜索模式,光标已经位于占位符之内的情况,等等。

编辑:自动删除占位符标记的版本是

nnoremap <c-j> <c-\><c-n>/{==.*==}<cr>v/==}/e<cr>s<c-r>=matchstr(@", '{==\zs.*\ze==}')<cr><esc>gv6h<c-g>
  • snoremap中的

答案 2 :(得分:0)

简而言之:

/{==.*==}<cr>

它的作用:

1。)找到图案

xxx

2。)删除第一个“ {==“

vt=

3。)视觉选择文本,直到第一个=为止(也许也可以针对使用正则表达式进行优化,而不是简单地搜索下一个=)

/==}<cr>

4。)转到结束序列

xxx

5。)将其删除

gv

6。)再次选择您的最后选择

{{1}}

答案 3 :(得分:0)

我已经找到了一种基于@snap所说的方式,我最终将代码添加到Python插件中以通过它运行它,因为这与我尝试做的事情更加吻合,如以下代码段所示:

@neovim.command('VimisEditTemplateBlock')
def urlify(self):
    """Search next codify block and prepare for editing"""
[...]
    self.nvim.command('call search("{==")') # Find beginning of codify block
    self.nvim.command('norm xxx') # Delete {==
    self.nvim.command('norm vf=') # Select the inner text
    self.nvim.command('norm v')
    self.nvim.command('norm xxxgvh') #Delete ==} and leave the inner text selected in Visual Mode
相关问题