Questions tagged «elisp»

与其他语言(尤其是与其他Lisp方言相比)有关Emacs Lisp作为一种语言的问题。也就是说,它是关于语言本身的问题。*请勿使用*关于*使用* Emacs Lisp的问题。Emacs Lisp是Emacs编辑器所基于的脚本和编程语言。

2
如何正确使用defcustom?
像大多数Emacs用户一样,我通过更改变量自定义了模式。对我而言,从未发生过的事情就是可以自定义“那个和那个”。当我开始查看eshell的一些源代码时,我意识到了这一点。我不是elisp程序员,但em-ls.el似乎专门使用defcustom,defgroup等。这似乎是elisp代码使用的全局定义变量的影子世界。因此,一个问题是,是否使用defcustom另一种处理(可自定义的)全局变量的方式? 谁能指出我如何正确使用(首先理解)背后的全部思想defcustom,何时使用,为什么,何时不使用?也许是elisp初学者的初学者示例。
15 elisp  defcustom 


2
函数或宏可以指定字节编译器警告吗?
我正在编写一个函数,该函数原则上接受任意数量的参数。但是,实际上,它只能传递 偶数个参数,否则会产生不良结果。 这是上下文的虚拟示例: (defun my-caller (&rest args) (while args (call-other-function (pop args) (pop args)))) 当对elisp文件进行字节编译时,如果字节编译器看到调用了错误数量的参数的函数,则会引发警告。显然,这绝不会发生my-caller,因为它被定义为可以接受任何数字。 仍然可能有一个我可以设置的符号属性,或者一个(declare)我可以添加到其定义中的表格。通知用户此函数应仅被赋予偶数个参数的信息。 有没有办法告知字节编译器此限制? 如果不是,是否可以使用宏而不是函数?



2
单引号和逗号引号的含义是什么?(引号,arg)
(quote x)使x不被评估,但在内的,前面添加一个使其被评估。那么使用带引号的单引号前面有逗号的意义是什么?xquote(quote ,x) 由第59行的恼人箭头所激发: (put (quote ,cmd) 'aa--alts ,alternatives) 为什么不(put cmd 'aa-alts ,alternatives)一样好?
15 elisp  backquote 

3
有什么方法只能运行一次挂钩函数吗?
上下文 我正在使用after-make-frame-functions挂钩在emacs客户端/服务器配置中正确加载主题。具体来说,这是我用来创建代码段(基于此SO答案): (if (daemonp) (add-hook 'after-make-frame-functions (lambda (frame) (select-frame frame) (load-theme 'monokai t) ;; setup the smart-mode-line and its theme (sml/setup))) (progn (load-theme 'monokai t) (sml/setup))) 问题 当emacsclient -c/t开始新的会话时,不仅在新框架中,而且还在所有先前存在的框架(其他emacsclient会话)中执行挂钩,这会产生非常烦人的视觉效果(在所有那些框架中再次加载主题)。更糟糕的是,在终端中已经打开的客户端的主题颜色就完全混乱了。显然,这仅在连接到同一emacs服务器的emacs客户端上发生。出现这种现象的原因很明显,该挂钩在服务器上运行,并且其所有客户端都受到影响。 问题 有什么方法可以只执行一次此功能,也可以不使用钩子而获得相同的结果吗? 部分解决方案 由于@Drew的回答,我现在有了这段代码。但是仍然存在问题,一旦在终端中启动客户端会话,GUI将无法正确加载主题,反之亦然。经过大量测试,我意识到其行为取决于首先启动哪个emacsclient,并且丢弃各种东西后,我认为它可能与所加载的调色板有关。如果您手动重新加载主题,那么一切都可以正常工作,这就是为什么每次在钩子上调用函数时都不会出现此行为的原因,就像在我的初始配置中一样。 (defun emacsclient-setup-theme-function (frame) (progn (select-frame frame) (load-theme 'monokai t) ;; setup the smart-mode-line and its theme (sml/setup) …

1
为什么setq和set quote在具有词法作用域的让界变量上有不同的作用?
我的一个扩展程序中存在一个错误,最终导致该错误是由于set我没有按预期工作: ;; -*- lexical-binding: t -*- (let ((a nil)) (setq a t) (print a)) (let ((a nil)) (set 'a t) (print a)) 与emacs -Q --batch -l temp.el打印一起运行时: t nil 这对我来说似乎很奇怪。我的印象(setq a b)是速记(set 'a b)。这是怎么回事?

1
为什么elisp文件的文件末尾有注释?
为什么elisp文件通常以结尾 ;;; file.el ends here? 有什么历史原因为什么这样做有用?我已经在elisp样式指南中看到它的推荐,但在现代elisp软件包中仍然看到它。 auto-insert-mode默认情况下,还会在新的elisp文件中添加这样的注释。


2
有条件的“和”与“何时”
这是对该答案的评论的后续。以下代码似乎是等效的: (and a b) (when a b) 当然,and让你把更多的条件:(and a b c d)手段(when (and a b c) d) 我倾向于when只用来表示分支。有实际差异吗?使用其中一个更好吗? 我手头没有Emacs的C源代码;and是C函数;when是一个扩展为的宏if,它本身是C函数。

7
Elisp代码以检查互联网连接
当我打开Emacs时,它将评估我的初始化文件,该文件包括通过Internet连接刷新我的软件包档案。当我没有互联网连接时,这是有问题的,因此在没有互联网连接的情况下启动Emacs时,我需要阻止执行该代码。为了解决此问题,我想知道当我没有互联网连接时是否有一种方法让Emacs忽略软件包刷新代码吗? 这是我的前几行init.el: ;; Requisites: Emacs >= 24 (require 'package) (package-initialize) ;; PACKAGE MANAGEMENT (add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t) (package-refresh-contents) 我想我可以添加代码来加载我的Emacs文件,如下所示: ;; Requisites: Emacs >= 24 (when (connected-to-internet-p) ; I need this predicate function (require 'package) (package-initialize) (add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t) (package-refresh-contents)) 是否有(connected-to-internet)功能或类似方法来解决此问题?
13 elisp  networking 

4
使用挂钩设置主要模式键与将其添加到模式图之间的区别
假设我已经下载了一个名为的主模式magical-mode,它有自己的神奇键盘映射magical-mode-map。此模式还提供了一个钩子magical-mode-hook,该钩子每次magical-mode成为缓冲区的主要模式时都会运行。现在,我想修改我的初始化文件,以添加一些自定义键绑定以在该模式下使用。 似乎有(至少)两种方法来为设置自定义键绑定magical-mode。我最常看到的是: (defun my-magical-keys () (local-set-key (kbd "C-i") 'previous-line) (local-set-key (kbd "C-k") 'next-line) (local-set-key (kbd "C-j") 'backward-char) (local-set-key (kbd "C-l") 'forward-char)) (add-hook 'magical-mode-hook 'my-magical-keys) 但是也可以这样进行: (define-key magical-mode-map (kbd "C-i") 'previous-line) (define-key magical-mode-map (kbd "C-k") 'next-line) (define-key magical-mode-map (kbd "C-j") 'backward-char) (define-key magical-mode-map (kbd "C-l") 'forward-char) 第二种方法对我来说似乎更干净。 一种方法比另一种方法有任何优势吗?

9
如何编辑elisp而不使括号丢失
我正在从linum.el修改一些elisp代码: (custom-set-variables '(linum-format 'dynamic)) (defadvice linum-update-window (around linum-dynamic activate) (let* ((w (length (number-to-string (+ (count-lines (point-min) (point-max)) 1)))) (linum-format (concat " %" (number-to-string w) "d "))) ad-do-it)) 通过修改(count-lines (point-min) (point-max))为,我能够修复缩进不一的错误(+ (count-lines (point-min) (point-max)) 1)。那很简单。 但是现在我想修改它,以便通过(concat " %" (number-to-string w) "2d ")在行数计数<10 的情况下添加if条件来最小宽度为2 。 这应该很容易!添加一个条件并复制/粘贴concat。小菜一碟吧?我的意思是,我知道我应该做的,但我很少过问elisp的,当我需要修改,有很多括号的任何东西我总是吓倒。 据我所知,“正确”的样式是基于缩进来构造代码,并在行的末尾而不是单独地将尾括号括起来。来自其他“ C”风格的语言,我很难以这种方式读写代码。所以我的问题是:我在做什么错?我应该如何编辑elisp并浏览代码,而不必坐在那里计算每个括号? 当我在elisp中处理过深的东西时,我必须关上门,拉开百叶窗,然后开始放置括号中的K&R样式,这样我不仅可以阅读而且可以修改令人毛骨悚然的东西而不会感到惊讶。 显然我做错了。我如何能这样无惧地触摸elisp? 请注意,我的问题是如何导航和编辑elisp而不是样式问题。我已经使用以下内容作为样式指南:https : …

4
“符号值”有什么作用?
该文档使我不明智: 此函数返回存储在符号的值单元格中的值。在此存储变量的当前(动态)值。如果变量没有本地绑定,则这只是其全局值。如果变量为空,则发出空变量错误信号。 符号值的意义是什么?我需要在何时何地使用它?
13 elisp  symbols 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.