重複上一次 Ex 命令
在 Vim 中有 3 種命令列模式:
Ex 命令模式: :something
搜素 模式: /something
表示式 模式(在插入模式裡輸入 <C-r>= 進入): =1+1<cr>
假如我們透過以下命令在 Ex 命令模式裡執行規範檔案:
:!rspec spec/models/code_spec.rb
我們可以在普通模式裡輸入 @: 來重複上一次 Ex 命令。
對 CSS 的屬性進行排序
如果我們想對 CSS 選擇器裡面的屬性行按照字母順序排序,我們只需要在視覺化模式裡選擇這些屬性行並且輸入 :sort ,然後就可以看到排序後的結果。
h4 {
font-size: 11px;
margin: 15px;
background: red;
}
選擇複製並且貼上文字
我們可以透過使用 gv 來選擇上一次選擇複製的文字。並且,可以使用 gv 來選擇上一次貼上的文字,gb 是一個我們已經新增到 vimrc 檔案裡的自定義對映。當我們進行方法重構、剪下-複製然後進行縮排對齊時,這些命令尤為好用。有了gb 命令,我們可以很容易地選中剛貼上的文字,然後使用 < 或者 > 來修正縮排。
" select last paste in visual mode
nnoremap <expr> gb "`[" . strpart(getregtype(), 0, 1) . "`]"
在插入模式裡貼上文字
假設我們現在處於插入模式並且想在不離開插入模式的情況下貼上文字,我們可以使用 <C-r>0 命令。如果複製的文本里包括換行符,<C-r><C-p>0 命令可以幫我們處理縮排問題。
多行範圍內執行正常模式命令
假設我們忘了給以下的 Javascript 程式碼行的行尾新增 ;:
var element = $(this)
var tabName = element.data("tab")
var report = element.data("report")
要給每一行新增分號,我們可以在視覺化模式裡選中這3行程式碼,然後執行 :normal A;命令。Vim 會在選中的每一行中執行 A; 命令(新增;的命令)。我們也可以使用另外一種方式,我們可以對整個檔案的內容使用 :%normal A; 命令。
在多行上重複最後一次修改
在上面的程式碼片段中,如果我們只在第一行上面使用A; 命令向行尾新增;。我們可以選擇2到3行的程式碼並且執行 :"<,"> normal .命令,為選中的每一行執行點號命令(dotcommand)重複上一次修改命令。
在多個檔案中執行替換
在 Vim 中,對多個檔案執行替換操作並不是一個直觀的操作。要在多個檔案裡進行搜尋和替換,首先我們需要建立一個檔案列表,之後在這些檔案裡面執行命令。我們可以使用 :args 命令來建立檔案列表。例如,載入所有以“ext”開頭的 Javascript 檔案:
:args app/assets/javascripts/ext*.js
我們可以透過:args命令來檢視有哪些檔案被載入到引數列表中。當檔案都載入到引數列表中後,我們可以執行搜尋和替換命令:
:argdo %s/From/To/g
一旦修改應用到檔案後,我們可以透過以下命令來更新引數列表中的檔案:
:argdo update
在多個檔案中進行搜尋和替換
當我們知道要執行替換命令的檔案在那的情況下,之前的替換技巧會很有用。但是,在大多數情況下,我們想要的是,在一堆檔案裡搜尋文字並且僅在匹配的檔案裡執行替換命令。要實現這個替換操作,我們可以使用vimgrep 命令在檔案中搜索匹配的文字。vimgrep 命令會建立一個快速列表(quicklist)來展示包含與模式匹配的文字的檔案列表,我們可以使用 :copen 命令來開啟這個列表。如果我們想充分利用好快速列表(quicklist),我們可以使用 :Qargs 命令把快速列表轉換為引數列表, :Qargs 命令是我們在 vimrc 檔案裡設定的一個對映:
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
最後, 下面是一個在多個檔案中進行搜尋和替換的操作命令:
:vimgrep /CurrencyNumberHelper/ app/models/*.rb
:Qargs
:argdo %s/CurrencyNumberHelper/CurrencyHelper/g
:args `ack-grep -l CurrencyNumberHelper`
# or, if you"re using Ack plugin, then just :Ack CurrencyNumberHelper
:Ack CurrencyNumberHelper
:cfdo s/CurrencyNumberHelper/CurrencyHelper/g | update
編輯已經錄製的宏
在錄製宏的過程中經常會出現誤操作,當出現出現誤操作時,對已錄製的宏進行編輯比重新錄製更簡單方便。假設我們錄製了一個宏到暫存器a裡,我們可以使用 :put a 命令把宏的內容列印到當前的緩衝區裡,然後在 Vim 裡對這個宏進行編輯。一旦對宏的內容進行了修改,我們可以選擇修改後的宏並且使用 "ay 命令把它複製到暫存器a中。之後我們就可以使用 @a 命令執行暫存器 a 中的新宏。
在多個檔案裡執行宏
如果我們已經錄製了宏,並且想在某些檔案裡執行它。首先,我們需要使用這些檔案來建立一個引數列表。比如我們需要載入一個 Rails 應用的所有 model:
:args app/models/*.rb
然後我們使用以下命令老來執行宏(這個宏已經錄製儲存在暫存器 a1a 中):
:argdo normal @a1a
最後,我們使用下面命令來儲存所有緩衝區的修改:
命令列中的 Vi 模式
Bash shell 提供了兩種命令列編輯模式:emacs 和 vi 模式。emacs 編輯模式是命令列的預設模式,我們可以使用以下命令來把命令列的編輯模式改為 vi 模式:
set -o vi
然後我們就可以在命令列模式裡使用 ESC 鍵來進入 vi 的編輯模式,並且可以使用 vi 文字行編輯能力。當我們在命令列裡處於 vi 編輯模式時,我們可以使用 v 鍵彈出編輯器,我們在裡面編輯儲存的命令會直接在命令列裡執行。linux就該這麼學 這是一個很讚的功能, 你覺得呢?:)
如果我們需要返回 emacs 模式,列印一下命令即可:
set -o emacs
重複上一次 Ex 命令
在 Vim 中有 3 種命令列模式:
Ex 命令模式: :something
搜素 模式: /something
表示式 模式(在插入模式裡輸入 <C-r>= 進入): =1+1<cr>
假如我們透過以下命令在 Ex 命令模式裡執行規範檔案:
:!rspec spec/models/code_spec.rb
我們可以在普通模式裡輸入 @: 來重複上一次 Ex 命令。
2對 CSS 的屬性進行排序
如果我們想對 CSS 選擇器裡面的屬性行按照字母順序排序,我們只需要在視覺化模式裡選擇這些屬性行並且輸入 :sort ,然後就可以看到排序後的結果。
h4 {
font-size: 11px;
margin: 15px;
background: red;
}
選擇複製並且貼上文字
我們可以透過使用 gv 來選擇上一次選擇複製的文字。並且,可以使用 gv 來選擇上一次貼上的文字,gb 是一個我們已經新增到 vimrc 檔案裡的自定義對映。當我們進行方法重構、剪下-複製然後進行縮排對齊時,這些命令尤為好用。有了gb 命令,我們可以很容易地選中剛貼上的文字,然後使用 < 或者 > 來修正縮排。
" select last paste in visual mode
nnoremap <expr> gb "`[" . strpart(getregtype(), 0, 1) . "`]"
在插入模式裡貼上文字
假設我們現在處於插入模式並且想在不離開插入模式的情況下貼上文字,我們可以使用 <C-r>0 命令。如果複製的文本里包括換行符,<C-r><C-p>0 命令可以幫我們處理縮排問題。
多行範圍內執行正常模式命令
假設我們忘了給以下的 Javascript 程式碼行的行尾新增 ;:
var element = $(this)
var tabName = element.data("tab")
var report = element.data("report")
要給每一行新增分號,我們可以在視覺化模式裡選中這3行程式碼,然後執行 :normal A;命令。Vim 會在選中的每一行中執行 A; 命令(新增;的命令)。我們也可以使用另外一種方式,我們可以對整個檔案的內容使用 :%normal A; 命令。
在多行上重複最後一次修改
在上面的程式碼片段中,如果我們只在第一行上面使用A; 命令向行尾新增;。我們可以選擇2到3行的程式碼並且執行 :"<,"> normal .命令,為選中的每一行執行點號命令(dotcommand)重複上一次修改命令。
在多個檔案中執行替換
在 Vim 中,對多個檔案執行替換操作並不是一個直觀的操作。要在多個檔案裡進行搜尋和替換,首先我們需要建立一個檔案列表,之後在這些檔案裡面執行命令。我們可以使用 :args 命令來建立檔案列表。例如,載入所有以“ext”開頭的 Javascript 檔案:
:args app/assets/javascripts/ext*.js
我們可以透過:args命令來檢視有哪些檔案被載入到引數列表中。當檔案都載入到引數列表中後,我們可以執行搜尋和替換命令:
:argdo %s/From/To/g
一旦修改應用到檔案後,我們可以透過以下命令來更新引數列表中的檔案:
:argdo update
在多個檔案中進行搜尋和替換
當我們知道要執行替換命令的檔案在那的情況下,之前的替換技巧會很有用。但是,在大多數情況下,我們想要的是,在一堆檔案裡搜尋文字並且僅在匹配的檔案裡執行替換命令。要實現這個替換操作,我們可以使用vimgrep 命令在檔案中搜索匹配的文字。vimgrep 命令會建立一個快速列表(quicklist)來展示包含與模式匹配的文字的檔案列表,我們可以使用 :copen 命令來開啟這個列表。如果我們想充分利用好快速列表(quicklist),我們可以使用 :Qargs 命令把快速列表轉換為引數列表, :Qargs 命令是我們在 vimrc 檔案裡設定的一個對映:
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
最後, 下面是一個在多個檔案中進行搜尋和替換的操作命令:
:vimgrep /CurrencyNumberHelper/ app/models/*.rb
:Qargs
:argdo %s/CurrencyNumberHelper/CurrencyHelper/g
:argdo update
:args `ack-grep -l CurrencyNumberHelper`
# or, if you"re using Ack plugin, then just :Ack CurrencyNumberHelper
:argdo %s/CurrencyNumberHelper/CurrencyHelper/g
:argdo update
:Ack CurrencyNumberHelper
:cfdo s/CurrencyNumberHelper/CurrencyHelper/g | update
編輯已經錄製的宏
在錄製宏的過程中經常會出現誤操作,當出現出現誤操作時,對已錄製的宏進行編輯比重新錄製更簡單方便。假設我們錄製了一個宏到暫存器a裡,我們可以使用 :put a 命令把宏的內容列印到當前的緩衝區裡,然後在 Vim 裡對這個宏進行編輯。一旦對宏的內容進行了修改,我們可以選擇修改後的宏並且使用 "ay 命令把它複製到暫存器a中。之後我們就可以使用 @a 命令執行暫存器 a 中的新宏。
在多個檔案裡執行宏
如果我們已經錄製了宏,並且想在某些檔案裡執行它。首先,我們需要使用這些檔案來建立一個引數列表。比如我們需要載入一個 Rails 應用的所有 model:
:args app/models/*.rb
然後我們使用以下命令老來執行宏(這個宏已經錄製儲存在暫存器 a1a 中):
:argdo normal @a1a
最後,我們使用下面命令來儲存所有緩衝區的修改:
:argdo update
命令列中的 Vi 模式
Bash shell 提供了兩種命令列編輯模式:emacs 和 vi 模式。emacs 編輯模式是命令列的預設模式,我們可以使用以下命令來把命令列的編輯模式改為 vi 模式:
set -o vi
然後我們就可以在命令列模式裡使用 ESC 鍵來進入 vi 的編輯模式,並且可以使用 vi 文字行編輯能力。當我們在命令列裡處於 vi 編輯模式時,我們可以使用 v 鍵彈出編輯器,我們在裡面編輯儲存的命令會直接在命令列裡執行。linux就該這麼學 這是一個很讚的功能, 你覺得呢?:)
如果我們需要返回 emacs 模式,列印一下命令即可:
set -o emacs