Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Complete instructions for getting xmllint to work with Sublime Text 2 and Windows.
1) Download XMLLint for Windows here:
2) Choose the xmllint-1.0.exe version and save somewhere in your Windows path (such as your user path).
3) Rename the file to: xmllint.exe (remove the -1.0)
4) Open Sublime Text 2
5) Click Preferences -> Browse Packages (opens up your Packages folder in Windows Explorer).
6) Open up the "User" folder in your Packages folder.
7) Create a file named:
8) Open that file in, well, Sublime Text 2 of course!
9) Paste the contents of the "" gist on this page.
10) Save the file and restart Sublime Text 2. Sometimes, you don't have to restart but I find it helps most of the time.
11) Click Preferences -> Keybindings - User
12) Alter that file so that it contains the "Keybindings - User" gist on this page.
13) Be sure the change the keybindings to what you prefer. This example uses ALT-SHIFT-X.
14) Save the file.
15) Go back to your Packages -> User folder in Windows Explorer.
16) Create (or open if it exists) a file called: Main.sublime-menu
17) Open that file in Sublime Text 2
18) Alter the file so that it includes the "Main.sublime-menu" gist on this page.
19) Save and relaunch Sublime Text 2 for good measure.
20) Enjoy.
You can now press "ALT-SHIFT-X" to format either a selection of text or the entire document if nothing is selected.
{ "keys": ["alt+shift+x"], "command": "tidy_xml_lint" }
"caption": "Selection",
"children": [
"caption": "Format",
"children": [
"caption": "Tidy with XML Lint",
"command": "tidy_xml_lint"
"id": "format"
"id": "selection"
import sublime, sublime_plugin, subprocess
class TidyXmlLintCommand(sublime_plugin.TextCommand):
def run(self, edit):
command = "xmllint -format -encode utf-8 -"
# help from
if self.view.sel()[0].empty():
xmlRegion = sublime.Region(0, self.view.size())
xmlRegion = self.view.sel()[0]
p = subprocess.Popen(command, bufsize=-1, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
result, err = p.communicate(self.view.substr(xmlRegion).encode('utf-8'))
if err != b"":
self.view.set_status('xmllint', "xmllint: " + err.decode("utf-8"))
self.view.replace(edit, xmlRegion, result.decode('utf-8'))
def clear(self):
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.