2013-04-06 74 views
1

在調試時,我通常會在執行過程中編寫大量跟蹤在屏幕上打印變量。如果Emacs可以爲我編寫模板,那將會很好。我不知道如何在Emacs上編程,所以我要求你的幫助:)在Emacs中生成跟蹤模板

我的想法如下。就像M-x trace-template一樣,它會詢問變量的名稱。那麼,這樣的事情將被添加到活動的緩衝區:

// trace20130604 
cout << "test.cpp variable: " << variable << endl; 

日期在評論中添加允許執行當天的痕跡快速搜索將其刪除不需要的時候。 「test.cpp」是自動插入的活動緩衝區。 「變量」是Emacs命令在執行時要求您輸入的變量名稱。

您認爲這樣做會有幫助嗎?易於實施?也許已經實施? :)

理想情況下,它應該是模式特定的,因此可以插入正確的模板,具體取決於您使用的語言。

非常感謝您的幫助!

問候。

解決方案的幾大-模式

我已經擴大了弗朗西斯科的解決方案,用於支付兩大模式中。這是我第一次嘗試在Elisp上做點什麼,我想我們的代碼很醜陋,但似乎有效。

(defun trace-template (variable-name) 
    (interactive "sVariable Name: ") 
    (if (string-equal (format "%s" major-mode) "c++-mode") 
     (progn 
      (insert (format-time-string "// trace%Y%m%d\n")) 
      (insert (format "cout << \"%s %s:\" << %s << endl;\n\n" 
        (file-name-nondirectory buffer-file-name) 
        variable-name variable-name))) 
    ) 
    (if (string-equal (format "%s" major-mode) "fortran-mode") 
     (progn 
      (insert (format-time-string "! trace%Y%m%d\n")) 
      (insert (format "WRITE(*,*) \"%s %s:\", %s\n\n" 
        (file-name-nondirectory buffer-file-name) 
        variable-name variable-name))) 
    ) 
) 

回答

0

第一種解決方案將包括在使用yasnippet延伸,其目的是在做什麼您需要:將(潛在參數)模板到當前的緩衝區。

Yasnippet可以使用emacs的包裝系統輕鬆安裝,例如通過MELPA存儲庫,其documentation解釋爲how to write custom snippets。下面的模板代碼片段看起來是這樣的:

#contributor : me <[email protected]> 
#name : trace 
# -- 
// `(format-time-string "%Y%m%d")` 
cout << "`(file-name-nondirectory buffer-file-name)` $1:" << $1 << endl; 

Yasnippet可以限制片段擴展到特定的模式,所以,我認爲你可以很容易地定義多個特定語言的片段都以同樣的方式命名。


另一種解決辦法是寫一個定製的Emacs Lisp的功能,如下列:

​​
+0

嗨弗朗西斯,非常感謝你的回答!我喜歡你的第二個功能,因爲我在不同的計算機之間移動.emacs,所以我只需要移動一個文件。我一直在添加一些ifs來根據主模式打印不同的模板。這花了我一些時間,但我想我做到了:) – siritinga 2013-04-07 12:16:22