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




vim linux (20)

He escuchado mucho sobre Vim , tanto los pros como los contras. 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ía preocuparte cuando hablas de velocidad (puede que no te interesen lo suficiente, pero deberías) son:

  1. Usar alternativamente las manos izquierda y derecha es la forma más rápida de usar el teclado.
  2. Nunca tocar el mouse es la segunda forma de ser lo más rápido posible. Le toma mucho tiempo mover su mano, tomar el mouse, moverlo y volver a colocarlo en el teclado (y, a menudo, tiene que mirar el teclado para asegurarse de haber regresado su 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, presiona Shift con la mano izquierda y mueves el cursor con la mano derecha para seleccionar el texto. Luego, Ctrl + C copia, mueve el cursor y Ctrl + V pega.

Con Vim es horrible:

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

¿Otro ejemplo? Buscar y reemplazar.

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

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

NB: Ya he leído la sheet cheat Vim :)

Mi pregunta es:

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


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

Ser capaz de ejecutar ediciones complejas y repetitivas con muy pocas pulsaciones (a menudo utilizando macros ). ¡Echa un vistazo a VimGolf para presenciar el poder de Vim!

Después de más de diez años de uso casi diario, es difícil imaginar usar cualquier otro editor.


Plugins 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 complementos. Hay scripts y complementos para hacer que haga todo tipo de locuras que el autor original nunca consideró. Aquí hay algunos ejemplos de plugins vim increíblemente útiles:

rails.vim

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

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

space.vim

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

surround.vim

Este complemento le brinda la capacidad de trabajar con texto que está delimitado de alguna manera. Te da objetos que denotan cosas dentro de parens, cosas dentro de comillas, etc. Puede ser útil para manipular texto delimitado.

supertab.vim

Este script trae la funcionalidad de finalización de pestañas de lujo a vim. El autocompletado ya está allí en el núcleo de vim, pero esto lo lleva a una pestaña rápida en lugar de a múltiples accesos directos de varias teclas diferentes. Muy práctico, e increíblemente divertido de usar. Si bien no es la inteligencia de VS, es un gran paso y brinda una gran cantidad de la funcionalidad que le gustaría esperar de una herramienta para completar pestañas.

syntastic.vim

Esta herramienta trae comandos de comprobación de sintaxis externa a vim. No lo he usado personalmente, pero he oído grandes cosas al respecto y el concepto es difícil de superar. Verificar la sintaxis sin tener que hacerlo manualmente es un gran ahorro de tiempo y puede ayudarlo a detectar errores sintácticos a medida que los introduce, en lugar de cuando finalmente se detiene para realizar la prueba.

fugitive.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 en la que svn se considera "nuevo", por lo que es probable que no vea git en el trabajo durante bastante tiempo.

nerdtree.vim

Un navegador de árbol para vim. Comencé a usar esto recientemente, y es realmente útil. Te permite poner una vista de árbol en una división vertical y abrir archivos fácilmente. Esto es genial para un proyecto con una gran cantidad de archivos de origen con los que salta con frecuencia.

FuzzyFinderTextmate.vim

Este es un complemento no mantenido, pero aún así increíblemente útil. Proporciona la capacidad de abrir archivos utilizando una sintaxis descriptiva "difusa". Significa que en un árbol disperso de archivos solo necesita escribir suficientes caracteres para desambiguar los archivos que le interesan del resto de la cruzada.

Conclusión

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

Gracias

Gracias a duwanis por sus configuraciones vim de las cuales he aprendido mucho y he tomado prestados la mayoría de los complementos que se enumeran aquí.


Tu problema con Vim es que no te quejas, vi .

Mencionas cortar con yy y te quejas de que casi nunca quieres cortar líneas enteras. De hecho, los programadores, que editan el código fuente, muy a menudo desean trabajar en líneas enteras, rangos de líneas y bloques de código. Sin embargo, yy es solo una de las muchas maneras de tirar el texto en el búfer de copia anónimo (o "registrarse" como se llama en vi ).

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

Esto también se puede expresar como dd P (elimine la línea actual y pegue una copia en su lugar; deje una copia en el registro anónimo como efecto secundario). Los " y " d "verbos" toman cualquier movimiento como su "sujeto". Por yW tanto, 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 solo comprende los movimientos básicos del cursor hacia arriba, hacia abajo, hacia la izquierda y hacia la derecha, entonces vi no será más productivo que una copia del "bloc de notas" para usted. (De acuerdo, aún tendrá resaltado de sintaxis y la capacidad de manejar archivos más grandes que un poco de ~ 45KB, pero trabaje conmigo aquí).

vi tiene 26 "marcas" y 26 "registros". Una marca se establece en cualquier ubicación del cursor utilizando el comando m . Cada marca está designada por una sola letra minúscula. Así, ma establece la marca ' a ' en la ubicación actual, y mz establece la marca ' z '. Puede moverse a la línea que contiene una marca usando el comando ' (comilla simple). Así, 'a mueve al principio de la línea que contiene la marca' a '. Puede moverse a la ubicación precisa de cualquier marca usando el comando ` (backquote). Por lo tanto, `z se moverá directamente a la ubicación exacta de la marca ' z '.

Debido a que estos son "movimientos", también pueden usarse como sujetos para otras "declaraciones".

Por lo tanto, una forma de cortar una selección arbitraria de texto sería soltar una marca (por lo general uso ' a ' como mi "primera" marca, ' z ' como mi próxima marca, ' b ' como otra y ' e ' como otra más (no recuerdo haber usado más de cuatro marcas en forma interactiva en 15 años de uso de vi ; uno crea sus propias convenciones sobre cómo las macros que no perturban el contexto interactivo de uno usan sus propias convenciones). Al otro extremo de nuestro texto deseado, podemos comenzar en cualquier extremo, no importa. Luego simplemente podemos usar d`a para cortar o y`a para copiar. Por lo tanto, todo el proceso tiene una sobrecarga de 5 pulsaciones de teclado (seis Si comenzamos en el modo "Insertar" y necesitamos salir del modo de comando Esc Out. Una vez que hemos cortado o copiado, pegar en una copia es una sola pulsación de 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 del texto sin mover el cursor y dejar caer 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 del texto lo corté usando { d} (3 pulsaciones de tecla). (Si resulta que ya estoy en la primera o la última línea del párrafo, simplemente puedo usar d} o d{ respectivamente.

La noción de "párrafo" por defecto es algo que usualmente es intuitivamente razonable. Por lo tanto, a menudo funciona 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 adelante o hacia atrás son movimientos en vi . Por lo tanto, también se pueden utilizar como "sujetos" en nuestras "declaraciones". Así que puedo usar d/foo para cortar de la línea actual a la siguiente línea que contiene la cadena "foo" y la y?bar Para copiar desde la línea actual a la línea más reciente (anterior) que contiene "barra". Si no quiero líneas enteras, todavía puedo usar los movimientos de búsqueda (como declaraciones propias), suelte mi (s) marca (s) y use los comandos `x como se describió anteriormente.

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

Esta noción de "prefijos" también agrega los análogos de gramaticales "adjetivos" y "adverbios" a nuestro lenguaje de manipulación de texto. La mayoría de los comandos (verbos) y movimiento (verbos u objetos, según el contexto) también pueden tomar prefijos numéricos. 3J significa "unir las siguientes tres líneas" y d5} significa "eliminar de la línea actual hasta el final del quinto párrafo hacia abajo desde aquí".

Esto es todo 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 tuviera que dominar solo estos conceptos intermedios, probablemente encontraría que raramente necesita escribir macros porque el lenguaje de manipulación del texto es lo suficientemente conciso y expresivo para hacer la mayoría de las cosas con la suficiente facilidad con el lenguaje "nativo" del editor.

Una muestra de trucos más avanzados:

Hay una serie de : comandos, en particular la técnica de sustitución global :% s/foo/bar/g . (Eso no es avanzado pero otros : comandos pueden ser). El conjunto completo de comandos fue heredado históricamente por las encarnaciones anteriores de vi como las utilidades ed (editor de líneas) y más tarde las ex (editor de líneas extendidas). De hecho, vi se llama así porque es la interfaz visual para ej .

: comandos normalmente operan sobre líneas de texto. Ed y ex se escribieron en una época en que las pantallas de los terminales no eran comunes y muchos terminales eran dispositivos de "teletipo" (TTY). Por lo tanto, era común trabajar con copias impresas del texto, usando comandos a través de una interfaz extremadamente concisa (las velocidades de conexión comunes 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 comunes en sesiones interactivas multiusuario; además, a menudo hubo cierta motivación para conservar el papel).

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

Los comandos :... g y :... v tienen alguna explicación, ya que son increíblemente poderosos. :... g es un prefijo para "globalmente" aplicar un comando posterior a todas las líneas que coinciden 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 comandos ex , estos pueden ser prefijados por direcciones de direccionamiento / rango. Por lo tanto :.,+21g/foo/d significa "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 "barra".

Es interesante que el comando común de Unix grep se haya inspirado en realidad por este comando ex (y que tenga el nombre de la forma en que se documentó). El comando ex :g/re/p (grep) fue la forma en que documentaron cómo "globalmente" "imprimir" líneas que contienen una "expresión regular" (re). Cuando se usaron ed y ex , el comando :p fue uno de los primeros que alguien aprendió y, a menudo, el primero cuando se editó un archivo. Así se imprimieron los contenidos actuales (generalmente solo una página llena a la vez con :.,+25p o algo así).

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

Podemos usar m para mover líneas y j para unir líneas. Por ejemplo, si tiene una lista y desea separar todas las cosas que coinciden (o, a la inversa, NO coinciden con algún patrón) sin eliminarlas, puede usar algo como :% g/foo/m$ ... y todas las " foo "las líneas se han movido al final del archivo. (Tenga en cuenta el otro consejo sobre el uso del final de su archivo como un espacio de borrador). Esto habrá conservado el orden relativo de todas las líneas "foo" mientras se extrajeron del resto de la lista. (Esto sería equivalente a hacer algo como: 1G!GGmap!Ggrep foo<ENTER>1G:1,'ag/foo'/d (copie el archivo a su propia cola, filtre la cola a través de grep y elimine todas las cosas de la cabeza).

Para unir líneas, generalmente puedo encontrar un patrón para todas las líneas que deben unirse a su predecesor (todas las líneas que comienzan con "^" en lugar de "^ *" en alguna lista de viñetas, por ejemplo). Para ese caso, usaría:: :% g/^ /-1j (para cada línea que coincida, suba una línea y :% g/^ /-1j ). (Por cierto: para las listas de viñetas que intentan buscar las líneas de viñeta y unirse a la siguiente no funciona por un par de razones ... puede unir una línea de viñeta a otra, y no unirá ninguna línea de viñeta a todas Sus continuaciones; solo funcionará en parejas en los partidos).

Casi sin mencionar que puede usar nuestros viejos amigos (sustituto) con los comandos v (global / converse-global). Por lo general, 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, puede usar un patrón complicado con capturas y usar referencias para preservar las partes de las líneas que NO desea 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 todas las "barras" con "zzz". (Algo como :% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g solo funcionaría para los casos de "barra" que PRECEDEN "foo" en la misma línea; ya es lo suficientemente desagradable, y tendría que ser manipulada aún más para detectar todos los casos en que "barra" precedió a "foo")

El punto es que hay más que solo p , s y d líneas en el conjunto de comandos ex .

Las direcciones : también pueden referirse a las marcas. Por lo tanto, puede usar:: :'a,'bg/foo/j para unir cualquier línea que contenga la cadena foo a su línea posterior, si se encuentra entre las líneas entre las marcas ' a ' y ' b '. (Sí, todos los ejemplos de comandos ex anteriores se pueden limitar a los subconjuntos de líneas del archivo prefijando con 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, admitiré libremente que a menudo he hecho cosas de forma iterativa e interactiva que probablemente se podrían haber hecho más eficientemente si me hubiera tomado el tiempo de pensar en el conjuro correcto.

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

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

Aún más poderosos son los ! (bang) y :... ! ( ex bang) comandos. 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! Esto puede ordenar todas las líneas en nuestro archivo usando 1G!Gsort ( G es el comando vi "goto"; por defecto va a la última línea del archivo, pero puede ir precedido por un número de línea, como 1, el primera linea). Esto es equivalente a la variante ex :1,$!sort . ¡Los escritores a menudo usan ! con las utilidades fmt o fold de Unix para reformar o "envolver 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 de él, a través de sangría u otras herramientas de cambio de formato de código.

Usando el :r! y ! comandos significa que cualquier utilidad o filtro externo se puede tratar como una extensión de nuestro editor. Ocasionalmente los he usado con scripts que extrajeron datos de una base de datos, o con comandos wget o lynx que extrajeron datos de un sitio web, o comandos ssh que extrajeron datos de sistemas remotos.

Otro comando ex útil es :so (abreviatura de :source ). Esto lee el contenido de un archivo como una serie de comandos. Cuando inicia vi it normalmente, implícitamente, realiza un :source en el archivo ~/.exinitrc (y Vim generalmente hace esto en ~/.vimrc , por ~/.vimrc ). 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, incluso puedes usar esto como un truco para almacenar secuencias de comandos de edición para aplicar 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 de conteo de palabras. Puedo aplicar esa "macro" a un archivo usando un comando como: vim +'so mymacro.ex' ./mytarget

(La opción de la 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 dado. Sin embargo, es un hecho poco conocido que se puede seguir el + con cualquier comando / expresión ex , como una "fuente" comando como lo he hecho aquí; por ejemplo, tengo scripts que invocan: vi +'/foo/d|wq!' ~/.ssh/known_hosts para eliminar una entrada de mi archivo de hosts conocidos SSH de forma no interactiva mientras yo estoy re-imágenes de un conjunto de servidores).

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

El comando @ es probablemente el comando vi más oscuro. En ocasiones, enseñando cursos avanzados de administración de sistemas durante casi una década, he conocido a muy pocas personas que lo hayan usado. @ ejecuta el contenido de un registro como si fuera un comando vi o ex .
Ejemplo: A menudo utilizo:: :r!locate ... para encontrar algún archivo en mi sistema y leer su nombre en mi documento. Desde allí, elimino cualquier golpe extraño, dejando solo la ruta completa al archivo en el que estoy interesado. En lugar de laboriosamente, haga tabulaciones a través de cada componente de la ruta (o peor, si me quedo atascado en una máquina sin completar la pestaña). Soporte en su copia de vi ) solo uso:

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

Eso es solo 10 pulsaciones (y la expresión "cdd @c es 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 sobrio

¡Solo he arañado a la superficie el poder de vi y nada de lo que he descrito aquí es incluso parte de las "mejoras" para las que se nombra 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 del poder de lo que nunca lo haré.


Algunos consejos de productividad:

Movimientos inteligentes

  • * y # buscan la palabra debajo del cursor adelante / 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 para el espacio separado solamente)
  • gg / G salta al principio / final del archivo.
  • % salto al juego {..} o (..), etc.
  • { / } saltar al siguiente párrafo.
  • '. saltar de nuevo a la última línea editada.
  • g; saltar de nuevo a la última posición editada.

Comandos de edición rápida

  • I inserto al principio.
  • A apéndice para terminar.
  • o / O abre una nueva línea después / antes de la actual.
  • Modo visual v / V / Ctrl+V (para seleccionar texto!)
  • Shift+R reemplazar texto
  • C cambiar 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 interior.
  • ci" = cambio interno entre" .. "
  • ci( = cambiar texto entre (..)
  • ci< = cambiar texto entre <..> (necesita set matchpairs+=<:> en vimrc)
  • 4dd = borrar 4 lineas
  • 3x = eliminar 3 caracteres.
  • 3s = sustituir 3 caracteres.

Comandos útiles del programador

  • r reemplaza un carácter (por ejemplo, rd reemplaza el carácter actual por d ).
  • ~ cambia el caso.
  • J une dos líneas
  • Ctrl + A / Ctrl + X incrementa / disminuye un número.
  • . repetir el último comando (una macro simple)
  • == corregir sangría de línea
  • > Bloque de sangría (en modo visual)
  • < bloque unindent (en modo visual)

Grabación de macros

  • Pulse q[ key ] para iniciar la grabación.
  • Luego pulsa q para detener la grabación.
  • La macro se puede jugar con @[ key ] .

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

Ejemplo de configuraciones bien construidas.

# 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")

Las configuraciones se pueden almacenar en ~/.vimrc , o en todo el sistema en /etc/vimrc.local y luego leerlas desde el /etc/vimrc usando:

source /etc/vimrc.local

(tendrás que reemplazar el # carácter de comentario con " para que funcione en VIM, quería dar el 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 bastante más productivo, sin tener que saber todas las cosas elegantes.


Estás hablando de la selección y copia de texto, creo que deberías echarle un vistazo al Modo Visual Vim .

En el modo visual, puede seleccionar texto usando los comandos Vim, luego puede hacer lo que quiera 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 de inicio / final
  • vib si el cursor está dentro del bloque de paréntesis

Desea seleccionar texto entre comillas:

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

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

  • viB
  • vi{

Desea seleccionar el archivo completo:

  • ggVG

La selección de bloque visual es otra característica realmente útil, le permite seleccionar un área rectangular de texto, solo tiene que presionar Ctrl - V para iniciarlo, y luego seleccionar el bloque de texto que desea y realizar cualquier tipo de operación, como tirón, eliminar, pegar, editar, etc. Es genial editar texto orientado a columnas .


<Ctrl> + W, V para dividir la pantalla verticalmente
<Ctrl> + W, W para cambiar entre las ventanas

! python% [args] para ejecutar el script que estoy editando en esta ventana

ZF en modo visual para plegar líneas arbitrarias.


CTRL+A incrementa el número en el que estás parado.


soldado americano

Ir a la última ubicación editada (muy útil si realizó alguna búsqueda y desea volver a editar)

^ P y ^ N

Complete el texto anterior (^ P) o siguiente (^ N).

^ O y ^ I

Ir a la ubicación anterior ( ^O- "O"para la ubicación anterior) o a la siguiente ( ^I- "I"cerca de "O"). Cuando realiza búsquedas, edita archivos, etc., puede navegar a través de estos "saltos" hacia adelante y hacia atrás.


Manipulaciones de texto a granel!

Ya sea a través de macros:

  • Comience con la grabación: qq
  • Hacer cosas
  • Para de grabar: q
  • Repetir: @q(la primera vez), @@después de eso.
  • Repita 20 veces: [email protected]@

O a través de expresiones regulares:

  • Reemplazar cosas: :%s/[fo]+/bar/g

(Pero ten cuidado: si haces esto último, tendrás 2 problemas :).)


Modo visual

Como han dicho otras personas, el modo visual es la respuesta a su problema de copiar / cortar y pegar. Vim te da 'v', 'V' y Cv. La letra 'v' minúscula en vim es esencialmente la misma que la tecla Mayús en el bloc de notas. Lo bueno es que no tienes que mantenerlo presionado. Puede utilizar cualquier técnica de movimiento para navegar de manera eficiente hasta el punto inicial (o final) de su selección. Luego presione 'v' y use técnicas de movimiento eficientes nuevamente para navegar al otro extremo de su selección. Entonces 'd' o 'y' le permiten cortar o copiar esa selección.

La ventaja que tiene el modo visual de vim sobre la descripción de Jim Dennis de cortar / copiar / pegar en vi es que no tiene que obtener la ubicación exactamente correcta. A veces es más eficiente usar un movimiento rápido para llegar a la vecindad general de donde quiere ir y luego refinarlo con otros movimientos que idear un comando de movimiento único más complejo que lo lleve exactamente a donde quiere ir.

La desventaja de usar el modo visual extensivamente de esta manera es que puede convertirse en una muleta que usa todo el tiempo, lo que le impide aprender nuevos comandos vi (m) que podrían permitirle hacer las cosas de manera más eficiente. Sin embargo, si eres muy proactivo en aprender nuevos aspectos de vi (m), entonces esto probablemente no te afectará mucho.

También volveré a enfatizar que la línea visual y los modos de bloque visual le brindan variaciones sobre este mismo tema que puede ser muy poderoso ... especialmente el modo de bloque visual.

Sobre el uso eficiente del teclado

También estoy en desacuerdo con su afirmación de que alternar las manos es la forma más rápida de usar el teclado. Tiene un elemento de verdad en ello. Hablando de manera muy general, el uso repetido de lo mismo es lento. Este ejemplo más significativo de este principio es que las pulsaciones de teclas consecutivas introducidas con el mismo dedo son muy lentas. Su afirmación probablemente se deriva de la tendencia natural a usar la transformación s / dedo / mano / en este patrón. Hasta cierto punto es correcto, pero en el extremo extremadamente alto del espectro de eficiencia es incorrecto.

Solo pregúntale a cualquier pianista. Pregúnteles si es más rápido tocar una sucesión de algunas notas alternando las manos o usando los dedos consecutivos de una sola mano en secuencia. La forma más rápida de teclear 4 pulsaciones no es alternar las manos, sino escribirlas con 4 dedos de la misma mano en orden ascendente o descendente (llame a esto "correr"). Esto debería ser evidente una vez que haya considerado esta posibilidad.

El problema más difícil es la optimización para esto. Es bastante fácil optimizar la distancia absoluta en el teclado. Vim hace eso. Es mucho más difícil de optimizar en el nivel de "ejecución", pero vi (m) con su edición modal le brinda una mejor oportunidad de poder hacerlo que cualquier otro enfoque no modal (ejem, emacs).

En emacs

Para que los fanáticos de los emacs ignoren por completo mi publicación por el último comentario entre paréntesis, siento que debo describir la raíz de la diferencia entre las religiones emacs y vim. Nunca he hablado en las guerras de editores y probablemente no lo volveré a hacer, pero nunca he escuchado a nadie describir las diferencias de esta manera, así que aquí va. La diferencia es la siguiente compensación:

Vim le brinda una eficiencia de edición de texto sin formato inigualable Emacs le brinda una capacidad incomparable para personalizar y programar el editor

Los ciegos vim fanáticos afirmarán que vim tiene un lenguaje de scripting. Pero es un lenguaje oscuro y ad hoc que fue diseñado para servir al editor. Emacs tiene Lisp! Basta de charla. Si no aprecias el significado de esas dos últimas oraciones o tienes el deseo de aprender lo suficiente sobre programación funcional y Lisp para desarrollar esa apreciación, entonces debes usar vim.

Los fanáticos de emacs afirmarán que emacs tiene el modo viper, por lo que es un superconjunto de vim. Pero el modo víbora no es estándar. Mi entendimiento es que el modo viper no es utilizado por la mayoría de los usuarios de emacs. Dado que no es el valor predeterminado, la mayoría de los usuarios de emacs probablemente no desarrollen una apreciación real de los beneficios del paradigma modal.

En mi opinión estas diferencias son ortogonales. Creo que los beneficios de vim y emacs tal como los he establecido son válidos. Esto significa que el editor final no existe todavía. Probablemente sea cierto que emacs sería la plataforma más sencilla para basar el editor definitivo. Pero la edición modal no está arraigada en la mentalidad de Emacs. La comunidad de emacs podría moverse de esa manera en el futuro, pero eso no parece muy probable.

Así que si quieres eficiencia de edición en bruto, utiliza vim. Si desea el mejor entorno para programar y programar su editor, use emacs. Si desea algunos de los dos con énfasis en la capacidad de programación, use emacs con el modo viper (o programe su propio modo). Si quieres lo mejor de ambos mundos, estás de suerte por ahora.


Todo en modo normal:

f <char> para pasar a la siguiente instancia de un carácter particular en la línea actual, y ; repetir.

F <char> para moverse a la instancia anterior de un carácter particular en la línea actual y ; repetir.

Si se usan de manera inteligente, los dos anteriores pueden hacer que te muevas rápidamente en una línea.

* en una palabra para buscar la siguiente instancia.

# en una palabra para buscar la instancia anterior.


Acabo de descubrir el omnicompletado de Vim el otro día, y aunque admito que estoy un poco confuso en lo que hace que, he tenido resultados sorprendentemente buenos con solo combinar Ctrl+ x Ctrl+ uo Ctrl+ n/ Ctrl+ pen el modo de inserción. No es del todo IntelliSense , pero todavía lo estoy aprendiendo.

¡Pruébalo! :help ins-completion


De acuerdo con el cartel superior - el : r! El comando es muy útil.

La mayoría de las veces lo uso para "pegar" cosas:

:r!cat
**Ctrl-V to paste from the OS clipboard**
^D

De esta manera no tengo que juguetear :set paste.


Hace poco descubrí este sitio: http://vimcasts.org/

Es bastante nuevo y realmente muy bueno. El tipo que dirige el sitio cambió de compañero de texto a vim y presenta lanzamientos muy buenos y concisos sobre temas específicos de vim. ¡Echale un vistazo!


Múltiples buffers, y en particular, saltos rápidos entre ellos para comparar dos archivos con :bpy :bn(correctamente reasignados a un solo Shift+ po Shift+ n)

vimdiff Modo (se divide en dos buffers verticales, con colores para mostrar las diferencias)

Copiar área con Ctrl+v

Y por último, complete la pestaña de los identificadores (busque "mosh_tab_or_complete"). Eso es un cambio de vida.


Me sorprendió encontrar a nadie mencionar el tmovimiento. Con frecuencia lo uso con listas de parámetros en forma de dt,oyt,


Pase 30 minutos haciendo el tutorial de vim (ejecute vimtutor en lugar de vim en el terminal). Aprenderás los movimientos básicos y algunas pulsaciones de teclas, esto te hará al menos tan productivo con vim como con el editor de texto que usaste antes. Después de eso, bueno, lee la respuesta de Jim Dennis de nuevo :)


Preguntaste sobre accesos directos productivos, pero creo que tu pregunta real es: ¿vale la pena vim? La respuesta a esta pregunta de es -> "Sí"

Debes haber notado dos cosas. Vim es poderoso, y vim es difícil de aprender. Gran parte de su poder radica en su capacidad de expansión y una combinación infinita de comandos. No te sientas abrumado. Ve lento. Un comando, un plugin a la vez. No te excedas.

Toda la inversión que pongas en vim pagará mil veces. Vas a estar dentro de un editor de texto durante muchas, muchas horas antes de morir. Vim será tu compañero.


Soy miembro de la American Cryptogram Association. La revista bimestral incluye más de 100 criptogramas de varios tipos. Aproximadamente 15 de estos son "cryptarithms" - varios tipos de problemas aritméticos con letras sustituidas por los dígitos. Dos o tres de estos son sudokus, excepto con letras en lugar de números. Cuando se complete la cuadrícula, las nueve letras distintas deletrearán una palabra o palabras, en alguna línea, diagonal, espiral, etc., en algún lugar de la cuadrícula.

En lugar de trabajar con lápiz o escribir los problemas a mano, descargo los problemas desde el área de miembros de su sitio web.

Cuando trabajo con estos sudokus, uso vi, simplemente porque estoy usando las instalaciones que vi tiene y que pocos editores tienen. Principalmente al convertir la cuadrícula con letras en una cuadrícula numerada, porque me resulta más fácil de resolver, y luego la cuadrícula numerada completa vuelve a la cuadrícula con letras para encontrar la palabra o las palabras de solución.

El problema está formateado como nueve grupos de nueve letras, con - s representa los espacios en blanco, escrito en dos líneas. El primer paso es formatearlos en nueve líneas de nueve caracteres cada una. No hay nada especial en esto, solo insertando ocho saltos de línea en los lugares apropiados.

El resultado se verá así:

T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T

Entonces, el primer paso para convertir esto en números es hacer una lista de las distintas letras. Primero, hago una copia del bloque. Coloco el cursor en la parte superior del bloque, luego escribo :y}}p. :me pone en modo de comando, ytira el siguiente comando de movimiento. Ya que }es un movimiento al final del siguiente párrafo, y}tira el párrafo. }luego mueve el cursor hasta el final del párrafo y ppega lo que habíamos tirado justo después del cursor. Asi quey}}p crea una copia del siguiente párrafo, y termina con el cursor entre las dos copias.

A continuación, convertiré una de esas copias en una lista de letras distintas. Ese comando es un poco más complejo:

:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'

:de nuevo me pone en modo de comando. !indica que el contenido del siguiente tirón debe canalizarse a través de una línea de comando. }tira el siguiente párrafo y la línea de comandos luego usa el trcomando para eliminar todo excepto las mayúsculas, el sedcomando para imprimir cada letra en una sola línea y el sortcomando para ordenar esas líneas, eliminar duplicados y luego treliminar las líneas nuevas, dejando las nueve letras distintas en una sola línea, reemplazando las nueve líneas que originalmente formaban el párrafo. En este caso, las letras son:ACELNOPST .

El siguiente paso es hacer otra copia de la cuadrícula. Y luego utilizar las cartas que hemos identificado simplemente para reemplazar cada una de esas cartas con un dígito del 1 al 9. Eso es simple: :!}tr ACELNOPST 0-9. El resultado es:

8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8

Esto puede resolverse de la forma habitual o ingresarse en cualquier solucionador de sudoku que prefiera. La solución completa se puede convertir de nuevo en letras con:!}tr 1-9 ACELNOPST .

Hay poder en vi que es igualado por muy pocos otros. El mayor problema es que solo unos pocos de los tutoriales de vi, sitios web, archivos de ayuda, etc., hacen más que apenas tocar la superficie de lo que es posible.


Use \cen cualquier lugar de la búsqueda para ignorar el caso (anulando su configuración de caso de ignorecase o smartcase) Por ejemplo, /\cfooo /foo\ccoincidirá foo, Foo, fOO, FOO, etc.

Utilice \Cen cualquier lugar en una búsqueda para forzar la coincidencia de casos. Por ejemplo, /\Cfooo /foo\Csolo coincidirá con foo.







vi