[Python-de] IDE: Umfrage

Stefan Schwarzer sschwarzer at sschwarzer.net
Sa Jul 5 18:50:06 CEST 2014


Hallo Bernd,

On 2014-07-05 12:08, Bernd Waterkamp wrote:
> Stefan Schwarzer schrieb:
>> Neben dem Editor habe ich immer eine Shell geöffnet, zu der ich mit
>> Alt-Tab wechseln kann und wieder zurück zum Editor. Auf Wunsch kann ich
>> mehr zu meinem "Setup" sagen.
> 
> Das interessiert mich durchaus. Als "Python-IDE" nutze ich vim bisher nicht
> wirklich. Als Editor bewährt er sich immer wieder. Artikel wie diesen hier
> http://sontek.net/blog/detail/turning-vim-into-a-modern-python-ide habe ich
> schon mal überflogen, aber mich interessieren weitere Erfahrungswerte im
> Plugin-Dschungel, da vim als "IDE" neben dem ipython-notebook auf der
> "Dinge die ich mal intensiv testen möchte" weit oben steht. 

Hier ist ein Beispiel-Screenshot [1].

[1] https://bytebucket.org/sschwarzer/misc/raw/59761ba5c4b2cc1a20fa3ced4f42d7fe76b2b6b0/desktop_vim1.png

Im Terminal links läuft screen [2], womit ich, ebenfalls per
Tastatur, zwischen mehreren Shells umschalten kann, wenn ich
das möchte.

[2] https://en.wikipedia.org/wiki/GNU_Screen

Ich strebe _nicht_ an, möglichst viele IDE-Funktionen in Vim
parat zu haben. Zum Beispiel erledige ich Mercurial- und
Subversion-Operationen fast vollständig auf der
Befehlszeile. (Gelegentlich nehme ich Experimente mit
`:!hg revert %` zurück.) Als Python-Shell verwende ich
IPython, bisher normalerweise nicht in der
Notebook-Variante. Zum Debuggen verwende ich üblicherweise
ipdb.

Meine verwendeten Vim-Plugins sind:

- Pathogen [3]
- Supertab [4]
- Bufkill [5]
- jpythonfold [6]. An diesem Folding-Plugin finde ich gut,
  dass es anders als manche anderen die Anzahl der
  gefalteten Zeilen ans Ende der Faltungszeile stellt.

[3] http://www.vim.org/scripts/script.php?script_id=2332
[4] http://www.vim.org/scripts/script.php?script_id=1643
[5] http://www.vim.org/scripts/script.php?script_id=1147
[6] http://www.vim.org/scripts/script.php?script_id=2527

Daneben habe ich einige Mappings:

  " Use <leader>w instead of ctrl-w for window commands.
  map <leader>w <c-w>

  " Comment and uncomment
  vnoremap <leader>c :s;^;# ;<cr>
  vnoremap <leader>C :s;^#\(\s*$\\| \);;<cr>

  " Join following lines with comments characters.
  nnoremap <leader>J JldW

  " Useful for debugging in Python.
  inoremap <leader>d import pdb; pdb.set_trace()
  inoremap <leader>di import ipdb; ipdb.set_trace()
  inoremap <leader>p print("=== :", )<ESC><BS><BS><BS><BS>i

  " Search for classes and functions/methods.
  nnoremap <leader>sc /^\s*class<space>
  nnoremap <leader>sf /^\s*def<space>

  " Adjust lines. Don't include <CR> , so that the command line can
  " be edited before submitting it.
  vnoremap <leader>a :!adjust.py -c1 -sb =

  " Format a selected visual area to 70 characters width. After
  " formatting, reset text width to 0.
  vmap <leader>m <esc>:set textwidth=70<cr>gvgq:set textwidth=0<cr>

  " See http://objectmix.com/editors/149163-how-do-xml-folding.html
  let g:xml_syntax_folding = 1
  autocmd FileType xml setlocal foldmethod=syntax

  augroup myprogs
    au!
    " Prepend all new source files below ~/sd with my default license.
    au BufNewFile  ~/sd/*  r ~/sd/MIT_LICENSE | :.-1 d | :$
    " In commit messages, move the cursor to the first line.
    au BufNewFile,BufRead svn-commit.tmp :1
  augroup END

Das obige Mapping

  inoremap <leader>p print("=== :", )<ESC><BS><BS><BS><BS>i

fügt die Zeile

  print("=== :", )

in den Quelltext ein und setzt den Cursor im Einfügemodus
vor den Doppelpunkt. Wenn ich diese Zeile "ausfülle", sehe
ich in der Ausgabe jeweils, _was_ da ausgegeben wird. :-)

Bei kleinen Projekten lasse ich Supertab einfach die gerade
geladenen Buffer nach Bezeichnern durchsuchen. Bei etwas
größeren Projekten verwende ich etwas wie

  " See http://stackoverflow.com/questions/155449/vim-auto-generate-ctags
  " Delete the tags file first. If we don't, a second `ctags` invocation
  " may garble the file if a previous `ctags` process is still running.
  autocmd BufWritePost ~/r/*/*.py silent! !rm tags && ctags -R &

um die Projekt-Dateien so zu indizieren, so dass ich mit ^]
oder mit den anderen Tag-Befehlen leicht zur Definition
eines Bezeichners springen kann, auch wenn die Datei vorher
nicht geladen war. Das klappt recht gut.

Apropos Buffer: Ich möchte an der Stelle daran erinnern,
dass der Befehl `:b` (`buffer`) nicht nur die Buffer-Nummern
als Argument erlaubt, sondern auch Teile von Datei-Pfaden.
Wenn ich also `ftputil/host.py` und `test/test_host.py`
geladen habe, kann ich beispielsweise mit `:b /host` zur
ersten und mit `:b st_host` zur zweiten Datei gehen. Je
nachdem, was so alles an Dateien geladen ist, reichen
gegebenenfalls auch weniger Zeichen.

Bei nicht zu großen Projekten reicht mir `:vimgrep` zusammen
mit Quickfix-Befehlen (`:help quickfix`), um die Dateien
nach Verwendungen eines Bezeichners zu durchsuchen. Das
funktioniert nicht "intelligent", sondern sucht nach
Text-Vorkommen. Immerhin kann man Wortgrenzen angeben.
Beispielsweise kann ich mit

  :vimgrep /\<host_/ **/*.py

alle Namen finden, die mit "host_" anfangen. Suchen nach
anderen regulären Ausdrücken ist auch kein Problem.

Ebenfalls nette Befehle sind `z<Enter>` und `zz`, um die
Zeile, in der der Cursor steht, an den Anfang oder die Mitte
des Fensters zu setzen. Der erste Befehl ist gut, um die
ganze Funktion/Methode zu sehen (wenn sie nicht länger als
eine Bildschirmseite ist) oder die Umgebung des Cursors.

Code-Folding per Tastatur ist ebenfalls nett. ;-)

Man kann an dieser Beschreibung vielleicht erkennen, dass
ich lieber praktische "nicht-perfekte" Funktionen habe, die
ich schnell aufrufen kann als "perfekte" Funktionen, für die
ich mich mit einer gegenüber Vim umständlich zu bedienenden
IDE kämpfen muss.

Mir ist andererseits natürlich klar, dass für jemanden, der
mit Vim nicht vertraut ist, _Vim_ umständlich zu bedienen
ist. ;-)

Viele Grüße
Stefan


Mehr Informationen über die Mailingliste python-de