Natürlich ist die Tatsache, dass Sie IDEs umgestalten können, für viele von unschätzbarem Wert. Ich mache es kaum, wenn ich programmiere, aber ich kann versuchen, es zu tun, wenn ich die Quelle eines anderen bearbeite. Wie können Sie eine so triviale Aufgabe in Vim über mehrere Dateien hinweg ausführen?
Ich habe dieses Plugin für das Refactoring von Ruby gefunden, aber wie wäre es mit "irgendeiner" Sprache?
vim
refactoring
Helmut Granda
quelle
quelle
Antworten:
Ich stimme dem Paradigma „Vim ist keine IDE“ zu. Aber es gibt Zeiten, in denen es keine IDE gibt. Folgendes verwende ich in diesen Situationen:
: grep ,: vimgrep ,: Ag ,: Ggrep
Refactoring, das mehr mit regelmäßigen Ersetzungen zu tun hat, verwende ich normalerweise : grep in meinem Projektbaum und zeichne dann ein Makro auf, um den Refactor auszuführen -: g und: s sind keine Denker. Normalerweise kann ich so eine große Anzahl von Dateien mit sehr geringem Aufwand schnell ändern. Ehrlich gesagt verwende ich diese Methode mehr als jede andere.
Abhängig von Ihrem Workflow können die integrierten Befehle langsam / unpraktisch sein. Wenn Sie git verwenden, möchten Sie das hervorragende Fugitive- Plugin und seinen
:Ggrep
Befehl verwenden, um nur Dateien zu durchsuchen, die in git eingecheckt sind. Ich mag auch den Silver Searcher wegen seiner Schnelligkeit.: argdo ,: cdo und: bufdo
: cdo und : argdo sind praktisch, um vim-Befehle über eine Reihe von Dateien auszuführen.
Befehlszeile
Wenn es schwieriger ist, die Liste der Dateien zu ermitteln, die geändert werden müssen, greife
:vimgrep
ich auf die Befehlszeile grep / find-Befehle zurück, um die Liste der Dateien, die ich umgestalten muss, genauer zu kuratieren. Speichern Sie die Liste in einer Textdatei und verwenden Sie:e
ein Mashup von Makroaufzeichnungen, um die Änderungen vorzunehmen, die ich vornehmen muss.Ich finde, je weniger verrostet ich meine Makroaufzeichnungsfähigkeiten behalte, desto nützlicher finde ich Vim für das Refactoring: Wohlfühlen beim Speichern / Wiederherstellen aus Registern, Inkrementieren / Dekrementieren von Registerzählervariablen, Bereinigen / Speichern von Makroaufzeichnungen in Dateien zur späteren Verwendung usw.
Aktualisieren
Seit dem Schreiben dieser weiteren Videocasts für die von mir beschriebenen Methoden wurden sie auf vimcasts.org veröffentlicht (ich empfehle Ihnen, ALLE Vimcasts anzusehen! ). Beachten Sie zum Refactoring die folgenden:
Vimgolf ist auch eine großartige Möglichkeit zum Üben.
Die Allgegenwart von Language Server Protocol-Servern seit ich diese Antwort geschrieben habe, hat Vim (und anderen Editoren) auch einige Refactoring-Funktionen eingebracht. IMO sind sie weit davon entfernt, die Fähigkeit zum Refactoring zu erreichen, die Sie in einer speziell entwickelten IDE sehen würden (ich verwende sie und bevorzuge Coc und ALE). Weitere Antworten auf diese Frage finden Sie unter!
quelle
Language Server Protocol (LSP)
Das Sprachserverprotokoll enthält die Funktion zum intelligenten Umbenennen von Symbolen in einem Projekt:
https://microsoft.github.io//language-server-protocol/specifications/specification-3-14/#textDocument_rename
Zum Beispiel unterstützen folgende Sprachserver dies:
Weitere Sprachserver finden Sie unter https://langserver.org/ .
Vim
Ein vim editor client ist erforderlich, um sie in vim zu verwenden. Folgende Optionen stehen zur Verfügung:
LanguageClient-neovim (benötigt Rost) schlägt die Zuordnung vor:
coc.nvim (erfordert node.js) schlägt die Zuordnung vor:
Ale hat
Ale definiert keine Tastenkombinationen. Dies muss vom Benutzer durchgeführt werden.
vim-lsp bietet den folgenden Befehl
Ähnlich wie bei Ale wird keine Zuordnung vorgeschlagen. Natürlich können Sie eine wie folgt definieren
(
<leader>r
soll durch deine Wahl ersetzt werden; ich kenne keine, über die sich die meisten Plugins einig sind)vim-lsc hat eine Standardzuordnung:
Siehe auch YouCompleteMe , das auch LSPs unterstützt.
Neovim
Neovim hat seit dem 13.11.2019 erste integrierte Unterstützung für lsp
Allgemeine Konfigurationen von LSPs finden Sie unter https://github.com/neovim/nvim-lsp
Ich konnte jedoch nicht herausfinden, wie intelligentes Umbenennen funktioniert. Wenn jemand dies weiß, aktualisieren Sie bitte diesen Abschnitt.
Andere Refactorings
Ich weiß nicht, ob es Pläne für das LSP-Protokoll gibt, komplexere Refactorings zu unterstützen, z. B. das Ändern der Klassenstruktur, das Hinzufügen von Parametern zu Methoden / Funktionen oder das Verschieben einer Methode in eine andere Klasse. Eine Liste der Refactorings finden Sie unter https://refactoring.com/catalog/ .
quelle
coc-rename
nur für den aktuellen Puffer funktioniert. Die Verwendung des exportierten Namens global im Projekt (über Dateien hinweg) wurde nicht aktualisiert.Python
Für die Python- Sprache bieten die folgenden Plugins 'intelligente' Umbenennungsfunktionen für vim:
jedi-vim
( Github )<leader>r
ropevim
( Github )CTRL-c r r
python-mode
( Github ):h pymode-rope-refactoring
quelle
C-Familie
Probieren Sie das Plugin Clighter zum Umbenennen-Refactoring für die C-Familie aus. Es basiert auf Clang, aber es gibt Einschränkungen und das Plugin ist als veraltet markiert.
Vorgeschlagene Zuordnung von Clighter ist
Beachten Sie, dass das Nachfolge-Plugin clighter8 die Umbenennungsfunktion im Commit 24927db42 entfernt hat .
Wenn Sie neovim verwenden, können Sie sich die Plugin- Klemme ansehen . Es schlägt vor
quelle
Ich habe dieses Plugin für generisches Refactoring geschrieben. Es sind noch viele Verbesserungen erforderlich. Irgendwann in der Zukunft werde ich versuchen, ctags zugunsten von Clang für C & C ++ Refactorings aufzugeben.
quelle
Vielleicht nicht die eleganteste Lösung, aber ich fand sie sehr praktisch: Ich verwende ECLIM , um VIM und Eclipse zu verbinden. Natürlich erfolgt die gesamte Bearbeitung meines Quellcodes in VIM, aber wenn es Zeit für eine Umgestaltung ist, kann man die überlegenen Funktionen von Eclipse in dieser Angelegenheit nutzen.
Versuche es.
quelle
Plugin Factorus
Es gibt ein weiteres Vim-Plugin für das Refactoring namens Factorus, das auf Github verfügbar ist .
Derzeit (2017-12) unterstützt es die Sprachen
quelle
Plugin YouCompleteMe (YCM) (20.000 Sterne auf Github)
http://ycm-core.github.io/YouCompleteMe/#the-refactorrename-new-name-subcommand
Standardmäßig gibt es keine Zuordnung.
quelle
Setzen Sie den Cursor auf den Namen, um ihn umzugestalten und einzugeben
gd(oder gDwenn Sie eine globale Variable umgestalten).
Dann
cgn neuer Name esc
und
. ein oder mehrere Male, um die nächsten Vorkommnisse umzugestalten
oder
:%norm . um alle Vorkommen im Puffer auf einmal umzugestalten.
quelle
Ich schreibe viel C / C ++ - Code in vim. Das häufigste Refactoring, das ich durchführe, ist das Umbenennen von Variablen, Klassennamen usw. Normalerweise verwende ich das
:bufdo :%s/source/dest/g
Suchen / Ersetzen in Dateien, was fast dem Umbenennen entspricht, das von großen IDEs bereitgestellt wird.In meinem Fall stellte ich jedoch fest, dass ich normalerweise ähnliche Entitäten umbenenne, die in verschiedenen Fällen geschrieben wurden (z. B. CamelCase, snake_case usw.), und entschied mich daher, ein kleines Dienstprogramm zu schreiben, um bei dieser Art der Suche nach "intelligenten Fällen" zu helfen. ersetzen, es wird hier gehostet . Es ist ein Befehlszeilenprogramm, kein Plugin für vim. Ich hoffe, Sie finden es nützlich.
quelle
Wenn Sie für das Refactoring Unite verwenden (und sollten), können Sie vim-qfreplace verwenden und es extrem einfach machen. Überprüfen Sie dieses Video , das zeigt, wie es funktioniert. Sobald Ihr Workflow festgelegt ist, können Sie einige Zuordnungen vornehmen, um ihn zu optimieren (anstatt die meisten Dinge wie im Video einzugeben).
quelle
Eine Kombination aus zwei Plugins: vim-ripgrep , um Dateien zu finden und die Ergebnisse in das Quickfix-Fenster zu stellen, und Quickfix-Reflector , um die Änderungen direkt im Quickfix-Fenster zu speichern und jede Änderung automatisch in den Dateien zu speichern.
quelle
Ich würde in Betracht ziehen, die Spacemacs-Version von Emacs zu verwenden. Es verwendet die gleichen Modi und die meisten Tastenanschläge wie Vim, verfügt jedoch aufgrund seiner Lisp-Natur über viel mehr Add-Ons. Wenn Sie in C ++ programmieren möchten, fügen Sie einfach die C ++ - Ebene hinzu und der größte Teil der IDE ist bereits für Sie eingerichtet. Für andere interpretierte Sprachen wie Python oder Bash müssen Sie keine Spacemacs hinterlassen, um sie zu verwenden. Sie haben sogar die Möglichkeit, Codeblöcke direkt in Ihrem Text auszuführen, was sich hervorragend für die literarische Programmierung oder reproduzierbare Programmierung eignet, bei der sich Code und Daten in derselben Datei befinden. Beides als Text gemacht.
Spacemacs ist in seiner anfänglichen Ladung viel schwerer zu handhaben, aber das zusätzliche Zeug, das Sie damit machen können, ist die wenigen Sekunden Startkosten wert. Ein Layer-Org-Modus ist einen Besuch wert. Es ist der beste Outliner, Programmierer, Day Timer / ToDo-Liste, den ich je benutzt habe.
quelle
Gehen
Es gibt ein Vim-Plugin https://github.com/godoctor/godoctor.vim , das sie zur Verfügung stellt
vim-go
:GoRename
.Sprachserver
gopls
quelle