From 47e01c676f46e3b75ca2721cddca098d91ddfb6f Mon Sep 17 00:00:00 2001 From: Zhang Chiyuan Date: Thu, 6 Mar 2008 09:15:58 +0000 Subject: [PATCH] added menu support --- snippets/c++-mode/beginend | 3 ++ snippets/c++-mode/class | 8 +++++ snippets/c++-mode/do | 6 ++++ snippets/c++-mode/for | 6 ++++ snippets/c++-mode/if | 6 ++++ snippets/c++-mode/main | 7 ++++ snippets/c++-mode/once | 8 +++++ snippets/c++-mode/struct | 6 ++++ snippets/c-mode/Inc.yas | 2 +- snippets/c-mode/do | 6 ++++ snippets/c-mode/for | 6 ++++ snippets/c-mode/if | 6 ++++ snippets/c-mode/inc | 2 +- snippets/c-mode/main | 7 ++++ snippets/c-mode/once | 8 +++++ snippets/c-mode/struct | 6 ++++ yasnippet.el | 74 +++++++++++++++++++++++++++++++++----- 17 files changed, 157 insertions(+), 10 deletions(-) create mode 100644 snippets/c++-mode/beginend create mode 100644 snippets/c++-mode/class create mode 100644 snippets/c++-mode/do create mode 100644 snippets/c++-mode/for create mode 100644 snippets/c++-mode/if create mode 100644 snippets/c++-mode/main create mode 100644 snippets/c++-mode/once create mode 100644 snippets/c++-mode/struct create mode 100644 snippets/c-mode/do create mode 100644 snippets/c-mode/for create mode 100644 snippets/c-mode/if create mode 100644 snippets/c-mode/main create mode 100644 snippets/c-mode/once create mode 100644 snippets/c-mode/struct diff --git a/snippets/c++-mode/beginend b/snippets/c++-mode/beginend new file mode 100644 index 0000000..aa45495 --- /dev/null +++ b/snippets/c++-mode/beginend @@ -0,0 +1,3 @@ +#name : v.begin(), v.end() +# -- +${1:v}.begin(), $1.end \ No newline at end of file diff --git a/snippets/c++-mode/class b/snippets/c++-mode/class new file mode 100644 index 0000000..1aefd41 --- /dev/null +++ b/snippets/c++-mode/class @@ -0,0 +1,8 @@ +#name : class бн { бн } +# -- +class ${1:Name} +{ +public: + $1($2); + virtual ~$1(); +}; \ No newline at end of file diff --git a/snippets/c++-mode/do b/snippets/c++-mode/do new file mode 100644 index 0000000..e0bc20b --- /dev/null +++ b/snippets/c++-mode/do @@ -0,0 +1,6 @@ +#name : do { бн } while (бн) +# -- +do +{ + $0 +} while (${1:condition}); \ No newline at end of file diff --git a/snippets/c++-mode/for b/snippets/c++-mode/for new file mode 100644 index 0000000..911107c --- /dev/null +++ b/snippets/c++-mode/for @@ -0,0 +1,6 @@ +#name : for (бн; бн; бн) { бн } +# -- +for (${1:int i = 0}; ${2:i < N}; ${3:++i}) +{ + $0 +} \ No newline at end of file diff --git a/snippets/c++-mode/if b/snippets/c++-mode/if new file mode 100644 index 0000000..6a93419 --- /dev/null +++ b/snippets/c++-mode/if @@ -0,0 +1,6 @@ +#name : if ( бн ) { бн } +# -- +if (${1:condition}) +{ + $0 +} \ No newline at end of file diff --git a/snippets/c++-mode/main b/snippets/c++-mode/main new file mode 100644 index 0000000..e1824b2 --- /dev/null +++ b/snippets/c++-mode/main @@ -0,0 +1,7 @@ +#name: int main(argc, argv) { бн } +# -- +int main(int argc, char const *argv) +{ + $0 + return 0; +} \ No newline at end of file diff --git a/snippets/c++-mode/once b/snippets/c++-mode/once new file mode 100644 index 0000000..1b63c39 --- /dev/null +++ b/snippets/c++-mode/once @@ -0,0 +1,8 @@ +#name : #ifndef XXX; #define XXX; #endif +# -- +#ifndef ${1:_`(upcase (file-name-nondirectory (file-name-sans-extension (buffer-file-name))))`_H_} +#define $1 + +$0 + +#endif /* $1 */ \ No newline at end of file diff --git a/snippets/c++-mode/struct b/snippets/c++-mode/struct new file mode 100644 index 0000000..8cc1a25 --- /dev/null +++ b/snippets/c++-mode/struct @@ -0,0 +1,6 @@ +#name : struct бн { бн } +# -- +struct ${1:name} +{ + $0 +}; \ No newline at end of file diff --git a/snippets/c-mode/Inc.yas b/snippets/c-mode/Inc.yas index de64090..cdcc8f1 100644 --- a/snippets/c-mode/Inc.yas +++ b/snippets/c-mode/Inc.yas @@ -1,3 +1,3 @@ -#name : #include <...> +#name : #include <бн> # -- #include <$1> \ No newline at end of file diff --git a/snippets/c-mode/do b/snippets/c-mode/do new file mode 100644 index 0000000..e0bc20b --- /dev/null +++ b/snippets/c-mode/do @@ -0,0 +1,6 @@ +#name : do { бн } while (бн) +# -- +do +{ + $0 +} while (${1:condition}); \ No newline at end of file diff --git a/snippets/c-mode/for b/snippets/c-mode/for new file mode 100644 index 0000000..911107c --- /dev/null +++ b/snippets/c-mode/for @@ -0,0 +1,6 @@ +#name : for (бн; бн; бн) { бн } +# -- +for (${1:int i = 0}; ${2:i < N}; ${3:++i}) +{ + $0 +} \ No newline at end of file diff --git a/snippets/c-mode/if b/snippets/c-mode/if new file mode 100644 index 0000000..6a93419 --- /dev/null +++ b/snippets/c-mode/if @@ -0,0 +1,6 @@ +#name : if ( бн ) { бн } +# -- +if (${1:condition}) +{ + $0 +} \ No newline at end of file diff --git a/snippets/c-mode/inc b/snippets/c-mode/inc index 61fd09b..d43d6bb 100644 --- a/snippets/c-mode/inc +++ b/snippets/c-mode/inc @@ -1,3 +1,3 @@ -#name : #include "..." +#name : #include "бн" # -- #include "$1" \ No newline at end of file diff --git a/snippets/c-mode/main b/snippets/c-mode/main new file mode 100644 index 0000000..2be6ccb --- /dev/null +++ b/snippets/c-mode/main @@ -0,0 +1,7 @@ +#name: int main(argc, argv) { бн } +# -- +int main(int argc, char *argv) +{ + $0 + return 0; +} \ No newline at end of file diff --git a/snippets/c-mode/once b/snippets/c-mode/once new file mode 100644 index 0000000..1b63c39 --- /dev/null +++ b/snippets/c-mode/once @@ -0,0 +1,8 @@ +#name : #ifndef XXX; #define XXX; #endif +# -- +#ifndef ${1:_`(upcase (file-name-nondirectory (file-name-sans-extension (buffer-file-name))))`_H_} +#define $1 + +$0 + +#endif /* $1 */ \ No newline at end of file diff --git a/snippets/c-mode/struct b/snippets/c-mode/struct new file mode 100644 index 0000000..8cc1a25 --- /dev/null +++ b/snippets/c-mode/struct @@ -0,0 +1,6 @@ +#name : struct бн { бн } +# -- +struct ${1:name} +{ + $0 +}; \ No newline at end of file diff --git a/yasnippet.el b/yasnippet.el index 2ffb926..9f99385 100644 --- a/yasnippet.el +++ b/yasnippet.el @@ -36,6 +36,12 @@ expanded.") current column if this variable is non-`nil'.") (make-variable-buffer-local 'yas/indent-line) +(defvar yas/trigger-key (kbd "TAB") + "The key to bind as a trigger of snippet.") +(defvar yas/trigger-fallback 'indent-according-to-mode + "The fallback command to call when there's no snippet to expand.") +(make-variable-buffer-local 'yas/trigger-fallback) + (defvar yas/keymap (make-sparse-keymap) "The keymap of snippet.") (define-key yas/keymap (kbd "TAB") 'yas/next-field-group) @@ -43,11 +49,25 @@ current column if this variable is non-`nil'.") (define-key yas/keymap (kbd "") 'yas/prev-field-group) (define-key yas/keymap (kbd "") 'yas/prev-field-group) +(defvar yas/use-menu t + "If this is set to `t', all snippet template of the current +mode will be listed under the menu \"yasnippet\".") + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Internal variables ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defvar yas/version "0.1") + (defvar yas/snippet-tables (make-hash-table) "A hash table of snippet tables corresponding to each major-mode.") +(defvar yas/menu-table (make-hash-table) + "A hash table of menus of corresponding major-mode.") +(defvar yas/menu-keymap (make-sparse-keymap)) +;; empty menu will cause problems, so we insert some items +(define-key yas/menu-keymap [yas/about] + '(menu-item "About" yas/about)) +(define-key yas/menu-keymap [yas/separator] + '(menu-item "--")) (defconst yas/escape-backslash (concat "YASESCAPE" "BACKSLASH" "PROTECTGUARD")) @@ -165,6 +185,7 @@ have, compare through the start point of the overlay." (goto-char (point-min)) (while (search-forward from nil t) (replace-match to t t))) + (defun yas/snippet-table (mode) "Get the snippet table corresponding to MODE." (let ((table (gethash mode yas/snippet-tables))) @@ -176,6 +197,14 @@ have, compare through the start point of the overlay." "Get the snippet table for current major-mode." (yas/snippet-table major-mode)) +(defun yas/menu-keymap-for-mode (mode) + "Get the menu keymap correspondong to MODE." + (let ((keymap (gethash mode yas/menu-table))) + (unless keymap + (setq table (make-sparse-keymap)) + (puthash mode keymap yas/menu-table)) + table)) + (defsubst yas/template (key snippet-table) "Get template for KEY in SNIPPET-TABLE." (gethash key snippet-table)) @@ -499,15 +528,45 @@ an example: (file-directory-p file)))) (directory-files directory t))) +(defun yas/make-menu-binding (template) + (lexical-let ((template (yas/template-content template))) + (lambda () + (interactive) + (yas/expand-snippet (point) + (point) + template)))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; User level functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun yas/about () + (interactive) + (message (concat "yasnippet (version " + yas/version + ") -- pluskid "))) +(defun yas/initialize () + "Do necessary initialization." + (global-set-key yas/trigger-key 'yas/expand) + (when yas/use-menu + (global-set-key [menu-bar yasnippet] + (cons "yasnippet" yas/menu-keymap)))) + (defun yas/define (mode key template &optional name) "Define a snippet. Expanding KEY into TEMPLATE. -NAME is a description to this template." - (puthash key - (yas/make-template template (or name key)) - (yas/snippet-table mode))) +NAME is a description to this template. Also update +the menu if `yas/use-menu' is `t'." + (let ((template (yas/make-template template (or name key)))) + (puthash key + template + (yas/snippet-table mode)) + (when yas/use-menu + (let ((keymap (yas/menu-keymap-for-mode mode))) + (define-key yas/menu-keymap (vector mode) + `(menu-item ,(symbol-name mode) ,keymap)) + (define-key keymap (vector (make-symbol key)) + `(menu-item ,(yas/template-name template) + ,(yas/make-menu-binding template) + :keys ,(concat key " ->"))))))) (defun yas/expand () "Expand a snippet. When a snippet is expanded, t is returned, @@ -516,10 +575,9 @@ otherwise, nil returned." (multiple-value-bind (key start end) (yas/current-key) (let ((template (yas/template key (yas/current-snippet-table)))) (if template - (progn - (yas/expand-snippet start end (yas/template-content template)) - t) - nil)))) + (yas/expand-snippet start end (yas/template-content template)) + (when yas/trigger-fallback + (call-interactively yas/trigger-fallback)))))) (defun yas/next-field-group () "Navigate to next field group. If there's none, exit the snippet."