diff options
author | Daniel Jasper <djasper@google.com> | 2017-06-19 07:30:04 +0000 |
---|---|---|
committer | Daniel Jasper <djasper@google.com> | 2017-06-19 07:30:04 +0000 |
commit | 115052359dace05d2fe72edfeaf609623aff4f0e (patch) | |
tree | 78f0ce0da10ef2a7436f211aa1ed0c1a63ed9781 /tools/clang-format | |
parent | 52b6305306e3d9127124d1cf6976d1a3a3c79e86 (diff) |
clang-format: Add capability to format the diff on save in vim.
With this patch, one can configure a BufWrite hook that will make the
clang-format integration compute a diff of the current buffer with the file
that's on disk and format all changed lines. This should create a
zero-overhead auto-format solution that doesn't require the file to
already be clang-format clean to avoid spurious diffs.
Review: https://reviews.llvm.org/D32429
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@305665 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/clang-format')
-rw-r--r-- | tools/clang-format/clang-format.py | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/tools/clang-format/clang-format.py b/tools/clang-format/clang-format.py index ae8a6ebf74..2412566346 100644 --- a/tools/clang-format/clang-format.py +++ b/tools/clang-format/clang-format.py @@ -63,8 +63,19 @@ def main(): # Determine range to format. if vim.eval('exists("l:lines")') == '1': lines = vim.eval('l:lines') + elif vim.eval('exists("l:formatdiff")') == '1': + with open(vim.current.buffer.name, 'r') as f: + ondisk = f.read().splitlines(); + sequence = difflib.SequenceMatcher(None, ondisk, vim.current.buffer) + lines = [] + for op in reversed(sequence.get_opcodes()): + if op[0] not in ['equal', 'delete']: + lines += ['-lines', '%s:%s' % (op[3] + 1, op[4])] + if lines == []: + return else: - lines = '%s:%s' % (vim.current.range.start + 1, vim.current.range.end + 1) + lines = ['-lines', '%s:%s' % (vim.current.range.start + 1, + vim.current.range.end + 1)] # Determine the cursor position. cursor = int(vim.eval('line2byte(line("."))+col(".")')) - 2 @@ -82,7 +93,7 @@ def main(): # Call formatter. command = [binary, '-style', style, '-cursor', str(cursor)] if lines != 'all': - command.extend(['-lines', lines]) + command += lines if fallback_style: command.extend(['-fallback-style', fallback_style]) if vim.current.buffer.name: |