vim實用筆記

安裝插件管理器

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

github倉庫地址 查看使用方式

vim操作技巧

. 重復命令

. 命令重復上次的修改
什么是修改:除了普通模式中執行的修改命令之外,每次進入插入模式時,也會形成一次修改。從進入插入模式的那一刻起,直到返回普通模式為止,為一次修改。

將以下內容進行縮放

Line one
Line two
Line three
Line four

Line one
Line two
Line three
Line four

指令:
光標起始:第二行開頭

>G
j
.
j.

用 . 的最佳實踐:一鍵移動 一鍵操作


var foo = "method("+argument1+","+argument2+")";
替換成
var foo = "method(" + argument1 + "," + argument2 + ")";
在插入模式下,vim會將連貫的操作當成一次修改,但如果是有進行光標移動,記錄的只是光標移動后的操作,要在 + 前后各加空格,必須移動光標。換一種思路,可以將+刪除,再重新輸入,就能有連貫的操作
f+
s + <esc>
;
.
;.
;.

逐個替換

...We're waiting for content before the site can go live...
...If you are content with this, let's go ahead with it...
...We'll launch as soon as we have the content...

逐個替換content為copy
光標定位在content

cwcopy<esc>
n
.

. 范式:用一次按鍵移動,另一次按鍵執行

普通模式

普通模式命令的強大,很大程度上源于它可以把操作符與動作命令結合在一起
控制撤銷命令的粒度:從進入插入模式開始,直到返回普通模式為止,在此期間輸入或刪除的任何內容都被當成一次修改。只要控制<esc>鍵的使用,就可控制粒度

The end is nigh
刪除末尾的單詞nigh

daw
刪除整個單詞(aw是文本對象)

<c-a> 和 <c-x> 分別對數字執行加和減操作。如果帶一個次數前綴,用于加減任意整數

.blog { background-position: 0px 0px }

修改
.news { background-position: -180px 0px }

cW.news<esc>
180<c-x> # 光標不在操作的數字上,會正向跳到所找到的第一個數字上

操作符+動作命令=操作

d{motion}命令可以對一個字符(dl), 一個完整單詞(daw), 或一整個段落(dap)進行操作,它作用的范圍由動作命令決定。c{motion}, y{motion} 也類似。統稱為操作符(operator), 用 :h operator可查閱完整的列表
操作符與動作命令的結合形成了一種語法。規則為:一個操作由一個操作符,后面跟一個動作命令組成

操作符命令

|c   |修改|
|d   |刪除|
|y   |復制到寄存器|
|g~  |反轉為大小寫|
|gu  |轉換為小寫|
|gU  |轉換為大寫|
|>   |增加縮進|
|<   |減少縮進|
|=   |自動縮進|
|!   |使用外部程序過濾{motion}所跨越的行|

插入模式

<c-h> 刪除前一個字符
<c-w> 刪除前一個單詞
<c-u> 刪至行首

插入模式只專注于做一件事:輸入文字
普通模式是我們大部分時間所使用的模式
<c-o> 進入插入-普通模式

不離開插入模式,粘貼寄存器中的文本

Practical Vim, by Drew Neil
Read Drew Neil's

修改為:
Practical Vim, by Drew Neil
Read Drew Neil's Practical Vim.

yt,
jA
<c-r>0
.<esc>

在插入模式 用<c-r>{register}可以方便地粘貼文本

gv 重復上一次選區

將標簽內容改為大寫
<a href="#">one</a>
<a href="#">two</a>
<a href="#">three</a>

<a href="#">ONE</a>
<a href="#">TWO</a>
<a href="#">THREE</a>
gUit
j.
j.

修改列文本

li.one a{ background-image: url('/images/sprite.png'); }
li.two a{ background-image: url('/images/sprite.png'); }
li.three a{ background-image: url('/images/sprite.png'); }

li.one a{ background-image: url('/components/sprite.png'); }
li.two a{ background-image: url('/components/sprite.png'); }
li.three a{ background-image: url('/components/sprite.png'); }

光標在第一行的images開頭
<c-v>jje
c
components
<esc>

在每行末尾添加;
var foo = 1
var bar = 'a'
var foobar = foo + bar

var foo = 1;
var bar = 'a';
var foobar = foo + bar;

光標在第一行的末尾
<c-v>jj$
A;
<esc>

I 光標移至行首并進入插入模式
A 光標移至行尾并進入插入模式

<!DOCTYPE html>
<html>
  <head><title>Practical Vim</title></head>
  <body><h1>Practical Vim</h1></body>
</html>

高亮選區后,進行命令模式,會將選區標識為'<,'>

:/<html>/,/</html>/p
操作html標簽之間的內容
還可以用偏移對地址進行修正
如:不想包括<html>及</html>所在的行,可以為之加上偏移
:/<html>/+1,/</html>/-1p

Ex命令的地址及范圍的符號:
1 文件的第一行
$ 文件的最后一行
0 虛擬行,位于文件第一行上方
. 光標所在行
'm 包含位置標記m的行
% 整個文件(:1,$的簡寫形式)

使用:t和:m命令復制和移動行

:copy的簡寫形式為:t

Shopping list
    Hardware Store
        Buy new hammer
    Beauty Parlor
        Buy nail polish remover
        Buy nails
Shopping list
    Hardware Store
        Buy new hammer
        Buy nails
    Beauty Parlor
        Buy nail polish remover
        Buy nails

:211t 208 將211行復制到208行

:6t. 把第6行復制到當前行下方
:t6 把當前行復制到第6行下方
:t. 復制當前行,相當于yyp(yyp會使用寄存器,而:t.則不會)
:t$ 把當前行復制到文本結尾
:6t0 把第6行復制到文件開頭

合并命令行指令:
可將 :write 與 :!ruby % 合并為 :write | !ruby %

運行shell命令
給命令加一個嘆號前綴,就可以調用外部程序
:!ls
在vim的命令行中,%代表當前文件名

把緩沖區內容作為標準輸入或輸出

:read !{cmd}將命令的標準輸出重定向到緩沖區
:write !{cmd}將緩沖區內容作為指定{cmd}的標準輸入

緩沖區操作
:ls 緩沖區列表
:bnext
:bprev
:bfirst
:blast
:bdelete n1 n2 n3
:N,M bdelete
通過緩沖區編號刪除相應的緩沖區

窗口操作
:close 關閉活動窗口
:only 關閉除活動窗口外的其他所有窗口

更好更快地移動

基于單詞的移動

w 正向移動到下一單詞的開頭
b 反向移動到當前單詞/上一單詞的開頭
e 正向移動到當前單詞/下一單詞的結尾
ge 反向移動到上一單詞的結尾
每個面向單詞的動作命令,都有一個面向字串的命令與其對應,如 w 與 W, e 與 E

區分屏幕行與實際行
j k ^ $ 實際行
gj gk g^ g$ 屏幕行

f{char} 除了定位之外,還可以直接與動作命令結合在一起。如:dfa 從當前位置刪除到下一個a的位置

f{char} 正向移動到下一個{char}所在之處
F{char} 反向移動到上一個{char}所在之處
t{char} 正向移動到下一個{char}所在之處的前一個字符上
T{char} 反向移動到上一個{char}所在這處的后一個字符上
; 重復上次的字符查找命令
, 反轉方向查找上次的字符查找命令

通常,在行內快速移動光標時,傾向于用f{char}和F{char}; 當與d{motion}或c{motion}一起使用時,更傾向于使用t{char}及T{char}

查找命令可以與動作命令結合
This phrase gets to the point.
d/ge<CR> 從當前位置刪除到ge處

用精確的文本對象選擇選區

文本對象就是基于結構定義的文本區域

var tpl = [
'<a href="{url}">{title}</a>'
]

光標定位到url中
vi}
a"
i>
it
at
a]
在可視模式下觀察這些文本對象選區的變化

vim的文本對象由兩個字符組成,第一個字符永遠是i或是a
i 選擇分隔符內部的文本
a 選擇包括分隔符在內的整個文本

vim的文本對象分為兩類:
一類是操作分隔符的文本對象,如 i) i" it
另一類是操作文本塊,如單詞,句子和段落
iw aw 當前單詞
iW aW 當前字串
is as 當前句子
ip ap 當前段落

設置位置標記

m{a-zA-Z}會用選定的字母標記當前光標所在位置
小寫位置標記只在每個緩沖區局部可見
大寫位置標記則全局可見
~{mark}跳轉到標記位置

% 在匹配括號間跳轉

surround插件的使用
New York 加上雙引號
"New York"
可視模式選中內容后(vee),執行 S"
將 "New York" 修改為 [New York]
光標進入文本中,執行 cs"]

在文件間跳轉

任何改變當前窗口中活動文件的命令,都可以被稱為跳轉命令,vim會把執行跳轉命令之前和之后的光標位置,記錄到跳轉列表中
面向句子的動作及面向段落的動作都算跳轉,但面向字符及面向單詞的動作則不算。
大范圍的動作命令可能會被當作跳轉,但小范圍的動作命令只能算移動

'. 總是指向上次修改的位置
gi 回到上次退出插入模式的地方并進入插入模式(只在本緩沖區內)

xp 調換光標之后的兩個字符

vim的刪除、復制與粘貼命令都會用到眾多寄存器中的某一個,通過給命令加"{register}前綴的方式指定要用的寄存器。若不指明,vim將默認使用無名寄存器
"ayiw
"bdd

0 復制專用寄存器,即僅當使用y{motion}命令時才會被賦值
yiw
jww
diw
"0p
盡管diw仍會覆蓋無名寄存器,但不會波及復制專用寄存器
:reg 查看所有寄存器內容

黑洞寄存器:用下劃線引用 "_d{motion}將刪除文本且不保存任何副本

只讀寄存器
"% 當前文件名
"# 輪換文件名
". 上次插入的文本
": 上次執行的Ex命令
"/ 上次查找的模式

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 命令歷史 以:和/開頭的命令都有歷史紀錄,可以首先鍵入:或/然后按上下箭頭來選擇某個歷史命令。 啟動vim 在命令...
    im螞蟻閱讀 30,804評論 3 48
  • dpkg 學習 安裝mysql apt-get install mysql-server-5.6 apt-get ...
    sharonji閱讀 448評論 0 0
  • Vim幾句話介紹Vim是Unix系統上的文本編輯軟件(你該不會不知道什么是文本編輯軟件吧!),在windows上也...
    何必遠方閱讀 3,189評論 0 3
  • 時光是一條河,在涉水過河時我遇見你,過河之后就成了陌人,南轅北轍。 我們都是喜歡看憂傷的文字,喜歡在朦...
    湖泊上的鹿影閱讀 121評論 0 0
  • 一、學經匯報: 學經日期:2017年4月10日 星期一 晴 寶貝年齡:8歲 學經周期:3年 學經人員:茹茹 茹爸...
    悅2017137閱讀 416評論 0 2