# These are the common keys acrosso modes taken directly from Rustyline. If
# you want to change the keybinding you should change the letter after
# "key:". If you want to change the modifier you should change or add the
# modifier after "key:", such as:
# key:
#   Char: A
# modifiers:
#   CTRL:
# binding:
#   blah:
# Available modifiers are CTRL, ALT, SHIFT, NONE, CTRL_SHIFT,
# ALT_SHIFT, CTRL_ALT, CTRL_ALT_SHIFT

##########################################################
# Common From https://github.com/kkawakam/rustyline#actions
##########################################################

# Control Backspace, delete 1 word at a time
- key:
    Backspace:
  modifiers:
    CTRL:
  binding:
    Kill:
      BackwardWord:
        repeat: 1
        word: Big

# Alt Backspace, delete 1 word at a time
- key:
    Backspace:
  modifiers:
    ALT:
  binding:
    Kill:
      BackwardWord:
        repeat: 1
        word: Big

# Move cursor to the beginning of line
- key:
    Home:
  binding:
    Move: BeginningOfLine

# Move cursor to end of line
- key:
    End:
  binding:
    Move: EndOfLine

# Move cursor one character left
- key:
    Left: #Left Arrow Key
  binding:
    Move:
      BackwardChar: 1

# Move cursor one character right
- key:
    Right: #Right Arrow Key
  binding:
    Move:
      ForwardChar: 1

# Complete Hint
- key:
    Right:
  modifiers:
    SHIFT:
  binding:
    CompleteHint:
- key:
    Char: F
  modifiers:
    CTRL:
  binding:
    CompleteHint:

# Interrupt/Cancel edition
- key:
    Char: C
  modifiers:
    CTRL:
  binding:
    Interrupt:

# (if line is not empty) Delete character under cursor
- key:
    Char: D
  modifiers:
    CTRL:
  binding:
    EndOfFile:

# Delete character under cursor
- key:
    Delete:
  binding:
    Kill:
      ForwardChar: 1

# Finish the line entry
- key:
    Char: J
  modifiers:
    CTRL:
  binding:
    AcceptLine:
- key:
    Char: M
  modifiers:
    CTRL:
  binding:
    AcceptLine:

# This makes multiline editing stop working since Enter accepts a line
# - key:
#     Enter:
#   binding:
#     AcceptLine:

# Next match from history
- key:
    Down: #Down Arrow Key
  binding:
    LineDownOrNextHistory: 1

# Previous match from history
- key:
    Up: #Up Arrow Key
  binding:
    LineUpOrPreviousHistory: 1

# Reverse Search history (Ctrl-S forward, Ctrl-G cancel)
- key:
    Char: R
  modifiers:
    CTRL:
  binding:
    ReverseSearchHistory:

# Forward Search history (Ctrl-R backward, Ctrl-G cancel)
- key:
    Char: S
  modifiers:
    CTRL:
  binding:
    ForwardSearchHistory:

# Transpose previous character with current character
- key:
    Char: T
  modifiers:
    CTRL:
  binding:
    TransposeChars:

# Delete from start of line to cursor
- key:
    Char: U
  modifiers:
    CTRL:
  binding:
    Kill: BeginningOfLine

# Insert any special character without performing its associated action (#65)
- key:
    Char: Q
  modifiers:
    CTRL:
  binding:
    QuotedInsert:
- key:
    Char: V
  modifiers:
    CTRL:
  binding:
    QuotedInsert:

# Delete word leading up to cursor (using white space as a word boundary)
- key:
    Char: W
  modifiers:
    CTRL:
  binding:
    Kill:
      BackwardWord:
        repeat: 1
        word: Big

# Paste from Yank buffer
- key:
    Char: Y
  modifiers:
    CTRL:
  binding:
    Yank:
      repeat: 1
      anchor: Before

# Suspend (Unix only)
- key:
    Char: Z
  modifiers:
    CTRL:
  binding:
    Suspend:

# Undo
- key:
    Char: "_"
  modifiers:
    CTRL:
  binding:
    Undo: 1

# KeyPress::UnknownEscSeq => Cmd::Noop,
- key:
    UnknownEscSeq:
  binding:
    Noop:
##########################################################
# Possible options for key:
##########################################################
# /// Unsupported escape sequence (on unix platform)
# UnknownEscSeq,
# /// ⌫ or `KeyEvent::Ctrl('H')`
# Backspace,
# /// ⇤ (usually Shift-Tab)
# BackTab,
# /// Paste (on unix platform)
# BracketedPasteStart,
# /// Paste (on unix platform)
# BracketedPasteEnd,
# /// Single char
# Char(char),
# /// ⌦
# Delete,
# /// ↓ arrow key
# Down,
# /// ⇲
# End,
# /// ↵ or `KeyEvent::Ctrl('M')`
# Enter,
# /// Escape or `KeyEvent::Ctrl('[')`
# Esc,
# /// Function key
# F(u8),
# /// ⇱
# Home,
# /// Insert key
# Insert,
# /// ← arrow key
# Left,
# // /// `KeyEvent::Char('\0')`
# Null,
# /// ⇟
# PageDown,
# /// ⇞
# PageUp,
# /// → arrow key
# Right,
# /// ⇥ or `KeyEvent::Ctrl('I')`
# Tab,
# /// ↑ arrow key
# Up,

##########################################################
# Possible options for command binding
##########################################################
# /// abort
# Abort, // Miscellaneous Command
# /// accept-line
# AcceptLine,
# /// beginning-of-history
# BeginningOfHistory,
# /// capitalize-word
# CapitalizeWord,
# /// clear-screen
# ClearScreen,
# /// complete
# Complete,
# /// complete-backward
# CompleteBackward,
# /// complete-hint
# CompleteHint,
# /// Dedent current line
# Dedent(Movement),
# /// downcase-word
# DowncaseWord,
# /// vi-eof-maybe
# EndOfFile,
# /// end-of-history
# EndOfHistory,
# /// forward-search-history
# ForwardSearchHistory,
# /// history-search-backward
# HistorySearchBackward,
# /// history-search-forward
# HistorySearchForward,
# /// Indent current line
# Indent(Movement),
# /// Insert text
# Insert { repeat: RepeatCount, string: String },
# /// Interrupt signal (Ctrl-C)
# Interrupt,
# /// backward-delete-char, backward-kill-line, backward-kill-word
# /// delete-char, kill-line, kill-word, unix-line-discard, unix-word-rubout,
# /// vi-delete, vi-delete-to, vi-rubout
# Kill(Movement),
# /// backward-char, backward-word, beginning-of-line, end-of-line,
# /// forward-char, forward-word, vi-char-search, vi-end-word, vi-next-word,
# /// vi-prev-word
# Move(Movement),
# /// Inserts a newline
# Newline,
# /// next-history
# NextHistory,
# /// No action
# Noop,
# /// vi-replace
# Overwrite(char),
# /// Paste from the clipboard
# #[cfg(windows)]
# PasteFromClipboard,
# /// previous-history
# PreviousHistory,
# /// quoted-insert
# QuotedInsert,
# /// vi-change-char
# ReplaceChar { repeat: RepeatCount, ch: char },
# /// vi-change-to, vi-substitute
# Replace {
#     movement: Movement,
#     replacement: Option<String>,
# },
# /// reverse-search-history
# ReverseSearchHistory,
# /// self-insert
# SelfInsert { repeat: RepeatCount, ch: char },
# /// Suspend signal (Ctrl-Z on unix platform)
# Suspend,
# /// transpose-chars
# TransposeChars,
# /// transpose-words
# TransposeWords(RepeatCount),
# /// undo
# Undo(RepeatCount),
# /// Unsupported / unexpected
# Unknown,
# /// upcase-word
# UpcaseWord,
# /// vi-yank-to
# ViYankTo(Movement),
# /// yank, vi-put
# Yank { repeat: RepeatCount, anchor: Anchor },
# /// yank-pop
# YankPop,
# /// moves cursor to the line above or switches to prev history entry if
# /// the cursor is already on the first line
# LineUpOrPreviousHistory(RepeatCount),
# /// moves cursor to the line below or switches to next history entry if
# /// the cursor is already on the last line
# LineDownOrNextHistory(RepeatCount),
# /// accepts the line when cursor is at the end of the text (non including
# /// trailing whitespace), inserts newline character otherwise
# AcceptOrInsertLine,

##########################################################
# Possible options for Word
##########################################################
# /// non-blanks characters
# Big,
# /// alphanumeric characters
# Emacs,
# /// alphanumeric (and '_') characters
# Vi,

##########################################################
# Possible options for At
##########################################################
# /// Start of word.
# Start,
# /// Before end of word.
# BeforeEnd,
# /// After end of word.
# AfterEnd,

##########################################################
# Possible options for Anchor
##########################################################
# /// After cursor
# After,
# /// Before cursor
# Before,

##########################################################
# Possible options for CharSearch
##########################################################
# /// Forward search
# Forward(char),
# /// Forward search until
# ForwardBefore(char),
# /// Backward search
# Backward(char),
# /// Backward search until
# BackwardAfter(char),

##########################################################
# Possible options for Movement
##########################################################
# /// Whole current line (not really a movement but a range)
# WholeLine,
# /// beginning-of-line
# BeginningOfLine,
# /// end-of-line
# EndOfLine,
# /// backward-word, vi-prev-word
# BackwardWord(RepeatCount, Word), // Backward until start of word
# /// forward-word, vi-end-word, vi-next-word
# ForwardWord(RepeatCount, At, Word), // Forward until start/end of word
# /// vi-char-search
# ViCharSearch(RepeatCount, CharSearch),
# /// vi-first-print
# ViFirstPrint,
# /// backward-char
# BackwardChar(RepeatCount),
# /// forward-char
# ForwardChar(RepeatCount),
# /// move to the same column on the previous line
# LineUp(RepeatCount),
# /// move to the same column on the next line
# LineDown(RepeatCount),
# /// Whole user input (not really a movement but a range)
# WholeBuffer,
# /// beginning-of-buffer
# BeginningOfBuffer,
# /// end-of-buffer
# EndOfBuffer,
