您的位置:首页 > 其它

vim常用操作

2010-03-12 14:09 323 查看
vi是个可视化的编辑器,可视化编辑器的含义就是在编辑文本时可以看到它们。Linux下的vim是vi的一个增强版本,有彩色和高亮等特性,对编程有很大的帮助。

基本使用:
启动和退出vim
vim的启动:在Linux的提示符下键入vim(或使用vim myfile来编辑已经存在的文件)即可启动它。
vim的退出:先按下Esc键回到命令行模式,然后键入“:”,此时光标会停留在最下面一行,再键入"q"(如果强行退出则还在后面加 "!" ),最后按下Enter键即可。

VIM 关于移动的命令
在当前行里面有效的移动光标
* fx:移动光标到当前行的下一个 x 处。很明显,x 可以是任意一个字母,而且你可以使用 ; 来重复你的上一个 f 命令。
* tx:和上面的命令类似,但是是移动到 x 的左边一个位置。(这真的很有用)
* Fx:和 fx 类似,不过是往回找。
* w:光标往前移动一个词。
* b:光标往后移动一个词。
* 0:移动光标到当前行首。
* ^:移动光标到当前行的第一个字母位置。
* $:移动光标到行尾。
* ):移动光标到下一个句子。
* ( :移动光标到上一个句子。
在整个文件里面有效移动光标
* <C-F>:向下移动一屏。
* <C-B>:向上移动一屏。
* G:到文件尾
* numG:移动光标到指定的行(num)。(比如 10G 就是到第 10 行)
* gg:到文件首
* H:移动光标到屏幕上面
* M:移动光标到屏幕中间
* L:移动光标到屏幕下面
* *:读取光标处的字符串,并且移动光标到它再次出现的地方。
* #:和上面的类似,但是是往反方向寻找。
* /text:从当前光标处开始搜索字符串 text,并且到达 text 出现的地方。必须使用回车来开始这个搜索命令。如果想重复上次的搜索的话,按 n。
* ?text:和上面类似,但是是反方向。
* ma:在当前光标的位置标记一个书签,名字为 a。书签名只能是小写字母。你看不见书签的存在,但它确实已经在那里了。
* `a:到书签 a 处。注意这个不是单引号,它一般位于大部分键盘的 1 的左边。
* `.:到你上次编辑文件的地方。这个命令很有用,而且你不用自己去标记它。

有效的移动大段的文本
* v:按字符选择。经常使用的模式,所以亲自尝试一下它。
* V:按行选择。这在你想拷贝或者移动很多行的文本的时候特别有用。
* <C-V>:按块选择。非常强大,只在很少的编辑器中才有这样的功能。你可以选择一个矩形块,并且在这个矩形里面的文本会被高亮。
在选择模式的时候使用上面所述的方向键和命令(motion)。比如,vwww,会高亮光标前面的三个词。Vjj 将会高亮当前行以及下面两行。
一旦你高亮了选区,你或许想进行一些操作:
* d:剪贴选择的内容到剪贴板。
* y:拷贝选择的内容到剪贴板。
* c:剪贴选择的内容到剪贴板并且进入插入模式。
如果你很清楚的知道你想拷贝或者剪切什么,那你根本就不需要进入可视选择模式。这样也会节省时间:
* d{motion}:剪切 motion 命令跨过的字符到剪贴板。比如,dw 会剪切一个词而 dfS 会将从当前光标到下一个 S 之间的字符剪切至剪贴板。
* y{motion}:和上面类似,不过是拷贝。
* c{motion}:和 d{motion} 类似,不过最后进入插入模式。
* dd:剪切当前行。
* yy:拷贝当前行。
* cc:剪切当前行并且进入插入模式。
* D:剪切从光标位置到行尾到剪贴板。
* Y:拷贝当前行。
* C:和 D 类似,最后进入插入模式。
* x:剪切当前字符到剪贴板。
* s:和x类似,不过最后进入插入模式。
y+y 将光标目前所在的位置整行复制
y+w 复制光标所在的位置到整个单词所在的位置
n+y+w 若按3yw,则会将光标所在位置到单词结束以及后面两个单词(共3个单词)一起复制
n+y+y 若按3yy,则将连同光标所在位置的一行与下面两行一起复制

粘贴很简单,按 p。

使用多重剪贴板
很多编辑器都只提供了一个剪贴板。VIM 有很多。剪贴板在 VIM 里面被称为寄存器(Registers)。你可以列出当前定义的所有寄存器名和它们的内容,命令为“:reg”。最好使用小写字母来作为寄存器的名称,因为大写的有些被 VIM 占用了。使用寄存器的命令为双引号 “。
比如:我们要拷贝当前行到寄存器 k。你应该按 “kyy。(你也可以使用 V”ky。为什么这样也可以呢?)现在当前行应该已经存在了寄存器 k 里面直到你又拷贝了一些东西进入寄存器 k。现在你可以使用命令 “kp 来粘贴寄存器 k 里面的内容到你想要的位置。

vim中常用的删除文本命令:
d+左方向键 连续按d和左方向键,将光标所在位置前一个字符删除
d+右方向键 将光标所在位置字符删除
d+上方向键 将光标所在位置行与其上一行同时删除
d+下方向键 将光标所在位置与下一行同时删除
d+d 连按两次d,可将光标所在的行删除,若是连续删除,可以按住d不放
d+w 删除光标所在位置的单词,若是光标在两个字之间,则删除光标后面的一个字符
n+d+d 删除包括光标所在行及乡下的n行
n+d+上方向键 删除包括光标所在行及向上的n行
n+d+下方向键 同n+d+d命令
D 将光标所在行后面所有的单词删除
x 将光标所在位置后一个字符删除
X 将光标所在位置前一个字符删除
n+x 删除光标所在位置及其后的n个字符
n+X 删除光标所在位置及其前的n个字符

vim中常用的找出行数的命令:
Ctrl+g 在最后一行中显示光标所在位置的行数及文章的总行数
nG 将光标移至n行
r 修改光标所在字符
R 修改光标所在位置的字符,可以一直替换字符,知道按下ESC键
u 表示复原功能
U 取消对行所作的所有改变
. 重复执行上一命令
Z+Z 连续按下两次Z,文件将保存并退出vim
% 符号匹配功能,在编辑时,如果输入"%(",系统会自动匹配相应的")" #这功能在ubuntu中我没有实现,不知道谁能解释一下
#可以用/代替%

vim中搜索及替换命令 :
/pattern:从光标开始处向文件尾搜索pattern
?pattern:从光标开始处向文件首搜索pattern
n:在同一方向重复上一次搜索命令
N:在反方向上重复上一次搜索命令
:s/p1/p2/g:将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:将文件中所有p1均用p2替换

vim中命令行模式切换到输入模式,进行插入:
* i:在当前字符的左边插入
* I:在当前行首插入
* a:在当前字符的右边插入
* A:在当前行尾插入
* o:在当前行下面插入一个新行
* O:在当前行上面插入一个新行
* c{motion}:删除 motion 命令跨过的字符,并且进入插入模式。比如:c$,这将会删除从光标位置到行尾的字符并且进入插入模式。ct!,这会删除从光标位置到下一个叹号(但不包 括),然后进入插入模式。被删除的字符被存在了剪贴板里面,并且可以再粘贴出来。
* d{motion}:和上面差不多,但是不进入插入模式。
使用数字也是 VIM 强大的而且很节省时间的重要特性之一。在很多 VIM 的命令之前都可以使用一个数字,这个数字将会告诉 VIM 这个命令需要执行几次。比如:
* 3j 将会把光标向下移动三行。
* 10dd 将会删除十行。
* y3″ 将会拷贝从当前光标到第三个出现的引号之间的内容到剪贴板。
数字是扩展 motion 命令作用域非常有效的方法。

vim最后行模式主要的操作命令:
e 创建新的文件
n 加载新的文件
w 写文件,也就是将编辑的内容保存到文件系统中。主要它是保存到临时文件中,直接退出,他并没有保存到文件中的
w! 如果想写只读文件,使用它强制写入文件
q! 不问你是否保存文件,强制退出
set nu set 可以设置vim的某些特性,这里是设置每行开头提示行数。想取消设置,使用命令 set none
/ 查找匹配字符串功能。如/(,将查找(和);如果想继续向下查找,可以按n键;向前继续查找则按N键
? 与/相似,但它是向前查找字符串

vim的注意事项:
1,当你不知道你是处于编辑方式还是命令方式时,可以使用Esc键退出命令方式,然后进行操作。

2,在使用vim时,万一发生了系统掉电或者突然关机时,可以使用恢复命令,如编辑file文件时突然断电或系统崩溃后的恢复命令:$ vi file -r

3.编程常用技巧:
% 跳转到配对的括号去
[[ 跳转到代码块的开头去(但要求代码块中'{'必须单独占一行)
]p 和 p 的功能差不多,但是它会自动调整被粘贴的文本的缩进去适应当前代码的位置。试一下!
>> 缩进所有选择的代码
<< 和上面类似,但是反缩进
gd 到达光标所在处函数或者变量的定义处。
K 在 Man 里面查找光标当前所在处的词。
'' 跳转到光标上次停靠的地方, 是两个', 而不是一个"

4.winmanager+ctags+taglist:
$ctags -R 进行ctag标签的初始化或者是更新,自动补全需要。
在源程序main.c不在tag目录时要进行以下操作:
:set tags= /src/main.c

<F1> 显示帮助
<cr> 如果光标下是目录, 则进入该目录; 如果光标下文件, 则打开该文件
- 返回上级目录
c 切换vim 当前工作目录正在浏览的目录
d 创建目录
D 删除目录或文件
i 切换显示方式
R 文件或目录重命名
s 选择排序方式
x 定制浏览方式, 使用你指定的程序打开该文件

5.自动补全
TAB键补全
Ctrl+X Ctrl+L 整行补全
Ctrl+X Ctrl+N 根据当前文件里关键字补全
Ctrl+X Ctrl+I 根据头文件内关键字补全
Ctrl+X Ctrl+] 根据标签补全
Ctrl+X Ctrl+F 补全文件名
Ctrl+X Ctrl+D 补全宏定义
Ctrl+X Ctrl+V 补全vim命令
Ctrl+X Ctrl+U 用户自定义补全方式
Ctrl+X Ctrl+S 拼写建议

6.编译:
VIM默认的设置为gcc的编译指令make,
编译完成后显示信息,
下面列出了命令
编译 :make
列出所有编译信息 :cl
显示第一条信息 :cfirst
显示最后一条信息 :clast
显示第n条信息 :cc n 例如显示第5条 :cc 5
显示下一条信息 :cn
显示上一条 :cp
如果此为错误信息,那么打回车,vim会自动把光标跳至错误行。

7.其他
1、连续行注释
  使用Vim/Vi编辑shell脚本,在进行调试的时候,需要进行多行的注释,每次都要先切换到插入模式,在行首输入注释符“#”,再退回命令模式,非常麻烦。其实如果要注释连续行,可在命令模式下执行,格式如下:
  :起始行,终止行s/要替换字符/替换为新字符/g
  如需注释第1行到第20行,可以执行:1,20s/^/#/g
  其中“^”表示在行首插入,“#”为要插入的字符,“g”表示执行替换时不确认,若希望每行交互询问是否执行,可将“g”改为“c”。

  2、非连续行注释(可以直接写在vimrc里面)
  如果注释非连续的多行,可以定义快捷键简化,格式为:
  :map 快捷键 执行命令
  如定义快捷键Ctrl+P为在当前行行首添加“//”注释,可以执行:
  :map ^P I//
  “^P”为定义快捷键Ctrl+P,要注意先按“Ctrl+v”再按“Ctrl+p”;

常用的map有:
1. cmap handles command-line mappings.
2. imap handles insert-only mappings.
3. map maps keys in normal, visual, and operator-pending mode.
4. map! maps keys in Vim's command and insert modes.
5. nmap maps keys in normal mode only.
6. omap maps keys in operator-pending mode only.
7. vmap maps keys in visual mode only.

另一个例子是:map <F10> <Esc>:tabnew<CR>,这里面的Esc是手动输入的~<CR>相当于回车
我在搜索的时候喜欢vim的高亮显示,但是我想在任意一个时候得到上次搜索的高亮结果(编辑的时候关掉,查找的时候开启),那么我在vimrc里写一个函数:

function ToggleHLSearch()
if &hls
set nohls
else
set hls
endif
endfunction

然后在后边在来一个映射:map <silent> <C-n> <Esc>:call ToggleHLSearch()<CR>
这样就解决了这个随时打开高亮搜索功能的问题。

  如果要取消此快捷键,只需输入命令:
  :unmap ^P
想查看设置的快捷键,输入:map即可看到。

  3、缩略语
  原来输入经常用的信息可以如此简单,
  :ab 替代符 原始信息
  示例如下:
  :ab sammail sam_helen@vip.163.com
  执行之后,在输入模式下任何地方录入“sammail”,再敲任意字母符号或者回车空格,咔嚓一下,利马就变成“sam_helen@vip.163.com”,那真是相当的方便啊!
:iab XXX YYY
要是不想替代就在输入完后按Ctrl+­v

  4、可以直接在Vim/Vi中执行UNIX/Linux命令不需退出Vim/Vi  :!命令

  5、可以直接将其他文件内容导入当前编辑文件中
  格式为:r 文件名
  如,需要导入文件/etc/issue的内容,执行:r /etc/issue
  先举个例子,很多程序员喜欢写完程序后在注释中写入当前时间,我有个好办法即省事又快速还准确,只需要在命令模式下执行:r !date
  当前时间就自动被导入了,任何命令的结果导入到当前编辑文件中,格式为 r !命令

  5、助力编程的查询功能
  以前在Linux系统下写一些C语言程序,有时记性不好,忘记了语法格式,使用Vim/Vi编写时可直接查询。如写程序写到fork时,突然失忆了(失去了对这个东东的记忆),就可以直接把光标移动到fork上,按“K”(大写的K),直接就会跳到Linux程序员手册,看到fork的帮助,看完后回车继续编写。

6、:h quickref 翻到VIM Quick Reference页(有用!)。
7、环境变量%表示当前文件名。
8、# 加密(小心使用,不要忘了密码)
:X : 然后vim会提示你输入密码
:wq
9.csupport的常用操作:

-- 注释操作 -----------------------------------------------------------

/cl end-of-line comment (n,v,i)
/cj adjust end-of-line comment(s) (n,v,i)
/cs set end-of-line comment column (n)
/c* code -> comment /* */ (n,v)
/c/ code -> comment // (n,v)
/cc code -> comment // (n,v)
/co comment -> code (n,v)
/cfr frame comment (n,i)
/cfu function comment (n,i)
/cme method description (n,i)
/ccl class description (n,i)
/cd date (n,i)
/ct date /& time (n,i)

-- 常用结构 ---------------------------------------------------------

/sd do { } while (n,v,i)
/sf for (n,i)
/sfo for { } (n,v,i)
/si if (n,i)
/sif if { } (n,v,i)
/sie if else (n,v,i)
/sife if { } else { } (n,v,i)
/sw while (n,i)
/swh while { } (n,v,i)
/ss switch (n,v,i)
/sc case (n,i)
/s{ { } (n,v,i)

-- 预处理命令 -------------------------------------------------------

/p< #include <> (n,i)
/p" #include "" (n,i)
/pd #define (n,i)
/pu #undef (n,i)
/pie #if #else #endif (n,v,i)
/pid #ifdef #else #endif (n,v,i)
/pin #ifndef #else #endif (n,v,i)
/pind #ifndef #def #endif (n,v,i)
/pi0 #if 0 #endif (n,v,i)
/pr0 remove #if 0 #endif (n,i)
/pe #error (n,i)
/pl #line (n,i)
/pp #pragma (n,i)

-- 常用短语 -------------------------------------------------------------

/if function (n,v,i)
/isf static function (n,v,i)
/im main() (n,v,i)
/i0 for( x=0; x<n; x+=1 ) (n,v,i)
/in for( x=n-1; x>=0; x-=1 ) (n,v,i)
/ie enum + typedef (n,i)
/is struct + typedef (n,i)
/iu union + typedef (n,i)
/ip printf() (n,i)
/isc scanf() (n,i)
/ica p=calloc() (n,i)
/ima p=malloc() (n,i)
/isi sizeof() (n,v,i)
/ias assert() (n,v)
/ii open input file (n,i)
/io open output file (n,i)

-- 代码段支持-----------------------------------------------------------

/nr read code snippet (n,i)
/nw write code snippet (n,v,i)
/ne edit code snippet (n,i)
/np pick up prototype (n,v,i)
/ni insert prototype(s) (n,i)
/nc clear prototype(s) (n,i)
/ns show prototype(s) (n,i)
/ntl edit local templates (n,i)
/ntg edit global templates (n,i)
/ntr rebuild templates (n,i)

-- C++ ----------------------------------------------------------------

/+c class (n,i)
/+cn class (using new) (n,i)
/+ci class implementation (n,i)
/+cni class (using new) implementation (n,i)
/+mi method implementation (n,i)
/+ai accessor implementation (n,i)

/+tc template class (n,i)
/+tcn template class (using new) (n,i)
/+tci template class implementation (n,i)
/+tcni template class (using new) impl. (n,i)
/+tmi template method implementation (n,i)
/+tai template accessor implementation (n,i)

/+tf template function (n,i)
/+ec error class (n,i)
/+tr try ... catch (n,v,i)
/+ca catch (n,v,i)
/+c. catch(...) (n,v,i)

-- 编译调试 ----------------------------------------------------------------

/rc save and compile (n,i)
/rl link (n,i)
/rr run (n,i)
/ra set comand line arguments (n,i)
/rm run make (n,i)
/rg cmd. line arg. for make (n,i)
/rp run splint (n,i)
/ri cmd. line arg. for splint (n,i)
/rk run CodeCheck (TM) (n,i)
/re cmd. line arg. for CodeCheck (TM) (n,i)
/rd run indent (n,v,i)
/rh hardcopy buffer (n,v,i)
/rs show plugin settings (n,i)
/rx set xterm size (n, only Linux/UNIX & GUI)
/ro change output destination (n,i)

常用个性化设置:
全局变量

GLOBAL VARIABLE DEFAULT VALUE TAG (see below)

g:C_GlobalTemplateFile plugin_dir.'c-support/templates/Templates'
g:C_LocalTemplateFile $HOME.'/.vim/c-support/templates/Templates'
g:C_TemplateOverwrittenMsg 'yes'

g:C_CodeSnippets plugin_dir."/c-support/codesnippets/"
g:C_Dictionary_File ""
g:C_LoadMenus "yes"
g:C_MenuHeader "yes"
g:C_OutputGvim "vim"
g:C_XtermDefaults "-fa courier -fs 12 -geometry 80x24"
g:C_Printheader "%<%f%h%m%< %=%{strftime('%x %X')} Page %N"

Linux/UNIX:
g:C_ObjExtension ".o"
g:C_ExeExtension ""
g:C_CCompiler "gcc"
g:C_CplusCompiler "g++"
g:C_CFlags "-Wall -g -O0 -c"
g:C_LFlags "-Wall -g -O0"
g:C_Libs "-lm"
g:C_LineEndCommColDefault 49
g:C_CExtension "c"
g:C_TypeOfH "cpp"

g:C_CodeCheckExeName "check"
g:C_CodeCheckOptions "-K13"

10.在你编辑你的电子邮件或者其他有段落的文本时,你可能会发现使用方向键和你预期的效果不一样,有时候可能会一次跳过了很多行。这是因为你的段落在 VIM 看来是一个大的长长的行。这时你可以在按 h、j、k 或者 l 之前键入一个 g,这样 VIM 就会按屏幕上面的行如你所愿的移动了。

2.关于一些基本设置
|:set| :se[t] 显示所有被改动的选项。
参数
'autoindent' 'ai' 根据上一行决定新行的缩进
'cindent' 'cin' 实现 C 程序的缩进
'cinkeys' 'cink' 设置 'cindent' 时启动缩进的键
'cinoptions' 'cino' 设置 'cindent' 时如何缩进
'cinwords' 'cinw' 'si' 和 'cin' 在这些词后加入额外的缩进
'shiftwidth' 'sw' (自动) 缩进使用的步进单位,以空白数目计
'smarttab' 'sta' 插入 <Tab> 时使用 'shiftwidth'

sample
:set cin 实现 C 程序的缩进
:set sw=4 设计(自动) 缩进使用4个空格
:set sta 插入<tab>时使用'shiftwidth'
:set backspace=2 指明在插入模式下可以使用<BS>删除光标前面的字符
:set filetype=cpp 指定文件类型为C++,以便使用高亮关键字显示
:syntax enable 设置高亮关键字显示

怎么让vim在启动时自动设置?
启动vim的时候使用vim -u /root/vimrc.vim
Vim 会在启动的时候执行这个文件里的命令,并且使用:vertion可以查看到系统vimrc配置文件,用户vimrc配置文件等的路径

怎样让vim自动缩排代码?
将光标放在{处,按ESC到Normal模式,然后按v再按%就可以把大括号中内容选定,然后按=就可以按照C语言格式缩排
%命令的作用是跳到匹配处,比如括号之间,C的宏指令#if #else #endif之间。

“去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限
set nocompatible
“显示行号
set nummber
“检测文件的类型
filetype on
“记录历史的行数
set history=1000
“背景使用黑色
set background=dark
“语法高亮度显示
syntax on
“下面两行在进行编写代码时,在格式对起上很有用;
“第一行,vim使用自动对起,也就是把当前行的对起格式应用到下一行;
“第二行,依据上面的对起格式,智能的选择对起方式,对于类似C语言编写上很有用
set autoindent
set smartindent
“第一行设置tab键为4个空格,第二行设置当行之间交错时使用4个空格
set tabstop=4
set shiftwidth=4
“设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号
set showmatch
“当vim进行编辑时,如果命令错误,会发出一个响声,该设置去掉响声
set vb t_vb=
“在编辑过程中,在右下角显示光标位置的状态行
set ruler
“默认情况下,寻找匹配是高亮度显示的,该设置关闭高亮显示
set nohls
“查询时非常方便,如要查找book单词,当输入到/b时,会自动找到第一
“个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的单词,依
“次类推,进行查找时,使用此设置会快速找到答案,当你找要匹配的单词
“时,别忘记回车
set incsearch

,输入左边括号"("后自动完成")",并把光标定位到两个括号中间
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {}<ESC>i
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>

function ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "/<Right>"
else
return a:char
endif
endf
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: