摘要:本文將以此為起點(diǎn),介紹一些替換小技巧。實(shí)話實(shí)說,使用命令來替換有違于大多數(shù)程序員的習(xí)慣。接下更進(jìn)一步,教多幾個(gè)小技巧。這么一來,替換將僅在當(dāng)前大括號(hào)內(nèi)生效。在替換局部變量時(shí),比起全局替換,這樣的替換方式無疑會(huì)更高效。
想必用過Vim的人都知道,在Vim里面,以下命令可以替換當(dāng)前文件的內(nèi)容:
:[range]s/{要被替換的模式}/{替換的內(nèi)容}/[flags]
其中range指定替換命令生效的范圍。flags指定替換的一些選項(xiàng),常用的有:
c 替換前進(jìn)行確認(rèn)
g 如果缺乏該選項(xiàng),只會(huì)替換第一個(gè)。一般我們所說的替換是全部替換,即加了g選項(xiàng)的替換。
i 忽略大小寫
e 忽略錯(cuò)誤
具體細(xì)節(jié)請:vert help substitude查看。
本文將以此為起點(diǎn),介紹一些替換小技巧。寫這篇文章,主要是分享個(gè)人的一些腦洞心得,順便向接觸過Vim的人安利下Vim的一些哲學(xué)。
實(shí)話實(shí)說,使用命令來替換有違于(大多數(shù))程序員的習(xí)慣。一般提起“替換”,第一感覺都是按下某個(gè)快捷鍵,然后在某個(gè)窗口中輸入“查找內(nèi)容”,再輸入“替換內(nèi)容”,按確定??壳妹顏硖鎿Q,總會(huì)讓人想起sed這樣的老東西,想起它那咒文一樣的指令(如果還想得起來的話)。
還好,Vim的映射機(jī)制讓想起這一切不再困難。你僅需映射一份模板:
" 把下面映射添加到vimrc中 " 設(shè)置替換命令的模板 nnoremaps :%s///gc " :vert help c_ " Ctrl-r " 插入最近一次復(fù)制/刪除的文本 nnoremap sl :%s/ "/ "/gc " Ctrl-r Ctrl-w 插入當(dāng)前光標(biāo)下的詞。 nnoremap sc :%s/< >/ /gc
這樣就不用記住完整的替換命令了,僅需填兩個(gè)空。是不是又回到了熟悉的“查找內(nèi)容”/“替換內(nèi)容”模式呢?
Vim哲學(xué)第N條:用映射消除重復(fù)的勞動(dòng)。
一般在文本編輯的過程中,常常會(huì)有重復(fù)某幾個(gè)步驟的情況。一個(gè)合格的Vimer應(yīng)該學(xué)會(huì)用映射或其他機(jī)制來減少無益的操作。所謂時(shí)間就是生命,珍愛生命,從靈活使用映射開始。
" :vert help map 查看如何在Vim中使用映射 " :vert help recording 查看如何在Vim中使用錄制
看了剛才的內(nèi)容,應(yīng)該不會(huì)對Vim里面的替換操作感到陌生了。接下更進(jìn)一步,教多幾個(gè)小技巧。
回顧替換命令:
:[range]s/{要被替換的模式}/{替換的內(nèi)容}/[flags]
最前面的range也是有些門道的。range是Vim中的一個(gè)概念,表示文本的某個(gè)范圍。常用的range有兩種:一種是m,n,表示從第m行到第n行,其中.表示當(dāng)前行,而$表示最未行;另一種是%,表示整個(gè)文件,等價(jià)于1,$。更多的形式請查看:vert help range。
憑借這一點(diǎn),我們可以實(shí)現(xiàn)指定替換的范圍,減輕確認(rèn)時(shí)的工作量。下面介紹個(gè)例子:
vnoremaps :s///gc
這個(gè)跟前面的normal模式下的設(shè)置模板的映射很像,不過有兩點(diǎn)不同。一點(diǎn)是,這是作用在visual模式下的映射;另一點(diǎn)是,這個(gè)模板里沒有指定范圍。在visual模式下使用命令,默認(rèn)范圍是當(dāng)前選中的范圍。(參見:vert help v_:)
于是乎,我們可以這樣使用:
敲vi{選中當(dāng)前大括號(hào)(代碼塊)里面的內(nèi)容。
敲
這么一來,替換將僅在當(dāng)前大括號(hào)內(nèi)生效。在替換局部變量時(shí),比起全局替換,這樣的替換方式無疑會(huì)更高效。
什么?你說你用Python?嗯,你可以考慮下借助第三方插件來選中代碼塊:
https://github.com/michaeljsmith/vim-indent-object
https://github.com/nelstrom/vim-textobj-rubyblock
https://github.com/kana/vim-textobj-user
Vim哲學(xué)第N+1條:用好組合技
很多情況下,替換操作涉及多個(gè)文件。由于缺乏項(xiàng)目管理的功能,編輯器在這方面自然比不上IDE。不過Vim還是支持對多個(gè)文件執(zhí)行替換操作,雖說有點(diǎn)兒粗糙。Vim提供了名為argdo的機(jī)制,可以在多個(gè)文件上執(zhí)行同樣的命令。
" 在dataType.cpp和dataType.h中替換filename為fn :args dataType.cpp dataType.h " :vert help argdo :argdo %s/filename/fn/gce | update
args命令接收文件列表,而argdo命令接收要執(zhí)行命令,update則寫入更新了的文件內(nèi)容。(注意這里的|是用來連接%s/filename/fn/gc和update成單一的參數(shù),不是管道符)
關(guān)于args的更多內(nèi)容,參見這篇文章:http://vimcasts.org/episodes/populating-the-arglist/
我們可以更進(jìn)一步,實(shí)現(xiàn)全項(xiàng)目內(nèi)的替換。假設(shè)你的項(xiàng)目用git作版本管理,那么通過git ls-files可以獲取全部文件名。然后用grep -l pattern $(git ls-files)可以篩選出含有pattern的文件。接下來就是把這份文件列表傳遞給args:
" 查找整個(gè)項(xiàng)目中含有filename的文件,并作為參數(shù)傳遞給args :args `grep -l filename $(git ls-files)` :argdo %s/filename/fn/gce | update
就是這樣。
Vim哲學(xué)第N+2條:善用外部命令來拓展Vim的能力
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24853.html
摘要:之所以能卓爾不群靠地就是一種自成一派且精悍有效的編輯器哲學(xué)當(dāng)然也是,就好像網(wǎng)游千千萬卻唯有一覽眾山小,那靠地不是技巧與外在,而是與眾不同的世界觀。征服其實(shí)是一種領(lǐng)悟,我融入了的哲學(xué)而已。這也是好東西,它比上一個(gè)更貼近的哲學(xué)。 就在幾個(gè)小時(shí)以前,我回答了一個(gè)關(guān)于推薦開發(fā)工具的問題,很多朋友表示喜歡和鼓勵(lì),非常感謝!我也很想多寫一些細(xì)節(jié),于是便起意開一個(gè)系列來聊聊我多次提到的 Vim。 ...
摘要:為什么要有模式呢以上其實(shí)已經(jīng)講述了一些原因,但真正的價(jià)值還在于接下來要講到的哲學(xué)。鼠標(biāo)與快捷鍵的操作治標(biāo)不治本,它們沒能從根本上解決這個(gè)問題。 學(xué)會(huì)用不同的角度去看待和理解這個(gè)世界,你收獲的永遠(yuǎn)會(huì)比你想象的更多。 上回我分享了如何掌握基礎(chǔ)移動(dòng)的心得體會(huì),而對于很重要的模式卻只是一帶而過,這其實(shí)是有原因的。過去我有過幾次教新手 Vim 的經(jīng)歷,按照慣常的方式先告訴他們模式切換,...
摘要:的哲學(xué)第四篇姍姍來遲,狗血的原因我就不多說了,好消息是我將為這個(gè)系列帶來一些動(dòng)態(tài)演示。所以目前為止你學(xué)會(huì)上述四個(gè)動(dòng)作指令就足夠了。以詞為單位使得我們可以更精確也是更具語義化的移動(dòng)光標(biāo),并且要比逐個(gè)字符的移動(dòng)要快得多。 Vim 的哲學(xué)第四篇姍姍來遲,狗血的原因我就不多說了,好消息是我將為這個(gè)系列帶來一些動(dòng)態(tài)演示。原本我打算錄視頻的,但是文章都寫了那么些篇了,現(xiàn)在再錄視頻似乎晚了些,所以我...
摘要:相反,不顯示行號(hào)設(shè)置為粘貼模式,解決粘貼時(shí)縮進(jìn)錯(cuò)亂問題。會(huì)自動(dòng)加入創(chuàng)建從當(dāng)前行起至以下行的折疊標(biāo)記,進(jìn)行折疊。中的標(biāo)記都有一個(gè)名字,這個(gè)名字用單一的字符表示。 學(xué)習(xí)vim并且其會(huì)成為你最后一個(gè)使用的文本編輯器 學(xué)習(xí)建議: 丟棄鼠標(biāo)和小鍵盤 具有搭配使用各種按鍵的意識(shí) 首先來一張 mindmap : showImg(http://sean-images.qiniudn.com/V...
閱讀 3841·2023-04-25 17:45
閱讀 3490·2021-09-04 16:40
閱讀 1041·2019-08-30 13:54
閱讀 2180·2019-08-29 12:59
閱讀 1451·2019-08-26 12:11
閱讀 3331·2019-08-23 15:17
閱讀 1556·2019-08-23 12:07
閱讀 3932·2019-08-22 18:00