在oschina看到不错的vim技巧文章,读了之后vi水平大有提高呵呵。 总结一下写代码的常用vi的命令,以后继续总结到这里来吧。大家有什么好的技巧也可以教我一下。
-----------基本动作--------------
i 切换到插入模式,在光标之前
a 切换到插入模式 在光标之后,自己体会和i的区别吧
I 切换到插入模式,光标在行的开始
A 切换到插入模式 光标在行的结尾
v 进入 visual mode ,选择模式?
R 进入替换模式,输入的文字直接覆盖替换光标下的字符。 直到按<Esc>建退出。
<Esc> 退出输入模式,
:w 保存文件
:w newfilename 文件另存为
:q 退出编辑
:wq 保存并退出
:edit 打开另外一个文件, 可以用<TAB> 补全
u undo 取消上次修改
ctrl + R redo 重复上次修改
:help 后面加上某个命令,查看vim的帮助文档
--------------编程常用设置--------------------
:set nowrap / set wrap "禁止自动换行/启用自动换行 有时候不自动换行看起来更清楚一些
:set number "显示行号
:set tabstop=4 "设置tab的宽度
:set shiftwidth=4 "设置自动缩进的的宽度
:syntax on "语法高亮
:set filetype=c "如果文件扩展名不是 c,可以用这个为vim指定文件格式。
:set cindent "启用 C 的自动缩进
:set colorcolumn=80 "设置代码一行最多80字符长度的可视边界,7.3版本以后可用。
"不大常用的tab相关设置 :set softtabstop=4 ,:set smarttabs, :set expandtab 把插入的tab 都转换成空格 , 还有retab等,按照设置重新转换tab ? (用法 :%retab8 ) ,
"突出显示当前行 set nocursorline
set cursorline
" 自动切换当前目录为当前文件所在的目录
set autochdir
" 允许在有未保存的修改时切换缓冲区,此时的修改由 vim负责保存
set hidden
set nobackup "禁用vim的自动备份文件功能
" 搜索时,高亮显示搜索到的单词
set hlsearch
colorscheme evening "设置代码高亮 的 颜色配置方案为 evening
"我比较喜欢下面这几种配色,都可以在网上找到吧 monokai evening twilight vividchalk freya spiderhawk
colorscheme monokai "我觉得这个最好看了
set exrc "设置vim加载所有目录下.vimrc文件,这样每个工程目录就可以有自己的自定义设置了。
set secure '限制上一步设置里面的目录下的vimrc不能使用某些不安全的命令
很多配色方案可以到vim网站去找,不过这里也有个抓屏,查看方便
http://vimcolorschemetest.googlecode.com/svn/html/index-c.html
设置编码, 参考 正确设置 Vim 的字符编码选项 http://rainux.org/vim-gvimvim-on-win32
set encoding=utf-8 这个设置了之后会在文件结尾加上编码标志,只是gvim内部使用的? 我看有问题再设置这个选项好了
set fileencoding=
上面的设置可以直接执行也可以放到vimrc文件里面去,以便每次启动时有效。可以下面这个加到vimrc方便使用
编码设置相关设置的说明: 来自 http://wensuper.iteye.com/blog/1495384
encoding(enc):encoding是Vim的内部使用编码,encoding的设置会影响Vim内部的Buffer、消息文字等。在Unix环境下,encoding的默认设置等于locale;Windows环境下会和当前代码页相同。在中文Windows环境下encoding的默认设置是cp936(GBK)。
fileencodings(fencs):Vim在打开文件时会根据fileencodings选项来识别文件编码,fileencodings可以同时设置多个编码,Vim会根据设置的顺序来猜测所打开文件的编码。
fileencoding(fenc):Vim在保存新建文件时会根据fileencoding的设置编码来保存。如果是打开已有文件,Vim会根据打开文件时所识别的编码来保存,除非在保存时重新设置fileencoding。
termencodings(tenc):在终端环境下使用Vim时,通过termencoding项来告诉Vim终端所使用的编码。
termencodings(tenc):在终端环境下使用Vim时,通过termencoding项来告诉Vim终端所使用的编码。
|:help encoding-values|列出Vim支持的所有编码。
设置gui界面 字体,打开时自动最大化
if has("gui_running")
if has("win32")
" 设定 windows 下 gvim 启动时最大化
autocmd GUIEnter * simalt ~x
" 设定 windows 下图形界面下的字体。该字体需要自己下载安装,下载地址:
"好像程序员比较喜欢的字体有
"1. Bitstream Vera Sans Mono
"http://www-old.gnome.org/fonts/
"http://ftp.gnome.org/pub/GNOME/sources/ttf-bitstream-vera/1.10/
"2. 微软visual stuido 自带的 Consolas字体
"http://www.microsoft.com/en-us/download/details.aspx?id=17879
" 下载安装完,gvim的菜单里面又有了Consolas 字体,可以用下面这个设置
" set guifont=Consolas:h12:cANSI
" Bitstream_Vera_Sans_Mono在默认的 gvim菜单里面有这个,
"下面这个设置字体大小为12
set guifont=Bitstream_Vera_Sans_Mono:h12:cANSI
else
" 设定 linux 下图形界面下的字体,该字体 Fedora 7 自带
set guifont=DejaVu\ LGC\ Sans\ Mono\ 14
endif
endif
记录上次文件打开时的光标的位置,这个很好,下次打开自动把光标移到上次修改的地方。 BufReadPost 是文件加载完的时候的动作吧
autocmd BufReadPost *
\ if line("'\"")>0&&line("'\"")<=line("$") |
\exe "normal g'\"" |
\ endif
"隐藏gvim的工具栏和菜单,按f1时才弹出, Toggle Menu and Toolbar
set guioptions-=m
set guioptions-=T
map <silent> <F1> :if &guioptions =~# 'T' <Bar>
\set guioptions-=T <Bar>
\set guioptions-=m <bar>
\else <Bar>
\set guioptions+=T <Bar>
\set guioptions+=m <Bar>
\endif<CR>
参考 http://vimdoc.sourceforge.net/htmldoc/gui.html
" 这个比较放到上面的go语言插件的后面才起作用,go那里好像重设置语法了
" 高亮显示行尾的空格,和空格和TAB键混用的情况
" http://vim.wikia.com/wiki/Highlight_unwanted_spaces
" ctermbg 必须用颜色名字,guibg可以用颜色值
highlight default ExtraWhitespace ctermbg=red guibg=#F92672
match ExtraWhitespace /\s\+$\| \+\t/
" 可以用下面这个删掉所有的行尾空格
" %s/\s\+$//
" 或者像下面这个map <leader>w git stripspace命令,来删掉这个 whitespace error
" 默认的<leader>键是 “\ ” 有的是逗号",”
function! Preserve(command)
" Preparation: save last search, and cursor position.
let _s=@/
let l = line(".")
let c = col(".")
" Do the business:
execute a:command
" Clean up: restore previous search history, and cursor position
let @/=_s
call cursor(l, c)
endfunction
" delete all trailing whitespace in current file
if has ("win32")
map <leader>w :call Preserve(":%!c:/git/bin/git.exe stripspace")<CR>
else
map <leader>w :call Preserve(":%!git stripspace")<CR>
endif
set path="" vim搜索c的+include文件的路径,比如下面 [I gf 命令等需要打开头文件的时候,就要根据这个path变量去搜索了。
------------移动光标---------------
h j k l 光标 “左 下 上 右” 移动
0 光标移动到本行的的开始
^ 光标移动到本行的第一个字符
$ 光标移动到本行末尾
b 光标移到单词的开头
e 光标移到单词的末尾
w 光标移到下一个单词
大写的 E W和小写的e w类似,不过单词是以空格作为分界。移动光标到下一个空格的的前或者后面一个字符。
+ 光标移到下一行的开头
- 光标移到上一行的开头
% 光标在匹配 最近() {} 块切换,这个很有用啊,类与visual studio中的ctrl + ]
‘’ 两次单引号,光标移到上次修改的位置。 两次反引号 ` 才是正式的写法? 一个反引号加上一点(`.)也可以跳到最后一个修改的位置(参加mark和macro的用法 http://www.viemu.com/vi-vim-tutorial-5.gif)
其实是反引号书签的用法来的, “m + 一个字母表示的书签名字” 就在当前行设置一个书签。 “反引号 + 一个字母表示的书签名字” 就跳到该书签的位置。
标签的一个 用法,比如要删大量内容,可以在某个地方ma ,mz 之类的设置标签到某行,然后把光标移到对应的位置,再 d`a y`z 之类的可以删除到指定标签位置的所有内容。
gvim里面单引号和反引号一样的效果,ma 之后, ‘a可以移动到书签a的位置
G 光标移到文件的末尾
gg 光标移到文件的开始
行号+G 或者 行号+gg 跳转到第几行
f + 字符 光标移到本行的 下一个指定字符,搜索
F + 字符 光标移到本行的 上一个指定字符,反向搜索
{ 段落的开始
} 段落的结尾
( 句子的开始
) 句子的结尾
g, 最近的修改
g; 最近的修改
gd 移到程序变量的定义 在函数里面查找
gD 移到程序变量的定义 在文件里面查找
[( 移到光标位置到 类似if 的条件判断的括号的开始
]) 移到光标位置到 类似if 的条件判断的括号的结尾
[{ 代码块的开始(for 循环if等的大括号)
]} 代码块的结尾 (for 循环if等的大括号)
[[ 移到函数的开始{
]} 移到函数的结尾的}
[# ]# 移到外层#if #endif的
[/ 代码注释的块的开始
]/ 代码注释的块的结尾
参考 *29.3* Moving through a program
http://vimdoc.sourceforge.net/htmldoc/usr_29.html#29.3
zz 光标当前位置滚动到移到屏幕的中间
zt zb 光标当前位置滚动到屏幕顶端和底部
shitf + M 光标滚动到移到屏幕的中间, 自己体会 和zz的区别
shitf + H 光标滚动到移到屏幕的顶端
shitf + L 光标滚动到移到屏幕的底部
ctrl + E 向上滚屏
ctrl + Y 向下滚屏, windows的vim听说需要重新map一下命令才有效果,否则是redo效果,自己google一下吧
ctrl + F ctrl +B 上下翻页
ctrl + o ctrl + i 移动光标到上一次光标所在的位置,在光标的历史位置记录里面前后移动。
*CTRL-O*
CTRL-O Go to [count] Older cursor position in jump list
(not a motion command). {not in Vi}
{not available without the |+jumplist| feature}
<Tab> or *CTRL-I* *<Tab>*
CTRL-I Go to [count] newer cursor position in jump list
(not a motion command).
In a |quickfix-window| it takes you to the position of
the error under the cursor.
{not in Vi}
{not available without the |+jumplist| feature}
--------------搜索用法-----------------
# 和 * 在文件搜索光标当前位置的单词,高亮位置。向前和向后搜索。 非常有用。
g# g* 同# *用法,但搜索的时候,当前单词如果作为其他的单词的一部分的时候,也高亮显示。# 和 * 要求完整匹配,这个值要求部分包含就可以了
/ 和 ? 进入搜索模式,在文档搜索相应的单词。 向前和向后
n 和 N 上面的两个搜索用法之后,向前和反向搜索下一个
[I 类似# 和 * 用法,不过显示一个快速列表。 还有这个用来搜索c /c++变量定义的,默认会用tags,但如果没有tags,也会在include 的头文件里面也会搜索,准确找到该类型的定义。这点和gD gd比较类似。 gD在文件里面搜索变量定义,gd在函数里面搜索,但这个[I 会搜索#include的文件。 include的查找目录由vim的path变量定义,可以修改vimrc配置文件指定path变量,不然vim会找不到头文件的。
数字 + [ + <TAB> 跳到上面一条命令里面显示的第几个 位置去。
]I 类似[I 但只列出后面的
]i 类似[I 但只列出前面的
参考 *29.4* Finding global identifiers http://vimdoc.sourceforge.net/htmldoc/usr_29.html#29.4
:/buf\c 搜索内容时,后面加上 \c 不区分大小写
---显示搜索命令历史--
q/ 显示搜索命令历史的窗口
q? 显示搜索命令历史的窗口 可以选择重用以前用过的搜索查找命令
在多个文件里面搜索
:vimgrep /pattern/[j][g] file file2... fileN
/joe/e : cursor set to End of match 搜索时可以移动光标到相对单词结尾偏移的位置
3/joe/e+1 : find 3rd joe cursor set to End of match plus 1 [C]
/joe/s-2 : cursor set to Start of match minus 2 搜索时可以移动光标到相对丹迪开头偏移的位置
:g/gladiolli/# : 弹出所有的包含gladiolli的行供 类似 [I 但【I使用的是当前光标下的词来搜索
/jo[ha]n Search john or joan
/\< the Search the, theatre or then
/the\> Search the or breathe
/\< the\> Search the
/fred\|joe Search fred or joe
/\<\d\d\d\d\> Search exactly 4 digits
/^\n\{3} Find 3 empty lines
------------替换操作------------------------------
:s/要替换的单词/替换为的内容/ 和perl里面的正则一样啊,
:%s/buf_/buf/c 在全文件替换buf_ 为buf,并且询问是否替换
:127,215 s/foo/bar 替换127行到215之间的foo为bar。
. 表示当前行, $表示最后一行,
:%s/\%Vold/new/g : Do a substitute on last visual area [N]
. or $ for current and last lines respectively. One could also use relative prefixes + and - to refer to offsets after or before the curent line, respectively. Thus: :.,$j meaning "from the current line to the last line, join them all into one line". :% is synonymous with :1,$ (all the lines).
The :... g and :... v commands bear some explanation as they are incredibly powerful. :... gis a prefix for "globally" applying a subsequent command to all lines which match a pattern (regular expression) while :... v applies such a command to all lines which do NOT match the given pattern ("v" from "conVerse"). As with other ex commands these can be prefixed by addressing/range references. Thus:.,+21g/foo/d means "delete any lines containing the string "foo" from the current one through the next 21 lines" while :.,$v/bar/d means "from here to the end of the file, delete any lines which DON'T contain the string "bar."
参考文档 |10.2| Substitution
http://vimdoc.sourceforge.net/htmldoc/usr_10.html#10.2
:%s/old/new/g Replace all occurences of old by new in file
:%s/old/new/gw Replace all occurences with confirmation
:2,35s/old/new/g Replace all occurences between lines 2 and 35
:5,$s/old/new/g Replace all occurences from line 5 to EOF
:%s/^/hello/g Replace the begining of each line by hello
:%s/$/Harry/g Replace the end of each line by Harry
:%s/onward/forward/gi Replace onward by forward, case unsensitive
---------------删除、复制和粘帖--------------------
o 在光标位置下面新建一行
O 在光标位置上面新建一行
j 合并上下两行为一行
d 删除
c change 剪切并进入插入模式, 和d的区别是这个会把剪切的记录也保存到重复命令 . 的记录里面去。
C D d$ c$ 删到行的结尾
s 删除当前字符并且进入插入模式
S 删掉一整行然后进入插入模式
行数+ dd 删除指定行数,比如 3dd 删除3行
行数+ cc 和 上一个类似,但会记录重复记录。
yy 复制当前行内容到剪切板
行数+ yy 复制多少行, 3yy 复制3行
p 在光标前粘贴
P 在光标后粘贴
r 替换当前选中内容,关于选择,参见下面xisual 模式
可以组合使用
y2w 复制后面连个单词
d2w 删除两个单词
db 删除到单词开头
di( di) da( da) 删除括号里面的块
di> di<
di{ di}
同样有
ce cw c3w 等
d/foo 删除到后面第一个出现foo的地方
y?bar 同样有复制到前面第一个出现bar的位置
y2/foo 复制当前光标位置到后面第二次出现foo之间的字符。
d/fred/ :delete until fred
y/fred/ :yank until fred
c/fred/e :change until fred end
利用标签用法,删除或复制大块数据
可以在某个地方ma ,mz 之类的设置标签到某行,然后把光标移到对应的位置,再 d`a c'a y`z 之类的可以删除或复制从当前光标所在wei位置到标签所在位置的所有内容。 修阿删除多行数据时这个比较方便。
利用visual模式,删除或复制大块数据。
按v 或者V 进入visual模式后,可以选择大块内容,用d c y 等进行操作。参考某某的 “选择块”的介绍。
"* 双引号+星号 再加上复制或者粘贴命令,把内容复制到系统剪切板,
"*yy 把当前行复制到系统剪切板
"*p 从系统剪切板粘帖出来
:%s/ *$//g Delete all white spaces
:g/string/d Delete all lines containing string
:v/string/d Delete all lines containing which didn’t contain string
:s/Bill/Steve/ Replace the first occurence of Bill by Steve in current line
:s/Bill/Steve/g Replace Bill by Steve in current line
:%s/Bill/Steve/g Replace Bill by Steve in all the file
:%s/\r//g Delete DOS carriage returns (^M)
:%s/\r/\r/g Transform DOS carriage returns in returns
:%s#<[^>]\+>##g Delete HTML tags but keeps text
:%s/^\(.*\)\n\1$/\1/ Delete lines which appears twice
ggVGg? Change text to Rot13
---------------------------------
指定寄存器
d c s y p 等指令操作的内容,默认保存到 “” 寄存器。但也可以用双引号加 一个字母表示的名字指定26个寄存器中任意的一个。
小写字母表示替换原有寄存器的内容,大写表示追加内容到寄存器
"ayy 复制当前行内容到 a号寄存器
“Ayy 把当前行内容添加到寄存器a里面,如果以前a寄存器已经有一行内容了,那么这个做完a寄存器就有两行内容了。
"ap 粘帖寄存器a里面内容
"bp 粘帖寄存器b里面内容
:reg : display contents of all registers:reg a : display content of register a
qqq : empty register "q" 应该是记录 一个空的宏到寄存器,所以寄存器就被清空了qaq : empty register "a"
其他的还有 0 到9好等寄存器,只读寄存器等,参考文档
registers
http://vimdoc.sourceforge.net/htmldoc/change.html#registers
:g/^\s*$/d : delete all blank lines
:g!/^dd/d : delete lines not containing string
:v/^dd/d : delete lines not containing string
:g/joe/,/fred/d : not line based (very powerfull)
:g/fred/,/joe/j : Join Lines [N]
:g/^/t. : duplicate every line
----------------重复命令-----------------------
. 按 “点” 这个句号字符重复执行命令, 从上一个按 i 进入“插入模式”开始到 esc建退出的所有动作。
非常有用。不如用了重复删除 重复粘贴等。
-------------选择块---------------------------
vim里面的 “visual mode”应该也去学一下。 选择文字时用比较方便。就是进入这个模式之后,把当前光标和你移动到的光标的内容都选择起来。
v 进入 visual 选择模式,以字符为选择单位
V 选择viusal模式,不过以整行为选择单位
然后就可以用 hjkl键选择区域。
组合命令:
“viB” 选择当前光标所在的两个大括号包含的整个代码块,不包含大括号
“vaB” 选择当前光标所在的两个大括号包含的整个代码块,包含大括号
类似的有
vib vab 选择两个括号里面的一整块内容
viw vaw 选择一个单词
类的的组合有,用于选择大括号 尖括号等里面的内容,i不包含,a包含。可以和其他编辑命令组合使用。
ii{
a{
i( a(
i< a<
i[ a[
也可以用鼠标直接选择区域,那就是select mode,后用鼠标选取之后,可以用ctrl + O 或者ctrl + G切换到visual mode。
很多命令可以在 visual mode下面操作,参考这里
http://vimdoc.sourceforge.net/htmldoc/visual.html#visual-operators
比较常用的有,选择多行之后进行删除复制,修改代码缩进等。
---------viusul mode的整块操作模式----Blockwise operators------------
ctrl + v 开始进入viusual mode的整块操作模式选取。
然后可以用hjkl 键选择块。
可以I之后修改esc退出后就应用到所有的行。 d删除,p可以粘贴整块的内容等。
windows因为快捷键默认ctrl +v 是粘贴,所以 ctrl + q才是块操作。
这个功能可以用来给多行代码前面加上注释 // 。
其他的块模式的操作有
I 在block的前面插入
A 添加字符串到 block的结尾
c C 修改block的每一行内容为指定字符床
< > 整block的缩进修改
r 替换
d 删除整个选中的block
p 粘贴整块block
参考 http://vimdoc.sourceforge.net/htmldoc/visual.html#blockwise-operators
其他visual模式说明参考详细参见:
http://vimdoc.sourceforge.net/htmldoc/visual.html#Visual
-------------代码缩进-----------------
< 选择块减少缩进,自己先用visual 模式,viB 选择块之后,再做这个就可以缩进一整块
> 选中块增加缩进。 这个缩进宽度由 set shiftwidth=4 定义
<iB >iB <aB >aB 可以直接使用,不用先选择代码块。
>i{ <a{ 等
>% 也可以直接把光标移到块的前面或者后面的大括号那里,然后运行 >% 命令就可以了,同样应也有 <%
>i{ 上面那个是把大括号一起移动的,这个缩进不包含大括号。
= 自动缩进代码块,用法,先把光标移到一块的起始括号那里 { ,然后 执行 =% 就可以格式化整个代码块了。
>> 当前行减少缩进, 左移
<< 当前行增加缩进,右移
5>> 行数加缩进,那么就一共几行一起调整缩进
组合命令
== 格式化当前一行。
=a{ 等号加上其他选择块命令, 格式化 一个 代码块。
1G=G 解释1G移到文件开始, G移到文件结束,所以这个组合就是格式化整个文件的代码。
gg=G 和 1G=G 等价
-------------------大小写转换--------------------------------------
按 v 进入”visual mode “ 模式,然后选中制定的文字,
再 gu ,选中的文字转换为小写。
gU 选中的文字转换为大写。
guW guW 等命令可以直接转换一个单词的,但我在Windows的 gvim里面好像默认没有这个用法,只能先到visual选择模式 gu才可以用。肯恩那个是vim或者linux平台的默认设置吧。
转换光标下面的字符的就是 vgu vgU 啦,
一开始发现不进入 ”visual mode “ 模式不能进行大小写转换,不过后来发现,这些也是可以直接使用的,下面这些更方便一些吧
~ 将光标下的字母大小写反向转换
guw 将光标所在的单词变为小写
guw 将光标所在的单词变为小写
gUw 将光标所在的单词变为大写
guu 光标所在的行所有字符变为小写
gUU 光标所在的行所有字符变为大写
g~~ 光标所在的行所有字符大小写反向转换
同样有 gU2w 等组合
------------------ 其他辅助编程用法-----------------------
[CTRL-I, ]CTRL-I Search for a word under the cursor in the current file and
any brought in by #include directives.
gd, Search for the definition of a variable 在函数里面查找
gD Search for the definition of a variable 在整个文件查找
]CTRL-D, [CTRL-D Jump to a macro definition.
]d, [d, ]D, [D Display macro definitions
CTRL-A,CTRL-X : increment, decrement next number on same line as the cursor 只在Linux下面起作用。Windows可能需要重新做一下按键映射
ctrl + n insert模式时,在输入很长的变量名字函数名字时,可以使用这个做自动补全,就不用完整的敲入整个变量名字了
ctrl + p 按ctrl + n补全之后,如果不合适,可以用这个取消补全,
----------------------- 临时退出 Vi/Vim、进入 shell 环境后再回来的要求:-------------------------------
方法一:使用 Ctrl-z 以及 fg 这两个命令组合。
这一解决方法主要利用了 Linux/Unix 的作业机制。具体原理是:Ctrl-z 命令将当前的 Vi/Vim 进程放到后台执行,之后 shell 环境即可为你所用;fg 命令则将位于后台的 Vi/Vim 进程放到前台执行,这样我们就再次进入 Vi/Vim 操作界面并恢复到原先的编辑状态。
方法二:使用行命令 :sh。
在 Vi/Vim 的正常模式下输入 :sh即可进入 Linux/Unix shell 环境。在要返回到 Vi/Vim 编辑环境时,输入 exit 命令即可。
这两种方法实现机制不一定,但效果一样,都非常快捷有效。
---------------------------------取得外部输入--------------------------------------------------------------
: r!<cmd> 将命令 <cmd> 的输出结果插入到当前光标所在位置
:r <file> 将文件 <file> 读入到当前光标所在位置
---------------------把多条命令录制为宏------------------------------
q 加上 一个字母表示宏的名字 表示开始宏的录制
q 再次按q,表示录制完成
@ 加 一个字母的表示的宏的名字,表示执行对应的宏
比如qa 开始录制宏a, 然后按q停止,再@a就可以执行刚刚录制的宏a了
@@ 执行最后一次执行过的宏。
5@@ 重复执行5次最后一次行的宏
多个组合操作需要重复执行的时候,使用这个功能可以方便很多。
参考
10.1*Record and playback commands
http://vimdoc.sourceforge.net/htmldoc/usr_10.html#10.1
http://www.viemu.com/vi-vim-tutorial-5.gif
------------------设置键盘快捷键-------------------
The main commands to know when dealing with key bindings are:
:map for the modes Normal, Insert, Visual and Command-line 所有模式都起作用
:imap for Insert mode only 只在insert模式起作用
:cmap for Command-line mode only
:nmap for Normal mode only
:vmap for Visual mode only
一个例子,把ctrl + s 映射为后面保存文件
:map <C-s> :w<cr>
其他常用按键表示
<CR> : carriage Return for maps <Space> 空格键<Esc> : Escape<Leader> : normally \ change with :let mapleader = ","<Bar> : | pipe
下面这个用在按键映射里面不错,不过肯能只在Linux下面有效,比如下面这个映射为在当前目录搜索当前光标所在的单词
:nnoremap <F3> :grep <C-R><C-W> *<CR><esc>:cw<cr>
CTRL-R CTRL-W : pull word under the cursor into a command line or searchCTRL-R CTRL-A : pull whole word including punctuationCTRL-R - : pull small registerCTRL-R [0-9a-z] : pull named registersCTRL-R % : pull file name (also #)
参考 http://vimdoc.sourceforge.net/htmldoc/map.html
------------------------查看执行过的命令 历史记录---------------------------
: 上下键 查找和补全
:history 列出所有的历史记录
:his c
:his s
-------------------VIM buffer 窗口-------------------------------------------------------
VIM里面一个buffer对应一个打开的文件
" 允许在有未保存的修改时切换缓冲区,此时的修改由 vim负责保存
:set hidden
"查看已经打开的buffer
:ls 或者 :buffers 命令都可以
“在不同的buffer直接切换,这个很好用
ctrl + 6
"切换到对应的buffer去 比如下面切换到第2个buffer
:buffer 2
"用不同的窗口打开所有的buffer
:ball
:vertical ball "在垂直分隔的窗口打开所有buffer
:sbuffer "split buffer到不同的窗口
前后一个buffer
:bnext :bn
:bprevious :bp
:bd[elete][!] [N] 可以指定号码的buffer,不指定buffer号码就关闭当前buffer, 会关闭打开这个buffer的所有windoww,并显示另外一个buffer。 不同于 :q[uit] 和 :close的关闭window命令
另外还可以使用辅助插件
bufexplorer.zip : Buffer Explorer 插件
http://www.vim.org/scripts/script.php?script_id=42
安装完 输入 :BufExplorer , 就会弹出一个包含所有buffer列表的窗口供选择。用鼠标或者键盘都可以跳转的到对应的buffer去。
或者在normal模式直接输入下面这个斜杠开始的命令,都可以打开bufexplorer的窗口。
'\be' (normal open) or
'\bs' (force horizontal split open) or
'\bv' (force vertical split open)
"可以把f9映射为这个buffer浏览的快捷键。
noremap <silent> <F9> :BufExplorer<CR>
nmap <F10> :bn<CR>
nmap <F11> :bp<CR>
--------------------------------配置gvim左侧文件浏览栏------------------
安装 nerdtree 这个插件
https://github.com/scrooloose/nerdtree
然后就可以,用 :NERDTree 命令启动 左侧浏览栏,然后 在左边点击 文件名 就自动打开,鼠标中建点击,在新的窗口打开文件。
t 键 打开一个新的 tab 窗口里面打开文件。
然后可以在vimrc中加入下面这行代码让vim 启动是自动打开 文件浏览栏。
autocmd vimenter * NERDTree
安装很简单,网页有说明
cd ~/.vim/bundlegit clone https://github.com/scrooloose/nerdtree.git
在Windows 平台,放到vim的安装目录就可以了。没有装git自己下载对应的插件文件放到对应的目录去就可以了。
最好也安装一下这个插件配合,这样在gvim里面启动时,自动启动NERDTree 的文件浏览栏,并且打开新的tab是,这个文件浏览窗口也始终显示。
不用配置前面的autocmd vimenter * NERDTree 命令了。 他autoload目录的插件自动加载。
https://github.com/jistr/vim-nerdtree-tabs
有很多默认选项开关 ,可以参考网页的说明
let g:nerdtree_tabs_open_on_gui_startup=1 这个默认就是1了,
let g:nerdtree_tabs_open_on_console_startup=1 直接在字符终端的的vim里面也默认启动 NERDTree
不过他这个插件加载比较慢,需要的时候再打开比较好
" 把F2映射为显示左侧目录浏览树窗口开关
map <F2> :NERDTreeToggle<CR>
-----------------------c/c++ 结构解析,函数快捷查找-------------------------------------------
另外为了浏览文件是查看搜索函数名字,有人还喜欢安装
cscope
ctags
taglist
等插件,这样查看搜索函数定义之类的方便一点吧。有需要的时候在网上找一下相关资料吧
------------------vim里面搜索目录下的文件,quickfix模式和grep--------
在vim里面直接搜索目录下的文件的内容
:grep sendv *.c 使用外部grep程序
:vimgrep /sendv/ *.c 使用内部vim 模式的搜索,速度较慢 Vim 需要载入每个文件,就像编辑它们那样。如果文件里没有匹配,相应
的缓冲区又会被彻底删除
:vimgrep sendv\c *.c 使用内部vim 模式的搜索,速度较慢
:help vimgrep
greo 在windows系统默认调用的是findstr /n命令来进行搜索的的, 可以通过 :set grepprg 设置来修改设置
linux缺省为 "grep -n " 参考
http://vimcdoc.sourceforge.net/doc/options.html#'grepprg'
我安装了git 自带一个mingw的grep 还是改为用grep好了,比findstr命令好用吧
:set grepprg=c:/git/bin/grep.exe\ -n
:grep -i sendv *.c 这样就可以用grep的各种参数了
其他的'grepformat'设置vim怎么解析grep的输出,一般都不用修改了吧。参考vm的文档
搜索之后只显示一行,可以:cc 重复显示结果
或者打开 quickfix窗口
:cw[indow] [height] 当存在可以识别的错误时,打开窗口。如果该窗口已经打开且
没有可识别的错误,则将此窗口关闭。
:cope[n] [height] 打开一个窗口显示当前的错误列表。
:ccl[ose] 关闭 quickfix 窗口。
:colder 和 :cnewer 合适显示十个搜索历史记录
在打开的窗口里面可以直接用鼠标双击和enter键可以跳到指定找到的指定位置去。
但以前的窗口缓冲器没有修改才行? 在quickfix 窗口 ctrl +w 在按enter键,可以在新窗口打开。
ctrl + w 在窗口直接切换
在quickfix模式里面常用操作
:cc 显示详细信息 ( :help :cc )
:cp 跳到上一个结果 ( :help :cp )
:cn 跳到下一个结果 ( :help :cn )
:cl 列出所有结果 ( :help :cl )
:cw 如果有结果列表,则打开quickfix窗口 ( :help :cw )
:col 到前一个旧的结果列表 ( :help :col )
:cnew 到后一个较新的结果列表 ( :help :cnew )
可以把这些命令映射到快捷建方便使用
":nmap <F4> :cw<cr>
":nmap <F4> :cclose<cr>
:nmap <F5> :cn<cr>
:nmap <F6> :cp<cr>
"把 f3 按键映射为在本目录下文件里面搜索光标下面的单词
if has("win32")
" grep的设置
:set grepprg=c:/git/bin/grep.exe\ -n
"windows平台用这个
:nmap <F3> "*yw<cr>:grep <c-v> ./*<cr><esc>:cw<cr>
else
" linux 平台用这个
:nnoremap <F3> :grep <C-R><C-W> *<CR><esc>:cw<cr>
endif
可以使用下面这个显示和隐藏quickfix窗口的函数,这样cw 和 cclose功能都映射到同一个按键了
" 弹出和隐藏quickfix窗口
" 来自http://vim.wikia.com/wiki/Toggle_to_open_or_close_the_quickfix_window
function! QFixToggle()
if exists("g:qfix_win")
cclose
unlet g:qfix_win
else
" copen 10
cw
let g:qfix_win = bufnr("$")
endif
endfunction
let g:qfix_win = 1
nmap <script> <silent> <F4> :call QFixToggle()<CR>
参考http://vimcdoc.sourceforge.net/doc/quickfix.html
这种quickfix的用法,vim内部出了grep 还支持make和其他编译工具的,可以参考vim的文档
--------------------------------------
vim-multiple-cursors插件 “True Sublime Text style multiple selections for Vim”
======================================================
https://github.com/terryma/vim-multiple-cursors
允许同时选择多个同名变量,同时修改。 参考上面主页上面的动画演示。比较有意思的一个插件,
可以用 git clone https://github.com/terryma/vim-multiple-cursors 把目录复制下来,然后把autoload 和 doc plugin目录复制到vim目
录去使用就可以了。
使用起来很简单,在normal模式,把光标移到一个变量名字上面,再不停的按 ctrl +n 就把相同名字的变量都选中了。然后使用vim的命令就
可以编辑了。esc退回普通模式。
commentary.vim 快捷注释代码插件
========================
https://github.com/tpope/vim-commentary
Commentary 可以帮你注释代码。在normal模式输入gcc 即可将该行注释(Commentary 会根据当前的 filetype 使用.
在visual 模式,额可以选择多行,然后输入 gc ,注释掉整个选中内容。
再次敲击 gcc 即可还原注释。我把空格键作为注释映射,下面这样:
nmap <space> gcc
vmap <space> gc
即在 normal 模式下,敲击空格键可以注释当前行,在 visual 模式下,敲击空格键可以注释选中的内容
参考了 http://zihua.li/2013/11/my-vim-configuration-plugin/的设置
NERD Commente 另外一个辅助注释代码的插件
================================
http://www.vim.org/scripts/script.php?script_id=1218
vim-expand-region 自动扩展选择区域的插件
==================================
https://github.com/terryma/vim-expand-region
可以通过 + _ 按键来扩大选择区域。比如,比如光标在单词中间,按一下 +,就选中整个单词,再+就选中单词外层的括号里面内容。等等,可以去上面主页去看动画。我只想在visual模式才使用这个功能,他插件里面会自己做一下判断你是否已经映射了快捷键的,如果已经有了,它就不在做nmap的普通模式的映射了。
" 自动扩大选择区域的插件,让它只在visual 模式才使用+ _键盘映射
vmap + <Plug>(expand_region_expand)
vmap _ <Plug>(expand_region_shrink
YouCompleteMe
===========
c/c++的最好用的自动补全插件,基于clang的c/c++语法分析
强烈推荐阅读下面这篇文章,体会 重复命令和 组合命令用法。
http://www.oschina.net/news/25882/why-they-are-using-vi
为什么这些死脑筋们在用 VI ?
翻译的还好,也许你要原版的。
Why, oh WHY, do those #?@! nutheads use vi?
http://www.viemu.com/a-why-vi-vim.html
后来也参考了
技巧:快速提高 Vi/Vim 使用效率的原则与途径
http://www.ibm.com/developerworks/cn/linux/l-cn-tip-vim/
vim的官方文档,可以用去看一下。不错的,详细的说明。
http://vimdoc.sourceforge.net/htmldoc/usr_toc.html
不过好像http://www.truth.sk/vim/vimbook-OPL.pdf 这个更有条理一些,讲的很详细,而且例子也不错,也将很多编程相关的高级用法等。我也参考了一下这个书。
之前发的一个图也是很好的参考。
http://hiphotos.baidu.com/widebright/pic/item/5d880d241eb39b40c89559a6.jpg
原来图是来自这里的啊
Graphical vi-vim Cheat Sheet and Tutorial
http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html
这网站还有很多图,给出由浅入深的学习步骤图。
不错的参考图书
Hacking Vim
A cookbook to get the most out of the latest
Vim editor
这个帖子提到的几个用法也不错
http://stackoverflow.com/questions/1218390/what-is-your-most-productive-shortcut-with-vim/1220118#1220118
Best of Vim Tips
http://www.rayninfo.co.uk/vimtips.html
Using vim as C/C++ IDE
http://www.alexeyshmalko.com/2014/using-vim-as-c-cpp-ide/
联系客服