@@ -205,6 +205,20 @@ Out-of-the box clojure-mode understands lein, boot and gradle."
205
205
(define-key map (kbd " C-c C-r l" ) #'clojure-thread-last-all )
206
206
(define-key map (kbd " C-c C-r C-a" ) #'clojure-unwind-all )
207
207
(define-key map (kbd " C-c C-r a" ) #'clojure-unwind-all )
208
+ (define-key map (kbd " C-c C-r C-p" ) #'clojure-cycle-privacy )
209
+ (define-key map (kbd " C-c C-r p" ) #'clojure-cycle-privacy )
210
+ (define-key map (kbd " C-c C-r (" ) #'clojure-convert-collection-to-list )
211
+ (define-key map (kbd " C-c C-r C-(" ) #'clojure-convert-collection-to-list )
212
+ (define-key map (kbd " C-c C-r '" ) #'clojure-convert-collection-to-quoted-list )
213
+ (define-key map (kbd " C-c C-r C-'" ) #'clojure-convert-collection-to-quoted-list )
214
+ (define-key map (kbd " C-c C-r {" ) #'clojure-convert-collection-to-map )
215
+ (define-key map (kbd " C-c C-r C-{" ) #'clojure-convert-collection-to-map )
216
+ (define-key map (kbd " C-c C-r [" ) #'clojure-convert-collection-to-vector )
217
+ (define-key map (kbd " C-c C-r C-[" ) #'clojure-convert-collection-to-vector )
218
+ (define-key map (kbd " C-c C-r #" ) #'clojure-convert-collection-to-set )
219
+ (define-key map (kbd " C-c C-r C-#" ) #'clojure-convert-collection-to-set )
220
+ (define-key map (kbd " C-c C-r C-i" ) #'clojure-cycle-if )
221
+ (define-key map (kbd " C-c C-r i" ) #'clojure-cycle-if )
208
222
(define-key map (kbd " C-c C-r n i" ) #'clojure-insert-ns-form )
209
223
(define-key map (kbd " C-c C-r n h" ) #'clojure-insert-ns-form-at-point )
210
224
(define-key map (kbd " C-c C-r n u" ) #'clojure-update-ns )
@@ -213,11 +227,19 @@ Out-of-the box clojure-mode understands lein, boot and gradle."
213
227
'(" Clojure"
214
228
[" Toggle between string & keyword" clojure-toggle-keyword-string]
215
229
[" Align expression" clojure-align]
230
+ [" Cycle privacy" clojure-cycle-privacy]
231
+ [" Cycle if, if-not" clojure-cycle-if]
216
232
(" ns forms"
217
233
[" Insert ns form at the top" clojure-insert-ns-form]
218
234
[" Insert ns form here" clojure-insert-ns-form-at-point]
219
235
[" Update ns form" clojure-update-ns]
220
236
[" Sort ns form" clojure-sort-ns])
237
+ (" Convert collection"
238
+ [" Convert to list" clojure-convert-collection-to-list]
239
+ [" Convert to quoted list" clojure-convert-collection-to-quoted-list]
240
+ [" Convert to map" clojure-convert-collection-to-map]
241
+ [" Convert to vector" clojure-convert-collection-to-vector]
242
+ [" Convert to set" clojure-convert-collection-to-set])
221
243
(" Refactor -> and ->>"
222
244
[" Thread once more" clojure-thread]
223
245
[" Fully thread a form with ->" clojure-thread-first-all]
@@ -1629,6 +1651,8 @@ This will skip over sexps that don't represent objects, so that ^hints and
1629
1651
; ; Refactoring support
1630
1652
; ;
1631
1653
; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1654
+
1655
+ ; ;; Threading macros related
1632
1656
(defcustom clojure-thread-all-but-last nil
1633
1657
" Non-nil means do not thread the last expression.
1634
1658
This means that `clojure-thread-first-all' and
@@ -1824,6 +1848,109 @@ When BUT-LAST is passed the last expression is not threaded."
1824
1848
(interactive " P" )
1825
1849
(clojure--thread-all " ->> " but-last))
1826
1850
1851
+ ; ;; Cycling stuff
1852
+
1853
+ (defcustom clojure-use-metadata-for-privacy nil
1854
+ " If nil, `clojure-cycle-privacy' will use (defn- f []).
1855
+ If t, it will use (defn ^:private f [])."
1856
+ :package-version '(clojure-mode . " 5.5.0" )
1857
+ :safe #'booleanp
1858
+ :type 'boolean )
1859
+
1860
+ ;;;### autoload
1861
+ (defun clojure-cycle-privacy ()
1862
+ " Make public the current private def, or vice-versa.
1863
+ See: https://github.com/clojure-emacs/clj-refactor.el/wiki/cljr-cycle-privacy"
1864
+ (interactive )
1865
+ (save-excursion
1866
+ (ignore-errors (forward-char 7 ))
1867
+ (search-backward-regexp " (defn?\\ (-\\ | ^:private\\ )?\\ _>" )
1868
+ (if (match-string 1 )
1869
+ (replace-match " " nil nil nil 1 )
1870
+ (goto-char (match-end 0 ))
1871
+ (insert (if (or clojure-use-metadata-for-privacy
1872
+ (equal (match-string 0 ) " (def" ))
1873
+ " ^:private"
1874
+ " -" )))))
1875
+
1876
+ (defun clojure--convert-collection (coll-open coll-close )
1877
+ " Convert the collection at (point) by unwrapping it an wrapping it between COLL-OPEN and COLL-CLOSE."
1878
+ (save-excursion
1879
+ (while (and
1880
+ (not (bobp ))
1881
+ (not (looking-at " (\\ |{\\ |\\ [" )))
1882
+ (backward-char ))
1883
+
1884
+ (when (or (eq ?\# (char-before ))
1885
+ (eq ?\' (char-before )))
1886
+ (delete-char -1 ))
1887
+
1888
+ (when (and (bobp )
1889
+ (not (memq (char-after ) '(?\{ ?\( ?\[ ))))
1890
+ (user-error " Beginning of file reached, collection is not found" ))
1891
+
1892
+ (insert coll-open (substring (clojure-delete-and-extract-sexp) 1 -1 ) coll-close)))
1893
+
1894
+ ;;;### autoload
1895
+ (defun clojure-convert-collection-to-list ()
1896
+ " Convert collection at (point) to list."
1897
+ (interactive )
1898
+ (clojure--convert-collection " (" " )" ))
1899
+
1900
+ ;;;### autoload
1901
+ (defun clojure-convert-collection-to-quoted-list ()
1902
+ " Convert collection at (point) to quoted list."
1903
+ (interactive )
1904
+ (clojure--convert-collection " '(" " )" ))
1905
+
1906
+ ;;;### autoload
1907
+ (defun clojure-convert-collection-to-map ()
1908
+ " Convert collection at (point) to map."
1909
+ (interactive )
1910
+ (clojure--convert-collection " {" " }" ))
1911
+
1912
+ ;;;### autoload
1913
+ (defun clojure-convert-collection-to-vector ()
1914
+ " Convert collection at (point) to vector."
1915
+ (interactive )
1916
+ (clojure--convert-collection " [" " ]" ))
1917
+
1918
+ ;;;### autoload
1919
+ (defun clojure-convert-collection-to-set ()
1920
+ " Convert collection at (point) to set."
1921
+ (interactive )
1922
+ (clojure--convert-collection " #{" " }" ))
1923
+
1924
+ (defun clojure--goto-if ()
1925
+ (when (in-string-p )
1926
+ (while (or (not (looking-at " (" ))
1927
+ (in-string-p ))
1928
+ (backward-char )))
1929
+ (while (not (looking-at " \\ ((if \\ )\\ |\\ ((if-not \\ )" ))
1930
+ (condition-case nil
1931
+ (backward-up-list )
1932
+ (scan-error (user-error " No if or if-not found" )))))
1933
+
1934
+ ;;;### autoload
1935
+ (defun clojure-cycle-if ()
1936
+ " Change a surrounding if to if-not, or vice-versa.
1937
+
1938
+ See: https://github.com/clojure-emacs/clj-refactor.el/wiki/cljr-cycle-if"
1939
+ (interactive )
1940
+ (save-excursion
1941
+ (clojure--goto-if)
1942
+ (cond
1943
+ ((looking-at " (if-not" )
1944
+ (forward-char 3 )
1945
+ (delete-char 4 )
1946
+ (forward-sexp 2 )
1947
+ (transpose-sexps 1 ))
1948
+ ((looking-at " (if" )
1949
+ (forward-char 3 )
1950
+ (insert " -not" )
1951
+ (forward-sexp 2 )
1952
+ (transpose-sexps 1 )))))
1953
+
1827
1954
1828
1955
; ;; ClojureScript
1829
1956
(defconst clojurescript-font-lock-keywords
0 commit comments