Настройка 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}

person lawlist    schedule 29.03.2014    source источник


Ответы (3)


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

# -*- mode: snippet -*-
# contributor: lawlist
# key: bold
# name: bold
# binding: TAB <f6>
# --
`(if (region-active-p)
   (concat
     "{\\\\bf "
     yas-selected-text
     "}")
   "{\\\\bf $1}")`
person lawlist    schedule 16.05.2015
comment
@PaulPichaureau - я использую это решение уже 2 года без каких-либо проблем. Пожалуйста, предоставьте некоторые подробности о том, что еще вы пробовали и какое решение (если таковое имеется) вы нашли. Люди, читающие эту ветку, понятия не имеют, есть ли у вас опыт работы с Emacs, включая, помимо прочего, опыт настройки и использования библиотеки yasnippet. Опубликовать комментарий о том, что это не работает, и поставить минус без каких-либо дополнительных объяснений, оказывает другим медвежью услугу. Насколько нам известно, у вас может быть что-то не так с настройкой, из-за которой этот ответ не работает должным образом. - person lawlist; 17.02.2017
comment
Я протестировал этот фрагмент на MacOS, emacs 25.1, последней версии yasnippet и файле инициализации, состоящем всего из трех строк: (require 'package) (package-initialize) (yas-global-mode 1). Это не работает. Возможно, в вашей конфигурации есть что-то особенное, благодаря чему этот фрагмент работает. Можете ли вы предоставить некоторые подробности? - person Paul Pichaureau; 04.04.2017
comment
@PaulPichaureau - в более старой версии yasnippet нажатие tab с последующим f6 вызывает команду yas-expand-from-keymap. Сегодня я загрузил последнюю версию yasnippet -- tab+f6 вызывает yas-expand (привязано к yas-minor-mode-map). Моя старая версия yasnippet даже не имеет этой переменной. Чтобы протестировать этот фрагмент, выделите/выберите текст, который вы хотите окружить, а затем используйте раскрывающееся меню в строке меню, чтобы выбрать этот bold фрагмент, и он будет правильно окружать текст. Может потребоваться отладка резервного поведения для yas-expand. - person lawlist; 04.04.2017

Я использую этот фрагмент для условного переноса переменных в литералы шаблонов 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
person Bae    schedule 28.07.2017

person    schedule
comment
Спасибо за первый шаг к решению. При использовании самой последней версии Yasnippet (0.8.0) с Emacs Trunk, созданной 19 марта 2014 г., выбранная область удаляется, а не окружается фрагментом. Протестировано с практически пустым файлом .emacs и только с установкой Yasnippet, т. е. файл .emacs содержит: (require 'package) (package-initialize) (require 'yasnippet) (yas-global-mode 1) - person lawlist; 01.04.2014
comment
Фрагмент работает нормально для меня, поэтому есть некоторая среда, которая заставляет его работать. У меня delete-selection-mode отключено, но cua-selection-mode включено, поэтому мой выбор все равно удаляется, когда я набираю текст. Может быть, попробуйте поставить (let (delete-selection-mode) ...) вокруг if. - person jpkotta; 01.04.2014
comment
Кроме того, я использую yasnippet 20140314 от melpa и Emacs 24.3.1. - person jpkotta; 01.04.2014
comment
Возможно, в Yasnippet есть другая переменная, которую необходимо установить (например, yas-wrap-around-region), чтобы ваше решение работало. Я открою исходный код в ближайшие несколько дней и посмотрю, смогу ли я его отследить. - person lawlist; 02.04.2014
comment
FWIW, у меня нет настроек yasnippet. Я просто переупорядочиваю yas-prompt-functions и включаю yas-global-mode. - person jpkotta; 02.04.2014