]> granicus.if.org Git - clang/commitdiff
Improvements to clang-format integrations.
authorDaniel Jasper <djasper@google.com>
Tue, 9 Apr 2013 15:23:04 +0000 (15:23 +0000)
committerDaniel Jasper <djasper@google.com>
Tue, 9 Apr 2013 15:23:04 +0000 (15:23 +0000)
This adds an emacs editor integration (thanks to Ami Fischman). Also
pulls out the style into a variable for the vi integration and just
uses clang-formats defaults style in clang-format-diff.py.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179098 91177308-0d34-0410-b5e6-96231b3b80d8

tools/clang-format/clang-format-diff.py
tools/clang-format/clang-format.el [new file with mode: 0644]
tools/clang-format/clang-format.py

index ab5f1b1bc630a3f3a96025508e439e750b3e59ed..16c6ad2159f77ba6a5219c5d77baf04e5df75c33 100755 (executable)
@@ -63,9 +63,10 @@ def formatRange(r, style):
   offset, length = getOffsetLength(filename, line_number, line_count)
   with open(filename, 'r') as f:
     text = f.read()
-  p = subprocess.Popen([binary, '-offset', str(offset), '-length', str(length),
-                        '-style', style],
-                       stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+  command = [binary, '-offset', str(offset), '-length', str(length)]
+  if style:
+    command.append('-style', style)
+  p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                        stdin=subprocess.PIPE)
   stdout, stderr = p.communicate(input=text)
   if stderr:
@@ -84,8 +85,7 @@ def main():
                                    'Reformat changed lines in diff')
   parser.add_argument('-p', default=1,
                       help='strip the smallest prefix containing P slashes')
-  parser.add_argument('-style', default='LLVM',
-                      help='formatting style to apply (LLVM, Google)')
+  parser.add_argument('-style', help='formatting style to apply (LLVM, Google)')
   args = parser.parse_args()
 
   filename = None
diff --git a/tools/clang-format/clang-format.el b/tools/clang-format/clang-format.el
new file mode 100644 (file)
index 0000000..c63c62e
--- /dev/null
@@ -0,0 +1,47 @@
+;;; Clang-format emacs integration for use with C/Objective-C/C++.
+
+;; This defines a function clang-format-region that you can bind to a key.
+;; A minimal .emacs would contain:
+;;
+;;   (load "<path-to-clang>/tools/clang/clang-format/clang-format.el")
+;;   (global-set-key [C-M-tab] 'clang-format-region)
+;;
+;; Depending on your configuration and coding style, you might need to modify
+;; 'style' and 'binary' below.
+(defun clang-format-region ()
+  (interactive)
+  (let ((orig-file buffer-file-name)
+        (orig-point (point))
+        (orig-mark (mark t))
+        (orig-mark-active mark-active)
+        (binary "clang-format")
+        (style "LLVM")
+        replacement-text replaced beg end)
+    (basic-save-buffer)
+    (save-restriction
+      (widen)
+      (if mark-active
+          (setq beg (1- (region-beginning))
+                end (1- (region-end)))
+        (setq beg (1- (line-beginning-position))
+              end (1- (line-end-position))))
+      (with-temp-buffer
+        (call-process
+         binary orig-file '(t nil) t
+         "-offset" (number-to-string beg)
+         "-length" (number-to-string (- end beg))
+         "-style" style)
+        (setq replacement-text
+              (buffer-substring-no-properties (point-min) (point-max))))
+      (unless (string= replacement-text
+                       (buffer-substring-no-properties (point-min) (point-max)))
+        (delete-region (point-min) (point-max))
+        (insert replacement-text)
+        (setq replaced t)))
+    (ignore-errors
+      (when orig-mark
+        (push-mark orig-mark)
+        (when orig-mark-active
+          (activate-mark)
+          (setq deactivate-mark nil)))
+      (goto-char orig-point))))
index de922574070320fb47d202c4a84ccdf430dacb87..d90c62a5bf681872c16b260d1fbe79d8ac2f4c9a 100644 (file)
@@ -23,6 +23,10 @@ import subprocess
 # Change this to the full path if clang-format is not on the path.
 binary = 'clang-format'
 
+# Change this to format according to other formatting styles (see 
+# clang-format -help)
+style = 'LLVM'
+
 # Get the current text.
 buf = vim.current.buffer
 text = "\n".join(buf)
@@ -34,7 +38,8 @@ length = int(vim.eval('line2byte(' +
                       str(vim.current.range.end + 2) + ')')) - offset - 2
 
 # Call formatter.
-p = subprocess.Popen([binary, '-offset', str(offset), '-length', str(length)],
+p = subprocess.Popen([binary, '-offset', str(offset), '-length', str(length),
+                      '-style', style],
                      stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                      stdin=subprocess.PIPE)
 stdout, stderr = p.communicate(input=text)