1127 votos

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

He oído hablar mucho de Vim tanto los pros como los contras. Realmente parece que debería ser (como desarrollador) más rápido con Vim que con cualquier otro editor. Estoy usando Vim para hacer algunas cosas básicas y estoy en el mejor de los casos 10 veces menos productivo con Vim.

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

  1. Usar alternativamente la mano izquierda y la derecha manos es el el más rápido manera de utilizar el teclado.
  2. No tocar nunca el ratón es la segunda forma de ser lo más rápido posible. Tardas mucho en mover la mano, agarrar el ratón, moverlo, y llevarlo al teclado (y a menudo tienes que mirar el teclado para asegurarse de que de que has devuelto la mano 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 que presionan Shift con la mano izquierda, y mueves el cursor con la mano derecha para seleccionar el texto. A continuación, Ctrl + C copias, se mueve el cursor y Ctrl + V pastas.

Con Vim es horrible:

  • yy para copiar una línea (¡casi nunca se quiere la línea completa!)
  • [number xx]yy para copiar xx líneas en el buffer. Pero nunca sabes exactamente si has seleccionado lo que querías. A menudo tengo que hacer [number xx]dd entonces u ¡para deshacer!

¿Otro ejemplo? Buscar y reemplazar.

  • En PSPad : Ctrl + f luego escriba lo que quiere buscar y pulse Enter .
  • En Vim: / , luego escriba lo que quiere buscar, luego si hay algunos caracteres especiales ponga \ antes de cada carácter especial, y luego pulse Enter .

Y todo con Vim es así: parece que no sé cómo manejarlo de forma correcta.

NB : Ya he leído el Vim engañar hoja :)

Mi pregunta es:

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

2862voto

Jim Dennis Puntos 5454

Su problema con Vim es que no entiendes vi .

Usted menciona el corte con yy y se quejan de que casi nunca quieren cortar líneas enteras. De hecho, los programadores que editan el código fuente, muy a menudo quieren trabajar en líneas enteras, rangos de líneas y bloques de código. Sin embargo, yy es sólo una de las muchas formas de introducir texto en el buffer de copia anónima (o "registro", como se llama en vi ).

El "zen" de vi es que estás hablando un idioma. El principio y es un verbo. El enunciado yy es un sinónimo de y_ . El y se duplica para que sea más fácil de escribir, ya que es una operación muy común.

Esto también puede expresarse como dd P (borrar la línea actual y pegar una copia en su lugar; dejando una copia en el registro anónimo como efecto secundario). La página web y y d Los "verbos" toman como "sujeto" cualquier movimiento. Así, yW es "tirar desde aquí (el cursor) hasta el final de la palabra actual/siguiente (grande)" y y'a es "tirar desde aquí hasta la línea que contiene la marca llamada ' a '."

Si sólo entiendes 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 ti. (De acuerdo, seguirás teniendo resaltado de sintaxis y la capacidad de manejar archivos más grandes que unos insignificantes ~45KB; pero trabaja conmigo aquí).

vi tiene 26 "marcas" y 26 "registros". Una marca se establece en cualquier posición del cursor utilizando la tecla m de mando. Cada marca se designa con una sola letra minúscula. Así, ma establece el valor de ' a a la ubicación actual, y mz establece el valor de ' z ' marca. Puede desplazarse a la línea que contiene una marca utilizando la tecla ' (comillas simples). Así, 'a se desplaza al principio de la línea que contiene el a ' marca. Puede desplazarse a la ubicación precisa de cualquier marca utilizando el botón ` (backquote). Así, `z se desplazará directamente al lugar exacto de la sección ' z ' marca.

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

Así, una forma de cortar una selección arbitraria de texto sería soltar una marca (yo suelo usar ' a ' como mi "primera" marca, ' z ' como mi siguiente marca, ' b ' como otro, y ' e ' como otra más (no recuerdo haber utilizado nunca de forma interactiva más de cuatro marcas en 15 años de uso de vi (uno crea sus propias convenciones sobre cómo las marcas y los registros son utilizados por las macros que no perturban el contexto interactivo). Luego vamos al otro extremo de nuestro texto deseado; podemos empezar por cualquiera de los dos extremos, no importa. Entonces podemos usar simplemente d`a para cortar o y`a para copiar. Así, todo el proceso tiene una sobrecarga de 5 pulsaciones (seis si empezamos en modo "insertar" y necesitamos Esc modo de comando de salida). Una vez que hemos cortado o copiado, pegar una copia es una sola pulsación: p .

Digo que esta es una forma de cortar o copiar texto. Sin embargo, es sólo una de las muchas. A menudo podemos describir más sucintamente el rango de texto sin tener que mover el cursor y soltar 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. Así, para mover un párrafo de texto lo corto usando { d} (3 pulsaciones). (Si resulta que ya estoy en la primera o última línea del párrafo, puedo utilizar simplemente d} o d{ respectivamente.

La noción de "párrafo" se inclina por algo que suele ser intuitivamente razonable. Por ello, suele funcionar tanto para el código como para la prosa.

Con frecuencia conocemos algún patrón (expresión regular) que marca un extremo u otro del texto en el que estamos interesados. Buscar hacia delante o hacia atrás son movimientos en vi . Por lo tanto, también pueden utilizarse como "sujetos" en nuestras "declaraciones". Así que puedo usar d/foo para cortar desde la línea actual hasta la siguiente línea que contiene la cadena "foo" y y?bar para copiar de la línea actual a la línea más reciente (anterior) que contenga "bar". Si no quiero líneas enteras puedo seguir utilizando los movimientos de búsqueda (como declaraciones propias), soltar mi(s) marca(s) y utilizar el `x como se ha descrito anteriormente.

Además de los "verbos" y los "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 utilizar cualquiera de los 26 registros "con nombre" mediante prefijando la referencia "objeto" con " (el modificador de comillas dobles). Así, si utilizo "add Estoy cortando la línea actual en el ' a y si utilizo "by/foo entonces estoy tirando una copia del texto de aquí a la siguiente línea que contiene "foo" en el ' b ' registro. Para pegar desde un registro simplemente antepongo el pegado con la misma secuencia de modificadores: "ap pega una copia del archivo ' a en el texto después del cursor y "bP pega una copia de ' 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. Así, 3J significa "unir las tres líneas siguientes" y d5} significa "borrar desde la línea actual hasta el final del quinto párrafo a partir de aquí".

Todo esto es de nivel intermedio vi . Nada de esto es Vim específicos y hay trucos mucho más avanzados en vi si estás preparado para aprenderlas. Si sólo dominas estos conceptos intermedios, probablemente descubrirás que rara vez necesitas escribir macros porque el lenguaje de manipulación de texto es lo suficientemente conciso y expresivo como para hacer la mayoría de las cosas fácilmente usando el lenguaje "nativo" del editor.


Una muestra de trucos más avanzados:

Hay una serie de : comandos, sobre todo el :% s/foo/bar/g técnica de sustitución global. (Esto no es avanzado, pero otros : puede ser). El conjunto : conjunto de comandos fue históricamente heredado por vi de las encarnaciones anteriores de la ed (editor de líneas) y posteriormente el ex (editor de líneas extendido). 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 época en la que las pantallas de los terminales eran poco comunes y muchos de ellos eran dispositivos de "teletipo" (TTY). Así que era habitual trabajar a partir de copias impresas del texto, utilizando comandos a través de una interfaz extremadamente escueta (las velocidades de conexión habituales eran de 110 baudios, o, aproximadamente, 11 caracteres por segundo, lo que es más lento que un mecanógrafo rápido; los retrasos eran habituales en las sesiones interactivas multiusuario; además, a menudo había cierta motivación para conservar el papel).

Así que la sintaxis de la mayoría de los : incluye una dirección o rango de direcciones (número de línea) seguido de un comando. Naturalmente, se pueden utilizar números de línea literales: :127,215 s/foo/bar para cambiar la primera aparición de "foo" por "bar" en cada línea entre 127 y 215. También se podrían utilizar algunas abreviaturas como . o $ para la línea actual y la última, respectivamente. También se pueden utilizar prefijos relativos + y - para referirse a los desplazamientos posteriores o anteriores a la línea actual, respectivamente. Así: :.,$j que significa "desde la línea actual hasta la última línea, unirlas todas en una sola línea". :% es sinónimo de :1,$ (todas las líneas).

El :... g y :... v Los comandos merecen alguna explicación, ya que son increíblemente poderosos. :... g es un prefijo para aplicar "globalmente" un comando posterior a todas las líneas que coincidan con un patrón (expresión regular) mientras que :... v aplica dicho comando a todas las líneas que NO coinciden con el patrón dado ("v" de "conVerse"). Al igual que con otros ex Estos comandos pueden ir precedidos de referencias de direcciones/rangos. Así, :.,+21g/foo/d significa "borrar 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, borra todas las líneas que NO contengan la cadena "bar".

Es interesante que el comando común de Unix grep en realidad se inspiró en esto ex (y se llama así por la forma en que se documentó). El ex comando :g/re/p (grep) era la forma en que se documentaba cómo "imprimir" globalmente las líneas que contenían una "expresión regular" (re). Cuando ed y ex fueron utilizados, el :p fue uno de los primeros que se aprendió y a menudo el primero que se utiliza al editar cualquier archivo. Era la forma de imprimir el contenido actual (normalmente sólo una página completa a la vez usando :.,+25p o algo así).

Tenga en cuenta que :% g/.../d o (su contraparte reVerse/conVerse: :% v/.../d son los patrones de uso más comunes. Sin embargo, hay un par de otros ex comandos que vale la pena recordar:

Podemos utilizar m para mover las líneas, y j para unir líneas. Por ejemplo, si tienes una lista y quieres separar todas las cosas que coinciden (o a la inversa, que NO coinciden con algún patrón) sin borrarlas, entonces puedes usar algo como :% g/foo/m$ ... y todas las líneas "foo" se habrán movido al final del archivo. (Tenga en cuenta el otro consejo sobre el uso del final de su archivo como espacio de borrado). Esto habrá preservado el orden relativo de todas las líneas "foo", al tiempo que las habrá extraído del resto de la lista. (Esto equivaldría 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 a través de grep y borrar todo el material de la cabeza).

Para unir líneas normalmente puedo encontrar un patrón para todas las líneas que necesitan ser unidas a su predecesor (todas las líneas que comienzan con "^ " en lugar de "^ * " en alguna lista de viñetas, por ejemplo). Para ese caso utilizaría :% g/^ /-1j (por cada línea coincidente, sube una línea y únelas). (BTW: para las listas de viñetas, intentar buscar las líneas de viñetas y unirlas 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 todo de sus continuaciones; sólo funcionará por pares en las coincidencias).

Casi no hace falta mencionar que puedes usar nuestro viejo amigo s (sustituir) con el g y v (global/converso-global). Normalmente no es necesario hacerlo. Sin embargo, considere algún caso en el que quiera realizar una sustitución sólo en las líneas que coincidan con algún otro patrón. A menudo puede utilizar un patrón complicado con capturas y utilizar referencias inversas para preservar las partes de las líneas que NO quiere cambiar. Sin embargo, a menudo será más fácil separar la coincidencia de la sustitución: :% g/foo/s/bar/zzz/g -- para cada línea que contenga "foo" sustituya todos los "bar" por "zzz". (Algo así como :% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g sólo funcionaría para los casos en los que "bar" fuera PRECEDIDO por "foo" en la misma línea; ya es bastante complicado, y tendría que modificarse aún más para captar todos los casos en los que "bar" precediera a "foo")

La cuestión es que hay más que p , s y d líneas en el ex conjunto de comandos.

El : Las direcciones también pueden referirse a las marcas. Así, se puede utilizar: :'a,'bg/foo/j para unir cualquier línea que contenga la cadena foo con su línea subsiguiente, si se encuentra entre las líneas entre el ' a ' y ' b ' marcas. (Sí, todo lo anterior ex Los ejemplos de comandos pueden limitarse a subconjuntos de líneas del archivo anteponiendo este tipo de expresiones de direccionamiento).

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

Otro muy útil vi o ex comando es :r para leer el contenido de otro archivo. Así: :r foo inserta el contenido del archivo llamado "foo" en la línea actual.

Más potente es el :r! de mando. Esto lee los resultados de un comando. Es lo mismo que suspender el vi sesión, ejecutando un comando, redirigiendo su salida a un archivo temporal, reanudando su vi y leyendo el contenido del archivo temporal.

Aún más potentes son los ! (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! Así podemos ordenar todas las líneas de nuestro archivo usando 1G!Gsort ( G es el vi "goto"; por defecto va a la última línea del archivo, pero puede ir precedido de un número de línea, como 1, la primera línea). Esto equivale al comando ex variante :1,$!sort . Los escritores suelen utilizar ! con el sistema Unix fmt o doblar utilidades para reformar o "envolver con palabras" selecciones de texto. Una macro muy común es {!}fmt (reformular el párrafo actual). Los programadores a veces lo utilizan para ejecutar su código, o sólo partes de él, a través de sangría u otras herramientas de reformateo de código.

Utilizando el :r! y ! significa que cualquier utilidad o filtro externo puede ser tratado como una extensión de nuestro editor. Ocasionalmente he utilizado estos con scripts que sacaban datos de una base de datos, o con wget o lince comandos que sacan datos de un sitio web, o ssh comandos que sacaban datos de sistemas remotos.

Otra utilidad ex comando es :so (abreviatura de :source ). Esto lee el contenido de un archivo como una serie de comandos. Cuando se inicia vi normalmente, de forma implícita, realiza una :source en ~/.exinitrc (y Vim suele hacer esto en ~/.vimrc (naturalmente). La utilidad de esto es que puedes cambiar tu perfil de editor sobre la marcha simplemente introduciendo un nuevo conjunto de macros, abreviaturas y ajustes del editor. Si eres astuto puedes incluso utilizar esto como un truco para almacenar secuencias de ex comandos de edición para aplicar a los 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

(El + opción de línea de comandos para vi y Vim se utiliza 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 el + por cualquier ex comando/expresión, como un comando "fuente" como he hecho aquí; para un ejemplo simple tengo scripts que invocan: vi +'/foo/d|wq!' ~/.ssh/known_hosts para eliminar una entrada de mi archivo de hosts conocidos de SSH de forma no interactiva mientras reimagino un conjunto de servidores).

Normalmente es mucho más fácil escribir estas "macros" utilizando Perl, AWK, sed (que es, de hecho, como grep una utilidad inspirada en el ed comando).

El @ es probablemente el comando más oscuro vi comando. Al impartir ocasionalmente cursos avanzados de administración de sistemas durante casi una década, he conocido a muy pocas personas que lo hayan utilizado alguna vez. @ ejecuta el contenido de un registro como si fuera un vi o ex comando.
Ejemplo: Suelo usar: :r!locate ... para encontrar algún archivo en mi sistema y leer su nombre en mi documento. A partir de ahí, elimino los resultados extraños, dejando sólo la ruta completa del archivo que me interesa. En lugar de trabajar Tab -(o peor aún, si me encuentro en una máquina sin soporte para la finalización de pestañas en su copia de vi ) Yo sólo uso:

  1. 0i:r (para convertir la línea actual en una línea válida :r comando),
  2. "cdd (para borrar la línea en el registro "c") y
  3. @c ejecutar ese comando.

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


Un pensamiento aleccionador

Sólo he arañado la superficie de vi y nada de lo que he descrito aquí es siquiera parte de las "mejoras" por las que vim ¡es nombrado! 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 utilizado considerablemente más de vi de lo que yo nunca lo haré.

505voto

CMS Puntos 315406

Si hablas de seleccionar y copiar texto, creo que deberías echarle un vistazo al Modo visual de Vim .

En el modo visual, puede seleccionar el texto utilizando los comandos de Vim, y luego puede hacer lo que quiera con la selección.

Considere los siguientes escenarios comunes:

Debe seleccionar hasta el siguiente paréntesis que coincida.

Podrías hacerlo:

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

Quiere seleccionar el texto entre comillas:

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

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

  • viB
  • vi{

Quiere seleccionar todo el archivo:

  • ggVG

Selección visual de bloques es otra función realmente útil, le permite seleccionar un área rectangular de texto, sólo tiene que pulsar Ctrl - V para iniciarlo, y luego seleccione el bloque de texto que desee y realice cualquier tipo de operación como tirar, borrar, pegar, editar, etc. Es genial para editar columna orientada texto.

207voto

vdboor Puntos 6259

Algunos consejos de productividad:

Movimientos inteligentes

  • * y # buscar la palabra bajo el cursor hacia adelante/hacia atrás.
  • w a la siguiente palabra
  • W a la siguiente palabra separada por espacios
  • b / e al principio/final de la palabra actual. ( B / E sólo para espacios separados)
  • gg / G saltar al principio/final del archivo.
  • % saltar a la correspondencia { .. } o ( .. ), etc.
  • { / } saltar al siguiente párrafo.
  • '. salta a la última línea editada.
  • g; saltar a la última posición editada.

Comandos de edición rápida

  • I insertar al principio.
  • A añadir al final.
  • o / O abrir una nueva línea después/antes de la actual.
  • v / V / Ctrl+V modo visual (¡para seleccionar el texto!)
  • Shift+R sustituir el texto
  • C cambiar la parte restante de la línea.

Combinación de comandos

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

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

Comandos útiles para el programador

  • r sustituir un carácter (por ejemplo rd sustituye el char actual por d ).
  • ~ cambia de caso.
  • J une dos líneas
  • Ctrl+A / Ctrl+X aumenta/disminuye un número.
  • . repetir el último comando (una simple macro)
  • == fijar la sangría de la línea
  • > bloque de sangría (en modo visual)
  • < desentrañar el bloque (en modo visual)

Grabación de macros

  • Pulse q[ key ] para empezar a grabar.
  • Entonces, golpea q para detener la grabación.
  • La macro puede ser reproducida con @[ key ] .

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

Ejemplo de escenarios 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")

Los ajustes se pueden almacenar en ~/.vimrc o en todo el sistema en /etc/vimrc.local y luego por lectura del /etc/vimrc archivo utilizando:

source /etc/vimrc.local

(tendrá que sustituir el # carácter de comentario con " para que funcione en VIM, quería dar un resaltado de sintaxis adecuado aquí).

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

98voto

kev Puntos 41855

El Control + R es muy útil :-) En cualquiera de los dos casos modo de inserción o modo de comando (es decir, en el : línea al teclear los comandos), continúe con un registro numerado o con nombre:

  • a - z los registros con nombre

  • " el registro sin nombre, que contiene el texto de la última supresión o tiró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 comandos

  • . el último texto insertado

  • - la última pequeña (menos de una línea) borrar

  • =5*5 insertar 25 en el texto (minicalculadora)

Ver :help i_CTRL-R y :help c_CTRL-R para obtener más detalles, y husmear por los alrededores para ver más cosas de CTRL-R.

91voto

Benson Puntos 10705

Plugins de Vim

Hay muchas respuestas buenas aquí, y una sorprendente sobre el zen de vi. Una cosa que no veo mencionada es que vim es extremadamente extensible a través de plugins. Hay scripts y plugins para hacer todo tipo de cosas locas que el autor original nunca consideró. Aquí hay algunos ejemplos de plugins de vim increíblemente útiles:

Rails.vim

Rails.vim es un plugin escrito por tpope. Es una herramienta increíble para la gente que desarrolla en Rails. Hace cosas mágicas sensibles al contexto que permiten saltar fácilmente de un método en un controlador a la vista asociada, a un modelo y a las pruebas unitarias de ese modelo. Me ha ahorrado docenas, si no cientos, de horas como desarrollador Rails.

gist.vim

Este plugin 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 al pastebin, que es increíblemente útil si estás colaborando con alguien a través de IRC o IM.

espacio.vim

Este plugin 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 se define sobre la marcha.

rodear.vim

Este plugin le ofrece la posibilidad de trabajar con texto delimitado de alguna manera. Te da objetos que denotan cosas dentro de paréntesis, cosas dentro de comillas, etc. Puede ser útil para manipular texto delimitado.

supertab.vim

Este script aporta una elegante funcionalidad de completado de pestañas a vim. El autocompletado 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 teclas diferentes. Muy práctico, e increíblemente divertido de usar. Si bien no es el intellisense de VS, es un gran paso y trae una gran cantidad de la funcionalidad que le gustaría esperar de una herramienta de terminación de pestañas.

syntastic.vim

Esta herramienta incorpora a vim comandos externos de comprobación de sintaxis. No la he utilizado personalmente, pero he oído hablar muy bien de ella y el concepto es difícil de superar. Comprobar la sintaxis sin tener que hacerlo manualmente es un gran ahorro de tiempo y puede ayudarte a detectar errores sintácticos a medida que los introduces y no cuando finalmente te paras a probar.

fugitivo.vim

Acceso directo a git desde dentro de vim. De nuevo, no he usado este plugin, pero puedo ver su utilidad. Desafortunadamente estoy en una cultura donde svn es considerado "nuevo", así que probablemente no veré git en el trabajo por bastante tiempo.

nerdtree.vim

Un navegador de árboles para vim. Empecé a usarlo hace poco y es muy útil. Te permite poner una vista de árbol en una división vertical y abrir archivos fácilmente. Esto es grande para un proyecto con un montón de archivos de origen que con frecuencia saltar entre.

FuzzyFinderTextmate.vim

Este es un plugin sin mantenimiento, pero sigue siendo increíblemente útil. Ofrece la posibilidad de abrir archivos utilizando una sintaxis descriptiva "difusa". Esto significa que en un árbol disperso de archivos sólo necesitas escribir suficientes caracteres para desambiguar los archivos que te interesan del resto de la basura.

Conclusión:

Hay un montón de herramientas increíbles disponibles para vim. Estoy seguro de que sólo he arañado la superficie aquí, y bien 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 plugins que amplían aún más vim, es una de las formas más potentes de editar texto jamás concebidas. Vim es fácilmente tan potente como emacs, eclipse, visual studio y textmate.

Gracias

Gracias a duwanis por su vim configs del que he aprendido mucho y he tomado prestados la mayoría de los plugins que aparecen aquí.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X