Last active
February 2, 2017 08:55
-
-
Save benjaoming/9911641 to your computer and use it in GitHub Desktop.
PyDev with autopep8 formatting upon CTRL+SHIFT+F
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
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