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

Fix recursion #82

Merged
merged 4 commits into from
Apr 15, 2024
Merged
Show file tree
Hide file tree
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
31 changes: 17 additions & 14 deletions parinfer-rust-helper.el
Original file line number Diff line number Diff line change
Expand Up @@ -68,17 +68,18 @@ download LIB-NAME for the user. Automatically downloads if
AUTO-DOWNLOAD is supplied or parinfer-rust runs in test mode,
otherwise will promt user. Return non-nil if the parinfer-rust
library was downloaded."
(when (and (not (file-exists-p library-location))
(or
auto-download
(parinfer-rust--test-p)
(yes-or-no-p parinfer-rust--ask-to-download)))
(parinfer-rust--download-from-github (car supported-versions)
;; This is a hold over because I am lazy. I've stuctured
;; this data such that my version is the first one in the
;; list
library-location lib-name)
t))
(if (file-exists-p library-location)
t
(when (or
auto-download
(parinfer-rust--test-p)
(yes-or-no-p parinfer-rust--ask-to-download))
(parinfer-rust--download-from-github (car supported-versions)
;; This is a hold over because I am lazy. I've stuctured
;; this data such that my version is the first one in the
;; list
library-location lib-name)
t)))
;; This function has a problem: Emacs can't reload dynamic libraries. This means that if we download
;; a new library the user has to restart Emacs.
(defun parinfer-rust--check-version (supported-versions current-version library-location lib-name)
Expand Down Expand Up @@ -237,10 +238,12 @@ mode to better emulate users."
(t num))))
(defun parinfer-rust--defer-loading (&rest _)
"Defer loading of `parinfer-rust-mode' until the buffer is in focus."
(when (eq (current-buffer)
(window-buffer (selected-window)))
;; This is a parinfer enabled buffer that started in the background and has now been moved to the foreground
(when (and parinfer-rust-enabled
(eq (current-buffer)
(window-buffer (selected-window))))
(remove-hook 'window-selection-change-functions #'parinfer-rust--defer-loading t)
(parinfer-rust-mode)))
(parinfer-rust-mode-enable)))
;; Disable fill column warning only for this buffer to enable long strings of text without
;; having to do a weird mapconcat.
;; Local Variables:
Expand Down
68 changes: 40 additions & 28 deletions parinfer-rust-mode.el
Original file line number Diff line number Diff line change
Expand Up @@ -503,7 +503,7 @@ Checks if MODE is a valid Parinfer mode, and uses
(parinfer-rust--set-default-state)
(parinfer-rust--dim-parens))

(defun parinfer-rust-mode-enable ()
(defun parinfer-rust-mode-setup ()
"Enable Parinfer."
(setq-local parinfer-rust-enabled t)
(parinfer-rust--detect-troublesome-modes)
Expand Down Expand Up @@ -535,6 +535,39 @@ This includes stopping tracking of all changes."
(setq-local parinfer-rust--disable nil)
(setq-local parinfer-rust--disable t)))

(defun parinfer-rust-mode-enable ()
"Enable Parinfer."
;; Make sure the library is installed at the appropriate location or offer to download it
(if (parinfer-rust--check-for-library parinfer-rust-supported-versions
parinfer-rust-library
parinfer-rust--lib-name
parinfer-rust-auto-download)
(progn
(require 'parinfer-rust parinfer-rust-library t)
;; Check version and prompt to download latest version if out of date Problem: Emacs can't
;; reload dynamic libraries, which means that if we download a new library the user has to
;; restart Emacs for changes to take effect.
(parinfer-rust--check-version parinfer-rust-supported-versions
(parinfer-rust-version)
parinfer-rust-library
parinfer-rust--lib-name)
(parinfer-rust-mode-setup)
(cond ((or (eq 'defer parinfer-rust-check-before-enable)
buffer-read-only)
;; Defer checking for changes until a user changes the buffer
(setq-local parinfer-rust--disable t)
(add-hook 'before-change-functions #'parinfer-rust--check-for-issues t t))

((eq 'immediate parinfer-rust-check-before-enable)
(setq-local parinfer-rust--disable t)
(parinfer-rust--check-for-issues))

(t (let ((parinfer-rust--mode "paren"))
(parinfer-rust--execute)))))
(progn
(message "Unable to load library parinfer-rust disabling parinfer-rust-mode")
(parinfer-rust-mode-disable))))

;;;###autoload
(defun parinfer-rust-switch-mode ()
"Switch to a different Parinfer mode.
Expand Down Expand Up @@ -572,37 +605,16 @@ not available."
(cond
(parinfer-rust-enabled
(parinfer-rust-mode-disable))
;; Don't do anything if the buffer is not selected
;; TODO: Come up with a better way to defer and disable loading
;; Defer waits for window selection change and disabled waits for a change event
;; there is also the idea of deferring the running of parinfer vs deferring the loading
((not (eq (current-buffer)
(window-buffer (selected-window))))
(setq-local parinfer-rust-enabled t)
(add-hook 'window-selection-change-functions #'parinfer-rust--defer-loading nil t))
(t
(progn
;; Make sure the library is installed at the appropriate location or offer to download it
(when (parinfer-rust--check-for-library parinfer-rust-supported-versions
parinfer-rust-library
parinfer-rust--lib-name
parinfer-rust-auto-download)
(require 'parinfer-rust parinfer-rust-library t))
;; Check version and prompt to download latest version if out of date Problem: Emacs can't
;; reload dynamic libraries, which means that if we download a new library the user has to
;; restart Emacs for changes to take effect.
(parinfer-rust--check-version parinfer-rust-supported-versions
(parinfer-rust-version)
parinfer-rust-library
parinfer-rust--lib-name)
(parinfer-rust-mode-enable)
(cond ((or (eq 'defer parinfer-rust-check-before-enable)
buffer-read-only)
;; Defer checking for changes until a user changes the buffer
(setq-local parinfer-rust--disable t)
(add-hook 'before-change-functions #'parinfer-rust--check-for-issues t t))

((eq 'immediate parinfer-rust-check-before-enable)
(setq-local parinfer-rust--disable t)
(parinfer-rust--check-for-issues))

(t (let ((parinfer-rust--mode "paren"))
(parinfer-rust--execute))))))))
(parinfer-rust-mode-enable))))

(provide 'parinfer-rust-mode)
;;; parinfer-rust-mode.el ends here
3 changes: 1 addition & 2 deletions test/test-helper.el
Original file line number Diff line number Diff line change
Expand Up @@ -143,10 +143,9 @@ it makes no sense to convert it to a string using
parinfer-rust-library
parinfer-rust--lib-name)
(indent-tabs-mode 0)
(parinfer-rust-mode-enable)
;; Disable checks for deferral and do not run --execute on initialization
;; this breaks a lot of test because they expect the buffer to be in a specific state
)))
(parinfer-rust-mode-setup))))

(defun simulate-parinfer-in-another-buffer--without-changes (test-string mode)
"Run parinfer on buffer using text and cursor position
Expand Down
2 changes: 1 addition & 1 deletion test/user-submitted-cases.el
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
;;; indent-parinfer-tests.el --- Auto generates tests based on a json file -*- lexical-binding: nil; -*-
;;; user-submitted-cases.el --- User submitted test cases -*- lexical-binding: nil; -*-
;; Copyright (C) 2019 Justin Barclay

;; Author: Justin Barclay <justinbarclay@gmail.com>
Expand Down
Loading