74 lines
2.4 KiB
EmacsLisp
74 lines
2.4 KiB
EmacsLisp
;;; tools/password-store/autoload.el -*- lexical-binding: t; -*-
|
|
|
|
;;;###autoload
|
|
(defun +pass/open ()
|
|
(interactive)
|
|
(cond ((featurep! :completion ivy)
|
|
(+pass/ivy))
|
|
((featurep! :completion helm)
|
|
(helm-pass))
|
|
(t
|
|
(pass))))
|
|
|
|
;;;###autoload
|
|
(defun +pass-get-field (entry fields)
|
|
(unless noninteractive
|
|
(if-let* ((data (if (listp entry) entry (auth-pass-parse-entry entry))))
|
|
(cl-loop for key in (doom-enlist fields)
|
|
when (assoc key data)
|
|
return (cdr it))
|
|
(error "Couldn't find entry: %s" entry))))
|
|
|
|
;;;###autoload
|
|
(defun +pass-get-user (entry)
|
|
(+pass-get-field entry +pass-user-fields))
|
|
|
|
;;;###autoload
|
|
(defun +pass-get-secret (entry)
|
|
(+pass-get-field entry 'secret))
|
|
|
|
(defun +pass-ivy-action--open-url (entry)
|
|
(if-let* ((url (+pass-get-field entry +pass-url-fields)))
|
|
(and (or (string-match-p "https?://" url)
|
|
(error "Field for %s doesn't look like an url" item))
|
|
(browse-url url))
|
|
(error "Username not found.")))
|
|
|
|
(defun +pass-ivy-action--get-field (item)
|
|
(let* ((data (auth-pass-parse-entry item))
|
|
(field (if data (completing-read "Field: " (mapcar #'car data) nil t))))
|
|
(if data
|
|
(progn
|
|
(password-store-clear)
|
|
(message "Copied %s's %s field to clipboard. Will clear in %s seconds"
|
|
item field (password-store-timeout))
|
|
(kill-new (+pass-get-field data field))
|
|
(setq password-store-timeout-timer
|
|
(run-at-time (password-store-timeout) nil 'password-store-clear)))
|
|
(error "Couldn't find entry: %s" item))))
|
|
|
|
(defun +pass-ivy-action--copy-username (entry)
|
|
(if-let* ((user (+pass-get-field entry +pass-user-fields)))
|
|
(progn (password-store-clear)
|
|
(message "Copied username to the kill ring.")
|
|
(kill-new user))
|
|
(error "Username not found.")))
|
|
|
|
(after! ivy
|
|
(ivy-add-actions
|
|
'+pass/ivy
|
|
'(("o" password-store-copy "copy password")
|
|
("e" password-store-edit "edit entry")
|
|
("u" +pass-ivy-action--copy-username "copy username")
|
|
("b" +pass-ivy-action--open-url "open url in browser")
|
|
("f" +pass-ivy-action--get-field "get field"))))
|
|
|
|
;;;###autoload
|
|
(defun +pass/ivy (&optional browse-url)
|
|
(interactive "P")
|
|
(ivy-read "Pass: " (password-store-list)
|
|
:action (if browse-url
|
|
#'password-store-url
|
|
#'password-store-copy)
|
|
:caller '+pass/ivy))
|
|
|