第一篇:VIM优缺点
VMI是Vender Managed Inventory,此交易方式降低了供应链的总成本并且提高供货速度; 优点:信息共享
对采购方,这样做采购方不再担心会缺料导致生产跟不上;
对供货方,这样做不但节省物流成本而且提高了供货速度,整体提高竞争力; 零售商:零售商能够帮助供应商更有效地做出计划
1、降低了管理成本
2、确保了对原材料库存需求的最小化
3、缩短了的产品生产周期,降低了市场风险
4、灵活地应对了供求关系的变化
5、“零库存”,提高了资金的使用率
供应商:供应商从零售商处获得销售点数据并使用该数据来协调其生产、库存活动与及零售商的实际销售活动;供应商能按照销售时点的数据,对需求做出预测,能更准确地确定客货批量,减少预测的不确定性,从而减少安全库存量,命名存储与供货成本更小,同时,供应商能更快响应用户需求,提高服务水平,使得用户的库存水平也降低
1、保障了对货物的控制权
2、灵活地应对了供求关系的变化,降低了市场风险
3、及时回收资金,提高了资金的使用率
对于供应商和零售商而言,首先,供应商拥有库,对于零售商来说,可以省去多余的定货部门,使人工任务自动化,可以从过程中去除不必要的控制步骤,使库存成本更低,服务水平更高。其次,供应商拥有库存,供应商会对库存考虑更多,并尽可能进行更为有效的管理,通过协调对多个零售生产与配送,进一步降低总成本。缺点:
如果采购方公司接某物料订单能力下降或者其客户不需要此类产品的供货时,就比较麻烦,但如果能提前与采购方做好这方面的解决方案就好很多。
供应商完全管理和拥有库存,直到零售商将其售出为止,但是零售商对库存有看管义务,并对库存物品的损伤或损坏负责。
如果供需预测不准确,货物会积压在供应商、分销商或者采购商手中,会祸及整条供应链。采用更为科学的预测手段,信息要及时沟通,买卖双方建立战略合作关系(双方会有共担风险的意识)这三个方面是解决供需预测不准确的方法。
实施VMI所产生的费用、风险应由买卖双方共同来承担。任何一方的吃亏都可能导致VMI过早夭折,甚至可能会影响双方进一步的合作关系。
及时传递信息和采取弥补措施非常关键。当预测变更后,买方要及时让卖方知晓,以便及时采取措施。
VMI要成功,OEM/EMS公司和供应商之间必须有一套完整的针对需求变化的协调机制,从而能尽量降低呆滞库存发生的概率。”
虽然VMI对双方都有利,但实施VMI需要支出一定的费用及承担不可预见的风险。
责任和风险分担如果不明确,很容易造成系统内部矛盾。
第二篇:vim用法总结
三种状态
Command: 任何输入都会作为编辑命令,而不会出现在屏幕上,任何输入都引起立即反映 Insert: 任何输入的数据都置于编辑寄存器,按ESC,可跳回command方式
Escape: 以“:”或者“/”为前导的指令,出现在屏幕的最下一行,任何输入都被当成特别指令。 离开vi
:q!离开vi,并放弃刚在缓冲区内编辑的内容。
:wq 将缓冲区内的资料写入磁盘中,并离开vi。
:x 同wq。
(注意—— :X 是文件加密,一定要与:x存盘退出相区别)
进入输入模式
a(append)由游标之后加入资料。A 由该行之末加入资料。
i(insert)由游标之前加入资料。
I 由该行之首加入资料。
o(open)新增一行於该行之下供输入资料之用。
O 新增一行於该行之上供输入资料之用。
删除与修改
x 删除游标所在该字元。
X 删除游标所在之前一字元。
r 用接於此指令之后的字元取代(replace)游标所在字元。如:ra将游标所在字元以 a 取代之。R 进入取代状态,直到《ESC》为止。
s 删除游标所在之字元,并进入输入模式直到《ESC》。
S 删除游标所在之该行资料,并进入输入模式直到《ESC》。
光标的移动
m
„
0 移至该行之首
$ 移至该行之末。
e 移动到下个字的最後一个字母
w 移动到下个字的第一个字母。
b 移动到上个字的第一个字母。
^ 移至该行的第一个字元处。
H 移至视窗的第一行。
M 移至视窗的中间那行。
L 移至视窗的最后一行。
G 移至该文件的最后一行。
+ 移至下一列的第一个字元处。
-移至上一列的第一个字元处。
:n 移至该文件的第 n 列。
n+ 移至游标所在位置之后的第 n 列。
n-移至游标所在位置之前的第 n 列。
(Vim)光标移动基本用法小解:
(这只要组合上边的功能就可以明白了,不用再一一讲解了吧!)ge b w e
← ←---→--→
This is-a line, with special/separated/words(and some more).←-←-------------------→---→
GE B W E
视窗的移动
剪切、复制、删除
Operator + Scope = command
Operator
d 剪切y 复制。
p 粘帖,与 d 和 y 配和使用。可将最后d或y的资料放置於游标所在位置之行列下。c 修改,类似delete与insert的组和。删除一个字组、句子等之资料,并插入新建资料。 Scope
e 由游标所在位置至该字串的最后一个字元。
w 由游标所在位置至下一个字串的第一个字元。
b 由游标所在位置至前一个字串的第一个字元。$ 由游标所在位置至该行的最后一个字元。
0 由游标所在位置至该行的第一个字元。
整行动作
dd 删除整行。
D 以行为单位,删除游标后之所有字元。
cc 修改整行的内容。
yy 使游标所在该行复制到记忆体缓冲区。
取消前一动作(Undo)u 恢复最后一个指令之前的结果。
U 恢复游标该行之所有改变。
(vim)u 可以多次撤消指令,一次撤消一个操作,直至本次操作开始为止。
(vim)Ctrl+r 可以恢复撤消前内容,按多次可恢复多次。
查找与替换
/字串 往游标之后寻找该字串。
?字串 往游标之前寻找该字串。
n 往下继续寻找下一个相同的字串。
N 往上继续寻找下一个相同的字串。
% 查找“(”,“)”,“{”,“}”的配对符。
s 搜寻某行列范围。
g 搜寻整个编辑缓冲区的资料。
:1,$s/old/new/g 将文件中所有的『old』改成『new』。
:10,20s/^/ / 将第10行至第20行资料的最前面插入5个空白。
(vim)
/字符串 后边输入查询内容可保存至缓冲区中,可用↑↓进行以往内容选择。
另外:将光标移动在选定单词下方按*,则可以选中此单词作为查询字符,可以避免输入一长串字符的麻烦。
(vim)大小写替换
首先用按v开启选择功能,然后用↑↓←→键来选定所要替换的字符,若是小写变大写,则按U;反之按u;
如果是选择单词,则可以在按v后,按w,最后按U/u,这样就可以将字符随意的改变大小写了,而不用删除后重新敲入。
资料的连接
J 句子的连接。将游标所在之下一行连接至游标该行的后面。
环境的设定
:set all 可设置的环境变量列表
:set 环境变量的当前值
:set nu 设定资料的行号。
:set nonu 取消行号设定。
:set ai 自动内缩。
:set noai 取消自动内缩。
(vim)
:set ruler 会在屏幕右下角显示当前光标所处位置,并随光移动而改变,占用屏幕空间较小,使用也比较方便,推荐使用。
:set hlsearch 在使用查找功能时,会高亮显示所有匹配的内容。
:set nohlsearch 关闭此功能。
:set incsearch 使Vim在输入字符串的过程中,光标就可定位显示匹配点。
:set nowrapscan 关闭查找自动回环功能,即查找到文件结尾处,结束查找;默认状态是自动回环
ex指令
读写资料
:10,20w test 将第10行至第20行的资料写入test文件。
:10,20w>>test 将第10行至第20行的资料加在test文件之后。
:r test 将test文件的资料读入编辑缓冲区的最后。
:e [filename] 编辑新的文件。
:e![filename] 放弃当前修改的文件,编辑新的文件。
:sh 进入shell环境,使用exit退出,回到编辑器中。:!cmd 运行命令cmd后,返回到编辑器中。
删除、复制及搬移
:10,20d 删除第10行至第20行的资料。:10d 删除第10行的资料。
:%d 删除整个编辑缓冲区。
:10,20co30 将第10行至第20行的资料复制至第30行之后。:10,20mo30 将第10行至第20行的资料搬移至第30行之后。
第三篇:VIM基本操作小结
VIM基本操作小结
第一讲小结 : 移动和进出
1.光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键。
h(左移)j(下行)k(上行)l(右移)
2.欲进入vim编辑器(从命令行提示符),请输入∶vim 文件名 <回车>
3.欲退出vim编辑器,请输入以下命令放弃所有修改∶
或者输入以下命令保存所有修改∶
4.在正常模式下删除光标所在位置的字符,请按∶ x
5.在正常模式下要在光标所在位置开始插入文本,请按∶ i输入必要文本
特别提示∶按下
第二讲小结:删除与撤销
1.欲从当前光标删除至单字/单词末尾,请输入∶dw
2.欲从当前光标删除至当前行末尾,请输入∶d$
3.欲删除整行,请输入∶dd
4.在正常模式下一个命令的格式是∶[number] command object 或者command [number]object
其意是∶ number代表要做的事情,比如 d 代表删除 object-代表要操作的对象,比如 w 代表单字/单词,$ 代表到行末等等。$(to the end of line), etc.5.欲撤消以前的操作,请输入∶u(小写的u)欲撤消在一行中所做的改动,请输入∶U(大写的U)欲撤消以前的撤消命令,恢复以前的操作结果,请输入∶CTRL-R
第三讲小结:置入,替换与修改
1.要重新置入已经删除的文本内容,请输入小写字母 p。该操作可以将已删除的文本内容置于光标之后。如果最后一次删除的是一个整行,那么该行将置于当前光标所在行的下一行。
2.要替换光标所在位置的字符,请输入小写的 r 和要替换掉原位置字符的新字符即可。
3.更改类命令允许您改变指定的对象,从当前光标所在位置直到对象的末尾。比如输入 cw 可以替换当前光标到单词的末尾的内容;输入 c$ 可以替换当前光标到行末的内容。
4.更改类命令的格式是∶[number]c object或者 c[number]object
第四讲小结:定位 搜索 配对 替换
1.Ctrl-g 用于显示当前光标所在位置和文件状态信息。Shift-G 用于将光标跳转至文件最后一行。先敲入一个行号然后按 Shift-G 则是将光标移动至该行号代表的行。
2.输入 / 然后紧随一个字符串是则是在当前所编辑的文档中向后查找该字符串。输入问号 ? 然后紧随一个字符串是则是在当前所编辑的文档中向前查找该字符串。完成一次查找之后按 n 键则是重复上一次的命令,可在同一方向上查找下一个字符串所在;或者按 Shift-N 向相反方向查找下该字符串所在。
3.如果光标当前位置是括号(、)、[、]、{、},按 % 可以将光标移动到配对的 括号上。
4.在一行内替换头一个字符串 old 为新的字符串 new,请输入:s/old/new在一行内替换所有的字符串 old 为新的字符串 new,请输入:s/old/new/g在两行内替换所有的字符串 old 为新的字符串 new,请输
入:#,#s/old/new/g在文件内替换所有的字符串 old 为新的字符串 new,请输入:%s/old/new/g进行全文替换时询问用户确认每个替换需添加 c 选项,请输入 :%s/old/new/gc
第五讲小结:外部命令,保存与插入
1.:!command 用于执行一个外部命令 command。
请看一些实际例子∶:!dir-用于显示当前目录的内容。:!rm FILENAME-用于删除名为 FILENAME 的文件。
2.:w FILENAME可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文件中。
3.:#,#w FILENAME 可将当前编辑文件第 # 行至第 # 行的内容保存到文件FILENAME 中。
4.:r FILENAME 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置 后面。
第四篇:vim高级用法多年经验原创总结
vim高级用法多年经验原创总结(全部测试成功)
====================================
一、Linux→命令模式:Vim filename
1.一次移动一个光标
h j k l
左下上右
2.行内移动
0 到行首(d0或d^删除至行首)
$ 至行尾(d$删除至行尾)
0=HOME 到行首
$=end 至行尾
G 到文件尾
50G 到50行
gg到文件首
3.有小d/大D都是剪切(del word)
dd剪掉当前行
5dd 剪掉当前行起共5行
D 剪空当前行
x 删除一个字母
dw剪除一个单词
4.undo撤消
u 一次撤一行中的一个动作(多行时小u比大U管用)
U 撤消一行中的所有动作(单行时大U比小u管用)
5.复制粘贴
yy复制当前行
5yy 复制5行
p 粘贴(paste)
ZZ 保存退出
ZQ 不保存退出
............6.vim中大小写转化:~或u或U(高级用法)
............a、整篇文章大写转化为小写:gg→guG
gg到文件首
gu把选定范围全部小写
G 到文件结束
..........b、整篇文章小写转化为大写:gg→gUG
gg到文件首
gU把选定范围全部大写
G 到文件结束
c、整篇文章反转(大转小小转大)
ggg~G()
==================================
二、命令模式→输入模式:按ins/a/A/i/I/o/O/r/Ro
1.插入
o 在光标下加一空行并进入插入模式
O 在光标上开一空行并进入插入模式
r 替换一个字符
R 连续替换多个字符
2.文件内容查找:
/word 从上而下在文件中查找字符串“word”
?word 从下而上在文件中查找字符串“word”
n 定位下一个匹配的被查找字符串
N 定位上一个匹配的被查找字符串
3.命令模式→Visual Block:(高级用法)
按ctrl+v,举例:选中多行并添加注释
#vim→ctrl+v→方向箭头选中→I→#→ESC
#vim→set nu→^v→(100G:当前行到第100行)→I→#→ESC
=============================
三、命令模式→末行模式
1.默认情况下Vim的搜索是大小写敏感的,:
:set ignorecase忽略大小写
:set noignorecase不忽略大小写
:set nu或:set number 设置显示行号
:set nonu或:set nonumber不显示行号
:999 移动光标到第999行
2.有彩色或无彩色(高级用法)
:syntax clear或:set syntax=off 暂时关闭语法高亮
:syntax enable 当前缓冲区打开语法高亮功能。
3.保存与退出
:w 存盘不退出
:w!暴力存盘不退出
:w file1 另存为file1
:q 无脏数据时正常退出
:q!放弃脏数据并退出
:wq正常保存并退出
:wq!暴力存盘并退出
4.文件内容替换(高级用法)
命令功能
:s /old/new 当前行中找到的第一个old 替换为new
:s /old/new/g 当前行中查找到的所有old 替换为new
:#,# s/old/new/g 行号“#,#”范围内替换所有的old为new
:% s/old/new/g 整个文件范围内替换所有的old为new
:s /old/new/c c命令:将对每个替换动作提示用户进行确认
5.文件加密与解密(高级用法)
------加密
vim t.c打开文件
:X 据提示操作//加密
: set key=password //加密作用同:X
:wq保存退出------解密
------解密
vim t.c打开文件
:set key= 解密
:wq保存退出
=============================
四、典型故障现象(图片见附件)一般是非正常关闭VI导致的,解决办法如下:
#rm.install.log=============================
五、查看vim帮助
:help index
1.Insert mode |insert-index|
2.Normal mode |normal-index|
2.1.Text objects |objects|
2.2.Window commands |CTRL-W|
2.3.Square bracket commands |[|
2.4.Commands starting with 'g' |g|
2.5.Commands starting with 'z' |z|
3.Visual mode |visual-index|
4.Command-line editing |ex-edit-index|
5.EX commands |ex-cmd-index|
*****************************************************************************************
oracle知识点精简总结系列持续增加中:
Oracle用户及用户配置文件精简总结
Oracle的登陆认证方式精简总结
实例恢复相关原理精简总结
Oracle权限精简总结
Oracle角色精简总结
OLTP与OLAP的区别精简总结
无GUI智能部署oracle脚本及视频有哪些Oracle进程?消耗了多少存?
第五篇:十多年实战总结linux下vim编辑
Linux 下Vim+ctags编辑,查看代码和编辑代码,运用熟练比可视化软件工具编写快很多。边看边操作,以后也要经常养成用命令的习惯。忘记了就查阅。很棒的,值得收藏。首先简介下vim一些命令,然后再介绍Vim+ctags做代码开发。1.查找
/xxx(?xxx)
表示在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示
向上查找.其中xxx可以是正规表达式,关于正规式就不多说了.一般来说是区分大小写的, 要想不区分大小写, 那得先输入
:set ignorecase
查找到以后, 再输入 n 查找下一个匹配处, 输入 N 反方向查找.*(#)
当光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的
下(上)一个单词.同样, 再输入 n 查找下一个匹配处, 输入 N 反方
向查找.g*(g#)
此命令与上条命令相似, 只不过它不完全匹配光标所在处的单词, 而
是匹配包含该单词的所有字符串.gd
本命令查找与光标所在单词相匹配的单词, 并将光标停留在文档的非
注释段中第一次出现这个单词的地方.%
本命令查找与光标所在处相匹配的反括号, 包括()[] {}
f(F)x
本命令表示在光标所在行进行查找, 查找光标右(左)方第一个x字符.找到后:
输入;表示继续往下找
输入 , 表示反方向查找
2.快速移动光标
在 vi 中, 移动光标和编辑是两件事, 正因为区分开来, 所以可以很方便的进行光标定 位和编辑.因此能更快一点移动光标是很有用的.w(e)
移动光标到下一个单词.b
移动光标到上一个单词.0
移动光标到本行最开头.^
移动光标到本行最开头的字符处.$
移动光标到本行结尾处.H
移动光标到屏幕的首行.M
移动光标到屏幕的中间一行.L
移动光标到屏幕的尾行.gg
移动光标到文档首行.G
移动光标到文档尾行.c-f
(即 ctrl 键与 f 键一同按下)本命令即 page down.c-b
(即 ctrl 键与 b 键一同按下, 后同)本命令即 page up.''
此命令相当有用, 它移动光标到上一个标记处, 比如用 gd, * 等查
找到某个单词后, 再输入此命令则回到上次停留的位置.'.此命令相当好使, 它移动光标到上一次的修改行.`.此命令相当强大, 它移动光标到上一次的修改点.3.拷贝, 删除与粘贴
在 vi 中 y 表示拷贝, d 表示删除, p 表示粘贴.其中拷贝与删除是与光标移动命令
结合的, 看几个例子就能够明白了.yw
表示拷贝从当前光标到光标所在单词结尾的内容.dw
表示删除从当前光标到光标所在单词结尾的内容.y0
表示拷贝从当前光标到光标所在行首的内容.d0
表示删除从当前光标到光标所在行首的内容.y$
表示拷贝从当前光标到光标所在行尾的内容.d$
表示删除从当前光标到光标所在行尾的内容.yfa
表示拷贝从当前光标到光标后面的第一个a字符之间的内容.dfa
表示删除从当前光标到光标后面的第一个a字符之间的内容.特殊地:
yy
表示拷贝光标所在行.dd
表示删除光标所在行.D
表示删除从当前光标到光标所在行尾的内容.关于拷贝, 删除和粘贴的复杂用法与寄存器有关, 可以自行查询.4.数字与命令
在 vi 中数字与命令结合往往表示重复进行此命令, 若在扩展模式的开头出现则表示行
号定位.如:
5fx
表示查找光标后第 5 个 x 字符.5w(e)
移动光标到下五个单词.5yy
表示拷贝光标以下 5 行.5dd
表示删除光标以下 5 行.y2fa
表示拷贝从当前光标到光标后面的第二个a字符之间的内容.:12,24y
表示拷贝第12行到第24行之间的内容.:12,y
表示拷贝第12行到光标所在行之间的内容.:,24y
表示拷贝光标所在行到第24行之间的内容.删除类似.5.快速输入字符
在 vi 中, 不要求你输入每一个字符, 可以有很多种方法快速输入一些字符.使用 linux/unix 的同学一定有一个经验, 在命令行下输入命令时敲入头几个字符再按
TAB 系统就会自动将剩下的字符补齐, 假如有多个匹配则会打印出来.这就是著名的命令
补齐(其实windows中也有文件名补齐功能).vi 中有许多的字符串补齐命令, 非常方便.c-p(c-n)
在编辑模式中, 输入几个字符后再输入此命令则 vi 开始向上(下)搜
索开头与其匹配的单词并补齐, 不断输入此命令则循环查找.此命令
会在所有在这个 vim 程序中打开的文件中进行匹配.c-x-l
在编辑模式中, 此命令快速补齐整行内容, 但是仅在本窗口中出现的
文档中进行匹配.c-x-f
在编辑模式中, 这个命令表示补齐文件名.如输入:
/usr/local/tom 后再输入此命令则它会自动匹配出:
/usr/local/tomcat/
abbr
即缩写.这是一个宏操作, 可以在编辑模式中用一个缩写代替另一个
字符串.比如编写java文件的常常输入 System.out.println, 这很
是麻烦, 所以应该用缩写来减少敲字.可以这么做:
:abbr sprt System.out.println
以后在输入sprt后再输入其他非字母符号, 它就会自动扩展为System.out.println
6.替换
替换是 vi 的强项, 因为可以用正规表达式来匹配字符串.以下提供几个例子.:s/aa/bb/g
将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb
:s/
将光标所在行出现的所有 aa 替换为 bb, 仅替换 aa 这个单词
:%s/aa/bb/g
将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb
:12,23s/aa/bb/g 将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb
:12,23s/^/#/
将从12行到23行的行首加入 # 字符
:%s= *$==
将所有行尾多余的空格删除
:g/^s*$/d
将所有不包含字符(空格也不包含)的空行删除.7.多文件编辑
在一个 vim 程序中打开很多文件进行编辑是挺方便的.:sp(:vsp)文件名
vim 将分割出一个横(纵)向窗口, 并在该窗口中打开新文件.从 vim6.0 开始, 文件名可以是一个目录的名称, 这样, vim 会
把该目录打开并显示文件列表, 在文件名上按回车则在本窗口打
开该文件, 若输入 O 则在新窗口中打开该文件, 输入 ? 可以看
到帮助信息.:e 文件名
vim 将在原窗口中打开新的文件, 若旧文件编辑过, 会要求保存.c-w-w
vim 分割了好几个窗口怎么办? 输入此命令可以将光标循环定位
到各个窗口之中.:ls
此命令查看本 vim 程序已经打开了多少个文件, 在屏幕的最下方
会显示出如下数据:
%a
“usevim.html”
行 162
#
“xxxxxx.html”
行 0
其中:
表示打开的文件序号, 这个序号很有用处.%a
表示文件代号, % 表示当前编辑的文件,# 表示上次编辑的文件
“usevim.html”
表示文件名.行 162
表示光标位置.:b 序号(代号)
此命令将指定序号(代号)的文件在本窗口打开, 其中的序号(代号)
就是用 :ls 命令看到的.:set diff
此命令用于比较两个文件, 可以用
:vsp filename
命令打开另一个文件, 然后在每个文件窗口中输入此命令,就能看
到效果了.8.宏替换
vi 不仅可以用 abbr 来替换文字, 也可以进行命令的宏定义.有些命令输起来很费劲,因此我把它们定义到
(windows 下为 $VIM/_vimrc)中, 写进去的时候不用写前面的冒号.:nmap
:nmap
命令模式下转移光标到不同窗口
:imap
:nmap
:java 中:(注, 这里为什么说 java 中, 因为以下定义对其他文件格式不起作用, 下文
会说到如何实现这一点)
:nmap
此命令用 javac 编译 java 文件, 它会自动将光标定位到出错点.不过这需要定
义一个 javac.vim 文件在 $VIM/compiler 下, 在 javac.vim 里面只有两行字:
setlocal makeprg=javac
setlocal errorformat=%A%f:%l: %m,%-Z%p^,%-C%.%#
:nmap
此命令用 ant 编译 java 文件, 它会自动将光标定位到出错点.一般来说, 安装
vim 后已经有了compiler/ant.vim文件, 因此这个命令可以直接使用.但是需要
在当前目录下有 build.xml 文件, 当然还必须安装 ant 才行.:nmap
:nmap
:nmap
:nmap
:nmap
此命令用于在窗口左部分割出一个新窗口, 里面的内容是 java 的资源树, 包括
本文件中出现的类, 类的成员变量及成员方法, 就好像 JCreator 表现的那样.在这个窗口中输入 ? 会看到帮助.嘿嘿, 很好用, 不过需要 ctags 支持.:imap
TAB 就是制表符, 单独拿出来做一节是因为这个东西确实很有用.<<输入此命令则光标所在行向左移动一个 tab.>>输入此命令则光标所在行向右移动一个 tab.5>>输入此命令则光标后 5 行向右移动一个 tab.:12,24>此命令将12行到14行的数据都向右移动一个 tab.:12,24>>此命令将12行到14行的数据都向右移动两个 tab.那么如何定义 tab 的大小呢? 有人愿意使用 8 个空格位, 有人用4个, 有的用2个.有的人希望 tab 完全用空格代替, 也有的人希望 tab 就是 tab.没关系, vim 能
帮助你.以下的设置一般也都先写入配置文件中, 免得老敲.:set shiftwidth=4
设置自动缩进 4 个空格, 当然要设自动缩进先.:set sts=4
即设置 softtabstop 为 4.输入 tab 后就跳了 4 格.:set tabstop=4
实际的 tab 即为 4 个空格, 而不是缺省的 8 个.:set expandtab
在输入 tab 后, vim 用恰当的空格来填充这个 tab.10.autocmd
这个命令十分的强大, 可以用这个命令实现对不同的文件格式应用不同的配置;可以
在新建文件时自动添加上版权声明等等.这些命令一般定义在 ~/.vimrc 这样的配置文件
里面.由于他很强大, 所以我不能给出很具体的说明, 只能举几个例子, 详细的请看帮助.:autocmd!
删除所有之前的自动命令.autocmd FileType
java
source ~/.vim/files/java.vim
autocmd FileType
java
source ~/.vim/files/jcommenter.vim
以上两条命令让我在打开 java 文件时才应用后面提到的两个配置文件.autocmd BufNewFile
*.java
0r ~/.vim/files/skeletons/java.skel
以上这条命令让我在新建 java 文件时自动加入 java.skel 文件的内容.autocmd BufNewFile
*.java
normal gnp
以上这条命令让我在新建 java 文件时自动运行 gnp 命令, 这个命令进行一些特殊化
处理, 比如将新 java 文件中的 __date__ 替换成今天的日期什么的.11.常用脚本
在 vim.sf.net 你可以发现很多脚本(script), 这些脚本常常有让你意想不到的作用.我常用的有:
jcommenter.vim
自动加入 javadoc 风格的注释.JBrowser.vim
类资源浏览.C, C++ 等可以用 Tlist
还有许多有用的, 比如 checkstyle.vim 可以检验你的编程风格, jad.vim 可以直接
反编译.class 文件等等.12.常用配置
在~/.vimrc 配置文件中你常常需要一些个性化配置.比如上面写的一些宏定义, 一些
autocmd 定义等等.比如:
set suffixes=.bak,~,.o,.h,.info,.swp,.aux,.bbl,.blg,.dvi,.lof,.log,.lot,.ps,.toc
这样在vim中打开文件时, 按 tab 键补齐文件名时它会忽略上述文件.set nu
显示行号
set ai
设置自动缩进
map Y y$
让 Y 和 D 一样, 要不然 Y 的本意和 yy 一样.vim+ctags用法:
[/home/brimmer/src]$ ctags-R “-R”表示递归创建,也就包括源代码根目录下的所有子目录下的源程序。“tags”文件中包括这些对象的列表: l 用#define定义的宏 l 枚举型变量的值 l 函数的定义、原型和声明 l 名字空间(namespace)l 类型定义(typedefs)l 变量(包括定义和声明)
l 类(class)、结构(struct)、枚举类型(enum)和联合(union)l 类、结构和联合中成员变量或函数
VIM用这个“tags”文件来定位上面这些做了标记的对象,下面介绍一下定位这些对象的方法: 1)用命令行。在运行vim的时候加上“-t”参数,例如: [/home/brimmer/src]$ vim-t foo_bar 这个命令将打开定义“foo_bar”(变量或函数或其它)的文件,并把光标定位到这一行。2)在vim编辑器内用“:ta”命令,例如: :ta foo_bar 3)最方便的方法是把光标移到变量名或函数名上,然后按下“Ctrl-]”。用“Ctrl-o”退回原来的地方。
注意:运行vim的时候,必须在“tags”文件所在的目录下运行。否则,运行vim的时候还要用“:set tags=”命令设定“tags”文件的路径,这样vim才能找到“tags”文件。在函数中移动光标
[{ 转到上一个位于第一列的“{” }] 转到下一个位于第一列的“{” { 转到上一个空行 } 转到下一个空行
gd 转到当前光标所指的局部变量的定义 * 转到当前光标所指的单词下一次出现的地方 # 转到当前光标所指的单词上一次出现的地方
Vim 的创造者是一名计算机程序员,因此这就不奇怪 Vim 中有许多帮助编写程序的功能: 跳转到标识符被定义和使用的地方;在另一个窗口中预览有关的声明等等。在下一章中还 会介绍更多的功能。
使用标签
什么是标签?标签就是一个标识符被定义的地方。一个例子就是 C 或者 C++ 程序中的函 数定义。标签列表可以保存在一个标签文件中。Vim 可以通过它来从任何地方跳转到该标签,也就是一个标识符被定义的地方。
在当前目录下为所有的 C 文件生成标签文件,使用下面的这个命令:
ctags *.c
“ctags” 是一个独立的程序。大多数 Unix 系统上都已经安装了它。如果你还没有安装,可以在这里找到 “Exuberant ctags”:
http://ctags.sf.net
现在你可以使用下面的命令跳转到一个函数定义的地方:
:tag startlist
这个命令会找到函数 “startlist”,即使该函数是在另一个文件中。
CTRL-] 命令会跳转到当前光标下单词的标签。这样浏览毫无头绪的 C 代码会变得更容 些易。举个例子,假设你在函数 “write_block” 中。你可以看到它调用了函数
“write_line”。但 “write_line” 做了什么呢?将光标置于调用 “write_line” 的地方然 后按 CTRL-],你就跳转到了这个函数的定义的地方了。
“write_line” 函数调用了 “write_char”。你需要知道它做了什么。将光标定位到调 用 “write_char” 的地方然后按 CTRL-],你就到了定义“write_char” 的地方。
+------+ |void write_block(char **s;int cnt)| |{ | | int i;| | for(i = 0;i < cnt;++i)| | write_line(s[i]);| |} | | +-----------|-------------------------+ | CTRL-] | | +----------------------------+ +--> |void write_line(char *s)| |{ | | while(*s!= 0)| | write_char(*s++);| |} | | +--------|-------------------+ | CTRL-] | | +-----+ +--> |void write_char(char c)| |{ | | putchar((int)(unsigned char)c);| |} | +-----+
“:tags” 命令显示你经过的标签列表: :tags # TO tag FROM line in file/text 1 1 write_line 8 write_block.c 2 1 write_char 7 write_line.c >
现在介绍向回跳转。CTRL-T 命令跳转到上一个标签。在上例中,你会回到 “write_line” 函数调用 “write_char” 的地方。
这个命令接受一个计数参数,用来表示跳转回去的标签个数。你已经向前跳转,现在 又跳转了回去。现在我们再一次向前跳转。下面的命令跳转到标签列表中最上面的标签:
:tag
你可以在前面加上要向前跳转的标签个数。比如:“:3tag”。CTRL-T 同样可以加上一个 计数参数。
通过这些命令,你可以用 CTRL-] 延着调用树向前跳转, 用 CTRL-T 向回跳转,用 “:tags” 命令显示当前位置。
分 割 窗 口
“:tag” 命令会将当前窗口的文件替换为包含新函数的文件。怎样才能同时查看两个文件 呢?你可以使用 “:split” 命令将窗口分开然后再用 “:tag” 命令。Vim 有个缩写命令可 以做到这些:
:stag tagname
使用下面的命令可以分割当前窗口并跳转到光标下的标签:
CTRL-W ]
如果指定了计数参数,新窗口将包含指定的那么多行。
多 个 标 记 文 件
如果在多个目录中都有文件,你可以在每一个目录下创建一个标签文件。Vim 只能跳转到 那个目录下的标签。
通过设定 'tags' 选项,你可以使用多个相关的标签文件。比如:
:set tags=./tags,./../tags,./*/tags
这会使 Vim 找到当前文件所在目录及其父目录和所有子目录下的标签文件。
这已经是不少的标签文件了,但也许仍不够。比如,当编辑 “~/proj/src” 目录下的 一个文件时,你无法找到 “~/proj/sub/tags” 目录下的标签文件。对这种情况,Vim 提供了一个查找整个目录树下标签文件的方法,比如:
:set tags=~/proj/**/tags
单 个 标 记 文 件
当 Vim 在多个地方查找标签文件时,你会听到硬盘在格格作响。这样会有点慢。在这种 情况下,你最好将这些时间花在生成一个大的标签文件上。你可以要等一会儿。
这得借助上面提到的 “Exuberant ctags” 程序。它有一个选项可以搜索整个目录树:
cd ~/proj ctags-R.这样做的好处是 “Exuberant ctags” 可以识别多种文件类型,它不仅适用于 C 和 C++ 程序,还适用于 Eiffel 甚至 Vim 脚本。请参考 ctags 文档进行调整所用参数。
现在你只需要告诉 Vim 你的标签文件在何处:
:set tags=~/proj/tags
多 个 匹 配
当一个函数(或类中的方法)被定义多次,“:tags” 命令会跳转到第一处。如果在当前 文件中存在匹配,那它将会被首先使用。
你现在可以跳转到同一个标签的其它匹配处:
:tnext
重复执行这个命令可以找到更多的匹配。如果存在很多匹配,你可以选择要跳转到哪一 个:
:tselect tagname
Vim 会为你展示一个选择列表:
# pri kind tag file 1 F f mch_init os_amiga.c mch_init()2 F f mch_init os_mac.c mch_init()3 F f mch_init os_msdos.c mch_init(void)4 F f mch_init os_riscos.c mch_init()Enter nr of choice(
你现在可以输入要跳转到的匹配代号(在第一列)。其它列的信息可以让你知道匹配在何 处被定义。
可以用这些命令在各匹配的标签间移动:
:tfirst 到第一个匹配
:[count]tprevious 向前 [count] 个匹配 :[count]tnext 向后 [count] 个匹配 :tlast 到最后一个匹配
如果没有指定,[count] 省缺为一。
猜 测 标 签 名
命令行补全是避免输入长标签名的好办法。只需输入开始的一部分然后按
:tag write_
你会得到第一个匹配。如果这不是你想要的,重复输入
有时你只知道一个函数名的一部分,或是你有很多以相同字符串开头而结尾不同的标 记。这时你可以告诉 Vim 使用一个模式来查找标签。
假设你要跳转到一个包含 “block” 的标签。首先输入:
:tag /block
现在再利用命令行补全功能:输入
标签名前面的 “/” 告诉 Vim 这不是一个确定的标签名而是一个模式。你可以利用有 关查找模式的所有特性。举个列子,假设你要选择所有以 “write_” 开头的标签:
:tselect /^write_
“^” 指定标签以 “write_” 开头,否则在中间含有 “write_” 的标签名也会被找到。类似 地,“___FCKpd___0quot;指定标签名结尾处的匹配。
标 签 浏 览 器
CTRL-] 可以让你跳转到光标所在标识符的定义处,因此你可以利用标识符的列表来形成 一个目录。这里给出一个例子。
首先生成一个标识符列表(需要 Exuberant ctags):
ctags--c-types=f-f functions *.c
现在打开 Vim 并在一个垂直分割窗口中编辑这个文件: vim :vsplit functions
窗口中包含一个所有函数的列表。其它的东西可以被忽略。用 ”:setlocal ts=99“ 命令 使其显示得更清晰些。
在这个窗口中,定义一个 mapping:
:nnoremap
移动光标至要跳转到函数的所在行,输入
相 关 杂 项
你可以设定 'ignorecase' 选项来忽略标签名里的大小写。
'tagbsearch' 选项标明标签文件是否经过排序。省缺是假定为标签文件已排序,这样会 使查找更快,但如果文件没有被排序是无法工作的。
'taglength' 选项可用来告诉 Vim 一个标签的有效字符个数。
当你使用 SNiFF+ 程序时,你可以利用 Vim 的有关接口 |sniff|。SNiFF+ 是一个商业 软件。
Cscope 是一个自由软件。它不仅可以找到一个标识符被声明的地方,还可以找到标识符 被使用的地方。请参考 |cscope|。
预览窗口
当编辑含有函数调用的代码时,你需要使用正确的调用参数。要获知所要传递的值,你可以 查看这个函数是如何定义的。标签机制对此十分适用。如果定义可在另一个窗口内显示那 就更好了。对此我们可以利用预览窗口。
打开一个预览窗口来显示函数 “write_char”:
:ptag write_char
Vim 会打开一个窗口,跳转到 “write_char” 标签。然后它会回到原来的位置。这样你可 以继续输入而不必使用 CTRL-W 命令。
如果函数名出现在文本中,你可以用下面的命令在预览窗口中得到其定义:
CTRL-W }
有一个脚本可以自动显示光标处的标签定义。请参考 |CursorHold-example|。
用下面的命令关闭预览窗口:
:pclose
要在预览窗口中编辑一个指定的文件,用 “:pedit”。这在编辑头文件时很有用,比如:
:pedit defs.h
最后,“psearch” 可用来查找当前文件和任何包含文件中的单词并在预览窗口中显示匹 配。这在使用没有标签文件的库函数时十分有用。例如:
:psearch popen
这会在预览窗口中显示含有 popen()原型的 “stdio.h” 文件:
FILE *popen __P((const char *, const char *));
你可以用 'previewheight' 选项指定预览窗口打开时的高度。
在代码间移动
因为程序代码是结构化的,Vim 可以识别其中的有关项目。一些特定的命令可用来完成相 关的移动。
C 程序中经常包含类似下面的代码:
#ifdef USE_POPEN fd = popen(“ls”, “r”)#else fd = fopen(“tmp”, “w”)#endif
有时会更长,也许还有套嵌。将光标置于 “#ifdef” 处按 %。Vim 会跳转到“#else”。继 续按 % 会跳转到 “#endif”。再次按下 % 又回到原来的 “#ifdef”。
当代码套嵌时,Vim 会找到相匹配的项目。这是检查你是否忘记了一个 “#endif” 的 好办法。
当你在一个 “#ifdef”“#endif” 块。例如:
#if defined(HAS_INC_H)a = a + inc();# ifdef USE_THEME a += 3;# endif set_width(a);
如果光标在最后一行,“[#” 会移动到第一行。中间的 “#ifdef”*/ 注释 有效。
+-> +-> /* | [/ | * A comment about--+ [/ | +--* wonderful life.| ]/ | */ <-+ | +--foo = bar * 3;--+ | ]/ /* a short comment */ <-+
查找全局标识符
你在编辑一个 C 程序,想要知道一个变量是被声明为 “int” 还是 “unsigned”。一个快 速的方法是使用 “[I” 命令来查找。
假设光标在单词 “column” 处。输入:
[I Vim 会列出它所找出的匹配行,不仅在当前文件内查找,还会在所有的包含文件中查找。结果如下所示:
structs.h 1: 29 unsigned column;/* column number */
相对使用标签文件或预览窗口的好处是包含文件也被搜索。大多数情况下都能找到正确 的声明。即使标签文件已经过期或者你没有为包含文件建立标签也不会影响结果。
但是一些准备工作是必要的,否则 “[I” 就没法工作。首先,'include' 选项必须指 定文件是如何被包含的。省缺值适用于 C 和 C++。对其它的语言,你需要自己设定。
定 位 包 含 文 件
Vim 会找到 'path' 选项指定路径中的包含文件。如果缺少某个目录,一些包含文件 将不会被找到。你可以用这个命令来查看:
:checkpath
它会列出不能找到的包含文件,以及被找到的包含文件。一个输出样例:
---Included files not found in path---
文件 “io.h” 被当前文件包含但无法找到。“vim.h” 可以找到,这样 “:checkpath” 跟进 这个文件并检查其中的包含文件。结果显示无法找到 “vim.h” 包含的 “functions.h” 和 “clib/exec_protos.h” 文件。
Note: Vim 不是一个编译器。它无法识别 “#ifdef” 语句。这就是说所有的 “#include” 语句都会被使用,即使它在 “#if NEVER” 之后。
给 'path' 选项增加一个目录可以修正无法找到文件的错误。一个好得参考是 Makefile。注意那些包括 “-I” 的条目,比如 “-I/usr/local/X11”。要增加这个目录,用:
:set path+=/usr/local/X11
如果有很多的子目录,你可以用 “*” 通配符。例如:
:set path+=/usr/*/include 这会找到 “/usr/local/include” 以及 “/usr/X11/include” 目录下的文件。
如果你的工程项目的包含文件都在一个套嵌的目录树下,“**” 就非常有用。它会搜索所 有的子目录。例如:
:set path+=/projects/invent/**/include
这会找到这些目录下的文件:
/projects/invent/include /projects/invent/main/include /projects/invent/main/os/include etc.还有其它的可能性。更多信息,请查看 'path' 选项。
如果你想查看找到的包含文件,用这个命令:
:checkpath!
你会得到一个(很长)的包含文件列表。为使它更短些,Vim 会对已经找到的文件显示 “(Already listed)” 而不再重新显示一遍。
跳 转 到 匹 配
“[I” 产生一个每项只有一行文本的列表。如果你想要进一步的查看第一项,你可以这个 命令来跳转:
[
你也可以使用 “[ CTRL-I”, 因为 CTRL-I 和按
“[I” 产生的列表在每行的开头都有一个序号。如果你要跳转到第一项外的其它项,首先 输入序号:
3[
会跳转到列表中的第三项。记住你可以用 CTRL-O 跳回到原来的地方。
相 关 命 令
[i 只列出第一项匹配 ]I 只列出光标下面的项目 ]i 只列出光标下面的第一项匹配
查 找 宏 定 义 标 识 符
“[I” 命令查找任何标识符。只查找 “#define” 定义的宏,用:
[D
同样,这会在所有的包含文件中查找。'define' 选项指定 “[D” 所查找的预定义样式。你需要改变它值来适用于 C 或 C++ 以外的语言。“[D” 相关命令:
[d 只列出第一项匹配 ]D 只列出光标下面的项目
]d 只列出光标下面的第一项匹配
*29.5* 查找局部标识符
“[I” 命令查找所有的包含文件。要在当前文件中查找并跳转到光标处单词被首次使用的 地方,用:
gD
提示:Goto Definition。这个命令对查找局部(C 语言中的 “static”)声明的变量或函 数很有用。例如(光标在 “counter” 处):
+-> static int counter = 0;| | int get_counter(void)gD | { | ++counter;+--return counter;}
要进一步的缩小查找范围,只在当前函数内查找,用这个命令:
gd
这会回到当前函数的开始处寻找光标处单词首次出现的地方。实际上,它是向后找到一个 在第一列 '{' 上面的空行,然后再从那里向前查找标识符。例如(光标位于 idx 上):
int find_entry(char *name){ +-> int idx;| gd | for(idx = 0;idx < table_len;++idx)| if(strcmp(table[idx].name, name)== 0)+--return idx;} 好好收藏,多动手,工多手熟!