Я часто использую подчиненные оболочки emacs или просто оболочку. Поскольку я работаю в основном над алгоритмами ML, мои команды иногда занимают много времени. Я хотел бы включить автоматическую синхронизацию всех команд, запускаемых в оболочках emacs, чтобы мне не нужно было добавлять лишний / уродливый склеивающий код и мне не приходилось «заранее думать» о времени выполнения. Когда я запускаю команду, ее время выполнения должно автоматически регистрироваться (лучше всего печатать в отдельный буфер), чтобы, если некоторые параметры внезапно заняли много времени, я мог отметить ее время выполнения позже. Все идеи приветствуются, спасибо.
3 ответа
Вдохновленный ответом gt, я нашел способ сделать это на python. Для интерпретатора Python,
Добавьте следующий код в usercustomize.py
внутри вашего каталога site-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 предполагает, что приглашение будет соответствовать определенному регулярному выражению. (в сторону: это также означает, что нет смысла менять нижний, более базовый, режим коминтов.) В любом случае, мы меняем переменную python-shell-prompt-alist в python.el так, чтобы она соответствовала установленному нами приглашению, затем удаляем 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())+">>> "
Один из способов обойти это с помощью обходного пути - настроить приглашение оболочки на отображение времени, а затем при каждом выполнении вы будете иметь предыдущую отметку времени и новую отметку времени, как только задание будет завершено. Это, вероятно, потребует от вас нажатия перед выполнением любой команды, чтобы получить новое приглашение и возобновить время воспроизведения dsiplayed, но это не является большой проблемой, когда вам нужен быстрый неточный таймер время от времени.
Чтобы получить приглашение типа 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>
У меня есть метод, который работает для меня под Linux. Это зависит от time
. Возможно есть подобная функция под окнами.
Этот метод не годится, если вы хотите использовать программу внутри оболочки, она не работает, скажем, в интерактивном режиме на python
. Просто посмотрите на это как на идею о том, как это реализовать, но на самом деле это не то, что я рекомендую, если только вы не выполняете функции shell/cmd внутри * shell * -buffer.
Здесь это идет:
В вашем .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