vim 自带教程
vimtutor
vim 配置美化
vim ~/.vim/vimrc #创建自己的vim配置
" _ ____ __ _____ __ __ ____ ____
" ___ ___ _ __ _ _ _ __ ( ) ___| \ \ / /_ _| \/ | _ \ / ___|
" / _ \/ _ \| '_ \| | | | '_ \|/\___ \ \ \ / / | || |\/| | |_) | |
" | __/ (_) | | | | |_| | | | | ___) | \ V / | || | | | _ <| |___
" \___|\___/|_| |_|\__,_|_| |_| |____/ \_/ |___|_| |_|_| \_\\____|
" ===============================木He寸&eonun===============================
" i 写入模式、i插入之前、I行首插入、a插入之后、A行尾插入、o下行插入、O上行插入、x 删除光标后一个字符
" <Operation(操作)> <Motion(动作)>
" d 剪切操作(剪切可看做删除), y 复制操作, p 粘贴操作, c 剪切后修改操作
" ← 左动作, → 右动作, 3← 3个左动作, b 选择光标开启到上一个词后的内容, i 指明光标在词中,当前词待操作, w 选择光标开始到下个词前的内容, iw 在当前词之间选择该, y3← 向右复制, f 查找动作
" 文件类型检测
filetype on
filetype indent on
filetype plugin on
filetype plugin indent on
" 开启语法高亮
if !exists("g:syntax_on")
syntax enable
endif
" 保存vimrc时立即重新加载生效
autocmd BufWritePost $MYVIMRC source $MYVIMRC
" txt文件按照wiki语法高亮
autocmd BufNewFile *.txt set ft=confluencewiki
autocmd BufEnter *.txt set ft=confluencewiki
" 恢复上次文件打开位置
au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif
" 打开时运行指令 取消上回搜索内容的高亮
exec "nohlsearch"
"=========
"===Let===
"==START==
" 将leader键(\键,类似于Windows键)换成空格(相当于空格键)
let mapleader=" "
" 矫正部分配色
let &t_ut=''
" 不同模式下的光标样式
let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_SR = "\<Esc>]50;CursorShape=2\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"
"===END===
"===let===
"=========
"=========
"===set===
"==START==
set nocompatible " 不兼容 VI ,compatible为兼容(tab将不会变成空格)
set fileencodings=utf-8,gbk " 写入文件时采用的编码类型
set termencoding=utf-8 " 输出到终端时采用的编码类型
set encoding=utf-8 " 缓存的文本、寄存器、Vim 脚本文件等
set guifont=YaHei\ Consolas\ Hybrid\ 11.5 " 设置显示字体为YaHei Consolas Hybrid
set number " 显示行号 缩写: nu
set relativenumber " 从当前行向前向后算行数
set cursorline " 突出显示当前行 缩写: cul
"set cursorcolumn " 突出显示当前列 缩写: cuc
set showmatch " 显示括号匹配
set showcmd " 显示指令
set laststatus=2 " 显示状态栏
set ruler " 显示光标当前位置
set wrap " 自动换行
set tw=0 " 防止自动分割行
set expandtab " 将制表符扩展为空格
set softtabstop=4 " 把连续数量的空格视为一个制表符
set tabstop=4 " 制表符长度为4空格 缩写:ts
set shiftwidth=4 " 自动缩进长度为4空格
set autoindent " 自动缩进 缩写:ai
set cindent " c格式自动缩进
set smartindent " 开启智能对其
" 基于缩进或语法进行代码折叠 indent(基于缩进)、syntax(基于语法)
" set foldmethod=indent
set foldmethod=syntax
" 启动 vim 时关闭折叠代码
set nofoldenable
set wildmenu " 命令补全
set autochdir " 在当前目录下执行命令
set hlsearch " 高亮显示搜索
set incsearch " 动态高亮搜索"
set ignorecase " 不区分大小写搜索
set smartcase " 智能大小写搜索
set mouse=a " 使用鼠标
set backspace=indent,eol,start " 能退格到行尾
"===END===
"===set===
"=========
"=============
"===键盘映射===
"====START====
" map 在普通、可视、运算符模式下生效
" map! 在插入、命令模式下生效
" 键映射map,有五种前缀,对应着vim中的五种模式:
" nore前缀: 非递归
" n前缀: 在普通模式下生效
" v前缀: 在可视模式下生效
" o前缀: 在运算符模式下生效
" i前缀: 在插入模式下生效
" c前缀: 在命令模式下生效
" ===一些键表===
" 因为某些原因,ALT几乎无法映射,同时CTRL键被linux系统频繁使用,F1到F12功能键某些也被vim占用,这些都不适合用来映射,以免造成快捷键冲突,在定义快捷键时为了避免一些冲突可用<LEADER>前缀键配合使用
" <k0>-<k9> 小键盘数字0到9
" <S-x> 大写S配合x,意味着shift+x组合键
" <C-x> 大写C配合x,意味着ctrl+x组合键
" <A-x> 大写A配合x,意味着alt+x组合键
" <ESC> ESC键
" <BS> backspace退格键
" <CR> ENTER回车键
" <Space> 空格键
" <Shift> shift键
" <Ctrl> ctrl键
" <Alt> alt键
" <F1>-<F12> F1到F12功能键
" <LEADER> vim前缀键,类似于Windows键/command (⌘) 键
" <silent> 命令不显示
" map 递归映射 a映射到c
" map a b
" map b c
" nmap 普通模式下的递归映射"
" unmap 取消 map 的映射
" mapclear 取消所有 map 的映射
" noremap 不递归映射 a映射为b b映射为c 两个映射互不影响
" noremap a b
" noremap b c
"noremap a b " 将 a 映射为 b
"noremap A 5b " 将 A 映射为 5b
"noremap = nzz " 将 n 映射 =zz " 用 zz 将该行变成中心点
"noremap - Nzz " 将 N 映射 -zz
"--------------------------------------------------------------------------"
noremap <LEADER><CR> :nohlsearch<CR> " 将 <LEADER><CR> 映射为 :nohlsearch<CR> 用于快捷取消搜索高亮
noremap J 5j
noremap K 5k
" 复制到系统剪切板
vnoremap Y :w !xclip -i -sel c <CR> " 需要安装xclip #sudo pacman -S xclip
"vnoremap Y "+y " 需要安装gvim #sudo pacman -S gvim
map MR :e $MYVIMRC<CR> " 打开vimrc
map s <nop>
map S :w<CR> " 将 S 的指令映射为 :w<CR> " <CR> 代表回车
map Q :q<CR> " 将 Q 的指令映射为 :q<CR>
map <silent> <C-a> ggvG " Ctrl-A 选中所有内容
map sk :set splitbelow<CR>:split<CR> " 下分屏":e /文件路径 打开文件
map sj :set nosplitbelow<CR>:split<CR> " 上分屏
map sl :set nosplitright<CR>:vsplit<CR> " 右分屏
map sh :set splitright<CR>:vsplit<CR> " 左分屏
map sz <C-w>t<C-w>H " 竖向分屏换左右分屏
map ss <C-w>t<C-w>K " 左右分屏换竖向分屏
map <LEADER>k <C-w>k " 光标到上屏
map <LEADER>j <C-w>j " 光标到下屏
map <LEADER>h <C-w>h " 光标到左屏
map <LEADER>l <C-w>l " 光标到右屏
map <up> :res +5<CR> " 分屏线上移
map <down> :res -5<CR> " 分屏线下移
map <left> :vertical resize+5<CR> " 分屏线左移
map <right> :vertical resize-5<CR> " 分屏线右移
map tn :tabe<CR> " 打开新选项卡
map th :-tabnext<CR> " 到左边的选项卡
map tl :+tabnext<CR> " 到右边的选项卡
" 符号自动补全
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
":inoremap { {<CR>}<ESC>O
":inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
function! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endfunction
"=====END=====
"===键盘映射===
"=============
Command 命令 |
Normal 常规模式 |
Visual 可视化模式 |
Operator Pending 运算符模式 |
Insert Only 插入模式 |
Command Line 命令行模式 |
:map |
y |
y |
y |
|
|
:map! |
|
|
|
y |
y |
:nmap |
y |
|
|
|
|
:vmap |
|
y |
|
|
|
:omap |
|
|
y |
|
|
:imap |
|
|
|
y |
|
:cmap |
|
|
|
|
y |
vim快捷键速查
基础操作
快捷键 |
功能 |
Esc |
从当前模式转换到“普通模式”。所有的键对应到命令。 |
i |
“插入模式”用于插入文字。回归按键的本职工作。 |
: |
“命令行模式” Vim 希望你输入类似于保存该文档命令的地方。 |
方向键
快捷键 |
功能 |
h |
光标向左移动一个字符 |
j 或 Ctrl + J |
光标向下移动一行 |
k 或 Ctrl + P |
光标向上移动一行 |
l |
光标向右移动一个字符 |
0 |
(数字 0)移动光标至本行开头 |
$ |
移动光标至本行末尾 |
^ |
移动光标至本行第一个非空字符处 |
w |
向前移动一个词 (上一个字母和数字组成的词之后) |
W |
向前移动一个词 (以空格分隔的词) |
5w |
向前移动五个词 |
b |
向后移动一个词 (下一个字母和数字组成的词之前) |
B |
向后移动一个词 (以空格分隔的词) |
5b |
向后移动五个词 |
G |
移动至文件末尾 |
gg |
移动至文件开头 |
文档浏览
快捷键 |
功能 |
( |
跳转到上一句 |
) |
跳转到下一句 |
{ |
跳转到上一段 |
} |
跳转到下一段 |
[[ |
跳转到上一部分 |
]] |
跳转到下一部分 |
[] |
跳转到上一部分的末尾 |
][ |
跳转到上一部分的开头 |
插入
快捷键 |
功能 |
a |
在光标后插入文本 |
A |
在行末插入文本 |
i |
在光标前插入文本 |
o |
(小写字母 o)在光标下方新开一行 |
O |
(大写字母 O)在光标上方新开一行 |
:r [filename] |
在光标下方插入文件 [filename] 的内容 |
:r ![command] |
执行命令 [command] ,并将输出插入至光标下方 |
删除
快捷键 |
功能 |
x |
删除光标处字符 |
dw |
删除一个词 |
d0 |
删至行首 |
d$ |
删至行末 |
d) |
删至句末 |
dgg |
删至文件开头 |
dG |
删至文件末尾 |
dd |
删除该行 |
3dd |
删除三行 |
替换
快捷键 |
功能 |
r{text} |
将光标处的字符替换成 |
R |
进入覆写模式,输入的字符将替换原有的字符 |
撤销重做
快捷键 |
功能 |
u |
撤销最后的操作 |
Ctrl+r |
重做最后撤销的操作 |
搜索、替换
快捷键 |
功能 |
/search_text |
检索文档,在文档后面的部分搜索 search_text |
?search_text |
检索文档,在文档前面的部分搜索 search_text |
n |
移动到后一个检索结果 |
N |
移动到前一个检索结果 |
:%s/original/replacement |
检索第一个 “original” 字符串并将其替换成 “replacement” |
:%s/original/replacement/g |
检索并将所有的 “original” 替换为 “replacement” |
:%s/original/replacement/gc |
检索出所有的 “original” 字符串,但在替换成 “replacement” 前,先询问是否替换 |
书签
快捷键 |
功能 |
m {a-zA-Z} |
在当前光标位置设置书签,书签名可用一个大小写字母({a-zA-Z}) |
:marks |
列出所有书签 |
{a-zA-Z} |
跳转到书签 |
可视模式
快捷键 |
功能 |
v |
进入逐字可视模式 |
V |
进入逐行可视模式 |
Esc |
退出可视模式 |
修改
快捷键 |
功能 |
~ |
切换大小写 |
d |
删除一个词 |
c |
变更 |
y |
复制 |
> |
右移 |
< |
左移 |
! |
通过外部命令进行过滤 |
保存、退出
快捷键 |
功能 |
:q |
退出 Vim,如果文件已被修改,将退出失败 |
:w |
保存文件 |
:w new_name |
用 new_name 作为文件名保存文件 |
:wq |
保存文件并退出 Vim |
:q! |
退出 Vim,不保存文件改动 |
ZZ |
退出 Vim,如果文件被改动过,保存改动内容 |
ZQ |
与 :q! 相同,退出 Vim,不保存文件改动 |
参考
指令集
"================
"=====指令收集=====
"======START=====
" 系统时间
" :map <F7> a<C-R>=strftime("%c")<CR><esc>
" :s/__date__/\=strftime("%c")/
"/*---------------------*\
" 基础命令
"\*---------------------*/
" ctrl+q 可以联合复制,粘贴,替换用 行操作
" ctrl+w+j ctrl+w+k (:bn :bp :bd)
" '. 它移动光标到上一次的修改行
" `. 它移动光标到上一次的修改点
" . 重复上次命令
" <C-O> : 依次沿着你的跳转记录向回跳 (从最近的一次开始)
" <C-I> : 依次沿着你的跳转记录向前跳
" ju(mps) : 列出你跳转的足迹
" :history : 列出历史命令记录
" :his c : 命令行命令历史
" :his s : 搜索命令历史
" q/ : 搜索命令历史的窗口
" q: : 命令行命令历史的窗口
" g ctrl+g 计算文件字符
" {,} 前进至上一段落前进至后一段落
" gg,G(2G) 文件首
" gd dw gf ga(进制转化)
" gg=G 全篇自动缩进 , =G 单行缩进
"* ci[ 删除一对 [] 中的所有字符并进入插入模式
"* ci( 删除一对 () 中的所有字符并进入插入模式
"* ci< 删除一对 <> 中的所有字符并进入插入模式
"* ci{ 删除一对 {} 中的所有字符并进入插入模式
"* cit 删除一对 HTML/XML 的标签内部的所有字符并进入插入模式
"* ci” ci’ ci` 删除一对引号字符 (” 或 ‘ 或 `) 中所有字符并进入插入模式
"
"* vi[ 选择一对 [] 中的所有字符
"* vi( 选择一对 () 中的所有字符
"* vi< 选择一对 <> 中的所有字符
"* vi{ 选择一对 {} 中的所有字符
"* vit 选择一对 HTML/XML 的标签内部的所有字符
"* vi” vi’ vi` 选择一对引号字符 (” 或 ‘ 或 `) 中所有字符
" crl+] 函数原型处 crl+t 回 ( ctags )
" ctl+p 自动补全( 编辑状态 )
" :X 加密保存( 要输入密码 )
" ? / (N n)
" f(F,t) 查找字符
" w(e) 移动光标到下一个单词.
" 5fx 表示查找光标后第 5 个 x 字符.
" 5w(e) 移动光标到下五个单词.
" b 移动光标到上一个单词.
" 0 移动光标到本行最开头.
" ^ 移动光标到本行最开头的字符处.
" $ 移动光标到本行结尾处.
" H 移动光标到屏幕的首行.
" M 移动光标到屏幕的中间一行.
" L 移动光标到屏幕的尾行.
" c-f (即 ctrl 键与 f 键一同按下)
" c-b (即 ctrl 键与 b 键一同按下) 翻页
" c-d (下半页) c-u(上半页) c-e (一行滚动)
" zz 让光标所在的行居屏幕中央
" zt 让光标所在的行居屏幕最上一行
" zb 让光标所在的行居屏幕最下一行
" 在 vi 中 y 表示拷贝, d 表示删除, p 表示粘贴. 其中拷贝与删除是与光标移动命令
" yw 表示拷贝从当前光标到光标所在单词结尾的内容.
" dw 表示删除从当前光标到光标所在单词结尾的内容.
" y0 表示拷贝从当前光标到光标所在行首的内容.
" d0 表示删除从当前光标到光标所在行首的内容.
" y$(Y) 表示拷贝从当前光标到光标所在行尾的内容.
" d$(D) 表示删除从当前光标到光标所在行尾的内容.
" yfa 表示拷贝从当前光标到光标后面的第一个a字符之间的内容.
" dfa 表示删除从当前光标到光标后面的第一个a字符之间的内容.
" s(S),a(A),x(X),D
" yy 表示拷贝光标所在行.
" dd 表示删除光标所在行.
" 5yy 表示拷贝光标以下 5 行.
" 5dd 表示删除光标以下 5 行.
" y2fa 表示拷贝从当前光标到光标后面的第二个a字符之间的内容.
" :12,24y 表示拷贝第12行到第24行之间的内容.
" :12,y 表示拷贝第12行到光标所在行之间的内容.
" :,24y 表示拷贝光标所在行到第24行之间的内容. 删除类似.
" TAB 就是制表符, 单独拿出来做一节是因为这个东西确实很有用.
" << 输入此命令则光标所在行向左移动一个 tab.
" >> 输入此命令则光标所在行向右移动一个 tab.
" 5>> 输入此命令则光标后 5 行向右移动一个 tab.
" :5>>(>>>) :>>(>>>)5
" :12,24> 此命令将12行到14行的数据都向右移动一个 tab.
" :12,24>> 此命令将12行到14行的数据都向右移动两个 tab.
" :set shiftwidth=4 设置自动缩进 4 个空格, 当然要设自动缩进先.
" :set sts=4 即设置 softtabstop 为 4. 输入 tab 后就跳了 4 格.
" :set tabstop=4 实际的 tab 即为 4 个空格, 而不是缺省的 8 个.
" :set expandtab 在输入 tab 后, vim 用恰当的空格来填充这个 tab.
" :g/^/exec 's/^/'.strpart(line('.').' ', 0, 4) 在行首插入行号
" set ai 设置自动缩进
" 5ia<esc> 重复插入5个a字符
"/*---------------------*\
" 替换命令
"\*---------------------*/
" 替换文字 2009-02-34 ----> 2009-02-34 00:00:00
" :%s/\(\d\{4\}-\d\{2\}-\d\{2\}\)/\1 00:00:00/g
" :s/aa/bb/g 将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb
" :s/\/bb/g 将光标所在行出现的所有 aa 替换为 bb, 仅替换 aa 这个单词
" :%s/aa/bb/g 将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb
" :12,23s/aa/bb/g 将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb
" :12,23s/^/#/ 将从12行到23行的行首加入 # 字符
" :%s/fred/joe/igc 一个常见的替换命令,修饰符igc和perl中一样意思
" s/dick/joe/igc则 对于这些满足条件的行进行替换
" :g/^\s*$/d 空行(空格也不包含)删除.
" :%s/\r//g 删除DOS方式的回车^M
" :%s/ *$// 删除行尾空白(%s/\s*$//g)
" :g!/^dd/d 删除不含字符串'dd'开头的行
" :v/^dd/d 同上,译释:v == g!,就是不匹配!
" :v/./.,/./-1join 压缩空行(多行空行合并为一行)
" :g/^$/,/./-j 压缩空行(多行空行合并为一行)
" :g/^/pu _ 把文中空行扩增一倍 (pu = put),原来两行间有一个空行,现在变成2个
" :g/^/m0 按行翻转文章 (m = move)
" :g/fred/,/joe/d not line based (very powerfull)
" :g/<input\|<form/p 或者 要用\|
" :g/fred/t$ 拷贝行,从fred到文件末尾(EOF)
" :%norm jdd 隔行删除,译释:%指明是对所有行进行操作,norm指出后面是normal模式的指令,j是下移一行,dd是删除行
" :'a,'bg/fred/s/dick/joe/igc ('a,'b指定一个范围:mark a ~ mark b)
" g//用一个正则表达式指出了进行操作的行必须可以被fred匹配,g//是一个全局显示命令
" /joe/e 光标停留在匹配单词最后一个字母处
" /joe/e+1 光标停留在匹配单词最后一个字母的下一个字母处
" /joe/s 光标停留在匹配单词第一个字母处
" /^joe.*fred.*bill/ 标准正则表达式
" /^[A-J]\+/ 找一个以A~J中一个字母重复两次或以上开头的行
" /forum\(\_.\)*pent 多行匹配
" /fred\_s*joe/i 中间可以有任何空白,包括换行符\n
" /fred\|joe 匹配FRED或JOE
" /\<fred\>/i 匹配fred,fred必须是一个独立的单词,而不是子串
" /\<\d\d\d\d\> 匹配4个数字 \<\d\{4}\>
" 列,替换所有在第三列中的str1
" :%s:\(\(\w\+\s\+\)\{2}\)str1:\1str2:
" 交换第一列和最后一列 (共4列)
" :%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1:
" 全局(global)显示命令,就是用 :g+正则表达式
" 译释: :g/{pattern}/{cmd} 就是全局找到匹配的,然后对这些行执行命令{cmd}
" :g/\<fred\>/ 显示所有能够为单词fred所匹配的行
" :g/<pattern>/z#.5 显示内容,还有行号
" :g/<pattern>/z#.5|echo '==========' 漂亮的显示
"/*---------------------*\
" 多文档操作 (基础)
"\*---------------------*/
" 用 :ls! 可以显示出当前所有的buffer
" :bn 跳转到下一个buffer
" :bp 跳转到上一个buffer
" :wn 存盘当前文件并跳转到下一个
" :wp 存盘当前文件并跳转到上一个
" :bd 把这个文件从buffer列表中做掉
" :b 3 跳到第3个buffer
" :b main 跳到一个名字中包含main的buffer
"/*---------------------*\
" 列复制
"\*---------------------*/
" 译注:@#%&^#*^%#$!
" :%s= [^ ]\+$=&&= : 复制最后一列
" :%s= \f\+$=&&= : 一样的功能
" :%s= \S\+$=&& : ft,还是一样
" 反向引用,或称记忆
" :s/\(.*\):\(.*\)/\2 : \1/ : 颠倒用:分割的两个字段
" :%s/^\(.*\)\n\1/\1$/ : 删除重复行
" 非贪婪匹配,\{-}
" :%s/^.\{-}pdf/new.pdf/ : 只是删除第一个pdf
" 跨越可能的多行
" :%s/<!--\_.\{-}-->// : 又是删除多行注释(咦?为什么要说「又」呢?)
" :help /\{-} : 看看关于 非贪婪数量符 的帮助
" :s/fred/<c-r>a/g : 替换fred成register a中的内容,呵呵
" 写在一行里的复杂命令
" :%s/\f\+\.gif\>/\r&\r/g | v/\.gif$/d | %s/gif/jpg/
" 译注:就是用 | 管道啦
"/*---------------------*\
" 大小写转换
"\*---------------------*/
" g~~ : 行翻转
" vEU : 字大写(广义字)
" vE~ : 字翻转(广义字)
" ~ 将光标下的字母改变大小写
" 3~ 将下3个字母改变其大小写
" g~w 字翻转
" U 将可视模式下的字母全改成大写字母
" gUU 将当前行的字母改成大写
" u 将可视模式下的字母全改成小写
" guu 将当前行的字母全改成小写
" gUw 将光标下的单词改成大写。
" guw 将光标下的单词改成小写。
"/*---------------------*\
" 文件浏览
"\*---------------------*/
" :Ex : 开启目录浏览器,注意首字母E是大写的
" :Sex : 在一个分割的窗口中开启目录浏览器
" :ls : 显示当前buffer的情况
" :cd .. : 进入父目录
" :pwd
" :args : 显示目前打开的文件
" :lcd %:p:h : 更改到当前文件所在的目录
" 译释:lcd是紧紧改变当前窗口的工作路径,% 是代表当前文件的文件名,
" 加上 :p扩展成全名(就是带了路径),加上 :h析取出路径
"=======END======
"===常用指令收集===
"================