我正在使用vim来维护我一天所做的博客(我用来生成输出的命令等等),有时我需要复制粘贴其中包含特殊html字符的字符串。有没有办法制作一个“html-paste”模式,以便(例如)转换<到& lt;?
答案 0 :(得分:6)
对于简单的XML编码,我使用Tim Pope的unimpaired.vim。
[x
后跟动议[x
[xx
对当前行进行编码编码刚粘贴的文字:
`[[x`]
说明:
`[
和`]
是由变更或冲动的边界设置的标记。开头为`[
,最后为`]
。`[
[x
以编码以下动作`]
,动作将是当前光标位置与粘贴文本末尾之间的所有文本。您可以选择将其包装成映射
nmap <leader>x `[[x`]
更多信息:
:h mark-motion
:h `[
答案 1 :(得分:5)
如果有人想要修改它们以接受范围,那么有一些小函数here,然后提供一个映射,通过[
和]
标记来处理上次粘贴的行为文本。
实际上,看了一下之后,根本不需要修改vim提示中的功能。如果函数未显式传递range
选项,则对给定范围的每一行调用该函数一次。这意味着您需要做的就是使用范围调用该函数。
以下是一些有用的例子。第一个为最后粘贴的文本中的每一行调用HtmlEscape(),第二个调用相同但对于视觉选择的块中的每一行。将其添加到您的.vimrc
:
nnoremap <Leader>h :'[,']call HtmlEscape()<CR>
vnoremap <Leader>h :call HtmlEscape()<CR>
function HtmlEscape()
silent s/&/\&/eg
silent s/</\</eg
silent s/>/\>/eg
endfunction
显然,如果你想要更换更多的东西,你必须添加它们;链接的维基页面上有很多。
答案 2 :(得分:3)
您可以使用将转换寄存器值的映射然后粘贴它:
python import xmlrpclib, vim
function! EscapeHTML(str)
try " Force any error to be an exception "
let d={}
python vim.eval("extend(d, {'xml': '"+xmlrpclib.escape(vim.eval("a:str")).replace("'", "''")+"'})")
return d.xml
endtry
endfunction
function! s:PasteHTML()
return "\"=EscapeHTML(getreg(".string(v:register)."))\np"
endfunction
nnoremap <expr> ,p <SID>PasteHTML()
需要安装了python支持和python的vim。 xmlrpclib
包附带python。如果你不想要python,请替换EscapeHTML函数。使用此脚本,p
将与p
一样,除了转换其输入。