Emclip - менеджер буфера обмена на elisp
Устав от глюков Parcellite я его снес, и решил написать свой clipboard manager, с блекджеком ;) Единственный до сих пор не решенный вопрос - это автоматическая синхронизация с системным буфером CLIPBOARD, это можно легко сделать по таймеру, но такой вариант меня не устраивает, а других пока не нашел*. Поэтому на данный момент вручную, с помощью emacsclient (я просто добавил кнопочку "+" в windowmenu флюксбокса).
* - не то, чтобы не нашел, на самом деле их просто дофига, и я затрудняюсь выбрать конкретную реализацию.
Код:
После потери фокуса окно Emclip будет скрыто, после вставки c emclip-sync снова показано, можно так же вызвать его с помощью emclip-show, чтобы посмотреть сохраненное. Еще можно использовать и для системных уведомлений с помощью emclip-insert вместо notify-send - последняя уведомления-то показывает, но только ничерта их не сохраняет, бывает неудобно.
Ну и конечно бесполезная картинко:
* - не то, чтобы не нашел, на самом деле их просто дофига, и я затрудняюсь выбрать конкретную реализацию.
Код:
;; Emacs Clipboard manager
;; (and notification system also)
(defun find-frame-by-name (name)
(let ((fl (frame-list)))
(while (not (string= name
(frame-parameter (car fl) 'name)))
(setq fl (cdr fl)))
(car fl)))
(defun emclip-autohide ()
"Focus out hide emclip"
(let ((name (frame-parameter (selected-frame) 'name)))
(when (string= name "*emclip*")
(modify-frame-parameters (find-frame-by-name "*emclip*")
'((visibility . nil)))
(remove-hook 'focus-out-hook 'emclip-autohide))))
(defun emclip-autohide-add ()
"Timeout hide emclip"
(run-at-time "5 sec" nil (lambda ()
(add-hook 'focus-out-hook 'emclip-autohide))))
(defun emclip-initialize ()
"Create emclip buffer"
(get-buffer-create "*emclip*")
(display-buffer-pop-up-frame "*emclip*" '((pop-up-frame-parameters (title . "*emclip*")
(width . 30)
(height . 30)
(border-width . 0)
(vertical-scroll-bars . right)
(scroll-bar-width . 4)
(unsplittable . t)
(menu-bar-lines . 0)
(tool-bar-lines . 0))))
(with-current-buffer "*emclip*"
(toggle-truncate-lines)
(setq mode-line-format nil)
(insert "\n\nПривет! Сегодня " (format-time-string "%d.%m.%y") "\n"))
(emclip-autohide-add))
(defun emclip-show ()
(interactive)
(modify-frame-parameters (find-frame-by-name "*emclip*") '((visibility . t)))
(select-frame-by-name "*emclip*")
(emclip-autohide-add))
(defun emclip-sync ()
"Get system clipboard manual (emacsclient), sorry"
(emclip-show)
(let ((s (substring-no-properties (gui-get-selection 'CLIPBOARD 'TEXT))))
(with-current-buffer "*emclip*"
(when (not (string-match-p (concat "^" s)
(buffer-substring 1 (point-max))))
(goto-char 1)
(insert "\n\n▶ " s)
(goto-char 1)))))
(defun emclip-insert (text)
"Function for various notifications, test"
(with-current-buffer "*emclip*"
(goto-char 1)
(insert "\n▶ " text "\n"))
(emclip-show))
;; Start
(run-at-time "5 sec" nil 'emclip-initialize)
;;; EOF
После потери фокуса окно Emclip будет скрыто, после вставки c emclip-sync снова показано, можно так же вызвать его с помощью emclip-show, чтобы посмотреть сохраненное. Еще можно использовать и для системных уведомлений с помощью emclip-insert вместо notify-send - последняя уведомления-то показывает, но только ничерта их не сохраняет, бывает неудобно.
Ну и конечно бесполезная картинко:

Отправить комментарий