2011-04-20 24 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