github.com/grzegorz-zur/bm@v0.0.0-20240312214136-6fc133e3e2c0/command.go (about) 1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 // Command mode. 8 type Command struct { 9 editor *Editor 10 } 11 12 // Show updates mode when switched to. 13 func (mode *Command) Show() error { 14 return nil 15 } 16 17 // Hide updates mode when switched from. 18 func (mode *Command) Hide() error { 19 return nil 20 } 21 22 // Key handles special key. 23 func (mode *Command) Key(key Key) error { 24 var err error 25 switch key { 26 case KeyTab: 27 mode.editor.SwitchMode(mode.editor.Switch) 28 } 29 if mode.editor.Empty() { 30 return nil 31 } 32 switch key { 33 case KeyLeft: 34 mode.editor.MoveLeft() 35 case KeyRight: 36 mode.editor.MoveRight() 37 case KeyUp: 38 mode.editor.MoveUp() 39 case KeyDown: 40 mode.editor.MoveDown() 41 case KeyHome: 42 mode.editor.MoveLineStart() 43 case KeyEnd: 44 mode.editor.MoveLineEnd() 45 case KeyPageUp: 46 mode.editor.MoveParagraphPrevious() 47 case KeyPageDown: 48 mode.editor.MoveParagraphNext() 49 } 50 if err != nil { 51 return fmt.Errorf("error handling key %v: %w", key, err) 52 } 53 return nil 54 } 55 56 // Rune handles runes. 57 func (mode *Command) Rune(rune rune) (err error) { 58 switch rune { 59 case 'b': 60 err = mode.editor.Write() 61 mode.editor.Pause() 62 case 'B': 63 err = mode.editor.Write() 64 mode.editor.Quit() 65 } 66 if mode.editor.Empty() { 67 return nil 68 } 69 switch rune { 70 case ' ': 71 mode.editor.SwitchMode(mode.editor.Input) 72 case 'd': 73 mode.editor.MoveLeft() 74 case 'f': 75 mode.editor.MoveRight() 76 case 'a': 77 mode.editor.MoveUp() 78 case 's': 79 mode.editor.MoveDown() 80 case 'D': 81 mode.editor.MoveLineStart() 82 case 'F': 83 mode.editor.MoveLineEnd() 84 case 'A': 85 mode.editor.MoveFileStart() 86 case 'S': 87 mode.editor.MoveFileEnd() 88 case 'e': 89 mode.editor.MoveWordPrevious() 90 case 'r': 91 mode.editor.MoveWordNext() 92 case 'q': 93 mode.editor.MoveParagraphPrevious() 94 case 'w': 95 mode.editor.MoveParagraphNext() 96 case 'z': 97 mode.editor.SwitchVersion(Backward) 98 case 'x': 99 mode.editor.SwitchVersion(Forward) 100 case 'c': 101 mode.editor.SwitchFile(Backward) 102 case 'v': 103 mode.editor.SwitchFile(Forward) 104 case 'j': 105 mode.editor.Delete() 106 case 'J': 107 mode.editor.DeleteLine() 108 case 'k': 109 mode.editor.LineBelow() 110 case 'K': 111 mode.editor.LineAbove() 112 case 'H': 113 mode.editor.SwitchMode(mode.editor.Select) 114 case 'h': 115 mode.editor.Paste() 116 case 'n': 117 _, err = mode.editor.File.Write() 118 mode.editor.Files.Close() 119 case 'N': 120 _, err = mode.editor.Read(true) 121 case 'm': 122 err = mode.editor.Write() 123 case 'M': 124 _, err = mode.editor.File.Write() 125 case '\\': 126 mode.editor.ToggleVisible() 127 } 128 if err != nil { 129 return fmt.Errorf("error handling rune %v: %w", rune, err) 130 } 131 return nil 132 } 133 134 // Render renders mode. 135 func (mode *Command) Render(view *View) (err error) { 136 if !mode.editor.Empty() { 137 err = mode.editor.File.Render(view) 138 if err != nil { 139 return fmt.Errorf("error rendering command mode: %w", err) 140 } 141 } 142 view.Color = ColorGreen 143 view.Prompt = "" 144 if mode.editor.Empty() { 145 view.Cursor = CursorNone 146 } 147 return nil 148 }