Subject: bug#25187: Initialization of `shell-mode-map' is not safe

From: Alexander Shukaev <[email-masked]>
Date: Tue, 13 Dec 2016 00:08:07 +0100

Hi,

consider

(defvar shell-mode-map
   (let ((map (nconc (make-sparse-keymap) comint-mode-map)))
     (define-key map "\C-c\C-f" 'shell-forward-command)
     (define-key map "\C-c\C-b" 'shell-backward-command)
     (define-key map "\t" 'completion-at-point)
     (define-key map (kbd "M-RET") 'shell-resync-dirs)
     (define-key map "\M-?" 'comint-dynamic-list-filename-completions)
     (define-key map [menu-bar completion]
       (cons "Complete"
	    (copy-keymap (lookup-key comint-mode-map [menu-bar completion]))))
     (define-key-after (lookup-key map [menu-bar completion])
       [complete-env-variable] '("Complete Env. Variable Name" .
				shell-dynamic-complete-environment-variable)
       'complete-file)
     (define-key-after (lookup-key map [menu-bar completion])
       [expand-directory] '("Expand Directory Reference" .
			   shell-replace-by-expanded-directory)
       'complete-expand)
     map))

from 'shell.el'.  When somebody decides to customize `comint-mode-map' 
by, for example, first wiping it out and then filling it again,

(with-eval-after-load 'comint	
   ;; Wipe `comint-mode-map':
   (setcdr comint-mode-map nil)
   ;; Fill `comint-mode-map':
   ...)

then when the `shell' feature is loaded, it will inevitably fail because 
`(lookup-key comint-mode-map [menu-bar completion])' may no longer 
return a keymap but rather nil or a number.

Looking forward for fix.

Regards,
Alexander