如何在 emacs 中自动计时任意 shell 命令?

如何在 emacs 中自动计时任意 shell 命令?

我经常使用 emacs 的次级 shell,或者只是 shell。由于我主要在 ML 算法上工作,所以我的命令有时会花费很长时间。我想启用在 emacs shell 中运行的所有命令的自动计时,这样我就不必添加额外/丑陋的粘合代码,也不必“预先考虑”运行时间。当我运行命令时,它的运行时间应该自动记录(最好打印到单独的缓冲区),这样如果某些参数突然需要很长时间,我可以稍后记录它的运行时间。欢迎提出所有想法,谢谢。

答案1

解决这个问题的一种方法是将 shell 提示设置为显示时间,这样每次执行时,您都会获得以前的时间戳,并在作业完成后立即获得新的时间戳。这可能需要您在运行任何命令之前按下以获取新提示并更新显示的时间,但当您偶尔需要快速不精确的计时器时,这不是一个大问题。

15:01:54 MyPath/MyDir>要获得类似bash 的提示符,请使用

export PS1='\t \[\033[01;32m\]\w>\[\033[00m\] '

编辑对于 Windows,请尝试

PROMPT $T $P$G

得到类似的东西17:07:34.60 C:\Programs\Console2>

答案2

受 gt 的回答启发,我找到了一种在 python 中执行此操作的方法。对于 python 解释器,
请将以下代码添加到目录usercustomize.pysite-packages

import time, sys

class ShowTime(object):
    def __str__(self):
        return time.strftime("%c", time.localtime())+" >>> "

sys.ps1=ShowTime()

这将添加一个提示,如下所示03/21/13 13:10:42 >>>

编辑

仅执行上述操作会破坏 Python 模式中的有用功能,如 send-region 和 send-buffer。基本上,Python 模式期望提示符与特定的正则表达式匹配。(另外:这也意味着没有必要更改较低、更基本的 comint-mode。)无论如何,我们更改 python.el 中的变量 python-shell-prompt-alist,使其与我们设置的提示符匹配,然后删除 python.elc,然后重新启动。

早些时候

(defcustom python-shell-prompt-alist
   '(("ipython" . "^In \\[[0-9]+\\]: *")
    (t . "^>>> "))

现在

(defcustom python-shell-prompt-alist
  '(("ipython" . "^In \\[[0-9]+\\]: *")
    (t . "^[0-9][0-9]_[0-9][0-9]:[0-9][0-9]:[0-9][0-9]>>> "))

这将匹配以下类型的提示time.strftime("%d_%H:%M:%S", time.localtime())+">>> "

答案3

我有一个在 Linux 下对我有用的方法。这取决于函数time。也许在 Windows 下有类似的函数。

如果您想在 shell 中使用程序,这种方法并不好,它不起作用,比如说python交互方式。 只是将其视为如何实现它的想法,但除非您只在 *shell* 缓冲区内执行 shell/cmd 函数,否则我真的不推荐它。

下面是:

在您的 .emacs 文件中添加此内容。

(defun my-send (proc cmd)
    (comint-simple-send proc (concat "time " cmd)))
(setq  comint-input-sender 'my-send)

每当我运行命令时,它看起来都像这样(此示例:睡眠 1 秒)

$ sleep 1

real    0m1.132s
user    0m0.000s
sys     0m0.000s

相关内容