mirror of
https://github.com/joaotavora/yasnippet.git
synced 2025-10-13 21:13:04 +00:00
Previous approach breaks the mode menu, need another `yas/trigger-key-overriding\' var
This commit is contained in:
parent
50bcb8f2d8
commit
429db5c65c
266
yasnippet.el
266
yasnippet.el
@ -244,6 +244,7 @@ Naturally this is only valid when `yas/indent-line' is `auto'"
|
|||||||
:type 'boolean
|
:type 'boolean
|
||||||
:group 'yasnippet)
|
:group 'yasnippet)
|
||||||
|
|
||||||
|
(defvar yas/trigger-key-overriding nil)
|
||||||
(defvar yas/trigger-key-map (make-sparse-keymap)
|
(defvar yas/trigger-key-map (make-sparse-keymap)
|
||||||
"Keymap used only for adding the trigger key to `minor-mode-overriding-map-alist'")
|
"Keymap used only for adding the trigger key to `minor-mode-overriding-map-alist'")
|
||||||
|
|
||||||
@ -592,138 +593,133 @@ snippet itself contains a condition that returns the symbol
|
|||||||
(defvar yas/minor-mode-menu nil
|
(defvar yas/minor-mode-menu nil
|
||||||
"Holds the YASnippet menu")
|
"Holds the YASnippet menu")
|
||||||
|
|
||||||
(defun yas/init-minor-keymap ()
|
(defvar yas/minor-mode nil)
|
||||||
|
|
||||||
|
(defvar yas/minor-mode-map
|
||||||
(let ((map (make-sparse-keymap)))
|
(let ((map (make-sparse-keymap)))
|
||||||
(easy-menu-define yas/minor-mode-menu
|
|
||||||
map
|
|
||||||
"Menu used when YAS/minor-mode is active."
|
|
||||||
'("YASnippet"
|
|
||||||
"----"
|
|
||||||
["Expand trigger" yas/expand
|
|
||||||
:help "Possibly expand tab trigger before point"]
|
|
||||||
["Insert at point..." yas/insert-snippet
|
|
||||||
:help "Prompt for an expandable snippet and expand it at point"]
|
|
||||||
["New snippet..." yas/new-snippet
|
|
||||||
:help "Create a new snippet in an appropriate directory"]
|
|
||||||
["Visit snippet file..." yas/visit-snippet-file
|
|
||||||
:help "Prompt for an expandable snippet and find its file"]
|
|
||||||
["Find snippets..." yas/find-snippets
|
|
||||||
:help "Invoke `find-file' in the appropriate snippet directory"]
|
|
||||||
"----"
|
|
||||||
("Snippet menu behaviour"
|
|
||||||
["Visit snippets" (setq yas/visit-from-menu t)
|
|
||||||
:help "Visit snippets from the menu"
|
|
||||||
:active t :style radio :selected yas/visit-from-menu]
|
|
||||||
["Expand snippets" (setq yas/visit-from-menu nil)
|
|
||||||
:help "Expand snippets from the menu"
|
|
||||||
:active t :style radio :selected (not yas/visit-from-menu)]
|
|
||||||
"----"
|
|
||||||
["Show \"Real\" modes only" (setq yas/use-menu 'real-modes)
|
|
||||||
:help "Show snippet submenus for modes that appear to be real major modes"
|
|
||||||
:active t :style radio :selected (eq yas/use-menu 'real-modes)]
|
|
||||||
["Show all modes" (setq yas/use-menu 't)
|
|
||||||
:help "Show one snippet submenu for each loaded table"
|
|
||||||
:active t :style radio :selected (eq yas/use-menu 't)]
|
|
||||||
["Abbreviate according to current mode" (setq yas/use-menu 'abbreviate)
|
|
||||||
:help "Show only snippet submenus for the current active modes"
|
|
||||||
:active t :style radio :selected (eq yas/use-menu 'abbreviate)])
|
|
||||||
("Indenting"
|
|
||||||
["Auto" (setq yas/indent-line 'auto)
|
|
||||||
:help "Indent each line of the snippet with `indent-according-to-mode'"
|
|
||||||
:active t :style radio :selected (eq yas/indent-line 'auto)]
|
|
||||||
["Fixed" (setq yas/indent-line 'fixed)
|
|
||||||
:help "Indent the snippet to the current column"
|
|
||||||
:active t :style radio :selected (eq yas/indent-line 'fixed)]
|
|
||||||
["None" (setq yas/indent-line 'none)
|
|
||||||
:help "Don't apply any particular snippet indentation after expansion"
|
|
||||||
:active t :style radio :selected (not (member yas/indent-line '(fixed auto)))]
|
|
||||||
"----"
|
|
||||||
["Also auto indent first line" (setq yas/also-auto-indent-first-line
|
|
||||||
(not yas/also-auto-indent-first-line))
|
|
||||||
:help "When auto-indenting also, auto indent the first line menu"
|
|
||||||
:active (eq yas/indent-line 'auto)
|
|
||||||
:style toggle :selected yas/also-auto-indent-first-line]
|
|
||||||
)
|
|
||||||
("Prompting method"
|
|
||||||
["System X-widget" (setq yas/prompt-functions
|
|
||||||
(cons 'yas/x-prompt
|
|
||||||
(remove 'yas/x-prompt
|
|
||||||
yas/prompt-functions)))
|
|
||||||
:help "Use your windowing system's (gtk, mac, windows, etc...) default menu"
|
|
||||||
:active t :style radio :selected (eq (car yas/prompt-functions)
|
|
||||||
'yas/x-prompt)]
|
|
||||||
["Dropdown-list" (setq yas/prompt-functions
|
|
||||||
(cons 'yas/dropdown-prompt
|
|
||||||
(remove 'yas/dropdown-prompt
|
|
||||||
yas/prompt-functions)))
|
|
||||||
:help "Use a special dropdown list"
|
|
||||||
:active t :style radio :selected (eq (car yas/prompt-functions)
|
|
||||||
'yas/dropdown-prompt)]
|
|
||||||
["Ido" (setq yas/prompt-functions
|
|
||||||
(cons 'yas/ido-prompt
|
|
||||||
(remove 'yas/ido-prompt
|
|
||||||
yas/prompt-functions)))
|
|
||||||
:help "Use an ido-style minibuffer prompt"
|
|
||||||
:active t :style radio :selected (eq (car yas/prompt-functions)
|
|
||||||
'yas/ido-prompt)]
|
|
||||||
["Completing read" (setq yas/prompt-functions
|
|
||||||
(cons 'yas/completing-prompt
|
|
||||||
(remove 'yas/completing-prompt-prompt
|
|
||||||
yas/prompt-functions)))
|
|
||||||
:help "Use a normal minibuffer prompt"
|
|
||||||
:active t :style radio :selected (eq (car yas/prompt-functions)
|
|
||||||
'yas/completing-prompt-prompt)]
|
|
||||||
)
|
|
||||||
("Misc"
|
|
||||||
["Wrap region in exit marker"
|
|
||||||
(setq yas/wrap-around-region
|
|
||||||
(not yas/wrap-around-region))
|
|
||||||
:help "If non-nil automatically wrap the selected text in the $0 snippet exit"
|
|
||||||
:style toggle :selected yas/wrap-around-region]
|
|
||||||
["Allow stacked expansions "
|
|
||||||
(setq yas/triggers-in-field
|
|
||||||
(not yas/triggers-in-field))
|
|
||||||
:help "If non-nil allow snippets to be triggered inside other snippet fields"
|
|
||||||
:style toggle :selected yas/triggers-in-field]
|
|
||||||
["Revive snippets on undo "
|
|
||||||
(setq yas/snippet-revival
|
|
||||||
(not yas/snippet-revival))
|
|
||||||
:help "If non-nil allow snippets to become active again after undo"
|
|
||||||
:style toggle :selected yas/snippet-revival]
|
|
||||||
["Good grace "
|
|
||||||
(setq yas/good-grace
|
|
||||||
(not yas/good-grace))
|
|
||||||
:help "If non-nil don't raise errors in bad embedded eslip in snippets"
|
|
||||||
:style toggle :selected yas/good-grace]
|
|
||||||
)
|
|
||||||
"----"
|
|
||||||
["Load snippets..." yas/load-directory
|
|
||||||
:help "Load snippets from a specific directory"]
|
|
||||||
["Reload everything" yas/reload-all
|
|
||||||
:help "Cleanup stuff, reload snippets, rebuild menus"]
|
|
||||||
["About" yas/about
|
|
||||||
:help "Display some information about YASsnippet"]))
|
|
||||||
;; Now for the stuff that has direct keybindings
|
;; Now for the stuff that has direct keybindings
|
||||||
;;
|
;;
|
||||||
(define-key map "\C-c&\C-s" 'yas/insert-snippet)
|
(define-key map "\C-c&\C-s" 'yas/insert-snippet)
|
||||||
(define-key map "\C-c&\C-n" 'yas/new-snippet)
|
(define-key map "\C-c&\C-n" 'yas/new-snippet)
|
||||||
(define-key map "\C-c&\C-v" 'yas/visit-snippet-file)
|
(define-key map "\C-c&\C-v" 'yas/visit-snippet-file)
|
||||||
(define-key map "\C-c&\C-f" 'yas/find-snippets)
|
(define-key map "\C-c&\C-f" 'yas/find-snippets)
|
||||||
map))
|
map)
|
||||||
|
|
||||||
(defvar yas/minor-mode-map (yas/init-minor-keymap)
|
|
||||||
"The keymap used when `yas/minor-mode' is active.")
|
"The keymap used when `yas/minor-mode' is active.")
|
||||||
|
|
||||||
|
(easy-menu-define yas/minor-mode-menu yas/minor-mode-map
|
||||||
|
"Menu used when YAS/minor-mode is active."
|
||||||
|
'("YASnippet"
|
||||||
|
"----"
|
||||||
|
["Expand trigger" yas/expand
|
||||||
|
:help "Possibly expand tab trigger before point"]
|
||||||
|
["Insert at point..." yas/insert-snippet
|
||||||
|
:help "Prompt for an expandable snippet and expand it at point"]
|
||||||
|
["New snippet..." yas/new-snippet
|
||||||
|
:help "Create a new snippet in an appropriate directory"]
|
||||||
|
["Visit snippet file..." yas/visit-snippet-file
|
||||||
|
:help "Prompt for an expandable snippet and find its file"]
|
||||||
|
["Find snippets..." yas/find-snippets
|
||||||
|
:help "Invoke `find-file' in the appropriate snippet directory"]
|
||||||
|
"----"
|
||||||
|
("Snippet menu behaviour"
|
||||||
|
["Visit snippets" (setq yas/visit-from-menu t)
|
||||||
|
:help "Visit snippets from the menu"
|
||||||
|
:active t :style radio :selected yas/visit-from-menu]
|
||||||
|
["Expand snippets" (setq yas/visit-from-menu nil)
|
||||||
|
:help "Expand snippets from the menu"
|
||||||
|
:active t :style radio :selected (not yas/visit-from-menu)]
|
||||||
|
"----"
|
||||||
|
["Show \"Real\" modes only" (setq yas/use-menu 'real-modes)
|
||||||
|
:help "Show snippet submenus for modes that appear to be real major modes"
|
||||||
|
:active t :style radio :selected (eq yas/use-menu 'real-modes)]
|
||||||
|
["Show all modes" (setq yas/use-menu 't)
|
||||||
|
:help "Show one snippet submenu for each loaded table"
|
||||||
|
:active t :style radio :selected (eq yas/use-menu 't)]
|
||||||
|
["Abbreviate according to current mode" (setq yas/use-menu 'abbreviate)
|
||||||
|
:help "Show only snippet submenus for the current active modes"
|
||||||
|
:active t :style radio :selected (eq yas/use-menu 'abbreviate)])
|
||||||
|
("Indenting"
|
||||||
|
["Auto" (setq yas/indent-line 'auto)
|
||||||
|
:help "Indent each line of the snippet with `indent-according-to-mode'"
|
||||||
|
:active t :style radio :selected (eq yas/indent-line 'auto)]
|
||||||
|
["Fixed" (setq yas/indent-line 'fixed)
|
||||||
|
:help "Indent the snippet to the current column"
|
||||||
|
:active t :style radio :selected (eq yas/indent-line 'fixed)]
|
||||||
|
["None" (setq yas/indent-line 'none)
|
||||||
|
:help "Don't apply any particular snippet indentation after expansion"
|
||||||
|
:active t :style radio :selected (not (member yas/indent-line '(fixed auto)))]
|
||||||
|
"----"
|
||||||
|
["Also auto indent first line" (setq yas/also-auto-indent-first-line
|
||||||
|
(not yas/also-auto-indent-first-line))
|
||||||
|
:help "When auto-indenting also, auto indent the first line menu"
|
||||||
|
:active (eq yas/indent-line 'auto)
|
||||||
|
:style toggle :selected yas/also-auto-indent-first-line]
|
||||||
|
)
|
||||||
|
("Prompting method"
|
||||||
|
["System X-widget" (setq yas/prompt-functions
|
||||||
|
(cons 'yas/x-prompt
|
||||||
|
(remove 'yas/x-prompt
|
||||||
|
yas/prompt-functions)))
|
||||||
|
:help "Use your windowing system's (gtk, mac, windows, etc...) default menu"
|
||||||
|
:active t :style radio :selected (eq (car yas/prompt-functions)
|
||||||
|
'yas/x-prompt)]
|
||||||
|
["Dropdown-list" (setq yas/prompt-functions
|
||||||
|
(cons 'yas/dropdown-prompt
|
||||||
|
(remove 'yas/dropdown-prompt
|
||||||
|
yas/prompt-functions)))
|
||||||
|
:help "Use a special dropdown list"
|
||||||
|
:active t :style radio :selected (eq (car yas/prompt-functions)
|
||||||
|
'yas/dropdown-prompt)]
|
||||||
|
["Ido" (setq yas/prompt-functions
|
||||||
|
(cons 'yas/ido-prompt
|
||||||
|
(remove 'yas/ido-prompt
|
||||||
|
yas/prompt-functions)))
|
||||||
|
:help "Use an ido-style minibuffer prompt"
|
||||||
|
:active t :style radio :selected (eq (car yas/prompt-functions)
|
||||||
|
'yas/ido-prompt)]
|
||||||
|
["Completing read" (setq yas/prompt-functions
|
||||||
|
(cons 'yas/completing-prompt
|
||||||
|
(remove 'yas/completing-prompt-prompt
|
||||||
|
yas/prompt-functions)))
|
||||||
|
:help "Use a normal minibuffer prompt"
|
||||||
|
:active t :style radio :selected (eq (car yas/prompt-functions)
|
||||||
|
'yas/completing-prompt-prompt)]
|
||||||
|
)
|
||||||
|
("Misc"
|
||||||
|
["Wrap region in exit marker"
|
||||||
|
(setq yas/wrap-around-region
|
||||||
|
(not yas/wrap-around-region))
|
||||||
|
:help "If non-nil automatically wrap the selected text in the $0 snippet exit"
|
||||||
|
:style toggle :selected yas/wrap-around-region]
|
||||||
|
["Allow stacked expansions "
|
||||||
|
(setq yas/triggers-in-field
|
||||||
|
(not yas/triggers-in-field))
|
||||||
|
:help "If non-nil allow snippets to be triggered inside other snippet fields"
|
||||||
|
:style toggle :selected yas/triggers-in-field]
|
||||||
|
["Revive snippets on undo "
|
||||||
|
(setq yas/snippet-revival
|
||||||
|
(not yas/snippet-revival))
|
||||||
|
:help "If non-nil allow snippets to become active again after undo"
|
||||||
|
:style toggle :selected yas/snippet-revival]
|
||||||
|
["Good grace "
|
||||||
|
(setq yas/good-grace
|
||||||
|
(not yas/good-grace))
|
||||||
|
:help "If non-nil don't raise errors in bad embedded eslip in snippets"
|
||||||
|
:style toggle :selected yas/good-grace]
|
||||||
|
)
|
||||||
|
"----"
|
||||||
|
["Load snippets..." yas/load-directory
|
||||||
|
:help "Load snippets from a specific directory"]
|
||||||
|
["Reload everything" yas/reload-all
|
||||||
|
:help "Cleanup stuff, reload snippets, rebuild menus"]
|
||||||
|
["About" yas/about
|
||||||
|
:help "Display some information about YASsnippet"]))
|
||||||
|
|
||||||
|
(defvar yas/trigger-key-active nil)
|
||||||
(defun yas/trigger-key-reload (&optional override)
|
(defun yas/trigger-key-reload (&optional override)
|
||||||
"Rebind `yas/expand' to the new value of `yas/trigger-key'."
|
"Rebind `yas/expand' to the new value of `yas/trigger-key'."
|
||||||
(let ((override (yas/read-kbd-macro override)))
|
(let ((override (yas/read-kbd-macro override)))
|
||||||
(aput 'minor-mode-overriding-map-alist
|
))
|
||||||
'yas/minor-mode
|
|
||||||
(if override
|
|
||||||
(let ((map (make-sparse-keymap)))
|
|
||||||
(define-key map override 'yas/expand)
|
|
||||||
map)
|
|
||||||
yas/trigger-key-map))))
|
|
||||||
|
|
||||||
(defvar yas/tables (make-hash-table)
|
(defvar yas/tables (make-hash-table)
|
||||||
"A hash table of MAJOR-MODE symbols to `yas/table' objects.")
|
"A hash table of MAJOR-MODE symbols to `yas/table' objects.")
|
||||||
@ -770,7 +766,7 @@ all defined direct keybindings to the command
|
|||||||
(define-minor-mode yas/minor-mode
|
(define-minor-mode yas/minor-mode
|
||||||
"Toggle YASnippet mode.
|
"Toggle YASnippet mode.
|
||||||
|
|
||||||
When YASnippet mode is enabled, the `tas/trigger-key' key expands
|
When YASnippet mode is enabled, the `yas/trigger-key' key expands
|
||||||
snippets of code depending on the mode.
|
snippets of code depending on the mode.
|
||||||
|
|
||||||
With no argument, this command toggles the mode.
|
With no argument, this command toggles the mode.
|
||||||
@ -781,29 +777,33 @@ You can customize the key through `yas/trigger-key'.
|
|||||||
|
|
||||||
Key bindings:
|
Key bindings:
|
||||||
\\{yas/minor-mode-map}"
|
\\{yas/minor-mode-map}"
|
||||||
nil
|
|
||||||
;; The indicator for the mode line.
|
|
||||||
" yas"
|
|
||||||
:group 'yasnippet
|
:group 'yasnippet
|
||||||
|
:lighter " yas"
|
||||||
|
:keymap yas/minor-mode-map
|
||||||
(cond (yas/minor-mode
|
(cond (yas/minor-mode
|
||||||
;; Reload the trigger key
|
;; Install the trigger key binding
|
||||||
;;
|
;;
|
||||||
(yas/trigger-key-reload)
|
(setq yas/trigger-key-overriding t)
|
||||||
|
(aput 'minor-mode-overriding-map-alist 'yas/trigger-key-overriding yas/trigger-key-map)
|
||||||
;; Install the direct keymaps in `emulation-mode-map-alists'
|
;; Install the direct keymaps in `emulation-mode-map-alists'
|
||||||
;; (we use `add-hook' even though it's not technically a hook,
|
;; (we use `add-hook' even though it's not technically a hook,
|
||||||
;; but it works). Then define variables named after modes to
|
;; but it works). Then define variables named after modes to
|
||||||
;; index `yas/direct-keymaps'.
|
;; index `yas/direct-keymaps'.
|
||||||
;;
|
;;
|
||||||
;; Also install the post-command-hook.
|
|
||||||
;;
|
|
||||||
(add-hook 'emulation-mode-map-alists 'yas/direct-keymaps)
|
(add-hook 'emulation-mode-map-alists 'yas/direct-keymaps)
|
||||||
|
;; Also install the post-command-hook and a run-once call to
|
||||||
|
;; `yas/direct-keymaps-set-vars'.
|
||||||
|
;;
|
||||||
(add-hook 'post-command-hook 'yas/post-command-handler nil t)
|
(add-hook 'post-command-hook 'yas/post-command-handler nil t)
|
||||||
(add-hook 'yas/minor-mode-hook 'yas/direct-keymaps-set-vars-runonce 'append))
|
(add-hook 'yas/minor-mode-hook 'yas/direct-keymaps-set-vars-runonce 'append))
|
||||||
(t
|
(t
|
||||||
;; Uninstall the direct keymaps and the post-command hook
|
;; Uninstall the direct keymaps and the post-command hook
|
||||||
;;
|
;;
|
||||||
(remove-hook 'post-command-hook 'yas/post-command-handler t)
|
(remove-hook 'post-command-hook 'yas/post-command-handler t)
|
||||||
(remove-hook 'emulation-mode-map-alists 'yas/direct-keymaps))))
|
(remove-hook 'emulation-mode-map-alists 'yas/direct-keymaps)
|
||||||
|
;; Uninstall the trigger key binding
|
||||||
|
;;
|
||||||
|
(setq yas/trigger-key-overriding nil))))
|
||||||
|
|
||||||
(defun yas/direct-keymaps-set-vars-runonce ()
|
(defun yas/direct-keymaps-set-vars-runonce ()
|
||||||
(yas/direct-keymaps-set-vars)
|
(yas/direct-keymaps-set-vars)
|
||||||
@ -1673,12 +1673,6 @@ Below TOP-LEVEL-DIR., each directory is a mode name."
|
|||||||
(setq yas/tables (make-hash-table))
|
(setq yas/tables (make-hash-table))
|
||||||
(setq yas/menu-table (make-hash-table))
|
(setq yas/menu-table (make-hash-table))
|
||||||
|
|
||||||
;; Init the `yas/minor-mode-map', taking care not to break the
|
|
||||||
;; menu....
|
|
||||||
;;
|
|
||||||
(setf (cdr yas/minor-mode-map)
|
|
||||||
(cdr (yas/init-minor-keymap)))
|
|
||||||
|
|
||||||
;; Reload the directories listed in `yas/snippet-dirs' or prompt
|
;; Reload the directories listed in `yas/snippet-dirs' or prompt
|
||||||
;; the user to select one.
|
;; the user to select one.
|
||||||
;;
|
;;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user