Historia de Vim y una guía para su uso efectivo.

Nota del traductor: esta es la primera parte del artículo monumental (en realidad monumental) sobre Vim y sus capacidades del desarrollador de Minneapolis y el autor del proyecto PostgREST, Joe lamenta a Nelson.

La primera parte del artículo está dedicada a conocer la historia de Vim como editor, y el autor habla sobre una serie de datos interesantes sobre las capacidades de Vim. En la segunda parte de la traducción, todas las fichas y trucos de vida que Joe decidió compartir con el público se concentrarán, allí la narración, como tal, se desvanece y solo queda un conjunto de pautas para la acción. Dado que el texto original tiene dimensiones completamente inaceptables, dividimos esta historia en dos artículos de aproximadamente el mismo tamaño. Hoy es la primera de dos publicaciones. Que tengas una buena lectura.



Este artículo se basa en investigar la historia de Vim y leer su guía de usuario de principio a fin. Espero que estas notas lo ayuden a descubrir (¿o redescubrir?) La funcionalidad básica de este editor para usted, así como también le permitirá abandonar el uso de archivos vimrc advertidos y usar complementos más cuidadosamente.



Referencias


Para ir más allá de los temas habituales, recomendaría obtener una copia en papel de este manual y una referencia de bolsillo espaciosa. No pude encontrar una copia impresa de la guía del usuario de Vim, así que al final simplemente imprimí el archivo PDF que vino con el editor usando printme1.com. $VIMRUNTIME/doc/usr_?? Viene con software en $VIMRUNTIME/doc/usr_?? . Como una lista conveniente de comandos, puedo aconsejar el libro de referencia "Vi and Vim Editors Pocket" .

Contenido

  • La historia
  • Jerarquía de configuración
  • Complementos de terceros
  • Copias de seguridad y sobornos
  • Incluir y ruta
  • Edición y compilación de un bucle
  • Diffs y parches
  • Búfer de entrada / salida
  • Tipos de archivo
  • No olvides el raton
  • Misceláneo

La historia


Nacimiento vi


Los comandos y funciones de Vi han existido por más de cincuenta años, comenzando con el editor QED. Aquí está su línea de tiempo:

  • 1966: QED (Editor rápido) en el sistema Berkeley Timesharing
  • Julio de 1969: con su ayuda aterrizaron en la luna (bueno, como referencia)
  • Ago 1969: QED → ed en AT&T
  • 1976 Febrero: ed → em ("Editor de mortales") en el Queen Mary's College
  • 1976: em → ex ("EXTENDIDO") en la Universidad de California, Berkeley
  • 1977 Oct: ex recibe modo visual, vi - terminal de texto

Si lee el manual QED y ex , puede encontrar algunas similitudes entre ellos. Ambos editores usan una gramática similar para indicar y trabajar con rangos de línea.

Los editores como QED ed y em fueron diseñados para terminales de impresión, que en su mayor parte eran máquinas de escribir eléctricas comunes con un módem conectado a ellas. Tales terminales de "copiadora completa" mostraban comandos en papel y, obviamente, después de ingresar era imposible hacer correcciones. Por lo tanto, el proceso de edición consistió en editar manualmente los comandos del usuario en papel y luego volver a ingresarlos.

En 1976, aparecieron terminales de video, por ejemplo, ADM-3A. Se agregó un "modo abierto" al editor Ex, que permitía editar a través de un terminal de video dentro de una sola página. Se agregó un modo visual para orientarse en las líneas del terminal utilizando el cursor. El modo visual se activó mediante el comando "vi" y actualizó constantemente el archivo que se muestra en la pantalla, manteniendo la posición de la línea de comando en la parte inferior de la pantalla. Dato interesante: se colocaron flechas en las teclas h, j, k, l del ADM-3A, lo que nos permitió mover el cursor a vi.

Puede obtener más información sobre esta transición de ed a ex / vi en una entrevista con Bill Joy . En él, habla sobre cómo creó ex / vi y sobre algunas cosas que finalmente lo decepcionaron.

Classic vi es solo un alter es ex. Ambos están representados por el mismo archivo binario, que puede ejecutarse tanto en modo ex como en modo vi, dependiendo del nombre del archivo ejecutable. El legado de toda esta historia es que ex / vi "se despliega" cuando se usa, casi no requiere recursos del sistema y puede funcionar en condiciones de ancho de banda limitado. También está disponible en la mayoría de los sistemas existentes y se describe completamente en POSIX.

Vi to vim


Derivado de ed, el editor ex / vi era propiedad intelectual de AT&T. Para usar vi en plataformas que no sean Unix, las personas tuvieron que escribir clones que tenían una base de código fuente diferente.

Aquí hay algunos de ellos:

  • nvi - 1980 para 4BSD
  • calvin - 1987 para DOS
  • vil - 1990 para DOS
  • stevie - 1987 para Atari ST
  • elvis - 1990 para Minix y 386BSD
  • vim - 1991 para Amiga
  • víbora - 1995 para Emacs
  • elwin - 1995 para Windows
  • lemmy - 2002 para Windows

Nos centraremos en el clon del centro de la lista: Vim. Bram Mulenaar quería usar vi en Amiga y comenzó a portar con Atari y desarrollar el stevie clon vi. Y llamó a su versión del puerto "Vi Imitación". Si desea conocer este proceso de primera mano, mire su entrevista para la revista Free Software.

En la versión 1.22, Vim pasó a llamarse "Vi IMproved", lo que indica la superioridad de la copia sobre el original. Aquí hay un gráfico de las siguientes versiones principales con descripciones de algunas características:



Para obtener más información sobre cada versión, se debe utilizar la ayuda, por ejemplo, para vim8. Para ver las actualizaciones planificadas, así como una lista de errores conocidos, debe dirigirse a todo.txt.

Por ejemplo, la octava versión incluía cierto soporte para trabajos asincrónicos debido a la presión sobre el proyecto de NeoVim. Los desarrolladores de este último querían ejecutar depuración y REPL para scripts web directamente dentro del editor.

En general, Vim es superportable. Adaptando toda la historia de su existencia para trabajar en plataformas completamente diferentes, este editor se vio obligado a permanecer dentro del marco de la cultura "fácil" de codificación. Vim se ejecuta en OS / 390, Amiga, BeOS y BeBox, Macintosh Classic, Atari MiNT, MS-DOS, OS / 2, QNX, RISC-OS, BSD, Linux, OS X, VMS y MS-Windows. Puede confiar en Vim en cualquier lugar y no le importa qué equipo usa.

Al final de la ruta vi original, en 2002, el código fuente ex / vi todavía se publicaba bajo la licencia de software libre BSD. Los brujos están disponibles en ex-vi.sourceforge.net .

Pero vayamos al grano. Antes de comenzar a analizar Vim, es útil saber cómo organiza y lee sus archivos de configuración.

Jerarquía de configuración


Anteriormente, creí erróneamente que Vim obtiene todas sus configuraciones y scripts solo del archivo .vimrc. Ver los repositorios de "archivos de puntos" aleatorios solo puede fortalecer esta opinión. Muy a menudo, las personas cargan monstruos en esencia archivos .vimrc individuales cuya tarea es controlar todos los aspectos del editor. Estas configuraciones enormes también se denominan a veces "distribuciones vim".

De hecho, Vim tiene una estructura ordenada en la que .vimrc es solo uno de los muchos "puntos de entrada". De hecho, usted mismo puede preguntarle a Vim qué scripts carga. Para hacer esto, edite algún código fuente para un proyecto aleatorio en su máquina, descárguelo y luego ejecute el comando

 :scriptnames 

Vale la pena leer esta lista. Intente adivinar qué hacen estos scripts y anote los directorios en los que se encuentran.

¿La lista fue más larga de lo que esperabas? Si ha instalado muchos complementos, entonces el editor tiene mucho que hacer. Verifique que se ralentiza al inicio ejecutando el siguiente comando de creación start.log:

 vim --startuptime start.log name-of-your-file 

Solo compara qué tan rápido comienza Vim desde el primer momento:

 vim --clean --startuptime clean.log name-of-your-file 

Para determinar qué scripts deben cargarse al inicio o durante la carga del búfer, debe verificar la ruta de tiempo de ejecución de Vim. Esta ruta está representada por una lista de directorios separados por comas, cada uno de los cuales contiene una estructura común. Vim comprueba estas estructuras en cada directorio para encontrar sus scripts de inicio. Los directorios se procesan estrictamente en el orden en que se encuentran en la lista.

Verifique la ruta de ejecución en su sistema a través de este comando:

 :set runtimepath 

Mi sistema contiene los siguientes directorios especificados por defecto para la verificación de runtimepath. Ni siquiera todos existen, pero Vim aún intentará acceder a ellos y verificará el contenido si todavía están en su lugar:

~/.vim
Directorio de inicio, diseñado para perfiles creados.

/usr/local/share/vim/vimfiles
Directorio Vim en todo el sistema, para perfiles con privilegios de administrador del sistema.

/usr/local/share/vim/vim81
Aka $ VIMRUNTIME, para archivos distribuidos con Vim.

/usr/local/share/vim/vimfiles/after
En el directorio Vim de todo el sistema, también existe el directorio after. Su objetivo es agregar la configuración personal del administrador del sistema "predeterminado".

~/.vim/after
El directorio "después" en el directorio de inicio. Esto es necesario para que las configuraciones personales no cancelen ni se superpongan con las configuraciones de todo el sistema o "predeterminadas".

En general, los directorios se procesan en el mismo orden en que se escriben en start.log, solo se hace una excepción para "después". Este siempre está al final de la lista y se procesa en último lugar.

Al procesar cada directorio, Vim busca subcarpetas en ellos con nombres específicos. Para obtener más información sobre esto, consulte la ayuda runtimepath. Aquí hay una breve descripción de las que consideraremos más adelante en el texto:

plugin /
Aquí se encuentran los archivos de script Vim que se cargan automáticamente al editar cualquier tipo de archivo. También se les llama "globales".

autoload /
(No debe confundirse con "plugin"). Estas secuencias de comandos de inicio contienen funciones que se ajustan solo a petición de otras secuencias de comandos.

ftdetect /
Scripts para determinar los tipos de archivo. En su trabajo, confían en la extensión, ubicación o contenido interno del archivo.

ftplugin /
Scripts que se ejecutan al editar archivos de un tipo conocido.

compiler /
Determina cómo ejecutar varios compiladores o comprobaciones de pelusas y cómo analizar su salida. Se puede dividir entre varios ftplugins a la vez. El compilador no se ejecuta automáticamente y debe ser llamado por un comando.

pack /
Un contenedor para paquetes nativos de Vim 8, el sucesor de la administración de paquetes al estilo Pathogen. Tiene su propio sistema de empaque, no requiere código de terceros para funcionar.

Y finalmente, ~ / .vimrc es una trampa para la configuración general del editor. Se usa para configurar los ajustes predeterminados, que se pueden asignar a un tipo específico de archivo. Para ver la lista completa, puede seleccionar .vimrc y ejecutar el comando de opciones.

Complementos de terceros


Los complementos son solo scripts de Vim, para lo cual es suficiente colocarlos en los lugares correctos en el runtimepath. En general, el proceso de instalación es extremadamente simple: simplemente suba los archivos. El problema es que algunos complementos son bastante difíciles de actualizar o eliminar, porque están dispersos en diferentes subdirectorios y obstruyen las rutas de ejecución con sus scripts. Es decir, al final es difícil determinar qué archivo pertenece a qué complemento.

Para resolver este problema, comenzaron a desarrollarse "administradores de complementos". En vim.org había un registro de complementos al menos hasta 2003 inclusive (si el archivo no está mintiendo). Sin embargo, los "administradores de complementos" como entidad entraron de moda solo en 2008.

Estas herramientas agregan directorios especiales para complementos para rastrear rutas de ejecución y organizar etiquetas mediante las cuales se pueden rastrear complementos. La mayoría de los gerentes también obtienen actualizaciones de complementos de la red.

A continuación, he creado administradores de complementos de acuerdo con la cronología de su aparición. Basado en los rangos de fechas de lanzamiento de la primera y la última versión. Si no hubo lanzamientos oficiales, tomé como base las primeras fechas de lanzamiento y la última actualización.

  • Mar 2006 - Jul 2014: Vimball
  • Oct 2008 - Dic 2015: Patógeno
  • Ago. 2009 - Dic. 2009: Vimana
  • Dic. 2009 - Dic. 2014: VAM
  • Ago 2010 - Nov 2010: sacudida
  • Oct 2010 - Nov 2012: tplugin
  • Oct 2010 - Feb 2014: Vundle
  • Mar 2012 - Mar 2018: vim-flavour
  • Abr 2012 - Mar 2016: NeoBundle
  • Ene 2013 - Ago 2017: infectar
  • Febrero de 2013 - agosto de 2016: vimogen
  • Oct 2013 - Jan 2015: vim-unbundle
  • Diciembre de 2013 - julio de 2015: Vizardry
  • Febrero de 2014 - octubre de 2018: vim-plug
  • Ene. 2015 - Oct 2015: habilitador
  • Ago. 2015 - Abr. 2016: Vizardry 2
  • Ene. 2016 - Jun. 2018: dein.vim
  • Sep 2016 - Presente: nativo en Vim 8
  • Febrero de 2017 - septiembre de 2018: minpac
  • Mar 2018 - Mar 2018: autopac
  • Febrero de 2017 - junio de 2018: paquete
  • Mar 2017 - Sep 2017: vim-pck
  • Sep 2017 - Sep 2017: paquete vim8
  • Septiembre de 2017 - mayo de 2019: voltios
  • Sep 2018 - Feb 2019: vim-packager
  • Feb. 2019 - Feb. 2019: plugpac.vim

Lo primero a lo que debe prestar atención en la lista anterior es la gran variedad. El segundo: cada una de las herramientas presentadas ha estado "viva" durante unos cuatro años y, muy probablemente, pasa de moda.

El camino de menor resistencia en la administración de complementos es simplemente usar la funcionalidad incorporada de Vim 8, que no requiere extraer ningún código de terceros. Veamos cómo hacerlo.

Para comenzar, cree dos directorios dentro de su runtimepath: opt y start.

 mkdir -p ~/.vim/pack/foobar/{opt,start} 

Presta atención al marcador de posición "foobar" (el nombre se puede cambiar). Clasifica completamente todos los paquetes que entran. La mayoría de los usuarios simplemente vuelcan todos sus complementos en cualquier categoría y, en general, esto es normal. Elige el nombre que quieras; Seguiré usando foobar. En teoría, también puede crear varias categorías, por ejemplo ~/.vim/pack/navigation y ~/.vim/pack/linting . Tenga en cuenta que Vim no reconoce la duplicación entre categorías y descarga duplicados dos veces si existen.

Los paquetes en "inicio" se cargan automáticamente, mientras que los paquetes en "opt" no se cargan hasta que provienen de Vim usando el comando :packadd . Esta opción es buena para paquetes poco utilizados y es compatible con Vim desde el primer momento, sin tener que ejecutar scripts. Tenga en cuenta que :packadd no :packadd contraparte para descargar paquetes.

Para revisar este ejemplo, agregaremos el complemento de búsqueda difusa ctrlp para optar. Descargue y descomprima su última versión en:

 curl -L https://github.com/kien/ctrlp.vim/archive/1.79.tar.gz \ | tar zx -C ~/.vim/pack/foobar/opt 

Este comando creará la ~ / .vim / pack / foobar / opt / ctrlp.vim-1.79 paquete listo para usar. Regrese a vim y cree los punteros de la etiqueta de ayuda (índice de etiquetas de ayuda) para el nuevo paquete:

 :helptags ~/.vim/pack/foobar/opt/ctrlp.vim-1.79/doc 

Este comando creará un archivo llamado "etiquetas" en la carpeta con el tipo de paquete, que hace que los temas estén disponibles para su visualización en el sistema interno de Vim. Forma alternativa: ejecute las etiquetas de ayuda TODAS después de descargar el paquete, y el comando se encargará de todos los archivos y sus rutas de ejecución.
Cuando desee usar un paquete, simplemente descárguelo y recuerde que en este caso la terminación funciona mediante pestañas, por lo que no necesita ingresar el nombre completo:

 :packadd ctrlp.vim-1.79 

El directorio base de Packadd se encuentra en el runtimepath, que le permite usar scripts de su complemento y ftdetect. Después de cargar ctrlp, puede usar el comando CTRL-P para abrir la búsqueda de archivos por coincidencia parcial.

Algunas personas realizan un seguimiento de su directorio ~ / .vim y usan git para controlar la versión de cada paquete. Por mi parte, simplemente desempaquete los paquetes de los archivos tar y los rastree manualmente a través del repositorio. Si usa paquetes suficientemente maduros que no requieren actualizaciones frecuentes, así como scripts, entonces son bastante pequeños y no saturan el historial de git.

Copias de seguridad y reversiones de versiones


Dependiendo de sus preferencias de usuario, Vim puede protegerlo de cuatro posibles causas de pérdida de datos:

  1. Bloqueo al editar (entre guardados). Vim puede proteger contra esto guardando periódicamente los cambios en el archivo de página.
  2. Protección contra la edición del mismo archivo con dos instancias de Vim, protección contra la sobrescritura de cambios realizados a través de una o más instancias. Esto también se realiza a través del archivo de intercambio.
  3. Falla durante el proceso de guardar en sí mismo después de cambiar el archivo final, pero hasta que el nuevo contenido esté completamente escrito. Vim puede protegerlo de esto con la función de reescritura. Para hacer esto, crea en el proceso de guardar un nuevo archivo, que posteriormente reemplaza al original, si todo salió bien. El método de reemplazo está determinado por la configuración de copia de seguridad.
  4. Guardar los nuevos contenidos del archivo siempre que se restaure el original. Vim le permite guardar una copia de seguridad de un archivo después de realizar cambios.

Pero antes de comenzar a explorar estas configuraciones inteligentes, ¿qué tal un par de bromas? Aquí hay algunos comentarios de muestra de archivos vimrc en GitHub:

“No cree un archivo de página. Administre todo a través del control de versiones ".
“Copias de seguridad para exiliados. Utiliza el control de versiones ".
"¡Solo control de versiones!" ¡Solo hardcore!
"Vivimos en un mundo de control de versiones, por lo que los intercambios y las copias de seguridad están en la basura".
"¿Por qué necesita archivos de copia de seguridad si el control de versiones es suficiente".
"Nunca he usado archivos de copia de seguridad de Vim ... Use el control de versiones".
"La mayoría de las cosas se pueden encontrar a través del control de versiones".
"Deshabilita las copias de seguridad de archivos, porque todavía usas el sistema de control de versiones;)".
"Y llegó el control de versiones, y Git nos salvó".
"Deshabilitar archivos de intercambio y sistema de copia de seguridad. ¡Utilice siempre el control de versiones! ¡SIEMPRE!
"No necesito una copia de seguridad, porque trabajo con control de versiones".

La ironía es que los comentarios anteriores reflejan solo una comprensión del cuarto y, en parte, el tercer tipo de falla. Si rechaza el archivo de intercambio y la copia de seguridad, perderá la protección en el caso descrito en los párrafos 1 y 2.

Aquí hay un ejemplo de configuración que recomiendo para una operación segura:

 " Protect changes between writes. Default values of " updatecount (200 keystrokes) and updatetime " (4 seconds) are fine set swapfile set directory^=~/.vim/swap// " protect against crash-during-write set writebackup " but do not persist backup after successful write set nobackup " use rename-and-write-new method whenever safe set backupcopy=auto " patch required to honor double slash at end if has("patch-8.1.0251") " consolidate the writebackups -- not a big " deal either way, since they usually get deleted set backupdir^=~/.vim/backup// end " persist the undo tree for each file set undofile set undodir^=~/.vim/undo// 

Estas configuraciones incluyen copias de seguridad para grabaciones incompletas, pero no guardan archivos después de que la operación se complete con éxito, porque tenemos control de versiones, el mejor control de versiones, bla, bla, bla, etc. etc. Tenga en cuenta que puede necesitar mkdir ~ / .vim / {swap, undodir, backup}, de lo contrario Vim accederá a la siguiente carpeta legible. Probablemente también deba ejecutar el comando chmod en las carpetas de destino para que sus contenidos sean privados, ya que los archivos de intercambio y el historial de copias de seguridad pueden contener información confidencial.

Vale la pena señalar que la característica de nuestras rutas de configuración es que siempre se cierran con una barra inclinada. Esta ortografía permite que la función elimine la posible ambigüedad en las rutas de los archivos de paginación y copia de seguridad para archivos con los mismos nombres, que se encuentran en directorios diferentes. Por ejemplo, el archivo de intercambio para / foo / bar se guardará en ~ / .vim / swap /% foo% bar.swp (escapé barras con signos de porcentaje). Hubo un error en el parche reciente de Vim que evitó que la barra se tuviera en cuenta para backupdir, por lo que la protección contra ella se muestra arriba.

Nuestro Vim también guarda el historial de reversión para cada archivo, por lo que puede restaurar la versión correcta incluso después de salir del modo de edición. Aunque dicha función puede parecer redundante en el contexto del archivo de intercambio que ya tenemos, el historial de reversión es una línea de defensa adicional durante la grabación de archivos.

Cuando hablamos de retrocesos, vale la pena recordar que Vim admite un árbol completo de historial de edición de archivos. Esto significa que puede hacer un cambio, revertirlo y luego repetir los mismos cambios nuevamente, y todo esto serán tres puntos de recuperación diferentes. El tiempo y el alcance de los cambios realizados pueden verificarse con el comando no incluido en la lista, pero es problemático sacar el árbol de él. : 5 , . , — , undotree — .

. . : . , .

: , ,vim . nowritebackup, , . , Vim , . backupskip .

«patchmode» Vim . , . , tar-, , git. set patchmod = .orig foo- foo.orig.

Include path


(include) . Vim path, include, suffixesadd, includeexpr. (. help include-search) — ctags .

. , . , help include .

, [i , , [d . gf Vim . :find, **/* , . , .. , .

, . ( ) CTRL-D. .

 " fuzzy-find lite nmap <Leader><space> :e ./**/ 

: path (headers) . , : checkpath, , . C checkpath. , , . , checkpath , .

«., / Usr / include ,,» . , — /usr/include, . , :help file-searching .

ftplugin ( ) , . : ./src/include ./include.

 setlocal path=.,,*/include/**3,./*/include/**3 setlocal path+=/usr/include 

«**3» — . , . , .

, , :checkpath , . , , .

: :he [, :he gf, :he :find .



.

Source: https://habr.com/ru/post/477768/


All Articles