VIM - Vi IMproved

Content of file: ~/.vimrc

set cindent                                                                                                                                                    
set autoindent
set ruler
set showmode
set shiftwidth=2
set tabstop=2
set expandtab
set incsearch
set number
set relativenumber
set hls 
set nocompatible
set guifontset=8x16,kc15f,-*-16-*-big5-0 
set cursorline
"set fenc=big5 enc=big5 tenc=utf8

syntax on
highlight Comment ctermfg=darkcyan
highlight Search term=reverse ctermbg=4 ctermfg=7
highlight CursorLine cterm=none ctermbg=0 
set background=dark
if has("autocmd")
   autocmd BufRead *.txt set tw=78
   autocmd BufReadPost *
      \ if line("'\"") > 0 && line ("'\"") <= line("$") |
      \   exe "normal g'\"" |
      \ endif
endif
nnoremap <F12> :TlistToggle<CR>
nnoremap <silent> <F3> :NERDTree<CR>
nnoremap <silent> <F7> :TlistOpen<CR>
nnoremap <silent> <F8> :TlistToggle<CR>
filetype plugin on

"let g:neocomplcache_enable_at_startup = 1

if has("multi_byte")
  if &termencoding == ""
    let &termencoding = &encoding
  endif
  set encoding=utf-8
  setglobal fileencoding=utf-8
  "setglobal bomb
  set fileencodings=ucs-bom,utf-8,latin1
endif





note of vim

啟動 vi(m)

移動畫面
分割視窗
tab 多視窗

移動指標
暫存器(register)

檔案存取
修改文字內容
pattern 的 正規表示法(regular expression)

Miscellaneous




啟動 vi(m)

vi -m => 以唯讀的方式開啟檔案,可以修改,但無法存檔
vi -M => 以唯讀的方式開啟檔案,無法修改

vi -o => 以水平分割的方式開啟多檔案
vi -O => 以垂直分割的方式開啟多檔案

vi -p => 以多 tab 視窗的方式開啟多檔案

vi -b => 編輯二進制檔案,ex: vi -b abc.bin

vi -d => 查看檔案間的 difference,等同於 vimdiff,ex: vi -d aaa.txt bbb.txt

:set encoding=utf8 => 支援繁體中文顯示
:set list => 顯示 TAB 及 行尾 符號
:set paste => 設定為貼上模式
:set nu => 顯示行號

:w => 將目前檔案內容存檔
:w %.new => 將目前檔案內容另存新檔到 目前的檔案名稱.new
:wa[ll] => 將目前 list 中的檔案全部存檔
:wn => 執行 :w 後,再執行 :n(ext)
:wq => 執行 :w 後,再執行 :q(uit)

:q => 關閉檔案
:q! => 不儲檔並關閉檔案
ZZ => 儲檔並關閉檔案,等同於 :wq
ZQ => 不儲檔並關閉檔案,等同於 :q!




移動畫面

CTRL-f => 向下捲動一頁
CTRL-b => 向上捲動一頁

CTRL-e => 向下捲動一行
CTRL-y => 向上捲動一行

zz => 將指標行移到螢幕中間
zb => 將指標行移到螢幕最底下
zt => 將指標行移到螢幕最上面




分割視窗

CTRL-w + s => 水平分割視窗,等同於 :sp(lit)
CTRL-w + v => 垂直分割視窗,等同於 :vsp(lit)
CTRL-w + n => 水平分割視窗,開新檔案
CTRL-w + o => 關閉其它分割視窗

CTRL-w + r => 旋轉分割視窗,先嘗試向右旋轉,再嘗試向下旋轉
CTRL-w + R => 旋轉分割視窗,先嘗試向左旋轉,再嘗試向上旋轉

CTRL-w + = => 平均分配分割視窗的大小
CTRL-w + + => 增加該分割視窗一行
CTRL-w + - => 減少該分割視窗一行
CTRL-w + > => 增加該分割視窗一欄
CTRL-w + < => 減少該分割視窗一欄
CTRL-w + _ => 將該分割視窗的高度調到最大
CTRL-w + | => 將該分割視窗的寬度調到最大

CTRL-w + T => 將該分割視窗切換為 tab 視窗

CTRL-w + w => 將指標移到下一個分割視窗
CTRL-w + W => 將指標移到上一個分割視窗
CTRL-w + h => 將指標移到向左一個分割視窗
CTRL-w + j => 將指標移到向下一個分割視窗
CTRL-w + k => 將指標移到向上一個分割視窗
CTRL-w + l => 將指標移到向右一個分割視窗

CTRL-w + H => 將該分割視窗移到最左邊
CTRL-w + J => 將該分割視窗移到最下方
CTRL-w + K => 將該分割視窗移到最上方
CTRL-w + L => 將該分割視窗移到最右邊

:clo[se] => 關閉該分割視窗
:on[ly] => 關閉其它分割視窗

 

:term[inal] => 開啟 terminal 並水平分割視窗
:vert[ical] term[inal] => 開啟 terminal 並垂直分割視窗



tab 多視窗

:tabe[dit] => 開啟新的 tab 視窗
:tabe[dit] {file-name} => 在 tab 開啟 {file-name}

gt => 跳到下一個 tab 視窗
gT => 跳到上一個 tab 視窗
3gt => 跳至第 3 個 tab 視窗

:tabm[ove] 0 => 將當前 tab 視窗順序移動到順序 0

:tabc[lose] => 關閉該 tab 視窗
:tabo[nly] => 關閉其它 tab 視窗

:tabn[ext] => 跳到下一個 tab 視窗
:tabp[revious] => 跳到上一個 tab 視窗




移動指標

h => 向左移一格
j => 向下移一行
k => 向上移一行
l => 向右移一格

$ => 移到該行最後一格
0 => 移到該行第一格
^ => 移到該行第一個字元
% => 移到相對應括號的位置

gj、gk、g0、g^、g$ => 幾乎等同於 j, k, 0, ^, $,但其作用於顯示行,而不是實際行

+ => 移到下一行的文字開頭,等同於 j + ^
- => 移到上一行的文字開頭,等同於 k + ^

( => 跳到上一個句子
) => 跳到下一個句子

{ => 跳到上一個段落
} => 跳到下一個段落

w => 移到下一個 word 字頭
W => 移到下一個 WORD 字頭
b => 移到上一個 word 字頭
B => 移到上一個 WORD 字頭
e => 移到(下一個) word 字尾
E => 移到(下一個) WORD 字尾
ge => 移到上一個 word 字尾
gE => 移到上一個 WORD 字尾

fx => 移到下一個 x 字母的位置
Fx => 移到上一個 x 字母的位置
tx => 移到下一個 x 字母的前一個位置
Tx => 移到下一個 x 字母的前一個位置
; => 重複上述移動指令,方向等同
, => 重複上述移動指令,方向相反

mn => 將指標位置標記為 n,n 可以是 a-z, A-Z,以下類推
'n => 移到標記為 n 的行首字母位置
`n => 移到標記為 n 的字母位置
'' => 移到移動前的行首字母位置
`` => 移到移動前的字母位置

gg => 移到第一行,等同於 [[
G => 移到最後一行,等同於 ]]
34g => 移到第34行

# => 向上搜尋 指標單字
* => 向下搜尋 指標單字

/keyword => 向上搜尋 keyword,等同於 /keyword/f
?keyword => 向下搜尋 keyword,等同於 ?keyword/f
/keyword/e => 將指標移到向下一個 keyword 的字尾位置

CTRL-r + CTRL-w => 在比對字串時,將目前比對到的 keyword 補滿輸入欄
CTRL-r + CTRL-a => 在比對字串時,將目前比對到的 keyword 再加到輸入欄

//f => 移到向下一個 keyword 的字頭位置
//e => 移到向下一個 keyword 的字尾位置
:%s///gn => 計算 keyword 的個數

v, V, CTRL-v => 選取文字,分別為字元、整行、區塊選取模式,可以用 o 跳往另一個選取方向
gv => 回到上次選取的範圍

:jump => 顯示 jump list
CTRL-o => 往後追縱 jump list
CTRL-i => 向前追縱 jump list
'' => 跳到上一個 jump 行的首個字母
`` => 跳到上一個 jump 行的字母

:changes => 顯示該檔案最近的修改 (change list)
'. => 跳到最近一個修改行的首個字母
`. => 跳到最近一個修改行的字母
'^ => 跳到最近一個插入行的首個字母
`^ => 跳到最近一個插入行的末個字母
'[ => 跳到最近一個修改行或複製行的首個字母,等同於 `[
'] => 跳到最近一個修改行或複製行的末個字母,等同於 `]
'< => 跳到最近一個選取範圍首行的首個字母
`< => 跳到最近一個選取範圍首行的該字母
'> => 跳到最近一個選取範圍末行的首個字母
`> => 跳到最近一個選取範圍末行的該字母




暫存器(register)
暫存器可以是 a-z, A-Z, 0-9,各自有不同的用法,a-z 是一般暫存器,A-Z 是增加內容到 a-z 暫存器,0-9 是 vi 自動使用的暫存器

qb => 將後續輸入的操作儲存到 暫存器 b
qB => 將後續輸入的操作附加到 暫存器 b

:reg[ister] => 顯示所有暫存器的內容
:reg[ister] b => 顯示 暫存器 b 的內容

:put b => 取得暫存器 b,貼上暫存器的內容,等同於 "bp

:d b => 刪除指標行,並將刪除的內容放至暫存器 b,等同於 "bdd
:y b => 複製指標行,並將複製的內容放至暫存器 b,等同於 "byy
"b6yy => 複製指標行以下6行,並將複製的內容放至暫存器 b
"bp => 貼上暫存器 b 的內容

@b => 執行 暫存器 b 的內容指令
@@ => 重複執行上一次利用暫存器所執行的指令
:normal @b => 執行 暫存器 b 的內容指令,等同於 @b

"" => 未命名的暫存器,儲存 d, c, s, x, y 命令的內容
"0 => 儲存最近一次 yank 的內容
"1 => 儲存最近一次 delete 的內容
"_ => 黑洞暫存器,可以將任何操作指令給此暫存器,而此操作結果,將不會影響其它暫存器內容

:let i = 0 => 建立變數 i,給值為 0
:echo i => 顯示變數 i 的值




檔案存取

ZZ => 存檔、離開,等同於 wq

:e! => 放棄修改,回復到最近一次存檔的內容

:r {file-name} => 從指標的下一行,插入 {file-name} 檔案內容
:0r {file-name} => 從第 0 行,插入 {file-name} 檔案內容
:r !ls => 從指標的下一行,插入 外部命令 ls 的輸出內容
:r !sort {file-name} => 從指標的下一行,插入 外部命令 sort {file-name} 的輸出內容

:30,39 !sort => 將第 30 ~ 39 行以 外部命令 sort 重新排列

:fin[d] {file-name} => 尋找並開啟 {file-name}

:e[dit] {file-name} => 關閉目前檔案,並開啟 {file-name}
:e[dit] {directory-path} => 關閉目前檔案,並開啟 {directory-path}

:e# => 關閉目前檔案,並重新開啟上一次關閉的檔案,等同於 CTRL-^

:args => 顯示檔案名稱列

:args {arglist} => 修改參數檔案名稱列
:n[ext] => 跳到下一個參數檔案名稱列的檔案
:p[rev[ious]] => 跳到上一個參數檔案名稱列的檔案
:first => 跳到第一個參數檔案名稱列的檔案
:last => 跳到最後一個參數檔案名稱列的檔案

gf => 關閉目前檔案,開啟指標所指的已存在檔名

:ls => 顯示 buffer 檔案名稱列
:bn[ext] => 跳到下一個 buffer 檔案名稱列的檔案
:bp[rev[ious]] => 跳到上一個 buffer 檔案名稱列的檔案




修改文字內容

a => 在指標後進入 輸入模式
A => 在指標行尾進入 輸入模式
i => 在指標進入 輸入模式
I => 在指標行行頭字頭進入 輸入模式
C => 刪除指標行後所有內容,並進入 輸入模式
D => 刪除指標行後所有內容
s => 刪除指標所指字元,並進入 輸入模式
S => 刪除指標行全部內容,並進入 輸入模式
x => 刪除指標字元
X => 刪除指標前字元
o => 新增下一行,並進入 輸入模式
O => 新增上一行,並進入 輸入模式

p => 在指標字元後貼上
P => 在指標字元前貼上

ce => 刪除指標到 word 字尾,並進入 輸入模式
cE => 刪除指標到 WORD 字尾,並進入 輸入模式
cb => 刪除指標到前一個 word 字頭,並進入 輸入模式
cB => 刪除指標到前一個 WORD 字頭,並進入 輸入模式
c$ => 刪除指標到行尾的文字,並進入 輸入模式
c^ => 刪除指標到行的第一個字元,並進入 輸入模式
c0 => 刪除指標到行頭的文字,並進入 輸入模式

de => 刪除指標到 word 字尾
dE => 刪除指標到 WORD 字尾
db => 刪除指標到前一個 word 字頭
dB => 刪除指標到前一個 WORD 字頭
d$ => 刪除指標到行尾的文字
d^ => 刪除指標到行的第一個字元
d0 => 刪除指標到行頭的文字

daw => 刪除指標 word,不保留空格
daW => 刪除指標 WORD,不保留空格
diw => 刪除指標 word,保留空格
diW => 刪除指標 WORD,保留空格

== => 自動調整縮排
>> => 向右縮排一步 (輸入模式: CTRL-t)
<< => 向左縮排一步 (輸入模式: CTRL-d)

:s/old/new => 將指標行的第一個 old 以 new 取代,s: substitute(取代)
:s/old/new/g => 將指標行所有的 old 以 new 取代,g: global(該行全域)
:s/old/new/gc => 一個一個尋問,是否將指標行內容所有的 old 以 new 取代,c: confirm(尋問確認)
:n,ms/old/new/g => 將第 n ~ m 行所有的 old 以 new 取代,n m 為行號數字
:%s/old/new/g => 將檔案內容所有的 old 以 new 取代,% 代表檔案全部內容

:1,$s/old/new/gc => 將內容的第 1 行到最後 1 行所有的 old 以 new 取代,等同於 :%s/old/new/gc

:[range] [v]g[lobal]/{pattern}/[cmd]
:g[lobal]/pattern/s/old/new/gc => 將內容的第 1 行到最後 1 行所有符合 pattern 的行,以 new 取代 old,第一個 g: global(文件內容全域)
:g/aa/d => 刪除含 aa 之行
:vg/bb/d => 刪除不含 bb 之行
:g/TODO/y[ank] a => 複製含 TODO 之行到 register a

CTRL-a => 尋找指標後的字元,對其數字加 1
CTRL-x => 尋找指標後的字元,對其數字減 1

~ => 將指標字元作大小寫切換
guw => 將指標 word 轉換成小寫字元
gUw => 將指標 word 轉換成大寫字元
g~w => 將指標 word 作大小寫切換
r => 將指標字元以下個輸入字元取代
R => 進入字元取代模式,依續輸入取代字元,按 ESC 離開

J => 合併下一行的內容

u => 回復到上一步
CTRL-r => 取消回復
U => 以行為單位,回復修改


在輸入模式:

CTRL-v => 以 10 進制 ASCII 碼輸入字元
CTRL-v + u => 以 16 進制四位元碼輸入字元

CTRL-r + = => 以計算方式輸入字元

CTRL-o => 允許以一般模式執行一個指令,之後自動回復到輸入模式

CTRL-[ => 離開輸入模式,回到一般模式,等同於 ESC




pattern 的 正規表示法(regular expression)

. 任意字元,ex: p.p => pap, pbp, p_p, p-p-p

* 表示該前字元可有多個也可無,ex: bugs* => bug, bugs, bugsssss

^ 以該後字串為開頭的行,ex: ^Part => Part...

$ 以該前字串為結尾的行,ex: here:$ => ...here:

\ 跳脫字元(escaping the character),使有特殊意思的符號變成一般符號使用

[] 任選一個字元,ex: a[aeiou]t => pat, pet, ..., put
p[a-z]t => pat, pbt, pct, ..., pzt
p[:;A-Za-z()]t => p:t, p;t, pAt, ..., pZt, pat, ..., pzt, p(t, p)t

^ 去除該後字元的可能性,ex: p[^a-z]t => p:t, p;t, pAt, ..., pZt, p(t, p)t, ...

\( \) 保留字串到緩衝區,ex: :%s/\(that\) or \(this\)/\2 or \1 => 把 that 保留到緩衝區 1,把 this 保留到緩衝區 2,再利用 \2 or \1 取出緩衝區的值

\< 以該後字串開頭的單字,ex: \<ac => acb, aczdg, acxxx, ...

\> 以該前字串結尾的單字,ex: ac\> => bac, zdgac, xxxac, ...

\w 代表 word character,包含數字、字母 及 _,ex: /\wry => ary, bry, 3ry, _ry, ...

\W 代表不為 word character,不包含數字、字母 及 _,ex: /\Wry => -ry, ?ry, !ry, %ry, ...

\x 表示為 16 進位字串,ex: /\v(\x{3}|\x{6}) => 123, abc, 123abc, abc123, a1b2c3, ...

\m magic 模式,一般預設模式就是此模式,詳情請查 :h \M。

\M nomagic 模式,有點複雜,詳情請查 :h \M。

\v very magic 模式,有點複雜,詳情請查 :h \M。

\V very nomagic 模式,將後續字元符號,除了 \ 之外,全當作一般字元,ex: /\Va.k.a. => a.k.a.,等同於: /a\.k\.a\.

& 代表搜尋樣式所比對出的完整字串,ex: :%s/abcde/&fg/ => "abcde" 轉換為 "abcdefg"

~ 代替上一個代換命令的替換字串,ex: :%s/his/their/ 之後,再輸入 :%s/my/~/ 等同於 :%s/his/their/

\u 強制下個字元為大寫
\l 強制下個字元為小寫,ex: :%s/\(That\) or \(this\)/\u\2 or \l\1/ => "That or this" 轉換為 "This or that"

\U 強制全部字元為大寫
\L 強制全部字元為小寫,ex: :%s/\(That\) or \(this\)/\U\2 or \L\1/ => "That or this" 轉換為 "THIS OR that"
:%s/Fortune/\U& => "Fortune" 轉換為 "FORTUNE"




Miscellaneous

:e + CTRL-d => 顯示出以 e 為開頭的可執行命令
:e + TAB => 按 TAB 選擇 e 為開頭的可執行命令

:!{cmd} => 執行 shell cmd,ex: :!date => 下 shell 環境執行 date

:sh[ell] => 跳到 shell 環境,離開後會回到 vi

:ab abc abcdefghijklmnopqrstuvexyz => 建立 abcdefghijklmnopqrstuvexyz 的縮寫為 abc
:unab abc => 取消 abc 的縮寫
:ab => 顯示目前所有的縮寫設定

:!mkdir -p %:h => 新增該檔名路徑的資料夾,%:h 指的是檔案路徑的 header

:pw[d] => 顯示目前資料夾路徑

:lc[d] [directory-path] => 修改目前資料夾路徑

q/ => 顯示搜尋指令的歷史紀錄,等同於 q?
q: => 顯示執行 Ex command-line 的歷史紀錄
CTRL-f => 從 / 或 ? 或 : 指令模式,切換到歷史紀錄模式
CTRL-p => 從 / 或 ? 或 : 指令模式,向前找尋歷史紀錄
CTRL-n => 從 / 或 ? 或 : 指令模式,向後找尋歷史紀錄

CTRL-g => 顯示檔案資訊
g + CTRL-g => 顯示指標字元在該檔案的資訊

ga => 顯示指標字元的編碼資訊

Q => 進入 Ex 模式
K => 顯示指標字串的 manual page

. => 重複上一次修改

最後,也是最重要的,上面的描述是有可能有錯的,如果有疑惑,請善用:
:h[elp] [arg] => 顯示 arg 相關的 help 資訊

當然,有時候也會發生 :help 資訊不完全正確的情況。




例子 (在 vim 中連續插入序數)

設定變數(i)
:let i = 0

選擇暫存器(t)存入以下動作:
qt

選擇要插入的行
i

選擇插入方式為暫存器
CTRL-r

選擇暫存器(=)
=

選擇要插入的變數
i

增加變數值(i)
:let i += 1

跳下一行
j

儲存完成,離開
ESC

執行暫存器(t)
@t

 

 

tmux

分割視窗的另一個工具是 tmux,在某些方面,用起來比 vim 切割 terminal 的方式更為直覺,而 tmux 的功能則更為多,以下列出 tmux 基本的三個指令:

Ctrl+b 再輸入 %  垂直分割視窗。
Ctrl+b 再輸入 " 水平分割視窗。
Ctrl+b 再輸入 方向鍵 切換至指定方向的 pane。

在 terminal 要啟用 tmux 的功能,只要先安裝 tmux,接著直接執行 tmux 即可。

 

修改 ~/.tmux.conf 可以客製化指令,如下的修改是以 vim 的方向鍵 hjkl 來取代 方向鍵,以實現切換至指定方向的 pane:
# Vim style pane selection
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

 

 

 

Reference

vim editor

Linux tmux 終端機管理工具使用教學

 

文字內容 或 影像內容 部份參考、引用自網路,如有侵權,請告知。

 

arrow
arrow
    全站熱搜

    silverwind1982 發表在 痞客邦 留言(0) 人氣()