Usage
------
-| Key | Command |
---------------|---------------------------------------------------|
-| C-c C-g g | Compute alignment columns from the current region |
-| C-c C-g s | Set alignment column to the current point |
-| C-c C-g a | Align argument list at the current point |
-| C-c C-g r | Align function declarations in the current region |
-| C-c C-g c | Insert ```module_object``` |
-| C-c C-g C | Insert ```MODULE_OBJECT``` |
-| C-c C-g C-c | Insert ```ModuleObject``` |
-| C-c C-g s | Insert custom snippet |
+| Key | Command |
+--------------|-----------------------------------------------------------|
+| C-c C-g C-g | Compute optimal alignment columns from the current region |
+| C-c C-g s | Set alignment column to the current point |
+| C-c C-g g | Guess alignment columns from the current region |
+| C-c C-g a | Align argument list at the current point |
+| C-c C-g r | Align function declarations in the current region |
+| C-c C-g c | Insert ```module_object``` |
+| C-c C-g C | Insert ```MODULE_OBJECT``` |
+| C-c C-g C-c | Insert ```ModuleObject``` |
+| C-c C-g s | Insert custom snippet |
Example
------
void g_gpg_ctx_clear_signers (GGpgCtx *ctx);
```
-Mark the region, type ```C-c C-g g```, and you will see the optimum
+Mark the region, type ```C-c C-g C-g```, and you will see the optimum
alignment columns:
```
(when (looking-back "\*+" nil t)
(setq column (- column (- (match-end 0) (match-beginning 0))))
(goto-char (match-beginning 0)))
+ ;; FIXME: should respect indent-tabs-mode?
(let (indent-tabs-mode)
(indent-to-column column)))
(push decl decls))))
decls))))
-(defun gobject-align--guess-columns (beg end)
+(defun gobject-align--compute-optimal-columns (beg end)
(let ((buffer (current-buffer))
decls)
(with-temp-buffer
arglist-identifier-start-column))))))
;;;###autoload
-(defun gobject-align-guess-columns (beg end)
- "Guess the alignment rule from the function declarations in BEG and END"
+(defun gobject-align-compute-optimal-columns (beg end)
+ "Compute the optimal alignment rule from the declarations in BEG and END.
+
+This sets `gobject-align-identifier-start-column',
+`gobject-align-arglist-start-column', and
+`gobject-align-arglist-identifier-start-column'."
(interactive "r")
- (let ((columns (gobject-align--guess-columns beg end)))
+ (let ((columns (gobject-align--compute-optimal-columns beg end)))
(setq gobject-align-identifier-start-column
(cdr (assq 'identifier-start-column columns))
gobject-align-arglist-start-column
gobject-align-arglist-start-column
gobject-align-arglist-identifier-start-column)))
+;;;###autoload
+(defun gobject-align-guess-columns (beg end)
+ "Guess the existing alignment rule from the declarations in BEG and END.
+
+This sets `gobject-align-identifier-start-column',
+`gobject-align-arglist-start-column', and
+`gobject-align-arglist-identifier-start-column'."
+ (interactive "r")
+ (let ((decls (gobject-align--scan-decls beg end))
+ arglist)
+ (unless decls
+ (error "No function declaration in the region"))
+ (setq arglist (gobject-align--parse-arglist
+ (1+ (gobject-align--decl-arglist-start (car decls)))
+ (1- (gobject-align--decl-arglist-end (car decls)))))
+ (unless arglist
+ (error "Empty argument list"))
+ (unless (gobject-align--argument-identifier-start (car arglist))
+ (error "No identifier in the argument list"))
+ (setq gobject-align-identifier-start-column
+ (gobject-align--marker-column
+ (gobject-align--decl-identifier-start (car decls)))
+ gobject-align-arglist-start-column
+ (gobject-align--marker-column
+ (gobject-align--decl-arglist-start (car decls)))
+ gobject-align-arglist-identifier-start-column
+ (gobject-align--marker-column
+ (gobject-align--argument-identifier-start (car arglist))))
+ (message
+ "identifier-start: %d, arglist-start: %d, arglist-identifier-start: %d"
+ gobject-align-identifier-start-column
+ gobject-align-arglist-start-column
+ gobject-align-arglist-identifier-start-column)))
+
;;;###autoload
(defun gobject-align-region (beg end)
"Reformat function declarations in the region between BEG and END."
(unless (and gobject-align-identifier-start-column
gobject-align-arglist-start-column
gobject-align-arglist-identifier-start-column)
- (let ((columns (gobject-align--guess-columns beg end)))
+ (let ((columns (gobject-align--compute-optimal-columns beg end)))
(unless gobject-align-identifier-start-column
(setq gobject-align-identifier-start-column
(cdr (assq 'identifier-start-column columns))))
(autoload 'gobject-align-region "gobject-align")
(autoload 'gobject-align-set-column "gobject-align")
(autoload 'gobject-align-guess-columns "gobject-align")
+(autoload 'gobject-align-compute-optimal-columns "gobject-align")
(autoload 'gobject-snippet-insert-package_class "gobject-snippet")
(autoload 'gobject-snippet-insert-PACKAGE_CLASS "gobject-snippet")
(autoload 'gobject-snippet-insert-PackageClass "gobject-snippet")
(define-key keymap "\C-c\C-gr" 'gobject-align-region)
(define-key keymap "\C-c\C-gf" 'gobject-align-set-column)
(define-key keymap "\C-c\C-gg" 'gobject-align-guess-columns)
+ (define-key keymap "\C-c\C-g\C-g" 'gobject-align-compute-optimal-columns)
(define-key keymap "\C-c\C-gc" 'gobject-snippet-insert-package_class)
(define-key keymap "\C-c\C-gC" 'gobject-snippet-insert-PACKAGE_CLASS)
(define-key keymap "\C-c\C-g\C-c" 'gobject-snippet-insert-PackageClass)
void g_gpg_ctx_clear_signers (GGpgCtx *ctx);
")
-(ert-deftest gobject-test-align--guess-columns ()
- "Tests the `gobject-align--guess-columns'."
+(defconst gobject-test-program-2 "\
+GDK_AVAILABLE_IN_3_16
+const gchar ** gtk_widget_list_action_prefixes (GtkWidget *widget);
+")
+
+(ert-deftest gobject-test-align--compute-optimal-columns ()
+ "Tests the `gobject-align--compute-optimal-columns'."
(with-temp-buffer
(insert gobject-test-program-1)
(c-mode)
- (let ((columns (gobject-align--guess-columns (point-min) (point-max))))
+ (let ((columns (gobject-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)) 63)))))
(with-temp-buffer
(insert gobject-test-program-1)
(c-mode)
- (gobject-align-guess-columns (point-min) (point-max))
+ (gobject-align-compute-optimal-columns (point-min) (point-max))
(gobject-align-region (point-min) (point-max))
(should (equal (buffer-string) gobject-test-program-1-aligned))))
+
+(ert-deftest gobject-test-align-guess-columns ()
+ "Tests the `gobject-align-guess-columns'."
+ (with-temp-buffer
+ (insert gobject-test-program-2)
+ (c-mode)
+ (gobject-align-guess-columns (point-min) (point-max))
+ (should (= gobject-align-identifier-start-column 24))
+ (should (= gobject-align-arglist-start-column 56))
+ (should (= gobject-align-arglist-identifier-start-column 80))))