2014-03-29 42 views
2

结合用户配置(delete-selection-mode 1),是否有办法将以下两个Yasnpepets合并为一个片段,以便根据该区域是否处于活动状态而工作不同。例如:(if (region-active-p) (yas/selected-text) "$1")为两个场景配置Yasnippet - (1)区域处于活动状态; (2)区域未激活

有源区 - 围绕有源区域与所述片段:

# -*- 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} 

回答

2

需要评估包含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}")` 
+0

不起作用。它产生:'{\\ bf $ 1}'。 –

+0

@PaulPichaureau - 我一直在使用这个解决方案2年没有任何问题。请提供一些关于您已经尝试过的以及您找到的解决方案(如果有)的详细信息。阅读此主题的人不知道您是否拥有任何Emacs体验,包括但不限于配置和使用'yasnippet'库。要发表评论说它不起作用,并在没有任何进一步解释的情况下倒下来,其他人就不会受到伤害。对于我们所知道的,您的设置可能有问题,导致此答案无法正常工作。 – lawlist

+0

我已经在MacOS,emacs 25.1,yasnippet的最后一个版本以及只有三行的初始化文件上测试了这个片段:(require'package)(package-initialize) (yas-global-mode 1)。它不起作用。也许你在你的配置上有一些特别的东西,使得这个代码片段工作。你能提供一些细节吗? –

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}")) 
+0

感谢您抽出宝贵的第一刺伤的解决方案。当2014年3月19日使用带有Emacs Trunk的最新版本的Yasnippet(0.8.0)时,所选区域将被删除而不是被代码段包围。测试一个几乎为空的'.emacs'文件,只安装Yasnippet - 即'.emacs'文件包含:'(require-package)(package-initialize)(require'yasnippet)(yas-global-mode 1 )' – lawlist

+0

这段代码对我来说确实很好,所以有一些环境可以使它工作。我禁用了'delete-selection-mode',但我确实启用了'cua-selection-mode',因此无论如何我的文本都会被删除。也许试着在'if'周围放一个'(let(delete-selection-mode)...)'。 – jpkotta

+0

另外,我使用melpa的yasnippet 20140314和Emacs 24.3.1。 – jpkotta

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