суббота, 22 октября 2016 г.

Emclip - менеджер буфера обмена на elisp

Устав от глюков Parcellite я его снес, и решил написать свой clipboard manager, с блекджеком ;) Единственный до сих пор не решенный вопрос - это автоматическая синхронизация с системным буфером CLIPBOARD, это можно легко сделать по таймеру, но такой вариант меня не устраивает, а других пока не нашел*. Поэтому на данный момент вручную, с помощью emacsclient (я просто добавил кнопочку "+" в windowmenu флюксбокса).

* - не то, чтобы не нашел, на самом деле их просто дофига, и я затрудняюсь выбрать конкретную реализацию.

Код:
;; 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 - последняя уведомления-то показывает, но только ничерта их не сохраняет, бывает неудобно.
Ну и конечно бесполезная картинко:



0 коммент. :

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

Следующее Предыдущее Главная страница

Blogger Template by Blogcrowds