Personal emacs config
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

155 lines
5.5 KiB

  1. ;;; paradox-core.el --- common functions -*- lexical-binding:t -*-
  2. ;; Copyright (C) 2014-2015 Artur Malabarba <bruce.connor.am@gmail.com>
  3. ;; Author: Artur Malabarba <bruce.connor.am@gmail.com>
  4. ;; Prefix: paradox
  5. ;; Separator: -
  6. ;;; License:
  7. ;;
  8. ;; This file is NOT part of GNU Emacs.
  9. ;;
  10. ;; This program is free software; you can redistribute it and/or
  11. ;; modify it under the terms of the GNU General Public License
  12. ;; as published by the Free Software Foundation; either version 2
  13. ;; of the License, or (at your option) any later version.
  14. ;;
  15. ;; This program is distributed in the hope that it will be useful,
  16. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. ;; GNU General Public License for more details.
  19. ;;
  20. ;;; Code:
  21. (require 'subr-x)
  22. ;;; Configurations
  23. (defface paradox-comment-face
  24. '((((background light)) :foreground "Grey30")
  25. (((background dark)) :foreground "Grey60"))
  26. "Face used on faded out stuff."
  27. :group 'paradox-menu
  28. :group 'paradox-commit-list)
  29. (defface paradox-highlight-face
  30. '((t :weight bold :inherit font-lock-variable-name-face))
  31. "Face used on highlighted stuff."
  32. :group 'paradox-menu
  33. :group 'paradox-commit-list)
  34. ;;; Internal variables
  35. (defvar paradox--star-count (make-hash-table))
  36. (defvar paradox--download-count (make-hash-table))
  37. (defvar paradox--package-repo-list (make-hash-table))
  38. (defvar paradox--wiki-packages (make-hash-table))
  39. (defconst paradox--data-url
  40. "https://raw.githubusercontent.com/Malabarba/paradox/data/"
  41. "Address of Paradox's data directory.")
  42. (defconst paradox--star-count-url (concat paradox--data-url "data-hashtables")
  43. "Address of the raw star-count file.")
  44. (make-obsolete-variable 'paradox--star-count-url 'paradox--data-url "2.1")
  45. (defconst paradox--package-count
  46. '(("total" . 0) ("built-in" . 0)
  47. ("obsolete" . 0) ("deleted" . 0)
  48. ("available" . 0) ("new" . 0)
  49. ("held" . 0) ("disabled" . 0)
  50. ("dependency" . 0) ("avail-obso" . 0)
  51. ("incompat" . 0) ("external" . 0)
  52. ("installed" . 0) ("unsigned" . 0)))
  53. (defmacro paradox--cas (string)
  54. "Same as (cdr (assoc-string ,STRING paradox--package-count))."
  55. `(cdr (assoc-string ,string paradox--package-count)))
  56. (defun paradox--truncate-string-to-width-filter (args)
  57. "Filter the args of `truncate-string-to-width' to use \"\".
  58. All arguments STR, END-COLUMN, START-COLUMN, PADDING, and
  59. ELLIPSIS are passed to `truncate-string-to-width'."
  60. (when (and (eq major-mode 'paradox-menu-mode)
  61. (eq t (nth 4 args)))
  62. (setf (nth 4 args) (if (char-displayable-p ?…) "" "$")))
  63. args)
  64. ;;; Overriding definitions
  65. (defvar paradox--backups nil)
  66. (defun paradox--core-enable ()
  67. "Enable core features."
  68. (ignore-errors (setcdr (assq 'menu-bar package-menu-mode-map) nil))
  69. (advice-add #'truncate-string-to-width :filter-args
  70. #'paradox--truncate-string-to-width-filter
  71. '((name . :paradox-override)))
  72. (add-to-list 'paradox--backups 'truncate-string-to-width))
  73. (defun paradox-disable ()
  74. "Disable paradox, and go back to regular package-menu."
  75. (interactive)
  76. (when paradox--backups
  77. (message "Restoring %s" (mapconcat #'symbol-name paradox--backups ", "))
  78. (dolist (it paradox--backups)
  79. (advice-remove it :paradox-override))
  80. (setq paradox--backups nil)))
  81. (defun paradox--override-definition (sym newdef)
  82. "Temporarily override SYM's function definition with NEWDEF.
  83. Record that in `paradox--backups', but do nothing if
  84. `paradox--backups' reports that it is already overriden."
  85. (unless (memq sym paradox--backups)
  86. (message "Overriding %s with %s" sym newdef)
  87. (advice-add sym :override newdef '((name . :paradox-override)))
  88. (add-to-list 'paradox--backups sym)))
  89. ;;; Pre 25.1 support
  90. (declare-function paradox--update-downloads-in-progress "paradox-menu")
  91. (if (fboundp 'package--update-downloads-in-progress)
  92. (defun paradox--update-downloads-in-progress (&optional name)
  93. (when name
  94. (package--update-downloads-in-progress name)))
  95. (defalias 'paradox--update-downloads-in-progress #'ignore))
  96. (define-obsolete-function-alias
  97. 'paradox--pdate-downloads-in-progress
  98. 'paradox--update-downloads-in-progress
  99. "2.1")
  100. ;;; Spinner
  101. (defvar paradox--spinner nil)
  102. (eval-and-compile (require 'spinner))
  103. (defcustom paradox-spinner-type 'horizontal-moving
  104. "Holds the type of spinner to be used in the mode-line.
  105. Takes a value accepted by `spinner-start'."
  106. :type `(choice (choice :tag "Choose a spinner by name"
  107. ,@(mapcar (lambda (c) (list 'const (car c)))
  108. spinner-types))
  109. (const :tag "A random spinner" random)
  110. (repeat :tag "A list of symbols from `spinner-types' to randomly choose from"
  111. (choice :tag "Choose a spinner by name"
  112. ,@(mapcar (lambda (c) (list 'const (car c)))
  113. spinner-types)))
  114. (vector :tag "A user defined vector"
  115. (repeat :inline t string)))
  116. :package-version '(paradox . "2.1")
  117. :group 'paradox-execute)
  118. (defun paradox--start-spinner ()
  119. (when (spinner-p paradox--spinner)
  120. (spinner-stop paradox--spinner))
  121. (setq paradox--spinner
  122. (make-spinner paradox-spinner-type t 10))
  123. (spinner-start paradox--spinner))
  124. (defun paradox--stop-spinner ()
  125. (when (spinner-p paradox--spinner)
  126. (spinner-stop paradox--spinner))
  127. (setq paradox--spinner nil))
  128. (provide 'paradox-core)
  129. ;;; paradox-core.el ends here.