-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathedit.tcl
364 lines (257 loc) · 9.46 KB
/
edit.tcl
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
###########################################################
# Name: edit.tcl
# Author: Daniele Bonini ([email protected])
# Date: 27/11/2023
# Desc: Edit Menu namespace of RadXIDE.
#
# Edit Menu namespace scaffolding and most of the code
# here presented and distributed contains excerpts
# from [alited](https://github.com/aplsimple/alited
# by Alex Plotnikov and contributors to the project.
# The original code of these excerpts could be
# borrowed from other sources which the author
# and the contributors to this RadXIDE have no
# knowledge about.
#
# License: MIT. Copyrights 5 Mode (Last implementation and adaptations.)
# Copyright (c) 2021-2023 Alex Plotnikov https://aplsimple.github.io (original scaffolding and excerpts.)
#
###########################################################
namespace eval edit {
# ________________________ find _________________________ #
proc find {} {
# Open the Find window to start a text search
namespace upvar ::radxide dan dan project project
set t $dan(TEXT)
set args {}
if {$project(CUR_FILE_PATH) ne {}} {
#tk_textCopy $t
#catch {clipboard get} clipcontent
#set sel $clipcontent
set sel [::radxide::win::InitFindInText 0 $t]
#tk_messageBox -title $dan(TITLE) -icon info -message $sel
set args "-buttons {butSearch SEARCH ::radxide::win::findTextOK butCANCEL CANCEL ::radxide::win::findTextCancel}"
catch {lassign [::radxide::win::input "Find" {} "Find text" [list \
ent "{} {} {-w 64}" "{$sel}"] \
-head "Search for:" {*}$args] res}
}
}
# ________________________ GotoLine _________________________ #
proc GotoLine {} {
# Open the Go To Line window
namespace upvar ::radxide dan dan project project
set t $dan(TEXT)
set args {}
set ln 1
if {$project(CUR_FILE_PATH) ne {}} {
#tk_messageBox -title $dan(TITLE) -icon info -message "Go To Line"
set args "-buttons {butGo GO ::radxide::win::GotoLineOK butCANCEL CANCEL ::radxide::win::GotoLineCancel}"
catch {lassign [::radxide::win::input "GotoLine" {} "Go to Line" [list \
ent "{} {} {-w 28}" "{$ln}"] \
-head "Go to line:" {*}$args] res}
}
}
# ________________________ Indent _________________________ #
proc Indent {{from "event"}} {
# Indent selected lines of text.
namespace upvar ::radxide dan dan
set indent $dan(TAB_IN_SPACE)
set len [string length $dan(TAB_IN_SPACE)]
set sels [SelectedLines]
set wtxt [lindex $sels 0]
#::apave::undoIn $wtxt
foreach {l1 l2} [lrange $sels 1 end] {
for {set l $l1} {$l<=$l2} {incr l} {
set line [$wtxt get $l.0 $l.end]
if {[string trim $line] eq {}} {
$wtxt replace $l.0 $l.end {}
} else {
set leadsp [leadingSpaces $line]
set sp [expr {$leadsp % $len}]
# align by the indent edge
if {$sp==0} {
set ind $indent
} else {
set ind [string repeat " " [expr {$len - $sp}]]
}
$wtxt insert $l.0 $ind
}
}
}
#::apave::undoOut $wtxt
#alited::main::HighlightLine
focus $dan(TEXT)
if {$from eq "event"} {
return -code break
}
}
# ________________________ leadingSpaces _________________________ #
proc leadingSpaces {line} {
# Returns a number of leading spaces of a line
# line - the line
return [expr {[string length $line]-[string length [string trimleft $line]]}]
}
# ________________________ makeCopy _________________________ #
proc makeCopy {{from "event"}} {
# Copy from the editor to the clipboard
#clipboard clear
#clipboard append $txt
namespace upvar ::radxide dan dan
set t $dan(TEXT)
tk_textCopy $t
if {$from eq "event"} {
return -code break
}
}
#_________________________ makeCut ________________________ #
proc makeCut {{from "event"}} {
# Cut from the editor to the clipboard
#set canvas %W
#eval [clipboard get -type TkCanvasItem]
namespace upvar ::radxide dan dan
set t $dan(TEXT)
tk_textCut $t
after 1000 "::radxide::win::fillGutter .danwin.fra.pan.fra2.text .danwin.fra.pan.fra2.gutText 5 1 #FFFFFF #222223"
#$dan(TEXT) yview [$dan(TEXT) index insert]
#$dan(GUTTEXT) yview moveto [lindex [$dan(TEXT) yview] 1]
if {$from eq "event"} {
return -code break
}
}
# ________________________ makeNewLine _________________________ #
proc makeNewLine {} {
namespace upvar ::radxide dan dan
set wt $dan(TEXT)
# getting previous line
set idx1 [$wt index {insert linestart}]
set idx2 [$wt index {insert lineend}]
set line [$wt get $idx1 $idx2]
# erasing tabs, replacing them with spaces..
set line [string map {\t $dan(TAB_IN_SPACE)} $line]
# calculating identation..
set orilength [string length $line]
set newlength [string length [string trimleft $line]]
set nspacesofindent [expr $orilength - $newlength]
# inserintg correct identation..
$wt insert [$wt index {insert}] \n[string repeat " " $nspacesofindent]
set idx3 [$wt index insert]
set idx4 [$wt index "$idx3 +1 line"]
::tk::TextSetCursor $wt $idx3
::radxide::win::fillGutter .danwin.fra.pan.fra2.text .danwin.fra.pan.fra2.gutText 5 1 "#FFFFFF" "#222223"
#$dan(TEXT) yview [$dan(TEXT) index insert]
#$dan(GUTTEXT) yview moveto [lindex [$dan(TEXT) yview] 1]
return -code break
}
#_________________________ makePaste ________________________ #
proc makePaste {{from "event"}} {
# Paste from the clipboard to the editor
#set canvas %W
#eval [clipboard get -type TkCanvasItem]
namespace upvar ::radxide dan dan
set t $dan(TEXT)
tk_textPaste $t
after 1000 "::radxide::win::fillGutter .danwin.fra.pan.fra2.text .danwin.fra.pan.fra2.gutText 5 1 #FFFFFF #222223"
#$dan(TEXT) yview [$dan(TEXT) index insert]
#$dan(GUTTEXT) yview moveto [lindex [$dan(TEXT) yview] 1]
if {$from eq "event"} {
return -code break
}
}
#_________________________ makeRedo ________________________ #
proc makeRedo {{from "event"}} {
# Paste from the clipboard to the editor
#set canvas %W
#eval [clipboard get -type TkCanvasItem]
namespace upvar ::radxide dan dan
set t $dan(TEXT)
catch {$t edit redo}
after idle "::radxide::win::fillGutter .danwin.fra.pan.fra2.text .danwin.fra.pan.fra2.gutText 5 1 #FFFFFF #222223"
#$dan(TEXT) yview [$dan(TEXT) index insert]
#$dan(GUTTEXT) yview moveto [lindex [$dan(TEXT) yview] 1]
if {$from eq "event"} {
return -code break
}
}
#_________________________ makeUndo ________________________ #
proc makeUndo {{from "event"}} {
# Paste from the clipboard to the editor
#set canvas %W
#eval [clipboard get -type TkCanvasItem]
namespace upvar ::radxide dan dan
set t $dan(TEXT)
catch {$t edit undo}
after idle "::radxide::win::fillGutter .danwin.fra.pan.fra2.text .danwin.fra.pan.fra2.gutText 5 1 #FFFFFF #222223"
#$dan(TEXT) yview [$dan(TEXT) index insert]
#$dan(GUTTEXT) yview moveto [lindex [$dan(TEXT) yview] 1]
if {$from eq "event"} {
return -code break
}
}
# ________________________ SelectedLines _________________________ #
proc SelectedLines {{wtxt ""} {strict no}} {
# Gets a range of lines of text that are selected at least partly.
# wtxt - text's path
# strict - if yes, only a real selection is counted
# Returns a list of the text widget's path and ranges of selected lines.
namespace upvar ::radxide dan dan
if {$wtxt eq {}} {set wtxt $dan(TEXT)}
set res [list $wtxt]
if {[catch {$wtxt tag ranges sel} sels] || ![llength $sels]} {
if {$strict} {
set sels [list]
} else {
set pos1 [set pos2 [$wtxt index insert]]
set sels [list $pos1 $pos2]
}
}
foreach {pos1 pos2} $sels {
if {$pos1 ne {}} {
set pos21 [$wtxt index "$pos2 linestart"]
if {[$wtxt get $pos21 $pos2] eq {}} {
set pos2 [$wtxt index "$pos2 - 1 line"]
}
}
set l1 [expr {int($pos1)}]
set l2 [expr {max($l1,int($pos2))}]
lappend res $l1 $l2
}
return $res
}
#_________________________ setup ________________________ #
proc setup {} {
# Open the Options window
namespace upvar ::radxide dan dan
tk_messageBox -title $dan(TITLE) -icon info -message "Please check 'radxide.tcl' to customize any variable."
}
# ________________________ UnIndent _________________________ #
proc UnIndent {{from "event"}} {
# Unindent selected lines of text.
namespace upvar ::radxide dan dan
set len [string length $dan(TAB_IN_SPACE)]
set spaces [list { } \t]
set sels [SelectedLines]
set wtxt [lindex $sels 0]
#::apave::undoIn $wtxt
foreach {l1 l2} [lrange $sels 1 end] {
for {set l $l1} {$l<=$l2} {incr l} {
set line [$wtxt get $l.0 $l.end]
if {[string trim $line] eq {}} {
$wtxt replace $l.0 $l.end {}
} elseif {[string index $line 0] in $spaces} {
set leadsp [leadingSpaces $line]
# align by the indent edge
set sp [expr {$leadsp % $len}]
if {$sp==0} {set sp $len}
$wtxt delete $l.0 "$l.0 + ${sp}c"
}
}
}
#::apave::undoOut $wtxt
focus $dan(TEXT)
if {$from eq "event"} {
return -code break
}
}
#_______________________
}
# _________________________________ EOF _________________________________ #