2009-04-18 11 views
7

ReSharper tiene una bonita función llamada "ampliar selección": presionando CTRL+W (creo que es el valor predeterminado) repetidamente, selecciona más y más desde su ubicación actual de intercalación. Primero es una palabra, luego más y más palabras, una línea, un bloque interno y externo de líneas (por ejemplo un bloque if), luego una función, etc. ...¿Hay alguna forma de emular la función "extender selección" de ReSharper en Vim?

Básicamente, al presionar la combinación de teclas repetidamente, puede terminar seleccionando el archivo completo. Estoy seguro de que al menos algunos de ustedes estarán familiarizados con esto.

Acabo de empezar a aprender todas las complejidades de vim y no tengo suficiente experiencia para ver cómo algo así podría implementarse en Vim (aunque supongo que es posible). Entonces mi pregunta está dirigida a los gurús de Vim: ¿se puede hacer esto y cómo?

Actualización: un poco de una historia de fondo. He estado hablando con mi ex jefe sobre todos los beneficios de Vim, y él piensa que todo está bien. Su única pregunta/problema fue: ¿tiene "extensión de selección"? Mi pregunta hasta ahora ha sido no. Entonces, si alguien sabe la respuesta, finalmente ganaré una discusión: P (y tal vez cree un nuevo Vim convertido :-))

+1

Es sorprendente cómo nadie respondiendo aquí reconoció la necesidad de un analizador (parcial) adecuado. Resharper implementa ovbiosamente esta (gran) característica sobre un modelo lógico del código: el código DOM. Esto es también lo que permite que las refactorizaciones funcionen en las selecciones realizadas. Sin un analizador apropiado, seleccionarías 'cosas' pero no las (sub) expresiones apropiadas. Esto último sería útil, pero no está soportado actualmente en Vim _Es decir. a menos que cuentes el soporte de Lisp: 'vabababo2k' es perfecto para lisp_ :) – sehe

+0

@sehe: Estás, por supuesto, completamente en lo cierto. He estado pensando en este problema de vez en cuando desde que hice la pregunta aquí (¡parece que fue hace mucho tiempo!) y me di cuenta de que, incluso si de alguna manera logro crear esta característica, solo funcionará para un idioma específico o una familia de idiomas. Muy mal, ¿no? :) –

+0

He estado reflexionando sobre esto yo también. Estaría contento con una solución al 90% (puedo hacer refactorizaciones bastante rápido en Vim manualmente por ahora). Sin embargo, un expansor de subexpresiones-selección-selección 'utilizable' es realmente mi función de sueño no.1. Estoy convencido de que es muy posible encontrar un analizador que sea DoTheRightThing para C#, Java, C++ y C; Los únicos casos de borde adhesivo que espero son C# contra C++ 0x lambdas. Así que probablemente los dejaré por un tiempo (y me aseguraré de que sean conectables). Todavía estoy decidiendo qué usar, ya que detelo el guión de vim. Me inclino por Python, pero estoy cansado de excluir las bases de usuarios – sehe

Respuesta

3

Tuve un avance rápido en este problema. No funciona como es. Siéntete libre de hacer ediciones y publicar en la wiki de vim o como un complemento si lo refinas.

lo más probable es que te gustaría hacer AG: resharp_list para cada idioma (por ejemplo, uno de los idiomas paranthesised, etc.)

Todo lo que se necesita es un marcador de la posición original del cursor: él marcadores y una tiempo de espera autocommand que restablece el índice.

"resharp emulator 
"TODO this needs a marker 
"also c-w is bad mapping as it has a lag with all the other- 
"window mappings 
" 
let g:resharp_index = 0 

let g:resharp_select = ['iw', 'is', 'ip', 'ggVG'] 

func! ResharpSelect() 
    if g:resharp_index >= len (g:resharp_select) 
     let g:resharp_index = 0 
    endif 

    exe "norm \<esc>v" . g:resharp_select[g:resharp_index] 
    let g:resharp_index = g:resharp_index + 1 
endfun 

nnoremap <c-w> :call ResharpSelect()<cr> 
vnoremap <c-w> :call ResharpSelect()<cr> 

"Something to reset on timeout. TODO this doesn't work 
au CursorHold :let g:resharp_index = 0<cr> 
+0

¡Lo intenté, es un buen comienzo! Espero aprender el script vim un día y ampliarlo. –

+0

Para hacer esto más vim-y, probablemente debería implementar mapeos de operador. – sehe

3

La respuesta es sí. Una vez que esté en modo Visual, puede usar todos los métodos de navegación habituales y algunos adicionales.

¿Algunos de mis favoritos? Primero golpeó v mientras que en el modo normal para llegar al modo visual después haga clic en:

  1. iw - para seleccionar la palabra interior. Ideal para seleccionar una palabra mientras se excluyen las llaves o citas circundantes
  2. w - pulse varias veces para seguir seleccionando cada palabra siguiente.
  3. b - seleccione wordwise backwords
  4. ^ - seleccionar todo desde la posición actual al principio del texto en la línea
  5. $ - seleccionar todo desde la posición actual hasta el final de la línea

Estoy seguro de que otros aquí también podrían agregarse a esta lista. Ah, y no te olvides del modo Visual Block Cv pruébalo en vim con los comandos anteriores, funciona en dos dimensiones :-)

+0

Estoy relativamente familiarizado con el modo visual, pero la diferencia clave es que tienes que mover los dedos y pensar qué es lo que quieres seleccionar a continuación (o, en otras palabras, _where_ para ampliar su selección). El objetivo es fusionar todos los que secuencialmente a una sola combinación de teclas. [Espero ser lo suficientemente claro, no soy un hablante nativo de inglés] –

+0

Bueno, eso es factible en Vim, solo tendrías que escribir una función vim que pasara por varios niveles de selección, y asignara una tecla a esa función. – rampion

2

Si estás hablando de Vim (y deberías ser :-), puedes comenzar marcando texto con el comando v, luego tiene todos los comandos de movimiento del cursor estándar (y, como usted sabe, hay un lote de ellos) que extenderá la selección, así como mover el cursor.

Luego, simplemente haz lo que quieras con el texto seleccionado.

Ver here para los detalles sangrientos.

+0

El mismo comentario que para Jeremy Wall :) –

2

Uno necesitaría escribir una función que salvaría la selección actual, luego probar selecciones cada vez más amplias, hasta que la nueva selección exceda la guardada o seleccione todo el texto.Algunas de las posibles selecciones son:

  • Viw - Seleccionar palabra
  • vis - sentencia select
  • vip - seleccione el párrafo
  • VIB - seleccionar texto dentro de los corchetes más internos
  • v2iB - seleccionar texto dentro de la próxima la mayoría de los corchetes más internos
  • ggVG - seleccionar todo el texto
+0

Esto es exactamente lo que quiero decir, el único problema es que no estoy familiarizado con el lenguaje de scripting Vim. :( –

1

Creo que Jeremy Wall va en la dirección correcta. Y para avanzar un poco más en esa dirección, puede mirar el guión "surround.vim" de Tim Pope. Una buena descripción está disponible on github. O, si prefiere, consígalo llamando al vim.org. Probablemente te ayude a hacer algunas de las cosas que te gustaría hacer, aunque parece que no tiene una función para decir, simplemente seleccionando dentro de una etiqueta. Avísame si estoy equivocado.

En última instancia, lo que realmente te gustaría es una jerarquía de objetos de texto adjuntos. Deberías leer sobre objetos de texto si no lo has hecho. Una buena descripción es here. Tenga en cuenta que puede tomar múltiples objetos de una sola vez usando conteos, o hacer esto iterativamente (intente vawasap}}} desde el modo normal).

También puede obtener scripts que definan otros objetos de texto, como this one que utiliza sangría para definir un objeto de texto. Funcionará para muchos idiomas si está formateando según estándares comunes y está garantizado para Python.

Una de las molestias es que el cursor termina al final del bloque visual, por lo que, por ejemplo, no puede seleccionar fácilmente todo entre algunos(), luego obtiene el nombre de la función que los precede ...

... PERO, acabo de encontrar en this post que puede cambiar este comportamiento con o. ¡Guay!

Sospecho que se encontrará más eficiente al saltarse las selecciones intermedias en el largo plazo.

De todos modos, voy a tener curiosidad por ver si alguien más viene con una solución más general también!

+0

¡Gracias por los enlaces! Aunque yo hace una pregunta "hace mucho tiempo", la secuencia de comandos de Vim todavía parece mágica para mí :) –

Cuestiones relacionadas