2011-11-10 83 views
2

在展開yasnpet之前是否可以替換字符?在展開yasnpet之前替換字符

說我有下面的代碼片段:

# -*- mode: snippet -*- 
# name: foo 
# key: foo 
# -- 
~bar$0 

我寫foo並按標籤擴大它,我得到~bar或明確說明其中第一行是擴張和膨脹後的第二個之前:現在

foo[Tab] 
~bar 

,想象我想要的片段直接刪除光標前的任何可能的空間(即1 ñ直接在空格之前)擴展代碼片段之前。

說我有以下文字

word word 

而且我把光標這樣

word [cursor]word 

,並進入片斷關鍵

word foo[cursor]word 

現在我擴大片斷通過按標籤,我想要下面的h appen

word~bar[cursor]word 

請注意,代碼段之前的空格被刪除,因此代碼段會直接插入第一個單詞之後。我怎樣才能做到這一點?這在上面定義的片段中不會發生。什麼情況是

word ~bar[cursor]word 

回答

1

這適用於從here最新yasnippet:

# -*- mode: snippet -*- 
# name: foo 
# key: foo 
# -- 
~bar${0:$$(save-excursion (goto-char (overlay-start (yas/snippet-control-overlay (first (yas/snippets-at-point))))) 
          (delete-char (- (skip-chars-backward " "))))} 
+0

恐怕不起作用。它插入所有代碼而不是執行它。我認爲lisp代碼需要寫在'\''內,但是爲你的代碼做這件事會導致elisp錯誤。 –

+0

你使用的是什麼版本的yasnippet?如果您沒有使用VCS的最新版本,請升級。 –

+0

另外,yasnippet項目頁面上有非常好的文檔。儘管我不得不通過源頭挖掘一點。 –

2

貌似可以嵌入一些Lisp代碼到你的模板中使用`。所以,我想你可以這樣做:

`(if (string= " " (string (preceding-char))) (backward-delete-char))` 
+0

你介意包括一個完整的片段定義? –

+0

我嘗試了'$ {1:\'(if(string =「」(string(preceding-char)))(backward-delete-char))''〜bar $ 0',但它並不像我想要的那樣。它不刪除前面的空格,它只將光標放在'bar'的第一個字母之前。 –

+0

我做了一些測試,並得到了一些工作 –