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