当前位置: 首页 > news >正文

【Mastering Vim 2_04】第三章:追随最佳实践:插件管理之道

最新版《Mastering Vim》封面,涵盖 Vim 9.0 版特性

【最新版《Mastering Vim》封面,涵盖 Vim 9.0 版特性】

文章目录

  • 第三章 追随最佳实践:插件管理之道
    • 1 插件的管理
    • 2 插件的手动加载
    • 3 packadd 命令的懒加载设置
    • 4 利用 Git 子模块更新插件
    • 5 其他插件管理工具简介
    • 6 插件运行慢的原因剖析
    • 7 Vim 中的不同模式
    • 8 Vim 命令的重新映射
    • 9 Leader 键的使用技巧
    • 10 插件的配置

写在前面
最近有事耽搁了,今天继续更新 Vim 的自学笔记。本篇为第三章核心知识点,主要介绍了 Vim 流行的插件管理方案、插件运行缓慢的性能分析方法以及重新映射快捷键方面的知识,可作为《Vim Masterclass》专栏相关内容的有益补充。

第三章 追随最佳实践:插件管理之道

本章概要

  • vim-plugVundlePathogenVim 原生的 package 包在插件管理中的应用;
  • 剖析插件运行缓慢的方法;
  • Vim 的主要模式(modes);
  • 探究重新映射命令的细节;
  • 引导键及其在各类自定义快捷键中的用途;
  • 插件配置和定制。

本章聚焦 Vim 插件管理,探讨了很多实用的管理技巧。


本章源码:https://github.com/PacktPublishing/Mastering-Vim-Second-Edition/tree/main/Chapter03

1 插件的管理

Vim 插件数量很多,安装到本地后需要统一管理。目前最流行的管理工具首推 vim-plug(https://github.com/junegunn/vim-plug)。

先删除上一章手动安装的所有插件,然后按下列方法操作,利用 vim-plug 工具实现一键安装、统一管理:

# 1. 删除本地手动安装的插件
$ pwd
/root/.vim/pack/plugins/start
$ rm -rf *
# 2. 修改 vimrc 文件
$ vim ~/.vimrc

.vimrc 文件中加入以下内容:

" Manage plugins with vim-plug.
call plug#begin()

Plug 'scrooloose/nerdtree'
Plug 'tpope/vim-vinegar'
Plug 'ctrlpvim/ctrlp.vim'
Plug 'mileszs/ack.vim'
Plug 'easymotion/vim-easymotion'

call plug#end()

然后下载 vim-plug 工具文件:

curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.github.com/junegunn/vim-plug/master/plug.vim

最后打开 Vim,并执行命令 :PlugInsatll + Enter

图 3.1 使用 vim-plug 工具批量安装 Vim 插件实测效果图

【图 3.1 使用 vim-plug 工具批量安装 Vim 插件实测效果图】

注意:

  1. 配置到 Plug 后面的字符串,都是该插件 GitHub 仓库的 <username>/<repository> 部分;
  2. 统一安装::PlugInstall + Enter
  3. 统一更新::PlugUpdate + Enter
  4. 统一删除::PlugClean + Enter
  5. 升级 vim-plug 本身::PlugUpgrade + Enter

此外,还可以针对不同的插件做一些个性化的定制,例如:

" 1. load NERDTree when the :NERDTreeToggle command is called
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
" 2. load goyo only for markdown
Plug 'junegunn/goyo.vim', { 'for': 'markdown' }

更多配置参数,详见其 GitHub 官方文档。

如果需要迁移 vimrc 文件,下列代码可以实现在新设备上自动安装相应的 Vim 插件:

" Download and install vim-plug (Linux, Mac, and Windows).
if empty(glob(
    \ '$HOME/' . (has('win32') ? 'vimfiles' : '.vim') .
      \ '/autoload/plug.vim'))
  execute '!curl -fLo ' .
    \ (has('win32') ? '\%USERPROFILE\%/vimfiles' : '$HOME/.vim') .
    \ '/autoload/plug.vim --create-dirs ' .
    \ 'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
  autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif

2 插件的手动加载

方法:将插件手动安装到 {packpath}/pack/<package_name>/opt/ 路径下,并执行命令 :packadd <plugin_name> 手动激活。

具体详见我的《Vim Masterclass》第 26 篇自学笔记。

3 packadd 命令的懒加载设置

可仿照下列形式在 vimrc 文件中进行懒加载配置:

" Load and run ack.vim plugin on :Ack command.
command! -nargs=* Ack :packadd ack.vim | Ack <f-args>
" Load an run Goyo plugin when opening Markdown files.
autocmd! filetype markdown packadd goyo.vim | Goyo

4 利用 Git 子模块更新插件

NERDTree 插件为例:

# 1. 初始化 Git 仓库
$ cd ~/.vim
$ git init
# 2. 将目标插件作为 Git 子模块引入
$ git submodule add https://github.com/scrooloose/nerdtree.git pack/plugins/start/nerdtree
$ git commit -am "Add NERDTree plugin"

需要更新插件时,执行 Git 命令:

$ git submodule update --recursive
$ git commit -am "Update plugins"

插件的删除使用:

$ git submodule deinit -f -- pack/plugins/start/nerdtree
$ rm -rf .git/modules/pack/plugins/start/nerdtree
$ git rm -f pack/plugins/start/nerdtree

5 其他插件管理工具简介

主要提到两种:

  • Vundlevim-plug 的前身,但没有 vim-plug 轻量。最大的不同在于提供了 :PluginSearch 命令,可在 Vim 中检索并试用需要的插件,但该特性自 2019 年就停止维护了,至今仍未恢复。具体详见 GitHub 仓库;
  • Pathogen:本质是一个 runtimepath 管理工具,不是专门的插件管理器。runtimepathVim 8.0 后式微,新用户已经很少了。具体详见 GitHub 仓库;

6 插件运行慢的原因剖析

Vim 支持性能参数日志记录,可以通过分析日志文件找出运行缓慢的原因。语法格式如下:

$ vim --startuptime startuptime.log
# 或者
$ gvim --startuptime startuptime.log

然后正常操作 Vim 一段时间,关闭后查看日志文件 startuptime.log 即可。

书中以 PythonGitHub 仓库为例,通过 CtrlP 插件给源码库建立索引来模拟影响性能的因素,演示了性能日志的创建及分析过程。

复制 Python 库到本地后,进入该项目目录;然后正常启动 Vim,并执行下列命令:

:profile start profile.log
:profile func *
:profile file *

接着按 Ctrl + P 命令触发 CtrlP 插件创建索引,然后退出 Vim,打开日志文件 profile.log(最后提前开启按缩进折叠 :set foldmethod=indent):

图 3.2 演示 Vim 性能日志及慢插件原因剖析过程

【图 3.2 演示 Vim 性能日志及慢插件原因剖析过程】

G 定位到日志末尾,找到最耗性能的函数:

图 3.3 在日志末尾定位执行缓慢的函数

【图 3.3 在日志末尾定位执行缓慢的函数】

接着全文检索 /32_GlobPath(仅供演示)查看单项性能数据,找到运行缓慢的原因:

图 3.4 定位存疑函数(SNR32_GlobPath)并查看性能参数详情,定位运行慢的具体原因

【图 3.4 定位存疑函数(SNR32_GlobPath)并查看性能参数详情,定位运行慢的具体原因】

7 Vim 中的不同模式

共分析了七大模式——

  1. Normal mode:正常模式;
  2. Command-line | ex mode:命令模式;
  3. Insert mode:插入模式下,使用 Ctrl-o 可以执行某个正常模式下的命令,然后重回插入模式;
  4. Replace | virtual replace mode:替换模式;
  5. Visual | Select mode:可视化模式、选择模式(较少使用);
  6. Terminal mode:终端模式,既可以水平拆分出一个窗口单独执行 shell 命令,也可以通过 :term <shell_command> 的形式在 Vim 内部执行一个 shell 命令;
  7. Operator-pending mode:操作符待令模式,即操作文本对象时指令输入过程中命令尚未触发执行的阶段。

其中,命令行模式的常见操作有:

  • Ctrl-f:调出历史命令列表;
  • Ctrl-p / Ctrl-n:历史命令的上下浏览,与上下方向键等效;
  • Ctrl-b / Ctrl-e:快速定位到命令行的起始、结尾位置;
  • ShiftLeft | RightCtrlLeft | Right:实现在命令行中按单词快速移动;

图 3.5 使用 Ctrl + f 调出历史命令列表

【图 3.5 使用 Ctrl + f 调出历史命令列表】

8 Vim 命令的重新映射

这部分内容可结合本人《Vim Masterclass》专栏 第 39 篇笔记 对照学习。

:map:noremap 的使用。前者可调用自定义的映射设置,后者仅限系统默认的映射设置。

也可以配置到 vimrc 文件:

noremap ; : " Use ; in addition to : to type commands.
noremap <c-u> :w<cr> " Save using <Ctrl-u> (u stands for update).

定制映射时可以限定生效范围:

  • :nmap:nnoremap:仅限正常模式生效;
  • :vmap:vnoremap :仅限可视化模式与选择模式生效;
  • :xmap:xnoremap :仅限可视模式生效;
  • :smap:snoremap :选择 select 选择模式生效;
  • :omap:onoremap :仅限操作符待令模式生效;
  • :map!:noremap! :仅对插入模式和命令行模式生效;
  • :imap:inoremap :仅对插入模式生效;
  • :cmap:cnoremap :仅对命令模式生效;

发散:输入引号时自动带出另一半引号

可通过 inoremap 映射轻松实现引号的成对自动补全(补全后可继续直接输入):

" Immediately add a closing quotes or braces in insert mode.
inoremap ' ''<esc>i
inoremap " ""<esc>i
inoremap ( ()<esc>i
inoremap { {}<esc>i
inoremap [ []<esc>i

9 Leader 键的使用技巧

Leader 键又叫引导键,默认为 \ 键,可通过 mapleader 进行修改:

" Map the leader key to a comma.
let mapleader = ','
" Map the leader key to a spacebar.
let mapleader = "\<space>"

上述定义中,将引导键设为空格键必须按第 4 行的写法来书写:

  • mapleader 不能直接出现特殊字符(如 space);
  • 必须使用双引号,转义符在单引号下无法正常转义;

实用案例:用 Leader 键 + W 自定义 :w + Enter 命令——

" Save a file with leader-w.
noremap <leader>w :w<cr>

再如:用 Leader 键 + N 自定义 :NERDTreeToggle 命令(用于切换 NERDTree 侧边栏的显示与隐藏):

noremap <leader>n :NERDTreeToggle<cr>

这样,每次想要切换 NERDTree 的显示与隐藏,就不用在命令模式输入 :NERDTreeToggle + Enter,直接在正常模式下输入 Space + N 即可,非常方便(假设 Leader 已变更为空格键)。

10 插件的配置

Vim 中的全局变量通常以 g: 为前缀,多用于配置插件的默认设置。例如,CtrlP 插件的默认当前工作路径可以设为当前 Git 项目的根目录:

let g:ctrlp_working_path_mode = 'ra'

这里的 g:ctrlp_working_path_mode 就是一个全局变量,通过 :h ctrlp + Enter 进入插件文档,可以学习更多类似变量。

相关文章:

  • 用PyInstaller构建动态脚本执行器:嵌入式Python解释器与模块打包 - 简明教程
  • 第四天面试题
  • Kafka消息服务之Java工具类
  • 在局域网中连接Grafana数据源
  • 什么是Grok-3?技术特点,场景,潜在问题与挑战
  • 数据结构(第八章 排序算法)
  • 成人床垫更新关于 SOR/2016-183 和《纺织品贴标和广告法规》的合规
  • nginx ngx_http_module(10) 指令详解
  • YOLOv11-ultralytics-8.3.67部分代码阅读笔记-dataset.py
  • Windows编程:在 VS2019 里面,显示行号
  • petalinux高版本设置自动登录和开机自启动配置
  • 敏捷项目管理:适应快速变化的项目环境
  • 武汉小米 Java 岗位一二面校招面经
  • Bazel 教程
  • MyBatis 中 SqlMapConfig 配置文件详解
  • HTML/CSS中交集选择器
  • 前七章综合练习
  • 集合 数据结构 泛型
  • Element UI常用组件
  • 知识库-登陆接口
  • 男子不满和睦家医院手术效果还遇到了“冒牌医生”?院方回应
  • 成都警方通报:8岁男孩落水父母下水施救,父亲遇难
  • 第二期人工智能能力建设研讨班在京开班,近40国和区域组织代表参加
  • 权益类基金发行回暖,这些老将挂帅新基,谁值得买?
  • 巫蛊:文化的历史暗流
  • 国家统计局今年将在全国开展两次人口固定样本跟访调查