2014-03-29 33 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