Elisp - 避免交互函数中出现提示

3
我正在尝试调用以下org-mode函数,在缓冲区中插入当前时间戳。该函数由脚本调用。
(org-time-stamp-inactive)

正如预期的那样,这将弹出一个提示,要求输入时间戳使用的日期。但是我想跳过提示,直接插入时间戳。这是否可能?我没有找到任何可以帮助我的东西。


检查文档,看它是否将时间戳作为参数。然后传递参数:(org-time-stamp-inactive your-time-stamp) - Barmar
看起来好像不行,所以我猜这是个死路。 - fullmontis
1
就此而言,这里的Org代码看起来并不理想。使用这样的函数进行非交互式操作应该是可能的(容易的)。而且文档也不够好。这些命令的文档应该清楚地说明它会提示用户,并且当然应该描述每个参数。如果我是一个Org用户,我会提交一个错误报告... - Drew
4个回答

2
这应该插入当前非活动时间戳:
(org-insert-time-stamp nil nil t)

1
谢谢,这个可行。我已经使用以下代码插入了一个带有当前时间戳的时间。 (org-insert-time-stamp nil t t) - fullmontis

2
`org-time-stamp` 无条件地调用 `org-read-date` 来提示用户输入日期。你不能传递一个日期。但是你可以在本地绑定 `org-read-date` 到一个函数,该函数返回你想要使用的日期。locally bind
(require 'cl)
(flet ((org-read-date (org-with-time &rest args)
         (format-time-string (if org-with-time "%Y-%m-%d %H:%M" "%Y-%m-%d")
                             (current-time))))
  (org-time-stamp-inactive with-time))

除非有时间戳,否则这没什么帮助。

@fullmontis 噢,是的。fletcl 库的一部分,您需要显式加载它。它与 Emacs 捆绑在一起。 - Gilles 'SO- stop being evil'
请注意,cl和因此flet已经过时,并被cl-lib取代。现代的Emacs Lisp代码应该使用cl-lib广义变量来进行临时函数覆盖,即使用cl-letf绑定symbol-function单元格(示例)。 - user355252
@lunaryorn Emacs 23(没有cl-lib)远非过时。 - Gilles 'SO- stop being evil'
@Gilles 我认为Emacs 23已经过时了,但显然你的看法可能不同。无论如何,我当然是在谈论最新稳定版本和即将发布的Emacs 24.4的情况。旧版Emacs的代码并不算“现代”,对吧? - user355252
@lunaryorn 现代和过时是有区别的。除非问题需要,我通常会编写对当前人们有用的答案。例如Debian stable、RHEL/CentOS以及如果不使用外部软件源,则我认为OSX仍在运行Emacs 23。Ubuntu LTS上个月刚刚切换。一个软件版本要过时需要几年时间——大多数用户不经常升级。考虑到cl在Emacs 24中仍然有效,并且它唯一的缺陷是与Common Lisp的兼容性不完美,因此没有停止使用它的紧迫性。 - Gilles 'SO- stop being evil'
显示剩余2条评论

1
我最终使用以下代码从头开始创建了时间戳:
  (insert (format-time-string "[%Y-%m-%d %a]"))

正是我需要的,谢谢! - Ishmael7

-1

你可以在类似函数 (org-time-stamp) 的文档中找到答案。

[...] 使用两个通用前缀参数,插入一个带有当前时间的活动时间戳而不提示用户。[...]

所以... 你只需要在调用函数之前按下 C-u C-u(例如 C-u C-u M-x org-time-stamp-inactive RET)即可。


1
我知道 :) 但是当从脚本调用函数时,我不知道该怎么做。而且我也想知道是否可能更一般地避免交互式函数中的提示。 - fullmontis
1
哦,好的。我不确定是否有更通用的方法来完成它,但如果您想避免插入通用参数,则有一个快速的技巧:(defun my-org-time-stamp () (interactive) (let ((current-prefix-arg '(16))) (call-interactively 'org-time-stamp))) 这个方法也可以在脚本中使用。 - Ignacy Moryc
要在该函数中插入不活动的时间戳,最后一个调用应为(call-interactively 'org-time-stamp-inactive) - Ignacy Moryc
不行,它仍然会插入当前时间戳。我猜这是一个bug。好吧,无论如何还是谢谢 :) - fullmontis
如果我没记错的话,那个 bug 几周前就被修复了。至少我报告过一个非常类似的问题。无论如何,使用 (org-time-stamp-inactive '(16)) 应该(几乎)等同于上面的 let 表达式。 - YoungFrog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接