Skip to content

Commit 4af5537

Browse files
authored
Implement rot13 cypher (#179)
* implement rot13 cypher * added tests * fix one testcase * fix g? testcase
1 parent 160a7fd commit 4af5537

File tree

2 files changed

+70
-1
lines changed

2 files changed

+70
-1
lines changed

src/vim.js

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ export function initVim(CodeMirror) {
179179
{ keys: 'gN', type: 'motion', motion: 'findAndSelectNextInclusive', motionArgs: { forward: false }},
180180
{ keys: 'gq', type: 'operator', operator: 'hardWrap' },
181181
{ keys: 'gw', type: 'operator', operator: 'hardWrap', operatorArgs: {keepCursor: true}},
182+
{ keys: 'g?', type: 'operator', operator: 'rot13'},
182183
// Operator-Motion dual commands
183184
{ keys: 'x', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorMotionArgs: { visualLine: false }},
184185
{ keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true }},
@@ -2729,7 +2730,37 @@ export function initVim(CodeMirror) {
27292730
args.registerName, 'yank',
27302731
text, args.linewise, vim.visualBlock);
27312732
return endPos;
2732-
}
2733+
},
2734+
rot13: function(cm, args, ranges, oldAnchor, newHead) {
2735+
var selections = cm.getSelections();
2736+
var swapped = [];
2737+
for (var j = 0; j < selections.length; j++) {
2738+
const replacement = selections[j]
2739+
.split('')
2740+
.map(x => {
2741+
const code = x.charCodeAt(0);
2742+
if (code >= 65 && code <= 90) { // Uppercase
2743+
return String.fromCharCode(65 + ((code - 65 + 13) % 26))
2744+
} else if (code >= 97 && code <= 122) { // Lowercase
2745+
return String.fromCharCode(97 + ((code - 97 + 13) % 26))
2746+
} else { // Not a letter
2747+
return x;
2748+
}
2749+
})
2750+
.join('')
2751+
swapped.push(replacement);
2752+
}
2753+
cm.replaceSelections(swapped);
2754+
if (args.shouldMoveCursor){
2755+
return newHead;
2756+
} else if (!cm.state.vim.visualMode && args.linewise && ranges[0].anchor.line + 1 == ranges[0].head.line) {
2757+
return motions.moveToFirstNonWhiteSpaceCharacter(cm, oldAnchor);
2758+
} else if (args.linewise){
2759+
return oldAnchor;
2760+
} else {
2761+
return cursorMin(ranges[0].anchor, ranges[0].head);
2762+
}
2763+
},
27332764
};
27342765

27352766
/** @arg {string} name @arg {import("./types").OperatorFn} fn */

test/vim_test.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,6 +1386,44 @@ testVim('gu_and_gU', function(cm, vim, helpers) {
13861386
helpers.doKeys('g', 'U', '2', 'U');
13871387
eq(cm.getValue(), 'ABC EFG\nXYZ');
13881388
}, { value: 'wa wb xx wc wd' });
1389+
testVim('g?', function(cm, vim, helpers) {
1390+
var curStart = makeCursor(0, 7);
1391+
var value = cm.getValue();
1392+
cm.setCursor(curStart);
1393+
helpers.doKeys('2', 'g', '?', 'w');
1394+
eq(cm.getValue(), 'wa wb xk jp wd');
1395+
eqCursorPos(curStart, cm.getCursor());
1396+
helpers.doKeys('2', 'g', '?', 'w');
1397+
eq(cm.getValue(), value);
1398+
1399+
helpers.doKeys('2', 'g', '?', 'B');
1400+
eq(cm.getValue(), 'wa jo kx wc wd');
1401+
eqCursorPos(makeCursor(0, 3), cm.getCursor());
1402+
1403+
cm.setCursor(makeCursor(0, 4));
1404+
helpers.doKeys('g', '?', 'i', 'w');
1405+
eq(cm.getValue(), 'wa wb kx wc wd');
1406+
eqCursorPos(makeCursor(0, 3), cm.getCursor());
1407+
1408+
var register = helpers.getRegisterController().getRegister();
1409+
eq('', register.toString());
1410+
is(!register.linewise);
1411+
1412+
cm.setCursor(curStart);
1413+
cm.setValue('abc efg();\nxyz');
1414+
helpers.doKeys('g', '?', 'g', '?');
1415+
eq(cm.getValue(), 'nop rst();\nxyz');
1416+
helpers.doKeys('g', '?', '?');
1417+
eq(cm.getValue(), 'abc efg();\nxyz');
1418+
eqCursorPos(makeCursor(0, 0), cm.getCursor());
1419+
helpers.doKeys('g', '?', '2', '?');
1420+
eq(cm.getValue(), 'nop rst();\nklm');
1421+
1422+
cm.setCursor(curStart);
1423+
cm.setValue('hello\nworld');
1424+
helpers.doKeys('l','<C-v>','l','j','g','?');
1425+
eq(cm.getValue(), 'hrylo\nwbeld');
1426+
}, { value: 'wa wb xx wc wd' });
13891427
testVim('visual_block_~', function(cm, vim, helpers) {
13901428
cm.setCursor(1, 1);
13911429
helpers.doKeys('<C-v>', 'l', 'l', 'j', '~');

0 commit comments

Comments
 (0)