emacs 24:如何恢复python模式下的emacs-23 sexp行为?

emacs 24:如何恢复python模式下的emacs-23 sexp行为?,python,emacs,progress,Python,Emacs,Progress,我使用“-no init file”运行emacs 23和24,以避免加载自定义项。但随后我显式地加载了我的python-mode.el的古老版本(3.105版,上一次版权公告1998),并看到了我将要描述的相同行为,因此我相信这是核心emacs,而不是python 考虑以下代码(*标记光标位置): 将光标放在“def”开头的第4列 对于emacs 23,运行mark sexp选择“def” 使用emacs 24,mark sexp选择整个代码块,直到结束 打印报表的一部分 这还不错。主要问题是

我使用“-no init file”运行emacs 23和24,以避免加载自定义项。但随后我显式地加载了我的python-mode.el的古老版本(3.105版,上一次版权公告1998),并看到了我将要描述的相同行为,因此我相信这是核心emacs,而不是python

考虑以下代码(
*
标记光标位置):

将光标放在“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)
同样,光标位于行的可打印部分col 4的开头

在emacs 23中,
mark sexp
选择
very_long\u var\u name

在emacs 24中,
mark sexp
选择从第4列到末尾的整行

我一直在使用
Ctrl-alt-space-alt-w
快速保存变量名。 (或
alt-2 ctrl-alt-space alt-w
保存ref表达式)现在 跑了。这是emacs,所以这必须是可定制的,但我还没有找到 实现新行为的地方(记住我使用的是python模式)
大约15岁)。我需要在.emacs文件中放入什么?

这似乎是emacs 24中的错误修复。因为从技术上讲,这是现在标志着完整的性别歧视。似乎您想要的是标记符号的功能

我认为,通过将其放入
.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)
(取消标记符号(&可选参数允许扩展)
“在lisp.el中标记sexp,但使用fowrad符号代替foward sexp”
(交互式“P\np”)
(cond)((和允许扩展
(或(和(等式最后一个命令此命令)(标记t))
(和瞬态标记模式标记激活)))
(setq arg(如果arg(前缀数值arg))
(如果(<(标记)(点))-1)
(设定标记)
(省去远足
(转到字符(标记))
(前进符号arg)
(点)
(t
(推动标记
(省去远足
(前进符号(前缀数值arg))
(点)
无)(t))
(全局设置键(kbd“C-M-SPC”)'您的标记符号)
请注意,这实际上是
标记sexp
的副本,但带有
前移符号
,而不是
前移sexp


如果您在其他缓冲区/模式中通过C-M-SPC使用
mark sexp
,这很可能会导致意外的奇怪,在这种情况下,您可能希望通过模式挂钩来实现此键绑定。

@Eric有趣。谢谢你在我的另一个答案中的评论

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

(添加hook'python模式hook(lambda()(setq forward sexp函数nil)))

来自
python模式内的注释
内置的emacs24(我想您可能会得到它)

最后但并非最不重要的是,专门的
python导航转发sexp
允许在代码块之间轻松导航。如果您喜欢
cc模式
-如
forward sexp
移动,将
forward sexp功能设置为nil就足够了


这与我在另一个答案中提到的sexp更接近,但在lisp之外,sexp似乎至少有点模棱两可

我认为这是V24中引入的回归。我在emacs中编辑python文件已经超过15年了,这是我第一次遇到这种行为。我仍然想要性别匹配。在我的示例中,我提到使用
alt-2 ctrl-alt-space alt-w
拖动
very_long\u var\u name[very_long\u expn]
,其中表达式可以包含多个单词。这里似乎还有其他的钩子,我想知道如何缩小范围。就是这样!非常感谢!这仍然适用于带括号的表达式和字符串。我对新行为的另一个问题是它的不对称性:坐在一个“def”上,fwd-sexp走到了街区的尽头,但一旦到了那里(fwd-sexp-1)又回到了一个传统的sexp。没问题。很高兴这有帮助。我不确定我是否完全理解你的第二个问题。如果你仍然有问题,那么请用一个例子和@me在评论中提出一个新的SO问题,我很乐意看一看。
(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)