Ubuntu 搭建强大的 IDE —— Vim + Vundle + 插件

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/luckydarcy/article/details/76732965
            </div>
                                                <!--一个博主专栏付费入口-->
         
         <!--一个博主专栏付费入口结束-->
        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css"><style class="darkreader darkreader--cors" media="screen">.htmledit_views address,.htmledit_views cite,.htmledit_views dfn,.htmledit_views em,.htmledit_views i,.htmledit_views span[lang],.htmledit_views var{font-style:italic}.htmledit_views{font-family:-apple-system,SF UI Text,Arial,PingFang SC,Hiragino Sans GB,Microsoft YaHei,WenQuanYi Micro Hei,sans-serif,SimHei,SimSun}.cke_editable{margin:24px;word-wrap:break-word}.htmledit_views img.right{border:1px solid #ccc;float:right;margin-left:15px;padding:5px}.htmledit_views img.left{border:1px solid #ccc;float:left;margin-right:15px;padding:5px}.htmledit_views .marker{background-color:#ff0}.htmledit_views figure{text-align:center;margin:0 24px;display:inline-block}.htmledit_views figure>figcaption{text-align:center;margin:8px;color:#999;font-size:14px;display:block}.htmledit_views a>img{padding:1px;margin:1px;border:none;outline:#0782c1 solid 1px}.htmledit_views .code-featured{border:5px solid red}.htmledit_views .math-featured{padding:20px;box-shadow:0 0 2px rgba(200,0,0,1);background-color:rgba(255,0,0,.05);margin:10px}.htmledit_views .image-clean{border:0;background:0 0;padding:0}.htmledit_views .image-clean>figcaption{font-size:.9em;text-align:right}.htmledit_views .image-grayscale{background-color:#fff;color:#666}.htmledit_views .image-grayscale img,.htmledit_views img.image-grayscale{filter:grayscale(100%)}.htmledit_views .embed-240p{max-width:426px;max-height:240px;margin:0 auto}.htmledit_views .embed-360p{max-width:640px;max-height:360px;margin:0 auto}.htmledit_views .embed-480p{max-width:854px;max-height:480px;margin:0 auto}.htmledit_views .embed-720p{max-width:1280px;max-height:720px;margin:0 auto}.htmledit_views .embed-1080p{max-width:1920px;max-height:1080px;margin:0 auto}.htmledit_views p{font-size:16px;color:#4d4d4d;font-weight:400;line-height:26px;margin:0 0 16px;overflow-x:auto}p[align=center]{text-align:center}.htmledit_views img{max-width:100%}.htmledit_views strong,.htmledit_views strong span{font-weight:700}.htmledit_views *{box-sizing:border-box}.htmledit_views h1,.htmledit_views h2,.htmledit_views h3,.htmledit_views h4,.htmledit_views h5,.htmledit_views h6{color:#4f4f4f;margin:8px 0 16px;font-weight:700}.htmledit_views ol,.htmledit_views ul{margin:0 0 24px;padding:0;font-size:16px}.htmledit_views ul ol{margin:0 0 24px 32px}.htmledit_views ul li{list-style-type:disc;margin:8px 0 0 32px}.htmledit_views ol li{list-style-type:decimal;margin-left:40px;margin-top:8px}.htmledit_views h1{font-size:28px;line-height:36px}.htmledit_views h2{font-size:24px;line-height:32px}.htmledit_views h3{font-size:22px;line-height:30px}.htmledit_views h4{font-size:20px;line-height:28px}.htmledit_views h5{font-size:18px;line-height:26px}.htmledit_views h6{font-size:16px;line-height:24px}.htmledit_views blockquote{display:block;padding:16px 16px 0;margin:0 0 24px;border-left:8px solid #dddfe4;background:#eef0f4;overflow:auto;overflow-scrolling:touch;word-wrap:normal;word-break:normal}.htmledit_views blockquote ol,.htmledit_views blockquote ul{margin-bottom:16px;padding:0;font-size:16px;line-height:24px}.htmledit_views blockquote ol li,.htmledit_views blockquote ul li{margin-bottom:0}.htmledit_views blockquote p{font-size:16px;line-height:26px;font-weight:400;margin-bottom:16px;color:#4f4f4f}.htmledit_views hr{margin:24px 0;border:none;border-bottom:solid #ccc 1px}.htmledit_views table tr{border:0;border-top:1px solid #ddd;background-color:#fff}.htmledit_views table{border-collapse:collapse;display:table;width:100%;text-align:left;margin-bottom:24px;margin-left:auto;margin-right:auto}.htmledit_views tbody{border:0}.htmledit_views table tr:nth-child(2n){background-color:#f7f7f7}.htmledit_views table tr td,.htmledit_views table tr th{border:1px solid #ddd;font-size:14px;color:#4f4f4f;line-height:22px;padding:8px;text-align:left}.htmledit_views table tr td p,.htmledit_views table tr th p{font-size:14px;color:#4f4f4f;margin:0;padding:0;text-align:left;line-height:22px}.htmledit_views table tr th p{font-weight:700}.htmledit_views table tr td code,.htmledit_views table tr th code{white-space:normal;word-break:break-word}.htmledit_views table tr th{font-weight:700;background-color:#eff3f5}.htmledit_views dl{margin:24px}.htmledit_views dl dt{margin:8px;font-weight:700}.htmledit_views dl dt dd{margin:8px}.htmledit_views abbr[data-original-title],.htmledit_views abbr[title]{cursor:help;border-bottom:1px dotted #999}.htmledit_views .initialism{font-size:90%;text-transform:uppercase}.htmledit_views pre{white-space:pre-wrap;word-wrap:break-word;margin:0 0 24px;overflow-x:auto;padding:8px}.marker{background-color:#ff0}htmledit_views img.mathcode{margin:0 8px}.htmledit_views kbd,.htmledit_views pre,.htmledit_views samp{font-family:Consolas,Inconsolata,Courier,monospace;font-size:14px;line-height:22px;color:#000}.htmledit_views code ol li div.hljs-ln-code,.htmledit_views code ol li div.hljs-ln-numbers,.htmledit_views pre code,.htmledit_views pre code div,.htmledit_views pre code span{font-family:"Source Code Pro","DejaVu Sans Mono","Ubuntu Mono","Anonymous Pro","Droid Sans Mono",Menlo,Monaco,Consolas,Inconsolata,Courier,monospace,"PingFang SC","Microsoft YaHei",sans-serif}.htmledit_views code{border-radius:4px}.htmledit_views a{color:#4ea1db;text-decoration:none}.htmledit_views a:focus,.htmledit_views a:hover{color:#ca0c16}.htmledit_views a:visited{color:#6795b5}.htmledit_views .footnote{vertical-align:top;position:relative;top:-4px;font-size:12px}.htmledit_views .flow-chart,.htmledit_views .sequence-diagram{text-align:center;margin-bottom:24px;font-size:14px!important}.htmledit_views .flow-chart [fill="#000"],.htmledit_views .flow-chart [fill="#000000"],.htmledit_views .flow-chart [fill=black],.htmledit_views .sequence-diagram [fill="#000"],.htmledit_views .sequence-diagram [fill="#000000"],.htmledit_views .sequence-diagram [fill=black]{fill:#4f4f4f}.htmledit_views .flow-chart [stroke="#000000"],.htmledit_views .sequence-diagram [stroke="#000000"]{stroke:#4f4f4f}.htmledit_views .MathJax_SVG_Display{text-align:center;margin:24px 0;font-size:18px;font-weight:400;color:#4f4f4f;position:relative;text-indent:0;max-width:none;max-height:none;min-width:0;min-height:0;width:100%}.htmledit_views pre code{display:block;line-height:22px;overflow-x:auto;white-space:pre;word-wrap:normal;border-radius:4px;padding:8px}.htmledit_views pre code:not(.hljs){background-color:#f3f4f5}.htmledit_views pre code,.htmledit_views pre code div,.htmledit_views pre code span{font-size:14px}.htmledit_views .prettyprint,.htmledit_views pre.prettyprint{margin:0 0 24px;padding:8px 16px 4px 56px;background-color:#f6f8fa;border:none}.htmledit_views .prettyprint .pre-numbering{position:absolute;width:48px;background-color:#eef0f4;top:0;left:0;margin:0;padding:8px 0;list-style:none;text-align:right}.htmledit_views .pre-numbering li{padding:0 8px;list-style:none;margin:0}.htmledit_views dl dd{margin:0 0 8px 40px}.htmledit_views kbd{padding:2px 8px;border:1px solid rgba(63,63,63,.25);box-shadow:0 1px 0 rgba(63,63,63,.25);background-color:#fff;color:#333;border-radius:4px;display:inline-block;margin:0 2px;white-space:nowrap}.htmledit_views .dp-highlighter{font-size:12px;text-align:left;margin:0 0 24px}.htmledit_views code ol{margin:0;overflow:hidden}.htmledit_views code ol li{list-style-type:none;margin-left:0;margin-top:0;height:22px}.htmledit_views code ol li div.hljs-ln-code{margin-left:8px}.htmledit_views code ol li div.hljs-ln-code,.htmledit_views code ol li div.hljs-ln-numbers{float:left;height:22px}.htmledit_views code ol li div.hljs-ln-numbers{width:24px;border-right:1px solid #c5c5c5}.htmledit_views code ol li div.hljs-ln-numbers .hljs-ln-line{word-wrap:normal}.htmledit_views code ol.hundred li div.hljs-ln-numbers{width:30px}.htmledit_views code ol.thousand li div.hljs-ln-numbers{width:36px}.htmledit_views .csdn-data-video{width:200px}.htmledit_views .csdn-data-video img{margin:0;display:block;width:200px;height:112px}.htmledit_views .csdn-data-video p{margin-top:10px;margin-bottom:0;font-size:14px}.htmledit_views pre[data-from=code-for-outside]{overflow:hidden}.htmledit_views pre[data-from=code-for-outside] code{overflow-x:auto;overflow-y:hidden}.htmledit_views pre[data-from=code-for-outside] code *{overflow:visible;overflow-wrap:break-word}.htmledit_views pre[data-from=code-for-outside] p code{padding:0}</style><style class="darkreader darkreader--sync" media="screen"></style>
                                    <div id="content_views" class="markdown_views">
                <!-- flowchart 箭头图标 勿删 -->
                <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                    <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                </svg>
                                        <p>  本文描述如何在 Ubuntu 环境中利用插件管理工具 Vundle 搭建一个 Vim 开发环境,从而提高在 Linux 下使用 Vim 进行编程的效率。</p>

安装 Vim

  在 Ubuntu 上安装 Vim 很简单,在终端敲入如下命令即可:

$ sudo apt-get install vim
 
 
  • 1

  在 Ubuntu 14.04 以上版本执行上述命令安装的 Vim 是 7.4+ 版本,但如果你和我一样使用 Ubuntu 12.04 的话,就没有那么幸运的。因为在 Ubuntu 12.04 上用 apt-get 安装的 Vim 是 7.3 版本的,这个版本相对来说还是太旧了,一些插件并不支持,比如 YouCompleteMe。所以我们需要将其升级到 7.4 以上的版本,看到有网友说添加 PPA 源之后可以升级,如下:

$ sudo add-apt-repository ppa:fcwu-tw/ppa  
$ sudo apt-get update  
$ sudo apt-get install vim  

 
 
  • 1
  • 2
  • 3
  • 4

  但我试过不行,所以我还是下载 Vim 的源代码进行安装了。我这里直接安装最新的 8.0 版本了,相关的源代码可以在如下网址找到:

下载、编译、安装命令如下:

$ git clone https://github.com/vim/vim.git
$ cd vim/src
$ ./configure --enable-pythoninterp=yes
$ make
$ sudo make installvim
 
 
  • 1
  • 2
  • 3
  • 4
  • 5

  敲入 vim 命令可以看到如下画面:

这里写图片描述

  需要注意的是,这里的 ./configure --enable-pythoninterp=yes 配置是必要的,表示开启 Vim 的 Python2 支持。如果想开启 Python3 支持,则参数应为 --enable-python3interp=yes
  Vim 的默认安装路径是 /usr/local/bin/vim,原来的 Vim 是 /usr/bin/vim,所以 Vim 8.0 和 Vim 7.3 是可以共用的。那为什么输入 vim 执行的是 8.0 版本的而不是 7.3 版本的呢?看看环境变量 PATH 就知道了,因为 /usr/local/bin 的路径在前面嘛!
  

$ echo $PATH
/sbin:/usr/sbin:/usr/lib/lightdm/lightdm:/usr/local/bin:/usr/bin:/bin
 
 
  • 1
  • 2

  所以现在的 vim 执行的是 8.0 版本,而 vi 执行的是 7.3 版本。
  另外,我们可以通过如下命令来检查 vim 是否已经支持 Python。没有执行./configure --enable-pythoninterp=yes 编译的话是这样的:

$ vim --version | grep python
+cryptv          +linebreak       +python          +viminfo
+cscope          +lispindent      -python3         +vreplace
 
 
  • 1
  • 2
  • 3

  而执行./configure --enable-pythoninterp=yes 之后编译的话是这样的:
  

$ vim --version | grep python
+cryptv          +linebreak       +python          +viminfo
+cscope          +lispindent      -python3         +vreplace
Linking: gcc   -L/usr/local/lib -Wl,--as-needed -o vim   -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0   -lSM -lICE -lXt -lX11 -lXdmcp -lSM -lICE  -lm -ltinfo -lnsl   -ldl    -L/usr/lib/python2.7/config -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions
 
 
  • 1
  • 2
  • 3
  • 4

安装 Vundle

  由于 vim 缺乏默认的插件管理器,所有插件的文件都散布在 ~/.vim 下的几个文件夹中,这样导致各种插件的安装、更新、删除都需要自己手动处理,既麻烦费事,又可能出现错误。所以我们需要插件管理器的帮忙,常见的插件管理器有 vundle、pathogen 等等,我们这里使用 vundle。
  Vundle 托管在 Github 上,所以使用 git 下载 vundle ,并将其存放于 ~/.vim/bundle/vundle 即可。使用如下命令直接将源代码检出到该目录:
  

$ git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
 
 
  • 1

  下载完了 vundle 后,还需要配置 .vimrc 文件。
  为了不让 .vimrc 看起来太臃肿,我是新建了一个 ~/.vimrc.bundles 文件来保存所有插件的配置。先在 ~/.vimrc.bundles 文件中包含如下内容:

filetype off
  set rtp+=~/.vim/bundle/vundle/
call vundle#rc()
 
 
  • 1
  • 2
  • 3

  然后在 ~/.vimrc 文件中加入内容:

if filereadable(expand("~/.vimrc.bundles"))
  source ~/.vimrc.bundles
endif
 
 
  • 1
  • 2
  • 3

  这样 vundle 就准备就绪了。

安装插件

  我们需要知道,Bundle 分为三类:

  1. 在 Github vim-scripts 用户下的 repos,只需要写出 repos 名称
  2. 在 Github 其他用户下的 repos,需要写出“用户名/repos名”
  3. 不在 Github 上的插件,需要写出 git 全路径

这里写图片描述

  比较常用就是第二种,也就是以“用户名/repos名”的方式。我们这里将插件的配置信息放在 ~/.vimrc.bundles,如下:

" Define bundles via Github repos "
Bundle 'christoomey/vim-run-interactive'
Bundle 'Valloric/YouCompleteMe'
Bundle 'croaky/vim-colors-github'
Bundle 'danro/rename.vim'
Bundle 'majutsushi/tagbar'
Bundle 'kchmck/vim-coffee-script'
Bundle 'kien/ctrlp.vim'
Bundle 'pbrisbin/vim-mkdir'
Bundle 'scrooloose/syntastic'
Bundle 'slim-template/vim-slim'
Bundle 'thoughtbot/vim-rspec'
Bundle 'tpope/vim-bundler'
Bundle 'tpope/vim-endwise'
Bundle 'tpope/vim-fugitive'
Bundle 'tpope/vim-rails'
Bundle 'tpope/vim-surround'
Bundle 'vim-ruby/vim-ruby'
Bundle 'vim-scripts/ctags.vim'
Bundle 'vim-scripts/matchit.zip'
Bundle 'vim-scripts/tComment'
Bundle 'mattn/emmet-vim'
Bundle 'scrooloose/nerdtree'
Bundle 'Lokaltog/vim-powerline'
Bundle 'godlygeek/tabular'
Bundle 'msanders/snipmate.vim'
Bundle 'jelera/vim-javascript-syntax'
Bundle 'altercation/vim-colors-solarized'
Bundle 'othree/html5.vim'
Bundle 'xsbeats/vim-blade'
Bundle 'Raimondi/delimitMate'
Bundle 'groenewege/vim-less'
Bundle 'evanmiller/nginx-vim-syntax'
Bundle 'Lokaltog/vim-easymotion'
Bundle 'tomasr/molokai'
Bundle 'klen/python-mode'
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

  接着,打开 vim,输入 :BundleInstall 或者直接在终端输入 vim +BundleInstall +qall 安装插件。

这里写图片描述

  有些插件比较大,需要等待一段时间才能下载、安装完毕。

vim 帮助文档

  vimtutor 是一个不错的入门文档,在终端直接输入 vimtutor 即可打开,这个文档在网上可以找到中文版

  另外,在 vim 中输入 :help 也可以查看帮助文档,如果实在看不惯英文,也可以切换成中文的。
  首先执行如下命令下载 vimcdoc-1.8.0.tar.gz:

$ wget  http://nchc.dl.sourceforge.net/sourceforge/vimcdoc/vimcdoc-1.8.0.tar.gz
 
 
  • 1

  然后解压 vimcdoc-1.8.0.tar.gz,进入 vimcdoc-1.8.0 目录可以找到 doc 目录,将 doc 中的全部文件复制到 ~/.vim/doc/ 目录。
  重新进入 vim,输入 :help 可以看到帮助文档变成中文了。
  
  如果无法显示中文,在 ~/.vimrc 中添加:

set helplang=cn
set encoding=utf-8

 
 
  • 1
  • 2
  • 3

出错提示

  如果在安装完插件后启动 vim 出现如下提示,则说明你的 vim 需要升级。

YouCompleteMe unavailable: requires Vim 7.4.1578+.
 
 
  • 1

  如果在安装完插件后启动 vim 出现如下提示,则说明你的 vim 需要重新编译以支持 Python。
  

YouCompleteMe unavailable: requires Vim compiled with Python (2.6+ or 3.3+) support
 
 
  • 1
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet"><style class="darkreader darkreader--cors" media="screen">.prism-atelier-sulphurpool-light .prism .namespace,.prism-atom-one-dark .prism .namespace,.prism-atom-one-light .prism .namespace,.prism-dracula .prism .namespace,.prism-github-gist .prism .namespace,.prism-kimbie-light .prism .namespace,.prism-tomorrow-night .prism .namespace,.prism-tomorrow-night-eighties .prism .namespace,.token.pre.gfm .namespace{opacity:.7}.app--dark .mermaid .loopLine,.app--dark .mermaid .messageLine0,.mermaid .loopLine,.mermaid .messageLine0{marker-end:"url("https://csdnimg.cn/release/phoenix/mdeditor/#arrowhead")"}.markdown_views,.markdown_views blockquote{word-break:break-word!important}.markdown_views pre>code.hljs{background-color:#f6f8fa}.markdown_views .hljs{display:block;padding:8px}.markdown_views .hljs-comment,.markdown_views .hljs-comment *,.markdown_views .hljs-javadoc,.markdown_views .hljs-template_comment{color:#800!important}.markdown_views .clojure .hljs-built_in,.markdown_views .hljs-keyword,.markdown_views .hljs-list .hljs-title,.markdown_views .hljs-request,.markdown_views .hljs-status,.markdown_views .hljs-tag .hljs-title,.markdown_views .hljs-winutils,.markdown_views .http .hljs-title,.markdown_views .method,.markdown_views .nginx .hljs-title,.markdown_views .setting .hljs-value,.markdown_views .tex .hljs-command{color:#008!important}.markdown_views .hljs-envvar{color:#660!important}.markdown_views .hljs-attr_selector,.markdown_views .hljs-cdata,.markdown_views .hljs-date,.markdown_views .hljs-filter .hljs-argument,.markdown_views .hljs-regexp{color:#080!important}.markdown_views .clojure .hljs-attribute,.markdown_views .css .hljs-function,.markdown_views .css .hljs-value .hljs-number,.markdown_views .hljs-decorator,.markdown_views .hljs-hexcolor,.markdown_views .hljs-literal,.markdown_views .hljs-number,.markdown_views .hljs-pi,.markdown_views .hljs-prompt,.markdown_views .hljs-shebang,.markdown_views .hljs-sub .hljs-identifier,.markdown_views .hljs-symbol,.markdown_views .hljs-tag,.markdown_views .hljs-tag .hljs-keyword,.markdown_views .ini .hljs-title{color:#066!important}.markdown_views .clojure .hljs-title,.markdown_views .haskell .hljs-type,.markdown_views .hljs-built_in,.markdown_views .hljs-class .hljs-id,.markdown_views .hljs-class .hljs-title,.markdown_views .hljs-doctype,.markdown_views .hljs-javadoctag,.markdown_views .hljs-params,.markdown_views .hljs-phpdoc,.markdown_views .hljs-tag .hljs-attribute,.markdown_views .hljs-typename,.markdown_views .hljs-variable,.markdown_views .hljs-yardoctag,.markdown_views .setting{color:#4f4f4f!important}.markdown_views .css .hljs-tag,.markdown_views .hljs-pseudo,.markdown_views .hljs-rules .hljs-property{color:#000!important}.markdown_views .css .hljs-class,.markdown_views .css .hljs-id{color:#9b703f!important}.markdown_views .hljs-value .hljs-important{color:#f70!important;font-weight:700}.markdown_views .hljs-rules .hljs-keyword{color:#c5af75!important}.markdown_views .apache .hljs-sqbracket,.markdown_views .hljs-annotation,.markdown_views .nginx .hljs-built_in{color:#9b859d!important}.markdown_views .tex .hljs-formula{background-color:#eee!important;font-style:italic}.markdown_views .diff .hljs-header,.markdown_views .hljs-chunk{color:grey!important;font-weight:700}.markdown_views .diff .hljs-change{background-color:#bccff9!important}.markdown_views .hljs-addition{background-color:#baeeba!important}.markdown_views .hljs-deletion{background-color:#ffc8bd!important}.markdown_views .hljs-comment .hljs-yardoctag{font-weight:700}.markdown_views .apache .hljs-cbracket,.markdown_views .apache .hljs-tag,.markdown_views .asciidoc .hljs-header,.markdown_views .bash .hljs-variable,.markdown_views .coffeescript .hljs-attribute,.markdown_views .django .hljs-variable,.markdown_views .erlang_repl .hljs-function_or_atom,.markdown_views .haml .hljs-symbol,.markdown_views .hljs-addition,.markdown_views .hljs-aggregate,.markdown_views .hljs-constant,.markdown_views .hljs-flow,.markdown_views .hljs-parent,.markdown_views .hljs-pragma,.markdown_views .hljs-preprocessor,.markdown_views .hljs-preprocessor *,.markdown_views .hljs-rules .hljs-value,.markdown_views .hljs-rules .hljs-value .hljs-number,.markdown_views .hljs-stream,.markdown_views .hljs-string,.markdown_views .hljs-tag .hljs-value,.markdown_views .hljs-template_tag,.markdown_views .hljs-title,.markdown_views .markdown .hljs-header,.markdown_views .ruby .hljs-symbol,.markdown_views .ruby .hljs-symbol .hljs-string,.markdown_views .smalltalk .hljs-class,.markdown_views .tex .hljs-command,.markdown_views .tex .hljs-special{color:#090!important}.markdown_views .clojure .hljs-built_in,.markdown_views .hljs,.markdown_views .hljs-subst,.markdown_views .hljs-tag .hljs-title,.markdown_views .lisp .hljs-title,.markdown_views .nginx .hljs-title{color:#4f4f4f!important}.markdown_views .apache .hljs-cbracket,.markdown_views .apache .hljs-tag,.markdown_views .asciidoc .hljs-header,.markdown_views .bash .hljs-variable,.markdown_views .coffeescript .hljs-attribute,.markdown_views .django .hljs-variable,.markdown_views .erlang_repl .hljs-function_or_atom,.markdown_views .haml .hljs-symbol,.markdown_views .hljs-addition,.markdown_views .hljs-aggregate,.markdown_views .hljs-constant,.markdown_views .hljs-flow,.markdown_views .hljs-parent,.markdown_views .hljs-pragma,.markdown_views .hljs-preprocessor,.markdown_views .hljs-rules .hljs-value,.markdown_views .hljs-rules .hljs-value .hljs-number,.markdown_views .hljs-stream,.markdown_views .hljs-string,.markdown_views .hljs-tag .hljs-value,.markdown_views .hljs-template_tag,.markdown_views .hljs-title,.markdown_views .markdown .hljs-header,.markdown_views .ruby .hljs-symbol,.markdown_views .ruby .hljs-symbol .hljs-string,.markdown_views .smalltalk .hljs-class,.markdown_views .tex .hljs-command,.markdown_views .tex .hljs-special{color:#090!important}.markdown_views .flow-chart [fill="#000"],.markdown_views .flow-chart [fill="#000000"],.markdown_views .flow-chart [fill=black],.markdown_views .sequence-diagram [fill="#000"],.markdown_views .sequence-diagram [fill="#000000"],.markdown_views .sequence-diagram [fill=black]{fill:#4f4f4f}.markdown_views pre code{display:block;font-size:14px;line-height:22px;overflow-x:auto;padding:0!important;white-space:pre;word-wrap:normal;background-color:#f6f8fa;border-radius:4px}@media screen and (-webkit-min-device-pixel-ratio:0){.markdown_views pre code{min-width:94%}}.markdown_views .prettyprint,.markdown_views pre.prettyprint{margin:0 0 24px;padding:8px 16px 6px 56px;background-color:#f6f8fa;border:none}.prettyprint{position:relative;overflow-y:hidden;overflow-x:auto}.markdown_views .prettyprint .pre-numbering{position:absolute;width:48px;background-color:#eef0f4;top:0;left:0;margin:0;padding:8px 0;list-style:none;text-align:right}.markdown_views .pre-numbering li{padding:0 8px;list-style:none;margin:0}.markdown_views.prism-atom-one-dark pre code{background-color:#282c34;color:#abb2bf}.markdown_views.prism-atom-one-dark pre code.hljs *{color:#abb2bf}.markdown_views.prism-atom-one-dark .prettyprint,.markdown_views.prism-atom-one-dark .prettyprint .pre-numbering,.markdown_views.prism-atom-one-dark pre.prettyprint{background-color:#282c34}.markdown_views.prism-atom-one-dark .pre-numbering li{color:#abb2bf!important;border-right:1px solid #c5c5c5}.markdown_views.prism-atom-one-light .prettyprint,.markdown_views.prism-atom-one-light .prettyprint .pre-numbering,.markdown_views.prism-atom-one-light pre code,.markdown_views.prism-atom-one-light pre.prettyprint{background-color:#fafafa}.markdown_views.prism-atom-one-light .pre-numbering li{color:#383a42!important;border-right:1px solid #c5c5c5}.markdown_views.prism-tomorrow-night pre code{background-color:#1d1f21;color:#c5c8c6}.markdown_views.prism-tomorrow-night pre code.hljs *{color:#c5c8c6}.markdown_views.prism-tomorrow-night .prettyprint,.markdown_views.prism-tomorrow-night .prettyprint .pre-numbering,.markdown_views.prism-tomorrow-night pre.prettyprint{background-color:#1d1f21}.markdown_views.prism-tomorrow-night .pre-numbering li{color:#c5c8c6!important;border-right:1px solid #c5c5c5}.markdown_views.prism-dracula pre code{background-color:#282a36;color:#f8f8f2}.markdown_views.prism-dracula pre code.hljs *{color:#f8f8f2}.markdown_views.prism-dracula .prettyprint,.markdown_views.prism-dracula .prettyprint .pre-numbering,.markdown_views.prism-dracula pre.prettyprint{background-color:#282a36}.markdown_views.prism-dracula .pre-numbering li{color:#f8f8f2!important;border-right:1px solid #c5c5c5}.markdown_views.prism-github-gist .prettyprint,.markdown_views.prism-github-gist .prettyprint .pre-numbering,.markdown_views.prism-github-gist pre code,.markdown_views.prism-github-gist pre.prettyprint{background-color:#f3f4f5}.markdown_views.prism-github-gist .pre-numbering li{color:#5e6687!important;border-right:1px solid #c5c5c5}.markdown_views.prism-kimbie-light .prettyprint,.markdown_views.prism-kimbie-light .prettyprint .pre-numbering,.markdown_views.prism-kimbie-light pre code,.markdown_views.prism-kimbie-light pre.prettyprint{background-color:#fbebd4}.markdown_views.prism-kimbie-light .pre-numbering li{color:#84613d!important;border-right:1px solid #c5c5c5}.markdown_views.prism-tomorrow-night-eighties pre code{background-color:#2d2d2d;color:#ccc}.markdown_views.prism-tomorrow-night-eighties pre code.hljs *{color:#ccc}.markdown_views.prism-tomorrow-night-eighties .prettyprint,.markdown_views.prism-tomorrow-night-eighties .prettyprint .pre-numbering,.markdown_views.prism-tomorrow-night-eighties pre.prettyprint{background-color:#2d2d2d}.markdown_views.prism-tomorrow-night-eighties .pre-numbering li{color:#ccc!important;border-right:1px solid #c5c5c5}.markdown_views.prism-atelier-sulphurpool-light .prettyprint,.markdown_views.prism-atelier-sulphurpool-light .prettyprint .pre-numbering,.markdown_views.prism-atelier-sulphurpool-light pre code,.markdown_views.prism-atelier-sulphurpool-light pre.prettyprint{background-color:#f5f7ff}.markdown_views.prism-atelier-sulphurpool-light .pre-numbering li{color:#5e6687!important;border-right:1px solid #c5c5c5}.markdown_views .prism .token.comment{font-family:'Source Code Pro','DejaVu Sans Mono','Ubuntu Mono','Anonymous Pro','Droid Sans Mono',Menlo,Monaco,Consolas,Inconsolata,Courier,'PingFang SC','Microsoft YaHei',sans-serif!important}.katex{font:400 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex .mathit,.katex .textit{font-style:italic}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:"0.10.2"}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathdefault{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .clap>.fix,.katex .fontsize-ensurer,.katex .hdashline,.katex .llap>.fix,.katex .mfrac .frac-line,.katex .mspace,.katex .nulldelimiter,.katex .rlap>.fix,.katex .rule,.katex .sizing{display:inline-block}progress,sub,sup{vertical-align:baseline}.katex .msupsub{text-align:left}.katex .accent>.vlist-t,.katex .mfrac>span>span,.katex .mtable .col-align-c>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .mfrac .frac-line{width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .accent .accent-body,.katex .delimcenter,.katex .op-symbol,.katex .rule{position:relative}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{width:.12em}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;margin:0 -.025em;border-right:.05em solid;min-width:1px}.katex .mtable .vs-dashed{border-right:.05em dashed}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex .mover,.katex .munder,.katex .x-arrow,.katex-display{text-align:center}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .brace-center,.katex .brace-left,.katex .brace-right,.katex .halfarrow-left,.katex .halfarrow-right{position:absolute;overflow:hidden}.katex .halfarrow-left{left:0;width:50.2%}.katex .halfarrow-right{right:0;width:50.2%}.katex .brace-left{left:0;width:25.1%}.katex .brace-center{left:25%;width:50%}.katex .brace-right{right:0;width:25.1%}button,hr,input{overflow:visible}.katex .x-arrow-pad{padding:0 .5em}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left}span.katex,span.katex *{font-family:KaTeX_Main,Times New Roman,serif}.token.pre.gfm *{font-weight:inherit!important;font-family:Source Code Pro,DejaVu Sans Mono,Ubuntu Mono,Anonymous Pro,Droid Sans Mono,Menlo,Monaco,Consolas,Inconsolata,Courier,monospace,PingFang SC,Microsoft YaHei,sans-serif}.token.pre.gfm .token.cdata,.token.pre.gfm .token.comment,.token.pre.gfm .token.doctype,.token.pre.gfm .token.prolog{color:#708090}.token.pre.gfm .token.punctuation{color:#999}.token.pre.gfm .token.boolean,.token.pre.gfm .token.constant,.token.pre.gfm .token.deleted,.token.pre.gfm .token.number,.token.pre.gfm .token.property,.token.pre.gfm .token.symbol,.token.pre.gfm .token.tag{color:#905}.token.pre.gfm .token.attr-name,.token.pre.gfm .token.builtin,.token.pre.gfm .token.char,.token.pre.gfm .token.inserted,.token.pre.gfm .token.selector,.token.pre.gfm .token.string{color:#690}.token.pre.gfm .language-css .token.string,.token.pre.gfm .style .token.string,.token.pre.gfm .token.entity,.token.pre.gfm .token.operator,.token.pre.gfm .token.url{color:#a67f59}.token.pre.gfm .token.atrule,.token.pre.gfm .token.attr-value,.token.pre.gfm .token.keyword{color:#07a}.token.pre.gfm .token.function{color:#dd4a68}.token.pre.gfm .token.important,.token.pre.gfm .token.regex,.token.pre.gfm .token.variable{color:#e90}.token.pre.gfm .token.bold,.token.pre.gfm .token.important{font-weight:500}.token.pre.gfm .token.italic{font-style:italic}.prism-atom-one-light .prism *{font:400 14px Source Code Pro,DejaVu Sans Mono,Ubuntu Mono,Anonymous Pro,Droid Sans Mono,Menlo,Monaco,Consolas,Inconsolata,Courier,monospace,PingFang SC,Microsoft YaHei,sans-serif!important}.prism-atom-one-light .prism .token.cdata,.prism-atom-one-light .prism .token.comment,.prism-atom-one-light .prism .token.prolog{color:#708090}.prism-atom-one-light .prism .token.doctype{color:#4078f2}.prism-atom-one-light .prism .token.comment{font-style:italic!important}.prism-atom-one-light .prism .token.punctuation{color:#999}.prism-atom-one-light .prism .token.constant,.prism-atom-one-light .prism .token.deleted,.prism-atom-one-light .prism .token.number,.prism-atom-one-light .prism .token.property,.prism-atom-one-light .prism .token.regex,.prism-atom-one-light .prism .token.symbol{color:#986801}.prism-atom-one-light .prism .token.boolean{color:#0184bb}.prism-atom-one-light .prism .token.tag{color:#e45649}.prism-atom-one-light .prism .token.attr-value,.prism-atom-one-light .prism .token.builtin,.prism-atom-one-light .prism .token.char,.prism-atom-one-light .prism .token.inserted,.prism-atom-one-light .prism .token.selector,.prism-atom-one-light .prism .token.string{color:#50a14f}.prism-atom-one-light .prism .token.attr-name{color:#986801}.prism-atom-one-light .prism .language-css .token.string,.prism-atom-one-light .prism .style .token.string,.prism-atom-one-light .prism .token.entity,.prism-atom-one-light .prism .token.operator,.prism-atom-one-light .prism .token.url{color:#a67f59}.prism-atom-one-light .prism .token.atrule,.prism-atom-one-light .prism .token.keyword{color:#07a}.prism-atom-one-light .prism .token.function{color:#dd4a68}.prism-atom-one-light .prism .token.important,.prism-atom-one-light .prism .token.variable{color:#e90}.prism-atom-one-light .prism .token.bold,.prism-atom-one-light .prism .token.important{font-weight:500}.prism-atom-one-light .prism .token.italic{font-style:italic}.prism-atom-one-dark .prism{color:#abb2bf;background:#282c34}.prism-atom-one-dark .prism *{font:400 14px Source Code Pro,DejaVu Sans Mono,Ubuntu Mono,Anonymous Pro,Droid Sans Mono,Menlo,Monaco,Consolas,Inconsolata,Courier,monospace,PingFang SC,Microsoft YaHei,sans-serif!important}.prism-atom-one-dark .prism .token.cdata,.prism-atom-one-dark .prism .token.comment,.prism-atom-one-dark .prism .token.prolog{color:#5c6370}.prism-atom-one-dark .prism .token.doctype{color:#61aeee}.prism-atom-one-dark .prism .token.comment{font-style:italic!important}.prism-atom-one-dark .prism .token.punctuation{color:#999}.prism-atom-one-dark .prism .token.constant,.prism-atom-one-dark .prism .token.deleted,.prism-atom-one-dark .prism .token.number,.prism-atom-one-dark .prism .token.property,.prism-atom-one-dark .prism .token.regex,.prism-atom-one-dark .prism .token.symbol{color:#98c379}.prism-atom-one-dark .prism .token.boolean{color:#56b6c2}.prism-atom-one-dark .prism .token.tag{color:#e06c75}.prism-atom-one-dark .prism .token.attr-value,.prism-atom-one-dark .prism .token.builtin,.prism-atom-one-dark .prism .token.char,.prism-atom-one-dark .prism .token.inserted,.prism-atom-one-dark .prism .token.selector,.prism-atom-one-dark .prism .token.string{color:#690}.prism-atom-one-dark .prism .token.attr-name{color:#d19a66}.prism-atom-one-dark .prism .language-css .token.string,.prism-atom-one-dark .prism .style .token.string,.prism-atom-one-dark .prism .token.entity,.prism-atom-one-dark .prism .token.operator,.prism-atom-one-dark .prism .token.url{color:#690}.prism-atom-one-dark .prism .token.atrule,.prism-atom-one-dark .prism .token.keyword{color:#c678dd}.prism-atom-one-dark .prism .token.function{color:#61aeee}.prism-atom-one-dark .prism .token.important,.prism-atom-one-dark .prism .token.variable{color:#e90}.prism-atom-one-dark .prism .token.bold,.prism-atom-one-dark .prism .token.important{font-weight:500}.prism-atom-one-dark .prism .token.italic{font-style:italic}.prism-atom-one-dark .prism .tocken.class-name{color:#e6c07b}.prism-tomorrow-night .prism{background:#1d1f21;color:#c5c8c6}.prism-tomorrow-night .prism *{font:400 14px Source Code Pro,DejaVu Sans Mono,Ubuntu Mono,Anonymous Pro,Droid Sans Mono,Menlo,Monaco,Consolas,Inconsolata,Courier,monospace,PingFang SC,Microsoft YaHei,sans-serif!important}.prism-tomorrow-night .prism .token.cdata,.prism-tomorrow-night .prism .token.comment,.prism-tomorrow-night .prism .token.prolog{color:#969896}.prism-tomorrow-night .prism .token.doctype{color:#de935f}.prism-tomorrow-night .prism .token.comment{font-style:italic!important}.prism-tomorrow-night .prism .token.punctuation{color:#999}.prism-tomorrow-night .prism .token.constant,.prism-tomorrow-night .prism .token.deleted,.prism-tomorrow-night .prism .token.number,.prism-tomorrow-night .prism .token.property,.prism-tomorrow-night .prism .token.regex,.prism-tomorrow-night .prism .token.symbol{color:#b5bd68}.prism-tomorrow-night .prism .token.boolean{color:#de935f}.prism-tomorrow-night .prism .token.tag{color:#c66}.prism-tomorrow-night .prism .token.attr-value,.prism-tomorrow-night .prism .token.builtin,.prism-tomorrow-night .prism .token.char,.prism-tomorrow-night .prism .token.inserted,.prism-tomorrow-night .prism .token.selector,.prism-tomorrow-night .prism .token.string{color:#b5bd68}.prism-tomorrow-night .prism .token.attr-name{color:#c66}.prism-tomorrow-night .prism .language-css .token.string,.prism-tomorrow-night .prism .style .token.string,.prism-tomorrow-night .prism .token.entity,.prism-tomorrow-night .prism .token.operator,.prism-tomorrow-night .prism .token.url{color:#a67f59}.prism-tomorrow-night .prism .token.atrule,.prism-tomorrow-night .prism .token.keyword{color:#b294bb}.prism-tomorrow-night .prism .token.function{color:#81a2be}.prism-tomorrow-night .prism .token.important,.prism-tomorrow-night .prism .token.variable{color:#c66}.prism-tomorrow-night .prism .token.bold,.prism-tomorrow-night .prism .token.important{font-weight:500}.prism-tomorrow-night .prism .token.italic{font-style:italic}.prism-dracula .prism{color:#f8f8f2;background:#282a36}.prism-dracula .prism *{font:400 14px Source Code Pro,DejaVu Sans Mono,Ubuntu Mono,Anonymous Pro,Droid Sans Mono,Menlo,Monaco,Consolas,Inconsolata,Courier,monospace,PingFang SC,Microsoft YaHei,sans-serif!important}.prism-dracula .prism .token.cdata,.prism-dracula .prism .token.comment,.prism-dracula .prism .token.prolog{color:#6272a4}.prism-dracula .prism .token.doctype{color:#f1fa8c}.prism-dracula .prism .token.comment{font-style:italic!important}.prism-dracula .prism .token.punctuation{color:#999}.prism-dracula .prism .token.constant,.prism-dracula .prism .token.deleted,.prism-dracula .prism .token.number,.prism-dracula .prism .token.property,.prism-dracula .prism .token.regex,.prism-dracula .prism .token.symbol{color:#f1fa8c}.prism-dracula .prism .token.boolean{color:#8be9fd}.prism-dracula .prism .token.attr-value,.prism-dracula .prism .token.builtin,.prism-dracula .prism .token.char,.prism-dracula .prism .token.inserted,.prism-dracula .prism .token.selector,.prism-dracula .prism .token.string,.prism-dracula .prism .token.tag{color:#f1fa8c}.prism-dracula .prism .token.attr-name{color:#8be9fd}.prism-dracula .prism .language-css .token.string,.prism-dracula .prism .style .token.string,.prism-dracula .prism .token.entity,.prism-dracula .prism .token.url{color:#f1fa8c}.prism-dracula .prism .token.operator{color:#6272a4}.prism-dracula .prism .token.atrule,.prism-dracula .prism .token.keyword{color:#ff79c6}.prism-dracula .prism .token.function{color:#8be9fd}.prism-dracula .prism .token.important,.prism-dracula .prism .token.variable{color:#e90}.prism-dracula .prism .token.bold,.prism-dracula .prism .token.important{font-weight:500}.prism-dracula .prism .token.italic{font-style:italic}.prism-dracula .prism .tocken.class-name{color:#e6c07b}.prism-atelier-sulphurpool-light .prism{color:#5e6687;background:#f5f7ff}.prism-atelier-sulphurpool-light .prism *{font:400 14px Source Code Pro,DejaVu Sans Mono,Ubuntu Mono,Anonymous Pro,Droid Sans Mono,Menlo,Monaco,Consolas,Inconsolata,Courier,monospace,PingFang SC,Microsoft YaHei,sans-serif!important}.prism-atelier-sulphurpool-light .prism .token.cdata,.prism-atelier-sulphurpool-light .prism .token.comment,.prism-atelier-sulphurpool-light .prism .token.prolog{color:#6b7394}.prism-atelier-sulphurpool-light .prism .token.doctype{color:#3d8fd1}.prism-atelier-sulphurpool-light .prism .token.comment{font-style:italic!important}.prism-atelier-sulphurpool-light .prism .token.punctuation{color:#999}.prism-atelier-sulphurpool-light .prism .token.constant,.prism-atelier-sulphurpool-light .prism .token.deleted,.prism-atelier-sulphurpool-light .prism .token.number,.prism-atelier-sulphurpool-light .prism .token.property,.prism-atelier-sulphurpool-light .prism .token.regex,.prism-atelier-sulphurpool-light .prism .token.symbol{color:#ac9739}.prism-atelier-sulphurpool-light .prism .token.boolean{color:#c76b29}.prism-atelier-sulphurpool-light .prism .token.tag{color:#c94922}.prism-atelier-sulphurpool-light .prism .token.attr-value,.prism-atelier-sulphurpool-light .prism .token.builtin,.prism-atelier-sulphurpool-light .prism .token.char,.prism-atelier-sulphurpool-light .prism .token.inserted,.prism-atelier-sulphurpool-light .prism .token.selector,.prism-atelier-sulphurpool-light .prism .token.string{color:#ac9739}.prism-atelier-sulphurpool-light .prism .token.attr-name{color:#c94922}.prism-atelier-sulphurpool-light .prism .language-css .token.string,.prism-atelier-sulphurpool-light .prism .style .token.string,.prism-atelier-sulphurpool-light .prism .token.entity,.prism-atelier-sulphurpool-light .prism .token.operator,.prism-atelier-sulphurpool-light .prism .token.url{color:#ac9739}.prism-atelier-sulphurpool-light .prism .token.atrule,.prism-atelier-sulphurpool-light .prism .token.keyword{color:#6679cc}.prism-atelier-sulphurpool-light .prism .token.function{color:#3d8fd1}.prism-atelier-sulphurpool-light .prism .token.important,.prism-atelier-sulphurpool-light .prism .token.variable{color:#e90}.prism-atelier-sulphurpool-light .prism .token.bold,.prism-atelier-sulphurpool-light .prism .token.important{font-weight:500}.prism-atelier-sulphurpool-light .prism .token.italic{font-style:italic}.prism-atelier-sulphurpool-light .prism .tocken.class-name{color:#e6c07b}.prism-github-gist .prism{color:#5e6687;background:#fff}.prism-github-gist .prism *{font:400 14px Source Code Pro,DejaVu Sans Mono,Ubuntu Mono,Anonymous Pro,Droid Sans Mono,Menlo,Monaco,Consolas,Inconsolata,Courier,monospace,PingFang SC,Microsoft YaHei,sans-serif!important}.prism-github-gist .prism .token.cdata,.prism-github-gist .prism .token.comment,.prism-github-gist .prism .token.prolog{color:#969896}.prism-github-gist .prism .token.doctype{color:#795da3}.prism-github-gist .prism .token.comment{font-style:italic!important}.prism-github-gist .prism .token.punctuation{color:#969896}.prism-github-gist .prism .token.constant,.prism-github-gist .prism .token.deleted,.prism-github-gist .prism .token.property,.prism-github-gist .prism .token.regex,.prism-github-gist .prism .token.symbol{color:#0086b3}.prism-github-gist .prism .token.number{color:#c76b29}.prism-github-gist .prism .token.boolean{color:#0086b3}.prism-github-gist .prism .token.tag{color:#63a35c}.prism-github-gist .prism .token.attr-value,.prism-github-gist .prism .token.builtin,.prism-github-gist .prism .token.char,.prism-github-gist .prism .token.inserted,.prism-github-gist .prism .token.selector,.prism-github-gist .prism .token.string{color:#df5000}.prism-github-gist .prism .token.attr-name{color:#795da3}.prism-github-gist .prism .language-css .token.string,.prism-github-gist .prism .style .token.string,.prism-github-gist .prism .token.entity,.prism-github-gist .prism .token.operator,.prism-github-gist .prism .token.url{color:#df5000}.prism-github-gist .prism .token.atrule,.prism-github-gist .prism .token.keyword{color:#a71d5d}.prism-github-gist .prism .token.function{color:#795da3}.prism-github-gist .prism .token.important,.prism-github-gist .prism .token.variable{color:#df5000}.prism-github-gist .prism .token.bold,.prism-github-gist .prism .token.important{font-weight:500}.prism-github-gist .prism .token.italic{font-style:italic}.prism-github-gist .prism .tocken.class-name{color:#e6c07b}.prism-kimbie-light .prism{color:#84613d;background:#fbebd4}.prism-kimbie-light .prism *{font:400 14px Source Code Pro,DejaVu Sans Mono,Ubuntu Mono,Anonymous Pro,Droid Sans Mono,Menlo,Monaco,Consolas,Inconsolata,Courier,monospace,PingFang SC,Microsoft YaHei,sans-serif!important}.prism-kimbie-light .prism .token.cdata,.prism-kimbie-light .prism .token.comment,.prism-kimbie-light .prism .token.prolog{color:#a57a4c}.prism-kimbie-light .prism .token.doctype{color:#f06431}.prism-kimbie-light .prism .token.comment{font-style:italic!important}.prism-kimbie-light .prism .token.punctuation{color:#999}.prism-kimbie-light .prism .token.constant,.prism-kimbie-light .prism .token.deleted,.prism-kimbie-light .prism .token.number,.prism-kimbie-light .prism .token.property,.prism-kimbie-light .prism .token.regex,.prism-kimbie-light .prism .token.symbol{color:#889b4a}.prism-kimbie-light .prism .token.boolean{color:#f79a32}.prism-kimbie-light .prism .token.tag{color:#dc3958}.prism-kimbie-light .prism .token.attr-value,.prism-kimbie-light .prism .token.builtin,.prism-kimbie-light .prism .token.char,.prism-kimbie-light .prism .token.inserted,.prism-kimbie-light .prism .token.selector,.prism-kimbie-light .prism .token.string{color:#889b4a}.prism-kimbie-light .prism .token.attr-name{color:#f06431}.prism-kimbie-light .prism .language-css .token.string,.prism-kimbie-light .prism .style .token.string,.prism-kimbie-light .prism .token.entity,.prism-kimbie-light .prism .token.operator,.prism-kimbie-light .prism .token.url{color:#889b4a}.prism-kimbie-light .prism .token.atrule,.prism-kimbie-light .prism .token.function,.prism-kimbie-light .prism .token.keyword{color:#98676a}.prism-kimbie-light .prism .token.important,.prism-kimbie-light .prism .token.variable{color:#e90}.prism-kimbie-light .prism .token.bold,.prism-kimbie-light .prism .token.important{font-weight:500}.prism-kimbie-light .prism .token.italic{font-style:italic}.prism-kimbie-light .prism .token.class-name{color:#f06431}.prism-tomorrow-night-eighties .prism{color:#ccc;background:#2d2d2d}.prism-tomorrow-night-eighties .prism *{font:400 14px Source Code Pro,DejaVu Sans Mono,Ubuntu Mono,Anonymous Pro,Droid Sans Mono,Menlo,Monaco,Consolas,Inconsolata,Courier,monospace,PingFang SC,Microsoft YaHei,sans-serif!important}.prism-tomorrow-night-eighties .prism .token.cdata,.prism-tomorrow-night-eighties .prism .token.comment,.prism-tomorrow-night-eighties .prism .token.prolog{color:#999}.prism-tomorrow-night-eighties .prism .token.doctype{color:#f99157}.prism-tomorrow-night-eighties .prism .token.comment{font-style:italic!important}.prism-tomorrow-night-eighties .prism .token.italic,dfn{font-style:italic}.prism-tomorrow-night-eighties .prism .token.punctuation{color:#999}.prism-tomorrow-night-eighties .prism .token.boolean,.prism-tomorrow-night-eighties .prism .token.constant,.prism-tomorrow-night-eighties .prism .token.deleted,.prism-tomorrow-night-eighties .prism .token.number,.prism-tomorrow-night-eighties .prism .token.property,.prism-tomorrow-night-eighties .prism .token.regex,.prism-tomorrow-night-eighties .prism .token.symbol{color:#f99157}.prism-tomorrow-night-eighties .prism .token.tag{color:#f2777a}.prism-tomorrow-night-eighties .prism .token.attr-value,.prism-tomorrow-night-eighties .prism .token.builtin,.prism-tomorrow-night-eighties .prism .token.char,.prism-tomorrow-night-eighties .prism .token.inserted,.prism-tomorrow-night-eighties .prism .token.selector,.prism-tomorrow-night-eighties .prism .token.string{color:#9c9}.prism-tomorrow-night-eighties .prism .token.attr-name{color:#fc6}.prism-tomorrow-night-eighties .prism .language-css .token.string,.prism-tomorrow-night-eighties .prism .style .token.string,.prism-tomorrow-night-eighties .prism .token.entity,.prism-tomorrow-night-eighties .prism .token.operator,.prism-tomorrow-night-eighties .prism .token.url{color:#9c9}.prism-tomorrow-night-eighties .prism .token.atrule,.prism-tomorrow-night-eighties .prism .token.keyword{color:#c9c}.prism-tomorrow-night-eighties .prism .token.function{color:#69c}.prism-tomorrow-night-eighties .prism .token.important,.prism-tomorrow-night-eighties .prism .token.variable{color:#e90}.prism-tomorrow-night-eighties .prism .token.bold,.prism-tomorrow-night-eighties .prism .token.important{font-weight:500}.prism-tomorrow-night-eighties .prism .tocken.class-name{color:#e6c07b}pre.line-numbers{position:relative;padding-left:3.8em;counter-reset:a}pre.line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{pointer-events:none;display:block;counter-increment:a}.line-numbers-rows>span:before{content:counter(a);color:#999;display:block;padding-right:.8em;text-align:right}audio,canvas,progress,video{display:inline-block}.mermaid{font-size:16px}.mermaid svg{color:rgba(0,0,0,.75);width:100%;max-width:100%}.app--dark .mermaid div.mermaidTooltip,.mermaid div.mermaidTooltip{position:absolute;max-width:200px;padding:2px;pointer-events:none;z-index:100;text-align:center}.app--dark .mermaid svg{color:hsla(0,0%,100%,.75)}.mermaid svg *{font-family:-apple-system,SF UI Text,Arial,PingFang SC,Hiragino Sans GB,Microsoft YaHei,WenQuanYi Micro Hei,sans-serif}.mermaid .mermaid .label{color:#333}.mermaid .node circle,.mermaid .node ellipse,.mermaid .node polygon,.mermaid .node rect{fill:#eee;stroke:#999;stroke-width:1px}.mermaid .edgePath .path{stroke:#666;stroke-width:1.5px}.mermaid .edgeLabel{background-color:#fff}.mermaid .cluster rect{fill:#eaf2fb!important;rx:4!important;stroke:#26a!important;stroke-width:1px!important}.mermaid .cluster text{fill:#333}.mermaid .actor{stroke:#999;fill:#eee}.mermaid text.actor{fill:#333;stroke:none}.mermaid .actor-line{stroke:#666}.mermaid .messageLine0,.mermaid .messageLine1{stroke-width:1.5;stroke-dasharray:"2 2";stroke:#333}.mermaid #arrowhead{fill:#333}.mermaid #crosshead path{fill:#333!important;stroke:#333!important}.mermaid .messageText{fill:#333;stroke:none}.mermaid .labelBox{stroke:#999;fill:#eee}.mermaid .labelText,.mermaid .loopText{fill:#fff;stroke:none}.mermaid .loopLine{stroke-width:2;stroke-dasharray:"2 2";stroke:#999}.mermaid .note{stroke:#770;fill:#ffa}.mermaid .noteText{fill:#000;stroke:none;font-family:Arial,Helvetica,sans-serif;font-size:14px}.mermaid .section{stroke:none;opacity:.2}.mermaid .section0,.mermaid .section2{fill:#d2d8e2}.mermaid .section1,.mermaid .section3{fill:#fff;opacity:.2}.mermaid .sectionTitle0,.mermaid .sectionTitle1,.mermaid .sectionTitle2,.mermaid .sectionTitle3{fill:#333}.mermaid .sectionTitle{text-anchor:start;font-size:11px}.mermaid .grid .tick{stroke:#dddfe4;opacity:.3;shape-rendering:crispEdges}.mermaid .grid path{stroke-width:0}.mermaid .today{fill:none;stroke:#d42;stroke-width:2px}.mermaid .task{stroke-width:2}.mermaid .taskText{text-anchor:middle;font-size:10px}.mermaid .taskTextOutsideRight{fill:#333;text-anchor:start;font-size:11px}.mermaid .taskTextOutsideLeft{fill:#333;text-anchor:end;font-size:11px}.mermaid .taskText0,.mermaid .taskText1,.mermaid .taskText2,.mermaid .taskText3{fill:#4d4d4d}.mermaid .task0,.mermaid .task1,.mermaid .task2,.mermaid .task3{fill:#ffe4c2}.mermaid .taskTextOutside0,.mermaid .taskTextOutside1,.mermaid .taskTextOutside2,.mermaid .taskTextOutside3{fill:#4d4d4d}.mermaid .active0,.mermaid .active1,.mermaid .active2,.mermaid .active3{fill:#add6f7}.mermaid .activeText0,.mermaid .activeText1,.mermaid .activeText2,.mermaid .activeText3{fill:#4d4d4d!important}.mermaid .done0,.mermaid .done1,.mermaid .done2,.mermaid .done3{fill:#c2e0f9;stroke-width:2}.mermaid .doneText0,.mermaid .doneText1,.mermaid .doneText2,.mermaid .doneText3{fill:#4d4d4d!important}.mermaid .crit0,.mermaid .crit1,.mermaid .crit2,.mermaid .crit3{fill:#ffcf94;stroke-width:2}.mermaid .activeCrit0,.mermaid .activeCrit1,.mermaid .activeCrit2,.mermaid .activeCrit3{fill:#f88f95;stroke-width:2}.mermaid .doneCrit0,.mermaid .doneCrit1,.mermaid .doneCrit2,.mermaid .doneCrit3{fill:#fcc7ca;stroke-width:2;cursor:pointer}.mermaid .doneCritText0,.mermaid .doneCritText1,.mermaid .doneCritText2,.mermaid .doneCritText3{fill:#4d4d4d!important}.mermaid .activeCritText0,.mermaid .activeCritText1,.mermaid .activeCritText2,.mermaid .activeCritText3{fill:#333!important}.mermaid .titleText{text-anchor:middle;font-size:16px;fill:#3d3d3d;font-weight:700}.mermaid g.classGroup text{fill:#999;stroke:none;font-family:trebuchet ms,verdana,arial;font-size:10px}.mermaid g.classGroup rect{fill:#eee;stroke:#999}.mermaid g.classGroup line{stroke:#999;stroke-width:1}.mermaid svg .classLabel .box{stroke:none;stroke-width:0;fill:#eee;opacity:.5}.mermaid svg .classLabel .label{fill:#999;font-size:10px}.mermaid .relation{stroke:#999;stroke-width:1;fill:none}.mermaid #compositionEnd,.mermaid #compositionStart,.mermaid .composition{fill:#999;stroke:#999;stroke-width:1}.mermaid #aggregationEnd,.mermaid #aggregationStart,.mermaid .aggregation{fill:#eee;stroke:#999;stroke-width:1}.mermaid #dependencyEnd,.mermaid #dependencyStart,.mermaid #extensionEnd,.mermaid #extensionStart{fill:#999;stroke:#999;stroke-width:1}.mermaid .node text{font-family:Arial,Helvetica,sans-serif;font-size:14px}.mermaid div.mermaidTooltip{font-family:Arial,Helvetica,sans-serif;font-size:12px;background:#eaf2fb;border:1px solid #26a;border-radius:2px}.app--dark .mermaid .label{color:#323d47}.app--dark .mermaid .node circle,.app--dark .mermaid .node ellipse,.app--dark .mermaid .node polygon,.app--dark .mermaid .node rect{fill:#bdd5ea;stroke:#81b1db;stroke-width:1px}.app--dark .mermaid .edgePath .path{stroke:#d3d3d3}.app--dark .mermaid .edgeLabel{background-color:#e8e8e8}.app--dark .mermaid .cluster rect{fill:#6d6d65!important;rx:4!important;stroke:hsla(0,0%,100%,.25)!important;stroke-width:1px!important}.app--dark .mermaid .cluster text{fill:#f9fffe}.app--dark .mermaid .actor{stroke:#81b1db;fill:#bdd5ea}.app--dark .mermaid text.actor{fill:#000;stroke:none}.app--dark .mermaid .actor-line{stroke:#d3d3d3}.app--dark .mermaid .messageLine0,.app--dark .mermaid .messageLine1{stroke-width:1.5;stroke-dasharray:"2 2";stroke:#d3d3d3}.app--dark .mermaid #arrowhead{fill:#d3d3d3!important}.app--dark .mermaid #crosshead path{fill:#d3d3d3!important;stroke:#d3d3d3!important}.app--dark .mermaid .messageText{fill:#d3d3d3;stroke:none}.app--dark .mermaid .labelBox{stroke:#81b1db;fill:#bdd5ea}.app--dark .mermaid .labelText{fill:#323d47;stroke:none}.app--dark .mermaid .loopText{fill:#d3d3d3;stroke:none}.app--dark .mermaid .loopLine{stroke-width:2;stroke-dasharray:"2 2";stroke:#81b1db}.app--dark .mermaid .note{stroke:hsla(0,0%,100%,.25);fill:#fff5ad}.app--dark .mermaid .noteText{fill:#000;stroke:none;font-family:trebuchet ms,verdana,arial;font-size:14px}.app--dark .mermaid .section{stroke:none;opacity:.2}.app--dark .mermaid .section0{fill:hsla(0,0%,100%,.3)}.app--dark .mermaid .section2{fill:#eae8b9}.app--dark .mermaid .section1,.app--dark .mermaid .section3{fill:#fff;opacity:.2}.app--dark .mermaid .sectionTitle0,.app--dark .mermaid .sectionTitle1,.app--dark .mermaid .sectionTitle2,.app--dark .mermaid .sectionTitle3{fill:#f9fffe}.app--dark .mermaid .sectionTitle{text-anchor:start;font-size:11px}.app--dark .mermaid .grid .tick{stroke:hsla(0,0%,100%,.3);opacity:.3;shape-rendering:crispEdges}.app--dark .mermaid .grid .tick text{fill:#d3d3d3;opacity:.5}.app--dark .mermaid .grid path{stroke-width:0}.app--dark .mermaid .today{fill:none;stroke:#db5757;stroke-width:2px}.app--dark .mermaid .task{stroke-width:1}.app--dark .mermaid .taskText{text-anchor:middle;font-size:11px}.app--dark .mermaid .taskTextOutsideRight{fill:#323d47;text-anchor:start;font-size:11px}.app--dark .mermaid .taskTextOutsideLeft{fill:#323d47;text-anchor:end;font-size:11px}.app--dark .mermaid .taskText0,.app--dark .mermaid .taskText1,.app--dark .mermaid .taskText2,.app--dark .mermaid .taskText3{fill:#323d47}.app--dark .mermaid .task0,.app--dark .mermaid .task1,.app--dark .mermaid .task2,.app--dark .mermaid .task3{fill:#bdd5ea;stroke:hsla(0,0%,100%,.5)}.app--dark .mermaid .taskTextOutside0,.app--dark .mermaid .taskTextOutside1,.app--dark .mermaid .taskTextOutside2,.app--dark .mermaid .taskTextOutside3{fill:#d3d3d3}.app--dark .mermaid .active0,.app--dark .mermaid .active1,.app--dark .mermaid .active2,.app--dark .mermaid .active3{fill:#81b1db;stroke:hsla(0,0%,100%,.5)}.app--dark .mermaid .activeText0,.app--dark .mermaid .activeText1,.app--dark .mermaid .activeText2,.app--dark .mermaid .activeText3{fill:#323d47!important}.app--dark .mermaid .done0,.app--dark .mermaid .done1,.app--dark .mermaid .done2,.app--dark .mermaid .done3{fill:#d3d3d3}.app--dark .mermaid .doneText0,.app--dark .mermaid .doneText1,.app--dark .mermaid .doneText2,.app--dark .mermaid .doneText3{fill:#323d47!important}.app--dark .mermaid .crit0,.app--dark .mermaid .crit1,.app--dark .mermaid .crit2,.app--dark .mermaid .crit3{stroke:#e83737;fill:#e83737;stroke-width:2}.app--dark .mermaid .activeCrit0,.app--dark .mermaid .activeCrit1,.app--dark .mermaid .activeCrit2,.app--dark .mermaid .activeCrit3{stroke:#e83737;fill:#81b1db;stroke-width:2}.app--dark .mermaid .doneCrit0,.app--dark .mermaid .doneCrit1,.app--dark .mermaid .doneCrit2,.app--dark .mermaid .doneCrit3{stroke:#e83737;fill:#d3d3d3;stroke-width:1;cursor:pointer;shape-rendering:crispEdges}.app--dark .mermaid .doneCritText0,.app--dark .mermaid .doneCritText1,.app--dark .mermaid .doneCritText2,.app--dark .mermaid .doneCritText3{fill:#d3d3d3!important}.app--dark .mermaid .activeCritText0,.app--dark .mermaid .activeCritText1,.app--dark .mermaid .activeCritText2,.app--dark .mermaid .activeCritText3{fill:#323d47!important}.app--dark .mermaid .titleText{text-anchor:middle;font-size:18px;fill:#d3d3d3}.app--dark .mermaid .node text{font-family:trebuchet ms,verdana,arial;font-size:14px}.app--dark .mermaid div.mermaidTooltip{font-family:trebuchet ms,verdana,arial;font-size:12px;background:#6d6d65;border:1px solid hsla(0,0%,100%,.25);border-radius:2px}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}.markdown_views *,legend{box-sizing:border-box}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}.markdown_views,body,html{font-family:-apple-system,SF UI Text,Arial,PingFang SC,Hiragino Sans GB,Microsoft YaHei,WenQuanYi Micro Hei,sans-serif}fieldset{padding:.35em .75em .625em}legend{display:table;max-width:100%;padding:0;color:inherit;white-space:normal}textarea{overflow:auto}summary{display:list-item}[hidden],template{display:none}body,html{color:rgba(0,0,0,.75);font-variant-ligatures:common-ligatures;line-height:1.625;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;tab-size:4;-moz-tab-size:4;-o-tab-size:4}.app--dark .layout__panel--editor,.app--dark .layout__panel--preview{color:hsla(0,0%,100%,.75)}.markdown_views blockquote,.markdown_views dl,.markdown_views ol,.markdown_views p,.markdown_views pre,.markdown_views ul{margin:1.2em 0}.markdown_views ol ol,.markdown_views ol ul,.markdown_views ul ol,.markdown_views ul ul{margin:0}.markdown_views dt{font-weight:700}.markdown_views code *,.markdown_views pre *,.markdown_views samp *{font-size:inherit}.markdown_views blockquote{color:rgba(0,0,0,.5);padding-left:1.5em}.app--dark .layout__panel--editor .markdown_views blockquote,.app--dark .layout__panel--preview .markdown_views blockquote{color:hsla(0,0%,100%,.4);border-left-color:hsla(0,0%,100%,.075)}.markdown_views code{padding:2px 4px}.markdown_views pre>code{background-color:rgba(0,0,0,.05);display:block;padding:.5em;-webkit-text-size-adjust:none;overflow-x:auto;white-space:pre}.markdown_views .toc ul{list-style-type:none;padding-left:20px}.markdown_views table{background-color:transparent;border-spacing:0}.markdown_views td,.markdown_views th{border-right:1px solid #dcdcdc;padding:8px 12px}.markdown_views td{border-top:1px solid #dcdcdc}.markdown_views mark{background-color:#f8f840}.markdown_views abbr[title]{cursor:help}.markdown_views img[src*="#pic_center"]{display:block;margin:auto}.markdown_views .task-list-item{list-style-type:none}.markdown_views .task-list-item-checkbox{margin:0 .2em 0 -1.3em}.markdown_views .page-break-after{page-break-after:always}.markdown_views .stackedit__html{margin-bottom:180px;margin-left:auto;margin-right:auto;padding-left:30px;padding-right:30px;max-width:750px}.markdown_views .stackedit__toc ul{padding:0}.markdown_views .stackedit__toc ul a{margin:.5rem 0;padding:.5rem 1rem}.markdown_views .stackedit__toc ul ul{color:#888;font-size:.9em}.markdown_views .stackedit__toc ul ul a{margin:0;padding:.1rem 1rem}.markdown_views .stackedit__toc li{display:block}.markdown_views .stackedit__toc a{display:block;color:inherit;text-decoration:none}.markdown_views .stackedit__toc a:active,.markdown_views .stackedit__toc a:focus,.markdown_views .stackedit__toc a:hover{background-color:rgba(0,0,0,.075);border-radius:4px}.markdown_views .stackedit__left{position:fixed;display:none;width:250px;height:100%;top:0;left:0;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:none}.markdown_views .stackedit__right{position:absolute;right:0;top:0;left:0}@media (min-width:1060px){.markdown_views .stackedit__left{display:block}.markdown_views .stackedit__right{left:250px}}.markdown_views .stackedit--pdf blockquote{border-left-color:#ececec}.markdown_views .stackedit--pdf .stackedit__html{padding-left:0;padding-right:0;max-width:none}.markdown_views p{font-size:16px;color:#4d4d4d;font-weight:400;line-height:26px;margin:0 0 16px}.markdown_views strong{font-weight:700}.markdown_views i,address,cite,dfn,em,var{font-style:italic}.markdown_views h1,.markdown_views h2,.markdown_views h3,.markdown_views h4,.markdown_views h5,.markdown_views h6{color:#4f4f4f;margin:8px 0 16px;font-weight:700}.markdown_views ol,.markdown_views ul{margin:0 0 24px;padding:0;font-size:16px}.markdown_views ul ol{margin:0 0 24px 32px}.markdown_views ul li{list-style-type:disc;margin:8px 0 0 32px}.markdown_views ol li{list-style-type:decimal;margin-left:40px;margin-top:8px}.markdown_views img{margin:24px 0;max-width:100%}.markdown_views h1{font-size:28px;line-height:36px}.markdown_views h2{font-size:24px;line-height:32px}.markdown_views h3{font-size:22px;line-height:30px}.markdown_views h4{font-size:20px;line-height:28px}.markdown_views h5{font-size:18px;line-height:26px}.markdown_views h6{font-size:16px;line-height:24px}.markdown_views h1 code{font-size:28px}.markdown_views h2 code{font-size:24px}.markdown_views h3 code{font-size:22px}.markdown_views h4 code{font-size:20px}.markdown_views h5 code{font-size:18px}.markdown_views h6 code{font-size:16px}.markdown_views blockquote{display:block;padding:16px;margin:0 0 24px;border-left:8px solid #dddfe4;background:#eef0f4;overflow:auto}.markdown_views blockquote ol,.markdown_views blockquote ul{margin-bottom:0;padding:0;font-size:14px;line-height:22px}.markdown_views blockquote ol li,.markdown_views blockquote ul li{margin-bottom:0}.markdown_views blockquote p{font-size:14px;line-height:22px;color:#999;font-weight:400;margin-bottom:0}.markdown_views hr{margin:24px 0;border:none;border-bottom:1px solid #ddd}.markdown_views table tr{border:0;border-top:1px solid #ddd;background-color:#fff}.markdown_views table{border-collapse:collapse;display:table;width:100%;text-align:center;margin-bottom:24px}.markdown_views tbody{border:0}.markdown_views table tr:nth-child(2n){background-color:#f7f7f7}.markdown_views table tr td,.markdown_views table tr th{font-size:14px;color:#4f4f4f;line-height:22px;border:1px solid #ddd;padding:8px;word-break:normal!important;vertical-align:middle}.markdown_views table tr td code,.markdown_views table tr th code{white-space:normal;word-break:normal!important}.markdown_views table tr th{font-weight:700;background-color:#eff3f5}.markdown_views dl{margin:24px}.markdown_views dl dt{margin:8px;font-weight:700}.markdown_views dl dt dd{margin:8px}.markdown_views abbr[data-original-title],.markdown_views abbr[title]{cursor:help;border-bottom:1px dotted #999}.markdown_views .initialism{font-size:90%;text-transform:uppercase}.markdown_views pre{margin-bottom:24px}.markdown_views pre code{color:unset}.markdown_views code,.markdown_views kbd,.markdown_views pre,.markdown_views samp{font-family:Source Code Pro,DejaVu Sans Mono,Ubuntu Mono,Anonymous Pro,Droid Sans Mono,Menlo,Monaco,Consolas,Inconsolata,Courier,monospace,PingFang SC,Microsoft YaHei,sans-serif;font-size:14px;line-height:22px;color:#000}.markdown_views code{color:#c7254e;background-color:#f9f2f4;border-radius:2px}.markdown_views a{text-decoration-skip:ink;color:#4ea1db;text-decoration:none}.markdown_views a:focus,.markdown_views a:hover{text-decoration:none;color:#ca0c16}.markdown_views a:visited{color:#6795b5}.markdown_views .footnote{vertical-align:top;position:relative;top:-4px;font-size:12px}.markdown_views .footnotes ol li{font-size:14px;line-height:22px;margin:0 0 8px 24px}.markdown_views .flow-chart,.markdown_views .sequence-diagram{text-align:center;margin-bottom:24px;font-size:14px!important}.markdown_views .flow-chart svg,.markdown_views .sequence-diagram svg{width:unset}.markdown_views .flow-chart [fill="#000"],.markdown_views .flow-chart [fill="#000000"],.markdown_views .flow-chart [fill=black],.markdown_views .sequence-diagram [fill="#000"],.markdown_views .sequence-diagram [fill="#000000"],.markdown_views .sequence-diagram [fill=black]{fill:#4f4f4f}.markdown_views .flow-chart [stroke="#000000"],.markdown_views .sequence-diagram [stroke="#000000"]{stroke:#4f4f4f}.markdown_views .MathJax_SVG_Display{text-align:center;margin:24px 0;font-size:18px;font-weight:400;color:#4f4f4f;position:relative;text-indent:0;max-width:none;max-height:none;min-width:0;min-height:0;width:100%}.markdown_views .toc{font-size:16px;line-height:24px;margin:0 0 24px;padding:0}.markdown_views .toc ul{margin:0 0 8px;padding:0}.markdown_views .toc ul ul{padding-left:24px}.markdown_views .toc ul li{list-style-type:none;margin:8px 0 0 24px}.markdown_views dl dd{margin:0 0 8px 40px}.markdown_views kbd{padding:2px 8px;border:1px solid rgba(63,63,63,.25);box-shadow:0 1px 0 rgba(63,63,63,.25);background-color:#fff;color:#333;border-radius:4px;display:inline-block;margin:0 2px;white-space:nowrap}</style><style class="darkreader darkreader--sync" media="screen"></style>
                </div>
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/luckydarcy/article/details/76737522
            </div>
                                                <!--一个博主专栏付费入口-->
         
         <!--一个博主专栏付费入口结束-->
        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css"><style class="darkreader darkreader--cors" media="screen">.htmledit_views address,.htmledit_views cite,.htmledit_views dfn,.htmledit_views em,.htmledit_views i,.htmledit_views span[lang],.htmledit_views var{font-style:italic}.htmledit_views{font-family:-apple-system,SF UI Text,Arial,PingFang SC,Hiragino Sans GB,Microsoft YaHei,WenQuanYi Micro Hei,sans-serif,SimHei,SimSun}.cke_editable{margin:24px;word-wrap:break-word}.htmledit_views img.right{border:1px solid #ccc;float:right;margin-left:15px;padding:5px}.htmledit_views img.left{border:1px solid #ccc;float:left;margin-right:15px;padding:5px}.htmledit_views .marker{background-color:#ff0}.htmledit_views figure{text-align:center;margin:0 24px;display:inline-block}.htmledit_views figure>figcaption{text-align:center;margin:8px;color:#999;font-size:14px;display:block}.htmledit_views a>img{padding:1px;margin:1px;border:none;outline:#0782c1 solid 1px}.htmledit_views .code-featured{border:5px solid red}.htmledit_views .math-featured{padding:20px;box-shadow:0 0 2px rgba(200,0,0,1);background-color:rgba(255,0,0,.05);margin:10px}.htmledit_views .image-clean{border:0;background:0 0;padding:0}.htmledit_views .image-clean>figcaption{font-size:.9em;text-align:right}.htmledit_views .image-grayscale{background-color:#fff;color:#666}.htmledit_views .image-grayscale img,.htmledit_views img.image-grayscale{filter:grayscale(100%)}.htmledit_views .embed-240p{max-width:426px;max-height:240px;margin:0 auto}.htmledit_views .embed-360p{max-width:640px;max-height:360px;margin:0 auto}.htmledit_views .embed-480p{max-width:854px;max-height:480px;margin:0 auto}.htmledit_views .embed-720p{max-width:1280px;max-height:720px;margin:0 auto}.htmledit_views .embed-1080p{max-width:1920px;max-height:1080px;margin:0 auto}.htmledit_views p{font-size:16px;color:#4d4d4d;font-weight:400;line-height:26px;margin:0 0 16px;overflow-x:auto}p[align=center]{text-align:center}.htmledit_views img{max-width:100%}.htmledit_views strong,.htmledit_views strong span{font-weight:700}.htmledit_views *{box-sizing:border-box}.htmledit_views h1,.htmledit_views h2,.htmledit_views h3,.htmledit_views h4,.htmledit_views h5,.htmledit_views h6{color:#4f4f4f;margin:8px 0 16px;font-weight:700}.htmledit_views ol,.htmledit_views ul{margin:0 0 24px;padding:0;font-size:16px}.htmledit_views ul ol{margin:0 0 24px 32px}.htmledit_views ul li{list-style-type:disc;margin:8px 0 0 32px}.htmledit_views ol li{list-style-type:decimal;margin-left:40px;margin-top:8px}.htmledit_views h1{font-size:28px;line-height:36px}.htmledit_views h2{font-size:24px;line-height:32px}.htmledit_views h3{font-size:22px;line-height:30px}.htmledit_views h4{font-size:20px;line-height:28px}.htmledit_views h5{font-size:18px;line-height:26px}.htmledit_views h6{font-size:16px;line-height:24px}.htmledit_views blockquote{display:block;padding:16px 16px 0;margin:0 0 24px;border-left:8px solid #dddfe4;background:#eef0f4;overflow:auto;overflow-scrolling:touch;word-wrap:normal;word-break:normal}.htmledit_views blockquote ol,.htmledit_views blockquote ul{margin-bottom:16px;padding:0;font-size:16px;line-height:24px}.htmledit_views blockquote ol li,.htmledit_views blockquote ul li{margin-bottom:0}.htmledit_views blockquote p{font-size:16px;line-height:26px;font-weight:400;margin-bottom:16px;color:#4f4f4f}.htmledit_views hr{margin:24px 0;border:none;border-bottom:solid #ccc 1px}.htmledit_views table tr{border:0;border-top:1px solid #ddd;background-color:#fff}.htmledit_views table{border-collapse:collapse;display:table;width:100%;text-align:left;margin-bottom:24px;margin-left:auto;margin-right:auto}.htmledit_views tbody{border:0}.htmledit_views table tr:nth-child(2n){background-color:#f7f7f7}.htmledit_views table tr td,.htmledit_views table tr th{border:1px solid #ddd;font-size:14px;color:#4f4f4f;line-height:22px;padding:8px;text-align:left}.htmledit_views table tr td p,.htmledit_views table tr th p{font-size:14px;color:#4f4f4f;margin:0;padding:0;text-align:left;line-height:22px}.htmledit_views table tr th p{font-weight:700}.htmledit_views table tr td code,.htmledit_views table tr th code{white-space:normal;word-break:break-word}.htmledit_views table tr th{font-weight:700;background-color:#eff3f5}.htmledit_views dl{margin:24px}.htmledit_views dl dt{margin:8px;font-weight:700}.htmledit_views dl dt dd{margin:8px}.htmledit_views abbr[data-original-title],.htmledit_views abbr[title]{cursor:help;border-bottom:1px dotted #999}.htmledit_views .initialism{font-size:90%;text-transform:uppercase}.htmledit_views pre{white-space:pre-wrap;word-wrap:break-word;margin:0 0 24px;overflow-x:auto;padding:8px}.marker{background-color:#ff0}htmledit_views img.mathcode{margin:0 8px}.htmledit_views kbd,.htmledit_views pre,.htmledit_views samp{font-family:Consolas,Inconsolata,Courier,monospace;font-size:14px;line-height:22px;color:#000}.htmledit_views code ol li div.hljs-ln-code,.htmledit_views code ol li div.hljs-ln-numbers,.htmledit_views pre code,.htmledit_views pre code div,.htmledit_views pre code span{font-family:"Source Code Pro","DejaVu Sans Mono","Ubuntu Mono","Anonymous Pro","Droid Sans Mono",Menlo,Monaco,Consolas,Inconsolata,Courier,monospace,"PingFang SC","Microsoft YaHei",sans-serif}.htmledit_views code{border-radius:4px}.htmledit_views a{color:#4ea1db;text-decoration:none}.htmledit_views a:focus,.htmledit_views a:hover{color:#ca0c16}.htmledit_views a:visited{color:#6795b5}.htmledit_views .footnote{vertical-align:top;position:relative;top:-4px;font-size:12px}.htmledit_views .flow-chart,.htmledit_views .sequence-diagram{text-align:center;margin-bottom:24px;font-size:14px!important}.htmledit_views .flow-chart [fill="#000"],.htmledit_views .flow-chart [fill="#000000"],.htmledit_views .flow-chart [fill=black],.htmledit_views .sequence-diagram [fill="#000"],.htmledit_views .sequence-diagram [fill="#000000"],.htmledit_views .sequence-diagram [fill=black]{fill:#4f4f4f}.htmledit_views .flow-chart [stroke="#000000"],.htmledit_views .sequence-diagram [stroke="#000000"]{stroke:#4f4f4f}.htmledit_views .MathJax_SVG_Display{text-align:center;margin:24px 0;font-size:18px;font-weight:400;color:#4f4f4f;position:relative;text-indent:0;max-width:none;max-height:none;min-width:0;min-height:0;width:100%}.htmledit_views pre code{display:block;line-height:22px;overflow-x:auto;white-space:pre;word-wrap:normal;border-radius:4px;padding:8px}.htmledit_views pre code:not(.hljs){background-color:#f3f4f5}.htmledit_views pre code,.htmledit_views pre code div,.htmledit_views pre code span{font-size:14px}.htmledit_views .prettyprint,.htmledit_views pre.prettyprint{margin:0 0 24px;padding:8px 16px 4px 56px;background-color:#f6f8fa;border:none}.htmledit_views .prettyprint .pre-numbering{position:absolute;width:48px;background-color:#eef0f4;top:0;left:0;margin:0;padding:8px 0;list-style:none;text-align:right}.htmledit_views .pre-numbering li{padding:0 8px;list-style:none;margin:0}.htmledit_views dl dd{margin:0 0 8px 40px}.htmledit_views kbd{padding:2px 8px;border:1px solid rgba(63,63,63,.25);box-shadow:0 1px 0 rgba(63,63,63,.25);background-color:#fff;color:#333;border-radius:4px;display:inline-block;margin:0 2px;white-space:nowrap}.htmledit_views .dp-highlighter{font-size:12px;text-align:left;margin:0 0 24px}.htmledit_views code ol{margin:0;overflow:hidden}.htmledit_views code ol li{list-style-type:none;margin-left:0;margin-top:0;height:22px}.htmledit_views code ol li div.hljs-ln-code{margin-left:8px}.htmledit_views code ol li div.hljs-ln-code,.htmledit_views code ol li div.hljs-ln-numbers{float:left;height:22px}.htmledit_views code ol li div.hljs-ln-numbers{width:24px;border-right:1px solid #c5c5c5}.htmledit_views code ol li div.hljs-ln-numbers .hljs-ln-line{word-wrap:normal}.htmledit_views code ol.hundred li div.hljs-ln-numbers{width:30px}.htmledit_views code ol.thousand li div.hljs-ln-numbers{width:36px}.htmledit_views .csdn-data-video{width:200px}.htmledit_views .csdn-data-video img{margin:0;display:block;width:200px;height:112px}.htmledit_views .csdn-data-video p{margin-top:10px;margin-bottom:0;font-size:14px}.htmledit_views pre[data-from=code-for-outside]{overflow:hidden}.htmledit_views pre[data-from=code-for-outside] code{overflow-x:auto;overflow-y:hidden}.htmledit_views pre[data-from=code-for-outside] code *{overflow:visible;overflow-wrap:break-word}.htmledit_views pre[data-from=code-for-outside] p code{padding:0}</style><style class="darkreader darkreader--sync" media="screen"></style>
                                    <div id="content_views" class="markdown_views">
                <!-- flowchart 箭头图标 勿删 -->
                <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                    <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                </svg>
                                        <p>在上一节(<a href="http://blog.csdn.net/lu_embedded/article/details/76732965" rel="nofollow" target="_blank">http://blog.csdn.net/lu_embedded/article/details/76732965</a>)我们已经通过 Vundle 下载、安装了一些插件,这些插件有一些可以直接用、有一些需要配置、有一些则需要编译,下面我们一一来看一下常用的一些插件应该怎样用起来吧。</p>

  首先要讲的是 YouCompleteMe,它应该是最难安装的一个插件了。vundle 已经帮我们做了一部分工作,但还不能使它正常工作起来,对于 C/C++ 用户来说,我们还需要编译 ycm_core.so 和 libclang.so。编译方法如下:

$ cd ~/.vim/bundle/YouCompleteMe

$ ./install.sh --clang-completer
WARNING: this script is deprecated. Use the install.py script instead.
ERROR: please install CMake and retry.

$ ./install.py --clang-completer
ERROR: please install CMake and retry.
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

  YouCompleteMe 目录下有两个安装脚本,install.sh 和 install.py,显然根据执行情况来看,install.sh 已经失效了,最后执行的是 install.py。但是,需要 CMake 的支持!
  于是我们 apt-get 一下吧:

$ sudo apt-get install cmake
 
 
  • 1

  很可惜,对于 Ubuntu 12.04 的用户来说,这种方法并不行。因为 install.py 要求的 CMake 需要 2.8.11 以上版本。所以我们还是手动安装一下吧:

$ wget http://www.cmake.org/files/v2.8/cmake-2.8.12.1-Linux-i386.tar.gz
$ tar zxvf cmake-2.8.12.1-Linux-i386.tar.gz
$ cd cmake-2.8.12.1-Linux-i386
$ sudo cp bin/* /usr/bin/
$ sudo cp -r share/cmake-2.8 /usr/share/
 
 
  • 1
  • 2
  • 3
  • 4
  • 5

  好了,现在可以继续执行 ./install.py --clang-completer ,可惜还不成功,提示如下:

$ ./install.py --clang-completer
Searching Python 2.7 libraries...
Found Python library: /usr/lib/python2.7/config/libpython2.7.so
Found Python headers folder: /usr/include/python2.7
-- The C compiler identification is GNU 4.6.3
-- The CXX compiler identification is GNU 4.6.3
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
CMake Error at CMakeLists.txt:217 (message):
  Your C++ compiler does NOT fully support C++11.
  ......
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

  显然,这次是由于 C++ 编译器不完全支持 C++ 11 造成的,因为 g++ 4.8 以上版本才完全支持 C++11 啊!而 Ubuntu 12.04 中用 apt-get 安装的是 4.6 版本的,所以还是手动升级一下 gcc 和 g++ 吧。具体方法参考:http://www.linuxidc.com/Linux/2014-03/97445.htm
  哎呀!我真是命苦,还以为万事大吉了,结果还是出错了:

......
g++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
 
 
  • 1
  • 2
  • 3

  经检查发现是因为我的虚拟机内存不足呀,编译 Linux 都没问题,没想到编译这个会出问题。。。好吧,面对这个情况,我们可以加大虚拟机的内存分配,或者临时使用交换分区来解决!
  再次执行 ./install.py --clang-completer,这次终于顺利编译通过了!忘了截图。。。不过没关系,我们在 third_party/ycmd/ 目录看到 libclang.so 和 ycm_core.so 就可以了。

$ cd ~/.vim/bundle/YouCompleteMe/third_party/ycmd/
$ ls *.so*
libclang.so.4    libclang.so.4.0    ycm_core.so
 
 
  • 1
  • 2
  • 3

  还差一步,运行 vim 的时候我们发现缺少 .ycm_extra_conf.py 文件。那就拷贝一份吧:

$ cd ~/.vim/bundle/YouCompleteMe/
$ cp ./third_party/ycmd/examples/.ycm_extra_conf.py ~/.vim/
 
 
  • 1
  • 2

  然后在 ~/.vimrc 中添加如下配置:

let g:ycm_server_python_interpreter='/usr/bin/python'
let g:ycm_global_ycm_extra_conf='~/.vim/.ycm_extra_conf.py'
 
 
  • 1
  • 2

  好了,打开 vim 试一下呗!

这里写图片描述


  搞定 YouCompleteMe 就完成了一大步了,其他插件的用法都比较简单,我在这里就大概列一下插件及其作用吧。(注意:有些插件存在包含与被包含的关系,有些插件功能相似,因此选择其中的一些使用即可。)
  

  • YouCompleteMe —— 代码补全
  • Syntastic —— 语法检查
  • SuperTab —— 使 Tab 快捷键具有更快捷的上下文提示功能
  • Ctags —— 实现变量名、函数名的跳转(需遍历源代码文件生成 tags 文件)
  • Cscope —— 升级版 Ctags
  • TagList —— 显示当前文件中的宏、全局变量、函数等 tag(类似于 SourceInsight 的功能)
  • Tagbar —— TagList 的替代品(更适合于 C++)
  • AutoPairs —— 自动插入和格式化括号
  • Powerline —— 状态栏
  • Vim-airline —— Powerline 的替代品
  • Echofunc —— 自动显示函数声明
  • Snipmate —— 自动插入代码(代码重用工具)
  • NERDTree —— 文件浏览器(树形目录)
  • Ctrlp —— 文件浏览器(重新定义打开目录和文件的方式,更适用于大规模项目文件的浏览)
  • MiniBufferExplorer —— 缓冲区文件管理器
  • NERDCommenter —— 快速注释
  • Undotree —— 支持 undo 和 redo
  • Gdbmgr —— 调试器
  • Molokai —— 颜色主题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值