emacs 24:如何为python模式恢复emacs-23性别行为?

时间:2016-02-02 19:48:36

标签: python emacs progress

我正在使用“--no-init-file”运行emacs 23和24,以避免加载我的自定义项。但后来我明确加载了古老版本的python-mode.el(版本3.105,最后版权声明1998),看到了我要描述的相同行为,所以我相信它是核心emacs,而不是python。

考虑这段代码(*标记光标位置):

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

将光标放在“def”开头的第4列。

使用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,所以这必须是可定制的,但我还没有找到 实现新行为的地方(并记住我正在使用python模式 那是大约15岁)。我需要在.emacs文件中添加什么内容?

2 个答案:

答案 0 :(得分:1)

@Eric有趣。感谢我的其他答案的评论中的背景。

我想你可能只想要这个:

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

来自python-mode内置emacs 24内的评论(我认为你可能会这样做)

  

最后但并非最不重要的是,专门的python-nav-forward-sexp允许在代码块之间轻松导航。如果您更喜欢cc-mode - 例如forward-sexp移动,将forward-sexp-function设置为nil就足够了......

这更接近于我对性别的看法,就像我在其他答案中所提到的那样,但在lisp之外,性别似乎至少有些含糊不清。

答案 1 :(得分: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

如果您在其他缓冲区/模式中通过 CM-SPC 使用mark-sexp,这很可能会导致意外的怪异,在这种情况下,您可能希望通过模式进行此键绑定反而挂钩。