2016-04-17 45 views
1

我使用的是惡意模式的emacs,我想將<leader>tt映射到函數projectile-dired,但是如果正在顯示dired緩衝區,那麼它應該映射到evil-delete-buffer,所以本質上是創建一個到切換函數的映射。在emacs中如何創建映射到另一個函數返回的函數?

學習Emacs的基礎知識後口齒不清,我想出了這個解決方案:

(defun toggle-projectile-dired() 
    "Toggles projectile-dired buffer." 
    (interactive) 
    (or 
    (when (derived-mode-p 'dired-mode) 
    (evil-delete-buffer (current-buffer))) 
    (projectile-dired))) 

;; This is how the mapping is done 
(evil-leader/set-key "tt" 'toggle-projectile-dired) 

但我所做的這個解決方案是創建一個映射到最終調用另一個函數的函數。

雖然我的解決方案可行(而且我很好),但我不能做的是返回要調用的函數(而不是像我這樣調用它)如何編寫這種方法?

或換句話說,如何返回一個函數名稱並使該映射調用返回函數?

PD:這個問題只是爲了學習elisp而已。謝謝!

編輯:

這裏是什麼,我想實現一些僞代碼(JavaScript的):

function toggleProjectileDired() { 
    if (derivedModeP == 'dired-mode') { 
    // We're in dired buffer 
    return 'evilDeleteBuffer'; 
    } else { 
    return 'projectileDired'; 
    } 
} 

evilLeaderSetKey("tt", toggleProjectileDired()); 

我的僞代碼的解決方案是:

function toggleProjectileDired() { 
    if (derivedModeP == 'dired-mode') { 
    // We're in dired buffer 
    evilDeleteBuffer(); 
    } else { 
    projectileDired(); 
    } 
} 

evilLeaderSetKey("tt", toggleProjectileDired); 

正如你可以看到,一個調用該函數時返回要調用的函數名稱。如何返回要在elisp中調用的函數名稱?

+0

請添加一些僞代碼,顯示您希望能夠做什麼的示例,因爲您的問題不明確。 – phils

+0

這個問題還不清楚。此外,'when'總是返回'nil'(除非它導致非本地出口並且不返回),所以你用'or'包裝它是沒用的。如果你想在'evil-delete-buffer'返回非''nil'時不執行'projectile-dired',那麼使用'and'而不是'when'(或者做別的具有相同效果的東西)。 – Drew

+0

@phils done:)..... @Drew謝謝我是emacs的新手,如果這不起作用,我會使用'if'語句,但它工作,雖然我會得到修改,謝謝。 –

回答

1

(警告:我不使用evil,和我不熟悉它的自定義鍵綁定功能)

的規範的方法,使一個鍵做一件事dired-mode和其他地方的另一件事是定義一個綁定在dired的鍵盤映射中,以及全局鍵盤映射中的另一個綁定(或任何合適的)。我建議你在大多數情況下都試圖遵循這種方法,因爲它使得查看發生的事情變得更加簡單。

但是,有一種方法可以滿足您的要求。這些頁面展示的方法的一些變化:

在本質上,你使用的菜單項:filter設施(NB菜單實際上看中的鍵盤佈局在Emacs)在運行時確定命令。請注意,如果過濾器函數返回nil,Emacs將它視爲在該鍵映射中不存在綁定,並繼續在其餘鍵映射中查找綁定;所以這個功能促進了僅僅有條件活動的綁定。

一個非evil版本的例子可能是這樣的:

(define-key global-map (kbd "<f6>") 
    `(menu-item "" projectile-dired 
       :filter ,(lambda (default) 
         (if (derived-mode-p 'dired-mode) 
          'evil-delete-buffer 
          default)))) 

再次,這將是更常見的:

(global-set-key (kbd "<f6>") 'projectile-dired) 
(eval-after-load "dired" 
    '(define-key dired-mode-map (kbd "<f6>") 'evil-delete-buffer)) 

FWIW,其實我覺得你開始使用一般方法在這種情況下可能是最好的。如果輸入KEY應始終在該窗口中切換dired,然後將其綁定到toggle-dired命令似乎是最明智的解決方案。

相關問題