(defvar monitor-http-buffer--timer nil
  "Таймер для мониторинга буфера *X*.")

(defun monitor-http-buffer ()
  (setq monitor-http-buffer--timer
        (run-at-time 1 1
                     (lambda ()
                       (let ((buf (get-buffer "*X*")))
                         (when (and (buffer-live-p buf)
                                    (> (with-current-buffer buf
                                         (- (point-max) (point-min)))
                                       0))
                           (psysho-log "[MONITOR] Буфер *X* заполнен, открываю...")
                           (display-buffer buf)
                           (when monitor-http-buffer--timer
                             (cancel-timer monitor-http-buffer--timer)
                             (setq monitor-http-buffer--timer nil))))))))

  
(defun monitor-http-buffer ()
  (run-at-time 1 1
               (lambda ()
                 (let ((buf (get-buffer "*X*")))
                   (when (and (buffer-live-p buf)
                              (> (with-current-buffer buf
                                   (- (point-max) (point-min)))
                                 0))
                     (psysho-log "[MONITOR] Буфер *X* заполнен, открываю...")
                     (display-buffer buf)
                     (cancel-function-timers 'monitor-http-buffer))))))
psysho-log - это то же что и message но с моими шрифтами
я хочу monitor-http-buffer чтобы прекращалась после показа буффер - соообщение только один раз
выходило чтоб


в елисп емакс проверить что буффер - существует и что там есть контент
(with-current-buffer "*X*" (- (point-max) (point-min)))
где буффер X - это вывод http запроса - runtime-at - надо использовать и вот так мониторить буду


есть ли в емакс возможности реагировать на события кроме таймера?

;;(process-send-string "tcp-client" "GET / HTTP/1.1\r\nHost: gnu.org\r\n\r\n")


;;(start-process "x1" "*xxxxx*" "/root/glibc/dark_c/sfirot" "")
;;(get-process "x1")
;;(set-process-sentinel (get-process "x1")
;;					  (lambda (proc event)
;;						(psysho-log "Process %s message: %s" proc event)))
;;(print (copy-sequence timer-list))
;;;(mapc #'cancel-timer timer-list)


(defun my-buffer-change-fn (beg end len)
  (message "Buffer changed from %d to %d (replaced %d chars)" beg end len))

(add-hook 'after-change-functions #'my-buffer-change-fn)


(defun my-watch-buffer (beg end len)
  (when (string= (buffer-name) "*X*")
    (message "*X* was modified")))

(add-hook 'after-change-functions #'my-watch-buffer)

(defun my-monitor-buffer-change (beg end len)
  (when (> (- (point-max) (point-min)) 0)
    (psysho-log "[HOOK] Буфер *X* получил данные, открываю...")
    (display-buffer (current-buffer))
    ;; Удаляем хук, чтобы сработал только один раз
    (remove-hook 'after-change-functions #'my-monitor-buffer-change t)))

(with-current-buffer "*X*"
  (add-hook 'after-change-functions #'my-monitor-buffer-change nil t))
