¿Cómo invertir la selección en vim?


12

Después de seleccionar un rango de líneas con el Vcomando, me gustaría eliminar cada línea del archivo que NO está seleccionada, entonces, ¿es una forma de invertir la selección? ¿Seleccionar cada línea que no está seleccionada?

Como que

:g!/FOO/d

elimina cada línea que NO contiene FOO .

Si tuviera un rango en mente y quisiera usar su inverso:

'a,'b

Necesitaría usar los dos rangos:

1,'a-1

y

'b+1,$

Sospecho que esto no se puede hacer en un solo paso, ¡pero sería bueno!


entonces, ¿quieres una operación de estilo de "recorte"?
quack quijote

Respuestas:


7

Primero cree la siguiente asignación (por ejemplo, vinculada a la <F4>clave)

map <F4> :<C-U>1,'<-1:delete<CR>:'>+1,$:delete<CR>

luego, después de seleccionar un rango en modo visual, simplemente presione <F4>para activar el comando asociado. El comando se puede explicar fácilmente en partes:

  • " :" Ingrese al modo de línea de comando.
  • " <C-U>" Elimina todos los caracteres entre la posición del cursor y el comienzo de la línea.
  • " 1,'<-1" Especifique el rango desde la primera línea del archivo hasta la línea anterior al inicio de la selección actual.
  • " :delete<CR>" Eliminar (el rango de líneas previamente especificado).
  • " :'>+1,$:delete<CR>" Eliminar las líneas en el rango " '>+1,$", es decir, desde la línea después del final de la selección hasta el final del archivo.

2
solo para explicarlo: 1, '<- 1 es el rango desde la línea 1 hasta el comienzo de la selección. '> + 1, $ es el rango de 1 línea después de la selección hasta el final ...
Akira

¿Hay alguna forma de hacerlo con un solo comando "eliminar"?
Kevin Panko

1
@ Kevin Panko: necesitaría combinar los rangos en una sola expresión. He mirado los documentos y no creo que la sintaxis de rango sea compatible. vimdoc.sourceforge.net/htmldoc/cmdline.html#cmdline-ranges ,,, vim.wikia.com/wiki/Ranges
quack quixote

15
  1. selecciona tu texto
  2. "*yggdG"*p lo que significa ...

    "*y    " yank it to the selection register
    ggdG   " delete everything
    "*p    " and paste the selection again 
    

99
ygg "_dGP es el mismo pero más corto.
Kevin Panko

1
al final obtienes el mismo texto, cierto :)
akira el

Me gustaría referirme a las respuestas de akira y Kevin Panko (no puedo agregar comentarios). "[o] opuesto [d] elete en (v) modo manual vmap od ygg" _dGP
Marcin Rogacki

Complementos como github.com/maxbrunsfeld/vim-yankstack facilitan este enfoque. No tiene que preocuparse tanto por la eliminación de su registro de extracción.
Jack O'Connor

¿Cómo se puede agregar esto como asignación de teclado .vimrc? He intentado algunos intentos pero aún no lo he conseguido. Mis intentos fueron map <F4> n"*yggdG"*p ynmap <F4> "*yggdG"*p
Brad Parks

7

Solo para la posteridad:

:v/\%V/d

Eso hace un inverso global en líneas que no son parte de la selección. Tenga en cuenta que: v es una construcción basada en líneas, por lo que cualquier línea que contenga parte de la selección, ya sea línea, secuencia o selección de bloque, se evitará la eliminación.


1

dado que 'invertir' significa básicamente crear 'multiselecciones' (el área antes y después de la selección original) volví a buscar en los vimscripts http://www.vim.org/scripts/script.php?script_id=953 . prueba esto.

 There are a number of operations to very
 easily manipulate selections such as modifying 
 the regions (add/delete/inverte/clear), hiding, 
 refreshing, saving and restoring etc."
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.