【问题标题】:emacs 24: How do I get back emacs-23 sexp behavior for python mode?emacs 24:如何恢复 python 模式的 emacs-23 sexp 行为?
【发布时间】:2016-02-02 19:48:35
【问题描述】:

我使用“--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 文件中添加什么?

【问题讨论】:

    标签: python emacs progress


    【解决方案1】:

    @Eric 有趣。感谢我的其他答案评论中的上下文。

    我想你可能只是想要这个:

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

    来自python-mode 内置 emacs 24 内的 cmets(我认为您可能会得到它)

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

    这更接近我对性别的看法,就像我在其他答案中提到的那样,但在 lisp 之外,性别似乎至少有点模棱两可。

    【讨论】:

    • 就是这样!非常感谢!对于带括号的表达式和字符串,这仍然可以正常工作。我对新行为的另一个问题是它的不对称性:坐在“def”上,fwd-sexp 走到块的末尾,但是一旦到那里 (fwd-sexp -1) 就会回到一个传统的 sexp。
    • 没问题。很高兴有帮助。不确定我是否完全理解你的第二个问题。如果您仍有问题,请使用示例提出一个新的 SO 问题,并在 cmets 中@我,我很乐意查看。
    【解决方案2】:

    似乎这是 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,这很可能会导致意外的怪异,在这种情况下,您可能希望通过模式挂钩进行此键绑定.

    【讨论】:

    • 我认为这是 v 24 中引入的回归。我在 emacs 中编辑 python 文件超过 15 年,这是我第一次遇到这种行为。我仍然想要性别匹配。在我的示例中,我提到使用alt-2 ctrl-alt-space alt-w 来拉动very_long_var_name[very_long_expn],其中表达式可以包含多个单词。这里似乎还有其他问题,想知道如何缩小范围。
    猜你喜欢
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多