2012-06-15 6 views

Odpowiedz

14

Można aktywować PyDev formatowania kodu-z Ctrl + Przesunięcie + F (preferencje w: Okno> Preferencje> PyDev> Redakcja> Code Style> Code Formatter - można nawet włączyć pracować automatycznie).

Mimo to wewnętrzny program do formatowania PyDev jest dość konserwatywny i nie wykona wszystkich transformacji wymaganych do uzyskania w 100% kompatybilnego kodu PEP8 (chociaż obsługuje on bardziej typowe przypadki), więc jeśli nie wystarcza dla twoich potrzeb, masz kilka opcji:

  1. można użyć autopep8.py który jest również zintegrowany PyDev domyślnie w najnowszej wersji (włączone poprzez okno> Preferencje> PyDev> Redakcja> Code Style> Code Formatter> użyj autopep8. py dla formatowania kodu?)

  2. Możesz przyjrzeć PythonTidy (narzędzie zewnętrzne) ... to można go używać, jak określono w: http://bear330.wordpress.com/2007/10/30/using-pythontidy-in-pydev-as-code-formatter/

4

zrobiłem skrypt umożliwiają użycie autopep8 w PyDev jako kod formater, a może być spersonalizowane w celu spełnienia standardu kodowania w twoim zespole.

Jeśli chcesz z niego korzystać, zapisz ten kod gdzieś jako pyedit_autopep8.py (pyedit_XXXX.py jest wymagany). Musisz także zainstalować pakiety Pythona pep8 i autopep8.

Następnie przejdź do eclipse stronę preferencji PyDev (w: okna> Preferencje> PyDev> scripting PyDev), aby określić lokalizację skryptu:

Teraz, w celu powołania autopep8 można po prostu naciśnij Ctrl + Shift + F podczas edycji kodu Pythona w czasie zaćmienia. Formatowany tekst jest również obsługiwany!

""" 
By Per A. Brodtkorb 
based on pyedit_pythontidy.py by Bear Huang (http://bear330.wordpress.com/). 

This code is public domain. 
""" 

import tempfile 
import os 

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.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 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 Autopep8Action(PyAction): 
     def _autopep8(self, text): 
      tmp_full_file_name = tempfile.mktemp() 
      f1 = FileWriter(tmp_full_file_name) 
      f1.write(text) 
      f1.close() 
      os.system('autopep8-script.py -i "%s"' % (tmp_full_file_name)) 
      f2 = open(tmp_full_file_name, "r") 
      tidy_text = f2.read() 
      f2.close() 
      os.remove(tmp_full_file_name) 
      return tidy_text 

     def _get_text(self, selection): 
      text = selection.getSelectedText() 
      format_all = len(text) == 0 
      if format_all: 
       print "Autopep8: format all." 
       text = selection.getDoc().get() 
       text_offset = 0 
      else: 
       print "Autopep8: Format selected." 
       text_offset = selection.getAbsoluteCursorOffset() 
      return text, text_offset 

     def run(self): 
      try: 
       selection = PySelection(editor) 

       text, text_offset = self._get_text(selection) 
       tidy_text = self._autopep8(text) 

       if len(text)==len(tidy_text): 
        print "Autopep8: Nothing todo!" 
       else: 
        doc = selection.getDoc() 
        doc.replace(text_offset, len(text), tidy_text) 

      except java.lang.Exception, e: 
       self.beep(e) 

    def bindInInterface(): 
     act = Autopep8Action() 
     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) 
+2

Jako notatkę, autopep8.py jest obecnie zintegrowana PyDev domyślnie (to po prostu musi być włączony w preferencjach). –