目录
1. vim 常见设置
- "set mouse=a 加注释,一个双引号即可
- nmap <F9> :set mouse-=a<cr> 设置快捷键 F9 来取消鼠标可用,按键映射 存储到哈希表中, <cr> 表示添加回车
- nmap <F10> :set mouse=a<cr> 设置快捷键 F10 来使得鼠标可用
- nmap <space>dm :set mouse-=a<cr> 先按下空格,再按 dm(自己设置) 重定义组合键
- nmap <space>em :set mouse=a<cr>
- nmap 是在普通模式下运行,递归,维护性差
- imap 是在插入模式下运行
- imap jk <esc> 在插入模式下按下 jk 保存
- imap jk <esc>:w<cr> 保存
- imap ( ()<esc>i 补全括号并且光标停留在 () 中,其实相当于一个字符串序列, 遇到 ( 解析成 () 此时光标在 () 中,按下 i 插入
- imap { {<cr>}<esc>i<cr>
- nnoremap 维护性好
- nnoremap J <c-w>j c 表示 ctrl,按下 ctrl+w,m 表示 alt 但是 ssh 连接时会导致 alt 键不生效,调整窗口,调整的是分屏后的屏幕窗口
- nnoremap K <c-w>k 这里需要注意的是如果配置了该快捷键,那么在 vim 环境下不能查询库函数的帮助手册,这是因为查询的方式是 K(shift + k),按键冲突。
- set nu 设置行号
- set nonu 取消设置行号
- syntax on 语法高亮
- syntax off 取消语法高亮
- set mouse=a 允许鼠标可用
- set mouse-=a 允许从 windows 端复制数据到 ssh 连接工具中
- set ts=4 或者 set tabstop=4 Tab 缩进 4 格
- set expandtab Tab 替换空格,实际上存储的 Tab 就变成了空格
- set autoindent 保持上一行的缩进
- set cindent 保持 C 的自动缩进
- set smartindent 智能缩进
- set showmatch 在输入括号时,短暂地跳转到对应括号处 高亮显示匹配括号
- set backspace=2 使得退格键能够正常处理
- set incsearch 输入关键词时高亮显示
- set hlsearch 高亮显示搜索结果
2. vim 常见用法
2.1 移动光标
h : 左←
j : 下↓
k : 上↑
l : 右→
$ : 当前行的行尾
0 : 当前行的行首,如果有空白字符,则回到空白字符处
^ : 也是移动到行首,与 0 不同的是, ^ 移动到本行第一个单词的首个字符
L : 当前屏幕的最后一行
H : 当前屏幕的第一行
M : 当前屏幕的中间行
e : 移动到单词末尾
w : 移动到光标所在位置的下一个单词开始位置
b : 移动到光标所在位置的上一个单词开始位置
} : 下一个空白行
{ : 上一个空白行
% : 左右括号之间跳转
:num : 移动到 num 行,末行模式
:$ : 移动到当前文件的末尾,末行模式
G : 移动到当前文件的末尾,即就是 shift+g
gg : 文件最开始处
nyy : 复制 n 行
nyw : 拷贝光标所在位置 n 个单词
nyb :拷贝光标所在位置之前的 n 个单词
x : 删除光标所在位置的字符
dw : 删除从光标所在位置到当前单词结尾
db : 删除从光标所在位置到当前单词开始
dd : 删除光标所在行
D : 删除从光标所在位置到当前行的行尾
d0 : 删除从光标所在位置到当前行的行首
d$ : 删除从光标所在位置到当前行的行尾
dG : 删除从光标所在位置到当前文件结尾
u : 撤销(undo)
ctrl + r : 撤销的撤销,即就是重做(read)
yy 或者 y 用于复制,类似于 ctrl + c,dd 或者 d 用于剪切,类似于 ctrl + x。
自动补全使用 ctrl + n 即可。
将光标置于待查看宏定义的单词上,使用 [d 可以查看宏定义语句。
末行模式执行 shell 命令 :!command
- :!man 2 open
- :!ls -l
- :!pwd
学习 vim 使用 vimtutor 命令即可。
2.2 多行缩进
- 在末行模式下 :10,20>
- 在可视模式下选中多行,按下 == 即可实现对齐,按下 > 可以缩进。
- ctrl+v 进入列可视化模式后,选中要缩进的行然后按下 shift+i,在第一行敲个 Table,再按两下 Esc 即可实现多行缩进。
2.3 可视化模式
shift+v 直接选中光标所在行,并进入可视化行模式:
x 用于删除选中的行
y 用于复制选中的行
p 用于粘贴
ctrl + v 进入可视化列模式
x 用于删除选中的列
y 用于复制选中的列
p 用于粘贴
如,可视化列模式通常用于多行注释。
ctrl + v 进入可视化列模式,然后按下 shift+i 进入插入模式,如果是注释 C 代码,那么按下 // ,最后按两下 Esc 即可实现添加多行注释。如果想要删除多行注释,可以在选中相应的列后,按下 d 或者 x 即可取消多行注释。
2.4 替换模式
在普通模式下,按下 r,然后按下想要替换后的字符,即可替换光标所在位置的字符。
2.5 末行替换
# 在 vim 里查找时,\n 代表换行符, \r 代表回车符。
# 而在替换时,\r 代表换行,\n 代表空字符。
以 int Add(int a, int b); 替换为
int Add(int a, int b) {
}
为例:
末行模式下,输入 :%s/;/ {\r\r}\r/g 即可全文替换成功。
如果只修改部分行,可以通过 :line1,line2s/;/ {\r\r}\r/g 进行替换,
其中:line1,line2 表示需要替换的行的范围。
# 消除 ^M
# ^M 的输入,按下 ctrl + v,然后再按下 ctrl + m 即可。
末行模式下,输入 :%s/^M//g 即可消除 ^M。
2.6 控制分屏的尺寸
2.6.1 上下分屏
:sp filename
:He # 可在下边分屏中浏览目录结构以及文件
2.6.2 左右分屏
:vsp filename
:vs filename
:Ve # 可在左边分屏中浏览目录结构以及文件
2.6.3 分屏切换
ctrl + ww # 在不同屏之间切换
- 减少当前窗口高度(对上下分屏才有用)ctrl+w -
- 增加当前窗口高度(对上下分屏才有用)ctrl+w +
- 增加当前窗口宽度(对左右分屏才有用)ctrl+w > 按完ctrl w 后松开,同时按下shift >
- 减少当前窗口宽度(对左右分屏才有用)ctrl+w < 按完ctrl w 后松开,同时按下shift <
- 使所有窗口恢复均等 ctrl+w =
2.7 跳转 man 手册
- 使用 K 来跳转,不过需要知道要查询的函数在第几章,比如 printf 函数在第 3 章,那么光标定位到 printf 函数处,在普通模式中按下 3 K 即可跳转到 printf 的 man 手册。
- 末行模式下 输入:!man 函数 即可查看man手册,需要注意的是,同样需要知道要查询的函数在第几章,比如查询 printf 函数,需要在末行模式下输入 :!man 3 printf。
2.8 查看代码空格和结尾
# 在末行模式下使用
# 其中 ^I 代表 Table,$ 代表结尾
:set list TAB
:set list
以上两种方式均可
2.9 全文复制
# 将 filename 文件的内容放在光标所在位置下面。
:r filename
2.10 打开标签页
:tabe hehe.c # 打开标签页
# gt 切换后一个标签页,gT 往前一个标签页切换
2.11 快速切换函数调用和函数声明
# 光标定位在 int 处,按下 shift+*
# 实际上是正则表达式 ?\<int\>
3. 常用配置
"This is sustzc config"
if (1)
syntax on
set nu
set tabstop=4
set shiftwidth=4
set autoindent
set cindent
set smartindent
set showmatch
set backspace=2
set incsearch
set hlsearch
set cursorcolumn
set cursorline
highlight CursorLine cterm=NONE ctermbg=darkred ctermfg=white guibg=NONE guifg=NONE
highlight CursorColumn cterm=NONE ctermbg=darkred ctermfg=white guibg=NONE guifg=NONE
set encoding=utf-8
set fileencodings=utf-8,ucs-bom,latin1,gb2312,gb18030,cp936,gbk,big5
set termencoding=utf-8
set fileformats=unix,dos
set clipboard+=unnamed
set ruler
set rulerformat=%20(%2*%<%f%=\ %m%r\ %3l\ %c\ %p%%%)
set confirm
"nnoremap <F9> :set mouse-=a<cr>
"nnoremap <F10> : set mouse=a<cr>
"nnoremap <space>dm :set mouse-=a<cr>
"nnoremap <space>em :set mouse=a<cr>
"nnoremap H <c-w>h
"nnoremap J <c-w>j
"nnoremap K <c-w>k
"nnoremap L <c-w>l
inoremap jk <esc>:w<cr>
inoremap wq <esc>:wq<cr>
inoremap qw <esc>:q!<cr>
"inoremap ( ()<esc>i
"inoremap \" \"\"<esc>i
"inoremap [ []<esc>i
"inoremap { {<esc>o<cr>}
"inoremap { {<esc>o}<esc>i<cr>
endif
4. 自动插入文件头
"定义函数 SetTitle, 自动插入文件头"
autocmd BufNewFile *.sh,*.pl,*.cc,*.cpp,*.c,*.py,*.java, exec ":call SetTitle()"
func SetTitle()
if &filetype == 'sh'
call setline(1,"\#!/bin/bash")
call append(line(".")+0, "")
call append(line(".")+1,"\##################################################################")
call append(line(".")+2,"\# File Name: ".expand("%"))
call append(line(".")+3, "\# Created Time: ".strftime("%c"))
call append(line(".")+4, "\#")
call append(line(".")+5, "\# Copyright (c) 2023, bash shell script from sustzc.")
call append(line(".")+6, "\# All rights reserved.")
call append(line(".")+7,"\##################################################################")
call append(line(".")+8, "")
call append(line(".")+9, "export LANG=en_US.UTF-8")
call append(line(".")+10, "")
call append(line(".")+11, "")
elseif &filetype == 'perl'
call setline(1,"\#!/usr/bin/perl -w")
call append(line(".")+0, "")
call append(line(".")+1,"\##################################################################")
call append(line(".")+2,"\# File Name: ".expand("%"))
call append(line(".")+3, "\# Created Time: ".strftime("%c"))
call append(line(".")+4, "\#")
call append(line(".")+5, "\# Copyright (c) 2023, perl script from sustzc.")
call append(line(".")+6, "\# All rights reserved.")
call append(line(".")+7,"\##################################################################")
call append(line(".")+8, "")
call append(line(".")+9, "")
elseif &filetype == 'cpp'
call setline(1,"\/\*")
call append(line(".")+0, "\* File Name: ".expand("%"))
call append(line(".")+1, "\* Created Time: ".strftime("%c"))
call append(line(".")+2, "\*")
call append(line(".")+3, "\* Copyright (c) 2023, c++ code from sustzc.")
call append(line(".")+4, "\* All rights reserved.")
call append(line(".")+5, "\*\/")
call append(line(".")+6, "")
call append(line(".")+7, "\//#include <iostream>")
call append(line(".")+8, "\//#include <string>")
call append(line(".")+9, "\//#include <algorithm>")
call append(line(".")+10, "\#include <bits/stdc++.h>")
call append(line(".")+11, "")
call append(line(".")+12, "using namespace std;")
call append(line(".")+13, "")
call append(line(".")+14, "int main(void)")
call append(line(".")+15,"\{")
call append(line(".")+16, "")
call append(line(".")+17, " return 0;")
call append(line(".")+18,"\}")
elseif &filetype == 'c'
call setline(1,"\/\*")
call append(line(".")+0, "\* File Name: ".expand("%"))
call append(line(".")+1, "\* Created Time: ".strftime("%c"))
call append(line(".")+2, "\*")
call append(line(".")+3, "\* Copyright (c) 2023, c code from sustzc.")
call append(line(".")+4, "\* All rights reserved.")
call append(line(".")+5, "\*\/")
call append(line(".")+6, "")
call append(line(".")+7, "\#include <stdio.h>")
call append(line(".")+8, "\#include <stdlib.h>")
call append(line(".")+9, "\#include <string.h>")
call append(line(".")+10, "\#include <errno.h>")
call append(line(".")+11, "\#include <unistd.h>")
call append(line(".")+12, "\#include <sys/types.h>")
call append(line(".")+13, "\#include <sys/stat.h>")
call append(line(".")+14, "\#include <sys/mman.h>")
call append(line(".")+15, "\#include <sys/wait.h>")
call append(line(".")+16, "\#include <fcntl.h>")
call append(line(".")+17, "\#include <pthread.h>")
call append(line(".")+18, "\#include <dirent.h>")
call append(line(".")+19, "\#include <semaphore.h>")
call append(line(".")+20, "\#include <signal.h>")
call append(line(".")+21, "\#include <sys/socket.h>")
call append(line(".")+22, "\#include <arpa/inet.h>")
call append(line(".")+23, "")
call append(line(".")+24, "\#define SYS_ERR(MSG) do { \\")
call append(line(".")+25, " perror(MSG); \\")
call append(line(".")+26, " exit(EXIT_FAILURE); \\")
call append(line(".")+27, " } while(0)")
call append(line(".")+28, "")
call append(line(".")+29, "\#define ERROR_CHECK(x) do { \\")
call append(line(".")+30, " if (-1 == (x)) { \\")
call append(line(".")+31, " SYS_ERR(#x); \\")
call append(line(".")+32, " } \\")
call append(line(".")+33, " } while(0)")
call append(line(".")+34, "")
call append(line(".")+35, "\#define ERROR_CHECK_MSG(x, MSG) do { \\")
call append(line(".")+36, " if (-1 == (x)) { \\")
call append(line(".")+37, " SYS_ERR(MSG); \\")
call append(line(".")+38, " } \\")
call append(line(".")+39, " } while(0)")
call append(line(".")+40, "")
call append(line(".")+41, "\#define HANDLER_ERR(MSG, EN) do { \\")
call append(line(".")+42, " errno = EN; \\")
call append(line(".")+43, " fprintf(stderr, \"%s: %s\\n\", \\")
call append(line(".")+44, " MSG, strerror(errno)); \\")
call append(line(".")+45, " exit(EXIT_FAILURE); \\")
call append(line(".")+46, " } while(0)")
call append(line(".")+47, "")
call append(line(".")+48, "int main(int argc, char *argv[], char *envp[])")
call append(line(".")+49,"\{")
call append(line(".")+50, "")
call append(line(".")+51, " return 0;")
call append(line(".")+52,"\}")
elseif &filetype == 'python'
call setline(1,"\#!/usr/bin/python -u")
call append(line(".")+0,"\# -*- coding:utf-8 -*-")
call append(line(".")+1, "")
call append(line(".")+2,"\##################################################################")
call append(line(".")+3,"\# File Name: ".expand("%"))
call append(line(".")+4, "\# Created Time: ".strftime("%c"))
call append(line(".")+5, "\#")
call append(line(".")+6, "\# Copyright (c) 2023, python script from sustzc.")
call append(line(".")+7, "\# All rights reserved.")
call append(line(".")+8,"\##################################################################")
call append(line(".")+9, "")
call append(line(".")+10, "import os")
call append(line(".")+11, "import sys")
call append(line(".")+12, "")
call append(line(".")+13, "if __name__ == '__main__':")
call append(line(".")+14, "")
elseif &filetype == 'java'
call setline(1,"\/\*")
call append(line(".")+0, "\* File Name: ".expand("%"))
call append(line(".")+1, "\* Created Time: ".strftime("%c"))
call append(line(".")+2, "\*")
call append(line(".")+3, "\* Copyright (c) 2023, java code from sustzc.")
call append(line(".")+4, "\* All rights reserved.")
call append(line(".")+5, "\*\/")
call append(line(".")+6, "")
endif
endfunc
"新建文件后, 自动定位到文件末尾"
autocmd BufNewFile * normal G
"This is sustzc config"
if (1)
syntax on
set nu
set tabstop=4
set shiftwidth=4
set autoindent
set cindent
set smartindent
set showmatch
set backspace=2
set incsearch
set hlsearch
set cursorcolumn
set cursorline
highlight CursorLine cterm=NONE ctermbg=darkred ctermfg=white guibg=NONE guifg=NONE
highlight CursorColumn cterm=NONE ctermbg=darkred ctermfg=white guibg=NONE guifg=NONE
set encoding=utf-8
"set fencs=gbk,gb2312,gb18030,cp936,utf-8,utf-bom,latin1
set fileencodings=utf-8,ucs-bom,latin1,gb2312,gb18030,cp936,gbk,big5
set termencoding=utf-8
"用于区分操作系统, 主要是回车 \r\n 的区别"
set fileformats=unix,dos
"与 Windows 共享剪贴板
set clipboard+=unnamed
"在状态行上显示光标所在位置的行号和列号
set ruler
set rulerformat=%20(%2*%<%f%=\ %m%r\ %3l\ %c\ %p%%%)
"在处理未保存或只读文件的时候, 弹出确认
set confirm
"nnoremap <F9> :set mouse-=a<cr>
"nnoremap <F10> : set mouse=a<cr>
"nnoremap <space>dm :set mouse-=a<cr>
"nnoremap <space>em :set mouse=a<cr>
"nnoremap H <c-w>h
"nnoremap J <c-w>j
"nnoremap K <c-w>k
"nnoremap L <c-w>l
inoremap jk <esc>:w<cr>
inoremap wq <esc>:wq<cr>
inoremap qw <esc>:q!<cr>
"inoremap ( ()<esc>i
"inoremap \" \"\"<esc>i
"inoremap [ []<esc>i
"inoremap { {<esc>o<cr>}
"inoremap { {<esc>o}<esc>i<cr>
endif