问题标签 [advising-functions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
908 浏览

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

Bob Glickstein 在“编写 GNU Emacs 扩展”第 3 章中描述了一种建议滚动功能的方法。(他建议让它们可逆,所以我们必须在滚动之前保存状态。)

例如,对于向上滚动命令,此建议是这样完成的

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

(我使用一个向量来保存 5 个引号。)

但现在我被困住了。

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

有什么办法吗?

(我正在使用 Emacs 24)

0 投票
1 回答
303 浏览

emacs - Emacs term-mode:停止在某些主机上设置远程默认目录

我曾经term-mode在 Emacs 中运行 Bash shell。在远程主机上,term-mode的目录跟踪功能有助于将default-directory主机名设置在其中,以便通过 Tramp 远程完成选项卡完成和文件访问。然而,有时我使用与我的工作站共享相同文件系统的远程主机,因为它们从 NFS 加载相同的目录。在这些情况下,流浪汉让我放慢了太多的速度。我希望在使用这些系统时,让 Emacs 在default-directory本地设置。为此,我term-handle-ansi-terminal-messages已从系统复制term.el到我的.emacs. 我替换这部分:

有了这个:

这调用了一个term-equivalent-filesystem-host-group-p函数,该函数告诉主机是否应该被视为具有等效的文件系统。

此方法具有预期的效果,但复制和修改系统 Lisp 代码对代码中的任何未来更改都不可靠。我认为如果不复制其一半的功能(消息循环或default-directoryange-ftp-...变量的设置),就不可能为该函数提供建议。

有一个更好的方法吗?

0 投票
4 回答
1495 浏览

emacs - emacs:如何使用标记环?

当我执行 aC-u C-SPC时,emacs 会将我带到“以前的位置”。随后C-u C-SPC的压力会回到以前的位置。这太棒了,我经常使用它。

但是有些事情总是困扰着我:标记环中唯一缺少的标记是where-I-invoked-this-in-the-1st-place!这就像在你身后留下面包屑,然后去“哎呀,我可能会迷路,我回去检查一下”,然后在你现在所在的地方不留下面包屑!

我尝试为该功能提供建议,但我无法终生以编程方式模拟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 中最接近某些编辑器所称的“选择”的等价物。

在没有前缀参数的情况下,将标记设置为点,并将旧标记位置推到本地标记环上。如果前一个标记设置在另一个缓冲区中,也将旧标记推到全局标记环上。

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

即使有一个哲学的,非实用的答案,我也可以。我只是想了解这里的想法。

0 投票
3 回答
417 浏览

emacs - Emacs - 跳过空格杀死

我正在尝试使 kill ring 基本上忽略仅空白条目(制表符、换行符、仅空格等),我对 elisp 相当陌生,我很确定要做的方法是做 defadvice 但我有一个几个问题。

  • 首先阻止空白条目进入杀戮环,还是在猛拉时跳过它们会更好?我假设后者。

在这种情况下,我完全不知道应该建议哪个函数,它在 current-kill、yank 和 insert-for-yank 之间——但我不完全确定我应该操纵哪个函数来不从 kill ring 中拉出空格。

谢谢!

编辑:我很确定这样做的方法是操纵“current-kill”以继续调用自己,直到它到达一个非空白条目?(或环结束,以先到者为准)

0 投票
2 回答
577 浏览

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模式更改为时运行 which fundamental-mode,但缓冲区以该模式启动,因此此挂钩未运行。
  • 好像没有办法勾搭get-buffer-create

我知道我总是可以使用这个特定示例advise的功能get-buffer-create,但我会尽量避免这种情况。

有什么提示吗?

0 投票
5 回答
252 浏览

emacs - 仅当从某个其他函数调用时才触发对函数的建议

我正在尝试解决dired-do-shell-command不能!在当前目录和父目录...'. 堆栈跟踪粘贴在底部。

我可以定义如下建议来绕过此错误:

但这会影响对dired-get-filename. 我希望它仅在堆栈为dired-do-shell-command -> dired-get-marked-files -> dired-get-filename.

我能想到的唯一方法如下

  • (with-output-to-string (backtrace))在建议定义中搜索匹配项
  • 将周围的建议添加到其他方法以设置一些可以在建议定义中测试的变量。

有更好的方法吗?我想我正在寻找对当前堆栈跟踪的访问作为数据结构而不是来自的字符串(backtrace)

为什么 dired-do-shell-command 不能对 '.' 进行操作 或者 '..'?

0 投票
2 回答
163 浏览

emacs - 只写缓冲区?

我想模仿大多数控制台在缓冲区中的工作方式,有什么办法吗?即只允许将文本附加到缓冲区,但不能删除?

可能我可以禁用或建议一些删除字符的内置功能,但恐怕这不是一个非常可扩展的解决方案......我可能会错过一些。

0 投票
1 回答
245 浏览

emacs - 为 setf 添加新的变量指示符?

我认为这在 Common Lisp 中是可能的(通过重载setf),但不确定 Emacs Lisp。

我想做的是:

表单(local ...)将调用我编写的一些代码并返回用于设置其值槽的符号。

编辑:从 gv.el 看来,建议似乎gv-get可以完成这项工作,但也许有更好的程序呢?

EDIT2:尝试了 Stefan 的建议,关闭,但不好:(

扩展为:

显然,不是我想要的。我试图通过上面提到的建议和 with 来做到这一点gv-define-expander,但是引用太多了,我找不到let用冗余替换来松散表达式部分的方法。

编辑3:

好的,除非我在范围或变量将设置为的值的评估顺序中严重搞砸了一些东西,这似乎有效:

0 投票
2 回答
94 浏览

emacs - 正确处理失败的片段完成

我使用 TAB 从 yasnippet 扩展片段,当它不扩展片段时,它通常会退回到缩进(绑定到 TAB 的默认命令),这由 yasnippets 自定义变量引用,yas-fallback-behavior它只能是call-other-commandor return-nil

我想要的功能是在点击 TAB 时:

  1. 尝试完成片段、成功或静默失败。
  2. 检查我们是否处于 PHP 模式,并php-complete-function静默调用、成功或失败。
  3. 默认为其当前的缩进命令 ( indent-for-tab-command)。

它目前完美地执行 1,然后是 3。yas--fallback但是,通过使用这段代码提供建议,我能够使其大部分工作:

剩下的唯一主要问题是,当尝试使用 TAB 缩进任何内容时,php-complete-function不会静默失败,而是会向 minibuffer 发送垃圾邮件,其中包含来自 PHP 完成的多次检查的消息。

那么有没有办法在这种情况下禁止来自该函数的消息传递,而无需进行所有相同的检查,它实际上是在我的建议中重新编程该函数?或者,有没有更好的方法来使用 yasnippet 来开始我所缺少的?

0 投票
2 回答
511 浏览

emacs - defadvice 可以在原始函数中使用变量吗?

让我以Emacs Lisp 中的修改示例为例:如何使用 ad-get-arg 和 ad-get-args?

(my-add 1 2 3)将运行良好的输出:

(my-add 1 2)无法c从原始函数中获取值:

我的问题是如何在defadvice正文中使用未提供的可选参数(或更一般地说,原始函数中的变量)?