-
Notifications
You must be signed in to change notification settings - Fork 3
/
repl.clj
121 lines (106 loc) · 3.93 KB
/
repl.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
(ns repl
(:import
[ICSharpCode.Scripting CommandLineHistory]
[ICSharpCode.SharpDevelop.Gui BeginReadOnlySectionProvider]
[System.Windows.Input KeyEventArgs KeyEventHandler Key Keyboard]
[Clode.Extensions ImageElementGenerator]
[System.IO Path]
[System.Reactive.Linq Observable]
[Common.Logging])
(:require
[wpf]
[theming]
[clojure.tools.logging :as log]
[command]
[avalonedit]))
(def control (atom nil))
(defn try-eval []
(let [prompt (str (ns-name *ns*) "=> ")]
(try
(let [cmd-text (last (command/add
(avalonedit/get-entered-text @control) ))
form (read-string cmd-text)
; result (eval form)
result (eval form)
prompt (str (ns-name *ns*) "=> ")]
(prn cmd-text)
(.AppendText @control (str Environment/NewLine result Environment/NewLine prompt)))
(catch Exception e
(.AppendText @control (str Environment/NewLine e Environment/NewLine prompt))
(prn e))
(finally
(avalonedit/set-entered-readonly @control)
(avalonedit/scroll-to-end @control)))
true))
(defn history-up []
(prn "up")
(avalonedit/set-current-text! @control (command/history-up))
true)
(defn history-down []
(prn "down")
(avalonedit/set-current-text! @control (command/history-down))
true)
(defn home []
(avalonedit/set-caret-to-readonly-offset @control)
true)
(defn on-key [s e]
(let [handled (cond
(and (= (.Key e) Key/Return)
(or (Keyboard/IsKeyDown Key/LeftCtrl)
(Keyboard/IsKeyDown Key/RightCtrl))
) (try-eval)
(and (= (.Key e) Key/Up)
(or (Keyboard/IsKeyDown Key/LeftCtrl)
(Keyboard/IsKeyDown Key/RightCtrl))
) (history-up)
(and (= (.Key e) Key/Down)
(or (Keyboard/IsKeyDown Key/LeftCtrl)
(Keyboard/IsKeyDown Key/RightCtrl))
) (history-down)
(= (.Key e) Key/Home) (home)
:else false)]
(prn handled)
(.set_Handled e handled)))
; (defn on-key [s e]
; (cond
; (and (= (.Key e) Key/Return)
; (or (Keyboard/IsKeyDown Key/LeftCtrl)
; (Keyboard/IsKeyDown Key/RightCtrl))
; ) (try-eval s e)
; ; (and (= (.Key e) Key/Up)
; ; (or (Keyboard/IsKeyDown Key/LeftCtrl)
; ; (Keyboard/IsKeyDown Key/RightCtrl))
; ; ) (history-up s e)
; (= (.Key e) Key/Up) (history-up s e)
; ; (and (= (.Key e) Key/Down)
; ; (or (Keyboard/IsKeyDown Key/LeftCtrl)
; ; (Keyboard/IsKeyDown Key/RightCtrl))
; ; ) (history-down s e)
; (= (.Key e) Key/Down) (history-down s e)
; ))
(defn init [repl-elem]
(prn "repl init")
(reset! control repl-elem)
(let [readOnlySection (BeginReadOnlySectionProvider.)
prompt (str (ns-name *ns*) "=> ") ]
(.Add (.. repl-elem TextArea TextView ElementGenerators)
(ImageElementGenerator. (Path/Combine Environment/CurrentDirectory "images")))
(theming/highlight repl-elem)
(-> repl-elem
.TextArea
.ReadOnlySectionProvider
(set! readOnlySection))
(set! (. repl-elem Text) prompt)
(set! (. repl-elem WordWrap) true)
(set! (.EndOffset readOnlySection) (-> repl-elem .Document .TextLength))
; (let [key-events (Observable/FromEventPattern repl-elem "PreviewKeyDown")
; filtered (Observable/Select
; (Observable/Where
; (sys-func [bool] [x] true)))]
; )
(.add_PreviewKeyDown (-> repl-elem
.TextArea)
(gen-delegate KeyEventHandler [sender e]
(on-key sender e)))))
; (def repl (.FindName (wpf/get-app-main-window) "repl"))
(prn "repl loaded")