Skip to content

Instantly share code, notes, and snippets.

@benjaoming
Last active February 2, 2017 08:55
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save benjaoming/9911641 to your computer and use it in GitHub Desktop.
Save benjaoming/9911641 to your computer and use it in GitHub Desktop.
PyDev with autopep8 formatting upon CTRL+SHIFT+F
"""
This code is public domain.
The original author is Bear Huang (http://bear330.wordpress.com/).
Uploaded to GIST and adapted for autopep8 by github/benjaoming
"""
# Guide for installing a code formatter (like this one) in PyDev:
# http://bear330.wordpress.com/2007/10/30/using-pythontidy-in-pydev-as-code-formatter/
# Ensure that your autopep8.py is executable (chmod +x).
ABS_PATH_TO_AUTOPEP8 = "/home/you/bin/autopep8.py"
if False:
from org.python.pydev.editor import PyEdit #@UnresolvedImport
cmd = 'command string'
editor = PyEdit
assert cmd is not None
assert editor is not None
if cmd == 'onCreateActions':
# from org.eclipse.jface.action import Action
from org.python.pydev.editor.actions import PyAction
from org.python.pydev.core.docutils import PySelection
from java.lang import Runnable
from org.eclipse.swt.widgets import Display
from org.eclipse.jface.text import IDocument
from org.eclipse.jface.text import TextSelection
from java.io import FileWriter
import java.lang.Exception
FORMAT_ACTION_DEFINITION_ID = "org.python.pydev.editor.actions.pyFormatStd"
FORMAT_ACTION_ID = "org.python.pydev.editor.actions.navigation.pyFormatStd"
class PythonTidyAction(PyAction):
def __init__(self, *args, **kws):
PyAction.__init__(self, *args, **kws)
def run(self):
import tempfile
import os
try:
ps = PySelection(editor)
doc = ps.getDoc()
startLine = ps.getStartLineIndex()
p1 = tempfile.mktemp()
p2 = tempfile.mktemp()
f1 = FileWriter(p1)
result = ""
formatAll = False
if ps.getTextSelection().getLength() == 0:
# format all.
c = doc.get()
f1.write(c)
formatAll = True
else:
# format selection.
#c = ps.getSelectedText()
#f1.write(ps.getSelectedText())
print "Format selected text is not supported yet."
f1.write("")
# A kind of solution is to insert a special comment in
# front and end of selection text, pythontidy it, and
# extract text according that comment.
f1.close()
#os.system('/home/benjamin/bin/PythonTidy.py "%s" "%s"' % (p1, p2))
os.system('%s --aggressive --aggressive --experimental "%s" > "%s"' % (ABS_PATH_TO_AUTOPEP8, p1, p2))
f2 = open(p2, "r")
result = f2.read()
f2.close()
os.remove(p1)
os.remove(p2)
if startLine >= doc.getNumberOfLines():
startLine = doc.getNumberOfLines() - 1
if formatAll:
doc.set(result)
else:
#doc.replace(doc.getLineOffset(startLine), 0, result)
pass
sel = TextSelection(doc, doc.getLineOffset(startLine), 0)
self.getTextEditor().getSelectionProvider().setSelection(sel)
except java.lang.Exception, e:
self.beep(e)
def bindInInterface():
act = PythonTidyAction()
act.setActionDefinitionId(FORMAT_ACTION_DEFINITION_ID)
act.setId(FORMAT_ACTION_ID)
try:
editor.setAction(FORMAT_ACTION_ID, act)
except:
pass
class RunInUi(Runnable):
'''Helper class that implements a Runnable (just so that we
can pass it to the Java side). It simply calls some callable.
'''
def __init__(self, c):
self.callable = c
def run(self):
self.callable ()
def runInUi(callable):
'''
@param callable: the callable that will be run in the UI
'''
Display.getDefault().asyncExec(RunInUi(callable))
runInUi(bindInInterface)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment