Skip to content

Commit 54e1957

Browse files
committed
Implement strpart()
1 parent df3f7d5 commit 54e1957

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

src/vimscript/expression/evaluate.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1241,7 +1241,13 @@ export class EvaluationContext {
12411241
const [s] = getArgs(1);
12421242
return int(toString(s!).length);
12431243
}
1244-
// TODO: strpart()
1244+
case 'strpart': {
1245+
const [_src, _start, _len, chars] = getArgs(2, 4);
1246+
const src = toString(_src!);
1247+
const start = toInt(_start!);
1248+
const len = _len ? toInt(_len) : src.length - start;
1249+
return str(src.substring(start, start + len));
1250+
}
12451251
// TODO: submatch()
12461252
// TODO: substitute()
12471253
case 'tan': {

test/vimscript/expression.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,13 @@ suite('Vimscript expressions', () => {
764764
exprTest('strlen([1,2,3])', { error: ErrorCode.UsingListAsAString });
765765
});
766766

767+
suite('strpart', () => {
768+
exprTest('strpart("abcdefg", 3, 2)', { value: str('de') });
769+
exprTest('strpart("abcdefg", -2, 4)', { value: str('ab') });
770+
exprTest('strpart("abcdefg", 5, 4)', { value: str('fg') });
771+
exprTest('strpart("abcdefg", 3)', { value: str('defg') });
772+
});
773+
767774
suite('split', () => {
768775
exprTest('split(" a\t\tb c ")', { value: list([str('a'), str('b'), str('c')]) });
769776
exprTest('split(" a\t\tb c ", "", 1)', {

0 commit comments

Comments
 (0)