vim使用技巧.docx
《vim使用技巧.docx》由会员分享,可在线阅读,更多相关《vim使用技巧.docx(36页珍藏版)》请在冰豆网上搜索。
![vim使用技巧.docx](https://file1.bdocx.com/fileroot1/2023-1/21/8db48592-3301-4073-81e3-64af8d17f705/8db48592-3301-4073-81e3-64af8d17f7051.gif)
vim使用技巧
vim使用技巧
vim常用技巧
所以我初步设想分三大部分来写
(1)vim基础
(2)vimtips的翻译和解释
(3)vimrc
由于水平所限,有错误和可笑之处,恳请批评。
这里就附带说一下vim基础了
很简单的概括一下:
1.程序
Unix:
vim
Win:
gvim
2.工作方式
normalmode普通模式
insertmode插入模式
visualmode可视模式
visual-linemode
visual-blockmode
command-linemode命令行模式
searchmode搜索模式
模式切换:
记住Esc总可以返回普通模式
normal=i=>insert
normal=v=>visual
normal=Shift-V=>visual-line
normal=Ctrl-V=>visual-block
normal=:
=>command-line
normal=/=>search
3.光标移动
开始,会用方向键和PgUp,PgDn就可以用了
vim和perl一样,你掌握一个子集,就可以很好的使用了
4.最后,说一下两个概念和
称为狭义字,它指一个单词,其中不包含空白和特殊字符
称为广义字,它所指的单词可以包含一些特殊字符
具体有那些字符可以看help
通常,它们会和你想的一样:
)
因为第二部分经常用到这个概念,所以在此说一下
----------------------------------------
#基础
----------------------------------------
*#g*g# :
寻找光标处的狭义单词()(前向/后向)
% :
括号配对寻找{}[]()
matchit.vim :
使得%能够配对标记 等等
:
插入模式下的单词自动完成
:
行自动完成(超级有用)
/ :
把狭义单词 写到搜索命令行
/ :
把广义单词 写到搜索命令行
:
setignorecase :
搜索时忽略大小写
:
syntaxon :
在Perl,HTML,PHP等中进行语法着色
:
hregexp :
按下control-D键即可得到包含有regexp的帮助主题的列表
:
(使用TAB可以实现帮助的自动补齐)
----------------------------------------
#使更新_vimrc更容易
:
nmap,s:
source$VIM/_vimrc
#译释:
nmap是绑定一个在normal模式下的快捷键
:
nmap,v:
e$VIM/_vimrc
#译释:
在normal模式下,先后按下,s两个键执行_vimrc,而,v则是编辑_vimrc
----------------------------------------
#visual模式(例子是:
轻松添加其他的HTMLTags)
:
vmapsb"zdiz :
在visual模式下选中的文字前后分别加上和
#译释:
vmap是绑定一个在visual模式下的快捷键
#译释:
原理:
在visual模式下,"zd把一个选中的区域命名为z然后删除,
#i进入插入模式,输入,z撤销刚才的删除,然后再写入,
#最后返回normal模式
#译释:
"z命令创建一个选中的区域为register,并把它命名为z
#译释:
更令人开心的有:
在visual模式下选中几行,然后输入2>,
# 则选中的行会全部缩进两个tab
# 555,偶一开始还是用:
xx,xxs/^/\t\t/,好傻啊!
:
vmapst"zdiz?
> :
在visual模式下选中的文字前后分别加上和?
>
----------------------------------------
#文件浏览
:
Ex :
开启目录浏览器,注意首字母E是大写的
:
Sex :
在一个分割的窗口中开启目录浏览器
:
ls :
显示当前buffer的情况
:
cd.. :
进入父目录
:
args :
显示目前打开的文件
:
lcd%:
p:
h :
更改到当前文件所在的目录
#译释:
lcd是紧紧改变当前窗口的工作路径,%是代表当前文件的文件名,
#加上:
p扩展成全名(就是带了路径),加上:
h析取出路径
:
autocmdBufEnter*lcd%:
p:
h :
自动更改到当前文件所在的目录
#译释:
autocmd指定一个自动命令,BufEnter指定一个事件,*指定事件的对象,
#lcd%:
p:
h指定一个动作
#hehe,好像和写记叙文差不多
----------------------------------------
#缓冲区(buffer)浏览器(第三方的一个最流行的脚本)
#需要下载bufexplorer.vim,http:
//www.vim.org/script.php?
script_id=42上就有
\be :
在缓冲区浏览器中打开缓冲区列表
\bs :
以分割窗口的形式打开缓冲区浏览器
----------------------------------------
#大小写转换
guu :
行小写
gUU :
行大写
g~~ :
行翻转(当然指大小写啦)
#译释:
g是大小写转换命令(greate),u/U/~是三种转换形式(小写/大写/翻转),
#最后一个重复则表示该转换是对于一行而言的
guw :
字大写(狭义字)译注:
建议对比iw
gUw :
字小写(狭义字)
g~w :
字翻转(狭义字)
#译释:
最后一个w表示该转换是对于一个字而言的,由于是在normal模式下,
#所以这个w表示一个狭义字
vEU :
字大写(广义字)
vE~ :
字翻转(广义字)
#译释:
vE这个指令组合会进入visual模式,然后选择一个广义字
ggguG :
把整个文章全部小写(ft!
bt!
)
gf :
取当前光标处的广义字作为文件名,然后试图打开它!
#译释:
为什么是广义字呢?
因为这样可以方便的取到路径啊,像/var/www/html/index.htm
ga :
显示光标处字符的ascii,hex,oct,...晕菜的一堆转换
ggVGg?
:
用rot13编码整个文件(晕!
)
#译释:
gg到文件首行首字符,V进入Visual-Line模式,G到文件末行首字符,
# 这样就选中了整篇文章,然后g?
就是用rot13编码整个文件啦
#
#【关于rot13——谁让英文是偶数个字母啊】
#ROT13是一种简单的编码,它把字母分成前后两组,每组13个,编码和解码
#的算法相同,仅仅交换字母的这两个部分,即:
[a..m]-->[n..z]和[n..z]
#-->[a..m]。
ROT13用简易的手段使得信件不能直接被识别和阅
#读,也不会被搜索匹配程序用通常的方法直接找到。
经常用于USENET中发表一
#些攻击性或令人不快的言论或有简单保密需要的文章。
#由于ROT13是自逆算法,所以,解码和编码是同一个过程。
:
增加,减少光标处的狭义字所表示的数字
:
(,仅仅是分割了这两个命令,不是命令的一部分)
:
Win32的用户可能需要重新定义一下Ctrl-A,呵呵
#译注:
goodguy,令人不得不想到perl的数字串
=5*5 :
插入25(这是一个迷你计算器耶!
)
----------------------------------------
#好玩的东东
:
h42 :
也可以访问
:
第一个结果就是News.DouglasAdams1952-2001.
:
Floor42extendsitsdeepestsympathiesto
:
thefamily,friends,andfansofDouglasAdams.
:
hholy-grail
:
h!
----------------------------------------
#标记和移动
'. :
跳到最后修改的那一行(超级有用)(ft,怎么又是这个评价)
`. :
不仅跳到最后修改的那一行,还要定位到修改点
:
依次沿着你的跳转记录向回跳(从最近的一次开始)
:
依次沿着你的跳转记录向前跳
:
ju(mps) :
列出你跳转的足迹
:
helpjump-motions
:
history :
列出历史命令记录
:
hisc :
命令行命令历史
:
hiss :
搜索命令历史
q/ :
搜索命令历史的窗口
q:
:
命令行命令历史的窗口
:
:
历史命令记录的窗口
----------------------------------------
#缩写和键盘映射(原文中文件举例都用了c:
/aaa/x,偶全给他改成/path/file了,哼唧)
:
map :
'a,'bw!
/path/file
#译释:
map是映射一个normal模式下的键
#这里是把F7键映射成把标记a到标记b中间的内容另存为一个文件/path/file
#标记(mark)的方法:
把光标移动到需要标记的地方,输入m,然后输入标记名,例如a
#引用标记的方法:
'a,即:
单引号加标记名
:
map :
r/path/file
#译释:
把F8键映射成在当前位置插入文件/path/file的内容
:
map :
.w!
/path/file2
#译释:
.(点号)表示当前行
#所以F11就是把当前行存为/path/file2
#最后的表示一个回车
:
map :
r/path/file2
:
abphp :
列出php表示的缩写
#译释:
定义一个缩写使用:
:
iabhmhmisty
#一个有趣的现象是,它列出的会是php和它的前子串开头的缩写
#例如,有这么几个缩写:
#h=>hmisty1,hm=>hmisty2,hmi=>hmisty3,m=>hmisty4
#那么使用:
abhm会显示这么几个缩写:
hm和h
#而不是你想象中的hm和hmi
:
map, :
列出以逗号开始的键盘映射
#译释:
一般而言,我们称这些逗号开始的组合键为“逗号命令”
#不过hmisty更喜欢用;构成“分号命令”
#而且不是用map,而是用imap
#因为偶懒么,懒得按,所以直接在insert模式下就执行命令了
#为什么用分号呢?
因为我最常用它写程序啊
#perl/C/C++/objectpascal/java,都是用分号结束一个语句
#我们一般很少在分号后面连续写其他字符
#所以用“分号+其他键”就很少会在输入的时候造成冲突
#在键盘映射中常用的表示
:
回车
:
Esc
:
转义符号\
:
管道符号|
----------------------------------------
#列出寄存器(Registers)
:
reg :
显示所有当前的registers
"1p :
"表示引用register,1表示一个名字叫做1的register,
:
p就是粘贴(paste)命令
#译释:
"也用来定义register
#先输入",表示定义register
#然后输入名字,如0~9,a~z
#然后执行删除或复制命令,如dd或y,
# 或者是visual模式下的d(删除选中的部分)或y(复制选中的部分)
#则被删除或复制的部分就被存入了这个命名的register
#
#观察:
一个特殊的register,"",里面存储了一个匿名的删除/复制
#在你执行dd或y的时候,被作用的部分被存到了""中
#这些和perl是多么像啊
----------------------------------------
#Usefultrick
"ayy@a :
把当前行作为一个Vim命令来执行
#译释:
"ayy是定义当前行到registera,然后@a是执行registera中存储的指令
#yy:
复制一行
#10yy:
复制从此向下的10行
yy@" :
用上面所提到的那个匿名register
----------------------------------------
#从其他程序获取输出(需要外部程序)
:
r!
ls.exe :
读取ls的输出到当前位置
!
!
date :
读取date的输出(但是会替换当前行的内容)
#译释:
其实你输入了!
!
后,vim就自动转换到:
.!
等待你继续输入
#使用外部程序sort进行排序(sort是Unix标准命令,ls,date也是)
:
%!
sort-u :
使用sort程序排序整个文件(用结果重写文件)
#译释:
%表示整个文件的所有行
#!
sort表示执行外部命令sort
#-u是sort的参数,mansort看看,这个参数的意义是合并相同的行
#u就是unique,如果两行内容相同,则结果中只保留一行的说
:
'a,'b!
sort-u :
对marka到markb中间的内容进行排序
!
1}sort-u :
排序当前段落(只能在normal模式下使用!
!
)
#译释:
!
表示使用filter,1}表示filter的对象是从当前行开始向后数一段
#段落指到空行处结束,不包括空行
#其实你一旦输入!
1},vim就自动计算当前段落应该到那一行(eg.+5),然后生成
#:
.,.+5!
等待之后输入sort-u,回车,完成操作
#.表示当前行,.+5当然就是当前行向后数5行
----------------------------------------
#多文档操作(基础)
#译注:
用:
ls!
可以显示出当前所有的buffer
:
bn :
跳转到下一个buffer
:
bp :
跳转到上一个buffer
:
wn :
存盘当前文件并跳转到下一个(又是“超级……”,ft!
)
:
wp :
存盘当前文件并跳转到上一个
:
bd :
把这个文件从buffer列表中做掉
:
bun :
卸掉buffer(关闭这个buffer的窗口但是不把它从列表中做掉)
:
baddfile.c :
把文件file.c添加到buffer列表
:
b3 :
跳到第3个buffer
:
bmain :
跳到一个名字中包含main的buffer,例如main.c
:
(ultra,这个怎么翻译?
:
()
:
savphp.html :
把当前文件存为php.html并打开php.html
:
sav!
%换一个后缀保存
:
e!
:
返回到修改之前的文件(修改之后没有存盘)
:
w/path/% :
把文件存到一个地儿
:
e# :
编辑标记为#的buffer(这个buffer必须含有一个可编辑的文件)
:
用ls命令就能看到哪一个buffer有#
:
%a表示当前正在编辑的buffer
:
u表示不能编辑或者已经被做掉的buffer
:
e#3 :
编辑编号为3的buffer(这个buffer必须含有一个可编辑的文件)
:
rew :
回到第一个可编辑的文件
:
brew :
回到第一个buffer
:
spfred.txt :
在一个水平分割的窗口中打开文件fred.txt
#译注:
vsfred.txt可以实现垂直分割
:
sball :
把当前所有含有可编辑文件的buffer显示到一个分割窗口中
:
(偶该考虑把super翻译成高级指令了,ft)
:
map :
ls:
e#:
在normal模式下按F5键,则会显示所有含有一个
:
可编辑文件的buffer,然后提示你输入buffer的序号,
:
输入后回车,则编辑这个buffer
#译注:
这是一个键盘绑定
:
sethidden :
允许不保存buffer而切换buffer(w/o=without)
----------------------------------------
#在分割窗口中快速切换
:
map j_
#译注:
原文此处有误,前面应该加上冒号
#这是一个键盘绑定,把Ctrl-J定义成切换到下一个窗口并最大化
:
map k_
----------------------------------------
#命令录制(最佳技巧,ft)
qq #录制到q
...#输入一系列复杂的指令
q #再次按q停止录制
@q #执行q中存储的指令
@@ #重复执行
#编辑register/录制
"ap#把registera中的内容贴到当前位置
...#现在你可以修改它了
"add#删除之,重新存入registera
@a #执行registera中的指令
----------------------------------------
#_vimrc基础
:
setincsearch :
实时匹配你输入的内容
:
setwildignore=*.o,*.obj,*.bak,*.exe:
tab键的自动完成现在会忽略这些
:
setshiftwidth=4 :
现在自动缩进将是4个字符
#译注:
一个tab位通常是8个字符
#所以,我们还要设定:
settabstop=4,这样,所有的缩进都是4字符了
#emacs默认就是4字符缩进吧?
:
setvbt_vb=". :
沉默方式(不要叫beep!
)
----------------------------------------
#加载windowsiexplorer来浏览(我想这只有在windows下用gvim才能用到)
:
nmap,f:
update:
silent!
startc:
\progra~1\intern~1\iexplore.exefile:
//%:
p
#译释:
nmap是做一个normal模式下的键盘绑定
#这里绑定了一个逗号命令,f
#:
update是写这个文件,与:
w不同,它只有当文件被修改了的时候才写
#:
silent别让弹出窗口报告执行结果
#!
...后面就是执行windows命令了。
呵呵,去问billgates什么意思吧。
#不过偶用gvim6.1试过了,好用!
:
nmap,i:
update:
!
startc:
\progra~1\intern~1\iexplore.exe
----------------------------------------
#用VIM编辑ftp文件
:
cmap,r :
Nreadftp:
//209.51.134.122/public_html/index.html
:
cmap,w :
Nwriteftp:
//209.51.134.122/public_html/index.html
#译注:
原文丢失了开头的冒号
#cmap是命令(command)模式绑定
gvimftp:
//209.51.134.122/public_html/index.html
#这一句就是开始编辑一个ftp远端的文件,ft
----------------------------------------
#附加到一个register(就是用大写的register名字啦!
)
"a5yy#复制5行到a中
10j #下移10行
"A5yy#再添加5行到a中