From 5ce26e59ddd0a633225a18558057a50172a94a80 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 12 Dec 2023 15:56:20 +0100 Subject: [PATCH 1/5] Fix eval for uneval --- public/squint/js/demo.mjs | 1 + .../nextjournal/clojure_mode/extensions/eval_region.cljc | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/public/squint/js/demo.mjs b/public/squint/js/demo.mjs index 85cd2ee..c6c0c4b 100644 --- a/public/squint/js/demo.mjs +++ b/public/squint/js/demo.mjs @@ -129,6 +129,7 @@ let editorElt = document.querySelector('#editor'); let editor = new EditorView({state: state, parent: editorElt, extensions: extensions }) +globalThis.editor = editor; let keys = {"ArrowUp": "↑", "ArrowDown": "↓", diff --git a/src-shared/nextjournal/clojure_mode/extensions/eval_region.cljc b/src-shared/nextjournal/clojure_mode/extensions/eval_region.cljc index a9602e4..b1cc613 100644 --- a/src-shared/nextjournal/clojure_mode/extensions/eval_region.cljc +++ b/src-shared/nextjournal/clojure_mode/extensions/eval_region.cljc @@ -32,11 +32,12 @@ (<= (n/start %) from) (<= (n/end %) from)) (cond-> % - (or (n/top? %) - (and (not (n/terminal-type? (n/type %))) - (< (n/start %) from (n/end %)))) + (or + (n/top? %) + (and (not (n/terminal-type? (n/type %))) + (< (n/start %) from (n/end %)))) (-> (n/children from -1) first)))) - (uppermost-edge-here from) + #_(uppermost-edge-here from) (n/balanced-range state)))) (defn top-level-node [state] From 5a7a6f92eb63199c0d3d16fa0edb5b90a514e8b5 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 12 Dec 2023 17:10:25 +0100 Subject: [PATCH 2/5] Fix issue --- public/squint/js/demo.mjs | 2 ++ .../clojure_mode/extensions/eval_region.cljc | 17 ++++++++++------- test/nextjournal/clojure_mode_tests.cljc | 4 +++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/public/squint/js/demo.mjs b/public/squint/js/demo.mjs index c6c0c4b..d02a242 100644 --- a/public/squint/js/demo.mjs +++ b/public/squint/js/demo.mjs @@ -120,6 +120,8 @@ let doc = `(comment (+ 1 2 3)) ` ; +// doc = `(do #_#_1 (+ 1 2 3) )` + evalCode(doc); let state = EditorState.create( {doc: doc, diff --git a/src-shared/nextjournal/clojure_mode/extensions/eval_region.cljc b/src-shared/nextjournal/clojure_mode/extensions/eval_region.cljc index b1cc613..62bdf7c 100644 --- a/src-shared/nextjournal/clojure_mode/extensions/eval_region.cljc +++ b/src-shared/nextjournal/clojure_mode/extensions/eval_region.cljc @@ -12,12 +12,15 @@ (defn uppermost-edge-here "Returns node or its highest ancestor that starts or ends at the cursor position." [pos node] - (or (->> (iterate n/up node) - (take-while (every-pred (complement n/top?) - #(or (= pos (n/end %) (n/end node)) - (= pos (n/start %) (n/start node))))) - (last)) - node)) + (let [node (or (->> (iterate n/up node) + (take-while (every-pred (complement n/top?) + #(or (= pos (n/end %) (n/end node)) + (= pos (n/start %) (n/start node))))) + (last)) + node)] + (if (= "Discard" (n/name node)) + (last (n/children node)) + node))) (defn main-selection [state] (-> @@ -37,7 +40,7 @@ (and (not (n/terminal-type? (n/type %))) (< (n/start %) from (n/end %)))) (-> (n/children from -1) first)))) - #_(uppermost-edge-here from) + (uppermost-edge-here from) (n/balanced-range state)))) (defn top-level-node [state] diff --git a/test/nextjournal/clojure_mode_tests.cljc b/test/nextjournal/clojure_mode_tests.cljc index 2d967f5..7c68710 100644 --- a/test/nextjournal/clojure_mode_tests.cljc +++ b/test/nextjournal/clojure_mode_tests.cljc @@ -331,7 +331,9 @@ (= (f (test-utils/make-state extensions input)) expected) "(+ |1 2 3)" eval-region/cursor-node-string "1" "(+ |(+ 1 2) 2 3)" eval-region/cursor-node-string "(+ 1 2)" - "(+ (+ 1 2)| 2 3)" eval-region/cursor-node-string "(+ 1 2)") + "(+ (+ 1 2)| 2 3)" eval-region/cursor-node-string "(+ 1 2)" + "(+ #_(+ 1 2)| 2 3)" eval-region/cursor-node-string "(+ 1 2)" + "(+ #_#_1 (+ 1 2)| 2 3)" eval-region/cursor-node-string "(+ 1 2)") (let [state (test-utils/make-state extensions ";; dude\n|{:a 1}")] (is (= "{:a 1}" (->> (eval-region/top-level-node state) (util/range-str state))))))) From b243c77df061346facdf5e3472c810bd271630a9 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 12 Dec 2023 17:11:49 +0100 Subject: [PATCH 3/5] Add changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..4971e7e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## Unreleased + +- Fix [#45](https://github.com/nextjournal/clojure-mode/issues/45): cursor after Discard node should evaluate child From 8d39fcaf64e94e6388d6e24ce51f0bf7bd846024 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 12 Dec 2023 17:17:38 +0100 Subject: [PATCH 4/5] Add history --- public/squint/js/demo.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/squint/js/demo.mjs b/public/squint/js/demo.mjs index d02a242..b5da6a7 100644 --- a/public/squint/js/demo.mjs +++ b/public/squint/js/demo.mjs @@ -2,6 +2,7 @@ import { default_extensions, complete_keymap } from '@nextjournal/clojure-mode'; import { extension as eval_ext, cursor_node_string, top_level_string } from '@nextjournal/clojure-mode/extensions/eval-region'; import { EditorView, drawSelection, keymap } from '@codemirror/view'; import { EditorState } from '@codemirror/state'; +import { history, historyKeymap } from '@codemirror/commands'; import { syntaxHighlighting, defaultHighlightStyle, foldGutter } from '@codemirror/language'; import { compileStringEx } from 'squint-cljs'; @@ -89,10 +90,11 @@ let squintExtension = ( opts ) => { }])} -let extensions = [ theme, foldGutter(), +let extensions = [ history(), theme, foldGutter(), syntaxHighlighting(defaultHighlightStyle), drawSelection(), keymap.of(complete_keymap), + keymap.of(historyKeymap), ...default_extensions, eval_ext({modifier: "Meta"}), squintExtension({modifier: "Meta"}) From 428212c5d533994e7ce1009d54ec652ba935b436 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Tue, 12 Dec 2023 17:19:15 +0100 Subject: [PATCH 5/5] Add history --- squint-demo/index.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/squint-demo/index.mjs b/squint-demo/index.mjs index 1fa5ca6..1a5adad 100644 --- a/squint-demo/index.mjs +++ b/squint-demo/index.mjs @@ -4,6 +4,7 @@ import { EditorView, drawSelection, keymap } from '@codemirror/view'; import { EditorState } from '@codemirror/state'; import { syntaxHighlighting, defaultHighlightStyle, foldGutter } from '@codemirror/language'; import { javascript } from '@codemirror/lang-javascript'; +import { history, historyKeymap } from '@codemirror/commands'; let theme = EditorView.theme({ ".cm-content": {whitespace: "pre-wrap", @@ -25,12 +26,13 @@ let theme = EditorView.theme({ "&.cm-focused .cm-cursor": {visibility: "visible"} }); -let extensions = [ +let extensions = [ history(), theme, foldGutter(), syntaxHighlighting(defaultHighlightStyle), drawSelection(), keymap.of(complete_keymap), + keymap.of(historyKeymap), ...default_extensions ];