r305665 - clang-format: Add capability to format the diff on save in vim.
David Blaikie via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 19 11:18:34 PDT 2017
On Mon, Jun 19, 2017 at 12:30 AM Daniel Jasper via cfe-commits <
cfe-commits at lists.llvm.org> wrote:
> Author: djasper
> Date: Mon Jun 19 02:30:04 2017
> New Revision: 305665
>
> URL: http://llvm.org/viewvc/llvm-project?rev=305665&view=rev
> Log:
> 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
>
> Modified:
> cfe/trunk/docs/ClangFormat.rst
> cfe/trunk/tools/clang-format/clang-format.py
>
> Modified: cfe/trunk/docs/ClangFormat.rst
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ClangFormat.rst?rev=305665&r1=305664&r2=305665&view=diff
>
> ==============================================================================
> --- cfe/trunk/docs/ClangFormat.rst (original)
> +++ cfe/trunk/docs/ClangFormat.rst Mon Jun 19 02:30:04 2017
> @@ -120,6 +120,18 @@ entity.
> It operates on the current, potentially unsaved buffer and does not create
> or save any files. To revert a formatting, just undo.
>
> +An alternative option is to format changes when saving a file and thus to
> +have a zero-effort integration into the coding workflow. To do this, add
> this to
> +your `.vimrc`:
> +
> +.. code-block:: vim
> +
> + function! Formatonsave()
> + let l:formatdiff = 1
> + pyf ~/llvm/tools/clang/tools/clang-format/clang-format.py
> + endfunction
> + autocmd BufWritePre *.h,*.cc,*.cpp call Formatonsave()
>
A cursory experiment with this didn't seem to quite do what I was
expecting. Am I holding it wrong?
Opened a file containing this:
void f3();
__attribute__((used)) inline void f1() {
f3();
}
__attribute__((used)) inline void f2() {
f1();
}
I removed a space from the beginining of line 3 (the call to f3()) and then
removed a space from between "f2()" and "{" on line 5.
I edited edit-mode and ran ":w" - only the second edit location was
reformatted. The f3() call remained indented with one space.
When I move the cursor up to line 3 (or 2 or 4) and save, it reformats that
line.
Indeed even if I don't modify anything, and run ":w" on lines 2-7, it
reformats either f1 or f2, depending on which range the cursor is in when I
write the file.?
> +
>
> Emacs Integration
> =================
>
> Modified: cfe/trunk/tools/clang-format/clang-format.py
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-format/clang-format.py?rev=305665&r1=305664&r2=305665&view=diff
>
> ==============================================================================
> --- cfe/trunk/tools/clang-format/clang-format.py (original)
> +++ cfe/trunk/tools/clang-format/clang-format.py Mon Jun 19 02:30:04 2017
> @@ -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:
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170619/b9ee6e12/attachment.html>
More information about the cfe-commits
mailing list