dive-into-vim

Предисловие

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

При использовании инструмента управления плагинами, такого как Vundle или vim-plug, после установки мы загружаем соответствующий плагин через конфигурационный файл .vimrc в каталоге пользователя, а затем в папке .vim в каталоге пользователя находится папка, соответствующая соответствующему плагину, в каждой папке или подпапке существует xxxx Что это такое?

Другой вопрос, читает ли Vim все свои настройки и скрипты только из ~/.vimrc?

Для начала давайте ответим на два вопроса.

(1) Файлы xxxx.vim по своей природе являются скриптами, поэтому они загружаются при запуске vim, и именно существование этих скриптов официально позволяет нам настраивать vim.

(2) Файл ~/ .vimrc — это только наша обычная пользовательская конфигурация, но есть много других мест, откуда берется конфигурация vim.

Какие скрипты на самом деле загружаются при запуске vim xxx.vim

Как упоминалось ранее, Vim очень аккуратно структурирован, и .vimrc — это всего лишь один из многих конфигурационных файлов. На самом деле, вы можете попросить Vim сообщить вам, какие именно скрипты загружены.

Откройте файл с помощью vim и выполните следующую команду:

# 查看vim加载时加载了那些插件(执行了哪些脚本)
:scriptnames 

  1: /usr/share/vim/vimrc
  2: /usr/share/vim/vim81/debian.vim
  3: /usr/share/vim/vim81/syntax/syntax.vim
  4: /usr/share/vim/vim81/syntax/synload.vim
  5: /usr/share/vim/vim81/syntax/syncolor.vim
  6: /usr/share/vim/vim81/filetype.vim
  7: ~/.vim/ftdetect/nginx.vim
  8: ~/.vimrc
  9: /usr/share/vim/vim81/colors/space-vim-dark.vim
 10: /usr/share/vim/vim81/plugin/getscriptPlugin.vim
 11: /usr/share/vim/vim81/plugin/gzip.vim
 12: /usr/share/vim/vim81/plugin/logiPat.vim
 13: /usr/share/vim/vim81/plugin/manpager.vim
 14: /usr/share/vim/vim81/plugin/matchparen.vim
 15: /usr/share/vim/vim81/plugin/netrwPlugin.vim
 16: /usr/share/vim/vim81/plugin/rrhelper.vim
 17: /usr/share/vim/vim81/plugin/spellfile.vim
 18: /usr/share/vim/vim81/plugin/tarPlugin.vim
 19: /usr/share/vim/vim81/plugin/tohtml.vim
 20: /usr/share/vim/vim81/plugin/vimballPlugin.vim
 21: /usr/share/vim/vim81/plugin/zipPlugin.vim
 22: /usr/share/vim/vim81/scripts.vim
 23: /usr/share/vim/vim81/syntax/vim.vim
 24: /usr/share/vim/vim81/syntax/python.vim
 25: ~/.vim/plugged/vim-airline/plugin/airline.vim
 26: ~/.vim/plugged/vim-airline/autoload/airline/init.vim
 27: ~/.vim/plugged/vim-airline/autoload/airline/parts.vim
 28: ~/.vim/plugged/vim-airline/autoload/airline/util.vim
 29: ~/.vim/plugged/vim-easy-align/plugin/easy_align.vim
Войдите в полноэкранный режим Выход из полноэкранного режима

Список длиннее, чем вы ожидали? Мы обнаружили, что множество скриптов xxx.vim файлов были загружены из разных мест (т.е. в разных папках) (потому что у меня здесь установлено несколько плагинов, у некоторых их может быть не так много, количество не всегда одинаково). И мы обнаруживаем, что загружаются не только те плагины, которые мы сами установили из папки .vim, но и многие другие из других мест, откуда это взялось? Подробнее об этом позже.

Это фактически тот же скрипт, который vim загружает при запуске, и чем больше скриптов, тем больше времени они отнимают. Если у вас установлено много плагинов, то редактору придется проделать много работы.

Проверка времени запуска vim

vim --startuptime start.log test1.py
Войдите в полноэкранный режим Выход из полноэкранного режима

Когда вы открываете этот файл test1.py, создается файл журнала start.log.

times in msec
 clock   self+sourced   self:  sourced script
 clock   elapsed:              other lines

000.014  000.014: --- VIM STARTING ---
000.415  000.401: Allocated generic buffers
000.717  000.302: locale set
000.734  000.017: window checked
001.838  001.104: inits 1
002.059  000.221: parsing arguments
002.063  000.004: expanding arguments
002.094  000.031: shell init
002.794  000.700: Termcap init
002.844  000.050: inits 2
003.193  000.349: init highlight
006.708  002.160  002.160: sourcing /usr/local/share/vim/vim82/syntax/syncolor.vim
007.073  002.654  000.494: sourcing /usr/local/share/vim/vim82/syntax/synload.vim
021.470  014.263  014.263: sourcing /usr/local/share/vim/vim82/filetype.vim
021.561  017.365  000.448: sourcing /usr/local/share/vim/vim82/syntax/syntax.vim
021.671  000.022  000.022: sourcing /usr/local/share/vim/vim82/filetype.vim
022.298  000.327  000.327: sourcing /usr/local/share/vim/vim82/syntax/syncolor.vim
023.018  000.311  000.311: sourcing /usr/local/share/vim/vim82/syntax/syncolor.vim
023.498  000.315  000.315: sourcing /usr/local/share/vim/vim82/syntax/syncolor.vim
024.292  002.567  001.614: sourcing /root/.vim/colors/molokai.vim
027.588  003.206  003.206: sourcing /root/.vim/autoload/plug.vim
031.007  001.300  001.300: sourcing /usr/local/share/vim/vim82/ftoff.vim
044.017  000.408  000.408: sourcing /root/.vim/plugged/vim-go/ftdetect/gofiletype.vim
044.226  011.661  011.253: sourcing /usr/local/share/vim/vim82/filetype.vim
044.435  000.064  000.064: sourcing /usr/local/share/vim/vim82/ftplugin.vim
044.607  000.054  000.054: sourcing /usr/local/share/vim/vim82/indent.vim
044.775  041.278  005.039: sourcing $HOME/.vimrc
044.785  000.314: sourcing vimrc file(s)
045.472  000.173  000.173: sourcing /root/.vim/plugged/vim-airline/autoload/airline/init.vim
046.018  000.142  000.142: sourcing /root/.vim/plugged/vim-airline/autoload/airline/parts.vim
047.723  000.339  000.339: sourcing /root/.vim/plugged/vim-airline/autoload/airline/util.vim
047.793  002.877  002.223: sourcing /root/.vim/plugged/vim-airline/plugin/airline.vim
048.251  000.357  000.357: sourcing /root/.vim/plugged/vim-easy-align/plugin/easy_align.vim
048.429  000.084  000.084: sourcing /root/.vim/plugged/neodark.vim/plugin/neodark.vim
049.881  001.103  001.103: sourcing /root/.vim/plugged/vim-go/autoload/go/config.vim
051.495  000.824  000.824: sourcing /root/.vim/plugged/vim-go/autoload/go/util.vim
...
...
中间省略
...
...
084.259  000.044  000.044: sourcing /root/.vim/plugged/vim-airline/autoload/airline/extensions/keymap.vim
091.665  000.092  000.092: sourcing /root/.vim/plugged/vim-airline/autoload/airline/themes.vim
092.103  000.665  000.573: sourcing /root/.vim/plugged/vim-airline/autoload/airline/themes/dark.vim
120.187  000.269  000.269: sourcing /root/.vim/plugged/vim-airline/autoload/airline/builder.vim
120.828  000.132  000.132: sourcing /root/.vim/plugged/vim-airline/autoload/airline/extensions/default.vim
190.934  110.326: opening buffers
190.988  000.054: BufEnter autocommands
191.000  000.012: editing files in windows
191.559  000.559: VimEnter autocommands
191.561  000.002: before starting main loop
194.803  003.242: first screen update
194.806  000.003: --- VIM STARTED ---
Войдите в полноэкранный режим Выход из полноэкранного режима

Как вы можете видеть, для открытия файла test1.py с помощью vim потребовалось 194,806 миллисекунд.

Запуск vim в чистом виде (без плагинов)

#  --clean  'nocompatible', Vim defaults, no plugins, no viminfo,
#  即仅仅使用默认的vim设置,不加载插件,也不启用其它的vimrc的配置等。
#  vim8.0版本可以使用--clean参数,vim7.4版本似乎没有这么参数,所以还是更新一下vim到新版本
vim --clean --startuptime start3.log test1.py
Войдите в полноэкранный режим Выход из полноэкранного режима

Открытие файла start3.log показывает, что общее количество миллисекунд составляет 022,682.

...
省略前面的
...
022.208  000.032: VimEnter autocommands
022.209  000.001: before starting main loop
022.680  000.471: first screen update
022.682  000.002: --- VIM STARTED ---
Войдите в полноэкранный режим Выход из полноэкранного режима

Путь поиска для загрузки времени выполнения vim

Чтобы определить, какие скрипты будут запущены при запуске или при загрузке буфера, Vim выполняет итерацию по ‘runtimepath’. Параметр представляет собой список каталогов, разделенных запятыми, каждый из которых имеет последовательную структуру.

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

Прохождение пути поиска runtimepath

После запуска vim выполните

:set runtimepath
Войдите в полноэкранный режим Выход из полноэкранного режима

Получите следующий результат.

  runtimepath=~/.vim,
  ~/.vim/plugged/vim-airline,
  ~/.vim/plugged/vim-easy-align,
  ~/.vim/plugged/neodark.vim,
  ~/.vim/plugged/vim-monokai,
  ~/.vim/plugged/vim-colors-github,
  ~/.vim/plugged/vim-one,
  ~/.vim/plugged/vim-go,
  ~/.vim/plugged/vim-godef,
  ~/.vim/plugged/nerdtree,
  ~/.vim/plugged/vim-nerdtree-tabs,
  ~/.vim/plugged/nerdtree-git-plugin,
  /usr/local/share/vim/vimfiles,
  /usr/local/share/vim/vim82,
  /usr/local/share/vim/vimfiles/after,
  ~/.vim/after
Войдите в полноэкранный режим Выход из полноэкранного режима

Краткое описание каталогов, содержащихся в runtimepath

  • ~/.vim

    • Домашний каталог, в котором вы можете сохранить свои личные предпочтения.
  • /usr/local/share/vim/vimfiles

    • Общесистемный каталог vim, в котором хранятся файлы, определенные системным администратором.
  • /usr/local/share/vim/vim81

    • т.е. $VIMRUNTIME, содержит файлы, распространяемые вместе с vim.
  • /usr/local/share/vim/vimfiles/after

    • Каталог «after» в общесистемном каталоге Vim. Системный администратор может использовать этот каталог для отмены настроек по умолчанию или добавления новых.
  • ~/.vim/after

    • Каталог ‘after’ в домашнем каталоге. Этот каталог можно использовать для отмены настроек по умолчанию или системных настроек личными предпочтениями, а также для добавления новых настроек.

Эти каталоги обрабатываются по порядку, поэтому если и есть что-то особенное в каталоге «after», так это то, что он находится в конце списка. В действительности в «после» нет ничего особенного.

При обработке каждого каталога Vim ищет вложенные папки с определенным именем. Подробнее об этом. См. :help runtimepath

  • плагин/
    • Файлы сценариев Vim, которые автоматически загружаются при редактировании любого типа файлов, называются «глобальными плагинами».
  • автозагрузка/

    • (Не путать с «плагинами»). Сценарии в автозагрузке содержат функции, которые загружаются только по запросу других сценариев.
  • ftdetect/

    • Сценарий для определения типов файлов. Тип файла может быть определен по расширению файла, местоположению или внутреннему содержимому файла.
  • ftplugin/

    • Сценарий, который будет выполняться при редактировании файлов известного типа.
  • компилятор/

    • Определяет, как запускаются различные компиляторы или инструменты форматирования и как разбирается их вывод. Может использоваться совместно несколькими ftplugins. Он не выполняется автоматически и должен быть вызван через :компилятор.
  • пакет/

  • Собственный каталог пакетов Vim 8, который использует формат «Pathogen» для управления пакетами. Встроенная система управления пакетами не требует использования стороннего кода.

Пользовательская установка плагинов сторонних производителей

Плагины в vim — это, по сути, скрипты, в Vim они просто скрипты и должны быть помещены в нужное место в пути выполнения, чтобы быть выполненными.

инструменты управления плагинами vim

  • Vundle

  • vim-plug

  • Пакеты Vim 8

встроенный менеджер пакетов vim8

Наиболее стабильным способом управления плагинами является использование встроенной в Vim8 функции менеджера пакетов, которая не требует стороннего кода.

Сначала создайте каталог пакета в папке .vim в каталоге пользователя, затем создайте два подкаталога opt и start в каталоге пакета.

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

mkdir -p ~/.vim/pack/{自定义名称}/{opt,start}
Войдите в полноэкранный режим Выход из полноэкранного режима

Обратите внимание на пользовательское имя. Это имя полностью зависит от вас. Мы используем его для распределения пакетов по категориям. Большинство людей сваливают все свои плагины в бессмысленную категорию, и это совершенно нормально. Теоретически вы можете создать несколько категорий, например, ~/.vim/pack/navigation, ~/.vim/pack/linting и т.д., но, конечно, я могу поместить их все в каталог foobar.

Vim не определяет дубликаты между категориями, если есть дубликаты, они будут загружены дважды.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *