Wie kann ich Bash-Skripte in Vim hervorheben?

76

Mein Vim-Editor hebt automatisch PHP-Dateien ( vim file.php), HTML-Dateien ( vim file.html) usw. hervor.

Aber wenn ich tippe: vim fileund darin ein Bash-Skript schreibe, wird es nicht hervorgehoben.

Wie kann ich Vim anweisen, es als Bash-Skript hervorzuheben?

Ich beginne #!/bin/bashoben in der Datei zu tippen, aber es funktioniert nicht.

Never_had_a_name
quelle

Antworten:

86

Geben Sie dem Shell-Skript korrekt eine .shErweiterung? Die automatische Syntaxauswahl von Vim basiert fast vollständig auf der Erkennung von Dateinamen (Erweiterungen). Wenn für eine Datei keine Syntax festgelegt ist (oder die falsche Syntax ist), wechselt Vim nicht automatisch zur richtigen Syntax, nur weil Sie mit der Eingabe eines Skripts in einer bestimmten Sprache begonnen haben.

Als vorübergehende Problemumgehung aktiviert der Befehl :set syn=shdie Hervorhebung der Shell-Skript-Syntax.

Mark Rushakoff
quelle
4
Aber die meisten Skripte haben keine .sh-Erweiterung? sollte ich es als .sh-Erweiterung verwenden, damit es funktioniert? Ist es empfehlenswert, Ihre Skripte zu benennen? und seine Bash ... also ist es immer noch .sh?
nie_had_a_name
3
@ajsie: Ich bin nicht sicher, welche Skripte Sie verwenden, aber die meisten bashSkripte, auf die ich stoße, haben tatsächlich ein .shSuffix. Um Bash wirklich zu spezifizieren und nicht nur sh, würden Sie die #!/bin/bashShebang-Zeile in einer .shDatei verwenden.
Mark Rushakoff
5
@MarkRushakoff, Bash-Skripten eine .shErweiterung zu geben, wird in vielen Kreisen als schlechte Form angesehen. Siehe zum Beispiel den faktoiden Bot, der vom relevanten Eintrag des Freenode # bash-Kanals verwendet wird: Wooledge.org/~greybot/meta/.sh
Charles Duffy
4
... um zu zitieren: "Verwenden Sie keine Erweiterungen für Ihre Skripte. Skripte definieren neue Befehle, die Sie ausführen können, und Befehle erhalten im Allgemeinen keine Erweiterungen. Führen Sie sie aus ls.elf? Außerdem: Bash-Skripte sind keine sh-Skripte (also nicht use .sh) und die Erweiterung verursachen nur dann Kopfschmerzen bei Abhängigkeiten, wenn das Skript in einer anderen Sprache umgeschrieben wird. Siehe talisman.org/~erlkonig/documents/… "
Charles Duffy
3
... Erweiterungen von Shell-Skripten werden allgemein als gute Idee akzeptiert, wenn ein Skript als Bibliothek verwendet werden soll (genau wie man eine .pyErweiterung für Python- Module verwendet, aber keine Python- Skripte im PATH) - aber in diesem Fall Die Erweiterung sollte korrekt wiedergeben, von welcher Shell das Skript korrekt analysiert werden kann. .shimpliziert "kompatibel mit allen POSIX-Shells", was für ein Bash- Skript im Allgemeinen nicht korrekt ist .
Charles Duffy
37

Die bisherigen Antworten sind korrekt, sodass Sie den Dateityp mit der Erweiterung (like .sh) oder einer Shebang-Zeile (like #!/bin/bash) identifizieren können. Wenn Sie keine haben, können Sie den Dateityp dennoch manuell angeben, indem Sie einen Modeline-Kommentar oben oder unten in Ihrer Datei verwenden.

Wenn Sie beispielsweise ein Skript ohne Erweiterung als Shell-Skript identifizieren möchten, können Sie diesen Kommentar oben in Ihre Datei einfügen:

# vim: set filetype=sh :

oder

# vim: filetype=sh

Dadurch wird vim angewiesen, die Datei als Shell-Skript zu behandeln. (Sie können auch andere Dinge in der modeline einstellen. In vim geben Sie :help modelinefür weitere Informationen ein.)

Bryant
quelle
Interessanterweise :funktioniert diese Modeline in meiner Umgebung im Finale , während diese Modeline ohne das Finale :nicht registriert wird. Die Hilfedokumentation zeigt eine Form einer Modeline, die nicht endet :.
Orluke
Das ist interessant. Die Hilfedokumentation (mit :help modeline) zeigt zwei Unterschiede: (1) Die Version mit dem Finale :"ist mit einigen Versionen von Vi kompatibel" und (2) ohne das Finale verwenden :Sie das setSchlüsselwort nicht. Da Sie nach der Modeline einen beliebigen Text einfügen können, :funktioniert das Finale mit oder ohne setSchlüsselwort.
Bryant
2
Wenn die Modeline keine Wirkung zu haben scheint, versuchen Sie set modelinein ~/.vimrc, sehen Sie diese Antwort
Tino
2
Wie ich bei der anderen Antwort bemerkt habe, die dies nahelegt, shscheint die POSIX-Shell hervorzuheben, nicht Bash. Insbesondere kennzeichnet es eine gültige Bash-Syntax als Fehler, was ziemlich ärgerlich ist.
Thanatos
23

Tatsächlich ist das Hervorheben der Syntax ein Merkmal von vim not vi. Versuchen Sie es mit dem Befehl vim und tun Sie es dann

:syntax on.

Gaurav Khare
quelle
1
Für mich auch. Sie können Ihrer .vimrc-Datei die Zeile "Syntax ein" hinzufügen.
2.
4
Dies war die Lösung für mich unter Mac OS X 10.10.3. Fügte eine .vimrc-Datei zu meinem Home-Verzeichnis vim ~/.vimrchinzu und fügte syntax onsie der Datei hinzu und schloss sie dann mit:x
James Owers
18

Ich kam zu dieser Antwort und suchte speziell nach Informationen zum Hervorheben der bashSyntax, nicht der POSIX-Shell. Wenn Sie einfach ein set ft=sh(oder ein gleichwertiges) Verfahren ausführen, wird die Datei für die POSIX-Shell hervorgehoben, wodurch eine Menge Syntax übrig bleibt, die bashin rot hervorgehoben gültig ist . So erhalten Sie eine Bash-Hervorhebung:

" Set a variable on the buffer that tells the sh syntax highlighter
" that this is bash:
let b:is_bash = 1
" Set the filetype to sh
set ft=sh

Beachten Sie, dass Sie den Befehl weiterhin benötigen , wenn dies ftbereits shder setFall ist. ansonsten derlet nicht sofort wirksam.

Sie können dies zu einem globalen Standard machen, indem Sie die Variable global machen, d let g:is_bash = 1. H.

:help ft-sh-syntaxist die Handbuchseite, die ich finden musste; Es erklärt dies und wie das Hervorheben anderer Geschmacksrichtungen der Schale ausgelöst wird.

Thanatos
quelle
Einige Versionen des shSyntax-Textmarkers markieren sogar gültigen Posix-Sh-Code als ungültig (z. B. $(subshell)) - dies korrigiert dies ebenfalls. Vielen Dank.
Mahmoud Al-Qudsi
15

Vim kann Dateitypen auch erkennen, indem es deren Inhalt überprüft (z. B. wenn die erste Zeile einen Bash Shebang enthält). Hier ist ein Zitat aus filetype.txt Hilfedatei:

Wenn Ihr Dateityp nur durch Überprüfen des Inhalts der Datei erkannt werden kann

Erstellen Sie Ihr Benutzer-Laufzeitverzeichnis. Normalerweise verwenden Sie das erste Element der Option 'Laufzeitpfad'. Beispiel für Unix:

:!mkdir ~/.vim

Erstellen Sie dazu eine vim-Skriptdatei. Beispiel:

if did_filetype()   " filetype already set..
    finish      " ..don't do these checks
endif
if getline(1) =~ '^#!.*\<mine\>'
    setfiletype mine
elseif getline(1) =~? '\<drawing\>'
    setfiletype drawing
endif

Weitere Beispiele finden Sie unter $ VIMRUNTIME / scripts.vim. Schreiben Sie diese Datei als "scripts.vim" in Ihr Benutzer-Laufzeitverzeichnis. Zum Beispiel für Unix:

:w ~/.vim/scripts.vim

Die Erkennung funktioniert sofort, Vim muss nicht neu gestartet werden.

Ihre Datei scripts.vim wird geladen, bevor die Standardprüfung nach Dateitypen erfolgt. Dies bedeutet, dass Ihre Regeln die Standardregeln in $ VIMRUNTIME / scripts.vim überschreiben.

Matteo Riva
quelle
1
Ich habe versucht, dies in .vimrc und .vim / scripts.vim einzufügen, aber beides hat nicht funktioniert. Es funktioniert nur, wenn ich die Befehle manuell eingebe, nachdem ich vim gestartet habe. Was mache ich falsch?
Eddy
@ Eddie Wahrscheinlich brauchen Sie set modelinein ~/.vimrc, siehe diese Antwort
Tino
9

vim erkennt man am obersten Kommentar

Versuchen Sie diese Zeile oben in der Datei

#!/bin/sh
Arun Karikalan
quelle
1
Sie haben das Stammverzeichnis '/' zwischen '!' und B'.
Am
1
sieht aus wie dies behoben wurde. Dies ist meiner Meinung nach die beste Antwort.
Lacostenycoder
2

Wenn Sie den Shebang oben in der Datei hinzugefügt haben, speichern Sie ihn und laden Sie ihn erneut (z :w|e ). Die Syntaxfarbe kann aktiviert werden.

Siehe auch Vim inkonsistente Syntax, die Bash-Dateien hervorhebt . Die akzeptierte Antwort kann ebenfalls hilfreich sein.

Dash-Tom-Bang
quelle
1

Für diejenigen, die eine Variante dieser Frage haben, dh wie man die Syntaxhervorhebung für Bash-Dateien ohne aktiviert .sh Erweiterung beim Öffnen automatisch ...

Fügen Sie filetype onin Ihrem .vimrc. Dies ermöglicht die Dateityperkennung, indem auch der Inhalt der Datei berücksichtigt wird. Beispielsweise werden Bash-Skripte auf den shDateityp gesetzt. Wenn Sie jedoch eingeben, #!wird die Dateityperkennung für eine neue Datei, die mit vim erstellt wurde, nicht ausgelöst. set ft=shIn diesem Fall müssen Sie sie verwenden . Für weitere Informationen , geben Sie :h filetypein vim.

Wie in den Kommentaren erwähnt, müssen Sie dies in Verbindung mit verwenden syntax enable, um die Hervorhebung zu aktivieren .

Oder du könntest verwenden :filetype detect. Aus dem Dokument:

Verwenden Sie diese Option, wenn Sie mit einer leeren Datei und eingegebenem Text begonnen haben, mit dem der Dateityp erkannt werden kann. Wenn Sie dies beispielsweise in ein Shell-Skript eingegeben haben: "#! / Bin / csh".

Mudassir
quelle
1
Der Befehl ist filetype onohne Einstellung, und Sie müssen auch die syntax enableHervorhebung aktivieren.
D. Ben Knoble
0

vim erkennt standardmäßig bereits viele Dateitypen. Die meisten von ihnen arbeiten mit Dateierweiterungen, aber in einem solchen Fall analysiert vim auch den Inhalt der Datei, um den richtigen Typ zu erraten.

vim setzt den Dateityp für bestimmte Dateinamen wie .bashrc, .tcshrcusw. automatisch. Aber eine Datei mit einem.sh Erweiterung wird jedoch entweder als csh-, ksh- oder bash-Skript erkannt. Um festzustellen, um welche Art von Skript es sich genau handelt, liest vim die erste Zeile der Datei, um das #! Linie.

Wenn die erste Zeile das Wort enthält bash, wird die Datei als Bash-Skript identifiziert. Normalerweise sehen Sie, #!/bin/bashob das Skript direkt ausgeführt werden soll, aber für eine Shell-Konfigurationsdatei # bashwürde auch die Verwendung einer einfachen Datei funktionieren.

Wenn Sie sich die Details ansehen möchten, ist dies in implementiert $VIMRUNTIME/filetype.vim.

raimue
quelle
Ähm, eigentlich wollte ich das woanders posten. Aber ich denke, die Antwort passt auch hier :-)
raimue
0

Der wahrscheinlich einfachste Weg, um eine neue Datei mit Syntax hervorzuheben, besteht darin, sie nach dem Schreiben der Shebang-Zeile neu zu laden. Ein einfacher :w :eschreibt die Datei aus, lädt sie neu und interpretiert die soeben geschriebene Shebang-Zeile, um Ihnen die entsprechende Syntaxhervorhebung zu geben.

cmaster - Monica wieder einsetzen
quelle
0

Wenn Sie den Dateityp bereits vor dem Öffnen des Skripts kennen oder ein neues Skript ohne eine übliche Erweiterung erstellen, können Sie es wie folgt an vim in der Befehlszeile übergeben:

vim -c 'setfiletype sh' path/to/script
vim -c 'setfiletype python' path/to/script
Edge-Case
quelle
-1

Wenn Sie eine neue Datei erstellen, kommt nur die Dateinamenerkennung ins Spiel. Die Inhaltserkennung ( #!/bin/bash) gilt nicht, wenn Sie sie nach dem Erstellen eines neuen Puffers eingeben.

Es ist sinnvoll, nur :set ft=bashdas erste Mal zu arbeiten. Wenn Sie es das nächste Mal bearbeiten, #!/bin/bashwird automatisch der richtige Dateityp festgelegt.

Hobbs
quelle
1
An meiner Seite ft=bashmuss gelesen werden ft=sh. Auch ich musste set modelinein ~/.vimrc, damit es funktioniert, siehe diese Antwort
Tino