summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Jasper <djasper@google.com>2013-04-09 15:23:04 +0000
committerDaniel Jasper <djasper@google.com>2013-04-09 15:23:04 +0000
commit63911838bf7891445ff39fdc7f81d1469d54f5c1 (patch)
treee8d0591f84016c3a6c2ce852a6edaed7f0e2c90e
parent40db5155fbd78faa792aefec5ceddcbf4fc3bb41 (diff)
downloadclang-63911838bf7891445ff39fdc7f81d1469d54f5c1.tar.gz
clang-63911838bf7891445ff39fdc7f81d1469d54f5c1.tar.bz2
clang-63911838bf7891445ff39fdc7f81d1469d54f5c1.tar.xz
Improvements to clang-format integrations.
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
-rwxr-xr-xtools/clang-format/clang-format-diff.py10
-rw-r--r--tools/clang-format/clang-format.el47
-rw-r--r--tools/clang-format/clang-format.py7
3 files changed, 58 insertions, 6 deletions
diff --git a/tools/clang-format/clang-format-diff.py b/tools/clang-format/clang-format-diff.py
index ab5f1b1bc6..16c6ad2159 100755
--- a/tools/clang-format/clang-format-diff.py
+++ b/tools/clang-format/clang-format-diff.py
@@ -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
index 0000000000..c63c62ee55
--- /dev/null
+++ b/tools/clang-format/clang-format.el
@@ -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))))
diff --git a/tools/clang-format/clang-format.py b/tools/clang-format/clang-format.py
index de92257407..d90c62a5bf 100644
--- a/tools/clang-format/clang-format.py
+++ b/tools/clang-format/clang-format.py
@@ -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)