Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Included the option to call zig build run from the project root. #74

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions zig-mode.el
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,18 @@
:safe #'stringp
:group 'zig-mode)

(defcustom zig-project-build-file "build.zig"
"Name of project build file used to find the project root."
:type 'string
:safe #'stringp
:group 'zig-mode)

(defcustom zig-project-root-search-up 3
"The number of directories to search upwards to find project root."
:type 'integer
:group 'zig-mode
:safe #'integerp)

;; zig CLI commands

(defun zig--run-cmd (cmd &optional source &rest args)
Expand Down Expand Up @@ -123,6 +135,31 @@ If given a SOURCE, execute the CMD on it."
(interactive)
(zig--run-cmd "run" (buffer-file-name) "-O" zig-run-optimization-mode))

(defun zig--find-project-root ()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Really what I'd suggest instead of these changes is to add a (likely trivial) snippet that allows project.el to find the project root of Zig project. Then you can use project-* functions as needed in zig-project-build-run below.

"Find the directory with the `zig-project-build-file'."
(let ((count 0)
root-dir
(dir (directory-file-name
(replace-regexp-in-string "^Directory " "" default-directory))))
(while (and (< count zig-project-root-search-up)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's locate-dominating-file for all of this btw, so no need to search directories upwards yourself.

(let ((is-dir? (member zig-project-build-file (directory-files dir))))
(when is-dir?
(setq root-dir dir))
(not is-dir?)))
(setq dir (file-name-directory dir))
(setq count (+ count 1)))
root-dir))

;;;###autoload
(defun zig-project-build-run ()
"Create an executable from the current project and run it immediately."
(interactive)
(let ((root-dir (zig--find-project-root)))
(if root-dir
(let ((default-directory root-dir))
(compile (concat "zig build run")))
(message (.. "Could not find " zig-build-file)))))

(defvar zig-return-to-buffer-after-format nil
"Enable zig-format-buffer to return to file buffer after fmt is done.")

Expand Down Expand Up @@ -519,6 +556,7 @@ This is written mainly to be used as `end-of-defun-function' for Zig."
(define-key map (kbd "C-c C-f") 'zig-format-buffer)
(define-key map (kbd "C-c C-r") 'zig-run)
(define-key map (kbd "C-c C-t") 'zig-test-buffer)
(define-key map (kbd "C-c C-p") 'zig-project-build-run)
map)
"Keymap for Zig major mode.")

Expand Down