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