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  }