2011-04-20 20 views
4

我正在使用vim来维护一天的工作(我用来生成输出等的命令)的博客,有时我需要复制粘贴具有特殊html字符的字符串。有没有办法做一个“HTML粘贴”模式,将(例如)将<转换为& lt ;?vim是否有HTML转义粘贴模式?

+0

VIM-不受损害 - https://github.com/tpope/vim-unimpaired#unimpairedvim – arcseldon 2017-11-10 09:02:47

回答

5

有几个小功能here如果有人感觉就像修改他们接受一个范围,然后提供经过[]标记作用于最后粘贴的文本的映射。


实际上,看了一下之后,根本不需要修改vim提示中的函数。如果某个函数没有明确地通过range选项,则该函数将针对给定范围的每一行调用一次。这意味着你所需要做的就是用范围调用函数。

下面是几个有用的例子。第一个在最后粘贴的文本中为每一行调用HtmlEscape(),第二个是相同的,但对于视觉选择的块中的每一行都是一样的。如果你想要更多的东西所取代,你不得不将它们添加

nnoremap <Leader>h :'[,']call HtmlEscape()<CR> 
vnoremap <Leader>h :call HtmlEscape()<CR> 

function HtmlEscape() 
    silent s/&/\&amp;/eg 
    silent s/</\&lt;/eg 
    silent s/>/\&gt;/eg 
endfunction 

明显;:添加到您的.vimrc链接的维基页面上有很多。

+0

太棒了!此外,一个litte解释 http://stackoverflow.com/questions/1764263/what-is-the-leader-in-a-vimrc-file – 2014-09-21 08:42:47

+0

只是好奇,为什么'\&'而不是'&'在替代? – rox 2016-08-15 02:33:20

+0

@rox请参阅':help sub-replace-special'。这一切都取决于你的vim设置是什么,但是默认'&'被替换为整个匹配的字符串。 – 2016-08-15 11:46:03

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活力。 xmlrpclib软件包附带python。如果你不想Python,请替换EscapeHTML函数。使用此脚本,p将像p一样工作,除了转换其输入。

6

对于简单的XML编码,我使用Tim Pope的unimpaired.vim

  • [x后跟一个运动
  • 视觉上选择文本然后[x
  • [xx编码当前线

为了编码只粘贴文本:

`[[x`] 

说明:

  • `[`]是由变化或拉紧的边界设置的标记。在开始处为`[,在末尾为`]
  • 第一位置移动到刚粘贴文本的开始与`[
  • 接着执行[x编码以下运动
  • 通过使用`]运动将是所有当前光标位置之间的粘贴结束时的文本文本。

您也可以选择这个包裹成一个映射

nmap <leader>x `[[x`] 

的更多信息:

:h mark-motion 
:h `[ 
+0

非常好的提示和优秀的背景 – sehe 2011-04-20 19:37:32