From 093ffa5fbf7143f4668bb0a3dc9659a5cc836e12 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Sat, 17 Jun 2023 17:20:29 +1000 Subject: Moving things one level deeper To ease gnu stow usage. Now we can do stow -t ~ emacs --- emacs/.emacs.d/lisp/my/my-hiedb.el | 73 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 emacs/.emacs.d/lisp/my/my-hiedb.el (limited to 'emacs/.emacs.d/lisp/my/my-hiedb.el') diff --git a/emacs/.emacs.d/lisp/my/my-hiedb.el b/emacs/.emacs.d/lisp/my/my-hiedb.el new file mode 100644 index 0000000..ef3a3c4 --- /dev/null +++ b/emacs/.emacs.d/lisp/my/my-hiedb.el @@ -0,0 +1,73 @@ +;;; my-hiedb.el -- Extensions for hiedb -*- lexical-binding: t -*- + +;; Copyright (C) 2023 Free Software Foundation. + +;; Author: Yuchen Pei +;; Package-Requires: ((emacs "28.2")) + +;; This file is part of dotfiles. + +;; dotfiles is free software: you can redistribute it and/or modify it under +;; the terms of the GNU Affero General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; dotfiles is distributed in the hope that it will be useful, but WITHOUT +;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General +;; Public License for more details. + +;; You should have received a copy of the GNU Affero General Public +;; License along with dotfiles. If not, see . + +;;; Commentary: + +;; Extensions for hiedb. + +;;; Code: + +;;; to use, do for example: +;; (add-hook 'haskell-mode-hook +;; (lambda () +;; (add-hook 'xref-backend-functions +;; #'hiedb--xref-backend nil t))) + +(defun hiedb--xref-backend () 'hiedb) + +(cl-defmethod xref-backend-definitions + ((_backend (eql hiedb)) _identifiers) + (my-hiedb-call-point-defs buffer-file-name + (1+ (current-line)) (1+ (current-column))) + (my-hiedb-parse-point-defs-output + (file-name-directory buffer-file-name) + (with-current-buffer "*hiedb*" + (goto-char (point-min)) (kill-line) (kill-line) + (buffer-string)) + )) + +(defun my-hiedb-call-point-defs (file line col) + (let ((dir (file-name-directory file)) + (module-name (file-name-base file))) + (with-current-buffer (get-buffer-create "*hiedb*") + (erase-buffer)) + (call-process "hiedb" nil "*hiedb*" nil + "-D" + (format "%sdefault.hiedb" dir) + "point-defs" module-name + (number-to-string line) + (number-to-string col)))) + +(defun my-hiedb-parse-point-defs-output (dir output) + "module-name:line-begin:col-begin-line-end:col-end" + (pcase-let ((`(,module-name ,line-beg ,col-beg, line-end, col-end) + (split-string output "[:-]" (print output)))) + (list + (xref-make-match + "" (xref-make-file-location + (format "%s%s.hs" dir module-name) + (string-to-number line-beg) + (string-to-number col-beg)) + (- (string-to-number col-end) (string-to-number col-beg)))))) + +(provide 'my-hiedb) +;;; my-hiedb.el ends here -- cgit v1.2.3