欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

vim编程常用命令

程序员文章站 2022-07-14 11:59:22
...
鉴于大家在使用VI 的时候有一定的陌生,在这里借花献佛,从兄弟版[SHELL]中整理出以下关于VI编程的高级技巧,希望对大家学习UNIX有所帮助,并希望大家能结合使用HPUX的心得体会对这些经验进行进一步的扩展。

vi中实现剪切操作:
v进入visual模式,d是删除命令(和命令模式一样)。
d之后用p可以粘贴,p粘贴在光标后,P在光标前。



  0. i插入状态(当前位置)  o插入状态(下一行)

  1.交换两个字符位置
  
  xp
  2.上下两行调换
  ddp
  3.把文件内容反转
  :g/^/m0/ (未通过)
  
  4.上下两行合并
  J
  5.删除所有行
  dG
  6.从当前位置删除到行尾
  d$
  7.从当前位置复制到行尾
  y$ 如果要粘贴到其他地方 p 就可以了
  
  
  由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态
  8.
  :ab string strings
  例如 ":ab usa United States of America" ,
  当你在文见里插入 usa 时
  United States of America 就蹦出来了
  9.
  :map keys new_seq
  定义你当前 键盘命令
  10.
  :set [all]
  vi or ex 的编辑状态
  如 显示每行 :set nu
  11.
  在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘贴在光标处的
  下面。
  
  12.
  单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S
  
  13.
  
  :%s/old_word/new_word/g
  这个指令是于在整个文件中替换特定字符串
  
  14.光标控制
  
  k:上移 nk 上移n行
  j:下移 nj 下移n行
  
  
  将光标移到第n行,按下 mk
  将光标移到第m行,按下 "ay'k
  即将第n到m的行存到a寄存器,以此类推,b,c........寄存器等
  
  这样就可以将你常用的需要复用的内容粘贴到不同的寄存器中以备用
  
  
  想粘贴到某处,直接将光标移到某地,按下 ‘ap 即可,以此类推,b,c........寄存器等
  
  在当前屏幕中
  H 跳到第一行
  M 跳到中间一行
  L 跳到最后一行
  
  15.
  表8-2 删除命令
  删除命令操作
  d l 删除当前字符(与x命令功能相同)
  d 0 删除到某一行的开始位置
  d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)
  d w 删除到某个单词的结尾位置
  d 3 w 删除到第三个单词的结尾位置
  d b 删除到某个单词的开始位置
  d W 删除到某个以空格作为分隔符的单词的结尾位置
  d B 删除到某个以空格作为分隔符的单词的开始位置
  d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置
  d) 删除到某个语句的结尾位置
  d 4) 删除到第四个语句的结尾位置
  d( 删除到某个语句的开始位置
  d } 删除到某个段落的结尾位置
  d { 删除到某个段落的开始位置
  d 7 { 删除到当前段落起始位置之前的第7个段落位置
  d d 删除当前行
  d /t e x t 删除从文本中出现“ t e x t”中所指定字样的位置,一直向前直到下一个该字样所出现的
  位置(但不包括该字样)之间的内容
  d fc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括
  该字符)之间的内容
  d tc 删除当前行直到下一个字符“ c”所出现位置之间的内容
  D 删除到某一行的结尾
  d $ 删除到某一行的结尾
  5 d d 删除从当前行所开始的5行内容
  d L 删除直到屏幕上最后一行的内容
  d H 删除直到屏幕上第一行的内容
  d G 删除直到工作缓存区结尾的内容
  d 1 G 删除直到工作缓存区开始的内容
  
  修改命令操作
  c l 更改当前字符
  c w 修改到某个单词的结尾位置
  c 3 w 修改到第三个单词的结尾位置
  c b 修改到某个单词的开始位置
  c W 修改到某个以空格作为分隔符的单词的结尾位置
  c B 修改到某个以空格作为分隔符的单词的开始位置
  c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置
  c 0 修改到某行的结尾位置
  c) 修改到某个语句的结尾位置
  c 4) 修改到第四个语句的结尾位置
  c( 修改到某个语句的开始位置
  c } 修改到某个段落的结尾位置
  c { 修改到某个段落的开始位置
  c 7 { 修改到当前段落起始位置之前的第7个段落位置
  c tc 修改当前行直到下一个字符c所出现位置之间的内容
  C 修改到某一行的结尾
  c c 修改当前行
  5 c c 修改从当前行所开始的5行内容
  
  
  .重复上一次修改!
  
  
  表8-4 替换命令
  替换命令操作
  s 将当前字符替换为一个或多个字符
  S 将当前行替换为一个或多个字符
  5 s 将从当前字符开始的5个字符替换为一个或多个字符
  
  
  vi替换使用规则:
  :g/s1/s/s2/s3/g
  第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换
  s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串
  
  
  16.
  
  fx
  往右移动到 x 字符上
  Fx
  往左移动到 x 字符上
  tx
  往右移动到 x 字符前
  Tx
  往左移动到 x 字符后
  (注意:以上四个命令中,其中x是键入的字符)
  ;
  分号,配合 f 和 t 使用,重复一次
  ,
  逗号,配合 f 和 t 使用,反方向重复一次
  
  
  17. vi 环境选项 Solaris ksh
  
  noautoindent nomodelines noshowmode
  autoprint nonumber noslowopen
  noautowrite nonovice tabstop=8
  nobeautify nooptimize taglength=0
  directory=/var/tmp paragraphs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tags
  noedcompatible prompt tagstack
  noerrorbells noreadonly term=vt100
  noexrc redraw noterse
  flash remap timeout
  hardtabs=8 report=5 ttytype=vt100
  noignorecase scroll=11 warn
  nolisp sections=NHSHH HUuhsh+c window=23
  nolist shell=/bin/ksh wrapscan
  magic shiftwidth=8 wrapmargin=0
  mesg noshowmatch nowriteany
  
  
  For C-Shell:
  setenv EXINIT "set nu"
  For Bourne or Korn Shell:
  EXINIT="set nu"; export EXINIT
  For Korn Shell Only (alternate method):
  typeset -x EXINIT="set nu"
  在 .profile 里设置 vi 的环境选项 , 以上均测试过
  
  
  18.标记文本
  
    mchar   用字母char标记当前光标的位置
    `char   移至char所标记处
    'char   移至char标记所在行的开头处
    "     移至当前行上一次所在位置(在光标移动之后)――一个双引号
    ''    移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号
  
  
  19.
  同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi的文件之间切换。
  但是我发现一个BUG:在用CTRL-SHIFT-6切换到上一个文件后,用:args查看多文件vi状态时,
  屏幕底部仍然显示目前vi的是刚才的文件。
  (在HP-UX,Solaris,AIX上通过)
  
  也可以使用:
  :e#
  进行切换
  
  20.
  sco 下VI 要在文本前同样的字符加用
  %s/^/要加的内容/g 要在文本后同样的字符加
  %s/$/要加的内容/g
  
  21.
  如何去掉文本中的 ^M 硬回车?不必用binary传回去再ascii传回来的方式,用shell或者unix语句实现。
  
  cat filename |tr -d '\015' >newfile
  不同的unix系统还存在一些其他不同的命令,如:doscp
  sed 也可以实现这个功能.
  
  dos2unix filename filename2
  反之
  unix2dos filename filename2
  
  在vi 中用:$s/^M//g
  ^是crtl-V crtl-M
  
  
  22.如何在“unix命令行”下将一个文件的某字符串用另一个串换掉
  
  sed 's/string1/string2/gp' file1 > file2
  
  23.将/etc/hosts下所有的地址都ping 2次
  
   1 #/usr/bin/sh
   2 #grad /etc/hosts and ping each address
   3 cat /etc/hosts|grep -v '^#' | while read LINE
   4 do
   5 ADDR=`awk '{print $1}'`
   6 for MACHINE in $ADDR
   7 do
   8 ping $MACHINE -n 2
   9 done
   10 done

24. Vim 自动补全功能

相信用过 Visual Studio 的人特别喜欢自动补全的功能。但是我不知道是否每个用 vim 的人都知道如何使用它。其实很简单,Ctrl+N 就可以了。它会根据你已经输入的 几个字符在上下文中寻找匹配,还能在同时打开的多个 VIM view 中查找,另外还能查找已经设置好的一些头文件。。

如果你用的是 vim7,在字符界面下,也能出现下拉框。。。。非常稳定,也非常好用。。

vim有万能补全<c+x><c+o>,函数名和类名都没有问题

宏定义也有<c+x><c+d>补全

类变量补全也有插件,还有一些别的插件比如

EnhancedCommentify 当前行或者多行可视模式下的注释/反注释 \x
SuperTab 在插入状态使用TAB键补全,现在被自己定义的F8代替了 <TAB>
taglist 函数和变量定义的窗口,并可以双击跳转 :TlistToggle绑定到F4
tabbar 用标签窗口形式,显示打开的文件 Alt-1,2切换
AutoExplorer help里面剔出的快速浏览函数和变量的定义
bufexplorer 浏览打开的缓冲文件 \be \bv \bs
mark 不同颜色标记当前词,支持多次高亮标记 \m

总之,只要你愿意配置vim可以非常强大

but,不要迷信vim。用什么工具,取决于你的工程应用。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

vim 对gtk API 函数自动补全


Gtk的API有很多,如何在使用时让VIM自动补全呢?
其实VIM已经有此功能了,这就是VIM的自动补全功能。包括ctrl-N,ctrl-P以及Ommi 补全功能。
当然了,还有对包含的头文件的自动搜索。但是编写gtk程序有一点不方便的是,它包的是gtk.h
,而gtk.h中是一大堆的*.h文件,显然是不可能在gtk.h中找到什么有用的东西的。
是不是有别的什么办法呢?

linux的使用在于小巧组合,vim配合ctags即可完成此任务。步骤如下:
1.首先进入/usr/include/gtk-2.0/gtk目录,下面有很多头文件,我们要在此目录下生成一个tags文件供使用。
2.执行ctags -R
3.将生成的tags文件copy到你的工作目录,即你写程序的地方。
4.再执行ctags -a  //将你写的程序的函数appended 到此文件上。

OK,大功告成。这下你写程序时,即可ctrl-N/P来自动补全gtk的API了。
不过使用时列表中的函数是有点多了,选择起来反而有点麻烦,但总比没有要好。




++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

(vi) vim 中 php 函数关键字自动补全(小小技巧)

如题,咱们就可以开始了,vim号称是万年编辑器,如果没有它的好是得不到这个称号的。现在面对网络开发,php相对流行,不断得到认可,估摸着也学了两 把,可是有的时候还是函数有点多,再加上扩展函数,没招,咱们得找个方法一步搞定。我是用vim出生的,所以就拿它来想办法了。也好,有个插件叫superTab,这家伙牛啊,用我们的tab键就搞定了自动补全,本来vim也是支持自动补全的,用的键是<c-p>(ctrl+p),在编写代码的过程当中,我们很容易发现,如果你的文件(指得是php文件)有include, include_once, require, require_once 这 些包含的文件中如果有你要的函数,你用vim自动补全时,vim是可以找到的,还有当前文件中有的字串都可以找到。这样我们就想了,如果我们有个文件,包 含全部的php函数,然后在编辑过程中让vim扫一遍,这样其不是就可以达到目的了。哈哈,估摸着也是这个原理,今天在网上不意间发现这么一段:
PHP 的函数列表文件, http://cvs.php.net/viewvc.cgi/phpdoc/funclist.txt(就是这个地方有我们所要的所有函数)现在呢,我们得让vim去找呀,这个找也得需要告诉vim这个文件放在什么地方,我把它放在了~/.vim目录下,~ 这个就是你自己的用户目录,比如 /home/test 。现在我们在.vimrc(~/.vimrc )中这么写:set dictionary-=~/.vim/funclist.txt dictionary+=~/.vim/funclist.txtset complete-=k complete +=k~OK!完工。说明(对于Ubuntu用户):
1.安装vim, $sudo apt-get install vim2.安装gvim, $sudo apt-get install vim-gtk3.在当前用户目录下建文件夹, $mkdir .vim4.在.vim文件夹下面建如是几个文件夹, .vim$mkdir colors .vim$mkdir plugin  .vim$mkdir syntax5.下载所要的插件suptab.vim(http://www.vim.org/scripts/script.php?script_id=1643) 放在文件夹plugin下6.建文件.vimrc $gvim .vimrc7.下载php函数文件,放入.vim文件夹下(http://cvs.php.net/viewvc.cgi/phpdoc/funclist.txt)8.在.vimrc 文件中加入上面的两句set……哈哈,就这么着完成了……,good luck!

25. 自动缩进
gg=G
ggvG=

home目录中的.exrc文件也可以根据需要进行编辑
34 set number
35 set cindent
36 set shiftwidth=4
37 set tabstop=4
38 " next command may change text color.
39 " highlight Comment ctermfg=green
40
41 " don't display line no
42 "set nonumber

26. 在vi中同时打开多个文件以及它们之间相互操作
1 vi a b c
:n跳至下一个文件,:e#回到刚才编辑的文件。
比如当前编辑文件为a,:n跳至b,再:n跳至c,:e#回到b,想回到a的话用:ea

2 打开一个,vi 文件名
然后在vi的命令输入状态下输入
:sp 另外一个文件的路径及文件名
如此就可以在一个窗口打开3个文件了。
可以使用 ctrl + 两次按 w
在3个文件中切换

3 :Ve 可以垂直打开目录结构
使用这个可以在一个vi中打开n个文件,可以在浏览目录时直接打开相关文件

27. 使用vim进行软件开发(1):vim+ctags+taglist +cscope

ctags有些系统自带,有些要自己手动安装(下载安装包,然后执行下面命令. /configure->make->make install)
1. taglist
能够列出源文件中的tag(function, class, variable, etc)并跳转.
注意:taglist依赖于ctags,所以要先装ctags,否则taglist装了也没法用!
(1)到http://vim.sourceforge.net/scripts/script.php?script_id=273
下载最新的taglist,我的版本是taglist_45.zip,解压你会发现俩个文件夹:doc和plugin.
(2) 把上面两个文件夹放到自己的~/.vim文件夹里面,如果自己的家目录(主目录)没有这个隐藏的文件夹,就自己mkdir .vim一下,建立一个。
然后把doc和plugin拷到.vim文件夹里。
(3)安装
在doc下面有个taglist.txt,看看会发现这是个帮助文档:
下面是它的第4部分:
==================
4. Installation~

1. Download the taglist.zip file and unzip the files to the $HOME/.vim or the
$HOME/vimfiles or the $VIM/vimfiles directory. After this step, you should
have the following two files (the directory structure should be preserved):

plugin/taglist.vim - main taglist plugin file
doc/taglist.txt - documentation (help) file

Refer to the |add-plugin|and |'runtimepath'| Vim help pages for more
details about installing Vim plugins.
2. Change to the $HOME/.vim/doc or $HOME/vimfiles/doc or $VIM/vimfiles/doc
directory, start Vim and run the ":helptags ." command to process the
taglist help file. Without this step, you cannot jump to the taglist help
topics.
======================
plugin/taglist.vim – taglist插件
doc/taglist.txt - taglist帮助文件
即到~/.vim/doc下面运行vim,然后在vim中运行":helptags ."或者":helptags taglist.txt"让vim找到taglist的帮助文档,之后你就可以跳转到taglist的帮助主题了。
(4)使用
在vim中用":TlistToggle"打开左边的tag窗口,再输一次自动关闭,按ctrl+w可以在窗口之间进行切换,也可以按照如下方法定义一个快捷键
  nnoremap :TlistToggle
":TlistOpen":Open and jump to the taglist window.
":TlistClose":Close the taglist window.
":TlistToggle":Open or close (toggle) the taglist window.
在taglist中的一些操作:
: 跳转到光标处tag的源文件(就是回车键)
o : 打开新窗口,并跳转到光标处tag的源文件。
p : 与
t : 打开新tab并跳转到光标处tag的源文件。
: 显示光标处tag的函数原型
+ : 打开tag组
- : 收拢tag组
x : 最大化/还原
我的~/.vimrc设置:
"created by liuhongdan 10-24-2007
set nu

""""""""for ctags""""""""""""""
set tags=tags;
""""""""""""""""""""""""""""""

""""""""for taglist"""""""""
let Tlist_Show_One_File = 1 "taglist插件只显示当前文件的tag
let Tlist_Use_Right_Window = 1 "让taglist窗口显示在右边,默认在左边
let Tlist_Exit_OnlyWindow = 1 "退出vim时候退出taglist

好了,taglist的基本功能差不多就这些,高级的设置请看自带的帮助文档 ^_^

2.下面介绍ctags(以后使用cscope,这是趋势的说)
下面是http://linux.chinaunix.net/bbs/thread-904179-1-1.html的RainbowBoy的帖子(在此表示感谢):
在浏览源码时,用SourceInsight,可以很方便的进行符号定义与引用间的跳转,以及符号定义、声明的查看。在VIM中,同样也可以,但是我在这样做时,遇到了一点问题,还请知道如何解决这个问题的同道能不吝赐教!
假设我现在的工程结构如下:
D:
└─MyProject
├─Module_1
│ Module_1.h
│ Module_1.c
│ Module_a.h
│ Module_a.c

├─Module_2
│ Module_2.h
│ Module_2.c

└─Module_3
Module_3.c
Module_3.h

用ctag实现在工程中,符号到符号定义间的跳转:
在项目根目录下即(MyProject目录)下用“ctags -R .”(这个"."可以不要的说--我注)创建一个tag文件后,在.vimrc文件中加入“set tags=tags;"这条语句(一定要有末尾的分号),这样,就算我当前工作在Module_1下的文件上(当前路径也是Module_1)。但是,我一样可以用CTRL-]在Module_1.c内跳转到Module_3.c内的Symbol定义上。
但是TAG的这个功能只能跳到Symbol的定义上去,不能查找到调用它的位置。如假设Module_1.c和Module_2.c内都用到 Symbol,而Symbol被定义在Module_3.c中。所以,不管在Module_1.c还是Module_2.c中执行CTRL-]都是到 Module_3.c的Symbol定义上(这也是为什么要使用cscope的原因了--我注)。

接着ctags用法:
详见:http://hi.baidu.com/original/blog/item/2cf8d53f00b7fcc27d1e71f0.html
[/home/brimmer/src]$ ctags -R
"-R"表示递归创建,也就包括源代码根目录下的所有子目录下的源程序。"tags"文件中包括这些对象的列表:
用#define定义的宏
枚举型变量的值
函数的定义、原型和声明
名字空间(namespace)
类型定义(typedefs)
变量(包括定义和声明)
类(class)、结构(struct)、枚举类型(enum)和联合(union)
类、结构和联合中成员变量或函数

VIM用这个"tags"文件来定位上面这些做了标记的对象,下面介绍一下定位这些对象的方法:
1)用命令行。在运行vim的时候加上"-t"参数,例如:
[/home/brimmer/src]$ vim -t foo_bar
这个命令将打开定义"foo_bar"(变量或函数或其它)的文件,并把光标定位到这一行。
2)在vim编辑器内用":ta"命令,例如:
:ta foo_bar
3)最方便的方法是把光标移到变量名或函数名上,然后按下"Ctrl-]"。用"Ctrl-o"或者"Ctrl-t"退回原来的地方。
注意:运行vim的时候,必须在"tags"文件所在的目录下运行。否则,运行vim的时候还要用":set tags="命令设定"tags"文件的路径,这样vim才能找到"tags"文件(这儿我们已经设置过了"set tags=tags;",在子目录中也可以使用)。
在函数中移动光标
[{ 转到上一个位于第一列的"{"
}] 转到下一个位于第一列的"{"
{ 转到上一个空行
} 转到下一个空行
gd 转到当前光标所指的局部变量的定义
* 转到当前光标所指的单词下一次出现的地方
# 转到当前光标所指的单词上一次出现的地方
Vim 的创造者是一名计算机程序员,因此这就不奇怪 Vim 中有许多帮助编写程序的功能:
跳转到标识符被定义和使用的地方;在另一个窗口中预览有关的声明等等。
更详细的用法请参考:help ctags

28. 更详细的命令(供查阅)

1、linux shell 命令行下删除一个单词的方法:

我们有时在Linux下输入命令时,难免有输错的时候,在有的终端上,输错后,用退格则出现乱码现像,可以用以下方法解决。

CTRL + H    #相当于按了一次退格键,一次删除一个字母

CTRL + U    #一次删一行

CTRL + W   #一次删一个单词,也可以这么理解,一次删一个空格的位置,比如:face book abcd edff,这种情况要按四次才能删完


2、vi下删除一个单词的方法:
diw    删除光标上的单词 (不包括空白字符)
daw    删除光标上的单词 (包括空白字符)

D    从当前位置删除到行尾 ("d$" 的缩写)

db    从当前位置删除到前一个单词的开头

dw    从当前位置删除到下一个单词开头

x    删除光标下的字符 ("dl" 的缩写)
X    删除光标前的字符 ("dh" 的缩写)


dG    删除到文件末
dgg    删除到文件首


"dl"    删除字符 (缩写: "x")            |dl|
"diw"    删除内含单词                *diw*
"daw"    删除一个单词                *daw*
"diW"    删除内含字串 (见 |WORD|)        *diW*

"daW"    删除一个字串 (见 |WORD|)        *daW*
"dd"    删除一行                |dd|
"dis"    删除内含句子                *dis*
"das"    删除一个句子                *das*
"dib"    删除内含 '(' ')' 块            *dib*
"dab"    删除一个 '(' ')' 块            *dab*
"dip"    删除内含段落                *dip*
"dap"    删除一个段落                *dap*
"diB"    删除内含 '{ ' ' }' 大块            *diB*
"daB"    删除一个 '{ ' ' }' 大块            *daB

3、vi / vim 删除以及其它命令




删除一行:dd



删除一个单词/光标之后的单词剩余部分:dw



删除当前字符:x



光标之后的该行部分:d$


在Vi 中移动光标

  k        上
h   l    左  右
  j        下

^        移动到该行第一个非空格的字符处
w        向前移动一个单词,将符号或标点当作单词处理
W        向前移动一个单词,不把符号或标点当作单词处理
b        向后移动一个单词,把符号或标点当作单词处理
B        向后移动一个单词,不把符号或标点当作单词处理
(        光标移至句首
)        光标移至句尾
{        光标移至段落开头
}        光标移至段落结尾
H        光标移至屏幕顶行
M        光标移至屏幕中间行
L        光标移至屏幕最后行
0        到行首
$        到行尾
gg       到页首
G        到页末
行号+G   跳转到指定行
n+       光标下移n行
n-       光标上移n行
Ctrl+g   查询当前行信息和当前文件信息

fx       向右跳到本行字符x处(x可以是任何字符)
Fx       向左跳到本行字符x处(x可以是任何字符)

tx       和fx相同,区别是跳到字符x前
Tx       和Fx相同,区别是跳到字符x后

C-b      向上滚动一屏
C-f      向下滚动一屏
C-u      向上滚动半屏
C-d      向下滚动半屏
C-y      向上滚动一行
C-e      向下滚动一行

nz       将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。

进入和退出Vi命令

vi filename               打开或新建文件,并将光标置于第一行首
vi +n filename            打开文件,并将光标置于第n行首
vi + filename             打开文件,并将光标置于最后一行首
vi +/pattern filename     打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename            在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename ... filename  打开多个文件,依次进行编辑

ZZ                        退出vi并保存
:q!                       退出vi,不保存
:wq                       退出vi并保存

重复操作

.        重复上一次操作

自动补齐

C-n      匹配下一个关键字
C-p      匹配上一个关键字

插入

o        在光标下方新开一行并将光标置于新行行首,进入插入模式。
O        同上,在光标上方。

a        在光标之后进入插入模式。
A        同上,在光标之前。


R        进入替换模式,直到按下Esc
set xxx  设置XXX选项。

行合并

J        把下面一行合并到本行后面

Vi中查找及替换命令

/pattern         从光标开始处向文件尾搜索pattern
?pattern         从光标开始处向文件首搜索pattern
n                在同一方向重复上一次搜索命令
N                在反方向上重复上一次搜索命令
%                查找配对的括号
:s/p1/p2/g       将当前行中所有p1均用p2替代,若要每个替换都向用户询问则应该用gc选项
:n1,n2s/p1/p2/g  将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g    将文件中所有p1均用p2替换

.*[]^%~$ 在Vi中具有特殊含义,若需要查找则应该加上转义字符"\"

查找的一些选项
设置高亮

:set hlsearch    设置高亮
:set nohlsearch  关闭高亮
:nohlsearch      关闭当前已经设置的高亮

增量查找

:set incsearch   设置增量查找
:set noincsearch 关闭增量查找

在Vi中删除

x        删除当前光标下的字符
dw       删除光标之后的单词剩余部分。
d$       删除光标之后的该行剩余部分。
dd       删除当前行。

c        功能和d相同,区别在于完成删除操作后进入INSERT MODE
cc       也是删除当前行,然后进入INSERT MODE


更改字符

rx       将当前光标下的字符更改为x(x为任意字符)
~        更改当前光标下的字符的大小写


键盘宏操作

qcharacter  开始录制宏,character为a到z的任意字符
q           终止录制宏
@character  调用先前录制的宏


恢复误操作

u        撤销最后执行的命令
U        修正之前对该行的操作
Ctrl+R   Redo

在Vi中操作Frame

c-w c-n  增加frame
c-w c-c  减少frame
c-w c-w  切换frame
c-w c-r  交换两个frame

VIM中的块操作

Vim支持多达26个剪贴板

  选块   先用v,C-v,V选择一块,然后用y复制,再用p粘贴。
  yy     复制当前整行
  nyy    复制当前行开始的n行内容
  ?nyy   将光标当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
  ?nyw   将光标当前行及其下n个词保存到寄存器?中,其中?为一个字母,n为一个数字
  ?nyl   将光标当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
  ?p     将寄存器?中的内容粘贴到光标位置之后。如果?是用yy复制的完整行,
         则粘贴在光标所在行下面。这里?可以是一个字母,也可以是一个数字
  ?P     将寄存器a中的内容粘贴到光标位置之前。如果?是用yy复制的完整行,
         则粘贴在光标所在行上面。这里?可以是一个字母,也可以是一个数字
  ay[motion]
            ay$    复制光标位置到行末并保存在寄存器a中
            ayft   复制光标位置到当前行第一个字母t并保存在寄存器a中

以上指令皆可去掉a工作,则y,p对未命名寄存器工作(所有d,c,x,y的对象都被保存在这里)。
剪切/复制/粘贴

所有删除的内容自动被保存,可以用p键粘贴
Vi的选项设置

all         列出所有选项设置情况
term        设置终端类型
ignorance   在搜索中忽略大小写
list        显示制表位(Ctrl+I)和行尾标志($)
number      显示行号
report      显示由面向行的命令修改过的数目
terse       显示简短的警告信息
warn        在转到别的文件时若没保存当前文件则显示NO write信息
nomagic     允许在搜索模式中,使用前面不带“\”的特殊字符
nowrapscan  禁止vi在搜索到达文件两端时,又从另一端开始
mesg        允许vi显示其他用户用write写到自己终端上的信息

tips

对代码自动格式化 gg=G