Bri*_*ell 8 python emacs elisp keyboard-shortcuts
我正在尝试我对Emacs的第一次修改.我录制了一个小键盘宏,让Emacs把它作为elisp吐出来,导致:
(setq add-docstring
"\C-rdef\C-n\C-a\C-m\C-p\C-i\C-u6\"\C-u3\C-b")
(global-set-key "\C-c\C-d" 'add-docstring)Run Code Online (Sandbox Code Playgroud)
但是,搜索Emacs参考文献显示C-c C-d已经在diff模式下绑定了.我不打算使用diff模式,但未来是不可知的,我不想为自己设置陷阱.所以我希望这个键绑定只能在python模式下运行,它试图帮助我添加文档字符串.
在我/usr/share/emacs/23.whatever/list/progmodes,我发现python.elc和python.el.gz.我解压缩python.el.gz并获得了elisp文件的可读版本.但是,现在,文档对我来说变得不透明了.
如何将我的键绑定添加到python模式,而不是全局?
对于奖励积分,是否可以将更改应用于python模式而无需重新启动emacs或关闭打开的文件?这是自我修改的编辑器,我认为这是可能的.
Tre*_*son 16
事实证明,C-c C-d已经绑定到python-mode(to 'python-pdbtrack-toggle-stack-tracking),所以你可能想重新选择你的键绑定.
注意:如果您只想剪切/粘贴解决方案,请跳到答案的末尾.继续阅读,了解如何到达那里 - 如果你想再做一次.
宏是一个良好的开端,但你所拥有的将不会很好.要获得可以绑定到某个键的内容,请尝试M-x insert-kbd-macro该宏,然后您将获得:
(fset 'add-docstring
(lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ("def ...unprintable characters...6\"3" 0 "%d")) arg)))
Run Code Online (Sandbox Code Playgroud)
(嗯....不可打印的字符,我不能剪切/粘贴到SO中,但你可以自己做以获得正确的东西).稍微改动,你得到的就是这个:
(fset 'add-docstring
(lambda (&optional arg)
"Keyboard macro."
(interactive "p")
(kmacro-exec-ring-item `(,(kbd "C-r def C-n C-a C-m C-p C-i C-u 6 \" C-u 3 C-b") 0 "%d")
arg)))
Run Code Online (Sandbox Code Playgroud)
这是第一步.通过上述内容,您可以执行M-x add-docstring并获得所需的行为.
下一步是你问的问题 - 如何在本地绑定密钥.键绑定的文档从这里开始,您感兴趣的是Local Keymaps部分,它导致以下内容:
(add-hook 'python-mode-hook
(lambda () (define-key python-mode-map (kbd "C-c C-d") 'add-docstring)))
Run Code Online (Sandbox Code Playgroud)
这将设置一个在python-mode打开时调用的匿名函数,该函数执行一项操作 - 它在keymap中专门为python-mode设置所需的键绑定.
如果你仔细阅读Keymaps部分,你会看到Emacs遵循只有用户应该绑定commads的约定C-c a,其中a是任何小写或大写字母(例如C-c d C-c T C-c p都是可用的),并且包约束模式特定的绑定C-c %,哪里%是标点字符或控制键(例如C-c C-c C-c [ C-c C-z).
所以,如果你改变你的绑定C-c d,那么你几乎可以保证不会与那里的任何包冲突.在python.el使用Emacs运不遵守这些约定,因为这样做随Emacs的大多数(所有?)的软件包.
你会注意到我kbd用来读取键序列.它是便携式的,我觉得它更容易阅读.
还有其他事情你可以做清理:
eval-after-load而不是钩子(见这个问题)以下是我为#1做的事情,它为您提供了一个放置其他自定义的便利位置:
(add-hook 'python-mode-hook 'my-python-customizations)
(defun my-python-customizations ()
"set up my personal customizations for python mode"
;; put other customizations in here
(define-key python-mode-map (kbd "C-c C-d") 'add-docstring))
(defun add-docstring (&optional arg)
"Keyboard macro."
(interactive "p")
(kmacro-exec-ring-item `(,(kbd "C-r def C-n C-a C-m C-p C-i C-u 6 \" C-u 3 C-b") 0 "%d")
arg))
Run Code Online (Sandbox Code Playgroud)
使用命名函数有点清洁,以后(remove-hook 'python-mode-hook 'my-python-customizations)如果你愿意,可以稍后再做.此外,如果你查看hook(C-h v python-mode-hook RET)的值,很明显会调用什么(匿名函数更长,更难以阅读).
对于奖励积分,将代码粘贴到.emacsdo后M-x eval-region,将告诉Emacs评估区域中的代码.要查看现有python缓冲区中的更改,您只需打开一个新的python文件/缓冲区,这将触发键绑定更改 - 这对所有python缓冲区都是通用的.
快乐的黑客.
| 归档时间: |
|
| 查看次数: |
2485 次 |
| 最近记录: |