vi 使用整理


一.假设你已开始喜欢vi了...

二. 开启档案, 关闭档案
vi 檔名  开启档案
: 进入命令列的方法
q 离开 (命令列)
wq 存盘然后离开 (命令列)
q! 放弃存盘, 强迫离开 (命令列)
ZZ 存盘然后离开 (不在命令列使用)
:e 檔名 在 Vi 中开启档案
三. Vi 的操作模式:
Vi 有二种主要的操作模式, ESC 键为单向的切换键(由本文输入模式回到编辑命令模式)
编辑命令模式 : 要 vi 做一些特定目的的动作. 如插入,附加,取代,修改,删除,移动光标,搜寻等等. 若是存盘等动作, 则需在命令列中下达, 欲切换至命令列, 需先按 :
本文输入模式 : 在此模式下, 任何字符, 皆被视为输入的数据. 
一开始进入 Vi 之后, 即进入编辑命令模式, 你输入的每一个字符, 皆被预视为一个指令. 有效的指令会被接受, 若是无效的指令, 会产生 beep beep 声, 以示警告.
若想做输入的动作, 必须切换为本文输入模式, 切换的方法, 只要单按一个特殊意义的字符键即可, 如下所示:
按 i 或 I 插入状态
按 a 或 A 附加状态
按 R 取代状态R 会进行连续字符取代
按 s 或 S 删除一个字符;删除光标所在那一列
按 cw, c2b, c$, c0 修改状态
按 o 或 O 新增空白列
你不必一下子全用上, 只要会 i, a, o 这个三个模式即可胜任愉快, 因为大部份时候, 你也只用这三个.
OK, 现在你可以试着在本文输入模式下, 键入一些资料看看. 然后, 按 ESC 切换回编辑命令模式.
四. 移动光标:
Vi 为了适用于各种不同的终端机模式, 因此以字键的方式来操控光标.
k j h l 上 下 左 右
Enter 换列
w b 往前一个 word ; 倒退一个 word
0 $ 至该列开头 ; 至该列尾端
+ - 往下一列; 往上一列
请记住一个要诀: 
在 Vi 中, 大部份的命令都可以在其前面加上数字, 该数字表示重复该命令的次数.
例如: 8l 表示往右移动 8 个字符, 3w 表示往前移动三个 word, 2b 表示倒退 2 个 word
注: word 的定义, 连续英数字元形成一个 word, 而其它特殊符号则每一个字符便是一个 word(除非连续特殊字符), 例如: --classify 中含有 2 个 word, 一个是 -- ; 一个是 classify
而 -x, 则有 3 个 word.
在特殊的终端机模式下, 方向键也是可以使用的. 如 linux 或 vt100. 
其实大部份时候, 你仍可以保有使用方向键的习惯. 但大概只有 local 下才能使用 PgUp , PgDn, End, Home 等键喔!
不过, 若你所使用的终端机模式不支持方向键, 那么上表中的按键, 就相当重要了.
五. 卷页:
^f 往下一页 (forward)
^b 往上一页 (before)
^d 往下半个屏幕(down)
^u 往上半个屏幕(up)
六. 跳列:
你可以指定跳至某一列位置. 跳动之前, 先查看一下目前所在列数是多少.
^g 可以显示目前的位置, 如: "ls.txt" line 53 of 264 --20%-- col 16-23 
上面表示, 目前是在第 53 列, 全部共有 264 列, 占该档百分之20的位置, 目前的光标, 实际是在第23行, 但只算成第16行, 因为中间有使用 tab 键.
80G 或 80gg 跳至第 80 列
G 跳至文件尾
gg 跳至文件头
七. 删除: (但不会进入本文输入模式)
x 删除一个字符
dd 删除一行
r 取代一个字符
以上皆针对光标目前的所在位置产生作用. 
还有 dw, db, de, d0, d$ 等命令, 但你不须一下子全用上. 上表中这三个够用了.
记住一个要诀: Vi 的命令繁多, 但你真正用上手的不必多, 而且这些也就够了.
八. undo (回复动作):
若你对上一个动作反悔了, 可以使用 undo 的功能:

u 取消上一个动作所产生的改变

U 取消光标所在那一列所有的改变
:e! 取消所有的改变, 回复至未修改之前
九. 关键词搜寻/取代:
/ 关键词 往下搜寻关键词
? 关键词 往上搜寻关键词
n 重复搜寻命令(不管往下或往上)
N 和 n 相反方向
cw字符串 以该字符串取代原有的关键词
n. 继续取代该字符串的动作
%s/目标/取代/g 将目标字符串全换成取代字符串
十. 选取、复制与搬移:
Y 或 yy 选取光标所在那一列
5Y 或 5yy 选取光标列所在共5列(5 只是一个例子, 可改用其它数字)
p 将选取的内容, 复制至光标之后
P 将选取的内容, 复制至光标之前
cw, x, dd 等删除命令 会将被删除的内容放入 buffer 中, 配合 p 或 P 即可做出搬移的效果.
十一. 暂时跳出 Vi:
在编辑过程中, 你可能想要执行其它命令, 方法如下:
:! 命令 执行该令命
:sh 暂时跳出 Vi, 欲回 Vi 按 ^d 或 exit

vI技巧:
shift + a移到本行尾并编辑
gg跳到文首
G跳到文尾
0跳到行首
$跳到行尾
w跳到下一个word
ndw 或 ndW 删除光标处开始及其后的 n-1 个字符。 
d0 删至行首。 
d$ 删至行尾。 
ndd 删除当前行及其后 n-1 行。 
x 或 X 删除一个字符。 
Ctrl+u 删除输入方式下所输入的文本。 
^R 恢复u的操作 
J 把下一行合并到当前行尾 
V 选择一行 
^V 按下^V后即可进行矩形的选择了 
aw 选择单词 
iw 内部单词(无空格) 
as 选择句子 
is 选择句子(无空格) 
ap 选择段落 
ip 选择段落(无空格) 
D 删除到行尾 
x,y 删除与复制包含高亮区 
dl 删除当前字符(与x命令功能相同) 
d0 删除到某一行的开始位置 
d^ 删除到某一行的第一个字符位置(不包括空格或TAB字符) 
dw 删除到某个单词的结尾位置 
d3w 删除到第三个单词的结尾位置 
db 删除到某个单词的开始位置 
dW 删除到某个以空格作为分隔符的单词的结尾位置 
dB 删除到某个以空格作为分隔符的单词的开始位置 
d7B 删除到前面7个以空格作为分隔符的单词的开始位置 
d) 删除到某个语句的结尾位置 
d4) 删除到第四个语句的结尾位置 
d( 删除到某个语句的开始位置 
d) 删除到某个段落的结尾位置 
d{ 删除到某个段落的开始位置 
d7{ 删除到当前段落起始位置之前的第7个段落位置 
dd 删除当前行 
d/text 删除从文本中出现“text”中所指定字样的位置, 
一直向前直到下一个该字样所出现的位置(但不包括该字样)之间的内容 
dfc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括该字符)之间的内容 
dtc 删除当前行直到下一个字符“c”所出现位置之间的内容 
D 删除到某一行的结尾 
d$ 删除到某一行的结尾 
5dd 删除从当前行所开始的5行内容 
dL 删除直到屏幕上最后一行的内容 
dH 删除直到屏幕上第一行的内容 
dG 删除直到工作缓存区结尾的内容 
d1G 删除直到工作缓存区开始的内容  


/ 查找
n 查找下一个

N 查找上一个

set number 显示行号
set mouse=a 显示鼠标
set ts=4 设置tablespace是4个字符,默认为8个
set autoindent 可以自动缩进

" 搜索

/joe/e : 设置光标到匹配"joe"的末尾

/joe/e+1 : 设置光标到匹配"joe"的末尾再后移一位

/joe/s-2 : 设置光标到匹配"joe“的开头再前移两位

/^joe.*fred.*bill/ : 匹配以'j'开头且"joe"到"fred"到"bill"之间至少有一个字符

/^[A-J]\+/ : 搜索'A'到’J‘重复两次以上的开头行

/begin\_.*end : 多行匹配

/fred\_s*joe/i : 可以是任何空白字符包括\n,\t等等

/fred\|joe : 搜索fred或者joe

/.*fred\&.*joe : 搜索同时包括fred跟joe的行

/\<fred\>/i : 搜索独立的单词fred

/\<\d\d\d\d\> : 搜索独立的4位数字

/\D\d\d\d\d\D : 搜索6位字符串中间4位数字前后两位不能为数字

/\<\d\{4}\> : 同/\<\d\d\d\d\>

" 查找空行

/^\n\{3} : 匹配三连续的空行

" 使用正则表达式组查找

/\(fred\).*\(joe\).*\2.*\1

" 正则表达式重复

/^\([^,]*,\)\{8}

" visual searching

:vmap // y/<C-R>"<CR> : visually模式下的键盘映射,把//映射成匹配当前选中的文本

:vmap <silent> // y/<C-R>=escape(@", '\\/.*$^~[]')<CR><CR> : 包括空白字符

" \zs 和 \ze 匹配原 :h /\zs

/<\zs[^>]*\ze> : 匹配尖括号中的内容

" 零宽度匹配 :h /\@=

/<\@<=[^>]*>\@= : search for tag contents, ignoring chevrons

/<\@<=\_[^>]*>\@= : search for tags across possible multiple lines

" 多行查找 \_ 的意思是包括换行符

/<!--\_p\{-}--> : 匹配<!--开始到-->结尾的所有内容

/fred\_s*joe/i : 匹配fred开始到joe,之间一定得是空白字符

/bugs\(\_.\)*bunny : 匹配所有bugs到bunny的字符串

:h \_ : help

" 查找函数声明,nmap为normal模式下的键盘映射

:nmap gx yiw/^\(sub\<bar>function\)\s\+<C-R>"<CR>

" 查找多个文件

:bufdo /searchstr/ : 在多个文件缓冲区里执行查找

" 更好的多文件查找定位方法

:bufdo %s/searchstr/&/gic : 在多个文件缓冲区里查找,按下n停止

" 怎样不使用 / 来查找网址

?http://www.vim.org/ : 向后查找

" 查找指定字符以外的字符串

/\c\v([^aeiou]&\a){4} : 查找4个辅音字母

----------------------------------------

#替换

:%s/fred/joe/igc : 普通替换命令

:%s/\r//g : 删除 DOS 的换行符 ^M

" 你的文本文件是否乱七八糟的排成一行?使用如下命令

:%s/\r/\r/g : 转换 DOS 回车符 ^M 为真正的回车符

:%s= *$== : 删除行尾空白

:%s= \+$== : 同上

:%s#\s*\r\?$## : 删除尾部空白和dos换行符

:%s#\s*\r*$## : 同上

" 删除空行

:%s/^\n\{3}// : 删除连续3个空行

:%s/^\n\+/\r/ : 压缩空行,多个替换为一个

%s#<[^>]\+>##g : 删除html的tag部分

" IF YOU ONLY WANT TO KNOW ONE THING

:'a,'bg/fred/s/dick/joe/igc : 非常有用

# 译释:''a,''b指定一个范围:mark a ~ mark b

# g//用一个正则表达式指出了进行操作的行必须可以被fred匹配

# 看后面,g//是一个全局显示命令

# s/dick/joe/igc则对于这些满足条件的行进行替换

" 复制列

:%s= [^ ]\+$=&&= : 复制最后一列

:%s= \f\+$=&&= : 一样

:%s= \S\+$=&& : 晕,还一样!

" 记忆(反向引用)

:s/\(.*\):\(.*\)/\2 : \1/ : 将两个字段颠倒

:%s/^\(.*\)\n\1$/\1/ : 删除重复行

" 非贪婪匹配 \{-}

:%s/^.\{-}pdf/new.pdf/ : 删除第一个pdf

" use of optional atom \?

:%s#\<[zy]\?tbl_[a-z_]\+\>#\L&#gc : lowercase with optional leading characters

" 跨越尽量多的行

:%s/<!--\_.\{-}-->// : 删除多行注释

:help /\{-} : 查看非贪婪匹配的更多帮助

" 使用寄存器替换

:s/fred/<c-r>a/g : 将fred替换为寄存器a里的内容

:s/fred/<c-r>asome_text<c-r>s/g

:s/fred/\=@a/g : better alternative as register not displayed

" 在一行里写多种命令

:%s/\f\+\.gif\>/\r&\r/g | v/\.gif$/d | %s/gif/jpg/

:%s/a/but/gie|:update|:next : 当使用 @: 来重复

" 或运算

:%s/suck\|buck/loopy/gc : 替换suck或者buck(这里|不是管道)

" 调用vim函数

:s/__date__/\=strftime("%c")/ : 将__date__替换成当前日期,使用strftime函数

" 处理列,替换所有在第三列中的str1

:%s:\(\(\w\+\s\+\)\{2}\)str1:\1str2:

" 交换第一列跟第四列

:%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1:

" 过滤form中的内容放在寄存器里

:redir @*|sil exec 'g#<\(input\|select\|textarea\|/\=form\)\>#p'|redir END

:nmap ,z :redir @*<Bar>sil exec 'g@<\(input\<Bar>select\<Bar>textarea\<Bar>

/\=form\)\>@p'<Bar>redir END<CR>

" 两位以上的数字减三(带进位。这个命令挺有趣)

:%s/\d\+/\=(submatch(0)-3)/

" 包含loc或者functions的行中的数字加6

:g/loc\|function/s/\d/\=submatch(0)+6/

" 比上面更好的方法

:%s#txtdev\zs\d#\=submatch(0)+1#g

:h /\zs 查看帮助

" 前缀为gg的数字加6

:%s/\(gg\)\@<=\d\+/\=submatch(0)+6/

:h zero-width 查看帮助

" 替换一个特定字符串为数字

:let i=10 | 'a,'bg/Abc/s/yy/\=i/ |let i=i+1 # 将yy转换成10,11,12等等

" 比上面的更精确

:let i=10 | 'a,'bg/Abc/s/xx\zsyy\ze/\=i/ |let i=i+1 # 将xxyy 转换成 xx11,xx12,

xx13

" find replacement text, put in memory, then use \zs to simplify substitute

:%s/"\([^.]\+\).*\zsxx/\1/

" Pull word under cursor into LHS of a substitute

:nmap <leader>z :%s#\<<c-r>=expand("<cword>")<cr>\>#

" Pull Visually Highlighted text into LHS of a substitute

:vmap <leader>z :<C-U>%s/\<<c-r>*\>/

----------------------------------------

" all following performing similar task, substitute within substitution

" Multiple single character substitution in a portion of line only

:%s,\(all/.*\)\@<=/,_,g : replace all / with _ AFTER "all/"

" Same thing

:s#all/\zs.*#\=substitute(submatch(0), '/', '_', 'g')#

" Substitute by splitting line, then re-joining

:s#all/#&^M#|s#/#_#g|-j!

" Substitute inside substitute

:%s/.*/\='cp '.submatch(0).' all/'.substitute(submatch(0),'/','_','g')/

----------------------------------------

" 全局显示命令

:g/gladiolli/# : 查找并显示匹配的行号

:g/fred.*joe.*dick/ : 显示所有含有 fred,joe & dick的行

:g/\<fred\>/ : 显示单一单词fred

:g/^\s*$/d : 删除所有空行

:g!/^dd/d : 删除不含字符串''dd''的行

:v/^dd/d : 同上

:g/fred/,/joe/d : 删除所有的从fred到joe

:g/-------/.-10,.d : 以-------为标记删除之前的10行

:g/{/ ,/}/- s/\n\+/\r/g : 删除 {...}之间的空行

:v/\S/d : Delete empty lines (both types)

:v/./,/./-j : 压缩空行

:g/^$/,/./-j : 同上

:g/<input\|<form/p : 或运算

:g/^/put_ : 双倍行宽 (pu = put)

:g/^/m0 : 颠倒文件 (m = move)

:'a,'bg/^/m'b : 颠倒选中的 a 到 b

:g/^/t. : 重复行

:g/fred/t$ : 拷贝行从fred到结尾

:g/stage/t'a : 拷贝行从stage 到 marker a(a为标记的位置)

:g/\(^I[^^I]*\)\{80}/d : 删除最少包含80个tab的行

" perform a substitute on every other line

:g/^/ if line('.')%2|s/^/zz /

" match all lines containing "somestr" between markers a & b

" copy after line containing "otherstr"

:'a,'bg/somestr/co/otherstr/ : co(py) or mo(ve)

" as above but also do a substitution

:'a,'bg/str1/s/str1/&&&/|mo/str2/

:%norm jdd : 隔行删除

" 增加数字 (键入 <c-a>)

:.,$g/^\d/exe "norm! \<c-a>": 增加从当前行首到结尾的数字

:'a,'bg/\d\+/norm! ^A : 增加数字

" 保存全局命令的结果 (注意必须使用添加模式) 你需要使用 qaq 清空寄存器a.

"save results to a register/paste buffer 存储结果到 寄存器/粘贴 到 a

:g/fred/y A : 添加配备行到寄存器到 a

:g/fred/y A | :let @*=@a : 放入复制缓冲区

:let @a=''|g/Barratt/y A |:let @*=@a

:'a,'b g/^Error/ . w >> errors.txt

" 复制每一行,然后在复制出来的每一行两侧加上一个 print '复制出来的内容'

:g/./yank|put|-1s/'/"/g|s/.*/Print '&'/

" 用文件中的内容替换字符串,-d 表示删除“标记”

:g/^MARK$/r tmp.ex | -d

" display prettily

:g/<pattern>/z#.5 : display with context

:g/<pattern>/z#.5|echo "==========" : display beautifully

" Combining g// with normal mode commands

:g/|/norm 2f|r* : replace 2nd | with a star

"send output of previous global command to a new window

:nmap <F3> :redir @a<CR>:g//<CR>:redir END<CR>:new<CR>:put! a<CR><CR>

----------------------------------------

" 全局命令和替换命令联姻 (强大的编辑能力)

:'a,'bg/fred/s/joe/susan/gic : 可以使用反向引用来匹配

:g/fred/,/joe/s/fred/joe/gic : non-line based (ultra)

----------------------------------------

" 先找fred,然后找joe

:/fred/;/joe/-2,/sid/+3s/sally/alley/gIC

----------------------------------------

" create a new file for each line of file eg 1.txt,2.txt,3,txt etc

:g/^/exe ".w ".line(".").".txt"

----------------------------------------

" Absolutely essential

----------------------------------------

* # g* g# : 查找当前光标下的单词(单个单词) (<cword>) (向前/向后)

% : 匹配括号 {}[]()

. : 重复上次操作

@: : 重复上次的命令

matchit.vim : 适%能匹配 <script> <?php等标记

<C-N><C-P> : 插入模式下自动完成填词

<C-X><C-L> : 行自动完成(超级有用)

/<C-R><C-W> : 把单个<cword>单词放入搜索或者命令行

/<C-R><C-A> : 把字符串中有的单词<CWORD>放入搜索或者命令行

:set ignorecase : 忽略大小写

:syntax on : 打开语法高亮 Perl,HTML,PHP 等等

:h regexp<C-D> : 按ctrl+d得到包含regexp的列表

(按tab自动不齐)

----------------------------------------

" 简单编辑更新 _vimrc文件

:nmap ,s :source $VIM/_vimrc :普通模式下的键盘映射 ,s映射成加载用户目录下的

_vimrc文件

:nmap ,v :e $VIM/_vimrc :,v映射成打开_vimrc文件

----------------------------------------

#VISUAL 模式 (方便增加 HTML 标签)

:vmap sb "zdi<C-R>z<ESC> : 在 VISUALLY模式下将选中的文本前后分别加上

:vmap st "zdi<?= <C-R>z ?><ESC> : 加上 <?= ?>

----------------------------------------

" 浏览

:Exp(lore) : 浏览文件

:Sex(plore) : 分割窗口浏览文件

:ls : 显示缓冲区

:cd .. : 设置当前目录位置

:args : 查看当前打开的所有文件

:lcd %:p:h : 改变路径到当前编辑的文件

:autocmd BufEnter * lcd %:p:h : 放入.vimrc自动完成上面的命令

----------------------------------------

" 缓冲区浏览(一直排名前10的vim脚本)

" 需要 bufexplorer.vim http://www.vim.org/script.php?script_id=42

\be : 缓冲浏览器中查看缓冲列表

\bs : 同上,但是分割窗口

----------------------------------------

" 转换大小写

guu : 将正行的字母转换成小写

gUU : 将正行的字母转换成大写

Vu : 转换选中的行(小写)

VU : 转换选中的行(大写)

g~~ : 反向转换

vEU : 转换词大写

vE~ : 反向转换词

ggguG : 将当前编辑文件内容全部转换成小写

" Visually 模式下选择所有的字母及数字 (放入 .vimrc文件中)

vmap ,c :s/\<\(.\)\(\k*\)\>/\u\1\L\2/g<CR>

" 大写所有句子的第一个字母

:%s/[.!?]\_s\+\a/\U&\E/g

----------------------------------------

gf : 打开当前光标下或后的文件

:nnoremap gF :view <cfile><cr> : 打开当前光标下或后的文件, 如果不存在则创建

ga : 显示当前光标下单个字的ascii,十进制,十六进制……

ggVGg? : 将整个文件用rot13编码……(谁看得懂啊~~hoho)

ggg?G : 同上 (针对大文件)

:8 | normal VGg? : 将第八行用rot13编码

:normal 10GVGg? : 同上

<C-A>,<C-X> : 增加,减少当前光标下的数字

win32 用户需要重定义 CNTRL-A

<C-R>=5*5 : 插入25 (小型计算器)

----------------------------------------

" 几个彩蛋……

:h 42 : also http://www.google.com/search?q=42

:h holy-grail

:h!

----------------------------------------

" 标记 & 移动

'. : 跳回最后编辑的行 (超有用)

`. : 同上,但是定位编辑点

g; : 跳转到比较旧的编辑位置(如果有的话) (vim6.3后的新功能)

g, : 这个是较心的位置 (同上)

:changes :打出改变表

:h changelist : 查看“改变表跳转”的帮助

<C-O> : 依次沿着你的跳转记录向回跳 (从最近的一次开始)

<C-I> : 依次沿着你的跳转记录向前跳

:ju(mps) : 列出跳转轨迹

:help jump-motions

:history : 列出历史记录

:his c : 命令行历史

:his s : 搜索历史

q/ : 搜索命令历史的窗口

q: : 命令行命令历史的窗口

:<C-F> : 历史窗口

----------------------------------------

" 缩写 & 映射

:map <f7> :'a,'bw! c:/aaa/x

:map <f8> :r c:/aaa/x

:map <f11> :.w! c:/aaa/xr<CR>

:map <f12> :r c:/aaa/xr<CR>

:ab php : 查看以php开头的缩写

:map , : 列出所有的映射(以逗号开始的)

" 允许映射 F10 (win32)

set wak=no : :h winaltkeys

" 映射中常使用的表示

<CR> : 回车

<ESC> : Esc

<LEADER> : 右斜杠

<BAR> : 管道符号

<BACKSPACE> : 退格键

<SILENT> : 不回显

#显示自定义的 RGB 颜色显示当前光标下的字符串 例如 #445588

:nmap <leader>c :hi Normal guibg=#<c-r>=expand("<cword>")<cr><cr>

map <f2> /price only\\|versus/ :in a map need to backslash the \

----------------------------------------

" Simple PHP debugging display all variables yanked into register a

" 简单的 PHP 调试将所有显示的变量放入寄存器a

iab phpdb exit("<hr>Debug <C-R>a ");

----------------------------------------

" 使用寄存器来映射 (放入 .vimrc文件自动加载)

:let @m=":'a,'bs/"

:let @s=":%!sort -u"

----------------------------------------

" 列出寄存器

:reg : 显示当前所有的寄存器

:reg a : 显示寄存器a中的内容

"1p.... : 引用一个叫1的寄存器

:let @y='yy@"' : pre-loading registers (put in .vimrc)

qqq : 清空寄存器 "q"

----------------------------------------

" 一些有用的决窍

"ayy@a : 把当前行作为命令执行

yy@" : 上面的匿名寄存器

u@. : 只执行键入的命令

----------------------------------------

" 从其它命令处获得输入(需要外部命令)

:r!ls.exe : 从ls 获得输入插入到当前位置

!!date : 从date获得输入(删除当前行)

" 使用外部sort排序

:%!sort -u : 用sort排序整个文件(结果覆盖整个文件)

:'a,'b!sort -u : 从mark a到mark b之间的内容进行排序

!1} sort -u : 排序一个段落

:g/^$/;,/^$/-1!sort : Sort each block (note the crucial ;)

----------------------------------------

" 多文件管理 (基本的)

:bn : 跳转到下一个buffer

:bp : 跳转到前一个buffer

:wn : 保存当前buffer并跳转到下一个buffer (超有用)

:wp : 保存当前buffer并跳转到前一个buffer

:bd : 把当前文件从buffer移出 (超有用)

:bun : 卸载当前buffer (关闭这个窗口但是不移出)

:badd file.c : 添加file.c到buffer列表

:b 3 : 前往第三个 buffer

:b main : 前往含有main的buffer中 比如说 main.c

:sav php.html : 把当前文件存为php.html并打开

:sav! %<.bak : 换一个后缀名保存 (旧方法)

:sav! %:r.cfm : 同上

:sav %:s/fred/joe/ : 替换文件名

:sav %:s/fred/joe/:r.bak2 : 替换文件和后缀

:!mv % %:r.bak : 重命名当前文件

:e! : 打开未修改之前的文件

:w c:/aaa/% : 存储文件到指定位置

:e # : 编辑标记为#的文件在buffer中

:rew : 返回到第一个可编辑的文件

:brew : 回到第一个buffer

:sp fred.txt : 分割窗口打开fred.txt

:sball,:sb : 把所有的 buffers分割显示在一个窗口中 (超有用)

:scrollbind : in each split window

:map <F5> :ls<CR>:e # : 按F5显示所有buffer, 并显示行号

:set hidden : 允许不保存当前buffer而进行切换

----------------------------------------

" 在分割窗口中快速切换

map <C-J> <C-W>j<C-W>_

map <C-K> <C-W>k<C-W>_

----------------------------------------

" 录制命令 (最好的技巧)

qq # 录制命令放入 q寄存器

输入一些命令

q # 录制结束

@q :执行放入寄存器q中的内容

@@ :重复

5@@ :重复5次

" 编辑一个 寄存器/录制

"qp :显示寄存器q中的内容(普通模式下)

<ctrl-R>q :显示寄存器q中的内容 (插入模式下)

" 你现在可以看到记录内容,随便编辑

"qdd :删除,重新存入q

@q :执行 录制/寄存器 q

" 在可视块中运行记录

1) 定义记录/寄存器

qq:s/ to/ from/g^Mq

2) 定义可视块

V}

3) 键入 : 将显示下面信息

:'<,'>

4)完成如下操作

:'<,'>norm @q

----------------------------------------

"combining a recording with a map (to end up in command mode)

nnoremap ] @q:w!<bar>bd

----------------------------------------

" 可视化模式提供一种灵活易用的方法选择一块文本供操作符使用

" 记出

v : 进入可视化模式

V : 进入可视化行选择模式

<C-V> : 进入可视化块选择模式

gv : 重新选择

o : 选择的区域头尾移动

"*y : 复制选择区域到paste buffer

V% : 选择一个匹配段

V}J : 合并一个段落

V}gJ : 合并一个段落,并保留空格

----------------------------------------

" 删除选中的10行的前两个字符(不过这里应该假设是紧凑的排版格式,不能包含空格、

tab等字符的,可是经实验应该是钱3个字符才对啊??)

0<c-v>10j2ld

----------------------------------------

" 如何用可视块拷贝几列

" 可视块(并非通常的 v 命令)

<C-V>,然后通过移动命令选择列 (win32 <C-Q>)

然后执行 c,d,y,r 等命令

----------------------------------------

" how to overwrite a visual-block of text with another such block

Pick the first block: ctrl-v move "ay

Pick the second block: ctrl-v move c ctrl-o "aP <esc>

----------------------------------------

" _vimrc 基本设置

:set incsearch : 输入搜索命令时,立即显示目前输入的模式对应的匹配。匹配的字符串

被高亮。

:set wildignore=*.o,*.obj,*.bak,*.exe : tab补全时忽略这些忽略这些

:set shiftwidth=3 : 设置自动缩进为3个字符

:set vb t_vb=". : 安静模式,关闭响铃跟闪烁

:set browsedir=buffer : 设置文件浏览使用的目录

“注:

”last 使用文件浏览器最近访问相同的目录。

“buffer 使用相关缓冲区的目录。

”current 使用当前目录。

“{path} 使用指定目录。

----------------------------------------

" 启动windows中的IE

:nmap ,f :update<CR>:silent !start c:\progra~1\intern~1\iexplore.exe

file://%:p<CR>

:nmap ,i :update<CR>: !start c:\progra~1\intern~1\iexplore.exe <cWORD><CR>

----------------------------------------

" 在vim里打开ftp

cmap ,r :Nread ftp://209.51.134.122/public_html/index.html

cmap ,w :Nwrite ftp://209.51.134.122/public_html/index.html

gvim ftp://www.somedomain.com/index.html # 使用 netrw.vim

----------------------------------------

" 向寄存器中添加内容 (使用相应寄存器名称的大写)

" 复制5行放入a寄存器,然后向下跳转10行再复制5行

"a5yy

10j

"A5yy

----------------------------------------

[I : 显示当前行中字符的所有匹配(超级有用)

----------------------------------------

" 常规缩进

:'a,'b>> :将mark a到mark b之间的内容进行两次缩进

" 虚拟模式下缩进 (可重复)

:vnoremap < <gv

”这是一个虚拟模式下的键盘映射 < 映射为<gv

"< 意为向内缩进,gv 上面已有解释,为重复上次选区

“<gv 也就是先向内缩进然后再选择刚才的选区

“这样就可以只按 < 实现重复缩进了

:vnoremap > >gv :向内缩进,原理同上

" 块缩进

>i{

>a{

" also

>% and <%

”自己试试看吧,涉及到用 { 的语言很有用,比如c,c++等

----------------------------------------

" 重定向 & 粘贴到寄存器 * (*为寄存器名称)

:redir @* : 重定向命令到paste缓冲区

:redir END : 结束

:redir >> out.txt : 重定向到文件

" 操作粘贴缓冲区

"*yy : 复制到寄存器

"*p : 从寄存器中粘贴一行

" 复制到粘贴缓冲区 (扩展模式)

:'a,'by* : 复制一个范围到粘贴寄存器

:%y* : 复制一个括号匹配到粘贴缓冲区

:.y* : 复制当前行到粘贴缓冲区

" 从剪贴板上过滤非可打印字符

" 当从一些 GUI 程序粘贴时会有用处

:nmap <leader>p :let @* = substitute(@*,'[^[:print:]]','','g')<cr>"*p

----------------------------------------

" 重新格式化文本

gq} : 合并一个段落

gqap : 当前段落

ggVGgq : 全部段落

Vgq : 当前行

" 在70列的时候换行

:s/.\{,69\};\s*\|.\{,69\}\s\+/&\r/g

----------------------------------------

" 命令使用于多个文件

:argdo %s/foo/bar/e : 在所有文件上操做 :args

:bufdo %s/foo/bar/e

:windo %s/foo/bar/e

:argdo exe '%!sort'|w! : 包含外部命令

----------------------------------------

" 命令行技巧

gvim -h : 显示帮助

ls | gvim - : 管道操作

cat xx | gvim - -c "v/^\d\d\|^[3-9]/d " : 从管道出过滤内容

gvim -o file1 file2 : 分割窗口显示两个文件

" 打开文件后执行一条命令

gvim.exe -c "/main" joe.c : 打开 joe.c & 跳转到 "main"

" 在打开一个文件时执行多条命令

vim -c "%s/ABC/DEF/ge | update" file1.c

" 在一组文件上执行多条命令

vim -c "argdo %s/ABC/DEF/ge | update" *.c

" 从一系列文件中删除一块区域

vim -c "argdo /begin/+1,/end/-1g/^/d | update" *.c

" 自动编辑文件 (编辑命令序列Ex commands已经包含在convert.vim中了)

vim -s "convert.vim" file.c

#不加载.vimrc跟任何plugin(干净清新的 VIM^_^)

gvim -u NONE -U NONE -N

" Access paste buffer contents (put in a script/batch file)

gvim -c 'normal ggdG"*p' c:/aaa/xp

" 将paste中的内容送往默认的打印机

gvim -c 's/^/\=@*/|hardcopy!|q!'

" gvim 里的 grep (win32 or *nix)

:grep somestring *.php : 创建匹配的文件列表

" 使用 :cn(向后后) :cp(向前) 操纵列表

:h grep :查看帮助

----------------------------------------

" GVIM 的差异比较

gvim -d file1 file2 : vimdiff (比较不差异)

dp : 把光标处的不同放到另一个文件

do : 在光标处从另一个文件取得不同

----------------------------------------

" Vim traps

在正则表达式中 + | ( { 都要加上转义符(反斜杠)

/fred\+/ : 匹配 fred/freddy 但不匹配 free

/\(fred\)\{2,3}/ : note what you have to break

----------------------------------------

" \v ,或叫做very magic (通常都是这么叫)可以取消转义符

/codes\(\n\|\s\)*where : 普通的正则表达式

/\vcodes(\n|\s)*where : very magic

----------------------------------------

" 把对象送到命令行或者搜索行

<C-R><C-W> : 执行当前光标下的单个单词

<C-R><C-A> : 执行当前光标下尽可能多的单词

<C-R>- : 送至一个小型寄存器(同样使用于插入模式)

<C-R>[0-9a-z] : 送至一个命名寄存器 (括弧同上)

<C-R>% : 送至文件名(#也行) (同上)

<C-R>=somevar : 送至一个变量 (例如 :let sray="ray[0-9]")

----------------------------------------

" 控制寄存器

:let @a=@_ : 清除寄存器 a

:let @a="" : 同上 a

:let @*=@a : 拷贝寄存器 a 到 paste buffer

:let @*=@: : 拷贝最后执行的命令到 paste buffer

:let @*=@/ : 拷贝最后执行的查找命令到paste buffer

:let @*=@% : 拷贝当前文件到 paste buffer

 

map <f11> "qyy:let @q=@q."zzz"

----------------------------------------

" 帮助的帮助? (使用 TAB)

:h quickref : VIM 快速参考页

:h tips : Vim'自己的技巧帮助

:h visual<C-D><tab> : 虚拟模式的帮助列表

: 然后使用tab选择它们

:h ctrl<C-D> : 所有关于ctrl键的帮助列表

:helpg uganda : 过滤帮助文件 使用 :cn, :cp 查找下一个及后一个

:h :r : 关于 :ex 的命令帮助

:h CTRL-R : 普通模式相关

:h /\r : \r是什么的意思

:h \\zs : 使用双反斜线查找关于 \zs 的帮助

:h i_CTRL-R : 在插入模式中 <C-R>的解释

:h c_CTRL-R : 在命令模式中 <C-R> 的解释

:h v_CTRL-V : 虚拟模式

:h tutor : VIM 快速指南

<C-[>, <C-T> : Move back & Forth in HELP History

gvim -h : VIM 命令行帮助

----------------------------------------

" 选项设置在那里

:scriptnames : 列出所有已经加载的 plugins, _vimrcs文件

:verbose set history? :显示 history的值并显示在那里定义的

:function : 列出所有函数

:func SearchCompl : 显示指定函数的细节

----------------------------------------

" 制作你自己的VIM 帮助

:helptags /vim/vim64/doc : 重新编译所有 *.txt 的帮助文件在这个目录里

:help add-local-help :如何添加本地帮助

----------------------------------------

" 用外部程序运行文件 (例如 php)

map <f9> :w<CR>:!c:/php/php.exe %<CR>

map <f2> :w<CR>:!perl -c %<CR>

----------------------------------------

" 在另一个buffer中,捕捉当前脚本的输出

:new | r!perl # : 新建一个buffer,从另一个buffer中读入结果

:new! x.out | r!perl # : 同上,并指定一个新文件名

:new+read!ls

----------------------------------------

" create a new buffer, paste a register "q" into it, then sort new buffer

:new +put q|%!sort

----------------------------------------

" 插入DOS换行符

:%s/$/\<C-V><C-M>&/g : (that's what you type

:%s/$/\<C-Q><C-M>&/g : for Win32) 对于Win32应该这样

:%s/$/\^M&/g : 你看到的^M是一个字符

----------------------------------------

" 自动删除行尾 Dos回车符和空格

autocmd BufRead * silent! %s/[\r \t]\+$//

autocmd BufEnter *.php :%s/[ \t\r]\+$//e

----------------------------------------

" 对指定文件或文件类型执行某个动作

autocmd VimEnter c:/intranet/note011.txt normal! ggVGg?

autocmd FileType *.pl exec('set fileformats=unix')

----------------------------------------

" 把最后一个命令贴到当前位置

i<c-r>:

" 把最后一个搜索指令贴到当前位置

i<c-r>/

----------------------------------------

" 更多的完成功能

<C-X><C-F> :插入当前目录下的一个文件名到当前位置

# 在insert模式下使用

# 然后用 Ctrl-P/Ctrl-N 翻页

----------------------------------------

" 替换一个visual区域

" 选择一个区域,然后输入 :s/Emacs/Vim/ 等等,vim会自动进入:模式

:'<,'>s/Emacs/Vim/g : 前面的' '<.'> 是vim自动添加的

gv : 重新选择前一个可视区域 (ULTRA)

----------------------------------------

" 在文件中插入行号

:g/^/exec "s/^/".strpart(line(".")." ", 0, 4)

:%s/^/\=strpart(line(".")." ", 0, 5)

:%s/^/\=line('.'). ' '

----------------------------------------

#用VIM的方式来编号行

:set number : 显示行号

:map <F12> :set number!<CR> : Show linenumbers flip-flop

:%s/^/\=strpart(line('.')." ",0,&ts)

#从任意行开始编号(需要perl)

:'a,'b!perl -pne 'BEGIN{$a=223} substr($_,2,0)=$a++'

#产生数字列表

#Type in number on line say 223 in an empty file

qqmnYP`n^Aq : in recording q repeat with @q

" 递增已存在数字到文件末

:.,$g/^\d/exe "normal! \<c-a>"

" 高级递增,参见:

http://vim.sourceforge.net/tip_view.php?tip_id=150

----------------------------------------

" 高级递增 (真的很有用)

" 把下面几句放到 _vimrc

let g:I=0

function! INC(increment)

let g:I =g:I + a:increment

return g:I

endfunction

" 例如从mark a 到mark b 递增,从223开始,步长为5

:let I=223

:'a,'bs/^/\=INC(5)/

" create a map for INC

cab viminc :let I=223 \| 'a,'bs/$/\=INC(5)/

----------------------------------------

" 生成从 23-64 的数字列表

o23<ESC>qqYp<C-A>q40@q

----------------------------------------

" 在当前插入模式下编辑/移动 (真得很有用)

<C-U> : 删除全部

<C-W> : 删除最后一个单词

<HOME><END> : 移动到行首/行尾

<C-LEFTARROW><C-RIGHTARROW> : 向前/后移动一个单词

<C-X><C-E>,<C-X><C-Y> : scroll while staying put in insert

----------------------------------------

#加密(小心使用,不要忘了密码)

:X : vim会提示你输入密码

:h :X

----------------------------------------

" 模式行 (使文件只读等),必须在前/后 5行内

// vim:noai:ts=2:sw=4:readonly:

" vim:ft=html: : 使用 HTML 语法高亮

:h modeline

----------------------------------------

" 建立你自己的菜单项

amenu Modeline.Insert\ a\ VIM\ modeline <Esc><Esc>ggOvim:ff=unix ts=4 ss=4<CR>

vim60:fdm=marker<esc>gg

----------------------------------------

" 一个保存当前光标下的狭义字到一个文件的函数

function! SaveWord()

normal yiw

exe ':!echo '.@0.' >> word.txt'

endfunction

map ,p :call SaveWord()

----------------------------------------

" 删除重复行的函数

function! Del()

if getline(".") == getline(line(".") - 1)

norm dd

endif

endfunction

 

:g/^/ call Del() #使用该函数的一个例子

----------------------------------------

" 双字节编码 (non alpha-numerics)

:digraphs : 显示编码表

:h dig : 帮助

i<C-K>e' : 输入 é

i<C-V>233 : 输入 é (Unix)

i<C-Q>233 : 输入 é (Win32)

ga : 查看字符的hex值

#删除非 ascii 字符

:%s/[<C-V>128-<C-V>255]//gi : where you have to type the Control-V

:%s/[?-?]//gi : Should see a black square & a dotted y

:%s/[<C-V>128-<C-V>255<C-V>01-<C-V>31]//gi : All pesky non-asciis

:exec "norm /[\x00-\x1f\x80-\xff]/" : same thing

#Pull a non-ascii character onto search bar

yl/<C-R>" :

/[^a-zA-Z0-9_[:space:][:punct:]] : search for all non-ascii

----------------------------------------

" 文件名自动完成 (例如 main_c.c)

:e main_<tab> : tab 键完成

gf : 打开光标处广义字命名的文件 (normal模式)

main_<C-X><C-F> : 文件名自动完成(insert模式)

----------------------------------------

" Vim复杂使用

" 交换两个单词

:%s/\<\(on\|off\)\>/\=strpart("offon", 3 * ("off" == submatch(0)), 3)/g

" 交换两个单词

:vnoremap <C-X> <Esc>`.``gvP``P

----------------------------------------

" 把text文件转换成html文件(oh,ft)

:runtime! syntax/2html.vim : 转换 txt 成 html

:h 2html

----------------------------------------

" VIM 有一个内部自带的 grep 命令

:grep some_keyword *.c : 得到一个包含some_keyword的c文件名列表

:cn : 去下一个出现的位置

----------------------------------------

" 强制无扩展名的文件的语法着色方式

:set syntax=perl

" 取消语法着色 (很有用)

:set syntax off

" 改变色彩主题 (在~vim/vim??/colors中的任何文件)

:colorscheme blue

" 通过使用模式行强迫使用 HTML 语法高亮

# vim:ft=html:

" 强制自动语法加亮(非标准的文件扩展)

au BufRead,BufNewFile */Content.IE?/* setfiletype html

----------------------------------------

:set noma (non modifiable) : 防止修改

:set ro (Read Only) : 只读保护

----------------------------------------

" 对话 (打开一堆文件)

gvim file1.c file2.c lib/lib.h lib/lib2.h : 在"对话"中加载这些文件

:mksession : 生成一个Session文件 (默认是Session.vim)

:q

gvim -S Session.vim : 重新加载所有文件

----------------------------------------

#标记(tags) (跳转到子程序/函数)

taglist.vim : 很流行的插件

:Tlist : 显示标记 (函数列表)

<C-]> : 跳转到光标处的函数

----------------------------------------

" columnise a csv file for display only as may crop wide columns

:let width = 20

:let fill=' ' | while strlen(fill) < width | let fill=fill.fill | endwhile

:%s/\([^;]*\);\=/\=strpart(submatch(1).fill, 0, width)/ge

:%s/\s\+$//ge

" Highlight a particular csv column (put in .vimrc)

function! CSVH(x)

execute 'match Keyword /^\([^,]*,\)\{'.a:x.'}\zs[^,]*/'

execute 'normal ^'.a:x.'f,'

endfunction

command! -nargs=1 Csv :call CSVH(<args>)

" call with

:Csv 5 : highlight fifth column

----------------------------------------

" 折叠:隐藏某些片断,使查看更容易

zf} : 使用动作命令折叠一个段落

v}zf : 使用可视模式折叠一个段落

zf'a : 折叠到一个标记上

zo : 打开折叠

zc : 重新关闭折叠

----------------------------------------

" 显示"不可见字符"

:set list

:h listchars

----------------------------------------

" 如何在不进入插入模式的情况下粘贴"普通模式的命令"

:norm qqy$jq

----------------------------------------

" 处理文件名

:h filename-modifiers : 帮助

:w % : 写入当前文件

:w %:r.cfm : 改变文件扩展名为 .cfm

:!echo %:p : 显示完整路径和文件名

:!echo %:p:h : 只显示完整路径

:!echo %:t : 只显示文件名

:reg % : 显示文件名

<C-R>% : 插入文件名 (插入模式)

"%p : 插入文件名 (普通模式)

/<C-R>% : 在文本中查找文件名

----------------------------------------

" 删除,但不破坏 buffer 内容

"_d : 你一直想要的东西

"_dw : 例如:删除一个单词 (使用黑洞???)

----------------------------------------

" 送完整的路径名到剪贴板,用于邮件附件等

nnoremap <F2> :let @*=expand("%:p")<cr> :unix

nnoremap <F2> :let @*=substitute(expand("%:p"), "/", "\\", "g")<cr> :win32

----------------------------------------

" 不用离开 Vim 就能修改文件名的简单 shell 脚本

$ vim

:r! ls *.c

:%s/\(.*\).c/mv & \1.bla

:w !sh

:q!

----------------------------------------

" 在一个文本里计算单词数

g<C-G>

----------------------------------------

" 你自己设置高亮显示的例子

:syn match DoubleSpace " "

:hi def DoubleSpace guibg=#e0e0e0

----------------------------------------

" reproduce previous line word by word

imap ] @@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s

nmap ] i@@@<ESC>hhkyWjl?@@@<CR>P/@@@<CR>3s

" 根据文件类型映射快捷键

:autocmd bufenter *.tex map <F1> :!latex %<CR>

:autocmd bufenter *.tex map <F2> :!xdvi -hush %<.dvi&<CR>

----------------------------------------

" 读取 MS-Word 文档,需要 antiword

:autocmd BufReadPre *.doc set ro

:autocmd BufReadPre *.doc set hlsearch!

:autocmd BufReadPost *.doc %!antiword "%"

----------------------------------------

" a folding method

vim: filetype=help foldmethod=marker foldmarker=<<<,>>>

A really big section closed with a tag <<<

--- remember folds can be nested ---

Closing tag >>>

----------------------------------------

" Just Another Vim Hacker JAVH

vim -c ":%s%s*%Cyrnfr)fcbafbe[Oenz(Zbbyranne%|:%s)[[()])-)Ig|norm Vg?"

# 译释:呵呵,谁来解释一下吧!

# 其实不过是在启动vim的时候执行了一个命令

# 先写入了 Just Another Vim Hacker 的rot13编码

# 然后再解码

1、插入文本数据

a                                      在光标当前所在字符位置的后面输入文本数据。

A                                     在光标当前所在行的行尾(也即最后一个字符位置)后面输入文本数据。

i                                       在光标当前所在字符位置的前面输入文本数据。

I                                      在光标当前所在行的行首(也即在第一个非空白的起始字符)前面输入文本数据。

o                                      在光标当前所在行下面的行首位置输入文本数据。

O                                     在光标当前所在行上面的行首位置输入文本数据。

2.     修改文本

C                                     替换当前文本行光标所在字符位置之后的所有数据,以Esc键结束。

cw                                   替换光标当前所在字符位置及之后的整个字或部分字,以Esc键结束。

[n]cc                                替换当前行,或从当前行开始的n行文本,以Esc键结束。

[n]s                                  替换光标当前所在位置的单个字符,或从光标当前位置开始的n个字符,以Esc键结束。

S                                     替换当前行,以Esc键结束。

r                                      替换光标当前所在位置的单个字符。

r<Enter>                           断行。也可使用“a”或“i”命令加Enter及Esc键实现。

R                                     从光标当前所在的字符位置开始,替换随后的所有字符,直至按下Esc键。

xp                                    交换字符位置。交换光标当前所在位置开始字符位置。

~                                      转换光标当前所在位置字符的大小写。

u                                      撤销最近一次执行的编辑命令,或依次撤销先前执行的编辑命令。

:u                                     同上(ex编辑命令)。

U                                     撤销施与当前文本行的编辑处理。

3.     删除文本

[n]x                                 删除光标当前所在位置的字符,或删除从光标当前位置开始的n个字符。

[n]X                                删除光标当前所在位置的前一个字符,或删除光标当前所在位置之前的n个字符。

dw                                   删除光标当前所在位置的一个整字或部分字符。如果光标在字首,则删除整字。如果光标在字的中间任何位置,则删除光标位置及之后的字符。

[n]dd                                删除光标当前所在的文本行,或删除从当前行开始的n个文本行。

D                                     删除当前文本行从光标位置开始之后的所有字符。

dG                                   删除从当前行开始直至文件最后一行的所有文本行。

d[n]G                               删除从文件的第n行开始直至当前行的所有文本行。

:line#1,line#2 d                  删除从指定的行号line#1到line#2之间的所有文本行。

4.     复制与移动文本

[n]yy                               复制光标当前所在的文本行,或从当前行开始的n个文本行。

[n]Y                                同上。

p(小写)                       把复制或删除(“dd”命令)的文本行粘贴到光标所在行的下面。

P(大写)                       把复制或删除(“dd”命令)的文本行粘贴到光标所在行的上面。

:line#1,line#2 co line#3      把第line#1~line#2行复制到第line#3行之后。

:line#1,line#2 m line#3       把第line#1~line#2行移至第line#3行之后。

还可以,个人以前一直觉得快copy麻烦,一直懒惰...今天无意中发现了,就贴过来了^_^
如何用vi 复制第5行到第10行并粘贴到第12行之后?
方法1:
光标放到第五行,
输入:y6y
光标放到第12行,
输入:p
方法2:
命令行模式下输入
:5,10 co 12
方法3:
我一般都是
先移到第五行 d6
p
再移到12行 
p
延伸一下, 有时候不想费劲看多少行或复制大量行时,可以使用标签来替代
光标移到起始行,输入ma
光标移到结束行,输入mb
光标移到粘贴行,输入mc
然后 :'a,'b co 'c
把 co 改成 m 就成剪切了
那删除呢
是不是5,10 de
刚才试了试,的确可以
也可以把大量的代码保存到一个文件,然后在另一个文件里打开需要拷贝的代码。
   
   在文件一:
光标移到起始行,输入ma
光标移到结束行,输入mb
       然后:'a, 'b w filename
   在文件二:
       光标移到需要赋值的行,输入:
       :r filename
行拷贝还有一个比较简单的方法:
操作如下:
找到要复制的行,键盘按下shift+v, 然后用方向键上下或j h 移动想要copy的行,然后按下y
在移动到目的行,按下p即完成拷贝多行。这种方法适合没有行号的多行copy。
Vi 提供了文本移动和复制命令,用户利用这些指令可以方便的复制字符、文字、行还有文本块。
有关的命令如下:
yy 将当前行复制到缓冲区
yw 将当前单词复制到缓冲区
y1 将光标处的一个字符复制到缓冲区
p 将缓冲区的信息粘贴到光标的后面
:行号1 ,行号2 copy 行号3                                  将行号1到行号2的内容复制到行号3所在行的后面。

:行号1 ,行号2 move 行号3                                     将行号1到行号2的文本内容移动到行号3所在行的后面

如果只是想使用系统粘贴板的话直接在输入模式按Shift+Inset(粘贴)就可以了,下面讲一下vim的粘贴板的基础知识,有兴趣的可以看看,应该会有所收获的。
vim帮助文档里与粘贴板有关的内容如下:

vim有12个粘贴板,分别是0、1、2、...、9、a、“、+;用:reg命令可以查看各个粘贴板里的内容。在vim中简单用y只是复制到“(双引号)粘贴板里,同样用p粘贴的也是这个粘贴板里的内容;
要将vim的内容复制到某个粘贴板,需要退出编辑模式,进入正常模式后,选择要复制的内容,然后按"Ny(注意带引号)完成复制,其中N为粘贴板号(注意是按一下双引号然后按粘贴板号最后按y),例如要把内容复制到粘贴板a,选中内容后按"ay就可以了,有两点需要说明一下:
“号粘贴板(临时粘贴板)比较特殊,直接按y就复制到这个粘贴板中了,直接按p就粘贴这个粘贴板中的内容;
+号粘贴板是系统粘贴板,用"+y将内容复制到该粘贴板后可以使用Ctrl+V将其粘贴到其他文档(如firefox、gedit)中,同理,要把在其他地方用Ctrl+C或右键复制的内容复制到vim中,需要在正常模式下按"+p;
要将vim某个粘贴板里的内容粘贴进来,需要退出编辑模式,在正常模式按"Np,其中N为粘贴板号,如上所述,可以按"5p将5号粘贴板里的内容粘贴进来,也可以按"+p将系统全局粘贴板里的内容粘贴进来。
注意:在我这里,只有vim.gtk或vim.gnome才能使用系统全局粘贴板,默认的vim.basic看不到+号寄存器。安装vim.gnome使用apt-get install vim-gnome,然后vim自动会链接到vim.gnome。

下面是vim复制粘贴的基本命令:
yy复制游标所在行整行。或大写一个Y。 
2yy或y2y复制两行。 ㄟ ,请举一反三好不好! :-) 
y^复制至行首,或y0。不含游标所在处字元。 
y$复制至行尾。含游标所在处字元。 
yw复制一个word。 
y2w复制两个字(单词)。 
yG复制至档尾。 
y1G复制至档首。 
p小写p代表贴至游标后(下)。 
P大写P代表贴至游标前(上)。

复制单个字符
首选进入正常模式(按ESC就行)
然后按v(指定粘贴板为"1v 引号不能少),进入visual方式,然后就可以移动方向键选中文本,然后按y,就拷贝完成,
如果你要从光标处开始复制 4 个字符,可以按 4yl (复制光标后的)("14yl)("110yl 后面10个字符),4yh(复制光标前的) ,就复制了4个字符到缓冲区中了,
按下来就可以用 p (指定粘贴板为"1v 引号不能少)命令随便粘贴了(1为指下粘贴板名)

 

整页翻页 ctrl-f ctrl-b

f就是forword b就是backward

翻半页
ctrl-d ctlr-u
d=down u=up

滚一行
ctrl-e ctrl-y

zz 让光标所杂的行居屏幕中央
zt 让光标所杂的行居屏幕最上一行 t=top
zb 让光标所杂的行居屏幕最下一行 b=bottom

如何使用 Vim 分屏功能。

vim-windows

 

分屏启动Vim
  1. 使用大写的O参数来垂直分屏。
    vim -On file1 file2 ...
  2. 使用小写的o参数来水平分屏。
    vim -on file1 file2 ...

注释: n是数字,表示分成几个屏。

关闭分屏 
  1. 关闭当前窗口。
    Ctrl+W c
  2. 关闭当前窗口,如果只剩最后一个了,则退出Vim。
    Ctrl+W q

分屏

  1. 上下分割当前打开的文件。
    Ctrl+W s
  2. 上下分割,并打开一个新的文件。
    :sp filename
  3. 左右分割当前打开的文件。 
    Ctrl+W v
  4. 左右分割,并打开一个新的文件。
    :vsp filename
移动光标

Vi中的光标键是h, j, k, l,要在各个屏间切换,只需要先按一下Ctrl+W

  1. 把光标移到右边的屏。
    Ctrl+W l
  2. 把光标移到左边的屏中。
    Ctrl+W h
  3. 把光标移到上边的屏中。
    Ctrl+W k
  4. 把光标移到下边的屏中。
    Ctrl+W j
  5. 把光标移到下一个的屏中。.
    Ctrl+W w
移动分屏

这个功能还是使用了Vim的光标键,只不过都是大写。当然了,如果你的分屏很乱很复杂的话,这个功能可能会出现一些非常奇怪的症状。

  1. 向右移动。
    Ctrl+W L
  2. 向左移动 
    Ctrl+W H
  3. 向上移动 
    Ctrl+W K
  4. 向下移动 
    Ctrl+W J
屏幕尺寸

下面是改变尺寸的一些操作,主要是高度,对于宽度你可以使用Ctrl+W <或是>,但这可能需要最新的版本才支持。

  1. 让所有的屏都有一样的高度。
    Ctrl+W =
  2. 增加高度。
    Ctrl+W +
  3. 减少高度。
    Ctrl+W -

也许还有其它我不知道的,欢迎你补充。

 

看看这个,不错的哦

vi.jpg

转载于:https://my.oschina.net/doz/blog/63402

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值