1. 配置vim編輯器
1-1. 為什么不使用vi而是vim
- vi適合編輯普通文本,不適用編寫腳本代碼,例如:缺少高亮顯示代碼、自動縮進等重要功能;
- vim相當於高級編輯器,可以提高開發效率。
1-2. 設置vim為默認編輯器
[root@oldboy scripts]# echo 'alias vi=vim' >> /etc/bashrc
[root@oldboy scripts]# tail -1 /etc/bashrc
alias vi=vim
[root@oldboy scripts]# source /etc/bashrc
經過上述調整后,當用vi命令時,會自動被vim替換。
1-3. 配置.vimrc的重要參數
Linux環境下的vim編輯器默認功能不夠強大,如果要進行Shell腳本的開發,還需要進行適當的設置,從而達到高效開發的目的。vim編輯器有一個可以用來調整配置的配置文件,默認放置在用戶家目錄下,全路徑及名字組合為:~/.vimrc(全局路徑為/etc/vimrc),這是一個隱藏文件。
~/.vimrc配置內容如下:
cat > ~/.vimrc << eof
" ~/.vimrc
" vim config file
" date 2018-07-15
" Created by oldboy
" blog:http://www.cnblogs.com/wushuaishuai
"""""""""""""""""""""
" => 全局配置
"""""""""""""""""""""
"關閉兼容模式
set nocompatible
"設置歷史記錄步數
set history=100
"開啟相關插件
filetype on
filetype plugin on
filetype indent on
"當文件在外部被修改時,自動更新該文件
set autoread
"激活鼠標的使用
set mouse=a
"""""""""""""""""""""
" => 字體和顏色
"""""""""""""""""""""
"開啟語法
syntax enable
"設置字體
"set guifont=dejaVu\ Sans\ MONO\ 10
"
""設置配色
"colorscheme desert
"高亮顯示當前行
set cursorline
hi cursorline guibg=#00ff00
hi CursorColumn guibg=#00ff00
"""""""""""""""""""""
" => 代碼折疊功能 by oldboy
"""""""""""""""""""""
"激活折疊功能
set foldenable
"設置按照語法方式折疊(可簡寫set fdm=XX)
"有6種折疊方法:
"manual 手工定義折疊
"indent 更多的縮進表示更高級別的折疊
"expr 用表達式來定義折疊
"syntax 用語法高亮來定義折疊
"diff 對沒有更改的文本進行折疊
"marker 對文中的標志進行折疊
set foldmethod=manual
"設置折疊區域的寬度
"如果不為0,則在屏幕左側顯示一個折疊標識列
"分別用“-”和“+”來表示打開和關閉的折疊。
set foldcolumn=0
"設置折疊層數為3
setlocal foldlevel=3
"設置為自動關閉折疊
set foldclose=all
"用空格鍵來代替zo和zc快捷鍵實現開關折疊
"zo O-pen a fold (打開折疊)
"zc C-lose a fold (關閉折疊)
"zf F-old creation (創建折疊)
nnoremap <space> @=((foldclosed(line('.')) < 0) 'zc' : 'zo')<CR>
"""""""""""""""""""""
" => 文字處理 by oldboy
"""""""""""""""""""""
"使用空格來替換Tab
set expandtab
"設置所有的Tab和縮進為4個空格
set tabstop=4
"設定 << 和 >> 命令移動時的寬度為4
set shiftwidth=4
"使得按退格鍵時可以一次刪掉4個空格
set softtabstop=4
set smarttab
"縮進,自動縮進(繼承前一行的縮進)
"set autoindent命令關閉自動縮進,是下面配置的縮寫。
"可使用autoindent命令的簡寫,即 “:set ai” 和 “:set noai”。
"還可以使用“ :set ai sw=4”在一個命令中打開縮進並設置縮進級別。
set ai
"智能縮進
set si
"自動換行
set wrap
"設置軟寬度
set sw=4
"""""""""""""""""""""
" => Vim 界面 by oldboy
"""""""""""""""""""""
"Turn on WiLd menu
set wildmenu
"顯示標尺
set ruler
"設置命令行的高度
set cmdheight=1
"顯示行數
"set nu
"Do not redraw, when running macros.. lazyredraw
set lz
"設置退格
set backspace=eol,start,indent
"Bbackspace and cursor keys wrap to
set whichwrap+=<,>,h,l
"Set magic on(設置魔術)
set magic
"關閉遇到錯誤時的聲音提示
"關閉錯誤信息響鈴
set noerrorbells
"關閉使用可視響鈴代替呼叫
set novisualbell
"顯示匹配的括號([{和}])
set showmatch
"How many tenths of a second to blink
set mat=2
"搜索時高亮顯示搜索到的內容
set hlsearch
"搜索時不區分大小寫
"還可以使用簡寫(“:set ic” 和 “:set noic”)
set ignorecase
"""""""""""""""""""""
" => 編碼設置
"""""""""""""""""""""
"設置編碼
set encoding=utf-8
"設置文件編碼
set fileencodings=utf-8
"設置終端編碼
set termencoding=utf-8
"""""""""""""""""""""
" => 其他設置 by oldboy 2010
"""""""""""""""""""""
"開啟新行時使用智能自動縮進
set smartindent
set cin
set showmatch
"隱藏工具欄
set guioptions-=T
"隱藏菜單欄
set guioptions-=m
"置空錯誤鈴聲的終端代碼
set vb t_vb=
"顯示狀態欄 (默認值為 1, 表示無法顯示狀態欄)
set laststatus=2
"粘貼不換行問題的解決方法
set pastetoggle=<F9>
"設置背景色
set background=dark
"設置高亮相關
highlight Search ctermbg=black ctermfg=white guifg=white guibg=black
"在Shell腳本的開頭自動增加解釋器及作者等版權信息
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1, "#!/bin/bash")
call setline(2, "# Author: Wu ShuaiShuai")
call setline(3, "# Blog2: http://www.cnblogs.com/wushuaishuai")
call setline(4, "# Time: ".strftime("%F %T"))
call setline(5, "# Name: ".expand("%"))
call setline(6, "# Version: v1.0")
call setline(7, "# Description: This is a Script.")
endif
endfunc
eof
退出重新登錄后.vimrc生效,同樣適用於普通用戶。
1-4. vim路徑等配置知識
相關配置文件 | 功能描述 |
---|---|
.viminfo | 用戶使用vim的操作歷史 |
.vimrc | 當前用戶vim的配置文件 |
/etc/vimrc | 系統全局vim的配置文件 |
/usr/share/vim/vim74/colors/ | 配色模板文件存放路徑 |
2. vim編輯器實戰
2-1. 代碼自動縮進功能
當輸入循環及條件結構語句等代碼時,系統會自動將輸入語句的關鍵字及命令代碼縮進到合理的位置,可以看到,vim的配置是以兩個空格為縮進寬度(.vimrc里設置的)的。
2-2. 代碼顏色高亮顯示功能
代碼顏色高亮顯示也是一個非常好的功能,可以通過它區分字符、變量、循環等很多不同的Shell腳本元素。例如當編寫的代碼出現錯誤時,對應的代碼高亮顏色就會和正確時的不同,開發者可以根據代碼的高亮顏色對Shell腳本進行調試,提升編碼的效率,減少編碼的錯誤。
2-3. vim配置文件的自動增加版權功能
當執行“vim oldboy.sh”編輯腳本時,只要是以.sh為擴展名的,就會自動增加版權信息。
2-4. 顯示當前行、顯示光標的坐標位置

2-5. vim配置文件的代碼折疊功能
在代碼量較大時比較有用的高級功能——代碼折疊(依賴.vimrc配置,當然也可以以命令模式執行)
- 在命令模式下,可以把光標定位到當前的第2行,然后執行zf3j命令,便可將第2行及其下的3行縮進,其他縮進也是如此。
- 若把光標放到對應折疊后的行上,按空格鍵即可展開上述折疊的行。
2-6. vim編輯器批量縮進及縮進調整技巧
有時我們從外部復制部分Shell代碼到當前腳本后發現縮進是亂的。
-
此時可以將vim編輯器調整為命令模式(按Esc鍵),然后移動鍵盤上下鍵將光標定位到要調整的行開頭。
-
接下來輸入“v”(可視化縮寫),然后用鍵盤移動光標選定要調整的多行。
-
最后按“=”鍵即可將代碼調整為規整的格式。
2-7. vim編輯器塊操作
2-7-1. 可視模式
進入可視模式有三種方法:v,V,Ctrl+v
- 按v(小寫)啟用可視模式,可以按單個字符選擇內容,移動光標可以選擇。
- 按V(大寫)啟用可視模式,立刻選中光標所在行,按單行符選擇內容,移動光標可以選擇。
- 按Ctrl+v啟用可視中的列塊模式,可以在列方向上選擇單個字符,移動光標可以選擇。
2-7-2. 列塊(可視)模式
Ctrl+v,啟用列塊模式,之后移動鼠標,可以選中某一個矩形塊,對於有規律的表格可以用這個功能。
目前當前光標所在的位置是右下角,可以在這個塊的四角進行移動光標,方法就是按o(小寫),O(大寫)來切換四個頂點。
(1).刪除或剪切操作
- Ctrl+v,進入列塊模式,選中需要刪除的內容
- 按d(小寫)即可刪除選中區域
- 按D(大寫)刪除選中區域及所在行后面的數據
(2).輸入操作
- Ctrl+v,進入列塊模式,選中需要添加的內容
- 按I(大寫)進入插入,然后輸入“//”(你想輸入的字符)
- 然后按ESC即可在其它行輸入你想輸入的字符了
(3).復制和粘貼操作
- Ctrl+v,進入列塊模式,選中需要復制的內容
- 按y(小寫)復制內容,4 line yanked 說明復制了四行
- 然后移動光標到行首,按p(小寫)在光標的后面一列輸入內容,按P(大寫)在光標前面一列輸入內容
2-8. vim多窗口使用技巧
2-8-1. 打開多窗口
打開多窗口的命令以下幾個:
橫向切割窗口
:new+窗口名(保存后就是文件名)
:split+窗口名,也可以簡寫為:sp+窗口名
縱向切割窗口名
:vsplit+窗口名,也可以簡寫為:vsp+窗口名
2-8-2. 關閉多窗口
可以用:q!,也可以使用:close,最后一個窗口不能使用close關閉。使用close只是暫時關閉窗口,其內容還在緩存中,只有使用q!、w!或x才能真能退出。
:tabc 關閉當前窗口
:tabo 關閉所有窗口
2-8-3. 窗口切換
:ctrl+w+j/k,通過j/k可以上下切換,或者:ctrl+w加上下左右鍵,還可以通過快速雙擊ctrl+w依次切換窗口。
2-8-4. 窗口大小調整
縱向調整
:ctrl+w + 縱向擴大(行數增加)
:ctrl+w - 縱向縮小 (行數減少)
:res(ize) num 例如::res 5,顯示行數調整為5行
:res(ize)+num 把當前窗口高度增加num行
:res(ize)-num 把當前窗口高度減少num行
橫向調整
:vertical res(ize) num 指定當前窗口為num列
:vertical res(ize)+num 把當前窗口增加num列
:vertical res(ize)-num 把當前窗口減少num列
2-8-5. 給窗口重命名
:f file
2-8-6. vim打開多文件
vim a b c
:n 跳至下一個文件,也可以直接指定要跳的文件,如:n c,可以直接跳到c文件
:e# 回到剛才編輯的文件
2-8-7. 開啟目錄瀏覽器
:Ex 開啟目錄瀏覽器(可以瀏覽當前目錄下的所有文件,並且可以選擇)
:Vex 垂直分割窗當前窗口,並在一個窗口中開啟目錄瀏覽器
:Sex 水平分割當前窗口,並在一個窗口中開啟目錄瀏覽器
:ls 顯示當前buffer情況
2-8-8. vim與shell切換
:shell 可以在不關閉vi的情況下切換到shell命令行
exit 從shell回到vim
2-9. vim常用操作快捷鍵
命令 | 說明 |
---|---|
普通模式:移動光標的操作 | |
G 或(shift+g) | 將光標移動到文件的最后一行 |
gg | 將光標移動到文件的第一行,等價於1gg 或1G |
數字0或^ | 將光標從所在位置移動到當前行的開頭 |
$ | 從光標所在位置將光標移動到當前行的結尾 |
n+Enter鍵 | n 為數字,Enter鍵 為回車鍵,將光標從當前位置向下移動 n 行 |
ngg | n 為數字,移動到文件的第n 行,如11gg 可移動到第 11 行,可配合“:set nu ”查看,同nG |
H | 光標移動到當前窗口最上方的那一行 |
M | 光標移動到當前窗口中間的那一行 |
L | 光標移動到當前窗口最下方的那一行 |
h 或( ←) | 光標向左移動一個字符 |
j 或(↓) | 光標向下移動一個字符 |
k 或(↑) | 光標向上移動一個字符 |
l 或(→) | 光標向右移動一個字符 |
普通模式:搜索與替換操作 | |
/oldboy | 從光標位置開始,向下尋找名為oldboy 的字符串 |
?oldboy | 從光標位置開始,向上尋找名為oldboy 的字符串 |
n | 從光標位置開始,向下重復前一個搜索的的動作 |
N | 從光標位置開始,向上重復前一個搜索的的動作 |
:g/A/s//B/g | 把符合A 的內容全部替換為B ,斜線為分隔符,可以用@ 、# 等替代 |
:%s/A/B/g | 把符合A 的內容全部替換為B ,斜線為分隔符,可以用@ 、# 等替代 |
:n1,n2s/A/B/gc | n1 、n2 為數字,在第n1 行和n2 行間尋找A ,用B 替換 |
普通模式:復制、粘貼、刪除等操作 | |
yy | 復制光標所在的當前行 |
nyy | n 為數字,復制光標開始向下共n 行 |
p/P | p 將已復制的數據粘貼到光標的下一行,P 則為粘貼到光標的上一行 |
dd | 刪除光標所在的當前行 |
ndd | n 為數字,刪除從光標開始向下共n 行 |
u | 恢復(回滾)前一個執行過操作 |
. | 點號。重復前一個執行過的動作 |
x | 向后刪除字符 |
X | 向前刪除字符 |
d1G | 刪除當前行至第一行 |
dG | 刪除當前行至最后一行 |
d0 | 刪除當前光標文本至行首 |
d$ | 刪除當前光標文本至行尾 |
進入編輯模式命令 | |
i | 在當前光標所在處插入文字 |
a | 在當前光標所在下一個字符處插入文字 |
I | 在當前所在行的行首第一個非空格符處開始插入文字,和 A 相反 |
A | 在當前所在行的行尾最后一個字符處開始插入文字,和 I 相反 |
O | 在當前所在行的上一行處插入新的一行 |
o | 在當前所在行的下一行處插入新的一行 |
Esc | 退出編輯模式,回到命令模式中 |
命令行模式 | |
:wq | 退出並保存 |
:wq! | 退出並強制保存,"!" 為強制的意思 |
:q! | 強制退出,不保存 |
:n1,n2 w filename | n1 、n2 為數字,將 n1 行到 n2 行的內容保存成 filename 這個文件 |
:n1,n2 co n3 | n1 、n2 為數字,將 n1 行到 n2 行的內容拷貝到 n3 位置下 |
:n1,n2 m n3 | n1 、n2 為數字,將 n1 行到 n2 行的內容挪至 n3 位置下 |
:!command | 暫時離開vi 到命令行模式下執行command 的顯示結果!例如 :! ls /etc |
:set nu | 顯示行號 |
:set nonu | 與 set nu 相反,取消行號 |
:vs filename | 垂直分屏顯示,同時顯示當前文件和 filename 對應文件的內容 |
:sp filename | 水平分屏顯示,同時顯示當前文件和 filename 對應文件的內容 |
I + # + Esc | 在可視塊模式下(Ctrl + v ), 一次性注釋所選的多行,取消注釋可用:n1,n2s/#/ /gc |
Del | 在可視塊模式下(Ctrl + v ),一次性刪除所選內容 |
r | 在可視塊模式下(Ctrl + v ),一次性替換所選內容 |


參考資料:《跟老男孩學Linux運維:Shell編程實戰》