Skip to content

Commit 135d55b

Browse files
committed
refactor: initalization improvements
1 parent 2cedb74 commit 135d55b

21 files changed

+329
-261
lines changed

README.org

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ This will load all `el` files included in the project. Alternatively, you can tr
6060
"idee-eshell.el"
6161
"idee-vterm.el"
6262
"idee-visitors.el"
63-
"idee-arch.el"
64-
"idee-yml.el"))
63+
"idee-arch.el"))
6564
#+end_src
6665

6766
Using `use-package` you can enable additional modules in a similar mannner, for example:

idee-clojure.el

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434

3535
(defconst clojure-comment-style (make-idee/comment-style :line-prefix ";;"))
3636

37+
(defvar idee/clojure-initialized nil)
38+
3739
(defun idee/clojure-enable()
3840
"Enable clojure bindings."
3941
(interactive)
@@ -77,8 +79,11 @@
7779
(idee/clojure-enable)))
7880

7981
(defun idee/clojure-init ()
80-
(add-hook 'clojure-mode-hook 'idee/clojure-enable)
81-
(idee/visitor-register 'idee/clojure-visitor))
82+
"Initialize idee-clojure."
83+
(interactive)
84+
(idee/only-once idee/clojure-initialized
85+
(add-hook 'clojure-mode-hook 'idee/clojure-enable)
86+
(idee/visitor-register 'idee/clojure-visitor)))
8287

8388
(provide 'idee-clojure)
8489
;;; idee-clojure.el ends here

idee-golang.el

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
(defconst glidee/yml "glide.yml")
3333
(defconst gopkg-toml "Gopkg.toml")
3434

35+
(defvar idee/golang-initialized nil)
36+
3537
(defun idee/golang-enable()
3638
"Enabled golang bindings."
3739
(interactive)
@@ -83,10 +85,11 @@ The command supports accepting an external CREATE-FUNCTION or defaults to idee/p
8385
(defun idee/golang-init ()
8486
"Initialize IDE golang."
8587
(interactive)
86-
(idee/visitor-register 'idee/golang-visitor)
87-
(idee/project-factory-register idee/golang-module-factory)
88-
;; Hooks
89-
(add-hook 'go-mode-hook 'idee/golang-hook))
88+
(idee/only-once idee/golang-initialized
89+
(idee/visitor-register 'idee/golang-visitor)
90+
(idee/project-factory-register idee/golang-module-factory)
91+
;; Hooks
92+
(add-hook 'go-mode-hook 'idee/golang-hook))
9093

9194
(provide 'idee-golang)
92-
;; idee-golang.el ends here
95+
;;; idee-golang.el ends here

idee-headers.el

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
;;
2929
;; Customization
3030
;;
31-
(defconst idee/emacs-headers-dir (concat (file-name-as-directory idee/resources-dir) "headers") "The directory where header files are stored.")
3231

3332
(defvar idee/header-selected-kind nil "The kind of header currently selcted.")
3433

@@ -92,10 +91,5 @@
9291
"Find the headers source directory."
9392
(concat (file-name-as-directory (idee/source-dir)) "headers"))
9493

95-
;;;###autoload
96-
(defun idee/header-init ()
97-
"Initialize ide headers."
98-
(advice-add 'projectile-switch-project :after 'idee/header-detect))
99-
10094
(provide 'idee-headers)
10195
;;; idee-headers.el ends here

idee-java-utils.el

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,19 @@
7171
"Return the package line for the current file."
7272
(idee/java-package-of default-directory))
7373

74+
;;;###autoload
7475
(defun idee/java-package-line()
7576
"Return the full package line for the current directory."
7677
(let ((pkg (idee/java-package-of default-directory)))
7778
(when (and pkg (not (idee/string-blank pkg)))
7879
(concat "package " pkg ";"))))
7980

81+
;;;###autoload
8082
(defun idee/java-class()
8183
"Return the class name for the current file."
8284
(file-name-nondirectory (file-name-sans-extension (buffer-file-name))))
8385

86+
;;;###autoload
8487
(defun idee/java-class-sans-suffix (suffix &optional class-name)
8588
"Return the class name for the current file."
8689
(let ((class-name (or class-name (file-name-nondirectory (file-name-sans-extension (buffer-file-name))))))

idee-java.el

Lines changed: 106 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
(defconst java-comment-style (make-idee/comment-style :block-beginning "/*" :block-ending "*/"
4848
:custom-block-beginning idee/comment-java-custom-block-beginning :custom-line-prefix idee/comment-java-custom-line-prefix :custom-block-ending idee/comment-java-custom-block-ending))
4949
(defvar idee/java-last-visited-class nil)
50+
(defvar idee/java-initialized nil)
5051

5152

5253
(defun idee/java-enable()
@@ -76,7 +77,7 @@
7677
(jshell-process-name (format "*jshell %s" (if module-dir module-dir (idee/project-root-dir))))
7778
(existing-buffer (car (seq-filter (lambda (b) (idee/starts-with (buffer-name b) jshell-process-name)) (buffer-list)))))
7879
(if existing-buffer
79-
(switch-to-buffer existing-buffer)
80+
(switch-to-buffer existing-buffer)
8081
(let* ((new-jshell-process-name (format "*%s*" jshell-buffer-name)))
8182
(ansi-term "/bin/sh" jshell-buffer-name)
8283
(term-line-mode)
@@ -98,33 +99,33 @@
9899
"Create a new java class with FQCN from the specified ARCHETYPE.
99100
The new class will be created under SRC-PATH or `src/main/java` if the src path is ommitted.
100101
The target module will be the current, unless BASE-PATH has been specified, in which case it will be used."
101-
(with-temp-buffer
102-
(let* ((base-path (file-name-as-directory (or base-path (idee/module-root-dir))))
103-
(src-path (file-name-as-directory (or src-path "src/main/java")))
104-
(package (idee/java-package-of-fqcn fqcn))
105-
(class-name (substring fqcn (+ 1 (length package))))
106-
(package-path (replace-regexp-in-string (regexp-quote ".") "/" package))
107-
(class (concat base-path (format "%s/%s/%s.java" src-path package-path class-name))))
108-
(set-visited-file-name class)
109-
(insert archetype)
110-
(java-mode)
111-
(yas-expand)
112-
(write-file class))))
102+
(with-temp-buffer
103+
(let* ((base-path (file-name-as-directory (or base-path (idee/module-root-dir))))
104+
(src-path (file-name-as-directory (or src-path "src/main/java")))
105+
(package (idee/java-package-of-fqcn fqcn))
106+
(class-name (substring fqcn (+ 1 (length package))))
107+
(package-path (replace-regexp-in-string (regexp-quote ".") "/" package))
108+
(class (concat base-path (format "%s/%s/%s.java" src-path package-path class-name))))
109+
(set-visited-file-name class)
110+
(insert archetype)
111+
(java-mode)
112+
(yas-expand)
113+
(write-file class))))
113114

114115
(defun idee/java-archetype-create-resource (name archetype &optional src-path base-path)
115116
"Create a new java class with FQCN in the current module from the specified ARCHETYPE."
116-
(with-temp-buffer
117-
(let* ((base-path (file-name-as-directory (or base-path (idee/module-root-dir))))
118-
(src-path (file-name-as-directory (or src-path "src/main/resources")))
119-
(resource (concat base-path (format "%s/%s" src-path name)))
120-
(extension (file-name-extension resource))
121-
(mode (cdr (assoc extension idee/type-modes-alist))))
122-
(set-visited-file-name resource)
123-
(when archetype
124-
(insert archetype)
125-
(when mode (funcall mode))
126-
(yas-expand))
127-
(write-file resource))))
117+
(with-temp-buffer
118+
(let* ((base-path (file-name-as-directory (or base-path (idee/module-root-dir))))
119+
(src-path (file-name-as-directory (or src-path "src/main/resources")))
120+
(resource (concat base-path (format "%s/%s" src-path name)))
121+
(extension (file-name-extension resource))
122+
(mode (cdr (assoc extension idee/type-modes-alist))))
123+
(set-visited-file-name resource)
124+
(when archetype
125+
(insert archetype)
126+
(when mode (funcall mode))
127+
(yas-expand))
128+
(write-file resource))))
128129

129130
(defun idee/java-register-spi (interface impl)
130131
"Create a new java class with FQCN in the current module from the specified ARCHETYPE."
@@ -147,54 +148,54 @@ The target module will be the current, unless BASE-PATH has been specified, in w
147148
(idee/java-archetype-create-class fqcn "abstract-factory")))
148149

149150
(defun idee/java-archetype-annotation-processor ()
150-
"A simple java annotation and annotation processor archetype."
151-
(interactive)
152-
(let* ((current-fqcn (idee/java-fqcn-of (buffer-file-name)))
153-
(current-pkg (idee/java-package-of (buffer-file-name)))
154-
(fqcn (read-string "Annotation processor qualified class name:" current-pkg)))
155-
(idee/java-archetype-create-class fqcn "annotation")
156-
(idee/java-archetype-create-class (concat fqcn "Processor") "apt")
157-
(idee/java-register-spi "javax.annotation.processing.Processor" fqcn)))
151+
"A simple java annotation and annotation processor archetype."
152+
(interactive)
153+
(let* ((current-fqcn (idee/java-fqcn-of (buffer-file-name)))
154+
(current-pkg (idee/java-package-of (buffer-file-name)))
155+
(fqcn (read-string "Annotation processor qualified class name:" current-pkg)))
156+
(idee/java-archetype-create-class fqcn "annotation")
157+
(idee/java-archetype-create-class (concat fqcn "Processor") "apt")
158+
(idee/java-register-spi "javax.annotation.processing.Processor" fqcn)))
158159

159160
;;
160161
;; Snippets
161162
;;
162163

163164
(defun idee/java-create-template (source-file name key &optional templates-dir)
164165
"Create snippet from file."
165-
(with-temp-buffer
166-
(let* ((root-dir (idee/project-root-dir (buffer-file-name)))
167-
(conf-dir (concat (file-name-as-directory root-dir) idee/project-conf-dir))
168-
(project-templates-dir (concat (file-name-as-directory conf-dir) "templates"))
169-
(templates-dir (or templates-dir project-templates-dir))
170-
(body (idee/java-snippet-body-from source-file))
171-
(target (concat (file-name-as-directory templates-dir) (format "java-mode/%s" key)))
172-
(parent (file-name-directory target)))
173-
(set-visited-file-name target)
174-
(insert (format "# name: %s" name))
175-
(newline)
176-
(insert (format "# key: %s" key))
177-
(newline)
178-
(insert "# --")
179-
(newline)
180-
(insert body)
181-
(write-file target)
182-
(yas-load-directory parent)
183-
(yas-compile-directory parent))))
166+
(with-temp-buffer
167+
(let* ((root-dir (idee/project-root-dir (buffer-file-name)))
168+
(conf-dir (concat (file-name-as-directory root-dir) idee/project-conf-dir))
169+
(project-templates-dir (concat (file-name-as-directory conf-dir) "templates"))
170+
(templates-dir (or templates-dir project-templates-dir))
171+
(body (idee/java-snippet-body-from source-file))
172+
(target (concat (file-name-as-directory templates-dir) (format "java-mode/%s" key)))
173+
(parent (file-name-directory target)))
174+
(set-visited-file-name target)
175+
(insert (format "# name: %s" name))
176+
(newline)
177+
(insert (format "# key: %s" key))
178+
(newline)
179+
(insert "# --")
180+
(newline)
181+
(insert body)
182+
(write-file target)
183+
(yas-load-directory parent)
184+
(yas-compile-directory parent))))
184185

185186
(defun idee/java-snippet-body-from (f)
186187
"Create snippet from file F."
187188
(with-temp-buffer
188189
(save-excursion
189-
(insert-file-contents f)
190-
(goto-char (point-min))
191-
(idee/comment-remove-at-point java-comment-style)
192-
(let* ((content (buffer-substring-no-properties (point-min) (point-max)))
193-
(class-name (idee/java-class-name-of f))
194-
(updated (concat
195-
"`idee/header`\n" (replace-regexp-in-string "package[ ]+[a-zA-Z0-9\.-]+;" "`idee/java-package-line`"
190+
(insert-file-contents f)
191+
(goto-char (point-min))
192+
(idee/comment-remove-at-point java-comment-style)
193+
(let* ((content (buffer-substring-no-properties (point-min) (point-max)))
194+
(class-name (idee/java-class-name-of f))
195+
(updated (concat
196+
"`idee/header`\n" (replace-regexp-in-string "package[ ]+[a-zA-Z0-9\.-]+;" "`idee/java-package-line`"
196197
(replace-regexp-in-string (regexp-quote class-name) idee/java-snippet-class-name content t) t))))
197-
updated))))
198+
updated))))
198199

199200
(defun idee/filename ()
200201
"Return the name for the current file."
@@ -208,44 +209,62 @@ The target module will be the current, unless BASE-PATH has been specified, in w
208209
(equal build-gradle x)))
209210
(directory-files root)))
210211

212+
;;;###autoload
211213
(defun idee/java-visitor (root)
212214
"Check if a java project is available under the specified ROOT."
213-
(if (idee/java-project-p root)
214-
(idee/java-enable)))
215+
(when (idee/java-project-p root)
216+
(idee/lsp-java-init)
217+
(idee/java-enable)))
215218

216219
;;;###autoload
217220
(defun idee/java-init ()
218221
"Initialize java."
219222
(interactive)
220223
;; Dependencies
221-
(idee/lsp-java-init)
222-
(idee/maven-init)
223-
(idee/quarkus-init)
224-
(idee/spring-init)
225-
226-
(idee/visitor-register 'idee/java-visitor)
227-
228-
(idee/template-factory-register (make-idee/template-factory
229-
:mode 'java-mode
230-
:description "A java temlate factory"
231-
:func 'idee/java-create-template))
232-
(idee/archetype-register
233-
(make-idee/archetype
234-
:name "Java Abstract Factory"
235-
:description "A simple java abstract factory"
236-
:func 'idee/java-archetype-abstract-factory))
237-
238-
(idee/archetype-register
239-
(make-idee/archetype
240-
:name "Java Annotation and Processor"
241-
:description "A java annotation and a java annotation processor"
242-
:func 'idee/java-archetype-annotation-processor))
224+
(idee/only-once idee/java-initialized
225+
;; LSP
226+
(idee/lsp-java-init)
227+
228+
;; Maven
229+
(idee/visitor-register 'idee/maven-visitor)
230+
(idee/project-factory-register (make-idee/project-factory
231+
:name "Maven"
232+
:description "New Maven project from archetype."
233+
:func 'idee/new-maven-from-archetype-project))
234+
;; Quarkus
235+
(idee/visitor-register 'idee/quarkus-visitor)
236+
(idee/project-factory-register (make-idee/project-factory
237+
:name "Quarkus"
238+
:description "New Quarkus project created using the quarkus maven plugin."
239+
:func 'idee/new-quarkus-rest-project))
240+
241+
;; Spring
242+
(idee/project-factory-register (make-idee/project-factory
243+
:name "Spring"
244+
:description "New Spring project created using https://start.spring.io"
245+
:func 'idee/new-spring-starter-project))
246+
247+
(idee/template-factory-register (make-idee/template-factory
248+
:mode 'java-mode
249+
:description "A java temlate factory"
250+
:func 'idee/java-create-template))
251+
(idee/archetype-register
252+
(make-idee/archetype
253+
:name "Java Abstract Factory"
254+
:description "A simple java abstract factory"
255+
:func 'idee/java-archetype-abstract-factory))
256+
257+
(idee/archetype-register
258+
(make-idee/archetype
259+
:name "Java Annotation and Processor"
260+
:description "A java annotation and a java annotation processor"
261+
:func 'idee/java-archetype-annotation-processor))
243262

244263
;;; Hook
245-
(add-hook 'java-mode-hook 'idee/java-enable)
246-
(add-hook 'java-mode-hook 'idee/java-visit-file)
264+
(add-hook 'java-mode-hook 'idee/java-enable)
265+
(add-hook 'java-mode-hook 'idee/java-visit-file)
247266

248-
(advice-add 'projectile-switch-to-buffer :after #'idee/java-visit-file))
267+
(advice-add 'projectile-switch-to-buffer :after #'idee/java-visit-file))))
249268

250269
(provide 'idee-java)
251270
;;; idee-java.el ends here

idee-javascript.el

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
(defconst jsconfig-json "jsconfig.json")
3434
(defconst tsconfig-json "tsconfig.json")
3535

36+
(defvar idee/javascript-initialized nil)
37+
3638
(defun idee/javascript-enable()
3739
"Enable javascript, add hooks, visitors etc."
3840
(interactive))
@@ -202,19 +204,20 @@ The command supports accepting an external CREATE-FUNCTION or defaults to idee/p
202204
(defun idee/javascript-init ()
203205
"Initialize IDE javascript."
204206
(interactive)
205-
(idee/project-factory-register idee/npm-project-factory)
206-
(idee/visitor-register 'idee/javascript-visitor)
207+
(idee/only-once idee/javascript-initialized
208+
(idee/project-factory-register idee/npm-project-factory)
209+
(idee/visitor-register 'idee/javascript-visitor)
207210

208-
(idee/template-factory-register (make-idee/template-factory
211+
(idee/template-factory-register (make-idee/template-factory
209212
:mode 'js-mode
210213
:description "A javascript temlate factory"
211214
:func 'idee/javascript-create-template))
212215

213-
;; Hooks
214-
(add-hook 'javascipt-mode-hook 'idee/javascript-hook)
215-
(add-hook 'js2-mode-hook 'idee/javascript-hook)
216-
(add-hook 'js-jsx-mode-hook 'idee/javascript-hook)
217-
(add-hook 'typescirpt-mode-hook 'idee/javascript-hook))
216+
;; Hooks
217+
(add-hook 'javascipt-mode-hook 'idee/javascript-hook)
218+
(add-hook 'js2-mode-hook 'idee/javascript-hook)
219+
(add-hook 'js-jsx-mode-hook 'idee/javascript-hook)
220+
(add-hook 'typescirpt-mode-hook 'idee/javascript-hook)))
218221

219222
(provide 'idee-javascript)
220223
;;; idee-javascript.el ends here

0 commit comments

Comments
 (0)