跳至主要內容

1. 简介

安图新大约 7 分钟

1. 简介

原文链接 - Vim 从入门到精通open in new window

什么是 Vim?

Vimopen in new window 是一个历史悠久的文本编辑器,可以追溯到 qedopen in new windowBram Moolenaaropen in new window 于 1991 年发布初始版本。

项目在 Githubopen in new window 上开发,项目讨论请订阅 vim_devopen in new window 邮件列表。

通过阅读 Why, oh WHY, do those #?@! nutheads use vi?open in new window 来对 Vim 进行大致的了解。

Vim 哲学

Vim 采用模式编辑的理念,即它提供了多种模式,按键在不同的模式下作用不同。 你可以在普通模式 下浏览文件,在插入模式下插入文本, 在可视模式下选择行,在命令模式下执行命令等等。起初这听起来可能很复杂, 但是这有一个很大的优点:不需要通过同时按住多个键来完成操作, 大多数时候你只需要依次按下这些按键即可。越常用的操作,所需要的按键数量越少。

和模式编辑紧密相连的概念是 操作符动作操作符 指的是开始某个行为, 例如:修改、删除或者选择文本,之后你要用一个 动作 来指定需要操作的文本区域。 比如,要改变括号内的文本,需要执行 ci( (读做 change inner parentheses); 删除整个段落的内容,需要执行 dap (读做:delete around paragraph)。

如果你能看见 Vim 老司机操作,你会发现他们使用 Vim 脚本语言就如同钢琴师弹钢琴一样。 复杂的操作只需要几个按键就能完成。他们甚至不用刻意去想,因为这已经成为肌肉记忆open in new window了。 这减少认识负荷open in new window并帮助人们专注于实际任务。

入门

Vim 自带一个交互式的教程,内含你需要了解的最基础的信息,你可以通过终端运行以下命令打开教程:

$ vimtutor

不要因为这个看上去很无聊而跳过,按照此教程多练习。你以前用的 IDE 或者其他编辑器很少是有“模式”概念的,因此一开始你会很难适应模式切换。但是你 Vim 使用的越多,肌肉记忆open in new window 将越容易形成。

Vim 基于一个 viopen in new window 克隆,叫做 Stevieopen in new window,支持两种运行模式:"compatible" 和 "nocompatible"。在兼容模式下运行 Vim 意味着使用 vi 的默认设置,而不是 Vim 的默认设置。除非你新建一个用户的 vimrc 或者使用 vim -N 命令启动 Vim,否则就是在兼容模式下运行 Vim!请大家不要在兼容模式下运行 Vim。

下一步

  1. 创建你自己的 vimrc
  2. 在第一周准备备忘录
  3. 通读基础章节了解 Vim 还有哪些功能。
  4. 按需学习!Vim 是学不完的。如果你遇到了问题,先上网寻找解决方案,你的问题可能已经被解决了。Vim 拥有大量的参考文档,知道如何利用这些参考文档很有必要:获取离线帮助
  5. 浏览附加资源

最后一个建议:使用插件之前,请先掌握 Vim 的基本操作。很多插件都只是对 Vim 自带功能的封装。

精简的 vimrc

Vim 启动是会按照一定的优先顺序来搜索配置文件,这个顺序,可以通过 :version 命令查看。下面分 Windows 系统, 和 *niux 系统分别来说明 Vim 是如何载入配置文件的。

Windows 系统

   system vimrc file: "$VIM\vimrc"
     user vimrc file: "$HOME\_vimrc"
 2nd user vimrc file: "$HOME\vimfiles\vimrc"
 3rd user vimrc file: "$VIM\_vimrc"
      user exrc file: "$HOME\_exrc"
  2nd user exrc file: "$VIM\_exrc"
  system gvimrc file: "$VIM\gvimrc"
    user gvimrc file: "$HOME\_gvimrc"
2nd user gvimrc file: "$HOME\vimfiles\gvimrc"
3rd user gvimrc file: "$VIM\_gvimrc"
       defaults file: "$VIMRUNTIME\defaults.vim"
    system menu file: "$VIMRUNTIME\menu.vim"

我们只看上面这一段,Vim 会优先读取 user vimrc file: $HOME\_vimrc, 当这一文件不存在是, Vim 再去寻找 2nd user vimrc file: $HOME\vimfiles\vimrc; 倘若这个文件还是不存在,那么 Vim 会去继续寻找 3rd user vimrc file: $VIM\_vimrc。 了解以上顺序后,就不会再因为 Vim 总是不读取配置文件而感到烦恼了。

Linux 或者 Mac OS

同 Windows 系统类似,也可以使用 :version 命令查看 vim 载入配置的优先顺序。

     系统 vimrc 文件: "/etc/vimrc"
     用户 vimrc 文件: "$HOME/.vimrc"
 第二用户 vimrc 文件: "~/.vim/vimrc"
      用户 exrc 文件: "$HOME/.exrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
         $VIM 预设值: "/etc"
  $VIMRUNTIME 预设值: "/usr/share/vim/vim81"

你可以在网上找到许多精简的 vimrc 配置文件,我的版本可能并不是最简单的版本,但是我的版本提供了一套我认为良好的,非常适合入门的设置。

最终你需要阅读完那些设置,然后自行决定需要使用哪些。😃

精简的 vimrc 如下:

"
" A (not so) minimal vimrc.
"

" You want Vim, not vi. When Vim finds a vimrc, 'nocompatible' is set anyway.
" We set it explicitely to make our position clear!
set nocompatible

filetype plugin indent on  " Load plugins according to detected filetype.
syntax on                  " Enable syntax highlighting.

set autoindent             " Indent according to previous line.
set expandtab              " Use spaces instead of tabs.
set softtabstop =4         " Tab key indents by 4 spaces.
set shiftwidth  =4         " >> indents by 4 spaces.
set shiftround             " >> indents to next multiple of 'shiftwidth'.

set backspace   =indent,eol,start  " Make backspace work as you would expect.
set hidden                 " Switch between buffers without having to save first.
set laststatus  =2         " Always show statusline.
set display     =lastline  " Show as much as possible of the last line.

set showmode               " Show current mode in command-line.
set showcmd                " Show already typed keys when more are expected.

set incsearch              " Highlight while searching with / or ?.
set hlsearch               " Keep matches highlighted.

set ttyfast                " Faster redrawing.
set lazyredraw             " Only redraw when necessary.

set splitbelow             " Open new windows below the current window.
set splitright             " Open new windows right of the current window.

set cursorline             " Find the current line quickly.
set wrapscan               " Searches wrap around end-of-file.
set report      =0         " Always report changed lines.
set synmaxcol   =200       " Only highlight the first 200 columns.

set list                   " Show non-printable characters.
if has('multi_byte') && &encoding ==# 'utf-8'
  let &listchars = 'tab:▸ ,extends:❯,precedes:❮,nbsp:±'
else
  let &listchars = 'tab:> ,extends:>,precedes:<,nbsp:.'
endif

" The fish shell is not very compatible to other shells and unexpectedly
" breaks things that use 'shell'.
if &shell =~# 'fish$'
  set shell=/bin/bash
endif

" Put all temporary files under the same directory.
" https://github.com/mhinz/vim-galore#handling-backup-swap-undo-and-viminfo-files
set backup
set backupdir   =$HOME/.vim/files/backup//
set backupext   =-vimbackup
set backupskip  =
set directory   =$HOME/.vim/files/swap//
set updatecount =100
set undofile
set undodir     =$HOME/.vim/files/undo//
set viminfo     ='100,n$HOME/.vim/files/info/viminfo

如果你有兴趣,这里是原作者的 vimrcopen in new window

建议:大多数插件作者都维护不止一个插件并且将他们的 vimrc 放在 Github 上展示(通常放在叫做 "vim-config" 或者 "dotfiles" 的仓库中),所以当你发现你喜欢的插件时,去插件维护者的 Github 主页看看有没有这样的仓库。

我正在使用什么样的 Vim

使用 :version 命令将向你展示当前正在运行的 Vim 的所有相关信息,包括它是如何编译的。

第一行告诉你这个二进制文件的编译时间和版本号,比如:7.4。接下来的一行呈现 Included patches: 1-1051,这是补丁版本包。因此你 Vim 确切的版本号是 7.4.1051。

另一行显示着一些像 Tiny version without GUI 或者 Huge version with GUI 的信息。很显然这些信息告诉你当前的 Vim 是否支持 GUI,例如:从终端中运行 gvim 或者从终端模拟器中的 Vim 内运行 :gui 命令。另一个重要的信息是 TinyHuge。Vim 的特性集区分被叫做 tinysmallnormalbig and huge,所有的都实现不同的功能子集。

:version 主要的输出内容是特性列表。+clipboard 意味这剪贴板功能被编译支持了,-clipboard 意味着剪贴板特性没有被编译支持。

一些功能特性需要编译支持才能正常工作。例如:为了让 :prof 工作,你需要使用 huge 模式编译的 Vim,因为那种模式启用了 +profile 特性。

如果你的输出情况并不是那样,并且你是从包管理器安装 Vim 的,确保你安装了 vim-xvim-x11vim-gtkvim-gnome 这些包或者相似的,因为这些包通常都是 huge 模式编译的。

你也可以运行下面这段代码来测试 Vim 版本以及功能支持:

" Do something if running at least Vim 7.4.42 with +profile enabled.
if (v:version > 704 || v:version == 704 && has('patch42')) && has('profile')
  " do stuff
endif

相关帮助:

:h :version
:h feature-list
:h +feature-list
:h has-patch

备忘录

为了避免版权问题,我只贴出链接:

来源链接:Vim 从入门到精通open in new window