2012-03-01 54 views
1

據我所知,「C-u M-x shell」可以用來運行多個shell。 但是如何定義一個函數來完成與「C-u M-x shell」相同的功能呢?如何定義一個函數在Emacs上運行多個shell?

+0

您還可以看看[多長期(http://emacs-fu.blogspot.com/2010/06/console-apps-in-emacs-with-multi-term.html)。 – Daimrod 2012-03-01 14:03:41

回答

2
(defun my-named-shell() 
    "Equivalent to C-u M-x shell RET" 
    (interactive) 
    (shell (get-buffer 
      (read-buffer 
      "Shell buffer: " 
      (generate-new-buffer-name "*shell*"))))) 

我用describe-functionfind-function檢查的shell行爲,其interactive聲明特別,然後我只是複製了必要的代碼,以將其轉換成一個參數的非交互式調用shell功能(但將其封裝在get-buffer中以提供緩衝區參數)。

其實我已經留下了一些代碼,處理遠程文件,因爲在代碼中的註釋顯得有點混亂。如果你不習慣在通過Tramp訪問遠程文件的緩衝區中使用C-u M-x shell,那麼這個省略不會影響你。

這一切都表示,一個更簡單的(和更完整)的辦法很簡單:

(defun my-named-shell() 
    "Equivalent to C-u M-x shell RET" 
    (interactive) 
    (let ((current-prefix-arg '(4))) 
    (call-interactively 'shell))) 

欲瞭解更多信息,請參閱https://stackoverflow.com/a/9388058/324105

在這種情況下current-prefix-arg可以是任何非零值,但我認爲使用C-u實際產生的值是一個好習慣。

+0

太棒了,它的工作原理!謝謝。 – Xun 2012-03-01 11:00:31

相關問題