Как удалить процесс с одинаковым именем (по одному за раз) от самого нового до самого старого
У меня есть ситуация, когда у меня может быть несколько процессов, запущенных одновременно со следующими именами:
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)))))