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