Конфигуриране на 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 съхранява текста на избрания регион, който може да се използва за повторно вмъкване на същия текст по време на създаването на фрагмента. Четири (4) обратни наклонени черти са необходими за всяка една (1) обратна наклонена черта.

# -*- 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 и init файл само с три реда: (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