summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Matveyev <greenfork.lists@yandex.com>2021-06-06 00:59:22 +0600
committerDmitry Matveyev <greenfork.lists@yandex.com>2021-06-06 01:32:53 +0600
commit0f49e7375e1a414f2a144694c8b1f91354a0804e (patch)
tree0049b4bca9d9231529098184e946cf36e716ea9d
parentd758bbf09b949f0fef88ef3c6762cc55098cdb95 (diff)
Add auto-inserting of "end" keyword to Elixir
fixup! Add auto-inserting of "end" keyword to Elixir
-rw-r--r--rc/filetype/elixir.kak23
-rw-r--r--test/indent/elixir/do-keyword/cmd1
-rw-r--r--test/indent/elixir/do-keyword/in1
-rw-r--r--test/indent/elixir/do-keyword/out10
-rw-r--r--test/indent/elixir/do-keyword/rc3
5 files changed, 33 insertions, 5 deletions
diff --git a/rc/filetype/elixir.kak b/rc/filetype/elixir.kak
index f06ffb1c..5b215942 100644
--- a/rc/filetype/elixir.kak
+++ b/rc/filetype/elixir.kak
@@ -19,8 +19,8 @@ hook global WinSetOption filetype=elixir %{
require-module elixir
hook window ModeChange pop:insert:.* -group elixir-trim-indent elixir-trim-indent
- hook window InsertChar \n -group elixir-insert elixir-insert-on-new-line
hook window InsertChar \n -group elixir-indent elixir-indent-on-new-line
+ hook window InsertChar \n -group elixir-insert elixir-insert-on-new-line
hook -once -always window WinSetOption filetype=.* %{ remove-hooks window elixir-.+ }
}
@@ -92,12 +92,25 @@ define-command -hidden elixir-trim-indent %{
try %{ execute-keys -draft -itersel <a-x> s \h+$ <ret> d }
}
-define-command -hidden elixir-insert-on-new-line %{
- evaluate-commands -draft -itersel %{
+define-command -hidden elixir-insert-on-new-line %[
+ evaluate-commands -no-hooks -draft -itersel %[
# copy -- comments prefix and following white spaces
try %{ execute-keys -draft k <a-x> s ^\h*\K--\h* <ret> y gh j P }
- }
-}
+ # wisely add end structure
+ evaluate-commands -save-regs x %[
+ try %{ execute-keys -draft k <a-x> s ^ \h + <ret> \" x y } catch %{ reg x '' }
+ try %[
+ evaluate-commands -draft %[
+ # Check if previous line opens a block
+ execute-keys -draft k<a-x> <a-k>^<c-r>x(.+\bdo$)<ret>
+ # Check that we do not already have an end for this indent level which is first set via `elixir-indent-on-new-line` hook
+ execute-keys -draft }i J <a-x> <a-K> ^<c-r>x(end|else)[^0-9A-Za-z_!?]<ret>
+ ]
+ execute-keys -draft o<c-r>xend<esc> # insert a new line with containing end
+ ]
+ ]
+ ]
+]
define-command -hidden elixir-indent-on-new-line %{
evaluate-commands -draft -itersel %{
diff --git a/test/indent/elixir/do-keyword/cmd b/test/indent/elixir/do-keyword/cmd
new file mode 100644
index 00000000..127363ac
--- /dev/null
+++ b/test/indent/elixir/do-keyword/cmd
@@ -0,0 +1 @@
+c<ret>f()<esc>jo<ret>def f1() do<ret>1<esc>jo<ret>def f2(), do: 2<ret>
diff --git a/test/indent/elixir/do-keyword/in b/test/indent/elixir/do-keyword/in
new file mode 100644
index 00000000..5e903f7f
--- /dev/null
+++ b/test/indent/elixir/do-keyword/in
@@ -0,0 +1 @@
+test do%( )
diff --git a/test/indent/elixir/do-keyword/out b/test/indent/elixir/do-keyword/out
new file mode 100644
index 00000000..ad2373b1
--- /dev/null
+++ b/test/indent/elixir/do-keyword/out
@@ -0,0 +1,10 @@
+test do
+ f()
+end
+
+def f1() do
+ 1
+end
+
+def f2(), do: 2
+
diff --git a/test/indent/elixir/do-keyword/rc b/test/indent/elixir/do-keyword/rc
new file mode 100644
index 00000000..5cc4387c
--- /dev/null
+++ b/test/indent/elixir/do-keyword/rc
@@ -0,0 +1,3 @@
+source "%val{runtime}/colors/default.kak"
+source "%val{runtime}/rc/filetype/elixir.kak"
+set buffer filetype elixir