半瓶水折腾Vim记(Portable gVim安装插件管理vim-plug)

对于Vim,我就是半瓶水,或者连半瓶水也算不上,只能算是见过瓶子而已。然后没有把基础打牢固就想取巧东拼西凑的实现功能。

以下是在gVim Portable上面安装插件管理vim-plug,然后安装插件vim-easy-align的过程。

在vim-plug官方页面上并没有介绍如何在portable版本的Vim上安装,然后在Google上搜索这个问题的解决方法,结果只有很少几个结果(比如https://github.com/junegunn/vim-plug/issues/438),而且感觉并没有把问题的原理讲清楚。这种找不到答案的情况一般有两种可能性,第一种可能是因为问题确实很小众,没人注意到也没人研究;第二种就是问题太简单,本就不应该成为一个问题。我初次尝试没有结果之后,隔了一个周末的思考,想着这个插件管理在实现上无非就是根据名称或网站查找,然后下载插件文件,再写入到配置文件里面。这有什么复杂的呢?于是,又结合其他搜索到的主题帖子继续研究。

Installation

Download plug.vim and put it in the "autoload" directory (in normal version, default path is ~/vimfiles/autoload) //对于Portable的GVim,autoload的位置: \util_gVimPortable\App\vim\vim80\autoload\plug.vim,那就简单的把从链接下载好的plug.vim文件放进这个目录中。

Vim

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

You can automate the process by putting the command in your Vim configuration file as suggested here.

Windows (PowerShell)
md ~\vimfiles\autoload
$uri = 'https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
(New-Object Net.WebClient).DownloadFile(
  $uri,
  $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(
    "~\vimfiles\autoload\plug.vim"
  )
)


Usage

Add a vim-plug section to your ~/.vimrc (or stdpath('config') . '/init.vim' for Neovim) //vimrc的位置:\util_gVimPortable\Data\settings\_vimrc

  1. Begin the section with call plug#begin()
  2. List the plugins with Plug commands
  3. call plug#end() to update &runtimepath and initialize plugin system
    • Automatically executes filetype plugin indent on and syntax enable. You can revert the settings after the call. e.g. filetype indent off, syntax off, etc.

Example

" Specify a directory for plugins
" - For Neovim: stdpath('data') . '/plugged'
" - Avoid using standard Vim directory names like 'plugin'
call plug#begin('~/.vim/plugged')

" Make sure you use single quotes

" Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
Plug 'junegunn/vim-easy-align'

" Any valid git URL is allowed
Plug 'https://github.com/junegunn/vim-github-dashboard.git'

" Multiple Plug commands can be written in a single line using | separators
Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'

" On-demand loading
Plug 'scrooloose/nerdtree', { 'on':  'NERDTreeToggle' }
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }

" Using a non-master branch
Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }

" Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
Plug 'fatih/vim-go', { 'tag': '*' }

" Plugin options
Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }

" Plugin outside ~/.vim/plugged with post-update hook
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }

" Unmanaged plugin (manually installed and updated)
Plug '~/my-prototype-plugin'

" Initialize plugin system
call plug#end()


另外,结合了知乎上搜索到的中文指引,教给了我另一个思路,

如果希望安装新插件,首先找到其在github.com的网址,然后将其追加至vimrc配置文件中的call plug#begin()call plug#end()之间,最后执行以下命令安装所有引用的插件:

:PlugInstall

你也可以使用以下命令,指定安装特定的插件:

:PlugInstall gist-vim 

卸载插件

如果希望卸载插件,请先在vimrc配置文件中注释或者删除对应插件的配置信息,然后再执行以下命令:

:PlugClean
更新插件

使用以下命令,可以更新vim-plug插件自身:

:PlugUpgrade

使用以下命令,可以批量更新所有已安装的插件:

:PlugUpdate
插件状态

使用以下命令,可以查看当前已安装插件的状态信息:

:PlugStatus

有两点需要注意的是:
  • Git需要安装,确保在CMD里面输入git然后回车可以正常才能让vim-plug通过git下载更新插件。
  • vim下输入命令 (PlugInstall) 是区分大小写的,如果输入pluginstall是不可以的。

  • //vimrc的位置:\util_gVimPortable\Data\settings\_vimrc

    修改后的_vimrc:
    call plug#begin('~/vimfiles/plugged') 这条指令中括号里的路径就是指定插件下载的目标路径。是根据_vimrc文件的路径的相对路径来确定的,'~/vimfiles/plugged'就是指_vimrc文件当前路径下有一个叫vimfiles的文件夹,再深入一层plugged文件夹,所有的插件就下载到这里。

    安装成功的效果:


    附:
    vim-plug
    相关的命令用法

    Commands

    CommandDescription
    PlugInstall [name ...] [#threads]Install plugins
    PlugUpdate [name ...] [#threads]Install or update plugins
    PlugClean[!]Remove unlisted plugins (bang version will clean without prompt)
    PlugUpgradeUpgrade vim-plug itself
    PlugStatusCheck the status of plugins
    PlugDiffExamine changes from the previous update and the pending changes
    PlugSnapshot[!] [output path]Generate script for restoring the current snapshot of the plugins

    Plug options

    OptionDescription
    branch/tag/commitBranch/tag/commit of the repository to use
    rtpSubdirectory that contains Vim plugin
    dirCustom directory for the plugin
    asUse different name for the plugin
    doPost-update hook (string or funcref)
    onOn-demand loading: Commands or <Plug>-mappings
    forOn-demand loading: File types
    frozenDo not update unless explicitly specified

    Global options

    FlagDefaultDescription
    g:plug_threads16Default number of threads to use
    g:plug_timeout60Time limit of each task in seconds (Ruby & Python)
    g:plug_retries2Number of retries in case of timeout (Ruby & Python)
    g:plug_shallow1Use shallow clone
    g:plug_windowvertical topleft newCommand to open plug window
    g:plug_pwindowabove 12newCommand to open preview window in PlugDiff
    g:plug_url_formathttps://git::@github.com/%s.gitprintf format to build repo URL (Only applies to the subsequent Plug commands)

    Keybindings

    • D - PlugDiff
    • S - PlugStatus
    • R - Retry failed update or installation tasks
    • U - Update plugins in the selected range
    • q - Close the window
    • :PlugStatus
      • L - Load plugin
    • :PlugDiff
      • X - Revert the update

    Example: A small sensible Vim configuration

    call plug#begin()
    Plug 'tpope/vim-sensible'
    call plug#end()

    On-demand loading of plugins

    " NERD tree will be loaded on the first invocation of NERDTreeToggle command
    Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
    
    " Multiple commands
    Plug 'junegunn/vim-github-dashboard', { 'on': ['GHDashboard', 'GHActivity'] }
    
    " Loaded when clojure file is opened
    Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
    
    " Multiple file types
    Plug 'kovisoft/paredit', { 'for': ['clojure', 'scheme'] }
    
    " On-demand loading on both conditions
    Plug 'junegunn/vader.vim',  { 'on': 'Vader', 'for': 'vader' }
    
    " Code to execute when the plugin is lazily loaded on demand
    Plug 'junegunn/goyo.vim', { 'for': 'markdown' }
    autocmd! User goyo.vim echom 'Goyo is now loaded!'

    The for option is generally not needed as most plugins for specific file types usually don't have too much code in the plugin directory. You might want to examine the output of vim --startuptime before applying the option.

    Post-update hooks

    There are some plugins that require extra steps after installation or update. In that case, use the do option to describe the task to be performed.

    Plug 'Shougo/vimproc.vim', { 'do': 'make' }
    Plug 'ycm-core/YouCompleteMe', { 'do': './install.py' }

    If the value starts with :, it will be recognized as a Vim command.

    Plug 'fatih/vim-go', { 'do': ':GoInstallBinaries' }

    If you need more control, you can pass a reference to a Vim function that takes a single argument.

    function! BuildYCM(info)
      " info is a dictionary with 3 fields
      " - name:   name of the plugin
      " - status: 'installed', 'updated', or 'unchanged'
      " - force:  set on PlugInstall! or PlugUpdate!
      if a:info.status == 'installed' || a:info.force
        !./install.py
      endif
    endfunction
    
    Plug 'ycm-core/YouCompleteMe', { 'do': function('BuildYCM') }

    Both forms of post-update hook are executed inside the directory of the plugin and only run when the repository has changed, but you can force it to run unconditionally with the bang-versions of the commands: PlugInstall! and PlugUpdate!.

    Make sure to escape BARs and double-quotes when you write the do option inline as they are mistakenly recognized as command separator or the start of the trailing comment.

    Plug 'junegunn/fzf', { 'do': 'yes \| ./install' }

    But you can avoid the escaping if you extract the inline specification using a variable (or any Vimscript expression) as follows:

    let g:fzf_install = 'yes | ./install'
    Plug 'junegunn/fzf', { 'do': g:fzf_install }

    PlugInstall! and PlugUpdate!

    The installer takes the following steps when installing/updating a plugin:

    1. git clone or git fetch from its origin
    2. Check out branch, tag, or commit and optionally git merge remote branch
    3. If the plugin was updated (or installed for the first time)
      1. Update submodules
      2. Execute post-update hooks

    The commands with the ! suffix ensure that all steps are run unconditionally.

    posted @ 2020-08-11 11:00  柠檬茶多放糖  阅读(1230)  评论(1编辑  收藏  举报