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.

90 lines
3.0 KiB

  1. ;;; company-nixos-options.el --- Company Backend for nixos-options
  2. ;; Copyright (C) 2015 Diego Berrocal and Travis B. Hartwell
  3. ;; Author: Diego Berrocal <cestdiego@gmail.com>
  4. ;; Travis B. Hartwell <nafai@travishartwell.net>
  5. ;; Created: 18 July 2015
  6. ;; Keywords: unix
  7. ;; Package-Version: 0.0.1
  8. ;; Package-Commit: 5fc8fa29bea9dd8e9c822af92f9bc6ddc223635f
  9. ;; Homepage: http://www.github.com/travisbhartwell/nix-emacs/
  10. ;; Version: "0.1.0"
  11. ;; Package-Requires: ((company "0.8.0") (nixos-options "0.0.1") (cl-lib "0.5.0"))
  12. ;; This file is not part of GNU Emacs.
  13. ;;; License: GPLv3
  14. ;;; Commentary:
  15. ;; Useful functions for exploring the NixOS options. Inspired by
  16. ;; https://nixos.org/nixos/options.html.
  17. ;;; Code:
  18. (require 'nixos-options)
  19. (require 'company)
  20. (require 'cl-lib)
  21. (defvar company-nixos-options-keywords
  22. (mapcar (lambda (nixos-option)
  23. (list (nixos-options-get-name nixos-option)
  24. (nixos-options-get-description nixos-option)))
  25. nixos-options))
  26. (defun company-nixos-options--make-candidate (candidate)
  27. (let* ((text (car candidate))
  28. (meta (cadr candidate)))
  29. (propertize text 'meta meta)))
  30. ;; The following two functions are borrowed from company-anaconda
  31. (defun company-nixos-options--get-property (property candidate)
  32. "Return the property PROPERTY of completion candidate CANDIDATE."
  33. (let ((item (get-text-property 0 'item candidate)))
  34. (plist-get item property)))
  35. (defun company-nixos-options--doc-buffer (candidate)
  36. "Return documentation buffer for chosen CANDIDATE."
  37. (let ((doc (nixos-options-get-documentation-for-option
  38. (nixos-options-get-option-by-name candidate))))
  39. (and doc (nixos-options-doc-buffer doc))))
  40. (defun company-nixos-options--candidates (prefix)
  41. (let (res)
  42. (dolist (item company-nixos-options-keywords)
  43. (when (string-prefix-p prefix (car item))
  44. (push (company-nixos-options--make-candidate item) res)))
  45. res))
  46. (defun company-nixos-options--meta (candidate)
  47. (format "This will use %s of %s"
  48. (get-text-property 0 'meta candidate)
  49. (substring-no-properties candidate)))
  50. (defun company-nixos-options--annotation (candidate)
  51. (format " -> %s" (get-text-property 0 'meta candidate)))
  52. (defun company-nixos--grab-symbol ()
  53. (buffer-substring (point) (save-excursion (skip-syntax-backward "w_.")
  54. (point))))
  55. (defun company-nixos-options--prefix ()
  56. "Grab prefix at point."
  57. (or (company-nixos--grab-symbol)
  58. 'stop))
  59. ;;;###autoload
  60. (defun company-nixos-options (command &optional arg &rest ignored)
  61. (interactive (list 'interactive))
  62. (cl-case command
  63. (interactive (company-begin-backend 'company-nixos-options))
  64. (prefix (company-nixos-options--prefix))
  65. (candidates (company-nixos-options--candidates arg))
  66. (doc-buffer (company-nixos-options--doc-buffer arg))
  67. ;; (annotation (company-nixos-options--annotation arg))
  68. (meta (company-nixos-options--meta arg))))
  69. (provide 'company-nixos-options)
  70. ;;; company-nixos-options.el ends here