diff --git a/Ide/IDE.icl b/Ide/IDE.icl index 40dfa6b33be71bd05a746119e872272261699bf3..f9ab72f895ab81159e65230a5749c12e90aa2964 100644 --- a/Ide/IDE.icl +++ b/Ide/IDE.icl @@ -985,6 +985,8 @@ editMenu altgr_workaround mEditId editRecId mFileSaveId mFileRevertId {mn_und, m :+: MenuItem "Add Pre&fix" [ MenuId (mg_edt!!5), MenuFunction (noLS add_prefix_selection)] :+: MenuItem "Remove Pref&ix" [ MenuId (mg_edt!!6), MenuFunction (noLS rem_prefix_selection)] :+: MenuItem "Change Prefi&x..." [ MenuId (mg_edt!!7), MenuFunction (noLS change_prefix_dlog)] + :+: MenuItem "I&ncrement Integers" [ MenuId (mg_edt!!8), MenuFunction (noLS increment_integers_in_selection)] + :+: MenuItem "De&crement Integers" [ MenuId (mg_edt!!9), MenuFunction (noLS decrement_integers_in_selection)] :+: MenuSeparator [] :+: MenuItem "Next &Window" [ MenuModsFunction stackfun diff --git a/Ide/IdeState.icl b/Ide/IdeState.icl index 84981d16db876eb2485f7551faeaf20c56696d78..c70876e3b0eee59a72d74f3f9b05570783e18a1c 100644 --- a/Ide/IdeState.icl +++ b/Ide/IdeState.icl @@ -202,7 +202,7 @@ iniGeneral (mEdCopyId,env) = openId env (mEdPasteId,env) = openId env (mEdClearId,env) = openId env - (edToolsIds,env) = openIds 8 env + (edToolsIds,env) = openIds 10 env (mdCmpId,env) = openId env (mdChkId,env) = openId env (mdGenId,env) = openId env diff --git a/Ide/prefix.dcl b/Ide/prefix.dcl index 96ffe406dbf78dcdb26b2f6a7e22338275ffe0f8..718d5d61f7f8371c1a81115878f0ae70973a5fc1 100644 --- a/Ide/prefix.dcl +++ b/Ide/prefix.dcl @@ -17,3 +17,7 @@ shift_selection_right :: !*(PSt General) -> *PSt General shift_selection_left :: !*(PSt General) -> *PSt General // block outdent + +increment_integers_in_selection :: !*(PSt General) -> *PSt General + +decrement_integers_in_selection :: !*(PSt General) -> *PSt General diff --git a/Ide/prefix.icl b/Ide/prefix.icl index 89afb45081e6eecde9502f9af214080d70f9fffc..25dc12cc7d285ecf3ef56eabb5ab2d8797c24203 100644 --- a/Ide/prefix.icl +++ b/Ide/prefix.icl @@ -193,3 +193,84 @@ where | n_spaces < size string && string.[n_spaces] == ' ' = count_spaces_at_begin (inc n_spaces) string = n_spaces + +increment_integers_in_selection :: !*(PSt General) -> *PSt General +increment_integers_in_selection ps + = replace_lines_and_redraw increment_prefix ps +where + increment_prefix text_tab_width line + = increment_integers 0 line + + increment_integers i line + | i'9' + = increment_integers (i+1) line + # after_digits_i = skip_digits (i+1) line + | not (i>0 && line.[i-1]=='-') + # (n_extra_chars,line) = increment_integer (after_digits_i-1) i line + = increment_integers (after_digits_i+n_extra_chars) line + # after_zeros_i = skip_zeros i line + | after_digits_i==after_zeros_i + # line = line % (0,i-2) +++ "1" +++ line % (after_zeros_i,size line-1) + = increment_integers i line + | after_digits_i==i+1 && line.[i]=='1' + # line = line % (0,i-2) +++ "0" +++ line % (after_digits_i,size line-1) + = increment_integers i line + # (n_extra_chars,line) = decrement_integer (after_digits_i-1) i line + = increment_integers (after_digits_i+n_extra_chars) line + = line + +decrement_integers_in_selection :: !*(PSt General) -> *PSt General +decrement_integers_in_selection ps + = replace_lines_and_redraw decrement_prefix ps +where + decrement_prefix text_tab_width line + = decrement_integers 0 line + + decrement_integers i line + | i'9' + = decrement_integers (i+1) line + # after_digits_i = skip_digits (i+1) line + | not (i>0 && line.[i-1]=='-') + # after_zeros_i = skip_zeros i line + | after_digits_i==after_zeros_i + # line = line % (0,i-1) +++ "-1" +++ line % (after_zeros_i,size line-1) + = decrement_integers (i+2) line + | after_digits_i==i+1 && line.[i]=='1' + = decrement_integers (i+1) (line:=(i,'0')) + # (n_extra_chars,line) = decrement_integer (after_digits_i-1) i line + = decrement_integers (after_digits_i+n_extra_chars) line + # (n_extra_chars,line) = increment_integer (after_digits_i-1) i line + = decrement_integers (after_digits_i+n_extra_chars) line + = line + +increment_integer :: !Int !Int !{#Char} -> (!Int,!{#Char}) +increment_integer digit_i first_digit_i line + # digit = line.[digit_i] + | digit<>'9' + = (0,line:=(digit_i,inc digit)) + | digit_i<>first_digit_i + = increment_integer (digit_i-1) first_digit_i (line:=(digit_i,'0')) + = (1,line % (0,digit_i-1) +++ "10" +++ line % (digit_i+1,size line-1)) + +decrement_integer :: !Int !Int !{#Char} -> (!Int,!{#Char}) +decrement_integer digit_i first_digit_i line + # digit = line.[digit_i] + | digit>'1' + = (0,line:=(digit_i,dec digit)) + | digit=='1' + | digit_i<>first_digit_i + = (0,line:=(digit_i,dec digit)) + = (-1,line % (0,digit_i-1)+++line % (digit_i+1,size line-1)) + = decrement_integer (digit_i-1) first_digit_i (line:=(digit_i,'9')) + +skip_digits i line + | i='0' && line.[i]<='9') + = skip_digits (i+1) line + = i; + +skip_zeros i line + | i