我有一个函数permanent-set-key
,可以自动将本地和全局的键绑定定义添加到init文件中。当用户请求添加本地键绑定时,该函数使用this非常强大的方法从我之前提到的问题的答案中确定当前本地键映射。
所以现在我知道了(current-local-map)
的符号名称,并且有适当的sexp来定义所需的键,例如:
(define-key python-shell-map [3 6] 'python-describe-symbol)
但是,在初始化时,通常这些地图是未定义的,因此急切地评估上面的表格会导致错误。
在适当的时间安排这些表格安排的强有力的程序化方法是什么?
到目前为止我一直在做的是假设当前本地地图存在次要模式,然后猜测次要模式文件的名称,以便以eval-after-load
形式包装上述sexp,根据公约foo-mode-mode-map
。例如,这是自动生成的:
(eval-after-load 'dired '(define-key dired-mode-map [8388711] 'run_gdmap_dired))
并且恰好工作(因为确实存在dired
模式和文件)。
对于第一个示例,此方法不起作用:不存在python-shell
次要或主要模式。主模式comint-mode
处理几个“子模式”,因此只添加“python”版本所需的自定义似乎不合适。
如何确定定义符号的文件名,例如python-shell-map
?
我想我可以使用after-load-functions并检查可能已定义的所有新符号,但也许有更直接的解决方案。
答案 0 :(得分:2)
我刚刚找到了自己的答案,感谢我之前没有注意到的apropos
:
(symbol-file SYMBOL &optional TYPE)
For more information check the manuals.
Return the name of the file that defined SYMBOL.
The value is normally an absolute file name. It can also be nil,
if the definition is not associated with any file. If SYMBOL
specifies an autoloaded function, the value can be a relative
file name without extension.
If TYPE is nil, then any kind of definition is acceptable. If
TYPE is `defun', `defvar', or `defface', that specifies function
definition, variable definition, or face definition only.
[back]
这样可行:
(symbol-file 'python-shell-map)--> "/usr/share/emacs/23.3/lisp/progmodes/python.elc"
编辑:
只是为了使其更明确:
(format "(eval-after-load \"%s\" '%s)" (symbol-file keymap-symbol) define-key-sexp)
答案 1 :(得分:1)
获得所需行为的另一种方法可能是生成以下形式的代码:
(add-hook '<MAJOR-MODE>-hook
(lambda () (local-set-key <KEY> <BINDING>)))
通过这种方式,您不必关心键盘映射表的名称,也不必关心用于初始化键盘映射表变量的文件名。
答案 2 :(得分:0)
评论后更正:对我来说,运行python.el为24.3:
(eval-after-load 'python-mode (lambda ()
(funcall (define-key inferior-python-mode-map MY-KEY COMMAND))))
答案 3 :(得分:0)
我最终使用的另一个解决方案是使用after-load-functions
挂钩定义一个函数eval-after-sym-loaded
,一旦给定的符号在{{{}之后绑定,它就会计算0-ary函数。 1}}调用 - 可能立即:
load-file