2010-03-02 13 views
69

Estoy usando Vim y editando scripts de Python.Vim elimina automáticamente la sangría en los comentarios de Python

Autoindent funciona bastante bien en general, pero cuando comienzo una nueva línea y escribo '#' para escribir un comentario, Vim desenlaza esa línea para mí.

Por ejemplo, si tengo

def foo(): 

y pulse Intro, Vim sangría correctamente

def foo(): 
    pass 

pero, si en lugar de escribir pass, escribo #, que unindents automáticamente

def foo(): 
# comment 

class Thing(): 
    def __init__(self): 
     pass 
# comment line gets unindented all the way 

mi archivo .vimrc sigue. Alguien sabe por qué está pasando esto?

set tabstop=4 
set smartindent 
set shiftwidth=4 
set expandtab 
set backspace=indent,eol,start 
set scrolloff=3 
set statusline=%f%m%r%h%w\ [%Y\ %{&ff}]\ [%l/%L\ (%p%%)] 
set laststatus=2 
+0

Para el motor de búsqueda: dedent, outdent. – naught101

Respuesta

53

Configuración smartindent en Vim hace que se comporte como usted describe para mí, mientras que con nosmartindent (que es lo que tienden a utilizar) se comporta como prefiere que lo haga.

Actualización: A partir de los documentos de smartindent:

Al escribir '#' como primer carácter en una nueva línea, el guión de esa línea se retira, el '#' se pone en el primer columna. La sangría se restaura para la línea siguiente. Si no quiere esto, use esta asignación : ": inoremap # X^H #", donde^H se ingresa con CTRL-V CTRL-H. Al usar el comando ">>", las líneas que comienzan con '#' no se cambian a la derecha .

Eso parece ser.


Actualización: Probablemente no es necesario preocuparse por lo siguiente ... Lo dejo aquí por el valor informativo adicional. ;-)

Si el ajuste nosmartindent no ayuda, tal vez usted podría utilizar el comando :set - sin parámetros - para obtener la lista de todos los valores que están activos en la sesión de Vim, a continuación, pegarla en alguna parte (en Pastie quizás). Hay algunas otras opciones que afectan la sangría automática, por lo que recuerdo.

+8

Tuve dificultades para obtener el^H sugerido en esta respuesta usando CTRL-V CTRL-H, pero encontré que 'inoremap # X #' funciona. – Glenn

17

Si bien la publicación de Michał explica lo que hace smartindent, puede hacer mucho más que simplemente apagarlo. Puede configurarlo más a su gusto, o mejor aún, deje que Vim elija una mejor sangría para usted. Con lo siguiente en su vimrc en lugar de otros ajustes de sangría:

filetype indent on 

Vim usará automáticamente el plugin guión adecuado para Python. Esto es mucho mejor que simplemente no eliminar el sangriento de una línea #, prácticamente todo debe estar adecuadamente sangrado.

+3

Jefromi, No entiendo su respuesta. vim ya está seleccionando el complemento de sangría python; el problema es que el complemento se sangra de manera ilógica, eliminando la sangría por completo. Entonces su solución propuesta no soluciona el problema como se explica en la pregunta. –

+2

'smartindent' hará que la inicial de línea' # 'se elimine independientemente de si 'filetype indent' está activado o no. Entonces, tienes que configurar 'nosmartindent' para arreglar las cosas de todos modos. –

+4

Ah, a la derecha. Debo aclarar: realmente quise usar el tipo de archivo de sangría * en lugar de * otras configuraciones de sangrado. – Cascabel

5

Usted puede tratar de una opción sólo para los archivos de Python:

autocmd BufRead *.py inoremap # X<c-h>#<space> 
1

Para algunos razón desconocida el comportamiento anterior fue causado cuando tenía cindent en. Apagarlo lo solucionó por mí. Ninguna de las otras soluciones anteriores ayudó.

+1

La razón es que la convención en código C (que es lo que 'cindent' es para) es Unindent directiva proprocessor, que comienza con' '#. Entonces, esto es útil para C, pero es un gran problema para Python. –

Cuestiones relacionadas