我正在尝试对 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/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它
我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
当谈到运行时自省(introspection)和动态代码生成时,我认为ruby没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资
我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司