我正在使用Emacs.
有没有办法在函数上添加钩子?
假设有降价输出功能.
它旨在将HTML文件导出到当前工作'markdown file'的当前目录中.
但是,我想将HTML文件导出到另一个目录中.如何在没有修改Emacs markdown插件(markdown-mode.el)的情况下执行此操作?
这是markdown-mode.el出口功能:
(defun markdown-export (&optional output-file)
"Run Markdown on the current buffer, save to file, and return the filename.
If OUTPUT-FILE is given, use that as the filename. Otherwise, use the filename
generated by `markdown-export-file-name', which will be constructed using the
current filename, but with the extension removed and replaced with .html."
(interactive)
(unless output-file
(setq output-file (markdown-export-file-name ".html")))
(when output-file
(let* ((init-buf (current-buffer))
(init-point (point))
(init-buf-string (buffer-string))
(output-buffer (find-file-noselect …Run Code Online (Sandbox Code Playgroud) 我知道你可以做
M-x load-theme RET
Run Code Online (Sandbox Code Playgroud)
并获取可自动完成的可用主题列表,您可以选择其中一个。
我正在寻找的是一种通过Emacs LISP获取此主题列表的方法,因此我可以使用自定义键绑定来循环浏览它,而不必查看所有可用主题并手动切换到一个主题。
我想使用list作为堆栈(或者可能有堆栈数据类型),推送一些东西(缺点),然后在以后弹出它,在elisp中最简单的方法是什么?
我认为这add-to-list会像推动一样,但我对流行音乐有什么用?
我有一个操作符,操作变量列表,如下所示:
(myfunc arg1 nil arg2 arg3)
Run Code Online (Sandbox Code Playgroud)
我需要选择(依赖于我们将调用的布尔变量my_bool)向该列表添加一个额外的参数,以便函数调用如下所示:
(myfunc arg1 nil arg2 added_argument arg3)
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是使用if块这样做:
(myfunc arg1 nil arg2 (if mybool t nil) arg3)
Run Code Online (Sandbox Code Playgroud)
但是如果mybool等于nil函数语法不允许的话,那将导致nil .
我的第二个想法是,也许我们可以过滤列表为nil并删除它,但我们无法因为首先出现的nil(或者说我想不出办法,我很乐意被证明是错误的,只是寻找解决方案).
我的第三个想法是,如果我们有像红宝石那样的splat操作符'我们可以过滤然后splat,所有都将被整理出来,所以这样:
(myfunc arg1 nil (mysplat arg2 (filter (!= nil) (if mybool t nil)))) arg3)
Run Code Online (Sandbox Code Playgroud)
但是我找不到splat运算符(技术上更像是一个列表解构运算符)(PS上面的代码是近似的,因为它是一个不起作用的解决方案,所以我确定在那里.
所以我的问题是如何可选地向函数调用添加单个参数,如果不这样做,则不会产生nil作为该参数.
在此先感谢,对不起我的新秀emacs lisp技能:(.
我正在寻找一些帮助,以提取已标记的文件和/或目录列表的所有元素dired-mode.从本质上讲,如果有某种方法可以从结果周围删除括号(mapcar (lambda (filename) (file-name-nondirectory filename)) (dired-get-marked-files)),那么就可以了.
(start-process
"name-of-process"
"*output-buffer*"
"/usr/bin/zip"
"zip-file-name.zip"
(mapcar
(lambda (filename) (file-name-nondirectory filename))
(dired-get-marked-files)) )
Run Code Online (Sandbox Code Playgroud)
我寻求的结果将如下所示:
(start-process
"name-of-process"
"*output-buffer*"
"/usr/bin/zip"
"zip-file-name.zip"
"filename-number-one"
"filename-number-two"
"filename-number-three" )
Run Code Online (Sandbox Code Playgroud)
编辑:
该start-process函数通常不接受单个连接的参数字符串.相反,每个参数必须单独拼写(每个参数周围都有引号),或者参数可以是变量.
以下是上面第一个示例中的调试器消息 - 发生错误是因为文件名周围有一个括号 - 即它不能是列表.
Debugger entered--Lisp error: (wrong-type-argument stringp ("file-name-number-one" "file-name-number-two" "file-name-number-three"))
start-process("name-of-process" "*output-buffer*" "/usr/bin/zip" "zip-file-name.zip" ("file-name-number-one" "file-name-number-two" "file-name-number-three"))
eval((start-process "name-of-process" "*output-buffer*" "/usr/bin/zip" "zip-file-name.zip" (mapcar (lambda (filename) (file-name-nondirectory filename)) (dired-get-marked-files))) nil)
(cons (eval exp lexical-binding) values)
(setq values (cons (eval …Run Code Online (Sandbox Code Playgroud) 在Emacs Lisp中,我似乎无法从列表中删除最后一项.
;; This works.
(setq list1 '(alpha beta))
(delete 'alpha list1) ;; => (beta)
;; list1 => (beta)
;; NOPE.
(setq list1 '(alpha))
(delete 'alpha list1) ;; => nil
;; list1 => (alpha)
Run Code Online (Sandbox Code Playgroud)
为什么?
如果有可能的话,我该怎么做?
在emacs中编辑.emacs.el时,我运行了Alt + X eval-buffer命令.我的操作系统是Windows.当我重新启动emacs时,它会显示以下警告:
警告(初始化):加载`... /.emacs.el'时发生错误:
错误:用于Unicode转义的非十六进制数字
为确保正常运行,您应该调查并删除初始化文件中的错误原因.使用`--debug-init'选项启动Emacs以查看完整的错误回溯.
.emacs.el是:
;;Open all fine in one running instance
;;Ref:http://www.johndcook.com/blog/2010/07/28/miscellaneous-emacs-adventures/
;;(server-start)
;;TEST
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
`(ansi-color-names-vector ["#242424" "#e5786d" "#95e454" "#cae682" "#8ac6f2" "#333366" "#ccaa8f" "#f6f3e8"])
`(custom-enabled-themes (quote (wheatgrass))))
(custom-set-faces
;; custom-set-faces was added by …Run Code Online (Sandbox Code Playgroud) 我遇到的行为setcdr似乎表明它不局限于在不同缓冲区中包含相同名称的缓冲区局部变量.我尝试过使用with-current-buffer,但这并不能解决问题.
例如,buffer-A并且buffer-B都含有一个名为局部变量variable-one,这是一种cons细胞-例如(overlay-string t),与setcdr正被用来设置cdr值要么t或nil.
有没有办法确保setcdr仅限于修改缓冲区本地值?
我学习了Emacs Lisp,因为我想自定义我的编辑器并且要清楚我对动态绑定的工作原理有点困惑.
这是一个例子:
(setq y 2)
(let ((y 1)
(z y))
(list y z))
==> (1 2)
Run Code Online (Sandbox Code Playgroud)
结果我回来了=> (1 2) 请一些人解释一下究竟发生了什么.我尝试使用框架的概念来解释它,每个框架创建本地绑定,但它似乎在这里以不同的方式工作.
为什么它不在最近的帧中取最接近的'y'值?
如果可以详细描述这里发生了什么,我会很高兴.
提前致谢.缺口.
Lisps经常声明,某些类型是自我评估的.例如,在emacs-lisp数字,"字符串",:关键字 - 符号和一些更多评估自己.
或者,更具体地说:评估表单并再次评估结果会得到相同的结果.
也可以创建自定义自我评估表单,例如
(defun my-list (&rest args)
(cons 'my-list (mapcar (lambda (e) (list 'quote e)) args)))
(my-list (+ 1 1) 'hello)
=> (my-list '2 'hello)
(eval (my-list (+ 1 1) 'hello))
=> (my-list '2 'hello)
Run Code Online (Sandbox Code Playgroud)
是否有任何实际用途来定义这些表格,或者这更像是一个深奥的概念?
我想过将"自定义类型"创建为自我评估表单,其中评估可以例如对参数执行类型检查.当我在我的代码中尝试使用这样的类型时,我通常发现它比仅仅使用例如plist更不方便.
*编辑*我再次检查,似乎我混淆了"自我评价"和"自我引用".在emacs lisp中,后一个术语应用于lambda表单,至少在没有词法绑定的上下文中.请注意eq,即使结果是lambda形式,它也永远不会计算为self()equal.
(setq form '(lambda () 1)) ;; => (lambda () 1)
(equal form (eval form)) ;; => t
(equal (eval form) (eval (eval form))) ;; => t
(eq form (eval form)) …Run Code Online (Sandbox Code Playgroud)