vim 学习笔记

多行添加注释和取消注释

正常模式 –> 可视模式:

指令 描述
v 可视模式
ctrl+v 可视块模式
shift+v 可视行模式

可视块模式有一个非常实用的作用:选多行进行注释

  • 多行添加注释:
    - 光标置于行首
    - ctrl + v,进入可视块模式
    - 移动光标,选中的位置会有高亮显示
    - shift + i,进入 insert 模式
    - 输入 //
    - esc

  • 多行取消注释:
    - 光标置于行首
    - ctrl + v,进入可视块模式
    - 移动光标,选中的位置会有高亮显示
    - 按 d

同一窗口操作多个文件

  1. 同时打开两个文件并分割窗口

上下分割:

1
$ vim -o filename1 filename2  

左右分割:

1
$ vim -O filename1 filename2
  1. 已打开一个文件,同时再打开另一个文件

上下分割:

1
:vs filename

左右分割:

1
:sp filename

其中,vs 可以用 vsplit 替换,sp 可以用 split 替换。
如果 finename 不存在,则会新建该文件并打开。

  1. 切换窗口

ctrl + w 开启窗口切换后,再选择按上下左右键进行跳转:

1
ctrl + w w  // 即按住ctrl键,再按两下w键。或者ctrl + w <h|j|k|l>

即按住 ctrl 键,按一次 w 键,再按一次表示方向的 h 或 j 或 k 或 l,则光标会切换到当前窗口的 左|下|上|右 侧的窗口。

  1. 关闭 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 的默认配置导致的。

  • 解决方法:
  1. 修改 vim 的默认配置文件

    1
    vim /usr/share/vim/vim81/defaults.vim
  2. 输入 /mouse 搜索关键词 mouse ,定位到下面位置

    1
    2
    3
    if has('mouse')
    set mouse=a
    endif

    set mouse=a 改为 set mouse-=a(在等号前面加上一个减号)

  3. 输入 :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.sha.h 来测试效果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    lhx@ubuntu:~$ vim a.sh

    #!/bin/sh

    #================================================================
    #
    # Author: paopao
    # Date: 2022-04-30
    # Description:
    #================================================================
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    lhx@ubuntu:~$ vim a.h

    /*================================================================
    * Author: paopao
    * Date: 2022-04-30
    * Description:
    ================================================================*/

    #ifndef _A_H
    #define _A_H

    #endif //A_H

底部状态行显示绝对路径和行列信息

  1. 打开 vim 配置文件
    1
    vim ~/.vimrc
  2. 修改方法
  • 方法 1:复制下面内容到配置文件最后面
1
2
3
4
5
6
7
8
9
" 状态栏
set laststatus=2 " 总是显示状态栏
highlight StatusLine cterm=bold ctermfg=yellow ctermbg=blue
" 获取当前路径,将$HOME转化为~
function! CurDir()
let curdir = substitute(getcwd(), $HOME, "~", "g")
return curdir
endfunction
set statusline=[%n]\ %f%m%r%h\ \|\ \ pwd:\ %{CurDir()}\ \ \|%=\|\ %l,%c\ %p%%\ \|\ ascii=%b,hex=%b%{((&fenc==\"\")?\"\":\"\ \|\ \".&fenc)}\ \|\ %{$USER}\ @\ %{hostname()}\
  • 方法 2:复制下面内容到配置文件最后面
1
2
set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%] "显示文件名:总行数,总的字符数
set ruler "在编辑过程中,在右下角显示光标位置的状态行
  • 参数列表
参数 含义
%{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} 表达式的结果