summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rc/filetype/awk.kak2
-rw-r--r--rc/filetype/c-family.kak4
-rw-r--r--rc/filetype/cabal.kak6
-rw-r--r--rc/filetype/css.kak2
-rw-r--r--rc/filetype/cue.kak2
-rw-r--r--rc/filetype/d.kak2
-rw-r--r--rc/filetype/dart.kak2
-rw-r--r--rc/filetype/gluon.kak20
-rw-r--r--rc/filetype/go.kak2
-rw-r--r--rc/filetype/java.kak2
-rw-r--r--rc/filetype/javascript.kak4
-rw-r--r--rc/filetype/json.kak8
-rw-r--r--rc/filetype/kakrc.kak12
-rw-r--r--rc/filetype/latex.kak2
-rw-r--r--rc/filetype/nix.kak4
-rw-r--r--rc/filetype/perl.kak6
-rw-r--r--rc/filetype/php.kak8
-rw-r--r--rc/filetype/protobuf.kak2
-rw-r--r--rc/filetype/python.kak14
-rw-r--r--rc/filetype/ragel.kak6
-rw-r--r--rc/filetype/rust.kak2
-rw-r--r--rc/filetype/sass.kak26
-rw-r--r--rc/filetype/scala.kak2
-rw-r--r--rc/filetype/sh.kak2
-rw-r--r--rc/filetype/zig.kak2
-rw-r--r--test/indent/c-family/deindent-function-closing-brace/cmd1
-rw-r--r--test/indent/c-family/deindent-function-closing-brace/in15
-rw-r--r--test/indent/c-family/deindent-function-closing-brace/out21
-rw-r--r--test/indent/c-family/deindent-function-closing-brace/rc3
-rw-r--r--test/indent/c-family/deindent-generic-closing-brace/cmd1
-rw-r--r--test/indent/c-family/deindent-generic-closing-brace/in31
-rw-r--r--test/indent/c-family/deindent-generic-closing-brace/out43
-rw-r--r--test/indent/c-family/deindent-generic-closing-brace/rc3
-rw-r--r--test/indent/c-family/deindent-if-closing-brace/cmd1
-rw-r--r--test/indent/c-family/deindent-if-closing-brace/in15
-rw-r--r--test/indent/c-family/deindent-if-closing-brace/out21
-rw-r--r--test/indent/c-family/deindent-if-closing-brace/rc3
-rw-r--r--test/indent/go/deindent-function-closing-brace/cmd1
-rw-r--r--test/indent/go/deindent-function-closing-brace/in15
-rw-r--r--test/indent/go/deindent-function-closing-brace/out21
-rw-r--r--test/indent/go/deindent-function-closing-brace/rc3
-rw-r--r--test/indent/go/deindent-generic-closing-brace/cmd1
-rw-r--r--test/indent/go/deindent-generic-closing-brace/in31
-rw-r--r--test/indent/go/deindent-generic-closing-brace/out43
-rw-r--r--test/indent/go/deindent-generic-closing-brace/rc3
-rw-r--r--test/indent/go/deindent-if-closing-brace/cmd1
-rw-r--r--test/indent/go/deindent-if-closing-brace/in12
-rw-r--r--test/indent/go/deindent-if-closing-brace/out17
-rw-r--r--test/indent/go/deindent-if-closing-brace/rc3
-rw-r--r--test/indent/javascript/deindent-complex-brace-structure/cmd1
-rw-r--r--test/indent/javascript/deindent-complex-brace-structure/in1
-rw-r--r--test/indent/javascript/deindent-complex-brace-structure/out12
-rw-r--r--test/indent/javascript/deindent-complex-brace-structure/rc3
-rw-r--r--test/indent/rust/deindent-function-closing-brace/cmd1
-rw-r--r--test/indent/rust/deindent-function-closing-brace/in15
-rw-r--r--test/indent/rust/deindent-function-closing-brace/out21
-rw-r--r--test/indent/rust/deindent-function-closing-brace/rc3
-rw-r--r--test/indent/rust/deindent-generic-closing-brace/cmd1
-rw-r--r--test/indent/rust/deindent-generic-closing-brace/in31
-rw-r--r--test/indent/rust/deindent-generic-closing-brace/out43
-rw-r--r--test/indent/rust/deindent-generic-closing-brace/rc3
-rw-r--r--test/indent/rust/deindent-if-closing-brace/cmd1
-rw-r--r--test/indent/rust/deindent-if-closing-brace/in15
-rw-r--r--test/indent/rust/deindent-if-closing-brace/out21
-rw-r--r--test/indent/rust/deindent-if-closing-brace/rc3
65 files changed, 584 insertions, 44 deletions
diff --git a/rc/filetype/awk.kak b/rc/filetype/awk.kak
index 663174b7..85ec591a 100644
--- a/rc/filetype/awk.kak
+++ b/rc/filetype/awk.kak
@@ -76,6 +76,8 @@ define-command -hidden awk-indent-on-new-line %[
try %[ execute-keys -draft k <a-x> s \h+$ <ret> d ]
# indent after line ending in opening curly brace
try %[ execute-keys -draft k<a-x> <a-k>\{\h*(#.*)?$<ret> j<a-gt> ]
+ # deindent closing brace when after cursor
+ try %[ execute-keys -draft <a-x> <a-k> ^\h*\} <ret> gh / \} <ret> m <a-S> 1<a-&> ]
]
]
diff --git a/rc/filetype/c-family.kak b/rc/filetype/c-family.kak
index b4a993eb..4f056857 100644
--- a/rc/filetype/c-family.kak
+++ b/rc/filetype/c-family.kak
@@ -83,7 +83,7 @@ define-command -hidden c-family-indent-on-newline %< evaluate-commands -draft -i
# remove previous empty lines resulting from the automatic indent
try %< execute-keys -draft k <a-x> <a-k>^\h+$<ret> Hd >
# indent after an opening brace or parenthesis at end of line
- try %< execute-keys -draft k <a-x> s[{(]\h*$<ret> j <a-gt> >
+ try %< execute-keys -draft k <a-x> <a-k>[{(]\h*$<ret> j <a-gt> >
# indent after a label
try %< execute-keys -draft k <a-x> s[a-zA-Z0-9_-]+:\h*$<ret> j <a-gt> >
# indent after a statement not followed by an opening brace
@@ -98,6 +98,8 @@ define-command -hidden c-family-indent-on-newline %< evaluate-commands -draft -i
try %< execute-keys -draft K <a-x> <a-k>\;\h*(//[^\n]+)?$<ret> \
K <a-x> s \belse\b\h*(?://[^\n]+)?\n([^\n]*\n){2}\z<ret> \
<a-S>1<a-&> >
+ # deindent closing brace(s) when after cursor
+ try %< execute-keys -draft <a-x> <a-k> ^\h*[})] <ret> gh / [})] <esc> m <a-S> 1<a-&> >
# align to the opening parenthesis or opening brace (whichever is first)
# on a previous line if its followed by text on the same line
try %< evaluate-commands -draft %<
diff --git a/rc/filetype/cabal.kak b/rc/filetype/cabal.kak
index 77519954..cb95d2d9 100644
--- a/rc/filetype/cabal.kak
+++ b/rc/filetype/cabal.kak
@@ -52,14 +52,16 @@ define-command -hidden cabal-trim-indent %{
define-command -hidden cabal-indent-on-new-line %[
evaluate-commands -draft -itersel %[
- # copy '#' comment prefix and following white spaces
- try %[ execute-keys -draft k <a-x> s ^\h*\K#\h* <ret> y gh j P ]
+ # copy '--' comment prefix and following white spaces
+ try %[ execute-keys -draft k <a-x> s ^\h*\K--\h* <ret> y gh j P ]
# preserve previous line indent
try %[ execute-keys -draft <semicolon> K <a-&> ]
# filter previous line
try %[ execute-keys -draft k : cabal-trim-indent <ret> ]
# indent after lines ending with { or :
try %[ execute-keys -draft <space> k <a-x> <a-k> [:{]$ <ret> j <a-gt> ]
+ # deindent closing brace when after cursor
+ try %[ execute-keys -draft <a-x> <a-k> \h*\} <ret> gh / \} <ret> m <a-S> 1<a-&> ]
]
]
diff --git a/rc/filetype/css.kak b/rc/filetype/css.kak
index 8825c84e..7f6f7866 100644
--- a/rc/filetype/css.kak
+++ b/rc/filetype/css.kak
@@ -71,6 +71,8 @@ define-command -hidden css-indent-on-new-line %[
try %[ execute-keys -draft k : css-trim-indent <ret> ]
# indent after lines ending with with {
try %[ execute-keys -draft k <a-x> <a-k> \{$ <ret> j <a-gt> ]
+ # deindent closing brace when after cursor
+ try %[ execute-keys -draft <a-x> <a-k> ^\h*\} <ret> gh / \} <ret> m <a-S> 1<a-&> ]
]
]
diff --git a/rc/filetype/cue.kak b/rc/filetype/cue.kak
index a2fbb0c7..ab46059e 100644
--- a/rc/filetype/cue.kak
+++ b/rc/filetype/cue.kak
@@ -136,6 +136,8 @@ define-command -hidden cue-indent-on-new-line %~
try %[ execute-keys -draft k <a-x> <a-k> [{(]\h*$ <ret> j <a-gt> ]
# indent after lines ending with [{(].+ and move first parameter to own line
try %< execute-keys -draft [c[({],[)}] <ret> <a-k> \A[({][^\n]+\n[^\n]*\n?\z <ret> L i<ret><esc> <gt> <a-S> <a-&> >
+ # deindent closing brace(s) when after cursor
+ try %< execute-keys -draft <a-x> <a-k> ^\h*[})] <ret> gh / [})] <ret> m <a-S> 1<a-&> >
|
# filter previous line
try %{ execute-keys -draft k : cue-trim-indent <ret> }
diff --git a/rc/filetype/d.kak b/rc/filetype/d.kak
index 18e547d5..73db7e52 100644
--- a/rc/filetype/d.kak
+++ b/rc/filetype/d.kak
@@ -121,6 +121,8 @@ define-command -hidden d-indent-on-new-line %~
try %[ execute-keys -draft k<a-x> <a-k> ^\h*(case|default).*:$ <ret> j<a-gt> ]
# indent after if|else|while|for
try %[ execute-keys -draft <semicolon><a-F>)MB <a-k> \A(if|else|while|for)\h*\(.*\)\h*\n\h*\n?\z <ret> s \A|.\z <ret> 1<a-&>1<a-space><a-gt> ]
+ # deindent closing brace(s) when after cursor
+ try %[ execute-keys -draft <a-x> <a-k> ^\h*[})] <ret> gh / [})] <ret> m <a-S> 1<a-&> ]
=
~
diff --git a/rc/filetype/dart.kak b/rc/filetype/dart.kak
index 541c1e58..2a07eafc 100644
--- a/rc/filetype/dart.kak
+++ b/rc/filetype/dart.kak
@@ -97,6 +97,8 @@ define-command -hidden dart-indent-on-new-line %~
try %[ execute-keys -draft k<a-x> <a-k> ^\h*(case|default).*:$ <ret> j<a-gt> ]
# indent after if|else|while|for
try %[ execute-keys -draft <semicolon><a-F>)MB <a-k> \A(if|else|while|for)\h*\(.*\)\h*\n\h*\n?\z <ret> s \A|.\z <ret> 1<a-&>1<a-space><a-gt> ]
+ # deindent closing brace when after cursor
+ try %[ execute-keys -draft <a-x> <a-k> ^\h*\} <ret> gh / \} <ret> m <a-S> 1<a-&> ]
=
~
diff --git a/rc/filetype/gluon.kak b/rc/filetype/gluon.kak
index 2298737c..d2e23644 100644
--- a/rc/filetype/gluon.kak
+++ b/rc/filetype/gluon.kak
@@ -31,7 +31,7 @@ hook -group gluon-highlight global WinSetOption filetype=gluon %{
}
-provide-module gluon %[
+provide-module gluon %§
# Highlighters
# ‾‾‾‾‾‾‾‾‾‾‾‾
@@ -78,8 +78,8 @@ define-command -hidden gluon-trim-indent %{
try %{ execute-keys -draft -itersel <a-x> s \h+$ <ret> d }
}
-define-command -hidden gluon-indent-on-new-line %{
- evaluate-commands -draft -itersel %{
+define-command -hidden gluon-indent-on-new-line %~
+ evaluate-commands -draft -itersel %_
# copy // and /// comments prefix and following white spaces
try %{ execute-keys -draft k <a-x> s ^\h*\K///?\h* <ret> y gh j P }
# preserve previous line indent
@@ -88,12 +88,10 @@ define-command -hidden gluon-indent-on-new-line %{
try %{ execute-keys -draft k : gluon-trim-indent <ret> }
# indent after lines ending with (open) braces, =, ->, condition, rec,
# or in
- try %{
- execute-keys -draft \
- \; k x <a-k> (\(|\{|\[|=|->|then|else|rec|in)$ <ret> j <a-gt>
- # balance out brackets } ]
- }
- }
-}
+ try %{ execute-keys -draft \; k x <a-k> (\(|\{|\[|=|->|then|else|rec|in)$ <ret> j <a-gt> }
+ # deindent closing brace(s) when after cursor
+ try %< execute-keys -draft <a-x> <a-k> ^\h*[})\]] <ret> gh / \})\]] <ret> m <a-S> 1<a-&> >
+ _
+~
-]
diff --git a/rc/filetype/go.kak b/rc/filetype/go.kak
index 69ce6c27..5d077991 100644
--- a/rc/filetype/go.kak
+++ b/rc/filetype/go.kak
@@ -89,6 +89,8 @@ define-command -hidden go-indent-on-new-line %~
try %[ execute-keys -draft k<a-x> <a-k> ^\h*(case|default).*:$ <ret> j<a-gt> ]
# indent after if|else|while|for
try %[ execute-keys -draft <semicolon><a-F>)MB <a-k> \A(if|else|while|for)\h*\(.*\)\h*\n\h*\n?\z <ret> s \A|.\z <ret> 1<a-&>1<a-space><a-gt> ]
+ # deindent closing brace(s) when after cursor
+ try %[ execute-keys -draft <a-x> <a-k> ^\h*[})] <ret> gh / [})] <ret> m <a-S> 1<a-&> ]
=
~
diff --git a/rc/filetype/java.kak b/rc/filetype/java.kak
index f6a77f82..12cb99a3 100644
--- a/rc/filetype/java.kak
+++ b/rc/filetype/java.kak
@@ -56,6 +56,8 @@ define-command -hidden java-indent-on-new-line %~
try %[ execute-keys -draft k<a-x> <a-k> ^\h*(case|default).*:$ <ret> j<a-gt> ]
# indent after keywords
try %[ execute-keys -draft <semicolon><a-F>)MB <a-k> \A(if|else|while|for|try|catch)\h*\(.*\)\h*\n\h*\n?\z <ret> s \A|.\z <ret> 1<a-&>1<a-space><a-gt> ]
+ # deindent closing brace(s) when after cursor
+ try %[ execute-keys -draft <a-x> <a-k> ^\h*[})] <ret> gh / [})] <ret> m <a-S> 1<a-&> ]
=
~
diff --git a/rc/filetype/javascript.kak b/rc/filetype/javascript.kak
index 191ae95d..fdac14af 100644
--- a/rc/filetype/javascript.kak
+++ b/rc/filetype/javascript.kak
@@ -61,7 +61,9 @@ define-command -hidden javascript-indent-on-new-line %<
# filter previous line
try %{ execute-keys -draft k : javascript-trim-indent <ret> }
# indent after lines beginning / ending with opener token
- try %_ execute-keys -draft k <a-x> <a-k> ^\h*[[{]|[[{]$ <ret> j <a-gt> _
+ try %_ execute-keys -draft k <a-x> s [[({] <ret> <space> <a-l> <a-K> [\])}] <ret> j <a-gt> _
+ # deindent closing token(s) when after cursor
+ try %_ execute-keys -draft <a-x> <a-k> ^\h*[})\]] <ret> gh / [})\]] <ret> m <a-S> 1<a-&> _
>
>
diff --git a/rc/filetype/json.kak b/rc/filetype/json.kak
index 2f798b6f..67f0506c 100644
--- a/rc/filetype/json.kak
+++ b/rc/filetype/json.kak
@@ -49,7 +49,7 @@ define-command -hidden json-trim-indent %{
define-command -hidden json-indent-on-char %<
evaluate-commands -draft -itersel %<
# align closer token to its opener when alone on a line
- try %< execute-keys -draft <a-h> <a-k> ^\h+[]}]$ <ret> m s \A|.\z <ret> 1<a-&> >
+ try %< execute-keys -draft <a-h> <a-k> ^\h+[\]}]$ <ret> m <a-S> 1<a-&> >
>
>
@@ -59,8 +59,10 @@ define-command -hidden json-indent-on-new-line %<
try %{ execute-keys -draft <semicolon> K <a-&> }
# filter previous line
try %{ execute-keys -draft k : json-trim-indent <ret> }
- # indent after lines beginning with opener token
- try %< execute-keys -draft k <a-x> <a-k> ^\h*[[{] <ret> j <a-gt> >
+ # indent after lines ending with opener token
+ try %< execute-keys -draft k <a-x> <a-k> [[{]\h*$ <ret> j <a-gt> >
+ # deindent closer token(s) when after cursor
+ try %< execute-keys -draft <a-x> <a-k> ^\h*[}\]] <ret> gh / [}\]] <ret> m <a-S> 1<a-&> >
>
>
diff --git a/rc/filetype/kakrc.kak b/rc/filetype/kakrc.kak
index 2a2f505f..bf59cdbf 100644
--- a/rc/filetype/kakrc.kak
+++ b/rc/filetype/kakrc.kak
@@ -90,8 +90,8 @@ add-highlighter shared/kakrc/single_string/escape regex "''" 0:default+b
# Commands
# ‾‾‾‾‾‾‾‾
-define-command -hidden kak-indent-on-new-line %{
- evaluate-commands -draft -itersel %{
+define-command -hidden kak-indent-on-new-line %~
+ evaluate-commands -draft -itersel %=
# copy '#' comment prefix and following white spaces
try %{ execute-keys -draft k <a-x> s ^\h*#\h* <ret> y jgh P }
# preserve previous line indent
@@ -100,8 +100,12 @@ define-command -hidden kak-indent-on-new-line %{
try %{ execute-keys -draft k <a-x> s \h+$ <ret> d }
# indent after line ending with %\w*[^\s\w]
try %{ execute-keys -draft k <a-x> <a-k> \%\w*[^\s\w]$ <ret> j <a-gt> }
- }
-}
+ # deindent closing brace when after cursor
+ try %_ execute-keys -draft -itersel <a-x> <a-k> ^\h*([>)}\]]) <ret> gh / <c-r>1 <ret> m <a-S> 1<a-&> _
+ # deindent closing char(s)
+ try %{ execute-keys -draft -itersel <a-x> <a-k> ^\h*([^\s\w]) <ret> gh / <c-r>1 <ret> <a-?> <c-r>1 <ret> <a-T>% <a-k> \w*<c-r>1$ <ret> <a-S> 1<a-&> }
+ =
+~
define-command -hidden kak-indent-on-closing-matching %~
# align to opening matching brace when alone on a line
diff --git a/rc/filetype/latex.kak b/rc/filetype/latex.kak
index af336f68..a872ad14 100644
--- a/rc/filetype/latex.kak
+++ b/rc/filetype/latex.kak
@@ -68,6 +68,8 @@ define-command -hidden latex-indent-newline %(
try %{ execute-keys -draft k<a-x> s\h+$<ret> d }
# indent after line ending with {
try %( execute-keys -draft k<a-x> <a-k>\{$<ret> j<a-gt> )
+ # deindent closing brace(s) when after cursor
+ try %( execute-keys -draft <a-x> <a-k> ^\h*\} <ret> gh / \} <ret> m <a-S> 1<a-&> )
# indent after line ending with \begin{...}[...]{...}, with multiple
# sets of arguments possible
try %(
diff --git a/rc/filetype/nix.kak b/rc/filetype/nix.kak
index 36137552..091204e9 100644
--- a/rc/filetype/nix.kak
+++ b/rc/filetype/nix.kak
@@ -95,7 +95,7 @@ define-command -hidden nix-trim-indent %{
define-command -hidden nix-indent-on-char %<
evaluate-commands -draft -itersel %<
# align closer token to its opener when alone on a line
- try %/ execute-keys -draft <a-h> <a-k> ^\h+[]}]$ <ret> m s \A|.\z <ret> 1<a-&> /
+ try %/ execute-keys -draft <a-h> <a-k> ^\h+[\]}]$ <ret> m s \A|.\z <ret> 1<a-&> /
>
>
@@ -109,6 +109,8 @@ define-command -hidden nix-indent-on-new-line %<
try %{ execute-keys -draft k : nix-trim-indent <ret> }
# indent after lines beginning / ending with opener token
try %_ execute-keys -draft k <a-x> <a-k> ^\h*[[{]|[[{]$ <ret> j <a-gt> _
+ # deindent closer token(s) when after cursor
+ try %_ execute-keys -draft <a-x> <a-k> ^\h*[}\]] <ret> gh / [}\]] <ret> m <a-S> 1<a-&> _
>
>
diff --git a/rc/filetype/perl.kak b/rc/filetype/perl.kak
index a2da7cf9..348b4cd3 100644
--- a/rc/filetype/perl.kak
+++ b/rc/filetype/perl.kak
@@ -111,12 +111,14 @@ define-command -hidden perl-indent-on-new-line %~
try %{ execute-keys -draft k<a-x> s \h+$ <ret>d }
# align to opening paren of previous line
try %{ execute-keys -draft [( <a-k> \A\([^\n]+\n[^\n]*\n?\z <ret> s \A\(\h*.|.\z <ret> '<a-;>' & }
- # copy // comments prefix
- try %{ execute-keys -draft <semicolon><c-s>k<a-x> s ^\h*\K/{2,} <ret> y<c-o>P<esc> }
+ # copy # comments prefix
+ try %{ execute-keys -draft <semicolon><c-s>k<a-x> s ^\h*\K# <ret> y<c-o>P<esc> }
# indent after a switch's case/default statements
try %[ execute-keys -draft k<a-x> <a-k> ^\h*(case|default).*:$ <ret> j<a-gt> ]
# indent after if|else|while|for
try %[ execute-keys -draft <semicolon><a-F>)MB <a-k> \A(if|else|while|for)\h*\(.*\)\h*\n\h*\n?\z <ret> s \A|.\z <ret> 1<a-&>1<a-space><a-gt> ]
+ # deindent closing brace(s) when after cursor
+ try %[ execute-keys -draft <a-x> <a-k> ^\h*[})] <ret> gh / [})] <ret> m <a-S> 1<a-&> ]
=
~
diff --git a/rc/filetype/php.kak b/rc/filetype/php.kak
index e296b4fa..770a4b60 100644
--- a/rc/filetype/php.kak
+++ b/rc/filetype/php.kak
@@ -23,7 +23,7 @@ hook -group php-highlight global WinSetOption filetype=php %{
hook -once -always window WinSetOption filetype=.* %{ remove-highlighter window/php-file }
}
-provide-module php %(
+provide-module php %§
require-module html
# Highlighters
@@ -77,7 +77,7 @@ define-command -hidden php-trim-indent %{
define-command -hidden php-indent-on-char %<
evaluate-commands -draft -itersel %<
# align closer token to its opener when alone on a line
- try %/ execute-keys -draft <a-h> <a-k> ^\h+[]}]$ <ret> m s \A|.\z <ret> 1<a-&> /
+ try %/ execute-keys -draft <a-h> <a-k> ^\h+[\]}]$ <ret> m s \A|.\z <ret> 1<a-&> /
>
>
@@ -93,7 +93,9 @@ define-command -hidden php-indent-on-new-line %<
try %_ execute-keys -draft k <a-x> <a-k> ^\h*[[{]|[[{]$ <ret> j <a-gt> _
# append " * " on lines starting a multiline /** or /* comment
try %{ execute-keys -draft k <a-x> s ^\h*/[*][* ]? <ret> j gi i <space>*<space> }
+ # deindent closer token(s) when after cursor
+ try %_ execute-keys -draft <a-x> <a-k> ^\h*[})] <ret> gh / [})] <ret> m <a-S> 1<a-&> _
>
>
-)
diff --git a/rc/filetype/protobuf.kak b/rc/filetype/protobuf.kak
index 2e7d8f97..3d9c9fba 100644
--- a/rc/filetype/protobuf.kak
+++ b/rc/filetype/protobuf.kak
@@ -76,6 +76,8 @@ define-command -hidden protobuf-indent-on-newline %~
try %{ execute-keys -draft k<a-x> s \h+$ <ret>d }
# copy // comments prefix
try %{ execute-keys -draft <semicolon><c-s>k<a-x> s ^\h*\K/{2,}(\h*(?=\S))? <ret> y<c-o>P<esc> }
+ # deindent closing brace(s) when after cursor
+ try %[ execute-keys -draft <a-x> <a-k> ^\h*\} <ret> gh / \} <ret> m <a-S> 1<a-&> ]
]
~
diff --git a/rc/filetype/python.kak b/rc/filetype/python.kak
index bac31e3f..db62c8db 100644
--- a/rc/filetype/python.kak
+++ b/rc/filetype/python.kak
@@ -28,7 +28,7 @@ hook -group python-highlight global WinSetOption filetype=python %{
hook -once -always window WinSetOption filetype=.* %{ remove-highlighter window/python }
}
-provide-module python %{
+provide-module python %§
# Highlighters & Completion
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
@@ -149,15 +149,17 @@ define-command -hidden python-insert-on-new-line %{
try %{ execute-keys -draft k <a-x> s ^\h*#\h* <ret> y jgh P }
}
}
-define-command -hidden python-indent-on-new-line %{
- evaluate-commands -draft -itersel %{
+define-command -hidden python-indent-on-new-line %<
+ evaluate-commands -draft -itersel %<
# preserve previous line indent
try %{ execute-keys -draft <semicolon> K <a-&> }
# cleanup trailing whitespaces from previous line
try %{ execute-keys -draft k <a-x> s \h+$ <ret> d }
# indent after line ending with :
try %{ execute-keys -draft <space> k <a-x> <a-k> :$ <ret> j <a-gt> }
- }
-}
+ # deindent closing brace/bracket when after cursor (for arrays and dictionaries)
+ try %[ execute-keys -draft <a-x> <a-k> ^\h*[}\]] <ret> gh / [}\]] <ret> m <a-S> 1<a-&> ]
+ >
+>
-}
diff --git a/rc/filetype/ragel.kak b/rc/filetype/ragel.kak
index 85a79b31..eadcf1f7 100644
--- a/rc/filetype/ragel.kak
+++ b/rc/filetype/ragel.kak
@@ -55,8 +55,8 @@ define-command -hidden ragel-trim-indent %{
define-command -hidden ragel-indent-on-char %<
evaluate-commands -draft -itersel %<
# align closer token to its opener when alone on a line
- try %< execute-keys -draft <a-h> <a-k> ^\h+[]})]$ <ret> m s \A|.\z <ret> 1<a-&> >
- try %< execute-keys -draft <a-h> <a-k> ^\h+ [*]$ <ret> <a-?> [*]$ <ret> s \A|.\z <ret> 1<a-&> >
+ try %< execute-keys -draft <a-h> <a-k> ^\h+[\]})]$ <ret> m s \A|.\z <ret> 1<a-&> >
+ try %< execute-keys -draft <a-h> <a-k> ^\h+ [*]$ <ret> <a-?> [*]$ <ret> s \A|.\z <ret> 1<a-&> >
>
>
@@ -70,6 +70,8 @@ define-command -hidden ragel-indent-on-new-line %<
try %{ execute-keys -draft k : ragel-trim-indent <ret> }
# indent after lines ending with opener token
try %< execute-keys -draft k <a-x> <a-k> [[{(*]$ <ret> j <a-gt> >
+ # align closer token to its opener when after cursor
+ try %< execute-keys -draft <a-x> <a-k> ^\h*[})\]] <ret> gh / [})\]] <ret> m <a-S> 1<a-&> >
>
>
diff --git a/rc/filetype/rust.kak b/rc/filetype/rust.kak
index 24d36f88..049fc444 100644
--- a/rc/filetype/rust.kak
+++ b/rc/filetype/rust.kak
@@ -112,6 +112,8 @@ define-command -hidden rust-indent-on-new-line %~
try %+ execute-keys -draft k <a-x> <a-k> ^\h*where\h*$ <ret> j <a-gt> +
# dedent after lines starting with . and ending with , or ;
try %_ execute-keys -draft k <a-x> <a-k> ^\h*\..*[,<semicolon>]\h*$ <ret> j <a-lt> _
+ # deindent closing brace(s) when after cursor
+ try %= execute-keys -draft <a-x> <a-k> ^\h*[})] <ret> gh / [})] <ret> m <a-S> 1<a-&> =
# todo dedent additional unmatched parenthesis
# try %& execute-keys -draft k <a-x> s \((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\) l Gl s\) %sh{
# count previous selections length
diff --git a/rc/filetype/sass.kak b/rc/filetype/sass.kak
index 403a47dd..d3df6300 100644
--- a/rc/filetype/sass.kak
+++ b/rc/filetype/sass.kak
@@ -11,15 +11,16 @@ hook global BufCreate .*[.](sass) %{
# Initialization
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾
-hook global WinSetOption filetype=sass %{
+hook global WinSetOption filetype=sass %<
require-module sass
hook window ModeChange pop:insert:.* -group sass-trim-indent sass-trim-indent
+ hook window InsertChar \} -group sass-indent sass-indent-on-closing-brace
hook window InsertChar \n -group sass-indent sass-indent-on-new-line
set-option buffer extra_word_chars '_' '-'
hook -once -always window WinSetOption filetype=.* %{ remove-hooks window sass-.+ }
-}
+>
hook -group sass-highlight global WinSetOption filetype=sass %{
add-highlighter window/sass ref sass
@@ -27,7 +28,7 @@ hook -group sass-highlight global WinSetOption filetype=sass %{
}
-provide-module sass %{
+provide-module sass %§
# Highlighters
# ‾‾‾‾‾‾‾‾‾‾‾‾
@@ -53,8 +54,15 @@ define-command -hidden sass-trim-indent %{
try %{ execute-keys -draft -itersel <a-x> s \h+$ <ret> d }
}
-define-command -hidden sass-indent-on-new-line %{
- evaluate-commands -draft -itersel %{
+define-command -hidden sass-indent-on-closing-brace %<
+ evaluate-commands -draft -itersel %<
+ # align closing brace to same indentation as the line that the opening brace resides on
+ try %[ execute-keys -draft <a-h> <a-k> ^\h+\}$ <ret> m <a-S> 1<a-&> ]
+ >
+>
+
+define-command -hidden sass-indent-on-new-line %<
+ evaluate-commands -draft -itersel %<
# copy '/' comment prefix and following white spaces
try %{ execute-keys -draft k <a-x> s ^\h*\K/\h* <ret> y gh j P }
# preserve previous line indent
@@ -63,7 +71,9 @@ define-command -hidden sass-indent-on-new-line %{
try %{ execute-keys -draft k : sass-trim-indent <ret> }
# avoid indent after properties and comments
try %{ execute-keys -draft k <a-x> <a-K> [:/] <ret> j <a-gt> }
- }
-}
+ # deindent closing brace when after cursor
+ try %[ execute-keys -draft <a-x> <a-k> ^\h*\} <ret> gh / \} <ret> m <a-S> 1<a-&> ]
+ >
+>
-}
diff --git a/rc/filetype/scala.kak b/rc/filetype/scala.kak
index 29884d20..48dfa937 100644
--- a/rc/filetype/scala.kak
+++ b/rc/filetype/scala.kak
@@ -69,6 +69,8 @@ define-command -hidden scala-indent-on-new-line %[
try %[ execute-keys -draft k : scala-trim-indent <ret> ]
# indent after lines ending with {
try %[ execute-keys -draft k <a-x> <a-k> \{$ <ret> j <a-gt> ]
+ # deindent closing brace when after cursor
+ try %[ execute-keys -draft <a-x> <a-k> ^\h*\} <ret> gh / \} <ret> m <a-S> 1<a-&> ]
]
]
diff --git a/rc/filetype/sh.kak b/rc/filetype/sh.kak
index 05cf3016..56511903 100644
--- a/rc/filetype/sh.kak
+++ b/rc/filetype/sh.kak
@@ -182,6 +182,8 @@ define-command -hidden sh-indent-on-new-line %[
try %= execute-keys -draft <space> k <a-x> <a-k> (\s|^)\{$ <ret> j <a-gt> =
# deindent closing }
try %= execute-keys -draft <space> k <a-x> <a-k> ^\s*\}$ <ret> <a-lt> j K <a-&> =
+ # deindent closing } when after cursor
+ try %= execute-keys -draft <a-x> <a-k> ^\h*\} <ret> gh / \} <ret> m <a-S> 1<a-&> =
]
]
diff --git a/rc/filetype/zig.kak b/rc/filetype/zig.kak
index 2f0e5d55..c70a14c9 100644
--- a/rc/filetype/zig.kak
+++ b/rc/filetype/zig.kak
@@ -121,6 +121,8 @@ define-command -hidden zig-indent-on-new-line %<
try %< execute-keys -draft <semicolon> K <a-&> >
# indent after lines ending in {
try %< execute-keys -draft k <a-x> <a-k> \{\h*$ <ret> j <a-gt> >
+ # deindent closing } when after cursor
+ try %< execute-keys -draft <a-x> <a-k> ^\h*\} <ret> gh / \} <ret> m <a-S> 1<a-&> >
>
# filter previous line
try %< execute-keys -draft k : zig-trim-indent <ret> >
diff --git a/test/indent/c-family/deindent-function-closing-brace/cmd b/test/indent/c-family/deindent-function-closing-brace/cmd
new file mode 100644
index 00000000..e3036a40
--- /dev/null
+++ b/test/indent/c-family/deindent-function-closing-brace/cmd
@@ -0,0 +1 @@
+c<ret>
diff --git a/test/indent/c-family/deindent-function-closing-brace/in b/test/indent/c-family/deindent-function-closing-brace/in
new file mode 100644
index 00000000..732f00da
--- /dev/null
+++ b/test/indent/c-family/deindent-function-closing-brace/in
@@ -0,0 +1,15 @@
+void foo(void) {%( )}
+
+void foo(void) {%( )
+}
+
+void foo(void) {%( )bar()}
+
+void foo(void) {%( )bar()
+}
+
+void foo(void) {
+ bar()%( )}
+
+ void foo(void) {
+ bar()%( )}
diff --git a/test/indent/c-family/deindent-function-closing-brace/out b/test/indent/c-family/deindent-function-closing-brace/out
new file mode 100644
index 00000000..b507fbee
--- /dev/null
+++ b/test/indent/c-family/deindent-function-closing-brace/out
@@ -0,0 +1,21 @@
+void foo(void) {
+}
+
+void foo(void) {
+
+}
+
+void foo(void) {
+ bar()}
+
+void foo(void) {
+ bar()
+}
+
+void foo(void) {
+ bar()
+}
+
+ void foo(void) {
+ bar()
+ }
diff --git a/test/indent/c-family/deindent-function-closing-brace/rc b/test/indent/c-family/deindent-function-closing-brace/rc
new file mode 100644
index 00000000..2c2a7247
--- /dev/null
+++ b/test/indent/c-family/deindent-function-closing-brace/rc
@@ -0,0 +1,3 @@
+source "%val{runtime}/colors/default.kak"
+source "%val{runtime}/rc/filetype/c-family.kak"
+set buffer filetype cpp
diff --git a/test/indent/c-family/deindent-generic-closing-brace/cmd b/test/indent/c-family/deindent-generic-closing-brace/cmd
new file mode 100644
index 00000000..e3036a40
--- /dev/null
+++ b/test/indent/c-family/deindent-generic-closing-brace/cmd
@@ -0,0 +1 @@
+c<ret>
diff --git a/test/indent/c-family/deindent-generic-closing-brace/in b/test/indent/c-family/deindent-generic-closing-brace/in
new file mode 100644
index 00000000..d7e7a23d
--- /dev/null
+++ b/test/indent/c-family/deindent-generic-closing-brace/in
@@ -0,0 +1,31 @@
+{%( )}
+
+{%( )
+}
+
+{%( )bar()}
+
+{%( )bar()
+}
+
+{
+ bar()%( )}
+
+{(%( ))}
+
+{(%( )
+)}
+
+{(%( )foo())}
+
+{(%( )foo()
+)}
+
+{(
+ bar()%( ))}
+
+ {
+ bar()%( )}
+
+ {(
+ bar()%( ))}
diff --git a/test/indent/c-family/deindent-generic-closing-brace/out b/test/indent/c-family/deindent-generic-closing-brace/out
new file mode 100644
index 00000000..d00507c9
--- /dev/null
+++ b/test/indent/c-family/deindent-generic-closing-brace/out
@@ -0,0 +1,43 @@
+{
+}
+
+{
+
+}
+
+{
+ bar()}
+
+{
+ bar()
+}
+
+{
+ bar()
+}
+
+{(
+)}
+
+{(
+
+)}
+
+{(
+ foo())}
+
+{(
+ foo()
+)}
+
+{(
+ bar()
+)}
+
+ {
+ bar()
+ }
+
+ {(
+ bar()
+ )}
diff --git a/test/indent/c-family/deindent-generic-closing-brace/rc b/test/indent/c-family/deindent-generic-closing-brace/rc
new file mode 100644
index 00000000..2c2a7247
--- /dev/null
+++ b/test/indent/c-family/deindent-generic-closing-brace/rc
@@ -0,0 +1,3 @@
+source "%val{runtime}/colors/default.kak"
+source "%val{runtime}/rc/filetype/c-family.kak"
+set buffer filetype cpp
diff --git a/test/indent/c-family/deindent-if-closing-brace/cmd b/test/indent/c-family/deindent-if-closing-brace/cmd
new file mode 100644
index 00000000..e3036a40
--- /dev/null
+++ b/test/indent/c-family/deindent-if-closing-brace/cmd
@@ -0,0 +1 @@
+c<ret>
diff --git a/test/indent/c-family/deindent-if-closing-brace/in b/test/indent/c-family/deindent-if-closing-brace/in
new file mode 100644
index 00000000..5ac38a34
--- /dev/null
+++ b/test/indent/c-family/deindent-if-closing-brace/in
@@ -0,0 +1,15 @@
+if (1) {%( )}
+
+if (1) {%( )
+}
+
+if (1) {%( )bar()}
+
+if (1) {%( )bar()
+}
+
+if (1) {
+ bar()%( )}
+
+ if (1) {
+ bar()%( )}
diff --git a/test/indent/c-family/deindent-if-closing-brace/out b/test/indent/c-family/deindent-if-closing-brace/out
new file mode 100644
index 00000000..d46b84cf
--- /dev/null
+++ b/test/indent/c-family/deindent-if-closing-brace/out
@@ -0,0 +1,21 @@
+if (1) {
+}
+
+if (1) {
+
+}
+
+if (1) {
+ bar()}
+
+if (1) {
+ bar()
+}
+
+if (1) {
+ bar()
+}
+
+ if (1) {
+ bar()
+ }
diff --git a/test/indent/c-family/deindent-if-closing-brace/rc b/test/indent/c-family/deindent-if-closing-brace/rc
new file mode 100644
index 00000000..2c2a7247
--- /dev/null
+++ b/test/indent/c-family/deindent-if-closing-brace/rc
@@ -0,0 +1,3 @@
+source "%val{runtime}/colors/default.kak"
+source "%val{runtime}/rc/filetype/c-family.kak"
+set buffer filetype cpp
diff --git a/test/indent/go/deindent-function-closing-brace/cmd b/test/indent/go/deindent-function-closing-brace/cmd
new file mode 100644
index 00000000..e3036a40
--- /dev/null
+++ b/test/indent/go/deindent-function-closing-brace/cmd
@@ -0,0 +1 @@
+c<ret>
diff --git a/test/indent/go/deindent-function-closing-brace/in b/test/indent/go/deindent-function-closing-brace/in
new file mode 100644
index 00000000..a30bf4c4
--- /dev/null
+++ b/test/indent/go/deindent-function-closing-brace/in
@@ -0,0 +1,15 @@
+func foo(x int) int {%( )}
+
+func foo(x int) int {%( )
+}
+
+func foo(x int) int {%( )bar()}
+
+func foo(x int) int {%( )bar()
+}
+
+func foo(x int) int {
+ bar()%( )}
+
+ func foo(x int) int {
+ bar()%( )}
diff --git a/test/indent/go/deindent-function-closing-brace/out b/test/indent/go/deindent-function-closing-brace/out
new file mode 100644
index 00000000..3a5e4869
--- /dev/null
+++ b/test/indent/go/deindent-function-closing-brace/out
@@ -0,0 +1,21 @@
+func foo(x int) int {
+}
+
+func foo(x int) int {
+
+}
+
+func foo(x int) int {
+ bar()}
+
+func foo(x int) int {
+ bar()
+}
+
+func foo(x int) int {
+ bar()
+}
+
+ func foo(x int) int {
+ bar()
+ }
diff --git a/test/indent/go/deindent-function-closing-brace/rc b/test/indent/go/deindent-function-closing-brace/rc
new file mode 100644
index 00000000..1b0b0035
--- /dev/null
+++ b/test/indent/go/deindent-function-closing-brace/rc
@@ -0,0 +1,3 @@
+source "%val{runtime}/colors/default.kak"
+source "%val{runtime}/rc/filetype/go.kak"
+set buffer filetype go
diff --git a/test/indent/go/deindent-generic-closing-brace/cmd b/test/indent/go/deindent-generic-closing-brace/cmd
new file mode 100644
index 00000000..e3036a40
--- /dev/null
+++ b/test/indent/go/deindent-generic-closing-brace/cmd
@@ -0,0 +1 @@
+c<ret>
diff --git a/test/indent/go/deindent-generic-closing-brace/in b/test/indent/go/deindent-generic-closing-brace/in
new file mode 100644
index 00000000..5a31c18f
--- /dev/null
+++ b/test/indent/go/deindent-generic-closing-brace/in
@@ -0,0 +1,31 @@
+{%( )}
+
+{%( )
+}
+
+{%( )bar()}
+
+{%( )bar()
+}
+
+{
+ bar()%( )}
+
+ {
+ bar()%( )}
+
+{(%( ))}
+
+{(%( )
+)}
+
+{(%( )foo())}
+
+{(%( )foo()
+)}
+
+{(
+ bar()%( ))}
+
+ {(
+ bar()%( ))}
diff --git a/test/indent/go/deindent-generic-closing-brace/out b/test/indent/go/deindent-generic-closing-brace/out
new file mode 100644
index 00000000..cfd6db40
--- /dev/null
+++ b/test/indent/go/deindent-generic-closing-brace/out
@@ -0,0 +1,43 @@
+{
+}
+
+{
+
+}
+
+{
+ bar()}
+
+{
+ bar()
+}
+
+{
+ bar()
+}
+
+ {
+ bar()
+ }
+
+{(
+)}
+
+{(
+
+)}
+
+{(
+ foo())}
+
+{(
+ foo()
+)}
+
+{(
+ bar()
+)}
+
+ {(
+ bar()
+ )}
diff --git a/test/indent/go/deindent-generic-closing-brace/rc b/test/indent/go/deindent-generic-closing-brace/rc
new file mode 100644
index 00000000..1b0b0035
--- /dev/null
+++ b/test/indent/go/deindent-generic-closing-brace/rc
@@ -0,0 +1,3 @@
+source "%val{runtime}/colors/default.kak"
+source "%val{runtime}/rc/filetype/go.kak"
+set buffer filetype go
diff --git a/test/indent/go/deindent-if-closing-brace/cmd b/test/indent/go/deindent-if-closing-brace/cmd
new file mode 100644
index 00000000..e3036a40
--- /dev/null
+++ b/test/indent/go/deindent-if-closing-brace/cmd
@@ -0,0 +1 @@
+c<ret>
diff --git a/test/indent/go/deindent-if-closing-brace/in b/test/indent/go/deindent-if-closing-brace/in
new file mode 100644
index 00000000..d5f59de0
--- /dev/null
+++ b/test/indent/go/deindent-if-closing-brace/in
@@ -0,0 +1,12 @@
+if true {%( )}
+
+if true {%( )
+}
+
+if true {%( )bar()}
+
+if true {%( )bar()
+}
+
+if true {
+ bar()%( )}
diff --git a/test/indent/go/deindent-if-closing-brace/out b/test/indent/go/deindent-if-closing-brace/out
new file mode 100644
index 00000000..2c63bd1c
--- /dev/null
+++ b/test/indent/go/deindent-if-closing-brace/out
@@ -0,0 +1,17 @@
+if true {
+}
+
+if true {
+
+}
+
+if true {
+ bar()}
+
+if true {
+ bar()
+}
+
+if true {
+ bar()
+}
diff --git a/test/indent/go/deindent-if-closing-brace/rc b/test/indent/go/deindent-if-closing-brace/rc
new file mode 100644
index 00000000..1b0b0035
--- /dev/null
+++ b/test/indent/go/deindent-if-closing-brace/rc
@@ -0,0 +1,3 @@
+source "%val{runtime}/colors/default.kak"
+source "%val{runtime}/rc/filetype/go.kak"
+set buffer filetype go
diff --git a/test/indent/javascript/deindent-complex-brace-structure/cmd b/test/indent/javascript/deindent-complex-brace-structure/cmd
new file mode 100644
index 00000000..f9bfe77d
--- /dev/null
+++ b/test/indent/javascript/deindent-complex-brace-structure/cmd
@@ -0,0 +1 @@
+c<ret><esc>Oif (true) {}<esc>hi<ret><esc>Oconsole.log();<esc>hhi<ret><esc>O{},<ret>{},<esc>hh<a-C>i<ret><esc>1<space>Ofoo: { bar: 1 },<esc>jjobaz: { bam: 2 },<esc>
diff --git a/test/indent/javascript/deindent-complex-brace-structure/in b/test/indent/javascript/deindent-complex-brace-structure/in
new file mode 100644
index 00000000..0f89c5b3
--- /dev/null
+++ b/test/indent/javascript/deindent-complex-brace-structure/in
@@ -0,0 +1 @@
+for (let i = 1; i < 5; ++i) {%( )}
diff --git a/test/indent/javascript/deindent-complex-brace-structure/out b/test/indent/javascript/deindent-complex-brace-structure/out
new file mode 100644
index 00000000..1d675934
--- /dev/null
+++ b/test/indent/javascript/deindent-complex-brace-structure/out
@@ -0,0 +1,12 @@
+for (let i = 1; i < 5; ++i) {
+ if (true) {
+ console.log(
+ {
+ foo: { bar: 1 },
+ },
+ {
+ baz: { bam: 2 },
+ },
+ );
+ }
+}
diff --git a/test/indent/javascript/deindent-complex-brace-structure/rc b/test/indent/javascript/deindent-complex-brace-structure/rc
new file mode 100644
index 00000000..c975d253
--- /dev/null
+++ b/test/indent/javascript/deindent-complex-brace-structure/rc
@@ -0,0 +1,3 @@
+source "%val{runtime}/colors/default.kak"
+source "%val{runtime}/rc/filetype/javascript.kak"
+set buffer filetype javascript
diff --git a/test/indent/rust/deindent-function-closing-brace/cmd b/test/indent/rust/deindent-function-closing-brace/cmd
new file mode 100644
index 00000000..e3036a40
--- /dev/null
+++ b/test/indent/rust/deindent-function-closing-brace/cmd
@@ -0,0 +1 @@
+c<ret>
diff --git a/test/indent/rust/deindent-function-closing-brace/in b/test/indent/rust/deindent-function-closing-brace/in
new file mode 100644
index 00000000..ab5cc032
--- /dev/null
+++ b/test/indent/rust/deindent-function-closing-brace/in
@@ -0,0 +1,15 @@
+fn foo() -> i32 {%( )}
+
+fn foo() -> i32 {%( )
+}
+
+fn foo() -> i32 {%( )bar()}
+
+fn foo() -> i32 {%( )bar()
+}
+
+fn foo() -> i32 {
+ bar()%( )}
+
+ fn foo() -> i32 {
+ bar()%( )}
diff --git a/test/indent/rust/deindent-function-closing-brace/out b/test/indent/rust/deindent-function-closing-brace/out
new file mode 100644
index 00000000..2c58c554
--- /dev/null
+++ b/test/indent/rust/deindent-function-closing-brace/out
@@ -0,0 +1,21 @@
+fn foo() -> i32 {
+}
+
+fn foo() -> i32 {
+
+}
+
+fn foo() -> i32 {
+ bar()}
+
+fn foo() -> i32 {
+ bar()
+}
+
+fn foo() -> i32 {
+ bar()
+}
+
+ fn foo() -> i32 {
+ bar()
+ }
diff --git a/test/indent/rust/deindent-function-closing-brace/rc b/test/indent/rust/deindent-function-closing-brace/rc
new file mode 100644
index 00000000..64064c25
--- /dev/null
+++ b/test/indent/rust/deindent-function-closing-brace/rc
@@ -0,0 +1,3 @@
+source "%val{runtime}/colors/default.kak"
+source "%val{runtime}/rc/filetype/rust.kak"
+set buffer filetype rust
diff --git a/test/indent/rust/deindent-generic-closing-brace/cmd b/test/indent/rust/deindent-generic-closing-brace/cmd
new file mode 100644
index 00000000..e3036a40
--- /dev/null
+++ b/test/indent/rust/deindent-generic-closing-brace/cmd
@@ -0,0 +1 @@
+c<ret>
diff --git a/test/indent/rust/deindent-generic-closing-brace/in b/test/indent/rust/deindent-generic-closing-brace/in
new file mode 100644
index 00000000..21109831
--- /dev/null
+++ b/test/indent/rust/deindent-generic-closing-brace/in
@@ -0,0 +1,31 @@
+{%( )}
+
+{%( )
+}
+
+{%( )bar()}
+
+{%( )bar()
+}
+
+{
+ bar()%( )}
+
+ {
+ bar()%( )}
+
+{(%( ))}
+
+{(%( )
+)}
+
+{(%( )foo())}
+
+{(%( )foo()
+)}
+
+{(
+ bar()%( ))}
+
+ {(
+ bar()%( ))}
diff --git a/test/indent/rust/deindent-generic-closing-brace/out b/test/indent/rust/deindent-generic-closing-brace/out
new file mode 100644
index 00000000..c8615372
--- /dev/null
+++ b/test/indent/rust/deindent-generic-closing-brace/out
@@ -0,0 +1,43 @@
+{
+}
+
+{
+
+}
+
+{
+ bar()}
+
+{
+ bar()
+}
+
+{
+ bar()
+}
+
+ {
+ bar()
+ }
+
+{(
+)}
+
+{(
+
+)}
+
+{(
+ foo())}
+
+{(
+ foo()
+)}
+
+{(
+ bar()
+)}
+
+ {(
+ bar()
+ )}
diff --git a/test/indent/rust/deindent-generic-closing-brace/rc b/test/indent/rust/deindent-generic-closing-brace/rc
new file mode 100644
index 00000000..64064c25
--- /dev/null
+++ b/test/indent/rust/deindent-generic-closing-brace/rc
@@ -0,0 +1,3 @@
+source "%val{runtime}/colors/default.kak"
+source "%val{runtime}/rc/filetype/rust.kak"
+set buffer filetype rust
diff --git a/test/indent/rust/deindent-if-closing-brace/cmd b/test/indent/rust/deindent-if-closing-brace/cmd
new file mode 100644
index 00000000..e3036a40
--- /dev/null
+++ b/test/indent/rust/deindent-if-closing-brace/cmd
@@ -0,0 +1 @@
+c<ret>
diff --git a/test/indent/rust/deindent-if-closing-brace/in b/test/indent/rust/deindent-if-closing-brace/in
new file mode 100644
index 00000000..f26c5e62
--- /dev/null
+++ b/test/indent/rust/deindent-if-closing-brace/in
@@ -0,0 +1,15 @@
+if true {%( )}
+
+if true {%( )
+}
+
+if true {%( )bar()}
+
+if true {%( )bar()
+}
+
+if true {
+ bar()%( )}
+
+ if true {
+ bar()%( )}
diff --git a/test/indent/rust/deindent-if-closing-brace/out b/test/indent/rust/deindent-if-closing-brace/out
new file mode 100644
index 00000000..1276abbe
--- /dev/null
+++ b/test/indent/rust/deindent-if-closing-brace/out
@@ -0,0 +1,21 @@
+if true {
+}
+
+if true {
+
+}
+
+if true {
+ bar()}
+
+if true {
+ bar()
+}
+
+if true {
+ bar()
+}
+
+ if true {
+ bar()
+ }
diff --git a/test/indent/rust/deindent-if-closing-brace/rc b/test/indent/rust/deindent-if-closing-brace/rc
new file mode 100644
index 00000000..64064c25
--- /dev/null
+++ b/test/indent/rust/deindent-if-closing-brace/rc
@@ -0,0 +1,3 @@
+source "%val{runtime}/colors/default.kak"
+source "%val{runtime}/rc/filetype/rust.kak"
+set buffer filetype rust