Pregunta

Desde el poderoso PEP 8 :

  

[P] límite arrendamiento todas las líneas a un máximo de 79 caracteres. Para hacer fluir largos bloques de texto (cadenas de documentación o comentarios), lo que limita la longitud de 72 caracteres se recomienda.

Al editar el código Python en Vim, puse mis textwidth a 79, y Vim ajusta automáticamente largas líneas de código Python para mí cuando me golpeó el límite de caracteres. Pero en comentarios y cadenas de documentación, necesito ajustar el texto a 72 caracteres en su lugar.

¿Hay alguna manera de hacer que Vim ajusta automáticamente textwidth a 72, cuando estoy en un comentario o cadena de documentación, y la puso de vuelta cuando he terminado?

¿Fue útil?

Solución

Por lo tanto, nunca he hecho ninguna de secuencias de comandos Vim antes, pero según esta pregunta acerca de hacer algo similar en C y este consejo para comprobar si usted está actualmente en una comentario, he hackeado una solución.

Por defecto, este utiliza el ancho de PEP8-sugerido de 79 caracteres para las líneas normales y 72 caracteres para los comentarios, pero se los puede sustituir por letting las variables g:python_normal_text_width o g:python_comment_text_width, respectivamente. (Personalmente, ajustar las líneas normales a 78 caracteres.)

Esta caída de bebé en su .vimrc y usted debe ser bueno para ir. Puedo empaquetar esto como un plug-in más tarde.

function! GetPythonTextWidth()
    if !exists('g:python_normal_text_width')
        let normal_text_width = 79
    else
        let normal_text_width = g:python_normal_text_width
    endif

    if !exists('g:python_comment_text_width')
        let comment_text_width = 72
    else
        let comment_text_width = g:python_comment_text_width
    endif

    let cur_syntax = synIDattr(synIDtrans(synID(line("."), col("."), 0)), "name")
    if cur_syntax == "Comment"
        return comment_text_width
    elseif cur_syntax == "String"
        " Check to see if we're in a docstring
        let lnum = line(".")
        while lnum >= 1 && (synIDattr(synIDtrans(synID(lnum, col([lnum, "$"]) - 1, 0)), "name") == "String" || match(getline(lnum), '\v^\s*$') > -1)
            if match(getline(lnum), "\\('''\\|\"\"\"\\)") > -1
                " Assume that any longstring is a docstring
                return comment_text_width
            endif
            let lnum -= 1
        endwhile
    endif

    return normal_text_width
endfunction

augroup pep8
    au!
    autocmd CursorMoved,CursorMovedI * :if &ft == 'python' | :exe 'setlocal textwidth='.GetPythonTextWidth() | :endif
augroup END

Otros consejos

La respuesta aceptada es genial! No obstante, admite el hábito que tengo para dar formato a / editar los comentarios que hago mis ediciones y luego usar el comando gqj, que es esencialmente "reformatear la línea actual se combina con la siguiente". Entonces me golpeó ''. repetir que para cada línea (el propio comando avanza el cursor a la siguiente línea). No sé el lenguaje de script Vim muy bien, por lo que alguien puede ser capaz de añadir soporte para esto a la respuesta aceptada. Mientras tanto, lo que he hecho es asignar una tecla de función (F6) para cambiar el textwidth a 72, el formato de la línea y luego cambiar la parte posterior textwidth a 79.

nmap <F6> :set textwidth=72<CR>gqj:set textwidth=79<CR>

Ahora, cuando estoy en una cadena de documentación, acabo de hacer la edición, (ESC) y luego pulsa F6 repetidamente hasta que todas las líneas tienen el formato correcto.

He añadido mi mando mapa y la secuencia de comandos respuesta aceptada a mi .vim / después / ftplugin / python.vim.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top