it-swarm.com.de

Umgestaltung in Vim

Natürlich ist die Tatsache, dass Sie IDEs umgestalten können, für viele von unschätzbarem Wert. Ich mache das fast nie, wenn ich programmiere, aber ich versuche es, wenn Sie die Quelle eines anderen bearbeiten. Wie erledigen Sie eine so triviale Aufgabe für mehrere Dateien in Vim?

Ich habe dieses Plugin für das Refactoring von Ruby gefunden, aber wie wäre es mit "irgendeiner" Sprache?

76
Helmut Granda

Ich stimme dem 'Vim is a IDE' Paradigma zu. Es gibt jedoch Zeiten, in denen es keine IDE gibt. Ich verwende in solchen Situationen Folgendes:

: grep,: vimgrep,: Ag,: Ggrep

Refactoring, das mehr mit regulären Ersetzungen zu tun hat, benutze ich normalerweise in meinem Projektbaum : grep und dann ein Makro aufzeichnen um den Refactor zu machen -: g und: s sind keine Brainers. Normalerweise kann ich so schnell und ohne großen Aufwand eine große Anzahl von Dateien ändern. Ehrlich gesagt verwende ich diese Methode mehr als jede andere.

Abhängig von Ihrem Workflow sind die integrierten Befehle möglicherweise langsam/unpraktisch. Wenn Sie git verwenden, möchten Sie das ausgezeichnete 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 über :vimgrep geändert werden müssen, greife ich auf die Befehlszeilenbefehle grep/find zurück, um die Liste der Dateien, die ich umgestalten muss, genauer zu sortieren. Speichern Sie die Liste in einer Textdatei und verwenden Sie :e und einen Mashup von Makroaufzeichnungen, um die erforderlichen Änderungen vorzunehmen.

Ich finde, je weniger verrostet ich meine Makroaufzeichnungsfähigkeiten halte, desto nützlicher finde ich Vim für das Refactoring: Sich beim Speichern/Wiederherstellen von Registern wohlfühlen, Registerzählervariablen inkrementieren/dekrementieren, Makroaufzeichnungen für spätere Verwendung in einer Datei speichern/speichern usw.


Update

Seit dem Schreiben dieser mehr Videocasts für die von mir beschriebenen Methoden wurden sie auf vimcasts.org veröffentlicht (ich möchte Sie bitten, ALLE Vimcasts! zu sehen). Für das Refactoring sollten Sie folgende beachten:

Vimgolf ist auch eine großartige Art zu üben.

63
dsummersl

C-Familie

  1. Probieren Sie das Plugin Clighter aus, um die c-Familie umzubenennen. Es basiert auf Clang, aber es gibt Einschränkungen und das Plugin wird als veraltet markiert.

    Vorgeschlagenes Mapping durch Clighter ist

    nmap <silent> <Leader>r :call clighter#Rename()<CR>
    

    Beachten Sie, dass das Nachfolge-Plugin clighter8 die Umbenennungsfunktion im commit 24927db42 entfernt hat.

  2. Wenn Sie neovim verwenden, können Sie das Plugin clamp betrachten. Es schlägt vor

    nmap <silent> <Leader>r :call ClampRename()<CR>
    
12
BB Chung

Python

Für die Sprache python bieten folgende Plugins intelligente Umbenennungsfunktionen für vim:

  • jedi-vim ( github ) <leader>r
  • ropevim ( github ) CTRL-c r r
  • python-mode ( github ) :h pymode-rope-refactoring
10
Hotschke

Ich habe dieses Plugin für generisches Refactoring geschrieben. Es bedarf noch vieler Verbesserungen. Irgendwann in der Zukunft werde ich versuchen, Ctags zugunsten von Clang für C & C++ - Refactorings aufzugeben.

5
Luc Hermitte

Vielleicht nicht die eleganteste Lösung, aber ich fand es sehr praktisch: Ich verwende ECLIM , um VIM und Eclipse zu verbinden. Natürlich wird mein Quellcode in VIM bearbeitet, aber wenn es Zeit ist, umzustrukturieren, kann man die hervorragenden Möglichkeiten von Eclipse in dieser Angelegenheit nutzen.

Versuche es.

4
fjrg76

Sprachserverprotokoll (LSP)

Dedizierte Sprachserver ermöglichen auch das Umbenennen. Z.B.

Ein vim Editor-Client ist erforderlich. Derzeit gibt es folgende Optionen:

  1. https://github.com/autozimu/LanguageClient-neovim die folgende Zuordnung für die Umbenennung vorschlägt:

    nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>
    
  2. https://github.com/prabirshrestha/vim-lsp das den folgenden Befehl enthält

    :LspRename
    
  3. https://github.com/natebosch/vim-lsc Ich konnte keine Unterstützung für die Umbenennung finden, aber ich würde erwarten, dass dies hinzugefügt wird.

3
Hotschke

Plugin Factorus

Es gibt ein weiteres vim-Plugin für das Refactoring mit dem Namen factorus, das unter github verfügbar ist.

Derzeit (2017-12) unterstützt es die Sprachen

  • c,
  • Java und
  • python.
3
Hotschke

Plugin YouCompleteMe (YCM) (15k Sterne auf Github)

:h RefactorRename-new-name

Der RefactorRename <new name>-Unterbefehl

Bei unterstützten Dateitypen versucht dieser Befehl, eine semantische Umbenennung durchzuführen des Bezeichners unter dem Cursor. Dies beinhaltet das Umbenennen von Deklarationen Definitionen und Verwendungen des Bezeichners oder jede andere für die Sprache geeignete Sprache Aktion. Das spezifische Verhalten wird durch die verwendete semantische Engine definiert.

Ähnlich wie bei | FixIt | werden mit diesem Befehl automatische Änderungen an Ihrem .__ vorgenommen. Quelldaten. Umbenennungsvorgänge können Änderungen an mehreren Dateien beinhalten, die kann zu diesem Zeitpunkt in Vim-Puffern offen sein. YouCompleteMe behandelt alle davon für dich. Das Verhalten wird im folgenden Abschnitt beschrieben.

In Dateitypen unterstützt: 'javascript' (nur Variablen), 'TypeScript'

Standardmäßig gibt es keine Zuordnung. Natürlich können Sie auch eine definieren, wenn Sie möchten.

2
Hotschke

Ich schreibe viel C/C++ - Code in vim. Das häufigste Refactoring, das ich mache, ist das Umbenennen von Variablen, Klassennamen usw. Normalerweise verwende ich :bufdo :%s/source/dest/g, um Suchen/Ersetzen in Dateien durchzuführen. Dies ist fast dasselbe wie das Umbenennen, das von großen IDEs bereitgestellt wird.
In meinem Fall habe ich jedoch festgestellt, dass ich normalerweise ähnliche Entitäten umbenenne, die in verschiedenen Fällen buchstabiert sind (z. B. CamelCase, snake_case usw.). Daher habe ich mich dazu entschlossen, ein kleines Hilfsprogramm zu schreiben, um bei dieser Art von "smart-case" zu helfen "Suchen/Ersetzen, es wird gehostet hier . Es ist ein Befehlszeilenprogramm, kein Plugin für vim. Ich hoffe, Sie finden es nützlich.

1
dkrikun

Wenn Sie Unite verwenden, sollten Sie vim-qfreplace verwenden, um das Refactoring zu vereinfachen. Überprüfen Sie dieses Video das zeigt, wie es funktioniert. Sobald Ihr Workflow eingerichtet ist, können Sie einige Zuordnungen vornehmen, um ihn zu optimieren (anstatt die meisten Dinge wie im Video einzugeben).

0
BenC

Eine Kombination aus zwei Plugins: vim-ripgrep , um Dateien zwischen den Dateien zu suchen und die Ergebnisse in das Quickfix-Fenster zu übernehmen, und Quickfix-Reflector , um die Änderungen direkt im zu speichern Quickfix-Fenster und lassen Sie jede Änderung automatisch in den Dateien speichern.

0
Jason

Ich würde die Verwendung der Spacemacs-Version von Emacs in Betracht ziehen. Es verwendet die gleichen Modi und die meisten Tastatureingaben wie Vim, bietet jedoch aufgrund seiner LISP-Eigenschaften viel mehr Add-On. Wenn Sie in C++ programmieren möchten, fügen Sie einfach die C++ - Ebene hinzu, und die meisten IDE sind bereits für Sie eingerichtet. Für andere interpretierte Sprachen wie Python oder Bash müssen Sie keine Spacemacs verlassen, um sie verwenden zu können. Sie haben sogar die Möglichkeit, Codeblöcke direkt in Ihrem Text auszuführen. Dies ist hervorragend für die Programmierung von Programmierkenntnissen oder für reproduzierbare Programmierung, bei der sich Code und Daten in derselben Datei befinden. Beides als Text.

Spacemacs ist viel härter in der Anfangslast, aber die zusätzlichen Dinge, die Sie damit machen können, sind die wenigen Sekunden des Startens wert. Ein Layer-Organisationsmodus lohnt sich. Es ist der beste Outliner, Programmierer, Tagestimer/ToDo-Liste, den ich je benutzt habe. 

0
C. Kelly Osborn