Отступ Vimscript и отладка скриптов ftplugin - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь вручную определить уровни отступа для .tex файлов с помощью скриптов ftplugin.

~/.vim/ftplugin/tex/indent.vim:

      1 setlocal indentexpr=TeXIndent(v:lnum)
      2
      3 function! TeXIndent(lnum)
      4     if a:lnum == 0
      5         return 0
      6     endif
      7
      8     let prev = getline(a:lnum - 1)
      9     let line = getline(a:lnum)
     10
     11     " sections have hardcoded indentation; environments are always subordinate to sections
     12     if prev =~ '^\s*\\section'
     13         return 1
     14     elseif prev =~ '^\s*\\subsection'
     15         return 2
     16     elseif prev =~ '^\s*\\subsubsection'
     17         return 3
     18     elseif prev =~ '^\s*\\paragraph'
     19         return 4
     20     " environment indentation
     21     elseif prev =~ '\\begin'
     22         return indent(a:lnum - 1) + 1 " increase indentation by 1 if previous line has \begin
     23     elseif line =~ '\\end'
     24         return indent(a:lnum - 1) - 1 " decrease indentation by 1 if line has \end
     25     else
     26         return indent(a:lnum - 1) " use previous indentation
     27     endif
     28 endfunction

Когда я набираю \section, я ожидаю нажатия enter, чтобы переместить курсор на уровень отступа 1 в следующей строке (то же самое для других условий, указанных в TeXIndent), и это не так. Тестирование с помощью более простой функции, которая каждый раз возвращает 2, также не демонстрирует этого поведения, поэтому я подозреваю, что мой подход ошибочен. Как добиться ожидаемого поведения?

В целом, как можно отлаживать скрипты ftplugin?

1 Ответ

0 голосов
/ 21 июня 2020

Все обычные подходы доступны при отладке ftplugin.

  • :debug exe "normal keysequence" можно использовать для отладки сопоставления
  • :debug Command можно использовать для отладки команды, функция (с :debug call или :debug echo) ...
  • :verbose может использоваться, чтобы узнать, что на самом деле определено и где оно было определено - см. этот специальный вопрос / ответ на vi.SE : https://vi.stackexchange.com/q/7722/626
  • журналы также могут быть использованы - см. моя структура
  • мы даже можем добавить некоторые утверждения для быстрого сбоя при программировании ошибки - см. мой другой фреймворк (из того же плагина библиотеки)

Теперь ваша проблема не в ftplugins, а в выражениях отступа. Если я не ошибаюсь, он сталкивается с теми же проблемами, что и с выражением свертки: функция отступа / сворачивания автоматически вызывается Vim один раз для каждой строки. Сообщения будут отключены, внутреннее использование :debug закончится кошмарами.

Что мы можем сделать:

  • записать в файл или в другое место, например в окно qf

  • не переводите ie функцию в v:lnum, чтобы иметь возможность вызывать эту функцию независимо. Это прекрасно, это то, что вы уже сделали. Мы можем проверить ответ на все вызовы с помощью

      :echo map(range(1, line('$')), 'the_expr_function(v:val)')
    
  • играть с воздушными шарами (требуется gvim вместо vim)

  • играть со знаками

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

(См. Также этот Q / A на vi.SE: https://vi.stackexchange.com/a/19916/626)

PS: плагины отступа должны go в {rtp}/indent/, а не {rtp}/ftplugin/, и мы обычно анализируем последнюю непустую строку. Вы должны найти примеры в $VIMRUNTIME/indent, и у меня есть несколько плагинов для отступов TeX, написанных Йоханнесом Зеллнером примерно в 2002 году.

...