github.com/grzegorz-zur/bm@v0.0.0-20240312214136-6fc133e3e2c0/select.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  )
     6  
     7  // Select mode.
     8  type Select struct {
     9  	editor *Editor
    10  }
    11  
    12  // Show updates mode when switched to.
    13  func (mode *Select) Show() error {
    14  	mode.editor.File.Select()
    15  	return nil
    16  }
    17  
    18  // Hide updates mode when switched from.
    19  func (mode *Select) Hide() error {
    20  	return nil
    21  }
    22  
    23  // Key handles special key.
    24  func (mode *Select) Key(key Key) error {
    25  	var err error
    26  	switch key {
    27  	case KeyLeft:
    28  		mode.editor.MoveLeft()
    29  	case KeyRight:
    30  		mode.editor.MoveRight()
    31  	case KeyUp:
    32  		mode.editor.MoveUp()
    33  	case KeyDown:
    34  		mode.editor.MoveDown()
    35  	case KeyHome:
    36  		mode.editor.MoveLineStart()
    37  	case KeyEnd:
    38  		mode.editor.MoveLineEnd()
    39  	case KeyPageUp:
    40  		mode.editor.MoveParagraphPrevious()
    41  	case KeyPageDown:
    42  		mode.editor.MoveParagraphNext()
    43  	}
    44  	if err != nil {
    45  		return fmt.Errorf("error handling key %v: %w", key, err)
    46  	}
    47  	return nil
    48  }
    49  
    50  // Rune handles runes.
    51  func (mode *Select) Rune(rune rune) error {
    52  	var err error
    53  	switch rune {
    54  	case 'd':
    55  		mode.editor.MoveLeft()
    56  	case 'f':
    57  		mode.editor.MoveRight()
    58  	case 'a':
    59  		mode.editor.MoveUp()
    60  	case 's':
    61  		mode.editor.MoveDown()
    62  	case 'D':
    63  		mode.editor.MoveLineStart()
    64  	case 'F':
    65  		mode.editor.MoveLineEnd()
    66  	case 'A':
    67  		mode.editor.MoveFileStart()
    68  	case 'S':
    69  		mode.editor.MoveFileEnd()
    70  	case 'q':
    71  		mode.editor.MoveParagraphPrevious()
    72  	case 'w':
    73  		mode.editor.MoveParagraphNext()
    74  	case 'e':
    75  		mode.editor.MoveWordPrevious()
    76  	case 'r':
    77  		mode.editor.MoveWordNext()
    78  	case 'H':
    79  		mode.editor.SwitchMode(mode.editor.Command)
    80  	case 'h':
    81  		mode.editor.Copy()
    82  	case 'j':
    83  		mode.editor.Cut()
    84  	}
    85  	if err != nil {
    86  		return fmt.Errorf("error handling rune %v: %w", rune, err)
    87  	}
    88  	return nil
    89  }
    90  
    91  // Render renders select mode.
    92  func (mode *Select) Render(view *View) error {
    93  	view.Select = true
    94  	err := mode.editor.File.Render(view)
    95  	if err != nil {
    96  		return fmt.Errorf("error rendering select mode: %w", err)
    97  	}
    98  	view.Color = ColorYellow
    99  	view.Prompt = ""
   100  	return nil
   101  }