我喜欢emacs.我喜欢正则表达式.我讨厌emacs的正则表达式语法 - 需要逃避分组的parens和braces,你不要逃避文字的parens,缺少预定义的字符类等.
我可以替换emacs的正则表达式引擎,或者调整一些设置,这样当我使用Query-replace-regexp(或许多其他功能之一)时,我可以使用我在java/js/perl/ruby/etc中编写的语法...?
编辑: 主题最初是"如何更改emacs'正则表达式引擎",它不仅会更改转义规则并添加字符类,还会(在帖子中未提及)添加对各种常见扩展的支持(?...).像非捕获parens这样的特征:(?:...),只有当/ if-not后跟:(?= ...)/(?!...)等时才匹配.我不相信(虽然很乐意纠正)这些可能与emacs的当前正则表达式引擎,并没有任何语法替换将解决这个问题.
下面的解决方案通过替换语法emacs理解来解决转义和其他char类的原始问题.第二个答案(现已删除)建议建议(添加一个函数在另一个开始时运行)emacs的正则表达式函数来替换所有正则表达式处理.作者迅速审查他/她自己意识到它可能会破坏现有的emacs代码,并最终删除了帖子.
我仍然希望将正则表达式引擎更改为支持扩展的引擎,但我同意普遍改变转义行为会造成严重破坏,我不愿意追逐.因此,我正在改变主题以匹配问题并接受回应.
我突然想到改变引擎以支持通用语法和扩展,建议正则表达式函数将emacs内部代码转换为通用语法,建议交互式函数将我的通用语法转换为emacs语法(所以它可以是转换回普通)...但我认为即使是RMS也会在此之前推荐一个分支.
我的Windows配置如下所示:
          +----------+-----------+
      |          |           |
      |          |           |
      |          |           |
      |          |           |
      |          |           |
      |          +-----------+
      |          |           |
      +----------+-----------+
我使用右下方的窗口进行特殊显示(如帮助,完成等),但是当我调用使用的命令(find-file-other-window等等)时,emacs仍坚持使用该窗口display-buffer,并调整该窗口的大小.这很烦人......有没有办法可以强制emacs不要使用那个窗口?我在考虑建议display-buffer,但这是c中的一个功能.有什么想法吗?
编辑:
基于Trey的答案,这对我来说是有用的:
(setq special-display-function 'my-display-buffer)
(setq special-display-regexps '(".*"))
(defun display-special-buffer (buf)
  "put the special buffers in the right spot (bottom rigt)"
    (let ((target-window (window-at (- (frame-width) 4) (- (frame-height) 4)))
          (pop-up-windows t))
      (set-window-buffer target-window buf)
      target-window))
(defun my-display-buffer (buf)
  "put all buffers in a window other than the one in …我想要做的是智能地为compile函数的字符串参数预先设置缓冲区本地默认值.  
现在compile.el默认使用"make"作为命令.我可以通过设置来设置它compile-command.我甚至可以将变量缓冲区本地化.如果我想要相同的静态值,那就行.  
但我想compile-command根据缓冲区的内容,缓冲区的名称,文件的包含目录的内容(如果有的话)以及月亮的相位来智能地选择.基本上我想控制默认值,然后允许交互式用户覆盖该预设值.
我希望通过以前的建议来做到这一点.但这并不像我预期的那样有效.
阅读advice.el文件,我明白了
假设一个函数/宏/子/特殊形式有N条前建议,M条左右的建议和K条后建议.假设没有任何建议受到保护,其建议的定义将如下所示(正文形式索引对应于该通知类中相应建议的位置):
([macro] lambda <arglist>
   [ [<advised-docstring>] [(interactive ...)] ]
   (let (ad-return-value)
 {<before-0-body-form>}*
       ....
 {<before-N-1-body-form>}*
 {<around-0-body-form>}*
    {<around-1-body-form>}*
      ....
       {<around-M-1-body-form>}*
      (setq ad-return-value
        <apply original definition to <arglist>>)
       {<other-around-M-1-body-form>}*
      ....
    {<other-around-1-body-form>}*
 {<other-around-0-body-form>}*
 {<after-0-body-form>}*
       ....
 {<after-K-1-body-form>}*
 ad-return-value))
这对我说的是,当建议的函数是交互式的时,`call-interactively'在调用before建议或任何建议之前调用交互式表单.
而且,当我添加建议时compile,我观察到的行为证实了这一点.处理交互式表单后将调用该通知.交互式表单建议用于编译的字符串,在我的建议有机会猜测它应该是什么之前,并预先设置它.
所以...
compile-command为任何缓冲区动态预设?想法赞赏.
我想在之前建议一些使用交互式参数的函数,例如find-dired:
(defadvice find-dired (before eab-find-dired activate)
  (message "before!")
  (setq find-args '("-iname '**'" . 10)))
但emacs只在find-dired交互式会话之后执行此建议,而我find-args之前无法设置.如何解决矛盾?
UPD.请注意,不推荐使用defadvice宏.
我使用Emacs模式来注释一些文件(实际模式并不重要)。它作为一个库提供,并附带编译的Lisp代码(当然)。我想通过覆盖其中的单个功能来修改其行为。仅用于我的本地Emacs会话。现在,我只是从库的源文件中复制粘贴该函数,对其进行一些修改,然后单击eval-last-sexp。到目前为止,一切都很好。但是,我得到的结果不一致:我不确定Emacs如何处理来自.elc文件的功能与来自源功能的混合功能。有时,我看到自己的函数版本正在运行,有时是原始版本。非常令人困惑(烦人)。
有什么想法可以不断替换Emacs库中的lisp函数而不修改库的只读源文件吗?
在回答中,我注意到:
;; Align with spaces only
(defadvice align-regexp (around align-regexp-with-spaces)
  "Never use tabs for alignment."
  (let ((indent-tabs-mode nil))
    ad-do-it))
(ad-activate 'align-regexp)
这听起来很有希望,但是...它是做什么的?
我尝试eval-region了代码块。但是对我来说,它所做的就是在align-regexp文档中添加以下内容:
建议使用此功能。
围绕建议的“ align-regexp-with-spaces”:
切勿使用制表符进行对齐。
我似乎无法实际使用align-regexp-with-spaces,如果那是什么效果……我想念的是什么?
我使用了GNU Emacs版本24.0.96.1(i386-mingw-nt6.1.7601)。
当我这样做时C-u C-SPC,emacs将我带到"我之前的位置".随后的C-u C-SPC印刷机会回到之前的位置.那太棒了,我经常使用它.
但总有一些事情让我感到困惑:标记环中唯一缺少的标记是我在第一个位置调用的地方!这就像把面包屑留在身后,然后去"哎呀,我可能会迷路,我可以回去检查一下",然后回去而不留下面包屑,你现在就在哪里!
我试过建议这个功能,但我不能以我的生活方式来编程模拟一个C-SPC C-SPC.
C-SPC C-SPC?以下是手册中对后者的说法(强调我的)C-SPC运行命令set-mark-command,它是`simple.el'中的交互式编译Lisp函数.
它与C- @,C-SPC绑定.
(set-mark-command ARG)
设置点所在的标记,或跳转到标记.设置标记也会改变区域,即点和标记之间的文本; 这是Emacs中最接近的等同于某些编辑所称的"选择".
如果没有前缀参数,请在点处设置标记,然后按下本地标记环上的旧标记位置.如果先前的标记设置在另一个缓冲区中,也要在全局标记环上按下旧标记.
但是,当我尝试使用它(非交互式)"没有前缀参数"以"在点设置标记"时,我得到一个调试器错误"错误的参数数量"..?(我意识到参数和前缀参数之间的区别).
即使有一个哲学的,非实际的答案,我也会没事的.我只想了解这里的想法.
目标:我希望show-trailing-whitespace为所有缓冲区启用一些保存.构成问题的例外情况*Shell Command Output*及其表亲*Async Shell Command*.
我经常show-trailing-whitespace定制到t.因此它在所有新缓冲区中都是活动的.
我还希望关闭某些缓冲区,其中最重要的是缓冲区*Shell Command Output*.这给我带来了一个问题:
fundamental-mode.没有fundamental-mode-hook我可以将此设置挂钩.after-major-mode-change-hook当主要的模式改为其上运行fundamental-mode,但缓冲在该模式启动,因此这个钩子无法运行.get-buffer-create.我知道我可以随时advise使用get-buffer-create这个特定示例的函数,但我尽量避免这种情况.
任何提示?
在python-mode中,有一个名为py-execute-region的函数,它将突出显示的代码区域发送到Python缓冲区进行评估.在评估之后,光标位于Python缓冲区中,但我希望它保留在脚本缓冲区中,以便我可以继续生成更多代码.我写了一个简单的建议功能:
(defadvice py-execute-region                                                
   (after py-execute-region-other-window activate)                          
   """ After execution, return cursor to script buffer """                  
   (other-window 1)                                                         
) 
但这根本不起作用.我尝试过其他变种,比如使用'around'而不是'after'; 将变量设置为脚本缓冲区名称,然后弹出缓冲区到该缓冲区和类似的东西.没有成功!我想知道这个机制对某人来说是否显而易见......谢谢!
我在守护进程模式下使用emacs,我也有一个initial-buffer-choice
变量集.有时,当我编辑我用的文件时,emacs会崩溃initial-buffer-choice.在这种情况下,当我使用--daemon启动emacs时,它将挂起并显示以下消息:
"todo.org has auto save data; consider M-x recover-this-file"
由于我主要从init脚本启动守护进程,因此我无法确认或拒绝此对话框,因此守护进程将永远挂起.在这种情况下,如何绕过自动保存数据的通知?如果有必要,我不介意丢失自动保存数据.
我试图这样做:
(defadvice command-line
  (around my-command-line-advice)
  "Be non-interactive while starting a daemon."
  (if (and (daemonp)
           (not server-process))
      (let ((noninteractive t))
        ad-do-it)
    ad-do-it))
 (ad-activate 'command-line)
但是,这不起作用.我仍然得到相同的悬挂行为.实际上,在建议中放置一条"消息"调用表明该建议根本没有被调用.
类似的问题:如果文件有自动保存数据,emacs-daemon启动会冻结.但是,此解决方案不起作用initial-buffer-choice.接受的答案似乎是从以前的版本编辑过来的,该版本可能已经成功定义了command-line我想要的建议,但不幸的是这个版本现在已经消失,取而代之的是desktop.el特定的版本.
Bob Glickstein 在“编写 GNU Emacs 扩展”的第 3 章中描述了一种建议滚动功能的方法。(他建议让它们可逆,所以我们必须在滚动之前保存状态。)
例如,对于向上滚动命令,此建议是这样完成的
(defadvice scroll-up-command (before reversibilate activate compile)
   "If it wants to be reversible, it must save the former state."
   (save-before-scroll))
好。我当然必须对所有滚动命令执行此操作。所以我想对它们进行排序,并想一起为它们提供建议。
(setq reversible-scroll-commands 
  [scroll-up-command 
   scroll-down-command 
   scroll-left-command 
   scroll-right-command])
(我使用一个向量来保存 5 个引号。)
但现在我被困住了。
(mapcar 
  (lambda (fun-name)
    (defadvice fun-name (before reversibilate activate compile)
       "If it wants to be reversible, it must save the former state."
       (save-before-scroll)))
   reversible-scroll-commands)
将建议(不存在的)函数 fun-name 四次,因为 defadvice 是一个宏,并且不评估 fun-name。
有什么办法吗?
(我正在使用 Emacs 24)
我试图让kill ring基本上忽略只有空格的条目(制表符,换行符,只是空格,etC),我对elisp很新,我很确定要做的方法是做defadvice但我有一个几个问题.
在这种情况下,我完全迷失了我应该建议的功能,它在current-kill,yank和insert-for-yank之间 - 但我并不完全确定我应该操纵哪个不从kill ring中甩出空白.
谢谢!
编辑:我很确定这样做的方法是操纵`current-kill'来保持自己调用直到它到达非空白条目?(或戒指的末尾,以先到者为准)
当我遇到一些非常奇怪的行为时,我试图回答另一个SO问题。这是我的小测试用例:
(make-variable-buffer-local
 (defvar my-override-mode-on-save nil
   "Can be set to automatically ignore read-only mode of a file when saving."))
(defadvice file-writable-p (around my-overide-file-writeable-p act)
  "override file-writable-p if `my-override-mode-on-save' is set."
  (or
   my-override-mode-on-save
   ad-do-it))
(defun my-override-toggle-read-only ()
  "Toggle buffer's read-only status, keeping `my-override-mode-on-save' in sync."
  (interactive)
  (setq my-override-mode-on-save (not my-override-mode-on-save))
  (toggle-read-only))
(defun tester-fn ()
  (interactive)
  (let ((xxx (file-writable-p "/tmp/foofoo"))
        (yyy (file-writable-p "/tmp/fooxxfoo")))
    (message (concat "XXX: " (if xxx "yes" "no") "   -   YYY: " (if yyy "yes" "no")))))
哪里:
/tmp/foofoo …