運維乾貨 | 12 個實用的 Vim 使用技巧

Linux雲端計算資料自學發表於2018-11-23

640?


1

重複上一條 Ex 命令


在 Vim 中有 3 種命令列模式提示:

· Ex 命令提示符::something

· 查詢提示符 Search prompt:/something

· 表示式提示符 Expression prompt:(在插入模式下輸入 <C-r>= ): =1+1<cr>

假如我們從 Ex 命令提示符中執行一個 spec:

1
:!rspec spec/models/code_spec.rb

我們可以通過在普通模式下輸入 @: 來重複上一條 Ex 命令。


2

在 CSS 中對屬性進行排序


如果我們需要按照字母表順序對 CSS 選擇器中的行進行排序,只需在可視模式下選擇選中的行並輸入 :sort,然後就可以對它們進行排序。

1
2
h4 {  font-size: 11px;  margin: 15px;  background: red;
}


3

選擇複製和貼上的文字


我們可以使用 gv 來選擇原始的需要複製的文字,使用 gb 選擇上一次貼上的文字。gb 是一個自定義的對映,可將其新增到 vimrc 檔案,而且該命令在進行提取方法重構、剪下時十分有用。我們還需要修復縮排,使用 gb 可以輕易選擇貼上的文字,然後使用 < 或 > 來進行修復。

1
" select last paste in visual modennoremap <expr> gb '`[' . strpart(getregtype(), 0, 1) . '`]'


4

在插入模式下貼上文字


假如處於插入模式中,並希望在不退出插入模式的情況下貼上已複製的文字。可通過使用 <C-r>0 實現這個需求。如果複製的文字包含新的行字元,<C-r><C-p>0 會處理縮排的問題。


5

在插入模式下刪除


如果需要在插入模式、Vim 命令列模式或 Shell 命令列中刪除字元、單詞或行,有以下的快捷方式:

1
<C-h> " delete back one character (backspace)<C-w> " delete back one word<C-u> " delete back to start of line<C-k> " delete forward to end of line


6

在某個範圍內執行普通模式命令


下面的 JavaScript 程式碼全都忘記加上 ; 分號了:

1
var element = $(this)var tabName = element.data('tab')var report = element.data('report')

我們可以選擇全部三行程式碼,然後執行命令 :normal A;,它將為每行執行 A; (追加 ;)的命令。或者,我們可以在檔案的整個內容上使用 :%normal A; 以達到相同的效果。


7

在多行程式碼中重複上一次更改


如果我們在上述程式碼段的第一行進行了一次修改,使用 A; 在行的結尾處插入 ;,如果需要再為 2-3 行新增 ;,應該怎樣操作?可以通過選擇第 2-3 行,並通過在視覺化模式下使用 dot (“.”) 命令  :'<,'> normal . 來重複該命令。



8

在多個檔案中進行替換操作


Vim 中,在多個檔案裡面不能直接進行替換操作。要在多個檔案中進行查詢和替換,首先需要建立一個檔案列表,我們將在其中執行一條命令。通過使用 :args 命令來實現這個需求。例如,載入所有以"ext"字串開頭的 JavaScript 檔案:

1
:args app/assets/javascripts/ext*.js

這樣可以看到通過執行 :args 命令得到的引數列表載入的檔案。準備好引數列表後,可以執行查詢和替換操作:

1
:argdo %s/From/To/g

一旦在檔案中進行了更改,我們可以使用以下命令儲存引數列表中所有的檔案:

1
:argdo update


9

在多個檔案中進行查詢和替換


如果我們知道被操作的檔案需要在哪裡執行替換命令,那麼上一個技巧可以正常工作。但是大多數時候,我們需要搜尋檔案中的文字,然後只在這些檔案中執行替換命令。此時,我們可以通過使用 vimgrep 命令在檔案查詢匹配。vimgrep 命令可建立快速列表,其中包含與模式匹配的檔案,該列表可通過 :copen 命令來開啟檢視。如果我們希望快速列表有用,需要使用 vimrc 檔案中的 :Qargs 對映來將其轉換為引數列表:

1
2
3
4
5
6
7
8
command! -nargs=0 -bar Qargs execute 'args' QuickfixFilenames()" populate the argument list with each of the files named in the quickfix list
function! QuickfixFilenames()
  let buffer_numbers = {}
  for quickfix_item in getqflist()
    let buffer_numbers[quickfix_item['bufnr']] = bufname(quickfix_item['bufnr'])
  endfor
  return join(map(values(buffer_numbers), 'fnameescape(v:val)'))
endfunction

最後,這裡有一個需要在檔案執行查詢和替換的例子:

1
:vimgrep /CurrencyNumberHelper/ app/models/*.rb:Qargs:argdo %s/CurrencyNumberHelper/CurrencyHelper/g:argdo update

在評論中,buztard 提到一個更簡單的方法是使用 ack-grep 來建立引數:

1
:args `ack-grep -l CurrencyNumberHelper`# or, if you're using Ack plugin, then just :Ack CurrencyNumberHelper:argdo %s/CurrencyNumberHelper/CurrencyHelper/g:argdo update

Thiago A. 也在評論中提到,如果你使用較新的 Vim 版本,這將會更簡單,可簡單地使用 cdo 和 cfdo 來完成這個需求:

1
:Ack CurrencyNumberHelper:cfdo s/CurrencyNumberHelper/CurrencyHelper/g | update


10

編輯已錄製的巨集


在錄製巨集的時候,很容易犯錯誤。當發生這種情況時,編輯已經錄製好的巨集比重新錄製更容易。

假設我們已經在暫存器 a 中錄製了新的巨集。可以使用 :put a 在當前的緩衝區中列印巨集的內容,並在 Vim 中對巨集進行編輯。一旦巨集被修改,我們可以選擇它然後使用 "ay 將它複製到暫存器。這樣,我們就可以使用 @a 從暫存器中執行新的巨集。


11

在多個檔案中執行巨集


我們已經錄製好了一個巨集,並且希望在多個檔案中執行它。首先我們需要使用檔案構建一個引數列表,例如,從一個 Rails 應用中載入所有模型:

1
:args app/models/*.rb

然後使用下面的命令執行巨集(記錄在暫存器 a 中):

1
:argdo normal @a

最後,使用下面的命令儲存所有的緩衝:

1
:argdo update


12

命令列中的 Vi 模式


Bash shell 提供了兩種模式用於命令列編輯:emacs 和 vi。預設情況下是 Emacs 編輯模式,可以使用以下方式將其更改為 vi 模式:

1
set -o vi

在命令列中,可以按下 ESC 鍵進入 vi 編輯模式,並使用 vi 的單行編輯功能。在命令列中的 vi 編輯模式下,可以通過按下 v 彈出編輯器,這樣就可以編輯和儲存將在命令列中執行的緩衝。

如果需要回到 emacs 模式,輸入:

1
set -o emacs

這裡有一份在 bash shell 的 vi 模式下可以執行哪些 Vi 命令的速查表 —— http://www.catonmat.net/download/bash-vi-editing-mode-cheat-sheet.txt。

來自:https://dalibornasevic.com/


11月雲端計算免費課程火爆來襲,免費深入瞭解雲端計算技術,揭祕運維行業發展,與技術大牛面對面交流,幫你尋找屬於你的努力方向~~

11月雲端計算免費訓練營

時間

11月23日 - 11月29日 (為期5天,24/25日休息,11月30日正式開班)

課程內容

  • 什麼是Linux、雲端計算、虛擬化;

  • KVM虛擬化實戰;

  • Linux作業系統由來;

  • 企業級Linux伺服器安裝方案;

  • 破解Linux系統密碼;

  • Linux命令列格式;

  • Linux下目錄和檔案管理;

  • FTP伺服器演示;

  • Web伺服器演示;

  • DNS伺服器演示;

  • 初識網路工程;

  • Linux雲端計算行業發展前景等等。

地點達內全國各中心校區,就近選擇。

講師:行業大咖,技術大牛面授課程。

免費報名方式長按下方二維碼即可免費申請

640?wx_fmt=png

*本次免費訓練營異常火爆,座位有限,各位童鞋抓緊時間,先報先得。

PS:記得查收小編送你的免費大禮包呦~

福利 | 一萬多套PPT模板等你免費來拿!無條件領取!

免費送 | 1000多套簡歷模板免費拿,附贈簡歷製作教程!

免費領 | 《Shell指令碼 100例》電子書免費拿,運維必備乾貨~

640?640

▼▼點選【閱讀原文】,5天運維免費課程,開講在即!

相關文章