├── README.md ├── autoload └── lyv.vim ├── lua └── init.lua └── resources └── vim_builtins.json /README.md: -------------------------------------------------------------------------------- 1 | # LearnYourVim 2 | 3 | To vim is to LYV. 4 | 5 | Learn Your Vim helps you make an Anki deck from: 6 | 7 | - Your personal mappings 8 | - Mappings you want to remember 9 | - Built-in Shortcuts 10 | 11 | 12 | ## Personal Mappings 13 | 14 | ```vim 15 | " For vim code, simply prepend a mapping line w/ " ANKI: 16 | 17 | " ANKI: Open fuzzy finder window for project files 18 | nnoremap FzfPreviewProjectFiles 19 | ``` 20 | 21 | After running ``, you'll have an Anki card that looks like: 22 | 23 | ``` 24 | Open fuzzy finder window for project files; ; 25 | ``` 26 | 27 | 28 | ## TODO: 29 | 30 | - Add tags support 31 | - Options to: 32 | - Show code 33 | - Show mode 34 | -------------------------------------------------------------------------------- /autoload/lyv.vim: -------------------------------------------------------------------------------- 1 | 2 | let g:lyv_fileoutput = get(g:, "lyv_fileoutput", expand("$XDG_CONFIG_HOME/anki_decks/nvim_shortcuts.anki_deck")) 3 | 4 | let s:anki_note_tag = "ANKI:" 5 | let s:anki_divider = "," 6 | 7 | function! lyv#test() abort 8 | let keymap = nvim_get_keymap('n') 9 | 10 | let anki_lines = [] 11 | for mapping_dict in keymap 12 | let script_file = scriptease#scriptname(mapping_dict.sid) 13 | let line_number = mapping_dict.lnum 14 | 15 | let result = systemlist(printf("sed '%sq;d' %s", line_number - 1, script_file)) 16 | 17 | if len(result) == 0 18 | continue 19 | endif 20 | 21 | let value = result[0] 22 | 23 | if match(value, s:anki_note_tag) >= 0 24 | " echo "=============" 25 | " echo value 26 | " echo mapping_dict 27 | 28 | call add(anki_lines, {"anki_note": value, "keymap": mapping_dict}) 29 | endif 30 | endfor 31 | 32 | return anki_lines 33 | endfunction 34 | 35 | function! lyv#export(anki_commands) abort 36 | let command_values = [] 37 | for command_object in a:anki_commands 38 | let formatted_lhs = command_object.keymap.lhs 39 | let formatted_lhs = substitute(formatted_lhs, " ", '\<space\>', "g") 40 | let formatted_lhs = substitute(formatted_lhs, g:mapleader, '\<leade\>', "g") 41 | 42 | call add( 43 | \ command_values, 44 | \ trim( 45 | \ printf('"%s"%s"%s"%s%s', 46 | \ trim(substitute(command_object.anki_note, '" ' . s:anki_note_tag, "", "")), 47 | \ s:anki_divider, 48 | \ formatted_lhs, 49 | \ s:anki_divider, 50 | \ s:anki_divider, 51 | \ ) 52 | \ )) 53 | endfor 54 | 55 | " Add in built-in files 56 | call extend(command_values, lyv#read_builtin_vim_commands()) 57 | 58 | call writefile(command_values, g:lyv_fileoutput, "") 59 | 60 | return command_values 61 | endfunction 62 | 63 | function! s:change_quote_to_double_quote(input_string) abort 64 | return substitute(a:input_string, '"', '""', "g") 65 | endfunction 66 | 67 | function! s:convert_json_to_anki(card) abort 68 | return printf( 69 | \ '"%s"%s"%s"%s"%s"%s', 70 | \ s:change_quote_to_double_quote(a:card.question), 71 | \ s:anki_divider, 72 | \ s:change_quote_to_double_quote(a:card.answer), 73 | \ s:anki_divider, 74 | \ join(a:card.tags, ","), 75 | \ s:anki_divider 76 | \ ) 77 | endfunction 78 | 79 | 80 | function! lyv#read_builtin_vim_commands() abort 81 | let vim_builtin_json_file = fnamemodify(expand(""), ":p:h") . "/resources/vim_builtins.json" 82 | let vim_builtin_cards = json_decode(readfile(vim_builtin_json_file)) 83 | 84 | let anki_cards = [] 85 | for json_card in vim_builtin_cards 86 | call add(anki_cards, s:convert_json_to_anki(json_card)) 87 | endfor 88 | 89 | return anki_cards 90 | endfunction 91 | 92 | " Time echo lyv#test() 93 | 94 | " { 95 | " 'lnum': 62, 96 | " 'expr': 0, 97 | " 'noremap': 0, 98 | " 'lhs': '', 99 | " 'mode': 'n', 100 | " 'nowait': 0, 101 | " 'silent': 0, 102 | " 'sid': 202, 103 | " 'rhs': 'SpeedDatingUp', 104 | " 'buffer': 0 105 | " } 106 | -------------------------------------------------------------------------------- /lua/init.lua: -------------------------------------------------------------------------------- 1 | local vim = vim 2 | local api = vim.api 3 | 4 | function os.capture(cmd, raw) 5 | local f = assert(io.popen(cmd, 'r')) 6 | local s = assert(f:read('*a')) 7 | f:close() 8 | if raw then return s end 9 | s = string.gsub(s, '^%s+', '') 10 | s = string.gsub(s, '%s+$', '') 11 | s = string.gsub(s, '[\n\r]+', ' ') 12 | return s 13 | end 14 | 15 | local lyv = {} 16 | 17 | 18 | function lyv.test() 19 | local keymap = api.nvim_get_keymap('n') 20 | 21 | local lookedup_sids = {} 22 | 23 | local anki_lines = {} 24 | for _, mapping_dict in ipairs(keymap) do 25 | local script_sid = mapping_dict.sid 26 | 27 | local script_filename = nil 28 | if lookedup_sids[script_sid] ~= nil then 29 | script_filename = lookedup_sids[script_sid] 30 | else 31 | script_filename = api.nvim_call_function('scriptease#scriptname', {script_sid}) 32 | end 33 | 34 | 35 | local line_value = os.capture(string.format("sed '%sq;d' %s", mapping_dict.lnum - 1, script_filename)) 36 | table.insert(anki_lines, {line=line_value, mapping=mapping_dict}) 37 | end 38 | 39 | return anki_lines 40 | end 41 | 42 | -- print(os.time()) 43 | -- print(lyv.test()) 44 | -- print(os.time()) 45 | 46 | return lyv 47 | -------------------------------------------------------------------------------- /resources/vim_builtins.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "question": "Move cursor down one line", 4 | "answer": "j", 5 | "tags": [ 6 | "Basic" 7 | ] 8 | }, 9 | { 10 | "question": "Move cursor up one line", 11 | "answer": "k", 12 | "tags": [ 13 | "Basic" 14 | ] 15 | }, 16 | { 17 | "question": "Move cursor left one character", 18 | "answer": "h", 19 | "tags": [ 20 | "Basic" 21 | ] 22 | }, 23 | { 24 | "question": "Move cursor right one character", 25 | "answer": "l", 26 | "tags": [ 27 | "Basic" 28 | ] 29 | }, 30 | { 31 | "question": "Return to Normal mode", 32 | "answer": "<ESC>
(escape)", 33 | "tags": [ 34 | "Basic" 35 | ] 36 | }, 37 | { 38 | "question": "Exit the editor, discarding any changes", 39 | "answer": ":q!<ENTER>", 40 | "tags": [ 41 | "Basic" 42 | ] 43 | }, 44 | { 45 | "question": "Exit the editor, but abort if there are unsaved changes", 46 | "answer": ":q<ENTER>", 47 | "tags": [ 48 | "Basic" 49 | ] 50 | }, 51 | { 52 | "question": "Delete the character under the cursor", 53 | "answer": "x", 54 | "tags": [ 55 | "Basic" 56 | ] 57 | }, 58 | { 59 | "question": "Insert text before the cursor", 60 | "answer": "i", 61 | "tags": [ 62 | "Basic" 63 | ] 64 | }, 65 | { 66 | "question": "Append text at the end of the current line", 67 | "answer": "A", 68 | "tags": [ 69 | "Basic" 70 | ] 71 | }, 72 | { 73 | "question": "Save the current file and exit", 74 | "answer": ":wq<ENTER>", 75 | "tags": [ 76 | "Basic" 77 | ] 78 | }, 79 | { 80 | "question": "Append text after the cursor", 81 | "answer": "a", 82 | "tags": [ 83 | "Basic" 84 | ] 85 | }, 86 | { 87 | "question": "Invert case of current character", 88 | "answer": "~", 89 | "tags": [ 90 | "Beginner" 91 | ] 92 | }, 93 | { 94 | "question": "Go down half a screen", 95 | "answer": "<C-D>", 96 | "tags": [ 97 | "Beginner" 98 | ] 99 | }, 100 | { 101 | "question": "Go up half a screen", 102 | "answer": "<C-U>", 103 | "tags": [ 104 | "Beginner" 105 | ] 106 | }, 107 | { 108 | "question": "Go forward a screen", 109 | "answer": "<C-F>", 110 | "tags": [ 111 | "Beginner" 112 | ] 113 | }, 114 | { 115 | "question": "Go back a screen", 116 | "answer": "<C-B>", 117 | "tags": [ 118 | "Beginner" 119 | ] 120 | }, 121 | { 122 | "question": "Go to end of text", 123 | "answer": "G", 124 | "tags": [ 125 | "Beginner" 126 | ] 127 | }, 128 | { 129 | "question": "Go to previous word", 130 | "answer": "b", 131 | "tags": [ 132 | "Beginner" 133 | ] 134 | }, 135 | { 136 | "question": "Go to next word", 137 | "answer": "w", 138 | "tags": [ 139 | "Beginner" 140 | ] 141 | }, 142 | { 143 | "question": "Go to end of (next) word", 144 | "answer": "e
(goes to end of next word if already at end of word)", 145 | "tags": [ 146 | "Beginner" 147 | ] 148 | }, 149 | { 150 | "question": "Go to end of previous word", 151 | "answer": "ge", 152 | "tags": [ 153 | "Beginner" 154 | ] 155 | }, 156 | { 157 | "question": "Go to first non-whitespace character of current line", 158 | "answer": "^", 159 | "tags": [ 160 | "Beginner" 161 | ] 162 | }, 163 | { 164 | "question": "Go to last character of current line", 165 | "answer": "$", 166 | "tags": [ 167 | "Beginner" 168 | ] 169 | }, 170 | { 171 | "question": "Go to line n", 172 | "answer": "nG ngg", 173 | "tags": [ 174 | "Beginner" 175 | ] 176 | }, 177 | { 178 | "question": "Go to first line of file", 179 | "answer": "1G gg", 180 | "tags": [ 181 | "Beginner" 182 | ] 183 | }, 184 | { 185 | "question": "Go to last line of file", 186 | "answer": "G", 187 | "tags": [ 188 | "Beginner" 189 | ] 190 | }, 191 | { 192 | "question": "Insert at beginning of line (after whitespace)", 193 | "answer": "I", 194 | "tags": [ 195 | "Basic" 196 | ] 197 | }, 198 | { 199 | "question": "Undo last command", 200 | "answer": "u", 201 | "tags": [ 202 | "Beginner" 203 | ] 204 | }, 205 | { 206 | "question": "Restore last changed line", 207 | "answer": "U", 208 | "tags": [ 209 | "Beginner" 210 | ] 211 | }, 212 | { 213 | "question": "Redo last undo", 214 | "answer": "<C-R>", 215 | "tags": [ 216 | "Beginner" 217 | ] 218 | }, 219 | { 220 | "question": "Move cursor left to start of next space-separated word", 221 | "answer": "B", 222 | "tags": [ 223 | "Beginner" 224 | ] 225 | }, 226 | { 227 | "question": "Move cursor right to start of next space-separated word", 228 | "answer": "W", 229 | "tags": [ 230 | "Beginner" 231 | ] 232 | }, 233 | { 234 | "question": "Move cursor left to end of next space-separated word", 235 | "answer": "gE", 236 | "tags": [ 237 | "Beginner" 238 | ] 239 | }, 240 | { 241 | "question": "Move cursor right to end of next space-separated word", 242 | "answer": "E", 243 | "tags": [ 244 | "Beginner" 245 | ] 246 | }, 247 | { 248 | "question": "Move cursor to next occurrence of character c", 249 | "answer": "fc", 250 | "tags": [ 251 | "Beginner" 252 | ] 253 | }, 254 | { 255 | "question": "Move cursor to previous occurrence of character c", 256 | "answer": "Fc", 257 | "tags": [ 258 | "Beginner" 259 | ] 260 | }, 261 | { 262 | "question": "Move cursor to character before next occurrence of c", 263 | "answer": "tc", 264 | "tags": [ 265 | "Beginner" 266 | ] 267 | }, 268 | { 269 | "question": "Move cursor to character after previous occurrence of c", 270 | "answer": "Tc", 271 | "tags": [ 272 | "Beginner" 273 | ] 274 | }, 275 | { 276 | "question": "Delete a word", 277 | "answer": "dw", 278 | "tags": [ 279 | "Beginner" 280 | ] 281 | }, 282 | { 283 | "question": "Delete to the end of the line", 284 | "answer": "d$", 285 | "tags": [ 286 | "Beginner" 287 | ] 288 | }, 289 | { 290 | "question": "Delete text indicated by motion m", 291 | "answer": "dm
(example: d$ means delete to end of line)", 292 | "tags": [ 293 | "Beginner" 294 | ] 295 | }, 296 | { 297 | "question": "Delete n words", 298 | "answer": "ndw", 299 | "tags": [ 300 | "Beginner" 301 | ] 302 | }, 303 | { 304 | "question": "Move to the start of the line (before whitespace)", 305 | "answer": "0", 306 | "tags": [ 307 | "Beginner" 308 | ] 309 | }, 310 | { 311 | "question": "Delete a line", 312 | "answer": "dd", 313 | "tags": [ 314 | "Beginner" 315 | ] 316 | }, 317 | { 318 | "question": "Undo the last command", 319 | "answer": "u
(may be used repeatedly to undo multiple commands)", 320 | "tags": [ 321 | "Beginner" 322 | ] 323 | }, 324 | { 325 | "question": "Redo the last undone command", 326 | "answer": "<C-R>
(Control-R)", 327 | "tags": [ 328 | "Beginner" 329 | ] 330 | }, 331 | { 332 | "question": "Put previously deleted (or copied) text after the cursor", 333 | "answer": "p", 334 | "tags": [ 335 | "Beginner" 336 | ] 337 | }, 338 | { 339 | "question": "Put previously deleted text before the cursor", 340 | "answer": "P", 341 | "tags": [ 342 | "Beginner" 343 | ] 344 | }, 345 | { 346 | "question": "Replace the character under the cursor with character x", 347 | "answer": "rx", 348 | "tags": [ 349 | "Beginner" 350 | ] 351 | }, 352 | { 353 | "question": "Change to the end of the current word", 354 | "answer": "ce", 355 | "tags": [ 356 | "Beginner" 357 | ] 358 | }, 359 | { 360 | "question": "Change to the end of the current line", 361 | "answer": "c$", 362 | "tags": [ 363 | "Beginner" 364 | ] 365 | }, 366 | { 367 | "question": "See location in file and file status", 368 | "answer": "<C-G>
(Control-G)", 369 | "tags": [ 370 | "Beginner" 371 | ] 372 | }, 373 | { 374 | "question": "Search for phrase", 375 | "answer": "/phrase<ENTER>", 376 | "tags": [ 377 | "Beginner" 378 | ] 379 | }, 380 | { 381 | "question": "Substitute first occurrence of phrase1 with phrase2 on the current line", 382 | "answer": ":s/phrase1/phrase2<ENTER>", 383 | "tags": [ 384 | "Beginner" 385 | ] 386 | }, 387 | { 388 | "question": "Substitute all occurrences of phrase1 with phrase2 on the current line", 389 | "answer": ":s/phrase1/phrase2/g<ENTER>
(The /g at the end means \"global\")", 390 | "tags": [ 391 | "Beginner" 392 | ] 393 | }, 394 | { 395 | "question": "Substitute all occurrences of phrase1 with phrase2 in the entire file", 396 | "answer": ":%s/phrase1/phrase2/g
(% means execute the command for the entire file)", 397 | "tags": [ 398 | "Beginner" 399 | ] 400 | }, 401 | { 402 | "question": "Execute external command cmd", 403 | "answer": ":!cmd", 404 | "tags": [ 405 | "Beginner" 406 | ] 407 | }, 408 | { 409 | "question": "Save the current file to file named filename", 410 | "answer": ":w filename", 411 | "tags": [ 412 | "Beginner" 413 | ] 414 | }, 415 | { 416 | "question": "Save the visually selected area to file named filename", 417 | "answer": ":w filename
(vim will automatically add '<,'> to the beginning of your command for the visually selected area)", 418 | "tags": [ 419 | "Beginner" 420 | ] 421 | }, 422 | { 423 | "question": "Open a new line below the cursor's line and enter Insert mode", 424 | "answer": "o", 425 | "tags": [ 426 | "Beginner" 427 | ] 428 | }, 429 | { 430 | "question": "Open a new line above the cursor's line and enter Insert mode", 431 | "answer": "O (capital o)", 432 | "tags": [ 433 | "Beginner" 434 | ] 435 | }, 436 | { 437 | "question": "Enter Replace mode, to repeatedly replace the character under the cursor and advance", 438 | "answer": "R", 439 | "tags": [ 440 | "Beginner" 441 | ] 442 | }, 443 | { 444 | "question": "Yank (copy) the selected text", 445 | "answer": "y", 446 | "tags": [ 447 | "Beginner" 448 | ] 449 | }, 450 | { 451 | "question": "Yank (copy) the current line", 452 | "answer": "yy or Y", 453 | "tags": [ 454 | "Beginner" 455 | ] 456 | }, 457 | { 458 | "question": "Yank (copy) from cursor through motion m", 459 | "answer": "ym", 460 | "tags": [ 461 | "Beginner" 462 | ] 463 | }, 464 | { 465 | "question": "Put (paste) copied text after the cursor", 466 | "answer": "p", 467 | "tags": [ 468 | "Beginner" 469 | ] 470 | }, 471 | { 472 | "question": "Put (paste) copied text before the cursor", 473 | "answer": "P", 474 | "tags": [ 475 | "Beginner" 476 | ] 477 | }, 478 | { 479 | "question": "Ignore case in searches", 480 | "answer": ":set ic (or :set ignorecase)", 481 | "tags": [ 482 | "Beginner" 483 | ] 484 | }, 485 | { 486 | "question": "Show partial matches while typing search phrase", 487 | "answer": ":set is (or :set incsearch)", 488 | "tags": [ 489 | "Beginner" 490 | ] 491 | }, 492 | { 493 | "question": "Highlight all matching phrases for the last search", 494 | "answer": ":set hls (or :set hlsearch)", 495 | "tags": [ 496 | "Beginner" 497 | ] 498 | }, 499 | { 500 | "question": "Get help on command cmd", 501 | "answer": ":help cmd", 502 | "tags": [ 503 | "Beginner" 504 | ] 505 | }, 506 | { 507 | "question": "Jump to the next window", 508 | "answer": "<C-W><C-W>", 509 | "tags": [ 510 | "Beginner" 511 | ] 512 | }, 513 | { 514 | "question": "Jump to the next window right, left, up, or down", 515 | "answer": "<C-W><C-K> (where K is a cursor movement key h, j, k, l)", 516 | "tags": [ 517 | "Beginner" 518 | ] 519 | }, 520 | { 521 | "question": "Jump to last modified line", 522 | "answer": "'.", 523 | "tags": [ 524 | "Intermediate" 525 | ] 526 | }, 527 | { 528 | "question": "Jump to exact spot in last modified line", 529 | "answer": "`.", 530 | "tags": [ 531 | "Intermediate" 532 | ] 533 | }, 534 | { 535 | "question": "Retrace your movements in file (backward)
", 536 | "answer": "<C-O>", 537 | "tags": [ 538 | "Intermediate" 539 | ] 540 | }, 541 | { 542 | "question": "Retrace your movements in file (forward)", 543 | "answer": "<C-I>", 544 | "tags": [ 545 | "Intermediate" 546 | ] 547 | }, 548 | { 549 | "question": "Forward find word under cursor", 550 | "answer": "*", 551 | "tags": [ 552 | "Intermediate" 553 | ] 554 | }, 555 | { 556 | "question": "Forward find word under cursor (fuzzy)", 557 | "answer": "g*", 558 | "tags": [ 559 | "Intermediate" 560 | ] 561 | }, 562 | { 563 | "question": "Backward find word under cursor (fuzzy)", 564 | "answer": "g#", 565 | "tags": [ 566 | "Intermediate" 567 | ] 568 | }, 569 | { 570 | "question": "Backward find word under cursor", 571 | "answer": "#", 572 | "tags": [ 573 | "Intermediate" 574 | ] 575 | }, 576 | { 577 | "question": "Open file name under cursor", 578 | "answer": "gf", 579 | "tags": [ 580 | "Intermediate" 581 | ] 582 | }, 583 | { 584 | "question": "Swap next two characters around", 585 | "answer": "xp", 586 | "tags": [ 587 | "Intermediate" 588 | ] 589 | }, 590 | { 591 | "question": "(Re)indent the text on the current line or on the area selected", 592 | "answer": "=\"", 593 | "tags": [ 594 | "Intermediate" 595 | ] 596 | }, 597 | { 598 | "question": "Append the next n lines to register 'a'", 599 | "answer": "\"Anyy", 600 | "tags": [ 601 | "Intermediate" 602 | ] 603 | }, 604 | { 605 | "question": "Go to top of screen", 606 | "answer": "H", 607 | "tags": [ 608 | "Intermediate" 609 | ] 610 | }, 611 | { 612 | "question": "Go to middle of screen", 613 | "answer": "M", 614 | "tags": [ 615 | "Intermediate" 616 | ] 617 | }, 618 | { 619 | "question": "Go to bottom of screen", 620 | "answer": "L", 621 | "tags": [ 622 | "Intermediate" 623 | ] 624 | }, 625 | { 626 | "question": "Mark this line x", 627 | "answer": "mx", 628 | "tags": [ 629 | "Intermediate" 630 | ] 631 | }, 632 | { 633 | "question": "Go to exact position of mark in line marked x", 634 | "answer": "`x", 635 | "tags": [ 636 | "Intermediate" 637 | ] 638 | }, 639 | { 640 | "question": "Go to percentage from top of file", 641 | "answer": "n%", 642 | "tags": [ 643 | "Intermediate" 644 | ] 645 | }, 646 | { 647 | "question": "Match of next brace, bracket, comment, #define", 648 | "answer": "%", 649 | "tags": [ 650 | "Intermediate" 651 | ] 652 | }, 653 | { 654 | "question": "Go to line n from top of window", 655 | "answer": "nH", 656 | "tags": [ 657 | "Intermediate" 658 | ] 659 | }, 660 | { 661 | "question": "Go to line n from bottom of window", 662 | "answer": "nL", 663 | "tags": [ 664 | "Intermediate" 665 | ] 666 | }, 667 | { 668 | "question": "Insert at first column", 669 | "answer": "gI", 670 | "tags": [ 671 | "Intermediate" 672 | ] 673 | }, 674 | { 675 | "question": "Go to line marked x", 676 | "answer": "'x", 677 | "tags": [ 678 | "Intermediate" 679 | ] 680 | }, 681 | { 682 | "question": "Switch case for movement command m", 683 | "answer": "g~m", 684 | "tags": [ 685 | "Intermediate" 686 | ] 687 | }, 688 | { 689 | "question": "Lowercase text between cursor and movement m", 690 | "answer": "gum", 691 | "tags": [ 692 | "Intermediate" 693 | ] 694 | }, 695 | { 696 | "question": "Uppercase text between cursor and movement command m", 697 | "answer": "gUm", 698 | "tags": [ 699 | "Intermediate" 700 | ] 701 | }, 702 | { 703 | "question": "Delete range r lines", 704 | "answer": ":rd<Enter>", 705 | "tags": [ 706 | "Intermediate" 707 | ] 708 | }, 709 | { 710 | "question": "Delete range r lines into register x", 711 | "answer": ":rdx<Enter>", 712 | "tags": [ 713 | "Intermediate" 714 | ] 715 | }, 716 | { 717 | "question": "Insert character represented by ASCII value n (Insert mode)", 718 | "answer": "<C-V>n", 719 | "tags": [ 720 | "Intermediate" 721 | ] 722 | }, 723 | { 724 | "question": "Insert previously inserted text (Insert mode)", 725 | "answer": "<C-A>", 726 | "tags": [ 727 | "Intermediate" 728 | ] 729 | }, 730 | { 731 | "question": "Text completion before cursor (Insert mode)", 732 | "answer": "<C-N>", 733 | "tags": [ 734 | "Intermediate" 735 | ] 736 | }, 737 | { 738 | "question": "Text completion after cursor (Insert mode)", 739 | "answer": "<C-P>", 740 | "tags": [ 741 | "Intermediate" 742 | ] 743 | }, 744 | { 745 | "question": "Delete word before cursor (Insert mode)", 746 | "answer": "<C-W>", 747 | "tags": [ 748 | "Intermediate" 749 | ] 750 | }, 751 | { 752 | "question": "Delete all inserted characters in current line", 753 | "answer": "<C-U>", 754 | "tags": [ 755 | "Intermediate" 756 | ] 757 | }, 758 | { 759 | "question": "Show the content of all registers", 760 | "answer": ":reg<Enter>", 761 | "tags": [ 762 | "Intermediate" 763 | ] 764 | }, 765 | { 766 | "question": "Show the content of register x", 767 | "answer": ":reg x<Enter>", 768 | "tags": [ 769 | "Intermediate" 770 | ] 771 | }, 772 | { 773 | "question": "Perform rot13 encoding on movement m", 774 | "answer": "g?m", 775 | "tags": [ 776 | "Intermediate" 777 | ] 778 | }, 779 | { 780 | "question": "Filter lines of movement m through command c", 781 | "answer": "!mc", 782 | "tags": [ 783 | "Intermediate" 784 | ] 785 | }, 786 | { 787 | "question": "Filter n lines through command c", 788 | "answer": "n!!c", 789 | "tags": [ 790 | "Intermediate" 791 | ] 792 | }, 793 | { 794 | "question": "Filter range r lines through command c", 795 | "answer": ":r!c", 796 | "tags": [ 797 | "Intermediate" 798 | ] 799 | }, 800 | { 801 | "question": "In visual mode, exchange cursor position with start/end of highlighting", 802 | "answer": "o", 803 | "tags": [ 804 | "Intermediate" 805 | ] 806 | }, 807 | { 808 | "question": "Start highlighting block", 809 | "answer": "<C-V>", 810 | "tags": [ 811 | "Intermediate" 812 | ] 813 | }, 814 | { 815 | "question": "Start highlighting with previous visual area", 816 | "answer": "gv", 817 | "tags": [ 818 | "Intermediate" 819 | ] 820 | }, 821 | { 822 | "question": "Record typed commands to register x", 823 | "answer": "qx", 824 | "tags": [ 825 | "Intermediate" 826 | ] 827 | }, 828 | { 829 | "question": "Append typed commands to register x", 830 | "answer": "qX", 831 | "tags": [ 832 | "Intermediate" 833 | ] 834 | }, 835 | { 836 | "question": "Stop recording", 837 | "answer": "q", 838 | "tags": [ 839 | "Intermediate" 840 | ] 841 | }, 842 | { 843 | "question": "Move cursor to leftmost position of screen on current line", 844 | "answer": "g0", 845 | "tags": [ 846 | "Intermediate" 847 | ] 848 | }, 849 | { 850 | "question": "Move cursor to first non-blank character of current line on screen", 851 | "answer": "g^", 852 | "tags": [ 853 | "Intermediate" 854 | ] 855 | }, 856 | { 857 | "question": "Move cursor to last character of current line on screen", 858 | "answer": "g$", 859 | "tags": [ 860 | "Intermediate" 861 | ] 862 | }, 863 | { 864 | "question": "Move cursor one screen line up", 865 | "answer": "gk", 866 | "tags": [ 867 | "Intermediate" 868 | ] 869 | }, 870 | { 871 | "question": "Move cursor one screen line down", 872 | "answer": "gj", 873 | "tags": [ 874 | "Intermediate" 875 | ] 876 | }, 877 | { 878 | "question": "Repeat last f/F/t/T movement", 879 | "answer": ";", 880 | "tags": [ 881 | "Intermediate" 882 | ] 883 | }, 884 | { 885 | "question": "Inverse of last f/F/t/T movement", 886 | "answer": ", (comma)", 887 | "tags": [ 888 | "Intermediate" 889 | ] 890 | }, 891 | { 892 | "question": "Set a mark in the current file", 893 | "answer": "m[a-z]", 894 | "tags": [ 895 | "Intermediate" 896 | ] 897 | }, 898 | { 899 | "question": "Set a mark that can be returned to from any file", 900 | "answer": "m[A-Z]
(capital letters)", 901 | "tags": [ 902 | "Intermediate" 903 | ] 904 | }, 905 | { 906 | "question": "Jump to tag under cursor", 907 | "answer": "<C-]>", 908 | "tags": [ 909 | "Intermediate" 910 | ] 911 | }, 912 | { 913 | "question": "Return from tag jump", 914 | "answer": "<C-T>", 915 | "tags": [ 916 | "Intermediate" 917 | ] 918 | }, 919 | { 920 | "question": "Jump to tag on top of tag stack (or select if multiple matches)", 921 | "answer": ":tj", 922 | "tags": [ 923 | "Intermediate" 924 | ] 925 | }, 926 | { 927 | "question": "Scroll one line up", 928 | "answer": "<C-E>", 929 | "tags": [ 930 | "Intermediate" 931 | ] 932 | }, 933 | { 934 | "question": "Scroll one line down", 935 | "answer": "<C-Y>", 936 | "tags": [ 937 | "Intermediate" 938 | ] 939 | }, 940 | { 941 | "question": "Scroll current line to top of window", 942 | "answer": "zt or z<Enter>", 943 | "tags": [ 944 | "Intermediate" 945 | ] 946 | }, 947 | { 948 | "question": "Scroll current line to center of window", 949 | "answer": "zz or z.", 950 | "tags": [ 951 | "Intermediate" 952 | ] 953 | }, 954 | { 955 | "question": "Scroll current line to bottom of window", 956 | "answer": "zb or z-", 957 | "tags": [ 958 | "Intermediate" 959 | ] 960 | }, 961 | { 962 | "question": "Scroll one character to the right", 963 | "answer": "zh", 964 | "tags": [ 965 | "Intermediate" 966 | ] 967 | }, 968 | { 969 | "question": "Scroll one character to the left", 970 | "answer": "zl", 971 | "tags": [ 972 | "Intermediate" 973 | ] 974 | }, 975 | { 976 | "question": "Scroll half a screen to the right", 977 | "answer": "zH", 978 | "tags": [ 979 | "Intermediate" 980 | ] 981 | }, 982 | { 983 | "question": "Scroll half a screen to the left", 984 | "answer": "zL", 985 | "tags": [ 986 | "Intermediate" 987 | ] 988 | }, 989 | { 990 | "question": "Write range r to file f", 991 | "answer": ":rw f", 992 | "tags": [ 993 | "Intermediate" 994 | ] 995 | }, 996 | { 997 | "question": "Append range r to file f", 998 | "answer": ":rw>>f", 999 | "tags": [ 1000 | "Intermediate" 1001 | ] 1002 | }, 1003 | { 1004 | "question": "Insert content of file f below cursor", 1005 | "answer": ":r f", 1006 | "tags": [ 1007 | "Intermediate" 1008 | ] 1009 | }, 1010 | { 1011 | "question": "Insert output of command c below cursor", 1012 | "answer": ":r! c", 1013 | "tags": [ 1014 | "Intermediate" 1015 | ] 1016 | }, 1017 | { 1018 | "question": "Repeat last substitution (:s) command", 1019 | "answer": "&", 1020 | "tags": [ 1021 | "Intermediate" 1022 | ] 1023 | }, 1024 | { 1025 | "question": "Go to next modified buffer", 1026 | "answer": ":bm", 1027 | "tags": [ 1028 | "Intermediate" 1029 | ] 1030 | }, 1031 | { 1032 | "question": "Open all buffers in new splits", 1033 | "answer": ":ba or :sba", 1034 | "tags": [ 1035 | "Intermediate" 1036 | ] 1037 | }, 1038 | { 1039 | "question": "Open all buffers in new vertical splits", 1040 | "answer": ":vert ba or :vert sba", 1041 | "tags": [ 1042 | "Intermediate" 1043 | ] 1044 | }, 1045 | { 1046 | "question": "The position of mark x in an ex range", 1047 | "answer": "'x
(example: :'x,'y delete)", 1048 | "tags": [ 1049 | "Intermediate" 1050 | ] 1051 | }, 1052 | { 1053 | "question": "In an ex range, the next line where pat matches", 1054 | "answer": "/pat/", 1055 | "tags": [ 1056 | "Intermediate" 1057 | ] 1058 | }, 1059 | { 1060 | "question": "In an ex range, the previous line where pat matches", 1061 | "answer": "?pat?", 1062 | "tags": [ 1063 | "Intermediate" 1064 | ] 1065 | }, 1066 | { 1067 | "question": "n lines from the preceding line number in an ex range", 1068 | "answer": "+n", 1069 | "tags": [ 1070 | "Intermediate" 1071 | ] 1072 | }, 1073 | { 1074 | "question": "n lines before the preceding line number, in an ex range", 1075 | "answer": "-n", 1076 | "tags": [ 1077 | "Intermediate" 1078 | ] 1079 | }, 1080 | { 1081 | "question": "Look up keyword under cursor with man", 1082 | "answer": "K", 1083 | "tags": [ 1084 | "Intermediate" 1085 | ] 1086 | }, 1087 | { 1088 | "question": "Forward to start of next method", 1089 | "answer": "]m", 1090 | "tags": [ 1091 | "Intermediate" 1092 | ] 1093 | }, 1094 | { 1095 | "question": "Backward to start of previous method", 1096 | "answer": "[m", 1097 | "tags": [ 1098 | "Intermediate" 1099 | ] 1100 | }, 1101 | { 1102 | "question": "Move to global definition of symbol under cursor", 1103 | "answer": "gD", 1104 | "tags": [ 1105 | "Intermediate" 1106 | ] 1107 | }, 1108 | { 1109 | "question": "Move to local definition of symbol under cursor", 1110 | "answer": "gd", 1111 | "tags": [ 1112 | "Intermediate" 1113 | ] 1114 | }, 1115 | { 1116 | "question": "Open a window for each file in the argument list", 1117 | "answer": ":all", 1118 | "tags": [ 1119 | "Intermediate" 1120 | ] 1121 | }, 1122 | { 1123 | "question": "Display the argument list", 1124 | "answer": ":args", 1125 | "tags": [ 1126 | "Intermediate" 1127 | ] 1128 | }, 1129 | { 1130 | "question": "List the leaves in the tree of (undoable) changes", 1131 | "answer": ":undol[ist]", 1132 | "tags": [ 1133 | "Intermediate" 1134 | ] 1135 | }, 1136 | { 1137 | "question": "Go to previous text state (may cross undo branches)", 1138 | "answer": "g-", 1139 | "tags": [ 1140 | "Intermediate" 1141 | ] 1142 | }, 1143 | { 1144 | "question": "Go to next text state (may cross undo branches)", 1145 | "answer": "g+", 1146 | "tags": [ 1147 | "Intermediate" 1148 | ] 1149 | }, 1150 | { 1151 | "question": "Set up automatic wrapping when reaching right margin n", 1152 | "answer": ":wrapmargin n", 1153 | "tags": [ 1154 | "Intermediate" 1155 | ] 1156 | }, 1157 | { 1158 | "question": "Turn off automatic wrapping", 1159 | "answer": ":wrapmargin 0", 1160 | "tags": [ 1161 | "Intermediate" 1162 | ] 1163 | }, 1164 | { 1165 | "question": "Turn on line numbers", 1166 | "answer": ":set number", 1167 | "tags": [ 1168 | "Intermediate" 1169 | ] 1170 | }, 1171 | { 1172 | "question": "Turn off line numbers", 1173 | "answer": ":set nonumber", 1174 | "tags": [ 1175 | "Intermediate" 1176 | ] 1177 | }, 1178 | { 1179 | "question": "List of your movements", 1180 | "answer": ":ju(mps)", 1181 | "tags": [ 1182 | "Advanced" 1183 | ] 1184 | }, 1185 | { 1186 | "question": "List of your recent commands", 1187 | "answer": ":his[tory]", 1188 | "tags": [ 1189 | "Advanced" 1190 | ] 1191 | }, 1192 | { 1193 | "question": "Lowercase line", 1194 | "answer": "guu", 1195 | "tags": [ 1196 | "Advanced" 1197 | ] 1198 | }, 1199 | { 1200 | "question": "Uppercase line", 1201 | "answer": "gUU", 1202 | "tags": [ 1203 | "Advanced" 1204 | ] 1205 | }, 1206 | { 1207 | "question": "Display hex, ascii value of character under cursor", 1208 | "answer": "ga", 1209 | "tags": [ 1210 | "Advanced" 1211 | ] 1212 | }, 1213 | { 1214 | "question": "Display hex value of utf-8 character under cursor", 1215 | "answer": "g8", 1216 | "tags": [ 1217 | "Advanced" 1218 | ] 1219 | }, 1220 | { 1221 | "question": "Rot13 whole file", 1222 | "answer": "ggg?G", 1223 | "tags": [ 1224 | "Advanced" 1225 | ] 1226 | }, 1227 | { 1228 | "question": "Add n to next number on same line as the cursor", 1229 | "answer": "n<C-A>", 1230 | "tags": [ 1231 | "Advanced" 1232 | ] 1233 | }, 1234 | { 1235 | "question": "In insert mode, insert value of expression (ie 5*5) into text", 1236 | "answer": "<C-R>=expr", 1237 | "tags": [ 1238 | "Advanced" 1239 | ] 1240 | }, 1241 | { 1242 | "question": "Subtract n (default 1) from next number on same line as cursor", 1243 | "answer": "n<C-X>", 1244 | "tags": [ 1245 | "Advanced" 1246 | ] 1247 | }, 1248 | { 1249 | "question": "Execute the macro recorded in register x on all lines of the current file", 1250 | "answer": ":%normal @x", 1251 | "tags": [ 1252 | "Advanced" 1253 | ] 1254 | }, 1255 | { 1256 | "question": "Execute the macro recorded in register x on a visually selected set of lines", 1257 | "answer": ":normal @x", 1258 | "tags": [ 1259 | "Advanced" 1260 | ] 1261 | }, 1262 | { 1263 | "question": "Show lines in file matching word under cursor", 1264 | "answer": "[I (capital 'I')", 1265 | "tags": [ 1266 | "Advanced" 1267 | ] 1268 | }, 1269 | { 1270 | "question": "Move cursor n sentences forward", 1271 | "answer": "n)", 1272 | "tags": [ 1273 | "Advanced" 1274 | ] 1275 | }, 1276 | { 1277 | "question": "Move cursor n sentences backward", 1278 | "answer": "n(", 1279 | "tags": [ 1280 | "Advanced" 1281 | ] 1282 | }, 1283 | { 1284 | "question": "Move cursor n paragraphs forward", 1285 | "answer": "n}", 1286 | "tags": [ 1287 | "Advanced" 1288 | ] 1289 | }, 1290 | { 1291 | "question": "Move cursor n paragraphs backward", 1292 | "answer": "n{", 1293 | "tags": [ 1294 | "Advanced" 1295 | ] 1296 | }, 1297 | { 1298 | "question": "Paste below the current line, adjusting indentation to match current line", 1299 | "answer": "]p", 1300 | "tags": [ 1301 | "Advanced" 1302 | ] 1303 | }, 1304 | { 1305 | "question": "Paste above the current line, adjusting indentation to match current line", 1306 | "answer": "[p", 1307 | "tags": [ 1308 | "Advanced" 1309 | ] 1310 | }, 1311 | { 1312 | "question": "Go to center of screen on current line", 1313 | "answer": "gm", 1314 | "tags": [ 1315 | "Advanced" 1316 | ] 1317 | }, 1318 | { 1319 | "question": "Column n of current line", 1320 | "answer": "n|", 1321 | "tags": [ 1322 | "Advanced" 1323 | ] 1324 | }, 1325 | { 1326 | "question": "Insert previously inserted text and return to command mode (Insert mode)", 1327 | "answer": "<C-@>", 1328 | "tags": [ 1329 | "Advanced" 1330 | ] 1331 | }, 1332 | { 1333 | "question": "Insert content of register x (Insert mode)", 1334 | "answer": "<C-R>x", 1335 | "tags": [ 1336 | "Advanced" 1337 | ] 1338 | }, 1339 | { 1340 | "question": "Insert digraph (\u0153 \u00e9 \u00f1 etc.)", 1341 | "answer": "<C-K>c1c2", 1342 | "tags": [ 1343 | "Advanced" 1344 | ] 1345 | }, 1346 | { 1347 | "question": "Put register after cursor position, leaving cursor after new text", 1348 | "answer": "gp", 1349 | "tags": [ 1350 | "Advanced" 1351 | ] 1352 | }, 1353 | { 1354 | "question": "Put register before cursor position, leaving cursor after new text", 1355 | "answer": "gP", 1356 | "tags": [ 1357 | "Advanced" 1358 | ] 1359 | }, 1360 | { 1361 | "question": "Format lines of movement m as plain text", 1362 | "answer": "gqm", 1363 | "tags": [ 1364 | "Advanced" 1365 | ] 1366 | }, 1367 | { 1368 | "question": "Center lines in range r to width n", 1369 | "answer": ":rce n", 1370 | "tags": [ 1371 | "Advanced" 1372 | ] 1373 | }, 1374 | { 1375 | "question": "Left align lines in range r with indent n", 1376 | "answer": ":rle n", 1377 | "tags": [ 1378 | "Advanced" 1379 | ] 1380 | }, 1381 | { 1382 | "question": "Right align lines in range r to width n", 1383 | "answer": ":rri n", 1384 | "tags": [ 1385 | "Advanced" 1386 | ] 1387 | }, 1388 | { 1389 | "question": "In visual mode, select a word", 1390 | "answer": "aw", 1391 | "tags": [ 1392 | "Advanced" 1393 | ] 1394 | }, 1395 | { 1396 | "question": "In visual mode, select a sentence", 1397 | "answer": "as", 1398 | "tags": [ 1399 | "Advanced" 1400 | ] 1401 | }, 1402 | { 1403 | "question": "In visual mode, select a paragraph", 1404 | "answer": "ap", 1405 | "tags": [ 1406 | "Advanced" 1407 | ] 1408 | }, 1409 | { 1410 | "question": "In visual mode, select a block delimited by ( )", 1411 | "answer": "ab", 1412 | "tags": [ 1413 | "Advanced" 1414 | ] 1415 | }, 1416 | { 1417 | "question": "In visual mode, select a block delimited by { }", 1418 | "answer": "aB", 1419 | "tags": [ 1420 | "Advanced" 1421 | ] 1422 | }, 1423 | { 1424 | "question": "Move cursor down n-1 lines to first non-blank character", 1425 | "answer": "n_", 1426 | "tags": [ 1427 | "Advanced" 1428 | ] 1429 | }, 1430 | { 1431 | "question": "Move backward to start of section", 1432 | "answer": "[[", 1433 | "tags": [ 1434 | "Advanced" 1435 | ] 1436 | }, 1437 | { 1438 | "question": "Move forward to start of next section", 1439 | "answer": "]]", 1440 | "tags": [ 1441 | "Advanced" 1442 | ] 1443 | }, 1444 | { 1445 | "question": "Move backward to previous section end", 1446 | "answer": "[]", 1447 | "tags": [ 1448 | "Advanced" 1449 | ] 1450 | }, 1451 | { 1452 | "question": "Move forward to next section end", 1453 | "answer": "][", 1454 | "tags": [ 1455 | "Advanced" 1456 | ] 1457 | }, 1458 | { 1459 | "question": "Move backward to previous unclosed (", 1460 | "answer": "[(", 1461 | "tags": [ 1462 | "Advanced" 1463 | ] 1464 | }, 1465 | { 1466 | "question": "Move forward to next unclosed )", 1467 | "answer": "])", 1468 | "tags": [ 1469 | "Advanced" 1470 | ] 1471 | }, 1472 | { 1473 | "question": "Move backward to previous unclosed {", 1474 | "answer": "[{", 1475 | "tags": [ 1476 | "Advanced" 1477 | ] 1478 | }, 1479 | { 1480 | "question": "Move forward to next unclosed }", 1481 | "answer": "]}", 1482 | "tags": [ 1483 | "Advanced" 1484 | ] 1485 | }, 1486 | { 1487 | "question": "List matching tags (and select)", 1488 | "answer": ":ts", 1489 | "tags": [ 1490 | "Advanced" 1491 | ] 1492 | }, 1493 | { 1494 | "question": "Split window and show tag under cursor", 1495 | "answer": "<C-W>]", 1496 | "tags": [ 1497 | "Advanced" 1498 | ] 1499 | }, 1500 | { 1501 | "question": "Preview tag under cursor", 1502 | "answer": "<C-W>{", 1503 | "tags": [ 1504 | "Advanced" 1505 | ] 1506 | }, 1507 | { 1508 | "question": "Preview tag t", 1509 | "answer": ":pt t", 1510 | "tags": [ 1511 | "Advanced" 1512 | ] 1513 | }, 1514 | { 1515 | "question": "Close tag preview window", 1516 | "answer": "<C-W>z or :pc", 1517 | "tags": [ 1518 | "Advanced" 1519 | ] 1520 | }, 1521 | { 1522 | "question": "Visual area expressed as an ex range", 1523 | "answer": "*
(Example: :* delete)", 1524 | "tags": [ 1525 | "Advanced" 1526 | ] 1527 | }, 1528 | { 1529 | "question": "Create a fold for motion m in manual folding mode", 1530 | "answer": "zfm", 1531 | "tags": [ 1532 | "Advanced" 1533 | ] 1534 | }, 1535 | { 1536 | "question": "Create a fold for the visually highlighted text in manual folding mode", 1537 | "answer": "zf", 1538 | "tags": [ 1539 | "Advanced" 1540 | ] 1541 | }, 1542 | { 1543 | "question": "Create a fold for n lines in manual folding mode", 1544 | "answer": "nzF", 1545 | "tags": [ 1546 | "Advanced" 1547 | ] 1548 | }, 1549 | { 1550 | "question": "Create a fold for the range of lines r in manual folding mode", 1551 | "answer": ":rfo[ld]", 1552 | "tags": [ 1553 | "Advanced" 1554 | ] 1555 | }, 1556 | { 1557 | "question": "Delete one folding level at the cursor in manual folding mode", 1558 | "answer": "zd", 1559 | "tags": [ 1560 | "Advanced" 1561 | ] 1562 | }, 1563 | { 1564 | "question": "Delete all folds recursively at the cursor in manual folding mode", 1565 | "answer": "zD", 1566 | "tags": [ 1567 | "Advanced" 1568 | ] 1569 | }, 1570 | { 1571 | "question": "Eliminate all folds in the window in manual folding mode", 1572 | "answer": "zE", 1573 | "tags": [ 1574 | "Advanced" 1575 | ] 1576 | }, 1577 | { 1578 | "question": "Open n levels of folding at the cursor", 1579 | "answer": "nzo
(default 1 level when no count provided)", 1580 | "tags": [ 1581 | "Advanced" 1582 | ] 1583 | }, 1584 | { 1585 | "question": "Open all folds under the cursor (or visual selection) recursively", 1586 | "answer": "zO", 1587 | "tags": [ 1588 | "Advanced" 1589 | ] 1590 | }, 1591 | { 1592 | "question": "Close n levels of folding under the cursor", 1593 | "answer": "nzc
(default 1 level when no count given)", 1594 | "tags": [ 1595 | "Advanced" 1596 | ] 1597 | }, 1598 | { 1599 | "question": "Close all folds under the cursor (or visual selection) recursively", 1600 | "answer": "zC", 1601 | "tags": [ 1602 | "Advanced" 1603 | ] 1604 | }, 1605 | { 1606 | "question": "Toggle n levels of folding (close open folds; open closed folds)", 1607 | "answer": "nza", 1608 | "tags": [ 1609 | "Advanced" 1610 | ] 1611 | }, 1612 | { 1613 | "question": "Toggle folding recursively (close open folds and open closed folds)", 1614 | "answer": "zA", 1615 | "tags": [ 1616 | "Advanced" 1617 | ] 1618 | }, 1619 | { 1620 | "question": "Open just enough folds to make the line in which the cursor is located not folded", 1621 | "answer": "zv", 1622 | "tags": [ 1623 | "Advanced" 1624 | ] 1625 | }, 1626 | { 1627 | "question": "Open all folds", 1628 | "answer": "zR", 1629 | "tags": [ 1630 | "Advanced" 1631 | ] 1632 | }, 1633 | { 1634 | "question": "Fold none: All folds will be open", 1635 | "answer": "zn", 1636 | "tags": [ 1637 | "Advanced" 1638 | ] 1639 | }, 1640 | { 1641 | "question": "Fold normal: All folds will be as they were before (opposite of fold none)", 1642 | "answer": "zN", 1643 | "tags": [ 1644 | "Advanced" 1645 | ] 1646 | }, 1647 | { 1648 | "question": "Move to start of current open fold", 1649 | "answer": "[z", 1650 | "tags": [ 1651 | "Advanced" 1652 | ] 1653 | }, 1654 | { 1655 | "question": "Move to end of current open fold", 1656 | "answer": "]z", 1657 | "tags": [ 1658 | "Advanced" 1659 | ] 1660 | }, 1661 | { 1662 | "question": "Move down to start of next fold", 1663 | "answer": "zj", 1664 | "tags": [ 1665 | "Advanced" 1666 | ] 1667 | }, 1668 | { 1669 | "question": "Move up to end of previous fold", 1670 | "answer": "zk", 1671 | "tags": [ 1672 | "Advanced" 1673 | ] 1674 | } 1675 | ] 1676 | --------------------------------------------------------------------------------