第9章 VIM程序编辑器
1. 一般命令模式
移动
方向移动
hjkl
左下上右方向键30 + 方向键
向某个方向移动30次
水平移动
0
移动到一行最前面^
移动到一行第一个非空白字符$
移动到一行最后面g_
移动到一行最后一个非空白字符w
移动到下一个单词开头b
移动到上一个单词的开头e
移动到下一个单词结尾 (W/B/E以空白符为分隔符)f + g
移动到一行的下一个g字母处F + g
反向移动到一行的g字母处t + g
移动到一行的下一个g字母前T + g
反向移动一行的下一个字母g前;
移动到下一个该字母,
移动到上一个该字母30 + space
向后移动30个字符
垂直移动
ctrl + f
下移动一页ctrl + b
上移动一页 (d/u移动半页)zz
将当前行移动到中央zt
移动当最上zb
移动到最下·H / M / L
移动到屏幕的上中下行+/-
下上移动一行G
移动到最后一行gg
移动到第一行3G
移动到第3行30 + enter
向下移动30行ctrl + o
移动到上一个位置
查找
/word
向下查找word?word
向上查找wordn / *
重复前一个查找动作N / #
反向进行前一个查找动作*/#
对光标所在单词进行搜索
替换
:[range] s/{pattern}/{string}/[flags]
range 表示范围 pattern表示正则表达式 string表示替换成的字符串(可忽略) flags表示模式(g 全局 c 确认选项 n只统计匹配次数):20,30 s/word1/word2/g(c)
在20与30行间将word1替换成word2,有c则会提示确认:1,$ s/word1/word2/g(c)
在第一行到最后一行进行上述动作:% s/word/word/g(c)
全局替换
文本对象
- 操作模式 : [number]<action:d/c/y>[text object]
- d : 删除 c : 修改 y : 复制
- action i|a key
- i 在key 的范围内不包括空格 a 在key的范围内包括空格
- key: w 单词 s 句子 p 段落 其他配对字符如{}, [], <>, " 等
- 举个例子 d (同理 y c 适用)
dd
删除光标所在一行30dd
剪切光标在内的向下30行d1G / dgg
剪切光标所在到第一行dG
剪切光标所在到最后一行d$
删除光标到行最后一个字符d0
删除光标前到行第一个字符dtk
删除直到k字符diw / de
删除单词daw / dw
删除单词包括后面的空白字符
删除
x
向后删除一个字符30x
包括光标向后删除30个字符30X
不包括光标向前删除30个字符s
删除一个字符进入插入模式30s
删除30个字符进入插入模式S
删除一行进入插入模式J
光标所在行与下一行结合成同一行
粘贴
p
在光标下一行粘贴P
在光标上一行粘贴:r filename
将文件内容追加到光标所在行后面:r! echo %
打印当前文件名:r! echo %:p
打印当前路径名- 插入模式
:set paste/nopaste
解决 ctrl+v 因为设置自动缩进产生混乱问题 - 插入模式
ctrl + R + [寄存器名字]
粘贴对应内容
寄存器
["regname]<action>
针对某个寄存器进行相应操作""
: 默认存储d/y/x的内容"0
: 只存储y的内容"%
当前文件名".
上次插入的文本"[a-z]
a-z寄存器"+
: 系统剪贴版 通过:echo has('clipboard')
查看是否支持:set clipoard=unnamed
设置系统剪贴板为无名寄存器:reg a-z
查看某个寄存器中的内容
宏与批量执行
q[a-z]
开始录制的命令存储在 [a-z]的寄存器中 / 结束录制@[a-z]
回放命令- 通过v选择多行后
:normal @[a-z]
作用于多行 或者:normal action 比如A$ 在行为插入$
进行批量行处理
操作
u
撤销一次动作ctrl + r
前进一次动作.
重复上一个操作
2. 编辑模式
模式转换
i
在光标前插入I
在所在行第一个非空格前插入a
在光标后插入A
在所在行最后一个字符后插入o
在光标下一行处插入一行O
上一行处插入新的一行r
替换光标所在字符一次R
一直替换光标所在字符直到退出gi
快速移动到上一次编辑的地方ctrl + c
或者ctrl + [
退出编辑模式
编辑快捷键
ctrl + h
删除上一个字母ctrl + w
删除上一个单词ctrl + u
删除一行- 只在shell下作用的快捷键
ctrl + f
后移光标ctrl + b
前移光标ctrl + e
移动到结尾ctrl + a
移动到开头
关键词补齐
ctrl + x
进入补齐菜单(第一步)ctrl + n/p
文件内容补齐 (也可以作为选择匹配的方向键)ctrl + f
文件名补齐ctrl + o
全能补齐
3. 命令模式
保存与退出
:w
写入:w!
强制写入:q
退出:q!
强制退出:wq
保存退出:wq!
强制保存退出ZZ
修改后保存退出 没修改直接退出:w filename
另存为另一个文件:20,30 w filename
将20行到30行的内容另存为另一个文件
可视区块
v
字符选择V
行选择ctrl + v
矩形选择y
复制d
删除p
粘贴
多窗口多文件编辑
多文件
$ vim file1 file2 (-O 多窗口)
打开多个文件:e filename
打开或新建另外一个文件:n / bnext / next
编辑下一个文件:N / bpre / last
编辑上一个文件b 1
跳转到第1个buffer中:files
列出所有编辑中的文件
多个窗口
:h window-resize
查看调整窗口文档:sp
横向划分窗口:sp filename
将filename打开或新建:sv
垂直划分窗口:sv filename
将filename打开或新建ctrl + w +
:hjkl
方向键切换当前窗口HJKL
方向键移动当前窗口w
循环切换当前窗口
多标签页
:h tabpage
查看tabpage文档:tabnew / tabe filename
在新标签页中打开文件:tabc
关闭当前标签页:tabo
关闭其他标签页ctrl + w + T
移动当前窗口到新的标签页[N]gt
切换[第N个]下一个标签页gT
切换上一个标签页
其他操作
ctrl + p
返回上一个命令:help
查询帮助文档:! command
暂时退出到执行command:e!
重新加载文档
4. 配置
缓存
- 修改文件时会建立.filename.swp文件作为缓存
- 出现意外终止情况,会自动读取文件来进行以下恢复操作:
- O 只读打开文件
- E 正常方式打开文件
- R 恢复缓存文件(恢复且保存后需要手动删除缓存文件)
- D 删除缓存文件
- Q / A 退出
记录和设置
- ~/.viminfo 记录文件的操作 /etc/.vimrc 记录整体vim的环境设置 ~/.vimrc 账户的设置
"
为注释:source ~/.vimrc
令配置生效:set all / :h option-list
查看所有属性配置
:set tabstop=4
设置tab格子数:set nu
显示行号:set nonu
取消行号:set hls
显示搜索高亮:set incsearch
显示搜索过程高亮:set autoindent
设置自动缩进:set paste / nopaste
:syntax on
打开标亮
映射
- imap/nmap/vmap 递归映射 inoremap/nnoremap/vnoremap 非递归映射
- 举个例子 inoremap <C-W>h <C-h> 将移动窗口按键简化
5. vim的其他注意事项
中文编码问题
- Linux 系统支持的语言 配置在/etc/locale.conf中
- Bash 语言与 LANG 和 LC_ALL 有关
- 文本编码要与GNOME下的终端字符编码要一致
- 配置的名称 为LANG/export LC_AL=
en_US.[编码] / zh_CN.[编码]
- ascii / gb2312 / gbk / gb18030 范围由小到大
- big5 表示繁体中文, utf8兼容ascii
DOS与UNIX环行符转换
- 换行符号 DOS : “^M " ( C R L F ) U N I X : " "(CRLF) UNIX :" "(CRLF)UNIX:"”(LF)
- 比如运行脚本出现问题 : “坏的解释器: 没有那个文件或目录”
- $ dos2unix/unix2dos [-kn] file [newfile]
- -k 保留文本的时间格式
- -n 保留源文件将新文件输出为newfile(推荐加上-n)
- $ file filename 查看文本以什么换行和编码方式
语系转换
- $ iconv --list 显示iconv支持的语系
- $ iconv -f type -t newtype filename [-o newfile] 将type转换成newtype
- -o 保留源文件将新文件输出为newfile(推荐加上-o)