我正在尝试我对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或关闭打开的文件?这是自我修改的编辑器,我认为这是可能的.
例如,这是一个宏:
(defmacro my-macro (x y)
(if (> x 0)
`(lambda (z) (+ z ,y))
`(lambda (z) (+ ,x z))))
Run Code Online (Sandbox Code Playgroud)
并(my-macro 2 3)返回(lambda (z) (+ z 3))
但是,((my-macro 2 3) 1)返回错误说,
Debugger entered--Lisp error:
(invalid-function (my-macro 2 3))
((my-macro 2 3) 1)
eval(((my-macro 2 3) 1))
eval-last-sexp-1(nil)
eval-last-sexp(nil)
call-interactively(eval-last-sexp nil nil)
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
对于上下文,我是一个emacs新手.我没有使用它很长时间,但已经越来越多地使用它(我非常喜欢它).我也很熟悉lisp,但不熟悉elisp.
我需要做的是将正则表达式绑定到键盘组合,因为我经常使用这个特定的正则表达式.
我一直在做什么:
M-C-s ^.*Table\(\(.*\n\)*?GO\)
Run Code Online (Sandbox Code Playgroud)
注意,我上面使用了换行符,但是我发现isearch-forward-regexp,你真的需要用\n正则表达式替换正则表达式C-q Q-j.这会插入一个文字换行符(不结束命令),这样我就可以在表达式中添加换行符并跨行匹配.
如何将其绑定到组合键?
我隐约明白我需要创建一个isearch-forward-regexp用表达式执行的elisp函数,但我对细节很模糊.我搜索了谷歌,发现大多数文档都有点令人困惑.
如何将正则表达式绑定到emacs中的键组合?
迈克斯通到目前为止得到了最好的答案 - 不完全是我想要的,但它适用于我需要的东西
编辑 - 这种方式有效,但在存储宏之后,当我以后再使用它时,我无法使用它C-x e.(即,如果我重新启动emacs然后键入M-x macro-name,然后C-x e,我在迷你缓冲区中收到一条消息,如'no last kbd macro'或类似的东西)
@Mike Stone - 感谢您提供的信息.我试过像这样创建一个宏:
C-x( M-C-s ^.*Table\(\(.*C-q C-J\)*?GO\) C-x)
Run Code Online (Sandbox Code Playgroud)
这创建了我的宏,但是当我执行我的宏时,我没有得到我使用时通常得到的相同突出显示isearch-forward-regexp.相反,它只是跳到表达式的下一个匹配结束.所以这并不适用于我需要的东西.有任何想法吗?
编辑:看起来我可以使用宏来做我想要的事情,我只需要在框外思考isearch-forward-regexp.我会尝试你的建议.
我正在使用ELPA的Clojure模式包.否则一切都很好,但我无法忍受paredit模式.我似乎无法轻易将其关闭,现在我只是为我打开的每个缓冲区禁用它.我尝试将此变量设置为nil:
(setq clojure-enable-paredit nil)
Run Code Online (Sandbox Code Playgroud)
但paredit仍然出现.有任何想法吗?
在emacs中,我已经阅读了以下代码片段simple.el:
(frame-parameter frame 'buried-buffer-list)
Run Code Online (Sandbox Code Playgroud)
'buried-buffer-list参数的确切含义是什么?它用于什么?
Emacs Lisp replace-string已经没有了replace-char.我想用常规ASCII引号替换"印刷"卷曲引号(此字符的Emacs代码是十六进制53979),我可以这样做:
(replace-string (make-string 1 ?\x53979) "'")
Run Code Online (Sandbox Code Playgroud)
我认为这会更好replace-char.
做这个的最好方式是什么?
我的.emacs文件中有很多自定义内容:字体,颜色,窗口大小,键绑定等等.所有这些都有效.
然后在最后,我刚刚添加了:(setq case-fold-search nil).这是一个变量,当设置nil为应该在所有emacs模式下使搜索区分大小写时.它不适合我.
在单个缓冲区中设置case-fold-search为nil有效,但是当我将其设置为时.emacs,它不起作用.是否有理由为什么a中的setq声明.emacs有时可能不起作用?我该如何尝试调试此问题?
当我执行M-x compile或获取elisp编译错误时,我的emacs垂直拆分窗口,并在新窗口中显示编译输出/错误消息.我更喜欢在全屏窗口中使用缓冲区,因为垂直分割窗口对我来说太窄了.我可以告诉emacs 不拆分窗口并执行M-x switch-buffer编译/错误缓冲区吗?
编辑:Trey的建议适用于编译.有没有办法为所有拆分窗口的命令设置它?我想到的三个是elisp编译,M-x apropos和M-x occur.
我在emacs中进行大部分开发,并使用bzr进行版本控制.我推断这c-x v =相当于bzr diff,但我不清楚如何从emacs中提交,或者各种bzr命令如何映射到emacs键绑定.任何人都可以建议最好的方法或指向我的教程吗?
我的c/c ++项目往往有相当简单的目录结构,分离出src,include,bin等.我也倾向于在最上面的目录中有一个主makefile.当在Emacs中这样工作时,我总是必须发布M-x cd uppermost-dir,以便我的编译快捷方式按预期工作.
有没有办法让当前目录与我启动Emacs的目录相同?也就是说,当我打开文件时,我可以阻止Emacs更改其工作目录吗?
或者,对于典型的工作流程,是否存在一些关键的问题,在Emacs中只有这样的目录层次结构?