Vim tirando rango de líneas


84

Soy un desarrollador de C # que recientemente decidió expandir mi conocimiento de las herramientas disponibles para mí. La primera herramienta que he decidido aprender es Vi / Vim. Todo ha ido bien hasta ahora, pero hay un par de preguntas a las que parece que no puedo encontrar la respuesta:

  1. Digamos que quería tirar de una serie de líneas. Sé que hay muchas formas de hacerlo, pero me gustaría hacerlo por número de línea. Pensé que sería similar a cómo funcionan los comandos sustitutos, algo así como 81,91y. ¿Hay alguna forma de hacer esto?

  2. Estoy un poco confundido acerca del gcomando en modo normal. Parece hacer una gran cantidad de cosas y realmente no puedo determinar qué hace el comando g en su núcleo. Estoy confundido sobre si es un comando de movimiento o una especie de "captura todo" para otros comandos ejecutados en modo normal. ¿Alguien puede explicarme esto o señalarme una referencia que dé una buena explicación del gcomando?


1
¿Conoce el comando ": ayuda" en vim (1)?
Steve Emmerson

Sí, pero no pude encontrarlo en todas las referencias. Resulta que estaba pensando que lo haría desde el modo normal, pero hometoast mostró cómo tenía que hacerse desde el modo de comando. Para el comando g, descubro que la ayuda no une todo como esperaría de los otros comandos.
jnadro52

3
Aparte, es posible que desee hacer una publicación por pregunta.
Dana

1
Lo haré en el futuro. Estaba más preocupado con la primera pregunta, solo pensé en la otra mientras escribía la primera.
jnadro52

Respuestas:


140

Líneas de Yank 81-91

:81,91y<enter>

Si a tus dedos no les gusta encontrar las teclas :y ,, esto también funcionaría (ve a la línea 81, tira 11 líneas)

81gg11yy 

Mi único uso de ges 5gg. Para ir a la quinta línea. 22gg: 22ª línea. Como dijo jimbo, en realidad es solo un modificador para algunos otros comandos.

Para completar, ( http://vim.wikia.com/wiki/Power_of_g ) explica mucho cómo gfunciona en el modo de comando.


2
El uso de letras mayúsculas también proporciona variaciones: ggirá a la primera línea, mientras Gque irá a la última. Además, 5Gva a la línea 5. Las marcas pueden ser utilizados en lugar de los números de línea también (bueno para las macros), es decir: :'a,52y
NVRAM

1
Si no le teme a la tecla Shift, 81G11Yes incluso "más corta".
Jens

1
La desventaja del método del modo normal es que pierde su "lugar"; posiblemente podrías mxantes y 'xdespués, pero luego la versión del modo comando se vuelve mucho más sucinta. Humm ... apenas escribí esto, vi la respuesta de @Asta.
Eric Smith

1
@WilliamRoss, esto en realidad coloca las líneas en un búfer para usar en vim, no necesariamente en el Portapapeles de su sistema, donde podría pegar, digamos, el Bloc de notas con CTRL + V. Ver pregunta relacionada: Cómo copiar / pegar texto de vi a diferentes aplicaciones
hometoast

1
Esto me divierte porque la única razón por la que busqué la primera solución fue para evitar contar líneas o hacer una resta en mi cabeza.
Paul Parker

22

También puede copiar las líneas actuales a la ubicación actual del cursor usando 't'.

:81,91t.<enter>

Esto pegará las líneas 81-91 debajo de la línea en la que se encuentra el cursor.

Aprendí esto de http://vimcasts.org, que es un excelente recurso sobre VIM.


¿Qué t.significa aquí?
CivFan

2
Según tengo entendido, tse puede considerar como tenferma o to y .es la dirección de la línea actual.
Asta

1
@CivFan es sinónimo de:copy
D. Ben Knoble

11

También me gusta usar la opción de número de línea relativo de vim, lo que significa que puedo ingresar:

:-10,-7ya a

para arrastrar el texto al búfer con nombre a.

NB Especificar A agregará lo que está tirando al contenido actual del búfer a.

No olvide que también puede copiar bloques de texto y mover bloques de texto con los comandos similares:

:-10,-7co .

significa copiar las cuatro líneas de texto 10 líneas arriba hacia abajo de la línea actual, y

:-10,-7mo .

significa mover las cuatro líneas de texto 10 líneas arriba hacia abajo de la línea actual.


8

El Gcomando va a un determinado número de línea, si va acompañado de un valor de recuento. 81Gte pone en la línea 81.

El ycomando se puede combinar con un movimiento, como G. Entonces, para tirar todo hasta la línea 91, puede usar y91G.

Juntos obtienes:

81Gy91G

Vaya a la línea 81, luego jale mientras va a la línea 91.


1
Desearía poder votar esto más de una vez. Algo que me ayudó fue usar esto para acceder a un registro (en mi caso, registro + es decir, el portapapeles):81G"+y91G
mgarey

1
@mgarey, ¿no hay forma de ingresar directamente a un registro usando la sintaxis de rango de línea? 81,91yy de alguna manera apuntar al registro?
diplosaurus

1
@diplosaurus Probablemente, pero no lo sé. Suena como una pregunta que podría hacer en vi.stackexchange.com, si aún no está allí o aquí en SO. Me interesaría. No soy un experto en Vim.
mgarey

2
@mgarey Tuve que ser creativo con la búsqueda de Google, pero lo encontré aquí: stackoverflow.com/questions/16225366/… . :81,91y +
diplosaurus

@diplosaurus :81,91y +no funciona. Funciona para otros registros como, :81,91y apor ejemplo, pero no parece que le guste el +registro. ¿Esto definitivamente funciona para otras personas?
ojunk

4

gno hace nada por sí mismo. Es uno de un par de metacomandos que contiene un montón de comandos no relacionados.

z es otro comando como ese.


Gracias. Ahora entiendo que solo se usa para diferentes propósitos. Cuando trato de aprender estas herramientas, trato de asociar los comandos con algo que pueda abstraer para recordar cómo usarlo correctamente. Parece que el comando g es solo una de esas cosas que necesita memorizar para usar correctamente.
jnadro52

2

Vim's :help indexdescribeg como:

|g|             g{char}            extended commands, see |g| below

Desplácese hacia abajo (o :help g) para ver una lista.


1
Estaba familiarizado con: help pero NO estaba familiarizado con: help (comando). Eso será muy útil en el futuro. Gracias amablemente, señor.
jnadro52

2

La mejor solución sería ingresar al "modo visual", presionando v. Y después de seleccionar las líneas, simplemente cópielas presionando y. Luego pegue las líneas copiadas presionando p.


No estoy de acuerdo, pero solo el modo visual bc es tan lento a veces.
D. Ben Knoble

1

Además de :91,96y aque yanks ( y) las líneas 91 a 96 en el registro a, (pegadas con "ap), las líneas yanked se pueden agregar al registro con:

:91,96y A

Es decir, la capitalización del Aregistro provoca una operación de adición en el registro en alugar de una sobrescritura. La capitalización del registro siempre funciona así, por ejemplo, se :let @A=';'agrega un ;al registroa .

El uso de más (+) o menos (-) hace referencia a líneas relativas a la posición actual del cursor:

:-10,+10y b

Es decir, tiraría ( y) 21 líneas alrededor de la posición actual del cursor y las pondría en registrob .

Una ausencia de entrada en realidad también representa la posición actual del cursor, lo que significa que esto:

:-5,y a

arrastraría el texto de 5 líneas arriba a la posición actual del cursor en el búfer con nombre a, y:

:,+5y a

arrastraría las 5 líneas después de la posición actual del cursor al búfer a.

Nota: Si tiene una macro en el búfer a, el yank anterior la sobrescribió, ya que los registros de yank y los registros de macro son realmente lo mismo. Por eso, casualmente, puede pegar una macro, editarla y luego volver a colocarla en su registro. Personalmente, utilizo las letras alcanzadas por mi mano izquierda para los tirones y las letras alcanzadas por la derecha para las macros.

Mover bloques de texto, se ve así:

:+10,+13m.

lo que significa mover las cuatro líneas colocadas 10 líneas por delante del cursor actual, por debajo de la línea actual.

Apéndice

Me previamente confundido yaen :91,95ya aser sinónimo de algún modo ya{motion}en el que el movimiento fue suministrada por 91,95. Esto era incorrecto y la "a" en yaes completamente innecesaria. En mi defensa, my help yankno transmite que yasea ​​un posible alias de yank.


1
:yaes una abreviatura de :yank, así que no estoy seguro de cómo me siento acerca de tirar todas las líneas . Pero buen trabajo al condensar parte de la información dispersa
D. Ben Knoble

Yo también lo pensé, hasta que miré :help yank. No hay alias yapara yank. Sin embargo, tienes razón, ano significa "todos", técnicamente significa "a". Sin embargo, prefiero decir "todos", ya que tiene más sentido para mí.
Paul Parker

2
:[range]y[ank] [x] Yank [range] lines [into register x]los corchetes en y[ank]indican que [ank]son opcionales. :y, :yay :yanson implícitamente alias de:yank
D. Ben Knoble

Me quedo corregido :) La a no es necesaria. Editaré la respuesta para reflejarla.
Paul Parker

1
Su apéndice es agradable, pero me refería a su primera línea, donde usa el comando ex :yay no el comando normaly
D. Ben Knoble

0

Como usuario de Vi / Vim desde hace mucho tiempo, tiendo a usar 'marcas' en lugar de números de línea (o 'marcadores de línea'). Funciona así: mes el carácter de 'marca'; luego use cualquier letra para identificar / nombrar la marca. Para volver a una marca, el prefacio de la marca nombrada con una comilla simple ( 'a) Estas marcas se pueden utilizar como rango. Ejemplos:

File:
    <line 1>
    <line 2>
    <line 3>
    <line 4>
    <line 5>

Cuando esté en modo comando, mueva el cursor a la línea 2, escriba ma. desplácese a la línea 4, escriba mb. Para tirar de la marca a a la marca b escriba:

    :'a,'byank

Para eliminar de la marca a a la marca b, escriba:

    :'a,'bdel

Para buscar desde la marca a hasta la marca by reemplazar 'ine' por 'tinta':

    :'a,'bs/ine/ink/g

Para copiar la marca a hasta la marca by pegar debajo de la posición actual (el 'punto' siempre hace referencia a la línea donde está posicionado el cursor):

    :'a,'bco . 

Cambie las líneas de código, entre la marca a y la marca b , una pestaña hacia la derecha (use el cheurón opuesto <, para moverse a la izquierda):

    :'a,'b> 

En el modo de comando, puede regresar a las marcas simplemente escribiendo 'apara regresar a la línea marcada a. Mecanografía'' lo lleva de regreso a la posición anterior (desafortunadamente solo recuerda la posición anterior, no dos hacia atrás).

Puede acceder a búferes con nombre, copiar, eliminar líneas, buscar y reemplazar solo partes de su código, etc.sin necesidad de conocer los números de línea.


0

Para arrancar líneas de la línea 81 a la 91:

enfoque 1: 81gg11yy

no está mal, pero tienes que hacer un poco de matemáticas para averiguar cuántas líneas tirar

enfoque 2: 81ggluego shift+vluego 91ggluegoy

MEJOR EN MI OPINIÓN porque esto es sencillo, solo tiene que saber lo obvio, es decir, de qué número de línea a qué número de línea desea tirar

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.