在介紹vi/vim的相關命令前,先來了解下什麼是vi/vim?爲何學習vi/vim?html
什麼是vi/vim?linux
- vi 是Visual Interface的縮寫,即 可視化接口
vim
是vi iMprove的縮寫,即vi的加強版
(具備語法着色功能),Vim是從 vi 發展出來的一個文本編輯器。爲何學習vi/vim?git
- 全部的Unix系統上都會默認內置vi/vim編輯器,而不必定帶有其餘文本編輯器,很是通用;
- 不少軟件的編輯接口都會默認調用vi/vim;
- vi/vim具備程序編輯的能力;
- vi/vim程序簡單,編輯速度至關快速
vi和vim有什麼區別?github
- 多級撤銷:在vi編輯器中,按u只能撤消上次命令,而在vim裏能夠無限制的撤消
- vi編輯器只能運行於unix中,而vim不只能夠運行於unix,還可用於windows、mac等多操做平臺
- vim能夠用不一樣的顏色來加亮你的代碼
- 能夠把vim當成vi來使用
因爲vi與vim在命令上幾乎相同,因此這裏以vim爲例,目前咱們使用較多的也是vim編輯器。shell
進入vim模式:在終端裏打 vim 回車。vim
vim一共有4個模式。經常使用是normal
和 insert
模式, 大部分時候都在兩個模式下來回切換
。windows
模式 | 英文名 | 描述 | 切換操做 |
---|---|---|---|
正常模式 | normal-mode | 用於查看文本,也可複製、粘貼、撤銷、重作等 | - 默認進入的是正常模式 - 不論位於什麼模式,按下 <Esc>鍵 (有時須要按兩下)都會進入正常模式 |
插入模式 | insert-mode | 也即編輯模式,用於編輯文本 | - 正常模式下,按下i, a, o, I,A,O 鍵,進入插入模式 |
命令模式 | normal-mode | 用於輸入指令 如:保存、運行、切換標籤、切割屏幕等 |
- 正常模式下,按下:(英文冒號)鍵 ,進入命令模式 |
可視模式 | visual-mode | 至關於高亮選取文本後的正常模式 可視模式中的操做有些像拿鼠標進行操做 |
- 在正常模式下,按下v,V,<ctrl>+v ,能夠進入可視模式 |
指令 | 描述 |
---|---|
:q | 直接退出(無更改) |
:wq | 保存退出 |
:q! | 放棄修改,強行退出 |
正常
模式下啓動vim後默認位於正常模式。不論位於什麼模式,通常狀況,按下<Esc>鍵(有時須要按兩下)都會進入normal(正常)模式。bash
正常模式通常用於瀏覽文件,也包括一些複製、粘貼、刪除等操做。app
在VIM的Normal模式下,全部的鍵就是功能鍵了less
返回 Normal 模式,請按 ESC
鍵
返回 Insert 模式,請按 i
鍵
插入/刪除
keys | 效果 | keys | 效果 |
---|---|---|---|
a | 光標以後插入 | A | 行尾插入 |
o | 下一行插入 | O | 上一行插入 |
i | 光標以前插入 | I | 行首插入 |
s | 刪除字符插入 | S | 刪除正行插入 |
dd | 刪除一行,並把刪除的行存到剪貼板裏 | "cc"或者"S" | 刪除後進入插入-insert-模式 |
dw | 刪除一個單詞 | cw | 刪除一個單詞進入插入-insert-模式 |
x 或 dl | 刪除一個字符 | s 或 cl | 刪除一個字符進入插入模式 |
cw | 替換從光標所在位置後到一個單詞結尾的字符 | "D"或"C" | 刪除到行尾能夠 |
dt" | 刪除全部的內容,直到遇到雙引號—— " |
||
u | 撤銷 | ctrl + r | 重作 |
拷貝/黏貼/刪除
keys | 效果 |
---|---|
y | 複製 當前光標所在的一個字符 |
x | 剪切 當前光標所在的一個字符 |
p | 粘貼 |
xp | 交換兩個字符 |
ddp | 交換兩行 |
yy | 拷貝當前行當行於 ddP |
0y$ | 0y$ 命令意味着:0 先到行頭,y 從這裏開始拷貝,$ 拷貝到本行最後一個字符 |
ye | 從當前位置拷貝到本單詞的最後一個字符 |
y2/foo | 拷貝2個 「foo」 之間的字符串 |
dt" | 刪除全部的內容,直到遇到雙引號—— " |
還有不少時間並不必定你就必定要按y纔會拷貝,下面的命令也會被拷貝:
d
(刪除 )v
(可視化的選擇)gU
(變大寫)gu
(變小寫)光標的移動
keys | 效果 | ||
---|---|---|---|
k l j h | 上右下左(↑→↓←) | ` | 移動到上次編輯文件的位置 |
gg | 跳到文件開頭 | G | 跳到文件尾 |
{ | 移動到段首 | } | 移動到段尾 |
b | 跳到上一個單詞的開頭 | J | 合併兩行 |
e | 跳到下一個單詞的結尾 | w | 跳到下一個單詞的開頭 |
0 | 數字零,到行頭 | $ | 到本行行尾 |
^ | 到本行第一個非blank(空格,tab,換行,回車等)字符的位置 | ngg 或 nG 或 :n | 跳到第n行 |
L | 移動到底部 | L | 移動到底部 |
H | 移動光標到屏幕頂端 | M | 移動到屏幕中間 |
選中
keys | 做用 |
---|---|
v+w | 打開選中模式,並向後移動一個單詞 |
v+b | 打開選中模型,並向前移動一個單詞 |
v+i+w | 打開選中模式,並選中當前單詞 |
修改
keys | 說明 |
---|---|
d s <existing char> |
刪除兩邊的指定字符 |
c s <existing char> <desired char> |
修改兩邊的指定字符 |
y s <motion> <desired char> |
修改兩邊字符 |
S <desired char> |
visual modes 選中指定字符中間的內容 |
格式
打開、保存、退出、改變文件
keys | 效果 |
---|---|
:e <path/to/file> | → 打開一個文件 |
:w | 存盤 |
:saveas <path/to/file> | 另存爲 `<path/to/file> |
:x , ZZ 或 :wq |
保存並退出 (:x 表示僅在須要時保存,ZZ不須要輸入冒號並回車)(:w 存盤, :q 退出) (陳皓注::w 後能夠跟文件名) |
:q! | 退出不保存 |
:qa! | 強行退出全部的正在編輯的文件,就算別的文件有更改。 |
:bn和 :bp |
你能夠同時打開不少文件,使用這兩個命令來切換下一個或上一個文件。(陳皓注:我喜歡使用:n到下一個文件) |
:help | 顯示相關命令的幫助。你也能夠就輸入 :help` 而不跟命令。(陳皓注:退出幫助須要輸入:q) |
|
:e! | 若不想保存文件,而從新打開 |
:e filename | 若想打開新文件 |
ctrl + ^ | 進行文件切換 |
代碼註釋
gc | 打開或關閉註釋 // |
gcc | 打開或關閉某一行代碼註釋 // |
gc2j | 打開或關閉兩行代碼註釋 |
gC | 塊代碼註釋 |
gCi) | 註釋 括號()中的代碼 |
其餘
插入
模式下所謂插入模式就是進入到一個能夠編輯文本文檔的模式,常規的方式就是按小i進入編輯模式,左下角顯示「--insert插入--」狀態。
在 normal 模式下轉 insert 模式,有三種途徑。
刪除
操做 | 效果 |
---|---|
ctrl+h | 刪除前一個字符 |
ctrl+w | 刪除前一個單詞 |
ctrl+u | 刪除前面一行全部字符 |
命令
模式在normal(正常)模式中,按下:
(冒號)鍵,會進入命令模式。
在命令模式中能夠執行一些輸入並執行一些vim或插件提供的指令,就像在shell裏同樣。這些指令包括 設置環境、文件操做、調用某個功能等等。
以:冒號開頭的命令
操做 | 效果 | 操做 | 效果 |
---|---|---|---|
:wq 或:x | 保存退出 | :set nu | 顯示行號 |
:wq! | 強制保存退出 | :set nonu | 不顯示行號 |
:q! | 強制退出 | :nohl | 不高亮顯示 |
注意::wq 或:x 都是保存退出,相似wq 若是在更改文件以後去操做2者的效果徹底相同。
可是有一種狀況不一樣,若是文件僅僅只是打開只看了一眼,這個時候使用wq會修改Mtime,更改爲文件查看的那一刻,也就是輸入wq那個時間。若是使用x那麼就不會更改Mtime時間
可視
模式在正常模式按下v, V, <Ctrl>+v
,能夠進入可視模式。
可視模式中的操做有點像拿鼠標進行操做,選擇文本的時候有一種鼠標選擇的即視感,有時候會很方便。
可視塊模式有一個很好的使用:多選註釋 加註釋 :
去註釋 :
近期筆者發現VSCode在vim 模式下CPU佔用常常是200%左右,卡頓很是嚴重,看了官方issue。 關閉easymotion 和 statusbarcolorcontrol 能夠解決此問題。
"vim.easymotion": false,
"vim.statusBarColorControl": false
複製代碼
vim 經常使用是normal 和 insert 模式。 大部分時候都在兩個模式下來回切換,若是在insert 模式下是中文輸入,按esc 或者 ctrl+[ 切到了 normal 模式,這個時候問題來了,須要手動切換輸入法到英文,不然會彈出中文提示。 還好官方給出瞭解決方案:
"vim.autoSwitchInputMethod.enable": true,
"vim.autoSwitchInputMethod.defaultIM": "com.apple.keylayout.US",
"vim.autoSwitchInputMethod.obtainIMCmd": "/usr/local/bin/im-select",
"vim.autoSwitchInputMethod.switchIMCmd": "/usr/local/bin/im-select {im}"
複製代碼
須要注意的是,mac下須要查明模式英文輸入法是US 仍是British ,而後修改defaultIM這個設置,不然會不起做用。
在vscode下面,咱們只須要對vim的相關配置進行設置就行。具體以下: 在【首選項】中進行設置。
"vim.useSystemClipboard": true
複製代碼
進行了上面的設置以後。就可使用系統的剪切板了。
到用戶目錄下新建文件爲 .vimrc,而後在其中寫下以下配置
syntax enable //語法高亮
set number //顯示行號
set cursorline //突出顯示當前行
set ruler //打開狀態欄標尺
set shiftwidth=4 //設定 << 和 >> 命令移動時的寬度爲 4
set softtabstop=4 //使得按退格鍵時能夠一次刪掉 4 個空格
set tabstop=4 //設定 tab 長度爲 4
複製代碼
幾個經常使用的Linux命令
以下:
cd 命令,用於切換當前目錄,它的參數是要切換到的目錄的路徑,能夠是絕對路徑,也能夠是相對路徑
cd /home ||進入 '/ home' 目錄' cd .. ||返回上一級目錄 cd ../.. ||返回上兩級目錄 cd ||進入我的的主目錄 cd ~user1 ||進入我的的主目錄 cd - ||返回上次所在的目錄 複製代碼
ls 命令,查看文件與目錄的命令,list之意,它的參數很是多,下面列出一些經常使用的:
ls ||查看目錄中的文件
ls -F ||查看目錄中的文件
ls -l ||顯示文件和目錄的詳細資料
ls -a ||顯示隱藏文件
ls -d ||僅列出目錄自己,而不是列出目錄的文件數據
ls -h ||將文件容量以較易讀的方式(GB,kB等)列出來
ls -R ||連同子目錄的內容一塊兒列出(遞歸列出),等於該目錄下的全部文件都會顯示出來
ls -lR ||以長數據串的形式列出當前目錄下的全部文件
ls *[0-9]* ||顯示包含數字的文件名和目錄名
複製代碼
mkdir 命令,
mkdir dir1 ||建立一個叫作 'dir1' 的目錄' mkdir dir1 dir2 ||同時建立兩個目錄 mkdir -p /tmp/dir1/dir2 ||建立一個目錄樹 複製代碼
cp 命令,該命令用於複製文件,copy之意,它還能夠把多個文件一次性地複製到一個目錄下
cp file1 file2 ||複製一個文件
cp dir/* . ||複製一個目錄下的全部文件到當前工做目錄
cp -a ||將文件的特性一塊兒複製
cp -a /tmp/dir1 . ||複製一個目錄到當前工做目錄
cp -a dir1 dir2 ||連同文件的全部特性把文件dir1複製成文件dir2
cp -p ||連同文件的屬性一塊兒複製,而非使用默認方式,與-a類似,經常使用於備份
cp -i ||若目標文件已經存在時,在覆蓋時會先詢問操做的進行
cp -r ||遞歸持續複製,用於目錄的複製行爲
cp -u ||目標文件與源文件有差別時纔會複製
複製代碼
mv 命令,該命令用於移動文件、目錄或改名,move之意
mv dir1 new_dir ||重命名/移動 一個目錄,把dir1重命名爲new_dir
mv -f ||force強制的意思,若是目標文件已經存在,不會詢問而直接覆蓋
mv -i ||若目標文件已經存在,就會詢問是否覆蓋
mv -u ||若目標文件已經存在,且比目標文件新,纔會更新
複製代碼
rm 命令,用於刪除文件或目錄,remove之間
rm -f ||就是force的意思,忽略不存在的文件,不會出現警告消息
rm -i file ||刪除文件file,在刪除以前會詢問是否進行該操做
rm -i ||互動模式,在刪除前會詢問用戶是否操做
rm -r ||遞歸刪除,最經常使用於目錄刪除,它是一個很是危險的參數
rm -rf dir1 ||刪除一個叫作 'dir1' 的目錄並同時刪除其內容
rm -rf dir1 dir2 ||同時刪除兩個目錄及它們的內容
複製代碼
find 命令,是一個基於查找的功能很是強大的命令,相對而言,它的使用也相對較爲複雜,參數也比較多,因此在這裏將給把它們分類列出:
# 與時間有關的參數:
find -mtime n ||n爲數字,意思爲在n天以前的「一天內」被更改過的文件;
find -mtime +n ||列出在n天以前(不含n天自己)被更改過的文件名;
find -mtime -n ||列出在n天以內(含n天自己)被更改過的文件名;
find -newer file ||列出比file還要新的文件名
# 例如:
find /root -mtime 0 # 在當前目錄下查找今天以內有改動的文件
# 與用戶或用戶組名有關的參數:
find -user name ||列出文件全部者爲name的文件
find -group name ||列出文件所屬用戶組爲name的文件
find -uid n ||列出文件全部者爲用戶ID爲n的文件
find -gid n ||列出文件所屬用戶組爲用戶組ID爲n的文件
# 例如:
find /home/ljianhui -user ljianhui # 在目錄/home/ljianhui中找出全部者爲ljianhui的文件
# 與文件權限及名稱有關的參數:
find -name filename ||找出文件名爲filename的文件
find -size [+-]SIZE ||找出比SIZE還要大(+)或小(-)的文件
find -tpye TYPE ||查找文件的類型爲TYPE的文件,TYPE的值主要有:通常文件(f)、設備文件(b、c)、
目錄(d)、鏈接文件(l)、socket(s)、FIFO管道文件(p);
find -perm mode ||查找文件權限恰好等於mode的文件,mode用數字表示,如0755;
find -perm -mode ||查找文件權限必需要所有包括mode權限的文件,mode用數字表示
find -perm +mode ||查找文件權限包含任一mode的權限的文件,mode用數字表示
# 例如:
find / -name passwd # 查找文件名爲passwd的文件
find . -perm 0755 # 查找當前目錄中文件權限的0755的文件
find . -size +12k # 查找當前目錄中大於12KB的文件,注意c表示byte
複製代碼
pwd 命令,顯示工做路徑
tree 命令,顯示文件和目錄由根目錄開始的樹形結構(1)
lstree 命令,顯示文件和目錄由根目錄開始的樹形結構(2)
ln -s file1 lnk1 命令,建立一個指向文件或目錄的軟連接
ln file1 lnk1 命令,建立一個指向文件或目錄的物理連接
cat命令,用於查看文本文件的內容,後接要查看的文件名,一般可用管道與more和less一塊兒使用,從而能夠一頁頁地查看數據。
cat text | less ||查看text文件中的內容
# 注:這條命令也可使用less text來代替
複製代碼