一、简介
可以直接在终端下采用纯键盘操作的一款文本编辑器,号称编辑器之神,可以二次升级、扩展。
二、基础用法
1.新建/打开:输入vim file.c,文件存在则打开,否则新建并打开
2.输入i:进入编辑模式,编写代码
3.保存退出:Esc键,输入大写的ZZ进入保存并退出
三、 Vim的三大模式
1.正常模式:(打开文件时的默认模式)
一般用于阅读文件,或者用于快捷键对文本快速修改
2.编辑模式:(插入模式)
一般用于输入内容、编辑文件
3.行底模式:
一般用于对vim的临时配置或执行高级操作 set nu出现行号
模式间切换:
正常模式 输入i -> 插入模式 按ESC -> 正常模式
正常模式 输入: -> 行底模式 按ESC -> 正常模式
四、正常模式下的常用操作:
光标移动:
命令 | 说明 | 命令 | 说明 |
h | 左 | j | 下 |
k | 上 | l | 右 |
gg | 光标跳到第一行 | G | 光标跳到最后行 |
n回车 | 光标向下跳n行 | n- | 光标向上跳n行 |
nG | 光标跳到第n行 | vim filename +n | 从第n行进入文件 |
删除操作:
命令 | 说明 | 命令 | 说明 |
x | 快速删一个 | nx | 删除n个字符 |
dw | 删除一个连续字符串,删除空格 | de | 删除一个连续字符串,不删除空格 |
dd | 删除整行 | ndd | 删除n行 |
d^ | 从当前光标删除到行首 | d$ | 从当前光标删除到行尾 |
dgg | 从光标处山到第一行 | dG | 从光标处删到最后一行 |
复制代码:
命令 | 说明 | 命令 | 说明 |
yy | 复制一行代码 | nyy | 复制n行代码 |
p | 粘贴到当前光标下方 | P | 粘贴到当前光标上方 |
特殊的 移动代码 | 删除内容还存储在粘贴板上,使用p可以粘贴出来从而达到移动效果 xp 交换两个字符 |
替换代码:
命令 | 说明 | 命令 | 说明 |
r | 替换光标所在的一个字符 | cw | 替换一个连续字符串,进入编辑模式 |
R | 进入替换模式(insert键切换替换和插入模式) |
撤销操作:
命令 | 说明 | 命令 | 说明 |
u | 撤销上一次操作 | I | 光标跳转到行首 |
Ctrl+r | 取消上次撤销操作 | a | 光标后面进入插入模式 |
A | 光标跳到当前行尾 | o | 在当前行的下方插入一行空白行 进入插入模式 |
O | 在当前行的上方插入一行空白行 进入插入模式 |
插入模式下的常用操作:
命令 | 说明命令说明 | ||
Ctrl+p/n | 自动补全,变量名\函数名\宏 | ||
Ctrl+i | 相当于TAB | ||
Ctrl+j | 相当于回车 | ||
Ctrl+c | 相当于ESC |
行底模式下操作:临时生效,长期生效需改vim配置文件(~/.vimrc)
命令 | 说明 | 命令 | 说明 |
:w | 写入 | :x | 保存退出 |
:q | 退出 修改不保存 | :X | 加密 |
:q! | 强制退出 | :set key= | 删除密码取消密码 必须:wq才生效 |
:wq | 保存退出 | :!cmd | 能够临时在vim中执行cmd系统命令 |
:/key | 查找关键值key n下一个 N上一个 | :%s/old/new | 把old关键词替换为new |
:set nu | 显示行号 | :set nonu | 取消显示 |
:>n | n行代码向右缩进一次 | :<n | n行代码向左缩进一次 |
五、如何配置Vim
1.打开终端输入 vim ~/.vimrc
2.写完后返回正常模式,ZZ退出
3.下次打开vim生效
部分Vim配置
"设置行号
set number
"设置TAB键的宽度
set tabstop=4
"自动缩进
set autoindent
"设置自动缩进的宽度
set shiftwidth=4
"智能缩进
set smartindent
"设置不生成临时文件
set noswapfile
"设置不备份
set nobackup
"设置插入模式下快速返回正常模式
imap jj <ESC>
"定义保存并退出函数
func! SaveExit()
exec "wq"
endfunc
"映射ctrl+z键调用保存并退出函数
map <C-z> : call SaveExit()<CR>
imap <C-z> <ESC> : call SaveExit()<CR>
vmap <C-z> <ESC> : call SaveExit()<CR>
"定义自动保存并编译执行代码函数
fun! ComplieCode()
exec "w"
if &filetype == "c"
exec "!gcc % -lm -pthread && ./a.out"
elseif &filetype == "cpp"
exec "!g++ -std=c++0x % -lm -pthread && ./a.out"
endif
endfunc
"映射ctrl+x键调用便编译执行函数
map <C-x> : call ComplieCode()<CR>
imap <C-x> <ESC> : call ComplieCode()<CR>
vmap <C-x> <ESC> : call ComplieCode()<CR>