2013-07-12 61 views
1

我是新來的elisp,所以請原諒我,如果以下方法完全笨拙。直接調用命令和使用鍵盤綁定的區別

在我目前正與團隊,有關閉蟒蛇塊用pass聲明(如果它們沒有被關閉的關鍵字,如elseexcept或終止等)的通用慣例。雖然不同尋常,但它具有如下優點:如果程序無意中發生了更改(使用emacs indent-region),則始終可以恢復程序的原始縮進。

要獲得現有的代碼行本公約,我寫了一個小elisp的功能:

(defun python-check-indent() 
"Check if automatic indentation changes current indent, insert pass keyword if it does." 
(interactive) 
(move-beginning-of-line 1) 
(skip-chars-forward " ") 
(if 
    (< 0 
    (let (original) 
     (setq original (point)) 
     (indent-for-tab-command) 
     (- (point) original) 
    ) 
    ) 
    (progn 
    (insert "pass") 
    (newline) 
    (indent-for-tab-command) 
    ) 
) 
(next-line) 
) 


(global-set-key (kbd "C-`") 'python-check-indent) 

的想法很簡單,就是測試是否按Tab會改變縮進,而在這種情況下,插入pass聲明。爲了便於處理更長的代碼塊,它然後前進到下一行。

當我運行它使用M-x python-check-indent,它做我想要的(除了它繞着空行稍微移動),也反覆運行它來處理多行。但是,當我使用C-keybinding重複運行它時,它開始搞亂第二次調用中的代碼。

所以,這裏是我的問題:調用一個命令與M-x ...並使用它的鍵綁定有什麼區別?我怎麼能改變功能不受這種差異?

emacs的版本:GNU Emacs的23.3.1(x86_64的,蘋果達爾文,NS蘋果了AppKit-1038.35)的對2011-03-10 black.porkrind.org

(編輯),目前的解決方法:我現在將它包裝在一個鍵盤宏內,所以它被綁定到Cx e,並且行爲正常。

回答

3

一般規則是最好避免在你的函數中使用複雜的交互式 命令,因爲它們可能會受到各種選項 的影響。

(defun python-check-indent() 
    "Check if automatic indentation changes current indent, insert pass keyword if it does." 
    (interactive) 
    (goto-char (line-beginning-position)) 
    (skip-chars-forward " ") 
    (when (< 0 
      (let (original) 
      (setq original (point)) 
      (python-indent-line) 
      (- (point) original))) 
    (insert "pass\n") 
    (python-indent-line)) 
    (forward-line)) 

然而,即使是這樣,因爲python-indent-line的行爲取決於last-commandpython-indent-trigger-commands可能是不太好的。我認爲最好的做法是將第一次調用python-indent-line替換爲計算目標縮進的代碼,而不是實際縮進,如(nth python-indent-current-level python-indent-levels)

PS。如果您仍有問題,我建議您使用edebug並逐步完成此功能。

+0

嗨,這個規則有很大的意義,但不幸的是,當我使用鍵綁定調用函數時,我仍然會得到不同的行爲,而使用M-x python-check-indent時它會正常工作。 –

+0

我懂了!我只需要用python-indent-line替換另一個indent-for-tab-command。非常感謝! –

相關問題