• Home
  • Raw
  • Download

Lines Matching +full:clang +full:- +full:format

1 ;;; clang-format.el --- Format code using clang-format
4 ;; Package-Requires: ((cl-lib "0.3"))
8 ;; This package allows to filter code through clang-format to fix its formatting.
9 ;; clang-format is a tool that formats C/C++/Obj-C code according to a set of
10 ;; style options, see <http://clang.llvm.org/docs/ClangFormatStyleOptions.html>.
11 ;; Note that clang-format 3.4 or newer is required.
13 ;; clang-format.el is available via MELPA and can be installed via
15 ;; M-x package-install clang-format
18 ;; `package-archives'. Alternatively, ensure the directory of this
19 ;; file is in your `load-path' and add
21 ;; (require 'clang-format)
25 ;; You may also want to bind `clang-format-region' to a key:
27 ;; (global-set-key [C-M-tab] 'clang-format-region)
31 (require 'cl-lib)
34 (defgroup clang-format nil unknown
35 "Format code using clang-format."
38 (defcustom clang-format-executable
39 (or (executable-find "clang-format")
40 "clang-format")
41 "Location of the clang-format executable.
44 :group 'clang-format
48 (defcustom clang-format-style "file"
49 "Style argument to pass to clang-format.
51 By default clang-format will load the style configuration from
52 a file named .clang-format located in one of the parent directories
54 :group 'clang-format
57 (make-variable-buffer-local 'clang-format-style)
59 (defun clang-format--extract (xml-node)
60 "Extract replacements and cursor information from XML-NODE."
61 (unless (and (listp xml-node) (eq (xml-node-name xml-node) 'replacements))
63 (let ((nodes (xml-node-children xml-node))
64 (incomplete-format (xml-get-attribute xml-node 'incomplete_format))
69 (let* ((children (xml-node-children node))
71 (cl-case (xml-node-name node)
73 (let* ((offset (xml-get-attribute-or-nil node 'offset))
74 (length (xml-get-attribute-or-nil node 'length)))
80 (setq offset (string-to-number offset))
81 (setq length (string-to-number length))
84 (setq cursor (string-to-number text)))))))
93 (list replacements cursor (string= incomplete-format "true"))))
95 (defun clang-format--replace (offset length &optional text)
96 (let ((start (byte-to-position (1+ offset)))
97 (end (byte-to-position (+ 1 offset length))))
98 (goto-char start)
99 (delete-region start end)
104 (defun clang-format-region (char-start char-end &optional style)
105 "Use clang-format to format the code between START and END according to STYLE.
107 is no active region. If no style is given uses `clang-format-style'."
109 (if (use-region-p)
110 (list (region-beginning) (region-end))
114 (setq style clang-format-style))
116 (let ((start (1- (position-bytes char-start)))
117 (end (1- (position-bytes char-end)))
118 (cursor (1- (position-bytes (point))))
119 (temp-buffer (generate-new-buffer " *clang-format-temp*"))
120 (temp-file (make-temp-file "clang-format")))
121 (unwind-protect
124 (call-process-region
125 (point-min) (point-max) clang-format-executable
126 nil `(,temp-buffer ,temp-file) nil
128 "-output-replacements-xml"
129 "-assume-filename" (or (buffer-file-name) "")
130 "-style" style
131 "-offset" (number-to-string start)
132 "-length" (number-to-string (- end start))
133 "-cursor" (number-to-string cursor)))
135 (with-temp-buffer
136 (insert-file-contents temp-file)
137 (when (> (point-max) (point-min))
139 (buffer-substring-no-properties
140 (point-min) (line-end-position))))
144 (error "(clang-format killed by signal %s%s)" status stderr))
146 (error "(clang-format failed with code %d%s)" status stderr)))
148 (with-current-buffer temp-buffer
149 (setq operations (clang-format--extract (car (xml-parse-region)))))
153 (incomplete-format (nth 2 operations)))
154 (save-excursion
156 (apply #'clang-format--replace rpl))
159 (goto-char (byte-to-position (1+ cursor))))
160 (message "%s" incomplete-format)
161 (if incomplete-format
162 (message "(clang-format: incomplete (syntax errors)%s)" stderr)
163 (message "(clang-format: success%s)" stderr))))
164 (delete-file temp-file)
165 (when (buffer-name temp-buffer) (kill-buffer temp-buffer)))))
168 (defun clang-format-buffer (&optional style)
169 "Use clang-format to format the current buffer according to STYLE."
171 (clang-format-region (point-min) (point-max) style))
174 (defalias 'clang-format 'clang-format-region) unknown
176 (provide 'clang-format)
177 ;;; clang-format.el ends here