Windows 下最实用的 Gvim 配置

2023-11-11

一直以来被称为编辑器之神的 vim 在 Windows 下很难发挥其强大的功能,本文从实用的角度阐述如何调校出一个比较好用的 vim

不过仍然要说明下,在众多 vim 构建版本中 Mac OS 平台的 MacVim 是我认为最好用的一个版本。由于自己公司主力用 Windows,又因笔者是一枚对编辑器颜值体验有要求的前端工程师, 所以才有了下文 ^!^

先说明下开发环境:

  • ThinkPad T450 (公司标配)
  • Windows 7 SP1 64bit 企业版
  • 编程语言 JavasSript, HTML, CSS, NodeJS, Python

前言

本文旨在配置和使用 vim,并不适合太初级的 vim 用户,本文作者也不是 vim 死忠粉,经常混用 Webstrom 和 vim

开始

开始之前我们先看一眼 Windows 上安装 Gvim 的默认界面,我们将从这里开始一步步的学习和配置

gvim-default

配置 _vimrc

由于 vimrc 里面会有很多的配置项,为了避免混乱,我大概按自己的使用习惯分成了几个小组:

  • Startup - 编辑器启动时需要添加的一些配置
  • General - 通用配置
  • Lang & Encoding - 语言和编码
  • GUI - 界面
  • Format - 基本的代码格式
  • Keymap - 通用的快捷键
  • Plugin - 插件相关(包括和当前插件相关的配置和快捷键等)
  • Function - vimrc 里面用到的常用方法

Startup

" Startup {{{
filetype indent plugin on


" vim 文件折叠方式为 marker
augroup ft_vim
    au!

    au FileType vim setlocal foldmethod=marker
augroup END
" }}}

设置 vim 相关文件打开后默认折叠方式为 marker,约定俗成的用三个花括号注释包裹起来,这样在你打开配置文件的时候 vim 就会帮你折叠起来,配置文件看起来就简洁多了,如图:

vim-fold-config

General

" General {{{
set nocompatible
set nobackup
set noswapfile
set history=1024
set autochdir
set whichwrap=b,s,<,>,[,]
set nobomb
set backspace=indent,eol,start whichwrap+=<,>,[,]
" Vim 的默认寄存器和系统剪贴板共享
set clipboard+=unnamed
" 设置 alt 键不映射到菜单栏
set winaltkeys=no
" }}}

基本上一眼就能看出来这是些啥玩意,不过后面两项目我个人感觉比较好用:

clipboard+=unnamed 比如你在其它地方 copy 了一段文字回到 vim 里面可以粘贴进来

winaltkeys=no 一般 windows 下应用程序的 alt 是用来定位菜单栏目的快捷键,我们需要禁用它,因为我们后面很多设置都需要使用 alt,需要使用 alt 来定位菜单的情况很少

Lang & Encoding

" Lang & Encoding {{{
set fileencodings=utf-8,gbk2312,gbk,gb18030,cp936
set encoding=utf-8
set langmenu=zh_CN
let $LANG = 'en_US.UTF-8'
"language messages zh_CN.UTF-8
" }}}

vim 里面设置编码的地方很多,上面这些配置可以保证不会出现乱码,像文件菜单、vim默认语言建议设置成 en_US

GUI

" GUI {{{
colorscheme Tomorrow-Night

source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
set cursorline
set hlsearch
set number
" 窗口大小
set lines=35 columns=140
" 分割出来的窗口位于当前窗口下边/右边
set splitbelow
set splitright
"不显示工具/菜单栏
set guioptions-=T
set guioptions-=m
set guioptions-=L
set guioptions-=r
set guioptions-=b
" 使用内置 tab 样式而不是 gui
set guioptions-=e
set nolist
" set listchars=tab:▶\ ,eol:¬,trail:·,extends:>,precedes:<
set guifont=Inconsolata:h12:cANSI
" }}}

编辑器配色建议使用 Tomorrow-Night,下载文件 copy 到 colors 目录即可

从上面的设置可以看出来,为了得到一个简洁漂亮的界面,我们去掉了菜单栏、各种滚动条、使用 vim 内置 tab 而不是 gvim 系统的 tab 样式,注意很多开发者喜欢显示不可见字符,比如:tab 制表符、换行符号、尾空格等。

我自己并不喜欢这样,因为这样只会使界面看起来更零乱,尤其是某插件纵向标尺

字体方面个人推荐 Inconsolata 这个在我看来是 Windows 平台最漂亮的等宽字体了

此时你的编辑器应该好看了很多:

more-beauty-vim

Format

" Format {{{
set autoindent
set smartindent
set tabstop=4
set expandtab
set softtabstop=4
set foldmethod=indent
syntax on
" }}}

这个设置容易引起争议,我自己是这么个设置,大家按个人喜好就行了,反正我是不建议使用 tab 的,对代码格式有强迫症的人一般都会设置 foldmethod=indent

Keymap

可以说快捷键是每个编辑器必备的功能,科学的设置快捷键能很大程度的提高效率。快捷键的设置要遵循一个规则:尽量不要修改系统默认配置的快捷键,非要设置的话选择好相应的模式

" Keymap {{{
let mapleader=","

nmap <leader>s :source $VIM/_vimrc<cr>
nmap <leader>e :e $VIM/_vimrc<cr>

map <leader>tn :tabnew<cr>
map <leader>tc :tabclose<cr>
map <leader>th :tabp<cr>
map <leader>tl :tabn<cr>

" 移动分割窗口
nmap <C-j> <C-W>j
nmap <C-k> <C-W>k
nmap <C-h> <C-W>h
nmap <C-l> <C-W>l

" 正常模式下 alt+j,k,h,l 调整分割窗口大小
nnoremap <M-j> :resize +5<cr>
nnoremap <M-k> :resize -5<cr>
nnoremap <M-h> :vertical resize -5<cr>
nnoremap <M-l> :vertical resize +5<cr>

" 插入模式移动光标 alt + 方向键
inoremap <M-j> <Down>
inoremap <M-k> <Up>
inoremap <M-h> <left>
inoremap <M-l> <Right>

" IDE like delete
inoremap <C-BS> <Esc>bdei

nnoremap vv ^vg_
" 转换当前行为大写
inoremap <C-u> <esc>mzgUiw`za
" 命令模式下的行首尾
cnoremap <C-a> <home>
cnoremap <C-e> <end>

nnoremap <F2> :setlocal number!<cr>
nnoremap <leader>w :set wrap!<cr>

imap <C-v> "+gP
vmap <C-c> "+y
vnoremap <BS> d
vnoremap <C-C> "+y
vnoremap <C-Insert> "+y
imap <C-V>		"+gP
map <S-Insert>		"+gP
cmap <C-V>		<C-R>+
cmap <S-Insert>		<C-R>+

exe 'inoremap <script> <C-V>' paste#paste_cmd['i']
exe 'vnoremap <script> <C-V>' paste#paste_cmd['v']

" 打开当前目录 windows
map <leader>ex :!start explorer %:p:h<CR>

" 打开当前目录CMD
map <leader>cmd :!start<cr>
" 打印当前时间
map <F3> a<C-R>=strftime("%Y-%m-%d %a %I:%M %p")<CR><Esc>

" 复制当前文件/路径到剪贴板
nmap ,fn :let @*=substitute(expand("%"), "/", "\\", "g")<CR>
nmap ,fp :let @*=substitute(expand("%:p"), "/", "\\", "g")<CR>

" 设置切换Buffer快捷键"
nnoremap <C-left> :bn<CR>
nnoremap <C-right> :bp<CR>

" }}}

首页我们设置了 leaderkey 为逗号「,」,不要问为什么约定的就是它。别设置成空格就行了

注意「,e」和「,s」分别用编辑配置文件,刷新配置文件,后面的路径要按你自己的情况去写,我默认使用了 vim 安装目录里面的 vimrc

分屏编辑操作的时候经常要在不同的屏之间跳来跳去 「Ctrl + vim方向」设置跳转方便顺滑的切换,顺便说下我个人的习惯是在当前tab下编辑一个项目的文件,如果要临时维护其它项目就新开tab,每个tab单独编辑一个项目文件

后面还设置了一些和 Windows 默认编辑操作兼容的快捷键,比如:复制,粘贴

注意有个细节,因为 vim 里面多行操作快捷键是 Ctrl + v 和 windows 粘贴冲突了,一个机智的做法是仅仅在 vim 插件模式设置 Ctrl 为粘贴,正常模式 Ctril + v 进入多选模式,两全其美

插入模式下要移动光标 还得 ESC 一下进入插入模式,这样太麻烦了,使用 「alt + vim方向」就简单多了

Plugin

插件方面根据我自己的工作内容和个人喜好,选择了以下几个,全部使用 vundle 来管理:

  • NERDTree
  • Vim-multiple-cursors
  • Tabular
  • Airline
  • Ctrlp
  • NERDCommenter
  • Emmet
  • SnipMate
  • Fugitive
  • Neocomplete

具体配置我就不帖代码了,可以上git上参观,下面大概解释下每个插件的用途

NERDTree

文件目录树管理,我一般设置成打开 vim 就启动

if exists('g:NERDTreeWinPos')
    autocmd vimenter * NERDTree D:\repo
endif

Vim-multiple-cursors

类似 sublime 多选,进入 visual 模式选择文本 Ctrl+shif+n 即可一直选择下一个匹配文本

mul-cur

Tabular

对齐插件,文章末尾 gif 图里面有展示,visual 模式下选择要对齐的多行文本,进入命令模式 :Tabularize /对齐符号<cr>

Airline

状态栏美化插件,准备弃用了

Ctrlp

类似IDE里面的最近打开的文件,用于快速定位文件/Buffer

NERDCommenter

注释插件,默认是快捷键是 <leader> c <SPACE>

Emmet

用来快速写 HTML

emmet

SnipMate

代码片段管理, 这个插件很早之前的那个版本不维护了,现在最新版的非常强大,不过有另外两个依赖,默认是没有任何内置的 snippet 的,如果需要样版,可以安装 这个插件 需要自定义的话手动更改 snippets 目录下的文件即可(其实就是个git仓库,你可以换成自己的)

snipmate

Fugitive

Git 命令增强工具,在 vim 使用 git,状态栏的分类名称就是调用的这个插件的方法 fugitive#head()

Neocomplete

自动补全插件,这个代码实例插件是需要 lua 支持的,可能你需要手动编译一个带 lua 支持版本的 gvim,下篇文章 我将记录下自己在 Windows 上编译安装的过程

什么?你说为啥不装 YouCompleteMe,官方作者都不支持的插件就别折腾了吧,Neocomplete 这个实例插件对于我的情况来说已经够用了

Function

常用方法这里我只有一个,移除尾空格

" Function {{{
" Remove trailing whitespace when writing a buffer, but not for diff files.
" From: Vigil
" @see http://blog.bs2.to/post/EdwardLee/17961
function! RemoveTrailingWhitespace()
    if &ft != "diff"
        let b:curcol = col(".")
        let b:curline = line(".")
        silent! %s/\s\+$//
        silent! %s/\(\s*\n\)\+\%$//
        call cursor(b:curline, b:curcol)
    endif
endfunction
autocmd BufWritePre * call RemoveTrailingWhitespace()
" }}}

No picture U say a … ?

complete-vimrc

这个是动图,不动戳大

gif-show-vim

结语

还有一点没说明,vimrc 里面的一些 windows 独有的设置我并没有加一些判断来兼容其它平台,这个是个人喜好而已,我会单独分开维护不同平台的配置文件,而不是全部放在一起各种逻辑判断

引用

完整配置文件

«免费 https 证书(Let's Encrypt)申请与配置Windows 下使用 MinGW 编译安装 (g)vim 添加 lua 等编程语言支持»

Comments

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 下最实用的 Gvim 配置 的相关文章

  • Vim 和 Ctags:生成标签时忽略某些文件

    我有一个文件夹 llvm2 9 我在其中运行了此命令 gt ctags R sort 1 c kinds p fields iaS extra q language force C 这是 html 文件中的索引方法 也存在于 llvm2 9
  • Vim:如何将一组行重新格式化为一行(如果该行是一个句子)?

    不是重复的在 Vim 中 将文件中的所有行连接成一行的最简单方法是什么 https stackoverflow com questions 391710 in vim what is the simplest way to join all
  • Vim 滚动时保持光标位置

    有没有办法在滚动时使 Vim gVim 中的 cusror 位置保持在屏幕外 与许多 Windows 编辑器类似 我了解标记 并且确实使用它们 我也知道 标记 最后编辑位置 但正在寻找其他想法 我问这个问题是因为有时我想将光标保留在某个位置
  • 可以使 ctag 遵循 #include 指令吗?

    我正在尝试在我的 Makefile 中创建一个目标来自动创建tags使用 ctags 文件 我有一个源文件列表 cpp 文件 但我没有所有头文件的列表 我使用g MM创建标头依赖项列表 我本以为 ctags 会遵循任何 include生成标
  • Windows 在 PATH 中搜索可执行文件的相对顺序是什么?

    如果我有a com a cmd a bat and a exe我的文件中的 PATH 如果我只调用该命令 Windows 会选择哪一个a 这是微软官方指定的吗 我只是想包裹我的gvim exe可执行文件 n 但是我的gvim bat似乎既不
  • 适用于 neovim / vim8 的 C# LSP 自动完成客户端

    我尝试了多种方法来使其发挥作用 但似乎没有简单的方法 是的 有大量的插件和配置 但截至 2019 年 10 月 它们无法正常工作 OmniSharp Vim https github com OmniSharp omnisharp vim客
  • vim:无法加载库 libpython

    我不让 vim 与 python 支持一起工作 我使用以下配置编译 vim 7 4 972 configure enable shared with features huge enable multibyte enable cscope
  • 使用 Webpack 波形符别名时通过 Vim 中的“gf”解析 JavaScript 模块

    我是使用波浪号的 Vue js 项目的新成员 模块导入中的符号 如 import WhateverApi from api whatever 项目存储库包含所有类型的文件 Vagrant 机器 Laravel 后端应用程序 配置文件和 Vu
  • 为什么 "map! :q " 在 vi​​m 中不起作用?

    I input map
  • 在 Vim 中的缩进线上按“Home”

    我有一个坏习惯 就是使用 home 键返回到行首 当我最近开始使用 vim 时 我注意到当我在缩进的行上按 home 键时 它会让我回到该行的开头 在 Notepad 我曾经使用的编辑器 中 它会让我返回到该行代码的开头 就在缩进之后 有没
  • Vim / vi 生存指南

    基本的 vim 命令有哪些 新用户需要了解什么才能避免陷入麻烦 请每条评论一条命令 我发现不可替代的 因为它也可以在 vi 中使用 与 vim 的视觉模式不同 是标记 您可以用以下标记标记不同的点m 小写 然后是您选择的字母 例如 x 然后
  • 以 Vim 的 -o - 模式打开 Grep 输出中的文件

    如何将文件列表放入 Vim 的 o 模式 我有一个文件列表作为 Grep 的输出 我运行失败 1 grep il sid vim o 2 grep il sid xargs vim o 3 grep il sid xargs vim 4 v
  • 使用 vim 重构目录中的类/方法/字符串的有效方法

    到目前为止 我一直在使用查找和替换操作手动重构代码 s stringiwanttoreplace newstring g in vim 但这是一个缓慢而费力的过程 如果我有的话字符串我想更换在特定目录内的许多文件中 我当前 典型的缓慢而费力
  • VIM - 显示上次保存版本和当前未保存版本的差异[重复]

    这个问题在这里已经有答案了 可能的重复 在 Vim 中保存文件之前我可以看到更改吗 https stackoverflow com questions 749297 can i see changes before i save my fi
  • 在键盘快捷键上插入预定义文本

    我经常插入binding pry当我调试我的 ruby 文件时 当我使用 Vim 时 我希望将其自动化 以避免每次都重新输入 我怎样才能做到呢 我想要映射的确切顺序是 插入新行 Insert binding pry到新创建的行 返回正常模式
  • 禁用 VIM 中的警告?

    有没有办法禁用 VIM 中的警告 特别是 当文件从只读变为可写时 我想禁用警告 12 我有一个脚本可以打开文件进行编辑 但 vim 认为文件已更改并发出警告 Thanks 我的 vimrc 中有以下内容 你应该只需要第二个 它将消息回显到状
  • Linux 上 的默认键绑定是什么? Mac 将此绑定到命令

    Vim 的一些示例设置 例如janus https github com carlhuda janus 将命令键绑定到某些命令 例如 Command Shift F for Ack map
  • 将 vim 的 vertsplit 字符更改为 │

    我认为这与代码页相关 但询问也无妨 在 windows xp 的 cmd 上 gvim 7 2 如何更改 vertsplit 字符 而不是默认的 它是 因此它是一条完整的线 而不是一条分割线 该字符通常会更改为 set fillchars
  • 使用 vim pythoncomplete 的 Python 文档字符串不显示我自己的类函数的换行符

    我在尝试使用时得到了一些意想不到的结果Python 全方位补全 http www vim org scripts script php script id 1542在我自己的类函数上 函数的文档字符串未正确设置换行符格式 如下图所示 当我从
  • 使 'n' 始终向前搜索,无论是否 / 或 ?用于搜索

    我几乎总是在 Vim 中搜索 然后继续向前搜索n并向后N 然而 有时我会使用 跳转到我当前所在行上方几行的项目 在这种情况下 如果我想向前搜索同一项目 我必须使用N代替n 令人烦恼的心理减速带 所以我的问题是 是否有可能使n永远向前走 并且

随机推荐

  • python学习笔记(十二)---访问限制

    私有变量 Python的私有变量表示形式 xx 两道下划线 只有内部可以访问 外部不能访问 class Student object def init self name score self name name self score sc
  • Hinton胶囊网络论文《Dynamic Routing between Capsules》的代码正式开源

    github地址 https github com Sarasra models tree master research capsules 运行测试验证设置是否正确 例如 python layers test py 快速MNIST测试结果
  • 电脑连接西门子S7-200CPU的步骤

    用电脑连接S7 200CPU非常简单 先给CPU供电 然后用PPI通信电缆连接PLC和电脑即可 1 给S7 200CPU供电 下图给出了两种给S7 200供电的方式 直流供电和交流供电 2 连接RS 232 PPI电缆 注意 可以用USB转
  • window下apache安装和配置

    下载 32位 http httpd apache org 64位 http www apachelounge com download 安装 解压Apache2 4到F Apache2 4 修改文件F Apache2 4 conf http
  • layui实现EXCEL文件导入的功能

    layui实现EXCEL文件导入的功能 前台设置导出按钮 a href class layui btn style font size 15px span i class layui icon xe67c i 导入 span a
  • js将英文符号转为ASCII码以及对中文的转换

    昨天用户反应点击某个part number 的level2查询无数据 经检查此PN中包含有 号 此PN当年很 单纯 只包含字母数字 所以被我原封不动的放入url参数中 今天它进化出了 这在url中被转成了空格 而且客户不保证今后不会用其他符
  • element-ui select选择器显示value值而不是label值的问题

    select 选择器正常情况下时可以根据 value 值显示对应 label值的 仅显示 value 可能是因为数据类型问题 需要转成Number类型 例如当value 值在数据库里字段类型是 bigint 时就不能自动转换显示 label
  • 谈谈计算机中存储单位

    互联网越来越发达 我们都知道看下载速度 那么平时我们看见的MB KB B有什么特殊的意思呢 如果你是计算机系的学生 你们的老师应该都问过这样一个问题 同学们 你们知道一个汉字占多少字节吗 1个汉字占两个字节 接下来就是很简单的数学除非问题
  • Java后端开发工程师简历加分项:个人在线简历的搭建

    演示网址 http lishaoyu top u html userid 27 GitHub地址 欢迎fork start 概述 五一小长假 找个小项目复习复习JavaWeb JavaEE基础 项目很简单 就是实现数据库的增删改查 分为五大
  • 融云:从「对话框」跳进魔法世界,AIGC 带给社交的新范式

    8 月 17 日 周四 融云将带来直播课 北极星如何协助开发者排查问题与预警风险 欢迎点击上方报名 AIGC 与社交结合的应用主要分两种 一是发乎于 AIGC 以大模型为基础提供虚拟伴侣等服务的 App 二是在原先已经十分成熟的产品中 添加
  • 微信小程序 数组存照片的方法

    微信小程序中可以使用数组存储照片的方法如下 在数组中定义照片的 URL 如 var photos https example com photo1 jpg https example com photo2 jpg https example
  • 世界上最大的开源基金会 Apache 是如何运作的?

    整理 苏宓 出品 CSDN ID CSDNnews 开源软件的发展势如破竹 全球各国的许多开源技术登上国际舞台 成为数以万计开发者协作 共享 共进的基石 在欣欣向荣态势下 也离不开遵循公开 透明 开放等理念的开源基金会的主导与治理 作为世界
  • 服务器时间如何修改

    win R 输入 gpedit msc 配置NtpServer time nist gov 正常就可以同步了 还没同步就执行下面的 更新组策略 命令行执行gpupdate force 重启 windows time 如果还没有同步 把上面的
  • mac 自带java 环境变量_Mac 安装JDK及环境变量配置

    1 先安装jkd Mac 的jdk系统有自带 如果没有用过的话 版本可能太低 需要重新下载较高的版本 1 终端查看当前安装的jdk版本号 java version 终端查看jdk版本号 2 下载JDK 1 访问Oracle官网 https
  • c++保存图标到dll_[LAB]一种无痕Dll模块注入方式

    0x00 前言 方式 CreateRemoteThread 需要 visual studio 2015 需要 进程模块查看器 如 PCHunter ProcessHacker 等 需要 创建一个用于实验注入的 MFC项目 窗体 需要 创建一
  • git clone出现fatal: Could not read from remote repository解决办法

    一 问题描述 在git clone一个项目时出现如下报错 第一个选项 问你是否继续连接 输入yes然后回车 The authenticity of host github com 20 205 243 166 can t be establ
  • 计算机考试选择题有多选嘛,期货从业资格考试综合题是单选还是多选题?

    期货从业考试采取闭卷 计算机考试方式 所有试题均为客观选择题 每科试题量为140道 满分100 60分为及格 每科考试多场次组织 单科考试时间为100分钟 期货从业资格考试科目考试时间均为100分钟 所有试题均为客观选择题 满分100分 6
  • Java substring( )

    substring start stop substring start stop 用于提取从start到stop 1之间的所有字符 所取字符长度为stop start start 非负整数 开始提取字符的起始位置 必需要写 stop 非负
  • 【教程】Win10安装SQLServer2005出现服务启动失败的问题解决

    Win10安装SQLServer2005时需要注意以下几点 1 先在控制面板中安装好IIS 2 右键SQLServer2005安装文件夹中的setup exe 设置兼容模式为Win7兼容模式 且以管理员身份运行 3 安装过程中 遇到弹窗提示
  • Windows 下最实用的 Gvim 配置

    一直以来被称为编辑器之神的 vim 在 Windows 下很难发挥其强大的功能 本文从实用的角度阐述如何调校出一个比较好用的 vim 不过仍然要说明下 在众多 vim 构建版本中 Mac OS 平台的 MacVim 是我认为最好用的一个版本