如何优雅的使用 Vim一:基本配置

如何优雅的使用 Vim(一):基本配置

Vim 十年,青春不再

转眼间,Vim 已用了十年。
从一开始的抵触、不解,到随之而来的习惯、喜欢,再到近几年编辑器层出不穷的盛况下对 Sublime Text 等短暂的尝试,以及最后即现在的回归,这是一个复杂的过程。
目前,我对 Vim 仍停留在配置和使用阶段,并没有为它开发过任何插件。希望接下来十年,能为它做一些贡献。
Vim 是一个难学难上手,即使熟悉了也会让你痛并快乐着的那种编辑器。要教别人用 Vim,就更是难上加难了。

如何评价GitHub准备推出下一代文本编辑器Xray? 一文,可以看到时下不少编辑器的尝试。软件行业发展到今天,编辑器远远没有达到一个完美的境界,包括 Vim,这本身就是一件很不可思议的事情。

基础设置

最最基本的一些设置,位于 vimrc 的开头。

" 首先设置 mapleader,后面键盘映射随时要用
" 基本上所有自定义的快捷键都以这个字符打头,比如映射`,w`为`:w`
let mapleader = ","
let g:mapleader = ","

" 不兼容 Vi,最大限度使用新特性
set nocompatible

" 写入文件时,不做备份
set nobackup
set Nowritebackup

" 不用交换文件
set noswapfile

" 保存文件的快捷键
nmap <leader>w :w!<CR>

" 移除 Windows 文件结尾的 `^M`
noremap <leader>m :%s/<C-V><C-M>//ge<CR>

" 重新打开文件时,恢复上一次游标位置
" 通过View可以记住很多设置,比如高亮当前行、折行等等,但是往往比较让人费解
set viewoptions=cursor  " 只记住游标
au BufWinLeave ?* mkview
au VimEnter ?* silent loadview

" 检测文件编码时,优先考虑 UTF-8
set fileencodings=utf-8,ucs-bom,gbk,gb2312,big5,latin1

" 不同平台,设置不同的行尾符,即 EOL
" 注意:在 Mac 平台,也是 unix 优先;自 OS X 始,行尾符与 Unix 一致,
"      都是 `\n` 而不是 `\r`
if has("win32")
    set fileformats=dos,unix,mac
else
    set fileformats=unix,mac,dos
endif

" 在断行、合并(join)行时,针对多字节字符(比如中文)的优化处理
set formatoptions+=mM

配色方案

目前主要使用 morhetz/gruvBox,本文所有截图都是 gruvBox效果
配色方案可以通过插件安装,这里先跳过,会有另一篇文章专门介绍插件

set background=dark
Syntax enable
colorscheme gruvBox
au BufEnter * :Syntax sync fromstart

格式

缩进选项

" 采用 C 风格的缩进,适用于大多数语言
" 细节调整见下面的 `cinoptions`
" 你也可以尝试 smartindent 和 autoindent
set cindent

" 细节调整,主要为了适应 Google C++ Style
" t0: 函数返回类型声明不缩进
" g0: C++ "public:" 等声明缩进一个字符
" h1: C++ "public:" 等声明后面的语句缩进一个字符
" N-s: C++ namespace 里不缩进
" j1: 合理的缩进 Java 或 C++ 的匿名函数,应该也适用于 JS
set cinoptions=t0,g1,h1,N-s,j1

制表符 vs. 空格

让制表符智能一些。

set smarttab

对程序员来说,用制表符还是用空格,足以引发一场战争。
美剧《硅谷》中,Richard 因为不能接受女友用空格缩进而断然与之分手。
下面的设置并不优雅,各人需求不一样,需做相应调整。

" 先设置缺省情况,然后根据不同文件类型再次重新设置
set expandtab | set tabstop=4 | set shiftwidth=4  " Python,CSS,etc.

" 对 C/C++ 等,制表符和缩进都是两个空格
au FileType c,cpp,html,htmldjango,lua,javascript,nsis
    \ set expandtab | set tabstop=2 | set shiftwidth=2

" Makefile 必须保留制表符,且习惯上占八个空格
" 不过,这年头谁还会写 Makefile?
au FileType make set noexpandtab | set tabstop=8 | set shiftwidth=8

文本宽度

除了缩进,另一个深具争议的话题就是 80列 限制。

虽然现在显示器大了很多,有些语言习惯上仍然遵守这一规则。

通过设置 textwidth,Vim 可以帮我们在输入时或用gq格式化时自动断行。

我发现,用 gq 格式化注释特别方便,超长的注释会自动重新排版,以保证不越过指定的长度。

目前,我仅对 C/C++/Python/Vim 做这种限制。

au FileType c,python,vim set textwidth=80

一般如果设定了宽度限制,最好能画一条竖线以警示。
设置 colorcolumn 即可。甚至可以设置为多列,比如 "81,101"。
我是所有文件类型都显示这么一条线。

set colorcolumn=81

折行

通常代码不需折行,前面有些语言设置了宽度限制就更不需要了。
实际操作下来,纯文本、Markdown、XML 等比较需要折行,因为它们常常一行太长了。

au FileType text,markdown,xml set wrap

" 折行时,以单词为界,以免切断单词
set linebreak
" 折行后的后续行,使用与第一行相同的缩进
set breakindent

用户界面

" 即使在终端,也尽量启用鼠标
if has("mouse") | set mouse=a | endif

" 显示输入中的命令,对 gqq/gcc 这种多个字符的命令特别有用
set showcmd
" 下面几个不解释,自行查看帮助
set scrolloff=7
set wildmenu
set wildmode="list:longest"
set ruler
" 命令行高度为两行
set cmdheight=2

" 永远显示行号
" 另有比较酷的相对行号(`relativenumber`),虽然我用不习惯
set number

set lazyredraw
" 切换缓存时不用保存
set hidden
" 输入模式下,退格键可以退一切字符
set backspace=eol,start,indent
set whichwrap+=<,>,h,l

高亮不想要的空格,比如行尾。

" See [http://vim.wikia.com/wiki/Highlight_unwanted_spaces]
" - highlight trailing whitespace in red
" - have this highlighting not appear whilst you are typing in insert mode
" - have the highlighting of whitespace apply when you open new buffers
highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches() " for performance

高亮当前行。

set cursorline

不过,我一般不用,因为闪烁的游标就已经很清楚了。

搜索

首先,搜索时忽略大小写(ignorecase)。但是,如果搜索模式里有大写字母,就不再忽略大小写(smartcase)。

set ignorecase
set smartcase

即时显示匹配结果(incsearch),并高亮所有结果(hlsearch)。

set incsearch
set hlsearch
map <silent> <leader><CR> :nohlsearch<CR>

替换时,缺省启用g标志,即,同一行里的所有匹配都会被替换。

set gdefault

切换窗口

切换窗口的键盘映射:

map <C-j> <C-W>j
map <C-k> <C-W>k
map <C-h> <C-W>h
map <C-l> <C-W>l

以及,直接用方向键切换缓存的键盘映射:

map <right> :bn<CR>
map <left>  :bp<CR>
map <up>    :bf<CR>
map <down>  :bl<CR>

缩写(Abbreviation)

当前日期、时间、文件名这些内容,用缩写来输入是再方便不过了。
当然,缩写本身的名字不能太常见,下面这些都以 x 打头,一般不会出现在正常的文本中。

iabbrev xname <YouName>  " 改成你自己的名字
iabbrev xmail <YouEmail> " 改成你自己的电邮
iabbrev xfile <c-r>=expand("%:t")<CR>
if exists("*strftime")
    iabbrev xdate <c-r>=strftime("%Y-%m-%d")<CR>  " 当前日期
    iabbrev xtime <c-r>=strftime("%H:%M:%s")<CR>  " 当前时间
endif

删除行尾空格

前面用户界面一节已经提到如何高亮行尾空格,下面设置可以删除行尾空格。

# 这个函数通过替换命令删除行尾空格
func! DeleteTrailingWS()
    exec "normal mz"
    %s/\s\+$//ge
    exec "normal `z"
endfunc

" 保存时自动删除行尾空格
au BufWrite * :call DeleteTrailingWS()
map <leader>W :call DeleteTrailingWS()<CR>

" 移除只包含空格的行里的空格(有点绕口)
" 貌似有了前面的函数,这个就没有什么必要了
map <F3> :%s/\s*$//g<CR>:noh<CR>''<CR>

结语

配置是无穷无尽的,是乐趣也是包袱。
这篇文章,并不是我的 Vim 配置的全部,而我的 Vim 配置,也经常性的在变。
此外,我主要写 C++ 和 Python,可能并不适合你。但是道理是一样的,总是免不了折腾。
所以,没有现成适用于所有人的配置,都是在别人的基础上不断收集和改进而成。

为了避免文章太长,常用插件的介绍就另起一篇吧。

<全文完>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


解决方案:解决linux下vim乱码的情况:(修改vimrc的内容)全局的情况下:即所有用户都能用这个配置文件地址:/etc/vimrc在文件中添加:setfileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936settermencoding=utf-8setencoding=utf-8如果只修改个人的vim配置情况:需要把/etc/
Linuxvi/vim所有的UnixLike系统都会内建vi文书编辑器,其他的文书编辑器则不一定会存在。但是目前我们使用比较多的是vim编辑器。vim具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。相关文章:史上最全Vim快捷键键位图—入门到进阶什么是vim
      vim正则匹配:空行:/^$/  /^[\t]*$/注释行:/^#/ /^[\t]*#/:1,$s/\([Rr]\)oot/\1ename/:1,$s/\(square\)and\(fair\)/\2and\1/ 
$select-editorSelectaneditor.Tochangelater,run'select-editor'.1./bin/ed2./binano<----easiest3./usr/bin/code4./usr/bin/vim.basic5./usr/bin/vim.tinyChoose1-5[2]:4
上次手贱忘了保存,这次就简单做个备忘吧,把踩过的坑记一下预览图安装工具:u盘、manjarokdeminimal20.0.3、win32DiskImager提取码:qt9f进bios、选择u盘启动、改语言、改时区、挂载分区(文件系统ext4、在200M左右的一个FAT分区上挂载/boot/efi)、安装安装很简单,按提示
Linux之文本编译器小结vim的优势所有的UNIX-LIKE习通都会内置vi文本编译器,其他的文本编译器则不一定存在很多软件的编译接口都会主动调用vivim有很强的程序编译能力,可以主动的一字体颜色辨别语法的正确性,方便程序设计因为程序简单,编译速度相当快vi的使用一般命令模
主机名字太长,怎么修改?  1.sudovim/etc/hostname 修改内容为wel,  本地主机名 2.sudovim/etc/hosts      修改主机名为wel,用于网络连接中主机名的识别 3.reboot 
目录#事故现场#事故原因#解决方法方法一:使用notepad转换方法二:使用vscode转换方法三:使用vim转换#参考#事故现场执行shell脚本文件,报错::notfound.sh:6:coreinstall.sh:查看脚本文件第6行,发现是空行;#事故原因window下的换行是回车符+换行符,也就是\r\n,而unix下是换行符\n
1、保存并退出linux下安装好了vim以及gcc后,我们开始新建一个c文件,例如:vimtest.c之后进入vim的编辑框中,点击i进入插入模式,开始编辑程序,当你编写好自己的程序之后,按Esc退出插入编辑状态,然后输入冒号加wq,点击Enter即可,完整的命令如下:wq如下图:  退出后,如果想要编译
概述使用VIM作简单字数统计背景想做一个简单的字数统计环境OSwin10shellmintty-2.9.41.需求概述需求需求统计文段内字符的数量支持自定义字符集2.方案1:vim自带统计概述vim自带方案操作定位到文段内某行vi
经典版下面这个键位图应该是大家最常看见的经典版了。对应的简体中文版其实经典版是一系列的入门教程键位图的组合结果,下面是不同编辑模式下的键位图。 
ssh是一个安全连接协议。作用两个:1.远程连接协议,2.远程文件传输协议协议默认端口为:22。 修改默认端口,再到ssh服务配置文件位置  vim/etc/ssh/ssh_config这条命令就可以修改了。按下ESC键,再输入:x 也可以退出vim。(和:q! 相同)修改注意:1.端口号在0-65535之间。2.别人
Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性。VIM是自由软件。Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Emacs的不同变体。1999年Emacs被选为Linuxworld文本编辑分类的优胜者,Vim屈居第二。但在2000年2月Vim赢
在Vim中,有时需要将tab转换成space。使用ret命令(replacetab)。[range]ret[ab]![new-tabstop]举例:将第一行到文件尾的tab转换成space,每个tab用4个space替代。:setexpandtab:%ret!4如果没有给定4,则用当前的tab宽度设定替换为space。 相关配置文件命令::settabstop=4设
分屏命令记不得文件名就输入.可浏览文件命令英文功能:sp[文件名]split横向分屏:vsp[文件名]verticalsplit纵向分屏    切换分屏窗口先按Ctrlw切换窗口命令英文功能 wwindow切换下一个窗口 rreverse互换窗口 c
1查看ctags支持的语言ctags--list-languages2查看语言和扩展名的对应关系ctags--list-maps 3对当前目录下所有ctags支持的语言格式文件生成tagsctags-R*缺点很明显,tags会非常大,tags生成会非常慢,而且代码跳转会卡顿。4只对特定文件生成tagsctags`find-name"*.h"`ct
vim基本命令 $vimtutor可以查看基本的vim操作1h(left)j(down)k(up)l(right)q!wqi:insertbeforethecursor(insert)插队嘛,肯定在光标前面A:appendaftertheline(appending)2dw:删除一个单词,保留光标前面部分d$:删除光标之后的同行
~/.vimrc内容如下:setnocompatiblefiletypeoffsetrtp+=~/.vim/bundle/Vundle.vimcallvundle#begin()Plugin'VundleVim/Vundle.vim'Plugin'tpope/vim-fugitive'Plugin'tpope/vim-unimpaired'Plugin'tpope/vim-repeat'Plu
程序:硬盘静态的代码  占用磁盘空间进程:内存运行计算的代码 占用CPU运行内存父进程与子进程  树型结构进程唯一标识: PID僵尸进程找到父进程杀掉  孤儿进程疯狂要内存  危害大 pstree [选项]-a显示完整命令行   -p 查看PID [PID或用户
~/.vimrc"Configurationfileforvimsetmodelines=0 "CVE-2007-2438setnumber"setrelativenumber"显示相对行号(这个非常重要,慢慢体会)setcursorlinesetcursorcolumnsetrulersetscrollbindsetencoding=utf-8colormolokaisyntaxon"开启