¿Existe alguna práctica recomendada para plegar un archivo vimrc?


21

Recientemente me di cuenta de que vimrcahora tiene más de 400 líneas de largo (lo cual es demasiado, intentaré reducir eso) y para que sea más fácil navegarlo, leerlo y editarlo, decidí investigar el concepto de plegado en vim (que No estaba familiarizado con) .

  • Traté de establecer el método de plegado indentpero no me gustó el resultado (fue demasiado desordenado principalmente porque una gran parte de mi vimrcno está realmente sangrado).
  • También traté de conjunto foldmethodde expry syntaxpero no era capaz de doblar nada correctamente.
  • Aquí el uso diffcomo método de plegado no parece relevante. (O si es así, no entiendo cómo usarlo)
  • Así que por ahora estoy usando el markermétodo que no me satisface totalmente debido a los marcadores "{{{y "}}}que encontré "ruidosos" en el archivo.

Por lo tanto, me gustaría saber si hay mejores prácticas o pautas comunes sobre cómo plegar correctamente avimrc .

Nota 1: Como todos sabemos, SO no es un foro y no está hecho para recopilar opiniones personales y eso no es lo que estoy buscando: por supuesto, creo que algunas personas tienen sus preferencias, pero me gustaría saber por qué usar los marcadores (por ejemplo) mejoran la legibilidad más que el uso de sangría.

Nota 2: También mi objetivo principal es vimrcaclararme lo más posible, por lo que si existen otras mejores prácticas para crear una buena vimrcidea, tengo curiosidad al respecto.

Edición 1: debería haber precisado que mi vimrcya está subdividido en secciones (y, a veces, subsección), siendo las principales

  • opciones generales
  • complementos (que contiene una subsección para cada complemento y su configuración)
  • mapeos
  • navegación (también contiene subsección)
  • color
  • etc ...

Y es esta estructura la que me hizo pensar en doblar: siento que poder generar solo la sección que me interesa en cierto momento es algo bastante conveniente.

Edición 2: la respuesta que menciona subdivisiones de vimrcen varios archivos es válida, pero como preferencia personal prefiero usar el plegado porque creo que es más fácil mantener solo un archivo en el repositorio git que contiene mis archivos de puntos. Esa es solo una preferencia personal y soy consciente de que también es posible usar este enfoque, pero preferiría usar el plegado.


Creo que usar "{{{es la forma más 'vim like' de hacer las cosas, el complemento solarizado lo usa y, aunque puede ser ruidoso, le brinda la forma más estándar de configurar pliegues manuales
icc97

Respuestas:


22

Tengo las siguientes modelinas en la parte inferior de mi vimrccopia de Godlygeek, el autor de la tabla :

"" vim:fdm=expr:fdl=0
"" vim:fde=getline(v\:lnum)=~'^""'?'>'.(matchend(getline(v\:lnum),'""*')-2)\:'='

Esto hará que cualquier línea que comience con 2+ sea "un pliegue. Cuanto más ", más profundo es el pliegue. Esto le permite subdividir secciones si lo necesita.


No puedo probarlo en este momento, ¡pero parece ser una solución ideal para mí! ¡Gracias por compartir!
statox

Algunos explican: getline (v: lnum) devuelve la cadena de la línea dada por el número de línea (v: lnum); = ~ significa coincidencia de expresión regular; '^ ""' significa que todas las líneas comienzan con dos "s; matchend (getline (v: lnum), '" "*') - 2 cuenta el número adicional de", eso significa que "" "se doblará con el nivel 1" "" "se doblará con el nivel 2 y así sucesivamente; getline (v: lnum) = ~ '^" "' devuelve verdadero o falso dependiendo de que la línea v: lnum comience con dos" o no; si es verdadero, el fde se establece en >extra number of "(nivel de inicio que se encuentra por el número después de <en esta línea) o '='(use el nivel de la línea anterior), el significado se puede encontrar enfold-expr
van abel

después de la reciente actualización de vim 8.1.1517), obtengo "" Error detectado al procesar modelinas "con esta configuración.
apollo

9

Es una buena idea definir primero sus propias categorías en su .vimrc(como una lista con sublistas y sublistas) y agregar todos sus complementos / configuraciones / funciones a las categorías respectivas. Combinado con plegado personalizado, esto puede funcionar muy bien:

Ejemplo

El ejemplo anterior muestra las posibles categorías que considero útiles para estructurar mi .vimrc. Utiliza las siguientes configuraciones de plegado personalizadas:

""""""""""""""""""""""""
"  THIS IS A CATEGORY  "
""""""""""""""""""""""""
"" Autofolding .vimrc
" see http://vimcasts.org/episodes/writing-a-custom-fold-expression/
""" defines a foldlevel for each line of code
function! VimFolds(lnum)
  let s:thisline = getline(a:lnum)
  if match(s:thisline, '^"" ') >= 0
    return '>2'
  endif
  if match(s:thisline, '^""" ') >= 0
    return '>3'
  endif
  let s:two_following_lines = 0
  if line(a:lnum) + 2 <= line('$')
    let s:line_1_after = getline(a:lnum+1)
    let s:line_2_after = getline(a:lnum+2)
    let s:two_following_lines = 1
  endif
  if !s:two_following_lines
      return '='
    endif
  else
    if (match(s:thisline, '^"""""') >= 0) &&
       \ (match(s:line_1_after, '^"  ') >= 0) &&
       \ (match(s:line_2_after, '^""""') >= 0)
      return '>1'
    else
      return '='
    endif
  endif
endfunction

""" defines a foldtext
function! VimFoldText()
  " handle special case of normal comment first
  let s:info = '('.string(v:foldend-v:foldstart).' l)'
  if v:foldlevel == 1
    let s:line = ' ◇ '.getline(v:foldstart+1)[3:-2]
  elseif v:foldlevel == 2
    let s:line = '   ●  '.getline(v:foldstart)[3:]
  elseif v:foldlevel == 3
    let s:line = '     ▪ '.getline(v:foldstart)[4:]
  endif
  if strwidth(s:line) > 80 - len(s:info) - 3
    return s:line[:79-len(s:info)-3+len(s:line)-strwidth(s:line)].'...'.s:info
  else
    return s:line.repeat(' ', 80 - strwidth(s:line) - len(s:info)).s:info
  endif
endfunction

""" set foldsettings automatically for vim files
augroup fold_vimrc
  autocmd!
  autocmd FileType vim 
                   \ setlocal foldmethod=expr |
                   \ setlocal foldexpr=VimFolds(v:lnum) |
                   \ setlocal foldtext=VimFoldText() |
     "              \ set foldcolumn=2 foldminlines=2
augroup END

Para definir sus propias categorías y subcategorías, use la siguiente sintaxis:

""""""""""""""
"  Category  "
""""""""""""""
"" Subcategory
""" Subsubcategory
" Just a comment, gets ignored no matter where

La categoría de nivel superior se puede crear realmente fácil si usa vim-snippets (por ejemplo, con UltiSnips ): solo expanda el fragmento boxo el bboxfragmento proporcionado por vim-snippets (escriba boxo bboxy presione el disparador de expansión).

Para alternar los pliegues abiertos y cerrados aún más rápido presionando el espacio dos veces:

let mapleader = "\<space>"
" Toggle folds
nnoremap <silent> <leader><Space> @=(foldlevel('.')?'za':"\<Space>")<CR>
vnoremap <leader><space> zf

De esa manera, tiene un sistema bien estructurado .vimrcque se puede navegar fácilmente.


+1 para el bonito gif animado :) Por curiosidad, ¿qué solías mostrar las teclas mecanografiadas?
mMontu

@mMontu: Utilicé screenkey para mostrar las teclas y gtk-recordmydesktop para grabarlo (ambos en repositorios de Debian). Con 5 fps, los clips de 45 segundos son menos que un MiB. Luego lo convirtió en línea a un gif (ahí es donde aparecieron las distorsiones, antes de que la calidad de la imagen fuera perfecta).
cbaumhardt

7

Uso mi vimrcarchivo primario como un enlace a varios otros archivos categorizados, obteniendo cada uno de ellos a medida que avanza, por ejemplo, las opciones de Vim en un archivo, la configuración del complemento en otro.

"--- Vim Options
source ~/.vim/config/vim_options.vim

"--- Here Be Functions!
" (need to be sourced before stuff that uses 'em)
runtime! functions/*.vim

"--- Key Mapping
source ~/.vim/config/key_mapping.vim

"--- Folding
source ~/.vim/config/folding.vim

"--- Autocmds
source ~/.vim/config/autocmds.vim

"--- We Are Plugged In!
source ~/.vim/config/plugins.vim

" vim: ft=vim fdm=marker

Como una respuesta más directa a la pregunta de OP, utilizo el método de marcador, pero hacia el lado derecho con espaciado, y alrededor de más categorías que individuales, en su mayor parte. Sin embargo, hago cada complemento por separado.


Olvidé precisar eso en mi pregunta: no soy fanático de "separar" vimrcen diferentes archivos porque (IMO) aumenta la complejidad y hace que sea más difícil de mantener. Sobre el plegado, ¿qué quiere decir con "hacia el lado derecho con espacio"?
statox

Quiero decir " {{{con tantos espacios allí como los tuyos textwidthpara que los marcadores estén cerca de los bordes derechos. También tengo una función personalizada FoldText en el archivo fold.vim. Prefiero archivos separados para que mi git repose solo un tipo específico de mod por confirmación.
Cometsong

7

Se podría decir que la "mejor práctica" es principalmente una cuestión de opinión, :) pero hay dos enfoques que (1) tienen un sentido obvio y (2) se pueden aplicar a todos los archivos de configuración, no solo a los de Vim: plegado por secciones lógicas y subsecciones (o incluso más profundas, si te sientes valiente), y dividiendo tu configuración en varios archivos más pequeños y :sourceponiéndolos.

Personalmente prefiero doblar porque hace que las cosas sean más fáciles de acceder, a la vez que me da cierta jerarquía para elegir. Plegar funciones autocmdys en los niveles más internos también es una buena idea, ya que estas forman unidades lógicas "naturales". markerel plegado tiene más sentido para todo esto, porque las jerarquías lógicas no se reflejan necesariamente en niveles de sangría o en resaltado de sintaxis. También aumento foldcolumn, lo que me da una pista visual de dónde estoy:

# vim: filetype=vim foldmethod=marker foldlevel=0 foldcolumn=3

En una nota al margen, esta foldtextfunción (una modificación de una función similar por Drew Neil, IIRC) tiene más sentido para mí que el predeterminado:

function! MyFoldText()
    let line = getline(v:foldstart)

    let nucolwidth = &foldcolumn + &number * &numberwidth
    let windowwidth = winwidth(0) - nucolwidth - 3
    let foldedlinecount = v:foldend - v:foldstart

    " expand tabs into spaces
    let chunks = split(line, "\t", 1)
    let line = join(map(chunks[:-2], 'v:val . repeat(" ", &tabstop - strwidth(v:val) % &tabstop)'), '') . chunks[-1]

    let line = strpart(line, 0, windowwidth - 2 - len(foldedlinecount))
    let fillcharcount = windowwidth - len(line) - len(foldedlinecount) - 1
    return line . '...' . repeat(' ', fillcharcount) . foldedlinecount . ' '
endfunction
set foldtext=MyFoldText()

Con el otro enfoque, dividir archivos, los principales problemas son encontrar cosas y cambiar de un archivo a otro. Una forma muy agradable de abordar ambos es usar un complemento como CtrlSF , CtrlP o similar. Pero probablemente ya estés usando uno de esos de todos modos.


Entonces vas con marker. De hecho, la personalización foldcolumnes algo agradable, veré qué valor se ajusta mejor a mi necesidad. También comparto su punto de vista sobre los archivos divididos, pero no sabía CtrlSFque lo examinaría incluso si estoy bastante contento CtrlP.
statox

¿También podría explicar cómo usar el método de plegado personalizado, por favor? He intentado establecer fdma foldtexte MyFoldText(), pero parece que no es la forma correcta de usarlo.
statox

@statox CtrlSFfunciona mejor con ag o ack , que son versiones esencialmente especializadas de grep. foldtextno es un método de plegado personalizado, sino una función para cambiar la apariencia del texto plegado. La última línea de mi muestra fragmento de cómo se utiliza: set foldtext=MyFoldText().
lcd047

2

Mejores prácticas básicas:

  • Dividir en secciones:

    • Complementos
    • Configuraciones
    • Vuelve a unir
  • Comente cada sección / reenlace

  • (copia de seguridad de su .vimrco _vimrcen Github)

Solo mi preferencia personal. Aunque quizás no sea de mucha ayuda.


Yo personalmente no uso el plegado, y no deberías necesitarlo. Simplemente organice su vimrc y todo debería estar bien.
Gustav Blomqvist

Mi vimrc ya está organizado en sección (opciones generales, complementos, asignaciones, navegación, color, etc.). El hecho de poder plegar una sección (o subsección) es realmente bueno para centrarse en lo que está editando / buscando.
statox

Bueno. Perdón por la mala respuesta.
Gustav Blomqvist

Esa no es una mala respuesta y también soy culpable por no dar suficientes preguntas detalladas, no hay que disculparse ;-)
statox

2

Inspirado por la respuesta de @ PeterRincker, diseñé lo siguiente para usar encabezados de estilo ATX. Agréguelo al final de su.vimrc

"# Folding

" Fold with ATX style headers - "# is H1, "## is H2, and so on
" vim:fdm=expr:fdl=0
" vim:fde=getline(v\:lnum)=~'^"#'?'>'.(matchend(getline(v\:lnum),'"#*')-1)\:'='

1

Si tiene funciones grandes como yo, puede usar esto para plegar sus funciones:

fun! MyFoldLevel(linenum)
    if ! exists('w:nextline')
        let w:nextline = 0
        let w:insideafun = 0
    endif

    if w:nextline == 1
        let w:nextline = 0
        let w:insideafun = 0
    endif

    let l:line = getline(a:linenum)

    if l:line =~# '^[[:space:]]*fun'
        let w:insideafun = 1
        return '>1'
    elseif l:line =~# '^[[:space:]]*endf'
        let w:nextline = 1
        return '<1'
    endif

    if w:insideafun == 1
        return 1
    else
        return 0
    endif
endfun

Y agregue esta línea de modelo a su vimrc:

" vim:fde=MyFoldLevel(v\:lnum):fdm=expr:

0

Ampliando la idea de @Peter Rincker y @ go2null. Si no desea establecer las opciones de plegado en la línea de modo Vim. Puede usar el siguiente autocmd para establecer el método de plegado y la expresión de plegado.

augroup vim_folding
    autocmd!
    autocmd FileType vim set foldmethod=expr foldlevel=0
    " note that double quote in foldexpr has to be escaped with backslash
    autocmd FileType vim set foldexpr=getline(v:lnum)=~'^\"#'?'>'.(matchend(getline(v:lnum),'\"#*')-1):'='
augroup END

Hice pequeñas modificaciones para hacer la respuesta original para que funcione como comando vim regular (no es necesario escapar de los dos puntos, pero se debe escapar la comilla doble).

Si no le gusta la foldexprcadena larga , podemos definir una función para eso:

function! VimFolds(lnum)
    let s:cur_line = getline(a:lnum)

    if s:cur_line =~ '^"#'
        return '>' . (matchend(s:cur_line, '"#*')-1)
    else
        return '='
    endif

endfunction

Luego reemplace la línea de autocmd a punto foldexprde

autocmd FileType vim set foldexpr=VimFolds(v:lnum)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.