Настройка Yasnippet для двух сценариев - (1) регион активен; (2) регион не активен

В сочетании с пользовательской конфигурацией (delete-selection-mode 1)Есть ли способ объединить два следующих Yasnippets в один фрагмент, чтобы он работал по-разному в зависимости от того, активен ли регион. Например: (if (region-active-p) (yas/selected-text) "$1")

Активная область - окружить активную область фрагментом:

# -*- mode: snippet -*-
# contributor: lawlist
# key: bold_selected
# name: bold_selected
# binding: C-I b b s
# --
{\bf `yas/selected-text`}

Неактивная область - вставьте фрагмент и поместите курсор в положение $1:

# -*- mode: snippet -*-
# contributor: lawlist
# key: bold
# name: bold
# binding: C-I b b b
# --
{\bf $1}

3 ответа

Решение

Галочки вокруг elisp код для оценки не требуется. Встроенная переменная yas-selected-text хранит текст выбранной области, который можно использовать для повторной вставки того же текста во время создания фрагмента. Четыре (4) обратных слеша необходимы для каждого (1) обратного слеша.

# -*- mode: snippet -*-
# contributor: lawlist
# key: bold
# name: bold
# binding: TAB <f6>
# --
`(if (region-active-p)
   (concat
     "{\\\\bf "
     yas-selected-text
     "}")
   "{\\\\bf $1}")`
# -*- mode: snippet -*-
# name: bold
# key: bold
# type: command
# --
(if (region-active-p)
    (yas-expand-snippet "{\\bf `yas-selected-text`}")
  (yas-expand-snippet "{\\bf $0}"))

Я использую этот фрагмент для условного переноса переменных в литералах шаблона JavaScript.

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

# -*- coding: utf-8; mode: snippet -*-
# name: wrap variable in string template to log its value `var=${var}`
# expand-env : ((yas-wrap-around-region nil))
# --
${1:`(if (region-active-p) (yas-selected-text) "var")`}=\${$1}$0

Для вашей проблемы этот фрагмент, кажется, работает

# -*- coding: utf-8; mode: snippet -*-
# name: wrap selected text, or user provided text, in bold font
# expand-env: ((yas-wrap-around-region nil))
# --
{\bf ${1:`(if (region-active-p) (yas-selected-text) "text-to-bold")`}}$0
Другие вопросы по тегам