@@ -133,6 +133,14 @@ Scaladoc behavior of indenting comment lines to the second asterisk."
133
133
:safe #'booleanp
134
134
:group 'scala )
135
135
136
+ (defcustom scala-indent:use-cycle-indent nil
137
+ " When non-nil, indentation will cycle from the new indent
138
+ strategy indent, the last known indent, and the left margin on
139
+ subsequent indent-line calls."
140
+ :type 'boolean
141
+ :safe #'booleanp
142
+ :group 'scala )
143
+
136
144
(defun scala-indent:run-on-strategy ()
137
145
" Returns the currently effecti run-on strategy"
138
146
(or scala-indent:effective-run-on-strategy
@@ -897,8 +905,66 @@ strings"
897
905
(beginning-of-line )
898
906
(when (looking-at " ^\\ s +$" ) (point )))))
899
907
900
- (defun scala-indent:indent-line (&optional strategy )
901
- " Indents the current line."
908
+ (defvar-local scala-indent:cycle-indent-stack (list )
909
+ " The automatically buffer local scala indent cycle stack.
910
+
911
+ The stack is initialized as (left-margin, (current-indentation))
912
+ when the custom var \" scala-indent:use-cycle-indent\" is non-nil
913
+ and \" scala-indent:indent-line\" is called. Subsequent
914
+ \" scala-indent:indent-line\" calls pop the indentation value from
915
+ the stack, until it is empty, resetting the indentation cycle." )
916
+
917
+
918
+
919
+ (defun scala-indent:cycle-indent-stack-push (indentation )
920
+ " Pushes an integer value onto the \" scala-indent:cycle-indent-stack\" .
921
+
922
+ Will fail if INDENTATION is not an integer"
923
+
924
+ (if (integerp indentation)
925
+ (add-to-list 'scala-indent:cycle-indent-stack indentation)
926
+ (error " \" scala-indent:cycle-indent-stack-push\" : Invalid INDENTATION argument %s "
927
+ indentation)))
928
+
929
+ (defun scala-indent:cycle-indent-stack-pop ()
930
+ " Gets the top value of the \" scala-indent:cycle-indent-stack\" stack.
931
+
932
+ Modifies the stack in-place."
933
+
934
+ (pop (buffer-local-value 'scala-indent:cycle-indent-stack (current-buffer ))))
935
+
936
+ (defun scala-indent:cycle-indent-stack-depth ()
937
+ " The current depth of the \" scala-indent:cycle-indent-stack\" stack"
938
+
939
+ (length (buffer-local-value 'scala-indent:cycle-indent-stack (current-buffer ))))
940
+
941
+
942
+ (defun scala-indent:cycle-indent-stack-emptyp (x )
943
+ " Check if the \" scala-indent:cycle-indent-stack\" is empty.
944
+
945
+ Returns t if the \" scala-indent:cycle-indent-stack\" is empty,
946
+ nil otherwise."
947
+
948
+ (= (length (buffer-local-value 'scala-indent:cycle-indent-stack (current-buffer ))) 0 ))
949
+
950
+ (defun scala-indent:cycle-indent-line (&optional strategy )
951
+ " Cycle scala indentation using optionally passed STRATEGY.
952
+
953
+ When the \" scala-indent:cycle-indent-stack\" is empty, push 0 and
954
+ the current indentation onto the stack, then indent according to
955
+ the optionally passed STRATEGY. Indent to the top of
956
+ \" scala-indent:cycle-indent-stack\" when non-empty."
957
+
958
+ (interactive " *" )
959
+ (cond ((scala-indent:cycle-indent-stack-emptyp nil )
960
+ (scala-indent:cycle-indent-stack-push (current-indentation ))
961
+ (scala-indent:cycle-indent-stack-push 0 )
962
+ (call-interactively 'scala-indent:strategy-indent-line t ))
963
+ (t (scala-indent:indent-line-to (scala-indent:cycle-indent-stack-pop)))))
964
+
965
+ ; ; the previously-named scala-indent:indent-line
966
+ (defun scala-indent:strategy-indent-line (&optional strategy )
967
+ " Indent lines according to the OPTIONAL scala indentation STRATEGY."
902
968
(interactive " *" )
903
969
(let ((state (save-excursion (syntax-ppss (line-beginning-position )))))
904
970
(if (nth 8 state) ; ; 8 = start pos of comment or string
@@ -918,6 +984,18 @@ strings"
918
984
(scala-indent:indent-code-line strategy)))
919
985
)
920
986
987
+ (defun scala-indent:indent-line (&optional strategy )
988
+ " Indent the current line with cycling.
989
+
990
+ If the custom var \" scala-indent:use-cycle-indent\" is non-nil,
991
+ cycle-indent using the optionally passed STRATEGY. Indent using
992
+ the optionally passed STRATEGY without cycling otherwise."
993
+
994
+ (interactive " *" )
995
+ (if scala-indent:use-cycle-indent
996
+ (call-interactively t 'scala-indent:cycle-indent-line )
997
+ (call-interactively t 'scala-indent:strategy-indent-line )))
998
+
921
999
(defun scala-indent:indent-with-reluctant-strategy ()
922
1000
(interactive " *" )
923
1001
(scala-indent:indent-line scala-indent:reluctant-strategy))
0 commit comments