Ich habe aus dieser Stapelüberlauf-Frage gelernt , dass es möglich ist , einen bestimmten Bereich von Zeilennummern zu verwenden vi
/ vim
auszukommentieren. Angenommen, ich habe das folgende Bash-Skript:
#!/bin/bash
This
is
my
very
very
great
script
Nehmen wir nun an , dass ich Zeilennummern 6 bis 8 , um einen Kommentar wollen (was die Wörter enthalten very
, very
und great
) mit dem #
Kommentarzeichen. In vi
/ vim
kann ich einfach :6,8s/^/#
Folgendes eingeben:
#!/bin/bash
This
is
my
#very
#very
#great
script
die Zeilen 6 bis 8 auskommentieren.
Meine Frage ist, ist es möglich, eine ähnliche Zeile einzugeben, die das #
Kommentarzeichen aus den Zeilen 6 bis 8 entfernt (aber keine anderen kommentierten Zeilen in der Datei)?
Nachdem ich das gesagt habe, stelle ich fest, dass es eine Debatte darüber gibt, ob ich tatsächlich benutze vi
oder vim
. In der Praxis öffne ich eine Datei script.sh
mit dem Befehl vi script.sh
. Auch wenn ich den Befehl eingebe which vi
, erhalte ich /usr/bin/vi
. Wenn ich jedoch einfach tippe vi
und drücke Enter, erhalte ich Folgendes:
~ VIM - Vi IMproved
~
~ version 7.2.330
~ by Bram Moolenaar et al.
~ Vim is open source and freely distributable
~
~ Sponsor Vim development!
~ type :help sponsor<Enter> for information
~
~ type :q<Enter> to exit
~ type :help<Enter> or <F1> for on-line help
~ type :help version7<Enter> for version info
Das scheint darauf hinzudeuten, dass ich tatsächlich benutze vim
. Ich greife mit SSH von meinem PC auf einen entfernten Ubuntu Linux-Cluster zu. Ich benutze kein Ubuntu Linux GUI.
NERD Commenter
ist der Weg hierher meiner Meinung nach! +1 für dasIch weiß, dass Ihre Frage die Verwendung von
vi
oder spezifiziert,vim
aber hier sind einige andere Optionen, um dies zu tun, ohne die Datei manuell öffnen zu müssen:Perl
Perl-Version> = 5.10
Dadurch wird der Inhalt der Datei ausgedruckt. Sie können entweder zu einer anderen (
> new_file.sh
) umleiten oderi
die Datei direkt bearbeiten:sed
Verwenden Sie erneut Folgendes, um die ursprüngliche Datei zu bearbeiten
i
:awk
/gawk
etc:Pure
bash
:quelle
vi
ist ein symbolischer Link zu denvim
meisten GNU / Linux-Distributionen. Sie verwenden ihn also tatsächlich,vim
wenn Sie tippenvi
.Um die Kommentare zu entfernen, können Sie Folgendes eingeben:
:6,8s/^#//
oder ein:6,8s/^\s*#//
vorangestelltes Leerzeichen vor dem#
Symbol entfernen .quelle
:6,8s/^#//
und6,8s/^\s*#//
?Sie verwenden wahrscheinlich
vim.tiny
. In jedem Fall können Sie die ersten Kommentare entfernen mit:Wenn Sie sie auf eine andere Weise einfügen (z. B. mit einem zusätzlichen Leerzeichen), müssen Sie möglicherweise alle anderen Elemente entfernen. Mit full vim ist es einfacher, Spalten visuell auszuwählen und Zeichen einzufügen / zu löschen, um dasselbe zu tun.
quelle
Persönlich benutze ich am liebsten den visuellen Block-Modus
ctrl+ vUm in den visuellen Blockmodus zu gelangen, wählen Sie mit den Pfeiltasten oder hjkl die Zeilen aus und drücken Sie xoder del.
Willst du sie zurück?
ctrl+ vTreffen Sie die Auswahl, dann I(Großbuchstaben i)#Esc
quelle
AFAIK, vi ist heutzutage normalerweise ein Symlink von vim (versuchen Sie
which vi
odertype vi
und folgen Sie dann den Symlinks). Vielleicht sogar/usr/bin/vi
->/etc/alternatives/vi
->/usr/bin/vim.basic
.Um mehrere Kommentarzeilen zu entfernen, bevorzuge ich es, einen vertikalen Block über auszuwählen CtrlVund zu löschen. Wenn Sie einen Kommentar Symbol auf mehrere Zeilen hinzufügen müssen, könnten Sie CtrlV, dann ShiftIgeben #und Esc, und ein Kommentar auf mehrere Zeilen hinzugefügt werden.
quelle
Die obigen Antworten verwenden
sind perfekte Lösung, aber etwas umständlich zu tippen. Dies kann vereinfacht werden, indem neue Befehle in definiert werden
~/.vimrc
.Und Sie können einfach tippen
Befehl platzieren / löschen.
Wenn Sie den visuellen Modus mögen, können Sie Karten definieren
Damit müssen Sie nur einen Linienbereich im visuellen Modus auswählen F7und F8auf und drücken , um Kommentare einzufügen bzw. zu entfernen.
quelle
Diese Antwort ist hier auf 1) den richtigen Code zeigen , in eine Paste
.vimrc
zu erhaltenvim 7.4+
Block zu tun zu kommentieren / uncommenting während Einrückungsebene mit 1 Verknüpfung im visuellen Modus zu halten und 2) es zu erklären.Hier ist der Code:
Wie es funktioniert:
let b:commentChar='//'
: Dies erstellt eine Variable in vim. Dasb
hier bezieht sich auf den Gültigkeitsbereich, der in diesem Fall im Puffer enthalten ist, dh die aktuell geöffnete Datei. Ihre Kommentarzeichen sind Zeichenfolgen und müssen in Anführungszeichen gesetzt werden. Die Anführungszeichen sind nicht Teil dessen, was beim Umschalten von Kommentaren ersetzt wird.autocmd BufNewFile,BufReadPost *...
: Autocommands lösen verschiedene Dinge aus. In diesem Fall werden diese ausgelöst, wenn eine neue Datei oder die gelesene Datei mit einer bestimmten Erweiterung endet. Nach dem Auslösen führen Sie den folgenden Befehl aus, mit dem Sie dencommentChar
Dateityp ändern können. Es gibt andere Möglichkeiten, dies zu tun, aber sie sind für Anfänger (wie mich) verwirrender.function! Docomment()
: Funktionen werden durch Beginnen mitfunction
und Beenden mit deklariertendfunction
. Funktionen müssen mit einem Großbuchstaben beginnen. das!
gewährleistet , dass diese Funktion alle vorherigen Funktionen überschreibt definiert alsDocomment()
mit dieser Version vonDocomment()
. Ohne!
hatte ich Fehler, aber das könnte daran liegen, dass ich neue Funktionen über die vim-Befehlszeile definierte.execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
: Execute ruft einen Befehl auf. In diesem Fall wird ausgeführtsubstitute
, was einen Bereich annehmen kann (standardmäßig ist dies die aktuelle Zeile), z. B.%
für den gesamten Puffer oder'<,'>
für den hervorgehobenen Abschnitt.^\s*
ist regulär, um mit dem Anfang einer Zeile übereinzustimmen, gefolgt von einer beliebigen Anzahl von Leerzeichen, die dann (aufgrund von&
) angehängt werden . Das.
hier wird für die Verkettung von Zeichenfolgen verwendet, daescape()
es nicht in Anführungszeichen eingeschlossen werden kann.escape()
Ermöglicht es Ihnen, ZeichencommentChar
, die mit den Argumenten übereinstimmen (in diesem Fall\
und/
), zu maskieren, indem Sie ihnen ein voranstellen\
. Danach verketten wir wieder mit dem Ende unserersubstitute
Zeichenkette, die das hate
Flagge. Dieses Flag lässt uns stillschweigend scheitern, was bedeutet, dass wir nicht darüber schreien, wenn wir in einer bestimmten Zeile keine Übereinstimmung finden. Insgesamt können Sie in dieser Zeile ein Kommentarzeichen gefolgt von einem Leerzeichen vor dem ersten Text einfügen, um die Einrückungsstufe beizubehalten.execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
: Dies ist ähnlich wie bei unserem letzten großen langen Befehl. Einzigartig an diesem haben wir\v
, der sicherstellt, dass wir uns nicht entziehen müssen()
, und1
der sich auf die Gruppe bezieht, die wir mit unserem gemacht haben()
. Grundsätzlich stimmen wir mit einer Zeile überein, die mit einer beliebigen Anzahl von Leerzeichen beginnt, gefolgt von unserem Kommentarzeichen und einer beliebigen Anzahl von Leerzeichen. Wir behalten nur den ersten Satz von Leerzeichen bei.e
Lassen Sie uns erneut unbemerkt scheitern, wenn in dieser Zeile kein Kommentarzeichen steht.let l:line=getpos("'<")[1]
: dies setzt eine Variable, ähnlich wie wir es mit unserem Kommentarzeichen gemacht haben,l
bezieht sich jedoch auf den lokalen Gültigkeitsbereich (lokal für diese Funktion).getpos()
Ruft die Position des Beginns unserer Hervorhebung ab und[1]
bedeutet, dass wir uns nur um die Zeilennummer kümmern, nicht um andere Dinge wie die Spaltennummer.if match(getline(l:line), '^\s*'.b:commentChar)>-1
: Sie wissen, wie esif
funktioniert.match()
prüft, ob das Erste das Zweite enthält, also greifen wir zu der Zeile, in der wir mit der Hervorhebung begonnen haben, und prüfen, ob sie mit einem Leerzeichen beginnt, gefolgt von unserem Kommentarzeichen.match()
Gibt den Index zurück, in dem dies zutrifft und-1
wenn keine Übereinstimmungen gefunden wurden. Daif
alle Zahlen ungleich Null als wahr ausgewertet werden, müssen wir unsere Ausgabe vergleichen, um festzustellen, ob sie größer als -1 ist. Der Vergleich invim
gibt 0 zurück, wenn er falsch ist, und 1, wenn erif
richtig ist.vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>
:vnoremap
bedeutet, den folgenden Befehl im visuellen Modus abzubilden, aber nicht rekursiv abzubilden (dh keine anderen Befehle zu ändern, die auf andere Weise verwendet werden könnten). Grundsätzlich sollten Sie als Anfänger immernoremap
darauf achten, dass Sie nichts kaputt machen.<silent>
bedeutet "Ich will nicht deine Worte, nur deine Taten" und weist es an, nichts in die Befehlszeile zu drucken.<C-r>
ist das, was wir mappen, was in diesem Fall Strg + R ist (beachten Sie, dass Sie mit diesem Mapping Cr im normalen Modus immer noch normal für "Wiederherstellen" verwenden können).C-u
Das ist ein bisschen verwirrend, aber im Grunde stellt es sicher, dass Sie Ihre visuelle Hervorhebung nicht aus den Augen verlieren (laut dieser Antwort startet Ihr Befehl mit'<,'>
dem, was wir wollen).call
Hier wird vim lediglich angewiesen, die von uns benannte Funktion auszuführen, und es wird<cr>
auf das Drücken derenter
Schaltfläche verwiesen. Wir müssen es einmal drücken, um die Funktion tatsächlich aufzurufen (ansonsten haben wir nurcall function()
die Befehlszeile eingegeben , und wir müssen es erneut drücken, damit unsere Stellvertreter den ganzen Weg durchlaufen (nicht wirklich sicher, warum, aber was auch immer).Wie auch immer, hoffentlich hilft das. Dies nimmt alles mit
v
,V
oderC-v
überprüft, ob die erste Zeile kommentiert ist. Wenn ja, kommentieren Sie alle markierten Zeilen aus und fügen Sie, falls nicht, jeder Zeile eine zusätzliche Ebene mit Kommentarzeichen hinzu. Das ist mein gewünschtes Verhalten; Ich wollte nicht nur, dass es umschaltet, ob jede Zeile im Block kommentiert wurde oder nicht, deshalb funktioniert es perfekt für mich, nachdem ich mehrere Fragen zu diesem Thema gestellt habe.quelle
Dort wird dieses lebensverändernde Plugin
tpope
genanntvim-commentary
https://github.com/tpope/vim-commentary
Dieses Plugin bietet :
Verwendung :
:
welcher als angezeigt wird:<,'>
:<,'>Commentary
und drücken Sie die Eingabetaste.quelle