From 0e295f3051bf32b00dea0e56113a8925ba198b53 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Sun, 21 Jul 2013 10:45:33 +0000 Subject: [PATCH] clang-format: Smarter replacement in the vim integration. With this fix, only changed regions will be replaced in vim's buffer. Thereby, marks should mostly be left intact. Furthermore, this is a better fix for the performance problem in conjunction with 'foldmethod=syntax' (see r186660). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@186789 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/clang-format/clang-format.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/tools/clang-format/clang-format.py b/tools/clang-format/clang-format.py index 866baf50f1..bf84ed0f5c 100644 --- a/tools/clang-format/clang-format.py +++ b/tools/clang-format/clang-format.py @@ -17,6 +17,7 @@ # It operates on the current, potentially unsaved buffer and does not create # or save any files. To revert a formatting, just undo. +import difflib import json import subprocess import sys @@ -67,10 +68,8 @@ else: lines = stdout.split('\n') output = json.loads(lines[0]) lines = lines[1:] - if '\n'.join(lines) != text: - common_length = min(len(buf), len(lines)) - buf[:common_length] = lines[:common_length] - for line in lines[len(buf):]: - buf.append(line) - del buf[len(lines):] - vim.command('goto %d' % (output['Cursor'] + 1)) + sequence = difflib.SequenceMatcher(None, vim.current.buffer, lines) + for op in sequence.get_opcodes(): + if op[0] is not 'equal': + vim.current.buffer[op[1]:op[2]] = lines[op[3]:op[4]] + vim.command('goto %d' % (output['Cursor'] + 1)) -- 2.50.1