Por supuesto, el hecho de que pueda refactorizar en IDE no tiene precio para muchos, casi nunca lo hago cuando estoy codificando, pero puedo intentar hacerlo cuando edito la fuente de otra persona. ¿Cómo logra una tarea tan trivial en varios archivos en Vim?
Encontré este complemento para refactorizar Ruby, pero ¿qué tal "cualquier" idioma?
vim
refactoring
Helmut Granda
fuente
fuente
Respuestas:
Estoy de acuerdo con el paradigma 'Vim no es un IDE'. Pero hay ocasiones en las que no existe un IDE. Esto es lo que uso en esas situaciones:
: grep,: vimgrep,: Ag,: Ggrep
La refactorización que tiene más que ver con los reemplazos regulares que suelo usar : grep en mi árbol de proyectos y luego grabar una macro para hacer la refactorización -: g y: s no son ideas para pensar. Por lo general, me permitirá modificar rápidamente una gran cantidad de archivos con muy poco esfuerzo. Honestamente, uso este método más que cualquier otro.
Dependiendo de su flujo de trabajo, los comandos integrados pueden ser lentos / inconvenientes. Si usa git, entonces querrá usar el excelente complemento Fugitive y su
:Ggrep
comando para buscar solo archivos registrados en git. También me gusta el Silver Searcher por su rapidez.: argdo,: cdo y: bufdo
: cdo y : argdo son útiles para ejecutar comandos vim sobre un conjunto de archivos.
línea de comando
Cuando es más difícil determinar la lista de archivos que necesitan cambios
:vimgrep
, recurro a los comandos grep / find de la línea de comandos para seleccionar más de cerca la lista de archivos que necesito refactorizar. Guarde la lista en un archivo de texto y use:e
un mashup de grabaciones de macros para realizar los cambios que necesito hacer.Encuentro que cuanto menos oxidado mantengo mis habilidades de grabación de macros, más útil encuentro a Vim para refactorizar: sentirme cómodo guardando / restaurando registros, incrementando / decrementando las variables del contador de registro, limpiando / guardando grabaciones de macros en un archivo para su uso posterior, etc.
Actualizar
Desde que escribí esto, se han publicado más videocasts de los métodos que describo en vimcasts.org (¡te animo a que veas TODOS los Vimcasts! ). Para refactorizar, mira estos:
Vimgolf también es una excelente forma de practicar.
La ubicuidad de los servidores de protocolo de servidor de idiomas desde que escribí esta respuesta también ha aportado cierta capacidad de refactorización a Vim (y a otros editores). En mi opinión, están muy lejos de igualar la capacidad de las capacidades de refactorización que vería en un IDE especialmente diseñado (los uso y prefiero coc y ALE). ¡Vea otras respuestas a esta pregunta para obtener más información!
fuente
Protocolo de servidor de idiomas (LSP)
El protocolo del servidor de idiomas contiene la función para el cambio de nombre inteligente de símbolos en un proyecto:
https://microsoft.github.io//language-server-protocol/specifications/specification-3-14/#textDocument_rename
Por ejemplo, el siguiente servidor de idioma lo admite:
Puede encontrar más servidores de idiomas en https://langserver.org/ .
Empuje
Es necesario un cliente de editor de vim para usarlos dentro de vim. Existen las siguientes opciones:
LanguageClient-neovim (requiere óxido) sugiere el mapeo:
coc.nvim (requiere node.js) sugiere la asignación:
Ale tiene
Ale no define ninguna combinación de teclas. Esto debe hacerlo el usuario.
vim-lsp proporciona el siguiente comando
Similar a Ale, no se sugiere ningún mapeo. Sin embargo, por supuesto, puede definir uno de la siguiente manera
(
<leader>r
debe ser reemplazado por su elección; no sé uno con el que estén de acuerdo la mayoría de los complementos)vim-lsc tiene una asignación predeterminada:
Consulte también YouCompleteMe, que también facilita los LSP.
Neovim
Neovim tiene soporte incorporado inicial para lsp desde el 13.11.2019
Consulte las configuraciones comunes de los LSP https://github.com/neovim/nvim-lsp
Sin embargo, no pude entender cómo funciona el cambio de nombre inteligente. Si alguien sabe esto, actualice esta sección.
Otras refactorizaciones
No sé si hay planes para que el protocolo LSP admita refactorizaciones más complejas, como cambiar la estructura de clases, agregar parámetros a métodos / funciones o mover un método a una clase diferente. Para obtener una lista de refactorizaciones, consulte https://refactoring.com/catalog/ .
fuente
coc-rename
solo funciona en el búfer actual. No actualizó el uso del nombre exportado globalmente en el proyecto (entre archivos).Pitón
Para el lenguaje Python , los siguientes complementos proporcionan capacidades de cambio de nombre 'inteligentes' para vim:
jedi-vim
( github )<leader>r
ropevim
( github )CTRL-c r r
python-mode
( github ):h pymode-rope-refactoring
fuente
Familia C
Pruebe el complemento Clighter para cambiar el nombre de la familia c. Se basa en clang, pero existen limitaciones y el complemento está marcado como obsoleto.
El mapeo sugerido por Clighter es
Tenga en cuenta que el complemento sucesor clighter8 ha eliminado la funcionalidad de cambio de nombre en el compromiso 24927db42 .
Si usa neovim, puede echar un vistazo a la abrazadera del complemento . Sugiere
fuente
Escribí este complemento para la refactorización genérica. Todavía requiere muchas mejoras. En algún momento en el futuro intentaré abandonar ctags a favor de clang para refactorizaciones de C & C ++.
fuente
Quizás no sea la solución más elegante, pero la encontré muy útil: uso ECLIM para conectar VIM y Eclipse. Por supuesto, toda la edición de mi código fuente se realiza en VIM, pero cuando llega el momento de refactorizar, uno puede aprovechar las capacidades superiores de Eclipse en este asunto.
Darle una oportunidad.
fuente
Plugin YouCompleteMe (YCM) (20k estrellas en GitHub)
http://ycm-core.github.io/YouCompleteMe/#the-refactorrename-new-name-subcommand
Por defecto no hay mapeo.
fuente
Plugin Factorus
Hay otro complemento de vim dedicado a la refactorización llamado factorus que está disponible en github .
Actualmente (2017-12), admite los idiomas
fuente
Coloque el cursor en el nombre para refactorizar y escribir
gd(o gDsi está refactorizando una variable global).
Luego
cgn nuevo nombre esc
y
. una o más veces para refactorizar la próxima (s) ocurrencia (s)
o
:%norm . para refactorizar todas las apariciones en el búfer a la vez.
fuente
Escribo mucho código C / C ++ en vim. La refactorización más común que hago es cambiar el nombre de las variables, los nombres de las clases, etc. Por lo general, utilizo
:bufdo :%s/source/dest/g
para hacer una búsqueda / reemplazo en archivos, que es casi lo mismo que el cambio de nombre proporcionado por los IDE grandes.Sin embargo, en mi caso, descubrí que generalmente cambio el nombre de entidades similares, deletreadas en diferentes casos (es decir, CamelCase, snake_case, etc.), así que decidí escribir una pequeña utilidad para ayudar con este tipo de búsqueda de "casos inteligentes" / reemplazar, está alojado aquí . Es una utilidad de línea de comandos, no un complemento para vim, espero que le resulte útil.
fuente
Para la refactorización, si está utilizando Unite (y debería hacerlo), puede utilizar vim-qfreplace y hacerlo extremadamente fácil. Mira este video que demuestra cómo funciona. Una vez que su flujo de trabajo está configurado, puede hacer algunas asignaciones para optimizarlo (en lugar de escribir la mayoría de las cosas como en el video).
fuente
Una combinación de dos complementos: vim-ripgrep , para buscar archivos y colocar los resultados en la ventana de corrección rápida, y quickfix-reflector para guardar los cambios directamente en la ventana de corrección rápida y guardar automáticamente cada cambio en los archivos.
fuente
Consideraría usar la versión spacemacs de emacs. Utiliza los mismos modos y la mayoría de las pulsaciones de teclas que Vim, pero tiene muchos más complementos debido a su naturaleza lisp. Si desea programar en C ++, simplemente agregue la capa c ++ y la mayor parte del IDE ya está configurado para usted. Para otros lenguajes interpretados como python o bash, no es necesario dejar spacemacs para usarlos. Incluso tienen una forma de ejecutar bloques de código directamente dentro de su texto, lo que funciona de manera fantástica para la programación alfabetizada o la programación reproducible donde el código y los datos están en el mismo archivo. Ambos hechos como texto.
Spacemacs es mucho más pesado en su carga inicial, pero las cosas adicionales que puede hacer con él valen la pena los pocos segundos del costo de inicio. Vale la pena echarle un vistazo al modo de organización de una capa. Es el mejor esquema, programador, temporizador diario / lista de tareas que he usado.
fuente
Vamos
Hay un complemento de vim https://github.com/godoctor/godoctor.vim que los hace disponibles
vim-go
:GoRename
.Servidor de idiomas
gopls
fuente