¿Cuál es tu atajo más productivo con Vim?

Resuelto Olivier Pons asked hace 15 años • 50 respuestas

He oído mucho sobre Vim , tanto sus ventajas como sus desventajas. Realmente parece que deberías ser (como desarrollador) más rápido con Vim que con cualquier otro editor. Estoy usando Vim para hacer algunas cosas básicas y, en el mejor de los casos, soy 10 veces menos productivo. con Vim.

Las únicas dos cosas que deberían importarte cuando hablas de velocidad (puede que no te importen lo suficiente, pero deberías) son:

  1. Usar alternativamente las manos derecha e izquierda es lo más rápido. de utilizar el teclado.
  2. No tocar nunca el ratón es la segunda forma de ser lo más rápido posible. Le lleva mucho tiempo mover la mano, agarrar el mouse, moverlo y volver a colocarlo en el teclado (y a menudo tiene que mirar el teclado para asegurarse de haber regresado la mano correctamente al lugar correcto).

Aquí hay dos ejemplos que demuestran por qué soy mucho menos productivo con Vim.

Copiar/cortar y pegar. Lo hago todo el tiempo. Con todos los editores contemporáneos, presionas Shift con la mano izquierda y mueves el cursor con la derecha para seleccionar texto. Luego Ctrl+ Ccopia, mueves el cursor y Ctrl+V pega.

Con Vim es horrible:

  • yypara copiar una línea (¡casi nunca querrás toda la línea!)
  • [number xx]yypara copiar xxlíneas en el búfer. Pero nunca sabes exactamente si has seleccionado lo que querías. ¡A menudo tengo que hacer [number xx]ddy luego udeshacer!

¿Otro ejemplo? Buscar y reemplazar.

  • En PSPad : Ctrl+ fluego escribe lo que deseas buscar, luego presionaEnter .
  • En Vim:, /luego escriba lo que desea buscar, luego, si hay algunos caracteres especiales \antes de cada carácter especial, presione Enter.

Y todo con Vim es así: parece que no sé manejarlo de la manera correcta.

NB: ya leí la hoja de referencia de Vim de Vim :)

Mi pregunta es:

¿Cuál es la forma en que usas Vim que te hace más productivo que con un editor contemporáneo?

Olivier Pons avatar Aug 02 '09 15:08 Olivier Pons
Aceptado

Tu problema con Vim es que no asimilas vi .

Mencionas cortar yyy te quejas de que casi nunca quieres cortar líneas enteras. De hecho, los programadores, al editar el código fuente, muy a menudo quieren trabajar en líneas completas, rangos de líneas y bloques de código. Sin embargo, yyes sólo una de las muchas formas de colocar texto en el búfer de copia anónimo (o "registro", como se llama en vi ).

El "Zen" de vi es que estás hablando un idioma. La inicial yes un verbo. La declaración yyes sinónimo de y_. Ely duplicado para que sea más fácil escribir, ya que es una operación muy común.

Esto también se puede expresar como dd P(eliminar la línea actual y pegar una copia nuevamente en su lugar; dejar una copia en el registro anónimo como efecto secundario). Los "verbos" yy dtoman cualquier movimiento como "sujeto". Por lo tanto, yWes "tirar desde aquí (el cursor) hasta el final de la palabra actual/siguiente (grande)" y y'a"tirar desde aquí hasta la línea que contiene la marca denominada ' a '".

Si sólo comprende los movimientos básicos del cursor hacia arriba, abajo, izquierda y derecha, entonces vi no será más productivo que una copia del "bloc de notas" para usted. (Está bien, aún tendrás resaltado de sintaxis y la capacidad de manejar archivos de más de unos insignificantes ~45 KB aproximadamente; pero trabaja conmigo aquí).

vi tiene 26 "marcas" y 26 "registros". Se establece una marca en cualquier ubicación del cursor mediante el mcomando. Cada marca está designada por una única letra minúscula. Por lo tanto, maestablece la marca ' a ' en la ubicación actual y mzestablece la marca ' z '. Puede pasar a la línea que contiene una marca usando el 'comando (comilla simple). De este modo 'ase desplaza al principio de la línea que contiene la marca ' a '. Puede desplazarse a la ubicación precisa de cualquier marca utilizando el `comando (comillas invertidas). De esta manera `zse moverá directamente a la ubicación exacta de la marca ' z '.

Como se trata de "movimientos", también pueden utilizarse como temas para otras "declaraciones".

Entonces, una forma de cortar una selección arbitraria de texto sería quitar una marca (normalmente uso ' a ' como mi "primera" marca, ' z ' como mi siguiente marca, ' b ' como otra y ' e ' como otro más (no recuerdo haber usado interactivamente más de cuatro marcas en 15 años de uso de vi ; uno crea sus propias convenciones sobre cómo las macros usan las marcas y los registros que no perturban el contexto interactivo). al otro extremo del texto deseado; podemos comenzar en cualquier extremo, no importa. Luego simplemente podemos usar d`apara cortar o y`acopiar. Por lo tanto, todo el proceso tiene una sobrecarga de 5 pulsaciones de teclas (seis si comenzamos en "insertar " y necesario para Escsalir del modo comando). Una vez que hemos cortado o copiado, pegar una copia es solo presionar una tecla: p.

Yo digo que esta es una forma de cortar o copiar texto. Sin embargo, es sólo uno de muchos. Con frecuencia podemos describir de manera más sucinta el rango de texto sin mover el cursor y colocar una marca. Por ejemplo si estoy en un párrafo de texto puedo usar {y }movimientos al principio o al final del párrafo respectivamente. Entonces, para mover un párrafo de texto, lo corto usando { d}(3 pulsaciones de teclas). (Si ya estoy en la primera o última línea del párrafo, puedo simplemente usar d}o d{respectivamente.

La noción de "párrafo" por defecto es algo que suele ser intuitivamente razonable. Por lo tanto, a menudo funciona tanto para código como para prosa.

Frecuentemente conocemos algún patrón (expresión regular) que marca un final u otro del texto que nos interesa. Buscar hacia adelante o hacia atrás son movimientos en vi . Por tanto, también pueden utilizarse como "sujetos" en nuestras "declaraciones". Entonces puedo usar d/foopara cortar desde la línea actual a la siguiente línea que contiene la cadena "foo" y y?barcopiar desde la línea actual a la línea más reciente (anterior) que contiene "barra". Si no quiero líneas completas, aún puedo usar los movimientos de búsqueda (como declaraciones propias), dejar mi(s) marca(s) y usar el `x comandos como se describió anteriormente.

Además de "verbos" y "sujetos", vi también tiene "objetos" (en el sentido gramatical del término). Hasta ahora sólo he descrito el uso del registro anónimo. Sin embargo, puedo usar cualquiera de los 26 registros "nombrados" anteponiendo la referencia del "objeto" con "(el modificador de comillas dobles). Por lo tanto, si lo uso "add, corto la línea actual en el registro ' a ' y si lo uso "by/foo, extraigo una copia del texto desde aquí a la siguiente línea que contiene "foo" en el registro ' b '. Para pegar desde un registro, simplemente prefijo el pegado con la misma secuencia de modificador: "appega una copia del contenido del registro ' a ' en el texto después del cursor y "bPpega una copia desde ' b ' antes de la línea actual.

Esta noción de "prefijos" también añade los análogos de los "adjetivos" y "adverbios" gramaticales a nuestro "lenguaje" de manipulación de textos. La mayoría de las órdenes (verbos) y movimientos (verbos u objetos, según el contexto) también pueden llevar prefijos numéricos. 3Jsignifica "unir las siguientes tres líneas" yd5} significa "eliminar desde la línea actual hasta el final del quinto párrafo desde aquí".

Todo esto es nivel intermedio vi . Nada de esto es específico de Vim y hay trucos mucho más avanzados en vi si estás listo para aprenderlos. Si dominaras sólo estos conceptos intermedios, probablemente descubrirías que rara vez necesitas escribir macros porque el lenguaje de manipulación de texto es lo suficientemente conciso y expresivo para hacer la mayoría de las cosas con bastante facilidad utilizando el lenguaje "nativo" del editor.


Una muestra de trucos más avanzados:

Hay varios :comandos, entre los que destaca la :% s/foo/bar/gtécnica de sustitución global. (Eso no es avanzado, pero otros :comandos pueden serlo). Todo el :conjunto de comandos fue heredado históricamente por las encarnaciones anteriores de vi como las utilidades ed (editor de líneas) y más tarde ex (editor de líneas extendidas). De hecho , vi se llama así porque es la interfaz visual de ex .

:Los comandos normalmente operan sobre líneas de texto. ed y ex se escribieron en una era en la que las pantallas de terminales eran poco comunes y muchos terminales eran dispositivos de "teletipo" (TTY). Por lo tanto, era común trabajar a partir de copias impresas del texto, usando comandos a través de una interfaz extremadamente concisa (las velocidades de conexión comunes eran 110 baudios, o, aproximadamente, 11 caracteres por segundo, lo cual es más lento que el de un mecanógrafo rápido; los retrasos eran comunes en sesiones interactivas multiusuario; además, a menudo había cierta motivación para ahorrar papel).

Entonces, la sintaxis de la mayoría de :los comandos incluye una dirección o rango de direcciones (número de línea) seguida de un comando. Naturalmente, se podrían usar números de línea literales: :127,215 s/foo/barpara cambiar la primera aparición de "foo" por "bar" en cada línea entre 127 y 215. También se podrían usar algunas abreviaturas como .o $para las líneas actual y última respectivamente. También se podrían usar prefijos relativos +y -para referirse a desplazamientos después o antes de la línea actual, respectivamente. Por lo tanto: :.,$jsignifica "desde la línea actual hasta la última línea, únelas todas en una sola línea". :%es sinónimo de:1,$ (todas las líneas).

Los comandos :... gy :... vmerecen alguna explicación ya que son increíblemente poderosos. :... ges un prefijo para aplicar "globalmente" un comando posterior a todas las líneas que coincidan con un patrón (expresión regular), mientras que :... vaplica dicho comando a todas las líneas que NO coincidan con el patrón dado ("v" de "conVerse"). Al igual que con otros comandos ex , estos pueden tener como prefijo referencias de dirección/rango. Por lo tanto :.,+21g/foo/dsignifica "eliminar cualquier línea que contenga la cadena "foo" desde la actual hasta las siguientes 21 líneas", mientras que:.,$v/bar/d significa "desde aquí hasta el final del archivo, elimine cualquier línea que NO contenga la cadena "bar".

Es interesante que el comando grep común de Unix en realidad se inspiró en este comando ex (y lleva el nombre de la forma en que fue documentado). El comando ex:g/re/p (grep) fue la forma en que documentaron cómo "imprimir" "globalmente" líneas que contienen una "expresión regular" (re). Cuando se usaron ed y ex:p , el comando fue uno de los primeros que alguien aprendió y, a menudo, el primero que se usó al editar cualquier archivo. Así era como imprimías el contenido actual (generalmente solo una página completa a la vez usando :.,+25po algo así).

Tenga en cuenta que :% g/.../do (su contraparte reVerse/conVerse: :% v/.../dson los patrones de uso más comunes. Sin embargo, hay un par de excomandos más que vale la pena recordar:

Podemos usarlo mpara mover líneas y junir líneas. Por ejemplo, si tiene una lista y desea separar todas las cosas que coinciden (o por el contrario, NO coinciden con algún patrón) sin eliminarlas, entonces puede usar algo como: ... :% g/foo/m$y todas las líneas "foo" se habrán movido a el final del archivo. (Tenga en cuenta el otro consejo sobre utilizar el final de su archivo como espacio temporal). Esto habrá conservado el orden relativo de todas las líneas "foo" y las habrá extraído del resto de la lista. (Esto sería equivalente a hacer algo como: 1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d(copiar el archivo a su propia cola, filtrar la cola grepy eliminar todo el material del encabezado).

Para unir líneas, normalmente puedo encontrar un patrón para todas las líneas que deben unirse a su predecesora (todas las líneas que comienzan con "^ " en lugar de "^ * " en alguna lista con viñetas, por ejemplo). En ese caso, usaría: :% g/^ /-1j(para cada línea coincidente, suba una línea y únalas). (Por cierto: para las listas de viñetas, intentar buscar las líneas de viñetas y unirse a la siguiente no funciona por un par de razones... puede unir una línea de viñetas a otra, y no unirá ninguna línea de viñetas a todas a sus continuaciones; sólo funcionará por pares en los partidos).

Casi no hace falta mencionar que puedes usar nuestro viejo amigo s(sustituto) con los comandos gy v(global/converse-global). Normalmente no es necesario hacerlo. Sin embargo, considere algún caso en el que desee realizar una sustitución solo en líneas que coincidan con algún otro patrón. A menudo puedes usar un patrón complicado con capturas y usar referencias anteriores para preservar las partes de las líneas que NO deseas cambiar. Sin embargo, a menudo será más fácil separar la coincidencia de la sustitución: :% g/foo/s/bar/zzz/g-- por cada línea que contenga "foo", sustituya todas las "barras" por "zzz". (Algo como:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g solo funcionaría para los casos de "bar" que fueron PRECEDIDOS por "foo" en la misma línea; ya es bastante desgarbado y tendría que modificarse aún más para captar todos los casos en los que "bar" precedió " foo")

El punto es que hay más que solo líneas p, sy den el exconjunto de comandos.

Las :direcciones también pueden referirse a marcas. Por lo tanto, puede usar: :'a,'bg/foo/jpara unir cualquier línea que contenga la cadena foo a su línea siguiente, si se encuentra entre las líneas entre las marcas ' a ' y ' b '. (Sí, todos los exejemplos de comandos anteriores se pueden limitar a subconjuntos de líneas del archivo anteponiendo este tipo de expresiones de direccionamiento).

Eso es bastante oscuro (solo he usado algo así unas cuantas veces en los últimos 15 años). Sin embargo, admito libremente que a menudo he hecho cosas de forma iterativa e interactiva que probablemente podrían haberse hecho de manera más eficiente si me hubiera tomado el tiempo para pensar en el encantamiento correcto.

Otro comando vi o ex muy útil es :rleer el contenido de otro archivo. Por lo tanto: :r fooinserta el contenido del archivo llamado "foo" en la línea actual.

Más poderoso es el :r!comando. Esto lee los resultados de un comando. Es lo mismo que suspender la sesión de vi , ejecutar un comando, redirigir su salida a un archivo temporal, reanudar la sesión de vi y leer el contenido del archivo temporal. archivo.

Aún más poderosos son los comandos !(bang) y :... !( ex bang). Estos también ejecutan comandos externos y leen los resultados en el texto actual. Sin embargo, ¡también filtran selecciones de nuestro texto a través del comando! Podemos ordenar todas las líneas de nuestro archivo usando 1G!Gsort( Ges el comando vi "goto"; por defecto va a la última línea del archivo, pero puede tener como prefijo un número de línea, como 1, la primera línea). Esto es equivalente a la variante ex:1,$!sort . Los escritores suelen utilizar !las utilidades fmt o fold de Unix para reformatear o "ajustar palabras" selecciones de texto. Una macro muy común es {!}fmt(reformatear el párrafo actual). Los programadores a veces lo usan para ejecutar su código, o solo partes del mismo, mediante sangría. u otras herramientas de reformateo de código.

Usar los comandos :r!y !significa que cualquier utilidad o filtro externo puede tratarse como una extensión de nuestro editor. Ocasionalmente los he usado con scripts que extraían datos de una base de datos, o con comandos wget o lynx que extraían datos de un sitio web, o comandos ssh que extraían datos de sistemas remotos.

Otro comando ex:so útil es (abreviatura de :source). Esto lee el contenido de un archivo como una serie de comandos. Cuando inicia vi , normalmente, implícitamente, realiza un archivo :sourceon ~/.exinitrc(y Vim generalmente lo hace ~/.vimrc, naturalmente). El uso de esto es que puede cambiar su perfil de editor sobre la marcha simplemente obteniendo un nuevo conjunto de macros, abreviaturas y configuraciones de editor. Si eres astuto, puedes incluso usar esto como un truco para almacenar secuencias de comandos de edición ex para aplicarlos a archivos bajo demanda.

Por ejemplo, tengo un archivo de siete líneas (36 caracteres) que ejecuta un archivo a través de wc e inserta un comentario de estilo C en la parte superior del archivo que contiene los datos del recuento de palabras. Puedo aplicar esa "macro" a un archivo usando un comando como:vim +'so mymacro.ex' ./mytarget

(La +opción de línea de comando para vi y Vim se usa normalmente para iniciar la sesión de edición en un número de línea determinado. Sin embargo, es un hecho poco conocido que se puede seguir +con cualquier comando/expresión ex válida , como un comando "fuente" como Lo he hecho aquí; para un ejemplo simple, tengo scripts que invocan: vi +'/foo/d|wq!' ~/.ssh/known_hostseliminar una entrada de mi archivo de hosts conocidos SSH de forma no interactiva mientras estoy volviendo a crear una imagen de un conjunto de servidores).

Por lo general, es mucho más fácil escribir este tipo de "macros" usando Perl, AWK, sed (que es, de hecho, como grep, una utilidad inspirada en el comando ed ).

El comando es probablemente el comando vi@ más oscuro . Al impartir ocasionalmente cursos avanzados de administración de sistemas durante casi una década, he conocido a muy pocas personas que alguna vez lo hayan usado. ejecuta el contenido de un registro como si fuera un comando vi o ex . Ejemplo: suelo utilizar: para buscar algún archivo en mi sistema y leer su nombre en mi documento. A partir de ahí, elimino todos los resultados superfluos y dejo solo la ruta completa al archivo que me interesa. En lugar de revisar laboriosamente cada componente de la ruta (o peor, si me quedo atascado en una máquina sin soporte para completar con pestañas). en su copia de vi ) solo uso:@
:r!locate ...Tab

  1. 0i:r(para convertir la línea actual en un comando :r válido ),
  2. "cdd(para eliminar la línea en el registro "c") y
  3. @cejecutar ese comando.

Son solo 10 pulsaciones de teclas (y la expresión "cdd @ces efectivamente una macro de dedo para mí, por lo que puedo escribirla casi tan rápido como cualquier palabra común de seis letras).


Un pensamiento aleccionador

¡Solo he arañado la superficie del poder de vi y nada de lo que he descrito aquí es siquiera parte de las "mejoras" que dan nombre a vim ! Todo lo que he descrito aquí debería funcionar en cualquier copia antigua de vi de hace 20 o 30 años.

Hay personas que han usado mucho más poder de vi que yo.

Jim Dennis avatar Aug 02 '2009 23:08 Jim Dennis

Estás hablando de seleccionar y copiar texto. Creo que deberías echarle un vistazo al modo visual de Vim .

En el modo visual, puedes seleccionar texto usando los comandos de Vim y luego puedes hacer lo que quieras con la selección.

Considere los siguientes escenarios comunes:

Debe seleccionar el siguiente paréntesis coincidente.

Podrías hacerlo:

  • v%si el cursor está en el paréntesis inicial/final
  • vibsi el cursor está dentro del bloque de paréntesis

Quiere seleccionar texto entre comillas:

  • vi" para comillas dobles
  • vi' para comillas simples

Desea seleccionar un bloque de llaves (muy común en lenguajes de estilo C):

  • viB
  • vi{

Quiere seleccionar el archivo completo:

  • ggVG

La selección visual de bloques es otra característica realmente útil, te permite seleccionar un área rectangular de texto, solo debes presionar Ctrl- Vpara iniciarlo, luego seleccionar el bloque de texto que deseas y realizar cualquier tipo de operación como tirar, eliminar, pegar, editar, etc. Es fantástico editar texto orientado a columnas .

Christian C. Salvadó avatar Aug 02 '2009 08:08 Christian C. Salvadó

Algunos consejos de productividad:

Movimientos inteligentes

  • *y #busque la palabra debajo del cursor hacia adelante/atrás.
  • wa la siguiente palabra
  • Wa la siguiente palabra separada por espacios
  • b/ eal principio/final de la palabra actual. ( B/ Esolo para espacios separados)
  • gg/ Gsaltar al principio/final del archivo.
  • %saltar a la coincidencia { .. } o ( .. ), etc.
  • {/ }saltar al siguiente párrafo.
  • '.volver a la última línea editada.
  • g;retrocede a la última posición editada.

Comandos de edición rápida

  • Iinsertar al principio.
  • Aañadir al final.
  • o/ Oabrir una nueva línea después/antes de la actual.
  • v// modo visual ( V¡ Ctrl+Vpara seleccionar texto!)
  • Shift+Rreemplazar texto
  • Ccambiar la parte restante de la línea.

Combinando comandos

La mayoría de los comandos aceptan una cantidad y una dirección, por ejemplo:

  • cW= cambiar hasta el final de la palabra
  • 3cW= cambiar 3 palabras
  • BcW= para comenzar la palabra completa, cambiar la palabra completa
  • ciW= cambiar palabra interna.
  • ci"= cambiar interior entre ".."
  • ci(= cambiar texto entre ( .. )
  • ci<= cambiar texto entre < .. > (necesita set matchpairs+=<:>en vimrc)
  • 4dd= eliminar 4 líneas
  • 3x= eliminar 3 caracteres.
  • 3s= sustituir 3 caracteres.

Comandos de programador útiles

  • rreemplazar un carácter (por ejemplo, rdreemplaza el carácter actual con d).
  • ~cambia de caso.
  • June dos líneas
  • Ctrl+A / Ctrl+X incrementa/disminuye un número.
  • .repetir el último comando (una macro simple)
  • ==arreglar sangría de línea
  • >bloque de sangría (en modo visual)
  • <bloque sin sangría (en modo visual)

Grabación de macros

  • Presione q[ key ]para comenzar a grabar.
  • Luego presione qpara detener la grabación.
  • La macro se puede jugar con @[ key ].

Al utilizar comandos y movimientos muy específicos, VIM puede reproducir esas acciones exactas en las siguientes líneas. (por ejemplo, A para añadir al final, b/ epara mover el cursor al principio o al final de una palabra respectivamente)

Ejemplo de entornos bien construidos

# reset to vim-defaults
if &compatible          # only if not set before:
  set nocompatible      # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif

# display settings
set background=dark     # enable for dark terminals
set nowrap              # dont wrap lines
set scrolloff=2         # 2 lines above/below cursor when scrolling
set number              # show line numbers
set showmatch           # show matching bracket (briefly jump)
set showmode            # show mode in status bar (insert/replace/...)
set showcmd             # show typed command in status bar
set ruler               # show cursor position in status bar
set title               # show file in titlebar
set wildmenu            # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2        # use 2 lines for the status bar
set matchtime=2         # show matching bracket for 0.2 seconds
set matchpairs+=<:>     # specially for html

# editor settings
set esckeys             # map missed escape sequences (enables keypad keys)
set ignorecase          # case insensitive searching
set smartcase           # but become case sensitive if you type uppercase characters
set smartindent         # smart auto indenting
set smarttab            # smart tab handling for indenting
set magic               # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode

set tabstop=4           # number of spaces a tab counts for
set shiftwidth=4        # spaces for autoindents
#set expandtab           # turn a tabs into spaces

set fileformat=unix     # file mode is unix
#set fileformats=unix,dos    # only detect unix file format, displays that ^M with dos files

# system settings
set lazyredraw          # no redraws in macros
set confirm             # get a dialog when :q, :w, or :wq fails
set nobackup            # no backup~ files.
set viminfo='20,\"500   # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden              # remember undo after quitting
set history=50          # keep 50 lines of command history
set mouse=v             # use mouse in visual mode (not normal,insert,command,help mode


# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
  syntax on          # enable colors
  set hlsearch       # highlight search (very useful!)
  set incsearch      # search incremently (search while typing)
endif

# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>

# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on

# file type specific settings
if has("autocmd")
  # For debugging
  #set verbose=9

  # if bash is sh.
  let bash_is_sh=1

  # change to directory of current file automatically
  autocmd BufEnter * lcd %:p:h

  # Put these in an autocmd group, so that we can delete them easily.
  augroup mysettings
    au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
    au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab

    # Confirm to PEP8
    au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,class
  augroup END

  augroup perl
    # reset (disable previous 'augroup perl' settings)
    au!  

    au BufReadPre,BufNewFile
    \ *.pl,*.pm
    \ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
    # formatoption:
    #   t - wrap text using textwidth
    #   c - wrap comments using textwidth (and auto insert comment leader)
    #   r - auto insert comment leader when pressing <return> in insert mode
    #   o - auto insert comment leader when pressing 'o' or 'O'.
    #   q - allow formatting of comments with "gq"
    #   a - auto formatting for paragraphs
    #   n - auto wrap numbered lists
    #   
  augroup END


  # Always jump to the last known cursor position. 
  # Don't do it when the position is invalid or when inside
  # an event handler (happens when dropping a file on gvim). 
  autocmd BufReadPost * 
    \ if line("'\"") > 0 && line("'\"") <= line("$") | 
    \   exe "normal g`\"" | 
    \ endif 

endif # has("autocmd")

La configuración se puede almacenar en ~/.vimrc, o en todo el sistema /etc/vimrc.localy luego leer desde el /etc/vimrcarchivo usando:

source /etc/vimrc.local

(Tendrás que reemplazar el #carácter de comentario para "que funcione en VIM; aquí quería resaltar la sintaxis adecuada).

Los comandos que he enumerado aquí son bastante básicos y los principales que uso hasta ahora. Ya me hacen bastante más productivo, sin tener que saber todas las cosas sofisticadas.

vdboor avatar Apr 01 '2010 09:04 vdboor

El mecanismo Control+ Res muy útil :-) Ya sea en modo de inserción o en modo de comando (es decir, en la :línea al escribir comandos), continúe con un registro numerado o con nombre:

  • a- zlos registros nombrados
  • "el registro sin nombre, que contiene el texto de la última eliminación o extracción
  • %el nombre del archivo actual
  • #el nombre de archivo alternativo
  • *el contenido del portapapeles (X11: selección primaria)
  • +el contenido del portapapeles
  • /el último patrón de búsqueda
  • :la última línea de comando
  • .el último texto insertado
  • -la última eliminación pequeña (menos de una línea)
  • =5*5insertar 25 en el texto (minicalculadora)

Vea :help i_CTRL-Ry :help c_CTRL-Rpara obtener más detalles, y husmee cerca para obtener más bondades de CTRL-R.

kev avatar Jun 02 '2010 18:06 kev

Complementos de Vim

Hay muchas buenas respuestas aquí y una sorprendente sobre el zen de vi. Una cosa que no veo mencionada es que vim es extremadamente extensible mediante complementos. Hay scripts y complementos para que haga todo tipo de locuras que el autor original nunca consideró. Aquí hay algunos ejemplos de complementos de vim increíblemente útiles:

rieles.vim

Rails.vim es un complemento escrito por tpope. Es una herramienta increíble para las personas que desarrollan rieles. Hace cosas mágicas sensibles al contexto que le permiten saltar fácilmente de un método en un controlador a la vista asociada, a un modelo y a las pruebas unitarias para ese modelo. Ha ahorrado decenas, si no cientos, de horas como desarrollador de rieles.

esencia.vim

Este complemento le permite seleccionar una región de texto en modo visual y escribir un comando rápido para publicarlo en gist.github.com . Esto permite un fácil acceso a Pastebin, lo cual es increíblemente útil si estás colaborando con alguien a través de IRC o IM.

espacio.vim

Este complemento proporciona una funcionalidad especial a la barra espaciadora. Convierte la barra espaciadora en algo análogo al punto, pero en lugar de repetir acciones repite movimientos. Esto puede ser muy útil para moverse rápidamente a través de un archivo de una manera que usted defina sobre la marcha.

envolvente.vim

Este complemento le brinda la posibilidad de trabajar con texto delimitado de alguna manera. Le proporciona objetos que denotan cosas dentro de los paréntesis, cosas dentro de las comillas, etc. Puede resultar útil para manipular texto delimitado.

supertab.vim

Este script aporta una elegante funcionalidad de finalización de pestañas a vim. El elemento de autocompletar ya está en el núcleo de vim, pero esto lo lleva a una pestaña rápida en lugar de múltiples atajos de múltiples teclas diferentes. Muy útil e increíblemente divertido de usar. Si bien no es el intellisense de VS, es un gran paso y brinda una gran cantidad de funcionalidad que le gustaría esperar de una herramienta de finalización de pestañas.

sintastic.vim

Esta herramienta incorpora comandos externos de verificación de sintaxis a vim. No lo he usado personalmente, pero he escuchado cosas maravillosas sobre él y el concepto es difícil de superar. Verificar la sintaxis sin tener que hacerlo manualmente es un gran ahorro de tiempo y puede ayudarle a detectar errores sintácticos a medida que los introduce, en lugar de cuando finalmente se detiene a probar.

fugitivo.vim

Acceso directo a git desde el interior de vim. Nuevamente, no he usado este complemento, pero puedo ver la utilidad. Desafortunadamente, estoy en una cultura donde svn se considera "nuevo", por lo que probablemente no veré a git en funcionamiento durante bastante tiempo.

nerdtree.vim

Un navegador de árbol para vim. Empecé a usar esto recientemente y es realmente útil. Le permite dividir verticalmente una vista de árbol y abrir archivos fácilmente. Esto es genial para un proyecto con muchos archivos fuente entre los que saltas con frecuencia.

FuzzyFinderTextmate.vim

Este es un complemento que no requiere mantenimiento, pero sigue siendo increíblemente útil. Proporciona la posibilidad de abrir archivos utilizando una sintaxis descriptiva "difusa". Significa que en un árbol disperso de archivos solo necesita escribir suficientes caracteres para eliminar la ambigüedad de los archivos que le interesan del resto del archivo.

Conclusión

Hay muchas herramientas increíbles disponibles para vim. Estoy seguro de que solo he arañado la superficie y vale la pena buscar herramientas aplicables a su dominio. La combinación del potente conjunto de herramientas de vi tradicional, las mejoras de vim y los complementos que extienden vim aún más, es una de las formas más poderosas de editar texto jamás concebida. Vim es fácilmente tan poderoso como emacs, eclipse, visual studio y textmate.

Gracias

Gracias a duwanis por sus configuraciones de vim de las cuales aprendí mucho y tomé prestados la mayoría de los complementos enumerados aquí.

 avatar Apr 01 '2010 03:04