如何将未知的参数列表映射到 elisp 中的启动进程?

2023-12-07

我终于尝试学习 elisp,但还没有集中精力如何将未知的参数列表动态映射到变量。

这是一个工作函数,它将最多三个参数传递给启动进程。但我想将无限数量的参数传递给该函数。

(defun create-drush-buffer (command &rest a)
  (if (locate-dominating-file default-directory "includes/bootstrap.inc")
      (progn
        (setq opt1 (car a))
        (setq opt2 (cadr a))
        (setq opt3 (caddr a))
        (setq allopt (concat opt1 " " opt2 " " opt3))
        (setq b-name (concat "*drush " command " " allopt "*"))
        (if (buffer-live-p b-name)
            (switch-to-buffer b-name)
          (setq d-buffer (get-buffer-create  b-name))
          (with-current-buffer d-buffer
            (goto-char (point-min))
            (view-mode 1)
            (hl-line-mode 1)
            (if opt3
                (start-process "drush" (current-buffer) drupal-drush-program
                               command
                               opt1
                               opt2
                               opt3)
              (if opt2
                  (start-process "drush" (current-buffer)
                                 drupal-drush-program
                                 command
                                 opt1
                                 opt2)
                (if opt1
                    (start-process "drush" (current-buffer)
                                   drupal-drush-program
                                   command
                                   opt1)
                  (start-process "drush" (current-buffer)
                                 drupal-drush-program
                                 command))))
            (shrink-window-if-larger-than-buffer))
          (switch-to-buffer d-buffer)))
    (message (concat default-directory " is not a drupal project"))))

这是我想使用 create-drush-buffer 的调用函数的示例。

(defun drush-sql-sync ()
  (interactive)
  (create-drush-buffer
   "sql-sync"
   "-y"
   "-d"
   "-v"
   "@cu.wstage1-education"
  "@cu.local-education"))

我怎样才能实现这一点并减少我的代码的冗余?任何有关代码的帮助,甚至引导我查阅相关文档,都很感激。


您可以使用apply:

(应用函数和其余参数)

使用剩余的参数调用 FUNCTION,使用最后一个参数作为列表 参数。然后返回FUNCTION返回的值。因此,(应用 '+ 1 2 '(3 4)) 返回 10。

这样,你就可以调用start-process使用类似的东西:

(apply 'start-process "drush" (current-buffer)
                             drupal-drush-program
                             command
                             a)

作为旁注,您不应该使用创建临时变量setq,因为这会创建或修改全局变量(如果不存在具有该名称的本地变量)。相反,使用let.

祝您的 elisp 项目好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将未知的参数列表映射到 elisp 中的启动进程? 的相关文章

  • 我可以在 emacs lisp 宏中添加条件吗?

    如何实现这样的目标 defmacro mood x if equal symbol name x t defun happy message Happy defun sad message Sad 我的目标是根据参数创建不同的函数 这样做有
  • 学习一种 Lisp 有助于学习另一种 Lisp 吗?

    学习不同的 Lisp 语言之间有协同作用吗 我目前正在学习 Emacs Lisp 因为它在我的日常 Emacs 使用中立即有用 但是我对所有 Lisp 都很着迷 所以也许有一天我会学习和使用其他语言 当我开始深入研究 Common Lisp
  • 获取缓冲区中的当前行作为 elisp 中的字符串

    如何在 elisp 中将缓冲区的当前行收集为字符串值 我可以做这个 let p1 p2 myLine setq p1 line beginning position setq p2 line end position setq myLine
  • 在命令行上评估 emacs lisp 表达式

    我是 emacs 的新手 我正在 redhat linux 上使用 emacs 24 1 并尝试评估 elisp 表达式 我想要 emacs 做的是评估 elisp 表达式而不启动 emacs 本身 我正在尝试不同的事情 emacs eva
  • 在 Emacs Lisp 中插入整月的日期

    我正在 Emacs Lisp 中进行一些编程 但我不完全确定如何处理某些事情 我正在尝试插入一整月的日期 每个日期都在一个新行上 如下列表所示 January 2009 年 1 月 1 日星期一 02 01 09 星期二 03 01 09
  • 如何在 Emacs 中找到建议函数的默认提示?

    当我查看文档时beginning of defun 有一个注释 This function is advised Around advice senator Move backward to the beginning of a defun
  • emacs lisp 中的 let 和 flet

    我不知道你是否会称其为规范公式 但为了绑定本地函数 GNU 手册建议我使用 flet defun adder with flet x flet f x x 3 f x 然而 我偶然尝试了 在玩了一会儿Scheme之后 下面的表达式 其中我使
  • 防止 Emacs 滚动到缓冲区末尾

    当我用鼠标或滚动条滚动到缓冲区末尾时 是否可以添加任何内容到 emacs 文件中 以防止 emacs 添加新行 我已经有了 setq next line add newlines nil 但这似乎只适用于我用键盘移动时 我对此主题进行了多次
  • 列出 emacs 中的所有顶级全局变量

    主要是为了我自己的启发 我尝试列出当前 Emacs 会话中加载的所有全局变量 我正在考虑做的是生成一个包含列出的所有功能的 HTML 文件 当然 定义函数 var 等的文件也很有用 emacs 中已经内置了一些可以提供帮助的东西吗 L 沿着
  • emacs isearch 整个缓冲区的延迟突出显示

    isearch 的默认行为是突出显示当前窗口中匹配的世界 我怎样才能改变这种行为 让它突出显示整个当前缓冲区中匹配的世界 也许您正在寻找高亮 命令 以便在执行其他操作时在整个缓冲区中突出显示内容 M shC h lists Global B
  • 为什么在 python 模式下重新向后搜索会给出不同的结果?

    我已经使用 python 模式很长时间了 我总是使用子字模式 但子字模式在 python 模式下表现得很奇怪 例如 M b移动 如果有一个名为test varialbe我将光标放在这个变量的末尾 在 python 模式下M b将使光标指向t
  • 如何键入组织捕获的动态文件条目

    我试图弄清楚是否有某种方法可以创建动态文件名以在 emacs org mode 中捕获 z test entry file headline A date specific headline Notes prompt 是否有一些简单的方法将
  • Emacs 中的 C 注释 - Linux 内核风格

    我在用着 setq default comment style multi line and my region comments when doing M are void main int i int b printf format s
  • Emacs Lisp 可以将 lambda 形式分配给像Scheme 这样的变量吗?

    在研究 Emacs Lisp 的符号单元时 我发现像这样的示例函数 defun a rest x x 我可以打电话 symbol function a 返回 lambda rest x x 如果我愿意的话我可以使用它 gt lambda r
  • 如何在 emacs 中自动回答是或否

    I binded function semantic symref to key C c C r like this global set key kbd C c C r semantic symref everytime I presse
  • 在 Emacs 中,如何更改迷你缓冲区完成列表窗口?

    我想为迷你缓冲区完成列表设置一个特定的窗口 目前 我有 3 个窗口采用此配置 在这种情况下 我想使用左下窗口作为迷你缓冲区完成列表 目前 它似乎是随机的一个窗口 大多数时候它喜欢使用最右边的窗口 它太薄了 无法在我不必水平滚动的情况下显示完
  • 如何在Emacs Lisp中脱离maphash?

    我需要提前退出maphash当我找到我要找的东西时 defun find in hash str hash let match nil maphash lambda key value if string prefix p str key
  • 如何让Emacs显示与实际存储的不同的字符?

    我想使用Elisp为Emacs实现动态文本替换 仅替换显示 不替换实际存储的文件 例如 在 LaTeX 文档中 我想输入 alpha 然后让 Emacs 将其显示为 因此更容易阅读 但在结果中 tex文件 我还想要 alpha 代替 被拯救
  • 字节编译宏时出现“返回的值未使用”警告

    为什么对以下内容进行字节编译会产生警告 defmacro foomacro shiftcode defun foo optional arg interactive concat shiftcode p message arg is i a
  • 如何在组织模式下关闭公司模式?

    我正在使用 spacemacs 并尝试在组织模式下关闭公司模式 同时将其保留在其他主要模式中 我尝试过以下方法 global company mode not org mode 但它不起作用 禁用自org mode hook 此方法几乎适用

随机推荐