Skip to content

Commit cfad98f

Browse files
committed
More progress
1 parent 2f97ac7 commit cfad98f

7 files changed

Lines changed: 184 additions & 19 deletions

File tree

plugin_api/v0/api.nim

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,8 @@ when pluginWorld == "plugin":
159159
let bn = b.normalized
160160
return Selection(first: min(an.first, bn.first), last: max(an.last, bn.last))
161161

162-
converter toCursor*(c: tuple[line, column: int]): Cursor = Cursor(line: c.line.int32, column: c.column.int32)
162+
converter toCursor*(c: (int, int)): Cursor = Cursor(line: c[0].int32, column: c[1].int32)
163+
converter toCursor*(c: (int32, int32)): Cursor = Cursor(line: c[0], column: c[1])
163164
converter toSelection*(c: tuple[line, column: int]): Selection = Selection(first: c.toCursor, last: c.toCursor)
164165
converter toSelection*(c: tuple[first, last: Cursor]): Selection = Selection(first: c.first, last: c.last)
165166
proc toSelection*(c: Cursor): Selection = Selection(first: c, last: c)

plugin_api/v0/registers.nim

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,21 @@ proc isReplayingCommands*(): bool {.nodestroy.} =
1616
let res = registersIsReplayingCommandsImported()
1717
result = res.bool
1818

19+
proc registersIsRecordingCommandsImported(a0: int32; a1: int32): bool {.
20+
wasmimport("is-recording-commands", "nev:plugins/registers").}
21+
proc isRecordingCommands*(register: WitString): bool {.nodestroy.} =
22+
## todo
23+
var
24+
arg0: int32
25+
arg1: int32
26+
if register.len > 0:
27+
arg0 = cast[int32](register[0].addr)
28+
else:
29+
arg0 = 0.int32
30+
arg1 = cast[int32](register.len)
31+
let res = registersIsRecordingCommandsImported(arg0, arg1)
32+
result = res.bool
33+
1934
proc registersSetRegisterTextImported(a0: int32; a1: int32; a2: int32; a3: int32): void {.
2035
wasmimport("set-register-text", "nev:plugins/registers").}
2136
proc setRegisterText*(text: WitString; register: WitString): void {.nodestroy.} =
@@ -37,6 +52,23 @@ proc setRegisterText*(text: WitString; register: WitString): void {.nodestroy.}
3752
arg3 = cast[int32](register.len)
3853
registersSetRegisterTextImported(arg0, arg1, arg2, arg3)
3954

55+
proc registersGetRegisterTextImported(a0: int32; a1: int32; a2: int32): void {.
56+
wasmimport("get-register-text", "nev:plugins/registers").}
57+
proc getRegisterText*(register: WitString): WitString {.nodestroy.} =
58+
## todo
59+
var
60+
retArea: array[8, uint8]
61+
arg0: int32
62+
arg1: int32
63+
if register.len > 0:
64+
arg0 = cast[int32](register[0].addr)
65+
else:
66+
arg0 = 0.int32
67+
arg1 = cast[int32](register.len)
68+
registersGetRegisterTextImported(arg0, arg1, cast[int32](retArea[0].addr))
69+
result = ws(cast[ptr char](cast[ptr int32](retArea[0].addr)[]),
70+
cast[ptr int32](retArea[4].addr)[])
71+
4072
proc registersStartRecordingCommandsImported(a0: int32; a1: int32): void {.
4173
wasmimport("start-recording-commands", "nev:plugins/registers").}
4274
proc startRecordingCommands*(register: WitString): void {.nodestroy.} =
@@ -50,3 +82,17 @@ proc startRecordingCommands*(register: WitString): void {.nodestroy.} =
5082
arg0 = 0.int32
5183
arg1 = cast[int32](register.len)
5284
registersStartRecordingCommandsImported(arg0, arg1)
85+
86+
proc registersStopRecordingCommandsImported(a0: int32; a1: int32): void {.
87+
wasmimport("stop-recording-commands", "nev:plugins/registers").}
88+
proc stopRecordingCommands*(register: WitString): void {.nodestroy.} =
89+
## todo
90+
var
91+
arg0: int32
92+
arg1: int32
93+
if register.len > 0:
94+
arg0 = cast[int32](register[0].addr)
95+
else:
96+
arg0 = 0.int32
97+
arg1 = cast[int32](register.len)
98+
registersStopRecordingCommandsImported(arg0, arg1)

plugins/vim/vim.nim

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -437,10 +437,10 @@ proc copySelection(editor: TextEditor, register: string = ""): seq[Selection] =
437437
# editor.moveCursorColumn(-1)
438438
# editor.updateTargetColumn()
439439

440-
# proc vimClamp*(editor: TextEditor, cursor: Cursor): Cursor =
441-
# var lineLen = editor.lineLength(cursor.line)
442-
# if not editor.vimState.cursorIncludeEol and lineLen > 0: lineLen.dec
443-
# result = (cursor.line, min(cursor.column, lineLen))
440+
proc vimClamp*(editor: TextEditor, cursor: Cursor): Cursor =
441+
var lineLen = editor.lineLength(cursor.line)
442+
if not editor.vimState.cursorIncludeEol and lineLen > 0: lineLen.dec
443+
result = (cursor.line, min(cursor.column, lineLen))
444444

445445
# proc vimMotionLine*(editor: TextEditor, cursor: Cursor, count: int): Selection =
446446
# var lineLen = editor.lineLength(cursor.line)
@@ -1462,14 +1462,13 @@ proc modeChangedHandler(editor: TextEditor, oldModes: seq[string], newModes: seq
14621462

14631463
# infof"vim: handle mode change {oldMode} -> {newMode}"
14641464
if newMode == "vim-new.normal":
1465-
discard
1466-
# if not isReplayingCommands() and isRecordingCommands(".-temp"):
1467-
# stopRecordingCommands(".-temp")
1465+
if not isReplayingCommands() and isRecordingCommands(ws".-temp"):
1466+
stopRecordingCommands(ws".-temp")
14681467

1469-
# if editor.getRevision > editor.vimState.revisionBeforeImplicitInsertMacro:
1470-
# infof"Record implicit macro because document was modified"
1471-
# let text = getRegisterText(".-temp")
1472-
# setRegisterText(text, ".")
1468+
if editor.getRevision > editor.vimState.revisionBeforeImplicitInsertMacro:
1469+
debugf"Record implicit macro because document was modified"
1470+
let text = getRegisterText(ws".-temp")
1471+
setRegisterText(text, ws".")
14731472
else:
14741473
if oldMode == "vim-new.normal" and newMode in recordModes:
14751474
editor.startRecordingCurrentCommandInPeriodMacro()
@@ -1480,10 +1479,10 @@ proc modeChangedHandler(editor: TextEditor, oldModes: seq[string], newModes: seq
14801479
editor.vimState.cursorIncludeEol = newMode == "vim-new.insert"
14811480
editor.vimState.currentUndoCheckpoint = if newMode == "vim-new.insert": "word" else: "insert"
14821481

1483-
# case newMode
1484-
# of "vim-new.normal":
1482+
case newMode
1483+
of "vim-new.normal":
14851484
# editor.setConfig "text.inclusive-selection", false
1486-
# editor.setSelections editor.selections.mapIt(editor.vimClamp(it.last).toSelection)
1485+
editor.setSelections editor.selections.mapIt(editor.vimClamp(it.last).toSelection)
14871486
# editor.saveCurrentCommandHistory()
14881487
# editor.hideCompletions()
14891488

src/generated/plugin_api_host.nim

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,10 +496,15 @@ proc processStderr(instance: ptr InstanceData; self: var ProcessResource): ReadC
496496
proc processStdout(instance: ptr InstanceData; self: var ProcessResource): ReadChannelResource
497497
proc processStdin(instance: ptr InstanceData; self: var ProcessResource): WriteChannelResource
498498
proc registersIsReplayingCommands(instance: ptr InstanceData): bool
499+
proc registersIsRecordingCommands(instance: ptr InstanceData;
500+
register: sink string): bool
499501
proc registersSetRegisterText(instance: ptr InstanceData; text: sink string;
500502
register: sink string): void
503+
proc registersGetRegisterText(instance: ptr InstanceData; register: sink string): string
501504
proc registersStartRecordingCommands(instance: ptr InstanceData;
502505
register: sink string): void
506+
proc registersStopRecordingCommands(instance: ptr InstanceData;
507+
register: sink string): void
503508
proc defineComponent*(linker: ptr LinkerT): WasmtimeResult[void] =
504509
block:
505510
let e = block:
@@ -3167,6 +3172,35 @@ proc defineComponent*(linker: ptr LinkerT): WasmtimeResult[void] =
31673172
parameters[0].i32 = cast[int32](res)
31683173
if e.isErr:
31693174
return e
3175+
block:
3176+
let e = block:
3177+
var ty: ptr WasmFunctypeT = newFunctype(
3178+
[WasmValkind.I32, WasmValkind.I32], [WasmValkind.I32])
3179+
linker.defineFuncUnchecked("nev:plugins/registers",
3180+
"is-recording-commands", ty):
3181+
var instance = cast[ptr InstanceData](store.getData())
3182+
var mainMemory = caller.getExport("memory")
3183+
if mainMemory.isNone:
3184+
mainMemory = instance.getMemoryFor(caller)
3185+
var memory: ptr UncheckedArray[uint8] = nil
3186+
if mainMemory.get.kind == WASMTIME_EXTERN_SHAREDMEMORY:
3187+
memory = cast[ptr UncheckedArray[uint8]](data(
3188+
mainMemory.get.of_field.sharedmemory))
3189+
elif mainMemory.get.kind == WASMTIME_EXTERN_MEMORY:
3190+
memory = cast[ptr UncheckedArray[uint8]](store.data(
3191+
mainMemory.get.of_field.memory.addr))
3192+
else:
3193+
assert false
3194+
var register: string
3195+
block:
3196+
let p0 = cast[ptr UncheckedArray[char]](memory[parameters[0].i32].addr)
3197+
register = newString(parameters[1].i32)
3198+
for i0 in 0 ..< register.len:
3199+
register[i0] = p0[i0]
3200+
let res = registersIsRecordingCommands(instance, register)
3201+
parameters[0].i32 = cast[int32](res)
3202+
if e.isErr:
3203+
return e
31703204
block:
31713205
let e = block:
31723206
var ty: ptr WasmFunctypeT = newFunctype(
@@ -3202,6 +3236,46 @@ proc defineComponent*(linker: ptr LinkerT): WasmtimeResult[void] =
32023236
registersSetRegisterText(instance, text, register)
32033237
if e.isErr:
32043238
return e
3239+
block:
3240+
let e = block:
3241+
var ty: ptr WasmFunctypeT = newFunctype(
3242+
[WasmValkind.I32, WasmValkind.I32, WasmValkind.I32], [])
3243+
linker.defineFuncUnchecked("nev:plugins/registers", "get-register-text",
3244+
ty):
3245+
var instance = cast[ptr InstanceData](store.getData())
3246+
var mainMemory = caller.getExport("memory")
3247+
if mainMemory.isNone:
3248+
mainMemory = instance.getMemoryFor(caller)
3249+
var memory: ptr UncheckedArray[uint8] = nil
3250+
if mainMemory.get.kind == WASMTIME_EXTERN_SHAREDMEMORY:
3251+
memory = cast[ptr UncheckedArray[uint8]](data(
3252+
mainMemory.get.of_field.sharedmemory))
3253+
elif mainMemory.get.kind == WASMTIME_EXTERN_MEMORY:
3254+
memory = cast[ptr UncheckedArray[uint8]](store.data(
3255+
mainMemory.get.of_field.memory.addr))
3256+
else:
3257+
assert false
3258+
let stackAllocFunc = caller.getExport("mem_stack_alloc").get.of_field.func_field
3259+
var register: string
3260+
block:
3261+
let p0 = cast[ptr UncheckedArray[char]](memory[parameters[0].i32].addr)
3262+
register = newString(parameters[1].i32)
3263+
for i0 in 0 ..< register.len:
3264+
register[i0] = p0[i0]
3265+
let res = registersGetRegisterText(instance, register)
3266+
let retArea = parameters[^1].i32
3267+
if res.len > 0:
3268+
let dataPtrWasm0 = int32(?stackAlloc(stackAllocFunc, store,
3269+
(res.len * 1).int32, 4))
3270+
cast[ptr int32](memory[retArea + 0].addr)[] = cast[int32](dataPtrWasm0)
3271+
block:
3272+
for i0 in 0 ..< res.len:
3273+
memory[dataPtrWasm0 + i0] = cast[uint8](res[i0])
3274+
else:
3275+
cast[ptr int32](memory[retArea + 0].addr)[] = 0.int32
3276+
cast[ptr int32](memory[retArea + 4].addr)[] = cast[int32](res.len)
3277+
if e.isErr:
3278+
return e
32053279
block:
32063280
let e = block:
32073281
var ty: ptr WasmFunctypeT = newFunctype(
@@ -3230,3 +3304,31 @@ proc defineComponent*(linker: ptr LinkerT): WasmtimeResult[void] =
32303304
registersStartRecordingCommands(instance, register)
32313305
if e.isErr:
32323306
return e
3307+
block:
3308+
let e = block:
3309+
var ty: ptr WasmFunctypeT = newFunctype(
3310+
[WasmValkind.I32, WasmValkind.I32], [])
3311+
linker.defineFuncUnchecked("nev:plugins/registers",
3312+
"stop-recording-commands", ty):
3313+
var instance = cast[ptr InstanceData](store.getData())
3314+
var mainMemory = caller.getExport("memory")
3315+
if mainMemory.isNone:
3316+
mainMemory = instance.getMemoryFor(caller)
3317+
var memory: ptr UncheckedArray[uint8] = nil
3318+
if mainMemory.get.kind == WASMTIME_EXTERN_SHAREDMEMORY:
3319+
memory = cast[ptr UncheckedArray[uint8]](data(
3320+
mainMemory.get.of_field.sharedmemory))
3321+
elif mainMemory.get.kind == WASMTIME_EXTERN_MEMORY:
3322+
memory = cast[ptr UncheckedArray[uint8]](store.data(
3323+
mainMemory.get.of_field.memory.addr))
3324+
else:
3325+
assert false
3326+
var register: string
3327+
block:
3328+
let p0 = cast[ptr UncheckedArray[char]](memory[parameters[0].i32].addr)
3329+
register = newString(parameters[1].i32)
3330+
for i0 in 0 ..< register.len:
3331+
register[i0] = p0[i0]
3332+
registersStopRecordingCommands(instance, register)
3333+
if e.isErr:
3334+
return e

src/layout.nim

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -635,12 +635,8 @@ proc showView*(self: LayoutService, view: View, slot: string = "", focus: bool =
635635
var p = self.layout.parentLayout(child)
636636
while p != nil:
637637
if not p.isVisible(child):
638-
debugf"{p.desc}, {child.desc} not visible"
639638
let activated = self.layout.tryActivateView proc(v: View): bool =
640639
return v == child
641-
debugf"activated: {activated}"
642-
else:
643-
debugf"{p.desc}, {child.desc} visible"
644640
child = p
645641
p = self.layout.parentLayout(child)
646642

src/plugin_api/plugin_api.nim

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,16 +744,31 @@ proc registersIsReplayingCommands(instance: ptr InstanceData): bool =
744744
return false
745745
return instance.host.registers.isReplayingCommands()
746746

747+
proc registersIsRecordingCommands(instance: ptr InstanceData; register: sink string): bool =
748+
if instance.host == nil:
749+
return false
750+
return instance.host.registers.isRecordingCommands(register)
751+
747752
proc registersSetRegisterText(instance: ptr InstanceData; text: sink string; register: sink string): void =
748753
if instance.host == nil:
749754
return
750755
instance.host.registers.setRegisterText(text, register)
751756

757+
proc registersGetRegisterText(instance: ptr InstanceData; register: sink string): string =
758+
if instance.host == nil:
759+
return
760+
return instance.host.registers.getRegisterText(register)
761+
752762
proc registersStartRecordingCommands(instance: ptr InstanceData; register: sink string): void =
753763
if instance.host == nil:
754764
return
755765
instance.host.registers.startRecordingCommands(register)
756766

767+
proc registersStopRecordingCommands(instance: ptr InstanceData; register: sink string): void =
768+
if instance.host == nil:
769+
return
770+
instance.host.registers.stopRecordingCommands(register)
771+
757772
proc commandsDefineCommand(instance: ptr InstanceData, name: sink string, active: bool, docs: sink string,
758773
params: sink seq[(string, string)], returnType: sink string, context: sink string; fun: uint32; data: uint32): void =
759774
if instance.host == nil:

wit/v0/api.wit

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,15 @@ interface registers {
253253
/// todo
254254
is-replaying-commands: func() -> bool;
255255
/// todo
256+
is-recording-commands: func(register: string) -> bool;
257+
/// todo
256258
set-register-text: func(text: string, register: string);
257259
/// todo
260+
get-register-text: func(register: string) -> string;
261+
/// todo
258262
start-recording-commands: func(register: string);
263+
/// todo
264+
stop-recording-commands: func(register: string);
259265
}
260266

261267
interface text-document {

0 commit comments

Comments
 (0)