|  | # This file is a minimal clang-format sublime-integration. To install: | 
|  | # - Change 'binary' if clang-format is not on the path (see below). | 
|  | # - Put this file into your sublime Packages directory, e.g. on Linux: | 
|  | #     ~/.config/sublime-text-2/Packages/User/clang-format-sublime.py | 
|  | # - Add a key binding: | 
|  | #     { "keys": ["ctrl+shift+c"], "command": "clang_format" }, | 
|  | # | 
|  | # With this integration you can press the bound key and clang-format will | 
|  | # format the current lines and selections for all cursor positions. The lines | 
|  | # or regions are extended to the next bigger syntactic entities. | 
|  | # | 
|  | # 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 absolute_import, division, print_function | 
|  | import sublime | 
|  | import sublime_plugin | 
|  | 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 the output of | 
|  | # 'clang-format --help' for a list of supported styles. The default looks for | 
|  | # a '.clang-format' or '_clang-format' file to indicate the style that should be | 
|  | # used. | 
|  | style = None | 
|  |  | 
|  |  | 
|  | class ClangFormatCommand(sublime_plugin.TextCommand): | 
|  | def run(self, edit): | 
|  | encoding = self.view.encoding() | 
|  | if encoding == "Undefined": | 
|  | encoding = "utf-8" | 
|  | regions = [] | 
|  | command = [binary] | 
|  | if style: | 
|  | command.extend(["-style", style]) | 
|  | for region in self.view.sel(): | 
|  | regions.append(region) | 
|  | region_offset = min(region.a, region.b) | 
|  | region_length = abs(region.b - region.a) | 
|  | command.extend( | 
|  | [ | 
|  | "-offset", | 
|  | str(region_offset), | 
|  | "-length", | 
|  | str(region_length), | 
|  | "-assume-filename", | 
|  | str(self.view.file_name()), | 
|  | ] | 
|  | ) | 
|  | old_viewport_position = self.view.viewport_position() | 
|  | buf = self.view.substr(sublime.Region(0, self.view.size())) | 
|  | p = subprocess.Popen( | 
|  | command, | 
|  | stdout=subprocess.PIPE, | 
|  | stderr=subprocess.PIPE, | 
|  | stdin=subprocess.PIPE, | 
|  | ) | 
|  | output, error = p.communicate(buf.encode(encoding)) | 
|  | if error: | 
|  | print(error) | 
|  | self.view.replace( | 
|  | edit, sublime.Region(0, self.view.size()), output.decode(encoding) | 
|  | ) | 
|  | self.view.sel().clear() | 
|  | for region in regions: | 
|  | self.view.sel().add(region) | 
|  | # FIXME: Without the 10ms delay, the viewport sometimes jumps. | 
|  | sublime.set_timeout( | 
|  | lambda: self.view.set_viewport_position(old_viewport_position, False), 10 | 
|  | ) |