viper-keym.el 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  1. ;;; viper-keym.el --- Viper keymaps
  2. ;; Copyright (C) 1994-1997, 2000-2012 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 true, 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 viper-no-multiple-ESC to nil will allow as many multiple ESC,
  51. as is allowed by the 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
  111. ;; and, after .viper 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. Enter as a sexp. Examples: \"\\C-z\", [(control ?z)]."
  118. :type 'sexp
  119. :group 'viper
  120. :set (lambda (symbol value)
  121. (let ((old-value (if (boundp 'viper-toggle-key)
  122. viper-toggle-key
  123. [(control ?z)])))
  124. (mapc
  125. (lambda (buf)
  126. (with-current-buffer buf
  127. (when (and (boundp 'viper-insert-basic-map)
  128. (keymapp viper-insert-basic-map))
  129. (when old-value
  130. (define-key viper-insert-basic-map old-value nil))
  131. (define-key viper-insert-basic-map value 'viper-escape-to-vi))
  132. (when (and (boundp 'viper-vi-intercept-map)
  133. (keymapp viper-vi-intercept-map))
  134. (when old-value
  135. (define-key viper-vi-intercept-map old-value nil))
  136. (define-key
  137. viper-vi-intercept-map value 'viper-toggle-key-action))
  138. (when (and (boundp 'viper-emacs-intercept-map)
  139. (keymapp viper-emacs-intercept-map))
  140. (define-key viper-emacs-intercept-map old-value nil)
  141. (define-key
  142. viper-emacs-intercept-map value 'viper-change-state-to-vi))
  143. ))
  144. (buffer-list))
  145. (set-default symbol value)
  146. )))
  147. (defcustom viper-quoted-insert-key "\C-v"
  148. "The key used to quote special characters when inserting them in Insert state."
  149. :type 'string
  150. :group 'viper)
  151. (defvar viper-ESC-key (kbd "ESC")
  152. "Key used to ESC.")
  153. ;;; Variables used by minor modes
  154. ;; Association list of the form
  155. ;; ((major-mode . keymap) (major-mode . keymap) ...)
  156. ;; Viper uses these keymaps to make user-requested adjustments
  157. ;; to its Vi state in various major modes.")
  158. (defvar viper-vi-state-modifier-alist nil)
  159. ;; Association list of the form
  160. ;; ((major-mode . keymap) (major-mode . keymap) ...)
  161. ;; Viper uses these keymaps to make user-requested adjustments
  162. ;; to its Insert state in various major modes.")
  163. (defvar viper-insert-state-modifier-alist nil)
  164. ;; Association list of the form
  165. ;; ((major-mode . keymap) (major-mode . keymap) ...)
  166. ;; Viper uses these keymaps to make user-requested adjustments
  167. ;; to its Emacs state in various major modes.
  168. (defvar viper-emacs-state-modifier-alist nil)
  169. ;; The list of viper keymaps. Set by viper-normalize-minor-mode-map-alist
  170. (viper-deflocalvar viper--key-maps nil)
  171. (viper-deflocalvar viper--intercept-key-maps nil)
  172. ;; Tells viper-add-local-keys to create a new viper-vi-local-user-map for new
  173. ;; buffers. Not a user option.
  174. (viper-deflocalvar viper-need-new-vi-local-map t "")
  175. (put 'viper-need-new-vi-local-map 'permanent-local t)
  176. ;; Tells viper-add-local-keys to create a new viper-insert-local-user-map for
  177. ;; new buffers. Not a user option.
  178. (viper-deflocalvar viper-need-new-insert-local-map t "")
  179. (put 'viper-need-new-insert-local-map 'permanent-local t)
  180. ;; Tells viper-add-local-keys to create a new viper-emacs-local-user-map for
  181. ;; new buffers. Not a user option.
  182. (viper-deflocalvar viper-need-new-emacs-local-map t "")
  183. (put 'viper-need-new-emacs-local-map 'permanent-local t)
  184. ;; Insert mode keymap
  185. ;; for novice users, pretend you are the real vi.
  186. (define-key viper-insert-diehard-map "\t" 'viper-insert-tab)
  187. (define-key viper-insert-diehard-map "\C-a" 'self-insert-command)
  188. (define-key viper-insert-diehard-map "\C-b" 'self-insert-command)
  189. (define-key viper-insert-diehard-map "\C-c" 'viper-change-state-to-vi)
  190. (define-key viper-insert-diehard-map "\C-e" 'self-insert-command)
  191. (define-key viper-insert-diehard-map "\C-f" 'self-insert-command)
  192. (define-key viper-insert-diehard-map "\C-g" 'self-insert-command)
  193. (define-key viper-insert-diehard-map "\C-i" 'self-insert-command)
  194. (define-key viper-insert-diehard-map "\C-k" 'self-insert-command)
  195. (define-key viper-insert-diehard-map "\C-l" 'self-insert-command)
  196. (define-key viper-insert-diehard-map "\C-n" 'self-insert-command)
  197. (define-key viper-insert-diehard-map "\C-o" 'self-insert-command)
  198. (define-key viper-insert-diehard-map "\C-p" 'self-insert-command)
  199. (define-key viper-insert-diehard-map "\C-q" 'self-insert-command)
  200. (define-key viper-insert-diehard-map "\C-r" 'self-insert-command)
  201. (define-key viper-insert-diehard-map "\C-s" 'self-insert-command)
  202. (define-key viper-insert-diehard-map "\C-u" 'viper-erase-line)
  203. (define-key viper-insert-diehard-map "\C-x" 'self-insert-command)
  204. (define-key viper-insert-diehard-map "\C-y" 'self-insert-command)
  205. (define-key viper-insert-diehard-map "\C-z" 'self-insert-command)
  206. (define-key viper-insert-diehard-map "\C-]" 'self-insert-command)
  207. (define-key viper-insert-diehard-map "\C-_" 'self-insert-command)
  208. (let ((i ?\ ))
  209. (while (<= i ?~)
  210. (define-key viper-insert-diehard-map (make-string 1 i) 'self-insert-command)
  211. (setq i (1+ i))))
  212. ;; Insert mode map when user wants emacs style
  213. (define-key viper-insert-basic-map "\C-d" 'viper-backward-indent)
  214. (define-key viper-insert-basic-map "\C-w" 'viper-delete-backward-word)
  215. (define-key viper-insert-basic-map "\C-t" 'viper-forward-indent)
  216. (define-key viper-insert-basic-map viper-quoted-insert-key 'quoted-insert)
  217. (define-key viper-insert-basic-map "\C-?" 'viper-del-backward-char-in-insert)
  218. (define-key viper-insert-basic-map [backspace] 'viper-del-backward-char-in-insert)
  219. (define-key viper-insert-basic-map "\C-\\" 'viper-alternate-Meta-key)
  220. (define-key viper-insert-basic-map viper-toggle-key 'viper-escape-to-vi)
  221. (define-key viper-insert-basic-map "\C-c\M-p"
  222. 'viper-insert-prev-from-insertion-ring)
  223. (define-key viper-insert-basic-map "\C-c\M-n"
  224. 'viper-insert-next-from-insertion-ring)
  225. ;; Replace keymap
  226. (define-key viper-replace-map "\C-t" 'viper-forward-indent)
  227. (define-key viper-replace-map "\C-j" 'viper-replace-state-carriage-return)
  228. (define-key viper-replace-map "\C-m" 'viper-replace-state-carriage-return)
  229. (define-key viper-replace-map "\C-?" 'viper-del-backward-char-in-replace)
  230. (define-key viper-replace-map [backspace] 'viper-del-backward-char-in-replace)
  231. ;; Vi keymaps
  232. (define-key viper-vi-basic-map "\C-^" (lambda ()
  233. (interactive) (viper-ex nil "e#")))
  234. (define-key viper-vi-basic-map "\C-b" 'viper-scroll-screen-back)
  235. (define-key viper-vi-basic-map "\C-d" 'viper-scroll-up)
  236. (define-key viper-vi-basic-map "\C-e" 'viper-scroll-up-one)
  237. (define-key viper-vi-basic-map "\C-f" 'viper-scroll-screen)
  238. (define-key viper-vi-basic-map "\C-m" 'viper-next-line-at-bol)
  239. (define-key viper-vi-basic-map "\C-u" 'viper-scroll-down)
  240. (define-key viper-vi-basic-map "\C-y" 'viper-scroll-down-one)
  241. ;;(define-key viper-vi-basic-map "\C-s" 'viper-isearch-forward)
  242. ;;(define-key viper-vi-basic-map "\C-r" 'viper-isearch-backward)
  243. (define-key viper-vi-basic-map "\C-c/" 'viper-toggle-search-style)
  244. (define-key viper-vi-basic-map "\C-c\C-g" 'viper-info-on-file)
  245. (define-key viper-vi-basic-map "\C-c\M-p" 'viper-prev-destructive-command)
  246. (define-key viper-vi-basic-map "\C-c\M-n" 'viper-next-destructive-command)
  247. (define-key viper-vi-basic-map " " 'viper-forward-char)
  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-command-argument)
  251. (define-key viper-vi-basic-map "$" 'viper-goto-eol)
  252. (define-key viper-vi-basic-map "%" 'viper-paren-match)
  253. (define-key viper-vi-basic-map "&" (lambda ()
  254. (interactive) (viper-ex nil "&")))
  255. (define-key viper-vi-basic-map "'" 'viper-goto-mark-and-skip-white)
  256. (define-key viper-vi-basic-map "(" 'viper-backward-sentence)
  257. (define-key viper-vi-basic-map ")" 'viper-forward-sentence)
  258. (define-key viper-vi-basic-map "*" 'call-last-kbd-macro)
  259. (define-key viper-vi-basic-map "+" 'viper-next-line-at-bol)
  260. (define-key viper-vi-basic-map "," 'viper-repeat-find-opposite)
  261. (define-key viper-vi-basic-map "-" 'viper-previous-line-at-bol)
  262. (define-key viper-vi-basic-map "." 'viper-repeat)
  263. (define-key viper-vi-basic-map "/" 'viper-search-forward)
  264. (define-key viper-vi-basic-map "0" 'viper-beginning-of-line)
  265. (define-key viper-vi-basic-map "1" 'viper-digit-argument)
  266. (define-key viper-vi-basic-map "2" 'viper-digit-argument)
  267. (define-key viper-vi-basic-map "3" 'viper-digit-argument)
  268. (define-key viper-vi-basic-map "4" 'viper-digit-argument)
  269. (define-key viper-vi-basic-map "5" 'viper-digit-argument)
  270. (define-key viper-vi-basic-map "6" 'viper-digit-argument)
  271. (define-key viper-vi-basic-map "7" 'viper-digit-argument)
  272. (define-key viper-vi-basic-map "8" 'viper-digit-argument)
  273. (define-key viper-vi-basic-map "9" 'viper-digit-argument)
  274. (define-key viper-vi-basic-map ":" 'viper-ex)
  275. (define-key viper-vi-basic-map ";" 'viper-repeat-find)
  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-command-argument)
  279. (define-key viper-vi-basic-map "?" 'viper-search-backward)
  280. (define-key viper-vi-basic-map "@" 'viper-register-macro)
  281. (define-key viper-vi-basic-map "A" 'viper-Append)
  282. (define-key viper-vi-basic-map "B" 'viper-backward-Word)
  283. (define-key viper-vi-basic-map "C" 'viper-change-to-eol)
  284. (define-key viper-vi-basic-map "D" 'viper-kill-line)
  285. (define-key viper-vi-basic-map "E" 'viper-end-of-Word)
  286. (define-key viper-vi-basic-map "F" 'viper-find-char-backward)
  287. (define-key viper-vi-basic-map "G" 'viper-goto-line)
  288. (define-key viper-vi-basic-map "H" 'viper-window-top)
  289. (define-key viper-vi-basic-map "I" 'viper-Insert)
  290. (define-key viper-vi-basic-map "J" 'viper-join-lines)
  291. (define-key viper-vi-basic-map "K" 'viper-nil)
  292. (define-key viper-vi-basic-map "L" 'viper-window-bottom)
  293. (define-key viper-vi-basic-map "M" 'viper-window-middle)
  294. (define-key viper-vi-basic-map "N" 'viper-search-Next)
  295. (define-key viper-vi-basic-map "O" 'viper-Open-line)
  296. (define-key viper-vi-basic-map "P" 'viper-Put-back)
  297. (define-key viper-vi-basic-map "Q" 'viper-query-replace)
  298. (define-key viper-vi-basic-map "R" 'viper-overwrite)
  299. (define-key viper-vi-basic-map "S" 'viper-substitute-line)
  300. (define-key viper-vi-basic-map "T" 'viper-goto-char-backward)
  301. (define-key viper-vi-basic-map "U" 'viper-undo)
  302. (define-key viper-vi-basic-map "V" 'find-file-other-window)
  303. (define-key viper-vi-basic-map "W" 'viper-forward-Word)
  304. (define-key viper-vi-basic-map "X" 'viper-delete-backward-char)
  305. (define-key viper-vi-basic-map "Y" 'viper-yank-line)
  306. (define-key viper-vi-basic-map "ZZ" 'viper-save-kill-buffer)
  307. (define-key viper-vi-basic-map "\\" 'viper-escape-to-emacs)
  308. (define-key viper-vi-basic-map "[" 'viper-brac-function)
  309. (define-key viper-vi-basic-map "]" 'viper-ket-function)
  310. (define-key viper-vi-basic-map "\C-\\" 'viper-alternate-Meta-key)
  311. (define-key viper-vi-basic-map "^" 'viper-bol-and-skip-white)
  312. (define-key viper-vi-basic-map "`" 'viper-goto-mark)
  313. (define-key viper-vi-basic-map "a" 'viper-append)
  314. (define-key viper-vi-basic-map "b" 'viper-backward-word)
  315. (define-key viper-vi-basic-map "c" 'viper-command-argument)
  316. (define-key viper-vi-basic-map "d" 'viper-command-argument)
  317. (define-key viper-vi-basic-map "e" 'viper-end-of-word)
  318. (define-key viper-vi-basic-map "f" 'viper-find-char-forward)
  319. (define-key viper-vi-basic-map "g" 'viper-nil)
  320. (define-key viper-vi-basic-map "h" 'viper-backward-char)
  321. (define-key viper-vi-basic-map [backspace] 'viper-backward-char)
  322. (define-key viper-vi-basic-map "i" 'viper-insert)
  323. (define-key viper-vi-basic-map "j" 'viper-next-line)
  324. (define-key viper-vi-basic-map "k" 'viper-previous-line)
  325. (define-key viper-vi-basic-map "l" 'viper-forward-char)
  326. (define-key viper-vi-basic-map "m" 'viper-mark-point)
  327. (define-key viper-vi-basic-map "n" 'viper-search-next)
  328. (define-key viper-vi-basic-map "o" 'viper-open-line)
  329. (define-key viper-vi-basic-map "p" 'viper-put-back)
  330. (define-key viper-vi-basic-map "q" 'viper-nil)
  331. (define-key viper-vi-basic-map "r" 'viper-replace-char)
  332. (define-key viper-vi-basic-map "s" 'viper-substitute)
  333. (define-key viper-vi-basic-map "t" 'viper-goto-char-forward)
  334. (define-key viper-vi-basic-map "u" 'viper-undo)
  335. (define-key viper-vi-basic-map "v" 'find-file)
  336. (define-key viper-vi-basic-map "\C-v" 'find-file-other-frame)
  337. (define-key viper-vi-basic-map "w" 'viper-forward-word)
  338. (define-key viper-vi-basic-map "x" 'viper-delete-char)
  339. (define-key viper-vi-basic-map "y" 'viper-command-argument)
  340. (define-key viper-vi-basic-map "zH" 'viper-line-to-top)
  341. (define-key viper-vi-basic-map "zM" 'viper-line-to-middle)
  342. (define-key viper-vi-basic-map "zL" 'viper-line-to-bottom)
  343. (define-key viper-vi-basic-map "z\C-m" 'viper-line-to-top)
  344. (define-key viper-vi-basic-map "z." 'viper-line-to-middle)
  345. (define-key viper-vi-basic-map "z-" 'viper-line-to-bottom)
  346. (define-key viper-vi-basic-map "{" 'viper-backward-paragraph)
  347. (define-key viper-vi-basic-map "|" 'viper-goto-col)
  348. (define-key viper-vi-basic-map "}" 'viper-forward-paragraph)
  349. (define-key viper-vi-basic-map "~" 'viper-toggle-case)
  350. (define-key viper-vi-basic-map "\C-?" 'viper-backward-char)
  351. (define-key viper-vi-basic-map "_" 'viper-nil)
  352. ;;; This is viper-vi-diehard-map. Used when viper-vi-diehard-minor-mode is on.
  353. (define-key viper-vi-diehard-map "\C-a" 'viper-nil)
  354. (define-key viper-vi-diehard-map "\C-c" 'viper-nil)
  355. (define-key viper-vi-diehard-map "\C-g" 'viper-info-on-file)
  356. (define-key viper-vi-diehard-map "\C-i" 'viper-nil)
  357. (define-key viper-vi-diehard-map "\C-k" 'viper-nil)
  358. (define-key viper-vi-diehard-map "\C-l" 'redraw-display)
  359. (define-key viper-vi-diehard-map "\C-n" 'viper-next-line)
  360. (define-key viper-vi-diehard-map "\C-o" 'viper-nil)
  361. (define-key viper-vi-diehard-map "\C-p" 'viper-previous-line)
  362. (define-key viper-vi-diehard-map "\C-q" 'viper-nil)
  363. (define-key viper-vi-diehard-map "\C-r" 'redraw-display)
  364. (define-key viper-vi-diehard-map "\C-s" 'viper-nil)
  365. (define-key viper-vi-diehard-map "\C-t" 'viper-nil)
  366. (define-key viper-vi-diehard-map "\C-v" 'viper-nil)
  367. (define-key viper-vi-diehard-map "\C-w" '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 "#" 'viper-nil)
  372. (define-key viper-vi-diehard-map "\C-_" 'viper-nil)
  373. (define-key viper-vi-diehard-map "\C-]" 'viper-nil) ; This is actually tags.
  374. ;;; Minibuffer keymap
  375. (defvar viper-minibuffer-map (make-sparse-keymap)
  376. "Keymap used to modify keys when Minibuffer is in Insert state.")
  377. (define-key viper-minibuffer-map "\C-m" 'viper-exit-minibuffer)
  378. (define-key viper-minibuffer-map "\C-j" 'viper-exit-minibuffer)
  379. ;; Map used to read Ex-style commands.
  380. (defvar viper-ex-cmd-map (make-sparse-keymap))
  381. (define-key viper-ex-cmd-map " " 'ex-cmd-read-exit)
  382. (define-key viper-ex-cmd-map "\t" 'ex-cmd-complete)
  383. ;; Keymap for reading file names in Ex-style commands.
  384. (defvar ex-read-filename-map (make-sparse-keymap))
  385. (define-key ex-read-filename-map " " 'viper-complete-filename-or-exit)
  386. (define-key ex-read-filename-map "!" 'viper-handle-!)
  387. ;; Some other maps
  388. (defvar viper-slash-and-colon-map (make-sparse-keymap)
  389. "This map redefines `/' and `:' to behave as in Vi.
  390. Useful in some modes, such as Gnus, MH, etc.")
  391. (define-key viper-slash-and-colon-map ":" 'viper-ex)
  392. (define-key viper-slash-and-colon-map "/" 'viper-search-forward)
  393. (defvar viper-comint-mode-modifier-map (make-sparse-keymap)
  394. "This map modifies comint mode.")
  395. (define-key viper-comint-mode-modifier-map "\C-m" 'viper-exec-key-in-emacs)
  396. (define-key viper-comint-mode-modifier-map "\C-d" 'viper-exec-key-in-emacs)
  397. (defvar viper-dired-modifier-map (make-sparse-keymap)
  398. "This map modifies Dired behavior.")
  399. (define-key viper-dired-modifier-map ":" 'viper-ex)
  400. (define-key viper-dired-modifier-map "/" 'viper-search-forward)
  401. (defvar viper-gnus-modifier-map (make-sparse-keymap)
  402. "This map modifies Gnus behavior.")
  403. (define-key viper-gnus-modifier-map ":" 'viper-ex)
  404. ;;; Code
  405. (defun viper-add-local-keys (state alist)
  406. "Override some vi-state or insert-state bindings in the current buffer.
  407. The effect is seen in the current buffer only.
  408. Useful for customizing mailer buffers, gnus, etc.
  409. STATE is 'vi-state, 'insert-state, or 'emacs-state
  410. ALIST is of the form ((key . func) (key . func) ...)
  411. Normally, this would be called from a hook to a major mode or
  412. on a per buffer basis.
  413. Usage:
  414. (viper-add-local-keys state '((key-str . func) (key-str . func)...)) "
  415. (let (map)
  416. (cond ((eq state 'vi-state)
  417. (if viper-need-new-vi-local-map
  418. (setq viper-vi-local-user-map (make-sparse-keymap)))
  419. (setq viper-need-new-vi-local-map nil
  420. map viper-vi-local-user-map))
  421. ((eq state 'insert-state)
  422. (if viper-need-new-insert-local-map
  423. (setq viper-insert-local-user-map (make-sparse-keymap)))
  424. (setq viper-need-new-insert-local-map nil
  425. map viper-insert-local-user-map))
  426. ((eq state 'emacs-state)
  427. (if viper-need-new-emacs-local-map
  428. (setq viper-emacs-local-user-map (make-sparse-keymap)))
  429. (setq viper-need-new-emacs-local-map nil
  430. map viper-emacs-local-user-map))
  431. (t
  432. (error
  433. "Invalid state in viper-add-local-keys: %S. Valid states: vi-state, insert-state or emacs-state" state)))
  434. (viper-modify-keymap map alist)
  435. (viper-normalize-minor-mode-map-alist)
  436. (viper-set-mode-vars-for viper-current-state)))
  437. (defun viper-zap-local-keys ()
  438. "Unconditionally reset Viper viper-*-local-user-map's.
  439. Rarely useful, but if you made a mistake by switching to a mode that adds
  440. undesirable local keys, e.g., comint-mode, then this function can restore
  441. sanity."
  442. (interactive)
  443. (setq viper-vi-local-user-map (make-sparse-keymap)
  444. viper-need-new-vi-local-map nil
  445. viper-insert-local-user-map (make-sparse-keymap)
  446. viper-need-new-insert-local-map nil
  447. viper-emacs-local-user-map (make-sparse-keymap)
  448. viper-need-new-emacs-local-map nil)
  449. (viper-normalize-minor-mode-map-alist))
  450. (defun viper-modify-major-mode (mode state keymap)
  451. "Modify key bindings in a major-mode in a Viper state using a keymap.
  452. If the default for a major mode is emacs-state, then modifications to this
  453. major mode may not take effect until the buffer switches state to Vi,
  454. Insert or Emacs. If this happens, add viper-change-state-to-emacs to this
  455. major mode's hook. If no such hook exists, you may have to put an advice on
  456. the function that invokes the major mode. See viper-set-hooks for hints.
  457. The above needs not to be done for major modes that come up in Vi or Insert
  458. state by default.
  459. Arguments: (major-mode viper-state keymap)"
  460. (let ((alist
  461. (cond ((eq state 'vi-state) 'viper-vi-state-modifier-alist)
  462. ((eq state 'insert-state) 'viper-insert-state-modifier-alist)
  463. ((eq state 'emacs-state) 'viper-emacs-state-modifier-alist)))
  464. elt)
  465. (if (setq elt (assoc mode (eval alist)))
  466. (set alist (delq elt (eval alist))))
  467. (set alist (cons (cons mode keymap) (eval alist)))
  468. ;; Normalization usually doesn't help here, since one needs to
  469. ;; normalize in the actual buffer where changes to the keymap are
  470. ;; to take place. However, it doesn't hurt, and it helps whenever this
  471. ;; function is actually called from within the affected buffer.
  472. (viper-normalize-minor-mode-map-alist)
  473. (viper-set-mode-vars-for viper-current-state)))
  474. ;; Displays variables that control Viper's keymaps
  475. (defun viper-debug-keymaps ()
  476. (interactive)
  477. (with-output-to-temp-buffer " *viper-debug*"
  478. (princ (format "Buffer name: %s\n\n" (buffer-name)))
  479. (princ "Variables: \n")
  480. (princ (format "major-mode: %S\n" major-mode))
  481. (princ (format "viper-current-state: %S\n" viper-current-state))
  482. (princ (format "viper-mode-string: %S\n\n" viper-mode-string))
  483. (princ (format "viper-vi-intercept-minor-mode: %S\n"
  484. viper-vi-intercept-minor-mode))
  485. (princ (format "viper-insert-intercept-minor-mode: %S\n"
  486. viper-insert-intercept-minor-mode))
  487. (princ (format "viper-emacs-intercept-minor-mode: %S\n"
  488. viper-emacs-intercept-minor-mode))
  489. (princ (format "viper-vi-minibuffer-minor-mode: %S\n"
  490. viper-vi-minibuffer-minor-mode))
  491. (princ (format "viper-insert-minibuffer-minor-mode: %S\n\n"
  492. viper-insert-minibuffer-minor-mode))
  493. (princ (format "viper-vi-local-user-minor-mode: %S\n"
  494. viper-vi-local-user-minor-mode))
  495. (princ (format "viper-vi-global-user-minor-mode: %S\n"
  496. viper-vi-global-user-minor-mode))
  497. (princ (format "viper-vi-kbd-minor-mode: %S\n" viper-vi-kbd-minor-mode))
  498. (princ (format "viper-vi-state-modifier-minor-mode: %S\n"
  499. viper-vi-state-modifier-minor-mode))
  500. (princ (format "viper-vi-diehard-minor-mode: %S\n"
  501. viper-vi-diehard-minor-mode))
  502. (princ (format "viper-vi-basic-minor-mode: %S\n" viper-vi-basic-minor-mode))
  503. (princ (format "viper-replace-minor-mode: %S\n" viper-replace-minor-mode))
  504. (princ (format "viper-insert-local-user-minor-mode: %S\n"
  505. viper-insert-local-user-minor-mode))
  506. (princ (format "viper-insert-global-user-minor-mode: %S\n"
  507. viper-insert-global-user-minor-mode))
  508. (princ (format "viper-insert-kbd-minor-mode: %S\n"
  509. viper-insert-kbd-minor-mode))
  510. (princ (format "viper-insert-state-modifier-minor-mode: %S\n"
  511. viper-insert-state-modifier-minor-mode))
  512. (princ (format "viper-insert-diehard-minor-mode: %S\n"
  513. viper-insert-diehard-minor-mode))
  514. (princ (format "viper-insert-basic-minor-mode: %S\n"
  515. viper-insert-basic-minor-mode))
  516. (princ (format "viper-emacs-local-user-minor-mode: %S\n"
  517. viper-emacs-local-user-minor-mode))
  518. (princ (format "viper-emacs-kbd-minor-mode: %S\n"
  519. viper-emacs-kbd-minor-mode))
  520. (princ (format "viper-emacs-global-user-minor-mode: %S\n"
  521. viper-emacs-global-user-minor-mode))
  522. (princ (format "viper-emacs-state-modifier-minor-mode: %S\n"
  523. viper-emacs-state-modifier-minor-mode))
  524. (princ (format "\nviper-expert-level %S\n" viper-expert-level))
  525. (princ (format "viper-no-multiple-ESC %S\n" viper-no-multiple-ESC))
  526. (princ (format "viper-always %S\n" viper-always))
  527. (princ (format "viper-ex-style-motion %S\n"
  528. viper-ex-style-motion))
  529. (princ (format "viper-ex-style-editing %S\n"
  530. viper-ex-style-editing))
  531. (princ (format "viper-want-emacs-keys-in-vi %S\n"
  532. viper-want-emacs-keys-in-vi))
  533. (princ (format "viper-want-emacs-keys-in-insert %S\n"
  534. viper-want-emacs-keys-in-insert))
  535. (princ (format "viper-want-ctl-h-help %S\n" viper-want-ctl-h-help))
  536. (princ "\n\n\n")
  537. (princ (format "Default value for minor-mode-map-alist: \n%S\n\n"
  538. (default-value 'minor-mode-map-alist)))
  539. (princ (format "Actual value for minor-mode-map-alist: \n%S\n"
  540. minor-mode-map-alist))
  541. ))
  542. ;;; Keymap utils
  543. (defun viper-add-keymap (mapsrc mapdst)
  544. "Add contents of mapsrc to mapdst. It is assumed that mapsrc is sparse."
  545. (if (featurep 'xemacs)
  546. ;; Emacs 22 has map-keymap.
  547. (map-keymap (lambda (key binding) (define-key mapdst key binding))
  548. mapsrc)
  549. (mapc (lambda (p) (define-key mapdst (vector (car p)) (cdr p)))
  550. (cdr mapsrc))))
  551. (defun viper-modify-keymap (map alist)
  552. "Modifies MAP with bindings specified in the ALIST. The alist has the
  553. form ((key . function) (key . function) ... )."
  554. (mapcar (lambda (p) (define-key map (eval (car p)) (cdr p)))
  555. alist))
  556. (provide 'viper-keym)
  557. ;; Local Variables:
  558. ;; eval: (put 'viper-deflocalvar 'lisp-indent-hook 'defun)
  559. ;; End:
  560. ;;; viper-keym.el ends here