vim 一些常用命令

大家都到了,上班了

得准备干活了,直接copy了. 有什么问题直接指出来我修改.


# 页面内跳转

H 跳转到本页面最上面一行(home)
M 跳转到本页面中间一行(middle)
L 跳转到本页面最下面一行(last)

# 滚屏
ctrl-u (up) 向上半屏
ctrl-d (down) 向下半屏
ctrl-b (backward) 向上一屏
ctrl-f (foward) 向下一屏
zz 当前行置屏幕中间
zt 当前行置屏幕最顶端
zb 当前行置屏幕最底

# `` 这个符号看起来象是一个反方向的单引号,或者,叫它开单引号
只要你执行一个命令使光标定位于当前行之外的某行上
去,这都叫一个跳转。包括"/"和"n"这些搜索命令
当发生跳转时,它会直接跳到刚才的那行.
` 就是一个跳转命令 后面的 `则是之前那行的标记
`` 命令不能反应在 f(ind) t(o) 和w e j k之类的命令上

# 根据光标停留位置的跳转
ctrl-o 命令跳转到更 早 时间光标停留的位置
ctrl-i 命令跳转到更 新 时间光标停留的位置

# m 命令(具名标记mark)
ma...mz一共26个位置可用.而 ` 跳转命令则配合m命令来使用 `a 则跳转到之前用ma标记的a处.

# diffs diffu 时跳转
:]c  / :[c  直接跳到两文件的不同之处...
:diffget diffput 不同文件部分的合并操作. 格式:
:[range]diffg[et] [bufspec]
:[range]diffpu[t] [bufspec]
一般为:
:[range]diffg 和 :[range]diffp   更常用的版本为
do与dp  -->  diff obtain 与 diff put 缩写
:1,$+1diffget 如果一个文件最后有删除行想从比较文件复制过来或者直接从比较文件Put过来

# gt / gT 标签(tab)间切换

# K (大写) linux环境
函数上直接按 K (大写) 会跳到该函数的帮助页

# 冒号命令 : 或查找时的 / ? 光标于屏幕底部 即命令行上
<Left> 向左一个字符
<Right> 向右一个字符
<S-Left> 或<C-Left> 向左一个单词
<S-Right> 或<C-Right> 向右一个单词
CTRL-B 或<Home> 到命令行行首
CTRL-E 或<End> 到命令行行尾
CTRL-W 删除光标前一个单词
CTRL-U 删除整个命令行

# gf 命令  查看当前 光标所在位置 文件名 的内容...甚至就URL是运气好也可以(不过最好是ftp)
需在 'path' 选项中设置好搜索路径..默认只有当前目录
'isfname' 选项则指定哪些字符可作为文件名的一部分

# :find命令..若当前文本内容中没有需要查找的文件名 而我们又知道
文件的名称
可以 :find 文件名..
同样是在 'path' 中查找

# 多次匹配一个字符串
/\(string\)*   则有 "stringstring"  stringstringstring" ... 还有""
为了不匹配空串所以 得用到 " \+ " 至少一个的意思
/\(string\)\+
还可匹配一个可有可无的项 " \= "
/folders\= 匹配 folder 和 folders

\{n,m}    注意不是\{n,m\}

如果"n"被忽略了就默认它为0,
如果"m"被忽略了就默认它为无穷大。如果",m"被忽略了那就会精确地匹配"n"次重复。

模式匹配到的次数
\{,4} 0, 1, 2, 3 或4次
\{3,} 3, 4, 5次,等等。
\{0,1} 0 或1,跟\= 一样
\{0,} 0 次或多次,跟* 一样
\{1,} 1 次或多次,跟\+ 一样
\{3} 3 次
 
# 正则表达式: 懒惰模式(尽可能少的匹配)
\{-num,num1}
\{num,-num1}
\{-}

# 预定义字符
\a 等同于 [a-zA-Z] 查找所有字母
\d        [0-9] 所有数字
\D  [^0-9] 所有非数字
\x  [0-9a-fA-F] 十六进制数
\X  [^0-9a-fA-F] 非十六进制数
\s  [ ] <Tab> 和 <space> 空白字符
\S  [^ ] 除了<tab> 和 <space> 之外
\l  [a-z] 小写字母
\L  [^a-z] 非小写字母
\u  [A-Z] 大小字母
\U  [^A-Z] 非大写字母
注意这些选项不能再次用在[]中...本身已经相当于[...]操作了.

# 匹配断行 \n \_
/the\nword  以the结束word开头的行
若还要匹配the word 则需匹配空格或断行
/the\_sword \_s 匹配空格或断行

"\s"匹配空白,"\_s"匹配空白或断行。同样,"\a"匹配一个字母字
符,"\_a"匹配一个字母字符或一个断行。其它的字符类也一样。
\_[] 让一个字符类集额外地包含一个断行 如
/"\_[^"]*" 可查找双引号引起来的字符串,即使它们跨过了行边界

# 在多个文档中搜索
:bufdo /searchstr
:argdo /searchstr

# 关于map
:map普通,可视模式及操作符等待模式,即相对于:编辑模块和可视模式,以下是几种模式
:nmap           普通模式下
:vmap           可视模式
:omap           操作符等待模式
:map!           插入和命令行模式
:imap           插入模式/ 编辑模式
:cmap           命令行模式
其中omap 是你已经键入了一个作为命 令的操作符,比如"d"或者"y",接下来Vim
希望继续键入一个移动命令或是一个文本对象。就是这种Vim希望继续接收命令而
你又尚未键入的悬而 未决的状态

# 程序中的移动
% 除了 :set matchpairs中的匹配外 甚至包括 #if - #endif结构块
[# ]# 跳到#if - #endif 的开头与结尾

第二个字母 [ 表示当前函数:
[[ 当前函数开头 ]] 下一函数的开头
][ 当前函数结尾 [] 上一函数的结尾

第二个字母 { 表示当前代码块:
[{ 跳转到当前代码块的开头(当前块作用域头), [{查找前一个未匹配的{
]} 跳转到当前代码块的末尾(当前块作用域尾), ]{查找后一个未匹配的{

# [I  (注意 i 为大写)  gD  gd
列出文本及include的及被inlcude包含的include中所有该单词或标识符出现的行
# 译注:# 可以全文查找与光标处的狭义字相匹配的字,
# 这在查找函数原型和实现,或者变量使用的时候很有用
gD 相当于 [I 命令 只是不会搜索 include 文件, gD只在当前文本查找
gd 则更小范围 只在当前函数内查找
[D 同 [I 但只找宏

# J 两行合并为一行(中间自动添加一个空格)
gJ 保留那些空白和后缀空白(中间不添加空格)


# g? 命令来加密高亮显示的文本,在这个命令中我们采用的是Vim中所采用的rot 13加密算法.
如果我们对同一个文本进行两次加密操作,就相当我们进行了解密操作.


# "."命令会重复你做出的所有<修改>,除了"u"命令CTRL-R和以冒号开头的命令
"."命令重复的是命令而不是内容

# (文本对象)
aw(a word) as(a sentence) iw(inner word) is(inner sencence)
操作+(文本对象)
aw 一个word(包括后面空格)
as 一句话sentence
iw 一个对象(不包括后面空格)
is 一句话.(同上不包括...)

将光标移至括号内,按shift+v进入行选模式,然后
i( - 选小括号中内容,不包括小括号
a( - 选小括号中内容,包括小括号
i[ - 选中括号中内容,不包括括号
a[ - 选中括号中内容,包括括号
i{ - 选大括号中内容,不包括大括号
a{ - 选大括号中内容,包括大括号

或者不用进入行模式, v进入普通选择模式
vi{ 选中{}中间的内容,不包括{}
va{ 选中{}中间内容,包括{}
vi( 选中()中间内容
vi< 选中<>中间内容
vi[ 选中[]中间内容
vit 选中中间的内容
vi” 选中”"中间内容
vi’ 选中”中间的内容
vis 选中一个句子
vib 选中一个block
viw选中一个单词
vip 选中一个段落

# "* 剪切板命令
"*yy 整行复制到剪切板
"*p  剪切板内容复制过来...

# 上面的局限是一次只能p一个内容..使用寄存器可以多处p
如 复制一句话到寄存器 f 中
"fyas (注意"f一定要在复制动作前面)
再复制一个文件块到寄存器 b 中
ctrl-qjjww"by
现在可以在别的文件中分别
"fp  /  "bp .... 26个寄存器哦.
寄存器详解
http://www.cnblogs.com/chenyadong/archive/2011/07/11/2103249.html

# :sav / :save /:saveas  另存为

# 读取命令的输出
:read !ls / :read !dir
当然read前可有数字做范围

# 将文本写入一个命令
如 :w !wc
计算当选文本内容的行数 单词数 字符数
千万注意别错写成
:w! wc

# :file 文件名 修改当前文件的名字

# !{motion}{program}
以一块文本为对象将它们通过管道送
至一个外部程序。换句话说, 由{program}指定的外部程序,接受由{motion}命令指定的
文本块作为输入,以它的输出来替换{motion}指定的文本块。

# !!命令1  用命令1 的结果替换当前行内容
类似于 :r !cmd
如!!date<ENTER>
mswin下最好 为 !!date /T<ENTER>


# q{register} 命令记录与回放 灰常实用的命令

"ayy@a :把当前行作为一个Vim命令来执行

1. q{register}  寄存器名字必需为 a-z 26之间一个字母
2. 执行你要执行的操作
3. 按下q以结束对命令的记录(就一个q,不要多按)
4. @{register} 回放这个寄存器中的宏


如 有文件内容
stdio.h
fcntl.h
unistd.h
stdlib.h
而想要
#include "stdio.h"
#include "fcntl.h"
#include "unistd.h"
#include "stdlib.h"

光标到位(第一行),然后

qa 开始将后续的命令记入寄存器a
^ //将光标移动到行首
i#include "<Esc> //在该行之前插入#include "
$ //移动到行尾
a"<Esc> //在行尾加上"字符
j //移到下一行
q //停止记录
最后
3@a

# 以上相对小写的大写字母 在 复制 和 删除上都有效..
"aY //复制一整行到寄存器小   a 中
下一行 "AY //将下一行追加到寄存器小 a 中
复制可以将多行内容复制到一个寄存器a中...

# 替换 :[range]substitute/from/to/[flags]
flags: g 每行都从头到尾对匹配的所有字符串进行操作
p 列印 列出最后一个被改变的行
e 就算没找到一个匹配的目标也不要报错 (宏操作中有用,因为一旦有报错就会停止执行)
c 在每个替换时要求用户确认
(y/n/a/q/l/^E/^Y)?
y 好吧,替换吧
n 不,这个先留着
a 别问了,全部换掉
q 退出,剩下的也不要管了
l 把现在这个改完就退出吧
CTRL-E 向上滚屏一行
CTRL-Y 向下滚屏一行

# :runtime! syntax/2html.vim 转换 txt 成 html, 会按照你的颜色配置来转  

# :[range]global/{pattern}/{command}

据说是vim最强大的命令
":global"中所谓的命令都必需是以":"开始的命令行命令
Normal模式下的命令不能直接使用。:normal命令可以间接地让你使用Normal模式下的命令。

    :g/^/exec "s/^/".strpart(line(".")."\t\t", 0, 4) 在行首插入行号
:g/^/m0                     : 按行翻转文章 (m = move)
:g/fred/t$                  : 拷贝行,从fred到文件末尾(EOF)
# 保存全局命令的结果 (注意必须使用添加模式)
:g/fred/y A                 : 添加所有为fred所匹配的行到register a
:'a,'b g/^Error/ . w >> errors.txt

# 消除行尾多余空格
:%s/\s\+$//      
\s\+$ 表示行尾的一个或多个空白字符 (注意 + 号要转意给命令不然会被直接当成 + 号)

:%s/\r//g                   : 删除DOS方式的回车^M
:g/\r/s/\r// : 同上
:%s/ *$//                   : 删除行尾空格

# Visual block模式下的批量插入
大写i  Istring<ESC>
大写a  Astring<ESC>
(注意输入单词后直接<ESC>)

# Visual block下
~ 交换大小写
U 小写到大写
u 大写到小写
r 全部替换为某个字符

# :%s/\([^,]*\),\(.*\)/\2 \1/ 说明下 \number的用法
(逗号的前后交换,逗号变空格)

# :%!xxd 二进制文件的十进制显示 (xxd.exe 自带的单独外部程序)
:%!xxd -r 逆向转换

# ctrl-V(unix) ctrl-q(win)
插入模式下键入字符原型(特殊字符)
如 <ESC> <F9> ...
还可以用数字来表示ASCII码 如 ctrl-q 127  /  ctrl-q x7f  (十六进制)
(同样o为8进制,甚至U为unicode字符)

连体字/特殊字符  ctrl-k
:digraphs 查看有哪些字符可用
ctrl-k Cu 会显示出符号"¤ " 它的ASCII为 164

# 插入模式下 ctrl-o 相当于进入 normal模式 即相当于 <ESC>键..但只能一次一个normal命令


# :{range}center [width]
让一个范围的行居中 如 :1,5center 40

同上的有 right / left (:{range}left [margin])
:1left 5
:2,5left
以上明显是一个段落的格式

左右对齐 没有对应的直接命令 得靠一个宏
:runtime macros/justiry.vim
然后在visual 模式下选中文本后执行 "_j" 命令(下划线)

# gv 命令 回到上次visual模式选中的文本的地方..good.


# 关于撤消树.
:earlier 10s(m)(h)回到10秒(分钟)(小时)前的状态..
相应还有
:later {num_time}s(m)(h)

# 删除重复
在Vim中删除重复的行很常见,通常有两种情况。
一、重复行紧挨着

– 删除连续相同的行,保留最后一行


:g/^\(.*\)$\n\1$/d 


– 删除连续相同的行,保留最开始一行

:g/\%(^\1$\n\)\@<=\(.*\)$/d

上面这两个命令在处理连续相同行时作用相同,但是下面全文搜索重复行删除时区别是保留前面的还是后面的重复行。

– 类似的,删除连续多个空行,只保留一行空行

g/^\s*$\n\s*$/d 


二、重复行不挨着
– 删除重复行,结果不要求按原顺序

:sort u
– 删除重复行,结果按照原顺序排列(这个有点麻烦)

1. 为了保存原有顺序,首先给每行加上行号和1个{
:let i=1|g/^/s//\=i.'{'/|let i+=1

2. 按照行号后面的内容排序,参考:help :sort
:sort /^\d\{-}{/ 

3. 删除行号后面的内容相同的行
保留后面的行:g/^\d\{-}{\(.*\)$\n\d\{-}{\1$/d 
或者保留开始的行:g/\%(^\d\{-}{\1$\n\)\@<=\d\{-}{\(.*\)$/d 

4. 按照行号恢复顺序
:sort n

5. 删除行首的原来的行号和{

:%s/\d\{-}{// 

# 一行的结束
unix LF <Line Feed> 换行
mac CR 回车
windows CR LF 回车换行

:set fileformats=unix,dos自动识别unix和ms-dos格式文件

# vim -x 文件名
启动vim时为新文件加密.
若为当前文件加密 则
:X   (大写x)
要解密 在当前文件中可用
:set key=
置空就好...注意加密 解密都要保存后才会生效.
(注意交换文件不会被加密...所以.... -n 参数会禁止生成交换文件)
vim -x -n file.txt
或者当在文件中时
:setlocal noswapfile

# :set virtualedit=all
设置虚拟编辑....
光标在屏幕上可自由移动....
:set virtualedit=
恢复正常
# 'browsedir'选项控制vim如何选择起始目录
last 上次访问过的目录 (默认)
buffer 当前文件所在目录
current 当前工作目录

# vim 字体
linux下
:set guifont=font\ size
windows下
:set guifont=font:size

若不确定是否有该字体可以后面加逗号 , 后继续
:set guifont=font1\ size1, font2\ size2
:set guifont=font1:size1, font2:size2

还可用
:set guifont=*
打开字体选择的对话框

# CTRL-G or :f/:file 若关闭ruler选项则会看到下面一行当前的状态信息  类似
g + ctrl g 命令  统计信息.很详细
ga 命令查看当前光标下字符的本来面目

# 缓冲区分三类..
1,当前缓冲区 活动的,可见的,被载入的,正在编辑的
2,隐藏缓冲区 被vim载入,只是被隐藏了
3,非活动缓冲 曾经被vim编辑过的...
Active 出现在窗口中,内容被载入
Hidden 不显示在窗口中,但内容被载入
Inactie 不出现在窗口中,内容也未被载入

:buffers
:ls
显示当前缓冲区
还有:ls!  / :buffers!

u 未被列出的缓冲区unlisted-buffer
% 当前缓冲区
# 上一次的活动缓冲区
l 被载入并显示在某窗口中的缓冲区
h 被载入但隐藏的缓冲区。
= 只读的缓冲区
- 不可编辑的缓冲区,其中 modifiable 选项被关闭
+ 有改动的缓冲区
:ls!命令可以列出不能忝列:ls 命令的缓冲区,如
以vim命令直接进入时的[未命名]缓冲区。

删除缓冲区 (实际是放入unlisted列表中)
:bdelete number
:bdelete 文件名
:n,mbd

:bwipe 则是彻底清空缓冲区

# 关于自动补全
ctrl-n   / ctrl-p
如果结果比较多可以再用ctrl-N / ctrl-P选择

Ctrl+E
表示退出下拉窗口, 并退回到原来录入的文字
Ctrl+Y
表示退出下拉窗口, 并接受当前选项

特殊补全
ctrl-x ctrl-O 使用ctags的分析结果来补全

以下补全不依赖于ctags
ctrl-x ctrl-F 文件名 FIlename
ctrl-x ctrl-L 整行内容 Line
ctrl-x ctrl-D 宏定义(包括那些在include文件里的宏) Define
ctrl-x ctrl-I 当前目录及其子目录里的文件 Include
ctrl-x ctrl-K 来自一个字典文件的word Key
ctrl-x ctrl-T 根据同义词字典补全 来自一个
ctrl-x ctrl-] 根据标签补全 table
ctrl-x ctrl-V Vim的命令行
ctrl-x ctrl-N 根据当前文件里关键字补全 local ctrl-n
ctrl-x ctrl-u 用户自己定义方式补全
ctrl-x ctrl-S 拼写建议

# :Ex 开启目录浏览器, 注意首字母E是大写的 (:Sex / :e .) 效果好像一样

# 把东西送到命令行/搜索行 
<C-R><C-W>              : 送一个狭义词
<C-R><C-A>              : 送一个广义词
<C-R>-                  : 送一个小型删除寄存器register
<C-R>[0-9a-z]           : 送一个命名寄存器register
<C-R>%                  : 送文件名过去 (#也行)(当前文件名)
<C-R>" : 送当前复制内容

# ctrl-r 武器
在 insert mode 和 command mode 均可使用,功能就是插入寄存器相关内容。
先 copy 或 delete 一些文本,然后在
normal mode 或 command mode 输入 ctrl-r "

寄存器的主要有以下几种:
a. The unnamed register ""
"d", "c", "s", "x" 和 "y" 等涉及删除或拷贝的命令
都会将内容存放于此(有例外)。

b. 10 numbered registers "0 to "9
0 为最近拷贝的内容,1-9 为最近删除的内容。
指定 named register 时不会存放于此。

c. The small delete register "-
删除不多于一行的内容会存在于此。

d. 26 named registers "a to "z or "A to "Z
小写与大写的区别是,小写是覆盖方式,大写是添加方式。

e. four read-only registers |":| |".| |"%| and |"#|
". 存放上次插入的文本
有什么用?呵,例如,你输入了一段文本,在另一个地方也
要有相同的内容,你输完后,一般要选择并复制一下吧?
而用这个,直接移到需要插入的地方,i<ctrl-r>. 即可。
"% 是当前编辑文件全名
呵,vim 中,% 就是代表当前编辑文件名的变量,好记吧?
不过,一般直接用 % 就行,例如":!cat %",vim 会自动
扩展。
"# 是alternate file 名称 (这个我不知道)
": 上次执行的命令
记起来比较容易,冒号就是命令行提示符嘛。这个有些什么用呢?
在测试配置文件时十分有用,先在命令行输入命令,调试好后,
在 insert mode 里按Ctrl-R : 就可将该命令插到文件中。

f. the expression register "=
呵,表达式寄存器,可以输入一个表达式,并插入结果。

g. The selection and drop registers "*, "+ and "~
跟 gui 即 X/Windows 剪贴板有关的变量。
在 X 中,鼠标中键与系统剪贴板不一样,至于区别,大家自己
试验一下,这里给个提示,在命令行下输入 reg 可以列出所有
寄存器的内容。
h. The black hole register "_

黑洞


i. Last search pattern register "/
上次搜索的内容。例如,我要搜索一个单词 linuxforum,但我
比较懒,先输入 /linux,发现出现很多个 linux,多次按 n 无果,
难道要重新输入 /linuxforum ? 不用,只需要 /<ctrl-r>/forum 即可。
呵,聪明的你一定想到了,用命令行历史也可以调来,按 ctrl-p 或 ctrl-n
即可上下翻阅。这样也可以嘛,也比较快捷,但要查找 forumlinux 呢?
用 ctrl-r 的话只需 /forum<ctrl-r>/ 

# 正则匹配
中文:
[^\x00-\xff]\+
GBK/GB2312编码:
[\x80-\xff]\+ 或 [\xa1-\xff]\+
UTF-8编码:
[\x{4e00}-\x{9fa5}]\+/u
[\u4300-\u9fa5]\+
身份证:
(^\d{15}$)|(^\d{17}([0-9]|X)$)
邮箱:
^[a-z]([a-z0-9]*[-_]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,3}([\.][a-z]{2})?$/i

国际域名格式如下:域名由各国文字的特定字符集、英文字母、数字及“-”(即连字符或减号)任意组合而成, 但开头及结尾均不能含有“-”,“-”不能连续出现 。 域名中字母不分大小写。域名最长可达60个字节(包括后缀.com、.net、.org等)。 
说明:
①/内容/i 构成一个不区分大小写的正则表达式;^ 匹配开始;$ 匹配结束。
②[a-z] E-Mail前缀必需是一个英文字母开头
③([a-z0-9]*[-_]?[a-z0-9]+)* 和_a_2、aaa11、_1_a_2匹配,和a1_、aaff_33a_、a__aa不匹配,如果是空字符,也是匹配的,*表示0个或者多个。
④*表示0个或多个前面的字符.
⑤[a-z0-9]* 匹配0个或多个英文字母或者数字;[-_]? 匹配0个或1“-”,因为“-”不能连续出现。
⑥[a-z0-9]+ 匹配1个或多个英文字母或者数字,因为“-”不能做为结尾
⑦@ 必需有个有@
⑧([a-z0-9]*[-_]?[a-z0-9]+)+ 见上面([a-z0-9]*[-_]?[a-z0-9]+)*解释,但是不能为空,+表示一个或者为多个。
⑨[\.] 将特殊字符(.)当成普通字符;[a-z]{2,3} 匹配2个至3个英文字母,一般为com或者net等。
⑩([\.][a-z]{2})? 匹配0个或者1个[\.][a-z]{2}(比如.cn等) 我不知道一般.com.cn最后部份是不是都是两位的,如果不是请修改{2}为{起始字数,结束字数} 

匹配用户密码:
http://see.xidian.edu.cn/cpp/html/1433.html
匹配日期时间:
http://see.xidian.edu.cn/cpp/html/1434.html
匹配URL或者网址:
http://see.xidian.edu.cn/cpp/html/1435.html
匹配电话号码和手机号码:
http://see.xidian.edu.cn/cpp/html/1436.html
匹配IP地址:
http://see.xidian.edu.cn/cpp/html/1437.html
匹配字母:
http://see.xidian.edu.cn/cpp/html/1438.html
HTML标签:
http://see.xidian.edu.cn/cpp/html/1439.html
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值