Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Konfigurisanje Emacs-a kao Python IDE-a

Ovaj post je star dve godine.Većina tehnika odavde neće raditi sa novim Emacs verzijama.Ostaviću ovaj post zarad istorijata.

Emacs je krupna zverka. Sposoban je da čita email-ove, pušta tetris, ponaša se kao fajl menadžer , prikazuje google mape, pa čak i da uređuje video snimke . Podržava puno stvari, dosta programskih jezika i ima mnogo dodataka za programiranje . Na nesreću, emacs nema puno programsko okruženje za python, izvan paketa.

U ovom članku ću prikazati kako se konfiguriše emacs za pisanje Python programa. Mi želimo da imamo mogućnost, ne samo za syntax highlighting(naznačavanje sintaksi), već, takođe, i kompletiranje koda, jednostavan pristup Python-ovoj dokumentaciji, pronalaženje uobičajenih grešaka, testiranja jedinica, otklanjanje bagova, kao i dobro interaktivno programsko okruženje.

Ova postavka se bazira na ipython i python-modu, ali je, takođe, moguće koristiti i rope, ropemacs , i mod za automatsko kompletiranje , kao što možemo videti ovde . U prošlosti nisam imao mnogo sreće sa ropemacs-om, ali ću pokušati ponovo, u budućnosti.

Instaliranje i konfigurisanje alatki

Prvo treba da instaliramo alatke, koje su nam potrebne.

  • python-mod. Postoje dva python moda; python.el i python-mode.el. Iako python.el dolazi uz GNU Emacs 22, preporučujem vam upotrebu python-mode.el, budući da podržava ipython. (Postoje neki razgovori oko spajanja dva moda, ali nisam upoznat sa njihovim trenutnim statusom). Preuzmite i instalirajte python-mod i ono što usledi, smestite u .emacs:

    (require 'python-mode) (add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))
  • ipython. Ipython je moćna python školjka, sa naprednim dodacima i finim kompletiranjem koda. Pogledajte [ipython-ov websajt] u vezi dokumentacije i zaduženja. Ukoliko koristite debian ili ubuntu, možete je instalirati pomoću jedne komande:

    sudo apt-get install ipython

Za konfigurisanje ipython-a, uredite ~/.ipython/ipy_user_conf.py i dodajte vaše opcise . Ja volim da koristim ipy_greedycompleter tako da će to kompletirati stvari poput “foo”.TAB.

  • ipython.el. Dozvoljava vam da koristite python-mod zajedno sa ipython-om. Preuzmite i instalirajte ipython.el i ono što usledi smestite u svoj .emacs:

    (require 'ipython)
  • lambda-mod. Ovo je samo radi estetike. Kada instalirate lambda-mode.el prikazivaće vam se lambda karakter (λ), ako utkucate lambda:

Lambda mode in emacs

Pun naziv “lambda” će i dalje stajati tamo, emacs će ga samo drugačije prikazati. Meni se dopada lambda-mod, zato što čini da kod izgleda kraće, urednije i šmekerskije. Preuzmite i instalirajte lambda-mode.el i ono što usledi smestite u svoj .emacs:

(require 'lambda-mode) (add-hook 'python-mode-hook #'lambda-mode 1)

Ja sam morao da podesim promenljivi lambda-symbol za ono što sledi, osim za YMMV:

(setq lambda-symbol (string (make-char 'greek-iso8859-7 107)))

Postoje i drugi načini za dobijanje lepih lambdi i lepih simbola u emacs-u, pogledajte Emacs Wiki stranu, da pronađete ono što vam se sviđa.

  • Anything(bilo šta). Koristićemo anything za kompletiranje koda. Preuzmite i instalirajte anything.el, anything-ipython.el , and anything-show-completion.el , i ono što usledi dodajte u svoj .emacs:

    (require 'anything) (require 'anything-ipython) (when (require 'anything-show-completion nil t) (use-anything-show-completion 'anything-ipython-complete '(length initial-pattern)))
  • Promenite comint tastere. Comint je minoran kod za bavljenje interpretatorskim komandama u nekom emacs baferur. Koriste ga mnogi modovi, uključujući ipython. Comint koristi M-p i M-nto ciklus, unazad i unapred, kroz istoriju ulaza. Ja preferiram da koristim tastere sa strelicama na gore i na dole:

    (require 'comint) (define-key comint-mode-map (kbd "M-") 'comint-next-input) (define-key comint-mode-map (kbd "M-") 'comint-previous-input) (define-key comint-mode-map [down] 'comint-next-matching-input-from-input) (define-key comint-mode-map [up] 'comint-previous-matching-input-from-input)
  • pylookup. Koristićemo pylookup za pretragu python dokumentacije, uz emacs. Za početak, instalirajte python dokumentaciju, lokalno. Ukoliko koristite debian ili ubuntu, možete je instačirati pomoću jedne komande:

    apt-get install python2.6-doc

Ukoliko python dokumentacija nije dostupna, kao paket za vaš sistem, preuzmite je sa python websajta i unzip-ujte negde na vašem računaru. Zatim preuzmite pylookup i pratite instrukcije u README(pročitaj me) fajlu. Pokrenite pylookup.py u indeksu baze podataka, pokretanjem:

./pylookup.py -u file:///usr/share/doc/python2.6-doc/html

Ova komanda će generisati fajl baze podataka (pylookup.db). Prirodno, potrebno je da postavite ispravnu putanju za python dokumentaciju. Sledeće je da treba da dodate ono što usledi u vaš.emacs. Na kraju, zamenite vrednosti, da se uklope sa vašim sistemom system.

(autoload 'pylookup-lookup "pylookup") (autoload 'pylookup-update "pylookup") (setq pylookup-program "~/.emacs.d/pylookup/pylookup.py") (setq pylookup-db-file "~/.emacs.d/pylookup/pylookup.db") (global-set-key "\C-ch" 'pylookup-lookup)
  • Autopair(automatsko uparivanje). Uobičajen dodatak u modernim editorima, služi da ubaci parove podudarajučih elemenata, poput parenthesis, quotes, i braces. Postoji mnogo načina da se ovo uradi u emacs-u, a instaliranje autopair.elis je verovatno najjednostavniji. Možete ga konfigurisati da radi u svim modovima i isključiti modove za koje ne želite da se aktiviraju. Na primer, ja ga imam konfigurisanog da radi globalno, osim u lisp-modu, gde koristim paredit :

    (autoload 'autopair-global-mode "autopair" nil t) (autopair-global-mode) (add-hook 'lisp-mode-hook #'(lambda () (setq autopair-dont-activate t)))

Takođe imam i ono što je usledilo u svom .emacs da učini da autopair radi uz python singl i trostruki upit:

(add-hook 'python-mode-hook #'(lambda () (push '(?' . ?') (getf autopair-extra-pairs :code)) (setq autopair-handle-action-fns (list #'autopair-default-handle-action #'autopair-python-triple-quote-action))))
  • pep8 and pylint. Ove skripte mogu poslužiti da provere stilske greške i najčešće pogreške u vašem programu. Instalirajte pylint i pep8:

    ako želite instalirano pylint pep8

preuzmite i instalirajte python-pep8.el i python-pylint.el da ih integrišete uz pomoć emacs-a I ono što usledi dodate su svoj .emacs:

(require 'python-pep8) (require 'python-pylint)
  • brisanje pratećeg praznog prostora. Kada ukucate taster za povratak, u python-modu, to će pozvati py-newline-and-indent. Kao što priručnik kaže, on “briše praznine ispred tačke, ubacuje novi red, i daje logične pretpostavke, kako želite da ubacite novi red.” Ovo je sjajno i ja obožavam ovaj dodatak, ali postoji nenamerna konsenkvenca, možete završiti sa praznim linijama sastavljenim od pratećih praznina. Python ne mari, ali pep8 alatka će se buniti. Ono što usledi smestite u svoj .emacs da obrišete prateće praznine, kada čuvate fajl:

    (add-hook 'before-save-hook 'delete-trailing-whitespace)
  • ipdb paket. ipdb paket čini jednostavnim postavljanje prelomnih tačaka u ipdb uklanjaču bagova. Lako se instalira uz pomoć easy_install (ma nije nego :-P):

    easy_install ipdb
  • reimport paket. reimport je zamena Python-ove reload funkcije, koja ponovo učitava sve module i podmodule, konzistentno. Korisna je za dugotrajne programe i kod interaktivnog programiranja. Instalirajte je pomoću easy_install:

    sudo easy_install reimport
  • Šabloni. Yasnippet su tekstualni šabloni za emacs. Preuzmite Yasnippet i ono što usledi smestite u vaš .emacs:

    (require 'yasnippet-bundle) (yas/initialize) (yas/load-directory "~/.emacs.d/my-snippets/")

Takođe možete instalirati flymake da proverite sintakse. To smatram zbunjujućim, pa ga ne koristim.

U redu, ovo su alatke koje su nam potrebne! Sada možemo da počnemo sa korišćenjem ovih dodataka.

Upotreba python-moda

Dakle, sada smo spremni da počnemo. Opvorit neki python fajl, recimo test.py, i ukucajte C-c ! (py-shell) da startujete python interpretator. Vratite se na test.py (pomoću C-x o) i ukucajte C-c C-c (py-execute-buffer) da pošaljete ceo bafer u interpretator. Na slici koja usledi možemo videti kako to radi; potrebno je da može da napiše kod u jednom fajlu i testira ga u interpretatoru bez potrebe za potpunim uredi-kompajluj-pokreni-testiraj ciklusom:

ipython inside emacs

Kompletiranje koda

Kompletiranje koda je veoma korisna funkcija, i ja smatram da mora biti sposobna za kompletiranje metoda, za obe, ugrađene i korisnički definisane , klase . Na primer, ako ukucate “os.path.” i M-tab emacs će prikazati sve raspoložive metode u os.path-u:

Python code completion in emacs

Ovaj metod kompletiranja koristi anything i možete upotrebiti C-n i C-p za navigaciju kroz predmete koji se kompletiraju (kada ste gotovi, ukucajte return-povratak)). Ovo koristi korisnički definisanim metodama i funkcijama, takođe:

Python code completion in emacs

Pristup dokumentaciji

Python ima sjajnu dokumentaciju, a snažan pomak u produktivnost predstavlja to što je moguće pristupiti dokumentaciji bez napuštanja editora. Koristeći pylookup možemo ukucati C-c h da potražimo bilo koji termin u python dokumentaciji. Na primer, ako ukucamo “os.path.basename” a zatim C-c h radi pozivanja dokumentacije, pylookup će otvoriti stranu sa dokumentacijom os.path.basename koristeći standardni pregledač, konfigurisan u emacs-u (obično firefox):

Međutim, mnogi ljudi radije koriste w3m inside emacs za pregledanje tehničke dokumentacije. Uz w3m možemo čitati dokumentaciju bez napuštanja emacs-a, čineći jednostavnim kopiranje delova koda i bez potrebe za prebacivanjem na spoljni program (previše prebacivanja ubija fokus). Ovde se nalazi ista dokumentacija sa gornje slike, ali uz upotrebu w3m-a ovog puta:

Ukoliko tragate za nečim što ima više od jednog mogućeg odgovora, pylookup će tražiti da izaberete između nekih mogućnosti, na primer, ako tražite “print-štampaj” dobićete puno opcija da izaberete među njima:

Kvalitet koda

pep8 skripta proverava kod, za vas, prateći PEP8 stilski vodič . Možete ga pokrenuti u emacs-u, ako ukucate M-x pep8. Taster M-x ` će vas prebaciti na mesto izvornog koda, gde se naredna greška pojavljuje:

Možete pokrenuti pylint u emacs-u uz M-x pylint, ponaša se slično kao pep8:

Testiranja jedinica

Moguće je pokrenuti testiranja jedinica u emacs-u, ako koristimo kompilacijski mod . Ukucajte M-x kompajluj, i zamenite ono što se pojavi (najverovatnije “make -k”) svojim omiljenim python programom, za pokretanje testiranja jedinica. Isto tako i sa pep8 i pylint (oba koriste kompilacijski mod), možete ukucati M-x za pronalaženje naredne greške. Na snimcima ekrana koji slede, možemo videti da testiraj_kvadrat_od_100_je_1000` je netačno:

Otklanjanje bagova

Postoji mnogo načina da se otkloni greška u python kodu. Ja volim da koristim ipdb, ipython-ov uklanjač bagova, zato što ima napredne dodatke, poput kompletiranja koda i naznačavanja sintaksi. Uz -pdb zastavicu Ipython će otići direktno na uklanjač bagova, kada se izuzetak ukaže, umesto da samo odštampa nađenu trasu. (možda ćete želeti da uredite ~/.ipython/ipythonrc, kako bi promena ostala trajna).

Da odredite prelomne tačke u regularnom python-ovom uklanjaču bagova, morate da dodate linije za praćenje vašem kodu:

import pdb; pdb.set_trace()

Sa ipdb paketom možemo na sličan način odrediti prelomne tačke, ako koristimo ipdb:

import ipdb; ipdb.set_trace()

I želim da emacs naznači linije koje podešavaju prelomne tačke, tako da mogu lako da opazim gde se prelomne tačke nalaze i zapamtim da ih uklonim iz koda nakon što uklonim bagove. Ja koristim sledeći kod, da to postignem:

(defun annotate-pdb () (interactive) (highlight-lines-matching-regexp "import pdb") (highlight-lines-matching-regexp "pdb.set_trace()")) (add-hook 'python-mode-hook 'annotate-pdb)

Obratite pažnju na pratećem snimku ekrana, kako je linija koja podešava prelomne tačke označena, a izvršavanje programa zaustavljeno u prelomnoj tački. Upotrebio sam komandu n (next-sledeće) da pređem na sledeću izjavu:

Ja imam funkciju za dodavanje prelomnih, mapiranih tačaka na C-c C-t, tako da mogu lako da podesim prelomne tačke :

(defun python-add-breakpoint () (interactive) (py-newline-and-indent) (insert "import ipdb; ipdb.set_trace()") (highlight-lines-matching-regexp "^[ ]*import ipdb; ipdb.set_trace()")) (define-key py-mode-map (kbd "C-c C-t") 'python-add-breakpoint)

Šabloni

Za tekstualne šablone koristim Yasnippet (obavezno pogledajte njegov demo ). Uz pomoć njega možete brzo i jednostavno odrediti šablone, da popune stvari za vas, poput klasa novog stila sa dokumentacijom i nekim __init__ metodom. Python nema puno zaduženja, ali vam korišćenje yasnippet može pomoći da kod napišete još brže.

Pronalaženje vašeg načina u izvornom kodu

Emacs nam dozvoljava kretanje kroz izvorni kod, upotrebom tagova . Kada ugledate poziv za funkciju, možete skočiti na njeno definisanje preko M-. (find-tag) i vratiti se nazad sa M-* (pop-tag-mark). Još jedna korisna komanda je tags-query-replace, i služi za promenu naziva funkcijama, metodima, itd. Da bismo je koristili moramo da generišemo fajl TAGOVI. Emacs dolazi sa etags komandom, ali ja preporučujem exuberant tags:

sudo apt-get install exuberant-ctags

Ja obično smeštam prateće kodove u Makefile radi generisanja fajla TAGOVI, za projekat:

ctags-exuberant -e -R --languages=python --exclude="__init__.py"

Izlaženje na kraj sa višestrukim fajlovima

Kao što smo videli, mi možemo programirati u interaktivnom stilu u python modu, šaljući bafer u python interpretator pomoću C-c C-c. Ovo uspešno funkcioniše kod prostih skripti i biblioteka, ali ne tako uspešno kod kompleksnijih modula, sa podmodulima. Na primer, ako otvorite file4.py u mainmodule, koji se nalaze ispod, i izvršite ih pomoću C-c C-c, propašće ukoliko zavisi od ostalih podmodula.

mainmodule |--- __init__.py |--- submodule1 |--- __init__.py |--- file1.py |--- file2.py |--- submodule2 |--- __init__.py |--- file3.py |--- file4.py

Mođemo definisati glavni fajl, koristeći py-master-file promenljivu; python-mod će izvršiti podešavanje fajla promenljivih, umesto aktuelnog baferskog fajla. Ova promenljiva može biti podešena kao fajl promenljivih, ali ja radije ne bih da poredim baš svaki .py file u modulu, sa fajlom promenljivih, tako da koristim direktorijum promenljivih , umesto toga. Još jedna prednost upotrebe direktorijuma promenljivih, u ovom slučaju, je ta što svaki član tima može podesiti py-master-file da prikaže podlogu njihovog fajl sistema. Kreirajte fajl pod nazivom .dir-locals.el u mainmodule-ovom korenu, sa sledećim sadržajem:

((python-mode . ((py-master-file . "/path/to/interactivetest.py") (tags-file-name . "/path/to/TAGS"))))

(Primećujete da ja takođe definišem ime fajla taga, tako da će ga emacs automatski učitati dok čitam python fajl, lociran u ovom direktorijumu.)

Da bi ovo radilo, koristim glavni fajl pod nazivom interactivetest.py, u korenu modula, da ponovo uvezem modul sa reimport paketom. Ovaj fajl, zapravo nije deo modula Iži ja ga čak i nisam potvrdio u kontrolama ove verzije. Sada, svaki put kada pritisnemo C-c C-c, bez obzira na to koji fajl menjamo, python-mod će izvršiti interactivetest.py ponovo, i prilagoditi ceo modul. Na primer, ovo je ono što imam u interactivetest.py za moju aristoxenus biblioteku:

import reimport import aristoxenus reimport.reimport(aristoxenus)

Ali mogu dodati nekoliko stvarčica u interactivetest.py fajl, kako bih, postigao da testiranje stvari bude interaktivno lakše, i bio u mogućnosti da ih sačuvam, između seansi kodiranja:

from aristoxenus.parse import humdrum foo = humdrum.parse_string("**kern\n4C")

Naravno, ovo nije zamena za testiranje jedinica, ali je lepo imati foo na raspolaganju, u REPL tako da ga mogu proveriti i lako pronaći šta ne valja.

Zaključak

Kao što vidite, možemo imati fino programsko okruženje za python u emacs-u. Možda izgleda kao da ima dosta posla, ali, ustvari, mi samo treba da preuzmemo i konfigurišemo, već postojeće pakete. Međutim, bilo bi lepo imati potpuno razvojno okruženje za python, poput slime-a.

Nisam pominjao mnoge stvari, poput emacs kod pregledača , git interfejs , i window menadžer sesija. One nisu specijalno određene za python, ali doprinose preobražaju emacs-a u moćnu alatku za programiranje. Možda ću ih pomenuti u sledećem članku.

Nameravam, da u budućnosti napravim zbirku sa ovim dodacima, tako da ostanite pripravni. U međuvremenu, šta ćete koristiti za programiranje python koda?





Published (Last edited): 11-02-2013 , source: http://pedrokroger.net/2010/07/configuring-emacs-as-a-python-ide-2/