我尝试创建一个映射,以便将视觉上选择的段落包含在
标签:
vnoremap <silent> _p <Esc>`>a</p><Esc>`<i<p><Esc>:'<,'>s/\n\{2,}/<\/p>\r\r<p>/g<CR>
不幸的是,这种映射总是</p>\r\r<p>
在选择的末尾添加一个不需要的字符(即</p>
在步骤 1 中的最后一个字符后面添加的字符)。
选择没有以双换行符结束,因此模式不应该匹配。我做错了什么?
来自答案
谢谢,Romain – 我安装了环绕插件,但当所选块包含多个段落时,它没有用。上面的映射适用于这种情况,而不是封闭单个段落。
我的映射首先将 </p> 添加到末尾,然后将 <p> 添加到选择的开头,之后它应该用适当的结束标记和开始标记组合替换每次出现的两个或多个换行符。
我仍然不明白为什么替换模式应用于选择的末尾,而该末尾从来不包含双换行符。
答案1
这其实不算不幸,因为这是你明确要求的:'<,'>s/\n\{2,}/<\/p>\r\r<p>/g<CR>
。
视觉上选定的块被完美地包裹在<p></p>
之前:
。
你知道吗环绕插件?它完美地解决了这个问题和其他问题。编辑 HTML 时,这个插件是必备的。
答案2
仔细阅读了有关 \%V 的文档后,我可以自己回答这个问题:
为了确保整个模式位于可视区域内,请在模式的开始和结束处放置 \%V
因此我的映射需要更改为
vnoremap <silent> _p <Esc>`>a</p><Esc>`<i<p><Esc>:'<,'>s/\%V\n\{2,}\%V/<\/p>\r\r<p>/ge<CR>:nohl<CR>
对于我提出问题之前没有进行恰当的研究,我深感抱歉。
答案3
我想这 4 个正则表达式可能看起来有点复杂,但是可以起作用。
:'<,'>s/\(\(\n\)\+\)/*\1*/g |:'<,'>s/\*\(.*\)\*/\1/g | :'<,'>s/\(^.*\)\*/\<tag\>\1/g | :'<,'>s/\n<tag>\(.*\)/\r\1\<\\tag\>/g
仅在文本的最后两行发现限制,或者当使用*
字符时必须将其替换为这些正则表达式中的另一个字符。