我正在使用“--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文件中添加什么内容?
答案 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
,这很可能会导致意外的怪异,在这种情况下,您可能希望通过模式进行此键绑定反而挂钩。