我的 Vim 故事 Vimfiles

2025-05-24

我的 Vim 故事

Vim文件

他们说,一旦你用过“notepad.exe”,你就用过所有文本编辑器了。他们说,文本编辑器就是文本编辑器。在专业地运行 Linux/Unix 的最初几年里,我潜意识里也认同这种说法,尽管我了解 Vim——我自认为了解 Vim。但当其他真正懂 Vim 的人使用它时,Vim仍然像魔法一样神奇。

如果您曾经使用过命令行,我相信您会体会到学习如何正确使用文本编辑程序的智慧。在 Unix/Linux 命令行中,文本为王。因此,学习如何有效地操作文本对您的工作效率大有裨益。如果您知道如何打开文件并编辑其内容,那么您也能配置系统。

我最喜欢用来处理这类工作的文本编辑程序是 Vim。它也是我在任何环境下都能找到的文本编辑器——无论是笔记本电脑还是服务器。Vim 可以在多种操作系统上使用,包括 Linux——这是我的首选操作系统。

我偶尔也会使用其他文本编辑器,例如“ gedit ”和“ Apostrophe ”。但大多数时候,当我打字、编写代码或编辑配置文件时,我都会使用 vim。

和许多前辈一样,我的文本编辑器之旅始于运行vim,很快便感到迷茫,然后又无法退出 vim,最后只好重启电脑。就这样,我最初成为了 vimemacs的用户——主要是因为nano当时 vim 还不为人所知。最终,我学会了 vim 的最低使用方法,仅够进行基本的文本编辑。

真正让我改变对 Vim 看法的,是花了一些时间去学习它。Vim 的学习曲线非常陡峭。在 Linux 上工作多年之后,我大约在 2009 年才花了相当多的时间学习 Vim,并根据自己的喜好进行定制。我可以毫不犹豫地说,我最终非常喜欢 Vim——它确实提高了我的工作效率。它功能强大,用途广泛——更重要的是,我有没有说过我喜欢它?

以前,我的 vim 配置是一堆杂乱的配置文件和一堆插件,它们被堆放在一个目录中,直到最后才逐渐恢复到我想要的状态。当时 vim 还没有完善的插件包管理工具,所以不得不这么做。后来Pathogen出现了,我抓住机会更好地组织 vim 文件。虽然 Pathogen 简化了 vim 文件和插件的组织管理,但它没有内置追踪多个插件源随时间变化的方法。

当时我已经在使用git并熟悉了这个相对较新的git submodules功能。我觉得可以使用 git submodules 来有效地管理单个插件。我四处寻找,看看是否有人已经想到了这一点。尽管我确信其他人可能已经想到了——据我所知——但当时没有人公开分享过类似的设置。所以我使用了 submodules 来实现——这对我来说只是个小小炫耀。我之前版本的 vim 配置文件已经不存在了。不过,git 仓库里有一个存档的、稍晚一些的版本。

从那时起,我维护 vim 设置最明显的变化就是切换到vim-plug插件管理。优秀的 vim-plug 免除了我处理 git 子模块的麻烦,让整个过程变得非常轻松。

以下部分将描述我正在使用的 vim 配置。我也会尽量在以后更新这篇文章,希望它能对某些人有所帮助——就像它帮助我了解其他人的做法一样。

需要注意的几点:


一些有用的 Vim 概念

在我们开始之前,我还想快速向您介绍几个关键的 vim 概念,我希望有人早点向我解释。

Vim 有多种模式。Vim被称为“模态”编辑器,这意味着 Vim 有几种可用的模式。

打个比方,想象一下如今的智能手机。你与它进行物理交互的方式有限,但你能用它做的事情却似乎无穷无尽。例如,根据你所处的模式,简单的点击屏幕就会产生不同的效果。在这个例子中,单一的触摸输入可以意味着不同的交互,例如唤醒屏幕、解锁、启动相机应用、重新定位焦点、对焦、拍照、与他人分享照片、在其他应用中点赞某人的照片等等。根据不同的情境(或者说模式),你做的同一件事可能会产生不同的结果。

Vim 有点像这样。它有一个Insert Mode输入文本(例如,打字)到编辑器的地方。它有一个Visual Mode选择文本部分的地方,这样你就可以直观地跟踪你正在对哪个文本部分进行操作(例如,复制选定的文本)。然后还有一个Normal Mode执行其他所有操作的地方,例如移动和操作文本(例如,剪切、复制、粘贴、删除等)。

您可以了解有关这些模式以及如何进入/退出它们的更多信息,您可以查看Vim Wikibook

使用 Vim 编辑就像编写文本程序一样。这其实是 Vim 有快捷键/按键序列的委婉说法。你可以让 Vim 执行一些简单的操作,也可以组合多个指令来执行更复杂的操作。一旦你掌握了基础知识,这些操作就会变得非常直观。

由于您只能使用计算机中的输入设备与软件交互,因此您输入的内容必然会受到限制。Vim 通过快捷键或按键序列来解决这个问题。注意到我说的是按键“序列”而不是“组合”吗?Vim 的快捷键通常定义成这样:您可以先按下一个键,然后再按下其他键,而不是同时按下所有键。

例如,按下d中的字母normal mode会告诉 vim“删除”下一个字符。如果要删除接下来的 5 个字符,指令将变为5d。同时dw删除下一个单词,并3dw删除接下来的 3 个单词;dd删除当前整行文本。7dd删除从当前行开始的 7 行。你懂的。

如果我们更进一步,您可以说“当然,,按下 键dt,可以删除到下一个出现的字符的文本”。按下键时,normal mode可以重复这些操作。想要更改文本而不是删除它?将“d”替换为“c”(例如)。想要直观地选择文本而不是同时删除或更改文本?使用“v”代替“d”或“c”(例如)。您还可以使用箭头键作为替代,将方向性融入其中.normal modect,vt,h, j, k, l

好处是,你不必记住所有东西。你可以用一些基本的积木来构建指令集,一次输入一个按键。有点像指挥管弦乐队,或者像编写文本编辑程序一样。很简洁吧?

你可以定义自己的快捷键。Vim允许你通过几种不同的方式定义自己的快捷键,下面将介绍其中一些。

关键是 Vim 允许您在键盘快捷键序列前加上一个特殊键(称为leaderkey),这样您自己的快捷键就不会与内置的 vim 快捷键冲突。

就我个人而言,我更喜欢按照我认为的“vim 方式”来设置快捷键。更进一步说,我倾向于设置那些不会破坏 vim 默认功能的快捷键,至少在逻辑上与内置功能(如果有的话)相邻,并且不会长期影响肌肉记忆。您可以自行判断下面的配置是否合理地遵循了这一点。

Vimbuffers是不同的编辑空间,而 vimtab pages不是。 “Vim 缓冲区”不要与“vim 标签页”或“vim 窗口”混淆。

Vim 中的Abuffer是内存中的编辑空间。您可以在那里打开一个文件,也可以稍后保存到文件中,或者直接丢弃它。一个 Vim 实例中可以打开多个缓冲区。

Vim 中的Awindow指的是缓冲区的视图。您可以拥有一个包含单个缓冲区的窗口,也可以在同一个缓冲区中拥有多个视图(例如,水平/垂直屏幕分割,或作为独立窗口)。例如,您可以将屏幕区域分割成两个窗口,并分别查看已打开文件的两个不同位置。请记住,这里提到的“窗口”指的是 Vim 窗口(通常以全屏或分屏区域显示),不一定是您习惯使用的图形窗口。

Vim 中的Atab page是组织 Vim 窗口的一种方式。这意味着每个标签页可以包含多个 Vim 窗口(例如,拆分窗口)。因此,你也可以在多个标签页中查看同一个缓冲区。

我知道这可能会让人困惑。你可以看看下面的总结是否有帮助。Vim 帮助文档总结如下

Abuffer是文件内存中的文本。A 是缓冲区上的视口。A 

窗口的集合。window

tab page

尝试将标签页用作不同的文件编辑空间是一个常见的错误,可能会导致令人困惑的错误。如果您不确定该使用哪个,请先尝试buffers一下,因为它们是您所需的编辑空间,并且无论如何您都可以在“窗口”中查看它们。如果您认为需要“标签页”,则可以稍后将其引入到您的工作流程中。

Vim 可以通过插件进行扩展。你可以使用插件(即用其他编程语言编写的程序vimscript)来添加 Vim 中未内置的特性/功能。下面你将看到我正在使用的插件。

总结一下这些关键概念:

  • Vim 有多种模式
  • 使用 Vim 编辑就像编写文本
  • 您可以定义自己的快捷方式
  • Vimbuffers是不同的编辑空间,而 vimtab pages不是
  • Vim 可通过插件进行扩展

解释我的配置

这些都是围绕 Fedora 系列 Linux 发行版(即包括 Fedora*、CentOS 和 Red Hat Enterprise Linux)中的默认 vim 安装环境构建的,因为这些是我通常的工作环境。

我的 .vimrc 从一些基本设置开始。

" Basic settings
set nocompatible " behave like vim, not old vi
set modelines=0 " don't use modelines
set viminfo='20,\"50 " use a viminfo file,...
set history=50 " and limit history
set ruler " show the cursor position
set title " show title on the window
set autoread " reload file if changed outside vim
set autowrite " save file on some commands
set scrolloff=1 " minimal no. of lines around cursor
set t_Co=256 " assume environment can use 256 colors
set laststatus=2 " always show the status line
set display+=lastline " show as much as possible of last line
set completeopt-=preview " disable preview for auto-completion
view raw basic.vim hosted with ❤ by GitHub
" Basic settings
set nocompatible " behave like vim, not old vi
set modelines=0 " don't use modelines
set viminfo='20,\"50 " use a viminfo file,...
set history=50 " and limit history
set ruler " show the cursor position
set title " show title on the window
set autoread " reload file if changed outside vim
set autowrite " save file on some commands
set scrolloff=1 " minimal no. of lines around cursor
set t_Co=256 " assume environment can use 256 colors
set laststatus=2 " always show the status line
set display+=lastline " show as much as possible of last line
set completeopt-=preview " disable preview for auto-completion
view raw basic.vim hosted with ❤ by GitHub

结合附带的注释,这些应该很容易理解。其中大部分是为了一些基本的便捷设置或改进视觉提示。

不过我应该提一下set autowrite。根据 vim 文档,autowrite即使你没有明确要求保存(即 vim 术语中的“写入”),也可以通过某些操作保存文件。

我喜欢尽可能避免这样的意外。然而,autowrite这是我为数不多的例外之一,因为它弥补了便利性。例如,它可以避免在缓冲区之间切换时出现烦人的“未保存内容警告”。如果您对此不确定,最好避免设置(即启用)它。


接下来是一些实际上会对您将要编辑的文本产生影响的事情——如何tab处理字符/键。

我知道“制表符 vs 空格”之争会多么两极分化。因此,我不会参与其中。我一开始是“制表符”阵营的,但我尽可能地使用空格代替制表符,主要是为了在不同环境下获得相对一致的视觉体验。

" How Tab behaves
set tabstop=4 " number of spaces used as tab for file
set softtabstop=4 " number of spaces used as tab for editing
set shiftwidth=4 " number of spaces used to autoindent
set expandtab " expand tabs into spaces
set smarttab " smart tabulation and backspace
set bs=indent,eol,start " allow backspacing over everything
view raw tabs.vim hosted with ❤ by GitHub
" How Tab behaves
set tabstop=4 " number of spaces used as tab for file
set softtabstop=4 " number of spaces used as tab for editing
set shiftwidth=4 " number of spaces used to autoindent
set expandtab " expand tabs into spaces
set smarttab " smart tabulation and backspace
set bs=indent,eol,start " allow backspacing over everything
view raw tabs.vim hosted with ❤ by GitHub

我更喜欢每个制表符对应 4 个空格,因为我现在使用的大多数语言(例如Rust)都能很好地支持这个设置。当您使用空格而不是制表符时,smarttabbs设置在退格键等功能上会有所帮助。如果您不设置这些设置,使用退格键删除所有扩展的制表符会变得很繁琐。

我还设置了按 Tab 键时自动输入空格set expandtab。这是另一个你应该注意的潜在陷阱。如果你不想扩展到空格,那么就不要设置expandtab

有些工具(例如 Python 和 Go)在需要 Tab 键时,处理空格并不总是很好。对于这种情况,您需要设置例外情况。我在配置的后面部分设置了一些 Tab 键处理的例外情况。


" How Search behaves
"set ignorecase " assume patterns are case insensitive,...
set smartcase " ...when lowercase-only is used
set incsearch " start searching as you type
view raw search.vim hosted with ❤ by GitHub
" How Search behaves
"set ignorecase " assume patterns are case insensitive,...
set smartcase " ...when lowercase-only is used
set incsearch " start searching as you type
view raw search.vim hosted with ❤ by GitHub

这里的注释很容易理解。需要记住的是,如果你设置了ignorecase,则在所有使用模式的地方都会忽略大小写。这在使用模式搜索和替换类型的操作时可能会导致棘手的情况。因此,我将其禁用。


" How non-printable things are shown
set list " show non-print characters,...
set listchars=trail:⋅,nbsp:⋅,tab:▷⋅ " for tabs and trailing spaces
set number " show line number for current line,...
set relativenumber " and relative line numbers for others
set cursorline " highlight the line with the cursor
set wildmenu " use command-line completion menu,...
set wildmode=longest:full " with wildmode
set autoindent " enable auto-indentation
view raw np.vim hosted with ❤ by GitHub
" How non-printable things are shown
set list " show non-print characters,...
set listchars=trail:⋅,nbsp:⋅,tab:▷⋅ " for tabs and trailing spaces
set number " show line number for current line,...
set relativenumber " and relative line numbers for others
set cursorline " highlight the line with the cursor
set wildmenu " use command-line completion menu,...
set wildmode=longest:full " with wildmode
set autoindent " enable auto-indentation
view raw np.vim hosted with ❤ by GitHub

" How IO behave
set ttyfast " assume the terminal is fast
set mouse=a " enable mouse in all modes
view raw io.vim hosted with ❤ by GitHub
" How IO behave
set ttyfast " assume the terminal is fast
set mouse=a " enable mouse in all modes
view raw io.vim hosted with ❤ by GitHub

此处的大多数设置都针对非打印字符。因此,它们不会对您正在编辑的文本产生影响,仅在您使用编辑器时提供视觉提示。

这里的例外是autoindent,它实际上会根据上一行的缩进自动缩进文本。你可以显式地使用 来禁用此功能(例如,在正常模式下输入或添加到 .vimrc 中noautoindent来临时禁用)。:set noautoindentset noautoindent

使用 Vim 时,您无需使用鼠标——事实上,我们不建议这样做。但如果您想做一些实用的事情,比如在进行目视检查时以自己的速度滚动,然后点击跳转到某个位置,那么您可以这样做。虽然我喜欢使用 Vim,但我并不反对只使用键盘。有时,在使用 Vim 时,加入鼠标——或者更准确地说,不让鼠标/触摸板变得毫无用处——会很有帮助。这就是我也启用鼠标的原因。


Vim 也有一个 GUI 版本,通常称为gvim。它带有类似于普通 GUI 程序的界面,包括工具栏、菜单栏、滚动条等。

当我使用 gvim 时,我更喜欢简洁干净的窗口,有点像终端版本的样子。如果您更喜欢 GUI 元素,可以跳过这些设置。

" Tweak how Gvim looks
set guifont=Inconsolata-g\ Medium\ 11 " set font in gvim
set guioptions-=T " no toolbar in gvim
set guioptions-=m " no menubar in gvim
set guioptions-=r " no right scrollbar in gvim
set guioptions-=L " no left scrollbar when v.split in gvim
view raw gvim.vim hosted with ❤ by GitHub
" Tweak how Gvim looks
set guifont=Inconsolata-g\ Medium\ 11 " set font in gvim
set guioptions-=T " no toolbar in gvim
set guioptions-=m " no menubar in gvim
set guioptions-=r " no right scrollbar in gvim
set guioptions-=L " no left scrollbar when v.split in gvim
view raw gvim.vim hosted with ❤ by GitHub

再次,这些设置在评论中进行了解释。

找到你常用的字体名称并永久设置它可能会有点棘手。一个简单的方法是:

  • 首先,在 的正常模式下gvim,输入:set guifont=*并按回车键。它将打开你环境的字体选择对话框。你这样设置的字体只是临时的(也就是说,直到你关闭 vim 为止)。
  • 在正常模式下,选择好字体和大小后,按下:set guifontEnter 键。系统会显示当前使用的字体名称。稍后,您可以在 .vimrc 文件中使用该名称来永久设置字体。请注意,您可以\在字体名称中的特殊字符(例如空格)前使用转义符。

在上面的例子中,我添加了“Inconsolata-g”字体,字体大小为“11”,字体大小为“Medium”。如果您想设置其他等宽字体,例如Fira MonoSource Code ProDejaVu MonoHack等,可以使用guifont。如果您在终端中使用 vim 而不是 gvim,则字体将通过终端设置继承。


接下来是一个非常重要的设置,尽管它只有一行。

" Set the <leader> key
let mapleader = ","
view raw leader.vim hosted with ❤ by GitHub
" Set the <leader> key
let mapleader = ","
view raw leader.vim hosted with ❤ by GitHub

如前所述,Vim 允许你自定义快捷键,而不会与默认快捷键冲突,方法是使用一个称为“leader”的值——在 .vimrc 中引用为<leader>。默认情况下,leader 键设置为“ \”。为了方便操作,我更喜欢将 leader 键设置为“ ,”。因此,当你在我的设置中看到类似 的<leader>y翻译时,y

你可能会想,这难道不会和插入逗号冲突吗?其实不会冲突,因为你在 中输入(即插入)文本中的逗号,insert mode而在 中调用快捷键normal mode


接下来是另一个有趣的部分——插件管理。Vim 从 8 版开始就内置了插件管理器。不过,我还没有深入研究过它。由于我目前的设置运行良好,所以也不需要更改它。

" Manage plugins with vim-plug
call plug#begin('~/.vim/bundle')
" To: Augment Vim behavior
Plug 'jiangmiao/auto-pairs'
Plug 'easymotion/vim-easymotion'
Plug 'terryma/vim-expand-region'
Plug 'vim-scripts/matchit.zip'
Plug 'tpope/vim-surround'
" To: Augment UI elements
Plug 'vim-scripts/buftabs'
Plug 'itchyny/lightline.vim'
Plug 'junegunn/limelight.vim', {'on': 'Limelight'}
Plug 'scrooloose/nerdtree', {'on': 'NERDTreeToggle'}
Plug 'mtth/scratch.vim', {'on': 'Scratch'}
Plug 'majutsushi/tagbar', {'on': 'TagbarToggle'}
" To: Add utility
Plug 'ctrlpvim/ctrlp.vim', {'on': 'CtrlP'}
Plug 'tpope/vim-fugitive'
Plug 'yegappan/grep', {'on': ['Grep', 'Rg']}
Plug 'scrooloose/nerdcommenter'
Plug 'godlygeek/tabular', {'on': 'Tabularize'}
" To: Augment filetype handling and syntax highlighting
Plug 'fatih/vim-go', {'for': 'go'}
Plug 'ekalinin/Dockerfile.vim', {'for': 'Dockerfile'}
Plug 'vim-pandoc/vim-pandoc-syntax', {'for': 'pandoc'}
\ | Plug 'vim-pandoc/vim-pandoc'
Plug 'rodjek/vim-puppet', {'for': 'puppet'}
Plug 'rust-lang/rust.vim', {'for': 'rust'}
Plug 'cespare/vim-toml', {'for': 'toml'}
" To: Add colorschemes (in addition to ones in .vim/colors)
Plug 'chriskempson/base16-vim'
Plug 'nielsmadan/harlequin'
Plug 'w0ng/vim-hybrid'
Plug 'kristijanhusak/vim-hybrid-material'
Plug 'nanotech/jellybeans.vim'
Plug 'Wutzara/vim-materialtheme'
Plug 'tomasr/molokai'
Plug 'rakr/vim-one'
Plug 'joshdick/onedark.vim'
Plug 'NLKNguyen/papercolor-theme'
Plug 'jpo/vim-railscasts-theme'
Plug 'altercation/vim-colors-solarized'
Plug 'chriskempson/vim-tomorrow-theme'
Plug 'lifepillar/vim-gruvbox8'
" End vim-plug definitions
call plug#end()
" Use of filetype to enable plugin and indentation
filetype plugin indent on
view raw plugins.vim hosted with ❤ by GitHub
" Manage plugins with vim-plug
call plug#begin('~/.vim/bundle')
" To: Augment Vim behavior
Plug 'jiangmiao/auto-pairs'
Plug 'easymotion/vim-easymotion'
Plug 'terryma/vim-expand-region'
Plug 'vim-scripts/matchit.zip'
Plug 'tpope/vim-surround'
" To: Augment UI elements
Plug 'vim-scripts/buftabs'
Plug 'itchyny/lightline.vim'
Plug 'junegunn/limelight.vim', {'on': 'Limelight'}
Plug 'scrooloose/nerdtree', {'on': 'NERDTreeToggle'}
Plug 'mtth/scratch.vim', {'on': 'Scratch'}
Plug 'majutsushi/tagbar', {'on': 'TagbarToggle'}
" To: Add utility
Plug 'ctrlpvim/ctrlp.vim', {'on': 'CtrlP'}
Plug 'tpope/vim-fugitive'
Plug 'yegappan/grep', {'on': ['Grep', 'Rg']}
Plug 'scrooloose/nerdcommenter'
Plug 'godlygeek/tabular', {'on': 'Tabularize'}
" To: Augment filetype handling and syntax highlighting
Plug 'fatih/vim-go', {'for': 'go'}
Plug 'ekalinin/Dockerfile.vim', {'for': 'Dockerfile'}
Plug 'vim-pandoc/vim-pandoc-syntax', {'for': 'pandoc'}
\ | Plug 'vim-pandoc/vim-pandoc'
Plug 'rodjek/vim-puppet', {'for': 'puppet'}
Plug 'rust-lang/rust.vim', {'for': 'rust'}
Plug 'cespare/vim-toml', {'for': 'toml'}
" To: Add colorschemes (in addition to ones in .vim/colors)
Plug 'chriskempson/base16-vim'
Plug 'nielsmadan/harlequin'
Plug 'w0ng/vim-hybrid'
Plug 'kristijanhusak/vim-hybrid-material'
Plug 'nanotech/jellybeans.vim'
Plug 'Wutzara/vim-materialtheme'
Plug 'tomasr/molokai'
Plug 'rakr/vim-one'
Plug 'joshdick/onedark.vim'
Plug 'NLKNguyen/papercolor-theme'
Plug 'jpo/vim-railscasts-theme'
Plug 'altercation/vim-colors-solarized'
Plug 'chriskempson/vim-tomorrow-theme'
Plug 'lifepillar/vim-gruvbox8'
" End vim-plug definitions
call plug#end()
" Use of filetype to enable plugin and indentation
filetype plugin indent on
view raw plugins.vim hosted with ❤ by GitHub

我使用vim-plugJunegunn Choi 开发的插件管理器。它用 vim 脚本编写,因此不需要外部运行时或复杂的手动安装步骤。使用“vim-plug”安装和更新插件非常轻松。

call plug#begin()插件在和的“vim-plug”调用之间定义call plug#end()。我将参数传递'~/.vim/bundle'给它call plug#begin(),以便它知道在哪里安装我的插件。在本例中,参数是一个名为bundle“主 vim 文件目录”的目录~/.vim。我把它放在那里,是因为这是我以前使用其他插件管理器时留下的。

我不会在这个插件列表中逐一介绍。但是,正如您上面看到的,我已将插件分为几个类别,例如:

  • “增强 Vim 行为”
  • “增强 UI 元素”
  • “增强文件类型处理和语法高亮”
  • “添加实用程序”
  • “添加配色方案”

由于我所有的插件都是通过 GitHub 添加的,您可以访问相关的代码库页面了解更多信息。要获取每个插件代码库页面的 URL,请在插件定义中的“ https://github.com/”后附加其名称。例如,“easymotion/vim-easymotion” 代码库的 URL 为“https://github.com/easymotion/vim-easymotion”

这里介绍的某些插件要么需要配置,要么可以配置。这些插件启用的一些功能以及它们引入的快捷方式记录在git repoREADME.md的文件中


" No blinking cursor. See http://www.linuxpowertop.org/known.php
let &guicursor = &guicursor . ",a:blinkon0"
" When the terminal supports colors, turn on...
if &t_Co > 2 || has("gui_running")
syntax on " syntax highlighting
set hlsearch " highlighting last searched pattern
endif
" Autocommands and groups (if supported)
if has("autocmd")
augroup general
autocmd!
" When editing a file, always jump to the last cursor position
autocmd BufReadPost *
\ if line("'\"") > 0 && line ("'\"") <= line("$") |
\ exe "normal! g'\"" |
\ endif
" Switch to working directory of the open file
autocmd BufEnter * lcd %:p:h
augroup END
view raw generic.vim hosted with ❤ by GitHub
" No blinking cursor. See http://www.linuxpowertop.org/known.php
let &guicursor = &guicursor . ",a:blinkon0"
" When the terminal supports colors, turn on...
if &t_Co > 2 || has("gui_running")
syntax on " syntax highlighting
set hlsearch " highlighting last searched pattern
endif
" Autocommands and groups (if supported)
if has("autocmd")
augroup general
autocmd!
" When editing a file, always jump to the last cursor position
autocmd BufReadPost *
\ if line("'\"") > 0 && line ("'\"") <= line("$") |
\ exe "normal! g'\"" |
\ endif
" Switch to working directory of the open file
autocmd BufEnter * lcd %:p:h
augroup END
view raw generic.vim hosted with ❤ by GitHub

" Custom filetypes settings: Ruby, JSON, Vagrant
augroup code_langs
autocmd!
autocmd FileType ruby
\ set tabstop=2 softtabstop=2 shiftwidth=2 expandtab
autocmd FileType go
\ set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab
autocmd BufRead,BufNewFile *.json setfiletype javascript
autocmd BufRead,BufNewFile Vagrantfile setfiletype ruby
augroup END
endif
view raw ft.vim hosted with ❤ by GitHub
" Custom filetypes settings: Ruby, JSON, Vagrant
augroup code_langs
autocmd!
autocmd FileType ruby
\ set tabstop=2 softtabstop=2 shiftwidth=2 expandtab
autocmd FileType go
\ set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab
autocmd BufRead,BufNewFile *.json setfiletype javascript
autocmd BufRead,BufNewFile Vagrantfile setfiletype ruby
augroup END
endif
view raw ft.vim hosted with ❤ by GitHub

我不再进一步解释上述内容,因为在所含注释的帮助下,它们已经非常不言自明了。

需要注意的是,正如我之前提到的,我包含了 Tab 行为异常(例如,RubyGo的 Tab 行为异常)。其他一些异常由文件类型插件自动处理。


如果你仔细观察我之前解释过的同一个文件的各个部分.vimrc,你会发现它有一个语法。正如我之前提到的,Vim 内置了脚本语言。你可以使用这种语言编写自定义函数,通过脚本化的方式让操作更加简单。

" Function: View changes after the last save
function! s:DiffWithSaved()
let filetype=&ft
diffthis
vnew | r # | normal! 1Gdd
diffthis
exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
exe "normal! ]c"
endfunction
com! DiffSaved call s:DiffWithSaved()
view raw func_diff.vim hosted with ❤ by GitHub
" Function: View changes after the last save
function! s:DiffWithSaved()
let filetype=&ft
diffthis
vnew | r # | normal! 1Gdd
diffthis
exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
exe "normal! ]c"
endfunction
com! DiffSaved call s:DiffWithSaved()
view raw func_diff.vim hosted with ❤ by GitHub

在上面的例子中,有一个名为“ DiffWithSaved()”的函数,它结合了 vim 的内置功能,用于查找自上次保存以来是否有任何更改。如果有,它会以类似 Unix 的视图形式呈现上次保存状态与当前状态之间的差异diff。最后,可以使用名为“ ”的命令来调用它DiffSaved

我还定义了一些其他函数。请注意,该ToggleFullScreen()函数有一个外部依赖项,即一个名为 的外部程序wmctrl

" Function: Toggle Quickfix window
let g:quickfix_open = 0
function! QuickfixToggle()
if g:quickfix_open
cclose
let g:quickfix_open = 0
execute g:quickfix_return . "wincmd w"
else
let g:quickfix_return = winnr()
copen
let g:quickfix_open = 1
endif
endfunction
view raw func_qfix.vim hosted with ❤ by GitHub
" Function: Toggle Quickfix window
let g:quickfix_open = 0
function! QuickfixToggle()
if g:quickfix_open
cclose
let g:quickfix_open = 0
execute g:quickfix_return . "wincmd w"
else
let g:quickfix_return = winnr()
copen
let g:quickfix_open = 1
endif
endfunction
view raw func_qfix.vim hosted with ❤ by GitHub

" Function: Toggle full screen mode in gvim (when supported by wmctrl)
function! ToggleFullScreen()
call system("wmctrl -i -r ".v:windowid." -b toggle,fullscreen")
redraw
endfunction
" Function: Toggle full screen mode in gvim (when supported by wmctrl)
function! ToggleFullScreen()
call system("wmctrl -i -r ".v:windowid." -b toggle,fullscreen")
redraw
endfunction

虽然这些函数定义了要执行的操作,但它们不会自动调用。我选择通过快捷键或功能键来调用它们。

" Clear the search result highlighting
nnoremap <leader>/ :noh<CR>
" Map key to function: View changes after the last save
nnoremap <leader>? :DiffSaved<CR>
" Map key to function: Toggle Quickfix window.
" When in doubt, try the shortcut twice.
nnoremap <leader>q :call QuickfixToggle()<CR>
" Toggle displaying non-printable characters
nnoremap <leader>l :set list!<CR>
" Toggle soft-wrap (fit text into window)
nnoremap <leader>j= :set wrap! wrap?<CR>
" Remove all trailing whitespace characters in curent file
nnoremap <leader>W :%s/\s\+$//<cr>:let @/=''<CR>
" Hardwrap current paragraph at value set for 'textwidth'
" Visual mode equivalent: gq
nnoremap <leader>gq gwap
" Un-wrap current paragraph (Visual mode equivalent is: J)
nnoremap <leader>J vipJ
" Clear the search result highlighting
nnoremap <leader>/ :noh<CR>
" Map key to function: View changes after the last save
nnoremap <leader>? :DiffSaved<CR>
" Map key to function: Toggle Quickfix window.
" When in doubt, try the shortcut twice.
nnoremap <leader>q :call QuickfixToggle()<CR>
" Toggle displaying non-printable characters
nnoremap <leader>l :set list!<CR>
" Toggle soft-wrap (fit text into window)
nnoremap <leader>j= :set wrap! wrap?<CR>
" Remove all trailing whitespace characters in curent file
nnoremap <leader>W :%s/\s\+$//<cr>:let @/=''<CR>
" Hardwrap current paragraph at value set for 'textwidth'
" Visual mode equivalent: gq
nnoremap <leader>gq gwap
" Un-wrap current paragraph (Visual mode equivalent is: J)
nnoremap <leader>J vipJ

您可以在上图中看到,DiffSaved和分别QuickfixToggle()配置为通过<leader>?和调用<leader>q。根据我的配置,这相当于分别按下,?,q

" Map <leader>y, x and p as shortcuts for copy, cut and paste (respectively)
" to/from system (X) clipboard when supported (Eg: gvim).
nnoremap <leader>y "+y
vnoremap <leader>y "+y
nnoremap <leader>x "+x
vnoremap <leader>x "+x
nnoremap <leader>p "+p
vnoremap <leader>p "+p
" Select the text that was just pasted
nnoremap <leader>v `[v`]
view raw map_cp.vim hosted with ❤ by GitHub
" Map <leader>y, x and p as shortcuts for copy, cut and paste (respectively)
" to/from system (X) clipboard when supported (Eg: gvim).
nnoremap <leader>y "+y
vnoremap <leader>y "+y
nnoremap <leader>x "+x
vnoremap <leader>x "+x
nnoremap <leader>p "+p
vnoremap <leader>p "+p
" Select the text that was just pasted
nnoremap <leader>v `[v`]
view raw map_cp.vim hosted with ❤ by GitHub

" Map Tab key to % (for working with matching pairs) in normal & visual modes.
nnoremap <tab> %
vnoremap <tab> %
" Make Y behave similar to C and D (from cursor to end of line)
nnoremap Y y$
view raw map_misc.vim hosted with ❤ by GitHub
" Map Tab key to % (for working with matching pairs) in normal & visual modes.
nnoremap <tab> %
vnoremap <tab> %
" Make Y behave similar to C and D (from cursor to end of line)
nnoremap Y y$
view raw map_misc.vim hosted with ❤ by GitHub

我在 中映射了一些实用的快捷键,用于处理剪贴板中的剪切/复制/粘贴操作gvim。这些快捷键分别用于剪切/复制/粘贴,是对内置xy、的补充p,但适用于外部剪贴板(例如,OS 剪贴板)。我还添加了<leader>v(例如,,v)功能,用于在粘贴文本后立即选中粘贴到 vim 中。

除了自定义快捷键之外,我还映射了一些功能键(例如键盘上的 F1 - F12 键)来执行有用的操作。

" Map F1 key to Esc
inoremap <F1> <ESC>
nnoremap <F1> <ESC>
vnoremap <F1> <ESC>
" F2 toggles indenting when pasting
set pastetoggle=<F2>
" Plugin: Auto Pairs - key to toggle auto-complete
let g:AutoPairsShortcutToggle = '<F3>'
" Map F4 key to toggle spell checking
noremap <F4> :setlocal spell! spelllang=en_us<CR>
" Map F5 key to change font in gvim
"noremap <F5> :set guifont=Inconsolata-g\ Medium\ 11<CR>
" Map F6 key to change font in gvim
"noremap <F6> :set guifont=Courier\ 10\ Pitch\ 12<CR>
" Map F7 to toggle focus-highlighting
noremap <F7> :Limelight!!<CR>
" Map F8 to toggle pattern scase-sensitivity (when uppercase are not used)
noremap <F8> :set ignorecase<CR>
" Map F10 for a promt to input where to show a margin. Then hit <CR> to show.
noremap <F10> :set colorcolumn=81
" Map key to function: Toggle full screen mode in gvim
" Requires wmctrl and a compatible WM. When ready, uncomment following line.
nnoremap <F11> :call ToggleFullScreen()<CR>
" Map F12 to toggle between dark/light background
noremap <F12> :let &background = ( &background == "dark"? "light" : "dark" )<CR>
view raw map_fkeys.vim hosted with ❤ by GitHub
" Map F1 key to Esc
inoremap <F1> <ESC>
nnoremap <F1> <ESC>
vnoremap <F1> <ESC>
" F2 toggles indenting when pasting
set pastetoggle=<F2>
" Plugin: Auto Pairs - key to toggle auto-complete
let g:AutoPairsShortcutToggle = '<F3>'
" Map F4 key to toggle spell checking
noremap <F4> :setlocal spell! spelllang=en_us<CR>
" Map F5 key to change font in gvim
"noremap <F5> :set guifont=Inconsolata-g\ Medium\ 11<CR>
" Map F6 key to change font in gvim
"noremap <F6> :set guifont=Courier\ 10\ Pitch\ 12<CR>
" Map F7 to toggle focus-highlighting
noremap <F7> :Limelight!!<CR>
" Map F8 to toggle pattern scase-sensitivity (when uppercase are not used)
noremap <F8> :set ignorecase<CR>
" Map F10 for a promt to input where to show a margin. Then hit <CR> to show.
noremap <F10> :set colorcolumn=81
" Map key to function: Toggle full screen mode in gvim
" Requires wmctrl and a compatible WM. When ready, uncomment following line.
nnoremap <F11> :call ToggleFullScreen()<CR>
" Map F12 to toggle between dark/light background
noremap <F12> :let &background = ( &background == "dark"? "light" : "dark" )<CR>
view raw map_fkeys.vim hosted with ❤ by GitHub

您可能会注意到我使用的约定是:功能键映射仅改变编辑器环境,而任何影响实际文本的内容都被映射为带有“leader”前缀的快捷方式。

在上面的代码中,我实际上将 F1 键重新映射为另一个ESC键,以避免在到达 时意外按下 F1 键ESC。F4 键用于切换拼写检查,F7 键用于使用junegunn/limelight.vim插件,F11 键用于调用上面提到的ToggleFullScreen()函数。其余部分应该不言自明。

我还提供了一个快捷方式,用于当你编辑完文件后忘记sudo保存时所需的权限。与其费尽心思从头开始,不如试试其他方法。以下方法可以让其中一个方法更加便捷(例如,不用使用:w保存,而是使用:w!!sudo 权限输入 保存)。

" Map w!! to write file with sudo, when forgot to open with sudo.
cmap w!! w !sudo tee % >/dev/null
view raw sudo.vim hosted with ❤ by GitHub
" Map w!! to write file with sudo, when forgot to open with sudo.
cmap w!! w !sudo tee % >/dev/null
view raw sudo.vim hosted with ❤ by GitHub

我之前提到过,buffers当你需要同时打开多个文件时,这些方法都是可行的。以下设置部分映射了一些快捷键,以便更快地在缓冲区之间切换。

" List buffers
nnoremap <leader>bl :ls<CR>
" Jump to given buffer number (after entering number hitting 'Enter')
nnoremap <leader>bg :b
" Go to previous buffer
nnoremap <leader>bv :bp<CR>
" Go to next buffer
nnoremap <leader>bn :bn<CR>
" Delete (close) the current buffer and jump to the previous buffer
nnoremap <leader>bd :bp <BAR> bd #<CR>
" Plugin: buftabs - configuration
let g:buftabs_only_basename=1
let g:buftabs_separator = ":"
let g:buftabs_marker_start = "[#"
let g:buftabs_marker_end = "]"
let g:buftabs_marker_modified = " *"
view raw buffers.vim hosted with ❤ by GitHub
" List buffers
nnoremap <leader>bl :ls<CR>
" Jump to given buffer number (after entering number hitting 'Enter')
nnoremap <leader>bg :b
" Go to previous buffer
nnoremap <leader>bv :bp<CR>
" Go to next buffer
nnoremap <leader>bn :bn<CR>
" Delete (close) the current buffer and jump to the previous buffer
nnoremap <leader>bd :bp <BAR> bd #<CR>
" Plugin: buftabs - configuration
let g:buftabs_only_basename=1
let g:buftabs_separator = ":"
let g:buftabs_marker_start = "[#"
let g:buftabs_marker_end = "]"
let g:buftabs_marker_modified = " *"
view raw buffers.vim hosted with ❤ by GitHub

此外,我还在这里配置了插件buftabs。它会在 vim 窗口底部显示你打开的文件。你无法通过点击它来切换缓冲区,而是提供了一个简洁的已打开缓冲区及其状态的指示。


最后,我们到了激动人心的部分——colorscheme!前两行明确termguicolors设置background了两个值,而不是尝试从环境中获取它们。

" Set colorschemes
set termguicolors
set background=dark
colorscheme one
view raw colorscheme.vim hosted with ❤ by GitHub
" Set colorschemes
set termguicolors
set background=dark
colorscheme one
view raw colorscheme.vim hosted with ❤ by GitHub

我的termguicolors设置明确指出您使用的终端支持 GUI 颜色。对我来说确实支持,因为我大多数时候都使用Fedora自带的GNOME 终端。如果您的终端不支持 GUI 颜色,请不要设置此项。

我的background设置是将终端背景设为深色。和许多需要长时间盯着屏幕的人一样,只要有机会,我也更喜欢使用深色主题。有些配色方案会根据这个值在深色和浅色版本之间进行选择,所以我明确指定了“深色”。如果您更喜欢浅色,也可以将其设置为“浅色”。

如果您不需要这两者中的任何一个,那么您不应该设置它们,因为如果您设置的值与它们期望的或能够处理的值不同,某些配色方案会看起来很奇怪。

解决了这些问题后,我终于设置了配色方案。我的配色方案一直在变。最近我更喜欢一个名为“ One ”的主题,它有浅色和深色两个版本(根据background设置选择)。

最终结果应该看起来像这样(Imgur 上的截图)


这篇文章就到这里。由于篇幅已长,我没有尝试添加更多细节,例如这些插件的功能或它们引入了哪些快捷键。如果您想了解这些细节,或者只是想给我一些意见,请留言,或者通过电子邮件@s/DM告诉我。

最初发布于: https://gaveen.me/2020/02/my-vim-story/

我的更新 vimfiles 可以在以下位置找到:

GitHub 徽标 gaveen / vimfiles

我的 Vimfiles

Vim文件

这是我当前的vimfiles。插件由 管理vim-plug。这些应该适用于 vim/gvim 和 neovim。

这并非旨在作为发行版,因为我可能会根据工作内容进行修改。另外,我几乎只在 Linux 下使用它。不过,非常欢迎您使用我的 vim 文件进行探索。.vimrc为了方便您使用,我已尽量保持文件的良好状态。

 

如何使用

如果您仍想使用这些 vim 文件,可以按照以下方法操作。

首先,您需要克隆这个存储库。 
$ git clone https://github.com/gaveen/vimfiles.git

.vim然后,您可以创建指向该目录和文件的符号链接.vimrc。假设您克隆存储库的位置是~/Apps/vimfiles,您可以执行以下操作: 
$ ln -s ~/Apps/vimfiles/.vim ~/.vim 
$ ln -s ~/Apps/vimfiles/.vimrc ~/.vimrc

最后,启动 vim 并安装插件。(注意: ...

文章来源:https://dev.to/gaveen/my-vim-story-594d
PREV
Netflix 系统设计-后端架构
NEXT
在你的 GitHub 个人资料自述文件中自动显示你最新的 dev.to 帖子