aboutsummaryrefslogtreecommitdiff
path: root/98-bindkeys.zsh
blob: 0d63dcef658a5cd6c76fe64a526e595b50db59ea (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
bindkey -v

bindkey -M menuselect 'h' vi-backward-char
bindkey -M menuselect 'k' vi-up-line-or-history
bindkey -M menuselect 'l' vi-forward-char
bindkey -M menuselect 'j' vi-down-line-or-history

bindkey -s '' ' '
bindkey '' backward-delete-char
bindkey -s '' ' '

bindkey -v '^?' backward-delete-char
bindkey -v '' backward-delete-char

autoload edit-command-line
zle -N edit-command-line
bindkey '' edit-command-line

nvim-feed-keys() {
  keys=${1/\'/\\\'}
  keys=${keys/\\/\\\\}
  python3 - <<END
import neovim, os
try:
  nvim_socket = os.environ["NVIM"]
  nvim = neovim.attach('socket', path=nvim_socket)
  nvim.feedkeys('$keys')
except KeyError:
  pass;
END
}

# This allows a ctrl-w motion with neovim, so one does not have do a terminal
# escape to switch panes.
nvim-move-pane() {
  read -sk key
  nvim-feed-keys "$key"
}

# Does anyone actually use the execute prompt in zsh? Rebind to go directly to
# the neovim command prompt.
nvim-cmd-mode() {
  if [[ -z "$NVIM" ]] ; then
    # fallback to original behavior.
    zle execute-named-cmd
  else
    nvim-feed-keys ":"
  fi
}

quote-escape() {
  sed "s/'/'\"'\"'/g" <<< "$1"
}

expand-last-file() {
  local before_cursor=$LBUFFER
  local after_cursor=$RBUFFER

  local after_cursor_first_word=${after_cursor/ *}
  local after_cursor_remaining=${after_cursor[${#after_cursor_first_word}+1,-1]}

  local before_cursor_last_word=${before_cursor//* }
  local before_cursor_remaining=${before_cursor[0, -${#before_cursor_last_word}-1]}

  local file="${before_cursor_last_word}${after_cursor_first_word}"

  if [ -f "${file}" ] ; then
    local catted_file="$(cat ${file})"
    catted_file="'$(quote-escape "${catted_file}")'"

    local new_l_buffer="${before_cursor_remaining}${catted_file}"

    BUFFER="${new_l_buffer}${after_cursor_remaining}"
    CURSOR=$#new_l_buffer
  fi
}

zle -N nvim-move-pane
zle -N nvim-cmd-mode
zle -N expand-last-file

bindkey -M vicmd '' nvim-move-pane
bindkey -M vicmd ':' nvim-cmd-mode
bindkey -M viins '' expand-last-file