104 lines
3.4 KiB
EmacsLisp
104 lines
3.4 KiB
EmacsLisp
;; Copyright (c) 2014 Microsoft Corporation. All rights reserved.
|
|
;; Released under Apache 2.0 license as described in the file LICENSE.
|
|
;;
|
|
;; Author: Soonho Kong
|
|
;;
|
|
|
|
(require 'cl-lib)
|
|
(require 'f)
|
|
(require 's)
|
|
(require 'dash)
|
|
(require 'dash-functional)
|
|
|
|
(defun lean4-setup-rootdir ()
|
|
(let ((root (executable-find lean4-executable-name)))
|
|
(when root
|
|
(setq lean4-rootdir (f-dirname (f-dirname root))))
|
|
lean4-rootdir))
|
|
|
|
(defun lean4-get-rootdir ()
|
|
(if lean4-rootdir
|
|
(let ((lean4-path (f-full (f-join lean4-rootdir "bin" lean4-executable-name))))
|
|
(unless (f-exists? lean4-path)
|
|
(error "Incorrect 'lean4-rootdir' value, path '%s' does not exist." lean4-path))
|
|
lean4-rootdir)
|
|
(or
|
|
(lean4-setup-rootdir)
|
|
(error
|
|
(concat "Lean was not found in the 'exec-path' and 'lean4-rootdir' is not defined. "
|
|
"Please set it via M-x customize-variable RET lean4-rootdir RET.")))))
|
|
|
|
(defun lean4-get-executable (exe-name)
|
|
"Return fullpath of lean executable"
|
|
(let ((lean4-bin-dir-name "bin"))
|
|
(f-full (f-join (lean4-get-rootdir) lean4-bin-dir-name exe-name))))
|
|
|
|
(defun lean4-line-offset (&optional pos)
|
|
"Return the byte-offset of `pos` or current position, counting from the
|
|
beginning of the line"
|
|
(interactive)
|
|
(let* ((pos (or pos (point)))
|
|
(bol-pos
|
|
(save-excursion
|
|
(goto-char pos)
|
|
(beginning-of-line)
|
|
(point))))
|
|
(- pos bol-pos)))
|
|
|
|
(defun lean4-pos-at-line-col (l c)
|
|
"Return the point of the given line and column."
|
|
;; http://emacs.stackexchange.com/a/8083
|
|
(save-excursion
|
|
(goto-char (point-min))
|
|
(forward-line (- l 1))
|
|
(move-to-column c)
|
|
(point)))
|
|
|
|
(defun lean4-whitespace-cleanup ()
|
|
(when lean4-delete-trailing-whitespace
|
|
(delete-trailing-whitespace)))
|
|
|
|
(defun lean4-in-comment-p ()
|
|
"t if a current point is inside of comment block
|
|
nil otherwise"
|
|
(nth 4 (syntax-ppss)))
|
|
|
|
;; The following function is a slightly modified version of
|
|
;; f--collect-entries written by Johan Andersson
|
|
;; The URL is at https://github.com/rejeep/f.el/blob/master/f.el#L416-L435
|
|
(defun lean4--collect-entries (path recursive)
|
|
(let (result
|
|
(entries
|
|
(-reject
|
|
(lambda (file)
|
|
(or
|
|
(equal (f-filename file) ".")
|
|
(equal (f-filename file) "..")))
|
|
(directory-files path t))))
|
|
;; The following line is the only modification that I made
|
|
;; It waits 0.0001 second for an event. This wait allows
|
|
;; wait-timeout function to check the timer and kill the execution
|
|
;; of this function.
|
|
(sit-for 0.0001)
|
|
(cond (recursive
|
|
(-map
|
|
(lambda (entry)
|
|
(if (f-file? entry)
|
|
(setq result (cons entry result))
|
|
(when (f-directory? entry)
|
|
(setq result (cons entry result))
|
|
(setq result (append result (lean4--collect-entries entry recursive))))))
|
|
entries))
|
|
(t (setq result entries)))
|
|
result))
|
|
|
|
;; The following function is a slightly modified version of
|
|
;; f-files function written by Johan Andersson The URL is at
|
|
;; https://github.com/rejeep/f.el/blob/master/f.el#L478-L481
|
|
(defun lean4-find-files (path &optional fn recursive)
|
|
"Find all files in PATH."
|
|
;; It calls lean4--collect-entries instead of f--collect-entries
|
|
(let ((files (-select 'f-file? (lean4--collect-entries path recursive))))
|
|
(if fn (-select fn files) files)))
|
|
|
|
(provide 'lean4-util)
|