08 marzo 2011

Vim como python ide II

Llevo unos días usando la modificación que hice para preparar a vim como python ide y he hecho unas modificaciones que he visto que me eran útiles y/o necesarias. Por si a alguien le resulta útil dejo aquí las modificaciones y algunos comandos interesantes.

Como he empezado desde cero y lógicamente no me he leído toda la documentación sino unas pocas cosas básicas y luego un poco a medida de mis necesidades cometo algunos errores. Para hacer una primera criba instalé pylint y su pluguin para vim que te indica donde has cometido errores y/o "errores" según los PEP de python (estos últimos son recomendaciones).

Instalamos los paquetes necesarios

sudo aptitude install pylint

Creamos el directorio apropiado y descargamos en el el pluguin

mkdir ~/.vim/compiler
cd ~/.vim/compiler
wget http://www.vim.org/scripts/download_script.php?src_id=10365

Activamos el funcionamiento escribiendo lo siguiente y conseguimos que cada vez que grabemos un archivo escrito en python nos muestre todos nuestros errores y así podamos corregirlos rápidamente.

vim ~/.vim/ftplugin/python.vim

compiler pylint

Si queremos que no se nos muestre cada vez que grabemos escribiremos lo siguiente

vim ~/.vimrc

let g:pylint_onwrite = 0

y simplemente escribimos o mapeamos

:Pylint

El autocompletado de python funciona bien, pero te reconoce funciones, clases de módulos importados o creadas por ti. Luego tienes Ctrl+P o Ctrl+N que te reconoce cualquier palabra de tu archivo u otro que tengas abierto. Así que si quisieras que reconozca por ejemplo raw_input o print sin que lo tengas escrito no lo hace. Solucioné esto creándome un diccionario para python o sea un archivo con las palabras que quieras (una en cada línea). Según el ejemplo anterior

mkdir ~/.vim/dictionaries/python

raw_input(
print

Ahora lo activamos y lo mapeamos para mayor agilidad y si escribiéramos ra y pulsáramos la tecla nos devolvería raw_input(

vim ~/.vim/ftplugin/python.vim

set dictionary=$HOME/.vim/dictionaries/python
imap <F5> <C-x><C-k>

Otro aporte interesante es añadir una cabecera automáticamente cuando creemos un archivo.py. Para ello primero creamos un archivo con el el contenido de nuestra cabecera.

mkdir ~/.vim/templates
vim python_head

:insert
#!/usr/bin/env python
# -*- coding: utf8 -*-
#==============================================================================
#       ARCHIVO:  ARXIVO
#           USO:  ---
#
#      OPCIONES:  ---
#    REQUISITOS:  ---
#         NOTAS:  ---
#         AUTOR:  ATOR
#           WEB:  VEB
#        CREADO:  KREA
#==============================================================================
#== DESCRIPCION:
.

Luego colocamos lo siguiente en vimrc que, aparte de escribir la cabecera sustituirá los valores por los datos correctos que le indiquemos

autocmd bufnewfile *.py so $HOME/.vim/templates/python_head
autocmd bufnewfile *.py exe "1," . 13 . "g/ARXIVO.*/s//" .expand("%")
autocmd bufnewfile *.py exe "1," . 13 . "g/ATOR.*/s//Nebur (Más Vale Manya ...), masvalemanya@gmail.com"
autocmd bufnewfile *.py exe "1," . 13 . "g/VEB.*/s//masvale-manya.blogspot.com"
autocmd bufnewfile *.py exe "1," . 13 . "g/KREA.*/s//" .strftime("%c")

Esto lo encontré en la documentación de bash-support y consiste en que cierre automáticamente las comillas dobles y simples, los paréntesis, corchetes y claves y ponga el cursor en medio para empezar a escribir. También lo prepararemos para que en modo visual escribiendo el símbolo inicial nos coloque no a cada lado de una selección.

vim ~/.vimrc

inoremap ( ()<Left>
inoremap [ []<Left>
inoremap { {}<Left>
vnoremap ( s()<Esc>P
vnoremap [ s[]<Esc>P
vnoremap { s{}<Esc>P
vnoremap  '  s''<Esc>P<Right>
vnoremap  "  s""<Esc>P<Right>
vnoremap  `  s``<Esc>P<Right>
inoremap        '  '<Esc>:call QuoteInsertionWrapper("'")<CR>a
inoremap        "  "<Esc>:call QuoteInsertionWrapper('"')<CR>a
inoremap        `  `<Esc>:call QuoteInsertionWrapper('`')<CR>a

function! QuoteInsertionWrapper (quote)
        let     col     = col('.')
        if getline('.')[col-2] !~ '\k' && getline('.')[col] !~ '\k'
                normal ax
                exe "normal r".a:quote."h"
        end
endfunction    " ----------  end of function QuoteInsertionWrapper

A veces nuestro código es muy largo y otro truco es el autoplegado automático. Las clases, funciones apareceran con un + al principio y muestra el nombre y el principio de su docstring en una línea, para que lo despleguemos cuando queramos. Como ya tengo un archivo en ftpluguin para que se active solo cuando use un archivo escrito en python me descargue el siguiente pluguin

wget http://www.vim.org/scripts/download_script.php?src_id=4431

Y copie su contenido en ~/.vim/ftplugin/python.vim

Como muchas veces trabajo con gnome-terminal tiene mapeado Ctrl+- y Ctrl++ para hacer más grande o pequeña la ventana de gnome, no podía hacer mas grande o pequeña línea a línea un split o vsplit. Para evitar esto y hacerlo más sencillo

vim ~/.vimrc

map - <C-w>-
map + <C-w>+
map < <C-w><
map > <C-w>>

Cuando pegamos algo desde fuera de vim normalmente se identa y has de ir eliminando las sangrías, ... Vim tiene un modo copiar donde esto no sucede. Por comodidad lo mapee y asi se activa y desactiva con una tecla

vim ~/.vimrc

set pastetoggle=<F12>

Para que cuando presionemos Ctrl+P o Ctrl+N nos devuelva las palabras completas no partidas. Ejemplo: cadena (sino aparece sola) en vez de cadena.split()

vim ~/.vim/ftplugin/python.vim

set iskeyword+=.

Si usamos algunas palabras muy usualmente como por ejemplo, pongamos que en cada archivo ponemos masvale-manya.blogspot.com podemos automatizarlo para que escribiendo azs (que no forme parte de otra palabra) nos lo escriba.

vim ~/.vimrc

ab azs masvale-manya.blogspot.com

Por último unos comandos interesantes

:mksession! archivo "te guarda tu estado actual (ventanas, bufers, ...) en archivo
:source archivo "te restaura el estado que este guardado en archivo
:w !sudo tee % "te permite guardar un archivo cuando no lo has abierto con sudo
:tab sba "convierte todos los bufers en pestañas
:wall "grabar todos los bufers
:qall "cerrar todas las ventanas
zo "Expande un pliegue
zc "Contrae un pliegue
zR "Expande todos los pliegues
zM "Contrae todos los pliegues
gU "en modo visual pone la selección en mayúsculas
gu "en modo visual pone la selección en minúsculas

No hay comentarios: