Фрагмент заголовка в реструктурированном тексте в vs code

В реструктурированном тексте заголовки записываются таким же количеством неалфавитно-цифровых 7-битных символов ASCII, как и текст заголовка. Подчеркивание и надчеркивание, если используются оба, должны быть равными и по крайней мере такими же длинными, как текст заголовка. Из официальной документации:

Заголовки подчеркиваются (или перечеркиваются и подчеркиваются) печатным небуквенно-цифровым 7-битным символом ASCII. Рекомендуемые варианты: = - ` : ' " ~ ^ _ * + # < >. Длина подчеркивания/надчеркивания должна быть не меньше длины текста заголовка.

Пример названия

=========================================================
Main titles are written using equals signs over and under
=========================================================

Я хочу создать для этого фрагмент кода VS. Что я мог сделать, так это только это,

"Title RST": {
    "prefix": "title",
    "body": [
      "="
      "$1"
      "=\n"
      "$0"
    ],
    "description": "Title for restructured text"
  }

Есть ли способ узнать длину текста, который будет напечатан, и, соответственно, вставить одинаковое количество надчеркиваний и подчеркиваний =.

В yasnippet в emacs это делается так:

${1:$(make-string (string-width yas-text) ?\=)}
${1:Title}
${1:$(make-string (string-width yas-text) ?\=)}

$0

Любая помощь, как реализовать такой фрагмент в коде VS? Я просмотрел фрагменты в расширении restructured text для VS Code здесь но не смог найти то, что подходит для моих нужд.


person Suman Khanal    schedule 17.11.2020    source источник
comment
docs.restructuredtext.net/articles/section.html   -  person Lex Li    schedule 17.11.2020


Ответы (1)


  "Title RST": {
    "prefix": "title",
    "body": [
      "${1/./=/g}",
      "$1",
      "${1/./=/g}",
      "$0"
    ],
    "description": "Title for restructured text"
  },

Преобразования ${1/./=/g} просто заменяют каждый символ в вашем тексте $1 на = в строке выше и ниже вашего текста.

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

Когда вы наберете текст, нажмите Tab, и преобразование будет завершено.

преобразование фрагмента


Вы спросили, возможно ли сделать так, чтобы надчеркивания/подчеркивания отображались как =s сразу после ввода текста заголовка. Но это невозможно с фрагментами vscode, требуется преобразование, и это не произойдет до Tab.

Это можно сделать с помощью версии HyperSnips (настройка немного сложнее, чем простые фрагменты vscode, но не так много):

snippet title "Title" A
``rv =  '='.repeat(t[0].length)``
$1
``rv = '='.repeat(t[0].length)``
endsnippet

Демонстрация HypeSnips

person Mark    schedule 17.11.2020
comment
Отличный обходной путь. Но есть ли способ получить = надчеркивание и подчеркивание при вводе заголовка после трех строк и нажатии Tab›? - person Suman Khanal; 18.11.2020
comment
Нет, не с простыми фрагментами vscode, преобразование в = может произойти только на вкладке. Есть расширение HyperSnips, которое позволяет делать то, что вы хотите. - person Mark; 18.11.2020
comment
Я отредактировал ответ, чтобы показать версию HyperSnips. Они более эффективны, чем фрагменты vscode, потому что они могут запускать javascript. - person Mark; 18.11.2020
comment
Именно то, что я хотел. Спасибо. - person Suman Khanal; 18.11.2020