En vim, a menudo necesito eliminar o tirar / poner grandes bloques de texto.
Puedo contar las líneas de texto e ingresar algo como 50dd
eliminar 50 líneas.
Pero eso es un poco doloroso. ¿Cómo puedo borrar este gran bloque de texto sin tener que saber cuántas líneas borrar de antemano?
move
hasta el final. Luego, eliminar hasta el final no es diferente a pasar al final.Respuestas:
Vaya a la línea de inicio de su bloque y escriba ma(marque "a", aunque, por supuesto, puede usar letras diferentes , e incluso varias letras para diferentes marcas, siempre que pueda mantener en su cabeza de qué letra es una marca) .
Luego vaya a la última línea e ingrese d'a(eliminar para marcar "a") o y'a(tirar para marcar "a") (a) .
Eso eliminará / eliminará todas las líneas de la actual a la marcada (inclusive)
Luego puede pegarlo en otro lugar con los comandos de pegado normales, como po P.
También es compatible con
vi
, así comovim
, en la remota posibilidad de que su entorno no ha sido bendecida con este último.(a) También lo uso para guardar mi lugar en el archivo si tengo que ir a buscar otro lugar para, por ejemplo, copiar y pegar la definición de una función a la que quiero llamar.
Simplemente marco la línea actual de la misma manera, may luego me alejo para encontrar lo que esté buscando.
Luego, una vez que lo encontré y lo copié en un registro, solo ingresé 'apara volver a marcar "a", la línea que guardé de antemano, donde luego puedo pegarla.
fuente
v
tecla, me pregunto si realmente lo necesito o ¿hay una mejor forma de movimiento?En Vim, use el modo de línea visual :
Para eliminar grandes bloques de texto, esto es preferible al modo visual simple porque no necesita preocuparse sobre en qué columna se encuentra el cursor.
fuente
}
para seleccionar párrafos completos o)
para oraciones. Hay más, puedes leer sobre ellos en:h object-motions
/something<CR>
es un método muy eficiente para llegar al final de su bloque de selecciónj
para mover el cursor hacia abajo (paso 3), puede escribir el número de línea seguido deG
para seleccionar hasta esa línea. Ejemplo:V150Gd
Puedes
:set relativenumber
, así no tienes que contar. ;)fuente
:set number
, y luego use d35G para eliminar hasta la línea 35.relativenumber
, pero mejor :-)Puede eliminar fácilmente un gran bloque de texto conociendo su estructura.
Si es un párrafo, use: d{(por ejemplo, puede prefijar con el número de párrafos)
Si es un bloque de código entre paréntesis, use: d%
Si el texto aparece hasta el final del archivo, use: dG
Si sabe cómo termina, use: d/y escriba el texto final seguido de Enter(también puede usar la expresión regular, por lo que las posibilidades son infinitas).
Alternativamente, use el modo visual ( V) y use las teclas de movimiento para seleccionar rápidamente el texto (por ejemplo, por {) y eliminarlo ( d).
O como sugirió Lie Ryan, use
d/search-string/e
para eliminar texto del cursor actual a la cadena buscada.Ver:
:help d
y:help motion
para más información.fuente
d/search-string/e
que eliminar desde el cursor actual hasta el final de la cadena de búsqueda, incluida la cadena de búsqueda en sí, yc/search-query
entrar en modo de inserción después de la eliminación. Usard/
withset incsearch
es una combinación ordenada, ya que le permite averiguar de manera interactiva si está operando en el rango de texto correcto y le ayuda a saber cuándo dejar de escribir la consulta de búsqueda para evitar escribir más de lo necesario.d
cona
(externo) oi
(interno) y un especificador de objeto muy útil. Los objetos comow
por palabra,p
para el párrafo,(
ob
para(...)
,[
por[...]
,{
oB
para{...}
, etc. documentación para visuales-operadores .Puede usar movimientos y / u objetos de texto. Por ejemplo, puede eliminar todo desde el cursor hasta la siguiente línea en blanco con
d}
. Si el cursor está dentro de un párrafo, el párrafo se puede eliminar condip
odap
. Si el cursor está dentro de una etiqueta HTML, puede eliminarlo condit
odat
.Los buenos mnemónicos para estos son " d elete i nside" y " d elete a round" (párrafo / etiqueta / paréntesis).
fuente
Yo suelo hacer
que eliminará cada línea entre los números de línea inicial y final proporcionados (incluidas las líneas dadas).
Tenga en cuenta que ambos
start
yend
pueden ser números de línea absolutos, patrones o desplazamientos desde otra posición.Ver también el comentario de doubleDown sobre ver Vim's documentación de gama , tiene algunos consejos útiles.
Ejemplo:
Digamos que tiene el siguiente archivo:
Luego, usando el comando
:2,3d
o:/fox/,/over/d
o:/quick/+1,/lazy/-1
o:+1,+2d
si estás en la primera línea o:-1,.d
si estás en la tercera línea, terminas con:fuente
:set ruler
, y luego ir a la parte superior y la parte inferior del texto para encontrarstart
yend
números de línea, y luego hacerlo:<start>,<end>d
:+12,+24d
<start>
y<end>
para esto. Para referencia, ver:h [range]
. Por lo tanto, en realidad es un poco más flexible de lo que parece.Si se trata de bloques delimitados (p. Ej., Código o etiquetas XML / HTML) con los que está tratando, puede colocar el cursor al comienzo del bloque y usar el modo visual junto con
%
seleccionar rápidamente bloques enteros de código y luego presionard
para eliminarlosfuente
dap
para borrar un párrafo,da(
,da{
,da[
, eliminar bloques delimeted por paréntesis, llaves o corchetes. Para html haydat
, que elimina una etiqueta,da'
yda"
elimina cadenas. También hay losdip
,di(
variantes, etc., que se elimine todo dentro de los delimitadores, pero deja intactos los delimitadores. Alternativamente, puede usarvap
(respvip
) para seleccionar todos los párrafos (resp inner). (Y entonces hayva(
yvi(
.) Además, haycap
ycip
(oca(
yci(
) para eliminar e ir al modo de inserción (es decir, "cambiar"). Yyap
para tirarAdemás de todos los otros buenos consejos, estoy agregando d+ Shift+ Lpara eliminar todo, desde la posición actual del cursor hasta la última línea visible en la pantalla. Repetir el comando lo bajará relativamente rápido.
fuente
El complemento numbers.vim es muy útil para esto. Es una forma mejorada de preceder cada línea con un número de línea. ¡Como
'number'
y'relativenumber'
, ambos se unieron!Está habilitado de forma predeterminada después de la instalación, también desea agregarlo
set number
a su vimrc si aún no lo tiene, ya que se comporta de manera extraña si no lo tiene.En modo normal, se parece a
:set relativenumber
:Le muestra números de línea relativos, excepto la línea donde está el cursor, donde muestra el número de línea absoluto (7 en este caso).
Si luego cambiamos al modo de inserción , se comportará como si
number
estuviera configurado mostrando siempre números de línea absolutos:Hay algunas opciones más y algunos comandos (consulte la página de inicio), pero los valores predeterminados deberían funcionar para la mayoría de las personas.
fuente
set number
,set relativenumber
entoncesautocmd InsertEnter * :set norelativenumber
yautocmd InsertLeave * :set relativenumber
Otro enfoque es si está tratando de eliminar un patrón específico, simplemente puede escribir d/
delim
Enter.fuente
Puede usar el procedimiento normal de entrada dmás un movimiento (como ya se explicó en las otras respuestas). El complemento EasyMotion proporciona nuevos movimientos que puede usar para resolver su problema de manera rápida y fácil.
Supongamos que desea eliminar de la posición actual del cursor al final de cualquier palabra en la pantalla, las teclas de movimiento serían
<Leader>
<Leader>
e(similares ale
movimiento normal ). Luego escriba las letras resaltadas que aparecen al final de la palabra en cuestión. También hay un movimiento de línea para que pueda eliminar la línea actual hasta la línea en cuestión con<Leader>
<Leader>
j.Tengo mi
<Leader>
llave configurada ,. Entonces, el comando completo es d<Leader>
<Leader>
e{letra (s) resaltada (s)}.De
:help easymotion
:Editar:
El repositorio github de EasyMotion está en https://github.com/Lokaltog/vim-easymotion .
Este reddit sobre personas que usan easymotion podría ser una lectura divertida.
fuente
Hay una solución simple que puede resolver su problema.
Coloque el cursor al comienzo del bloque de texto que desea eliminar y realice
d50gg
.Esto eliminará todas las líneas de su posición actual a la línea 50 de su texto.
eq: si su cursor está en la línea 46 ,
d50gg
borrará 4 líneas.fuente
G
lugar de gg, ya que también funciona en vi, y por supuesto,:set number
siempre es útil para encontrar el número de línea a la que desea ir.Use el modo visual con resaltado de línea.
Prefiero este método para eliminar bloques de código porque elimina líneas enteras en comparación con simplemente usar el modo visual, donde debe colocar el cursor en la columna derecha para eliminar lo que desea.
fuente
No me gusta estar
relativenumber
encendido todo el tiempo, así que configuré mi Vim para habilitarlo solo cuando estoy en modo visual:Esto facilita su tarea:
porque después de golpear Vpuedes ver qué tan lejos está la línea objetivo.
Esto puede resultar molesto a largo plazo (el texto se desplaza hacia la derecha y hacia la izquierda cuando el número relativo está habilitado / deshabilitado), pero hasta ahora lo estoy disfrutando bastante.
fuente
v<Esc>d50j
?V
si sé que haré una operación en línea, y luego puedo dejarlod
hasta el final, para mayor confianza.Lo que funcionó muy bien para mí con
vi
::set number
para ver el número de la línea hasta donde quería borrar;Regrese a la línea donde tuvo que comenzar la eliminación
d1290G
fuente