Как удалить процесс с одинаковым именем (по одному за раз) от самого нового до самого старого

У меня есть ситуация, когда у меня может быть несколько процессов, запущенных одновременно со следующими именами:

preview
preview<1>
preview<2>
preview<3>
preview<4>

Мне нужна помощь, чтобы создать функцию, которая будет удалять самый новый процесс (т. Е. Процесс с наибольшим номером) каждый раз, когда функция активируется - до тех пор, пока процессы с номерами больше не существуют, а затем удалить окончательный процесс (предварительный просмотр) без номера.

Другими словами, вызов функции один раз приведет к удалению preview<4> - повторный вызов функции удалит preview<3>и так до тех пор, пока все они не исчезнут.

У меня есть функция, которая просматривает содержимое файла из режима Dired на компьютере с OSX, используя:

РЕДАКТИРОВАТЬ: Заменено (car (dired-get-marked-files)) с (dired-get-file-for-visit), который позволяет воздействовать на файл под курсором, даже если другие уже отмечены. Удалена глобальная переменная и обновлена ​​полная комбинация клавиш.

;; Preview using qlmanage.
(define-key dired-mode-map (kbd "<SPC>") (lambda () (interactive)
  (start-process "preview" nil "qlmanage" "-p" (dired-get-file-for-visit))))

и я настроил ключ для удаления одного процесса с именем "Предварительный просмотр":

(define-key dired-mode-map (kbd "<escape>") (lambda () (interactive)
  (delete-process (get-process "preview"))

1 ответ

Решение

Я думаю, что-то вроде этого будет работать:

(defun kill-last-process-named (name)
  (cl-loop with name-re = 
           (format "^%s\\(?:<\\([[:digit:]]+\\)>\\)?" (regexp-quote name))
   for process in (process-list)
   for pname = (process-name process)
   if (string-match name-re pname)
   collect (cons (string-to-number (or (match-string 1 pname) "0")) process)
   into processes
   finally (delete-process (cdar (cl-sort processes '> :key 'car)))))
Другие вопросы по тегам