Skip to content

Commit

Permalink
[clang-format-vim] Support vim linked against py3
Browse files Browse the repository at this point in the history
clang-format.py previously only worked in vim compiled against python2.

This patch adds the necessary syntax changes to make this work with vim
linked against python3, which is now shipped by default for at least Ubuntu16 and Arch.

Differential Revision: https://reviews.llvm.org/D23319

Subscribers: cfe-commits
llvm-svn: 280240
  • Loading branch information
ldrumm committed Aug 31, 2016
1 parent 3c1137c commit ff7c77f
Showing 1 changed file with 11 additions and 7 deletions.
18 changes: 11 additions & 7 deletions clang/tools/clang-format/clang-format.py
Expand Up @@ -25,6 +25,7 @@
#
# It operates on the current, potentially unsaved buffer and does not create
# or save any files. To revert a formatting, just undo.
from __future__ import print_function

import difflib
import json
Expand All @@ -49,6 +50,7 @@

def main():
# Get the current text.
encoding = vim.eval("&encoding")
buf = vim.current.buffer
text = '\n'.join(buf)

Expand All @@ -61,7 +63,7 @@ def main():
# Determine the cursor position.
cursor = int(vim.eval('line2byte(line("."))+col(".")')) - 2
if cursor < 0:
print 'Couldn\'t determine cursor position. Is your file empty?'
print('Couldn\'t determine cursor position. Is your file empty?')
return

# Avoid flashing an ugly, ugly cmd prompt on Windows when invoking clang-format.
Expand All @@ -82,25 +84,27 @@ def main():
p = subprocess.Popen(command,
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
stdin=subprocess.PIPE, startupinfo=startupinfo)
stdout, stderr = p.communicate(input=text)
stdout, stderr = p.communicate(input=text.encode(encoding))

# If successful, replace buffer contents.
if stderr:
print stderr
print(stderr)

if not stdout:
print ('No output from clang-format (crashed?).\n' +
'Please report to bugs.llvm.org.')
print(
'No output from clang-format (crashed?).\n'
'Please report to bugs.llvm.org.'
)
else:
lines = stdout.split('\n')
lines = stdout.decode(encoding).split('\n')
output = json.loads(lines[0])
lines = lines[1:]
sequence = difflib.SequenceMatcher(None, vim.current.buffer, lines)
for op in reversed(sequence.get_opcodes()):
if op[0] is not 'equal':
vim.current.buffer[op[1]:op[2]] = lines[op[3]:op[4]]
if output.get('IncompleteFormat'):
print 'clang-format: incomplete (syntax errors)'
print('clang-format: incomplete (syntax errors)')
vim.command('goto %d' % (output['Cursor'] + 1))

main()

0 comments on commit ff7c77f

Please sign in to comment.