From a654ab4a50b5e598b55a2802b82a1884985b384a Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Tue, 19 Jan 2016 10:55:20 +0900 Subject: [PATCH] Rename to gnome-c-style Suggested by Bill Wohler and Artur Malabarba. --- Makefile | 4 +- README.md | 8 +- gnome-align.el => gnome-c-align.el | 299 ++++++++--------- gnome-c-snippet.el | 520 +++++++++++++++++++++++++++++ gnome-c-style.el | 55 +++ gnome-tests.el => gnome-c-tests.el | 84 ++--- gnome-minor-mode.el | 65 ---- gnome-snippet.el | 520 ----------------------------- 8 files changed, 770 insertions(+), 785 deletions(-) rename gnome-align.el => gnome-c-align.el (55%) create mode 100644 gnome-c-snippet.el create mode 100644 gnome-c-style.el rename gnome-tests.el => gnome-c-tests.el (60%) delete mode 100644 gnome-minor-mode.el delete mode 100644 gnome-snippet.el diff --git a/Makefile b/Makefile index 3e031e6d9..571841efa 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ EMACS ?= emacs RM ?= rm -ELC = gnome-align.elc gnome-snippet.elc gnome-minor-mode.elc +ELC = gnome-c-align.elc gnome-c-snippet.elc gnome-c-style.elc all: $(ELC) @@ -10,7 +10,7 @@ all: $(ELC) check: $(EMACS) -Q -batch --eval "(setq load-path (cons nil load-path))" \ - -l ert -l gnome-tests.el -f ert-run-tests-batch-and-exit + -l ert -l gnome-c-tests.el -f ert-run-tests-batch-and-exit clean: $(RM) -rf $(ELC) diff --git a/README.md b/README.md index a8f06a5be..336a4629f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -gnome-minor-mode +gnome-c-style ====== In the C coding style commonly used in GNOME, identifiers are written @@ -6,7 +6,7 @@ in camel case and function arguments are aligned to the right end. That makes it a bit cumbersome to keep your code consistent with the style, even with align.el or plugins like yasnippet. -gnome-minor-mode is an Emacs minor mode intended to help editing C +gnome-c-style is an Emacs minor mode intended to help editing C source code in that style. It mainly provides two features: text alignment and snippet insersion. @@ -18,8 +18,8 @@ Install * Add the following lines to ~/.emacs/init.el: ``` -(autoload 'gnome-minor-mode "gnome-minor-mode" "GNOME minor mode" t) -(add-hook 'c-mode-hook 'gnome-minor-mode) +(autoload 'gnome-c-style-mode "gnome-c-style" "GNOME-style C minor mode" t) +(add-hook 'c-mode-hook 'gnome-c-style-mode) ``` Usage diff --git a/gnome-align.el b/gnome-c-align.el similarity index 55% rename from gnome-align.el rename to gnome-c-align.el index 644c0ebdf..d8c6d11d1 100644 --- a/gnome-align.el +++ b/gnome-c-align.el @@ -1,4 +1,4 @@ -;; gnome-align.el --- GNOME-style code alignment -*- lexical-binding: t; -*- +;; gnome-c-align.el --- GNOME-style code alignment -*- lexical-binding: t; -*- ;; Copyright (C) 2016 Daiki Ueno ;; Author: Daiki Ueno @@ -25,29 +25,24 @@ (require 'cc-mode) (require 'cl-lib) -(defgroup gnome-minor-mode nil - "GNOME-style C source code editing" - :prefix "gnome-" - :group 'c) - -(defcustom gnome-align-max-column 80 +(defcustom gnome-c-align-max-column 80 "Maximum number of columns per line." :type '(choice (integer :tag "Columns") (const :tag "No wrap")) - :group 'gnome-minor-mode) + :group 'gnome-c-style) -(defvar gnome-align-identifier-start-column nil) -(make-variable-buffer-local 'gnome-align-identifier-start-column) +(defvar gnome-c-align-identifier-start-column nil) +(make-variable-buffer-local 'gnome-c-align-identifier-start-column) -(defvar gnome-align-arglist-start-column nil) -(make-variable-buffer-local 'gnome-align-arglist-start-column) +(defvar gnome-c-align-arglist-start-column nil) +(make-variable-buffer-local 'gnome-c-align-arglist-start-column) -(defvar gnome-align-arglist-identifier-start-column nil) -(make-variable-buffer-local 'gnome-align-arglist-identifier-start-column) +(defvar gnome-c-align-arglist-identifier-start-column nil) +(make-variable-buffer-local 'gnome-c-align-arglist-identifier-start-column) -(cl-defstruct (gnome-align--argument +(cl-defstruct (gnome-c-align--argument (:constructor nil) - (:constructor gnome-align--make-argument (type-start + (:constructor gnome-c-align--make-argument (type-start type-identifier-end type-end identifier-start @@ -60,12 +55,12 @@ (identifier-start nil :read-only t) (identifier-end nil :read-only t)) -(defun gnome-align--marker-column (marker) +(defun gnome-c-align--marker-column (marker) (save-excursion (goto-char marker) (current-column))) -(defun gnome-align--indent-to-column (column) +(defun gnome-c-align--indent-to-column (column) ;; Prefer 'char **foo' than 'char ** foo' (when (looking-back "\*+" nil t) (setq column (- column (- (match-end 0) (match-beginning 0)))) @@ -74,41 +69,41 @@ (let (indent-tabs-mode) (indent-to-column column))) -(defun gnome-align--argument-type-width (arg) - (- (gnome-align--marker-column (gnome-align--argument-type-end arg)) - (gnome-align--marker-column (gnome-align--argument-type-start arg)))) +(defun gnome-c-align--argument-type-width (arg) + (- (gnome-c-align--marker-column (gnome-c-align--argument-type-end arg)) + (gnome-c-align--marker-column (gnome-c-align--argument-type-start arg)))) -(defun gnome-align--argument-type-identifier-width (arg) - (- (gnome-align--marker-column - (gnome-align--argument-type-identifier-end arg)) - (gnome-align--marker-column - (gnome-align--argument-type-start arg)))) +(defun gnome-c-align--argument-type-identifier-width (arg) + (- (gnome-c-align--marker-column + (gnome-c-align--argument-type-identifier-end arg)) + (gnome-c-align--marker-column + (gnome-c-align--argument-type-start arg)))) -(defun gnome-align--arglist-identifier-start-column (arglist start-column) +(defun gnome-c-align--arglist-identifier-start-column (arglist start-column) (let ((max-type-identifier-width (apply #'max - (mapcar #'gnome-align--argument-type-identifier-width arglist))) + (mapcar #'gnome-c-align--argument-type-identifier-width arglist))) (max-extra-width (apply #'max (mapcar (lambda (argument) - (- (gnome-align--argument-type-end argument) - (gnome-align--argument-type-identifier-end argument))) + (- (gnome-c-align--argument-type-end argument) + (gnome-c-align--argument-type-identifier-end argument))) arglist)))) (+ start-column max-type-identifier-width max-extra-width))) -(defun gnome-align--argument-identifier-width (argument) - (if (gnome-align--argument-identifier-start argument) - (- (gnome-align--marker-column - (gnome-align--argument-identifier-end argument)) - (gnome-align--marker-column - (gnome-align--argument-identifier-start argument))) +(defun gnome-c-align--argument-identifier-width (argument) + (if (gnome-c-align--argument-identifier-start argument) + (- (gnome-c-align--marker-column + (gnome-c-align--argument-identifier-end argument)) + (gnome-c-align--marker-column + (gnome-c-align--argument-identifier-start argument))) 0)) -(defun gnome-align--arglist-identifier-width (arglist) - (apply #'max (mapcar #'gnome-align--argument-identifier-width arglist))) +(defun gnome-c-align--arglist-identifier-width (arglist) + (apply #'max (mapcar #'gnome-c-align--argument-identifier-width arglist))) -(defun gnome-align--normalize-arglist-region (beg end) +(defun gnome-c-align--normalize-arglist-region (beg end) (save-excursion (save-restriction (narrow-to-region beg end) @@ -128,7 +123,7 @@ (goto-char (point-min)) (delete-matching-lines "^$")))) -(defun gnome-align--parse-arglist (beg end) +(defun gnome-c-align--parse-arglist (beg end) (save-excursion (save-restriction (narrow-to-region beg end) @@ -172,7 +167,7 @@ (skip-chars-backward "*" type-start) (c-backward-syntactic-ws) (setq type-identifier-end (point-marker)))) - (push (gnome-align--make-argument type-start + (push (gnome-c-align--make-argument type-start type-identifier-end type-end identifier-start @@ -181,35 +176,35 @@ arglist)))) ;;;###autoload -(defun gnome-align-at-point (&optional identifier-start-column) +(defun gnome-c-align-at-point (&optional identifier-start-column) "Reformat argument list at point, aligning argument to the right end." (interactive) (save-excursion (let* (start-column arglist) (cl-destructuring-bind (beg end) - (gnome-align--arglist-region-at-point (point)) + (gnome-c-align--arglist-region-at-point (point)) (goto-char beg) (setq start-column (current-column)) (save-restriction (narrow-to-region beg end) - (setq arglist (gnome-align--parse-arglist (point-min) (point-max))) - (gnome-align--normalize-arglist-region (point-min) (point-max)) + (setq arglist (gnome-c-align--parse-arglist (point-min) (point-max))) + (gnome-c-align--normalize-arglist-region (point-min) (point-max)) (unless identifier-start-column (setq identifier-start-column - (gnome-align--arglist-identifier-start-column arglist 0))) + (gnome-c-align--arglist-identifier-start-column arglist 0))) (dolist (argument arglist) - (goto-char (gnome-align--argument-type-start argument)) + (goto-char (gnome-c-align--argument-type-start argument)) (let ((column (if (bobp) 0 start-column))) (when (not (bobp)) - (gnome-align--indent-to-column start-column)) - (when (gnome-align--argument-identifier-start argument) + (gnome-c-align--indent-to-column start-column)) + (when (gnome-c-align--argument-identifier-start argument) (setq column (+ column identifier-start-column)) - (goto-char (gnome-align--argument-identifier-start argument)) - (gnome-align--indent-to-column column))))))))) + (goto-char (gnome-c-align--argument-identifier-start argument)) + (gnome-c-align--indent-to-column column))))))))) -(cl-defstruct (gnome-align--decl +(cl-defstruct (gnome-c-align--decl (:constructor nil) - (:constructor gnome-align--make-decl (start + (:constructor gnome-c-align--make-decl (start end identifier-start identifier-end @@ -226,31 +221,31 @@ (arglist-end nil :read-only t) (arglist nil :read-only t)) -(defun gnome-align--decls-identifier-start-column (decls start-column) +(defun gnome-c-align--decls-identifier-start-column (decls start-column) (apply #'max (delq nil (mapcar (lambda (decl) (let ((decl-column (+ start-column - (gnome-align--marker-column - (gnome-align--decl-identifier-start decl))))) - (if (and gnome-align-max-column - (> decl-column gnome-align-max-column)) + (gnome-c-align--marker-column + (gnome-c-align--decl-identifier-start decl))))) + (if (and gnome-c-align-max-column + (> decl-column gnome-c-align-max-column)) nil decl-column))) decls)))) -(defun gnome-align--decl-identifier-width (decl) - (- (gnome-align--marker-column - (gnome-align--decl-identifier-end decl)) - (gnome-align--marker-column - (gnome-align--decl-identifier-start decl)))) +(defun gnome-c-align--decl-identifier-width (decl) + (- (gnome-c-align--marker-column + (gnome-c-align--decl-identifier-end decl)) + (gnome-c-align--marker-column + (gnome-c-align--decl-identifier-start decl)))) -(defun gnome-align--decls-arglist-start-column (decls start-column) +(defun gnome-c-align--decls-arglist-start-column (decls start-column) (let ((arglist-width - (+ (gnome-align--decls-arglist-identifier-start-column decls 0) - (gnome-align--decls-arglist-identifier-width decls) + (+ (gnome-c-align--decls-arglist-identifier-start-column decls 0) + (gnome-c-align--decls-arglist-identifier-width decls) (length ");")))) (apply #'max (delq nil @@ -258,30 +253,30 @@ (lambda (decl) (let ((decl-column (+ start-column - (gnome-align--decl-identifier-width decl) + (gnome-c-align--decl-identifier-width decl) 1))) - (if (and gnome-align-max-column + (if (and gnome-c-align-max-column (> (+ decl-column arglist-width) - gnome-align-max-column)) + gnome-c-align-max-column)) nil decl-column))) decls))))) -(defun gnome-align--decls-arglist-identifier-width (decls) +(defun gnome-c-align--decls-arglist-identifier-width (decls) (apply #'max (mapcar (lambda (decl) - (gnome-align--arglist-identifier-width - (gnome-align--decl-arglist decl))) + (gnome-c-align--arglist-identifier-width + (gnome-c-align--decl-arglist decl))) decls))) -(defun gnome-align--decls-arglist-identifier-start-column (decls start-column) +(defun gnome-c-align--decls-arglist-identifier-start-column (decls start-column) (apply #'max (mapcar (lambda (decl) ;; FIXME: should wrap lines inside argument list? - (gnome-align--arglist-identifier-start-column - (gnome-align--decl-arglist decl) + (gnome-c-align--arglist-identifier-start-column + (gnome-c-align--decl-arglist decl) start-column)) decls))) -(defun gnome-align--parse-decl (beg end) +(defun gnome-c-align--parse-decl (beg end) ;; Parse at most one func declaration found in BEG END. (save-excursion (save-restriction @@ -315,29 +310,29 @@ (goto-char arglist-start) (c-forward-sexp) (setq arglist-end (point-marker)) - (gnome-align--make-decl beg end + (gnome-c-align--make-decl beg end identifier-start identifier-end arglist-start arglist-end - (gnome-align--parse-arglist + (gnome-c-align--parse-arglist (1+ arglist-start) (1- arglist-end))))))))) -(defun gnome-align--normalize-decl (decl) +(defun gnome-c-align--normalize-decl (decl) (save-excursion (save-restriction - (narrow-to-region (gnome-align--decl-identifier-start decl) - (gnome-align--decl-arglist-end decl)) + (narrow-to-region (gnome-c-align--decl-identifier-start decl) + (gnome-c-align--decl-arglist-end decl)) (goto-char (point-min)) (while (re-search-forward "\n" nil t) (replace-match " "))) (save-restriction - (narrow-to-region (gnome-align--decl-start decl) - (gnome-align--decl-end decl)) + (narrow-to-region (gnome-c-align--decl-start decl) + (gnome-c-align--decl-end decl)) (goto-char (point-min)) (while (re-search-forward "\\s-+" nil t) (replace-match " "))))) -(defun gnome-align--arglist-region-at-point (point) +(defun gnome-c-align--arglist-region-at-point (point) (save-excursion (let (start) (goto-char point) @@ -355,7 +350,7 @@ (list start (point))))) ;;;###autoload -(defun gnome-align-set-column (symbol) +(defun gnome-c-align-set-column (symbol) "Set alignment column of SYMBOL." (interactive (let ((symbol-name (completing-read "Symbol to change: " @@ -363,10 +358,10 @@ "arglist-start" "arglist-identifier-start") nil t))) - (list (intern (format "gnome-align-%s-column" symbol-name))))) + (list (intern (format "gnome-c-align-%s-column" symbol-name))))) (set symbol (current-column))) -(defun gnome-align--scan-decls (beg end) +(defun gnome-c-align--scan-decls (beg end) (save-excursion (save-restriction (narrow-to-region beg end) @@ -378,27 +373,27 @@ (setq decl-start (point-marker)) (c-end-of-statement) (setq decl-end (point-marker)) - (setq decl (gnome-align--parse-decl decl-start decl-end)) + (setq decl (gnome-c-align--parse-decl decl-start decl-end)) (when decl (push decl decls)))) decls)))) -(defun gnome-align--compute-optimal-columns (beg end) +(defun gnome-c-align--compute-optimal-columns (beg end) (let ((buffer (current-buffer)) decls) (with-temp-buffer (insert-buffer-substring-no-properties buffer beg end) (c-mode) - (setq decls (gnome-align--scan-decls (point-min) (point-max))) - (mapc #'gnome-align--normalize-decl decls) + (setq decls (gnome-c-align--scan-decls (point-min) (point-max))) + (mapc #'gnome-c-align--normalize-decl decls) (let* ((identifier-start-column - (gnome-align--decls-identifier-start-column + (gnome-c-align--decls-identifier-start-column decls 0)) (arglist-start-column - (gnome-align--decls-arglist-start-column + (gnome-c-align--decls-arglist-start-column decls identifier-start-column)) (arglist-identifier-start-column - (gnome-align--decls-arglist-identifier-start-column + (gnome-c-align--decls-arglist-identifier-start-column decls (+ (length "(") arglist-start-column)))) (list (cons 'identifier-start-column identifier-start-column) @@ -408,99 +403,99 @@ arglist-identifier-start-column)))))) ;;;###autoload -(defun gnome-align-compute-optimal-columns (beg end) +(defun gnome-c-align-compute-optimal-columns (beg end) "Compute the optimal alignment rule from the declarations in BEG and END. -This sets `gnome-align-identifier-start-column', -`gnome-align-arglist-start-column', and -`gnome-align-arglist-identifier-start-column'." +This sets `gnome-c-align-identifier-start-column', +`gnome-c-align-arglist-start-column', and +`gnome-c-align-arglist-identifier-start-column'." (interactive "r") - (let ((columns (gnome-align--compute-optimal-columns beg end))) - (setq gnome-align-identifier-start-column + (let ((columns (gnome-c-align--compute-optimal-columns beg end))) + (setq gnome-c-align-identifier-start-column (cdr (assq 'identifier-start-column columns)) - gnome-align-arglist-start-column + gnome-c-align-arglist-start-column (cdr (assq 'arglist-start-column columns)) - gnome-align-arglist-identifier-start-column + gnome-c-align-arglist-identifier-start-column (cdr (assq 'arglist-identifier-start-column columns))) (message "identifier-start: %d, arglist-start: %d, arglist-identifier-start: %d" - gnome-align-identifier-start-column - gnome-align-arglist-start-column - gnome-align-arglist-identifier-start-column))) + gnome-c-align-identifier-start-column + gnome-c-align-arglist-start-column + gnome-c-align-arglist-identifier-start-column))) ;;;###autoload -(defun gnome-align-guess-columns (beg end) +(defun gnome-c-align-guess-columns (beg end) "Guess the existing alignment rule from the declarations in BEG and END. -This sets `gnome-align-identifier-start-column', -`gnome-align-arglist-start-column', and -`gnome-align-arglist-identifier-start-column'." +This sets `gnome-c-align-identifier-start-column', +`gnome-c-align-arglist-start-column', and +`gnome-c-align-arglist-identifier-start-column'." (interactive "r") - (let ((decls (gnome-align--scan-decls beg end)) + (let ((decls (gnome-c-align--scan-decls beg end)) arglist) (unless decls (error "No function declaration in the region")) - (setq arglist (gnome-align--parse-arglist - (1+ (gnome-align--decl-arglist-start (car decls))) - (1- (gnome-align--decl-arglist-end (car decls))))) + (setq arglist (gnome-c-align--parse-arglist + (1+ (gnome-c-align--decl-arglist-start (car decls))) + (1- (gnome-c-align--decl-arglist-end (car decls))))) (unless arglist (error "Empty argument list")) - (unless (gnome-align--argument-identifier-start (car arglist)) + (unless (gnome-c-align--argument-identifier-start (car arglist)) (error "No identifier in the argument list")) - (setq gnome-align-identifier-start-column - (gnome-align--marker-column - (gnome-align--decl-identifier-start (car decls))) - gnome-align-arglist-start-column - (gnome-align--marker-column - (gnome-align--decl-arglist-start (car decls))) - gnome-align-arglist-identifier-start-column - (gnome-align--marker-column - (gnome-align--argument-identifier-start (car arglist)))) + (setq gnome-c-align-identifier-start-column + (gnome-c-align--marker-column + (gnome-c-align--decl-identifier-start (car decls))) + gnome-c-align-arglist-start-column + (gnome-c-align--marker-column + (gnome-c-align--decl-arglist-start (car decls))) + gnome-c-align-arglist-identifier-start-column + (gnome-c-align--marker-column + (gnome-c-align--argument-identifier-start (car arglist)))) (message "identifier-start: %d, arglist-start: %d, arglist-identifier-start: %d" - gnome-align-identifier-start-column - gnome-align-arglist-start-column - gnome-align-arglist-identifier-start-column))) + gnome-c-align-identifier-start-column + gnome-c-align-arglist-start-column + gnome-c-align-arglist-identifier-start-column))) ;;;###autoload -(defun gnome-align-region (beg end) +(defun gnome-c-align-region (beg end) "Reformat function declarations in the region between BEG and END." (interactive "r") (save-excursion (let (decls) (save-restriction (narrow-to-region beg end) - (unless (and gnome-align-identifier-start-column - gnome-align-arglist-start-column - gnome-align-arglist-identifier-start-column) - (let ((columns (gnome-align--compute-optimal-columns beg end))) - (unless gnome-align-identifier-start-column - (setq gnome-align-identifier-start-column + (unless (and gnome-c-align-identifier-start-column + gnome-c-align-arglist-start-column + gnome-c-align-arglist-identifier-start-column) + (let ((columns (gnome-c-align--compute-optimal-columns beg end))) + (unless gnome-c-align-identifier-start-column + (setq gnome-c-align-identifier-start-column (cdr (assq 'identifier-start-column columns)))) - (unless gnome-align-arglist-start-column - (setq gnome-align-arglist-start-column + (unless gnome-c-align-arglist-start-column + (setq gnome-c-align-arglist-start-column (cdr (assq 'arglist-start-column columns)))) - (unless gnome-align-arglist-identifier-start-column - (setq gnome-align-arglist-identifier-start-column + (unless gnome-c-align-arglist-identifier-start-column + (setq gnome-c-align-arglist-identifier-start-column (cdr (assq 'arglist-identifier-start-column columns)))))) - (setq decls (gnome-align--scan-decls beg end)) - (mapc #'gnome-align--normalize-decl decls) + (setq decls (gnome-c-align--scan-decls beg end)) + (mapc #'gnome-c-align--normalize-decl decls) (dolist (decl decls) - (goto-char (gnome-align--decl-identifier-start decl)) - (gnome-align--indent-to-column - gnome-align-identifier-start-column) - (goto-char (gnome-align--decl-identifier-end decl)) - (when (>= (current-column) gnome-align-arglist-start-column) + (goto-char (gnome-c-align--decl-identifier-start decl)) + (gnome-c-align--indent-to-column + gnome-c-align-identifier-start-column) + (goto-char (gnome-c-align--decl-identifier-end decl)) + (when (>= (current-column) gnome-c-align-arglist-start-column) (insert "\n")) - (goto-char (gnome-align--decl-arglist-start decl)) - (gnome-align--indent-to-column - gnome-align-arglist-start-column) + (goto-char (gnome-c-align--decl-arglist-start decl)) + (gnome-c-align--indent-to-column + gnome-c-align-arglist-start-column) (forward-char) - (gnome-align-at-point - (- (- gnome-align-arglist-identifier-start-column + (gnome-c-align-at-point + (- (- gnome-c-align-arglist-identifier-start-column (length "(")) - gnome-align-arglist-start-column))))))) + gnome-c-align-arglist-start-column))))))) -(provide 'gnome-align) +(provide 'gnome-c-align) -;;; gnome-align.el ends here +;;; gnome-c-align.el ends here diff --git a/gnome-c-snippet.el b/gnome-c-snippet.el new file mode 100644 index 000000000..0f18834f1 --- /dev/null +++ b/gnome-c-snippet.el @@ -0,0 +1,520 @@ +;;; gnome-c-snippet.el --- GNOME-style code generation -*- lexical-binding: t; -*- +;; Copyright (C) 2016 Daiki Ueno + +;; Author: Daiki Ueno +;; Keywords: GNOME, C, coding style + +;; This file is not part of GNU Emacs. + +;; This program is free software: you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation, either version 3 of the +;; License, or (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see +;; . + +;;; Code: + +(require 'gnome-c-align) + +(eval-when-compile + (require 'subword)) + +(declare-function subword-forward "subword.el" (&optional arg)) + +(defvar gnome-c-snippet-package nil) +(make-variable-buffer-local 'gnome-c-snippet-package) + +(defvar gnome-c-snippet-class nil) +(make-variable-buffer-local 'gnome-c-snippet-class) + +(defvar gnome-c-snippet-parent-package nil) +(make-variable-buffer-local 'gnome-c-snippet-parent-package) + +(defvar gnome-c-snippet-parent-class nil) +(make-variable-buffer-local 'gnome-c-snippet-parent-class) + +(defcustom gnome-c-snippet-align-arglist t + "Whether to align argument list of the inserted snippet" + :type 'boolean + :group 'gnome-c-style) + +(make-variable-buffer-local 'gnome-c-snippet-align-arglist) + +(defun gnome-c-snippet--parse-name (name) + (require 'subword) + (with-temp-buffer + (let (words) + (insert name) + (goto-char (point-min)) + (while (not (eobp)) + ;; Skip characters not recognized by subword-mode. + (if (looking-at "[^[:lower:][:upper:][:digit:]]+") + (goto-char (match-end 0))) + (push (buffer-substring (point) (progn (subword-forward 1) + (point))) + words)) + (nreverse words)))) + +(defun gnome-c-snippet--read-package-and-class (package-prompt + class-prompt + package-symbol + class-symbol) + (when (or current-prefix-arg + (not (and (symbol-value package-symbol) + (symbol-value class-symbol)))) + (set package-symbol + (gnome-c-snippet--parse-name + (read-string (or package-prompt + "Package (CamelCase): ") + (if (symbol-value package-symbol) + (gnome-c-snippet--format-Package + (symbol-value package-symbol)))))) + (set class-symbol + (gnome-c-snippet--parse-name + (read-string (or class-prompt + "Class (CamelCase): ") + (if (symbol-value class-symbol) + (gnome-c-snippet--format-Class + (symbol-value class-symbol))))))) + (list (symbol-value package-symbol) (symbol-value class-symbol))) + +(defun gnome-c-snippet--format-PACKAGE (package) + (mapconcat #'upcase package "_")) +(defalias 'gnome-c-snippet--format-CLASS 'gnome-c-snippet--format-PACKAGE) + +(defun gnome-c-snippet--format-PACKAGE_CLASS (package class) + (concat (gnome-c-snippet--format-PACKAGE package) + "_" + (gnome-c-snippet--format-CLASS class))) + +(defun gnome-c-snippet--format-package (package) + (mapconcat #'downcase package "_")) +(defalias 'gnome-c-snippet--format-class 'gnome-c-snippet--format-package) + +(defun gnome-c-snippet--format-package_class (package class) + (concat (gnome-c-snippet--format-package package) + "_" + (gnome-c-snippet--format-class class))) + +(defun gnome-c-snippet--format-Package (package) + (mapconcat #'identity package "")) +(defalias 'gnome-c-snippet--format-Class 'gnome-c-snippet--format-Package) + +(defun gnome-c-snippet--format-PackageClass (package class) + (concat (gnome-c-snippet--format-Package package) + (gnome-c-snippet--format-Class class))) + +;;;###autoload +(defun gnome-c-snippet-insert-package_class (package class) + "Insert the class name before the current point." + (interactive (gnome-c-snippet--read-package-and-class + nil nil + 'gnome-c-snippet-package + 'gnome-c-snippet-class)) + (insert (gnome-c-snippet--format-package_class package class))) + +;;;###autoload +(defun gnome-c-snippet-insert-PACKAGE_CLASS (package class) + "Insert the class name before the current point." + (interactive (gnome-c-snippet--read-package-and-class + nil nil + 'gnome-c-snippet-package + 'gnome-c-snippet-class)) + (insert (gnome-c-snippet--format-PACKAGE_CLASS package class))) + +;;;###autoload +(defun gnome-c-snippet-insert-PackageClass (package class) + "Insert the class name (in CamelCase) before the current point." + (interactive (gnome-c-snippet--read-package-and-class + nil nil + 'gnome-c-snippet-package + 'gnome-c-snippet-class)) + (insert (gnome-c-snippet--format-PackageClass package class))) + +(defun gnome-c-snippet-insert-interface-declaration (package iface + parent-package parent-class) + "Insert interface declaration for PACKAGE and IFACE" + (interactive + (append (gnome-c-snippet--read-package-and-class + nil + "Interface (CamelCase): " + 'gnome-c-snippet-package + 'gnome-c-snippet-class) + (gnome-c-snippet--read-package-and-class + "Parent package (CamelCase): " + "Parent class (CamelCase): " + 'gnome-c-snippet-parent-package + 'gnome-c-snippet-parent-class))) + (insert "\ +#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 ()) +G_DECLARE_INTERFACE (" (gnome-c-snippet--format-PackageClass package iface) ", " +(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) ") +")) + +(defun gnome-c-snippet--insert-class-declaration (package + class + parent-package + parent-class + derivable) + (insert "\ +#define " (gnome-c-snippet--format-PACKAGE package) "_TYPE_" (gnome-c-snippet--format-CLASS class) " (" (gnome-c-snippet--format-package_class package class) "_get_type ()) +G_DECLARE_" (if derivable "DERIVABLE" "FINAL") "_TYPE (" (gnome-c-snippet--format-PackageClass package class) ", " +(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) ") +")) + +(defun gnome-c-snippet-insert-final-class-declaration (package + class + parent-package + parent-class) + "Insert final class declaration for PACKAGE and CLASS." + (interactive + (append (gnome-c-snippet--read-package-and-class + nil nil + 'gnome-c-snippet-package + 'gnome-c-snippet-class) + (gnome-c-snippet--read-package-and-class + "Parent package (CamelCase): " + "Parent class (CamelCase): " + 'gnome-c-snippet-parent-package + 'gnome-c-snippet-parent-class))) + (gnome-c-snippet--insert-class-declaration package + class + parent-package + parent-class + nil)) + +(defun gnome-c-snippet-insert-derivable-class-declaration (package + class + parent-package + parent-class) + "Insert derivable class declaration for PACKAGE and CLASS." + (interactive + (append (gnome-c-snippet--read-package-and-class + nil nil + 'gnome-c-snippet-package + 'gnome-c-snippet-class) + (gnome-c-snippet--read-package-and-class + "Parent package (CamelCase): " + "Parent class (CamelCase): " + 'gnome-c-snippet-parent-package + 'gnome-c-snippet-parent-class))) + (gnome-c-snippet--insert-class-declaration package + class + parent-package + parent-class + t)) + +(defun gnome-c-snippet-insert-interface-definition (package + iface + parent-package + parent-class) + "Insert class definition for PACKAGE and CLASS." + (interactive + (append (gnome-c-snippet--read-package-and-class + nil + "Interface (CamelCase): " + 'gnome-c-snippet-package + 'gnome-c-snippet-class) + (gnome-c-snippet--read-package-and-class + "Parent package (CamelCase): " + "Parent class (CamelCase): " + 'gnome-c-snippet-parent-package + 'gnome-c-snippet-parent-class))) + (insert "\ +static void +" (gnome-c-snippet--format-package_class package iface) "_default_init (" (gnome-c-snippet--format-PackageClass package iface) "Interface *iface) { +} + +G_DEFINE_INTERFACE (" (gnome-c-snippet--format-PackageClass package iface) ", " +(gnome-c-snippet--format-package_class package iface) ", " (gnome-c-snippet--format-PACKAGE parent-package) "_TYPE_" (gnome-c-snippet--format-CLASS parent-class) ") +")) + +(defun gnome-c-snippet--insert-class-definition (package + class + parent-package + parent-class + abstract) + (insert "\ +G_DEFINE_" (if abstract "ABSTRACT_" "") "TYPE (" (gnome-c-snippet--format-PackageClass package class) ", " +(gnome-c-snippet--format-package_class package class) ", " (gnome-c-snippet--format-PACKAGE parent-package) "_TYPE_" (gnome-c-snippet--format-CLASS parent-class) ") + +static void +" (gnome-c-snippet--format-package_class package class) "_class_init (" (gnome-c-snippet--format-PackageClass package class) "Class *klass) +{ +} + +static void +" (gnome-c-snippet--format-package_class package class) "_init (" (gnome-c-snippet--format-PackageClass package class) " *self) +{ +} +")) + +(defun gnome-c-snippet-insert-class-definition (package + class + parent-package + parent-class) + "Insert class definition for PACKAGE and CLASS." + (interactive + (append (gnome-c-snippet--read-package-and-class + nil nil + 'gnome-c-snippet-package + 'gnome-c-snippet-class) + (gnome-c-snippet--read-package-and-class + "Parent package (CamelCase): " + "Parent class (CamelCase): " + 'gnome-c-snippet-parent-package + 'gnome-c-snippet-parent-class))) + (gnome-c-snippet--insert-class-definition package + class + parent-package + parent-class + nil)) + +(defun gnome-c-snippet-insert-abstract-class-definition (package + class + parent-package + parent-class) + "Insert abstract class definition for PACKAGE and CLASS." + (interactive + (append (gnome-c-snippet--read-package-and-class + nil nil + 'gnome-c-snippet-package + 'gnome-c-snippet-class) + (gnome-c-snippet--read-package-and-class + "Parent package (CamelCase): " + "Parent class (CamelCase): " + 'gnome-c-snippet-parent-package + 'gnome-c-snippet-parent-class))) + (gnome-c-snippet--insert-class-definition package + class + parent-package + parent-class + t)) + +(defun gnome-c-snippet-insert-constructor (package class) + "Insert 'constructor' vfunc of GObjectClass for PACKAGE and CLASS." + (interactive + (gnome-c-snippet--read-package-and-class + nil nil + 'gnome-c-snippet-package + 'gnome-c-snippet-class)) + (let (arglist-start body-start) + (insert "\ +static GObject * +" (gnome-c-snippet--format-package_class package class) "_constructor (") + (setq arglist-start (point-marker)) + (insert "GType *object, +guint n_construct_properties, +GObjectConstructParam *construct_properties)\n") + (setq body-start (point-marker)) + (if gnome-c-snippet-align-arglist + (progn + (goto-char arglist-start) + (gnome-c-align-at-point)) + (indent-region arglist-start (point))) + (goto-char body-start) + (insert "{ + " (gnome-c-snippet--format-PackageClass package class) " *self = " + (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object); + + G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->constructed (object); +} +") + (indent-region body-start (point)))) + +(defun gnome-c-snippet-insert-set_property (package class) + "Insert 'set_property' vfunc of GObjectClass for PACKAGE and CLASS." + (interactive + (gnome-c-snippet--read-package-and-class + nil nil + 'gnome-c-snippet-package + 'gnome-c-snippet-class)) + (let (arglist-start body-start) + (insert "\ +static void +" (gnome-c-snippet--format-package_class package class) "_set_property (") + (setq arglist-start (point-marker)) + (insert "GObject *object, +guint prop_id, +const GValue *value, +GParamSpec *pspec)\n") + (setq body-start (point-marker)) + (if gnome-c-snippet-align-arglist + (progn + (goto-char arglist-start) + (gnome-c-align-at-point)) + (indent-region arglist-start (point))) + (goto-char body-start) + (insert "{ + " (gnome-c-snippet--format-PackageClass package class) " *self = " + (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object); + + switch (prop_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} +") + (indent-region body-start (point)))) + +(defun gnome-c-snippet-insert-get_property (package class) + "Insert 'get_property' vfunc of GObjectClass for PACKAGE and CLASS." + (interactive + (gnome-c-snippet--read-package-and-class + nil nil + 'gnome-c-snippet-package + 'gnome-c-snippet-class)) + (let (arglist-start body-start) + (insert "\ +static void +" (gnome-c-snippet--format-package_class package class) "_get_property (") + (setq arglist-start (point-marker)) + (insert "GObject *object, +guint prop_id, +GValue *value, +GParamSpec *pspec)\n") + (setq body-start (point-marker)) + (if gnome-c-snippet-align-arglist + (progn + (goto-char arglist-start) + (gnome-c-align-at-point)) + (indent-region arglist-start (point))) + (goto-char body-start) + (insert "{ + " (gnome-c-snippet--format-PackageClass package class) " *self = " +(gnome-c-snippet--format-PACKAGE_CLASS package class) " (object); + + switch (prop_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} +") + (indent-region body-start (point)))) + +(defun gnome-c-snippet-insert-dispose (package class) + "Insert 'dispose' vfunc of GObjectClass for PACKAGE and CLASS." + (interactive + (gnome-c-snippet--read-package-and-class + nil nil + 'gnome-c-snippet-package + 'gnome-c-snippet-class)) + (let (body-start) + (insert "\ +static void +" (gnome-c-snippet--format-package_class package class) "_dispose (GObject *object)\n") + (setq body-start (point-marker)) + (insert "{ + " (gnome-c-snippet--format-PackageClass package class) " *self = " + (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object); + + G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->dispose (object); +} +") + (indent-region body-start (point)))) + +(defun gnome-c-snippet-insert-finalize (package class) + "Insert 'finalize' vfunc of GObjectClass for PACKAGE and CLASS." + (interactive + (gnome-c-snippet--read-package-and-class + nil nil + 'gnome-c-snippet-package + 'gnome-c-snippet-class)) + (let (body-start) + (insert "\ +static void +" (gnome-c-snippet--format-package_class package class) "_finalize (GObject *object)\n") + (setq body-start (point-marker)) + (insert "{ + " (gnome-c-snippet--format-PackageClass package class) " *self = " + (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object); + + G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->finalize (object); +} +") + (indent-region body-start (point)))) + +(defun gnome-c-snippet-insert-notify (package class) + "Insert 'notify' vfunc of GObjectClass for PACKAGE and CLASS." + (interactive + (gnome-c-snippet--read-package-and-class + nil nil + 'gnome-c-snippet-package + 'gnome-c-snippet-class)) + (let (body-start) + (insert "\ +static void +" (gnome-c-snippet--format-package_class package class) "_notify (GObject *object)\n") + (setq body-start (point-marker)) + (insert "{ + " (gnome-c-snippet--format-PackageClass package class) " *self = " + (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object); + + G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->finalize (object); +} +") + (indent-region body-start (point)))) + +(defun gnome-c-snippet-insert-constructed (package class) + "Insert 'constructed' vfunc of GObjectClass for PACKAGE and CLASS." + (interactive + (gnome-c-snippet--read-package-and-class + nil nil + 'gnome-c-snippet-package + 'gnome-c-snippet-class)) + (let (body-start) + (insert "\ +static void +" (gnome-c-snippet--format-package_class package class) "_constructed (GObject *object)\n") + (setq body-start (point-marker)) + (insert "{ + " (gnome-c-snippet--format-PackageClass package class) " *self = " + (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object); + + G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->constructed (object); +} +") + (indent-region body-start (point)))) + +(defvar gnome-c-snippet-snippet-commands + '(("G_DECLARE_INTERFACE" . gnome-c-snippet-insert-interface-declaration) + ("G_DECLARE_FINAL_TYPE" . gnome-c-snippet-insert-final-class-declaration) + ("G_DECLARE_DERIVABLE_TYPE" . + gnome-c-snippet-insert-derivable-class-declaration) + ("G_DEFINE_INTERFACE" . gnome-c-snippet-insert-interface-definition) + ("G_DEFINE_TYPE" . gnome-c-snippet-insert-class-definition) + ("G_DEFINE_ABSTRACT_TYPE" . + gnome-c-snippet-insert-abstract-class-definition) + ("GObjectClass.constructor" . gnome-c-snippet-insert-constructor) + ("GObjectClass.set_property" . gnome-c-snippet-insert-set_property) + ("GObjectClass.get_property" . gnome-c-snippet-insert-get_property) + ("GObjectClass.dispose" . gnome-c-snippet-insert-dispose) + ("GObjectClass.finalize" . gnome-c-snippet-insert-finalize) + ;; GObjectClass.dispatch_properties_changed + ("GObjectClass.notify" . gnome-c-snippet-insert-notify) + ("GObjectClass.contructed" . gnome-c-snippet-insert-constructed))) + +;;;###autoload +(defun gnome-c-snippet-insert (snippet) + (interactive + (list (completing-read "Snippet: " gnome-c-snippet-snippet-commands nil t))) + (let ((entry (assoc snippet gnome-c-snippet-snippet-commands))) + (unless entry + (error "Unknown snippet: %s" snippet)) + (call-interactively (cdr entry)))) + +(provide 'gnome-c-snippet) + +;;; gnome-c-snippet.el ends here diff --git a/gnome-c-style.el b/gnome-c-style.el new file mode 100644 index 000000000..197db136b --- /dev/null +++ b/gnome-c-style.el @@ -0,0 +1,55 @@ +;;; gnome-c-style.el --- minor mode for editing GNOME-style C source code -*- lexical-binding: t; -*- +;; Copyright (C) 2016 Daiki Ueno + +;; Author: Daiki Ueno +;; Keywords: GNOME, C, coding style +;; Version: 0.1 +;; Maintainer: Daiki Ueno + +;; This file is not part of GNU Emacs. + +;; This program is free software: you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation, either version 3 of the +;; License, or (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see +;; . + +;;; Code: + +(require 'gnome-c-align) +(require 'gnome-c-snippet) + +(defgroup gnome-c-style nil + "GNOME-style C source code editing" + :prefix "gnome-c-" + :group 'c) + +(defvar gnome-c-style-mode-map + (let ((keymap (make-sparse-keymap))) + (define-key keymap "\C-c\C-ga" 'gnome-c-align-at-point) + (define-key keymap "\C-c\C-gr" 'gnome-c-align-region) + (define-key keymap "\C-c\C-gf" 'gnome-c-align-set-column) + (define-key keymap "\C-c\C-gg" 'gnome-c-align-guess-columns) + (define-key keymap "\C-c\C-g\C-g" 'gnome-c-align-compute-optimal-columns) + (define-key keymap "\C-c\C-gc" 'gnome-c-snippet-insert-package_class) + (define-key keymap "\C-c\C-gC" 'gnome-c-snippet-insert-PACKAGE_CLASS) + (define-key keymap "\C-c\C-g\C-c" 'gnome-c-snippet-insert-PackageClass) + (define-key keymap "\C-c\C-gs" 'gnome-c-snippet-insert) + keymap)) + +;;;###autoload +(define-minor-mode gnome-c-style-mode + "A minor-mode for editing GNOME-style C source code." + nil " GNOME" gnome-c-style-map) + +(provide 'gnome-c-style) + +;;; gnome-c-style.el ends here diff --git a/gnome-tests.el b/gnome-c-tests.el similarity index 60% rename from gnome-tests.el rename to gnome-c-tests.el index 824540780..ad4c9b204 100644 --- a/gnome-tests.el +++ b/gnome-c-tests.el @@ -1,6 +1,6 @@ -(require 'gnome-align) +(require 'gnome-c-align) -(defconst gnome-test-program-1 "\ +(defconst gnome-c-test-program-1 "\ GGpgCtx *g_gpg_ctx_new (GError **error); typedef void (*GGpgProgressCallback) (gpointer user_data, @@ -19,7 +19,7 @@ GGpgKey *g_gpg_ctx_get_signer (GGpgCtx *ctx, guint index); void g_gpg_ctx_clear_signers (GGpgCtx *ctx); ") -(defconst gnome-test-program-1-aligned "\ +(defconst gnome-c-test-program-1-aligned "\ GGpgCtx *g_gpg_ctx_new (GError **error); typedef void (*GGpgProgressCallback) (gpointer user_data, @@ -40,12 +40,12 @@ GGpgKey *g_gpg_ctx_get_signer (GGpgCtx *ctx, void g_gpg_ctx_clear_signers (GGpgCtx *ctx); ") -(defconst gnome-test-program-2 "\ +(defconst gnome-c-test-program-2 "\ GDK_AVAILABLE_IN_3_16 const gchar ** gtk_widget_list_action_prefixes (GtkWidget *widget); ") -(defconst gnome-test-program-3 "\ +(defconst gnome-c-test-program-3 "\ /* overridable methods */ void (*set_property) (GObject *object, guint property_id, @@ -57,68 +57,68 @@ const gchar ** gtk_widget_list_action_prefixes (GtkWidget * GParamSpec *pspec); ") -(defconst gnome-test-program-4 "\ +(defconst gnome-c-test-program-4 "\ FOO_AVAILABLE_IN_ALL int foo (struct foo ***a, int b, ...) G_GNUC_CONST; ") -(defconst gnome-test-program-4-aligned "\ +(defconst gnome-c-test-program-4-aligned "\ FOO_AVAILABLE_IN_ALL int foo (struct foo ***a, int b, ...) G_GNUC_CONST; ") -(ert-deftest gnome-test-align--compute-optimal-columns () - "Tests the `gnome-align--compute-optimal-columns'." +(ert-deftest gnome-c-test-align--compute-optimal-columns () + "Tests the `gnome-c-align--compute-optimal-columns'." (with-temp-buffer - (insert gnome-test-program-1) + (insert gnome-c-test-program-1) (c-mode) - (let* (gnome-align-max-column + (let* (gnome-c-align-max-column (columns - (gnome-align--compute-optimal-columns (point-min) (point-max)))) + (gnome-c-align--compute-optimal-columns (point-min) (point-max)))) (should (= (cdr (assq 'identifier-start-column columns)) 9)) (should (= (cdr (assq 'arglist-start-column columns)) 41)) (should (= (cdr (assq 'arglist-identifier-start-column columns)) 64))))) -(ert-deftest gnome-test-align-region () - "Tests the `gnome-align-region'." +(ert-deftest gnome-c-test-align-region () + "Tests the `gnome-c-align-region'." (with-temp-buffer - (insert gnome-test-program-1) + (insert gnome-c-test-program-1) (c-mode) - (let (gnome-align-max-column) - (gnome-align-compute-optimal-columns (point-min) (point-max)) - (gnome-align-region (point-min) (point-max))) - (should (equal (buffer-string) gnome-test-program-1-aligned)))) + (let (gnome-c-align-max-column) + (gnome-c-align-compute-optimal-columns (point-min) (point-max)) + (gnome-c-align-region (point-min) (point-max))) + (should (equal (buffer-string) gnome-c-test-program-1-aligned)))) -(ert-deftest gnome-test-align-region-2 () - "Tests the `gnome-align-region'." +(ert-deftest gnome-c-test-align-region-2 () + "Tests the `gnome-c-align-region'." (with-temp-buffer - (insert gnome-test-program-4) + (insert gnome-c-test-program-4) (c-mode) - (let (gnome-align-max-column) - (gnome-align-compute-optimal-columns (point-min) (point-max)) - (gnome-align-region (point-min) (point-max))) - (should (equal (buffer-string) gnome-test-program-4-aligned)))) + (let (gnome-c-align-max-column) + (gnome-c-align-compute-optimal-columns (point-min) (point-max)) + (gnome-c-align-region (point-min) (point-max))) + (should (equal (buffer-string) gnome-c-test-program-4-aligned)))) -(ert-deftest gnome-test-align-guess-columns-1 () - "Tests the `gnome-align-guess-columns'." +(ert-deftest gnome-c-test-align-guess-columns-1 () + "Tests the `gnome-c-align-guess-columns'." (with-temp-buffer - (insert gnome-test-program-2) + (insert gnome-c-test-program-2) (c-mode) - (let (gnome-align-max-column) - (gnome-align-guess-columns (point-min) (point-max))) - (should (= gnome-align-identifier-start-column 24)) - (should (= gnome-align-arglist-start-column 56)) - (should (= gnome-align-arglist-identifier-start-column 80)))) + (let (gnome-c-align-max-column) + (gnome-c-align-guess-columns (point-min) (point-max))) + (should (= gnome-c-align-identifier-start-column 24)) + (should (= gnome-c-align-arglist-start-column 56)) + (should (= gnome-c-align-arglist-identifier-start-column 80)))) -(ert-deftest gnome-test-align-guess-columns-2 () - "Tests the `gnome-align-guess-columns'." +(ert-deftest gnome-c-test-align-guess-columns-2 () + "Tests the `gnome-c-align-guess-columns'." (with-temp-buffer - (insert gnome-test-program-3) + (insert gnome-c-test-program-3) (c-mode) - (let (gnome-align-max-column) - (gnome-align-guess-columns (point-min) (point-max))) - (should (= gnome-align-identifier-start-column 13)) - (should (= gnome-align-arglist-start-column 40)) - (should (= gnome-align-arglist-identifier-start-column 57)))) + (let (gnome-c-align-max-column) + (gnome-c-align-guess-columns (point-min) (point-max))) + (should (= gnome-c-align-identifier-start-column 13)) + (should (= gnome-c-align-arglist-start-column 40)) + (should (= gnome-c-align-arglist-identifier-start-column 57)))) diff --git a/gnome-minor-mode.el b/gnome-minor-mode.el deleted file mode 100644 index b2930bed1..000000000 --- a/gnome-minor-mode.el +++ /dev/null @@ -1,65 +0,0 @@ -;;; gnome-minor-mode.el --- minor mode for editing GNOME-style C source code -*- lexical-binding: t; -*- -;; Copyright (C) 2016 Daiki Ueno - -;; Author: Daiki Ueno -;; Keywords: GNOME, C, coding style -;; Version: 0.1 -;; Maintainer: Daiki Ueno - -;; This file is not part of GNU Emacs. - -;; This program is free software: you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation, either version 3 of the -;; License, or (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see -;; . - -;;; Code: - -(autoload 'gnome-align-at-point "gnome-align") -(autoload 'gnome-align-region "gnome-align") -(autoload 'gnome-align-set-column "gnome-align") -(autoload 'gnome-align-guess-columns "gnome-align") -(autoload 'gnome-align-compute-optimal-columns "gnome-align") -(autoload 'gnome-snippet-insert-package_class "gnome-snippet") -(autoload 'gnome-snippet-insert-PACKAGE_CLASS "gnome-snippet") -(autoload 'gnome-snippet-insert-PackageClass "gnome-snippet") -(autoload 'gnome-snippet-insert-interface-declation "gnome-snippet") -(autoload 'gnome-snippet-insert-class-declation "gnome-snippet") -(autoload 'gnome-snippet-insert-set_property "gnome-snippet") -(autoload 'gnome-snippet-insert-get_property "gnome-snippet") -(autoload 'gnome-snippet-insert-dispose "gnome-snippet") -(autoload 'gnome-snippet-insert-finalize "gnome-snippet") -(autoload 'gnome-snippet-insert-notify "gnome-snippet") -(autoload 'gnome-snippet-insert-constructed "gnome-snippet") -(autoload 'gnome-snippet-insert "gnome-snippet") - -(defvar gnome-minor-mode-map - (let ((keymap (make-sparse-keymap))) - (define-key keymap "\C-c\C-ga" 'gnome-align-at-point) - (define-key keymap "\C-c\C-gr" 'gnome-align-region) - (define-key keymap "\C-c\C-gf" 'gnome-align-set-column) - (define-key keymap "\C-c\C-gg" 'gnome-align-guess-columns) - (define-key keymap "\C-c\C-g\C-g" 'gnome-align-compute-optimal-columns) - (define-key keymap "\C-c\C-gc" 'gnome-snippet-insert-package_class) - (define-key keymap "\C-c\C-gC" 'gnome-snippet-insert-PACKAGE_CLASS) - (define-key keymap "\C-c\C-g\C-c" 'gnome-snippet-insert-PackageClass) - (define-key keymap "\C-c\C-gs" 'gnome-snippet-insert) - keymap)) - -;;;###autoload -(define-minor-mode gnome-minor-mode - "A minor-mode for editing GNOME-style C source code." - nil " GNOME" gnome-minor-mode-map) - -(provide 'gnome-c-mode) - -;;; gnome-c-mode.el ends here diff --git a/gnome-snippet.el b/gnome-snippet.el deleted file mode 100644 index a2862ab29..000000000 --- a/gnome-snippet.el +++ /dev/null @@ -1,520 +0,0 @@ -;;; gnome-snippet.el --- GNOME-style code generation -*- lexical-binding: t; -*- -;; Copyright (C) 2016 Daiki Ueno - -;; Author: Daiki Ueno -;; Keywords: GNOME, C, coding style - -;; This file is not part of GNU Emacs. - -;; This program is free software: you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation, either version 3 of the -;; License, or (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, but -;; WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see -;; . - -;;; Code: - -(require 'gnome-align) - -(eval-when-compile - (require 'subword)) - -(declare-function subword-forward "subword.el" (&optional arg)) - -(defvar gnome-snippet-package nil) -(make-variable-buffer-local 'gnome-snippet-package) - -(defvar gnome-snippet-class nil) -(make-variable-buffer-local 'gnome-snippet-class) - -(defvar gnome-snippet-parent-package nil) -(make-variable-buffer-local 'gnome-snippet-parent-package) - -(defvar gnome-snippet-parent-class nil) -(make-variable-buffer-local 'gnome-snippet-parent-class) - -(defcustom gnome-snippet-align-arglist t - "Whether to align argument list of the inserted snippet" - :type 'boolean - :group 'gnome-minor-mode) - -(make-variable-buffer-local 'gnome-snippet-align-arglist) - -(defun gnome-snippet--parse-name (name) - (require 'subword) - (with-temp-buffer - (let (words) - (insert name) - (goto-char (point-min)) - (while (not (eobp)) - ;; Skip characters not recognized by subword-mode. - (if (looking-at "[^[:lower:][:upper:][:digit:]]+") - (goto-char (match-end 0))) - (push (buffer-substring (point) (progn (subword-forward 1) - (point))) - words)) - (nreverse words)))) - -(defun gnome-snippet--read-package-and-class (package-prompt - class-prompt - package-symbol - class-symbol) - (when (or current-prefix-arg - (not (and (symbol-value package-symbol) - (symbol-value class-symbol)))) - (set package-symbol - (gnome-snippet--parse-name - (read-string (or package-prompt - "Package (CamelCase): ") - (if (symbol-value package-symbol) - (gnome-snippet--format-Package - (symbol-value package-symbol)))))) - (set class-symbol - (gnome-snippet--parse-name - (read-string (or class-prompt - "Class (CamelCase): ") - (if (symbol-value class-symbol) - (gnome-snippet--format-Class - (symbol-value class-symbol))))))) - (list (symbol-value package-symbol) (symbol-value class-symbol))) - -(defun gnome-snippet--format-PACKAGE (package) - (mapconcat #'upcase package "_")) -(defalias 'gnome-snippet--format-CLASS 'gnome-snippet--format-PACKAGE) - -(defun gnome-snippet--format-PACKAGE_CLASS (package class) - (concat (gnome-snippet--format-PACKAGE package) - "_" - (gnome-snippet--format-CLASS class))) - -(defun gnome-snippet--format-package (package) - (mapconcat #'downcase package "_")) -(defalias 'gnome-snippet--format-class 'gnome-snippet--format-package) - -(defun gnome-snippet--format-package_class (package class) - (concat (gnome-snippet--format-package package) - "_" - (gnome-snippet--format-class class))) - -(defun gnome-snippet--format-Package (package) - (mapconcat #'identity package "")) -(defalias 'gnome-snippet--format-Class 'gnome-snippet--format-Package) - -(defun gnome-snippet--format-PackageClass (package class) - (concat (gnome-snippet--format-Package package) - (gnome-snippet--format-Class class))) - -;;;###autoload -(defun gnome-snippet-insert-package_class (package class) - "Insert the class name before the current point." - (interactive (gnome-snippet--read-package-and-class - nil nil - 'gnome-snippet-package - 'gnome-snippet-class)) - (insert (gnome-snippet--format-package_class package class))) - -;;;###autoload -(defun gnome-snippet-insert-PACKAGE_CLASS (package class) - "Insert the class name before the current point." - (interactive (gnome-snippet--read-package-and-class - nil nil - 'gnome-snippet-package - 'gnome-snippet-class)) - (insert (gnome-snippet--format-PACKAGE_CLASS package class))) - -;;;###autoload -(defun gnome-snippet-insert-PackageClass (package class) - "Insert the class name (in CamelCase) before the current point." - (interactive (gnome-snippet--read-package-and-class - nil nil - 'gnome-snippet-package - 'gnome-snippet-class)) - (insert (gnome-snippet--format-PackageClass package class))) - -(defun gnome-snippet-insert-interface-declaration (package iface - parent-package parent-class) - "Insert interface declaration for PACKAGE and IFACE" - (interactive - (append (gnome-snippet--read-package-and-class - nil - "Interface (CamelCase): " - 'gnome-snippet-package - 'gnome-snippet-class) - (gnome-snippet--read-package-and-class - "Parent package (CamelCase): " - "Parent class (CamelCase): " - 'gnome-snippet-parent-package - 'gnome-snippet-parent-class))) - (insert "\ -#define " (gnome-snippet--format-PACKAGE package) "_TYPE_" (gnome-snippet--format-CLASS iface) " (" (gnome-snippet--format-package package) "_" (gnome-snippet--format-class iface) "_get_type ()) -G_DECLARE_INTERFACE (" (gnome-snippet--format-PackageClass package iface) ", " -(gnome-snippet--format-package_class package iface) ", " (gnome-snippet--format-PACKAGE package) ", " (gnome-snippet--format-CLASS iface) ", " (gnome-snippet--format-PackageClass parent-package parent-class) ") -")) - -(defun gnome-snippet--insert-class-declaration (package - class - parent-package - parent-class - derivable) - (insert "\ -#define " (gnome-snippet--format-PACKAGE package) "_TYPE_" (gnome-snippet--format-CLASS class) " (" (gnome-snippet--format-package_class package class) "_get_type ()) -G_DECLARE_" (if derivable "DERIVABLE" "FINAL") "_TYPE (" (gnome-snippet--format-PackageClass package class) ", " -(gnome-snippet--format-package_class package class) ", " (gnome-snippet--format-PACKAGE package) ", " (gnome-snippet--format-CLASS class) ", " (gnome-snippet--format-PackageClass parent-package parent-class) ") -")) - -(defun gnome-snippet-insert-final-class-declaration (package - class - parent-package - parent-class) - "Insert final class declaration for PACKAGE and CLASS." - (interactive - (append (gnome-snippet--read-package-and-class - nil nil - 'gnome-snippet-package - 'gnome-snippet-class) - (gnome-snippet--read-package-and-class - "Parent package (CamelCase): " - "Parent class (CamelCase): " - 'gnome-snippet-parent-package - 'gnome-snippet-parent-class))) - (gnome-snippet--insert-class-declaration package - class - parent-package - parent-class - nil)) - -(defun gnome-snippet-insert-derivable-class-declaration (package - class - parent-package - parent-class) - "Insert derivable class declaration for PACKAGE and CLASS." - (interactive - (append (gnome-snippet--read-package-and-class - nil nil - 'gnome-snippet-package - 'gnome-snippet-class) - (gnome-snippet--read-package-and-class - "Parent package (CamelCase): " - "Parent class (CamelCase): " - 'gnome-snippet-parent-package - 'gnome-snippet-parent-class))) - (gnome-snippet--insert-class-declaration package - class - parent-package - parent-class - t)) - -(defun gnome-snippet-insert-interface-definition (package - iface - parent-package - parent-class) - "Insert class definition for PACKAGE and CLASS." - (interactive - (append (gnome-snippet--read-package-and-class - nil - "Interface (CamelCase): " - 'gnome-snippet-package - 'gnome-snippet-class) - (gnome-snippet--read-package-and-class - "Parent package (CamelCase): " - "Parent class (CamelCase): " - 'gnome-snippet-parent-package - 'gnome-snippet-parent-class))) - (insert "\ -static void -" (gnome-snippet--format-package_class package iface) "_default_init (" (gnome-snippet--format-PackageClass package iface) "Interface *iface) { -} - -G_DEFINE_INTERFACE (" (gnome-snippet--format-PackageClass package iface) ", " -(gnome-snippet--format-package_class package iface) ", " (gnome-snippet--format-PACKAGE parent-package) "_TYPE_" (gnome-snippet--format-CLASS parent-class) ") -")) - -(defun gnome-snippet--insert-class-definition (package - class - parent-package - parent-class - abstract) - (insert "\ -G_DEFINE_" (if abstract "ABSTRACT_" "") "TYPE (" (gnome-snippet--format-PackageClass package class) ", " -(gnome-snippet--format-package_class package class) ", " (gnome-snippet--format-PACKAGE parent-package) "_TYPE_" (gnome-snippet--format-CLASS parent-class) ") - -static void -" (gnome-snippet--format-package_class package class) "_class_init (" (gnome-snippet--format-PackageClass package class) "Class *klass) -{ -} - -static void -" (gnome-snippet--format-package_class package class) "_init (" (gnome-snippet--format-PackageClass package class) " *self) -{ -} -")) - -(defun gnome-snippet-insert-class-definition (package - class - parent-package - parent-class) - "Insert class definition for PACKAGE and CLASS." - (interactive - (append (gnome-snippet--read-package-and-class - nil nil - 'gnome-snippet-package - 'gnome-snippet-class) - (gnome-snippet--read-package-and-class - "Parent package (CamelCase): " - "Parent class (CamelCase): " - 'gnome-snippet-parent-package - 'gnome-snippet-parent-class))) - (gnome-snippet--insert-class-definition package - class - parent-package - parent-class - nil)) - -(defun gnome-snippet-insert-abstract-class-definition (package - class - parent-package - parent-class) - "Insert abstract class definition for PACKAGE and CLASS." - (interactive - (append (gnome-snippet--read-package-and-class - nil nil - 'gnome-snippet-package - 'gnome-snippet-class) - (gnome-snippet--read-package-and-class - "Parent package (CamelCase): " - "Parent class (CamelCase): " - 'gnome-snippet-parent-package - 'gnome-snippet-parent-class))) - (gnome-snippet--insert-class-definition package - class - parent-package - parent-class - t)) - -(defun gnome-snippet-insert-constructor (package class) - "Insert 'constructor' vfunc of GObjectClass for PACKAGE and CLASS." - (interactive - (gnome-snippet--read-package-and-class - nil nil - 'gnome-snippet-package - 'gnome-snippet-class)) - (let (arglist-start body-start) - (insert "\ -static GObject * -" (gnome-snippet--format-package_class package class) "_constructor (") - (setq arglist-start (point-marker)) - (insert "GType *object, -guint n_construct_properties, -GObjectConstructParam *construct_properties)\n") - (setq body-start (point-marker)) - (if gnome-snippet-align-arglist - (progn - (goto-char arglist-start) - (gnome-align-at-point)) - (indent-region arglist-start (point))) - (goto-char body-start) - (insert "{ - " (gnome-snippet--format-PackageClass package class) " *self = " - (gnome-snippet--format-PACKAGE_CLASS package class) " (object); - - G_OBJECT_CLASS (" (gnome-snippet--format-package_class package class) "_parent_class)->constructed (object); -} -") - (indent-region body-start (point)))) - -(defun gnome-snippet-insert-set_property (package class) - "Insert 'set_property' vfunc of GObjectClass for PACKAGE and CLASS." - (interactive - (gnome-snippet--read-package-and-class - nil nil - 'gnome-snippet-package - 'gnome-snippet-class)) - (let (arglist-start body-start) - (insert "\ -static void -" (gnome-snippet--format-package_class package class) "_set_property (") - (setq arglist-start (point-marker)) - (insert "GObject *object, -guint prop_id, -const GValue *value, -GParamSpec *pspec)\n") - (setq body-start (point-marker)) - (if gnome-snippet-align-arglist - (progn - (goto-char arglist-start) - (gnome-align-at-point)) - (indent-region arglist-start (point))) - (goto-char body-start) - (insert "{ - " (gnome-snippet--format-PackageClass package class) " *self = " - (gnome-snippet--format-PACKAGE_CLASS package class) " (object); - - switch (prop_id) - { - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} -") - (indent-region body-start (point)))) - -(defun gnome-snippet-insert-get_property (package class) - "Insert 'get_property' vfunc of GObjectClass for PACKAGE and CLASS." - (interactive - (gnome-snippet--read-package-and-class - nil nil - 'gnome-snippet-package - 'gnome-snippet-class)) - (let (arglist-start body-start) - (insert "\ -static void -" (gnome-snippet--format-package_class package class) "_get_property (") - (setq arglist-start (point-marker)) - (insert "GObject *object, -guint prop_id, -GValue *value, -GParamSpec *pspec)\n") - (setq body-start (point-marker)) - (if gnome-snippet-align-arglist - (progn - (goto-char arglist-start) - (gnome-align-at-point)) - (indent-region arglist-start (point))) - (goto-char body-start) - (insert "{ - " (gnome-snippet--format-PackageClass package class) " *self = " -(gnome-snippet--format-PACKAGE_CLASS package class) " (object); - - switch (prop_id) - { - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} -") - (indent-region body-start (point)))) - -(defun gnome-snippet-insert-dispose (package class) - "Insert 'dispose' vfunc of GObjectClass for PACKAGE and CLASS." - (interactive - (gnome-snippet--read-package-and-class - nil nil - 'gnome-snippet-package - 'gnome-snippet-class)) - (let (body-start) - (insert "\ -static void -" (gnome-snippet--format-package_class package class) "_dispose (GObject *object)\n") - (setq body-start (point-marker)) - (insert "{ - " (gnome-snippet--format-PackageClass package class) " *self = " - (gnome-snippet--format-PACKAGE_CLASS package class) " (object); - - G_OBJECT_CLASS (" (gnome-snippet--format-package_class package class) "_parent_class)->dispose (object); -} -") - (indent-region body-start (point)))) - -(defun gnome-snippet-insert-finalize (package class) - "Insert 'finalize' vfunc of GObjectClass for PACKAGE and CLASS." - (interactive - (gnome-snippet--read-package-and-class - nil nil - 'gnome-snippet-package - 'gnome-snippet-class)) - (let (body-start) - (insert "\ -static void -" (gnome-snippet--format-package_class package class) "_finalize (GObject *object)\n") - (setq body-start (point-marker)) - (insert "{ - " (gnome-snippet--format-PackageClass package class) " *self = " - (gnome-snippet--format-PACKAGE_CLASS package class) " (object); - - G_OBJECT_CLASS (" (gnome-snippet--format-package_class package class) "_parent_class)->finalize (object); -} -") - (indent-region body-start (point)))) - -(defun gnome-snippet-insert-notify (package class) - "Insert 'notify' vfunc of GObjectClass for PACKAGE and CLASS." - (interactive - (gnome-snippet--read-package-and-class - nil nil - 'gnome-snippet-package - 'gnome-snippet-class)) - (let (body-start) - (insert "\ -static void -" (gnome-snippet--format-package_class package class) "_notify (GObject *object)\n") - (setq body-start (point-marker)) - (insert "{ - " (gnome-snippet--format-PackageClass package class) " *self = " - (gnome-snippet--format-PACKAGE_CLASS package class) " (object); - - G_OBJECT_CLASS (" (gnome-snippet--format-package_class package class) "_parent_class)->finalize (object); -} -") - (indent-region body-start (point)))) - -(defun gnome-snippet-insert-constructed (package class) - "Insert 'constructed' vfunc of GObjectClass for PACKAGE and CLASS." - (interactive - (gnome-snippet--read-package-and-class - nil nil - 'gnome-snippet-package - 'gnome-snippet-class)) - (let (body-start) - (insert "\ -static void -" (gnome-snippet--format-package_class package class) "_constructed (GObject *object)\n") - (setq body-start (point-marker)) - (insert "{ - " (gnome-snippet--format-PackageClass package class) " *self = " - (gnome-snippet--format-PACKAGE_CLASS package class) " (object); - - G_OBJECT_CLASS (" (gnome-snippet--format-package_class package class) "_parent_class)->constructed (object); -} -") - (indent-region body-start (point)))) - -(defvar gnome-snippet-snippet-commands - '(("G_DECLARE_INTERFACE" . gnome-snippet-insert-interface-declaration) - ("G_DECLARE_FINAL_TYPE" . gnome-snippet-insert-final-class-declaration) - ("G_DECLARE_DERIVABLE_TYPE" . - gnome-snippet-insert-derivable-class-declaration) - ("G_DEFINE_INTERFACE" . gnome-snippet-insert-interface-definition) - ("G_DEFINE_TYPE" . gnome-snippet-insert-class-definition) - ("G_DEFINE_ABSTRACT_TYPE" . - gnome-snippet-insert-abstract-class-definition) - ("GObjectClass.constructor" . gnome-snippet-insert-constructor) - ("GObjectClass.set_property" . gnome-snippet-insert-set_property) - ("GObjectClass.get_property" . gnome-snippet-insert-get_property) - ("GObjectClass.dispose" . gnome-snippet-insert-dispose) - ("GObjectClass.finalize" . gnome-snippet-insert-finalize) - ;; GObjectClass.dispatch_properties_changed - ("GObjectClass.notify" . gnome-snippet-insert-notify) - ("GObjectClass.contructed" . gnome-snippet-insert-constructed))) - -;;;###autoload -(defun gnome-snippet-insert (snippet) - (interactive - (list (completing-read "Snippet: " gnome-snippet-snippet-commands nil t))) - (let ((entry (assoc snippet gnome-snippet-snippet-commands))) - (unless entry - (error "Unknown snippet: %s" snippet)) - (call-interactively (cdr entry)))) - -(provide 'gnome-snippet) - -;;; gnome-snippet.el ends here -- 2.39.2