2016-02-02 38 views
1

我正在使用「--no-init-file」運行emacs 23和24以避免加載我的自定義項。但後來我明確加載了我的古代版本的python-mode.el(版本3.105,最後版權注意事項1998),並且看到了我將要描述的相同行爲,所以我相信它是核心emacs,而不是python。emacs 24:如何獲取python模式下的emacs-23 sexp行爲?

考慮這個代碼(*馬克光標位置):

*def emacs_is_fun(): 
    for x in range(3): 
     print(x) 

將光標在塔4在開始「DEF」。

隨着emacs 23,運行mark-sexp選擇「def」。

用emacs 24,mark-sexp選擇整個代碼塊,到打印語句的末尾 。

這並不壞。的主要問題是這種常見的用法:

*very_long_var_name[very_long_expn] += long_function_call(long_arg_list, blah) 

同樣,光標位於該行的可打印部分的開始,列4

在Emacs 23,mark-sexp選擇very_long_var_name

在emacs 24中,mark-sexp選擇從第4列到最後的完整行。我使用Ctrl-alt-space alt-w來快速保存變量名稱。 (或alt-2 ctrl-alt-space alt-w保存ref表達式。)現在它的 沒了。這是emacs,所以這必須是可定製的,但我還沒有發現 新的行爲被實現(並記住我正在使用大約15歲的python模式 )。我需要在我的.emacs文件中放入什麼?

回答

1

@Eric有趣。感謝我的其他答案的評論中的背景。

我想你可能只是想這則:

(add-hook 'python-mode-hook (lambda() (setq forward-sexp-function nil)))

從內python-mode內置的Emacs 24(我想你可能不是獲取)

最後但評論不僅如此,專門的python-nav-forward-sexp允許在代碼塊之間輕鬆導航。如果你喜歡cc-modeforward-sexp運動,設置forward-sexp-function爲nil就足夠了...

這種凝膠化接近我認爲SEXP的,就像我在其他的答案中提到,但口齒不清外SEXP似乎至少有點含糊不清。

+0

就是這樣!非常感謝!這仍然符合括號表達式和字符串的預期。我對這種新行爲的另一個問題是它的不對稱性:坐在'def'上,fwd-sexp走到塊的盡頭,但是一旦出現(fwd-sexp-1)就會返回一個傳統的sexp。 – Eric

+0

沒問題。很高興幫助。不知道我完全理解你的第二個問題。如果你仍然有問題,請在評論中以示例和@我的方式提出新的SO問題,我很樂意看一看。 – Jack

0

看起來像這是在emacs 24錯誤修復。因爲這在技術上現在標記完整的sexp。看起來你想要的是標記符號的功能。

認爲通過把這個在你的.emacs你會得到你想要的功能。

(defun your-mark-symbol (&optional arg allow-extend) 
    "mark-sexp in lisp.el but with fowrad-symbol instead of foward-sexp" 
    (interactive "P\np") 
    (cond ((and allow-extend 
      (or (and (eq last-command this-command) (mark t)) 
      (and transient-mark-mode mark-active))) 
    (setq arg (if arg (prefix-numeric-value arg) 
      (if (< (mark) (point)) -1 1))) 
    (set-mark 
     (save-excursion 
     (goto-char (mark)) 
     (forward-symbol arg) 
     (point)))) 
    (t 
    (push-mark 
     (save-excursion 
     (forward-symbol (prefix-numeric-value arg)) 
     (point)) 
     nil t)))) 

(global-set-key (kbd "C-M-SPC") 'your-mark-symbol) 

注意,是名副其實的mark-sexp副本,但與foward-symbol而不是forward-sexp

這可能如果您是通過C-M-SPC其他緩衝器/模式下使用mark-sexp,在這種情況下,你會想這樣做使通過模式掛機鍵綁定這不是很好引起意想不到的怪事。

+0

我認爲這是第24版中的一個迴歸。我已經在emacs中編輯了超過15年的python文件,這是我第一次遇到這種行爲。而我仍然希望sexp匹配。在我的例子中,我暗指使用'alt-2 ctrl-alt-space alt-w'來抽取'very_long_var_name [very_long_expn]',其中表達式可以包含多個單詞。這裏似乎還有其他一些問題,並希望知道如何縮小範圍。 – Eric