一、vim簡介
Vim
是一款功能強大且高度可定制的文本編輯器,廣泛應用于Linux
和 Unix
系統中。
它不僅繼承了vi
編輯器的所有特性,還增加了許多新的功能,如語法高亮、代碼折疊、多級撤銷等。
Vim有三種主要的工作模式:
- 命令模式(
Command Mode
) - 插入模式(
Insert Mode
) - 底線命令模式(
Command-Line Mode
)
每種模式下可以執行不同的操作。
二、啟動與退出
-
啟動
啟動Vim可以通過在終端輸入vim或vim 文件名來實現。
如果文件不存在,Vim將創建一個新文件。 -
退出
退出Vim時,根據是否需要保存更改,可以選擇以下命令之一:- 正常退出
:q
:當文件沒有被修改時,可以直接使用此命令退出 Vim。如果文件已經被修改但未保存,則會提示錯誤信息,不允許直接退出。:x
或:wq
:這兩個命令是等價的,表示保存當前文件并退出。其中:w
表示寫入(保存),而:q
表示退出。ZZ
:這是另一種保存并退出的方式,相當于:wq
,但是不需要輸入冒號進入命令模式,而是直接按兩次大寫的Z
鍵即可。
- 不保存退出
::q!
:強制退出而不保存任何更改。這對于那些想要放棄所有未保存更改的情況非常有用。:ZQ:類似于
:q! `的效果,即不保存變更強行退出。注意,這不是標準的 Vim 命令,但在某些版本中可用。
- 強制操作
::w!
:當權限不足或其他原因導致無法正常保存時,可以嘗試使用:w!
來強制保存文件。::wq!
或:x!
:在遇到類似問題時,也可以通過這些命令來強制保存并退出19。::qa!
:當在一個多窗口環境中工作時,可以使用該命令關閉所有窗口并且不保存任何更改地退出 Vim。
- 其他特殊情況
::e!
:如果你打開了一個文件并進行了修改,但又想回到上一次保存的狀態繼續編輯,可以使用此命令重新加載未修改過的文件內容。::cq
或:cquit
:這將使 Vim 在退出時返回非零狀態碼,通常用于腳本編程中,以指示程序遇到了錯誤。
- 正常退出
三、模式切換
-
命令模式:這是啟動Vim后的默認模式,在這里可以輸入各種命令來導航、編輯文本。
-
插入模式:通過按i鍵進入此模式,在這里可以輸入文本內容。要返回命令模式,只需按下
Esc
鍵。 -
底線命令模式:在命令模式下按
:
進入,用于輸入更復雜的命令,如保存文件、退出等。
四、基本命令
4.1 光標移動
-
使用 方向鍵 或者
k
(上)、j
(下)、h
(左)、l
(右)來逐字符移動光標。 -
0
或Home
:移動到當前行的第一個非空白字符。 -
$
或End
:移動到當前行的最后一個字符。 -
gg
:移動到文件的第一行; -
G
:移動到最后一行; -
nG
:移動到第n行。 -
[Ctrl] + f
:向下翻頁;[Ctrl] + b
:向上翻頁。
4.1 編輯文本
-
插入文本:
i
、I
、a
、A
、o
、O
分別表示在不同位置開始插入文本。 -
刪除文本:
- 刪除單個字符
x
:刪除光標所在字符X
:刪除光標前一個字符
- 刪除單詞或部分行
dw
:刪除從光標位置到下一個單詞開頭之間的所有內容。注意:不一定是刪除整個單詞
db
:刪除從光標位置到上一個單詞開頭之間的所有內容。de
:刪除從光標位置到當前單詞結尾的所有內容。dE
:刪除從光標位置到當前大寫字母開頭單詞結尾的所有內容。d$
:刪除從光標位置到當前行末尾的所有內容。
- 刪除整行或多行
dd
:刪除當前行。ndd
:刪除從當前行開始的n行(例如,5dd
會刪除接下來的五行)。dG
:刪除從當前行到文件最后一行的所有內容。d1G
:刪除從當前行到文件第一行的所有內容。:start,end d
:刪除指定范圍內的行,其中start和end是起始和結束行號。例如,:3,7d將刪除第3至第7行
。
- 刪除所有內容
ggdG
:這是另一種快速刪除整個文件內容的方法,首先將光標移動到文件頂部(gg
),然后刪除直到文件末尾(dG
)。:%d
:在底行模式下輸入此命令也會刪除文件中的所有行。:%s/./ /g
或:%s/^.*$//g
:使用替換命令將每一行的內容替換成空字符串
- 刪除特定模式匹配的行
:g/pattern/d
:刪除所有包含pattern
的行。這里pattern
可以是一個正則表達式。:g!/pattern/d
:刪除所有不包含pattern
的行。
- 其他刪除操作
J
:合并當前行與下一行,即刪除兩行間的換行符。D
:刪除光標后到行尾的所有內容,等同于d$
。C
:刪除光標后的所有內容并進入插入模式,類似于c$
。
- 使用可視模式進行刪除
v
:進入字符級別可視化模式,選擇文本后按d
刪除。V
:進入行級別可視化模式,選擇多行后按d
刪除。Ctrl-v
:進入塊級別可視化模式,選擇矩形區域后按d
刪除。
- 特殊情況下的刪除
:g/^$/d
:刪除所有空行。:g/^#.*$/d
:刪除以#
開頭的所有行(通常為注釋行)。
- 刪除單個字符
-
復制粘貼:
yy
:復制一行;p
:粘貼到光標之后;P
:粘貼到光標之前。
4.1 搜索替換
-
尋找字符串
/pattern
:向光標之下尋找字符串pattern
;?pattern
:向光標之上查找。
-
重復搜索
n
:重復前一次搜索;N
:反向重復。
-
替換命令
- 格式為:
s/old/new/[g]
,其中g
表示全局替換整個文件中的所有匹配項。
- 格式為:
五、高級功能
- 分屏操作:
:split
:水平分割窗口;:vsplit
: 垂直分割Ctrl+w
:加 方向鍵 在多個窗口間切換。
- 宏錄制:
qa
:開始錄制宏至寄存器a- 再次按
q
:結束錄制 @a
:播放宏
- 配置文件:
.vimrc
位于用戶目錄下,用于自定義Vim
的行為設置及加載插件。
六、實用技巧
- 快速定位:
gg
:跳轉到文件開頭G
:跳轉到結尾:n
:跳轉到第n行
- 代碼折疊:
za
:折疊/展開當前塊zc
:折疊zo
:展開zR
:展開所有zM
:折疊所有
- 快速注釋代碼:
安裝NERD Commenter
插件后,- 使用
,+ci
注釋選中區域; ,+cu取消注釋
- 使用
七、配置與定制(自定義配置)
每個用戶都可以根據自己的需求創建或修改.vimrc
文件(位于用戶的主目錄下),以實現個性化的設置。
例如,可以通過添加以下命令來自定義行號顯示、啟用語法高亮、設置縮進等:
set nu
:顯示行號set cursorline
:突出顯示當前行syntax on
:開啟語法高亮set tabstop=4 shiftwidth=4 expandtab
:將Tab
鍵替換為四個空格
此外,還可以安裝各種插件來擴展Vim
的功能,如自動補全工具YouCompleteMe
、項目管理器NERDTree
等。
八、插件管理
隨著社區的發展,出現了許多優秀的Vim
插件,它們可以幫助開發者更高效地完成任務。
為了方便管理和加載這些插件,推薦使用Vundle
或者Plug
等插件管理器。
安裝后只需在.vimrc
中列出所需的插件列表,并運行相應的安裝命令即可快速安裝并啟用所需插件。
九、可視化模式(Visual Mode)
可視化模式是Vim的一個重要特性,它允許用戶通過鍵盤選擇文本,并對選定的文本塊進行各種操作,如復制、剪切、刪除、格式化等。
這一模式極大地提高了編輯效率,特別是對于需要頻繁處理文本塊的用戶來說。
-
可視化模式概述
-
在
Vim
中,可以通過如下命令進入可視化模式- 按下
v
鍵:進入字符可視化模式(Characterwise visual mode), - 按下
V
鍵:進入行可視化模式(Linewise visual mode), - 按住
Ctrl
鍵并按下v
鍵:進入塊可視化模式(Blockwise visual mode)。
- 按下
-
進入了可視化模式,屏幕底部會顯示相應的標識符以指示當前所處的模式:
--VISUAL--
表示字符可視化模式--VISUAL LINE--
表示行可視化模式--VISUAL BLOCK--
則表示塊可視化模式
-
-
字符可視化模式
字符可視化模式允許用戶逐個字符地選擇文本。
這對于選擇短語、單詞或句子非常有用。
用戶可以使用 方向鍵 或 Vim中的導航命令(如w、b、e等)來擴展選擇范圍。
一旦選擇了所需的文本,就可以應用各種編輯命令d
:用于刪除選中的文本y
:用于復制選中的文本到寄存器中c
:用于更改選中的文本
-
行可視化模式
行可視化模式是以行為單位選擇文本的方式。
當用戶想要移動、復制或刪除整個行時,這種模式特別有用。
進入行可視化模式后,用戶可以通過上下箭頭或其他導航命令來選擇多行文本。d
命令:刪除選中的行,y
命令:復制選中的行,>
和<
命令:來增加或減少選中行的縮進
-
塊可視化模式
塊可視化模式允許用戶選擇矩形區域內的文本。
這對于表格數據的操作非常有用,比如同時編輯多列內容。
在塊可視化模式下,用戶可以選擇一個矩形區域,然后執行諸如插入文本、刪除文本或改變大小寫等操作。
此外,還可以利用I命令在每行的相同位置插入文本,這對于批量編輯具有固定格式的數據非常方便。 -
其他有用的命令
除了基本的選擇和編輯命令外,可視化模式還支持更多高級操作。:
命令:可以在選中的文本范圍內執行Ex命令,如排序、搜索替換等;J
命令:可以將選中的行合并成一行;g?
命令:可以對選中的文本應用ROT13
編碼/解碼。gv
命令:如果用戶希望重新選擇上一次高亮的文本區域,可以使用gv
命令。
-
總之,
Vim的可視化模式為用戶提供了一種直觀且高效的方式來處理文本。
通過熟練掌握這些模式及其相關命令,用戶可以在不需要離開鍵盤的情況下完成復雜的文本編輯任務,從而提高工作效率。
十一、多文件處理
Vim支持同時打開多個文件,并可以在不同文件之間輕松切換。
使用:split
或 :vsplit
命令創建新的水平或垂直分割窗口來顯示其他文件。
此外,還可以利用標簽頁(Tab Pages
)管理多個文件,例如:tabnew filename
用于在新標簽中打開文件。
為了方便導航,可以通過:tabs
查看所有打開的標簽,或者使用gt/gT
向前/向后切換標簽。
在Linux環境下,Vim編輯器不僅支持對單個文件的編輯,還提供了強大的多文件處理功能。
通過使用緩沖區(buffer
)、窗口(window
)和標簽頁(tab
),用戶可以在同一個Vim會話中同時打開并編輯多個文件,極大地提高了工作效率。
以下是關于如何在Vim中進行多文件處理的具體介紹。
-
啟動時打開多個文件
當您想要一次性打開多個文件時,可以直接在命令行中啟動Vim,并將所有要編輯的文件名作為參數傳遞給它。例如:
- Vim啟動并將這些文件加載到不同的緩沖區中,但默認情況下只會顯示第一個文件的內容。
vim file1 file2 file3
- 如果您希望以分屏的方式同時查看多個文件,則可以使用-o或-O選項來分別實現水平或垂直分割窗口的效果:
vim -o file1 file2
# 水平分屏
vim -O file1 file2
# 垂直分屏 - 此外,還可以直接在命令行上使用
vimdiff
命令來比較兩個文件之間的差異,這對于代碼審查或文檔對比非常有用。
- Vim啟動并將這些文件加載到不同的緩沖區中,但默認情況下只會顯示第一個文件的內容。
-
在已啟動的Vim中打開新文件
如果已經在Vim內部工作并且需要打開新的文件,可以通過以下幾種方式之一完成::e filename
命令:替換當前緩沖區中的內容為指定的新文件。:sp filename
或:vsp filename
命令:創建一個新的水平或垂直分割窗口,并在其中加載指定的文件。:tabedit filename
命令:在一個新的標簽頁中打開文件。
-
文件間的切換與管理
一旦有多個文件被加載到了Vim中,可以利用一系列命令來進行快速切換和管理::ls
:列出所有已經加載到內存中的緩沖區及其狀態。:b<number>
或:buffer <number>
:根據編號選擇特定的緩沖區進行編輯。Ctrl+^
或:e#
:在最近訪問過的兩個文件之間切換。:bn
或:bp
:向前或向后切換到下一個/前一個文件。Ctrl+w w
:循環切換各個窗口。gt
:切換到下一個標簽頁;gT
: 則用于返回至上一個標簽頁。
-
緩沖區、窗口與標簽頁的關系
理解緩沖區、窗口以及標簽頁之間的關系對于有效利用Vim的多文件處理能力至關重要。簡單來說:- 緩沖區是指Vim為每個打開的文件分配的一塊內存空間,即使該文件沒有顯示在任何窗口中也存在相應的緩沖區。
- 窗口是屏幕上用來展示某個特定緩沖區內容的一個區域,同一時間可以有多個窗口顯示不同或者相同的緩沖區。
- 標簽頁則是包含一組窗口的集合,允許用戶在同一Vim實例內組織多個獨立的工作環境。
十二、集成開發環境(IDE)特性
雖然Vim本身不是IDE,但它可以通過各種方式模擬IDE的行為。例如,結合ctags生成索引文件,以便快速查找函數定義;
或者使用cscope進行更復雜的源碼分析。
另外,還有專門為特定編程語言設計的插件,如Python-mode、YouCompleteMe 等,它們為開發者提供了諸如智能感知、調試支持等功能。
十三、自定義與自動化
每個用戶的編輯習慣都不盡相同,因此Vim允許高度個性化配置。
除了前面提到的.vimrc文件外,還可以設置快捷鍵映射、顏色主題、狀態欄信息等內容。更重要的是,Vim腳本語言使得編寫復雜任務變得可能,比如批量重命名變量、格式化代碼等。對于經常重復的任務,可以編寫宏錄制下來,以便日后一鍵完成。
十四、搜索歷史與命令行補全
14.1 搜索歷史
Linux的Vim編輯器中,搜索歷史命令是一個非常有用的功能,它允許用戶回顧并重新使用以前執行過的搜索模式。
Vim提供了多種方式來訪問和管理這些歷史記錄。
以下是關于如何查看、管理和使用Vim中的所有類型搜索歷史命令的詳細說明。
-
查看所有類型的搜索歷史
:history all
: 在命令行模式下輸入此命令會列出所有的歷史條目,包括命令行歷史、搜索歷史等。:history
+ 類型: 在命令行模式下輸入此命令只查看特定類型的歷史記錄:history c
: 只查看命令行歷史記錄:history s
: 只查看搜索歷史記錄
-
瀏覽和重復使用搜索歷史
- 當您想要瀏覽之前執行過的搜索時,可以在普通模式下按
q/
(向前搜索)或q?
(向后搜索)來打開一個包含所有搜索歷史的小窗口。
選擇一項歷史記錄后按下回車鍵即可再次執行該搜索。 - 此外,在命令行模式中,您可以直接輸入
/
或?
,然后通過上下箭頭鍵來瀏覽搜索歷史記錄,并可以選擇其中一個來執行。 - 如果您只是想快速地重復上一次的搜索,可以在普通模式下輸入
n
(查找下一個匹配項)或N
(反向查找下一個匹配項)。
如果需要從命令行模式開始一個新的搜索但又不想丟失當前光標位置,可以先輸入/
或?
再按回車鍵,然后使用上下箭頭鍵選擇之前的搜索模式。
- 當您想要瀏覽之前執行過的搜索時,可以在普通模式下按
-
使用快捷鍵訪問歷史
對于更高效的搜索歷史訪問,可以利用一些快捷鍵組合。-
例如,在命令行模式下,您可以按
Ctrl-P
(向上導航)或Ctrl-N
(向下導航)來滾動瀏覽歷史命令列表。
這種方法特別適合于那些經常重復相同或相似命令的場景。 -
另外,如果您正在尋找特定的命令或搜索模式,可以在命令行模式下輸入部分字符串,然后按
Ctrl-R
以啟動增量式搜索,這將幫助您更快地定位到所需的命令或搜索模式。
-
-
配置歷史選項
- 為了更好地控制歷史記錄的行為,可以通過設置history選項來調整保存的歷史條目數量。
默認情況下,Vim會記住最近50
個命令和搜索歷史條目。
如果您希望增加這個數目,可以在.vimrc
文件中添加如下配置:
set history=1000 " 保持1000個命令和搜索的歷史記錄
- 此外,還可以通過修改
viminfo
文件中的相應參數來持久化歷史記錄,即使關閉了Vim之后也能保留下來。 - 請注意,更改
.viminfo
文件的內容可能會影響其他與歷史相關的功能,因此建議謹慎操作。
- 為了更好地控制歷史記錄的行為,可以通過設置history選項來調整保存的歷史條目數量。
14.2 命令行補全
Vim提供了多種命令行補全的功能,可以極大地提高用戶的編輯效率。
Vim的命令行補全不僅限于簡單的文件名或路徑補全,還包括關鍵字、字典、標簽等多種類型的補全。
以下是關于Vim命令行補全的一些詳細介紹:
-
基本命令行補全
在Vim的命令行模式下(即輸入:
后),用戶可以通過按下Tab
鍵來實現基本的命令補全。
這種補全方式適用于命令、文件名和目錄名等。
如果當前輸入的部分有多個可能的匹配項,連續按兩次Tab
鍵將會列出所有可能的匹配項。
然而,默認情況下,這種方式不會顯示所有匹配的命令或文件名。
為了改進這一點,可以在$HOME/.vimrc
配置文件中添加一行設定:
set wildmode=list:longest
這將使得當用戶輸入部分命令或文件名并按下Tab
鍵時,Vim會嘗試列出所有可能的匹配項,并展示最長的公共前綴。 -
更高級的命令行補全
除了基本的補全外,Vim還支持更復雜的命令行補全,比如整行補全、根據當前文件中的關鍵字補全、字典補全、同義詞字典補全等。
這些補全可以通過特定的快捷鍵組合觸發,例如:- 整行補全:
Ctrl-X Ctrl-L
用于查找并補全與當前行相似的其他行。 - 關鍵字補全:
Ctrl-X Ctrl-N
用于從當前文件中查找匹配的關鍵字;而Ctrl-X Ctrl-P則是向前查找關鍵字。 - 字典補全:
Ctrl-X Ctrl-K
允許用戶定義一個字典文件,從中查找匹配的單詞。 - 同義詞字典補全:
Ctrl-X Ctrl-T
用于基于用戶提供的同義詞庫進行補全。 - 文件名補全:
Ctrl-X Ctrl-F
用于補全文件路徑和文件名。
- 整行補全:
-
自定義補全設置
- 為了更好地適應個人的工作流程,用戶還可以自定義Vim的補全行為。
例如,通過修改
.vimrc
文件中的選項,如complete
、dictionary
、thesaurus
等,以指定不同的補全來源。 - 此外,還可以利用插件如
YouCompleteMe
來增強代碼補全的能力,特別是對于編程語言的支持。
- 為了更好地適應個人的工作流程,用戶還可以自定義Vim的補全行為。
-
配合Zsh使用
- 值得注意的是,在某些情況下,Vim的命令行補全可能會與
shell
環境下的命令補全混淆。
例如,在Zsh
環境下,用戶可以通過安裝zsh-autosuggestions
插件來獲得更加智能的命令建議,包括對Vim命令的支持。
這意味著即使是在終端外部,用戶也能享受到類似于Vim內部的高效命令補全體驗。
- 值得注意的是,在某些情況下,Vim的命令行補全可能會與
-
綜上所述
- Vim提供了豐富的命令行補全機制,無論是簡單的文件名補全還是復雜的代碼片段補全,都能滿足不同場景下的需求。
通過適當的配置和工具集成,用戶可以顯著提升在Vim中的工作流效率。
- Vim提供了豐富的命令行補全機制,無論是簡單的文件名補全還是復雜的代碼片段補全,都能滿足不同場景下的需求。
14.3 與Shell交互
有時需要在不離開Vim的情況下運行外部命令。
- 這時可以使用
!command
的形式直接調用shell命令,結果將被顯示在屏幕上。
如果想要把輸出插入到當前緩沖區,則可以在命令前加上r
,如:r !ls
會將當前目錄下的文件列表插入光標位置。 - 另一個有用的特性是能夠在后臺啟動進程而不阻塞Vim界面,這對于長時間運行的任務特別有用。
Vim編輯器與Shell之間的交互是Linux系統管理員和開發者日常工作中非常重要的技能之一。
這種交互可以通過多種方式實現,不僅提高了工作效率,還能簡化復雜的任務處理流程。
下面我們將深入探討幾種常見的Vim與Shell交互的方式。
-
在Vim中執行Shell命令
-
在Vim中可以直接執行Shell命令而無需退出編輯器。
這可以通過使用!字符來完成,它允許你在不離開Vim的情況下運行外部命令。例如,如果你想檢查當前的時間或日期,可以在命令模式下輸入如下命令:
:!date
執行后,屏幕上會顯示當前的日期和時間;按回車鍵即可返回到原來的編輯位置繼續工作。 -
此外,你還可以創建一個臨時的shell會話,在其中連續運行多個Unix命令,而不必每次都回到Vim編輯狀態。
要創建這樣的shell
會話,可以使用:sh
或者:shell
命令。
當你完成所有需要的操作并準備返回Vim時,只需按下Ctrl-D
或 輸入exit
命令即可。
-
-
將Shell命令輸出插入到文件中
-
有時候我們可能希望將某個命令的結果直接插入到正在編輯的文件里。
為此,Vim提供了:r !command
語法,用于讀取命令的標準輸出并將結果追加到當前行之后。比如,要獲取目錄列表并將其添加到文檔末尾,可以這樣做:
:r !ls -l
-
同樣地,如果想要對特定范圍內的行應用某些過濾器(如排序),你可以指定行號范圍加上!符號后跟上相應的命令。
例如,要對第96至99行的內容進行排序,可以使用以下命令:
:96,99!sort
-
-
** 使用Ctrl-Z掛起Vim進程**
- 另一種方便的方法是在編輯過程中暫時將Vim放到后臺,以便能夠快速切換到shell環境中執行其他任務。
要做到這一點,只需要在普通模式下按Ctrl-Z
組合鍵即可。
之后就可以自由地在shell
提示符下操作了。
當再次需要恢復Vim會話時,只要簡單地輸入fg
命令就能讓Vim重新回到前臺
- 另一種方便的方法是在編輯過程中暫時將Vim放到后臺,以便能夠快速切換到shell環境中執行其他任務。
-
Shell腳本變量的編輯
-
對于編寫Shell腳本來說,利用Vim的強大功能來進行文本編輯是非常有幫助的。
由于Shell腳本本質上就是一系列命令組成的文本文件,因此我們可以像對待普通文本那樣對其進行修改。例如,當我們需要批量替換某個變量名時,可以使用Vim內置的搜索替換功能,即
:%s/old_variable/new_variable/g
命令。
這將在整個文件范圍內查找并替換所有的匹配項。 -
另外,如果你經常需要處理類似的變更,還可以考慮為Vim配置一些自定義映射或宏,以加速重復性工作的完成。
例如,設置一個快捷鍵專門用來插入常用的環境變量聲明等。
-
綜上所述,通過上述幾種方法,我們可以看到Vim不僅僅是一個簡單的文本編輯工具,更是一個強大的集成開發環境,尤其是在結合Shell編程時展現出了極大的靈活性和實用性。
十六、文檔幫助
最后但同樣重要的是,Vim內置了一個詳盡的幫助系統。
只需輸入:help topic
就能獲取關于幾乎任何主題的幫助文檔。
這個內嵌的幫助不僅涵蓋了基本命令,還包括了對插件的支持說明和其他高級話題。
十七、總結
綜上所述,Vim不僅僅是一個簡單的文本編輯器,它更像是一個可以根據個人需求靈活調整的工作平臺。
隨著經驗的增長,你會發現越來越多的方法來優化你的工作流程,無論是通過學習新的快捷鍵組合還是探索社區提供的豐富資源。