2011-12-06 105 views
7

當我在emacs中使用dired模式時,我可以通過鍵入!xxx運行shell命令,但是如何綁定密鑰才能運行此命令? 例如,我想在文件上按O,然後dired將運行'cygstart'來打開此文件。 謝謝。如何綁定密鑰在dired中運行shell命令emacs

回答

10

您可以使用shell-command函數。例如:

(defun ls() 
    "Lists the contents of the current directory." 
    (interactive) 
    (shell-command "ls")) 

(global-set-key (kbd "C-x :") 'ls); Or whatever key you want... 

要定義在單個緩存器的命令,則可以使用local-set-key。在dired中,您可以使用dired-file-name-at-point獲得該文件的名稱。所以,你問什麼:

(defun cygstart-in-dired() 
    "Uses the cygstart command to open the file at point." 
    (interactive) 
    (shell-command (concat "cygstart " (dired-file-name-at-point)))) 
(add-hook 'dired-mode-hook '(lambda() 
           (local-set-key (kbd "O") 'cygstart-in-dired))) 
+5

注意:在回答問題之前,我不知道任何這些功能。我在'M-!'上使用'C-h k'獲得'shell-command'的名字;我首先猜測它是一個'dired-'函數,然後使用'C-h f'和tab自動完成名稱,從而得到'dired-file-name-at-point'。你也可以很容易地找出這樣的Emacs函數名稱和效果 - 畢竟它是一個**自我編輯的**編輯器!這只是它令人敬畏的許多方式之一。 –

3
;; this will output ls 
(global-set-key (kbd "C-x :") (lambda() (interactive) (shell-command "ls"))) 

;; this is bonus and not directly related to the question 
;; will insert the current date into active buffer 
(global-set-key (kbd "C-x :") (lambda() (interactive) (insert (shell-command-to-string "date")))) 

lambda定義了一個匿名函數來代替。這樣你就不必定義一個輔助函數,它將在另一個步驟中綁定到一個鍵。

lambda是關鍵字,如果需要某些參數,則下一個括號對保存您的參數。休息與任何常規功能定義類似。