# localization: skip(private)
function __fish_shared_key_bindings -d "Prints function body for bindings shared between emacs and vi mode"
    # These are some bindings that are supposed to be shared between vi mode and default mode.
    # They are supposed to be unrelated to text-editing (or movement).
    # This takes $argv so the vi-bindings can pass the mode they are valid in.
    # The code is printed instead of executed so that `bind` attributes the bindings to the caller.
    printf %s '
if contains -- -h $argv
    or contains -- --help $argv
    echo "Sorry but this function doesn\'t support -h or --help" >&2
    return 1
end
bind --preset $argv ctrl-y yank
or return # protect against invalid $argv
bind --preset $argv alt-y yank-pop

 # Left/Right arrow
bind --preset $argv right forward-char
bind --preset $argv left backward-char

 # Ctrl-left/right - these also work in vim.
bind --preset $argv ctrl-right forward-token
bind --preset $argv ctrl-left backward-token

bind --preset $argv pageup beginning-of-history
bind --preset $argv pagedown end-of-history

 # Interaction with the system clipboard.
bind --preset $argv ctrl-x fish_clipboard_copy
bind --preset $argv ctrl-v fish_clipboard_paste

bind --preset $argv escape cancel
bind --preset $argv ctrl-\[ cancel
bind --preset $argv tab complete
bind --preset $argv ctrl-i complete
bind --preset $argv ctrl-s pager-toggle-search
 # shift-tab does a tab complete followed by a search.
bind --preset $argv shift-tab complete-and-search
bind --preset $argv shift-delete history-delete or backward-delete-char

bind --preset $argv down down-or-search
bind --preset $argv up up-or-search

bind --preset $argv shift-right forward-bigword
bind --preset $argv shift-left backward-bigword

bind --preset $argv alt-b prevd-or-backward-word
bind --preset $argv alt-f nextd-or-forward-word

for alt_right in alt-right \e\[1\;9C  # TODO(terminal-workaround) iTerm2 < 3.5.12
    bind --preset $argv $alt_right nextd-or-forward-word
end
for alt_left in alt-left \e\[1\;9D  # TODO(terminal-workaround) iTerm2 < 3.5.12
    bind --preset $argv $alt_left prevd-or-backward-word
end

bind --preset $argv alt-up history-token-search-backward
bind --preset $argv alt-down history-token-search-forward
 # TODO(terminal-workaround)
bind --preset $argv \e\[1\;9A history-token-search-backward  # iTerm2 < 3.5.12
bind --preset $argv \e\[1\;9B history-token-search-forward  # iTerm2 < 3.5.12
 # Bash compatibility
 # https://github.com/fish-shell/fish-shell/issues/89
bind --preset $argv alt-. history-token-search-backward

bind --preset $argv alt-l __fish_list_current_token
bind --preset $argv alt-o __fish_preview_current_file
bind --preset $argv alt-w __fish_whatis_current_token
bind --preset $argv ctrl-l \
    "status test-terminal-feature scroll-content-up && commandline -f scrollback-push" \
    clear-screen
bind --preset $argv ctrl-c clear-commandline
bind --preset $argv ctrl-u backward-kill-line
bind --preset $argv ctrl-k kill-line
bind --preset $argv ctrl-w backward-kill-path-component
bind --preset $argv end end-of-line
bind --preset $argv home beginning-of-line

bind --preset $argv alt-d \'if test "$(commandline; printf .)" = \n.; __fish_echo dirh; else; commandline -f kill-word; end\'
bind --preset $argv ctrl-d delete-or-exit

bind --preset $argv alt-s \'for cmd in sudo doas please run0; if command -q $cmd; fish_commandline_prepend $cmd; break; end; end\'

 # Allow reading manpages by pressing f1 (many GUI applications) or Alt+h (like in zsh).
bind --preset $argv f1 __fish_man_page
bind --preset $argv alt-h __fish_man_page

 # This will make sure the output of the current command is paged using the default pager when
 # you press Meta-p.
 # If none is set, less will be used.
bind --preset $argv alt-p __fish_paginate

 # Make it easy to turn an unexecuted command into a comment in the shell history. Also,
 # remove the commenting chars so the command can be further edited then executed.
bind --preset $argv alt-# __fish_toggle_comment_commandline

 # These keystrokes invoke an external editor on the command buffer.
bind --preset $argv alt-e edit_command_buffer
bind --preset $argv alt-v edit_command_buffer

 # Bindings that are shared in text-insertion modes.
if not set -l index (contains --index -- -M $argv)
    or test $argv[(math $index + 1)] = insert

     # This is the default binding, i.e. the one used if no other binding matches
    bind --preset $argv "" self-insert
    or exit # protect against invalid $argv

     # Space and other command terminators expands abbrs _and_ inserts itself.
    bind --preset $argv space self-insert expand-abbr
    bind --preset $argv ";" self-insert expand-abbr
    bind --preset $argv "|" self-insert expand-abbr
    bind --preset $argv "&" self-insert expand-abbr
    bind --preset $argv ">" self-insert expand-abbr
    bind --preset $argv "<" self-insert expand-abbr
    set -l maybe_search_field "(commandline --search-field >/dev/null && echo --search-field)"
    bind --preset $argv shift-enter "commandline -i \n $maybe_search_field"  expand-abbr
    bind --preset $argv alt-enter "commandline -i \n $maybe_search_field"  expand-abbr
    bind --preset $argv ")" self-insert expand-abbr  # Closing a command substitution.
    bind --preset $argv ctrl-space \'test -n "$(commandline)" && commandline -i " " \'$maybe_search_field
     # Shift-space behaves like space because it\'s easy to mistype.
    bind --preset $argv shift-space \'commandline -i " " \'$maybe_search_field expand-abbr

    bind --preset $argv enter execute
    bind --preset $argv ctrl-j execute
    bind --preset $argv ctrl-m execute
     # Make Control+Return behave like Return because it\'s easy to mistype after accepting an autosuggestion.
    bind --preset $argv ctrl-enter execute
end'
end
