Skip to content

Commit dea74bf

Browse files
authored
feat: Add y0 and y$ commands to Normal mode (#1905)
1 parent de75fc5 commit dea74bf

File tree

4 files changed

+169
-16
lines changed

4 files changed

+169
-16
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
.. _#1905: https://github.com/fox0430/moe/pull/1905
2+
3+
Added
4+
.....
5+
6+
- `#1905`_ feat: Add y0 and y$ commands to Normal mode
7+

src/moepkg/editor.nim

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1381,15 +1381,15 @@ proc yankLines*(
13811381
name: string,
13821382
settings: EditorSettings) =
13831383

1384-
const IsDelete = false
1385-
bufStatus.yankLines(
1386-
registers,
1387-
commandLine,
1388-
notificationSettings,
1389-
first, last,
1390-
name,
1391-
IsDelete,
1392-
settings)
1384+
const IsDelete = false
1385+
bufStatus.yankLines(
1386+
registers,
1387+
commandLine,
1388+
notificationSettings,
1389+
first, last,
1390+
name,
1391+
IsDelete,
1392+
settings)
13931393

13941394
proc yankLines*(
13951395
bufStatus: BufferStatus,
@@ -1411,15 +1411,14 @@ proc yankLines*(
14111411
IsDelete,
14121412
settings)
14131413

1414-
# name is the register name
14151414
proc yankCharacters*(
14161415
bufStatus: BufferStatus,
14171416
registers: var Registers,
14181417
windowNode: WindowNode,
14191418
commandLine: var CommandLine,
14201419
settings: EditorSettings,
14211420
length: int,
1422-
name: string,
1421+
registerName: string,
14231422
isDelete: bool) =
14241423

14251424
var yankedBuffer: Runes
@@ -1431,8 +1430,8 @@ proc yankCharacters*(
14311430
line = windowNode.currentLine
14321431
yankedBuffer.add bufStatus.buffer[line][col]
14331432

1434-
if name.len > 0:
1435-
registers.addRegister(yankedBuffer, name, settings)
1433+
if registerName.len > 0:
1434+
registers.addRegister(yankedBuffer, registerName, settings)
14361435
else:
14371436
registers.addRegister(yankedBuffer, settings)
14381437

src/moepkg/normalmode.nim

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,47 @@ proc yankCharactersToCharacter(
668668
registerName,
669669
IsDelete)
670670

671+
proc yankCharactersFromBeginOfLine(
672+
status: var EditorStatus,
673+
registerName: string = "") =
674+
## y0 command
675+
676+
if currentMainWindowNode.currentColumn > 0:
677+
let currentColumn = currentMainWindowNode.currentColumn
678+
currentMainWindowNode.currentColumn = 0
679+
680+
const IsDelete = false
681+
currentBufStatus.yankCharacters(
682+
status.registers,
683+
currentMainWindowNode,
684+
status.commandLine,
685+
status.settings,
686+
currentColumn,
687+
registerName,
688+
IsDelete)
689+
690+
currentMainWindowNode.currentColumn = currentColumn
691+
692+
proc yankCharactersToEndOfLine(
693+
status: var EditorStatus,
694+
registerName: string = "") =
695+
## y$ command
696+
697+
if currentBufStatus.buffer[currentMainWindowNode.currentLine].len > 0:
698+
699+
const IsDelete = false
700+
let length =
701+
currentBufStatus.buffer[currentMainWindowNode.currentLine].len -
702+
currentMainWindowNode.currentColumn
703+
currentBufStatus.yankCharacters(
704+
status.registers,
705+
currentMainWindowNode,
706+
status.commandLine,
707+
status.settings,
708+
length,
709+
registerName,
710+
IsDelete)
711+
671712
proc deleteCharacters(status: var EditorStatus, registerName: string) =
672713
if currentBufStatus.isReadonly:
673714
status.commandLine.writeReadonlyModeWarning
@@ -1167,6 +1208,10 @@ proc addRegister(status: var EditorStatus, command, registerName: string) =
11671208
status.yankToPreviousBlankLine(registerName)
11681209
elif command == "y}":
11691210
status.yankToNextBlankLine(registerName)
1211+
elif command == "y0":
1212+
status.yankCharactersFromBeginOfLine(registerName)
1213+
elif command == "y$":
1214+
status.yankCharactersToEndOfLine
11701215
elif command == "dd":
11711216
status.deleteLines(registerName)
11721217
elif command == "dw":
@@ -1245,6 +1290,8 @@ proc registerCommand(status: var EditorStatus, command: Runes) =
12451290
cmd == "yl" or
12461291
cmd == "y{" or
12471292
cmd == "y}" or
1293+
cmd == "y0" or
1294+
cmd == "y$" or
12481295
cmd == "dd" or
12491296
cmd == "dw" or
12501297
cmd == "d$" or (cmd.len == 1 and isEndKey(command[0])) or
@@ -1508,6 +1555,10 @@ proc normalCommand(status: var EditorStatus, commands: Runes): Option[Rune] =
15081555
status.yankToNextBlankLine
15091556
elif secondKey == ord('l'):
15101557
status.yankCharacters
1558+
elif secondKey == ord('0'):
1559+
status.yankCharactersFromBeginOfLine
1560+
elif secondKey == ord('$'):
1561+
status.yankCharactersToEndOfLine
15111562
elif secondKey == ord('t'):
15121563
let thirdKey = commands[2]
15131564
status.yankCharactersToCharacter(thirdKey)
@@ -1795,8 +1846,10 @@ proc isNormalModeCommand*(
17951846
command[1] == ord('w') or
17961847
command[1] == ord('{') or
17971848
command[1] == ord('}') or
1798-
command[1] == ord('l'):
1799-
result = InputState.Valid
1849+
command[1] == ord('l') or
1850+
command[1] == ord('0') or
1851+
command[1] == ord('$'):
1852+
result = InputState.Valid
18001853
elif command == "yt".ru:
18011854
result = InputState.Continue
18021855
elif command.len == 3:
@@ -1890,6 +1943,8 @@ proc isNormalModeCommand*(
18901943
cmd == "yl" or
18911944
cmd == "y{" or
18921945
cmd == "y}" or
1946+
cmd == "y0" or
1947+
cmd == "y$" or
18931948
cmd == "dd" or
18941949
cmd == "dw" or
18951950
cmd == "d$" or (cmd.len == 1 and isEndKey(cmd[0].toRune)) or

tests/tnormalmode.nim

Lines changed: 93 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1285,7 +1285,7 @@ suite "Normal mode: delete from the beginning of the line to current column":
12851285

12861286
check status.registers.noNameRegisters.buffer[0] == ru"abcde"
12871287

1288-
suite "Normal mode: Yank string":
1288+
suite "Normal mode: Yank characters":
12891289
test "yank character (yl command)":
12901290
var status = initEditorStatus()
12911291
discard status.addNewBufferInCurrentWin.get
@@ -1327,6 +1327,98 @@ suite "Normal mode: Yank string":
13271327

13281328
check status.registers.noNameRegisters.buffer[0] == ru"abcde"
13291329

1330+
suite "Normal mode: yank characters from the begin of the line":
1331+
test "y0 command":
1332+
var status = initEditorStatus()
1333+
discard status.addNewBufferInCurrentWin.get
1334+
currentBufStatus.buffer = initGapBuffer(@[ru"abcde"])
1335+
currentMainWindowNode.currentColumn = 2
1336+
1337+
const Command = ru"y0"
1338+
check isNormalModeCommand(Command, none(Rune)) == InputState.Valid
1339+
check status.normalCommand(Command).isNone
1340+
1341+
check status.registers.noNameRegisters.buffer[0] == ru"ab"
1342+
1343+
test "Basic 1":
1344+
var status = initEditorStatus()
1345+
discard status.addNewBufferInCurrentWin.get
1346+
currentBufStatus.buffer = initGapBuffer(@[ru"abcde"])
1347+
currentMainWindowNode.currentColumn = 1
1348+
1349+
status.yankCharactersFromBeginOfLine
1350+
1351+
check status.registers.noNameRegisters.buffer[0] == ru"a"
1352+
1353+
test "Basic 2":
1354+
var status = initEditorStatus()
1355+
discard status.addNewBufferInCurrentWin.get
1356+
currentBufStatus.buffer = initGapBuffer(@[ru"abcde"])
1357+
currentMainWindowNode.currentColumn = 4
1358+
1359+
status.yankCharactersFromBeginOfLine
1360+
1361+
check status.registers.noNameRegisters.buffer[0] == ru"abcd"
1362+
1363+
test "currentColumn == 0":
1364+
var status = initEditorStatus()
1365+
discard status.addNewBufferInCurrentWin.get
1366+
currentBufStatus.buffer = initGapBuffer(@[ru"abcde"])
1367+
1368+
status.yankCharactersFromBeginOfLine
1369+
1370+
check status.registers.noNameRegisters.buffer.len == 0
1371+
1372+
test "Empty line":
1373+
var status = initEditorStatus()
1374+
discard status.addNewBufferInCurrentWin.get
1375+
currentBufStatus.buffer = initGapBuffer(@[ru""])
1376+
1377+
status.yankCharactersFromBeginOfLine
1378+
1379+
check status.registers.noNameRegisters.buffer.len == 0
1380+
1381+
suite "Normal mode: yank characters to the end of the line":
1382+
test "y$ command":
1383+
var status = initEditorStatus()
1384+
discard status.addNewBufferInCurrentWin.get
1385+
currentBufStatus.buffer = initGapBuffer(@[ru"abcde"])
1386+
currentMainWindowNode.currentColumn = 2
1387+
1388+
const Command = ru"y$"
1389+
check isNormalModeCommand(Command, none(Rune)) == InputState.Valid
1390+
check status.normalCommand(Command).isNone
1391+
1392+
check status.registers.noNameRegisters.buffer[0] == ru"cde"
1393+
1394+
test "Basic 1":
1395+
var status = initEditorStatus()
1396+
discard status.addNewBufferInCurrentWin.get
1397+
currentBufStatus.buffer = initGapBuffer(@[ru"abcde"])
1398+
1399+
status.yankCharactersToEndOfLine
1400+
1401+
check status.registers.noNameRegisters.buffer[0] == ru"abcde"
1402+
1403+
test "Basic 2":
1404+
var status = initEditorStatus()
1405+
discard status.addNewBufferInCurrentWin.get
1406+
currentBufStatus.buffer = initGapBuffer(@[ru"abcde"])
1407+
currentMainWindowNode.currentColumn = 4
1408+
1409+
status.yankCharactersToEndOfLine
1410+
1411+
check status.registers.noNameRegisters.buffer[0] == ru"e"
1412+
1413+
test "Empty line":
1414+
var status = initEditorStatus()
1415+
discard status.addNewBufferInCurrentWin.get
1416+
currentBufStatus.buffer = initGapBuffer(@[ru""])
1417+
1418+
status.yankCharactersToEndOfLine
1419+
1420+
check status.registers.noNameRegisters.buffer.len == 0
1421+
13301422
suite "Normal mode: Cut character before cursor":
13311423
test "Cut character before cursor (X command)":
13321424
var status = initEditorStatus()

0 commit comments

Comments
 (0)