Вопрос или проблема
Несколько лет назад все, что вам нужно было сделать, это убедиться, что плагин matchit.vim установлен, чтобы иметь возможность сопоставлять начальные/конечные конструкции в bash, такие как if/elif/else/fi, но что-то произошло, и, хотя matchit.vim включен по умолчанию в Ubuntu, эти связанные термины больше не определены.
Я поместил let b:match_words="if:elif:else:fi,while:done,until:done"
в .vimrc, и это как-то работает (если у вас есть вложенная until..done внутри while..done, это сбивается с толку).
Я надеюсь, что у кого-то есть дистрибутив, где b:match_words предопределен, и он может выполнить let b:match_words
в vi, а затем опубликовать результаты здесь (если возвращается “undefined variable”, и :scriptnames
в vi показывает, что matchit.vim загружен, то вы находитесь в таком же положении).
Ответ или решение
Вопрос, который вы подняли, довольно интересен и касается использования плагина matchit.vim в текстовом редакторе Vim, а именно его возможности сопоставления начальных и конечных конструкций в сценариях на языке bash. Несмотря на то что matchit.vim часто был встраиваемым решением для таких задач, кажется, что в какой-то момент его функциональность перестала соответствовать прежним ожиданиям, особенно на дистрибутивах Ubuntu, где он уже встроен по умолчанию.
Теория
Плагин matchit.vim был разработан для расширения функции поиска соответствий в Vim. Он позволяет пользователям легко переходить между парными конструкциями в коде, подобно тому, как это делается для скобок. Для bash-скриптов это крайне полезно, так как он может помочь в навигации между такими конструкциями, как if ... fi
, while ... done
и другими. Однако, приложение этого плагина требует настройки переменной b:match_words
, которая определяет набор соответствующих пар в зависимости от языковых конструкций. Она может быть определена в вашем .vimrc
или в файлах, загружаемых при старте Vim.
Пример
Вы упомянули, что добавили в .vimrc
следующее выражение:
let b:match_words="if:elif:else:fi,while:done,until:done"
Это определение в принципе корректно, однако оно может создавать нежелательные эффекты и путаницу, особенно в сложных случаях, где конструкции вложены друг в друга, например, until...done
внутри while...done
. Это связано с тем, что Matcher в текущей конфигурации не всегда может точно определить, какая из конструкций "done" соответствует начальной.
Применение
Для решения вашей проблемы можно предложить несколько подходов:
-
Проверить и обновить matchit.vim: Начнем с проверки, что загружена последняя версия плагина и что он правильно настроен в вашей системе. Используйте команду
:scriptnames
в Vim, чтобы убедиться, что плагин загружен и активен. Если версия устарела, стоит вручную обновить ее из публичных репозиториев или напрямую с официального сайта Vim. -
Настройка
b:match_words
: Вместо непосредственного указания этой переменной в.vimrc
возможно использовать настройки через autocmd, чтобы она применялась только к файлам bash. Например:autocmd FileType sh let b:match_words="if:elif:else:fi,while:done,until:done"
Такой подход гарантирует применение настроек конкретно для скриптов sh (bash).
-
Оптимизация и тестирование: Если конфликты все еще возникают, попробуйте использовать более сложные шаблоны для
b:match_words
. В некоторых случаях помогает использование lua-скриптов или написание специфичных фрагментов на VimL, которые могут вести себя как плагины, для повышения фрагментированности и точности поиска соответствий. -
Поиск существующих решений: Попробуйте найти конфигурации или обновленные версии matchit.vim от других пользователей на платформах, таких как GitHub, StackExchange или форумах, посвященных VIM. Некоторые пользователи могли уже решить аналогичные проблемы и поделиться своими решениями.
-
Доработка через плагины: Если проблема все еще остается нерешенной или требует более специализированного подхода, можно рассмотреть разработку или установку дополнительного плагина. Некоторые Vim-комьюнити уже разрабатывают специфические расширения для поддержки различных языков программирования.
В итоге, большую роль в успешной настройке matchit.vim играет не только сам плагин, но и грамотная настройка окружения и конфигурация Vim. Если предложенные решения не дают ожидаемого результата, возможно, стоит рассмотреть перенос части использования на альтернативные платформы для редактирования, которые могут предоставить более интуитивные инструменты для работы с bash-скриптами.