viper-keym.el 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. ;;; viper-keym.el --- Viper keymaps
  2. ;; Copyright (C) 1994-1997, 2000-2017 Free Software Foundation, Inc.
  3. ;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
  4. ;; Package: viper
  5. ;; This file is part of GNU Emacs.
  6. ;; GNU Emacs is free software: you can redistribute it and/or modify
  7. ;; it under the terms of the GNU General Public License as published by
  8. ;; the Free Software Foundation, either version 3 of the License, or
  9. ;; (at your option) any later version.
  10. ;; GNU Emacs is distributed in the hope that it will be useful,
  11. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ;; GNU General Public License for more details.
  14. ;; You should have received a copy of the GNU General Public License
  15. ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
  16. ;;; Commentary:
  17. ;;; Code:
  18. ;; compiler pacifier
  19. (defvar viper-always)
  20. (defvar viper-current-state)
  21. (defvar viper-mode-string)
  22. (defvar viper-expert-level)
  23. (defvar viper-ex-style-editing)
  24. (defvar viper-ex-style-motion)
  25. (eval-and-compile
  26. (unless (fboundp 'declare-function) (defmacro declare-function (&rest r))))
  27. ;; end pacifier
  28. (require 'viper-util)
  29. (declare-function viper-ex "viper-ex" (arg &optional string))
  30. (declare-function viper-normalize-minor-mode-map-alist "viper-cmd" ())
  31. (declare-function viper-set-mode-vars-for "viper-cmd" (state))
  32. ;;; Variables
  33. ;;; Emacs keys in other states.
  34. (defcustom viper-want-emacs-keys-in-insert t
  35. "Set to nil if you want complete Vi compatibility in insert mode.
  36. Complete compatibility with Vi is not recommended for power use of Viper."
  37. :type 'boolean
  38. :group 'viper)
  39. (defcustom viper-want-emacs-keys-in-vi t
  40. "Set to nil if you want complete Vi compatibility in Vi mode.
  41. Full Vi compatibility is not recommended for power use of Viper."
  42. :type 'boolean
  43. :group 'viper)
  44. (defcustom viper-no-multiple-ESC t
  45. "If non-nil, multiple ESC in Vi mode will cause bell to ring.
  46. This is set to t on a windowing terminal and to `twice' on a dumb
  47. terminal (unless the user level is 1, 2, or 5). On a dumb terminal, this
  48. enables cursor keys and is generally more convenient, as terminals usually
  49. don't have a convenient Meta key.
  50. Setting it to nil will allow as many multiple ESC, as is allowed by the
  51. major mode in effect."
  52. :type 'boolean
  53. :group 'viper)
  54. (defcustom viper-want-ctl-h-help nil
  55. "If non-nil, C-h gets bound to help-command; otherwise, C-h gets the usual Vi bindings."
  56. :type 'boolean
  57. :group 'viper)
  58. ;;; Keymaps
  59. ;; Keymaps for vital things like \e and C-z.
  60. ;; Not for users
  61. (defvar viper-vi-intercept-map (make-sparse-keymap))
  62. (defvar viper-insert-intercept-map (make-sparse-keymap))
  63. (defvar viper-emacs-intercept-map (make-sparse-keymap))
  64. ;; keymap used to zap all keymaps other than function-key-map,
  65. ;; device-function-key-map, etc.
  66. (defvar viper-overriding-map (make-sparse-keymap))
  67. (viper-deflocalvar viper-vi-local-user-map (make-sparse-keymap)
  68. "Keymap for user-defined local bindings.
  69. Useful for changing bindings such as ZZ in certain major modes.
  70. For instance, in letter-mode, one may want to bind ZZ to
  71. mh-send-letter. In a newsreader such as gnus, tin, or rn, ZZ could be bound
  72. to save-buffers-kill-emacs then post article, etc.")
  73. (put 'viper-vi-local-user-map 'permanent-local t)
  74. (defvar viper-vi-global-user-map (make-sparse-keymap)
  75. "Keymap for user-defined global bindings.
  76. These bindings are seen in all Viper buffers.")
  77. (defvar viper-vi-basic-map (make-keymap)
  78. "This is the main keymap in effect in Viper's Vi state.
  79. This map is global, shared by all buffers.")
  80. (defvar viper-vi-kbd-map (make-sparse-keymap)
  81. "This keymap keeps keyboard macros defined via the :map command.")
  82. (defvar viper-vi-diehard-map (make-sparse-keymap)
  83. "This keymap is in use when the user asks Viper to simulate Vi very closely.
  84. This happens when viper-expert-level is 1 or 2. See viper-set-expert-level.")
  85. (viper-deflocalvar viper-insert-local-user-map (make-sparse-keymap)
  86. "Auxiliary map for per-buffer user-defined keybindings in Insert state.")
  87. (put 'viper-insert-local-user-map 'permanent-local t)
  88. (defvar viper-insert-global-user-map (make-sparse-keymap)
  89. "Auxiliary map for global user-defined bindings in Insert state.")
  90. (defvar viper-insert-basic-map (make-sparse-keymap)
  91. "The basic insert-mode keymap.")
  92. (defvar viper-insert-diehard-map (make-keymap)
  93. "Map used when user wants vi-style keys in insert mode.
  94. Most of the Emacs keys are suppressed. This map overshadows
  95. viper-insert-basic-map. Not recommended, except for novice users.")
  96. (defvar viper-insert-kbd-map (make-sparse-keymap)
  97. "This keymap keeps VI-style kbd macros for insert mode.")
  98. (defvar viper-replace-map (make-sparse-keymap)
  99. "Map used in Viper's replace state.")
  100. (defvar viper-emacs-global-user-map (make-sparse-keymap)
  101. "Auxiliary map for global user-defined bindings in Emacs state.")
  102. (defvar viper-emacs-kbd-map (make-sparse-keymap)
  103. "This keymap keeps Vi-style kbd macros for Emacs mode.")
  104. (viper-deflocalvar viper-emacs-local-user-map (make-sparse-keymap)
  105. "Auxiliary map for local user-defined bindings in Emacs state.")
  106. (put 'viper-emacs-local-user-map 'permanent-local t)
  107. ;; This keymap should stay empty
  108. (defvar viper-empty-keymap (make-sparse-keymap))
  109. ;; This was the main Vi mode in old versions of VIP which may have been
  110. ;; extensively used by VIP users. We declare it as a global var and, after
  111. ;; viper-custom-file-name is loaded, we add this keymap to viper-vi-basic-map.
  112. (defvar viper-mode-map (make-sparse-keymap))
  113. ;; Some important keys used in viper
  114. (defcustom viper-toggle-key [(control ?z)] ; "\C-z"
  115. "The key used to change states from Emacs to Vi and back.
  116. In insert mode, this key also functions as Meta."
  117. :type 'key-sequence
  118. :group 'viper
  119. :set (lambda (symbol value)
  120. (let ((old-value (if (boundp 'viper-toggle-key)
  121. viper-toggle-key
  122. [(control ?z)])))
  123. (mapc
  124. (lambda (buf)
  125. (with-current-buffer buf
  126. (when (and (boundp 'viper-insert-basic-map)
  127. (keymapp viper-insert-basic-map))
  128. (when old-value
  129. (define-key viper-insert-basic-map old-value nil))
  130. (define-key viper-insert-basic-map value 'viper-escape-to-vi))
  131. (when (and (boundp 'viper-vi-intercept-map)
  132. (keymapp viper-vi-intercept-map))
  133. (when old-value
  134. (define-key viper-vi-intercept-map old-value nil))
  135. (define-key
  136. viper-vi-intercept-map value 'viper-toggle-key-action))
  137. (when (and (boundp 'viper-emacs-intercept-map)
  138. (keymapp viper-emacs-intercept-map))
  139. (define-key viper-emacs-intercept-map old-value nil)
  140. (define-key
  141. viper-emacs-intercept-map value 'viper-change-state-to-vi))
  142. ))
  143. (buffer-list))
  144. (set-default symbol value)
  145. )))
  146. (defcustom viper-quoted-insert-key "\C-v"
  147. "The key used to quote special characters when inserting them in Insert state."
  148. :type 'string
  149. :group 'viper)
  150. (defconst viper-ESC-key [escape]
  151. "Key used to ESC.")
  152. ;;; Variables used by minor modes
  153. ;; Association list of the form
  154. ;; ((major-mode . keymap) (major-mode . keymap) ...)
  155. ;; Viper uses these keymaps to make user-requested adjustments
  156. ;; to its Vi state in various major modes.")
  157. (defvar viper-vi-state-modifier-alist nil)
  158. ;; Association list of the form
  159. ;; ((major-mode . keymap) (major-mode . keymap) ...)
  160. ;; Viper uses these keymaps to make user-requested adjustments
  161. ;; to its Insert state in various major modes.")
  162. (defvar viper-insert-state-modifier-alist nil)
  163. ;; Association list of the form
  164. ;; ((major-mode . keymap) (major-mode . keymap) ...)
  165. ;; Viper uses these keymaps to make user-requested adjustments
  166. ;; to its Emacs state in various major modes.
  167. (defvar viper-emacs-state-modifier-alist nil)
  168. ;; The list of viper keymaps. Set by viper-normalize-minor-mode-map-alist
  169. (viper-deflocalvar viper--key-maps nil)
  170. (viper-deflocalvar viper--intercept-key-maps nil)
  171. ;; Tells viper-add-local-keys to create a new viper-vi-local-user-map for new
  172. ;; buffers. Not a user option.
  173. (viper-deflocalvar viper-need-new-vi-local-map t "")
  174. (put 'viper-need-new-vi-local-map 'permanent-local t)
  175. ;; Tells viper-add-local-keys to create a new viper-insert-local-user-map for
  176. ;; new buffers. Not a user option.
  177. (viper-deflocalvar viper-need-new-insert-local-map t "")
  178. (put 'viper-need-new-insert-local-map 'permanent-local t)
  179. ;; Tells viper-add-local-keys to create a new viper-emacs-local-user-map for
  180. ;; new buffers. Not a user option.
  181. (viper-deflocalvar viper-need-new-emacs-local-map t "")
  182. (put 'viper-need-new-emacs-local-map 'permanent-local t)
  183. ;; Insert mode keymap
  184. ;; for novice users, pretend you are the real vi.
  185. (define-key viper-insert-diehard-map "\t" 'viper-insert-tab)
  186. (define-key viper-insert-diehard-map "\C-a" 'self-insert-command)
  187. (define-key viper-insert-diehard-map "\C-b" 'self-insert-command)
  188. (define-key viper-insert-diehard-map "\C-c" 'viper-change-state-to-vi)
  189. (define-key viper-insert-diehard-map "\C-e" 'self-insert-command)
  190. (define-key viper-insert-diehard-map "\C-f" 'self-insert-command)
  191. (define-key viper-insert-diehard-map "\C-g" 'self-insert-command)
  192. (define-key viper-insert-diehard-map "\C-i" 'self-insert-command)
  193. (define-key viper-insert-diehard-map "\C-k" 'self-insert-command)
  194. (define-key viper-insert-diehard-map "\C-l" 'self-insert-command)
  195. (define-key viper-insert-diehard-map "\C-n" 'self-insert-command)
  196. (define-key viper-insert-diehard-map "\C-o" 'self-insert-command)
  197. (define-key viper-insert-diehard-map "\C-p" 'self-insert-command)
  198. (define-key viper-insert-diehard-map "\C-q" 'self-insert-command)
  199. (define-key viper-insert-diehard-map "\C-r" 'self-insert-command)
  200. (define-key viper-insert-diehard-map "\C-s" 'self-insert-command)
  201. (define-key viper-insert-diehard-map "\C-u" 'viper-erase-line)
  202. (define-key viper-insert-diehard-map "\C-x" 'self-insert-command)
  203. (define-key viper-insert-diehard-map "\C-y" 'self-insert-command)
  204. (define-key viper-insert-diehard-map "\C-z" 'self-insert-command)
  205. (define-key viper-insert-diehard-map "\C-]" 'self-insert-command)
  206. (define-key viper-insert-diehard-map "\C-_" 'self-insert-command)
  207. (let ((i ?\ ))
  208. (while (<= i ?~)
  209. (define-key viper-insert-diehard-map (make-string 1 i) 'self-insert-command)
  210. (setq i (1+ i))))
  211. ;; Insert mode map when user wants emacs style
  212. (define-key viper-insert-basic-map "\C-d" 'viper-backward-indent)
  213. (define-key viper-insert-basic-map "\C-w" 'viper-delete-backward-word)
  214. (define-key viper-insert-basic-map "\C-t" 'viper-forward-indent)
  215. (define-key viper-insert-basic-map viper-quoted-insert-key 'quoted-insert)
  216. (define-key viper-insert-basic-map "\C-?" 'viper-del-backward-char-in-insert)
  217. (define-key viper-insert-basic-map [backspace] 'viper-del-backward-char-in-insert)
  218. (define-key viper-insert-basic-map "\C-\\" 'viper-alternate-Meta-key)
  219. (define-key viper-insert-basic-map viper-toggle-key 'viper-escape-to-vi)
  220. (define-key viper-insert-basic-map "\C-c\M-p"
  221. 'viper-insert-prev-from-insertion-ring)
  222. (define-key viper-insert-basic-map "\C-c\M-n"
  223. 'viper-insert-next-from-insertion-ring)
  224. ;; Replace keymap
  225. (define-key viper-replace-map "\C-t" 'viper-forward-indent)
  226. (define-key viper-replace-map "\C-j" 'viper-replace-state-carriage-return)
  227. (define-key viper-replace-map "\C-m" 'viper-replace-state-carriage-return)
  228. (define-key viper-replace-map "\C-?" 'viper-del-backward-char-in-replace)
  229. (define-key viper-replace-map [backspace] 'viper-del-backward-char-in-replace)
  230. ;; Vi keymaps
  231. (define-key viper-vi-basic-map "\C-^" (lambda ()
  232. (interactive) (viper-ex nil "e#")))
  233. (define-key viper-vi-basic-map "\C-b" 'viper-scroll-screen-back)
  234. (define-key viper-vi-basic-map "\C-d" 'viper-scroll-up)
  235. (define-key viper-vi-basic-map "\C-e" 'viper-scroll-up-one)
  236. (define-key viper-vi-basic-map "\C-f" 'viper-scroll-screen)
  237. (define-key viper-vi-basic-map "\C-m" 'viper-next-line-at-bol)
  238. (define-key viper-vi-basic-map "\C-u" 'viper-scroll-down)
  239. (define-key viper-vi-basic-map "\C-y" 'viper-scroll-down-one)
  240. ;;(define-key viper-vi-basic-map "\C-s" 'viper-isearch-forward)
  241. ;;(define-key viper-vi-basic-map "\C-r" 'viper-isearch-backward)
  242. (define-key viper-vi-basic-map "\C-c/" 'viper-toggle-search-style)
  243. (define-key viper-vi-basic-map "\C-c\C-g" 'viper-info-on-file)
  244. (define-key viper-vi-basic-map "\C-c\M-p" 'viper-prev-destructive-command)
  245. (define-key viper-vi-basic-map "\C-c\M-n" 'viper-next-destructive-command)
  246. (define-key viper-vi-basic-map " " 'viper-forward-char)
  247. (define-key viper-vi-basic-map "!" 'viper-command-argument)
  248. (define-key viper-vi-basic-map "\"" 'viper-command-argument)
  249. (define-key viper-vi-basic-map "#" 'viper-command-argument)
  250. (define-key viper-vi-basic-map "$" 'viper-goto-eol)
  251. (define-key viper-vi-basic-map "%" 'viper-paren-match)
  252. (define-key viper-vi-basic-map "&" (lambda ()
  253. (interactive) (viper-ex nil "&")))
  254. (define-key viper-vi-basic-map "'" 'viper-goto-mark-and-skip-white)
  255. (define-key viper-vi-basic-map "(" 'viper-backward-sentence)
  256. (define-key viper-vi-basic-map ")" 'viper-forward-sentence)
  257. (define-key viper-vi-basic-map "*" 'call-last-kbd-macro)
  258. (define-key viper-vi-basic-map "+" 'viper-next-line-at-bol)
  259. (define-key viper-vi-basic-map "," 'viper-repeat-find-opposite)
  260. (define-key viper-vi-basic-map "-" 'viper-previous-line-at-bol)
  261. (define-key viper-vi-basic-map "." 'viper-repeat)
  262. (define-key viper-vi-basic-map "/" 'viper-search-forward)
  263. (define-key viper-vi-basic-map "0" 'viper-beginning-of-line)
  264. (define-key viper-vi-basic-map "1" 'viper-digit-argument)
  265. (define-key viper-vi-basic-map "2" 'viper-digit-argument)
  266. (define-key viper-vi-basic-map "3" 'viper-digit-argument)
  267. (define-key viper-vi-basic-map "4" 'viper-digit-argument)
  268. (define-key viper-vi-basic-map "5" 'viper-digit-argument)
  269. (define-key viper-vi-basic-map "6" 'viper-digit-argument)
  270. (define-key viper-vi-basic-map "7" 'viper-digit-argument)
  271. (define-key viper-vi-basic-map "8" 'viper-digit-argument)
  272. (define-key viper-vi-basic-map "9" 'viper-digit-argument)
  273. (define-key viper-vi-basic-map ":" 'viper-ex)
  274. (define-key viper-vi-basic-map ";" 'viper-repeat-find)
  275. (define-key viper-vi-basic-map "<" 'viper-command-argument)
  276. (define-key viper-vi-basic-map "=" 'viper-command-argument)
  277. (define-key viper-vi-basic-map ">" 'viper-command-argument)
  278. (define-key viper-vi-basic-map "?" 'viper-search-backward)
  279. (define-key viper-vi-basic-map "@" 'viper-register-macro)
  280. (define-key viper-vi-basic-map "A" 'viper-Append)
  281. (define-key viper-vi-basic-map "B" 'viper-backward-Word)
  282. (define-key viper-vi-basic-map "C" 'viper-change-to-eol)
  283. (define-key viper-vi-basic-map "D" 'viper-kill-line)
  284. (define-key viper-vi-basic-map "E" 'viper-end-of-Word)
  285. (define-key viper-vi-basic-map "F" 'viper-find-char-backward)
  286. (define-key viper-vi-basic-map "G" 'viper-goto-line)
  287. (define-key viper-vi-basic-map "H" 'viper-window-top)
  288. (define-key viper-vi-basic-map "I" 'viper-Insert)
  289. (define-key viper-vi-basic-map "J" 'viper-join-lines)
  290. (define-key viper-vi-basic-map "K" 'viper-nil)
  291. (define-key viper-vi-basic-map "L" 'viper-window-bottom)
  292. (define-key viper-vi-basic-map "M" 'viper-window-middle)
  293. (define-key viper-vi-basic-map "N" 'viper-search-Next)
  294. (define-key viper-vi-basic-map "O" 'viper-Open-line)
  295. (define-key viper-vi-basic-map "P" 'viper-Put-back)
  296. (define-key viper-vi-basic-map "Q" 'viper-query-replace)
  297. (define-key viper-vi-basic-map "R" 'viper-overwrite)
  298. (define-key viper-vi-basic-map "S" 'viper-substitute-line)
  299. (define-key viper-vi-basic-map "T" 'viper-goto-char-backward)
  300. (define-key viper-vi-basic-map "U" 'viper-undo)
  301. (define-key viper-vi-basic-map "V" 'find-file-other-window)
  302. (define-key viper-vi-basic-map "W" 'viper-forward-Word)
  303. (define-key viper-vi-basic-map "X" 'viper-delete-backward-char)
  304. (define-key viper-vi-basic-map "Y" 'viper-yank-line)
  305. (define-key viper-vi-basic-map "ZZ" 'viper-save-kill-buffer)
  306. (define-key viper-vi-basic-map "\\" 'viper-escape-to-emacs)
  307. (define-key viper-vi-basic-map "[" 'viper-brac-function)
  308. (define-key viper-vi-basic-map "]" 'viper-ket-function)
  309. (define-key viper-vi-basic-map "\C-\\" 'viper-alternate-Meta-key)
  310. (define-key viper-vi-basic-map "^" 'viper-bol-and-skip-white)
  311. (define-key viper-vi-basic-map "`" 'viper-goto-mark)
  312. (define-key viper-vi-basic-map "a" 'viper-append)
  313. (define-key viper-vi-basic-map "b" 'viper-backward-word)
  314. (define-key viper-vi-basic-map "c" 'viper-command-argument)
  315. (define-key viper-vi-basic-map "d" 'viper-command-argument)
  316. (define-key viper-vi-basic-map "e" 'viper-end-of-word)
  317. (define-key viper-vi-basic-map "f" 'viper-find-char-forward)
  318. (define-key viper-vi-basic-map "g" 'viper-nil)
  319. (define-key viper-vi-basic-map "h" 'viper-backward-char)
  320. (define-key viper-vi-basic-map [backspace] 'viper-backward-char)
  321. (define-key viper-vi-basic-map "i" 'viper-insert)
  322. (define-key viper-vi-basic-map "j" 'viper-next-line)
  323. (define-key viper-vi-basic-map "k" 'viper-previous-line)
  324. (define-key viper-vi-basic-map "l" 'viper-forward-char)
  325. (define-key viper-vi-basic-map "m" 'viper-mark-point)
  326. (define-key viper-vi-basic-map "n" 'viper-search-next)
  327. (define-key viper-vi-basic-map "o" 'viper-open-line)
  328. (define-key viper-vi-basic-map "p" 'viper-put-back)
  329. (define-key viper-vi-basic-map "q" 'viper-nil)
  330. (define-key viper-vi-basic-map "r" 'viper-replace-char)
  331. (define-key viper-vi-basic-map "s" 'viper-substitute)
  332. (define-key viper-vi-basic-map "t" 'viper-goto-char-forward)
  333. (define-key viper-vi-basic-map "u" 'viper-undo)
  334. (define-key viper-vi-basic-map "v" 'find-file)
  335. (define-key viper-vi-basic-map "\C-v" 'find-file-other-frame)
  336. (define-key viper-vi-basic-map "w" 'viper-forward-word)
  337. (define-key viper-vi-basic-map "x" 'viper-delete-char)
  338. (define-key viper-vi-basic-map "y" 'viper-command-argument)
  339. (define-key viper-vi-basic-map "zH" 'viper-line-to-top)
  340. (define-key viper-vi-basic-map "zM" 'viper-line-to-middle)
  341. (define-key viper-vi-basic-map "zL" 'viper-line-to-bottom)
  342. (define-key viper-vi-basic-map "z\C-m" 'viper-line-to-top)
  343. (define-key viper-vi-basic-map "z." 'viper-line-to-middle)
  344. (define-key viper-vi-basic-map "z-" 'viper-line-to-bottom)
  345. (define-key viper-vi-basic-map "{" 'viper-backward-paragraph)
  346. (define-key viper-vi-basic-map "|" 'viper-goto-col)
  347. (define-key viper-vi-basic-map "}" 'viper-forward-paragraph)
  348. (define-key viper-vi-basic-map "~" 'viper-toggle-case)
  349. (define-key viper-vi-basic-map "\C-?" 'viper-backward-char)
  350. (define-key viper-vi-basic-map "_" 'viper-nil)
  351. ;;; This is viper-vi-diehard-map. Used when viper-vi-diehard-minor-mode is on.
  352. (define-key viper-vi-diehard-map "\C-a" 'viper-nil)
  353. (define-key viper-vi-diehard-map "\C-c" 'viper-nil)
  354. (define-key viper-vi-diehard-map "\C-g" 'viper-info-on-file)
  355. (define-key viper-vi-diehard-map "\C-i" 'viper-nil)
  356. (define-key viper-vi-diehard-map "\C-k" 'viper-nil)
  357. (define-key viper-vi-diehard-map "\C-l" 'redraw-display)
  358. (define-key viper-vi-diehard-map "\C-n" 'viper-next-line)
  359. (define-key viper-vi-diehard-map "\C-o" 'viper-nil)
  360. (define-key viper-vi-diehard-map "\C-p" 'viper-previous-line)
  361. (define-key viper-vi-diehard-map "\C-q" 'viper-nil)
  362. (define-key viper-vi-diehard-map "\C-r" 'redraw-display)
  363. (define-key viper-vi-diehard-map "\C-s" 'viper-nil)
  364. (define-key viper-vi-diehard-map "\C-t" 'viper-nil)
  365. (define-key viper-vi-diehard-map "\C-v" 'viper-nil)
  366. (define-key viper-vi-diehard-map "\C-w" 'viper-nil)
  367. (define-key viper-vi-diehard-map "@" 'viper-nil)
  368. (define-key viper-vi-diehard-map "_" 'viper-nil)
  369. (define-key viper-vi-diehard-map "*" 'viper-nil)
  370. (define-key viper-vi-diehard-map "#" 'viper-nil)
  371. (define-key viper-vi-diehard-map "\C-_" 'viper-nil)
  372. (define-key viper-vi-diehard-map "\C-]" 'viper-nil) ; This is actually tags.
  373. ;;; Minibuffer keymap
  374. (defvar viper-minibuffer-map (make-sparse-keymap)
  375. "Keymap used to modify keys when Minibuffer is in Insert state.")
  376. (define-key viper-minibuffer-map "\C-m" 'viper-exit-minibuffer)
  377. (define-key viper-minibuffer-map "\C-j" 'viper-exit-minibuffer)
  378. ;; Map used to read Ex-style commands.
  379. (defvar viper-ex-cmd-map (make-sparse-keymap))
  380. (define-key viper-ex-cmd-map " " 'ex-cmd-read-exit)
  381. (define-key viper-ex-cmd-map "\t" 'ex-cmd-complete)
  382. ;; Keymap for reading file names in Ex-style commands.
  383. (defvar ex-read-filename-map (make-sparse-keymap))
  384. (define-key ex-read-filename-map " " 'viper-complete-filename-or-exit)
  385. (define-key ex-read-filename-map "!" 'viper-handle-!)
  386. ;; Some other maps
  387. (defvar viper-slash-and-colon-map (make-sparse-keymap)
  388. "This map redefines `/' and `:' to behave as in Vi.
  389. Useful in some modes, such as Gnus, MH, etc.")
  390. (define-key viper-slash-and-colon-map ":" 'viper-ex)
  391. (define-key viper-slash-and-colon-map "/" 'viper-search-forward)
  392. (defvar viper-comint-mode-modifier-map (make-sparse-keymap)
  393. "This map modifies comint mode.")
  394. (define-key viper-comint-mode-modifier-map "\C-m" 'viper-exec-key-in-emacs)
  395. (define-key viper-comint-mode-modifier-map "\C-d" 'viper-exec-key-in-emacs)
  396. (defvar viper-dired-modifier-map (make-sparse-keymap)
  397. "This map modifies Dired behavior.")
  398. (define-key viper-dired-modifier-map ":" 'viper-ex)
  399. (define-key viper-dired-modifier-map "/" 'viper-search-forward)
  400. (defvar viper-gnus-modifier-map (make-sparse-keymap)
  401. "This map modifies Gnus behavior.")
  402. (define-key viper-gnus-modifier-map ":" 'viper-ex)
  403. ;;; Code
  404. (defun viper-add-local-keys (state alist)
  405. "Override some vi-state or insert-state bindings in the current buffer.
  406. The effect is seen in the current buffer only.
  407. Useful for customizing mailer buffers, gnus, etc.
  408. STATE is `vi-state', `insert-state', or `emacs-state'.
  409. ALIST is of the form ((key . func) (key . func) ...)
  410. Normally, this would be called from a hook to a major mode or
  411. on a per buffer basis.
  412. Usage:
  413. (viper-add-local-keys state \\='((key-str . func) (key-str . func)...)) "
  414. (let (map)
  415. (cond ((eq state 'vi-state)
  416. (if viper-need-new-vi-local-map
  417. (setq viper-vi-local-user-map (make-sparse-keymap)))
  418. (setq viper-need-new-vi-local-map nil
  419. map viper-vi-local-user-map))
  420. ((eq state 'insert-state)
  421. (if viper-need-new-insert-local-map
  422. (setq viper-insert-local-user-map (make-sparse-keymap)))
  423. (setq viper-need-new-insert-local-map nil
  424. map viper-insert-local-user-map))
  425. ((eq state 'emacs-state)
  426. (if viper-need-new-emacs-local-map
  427. (setq viper-emacs-local-user-map (make-sparse-keymap)))
  428. (setq viper-need-new-emacs-local-map nil
  429. map viper-emacs-local-user-map))
  430. (t
  431. (error
  432. "Invalid state in viper-add-local-keys: %S. Valid states: vi-state, insert-state or emacs-state" state)))
  433. (viper-modify-keymap map alist)
  434. (viper-normalize-minor-mode-map-alist)
  435. (viper-set-mode-vars-for viper-current-state)))
  436. (defun viper-zap-local-keys ()
  437. "Unconditionally reset Viper viper-*-local-user-map's.
  438. Rarely useful, but if you made a mistake by switching to a mode that adds
  439. undesirable local keys, e.g., comint-mode, then this function can restore
  440. sanity."
  441. (interactive)
  442. (setq viper-vi-local-user-map (make-sparse-keymap)
  443. viper-need-new-vi-local-map nil
  444. viper-insert-local-user-map (make-sparse-keymap)
  445. viper-need-new-insert-local-map nil
  446. viper-emacs-local-user-map (make-sparse-keymap)
  447. viper-need-new-emacs-local-map nil)
  448. (viper-normalize-minor-mode-map-alist))
  449. (defun viper-modify-major-mode (mode state keymap)
  450. "Modify key bindings in a major-mode in a Viper state using a keymap.
  451. If the default for a major mode is emacs-state, then modifications to this
  452. major mode may not take effect until the buffer switches state to Vi,
  453. Insert or Emacs. If this happens, add viper-change-state-to-emacs to this
  454. major mode's hook. If no such hook exists, you may have to put an advice on
  455. the function that invokes the major mode. See viper-set-hooks for hints.
  456. The above needs not to be done for major modes that come up in Vi or Insert
  457. state by default.
  458. Arguments: (major-mode viper-state keymap)"
  459. (let ((alist
  460. (cond ((eq state 'vi-state) 'viper-vi-state-modifier-alist)
  461. ((eq state 'insert-state) 'viper-insert-state-modifier-alist)
  462. ((eq state 'emacs-state) 'viper-emacs-state-modifier-alist)))
  463. elt)
  464. (if (setq elt (assoc mode (eval alist)))
  465. (set alist (delq elt (eval alist))))
  466. (set alist (cons (cons mode keymap) (eval alist)))
  467. ;; Normalization usually doesn't help here, since one needs to
  468. ;; normalize in the actual buffer where changes to the keymap are
  469. ;; to take place. However, it doesn't hurt, and it helps whenever this
  470. ;; function is actually called from within the affected buffer.
  471. (viper-normalize-minor-mode-map-alist)
  472. (viper-set-mode-vars-for viper-current-state)))
  473. ;; Displays variables that control Viper's keymaps
  474. (defun viper-debug-keymaps ()
  475. (interactive)
  476. (with-output-to-temp-buffer " *viper-debug*"
  477. (princ (format "Buffer name: %s\n\n" (buffer-name)))
  478. (princ "Variables: \n")
  479. (princ (format "major-mode: %S\n" major-mode))
  480. (princ (format "viper-current-state: %S\n" viper-current-state))
  481. (princ (format "viper-mode-string: %S\n\n" viper-mode-string))
  482. (princ (format "viper-vi-intercept-minor-mode: %S\n"
  483. viper-vi-intercept-minor-mode))
  484. (princ (format "viper-insert-intercept-minor-mode: %S\n"
  485. viper-insert-intercept-minor-mode))
  486. (princ (format "viper-emacs-intercept-minor-mode: %S\n"
  487. viper-emacs-intercept-minor-mode))
  488. (princ (format "viper-vi-minibuffer-minor-mode: %S\n"
  489. viper-vi-minibuffer-minor-mode))
  490. (princ (format "viper-insert-minibuffer-minor-mode: %S\n\n"
  491. viper-insert-minibuffer-minor-mode))
  492. (princ (format "viper-vi-local-user-minor-mode: %S\n"
  493. viper-vi-local-user-minor-mode))
  494. (princ (format "viper-vi-global-user-minor-mode: %S\n"
  495. viper-vi-global-user-minor-mode))
  496. (princ (format "viper-vi-kbd-minor-mode: %S\n" viper-vi-kbd-minor-mode))
  497. (princ (format "viper-vi-state-modifier-minor-mode: %S\n"
  498. viper-vi-state-modifier-minor-mode))
  499. (princ (format "viper-vi-diehard-minor-mode: %S\n"
  500. viper-vi-diehard-minor-mode))
  501. (princ (format "viper-vi-basic-minor-mode: %S\n" viper-vi-basic-minor-mode))
  502. (princ (format "viper-replace-minor-mode: %S\n" viper-replace-minor-mode))
  503. (princ (format "viper-insert-local-user-minor-mode: %S\n"
  504. viper-insert-local-user-minor-mode))
  505. (princ (format "viper-insert-global-user-minor-mode: %S\n"
  506. viper-insert-global-user-minor-mode))
  507. (princ (format "viper-insert-kbd-minor-mode: %S\n"
  508. viper-insert-kbd-minor-mode))
  509. (princ (format "viper-insert-state-modifier-minor-mode: %S\n"
  510. viper-insert-state-modifier-minor-mode))
  511. (princ (format "viper-insert-diehard-minor-mode: %S\n"
  512. viper-insert-diehard-minor-mode))
  513. (princ (format "viper-insert-basic-minor-mode: %S\n"
  514. viper-insert-basic-minor-mode))
  515. (princ (format "viper-emacs-local-user-minor-mode: %S\n"
  516. viper-emacs-local-user-minor-mode))
  517. (princ (format "viper-emacs-kbd-minor-mode: %S\n"
  518. viper-emacs-kbd-minor-mode))
  519. (princ (format "viper-emacs-global-user-minor-mode: %S\n"
  520. viper-emacs-global-user-minor-mode))
  521. (princ (format "viper-emacs-state-modifier-minor-mode: %S\n"
  522. viper-emacs-state-modifier-minor-mode))
  523. (princ (format "\nviper-expert-level %S\n" viper-expert-level))
  524. (princ (format "viper-no-multiple-ESC %S\n" viper-no-multiple-ESC))
  525. (princ (format "viper-always %S\n" viper-always))
  526. (princ (format "viper-ex-style-motion %S\n"
  527. viper-ex-style-motion))
  528. (princ (format "viper-ex-style-editing %S\n"
  529. viper-ex-style-editing))
  530. (princ (format "viper-want-emacs-keys-in-vi %S\n"
  531. viper-want-emacs-keys-in-vi))
  532. (princ (format "viper-want-emacs-keys-in-insert %S\n"
  533. viper-want-emacs-keys-in-insert))
  534. (princ (format "viper-want-ctl-h-help %S\n" viper-want-ctl-h-help))
  535. (princ "\n\n\n")
  536. (princ (format "Default value for minor-mode-map-alist: \n%S\n\n"
  537. (default-value 'minor-mode-map-alist)))
  538. (princ (format "Actual value for minor-mode-map-alist: \n%S\n"
  539. minor-mode-map-alist))
  540. ))
  541. ;;; Keymap utils
  542. (defun viper-add-keymap (mapsrc mapdst)
  543. "Add contents of mapsrc to mapdst. It is assumed that mapsrc is sparse."
  544. (if (featurep 'xemacs)
  545. ;; Emacs 22 has map-keymap.
  546. (map-keymap (lambda (key binding) (define-key mapdst key binding))
  547. mapsrc)
  548. (mapc (lambda (p) (define-key mapdst (vector (car p)) (cdr p)))
  549. (cdr mapsrc))))
  550. (defun viper-modify-keymap (map alist)
  551. "Modifies MAP with bindings specified in the ALIST. The alist has the
  552. form ((key . function) (key . function) ... )."
  553. (mapcar (lambda (p) (define-key map (eval (car p)) (cdr p)))
  554. alist))
  555. (provide 'viper-keym)
  556. ;; Local Variables:
  557. ;; eval: (put 'viper-deflocalvar 'lisp-indent-hook 'defun)
  558. ;; End:
  559. ;;; viper-keym.el ends here