Vim技巧大全
无插件vimrc:
" ====================================== " 基本配置 " ====================================== " 不兼容vi命令 set nocompatible " Vim 的默认寄存器和系统剪贴板共享 set clipboard+=unnamed let $LANG = 'en_US.UTF-8' language messages zh_CN.UTF-8 set encoding=utf-8 set termencoding=cp936 set fileencoding=utf-8 set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1 set langmenu=zh_CN.utf-8 set imcmdline " 防止菜单出现乱码 source $VIMRUNTIME/delmenu.vim source $VIMRUNTIME/menu.vim " 打开语法高亮 syntax on colorscheme desert " 开启文件类型检查,并且载入与该类型对应的缩进规则。 filetype indent on " 在底部状态栏显示当前模式,如插入、命令模式 set showmode " 在命令模式下显示当前命令,如输入2y时,会在状态栏显示命令,再次输入y时,执行命令,状态栏命令消失 set showcmd " 是否显示状态栏。0表示不显示,1表示只在多窗口时显示,2表示显示。 set laststatus=2 set statusline=[%{&ff}:%{&fenc}]%F%m%r%h\ %w\ \ %=%l,%c\ %L " 在状态栏显示光标的当前位置 set ruler " 支持鼠标 set mouse=a " 当前文本使用uf8编码 set encoding=utf-8 " 保留命令的历史记录数 set history=1000 " 显示行号 set number " 光标所在的当前行高亮 hi CursorLine term=bold cterm=bold ctermbg=darkgray hi LineNr ctermbg=black set cursorline " 设置行宽,即一行显示多少个字符 set textwidth=100 " 自动折行,即太长的行分成几行显示,关闭自动折行为set nowrap set wrap " 只有遇到指定的符号(比如空格、连词号和其他标点符号),才发生折行。也就是说,不会在单词内部折行 set linebreak " 垂直滚动时,光标距离顶部/底部的位置(单位:行) set scrolloff=5 " 水平滚动时,光标距离行首或行尾的位置(单位:字符)。该配置在不折行时比较有用。 set sidescrolloff=10 " ====================================== " 缩进相关配置 " ====================================== " 按下tab时显示的空格数 set tabstop=4 " tab转化为多少个空格 set softtabstop=4 " 执行移位操作`>>或<<`时,显示的空格数 set shiftwidth=4 " 由于 tab 键在不同的编辑器缩进不一致,该设置自动将 Tab 转为空格 set expandtab " 自动缩略,当按下回车时,自动与上一行的缩进保持一致 set autoindent " ====================================== " 搜索相关配置 " ====================================== " 光标遇到{[()]}时,会高亮显示另一半匹配的符号 set showmatch " 高亮显示搜索的词 set hlsearch " 增量搜索匹配结果,即每输入一个字母都会进行匹配 set incsearch " 搜索时忽略大小写 set ignorecase " 如果同时打开了ignorecase,那么对于只有一个大写字母的搜索词,将大小写敏感;其他情况都是大小写不敏感 set smartcase " ====================================== " 编辑相关配置 " ====================================== " 不创建交换文件。交换文件主要用于系统崩溃时恢复文件,文件名的开头是.、结尾是.swp set noswapfile " 自动切换工作目录。这主要用在一个 Vim 会话之中打开多个文件的情况,默认的工作目录是打开的第一个文件的目录。该配置可以将工作目录自动切换到,正在编辑的文件的目录。 set autochdir " 出错时,不要发出响声 set noerrorbells " 出错时,发出视觉提示,通常是屏幕闪烁 set visualbell " 打开文件监视。如果在编辑过程中文件发生外部改变,就会发出提示。 set autoread " 命令模式下,底部操作指令按下 Tab 键自动补全 set wildmenu
如果我的关于这个话题的最新帖子没有提醒到你的话,那我明确地说,我是一个 Vim 的粉丝。所以在你们中的某些人向我扔石头之前,我先向你们展示一系列“鲜为人知的 Vim 命令”。我的意思是,一些你可能以前没有碰到过的命令,但可能对你来说很有用。作为第二免责声明,我不知道哪些命令是你可能知道的,以及哪些是对你来说有用的。因此这些命令实际上是一些相对少见,但很可能很有用的 Vim 命令。
保存文件并退出
说起来有些惭愧,我也是最近才学到这个命令
: x
和下面的命令是等价的:
: wq
都是保存当前文件并退出。
(译者注:这两个命令实际上并不完全等价,当文件被修改时两个命令时相同的。但如果未被修改,使用 : x 不会更改文件的修改时间,而使用 :wq 会改变文件的修改时间。)
基本计算器
在插入模式下,你可以使用 Ctrl+r 键然后输入 =,再输入一个简单的算式。按 Enter 键,计算结果就会插入到文件中。例如,尝试输入:
然后计算结果“4 ”会被插入到文件中。
查找重复的连续的单词
当你很快地打字时,很有可能会连续输入同一个单词两次,就像 this this。这种错误可能骗过任何一个人,即使是你自己重新阅读一遍也不可避免。幸运的是,有一个简单的正则表达式可以用来预防这个错误。使用搜索命令(默认是 /)然后输入:
这会显示所有重复的单词。要达到最好的效果,不要忘记把下面的命令:
放到你的 .vimrc 文件中高亮所有的匹配。
缩写
一个很可能是最令人印象深刻的窍门是你可以在 Vim 中定义缩写,它可以实时地把你输入的东西替换为另外的东西。语法格式如下:
一个通用的例子是:
会把你输入的 “asap” 替换为 “as soon as possible”。
在你忘记用 root 方式打开文件时的文件保存
这可能是一个在论坛中一直受欢迎的命令。每当你打开一个你没有写入权限的文件(比如系统配置文件)并做了一些修改,Vim 无法通过普通的 “:w” 命令来保存。
你不需要重新以 root 方式打开文件再进行修改,只需要运行:
这会直接以 root 方式保存。
实时加密文本
如果你不想让别人看懂你的屏幕上的内容,你可以使用一个内置的选项,通过下面的命令使用 ROT13来对文本进行编码:
gg 把光标移动到 Vim 缓冲区的第一行,V 进入可视模式,G 把光标移动到缓冲区的最后一行。因此,ggVG 使可视模式覆盖这个当前缓冲区。最后 g? 使用 ROT13 对整个区域进行编码。
注意它可以被映射到一个最常使用的键。它对字母符号也可以很好地工作。要对它进行撤销,最好的方法就是使用撤销命令:u。
自动补全
这是另外一个令我感到惭愧的功能,但我发现周围很多人并不知道。Vim 默认有自动补全的功能。的确这个功能是很基本的,并且可以通过插件来增强,但它也很有帮助。方法很简单。Vim 尝试通过已经输入的单词来预测单词的结尾。比如当你在同一个文件中第二次输入 “compiler” 时,仅仅输入 “com” 然后保持在插入模式,按 Ctrl+n 键就可以看到 Vim 为你补全了单词。很简单,但也很有用。
比较两个文件的不同
你们中的大多数很可能都知道 vimdiff 命令,它可以使用分离模式打开 Vim 并比较两个文件的不同。语法如下:
但同样的结果也可以通过下面的 Vim 命令来获得:
首先在 Vim 中打开原始文件。然后使用分离模式带来第二个文件:
最后在第一个缓冲区里输入:
通过 Ctrl+w 来切换缓冲区并再次输入:
这样两个文件中不同的部分就会被高亮。
(译者注:可以直接在一个缓冲区里使用命令 :windo diffthis,而不用输入 :diffthis 两次)
要停止比较,使用:
按时间回退文件
Vim 会记录文件的更改,你很容易可以回退到之前某个时间。该命令是相当直观的。比如:
会把文件回退到 1 分钟以前的状态。
注意,你可以使用下面的命令进行相反的转换:
删除标记内部的文字
当我开始使用 Vim 时,一件我总是想很方便做的事情是如何轻松的删除方括号或圆括号里的内容。转到开始的标记,然后使用下面的语法:
比如,把光标放在开始的圆括号上,使用下面的命令来删除圆括号内的文字:
如果是方括号或者是引号,则使用:
和:
删除指定标记前的内容
和删除标记内部有些相似,但目的不同。命令如下:
会删除所有光标和标记之间的内容(保持标记不动),如果在同一行有这个标记的话。例如
会删除至句子的末尾,但保持 ‘.’ 不动。
把 Vim 变为十六进制编辑器
这不是我最喜欢的窍门,但有时会很有趣。你可以把 Vim 和 xxd 功能连起来来把文件转换为十六进制模式。命令如下:
类似的,你可以通过下面的命令恢复原来的状态:
把光标下的文字置于屏幕中央
我们所要做的事情如标题所示。如果你想强制滚动屏幕来把光标下的文字置于屏幕的中央,在可视模式中使用命令(译者注:在普通模式中也可以):
zz
跳到上一个/下一个位置
当你编辑一个很大的文件时,经常要做的事是在某处进行修改,然后跳到另外一处。如果你想跳回之前修改的地方,使用命令:
来回到之前修改的地方
类似的:
会回退上面的跳动。
把当前文件转化为网页
这会生成一个 HTML 文件来显示文本,并在分开的窗口显示源代码:
另外一个无插件的vimrc
" ====================================== " 基本配置 " ====================================== " 不兼容vi命令 set nocompatible " Vim 的默认寄存器和系统剪贴板共享 set clipboard+=unnamed let $LANG = 'en_US.UTF-8' language messages zh_CN.UTF-8 set encoding=utf-8 set termencoding=cp936 set fileencoding=utf-8 set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1 set langmenu=zh_CN.utf-8 set imcmdline " 文件头文件尾按向上或向下键时闪屏的解决办法 set noerrorbells visualbell t_vb= autocmd GUIEnter * set visualbell t_vb= " 按F11切换全屏 imap <F11> :call libcallnr("gvimfullscreen.dll","ToggleFullScreen", 0)<CR> " }}} " 防止菜单出现乱码 source $VIMRUNTIME/delmenu.vim source $VIMRUNTIME/menu.vim " 打开语法高亮 syntax on " 开启文件类型检查,并且载入与该类型对应的缩进规则。 filetype indent on " 在底部状态栏显示当前模式,如插入、命令模式 set showmode " 在命令模式下显示当前命令,如输入2y时,会在状态栏显示命令,再次输入y时,执行命令,状态栏命令消失 set showcmd " 是否显示状态栏。0表示不显示,1表示只在多窗口时显示,2表示显示。 set laststatus=2 set statusline=[%{&ff}:%{&fenc}]%F%m%r%h\ %w\ \ %=%l,%c\ %L " 在状态栏显示光标的当前位置 set ruler " 支持鼠标 set mouse=a " 当前文本使用uf8编码 set encoding=utf-8 " 保留命令的历史记录数 set history=1000 " 光标所在的当前行高亮 "set t_Co=256 colorscheme desert " slate hi LineNr ctermbg=darkblue ctermfg=yellow hi CursorLine ctermbg=darkgray if has("gui_win32") set guifont=YaHei_Consolas_Hybrid:h11 colorscheme desert highlight LineNr guibg=#1c1c1c guifg=#afaf87 "colorscheme molokai endif " Set cursor shape and color if &term =~ "xterm" " INSERT mode let &t_SI = "\<Esc>[6 q" . "\<Esc>]12;blue\x7" " REPLACE mode let &t_SR = "\<Esc>[3 q" . "\<Esc>]12;black\x7" " NORMAL mode let &t_EI = "\<Esc>[2 q" . "\<Esc>]12;green\x7" endif " 1 -> blinking block 闪烁的方块 " 2 -> solid block 不闪烁的方块 " 3 -> blinking underscore 闪烁的下划线 " 4 -> solid underscore 不闪烁的下划线 " 5 -> blinking vertical bar 闪烁的竖线 " 6 -> solid vertical bar 不闪烁的竖线 " 显示行号 set number set cursorline " 设置行宽,即一行显示多少个字符 set textwidth=100 " 自动折行,即太长的行分成几行显示,关闭自动折行为set nowrap set wrap " 只有遇到指定的符号(比如空格、连词号和其他标点符号),才发生折行。也就是说,不会在单词内部折行 set linebreak " 垂直滚动时,光标距离顶部/底部的位置(单位:行) set scrolloff=5 " 水平滚动时,光标距离行首或行尾的位置(单位:字符)。该配置在不折行时比较有用。 set sidescrolloff=10 " ====================================== " 缩进相关配置 " ====================================== " 按下tab时显示的空格数 set tabstop=4 " tab转化为多少个空格 set softtabstop=4 " 执行移位操作`>>或<<`时,显示的空格数 set shiftwidth=4 " 由于 tab 键在不同的编辑器缩进不一致,该设置自动将 Tab 转为空格 set expandtab " 自动缩略,当按下回车时,自动与上一行的缩进保持一致 set autoindent " ====================================== " 搜索相关配置 " ====================================== " 光标遇到{[()]}时,会高亮显示另一半匹配的符号 set showmatch " 高亮显示搜索的词 set hlsearch " 增量搜索匹配结果,即每输入一个字母都会进行匹配 set incsearch " 搜索时忽略大小写 set ignorecase " 如果同时打开了ignorecase,那么对于只有一个大写字母的搜索词,将大小写敏感;其他情况都是大小写不敏感 set smartcase " ====================================== " 编辑相关配置 " ====================================== " 不创建交换文件。交换文件主要用于系统崩溃时恢复文件,文件名的开头是.、结尾是.swp set noswapfile " 自动切换工作目录。这主要用在一个 Vim 会话之中打开多个文件的情况,默认的工作目录是打开的第一个文件的目录。该配置可以将工作目录自动切换到,正在编辑的文件的目录。 set autochdir " 出错时,不要发出响声 set noerrorbells " 出错时,发出视觉提示,通常是屏幕闪烁 set visualbell " 打开文件监视。如果在编辑过程中文件发生外部改变,就会发出提示。 set autoread " 命令模式下,底部操作指令按下 Tab 键自动补全 set wildmenu
" ======================================" 基本配置" ======================================
" 不兼容vi命令set nocompatible
" Vim 的默认寄存器和系统剪贴板共享set clipboard+=unnamedlet $LANG = 'en_US.UTF-8'language messages zh_CN.UTF-8set encoding=utf-8set termencoding=cp936set fileencoding=utf-8set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1set langmenu=zh_CN.utf-8set imcmdline
" 文件头文件尾按向上或向下键时闪屏的解决办法set noerrorbells visualbell t_vb=autocmd GUIEnter * set visualbell t_vb=
" 按F11切换全屏imap <F11> :call libcallnr("gvimfullscreen.dll","ToggleFullScreen", 0)<CR>" }}}
" 防止菜单出现乱码source $VIMRUNTIME/delmenu.vimsource $VIMRUNTIME/menu.vim
" 打开语法高亮syntax on
" 开启文件类型检查,并且载入与该类型对应的缩进规则。filetype indent on
" 在底部状态栏显示当前模式,如插入、命令模式set showmode
" 在命令模式下显示当前命令,如输入2y时,会在状态栏显示命令,再次输入y时,执行命令,状态栏命令消失set showcmd
" 是否显示状态栏。0表示不显示,1表示只在多窗口时显示,2表示显示。set laststatus=2set statusline=[%{&ff}:%{&fenc}]%F%m%r%h\ %w\ \ %=%l,%c\ %L
" 在状态栏显示光标的当前位置set ruler
" 支持鼠标set mouse=a
" 当前文本使用uf8编码set encoding=utf-8
" 保留命令的历史记录数set history=1000
" 光标所在的当前行高亮"set t_Co=256colorscheme desert " slatehi LineNr ctermbg=darkblue ctermfg=yellowhi CursorLine ctermbg=darkgrayif has("gui_win32") set guifont=YaHei_Consolas_Hybrid:h11 colorscheme desert highlight LineNr guibg=#1c1c1c guifg=#afaf87 "colorscheme molokaiendif
" Set cursor shape and colorif &term =~ "xterm" " INSERT mode let &t_SI = "\<Esc>[6 q" . "\<Esc>]12;blue\x7" " REPLACE mode let &t_SR = "\<Esc>[3 q" . "\<Esc>]12;black\x7" " NORMAL mode let &t_EI = "\<Esc>[2 q" . "\<Esc>]12;green\x7"endif" 1 -> blinking block 闪烁的方块" 2 -> solid block 不闪烁的方块" 3 -> blinking underscore 闪烁的下划线" 4 -> solid underscore 不闪烁的下划线" 5 -> blinking vertical bar 闪烁的竖线" 6 -> solid vertical bar 不闪烁的竖线
" 显示行号set numberset cursorline
" 设置行宽,即一行显示多少个字符set textwidth=100
" 自动折行,即太长的行分成几行显示,关闭自动折行为set nowrapset wrap
" 只有遇到指定的符号(比如空格、连词号和其他标点符号),才发生折行。也就是说,不会在单词内部折行set linebreak
" 垂直滚动时,光标距离顶部/底部的位置(单位:行)set scrolloff=5
" 水平滚动时,光标距离行首或行尾的位置(单位:字符)。该配置在不折行时比较有用。set sidescrolloff=10
" ======================================" 缩进相关配置" ======================================
" 按下tab时显示的空格数set tabstop=4
" tab转化为多少个空格set softtabstop=4
" 执行移位操作`>>或<<`时,显示的空格数set shiftwidth=4
" 由于 tab 键在不同的编辑器缩进不一致,该设置自动将 Tab 转为空格set expandtab
" 自动缩略,当按下回车时,自动与上一行的缩进保持一致set autoindent
" ======================================" 搜索相关配置" ======================================
" 光标遇到{[()]}时,会高亮显示另一半匹配的符号set showmatch
" 高亮显示搜索的词set hlsearch
" 增量搜索匹配结果,即每输入一个字母都会进行匹配set incsearch
" 搜索时忽略大小写set ignorecase
" 如果同时打开了ignorecase,那么对于只有一个大写字母的搜索词,将大小写敏感;其他情况都是大小写不敏感set smartcase
" ======================================" 编辑相关配置" ======================================" 不创建交换文件。交换文件主要用于系统崩溃时恢复文件,文件名的开头是.、结尾是.swpset noswapfile
" 自动切换工作目录。这主要用在一个 Vim 会话之中打开多个文件的情况,默认的工作目录是打开的第一个文件的目录。该配置可以将工作目录自动切换到,正在编辑的文件的目录。set autochdir
" 出错时,不要发出响声set noerrorbells
" 出错时,发出视觉提示,通常是屏幕闪烁set visualbell
" 打开文件监视。如果在编辑过程中文件发生外部改变,就会发出提示。set autoread
" 命令模式下,底部操作指令按下 Tab 键自动补全set wildmenu