标签: advising-functions

是否可以更改emacs的regexp语法?

我喜欢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也会在此之前推荐一个分支.

regex syntax emacs advising-functions

42
推荐指数
2
解决办法
3333
查看次数

如何强制Emacs不在特定窗口中显示缓冲区?

我的Windows配置如下所示:

          +----------+-----------+
      |          |           |
      |          |           |
      |          |           |
      |          |           |
      |          |           |
      |          +-----------+
      |          |           |
      +----------+-----------+
Run Code Online (Sandbox Code Playgroud)

我使用右下方的窗口进行特殊显示(如帮助,完成等),但是当我调用使用的命令(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 …
Run Code Online (Sandbox Code Playgroud)

lisp emacs elisp advising-functions

18
推荐指数
1
解决办法
3890
查看次数

Emacs/Emacs Lisp:我可以在交互式表单之前插入建议吗?或者如何智能地预先设置编译命令?

我想要做的是智能地为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))
Run Code Online (Sandbox Code Playgroud)

这对我说的是,当建议的函数是交互式的时,`call-interactively'在调用before建议或任何建议之前调用交互式表单.

而且,当我添加建议时compile,我观察到的行为证实了这一点.处理交互式表单后将调用该通知.交互式表单建议用于编译的字符串,我的建议有机会猜测它应该是什么之前,并预先设置它.

所以...

  • 如何在交互式表单之前运行我的代码?可以建议吗?如果不是建议,还有其他什么?要么
  • 如何compile-command为任何缓冲区动态预设?

想法赞赏.

emacs elisp defadvice advising-functions

6
推荐指数
3
解决办法
768
查看次数

建议使用emacs交互功能:之前

我想在之前建议一些使用交互式参数的函数,例如find-dired:

(defadvice find-dired (before eab-find-dired activate)
  (message "before!")
  (setq find-args '("-iname '**'" . 10)))
Run Code Online (Sandbox Code Playgroud)

但emacs只在find-dired交互式会话之后执行此建议,而我find-args之前无法设置.如何解决矛盾?

UPD.请注意,不推荐使用defadvice宏.

emacs defadvice advising-functions

6
推荐指数
2
解决办法
2499
查看次数

覆盖Emacs库中的单个函数

我使用Emacs模式来注释一些文件(实际模式并不重要)。它作为一个库提供,并附带编译的Lisp代码(当然)。我想通过覆盖其中的单个功能来修改其行为。仅用于我的本地Emacs会话。现在,我只是从库的源文件中复制粘贴该函数,对其进行一些修改,然后单击eval-last-sexp。到目前为止,一切都很好。但是,我得到的结果不一致:我不确定Emacs如何处理来自.elc文件的功能与来自源功能的混合功能。有时,我看到自己的函数版本正在运行,有时是原始版本。非常令人困惑(烦人)。

有什么想法可以不断替换Emacs库中的lisp函数而不修改库的只读源文件吗?

emacs function advising-functions

6
推荐指数
1
解决办法
335
查看次数

广告激活有什么作用?

回答中,我注意到:

;; 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)
Run Code Online (Sandbox Code Playgroud)

听起来很有希望,但是...它是做什么的?

我尝试eval-region了代码块。但是对我来说,它所做的就是在align-regexp文档中添加以下内容:

建议使用此功能。

围绕建议的“ align-regexp-with-spaces”:
切勿使用制表符进行对齐。

我似乎无法实际使用align-regexp-with-spaces,如果那是什么效果……我想念的是什么?

我使用了GNU Emacs版本24.0.96.1(i386-mingw-nt6.1.7601)。

emacs elisp defadvice advising-functions

5
推荐指数
1
解决办法
724
查看次数

emacs:如何使用标记环?

当我这样做时C-u C-SPC,emacs将我带到"我之前的位置".随后的C-u C-SPC印刷机会回到之前的位置.那太棒了,我经常使用它.

但总有一些事情让我感到困惑:标记环中唯一缺少的标记是我在第一个位置调用的地方!这就像把面包屑留在身后,然后去"哎呀,我可能会迷路,我可以回去检查一下",然后回去而不留下面包屑,你现在就在哪里!

我试过建议这个功能,但我不能以我的生活方式来编程模拟一个C-SPC C-SPC.

  • 我如何"看到"(回声,消息,跟踪等)键组合的作用,如"Ch k",但对于重复的键序列,如C-SPC C-SPC?以下是手册中对后者的说法(强调我的)

C-SPC运行命令set-mark-command,它是`simple.el'中的交互式编译Lisp函数.

它与C- @,C-SPC绑定.

(set-mark-command ARG)

设置点所在的标记,或跳转到标记.设置标记也会改变区域,即点和标记之间的文本; 这是Emacs中最接近的等同于某些编辑所称的"选择".

如果没有前缀参数,请在点处设置标记,然后按下本地标记环上的旧标记位置.如果先前的标记设置在另一个缓冲区中,也要在全局标记环上按下旧标记.

但是,当我尝试使用它(非交互式)"没有前缀参数"以"在点设置标记"时,我得到一个调试器错误"错误的参数数量"..?(我意识到参数和前缀参数之间的区别).

即使有一个哲学的,非实际的答案,我也会没事的.我只想了解这里的想法.

emacs elisp defadvice advising-functions

5
推荐指数
1
解决办法
1219
查看次数

如何更改特定基本模式缓冲区的变量

目标:我希望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这个特定示例的函数,但我尽量避免这种情况.

任何提示?

emacs defadvice advising-functions

5
推荐指数
1
解决办法
468
查看次数

关于python-mode函数的Emacs defadvice

在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)                                                         
) 
Run Code Online (Sandbox Code Playgroud)

但这根本不起作用.我尝试过其他变种,比如使用'around'而不是'after'; 将变量设置为脚本缓冲区名称,然后弹出缓冲区到该缓冲区和类似的东西.没有成功!我想知道这个机制对某人来说是否显而易见......谢谢!

python emacs elisp defadvice advising-functions

5
推荐指数
1
解决办法
1583
查看次数

当initial-buffer-choice有自动保存数据时,如何防止emacs挂起?

我在守护进程模式下使用emacs,我也有一个initial-buffer-choice 变量集.有时,当我编辑我用的文件时,emacs会崩溃initial-buffer-choice.在这种情况下,当我使用--daemon启动emacs时,它将挂起并显示以下消息:

"todo.org has auto save data; consider M-x recover-this-file"
Run Code Online (Sandbox Code Playgroud)

由于我主要从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)
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.我仍然得到相同的悬挂行为.实际上,在建议中放置一条"消息"调用表明该建议根本没有被调用.

类似的问题:如果文件有自动保存数据,emacs-daemon启动会冻结.但是,此解决方案不起作用initial-buffer-choice.接受的答案似乎是从以前的版本编辑过来的,该版本可能已经成功定义了command-line我想要的建议,但不幸的是这个版本现在已经消失,取而代之的是desktop.el特定的版本.

emacs advising-functions

5
推荐指数
1
解决办法
985
查看次数

Emacs Lisp,如何映射宏,并评估其中一个参数

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))
Run Code Online (Sandbox Code Playgroud)

好。我当然必须对所有滚动命令执行此操作。所以我想对它们进行排序,并想一起为它们提供建议。

(setq reversible-scroll-commands 
  [scroll-up-command 
   scroll-down-command 
   scroll-left-command 
   scroll-right-command])
Run Code Online (Sandbox Code Playgroud)

(我使用一个向量来保存 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)
Run Code Online (Sandbox Code Playgroud)

将建议(不存在的)函数 fun-name 四次,因为 defadvice 是一个宏,并且不评估 fun-name。

有什么办法吗?

(我正在使用 Emacs 24)

emacs elisp defadvice advising-functions

5
推荐指数
1
解决办法
832
查看次数

Emacs - 跳过空白杀戮

我试图让kill ring基本上忽略只有空格的条目(制表符,换行符,只是空格,etC),我对elisp很新,我很确定要做的方法是做defadvice但我有一个几个问题.

  • 最好是阻止空白条目首先进入杀戮戒指,还是跳过它们?我假设后者.

在这种情况下,我完全迷失了我应该建议的功能,它在current-kill,yank和insert-for-yank之间 - 但我并不完全确定我应该操纵哪个不从kill ring中甩出空白.

谢谢!

编辑:我很确定这样做的方法是操纵`current-kill'来保持自己调用直到它到达非空白条目?(或戒指的末尾,以先到者为准)

emacs elisp defadvice advising-functions

4
推荐指数
1
解决办法
310
查看次数

如何在Emacs中建议原语

当我遇到一些非常奇怪的行为时,我试图回答另一个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")))))
Run Code Online (Sandbox Code Playgroud)

哪里:

  • /tmp/foofoo …

emacs elisp defadvice advising-functions

4
推荐指数
1
解决办法
415
查看次数

标签 统计

advising-functions ×13

emacs ×13

defadvice ×9

elisp ×8

function ×1

lisp ×1

python ×1

regex ×1

syntax ×1