# Vi Mode Tests # Tests vi-style line editing commands metadata: category: "Vi Mode" description: "Tests for vi-style command line editing" phase: 3 tests: # ============================================================= # MODE SWITCHING # ============================================================= - name: "Enable vi mode with set -o vi" steps: - send_line: "set -o vi" - send_line: "echo vi_enabled" expect_output: "vi_enabled" match_type: "contains" - name: "Escape enters command mode" steps: - send_line: "set -o vi" - send: "echo hello" - send_key: "Escape" - wait: 0.7 - send: "0" - wait: 0.2 - send: "d" - wait: 0.2 - send: "w" - wait: 0.2 - send: "i" - wait: 0.2 - send: "echo goodbye" - send_key: "Enter" expect_output: "goodbye" match_type: "contains" # ============================================================= # MOVEMENT COMMANDS (in command mode) # ============================================================= - name: "h moves cursor left" steps: - send_line: "set -o vi" - send: "echo ABCD" - send_key: "Escape" - wait: 0.7 - send: "h" - wait: 0.2 - send: "i" - wait: 0.2 - send: "X" - send_key: "Escape" - wait: 0.2 - send: "0" - wait: 0.2 - send: "i" - wait: 0.2 - send_key: "Enter" expect_output: "ABXCD" match_type: "contains" - name: "l moves cursor right" steps: - send_line: "set -o vi" - send: "echo ABCD" - send_key: "Escape" - wait: 0.7 - send: "0" - wait: 0.2 - send: "w" - wait: 0.2 - send: "l" - wait: 0.2 - send: "i" - wait: 0.2 - send: "X" - send_key: "Escape" - wait: 0.2 - send: "0" - wait: 0.2 - send: "i" - wait: 0.2 - send_key: "Enter" expect_output: "AXBCD" match_type: "contains" - name: "0 moves to beginning of line" steps: - send_line: "set -o vi" - send: "echo test" - send_key: "Escape" - wait: 0.7 - send: "0" - wait: 0.2 - send: "d" - wait: 0.2 - send: "w" - wait: 0.2 - send: "i" - wait: 0.2 - send: "printf '" - send_key: "Escape" - wait: 0.2 - send: "A" - wait: 0.2 - send: "'" - send_key: "Enter" expect_output: "test" match_type: "contains" - name: "$ moves to end of line" steps: - send_line: "set -o vi" - send: "echo test" - send_key: "Escape" - wait: 0.7 - send: "0" - wait: 0.2 - send: "$" - wait: 0.2 - send: "a" - wait: 0.2 - send: "X" - send_key: "Enter" expect_output: "echo testX" match_type: "contains" - name: "w moves forward one word" steps: - send_line: "set -o vi" - send: "echo ABC DEF" - send_key: "Escape" - wait: 0.7 - send: "0" - wait: 0.2 - send: "w" - wait: 0.2 - send: "w" - wait: 0.2 - send: "i" - wait: 0.2 - send: "X" - send_key: "Escape" - wait: 0.2 - send: "0" - wait: 0.2 - send: "i" - wait: 0.2 - send_key: "Enter" expect_output: "ABC XDEF" match_type: "contains" - name: "b moves backward one word" steps: - send_line: "set -o vi" - send: "echo ABC DEF" - send_key: "Escape" - wait: 0.7 - send: "b" - wait: 0.2 - send: "i" - wait: 0.2 - send: "X" - send_key: "Escape" - wait: 0.2 - send: "0" - wait: 0.2 - send: "i" - wait: 0.2 - send_key: "Enter" expect_output: "ABC XDEF" match_type: "contains" - name: "e moves to end of word" steps: - send_line: "set -o vi" - send: "echo ABC DEF" - send_key: "Escape" - wait: 0.7 - send: "0" - wait: 0.2 - send: "w" - wait: 0.2 - send: "e" - wait: 0.2 - send: "a" - wait: 0.2 - send: "X" - send_key: "Escape" - wait: 0.2 - send: "0" - wait: 0.2 - send: "i" - wait: 0.2 - send_key: "Enter" expect_output: "ABCX DEF" match_type: "contains" # ============================================================= # INSERT MODE COMMANDS # ============================================================= - name: "i enters insert mode before cursor" steps: - send_line: "set -o vi" - send: "echo ABCD" - send_key: "Escape" - wait: 0.7 - send: "0" - wait: 0.2 - send: "w" - wait: 0.2 - send: "i" - wait: 0.2 - send: "X" - send_key: "Escape" - wait: 0.2 - send: "0" - wait: 0.2 - send: "i" - wait: 0.2 - send_key: "Enter" expect_output: "XABCD" match_type: "contains" - name: "a enters insert mode after cursor" steps: - send_line: "set -o vi" - send: "echo ABCD" - send_key: "Escape" - wait: 0.7 - send: "0" - wait: 0.2 - send: "w" - wait: 0.2 - send: "a" - wait: 0.2 - send: "X" - send_key: "Escape" - wait: 0.2 - send: "0" - wait: 0.2 - send: "i" - wait: 0.2 - send_key: "Enter" expect_output: "AXBCD" match_type: "contains" - name: "I enters insert mode at beginning" steps: - send_line: "set -o vi" - send: "cho test" - send_key: "Escape" - wait: 0.7 - send: "I" - wait: 0.2 - send: "e" - send_key: "Enter" expect_output: "test" match_type: "contains" - name: "A enters insert mode at end" steps: - send_line: "set -o vi" - send: "echo test" - send_key: "Escape" - wait: 0.5 - send: "A" - wait: 0.1 - send: "X" - send_key: "Enter" expect_output: "echo testX" match_type: "contains" # ============================================================= # DELETION COMMANDS # ============================================================= - name: "x deletes character under cursor" steps: - send_line: "set -o vi" - send: "echo test" - send_key: "Escape" - wait: 0.7 - send: "0" - wait: 0.2 - send: "x" - wait: 0.2 - send: "i" - send_key: "Enter" expect_output: "cho test" match_type: "contains" - name: "X deletes character before cursor" steps: - send_line: "set -o vi" - send: "echo test" - send_key: "Escape" - wait: 0.5 - send: "X" - wait: 0.1 - send: "a" - send_key: "Enter" expect_output: "echo tes" match_type: "contains" - name: "dw deletes word" steps: - send_line: "set -o vi" - send: "echo hello world" - send_key: "Escape" - wait: 0.7 - send: "0" - wait: 0.2 - send: "d" - wait: 0.2 - send: "w" - wait: 0.2 - send: "i" - send_key: "Enter" expect_output: "hello world" match_type: "contains" - name: "dd clears entire line" steps: - send_line: "set -o vi" - send: "echo test" - send_key: "Escape" - wait: 0.7 - send: "d" - wait: 0.2 - send: "d" - wait: 0.2 - send: "i" - wait: 0.2 - send: "echo cleared" - send_key: "Enter" expect_output: "cleared" match_type: "contains" - name: "D deletes to end of line" steps: - send_line: "set -o vi" - send: "echo hello world" - send_key: "Escape" - wait: 0.7 - send: "0" - wait: 0.2 - send: "w" - wait: 0.2 - send: "D" - wait: 0.2 - send: "a" - send_key: "Enter" expect_output: "echo" match_type: "contains" # ============================================================= # CHANGE COMMANDS # ============================================================= - name: "cw changes word" steps: - send_line: "set -o vi" - send: "echo hello world" - send_key: "Escape" - wait: 0.7 - send: "0" - wait: 0.2 - send: "w" - wait: 0.2 - send: "c" - wait: 0.2 - send: "w" - wait: 0.2 - send: "goodbye" - send_key: "Enter" expect_output: "goodbye world" match_type: "contains" - name: "cc changes entire line" steps: - send_line: "set -o vi" - send: "old command" - send_key: "Escape" - wait: 0.7 - send: "c" - wait: 0.2 - send: "c" - wait: 0.2 - send: "echo new" - send_key: "Enter" expect_output: "new" match_type: "contains" - name: "C changes to end of line" steps: - send_line: "set -o vi" - send: "echo hello world" - send_key: "Escape" - wait: 0.7 - send: "0" - wait: 0.2 - send: "w" - wait: 0.2 - send: "C" - wait: 0.2 - send: "changed" - send_key: "Enter" expect_output: "changed" match_type: "contains" # ============================================================= # HISTORY NAVIGATION (in command mode) # ============================================================= - name: "k moves to previous history" steps: - send_line: "set -o vi" - send_line: "echo first" - send_line: "echo second" - send_key: "Escape" - wait: 0.5 - send: "k" - send_key: "Enter" expect_output: "second" match_type: "contains" - name: "j moves to next history" steps: - send_line: "set -o vi" - send_line: "echo first" - send_line: "echo second" - send_key: "Escape" - wait: 0.7 - send: "k" - wait: 0.2 - send: "k" - wait: 0.2 - send: "j" - send_key: "Enter" expect_output: "second" match_type: "contains" # ============================================================= # UNDO # ============================================================= - name: "u undoes last change" steps: - send_line: "set -o vi" - send: "echo test" - send_key: "Escape" - wait: 0.7 - send: "0" - wait: 0.2 - send: "d" - wait: 0.2 - send: "w" - wait: 0.2 - send: "u" - wait: 0.2 - send: "i" - send_key: "Enter" expect_output: "test" match_type: "contains" # ============================================================= # REPEAT AND COUNT # ============================================================= - name: "2x deletes two characters" steps: - send_line: "set -o vi" - send: "echo abcd" - send_key: "Escape" - wait: 0.7 - send: "0" - wait: 0.2 - send: "2" - wait: 0.2 - send: "x" - wait: 0.2 - send: "i" - send_key: "Enter" expect_output: "ho abcd" match_type: "contains" - name: "3l moves 3 characters right" steps: - send_line: "set -o vi" - send: "echo ABCDEF" - send_key: "Escape" - wait: 0.7 - send: "0" - wait: 0.2 - send: "w" - wait: 0.2 - send: "3" - wait: 0.2 - send: "l" - wait: 0.2 - send: "i" - wait: 0.2 - send: "X" - send_key: "Escape" - wait: 0.2 - send: "0" - wait: 0.2 - send: "i" - wait: 0.2 - send_key: "Enter" expect_output: "ABCXDEF" match_type: "contains" # ============================================================= # RETURN TO EMACS MODE # ============================================================= - name: "set -o emacs returns to emacs mode" steps: - send_line: "set -o vi" - send_line: "set -o emacs" - send: "cho hello" - send_key: "C-a" - send: "e" - send_key: "Enter" expect_output: "hello" match_type: "contains"