ZZ:退出并保存
e!:退回到上次保存时的样子
cw:修改单词(自动进入插入模式)
cc:修改一整行的内容
cs:修改一个词(自动进入插入模式)
.:可以重复上一个命令
EX命令
EX命令的逻辑是 将命令作用与指定的地址,有些命令只有源地址参数,而有些命令则由目的地址参数。
EX命令:
t/co:复制行(有目的地址)
nu:显示行号
#:显示行号
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下
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 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
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
"根据时间设置配色方案
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
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!
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
autocmd! newFileDetection
endif
endfunction
" 删除组 augroup! newFileDetection
function SetCppPreSet()
set cindent
set foldmethod=syntax
set foldlevel=10
set cindent
set foldmethod=syntax
set foldlevel=10
set foldcolumn=6
syntax enable
syntax on
set ai
endfunction
autocmd BufReadPost *.cpp,*.h call SetCppPreSet()
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,打开历史命令窗口,查找和执行历史命令。