Расширенная глава конфигурации Vim

VIM

в предыдущем посте в блогеВведение в настройку Vim, я лишь вкратце представил базовую конфигурацию Vim и несколько часто используемых подключаемых модулей, но при более позднем использовании я обнаружил, что конфигурация Vim не очень проста в использовании, особенно минибуфер, taglist, fileexplore имеют прямые конфликты, и Управление его плагинами также более проблематично. Этот пост в блоге в основном посвящен решению этих двух проблем и опробованию некоторых плагинов, которые больше подходят для фермеров кода.

Введение

Первоначальная цель использования Vim раньше заключалась, с одной стороны, в мощи его плагинов и, что более важно, в том, что он подходит для установки 13 . Но по мере того, как я узнавал больше о Vim, я обнаружил, что у Vim есть причина, которую можно увидеть из следующей оценки:

  • В мире всего три редактора, EMACS, VIM и другие
  • VIM — бог редакторов, EMACS — бог редакторов
  • EMACS is actually an OS which pretends to be an editor

В соответствии с проблемами повседневного использования конфигурации в предыдущем сообщении в блоге, решение приведено здесь, Для конфликта между плагинами панель тегов используется для замены списка тегов, а управление плагинами заключается в использовании плагина пакета . В Vim действительно много полезных и удобных плагинов.

Эффективный плагин

Есть много плагинов для vim, и они очень мощные и очень мощные. Адрес плагина на официальном сайте находится по адресуздесь.

vundle

Vundle — это плагин для управления плагинами vim, который эффективно использует git, так что установка, обновление и удаление плагинов vim управляются vundle, тем самым освобождая пользователей от конфигурации установки vim.

  1. установить vundle

    git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
    
  2. Управление плагинами Vim с помощью vundle

    1. существуетVim ScriptВыберите плагин, который хотите использовать

    2. Добавьте в файл конфигурации Vim .vimrcPlugin plugin_name

    3. Выполните команду инициализации vundle:PluginInstall, плагин установлен

    4. Общие команды

      # 更新插件
      :PluginInstall!
      # 清除不再使用的插件
      :PluginClean
      # 列出所有插件
      :PluginList
      # 查找插件
      :PluginSearch
      
    5. Конфигурация vundle в .vimrc

      " 文件类型检测关闭[必须](/usr/share/vim/vim74/filetype.vim)
      filetype off
      " 设置runtime path包含Vundle的路径并且初始化
      set rtp+=~/.vim/bundle/Vundle.vim
      " 设置plugins安装地址
      call vundle#begin('~/.vim/bundle/')
      " 安装Vundle,让其管理插件[必须]
      Plugin 'gmarik/Vundle.vim'
      
      """"""""""""""""""""""""""""""""""
      " Vundle插件安装样例:
      " 插件在github上
      " Plugin 'tpope/vim-fugitive'
      " 插件来自网页http://vim-scripts.org/vim/scripts.html
      " Plugin 'L9'
      " Git插件,但插件不在Github上
      " Plugin 'git://git.wincent.com/command-t.git'
      " 插件在本地机器上 (i.e. when working on your own plugin)
      " Plugin 'file:///home/gmarik/path/to/plugin'
      " The sparkup vim script is in a subdirectory of this repo called vim.
      " Pass the path to set the runtimepath properly.
      " Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
      " 使用用户名来避免插件冲突 ie. L9
      " Plugin 'user/L9', {'name': 'newL9'}
      """"""""""""""""""""""""""""""""""
      
      " 所有插件的添加在end之前[必须]
      call vundle#end()            
      " 文件类型对应的插件[必须](/usr/share/vim/vim74/ftplugin.vim)
      filetype plugin on
      " 文件类型对应的缩进文件
      filetype indent on
      

The-NERD-tree

NERDTree — один из наиболее часто используемых плагинов для Vim. Он может отображать структуру каталогов и файлов во время работы Vim. Он похож на файловый браузер в левой части TextMate, но более удобен в работе. Вы можете быстро просматривать файлы, не отрываясь от клавиатуры. , и переключаться между файлами и папками. Пример этого показан на рисунке ниже:NERDTree

  1. Установка и настройка в vim

    call vundle#begin('~/.vim/bundle')
    " 在Vim的编辑窗口中树状显示文件目录[The-NERD-tree]
    Plugin 'The-NERD-tree'
    call vundle#end()  
    
    """"""""""""""""""""""""""""""""""
    " The-NERD-tree配置
    """"""""""""""""""""""""""""""""""
    " 不显示缓冲文件,中间文件
    let NERDTreeIgnore=[ '.pyc$', '.pyo$', '.obj$', '.o$', '.so$', '.egg$', '^.git$', '^.svn$', '^.hg$' ]
    " 只剩一个NERDTree窗口时退出vim
    autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") &&b:NERDTreeType == "primary") | q | endif
    " <F9>打开/关闭文件管理器
    nnoremap <silent> <F9> :NERDTreeToggle<CR>
    

The-NERD-Commenter

Этот плагин также является обязательным, в основном для автоматического аннотирования контента. Когда ваш xml, естественно, является комментарием xml, когда вы являетесь java, это, естественно, правило комментария java. Пример этого показан на рисунке ниже:nerdcommenter

  1. Установка и настройка в Vim

    call vundle#begin('~/.vim/bundle/')
    " 快速添加/去除注释
    Plugin 'The-NERD-Commenter'
    call vundle#end()  
    
    """"""""""""""""""""""""""""""""""
    " The-NERD-Commenter配置
    """"""""""""""""""""""""""""""""""
    " 注释的时候自动加个空格, 强迫症必配
    let g:NERDSpaceDelims=1
    " mm智能判断加上/解开注释
    map mm <leader>c<space>
    

ctrlp

Это плагин для поиска файлов, его функция похожа на NERDTree, но все же немного отличается. Пример этого показан на рисунке ниже:nerdcommenter

  1. Установка и настройка в vim

    call vundle#begin('~/.vim/bundle/')
    " 文件搜索
    Plugin 'kien/ctrlp.vim'
    call vundle#end()  
    
    """"""""""""""""""""""""""""""""""
    " ctrlp配置
    """"""""""""""""""""""""""""""""""
    " 设置CtrlP的本地工作目录,0代表不设置该功能
    let g:ctrlp_working_path_mode=0
    " ctrlp窗口在底部
    let g:ctrlp_match_window_bottom=1
    " ctrlp窗口最大高度为15行
    let g:ctrlp_max_height=15
    " 窗口
    let g:ctrlp_match_window_reversed=0
    " 最近打开的文件的个数
    let g:ctrlp_mruf_max=500
    " 记录但去掉重复的软链接
    let g:ctrlp_follow_symlinks=1
    " <Ctrl-f>启动文件查找
    let g:ctrlp_map = '<c-f>'
    " Ctrlp启动文件查找
    let g:ctrlp_cmd = 'CtrlP'
    " 相当于mru功能,show recently opened files
    map <c-p> :CtrlPMRU<CR>
    " 忽略以下文件类型
    set wildignore+=*/tmp/*,*.so,*.swp,*.zip
    " 忽略以下文件目录
    let g:ctrlp_custom_ignore = {'dir':  '/].(git|hg|svn|rvm)$','file': '(exe|so|dll|zip|tar|tar.gz)$'}
    

ctags

ctags может устанавливать индекс тега исходного дерева (тег — это место, где определяется идентификатор, например, определение функции), чтобы программисты могли быстро находить функции, переменные, определения макросов и т. д. для просмотра прототипа во время программирования. .

  1. Установите инструмент exuberant-ctags

    sudo apt-get install exuberant-ctags
    
  2. Создать индекс кодовой базы C++

    1. скачатьlibstdc++Заголовочные файлы, включая STL, потоки и т. д. в C++.

    2. Разархивируйте его в каталог ~/.vim/tags и выполните команду ctags

      ctags -R --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ cpp_src
      mv tags ~/.vim/tags/cpptag
      
    3. Установить в .vimrc

      set tags+=~/.vim/tags/cpptag
      
  3. Создать индекс репозитория Gcc

    1. После установки build-essential в Ubuntu в каталоге /usr/include/c++ появятся заголовочные файлы C/C++.

      sudo apt-get install build-essential
      
    2. Скопируйте файлы из /usr/include/c++/4.8 в папку ~/.vim/tags/gcc и выполните команду ctags.

      cp -R /usr/include/c++/4.8 ~/.vim/tags/gcc
      ctags -R --c++-kinds=+p --fields=+iaS --extra=+q gcc
      mv tags ~/.vim/tags/gcctag
      
    3. Установить в .vimrc

      set tags+=~/.vim/tags/gcctag
      

cscope

Cscope, приложение, которое программисты используют для помощи в программировании и отслеживании кода, в основном для программ на языке C. Первоначально возник в Bell Labs, работал на PDP-11 и был разработан Джо Стеффеном.

  1. Установите инструмент cscope

    sudo apt-get install cscope
    
  2. Создать индекс библиотеки gnu c

    1. скачатьglibcфайл, это библиотека libc, выпущенная GNU, то есть библиотека времени выполнения C. glibc — это API самого низкого уровня в системе Linux, почти любая другая библиотека времени выполнения будет зависеть от glibc.

    2. Разархивируйте в каталог ~/.vim/tags и выполните команду cscope

      cd ~/.vim/tags/glibc-2.22
              cscope -Rbq
      
    3. Установить в .vimrc

      """"""""""""""""""""""""""""""""""
      " cscope配置
      """"""""""""""""""""""""""""""""""
      if has("cscope")
          " 设置cscope的命令位置
          set csprg=/usr/local/bin/cscope
          " 设定quickfix来显示cscope的结果
          set cscopequickfix=s-,c-,d-,i-,t-,e-
          " 先搜索tags标签文件,在搜索cscope数据库
          set csto=1
          " 使用cstag查询,也就是同时搜索cscope数据库和tags标签文件
          set cst
          " 不显示添加数据库是否成功
          set nocsverb
          "
          if filereadable("cscope.out")
          " 添加当前目录下的cscope数据库
          cs add cscope.out
          else
          " 添加vim自带的cscope数据库
          " gnu c 数据库
          cs add ~/.vim/tags/glibc-2.22/cscope.out ~/.vim/tags/glibc-2.22
          endif
          " 显示添加数据库成功
          set csverb
      endif
      
      " 映射快捷键"<C-_>g的按法是先按"Ctrl+Shift+-", 然后很快再按"g"
      " 查找本 C 符号(可以跳过注释)
      nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR>
      "查找本定义
      nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>
      "查找调用本函数的函数
      nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR>
      "查找本字符串
      nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR>
      "查找本 egrep 模式
      nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR>
      "查找本文件
      nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
      "查找包含本文件的文件
      nmap <C-_>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
      "查找本函数调用的函数
      nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR>
      

tagbar

Плагин tagbar — это плагин с функциональностью, аналогичной taglist, но он лучше, чем taglist, и отлично работает с NERDTree.

  1. Преимущества тагбаров

    • Отображается список функций, поддерживающих заголовочные файлы.

    Внимательные читатели могут обнаружить, что панель тегов также различает уровни видимости функций, используя + – # и раскрашивая их.

    • Улучшенная объектно-ориентированная поддержка

    Хотя в taglist также будет указан список классов, но в целом он по-прежнему очень неинтуитивен.

    • Автоматически перестраивать на основе времени модификации файла

    На данный момент работа со списком тегов очень плохая, фактически этого можно добиться с помощью этой временной метки.

  2. Установка и настройка в vim

    call vundle#begin('~/.vim/bundle/')
    " 替换taglist的插件[tagbar]
    Plugin 'majutsushi/tagbar'
    call vundle#end()  
    
    """"""""""""""""""""""""""""""""""
    " tagbar配置
    """"""""""""""""""""""""""""""""""
    " 启动时自动focus
    let g:tagbar_autofocus=1
    " <F10>打开/关闭Tagbar
    nnoremap <silent> <F10> :TagbarToggle<CR>
    

rainbow

Этот плагин тоже необходим.Основная функция этого плагина - различать парные (){}[] разными цветами, что очень удобно для того, чтобы видеть объем скобок.

  1. Установка и настройка в Vim

    call vundle#begin('~/.vim/bundle/')
    " 括号显示增强
    Plugin 'luochen1990/rainbow'
    call vundle#end()  
    
    """"""""""""""""""""""""""""""""""
    " rainbow配置
    """"""""""""""""""""""""""""""""""
    " rainbow激活
    let g:rainbow_active = 1
    
  2. Добавить функцию автозапуска в радугу

    if (exists('g:rainbow_active') && g:rainbow_active)
        auto syntax * call rainbow#hook()
        auto colorscheme * call rainbow#show()
        " 下面这命令使rainbow在vim启动时被打开
        autocmd VimEnter * nested call rainbow#toggle()
    endif
    

syntastic

Это очень полезный плагин, он может проверять синтаксис и стиль кодирования в режиме реального времени, и его можно использовать, чтобы почти не делать ошибок компиляции после завершения кодирования. И он также включает инструмент статической проверки: lint, который может сделать ваш код более совершенным. Более мощный, он поддерживает почти сотню языков программирования, например встроенный компилятор реального времени. После возникновения ошибки очень удобно прыгнуть не туда. Пример этого показан на рисунке ниже:nerdcommenter

  1. Установка и настройка в vim

    call vundle#begin('~/.vim/bundle/')
    " 语义高亮
    Plugin 'scrooloose/syntastic'
    call vundle#end()  
    
    """"""""""""""""""""""""""""""""""
    " syntastic配置
    """"""""""""""""""""""""""""""""""
    " 首次打开和保存时都要进行语义检查
    let g:syntastic_check_on_open = 1  
    " 设置错误提示符'x'
    let g:syntastic_error_symbol = 'x'  
    " 设置警告提示符'!'
    let g:syntastic_warning_symbol = '!'  
    " 当鼠标放在错误行则显示错误信息
    let g:syntastic_enable_balloons = 1  
    " 保存退出时不用进行语义检测
    let g:syntastic_check_on_wq = 0
    " 编译有误则错误窗口显示,否在不显示
    let g:syntastic_auto_loc_list = 1
    " 错误总会填充到错误窗口
    let g:syntastic_always_populate_loc_list = 1
    

YouCompleteMe

Автодополнение кода в YouCompleteMe полностью на уровне компилятора, не ниже, чем в Visual Assist. Он основан на LLVM/clang, компиляторе, поддерживаемом Apple для замены GNU/GCC, именно потому, что YouCompleteMe имеет поддержку компилятора и больше не сопоставляется на основе текста, как предыдущие плагины, поэтому точность как это высокий. Более того, это архитектура C/S, она будет создавать серверную часть локально, использовать clang для разбора кода, а затем возвращать результат клиенту, поэтому она также решает проблему скорости различных подключаемых модулей завершения, вызванную тем, что VIM однопоточный Критиковали за то, что он очень медленный, при его использовании вы почти не чувствуете задержки, а опыт достиг уровня Visual Assist.
Помимо завершения, у YouCompleteMe также есть очень важная роль: переход по коду, который также может обеспечить точность на уровне компилятора, сравнимую с Visual Assist и Source Insight. Пример этого показан на рисунке ниже:nerdcommenter

  1. Установите необходимое программное обеспечение

    sudo apt-get install clang llvm cmake python python-dev
    
  2. Скомпилировать вручную

    cd ~/.vim/bundle/YouCompleteMe
    ./install.sh --clang-completer
    
  3. Установка и настройка в vim

    call vundle#begin('~/.vim/bundle/')
    " 自动补全
    Plugin 'Valloric/YouCompleteMe'
    call vundle#end()  
    
    """"""""""""""""""""""""""""""""""
    " YouCompleteMe配置
    """"""""""""""""""""""""""""""""""
    " 设置YCM配置文件的路径
    let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
    " 开启关键字语法检测
    let g:ycm_seed_identifiers_with_syntax = 1
    " 自动触发补全
    let g:ycm_auto_trigger = 1
    " YCM触发的条件
    let g:ycm_semantic_triggers = {  
    \ 'c' : ['->' , '.'],
    \ 'cpp,objcpp' : ['->','.','::'],
    \ 'java,javascript,python,scala' : ['.'],
    \ 'ruby' : ['.','::'],
    \}
    " 不用每次询问.ycm_extra_conf.py位置
    let g:ycm_confirm_extra_conf=0
    " YCM也从tags文件中收集标识符
    let g:ycm_collect_identifiers_from_tags_files=1
    " 当输入注释的时候不用弹出提示
    let g:ycm_complete_in_comments=0
    " 当输入字符的时候弹出提示
    let g:ycm_complete_in_strings=1
    

СОВЕТЫ: ​​вкладка недействительна
Если вы видите окно приглашения YouCompleteMe после установки YouCompleteMe, но вы не можете использовать для автозаполнения, вы можете использовать только клавиши со стрелками вверх и вниз + Enter для выбора, вам следует проверить, включен ли режим вставки в .vimrc То есть set paste установлен. Этот режим маскирует все сопоставления и сокращения. (тот же вопрос для ultisnips)

ultisnips

Этот плагин также необходим.Основная функция этого плагина заключается в быстром вводе фиксированных блоков кода, таких как заявление об авторских правах в начале файла,#ifndef... #def... #endifС помощью этого определения макроса уценка записывает информацию заголовка сообщения в блоге jekyll. Самое главное - следовать своим привычкампользовательский блок кода, чтобы вам не пришлось тренироваться в соответствии с привычками IDE. Его динамический эффект заключается в следующем:ultisnippets

  1. Установка и настройка в vim

    call vundle#begin('~/.vim/bundle/')
    " ultisnips
    Plugin 'SirVer/ultisnips'
    " Snippets are separated from the engine
    Plugin 'honza/vim-snippets'
    call vundle#end()  
    
    """"""""""""""""""""""""""""""""""
    " ultisnips配置
    """"""""""""""""""""""""""""""""""
    " 如果使用了Valloric/YouCompleteMe,就别设置为<tab>
    let g:UltiSnipsExpandTrigger="<c-j>"
    " 前选片段
    let g:UltiSnipsJumpForwardTrigger="<C-f>"
    " 后选片段
    let g:UltiSnipsJumpBackwardTrigger="<C-b>"
    " 使用:UltiSnipsEdit打开片段定义文件时分屏位置
    let g:UltiSnipsEditSplit="vertical"
    
  2. пользовательский блок кода

Мы заметили, что в процессе установки ultisnips, помимо самой установки, мы также установили vim-сниппеты honza, и одной из основных его функций является предоставление большого количества (на данный момент 80) программных фрагментов, таких как c, python, уценка, make, sh, sql и т. д. И эти фрагменты находятся в папке .vim/bundle/vim-snippets/snippets. Кроме того, мы также можем настроить наши собственные блоки кода.Рекомендуется поместить их в каталог .vim/UltiSnippets (тот же уровень, что и пакет).С одной стороны, блоки кода в .vim/bundle/vim-snippets/ snippets — это чей-то git-проект. С другой стороны, файлы в .vim/UltiSnippets могут переопределять конфигурацию в vim-snippets, что больше соответствует целям DIY. В Интернете не так много ресурсов о том, как писать сниппеты, но даются следующие предложения: * Просмотрите код в .vim/bundle/vim-snippets/snippets * пройти через:help snippets Ознакомьтесь с справочной документацией ultisnips * Сообщение блогаНастройте свои собственные блоки кодаобразцы в

    ```sh
    ## head Jekyll写博文时插入的头文件信息
    snippet head "Jekyll post header" b # b代表begin(snippet should be expanded only at the beginning of a line )
    ---
    layout:       default
    title:        ${1:blog_name}
    category:     [${2:cate1,cate2}]
    comments:     true
    date:         `!v strftime("%Y-%m-%d %H:%M:%S")`
    ---
    ${0}        # 代表tab最终停留的位置

    endsnippet
    ```

tabular

Это обязательный плагин для Дев или кодеров, потому что, когда вы видите беспорядочную типографику кода/текста — знаки равенства, двоеточия, таблицы и т. д. не выстраиваются в линию, вы должны сойти с ума. Табличный плагин прекрасно решает эту проблему. Как и в легенде ниже, просто введите команду:Tabularize /*(* представляет выровненный символ):
tabular

  1. Установка и настройка в Vim

    call vundle#begin('~/.vim/bundle/')
    " tab对齐
    Plugin 'godlygeek/tabular'
    call vundle#end()  
    
    """"""""""""""""""""""""""""""""""
    " tabular配置
    """"""""""""""""""""""""""""""""""
    " 目前还尚在摸索中
    

vim-markdown

vim-markdown — это плагин для семантической подсветки и сопоставления правил собственного синтаксиса уценки и расширенного уценки.

  1. Установка и настройка в vim

    call vundle#begin('~/.vim/bundle/')
    " markdown语义高亮
    Plugin 'plasticboy/vim-markdown'
    call vundle#end()
    
    """"""""""""""""""""""""""""""""""
    " tabular配置
    """"""""""""""""""""""""""""""""""
    " vim识别md
    autocmd BufNewFile,BufReadPost *.md set filetype=markdown
    let g:vimmarkdownfoldingdisabled=1 "取消代码折叠
    let g:vimmarkdownnodefaultkeymappings=1 "取消默认的键对应
    let g:vimmarkdownmath=1 "使用数学符号
    let g:vimmarkdownfrontmatter=1 "高亮YMAL frontmatter
    

[предварительный просмотр синхронизации уценки][предварительный просмотр уценки]

markdown-preview — это подключаемый модуль, используемый для перевода файла уценки, открытого vim, в html и отображения его в браузере.Изюминкой этого подключаемого модуля является обновление в реальном времени.

  1. Установка и настройка в Vim

    call vundle#begin('~/.vim/bundle/')
    " markdown同步显示
    Plugin 'iamcco/mathjax-support-for-mkdp'
    Plugin 'iamcco/markdown-preview.vim'
    call vundle#end()
    
    """"""""""""""""""""""""""""""""""
    " markdown-preview.vim配置
    """"""""""""""""""""""""""""""""""
    " 设置启动chrome浏览器的命令
    let g:mkdp_path_to_chrome = "open -a Google\\ Chrome"
    " 设置为1则打开markdown文件时自动打开浏览器
    let g:mkdp_auto_start = 1
    " 设置为1则在编辑markdown的时候预览窗口是否打开,未开则自动打开
    let g:mkdp_auto_open = 1
    " 切换buffer时自动关闭预览窗口,设置为0则在切换buffer时不自动关闭
    let g:mkdp_auto_close = 1
    " 设置为1则只有在保存文件或退出插入模式时更新预览,默认为0,实时更新预览
    let g:mkdp_refresh_slow = 0
    " 设置为1则所有文件都使用MarkdownPreview进行预览,默认只有markdown文件可以
    let g:mkdp_command_for_global = 0
    

emmet-vim

Предшественник Emmet называется Zen Coding, это внешний плагин. Официально поддерживает многие программы, такие как Sublime Text, Notepad++, Dreamweaver, Eclipse, Adobe Brackets и т. д. Emmet.vim не принадлежит Эммету, а разработан японцем Ясухиро Мацумото. Для фронтенд-разработчиков это артефакт, который может сэкономить много повторяющейся работы по кодированию. Ввиду отсутствия front-end разработки здесь просто отметка.

использованная литература

  1. забавная вим-игра
  2. Руководство по изучению Vim
  3. vim plugin
  4. Vim Script
  5. Конфигурация и описание Vim - среда программирования IDE
  6. Эффективный плагин vim
  7. Мнемосхема ВИМ
  8. Процедурный мир Vimer
  9. vimium
  10. youcompleteme
  11. syntastic
  12. python IDE
  13. ultisnips
  14. Настройте свои собственные блоки кода
  15. Артефакт разработки интерфейса Эммет
  16. Эммет Учебник
  17. Выровнять артефакт-таблицу
  18. vim-markdown

Если эта статья полезна для вас или вас интересуют технические статьи, вы можете подписаться на общедоступный аккаунт WeChat: Technical Tea Party, вы можете получать соответствующие технические статьи как можно скорее, спасибо!

技术茶话会

Эта статья опубликована на многопостовой платформеArtiPubавтоматическая публикация