- 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/
我不知道该怎么做... function f1() { var x = 10; function f2(fx) { var x; x = 6;
早期绑定(bind)和后期绑定(bind)有什么区别? 最佳答案 简短的回答是,早期(或静态)绑定(bind)是指编译时绑定(bind),后期(或动态)绑定(bind)是指运行时绑定(bind)(例如
如何在 SwiftUI View 上使用 Binding(get: { }, set: { }) 自定义绑定(bind)与 @Binding 属性。我已成功使用此自定义绑定(bind)与 @State
我经常发现自己遇到问题,即控件的两个(相关)值被更新,并且两者都会触发昂贵的操作,或者控件可能会暂时处于不一致的状态。 例如,考虑一个数据绑定(bind),其中两个值 (x,y) 相互减去,最终结果用
我想通过我的 ViewModel 控制我的一个窗口的高度和宽度。 这看起来很简单。 但没有。它不起作用。 它检查 ViewModel 的 Width但不是 Height . 奇怪的是,如果我切换 W
UI5中一次性绑定(bind)和单向绑定(bind)有什么区别? 是否有任何用户特定的用例我会使用它们? 我无法从文档中获得太多信息。 最佳答案 单程 它的作用:单向数据流。模型数据的变化(例如通过
(define make (lambda (x) (lambda (y) (cons x (list y))))) (let ((x 7) (p (make 4))) (cons
尽管我或多或少地了解什么是语言绑定(bind),但我很难理解它们是如何工作的。 例如,谁能解释一下如何为 WinAPI 制作 Java 绑定(bind)? 最佳答案 如果您搜索 Foreign Fun
谁能解释为什么我可以重新绑定(bind)列表但不能+? (binding [list vector] (list 1 3)) (binding [list +] (list 1 3)) (bi
我真的很喜欢 Caliburn 和命名约定绑定(bind),我很惊讶 可见性与“CanNAME”约定用于保护 Action 的方式不同。 据我所知, BooleanToVisibilityConver
我了解动态绑定(bind)的实现方式以及静态绑定(bind)和动态绑定(bind)之间的区别,但我只是无法理解动态绑定(bind)的定义。基本上它是一种运行时绑定(bind)类型。 最佳答案 基本上,
http://jsfiddle.net/3NRsd/ var foo = $("div").bind("click", function() { $("div").animate({"hei
这个问题我快疯了...我有一个用户控件,它有一个用于插入操作的 FormView 和一个用于所有其他操作的 GridView。 在这两个控件中,我都有一个 DropDownList,如下所示: '
我有一个绑定(bind)到 ListBox 的地址的 ObservableCollection。然后在 ItemTemplate 中,我使用 {Binding .} 绑定(bind)到当前地址记录。这
如果我有以下简单的 js/knockout 代码: .js( View 模型): var image = ko.observable('http://placehold.it/300x150'); 看
我正在 aurelia 上开发一个自定义属性,让用户在输入文本区域时从列表中进行选择。例如,用法将是这样的: 正如您可能注意到的,auto-complete是属性。现在,当我想显示提示时,我想在自定
我正在使用 EventEmitter2作为我的应用程序内部的消息总线。现在我需要绑定(bind)和取消绑定(bind)一些事件处理程序。因为我也希望他们bind将它们添加到给定的上下文中,我最终得到以
我有以下函数调用: $(".selector").on("click", callback.bind(this, param1, param2)); 在我的回调函数中,我想使用绑定(bind)的 th
我目前正在试验新的编译绑定(bind),并且(再次)达到了我在拼图中遗漏了一个小问题:为什么我必须调用 Bindings.Update?直到现在,我还认为实现 INotifyPropertyChang
我正在阅读一本关于编写 JavaScript 框架的书,并找到了这段代码。但是我不明白它是如何工作的,尤其是 bind.bind 的用法?有人知道吗? var bind = Function.prot
我是一名优秀的程序员,十分优秀!