vim 学习笔记
多行添加注释和取消注释
正常模式 –> 可视模式:
指令 | 描述 |
---|---|
v | 可视模式 |
ctrl+v | 可视块模式 |
shift+v | 可视行模式 |
可视块模式有一个非常实用的作用:选多行进行注释
多行添加注释:
- 光标置于行首
-ctrl + v
,进入可视块模式
- 移动光标,选中的位置会有高亮显示
-shift + i
,进入 insert 模式
- 输入//
-esc
多行取消注释:
- 光标置于行首
-ctrl + v
,进入可视块模式
- 移动光标,选中的位置会有高亮显示
- 按d
同一窗口操作多个文件
- 同时打开两个文件并分割窗口
上下分割:
1 | $ vim -o filename1 filename2 |
左右分割:
1 | $ vim -O filename1 filename2 |
- 已打开一个文件,同时再打开另一个文件
上下分割:
1 | :vs filename |
左右分割:
1 | :sp filename |
其中,vs 可以用 vsplit 替换,sp 可以用 split 替换。
如果 finename 不存在,则会新建该文件并打开。
- 切换窗口
先 ctrl + w
开启窗口切换后,再选择按上下左右键进行跳转:
1 | ctrl + w w // 即按住ctrl键,再按两下w键。或者ctrl + w <h|j|k|l> |
即按住 ctrl 键,按一次 w 键,再按一次表示方向的 h 或 j 或 k 或 l,则光标会切换到当前窗口的 左|下|上|右 侧的窗口。
- 关闭 vim 窗口
关闭光标所在的窗口:
1 | :q |
关闭所有窗口:
1 | :qa |
关闭除光标所在的窗口之外的其他窗口:
1 | :only |
统计字符串出现次数
- 命令
1 | :%s/pattern//gn |
- 参数说明
% :指明操作区间,% 表示全文本;可以使用 1,$ 或者行区间代替
s:substitute,表示替换
pattern:要查找的字符串
//:替代文本应该放在这里,两个斜杠中间没有任何字符表示无替代文本
g:替换该行所有出现的字符串,如果没有该参数则只替换该行第一次出现的地方
n:表示匹配的行数
- 扩展
统计 k 行到 l 行出现 pattern 的次数:
1 | :k,ls/pattern//gn |
统计在当前编辑文本出现的次数:
1 | :%s/pattern//gn |
统计在文件中出现的行数:
1 | cat file|greg –i pattern |wc –l |
鼠标选中不能复制
vim 中鼠标选中不能复制并进入可视模式,习惯了在 vim 中鼠标选中即复制的效果,对此问题从网上查了下发现是 vim 的默认配置导致的。
- 解决方法:
修改 vim 的默认配置文件
1
vim /usr/share/vim/vim81/defaults.vim
输入
/mouse
搜索关键词mouse
,定位到下面位置1
2
3if has('mouse')
set mouse=a
endif将
set mouse=a
改为set mouse-=a
(在等号前面加上一个减号)输入
:wq!
保存即可解决问题。
删除多余空格
删除行尾多余的空格和 tab 符号。
1
%s/\s\+$//g
命令解释:
【% s】表示全文替换
【% s/str1/str2/g】表示将全文中str1
替换成str2
【\s+$】要替换的内容str1
,其中\s
表示空格和 tab,\+
表示一个或多个,$
表示行尾(表示行末($)前的一个或者多个(+)空格(\s))
【//】替换后的内容str2
,其中 // 直接为空,表示替换为空,即达到删除效果
【g】表示全局替换(global)
只删除行尾空格,不能删除 tab
1
%s/ *$//g
/ 和 * 中间有空格,只能删除行尾空格,对于 tab 不能删除
vim 新建文件自动添加头部注释
- 修改
~/.vimrc
,在文件最后添加以下内容:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45" 【vim创建程序文件自动添加头部注释】
" 当新建.h .c .hpp .cpp .sh文件时自动调用SetTitle函数添加头部注释
autocmd BufNewFile *.[ch],*.hpp,*.cpp,*.sh exec ":call SetTitle()"
" 定义.h .c .hpp .cpp注释格式
func SetComment()
call setline(1,"/*================================================================")
call append(line("."), "* Author: paopao")
call append(line(".")+1, "* Date: ".strftime("%Y-%m-%d"))
call append(line(".")+2, "* Description: ")
call append(line(".")+3, "================================================================*/")
call append(line(".")+4, "")
endfunc
" 定义.sh注释格式
func SetComment_sh()
call setline(3, "#================================================================")
call setline(4, "#")
call setline(5, "# Author: paopao")
call setline(6, "# Date: ".strftime("%Y-%m-%d"))
call setline(7, "# Description: ")
call setline(8, "#================================================================")
call setline(9, "")
endfunc
" 定义函数SetTitle,自动插入文件头
func SetTitle()
if &filetype == 'sh'
call setline(1,"#!/bin/sh")
call setline(2,"")
call SetComment_sh()
else
call SetComment()
if expand("%:e") == 'h'
call append(line(".")+5, "#ifndef _".toupper(expand("%:t:r"))."_H")
call append(line(".")+6, "#define _".toupper(expand("%:t:r"))."_H")
call append(line(".")+7, "")
call append(line(".")+8, "#endif //".toupper(expand("%:t:r"))."_H")
elseif expand("%:e") == 'hpp'
call append(line(".")+5, "#ifndef _".toupper(expand("%:t:r"))."_HPP")
call append(line(".")+6, "#define _".toupper(expand("%:t:r"))."_HPP")
call append(line(".")+7, "")
call append(line(".")+8, "#endif //".toupper(expand("%:t:r"))."_HPP")
endif
endif
endfunc - 新建
a.sh
和a.h
来测试效果:1
2
3
4
5
6
7
8
9
10lhx@ubuntu:~$ vim a.sh
#!/bin/sh
#================================================================
#
# Author: paopao
# Date: 2022-04-30
# Description:
#================================================================1
2
3
4
5
6
7
8
9
10
11
12lhx@ubuntu:~$ vim a.h
/*================================================================
* Author: paopao
* Date: 2022-04-30
* Description:
================================================================*/
#ifndef _A_H
#define _A_H
#endif //A_H
底部状态行显示绝对路径和行列信息
- 打开 vim 配置文件
1
vim ~/.vimrc
- 修改方法
- 方法 1:复制下面内容到配置文件最后面
1 | " 状态栏 |
- 方法 2:复制下面内容到配置文件最后面
1 | set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%] "显示文件名:总行数,总的字符数 |
- 参数列表
参数 | 含义 |
---|---|
%{n}* | % 对其余的行使用高亮显示组 Usern,直到另一个 % n*。数字 n 必须从 1 到 9。用 % 或 %0 可以恢复正常的高亮显示。 |
%< | 如果状态行过长,在何处换行。缺省是在开头。 |
%= | 左对齐和右对齐项目之间的分割点。 |
% | 字符 % |
%B | 光标下字符的十六进制形式 |
%F | 缓冲区的文件完整路径 |
%H | 如果为帮助缓冲区则显示为 HLP |
%L | 缓冲区中的行数 |
%M | 如果缓冲区修改过则显示为 + |
%N | 打印机页号 |
%O | 以十六进制方式显示文件中的字符偏移 |
%P | 文件中光标前的 % |
%R | 如果缓冲区只读则为 RO |
%V | 列数。如果与 % c 相同则为空字符串 |
%W | 如果窗口为预览窗口则为 PRV |
%Y | 缓冲区的文件类型,如 vim |
%a | 如果编辑多行文本,这个字行串就是 ({current} of {arguments}),例如:(5 of 18)。如果在命令行中只有一行,这个字符串为空 |
%b | 光标下的字符的十进制表示形式 |
%c | 列号 |
%f | 缓冲区的文件路径 |
%h | 如果为帮助缓冲区显示为 [Help] |
%l | 行号 |
%m | 如果缓冲区已修改则表示为 [+] |
%n | 缓冲区号 |
%o | 在光标前的字符数(包括光标下的字符) |
%p | 文件中所在行的百分比 |
%r | 如果缓冲区为只读则表示为 [RO] |
%t | 文件名 (无路径) |
%v | 虚列号 |
%w | 如果为预览窗口则显示为 [Preview] |
%y | 缓冲区的文件类型,如 [vim] |
%{expr} | 表达式的结果 |