2013-12-11 102 views
2

我想在Ex一行內做一些非常簡單的事情: 在PHP echo聲明中包裝HTML行。Vim:用一些東西代替整行

<p>Greetings</p> 
*run command* 
echo "<p>Greetings</p>"; 

這應該是非常簡單的,因爲存在佔位符只能在當前行上工作。

我做了工作中使用此命令

:s/\v(.*)/echo "\1";/g 

然而,這使Vim搜索,因此突出匹配的一切。*(=什麼)。整個文件因此突出顯示,我必須手動清除上次搜索或搜索某些垃圾來清除它。

因此總結:Ex命令期間是否有任何現有的佔位符或方式來引用當前行?

+1

清除搜索模式隨後使用: nohlrsearch – bjhaid

回答

4

你可以用:nohlsearch停止高亮:

:s/\v(.*)/echo "\1";/g | noh 

這將仍然痛毆最近的搜索模式;完全中和,使用:

:s/\v(.*)/echo "\1";/g | call histdel('search', -1) | let @/ = histget('search', -1) | nohlsearch 

或者,您可以切換到較低級別的功能,避免匹配:

:call setline('.', 'echo "' . getline('.') . '";') 

PS:您可以簡化您的搜索模式;沒有必要明確地捕捉某些東西;看看如何簡化它的許多其他答案。

+0

我嘗試了所有的解決方案在這裏和你是唯一誰清除的成功突出。查看一些較低級別的功能也非常有趣!謝謝:) – krystah

+1

謝謝!我很驚訝你的問題吸引了多少答案,以及他們大多數人錯過了這一點。請嘗試下次更好地表達您的問題(我知道這很難);它似乎並不完全清楚(我也必須讀兩遍)。 –

+0

我會牢記這一點!謝謝首席。 ^^ – krystah

0

看起來像(.*)正在消耗一切,包括換行符。嘗試是這樣的:

:s/\v(.*)\n/echo "\1";/g 
+1

我不認爲在這裏使用全局標誌點;) –

3

這會做:

:s/.*/echo "&";/ 
+0

這不是簡單的方法來做替換(避免捕獲組)嗎?這是如何避免緩衝區中的所有文本事後匹配的? –

+0

是的,&至少是\ 0的好速記,至少我喜歡=) – krystah

+0

@IngoKarkat哦,我錯過了'noh'部分... – Kent

0

是的,你可以參考同一個點的當前行。例如,「.s/a/b /」僅在當前行中替換,或者「3,.s/a/b /」替換第3個和當前行之間的所有行。如果不在「s」前面放置一個行範圍,則只會自動假定當前行(「。」)。

但這不是你的問題。 Vim不會更改其他行,是嗎?因此,替代品僅限於當前產品線。問題是Vim在搜索一個模式之後,在整個文件中突出顯示了這個模式。除了搜索垃圾之外,你無法做到這一點,就像你自己提出的那樣。

0

我會用...

:s!.*!echo "&";! 

...這個工作,因爲它是很好的和短期,然後......

整個文件這樣強調,我有手動清除上次搜索或搜索某些垃圾來清除它。

我在my .vimrc只是這樣的場合下面的映射:

nnoremap <Leader>/ :<C-U>nohlsearch<CR> 

這讓我通過鍵入\/清除亮點。

請參見:

0

如果在源查找vim-surround會有東西在裏面我敢打賭。或者只需安裝該插件!