2016-04-17 13 views
1

私はevac-modeでemacsを使用していますが、<leader>ttを関数projectile-diredにマップしたいのですが、diredバッファが表示されている場合はevil-delete-bufferにマップする必要があります。つまり、トグル関数へのマップを作成する必要があります。 emacsのの基本を学習した後emacsでは、別の関数から返された関数へのマッピングを作成する方法は?

は、Lisp私はこの解決策を考え出した:

(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の一部を学ぶためのものです。ありがとう!

編集:ここでは

は私が達成したいもののいくつかの擬似コード(ジャバスクリプト)です:

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'を返します(ローカルではない終了を返し、返さない限り)ので、 'または'で囲むことは無意味です。 'evil-delete-buffer'が非' nil'を返すときに 'projectile-dired'を実行しない場合は、' when'の代わりに 'and'を使います(または同じ効果を持つ何か他のものを実行してください)。 – Drew

+0

@phils done:)..... @Drew thanks私はemacsの初心者ですが、それがうまくいかない場合は 'if'文を使用しますが、それはうまくいきました。 –

答えて

1

(警告:私はevilを使用しないで、そのカスタムキーバインド機能に慣れていないよん)

キーを作るための標準的なアプローチは、dired-modeで一つのことを行うと、別のものは、他の場所で結合1を定義することですdiredのキーマップでは、グローバルキーマップ(または適切なもの)で別のバインディングを使用します。ほとんどの状況でこのアプローチに従うことをお勧めします。何が起きているのかをもっと簡単に確認できるからです。

しかし、あなたが求めていることをする方法があります。これらのページは、アプローチにいくつかのバリエーションを示します(メニューは実際に派手なキーマップはEmacsであるNB)本質的に

は、メニュー項目の:filter施設を利用します実行時にコマンドを判別します。フィルタ関数が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コマンドにバインドすることは、最も自明な実装のようです。

関連する問題