vim使用技巧
1赞一直在用gvim编写verilog代码,以前根本不怎么使用上面自带的命令,都是傻瓜式手动操作,效率是极其低下,在尝试了一些基本命令和使用技巧后,感觉非常easy,效率有了很大提高,特别是代码复用上。今天花时间,整理了下gvim的快捷键,每个都尝试了下,也鼓励大家花时间都玩一下,掌握一些实用的技巧。
移动光标类命令
h:光标左移一个字符
l:光标右移一个字符
space:光标右移一个字符
Backspace:光标左移一个字符
k或Ctrl+p:光标上移一行
j或Ctrl+n:光标下移一行
Enter:光标下移一行
w或W:光标右移一个字至字首
b或B:光标左移一个字至字首
e或E:光标右移一个字至字尾
):光标移至句尾
(:光标移至句首
}:光标移至段落开头
{:光标移至段落结尾
nG:光标移至第n行首
n+:光标下移n行
n-:光标上移n行
$:光标移至当前行尾
^:移到当前行的第一个非空字符
n$:光标移至第n行尾
0:(注意是数字零)光标移至当前行首
G:跳至文件的底部
[[:跳至文件的开头
]]:跳至文件的底部
H:光标移至屏幕顶行
M:光标移至屏幕中间行
L:光标移至屏幕最后行
ctrl+l:重绘屏幕
z:将当前行置为屏幕的顶行
z-:将当前行置为屏幕的底行
m(a-z):用一个字母来标记当前位置,如用mz表示标记z
'(a-z):将光标移动到指定的标记,如用'z表示移动到z
屏幕翻滚类命令
Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
Ctrl+f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
插入文本类命令
i:在光标前
I:在当前行首
a:光标后
A:在当前行尾
o:在当前行之下新开一行
O:在当前行之上新开一行
r:替换当前字符
R:替换当前字符及其后的字符,直至按ESC键
s:从当前光标位置处开始,以输入的文本替代指定数目的字符
S:删除指定数目的行,并以所输入文本代替之
复制、粘贴
yy:将当前行的内容放入临时缓冲区
nyy:将n行的内容放入临时缓冲区
p:将临时缓冲区中的文本放入光标后
P:将临时缓冲区中的文本放入光标前
(a-z)nyy:复制n行放入名字为圆括号内的可命名缓冲区,省略n表示当前行
(a-z)ndd:删除n行放入名字为圆括号内的可命名缓冲区,省略n表示当前行
(a-z)p:将名字为圆括号的可命名缓冲区的内容放入当前行后
(a-z)P:将名字为圆括号的可命名缓冲区的内容放入当前行前
:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d:将n1行到n2行之间的内容删除
删除命令
de:删除当前字符
dw:删至下一个字的开头
db:删除光标前面的字
ndw或ndW:删除光标处开始及其后的n-1个字
do:删至行首
dw:删至下一个字的开头
dG:删除行,直到文件结束
d$:删至行尾
dd:删除当前行
ndd:向下删除当前行在内的n行
x或X:删除一个字符,x删除光标后的,而X删除光标前的
u或U:撤销,u撤销上一步操作,U撤销对当前行的所有操作
Ctrl+u:删除输入方式下所输入的文本
J:将下一行连接到当前行的末尾
nJ:连接后面n行
文本替换
:s/old/new:用new替换行中首次出现的old
:s/old/new/g:用new替换行中所有的old
:n,m s/old/new/g:用new替换从n到m行里所有的old
:%s/old/new/g:用new替换当前文件里所有的old
搜索及替换命令
/pattern:从光标开始处向文件尾搜索pattern
?pattern:从光标开始处向文件首搜索pattern
n:在同一方向重复上一次搜索命令
N:在反方向上重复上一次搜索命令
保存文本和退出
:w:保存文件但不退出
:w file:将修改保存在file中但不退出
:wq或ZZ或:x保存文件并退出
:q!不保存文件,退出
:e!放弃所有修改,从上次保存文件开始再编辑
补充
选项设置
:set all打印所有选项
:set nooption关闭option选项
:set nu每行前打印行号
:set showmode显示是输入模式还是替换模式
:set autoindent继承前一行的缩进方式,特别适用于多行注释
:set smartindent为C程序提供自动缩进
:set list显示制表符和行尾符号
:set ts=8为文本输入设置tab stops
:set window=n设置文本窗口显示n行
:set number显示行数
:setterm:设置终端类型
:setignorance:在搜索中忽略大小写
:setreport:显示由面向行的命令修改过的数目
:setterse:显示简短的警告信息
:setwarn:在转到别的文件时若没保存当前文件则显示NO write信息
:setnomagic:允许在搜索模式中,使用前面不带“/”的特殊字符
:setnowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
:setmesg:允许vi显示其他用户用write写到自己终端上的信息
vimrc配置
set shortmess=atI "启动的时候不显示那个援助乌干达儿童的提示
winpos 5 5 "设定窗口位置
set lines=40 columns=155 "设定窗口大小
set go= "不要图形按钮
color asmanian2 "设置背景主题
set guifont=Courier_New:h10:cANSI "设置字体
syntax on "语法高亮
autocmd InsertLeave * se nocul "用浅色高亮当前行
autocmd InsertEnter * se cul "用浅色高亮当前行
set ruler "显示标尺
set showcmd "输入的命令显示出来,看的清楚些
set cmdheight=1 "命令行(在状态行下)的高度,设置为1
set whichwrap+=<,>,h,l "允许backspace和光标键跨越行边界(不建议)
set scrolloff=3 "光标移动到buffer的顶部和底部时保持3行距离
set novisualbell "不要闪烁(不明白)
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")} "状态行显示的内容
set laststatus=1 "启动显示状态行(1),总是显示状态行(2)
set foldenable "允许折叠
set foldmethod=manual "手动折叠
set background=dark "背景使用黑色
set nocompatible "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
"显示中文帮助
if version >= 603
set helplang=cn
set encoding=utf-8
endif
"设置配色方案
colorscheme murphy
"字体
if (has("gui_running"))
set guifont=Bitstream\ Vera\ Sans\ Mono\ 10
endif
vim编码方式的设置
和所有的流行文本编辑器一样,Vim可以很好的编辑各种字符编码的文件,这当然包括UCS-2、UTF-8等流行的Unicode编码方式。然而不幸的是,和很多来自Linux世界的软件一样,这需要你自己动手设置。
Vim有四个跟字符编码方式有关的选项,encoding、fileencoding、fileencodings、termencoding (这些选项可能的取值请参考Vim在线帮助:help encoding-names),它们的意义如下:
* encoding: Vim内部使用的字符编码方式,包括Vim的buffer (缓冲区)、菜单文本、消息文本等。默认是根据你的locale选择.用户手册上建议只在.vimrc中改变它的值,事实上似乎也只有在.vimrc中改变它的值才有意义。你可以用另外一种编码来编辑和保存文件,如你的vim的encoding为utf-8,所编辑的文件采用cp936编码,vim会 自动将读入的文件转成utf-8(vim的能读懂的方式),而当你写入文件时,又会自动转回成cp936(文件的保存编码).
* fileencoding: Vim中当前编辑的文件的字符编码方式,Vim保存文件时也会将文件保存为这种字符编码方式(不管是否新文件都如此)。
* fileencodings: Vim自动探测fileencoding的顺序列表,启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将fileencoding设置为最终探测到的字符编码方式。因此最好将Unicode编码方式放到这个列表的最前面,将拉丁语系编码方式latin1放到最后面。
* termencoding: Vim所工作的终端(或者Windows的Console窗口)的字符编码方式。如果vim所在的term与vim编码相同,则无需设置。如其不然,你可以用vim的termencoding选项将自动转换成term的编码.这个选项在Windows下对我们常用的GUI模式的gVim无效,而对Console模式的Vim而言就是Windows控制台的代码页,并且通常我们不需要改变它。
好了,解释完了这一堆容易让新手犯糊涂的参数,我们来看看Vim的多字符编码方式支持是如何工作的。
1. Vim启动,根据.vimrc中设置的encoding的值来设置buffer、菜单文本、消息文的字符编码方式。
2.读取需要编辑的文件,根据fileencodings中列出的字符编码方式逐一探测该文件编码方式。并设置fileencoding为探测到的,看起来是正确的(注1)字符编码方式。
3.对比fileencoding和encoding的值,若不同则调用iconv将文件内容转换为encoding所描述的字符编码方式,并且把转换后的内容放到为此文件开辟的buffer里,此时我们就可以开始编辑这个文件了。注意,完成这一步动作需要调用外部的iconv.dll(注2),你需要保证这个文件存在于$VIMRUNTIME或者其他列在PATH环境变量中的目录里。
4.编辑完成后保存文件时,再次对比fileencoding和encoding的值。若不同,再次调用iconv将即将保存的buffer中的文本转换为fileencoding所描述的字符编码方式,并保存到指定的文件中。同样,这需要调用iconv.dll由于Unicode能够包含几乎所有的语言的字符,而且Unicode的UTF-8编码方式又是非常具有性价比的编码方式(空间消耗比UCS-2小),因此建议encoding的值设置为utf-8。这么做的另一个理由是encoding设置为utf-8时,Vim自动探测文件的编码方式会更准确(或许这个理由才是主要的;)。我们在中文Windows里编辑的文件,为了兼顾与其他软件的兼容性,文件编码还是设置为GB2312/GBK比较合适,因此fileencoding建议设置为chinese (chinese是个别名,在Unix里表示gb2312,在Windows里表示cp936,也就是GBK的代码页)。
在Windows下乱码解决办法
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
set langmenu=zh_CN.utf-8
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
language messages zh_cn.utf-8