结合(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}
需要在要计算的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}")`
# -*- 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