2012-03-20 60 views
0

我是abbrev-mode的粉絲,我想要一些類似的東西:你開始打字,一旦你輸入一些標點符號(或者只是一個空格就足夠了),它會調用一個函數(如果我鍵入空格當然,就像縮寫模式一樣)等效的縮寫模式,但功能?

我絕對不希望執行每一次我打了一些空間功能...

因此,而不是擴大使用abbrev-mode的縮寫,它會跑我選擇的功能。

當然,它需要與我一直使用的abbrev-mode兼容。

我該如何得到這種行爲?

+0

爲什麼有人投票這個關閉超出了我......問題很明顯。它顯然可能是非常有用的(就像縮寫模式非常有用),並且已經有一個很好的答案。 – 2012-03-20 21:09:36

回答

3

一種方法可以是使用pre-abbrev-expand-hook。我自己並沒有使用縮略模式,但是聽起來好像你可以用這種方式重新使用縮寫模式機器,並且簡單地定義一些擴展到自己(或者什麼都沒有?)的「縮寫」,然後你抓住它們在那個鉤子,並採取任何你想要的行動。

expand圖書館顯然是相關的,並提供expand-expand-hook,這可能是另一種選擇?

編輯:哎呦; pre-abbrev-expand-hook是過時的,因爲23.1

abbrev-expand-functions是正確的變量的使用方法:

包裝鉤圍繞`擴大-縮寫」。 這個特殊鉤子上的函數被一個參數調用: 一個執行縮寫擴展的函數。如果擴展發生,它應該返回 縮寫符號。

M-x find-function RET expand-abbrev RET的代碼,你也需要閱讀C-h f with-wrapper-hook RET瞭解這個鉤子是如何使用的。

+0

ah +1這聽起來像個好主意,我不確定我的Emacs-fu足夠強大,但我喜歡重複使用縮寫模式機器的想法:) – 2012-03-20 21:08:35

3

編輯: 您的修訂問題添加了一些我的答案沒有解決的關鍵細節。 phils提供了一種解決這個問題的方法。另一個將使用yasnippet。您可以在您的片斷模板任意Lisp代碼,所以你可以做這樣的事情:

# -*- mode: snippet -*- 
# name: foobars 
# key: fbf 
# binding: direct-keybinding 
# -- 
`(foo-bar-for-the-win)` 

你需要確保你的函數沒有返回任何東西,否則會在緩衝區中插入。我不使用縮略模式,所以我不知道這是否會引起衝突。 yas/snippet需要一些實驗才能使其運行,但一旦建立起來它就非常方便。

原始回答: 您可以將空間綁定到您喜歡的任何函數。您可以將所有標點鍵綁定到相同的功能或不同的功能。

(define-key your-mode-map " " 'your-choice-function) 

您可能想要在自定義模式映射中執行此操作,以便切換模式時可以返回正常行爲。在全球範圍內設置空間,但只能自行插入將無濟於事。

+0

所以我應該綁定到我自己的功能,然後調度到縮寫模式或「my-funabbrev模式」?我不想將空間綁定到* one *函數,我希望空間根據我在空格之前鍵入的內容執行一個函數,就像縮寫模式一樣。例如在縮寫模式下,我可以鍵入「teh」並將其變爲「the」。在我的情況下,我想輸入「fbf」並讓Emacs自動執行函數* foo-bar-forthewin *(因爲某處我會將fbd綁定到foo-bar-forthewin。然後我要鍵入「sof」並讓Emacs自動運行*其他功能* – 2012-03-20 21:05:00

+0

就像縮寫模式一樣,我不太可能將某個函數綁定到某些需要在另一個模式中輸入的函數。這就是爲什麼99.999%的縮寫模式下的空間就像一個空間一樣(這就是爲什麼縮寫模式非常棒,我會說)。如果發生衝突,我總是可以刪除特定的函數綁定。 – 2012-03-20 21:06:53

2

每個縮寫詞都由幾個元素組成。主要元素包括名稱(例如「fbf」),擴展(您喜歡的任何字符串)和鉤子(被調用的函數)。在你的情況下,這聽起來像你想要擴展爲空字符串,並簡單地指定你的foo-bar-for-the-win作爲鉤。