init.zsh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #
  2. # Editor and input char assignment
  3. #
  4. # Return if requirements are not found.
  5. if [[ ${TERM} == 'dumb' ]]; then
  6. return 1
  7. fi
  8. # Use human-friendly identifiers.
  9. zmodload -F zsh/terminfo +b:echoti +p:terminfo
  10. typeset -gA key_info
  11. key_info=(
  12. 'Control' '\C-'
  13. 'ControlLeft' '\e[1;5D \e[5D \e\e[D \eOd \eOD'
  14. 'ControlRight' '\e[1;5C \e[5C \e\e[C \eOc \eOC'
  15. 'Escape' '\e'
  16. 'Meta' '\M-'
  17. 'Backspace' "${terminfo[kbs]}"
  18. 'BackTab' "${terminfo[kcbt]}"
  19. 'Left' "${terminfo[kcub1]}"
  20. 'Down' "${terminfo[kcud1]}"
  21. 'Right' "${terminfo[kcuf1]}"
  22. 'Up' "${terminfo[kcuu1]}"
  23. 'Delete' "${terminfo[kdch1]}"
  24. 'End' "${terminfo[kend]}"
  25. 'F1' "${terminfo[kf1]}"
  26. 'F2' "${terminfo[kf2]}"
  27. 'F3' "${terminfo[kf3]}"
  28. 'F4' "${terminfo[kf4]}"
  29. 'F5' "${terminfo[kf5]}"
  30. 'F6' "${terminfo[kf6]}"
  31. 'F7' "${terminfo[kf7]}"
  32. 'F8' "${terminfo[kf8]}"
  33. 'F9' "${terminfo[kf9]}"
  34. 'F10' "${terminfo[kf10]}"
  35. 'F11' "${terminfo[kf11]}"
  36. 'F12' "${terminfo[kf12]}"
  37. 'Home' "${terminfo[khome]}"
  38. 'Insert' "${terminfo[kich1]}"
  39. 'PageDown' "${terminfo[knp]}"
  40. 'PageUp' "${terminfo[kpp]}"
  41. )
  42. # Bind the keys
  43. local key
  44. for key (${(s: :)key_info[ControlLeft]}) bindkey ${key} backward-word
  45. for key (${(s: :)key_info[ControlRight]}) bindkey ${key} forward-word
  46. [[ -n ${key_info[Home]} ]] && bindkey ${key_info[Home]} beginning-of-line
  47. [[ -n ${key_info[End]} ]] && bindkey ${key_info[End]} end-of-line
  48. [[ -n ${key_info[PageUp]} ]] && bindkey ${key_info[PageUp]} up-line-or-history
  49. [[ -n ${key_info[PageDown]} ]] && bindkey ${key_info[PageDown]} down-line-or-history
  50. [[ -n ${key_info[Insert]} ]] && bindkey ${key_info[Insert]} overwrite-mode
  51. if [[ ${zdouble_dot_expand} == 'true' ]]; then
  52. double-dot-expand() {
  53. if [[ ${LBUFFER} == *.. ]]; then
  54. LBUFFER+='/..'
  55. else
  56. LBUFFER+='.'
  57. fi
  58. }
  59. zle -N double-dot-expand
  60. bindkey '.' double-dot-expand
  61. fi
  62. [[ -n ${key_info[Backspace]} ]] && bindkey ${key_info[Backspace]} backward-delete-char
  63. [[ -n ${key_info[Delete]} ]] && bindkey ${key_info[Delete]} delete-char
  64. [[ -n ${key_info[Left]} ]] && bindkey ${key_info[Left]} backward-char
  65. [[ -n ${key_info[Right]} ]] && bindkey ${key_info[Right]} forward-char
  66. # Expandpace.
  67. bindkey ' ' magic-space
  68. # Clear
  69. bindkey "${key_info[Control]}L" clear-screen
  70. # Bind Shift + Tab to go to the previous menu item.
  71. [[ -n ${key_info[BackTab]} ]] && bindkey ${key_info[BackTab]} reverse-menu-complete
  72. autoload -Uz is-at-least && if ! is-at-least 5.3; then
  73. # Redisplay after completing, and avoid blank prompt after <Tab><Tab><Ctrl-C>
  74. expand-or-complete-with-redisplay() {
  75. print -Pn '...'
  76. zle expand-or-complete
  77. zle redisplay
  78. }
  79. zle -N expand-or-complete-with-redisplay
  80. bindkey "${key_info[Control]}I" expand-or-complete-with-redisplay
  81. fi
  82. # Put into application mode and validate ${terminfo}
  83. zle-line-init() {
  84. (( ${+terminfo[smkx]} )) && echoti smkx
  85. }
  86. zle-line-finish() {
  87. (( ${+terminfo[rmkx]} )) && echoti rmkx
  88. }
  89. zle -N zle-line-init
  90. zle -N zle-line-finish