- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试对 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)
不过,搜索 Emacs 引用资料后发现 C-c C-d 已经绑定(bind)在 diff 模式中。我不计划使用 diff 模式,但 future 是不可知的,我不想给自己设下陷阱。所以我希望这个键绑定(bind)只在 python 模式下运行,它会尝试帮助我添加文档字符串。
在我的 /usr/share/emacs/23.whatever/list/progmodes
中,我找到了 python.elc
和 python.el.gz
。我解压缩了 python.el.gz
并获得了 elisp 文件的可读版本。但是现在,文档对我来说变得不透明了。
如何将我的键绑定(bind)添加到 python 模式,而不是全局?
是否可以在不重新启动 emacs 或关闭打开的文件的情况下将更改应用到 python 模式以获得奖励积分?它是自修改编辑器,我认为它很有可能成为可能。
最佳答案
事实证明,C-c C-d 已经在 python-mode
中绑定(bind)(到 'python-pdbtrack-toggle-stack-tracking
) ,因此您可能需要重新审视您对键绑定(bind)的选择。
注意:如果您只想剪切/粘贴解决方案,请跳至答案末尾。请继续阅读有关如何到达那里的说明 - 以防您想再次这样做。
宏是一个良好的开端,但您所拥有的将无法正常工作。要获得可以绑定(bind)到某个键的内容,请为该宏尝试 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)))
(嗯....不可打印的字符,我不能剪切/粘贴到 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)))
这是第一步。通过以上,您可以执行 M-x add-docstring
并获得您想要的行为。
下一步就是您所要求的 - 如何在本地绑定(bind)到 key 。 keybindings begins here 的文档,您感兴趣的是 Local Keymaps section ,这会导致以下结果:
(add-hook 'python-mode-hook
(lambda () (define-key python-mode-map (kbd "C-c C-d") 'add-docstring)))
这会设置一个匿名函数,当 python-mode
开启时调用,该函数只做一件事——它在键盘映射中专门为 python-mode 设置你想要的键绑定(bind).
如果您阅读 Keymaps section仔细观察,您会发现 Emacs 遵循只有用户才能将逗号绑定(bind)到 C-c a 的约定,其中 a 是任何小写或大写字母(例如 C-c d C-c T C-c p 都可用),并且包将特定于模式的绑定(bind)限制为 C-c %,其中 % 是任何标点符号或控制键(例如 C-c C-c C-c [ C-c C-z)。
因此,如果您将绑定(bind)更改为 C-c d,那么您几乎可以保证不会与那里的任何包发生冲突。 Emacs 随附的 python.el
确实遵循这些约定,Emacs 随附的大多数(全部?)包也是如此。
你会注意到我使用了 kbd
读取键序列。它是可移植的,我发现它更容易阅读。
您还可以做更多的事情来清理它:
eval-after-load
而不是钩子(Hook)(见这个问题)这是我为 #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))
使用命名函数更简洁一些,因为您以后可以根据需要执行 (remove-hook 'python-mode-hook 'my-python-customizations)
。此外,如果您查看 Hook 的值 (C-h v python-mode-hook RET),很明显调用了什么(匿名函数更长且更难阅读)。
为了加分,将代码粘贴到 .emacs
后执行 M-x eval-region,这将告诉 Emacs 评估该区域中的代码。要查看现有 python 缓冲区中的更改,您只需打开一个新的 python 文件/缓冲区,这将触发键绑定(bind)更改——这对所有 python 缓冲区都是通用的。
祝你黑客愉快。
关于python - 将键盘绑定(bind)添加到现有的 Emacs 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2429603/
我有一个 foo 类,它有一个 bar 方法,它接受可调用的东西(函数指针/仿函数)。这个可调用的东西应该作为绑定(bind)元素传递给另一个方法 doit 和第三个方法 bar_cb 方法。 #in
我正在尝试在我的 WPF 4.0 应用程序(使用 VS 2010 Pro RTM)中创建自定义 TabItem 模板/样式,但尽管一切似乎都正常工作,但我注意到跟踪窗口中存在绑定(bind)错误。 我
作为一名刚接触 Android 的开发人员,我想我可能误解了绑定(bind)服务。 我创建了一项服务来结束对服务器的访问。作为此服务的一部分,该服务正在监听多播地址,以识别本地网络上的设备何时出现和消
这个问题在这里已经有了答案: What is the use of the JavaScript 'bind' method? (23 个回答) 关闭 7 年前。 所以我一直在尝试了解一些 JS 上
我不明白这三种语法之间的区别: where a = f (b) do a <- f (b) do let a = f (b) 我确实明白了a <- f(b)与其他两个不同,在大多数情况下,我尝试了所有
我在将 Cocoa 项目从手动同步接口(interface)模型转换为绑定(bind)模型时遇到问题,这样我就不必担心接口(interface)粘合代码。 我关注了 CocoaDevCentral C
我正在尝试找出一种好的方法来对处理大数据集的代码进行并行化,然后将结果数据导入 RavenDb。 数据处理受 CPU 限制和数据库导入 IO 限制。 我正在寻找一种解决方案,以对 Environmen
我正在 foreach 循环中生成单选按钮。我试图将选中的属性绑定(bind)到父级中的基本可观察值。不幸的是,当单击单选按钮时,父级的属性似乎没有在单击处理程序中更新。 基于一些previous w
在我的 Windows Phone 应用程序中,我有两个 LongListSelectors并排在页面上。我想做到这一点,以便当用户滚动其中一个时,另一个滚动相同的量。 两个 LongListSele
我在网上看到这个问题准备面试: Given a non-preemptive kernel which type of process will get affected morein terms o
我有一个 foreach 绑定(bind),如下所示: Summary Permitting 原因是有两个选项卡始终存在,并且我根据是否添加了其他选项卡来添加其他选项
任何人都有绑定(bind)相同的情况DataContext到 TextBlock 中的 Text 属性(例如)。 我必须分配 DataContext以我的风格反射(reflect)基于 Datacon
给定以下代码: Login 和下面的javascript $(function () { $('#btnLogin').click(function () { co
我使用 boost::asio 创建了一个服务器。我在绑定(bind)到端点时遇到问题。所以,如果我在构造函数中初始化一个接受器: Server::Server(QWidget *parent) :
我正在将现有项目从 MySQL 转换为 Postgres。代码中有相当多的原始 SQL 文字使用 ? 作为占位符,例如 SELECT id FROM users WHERE
似乎在绑定(bind)某些数据时出错了,有人可以帮我解决我哪里出错了,尽管我无法弄清楚。 真的不需要在这里显示太多,这是 Binding,我已经通过移除背景并在其中放置颜色来测试背景,效果很好。 编辑
我正在尝试使用 wcf 构建一个 http 监听器(web 服务)。这个监听器是一个更大的桌面应用程序的一部分。此桌面应用程序还会调用 http 监听器。 当监听器接收到数据时,它应该被传递到桌面应用
嘿嘿。 我正在使用 Node.JS 和 child_process 来生成 bash 进程。我试图了解我是否正在执行 I/O 绑定(bind)、CPU 绑定(bind)或两者兼而有之。 我正在使用 p
尝试执行以下操作并出现“Got interpolation ({{}}) where expression was expected”错误。 {{item.name}} 谢谢!
我有一个导入的 Java 库,它是我解决方案中的“绑定(bind)库”项目。 我正在尝试从解决方案中的另一个项目绑定(bind)到第 3 方库中的服务。 第 3 方库文档 [在 java 中] 非常简
我是一名优秀的程序员,十分优秀!