]> code.delx.au - gnu-emacs-elpa/blob - gnome-c-snippet.el
snippet: Support guessing package/class names
[gnu-emacs-elpa] / gnome-c-snippet.el
1 ;;; gnome-c-snippet.el --- GNOME-style code generation -*- lexical-binding: t; -*-
2 ;; Copyright (C) 2016 Free Software Foundation, Inc.
3
4 ;; Author: Daiki Ueno <ueno@gnu.org>
5 ;; Keywords: GNOME, C, coding style
6
7 ;; This file is part of GNU Emacs.
8
9 ;; GNU Emacs is free software: you can redistribute it and/or modify
10 ;; it under the terms of the GNU General Public License as published by
11 ;; the Free Software Foundation, either version 3 of the License, or
12 ;; (at your option) any later version.
13
14 ;; GNU Emacs is distributed in the hope that it will be useful,
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ;; GNU General Public License for more details.
18
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
21
22 ;;; Commentary:
23
24 ;; FIXME: The snippets defined here could be rewritten in yasnippet
25
26 ;;; Code:
27
28 (require 'gnome-c-align)
29 (require 'subword)
30
31 (defvar gnome-c-snippet-package nil)
32 (make-variable-buffer-local 'gnome-c-snippet-package)
33
34 (defvar gnome-c-snippet-class nil)
35 (make-variable-buffer-local 'gnome-c-snippet-class)
36
37 (defvar gnome-c-snippet-parent-package nil)
38 (make-variable-buffer-local 'gnome-c-snippet-parent-package)
39
40 (defvar gnome-c-snippet-parent-class nil)
41 (make-variable-buffer-local 'gnome-c-snippet-parent-class)
42
43 (defconst gnome-c-snippet-guess-name-functions
44 '(gnome-c-snippet--guess-name-from-header-buffer
45 gnome-c-snippet--guess-name-from-declaration
46 gnome-c-snippet--guess-name-from-file-name))
47
48 (defcustom gnome-c-snippet-align-arglist t
49 "Whether to align argument list of the inserted snippet"
50 :type 'boolean
51 :group 'gnome-c-style)
52
53 (make-variable-buffer-local 'gnome-c-snippet-align-arglist)
54
55 (defun gnome-c-snippet--find-declaration ()
56 (save-excursion
57 (let (beg end)
58 (goto-char (point-min))
59 (when (re-search-forward
60 "^G_DECLARE_\\(?:FINAL\\|DERIVABLE\\)_TYPE\\s-*("
61 nil t)
62 (setq beg (match-beginning 0))
63 (goto-char (match-end 0))
64 (backward-char)
65 (condition-case nil
66 (progn
67 (c-forward-sexp)
68 (setq end (point)))
69 (error)))
70 (when (and beg end)
71 (list beg end)))))
72
73 (defun gnome-c-snippet--extract-names-from-declaration (beg end)
74 (save-excursion
75 (narrow-to-region beg end)
76 (goto-char (point-min))
77 (search-forward "(")
78 (c-forward-syntactic-ws)
79 (let ((capitalized-package-class
80 (buffer-substring-no-properties (point)
81 (progn
82 (c-forward-token-2)
83 (c-backward-syntactic-ws)
84 (point))))
85 uppercased-package uppercased-class
86 capitalized-package capitalized-class)
87 (c-forward-syntactic-ws)
88 (c-forward-token-2 3)
89 (setq uppercased-package (split-string
90 (buffer-substring (point)
91 (progn
92 (c-forward-token-2)
93 (c-backward-syntactic-ws)
94 (point)))
95 "_"))
96 (c-forward-syntactic-ws)
97 (c-forward-token-2)
98 (setq uppercased-class (split-string
99 (buffer-substring (point)
100 (progn
101 (c-forward-token-2)
102 (c-backward-syntactic-ws)
103 (point)))
104 "_"))
105 (catch 'error
106 (let ((index 0))
107 (dolist (uppercased uppercased-package)
108 (let* ((length (length uppercased))
109 (capitalized
110 (substring capitalized-package-class
111 index (+ index length))))
112 (unless (equal (upcase capitalized) uppercased)
113 (throw 'error nil))
114 (push capitalized capitalized-package)
115 (setq index (+ index length))))
116 (dolist (uppercased uppercased-class)
117 (let* ((length (length uppercased))
118 (capitalized
119 (substring capitalized-package-class
120 index (+ index length))))
121 (unless (equal (upcase capitalized) uppercased)
122 (throw 'error nil))
123 (push capitalized capitalized-class)
124 (setq index (+ index length))))))
125 (list (nreverse capitalized-package)
126 (nreverse capitalized-class)))))
127
128 (defun gnome-c-snippet--find-header-buffer ()
129 (when (equal (file-name-extension buffer-file-name) "c")
130 (let ((header-file-name
131 (concat (file-name-sans-extension buffer-file-name) ".h")))
132 (cl-find-if
133 (lambda (buffer)
134 (with-current-buffer buffer
135 (equal buffer-file-name header-file-name)))
136 (buffer-list)))))
137
138 (defun gnome-c-snippet--guess-name-from-header-buffer (symbol)
139 (let ((header-buffer (gnome-c-snippet--find-header-buffer)))
140 (when header-buffer
141 (with-current-buffer header-buffer
142 (symbol-value (intern (format "gnome-c-snippet-%S" symbol)))))))
143
144 (defun gnome-c-snippet--guess-name-from-declaration (symbol)
145 (when (memq symbol '(package class))
146 (let ((header-buffer (gnome-c-snippet--find-header-buffer)))
147 (when header-buffer
148 (with-current-buffer header-buffer
149 (let ((region (gnome-c-snippet--find-declaration))
150 names)
151 (when region
152 (setq names
153 (apply #'gnome-c-snippet--extract-names-from-declaration
154 region))
155 (when names
156 (pcase symbol
157 ('package (car names))
158 ('class (nth 1 names)))))))))))
159
160 (defun gnome-c-snippet--guess-name-from-file-name (symbol)
161 (when (memq symbol '(package class))
162 (let ((filename (file-name-sans-extension
163 (file-name-nondirectory buffer-file-name))))
164 (when (string-match-p "-" filename)
165 (let ((names (split-string filename "-")))
166 (pcase symbol
167 ('package (list (upcase-initials (car names))))
168 ('class (mapcar #'upcase-initials (cdr names)))))))))
169
170 (defun gnome-c-snippet--parse-name (name)
171 (with-temp-buffer
172 (let (words)
173 (insert (upcase-initials name))
174 (goto-char (point-min))
175 (while (not (eobp))
176 ;; Skip characters not recognized by subword-mode.
177 (if (looking-at "[^[:lower:][:upper:][:digit:]]+")
178 (goto-char (match-end 0)))
179 (push (buffer-substring (point) (progn (subword-forward 1)
180 (point)))
181 words))
182 (nreverse words))))
183
184 (defun gnome-c-snippet--read-name (prompt symbol &optional default)
185 (when (or current-prefix-arg
186 (not (symbol-value symbol)))
187 (set symbol
188 (gnome-c-snippet--parse-name
189 (read-string prompt
190 (or (if (symbol-value symbol)
191 (gnome-c-snippet--format-Package
192 (symbol-value symbol)))
193 default)))))
194 (symbol-value symbol))
195
196 (defun gnome-c-snippet--read-package-and-class (parent)
197 (append (list (gnome-c-snippet--read-name
198 "Package (CamelCase): "
199 'gnome-c-snippet-package
200 (gnome-c-snippet--format-Package
201 (run-hook-with-args-until-success
202 'gnome-c-snippet-guess-name-functions
203 'package)))
204 (gnome-c-snippet--read-name
205 "Class (CamelCase): "
206 'gnome-c-snippet-class
207 (gnome-c-snippet--format-Class
208 (run-hook-with-args-until-success
209 'gnome-c-snippet-guess-name-functions
210 'class))))
211 (when parent
212 (list (gnome-c-snippet--read-name
213 "Parent package (CamelCase): "
214 'gnome-c-snippet-parent-package
215 (gnome-c-snippet--format-Package
216 (run-hook-with-args-until-success
217 'gnome-c-snippet-guess-name-functions
218 'parent-package)))
219 (gnome-c-snippet--read-name
220 "Parent class (CamelCase): "
221 'gnome-c-snippet-parent-class
222 (gnome-c-snippet--format-Class
223 (run-hook-with-args-until-success
224 'gnome-c-snippet-guess-name-functions
225 'parent-class)))))))
226
227 (defun gnome-c-snippet--read-package-and-interface (parent)
228 (list (gnome-c-snippet--read-name
229 "Package (CamelCase): "
230 'gnome-c-snippet-package
231 (gnome-c-snippet--format-Package
232 (run-hook-with-args-until-success
233 'gnome-c-snippet-guess-name-functions
234 'package)))
235 (gnome-c-snippet--read-name
236 "Interface (CamelCase): "
237 'gnome-c-snippet-class
238 (gnome-c-snippet--format-Class
239 (run-hook-with-args-until-success
240 'gnome-c-snippet-guess-name-functions
241 'class)))
242 (when parent
243 (list (gnome-c-snippet--read-name
244 "Parent package (CamelCase): "
245 'gnome-c-snippet-parent-package
246 (gnome-c-snippet--format-Package
247 (run-hook-with-args-until-success
248 'gnome-c-snippet-guess-name-functions
249 'parent-package)))
250 (gnome-c-snippet--read-name
251 "Parent class (CamelCase): "
252 'gnome-c-snippet-parent-class
253 (gnome-c-snippet--format-Class
254 (run-hook-with-args-until-success
255 'gnome-c-snippet-guess-name-functions
256 'parent-class)))))))
257
258 (defun gnome-c-snippet--format-PACKAGE (package)
259 (mapconcat #'upcase package "_"))
260 (defalias 'gnome-c-snippet--format-CLASS 'gnome-c-snippet--format-PACKAGE)
261
262 (defun gnome-c-snippet--format-PACKAGE_CLASS (package class)
263 (concat (gnome-c-snippet--format-PACKAGE package)
264 "_"
265 (gnome-c-snippet--format-CLASS class)))
266
267 (defun gnome-c-snippet--format-package (package)
268 (mapconcat #'downcase package "_"))
269 (defalias 'gnome-c-snippet--format-class 'gnome-c-snippet--format-package)
270
271 (defun gnome-c-snippet--format-package_class (package class)
272 (concat (gnome-c-snippet--format-package package)
273 "_"
274 (gnome-c-snippet--format-class class)))
275
276 (defun gnome-c-snippet--format-Package (package)
277 (mapconcat #'identity package ""))
278 (defalias 'gnome-c-snippet--format-Class 'gnome-c-snippet--format-Package)
279
280 (defun gnome-c-snippet--format-PackageClass (package class)
281 (concat (gnome-c-snippet--format-Package package)
282 (gnome-c-snippet--format-Class class)))
283
284 ;;;###autoload
285 (defun gnome-c-snippet-insert-package_class (package class)
286 "Insert the class name before the current point."
287 (interactive (gnome-c-snippet--read-package-and-class nil))
288 (insert (gnome-c-snippet--format-package_class package class)))
289
290 ;;;###autoload
291 (defun gnome-c-snippet-insert-PACKAGE_CLASS (package class)
292 "Insert the class name before the current point."
293 (interactive (gnome-c-snippet--read-package-and-class nil))
294 (insert (gnome-c-snippet--format-PACKAGE_CLASS package class)))
295
296 ;;;###autoload
297 (defun gnome-c-snippet-insert-PackageClass (package class)
298 "Insert the class name (in CamelCase) before the current point."
299 (interactive (gnome-c-snippet--read-package-and-class nil))
300 (insert (gnome-c-snippet--format-PackageClass package class)))
301
302 (defun gnome-c-snippet-insert-interface-declaration (package iface
303 parent-package parent-class)
304 "Insert interface declaration for PACKAGE and IFACE"
305 (interactive (gnome-c-snippet--read-package-and-interface t))
306 (insert "\
307 #define " (gnome-c-snippet--format-PACKAGE package) "_TYPE_" (gnome-c-snippet--format-CLASS iface) " (" (gnome-c-snippet--format-package package) "_" (gnome-c-snippet--format-class iface) "_get_type ())
308 G_DECLARE_INTERFACE (" (gnome-c-snippet--format-PackageClass package iface) ", "
309 (gnome-c-snippet--format-package_class package iface) ", " (gnome-c-snippet--format-PACKAGE package) ", " (gnome-c-snippet--format-CLASS iface) ", " (gnome-c-snippet--format-PackageClass parent-package parent-class) ")
310 "))
311
312 (defun gnome-c-snippet--insert-class-declaration (package
313 class
314 parent-package
315 parent-class
316 derivable)
317 (insert "\
318 #define " (gnome-c-snippet--format-PACKAGE package) "_TYPE_" (gnome-c-snippet--format-CLASS class) " (" (gnome-c-snippet--format-package_class package class) "_get_type ())
319 G_DECLARE_" (if derivable "DERIVABLE" "FINAL") "_TYPE (" (gnome-c-snippet--format-PackageClass package class) ", "
320 (gnome-c-snippet--format-package_class package class) ", " (gnome-c-snippet--format-PACKAGE package) ", " (gnome-c-snippet--format-CLASS class) ", " (gnome-c-snippet--format-PackageClass parent-package parent-class) ")
321 "))
322
323 (defun gnome-c-snippet-insert-final-class-declaration (package
324 class
325 parent-package
326 parent-class)
327 "Insert final class declaration for PACKAGE and CLASS."
328 (interactive (gnome-c-snippet--read-package-and-class t))
329 (gnome-c-snippet--insert-class-declaration package
330 class
331 parent-package
332 parent-class
333 nil))
334
335 (defun gnome-c-snippet-insert-derivable-class-declaration (package
336 class
337 parent-package
338 parent-class)
339 "Insert derivable class declaration for PACKAGE and CLASS."
340 (interactive (gnome-c-snippet--read-package-and-class t))
341 (gnome-c-snippet--insert-class-declaration package
342 class
343 parent-package
344 parent-class
345 t))
346
347 (defun gnome-c-snippet-insert-interface-definition (package
348 iface
349 parent-package
350 parent-class)
351 "Insert class definition for PACKAGE and CLASS."
352 (interactive (gnome-c-snippet--read-package-and-interface t))
353 (insert "\
354 static void
355 " (gnome-c-snippet--format-package_class package iface) "_default_init (" (gnome-c-snippet--format-PackageClass package iface) "Interface *iface) {
356 }
357
358 G_DEFINE_INTERFACE (" (gnome-c-snippet--format-PackageClass package iface) ", "
359 (gnome-c-snippet--format-package_class package iface) ", " (gnome-c-snippet--format-PACKAGE parent-package) "_TYPE_" (gnome-c-snippet--format-CLASS parent-class) ")
360 "))
361
362 (defun gnome-c-snippet--insert-class-definition (package
363 class
364 parent-package
365 parent-class
366 abstract)
367 (insert "\
368 G_DEFINE_" (if abstract "ABSTRACT_" "") "TYPE (" (gnome-c-snippet--format-PackageClass package class) ", "
369 (gnome-c-snippet--format-package_class package class) ", " (gnome-c-snippet--format-PACKAGE parent-package) "_TYPE_" (gnome-c-snippet--format-CLASS parent-class) ")
370
371 static void
372 " (gnome-c-snippet--format-package_class package class) "_class_init (" (gnome-c-snippet--format-PackageClass package class) "Class *klass)
373 {
374 }
375
376 static void
377 " (gnome-c-snippet--format-package_class package class) "_init (" (gnome-c-snippet--format-PackageClass package class) " *self)
378 {
379 }
380 "))
381
382 (defun gnome-c-snippet-insert-class-definition (package
383 class
384 parent-package
385 parent-class)
386 "Insert class definition for PACKAGE and CLASS."
387 (interactive (gnome-c-snippet--read-package-and-class t))
388 (gnome-c-snippet--insert-class-definition package
389 class
390 parent-package
391 parent-class
392 nil))
393
394 (defun gnome-c-snippet-insert-abstract-class-definition (package
395 class
396 parent-package
397 parent-class)
398 "Insert abstract class definition for PACKAGE and CLASS."
399 (interactive (gnome-c-snippet--read-package-and-class t))
400 (gnome-c-snippet--insert-class-definition package
401 class
402 parent-package
403 parent-class
404 t))
405
406 (defun gnome-c-snippet-insert-constructor (package class)
407 "Insert 'constructor' vfunc of GObjectClass for PACKAGE and CLASS."
408 (interactive (gnome-c-snippet--read-package-and-class nil))
409 (let (arglist-start body-start)
410 (insert "\
411 static GObject *
412 " (gnome-c-snippet--format-package_class package class) "_constructor (")
413 (setq arglist-start (point-marker))
414 (insert "GType *object,
415 guint n_construct_properties,
416 GObjectConstructParam *construct_properties)\n")
417 (setq body-start (point-marker))
418 (if gnome-c-snippet-align-arglist
419 (progn
420 (goto-char arglist-start)
421 (gnome-c-align-arglist-at-point))
422 (indent-region arglist-start (point)))
423 (goto-char body-start)
424 (insert "{
425 " (gnome-c-snippet--format-PackageClass package class) " *self = "
426 (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
427
428 G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->constructor (type, n_construct_properties, construct_properties);
429 }
430 ")
431 (indent-region body-start (point))))
432
433 (defun gnome-c-snippet-insert-set_property (package class)
434 "Insert 'set_property' vfunc of GObjectClass for PACKAGE and CLASS."
435 (interactive (gnome-c-snippet--read-package-and-class nil))
436 (let (arglist-start body-start)
437 (insert "\
438 static void
439 " (gnome-c-snippet--format-package_class package class) "_set_property (")
440 (setq arglist-start (point-marker))
441 (insert "GObject *object,
442 guint prop_id,
443 const GValue *value,
444 GParamSpec *pspec)\n")
445 (setq body-start (point-marker))
446 (if gnome-c-snippet-align-arglist
447 (progn
448 (goto-char arglist-start)
449 (gnome-c-align-arglist-at-point))
450 (indent-region arglist-start (point)))
451 (goto-char body-start)
452 (insert "{
453 " (gnome-c-snippet--format-PackageClass package class) " *self = "
454 (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
455
456 switch (prop_id)
457 {
458 default:
459 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
460 break;
461 }
462 }
463 ")
464 (indent-region body-start (point))))
465
466 (defun gnome-c-snippet-insert-get_property (package class)
467 "Insert 'get_property' vfunc of GObjectClass for PACKAGE and CLASS."
468 (interactive (gnome-c-snippet--read-package-and-class nil))
469 (let (arglist-start body-start)
470 (insert "\
471 static void
472 " (gnome-c-snippet--format-package_class package class) "_get_property (")
473 (setq arglist-start (point-marker))
474 (insert "GObject *object,
475 guint prop_id,
476 GValue *value,
477 GParamSpec *pspec)\n")
478 (setq body-start (point-marker))
479 (if gnome-c-snippet-align-arglist
480 (progn
481 (goto-char arglist-start)
482 (gnome-c-align-arglist-at-point))
483 (indent-region arglist-start (point)))
484 (goto-char body-start)
485 (insert "{
486 " (gnome-c-snippet--format-PackageClass package class) " *self = "
487 (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
488
489 switch (prop_id)
490 {
491 default:
492 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
493 break;
494 }
495 }
496 ")
497 (indent-region body-start (point))))
498
499 (defun gnome-c-snippet-insert-dispose (package class)
500 "Insert 'dispose' vfunc of GObjectClass for PACKAGE and CLASS."
501 (interactive (gnome-c-snippet--read-package-and-class nil))
502 (let (body-start)
503 (insert "\
504 static void
505 " (gnome-c-snippet--format-package_class package class) "_dispose (GObject *object)\n")
506 (setq body-start (point-marker))
507 (insert "{
508 " (gnome-c-snippet--format-PackageClass package class) " *self = "
509 (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
510
511 G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->dispose (object);
512 }
513 ")
514 (indent-region body-start (point))))
515
516 (defun gnome-c-snippet-insert-finalize (package class)
517 "Insert 'finalize' vfunc of GObjectClass for PACKAGE and CLASS."
518 (interactive (gnome-c-snippet--read-package-and-class nil))
519 (let (body-start)
520 (insert "\
521 static void
522 " (gnome-c-snippet--format-package_class package class) "_finalize (GObject *object)\n")
523 (setq body-start (point-marker))
524 (insert "{
525 " (gnome-c-snippet--format-PackageClass package class) " *self = "
526 (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
527
528 G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->finalize (object);
529 }
530 ")
531 (indent-region body-start (point))))
532
533 (defun gnome-c-snippet-insert-dispatch_properties_changed (package class)
534 "Insert 'dispatch_properties_changed vfunc of GObjectClass for
535 PACKAGE and CLASS."
536 (interactive (gnome-c-snippet--read-package-and-class nil))
537 (let (arglist-start body-start)
538 (insert "\
539 static void
540 " (gnome-c-snippet--format-package_class package class) "_dispatch_properties_changed (")
541 (setq arglist-start (point-marker))
542 (insert "GObject *object,
543 guint n_pspecs,
544 GParamSpec **pspecs)\n")
545 (setq body-start (point-marker))
546 (if gnome-c-snippet-align-arglist
547 (progn
548 (goto-char arglist-start)
549 (gnome-c-align-arglist-at-point))
550 (indent-region arglist-start (point)))
551 (goto-char body-start)
552 (insert "{
553 " (gnome-c-snippet--format-PackageClass package class) " *self = "
554 (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
555
556 G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->dispatch_properties_changed (object, n_pspecs, pspecs);
557 }
558 ")
559 (indent-region body-start (point))))
560
561 (defun gnome-c-snippet-insert-notify (package class)
562 "Insert 'notify' vfunc of GObjectClass for PACKAGE and CLASS."
563 (interactive (gnome-c-snippet--read-package-and-class nil))
564 (let (arglist-start body-start)
565 (insert "\
566 static void
567 " (gnome-c-snippet--format-package_class package class) "_notify (")
568 (setq arglist-start (point-marker))
569 (insert "GObject *object,
570 GParamSpec *pspec)\n")
571 (setq body-start (point-marker))
572 (if gnome-c-snippet-align-arglist
573 (progn
574 (goto-char arglist-start)
575 (gnome-c-align-arglist-at-point))
576 (indent-region arglist-start (point)))
577 (insert "{
578 " (gnome-c-snippet--format-PackageClass package class) " *self = "
579 (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
580
581 G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->notify (object, pspec);
582 }
583 ")
584 (indent-region body-start (point))))
585
586 (defun gnome-c-snippet-insert-constructed (package class)
587 "Insert 'constructed' vfunc of GObjectClass for PACKAGE and CLASS."
588 (interactive (gnome-c-snippet--read-package-and-class nil))
589 (let (body-start)
590 (insert "\
591 static void
592 " (gnome-c-snippet--format-package_class package class) "_constructed (GObject *object)\n")
593 (setq body-start (point-marker))
594 (insert "{
595 " (gnome-c-snippet--format-PackageClass package class) " *self = "
596 (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
597
598 G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->constructed (object);
599 }
600 ")
601 (indent-region body-start (point))))
602
603 (defvar gnome-c-snippet-snippet-commands
604 '(("G_DECLARE_INTERFACE" . gnome-c-snippet-insert-interface-declaration)
605 ("G_DECLARE_FINAL_TYPE" . gnome-c-snippet-insert-final-class-declaration)
606 ("G_DECLARE_DERIVABLE_TYPE" .
607 gnome-c-snippet-insert-derivable-class-declaration)
608 ("G_DEFINE_INTERFACE" . gnome-c-snippet-insert-interface-definition)
609 ("G_DEFINE_TYPE" . gnome-c-snippet-insert-class-definition)
610 ("G_DEFINE_ABSTRACT_TYPE" .
611 gnome-c-snippet-insert-abstract-class-definition)
612 ("GObjectClass.constructor" . gnome-c-snippet-insert-constructor)
613 ("GObjectClass.set_property" . gnome-c-snippet-insert-set_property)
614 ("GObjectClass.get_property" . gnome-c-snippet-insert-get_property)
615 ("GObjectClass.dispose" . gnome-c-snippet-insert-dispose)
616 ("GObjectClass.finalize" . gnome-c-snippet-insert-finalize)
617 ("GObjectClass.dispatch_properties_changed" .
618 gnome-c-snippet-insert-dispatch_properties_changed)
619 ("GObjectClass.notify" . gnome-c-snippet-insert-notify)
620 ("GObjectClass.constructed" . gnome-c-snippet-insert-constructed)))
621
622 ;;;###autoload
623 (defun gnome-c-snippet-insert (snippet)
624 (interactive
625 (list (completing-read "Snippet: " gnome-c-snippet-snippet-commands nil t)))
626 (let ((entry (assoc snippet gnome-c-snippet-snippet-commands)))
627 (unless entry
628 (error "Unknown snippet: %s" snippet))
629 (call-interactively (cdr entry))))
630
631 (provide 'gnome-c-snippet)
632
633 ;;; gnome-c-snippet.el ends here