ZZ:退出并保存

e!:退回到上次保存时的样子
cw:修改单词(自动进入插入模式)
cc:修改一整行的内容
cs:修改一个词(自动进入插入模式)
.:可以重复上一个命令

 

 

 

 

 

 

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
EX命令
 
 
EX命令的逻辑是 将命令作用与指定的地址,有些命令只有源地址参数,而有些命令则由目的地址参数。
 
EX命令:
      d:删除行
      t/co:复制行(有目的地址)
      p:打印行
      nu:显示行号
      w:保存行
      #:显示行号
      
EX定位行的方法
      绝对方式: a.   "."表示当前行,为默认值,如果没有显示指定则为默认行(相当于有一个".")
                     b.   "$"最后一行
                     c.   "0"第一行之前
                     d.   "num"第num行
                     e.   /pattern/模式匹配出现的第一次所在行
               
 
       相对方式:a. [一个绝对行号]+[num]   如果没有”绝对行号“则相对于当前行, 如果没有num则为1 ,绝对行后面的第num行
                       b.  [一个绝对行号]-[num]   如果没有”绝对行号“则相对于当前行, 如果没有num则为1 ,绝对行前面的第num行
 
        相对地址和绝对地址组合构成各式各样的地址和地址范围
  例如命令:
     :1,20 s/awk/sed/g
     :/^luo/,/^lcm/s/awk/sed/g  将"luo"开头的行到"lcm"开头的行中的所有行做替换操作
     :g/^luo/s/awk/sed/g   将所有以luo开始的行执行替换操作
 
     :=  ->列出总行数
     :.=  ->列出当前行
     :/pattern/=  ->列出第一次匹配的行号
 
     有些时候,希望后续地址是针对前序匹配的地址进行偏移,则使用分号表示地址分隔符,例如:
 
        (当前光标在120行) 则    100,+20   表示的是100,140行的范围
          而 100+20则表示100,120的访问
 
 

 

 
 
g表示 定位范围内的所有匹配的 ,g!相反 。如果没有g则表示是第一次出现。
可以用‘|’合并多个命令,后续命令作用在前序命名的结果之上。
 
":x"与":wq"命令的差别,前者只有文件有改变是才写人,而后者无条件写人。
 
:w file_name  -> saveas file_name ->另存为
 
:范围 w file_name  -> 将范围内的内容保存到新文件
 
:w >> file_name   ->将当前文件内容追加到新文件中
 
:地址 r file_name  ->将文件读到当前文件的地址之下
 
操作多个文件
 
在命令行加多个文件名作为参数,打开多个文件,视图位于第一个文件,
 
使用命令“:ar[gs]”可以查看打开的文件列表,由"[]"包括的文件名,是真正编辑的文件。
 
通过:n,ctrl+^切换文件。
“rew"切换到第一个文件
”last“切换到最后一个文件。
 
:e! ->加载最后一次保存的文件
 
%:代表当前的文件名称
#:代表候补的文件名称
 
用":e"命令加载新文件时,不会清除命名缓冲区的内容。
:ya ->将内容拖入缓冲
:pu ->将内容从缓冲复制到文件。


:g/pattern/s/old/new/g:在满足模式的行做替换操作(第一个g表示作用于所有模式匹配的行,第二个g表示作用于匹配行里面的所有匹配old的地方)。
:g/pattern/s//new/g将匹配的行的内容替换成new  s后面的“//"表示之前匹配的内容
 
替换串(new) 中的特殊字符含义
\n: 代表捕获
&:代表匹配的串
~:代表上一次替换时,用来替换的串
\u:将后接的字符变成大写
\U:将后接的字符串变成大写
\l:将后接的字符变成小写
\L:将后接的字符串变成小写
&:重复上一次执行的替换操作
 
 

 

 
 
 

 

 

 
 
选项设置
 
1.vi首先从terminfo数据库读取当前终端的配置信息
2.vi 打开之前首先执行环境变量EXINIT中的命令,然后是家目录的".exrc"文件中的命令。
3.":set"命令支持两类选项设置
    a.    :set option   /    set nooption (打开或关闭某个选项)
    b.    :set option=数字或字符串
 
4.":set all"显示所有选项的当前设置值
   ":set"显示特殊设置值
   ":set option?"查看某个选项当前的设置值。

.exrc文件
 
   1.在.exrc中的命令不需要加前导":"号。
   2.要使本地.exrc文件生效,需要在家目录的.exrc中设置命令"set exrc"
   3.可以将命令写入其他任何文件,然后用命令":so 文件名"将该文件的设置在vi中生效。
 
使用unix命令
 
1.  :!:产生一个子sh后面跟命令
2.  :sh 打开一个shell连续执行命令,ctrl+d返回vim
3.  :[linenum]r !command 将命令结果插入到 linenum下
4.  :[linenum]r file 将文件内容读入到linenum下
//将文件中的内容作为命令的输入,命令输出将覆盖文件当前的内容
5.  :[linenum1,linenum2] !cmd
6. vi的方式 不用冒号 [replay times]![文本行范围定位命令]  unix命令
7.在vi中可以设置缩写(在插入模式输入缩写,在按下非字母键时会补全)
   :ab 查看当前定义的所有缩写
   :ab lcm luo cai min   //将"luo cai min"设置成缩写串 lcm
   :unab lcm 取消缩写
8.设置命令缩写
   :map shortcmd  cmd cmd cmd //在命令里面出现的功能键需要先按ctrl+v再输入
 
 
map rd          :r !date +'\%Y\%m\%d'<CR>^ywI/* luocaimin delete begin <Esc>A */<CR>#if 0<CR>#else<CR>#endif<CR><Esc>pI/* luocaimin delete end <Esc>A */<CR>
 
map ra          :r !date +'\%Y\%m\%d'<CR>^ywI/* luocaimin add begin <Esc>A */<CR><Esc>pI/* luocaimin add end <Esc>A */<CR>
 
map rae           :r !date +'\%Y\%m\%d'<CR>I/* luocaimin add end <Esc>A */<CR>
map rab           :r !date +'\%Y\%m\%d'<CR>I/* luocaimin add begin <Esc>A */<CR>
map ra          :r !date +'\%Y\%m\%d'<CR>^ywI/* luocaimin add begin <Esc>A */<CR><Esc>pI/* luocaimin add end <Esc>A */<CR>
map rd          :r !date +'\%Y\%m\%d'<CR>^ywI/* luocaimin delete begin <Esc>A */<CR>#if 0<CR>#else<CR>#endif<CR><Esc>pI/* luocaimin delete end <Esc>A */<CR>
 
"求当前行代表的公式之和
 
map lsum  yyp:.!bc<CR>I<C-H>i=<Esc>
 
 
在单词末尾进入插入模式  :map e ea
对调两个单词                  :map K dwwp
保存一个文件并进入下一个文件   :map q :w^M:n^M
注释代码    :map rmk I/* ^[A */^[
 
9.需要在插入模式中将某个插入值作为命令则需要在map后面加上! 
 
 eg:xml tag自动补全
 :map! >  >^[F<lyf>f>a<\^[p
 
10. 在编辑模式输入命令串,然后读入命令缓存(通过删除的方式" "gdd "将命令读入命名缓存区g),通过“@命名缓存”来执行命令。“@”会解释为vi命令
 
11.自动缩排 :  ":set autoindent" 的作用是让新行与上一行有相同的缩进。
     在自动缩排下输入代码时(插入模式),在行头"ctrl t"将执行下一层缩排,"ctrl d"相反。

 

 
     "5<<"将包括当前行在内的以下5行向左缩进8个字符的位置 "5>>"相反
 
 
     :set tabstop=4  设置tab的宽度为4个字符
 
  
12: ":set list"显示整个文件的隐藏字符。  ":l"显示当前行的隐藏字符
13:"%"如果没有在括号字符'{([])}'上,会移到本行的向前找到的第一个括号上。
 
14:  ":set showmatch"在输入括号时会高亮显示其匹配的括号。
 
15:ctags
       15.1 ctags -R 从当前目录迭代搜索源文件,并建立tags文件。  
       15.2 ":set tags=tags文件" 指定tags文件
       15.3  ":tag  GET_BALANCE" 查找并跳转到GET_BALANCE所在文件和位置 ,":stag tagname"用横屏分页的方式显示符号
       15.4  将光标位于符号之上,ctrl+] 跳转到符号所在文件和位置  , ctrl+w+]  用横屏分页的方式显示符号
       15.5   ctrl+t 返回到跳转之前的位置
       15.6 ":stag[!] tagname" 新窗口打开标签
 
16: '*'高亮显示光标下的单词并进入搜索模式,'#'高亮显示光标下的单词,并进入反向搜索模式。
 
17: 'viw'可视模式下选中一个单词
 
18.自动添加tag(当文件有变化时自动更新tags文件)
     autocmd BufWritePost *.cpp,*.c,*.h :!cur_dir=`pwd` && cd ~ && ctags -a %:p && cd -
     注  %:p表示带路径的当前文件名
 
19. 在可视模式下的选中区
      19.1  "niw":选中光标下及后面的n个单词,标点号和空字符都算一个单词
      19.2  "niW":选中光标下及后面的n个单词,空格算一个单词
      19.3  "naw":选中光标下及后面的n个单词,标点算一个单词,空格算分隔符
      19.4  "naW":选中光标下及后面的n个单词,标点不算一个单词,空格算分隔符
      19.5  "as","is":选中一句话
      19.6  "ap","ip": 选择一段话。
 
vi -o[n] file1 file2
set laststatus=n
set winheight=n
set winwidth=n
ctrl+w+s/v
ctrl+w+h/j/k/l/t/b
ctrl+w+q
ctrl+w+c
:split otherfile
:vsplit otherfile
:new
:[N]sp[lit] ++opt +cmd other
 
 
 
 
缓冲区
 
ls:列出缓冲区
ls!:列出包括“非列出缓冲区”的缓冲区
 
列出的缓冲区信息
 
 
缓冲区命令
 
:windo cmd   在当前可见页的所有窗口中执行命令cmd,如果cmd报错,则停留在报错窗口
:bufdo[!] cmd 在所有缓冲中(包括所有可见和不可见窗口)执行命令cmd,如果cmd报错,则停留在报错窗口


 
标签:
:tabnew  filename
:tabclose/tabc
:tabonly
:tabn
:tabp
:tabd[o]
 
 
 
 
 
 
VIM脚本
 
所有命令和选项都是脚本的有效输入
标准流控制(if...then....else,while)
具有函数变量等
 
变量的作用域与变量的名称有关系
 
 
根据时间设置配色方案的例子
let curhour = strftime("%H")
echo "curhour is ".curhour
if curhour < 6
     let colshm="darkblue"
elseif curhour < 12
     let colshm="morning"
elseif curhour < 18
     let colshm="shine"
else
     let colshm="evening"
endif
echo "setting color scheme to ".colshm
execute "colorscheme ".colshm (colshm是字符串和下面的直接命令选项不同,命令和命令选项可以直接执行,命令和字符串不可直接执行,需要使用execute命令将命令本身识别为字符串,然后在和后续字符串组成命令加选项的字符串执行)

"let curhour = strftime("%H")
"echo "curhour is ".curhour
"if curhour < 6
"     let colshm="darkblue"
"elseif curhour < 12
"     let colshm="morning"
"elseif curhour < 18
"     colorscheme shine
"     echo "setting color scheme to shine"
"else
"     let colshm="evening"
"endif
 
 
 
 
定义函数
 
定义函数:vim使用function  funcname(param1,param2,...)...endfunction定义函数(函数名称必须以大写字符开头)
调用函数:call funcname(param1,param2,...)
 
 
statusline可以自定义,在statusline发生变化时会重写,所以可以利用这一点,执行需要频繁检查的操作。
 
 
重复检查
let g:colorname = "xyzzy"
"根据时间设置配色方案
function Settimeofcolor()
     let curhour = strftime("%H")
     echo "curhour is ".curhour
     if curhour < 6
          let colshm="darkblue"
     elseif curhour < 12
          let colshm="morning"
     elseif curhour < 18
          let colshm="shine"
     else
          let colshm="evening"
     endif
     if g:colorname !~ colshm
          echo "setting color scheme to ".colshm
          execute "colorscheme ".colshm
     endif
endfunction
 
打开文件后
 
set statusline+=\%{Settimeofcolor()}
 
全局数组定义
 
 
最终版本
 
let g:colorname = "xyzzy"
let g:colorarray=["darkblue","morning","shine","evening"]
"根据时间设置配色方案
function Settimeofcolor()
     let curhour = strftime("%H")
     echo "curhour is ".curhour
     let colshm=g:colorarray[curhour/6]
     if g:colorname !~ colshm
          echo "setting color scheme to ".colshm
          execute "colorscheme ".colshm
     endif
endfunction
 
 
VIM自动命令
 
'
 
自动命令格式
 
 
"&vim选项":取vim选项的值 eg: &filetype
"exists(变量名或函数名)":检查变量或函数是否已经定义
                eg:
               if exists("b:iscount")==0
                    "如果没有定义变量b:iscount则定义并赋值
                    let b:iscount=0
               endif
 
 
 
 
文件类型自动检测脚本
 
"定义新自动命令组
augroup newFileDetection
autocmd CursorMovedI * call CheckFileType()  "为组添加自动命令
augroup END

function CheckFileType()
if exists("b:countCheck") == 0
let b:countCheck = 0
endifh
let b:countCheck += 1
" Don't start detecting until approx. 20 chars.
if &filetype == "" && b:countCheck > 20 && b:countCheck < 200
filetype detect
" If we’ve exceeded the count threshold (200), OR a filetype has been detected
" delete the autocmd!

elseif b:countCheck >= 200 || &filetype != ""
”如果不需要自动命令,则通过取消组的自动命令来消除其对性能的影响
autocmd! newFileDetection
endif
endfunction

 
 
"      删除组 augroup! newFileDetection
 
 
function SetCppPreSet()                        
        set cindent                            
        set foldmethod=syntax                          
        set foldlevel=10
        set foldcolumn=6
        syntax enable
        syntax on     
        set ai         
endfunction                                    
                                               
autocmd BufReadPost *.cpp,*.h call SetCppPreSet()
 
保存编辑会话  ":mksession sessionfile_name"
载入会话:":source sessionfile_name"
 
程序员扩展功能
折叠
':mkview': 在创建了很多折叠的后,保存折叠
':loadview': 加载保存的折叠
 
 
文件比较
vimdiff file1 file2
 
 
撤销与重做
"U",撤销
"ctrl+R"重做  //set undolevels=n 设置可以重做的深度
 
 
 
 
在命令模式下(":") ctrl+f,打开历史命令窗口,查找和执行历史命令。