[PYTHON] Fügen Sie Sublime Linter D-Sprache (jede andere Sprache) zum Hervorheben hinzu

Sublime Linter ist eines der Pakete von Sublime Text2 und eine Funktion zum Hervorheben des Teils, in dem der Kompilierungs- oder Syntaxfehler aufgetreten ist. Es sieht aus wie auf dem Bild unten.

SublimeLinter例

Die offizielle Seite für Sublime Linter ist unten. https://github.com/SublimeLinter/SublimeLinter

Auf der folgenden Seite finden Sie Informationen zur Installation von Sublime Linter. http://perl.no-tubo.net/2012/05/03/mac%E3%81%AE%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF-sublime-text2%E3%81%A7javascript%E3%81%AE%E3%82%B7%E3%83%B3%E3%82%BF%E3%83%83%E3%82%AF%E3%82%B9%E3%82%A8%E3%83%A9/ http://watson1978.github.com/blog/2012/08/23/make-a-sublime-text-environment/

Hier erfahren Sie, wie Sie die D-Sprache damit hervorheben.

Datei für D-Sprache hinzufügen

Öffnen Sie nach der Installation von SublimeLinter den Ordner mit den Paketen, indem Sie [Sublime Text 2] -> [Einstellungen] -> [Pakete durchsuchen…] auswählen. (Für MacOS. Ich kenne kein anderes Betriebssystem.) BrowsePackage…

Wenn Sie dann den Ordner mit dem Paket öffnen, öffnen Sie den Ordner [~~ / Packages / SublimeLinter / sublimelinter / modules /]. Ich denke, dass python.py oder java.py darin enthalten ist, also erstelle d.py.

Erstellen Sie den Fluss d.py.

Kopieren Sie die Quelle von objectiv-j.py nach d.py, löschen Sie nicht benötigte Teile und gehen Sie wie folgt vor.

d.py


import re
import os
import subprocess

from base_linter import BaseLinter

CONFIG = {
    'language': 'D'
}


class Linter(BaseLinter):
    def built_in_check(self, view, code, filename):
        return ''

    def parse_errors(self, view, errors, lines, errorUnderlines, violationUnderlines, warningUnderlines, errorMessages, violationMessages, warningMessages):
		return ''

built_in_check ist die Funktion, die den Code kompiliert und einen Kompilierungsfehler zurückgibt, und parse_errors ist die Funktion, die basierend auf dem Fehler von built_in_check entscheidet, wo hervorgehoben werden soll.

Inhalt von built_in_check

Die Argumente für "built_in_check" sind "self", "view", "code", "filename". Selbst ist Selbstvertrauen (dies in C #), Ansicht ist eine Registerkartenklasse, Code ist ** der Inhalt einer nicht gespeicherten Datei, die bearbeitet wird **, und Dateiname ist der Name der angezeigten Datei. Also schreibe ich die Inhaltsverarbeitung, um den Code in'built_in_check 'zu kompilieren, aber die Notizen lauten wie folgt.

  1. Das Kompilierungsziel ist Code. Durch das Kompilieren der Dateinamensdatei wird die unbearbeitete Datei kompiliert, was seltsam ist. Speichern Sie den Code in einem geeigneten Ordner mit d.py und kompilieren Sie ihn
  2. Die Kompilierungsoption dmd lautet -c -o- -w -unittest -debug
  3. Wenn Sie nicht verstehen, lesen Sie base_linter.py

Das Ergebnis ist also unten.

d.py


…
#Temp-Ordner zum Schreiben von Dateien während des Schreibens
TMPPATH_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '.dtmpfiles'))
if not os.path.exists(TMPPATH_DIR):
    os.mkdir(TMPPATH_DIR)
…
class Linter(BaseLinter):
    def built_in_check(self, view, code, filename):
      def built_in_check(self, view, code, filename):
        #Pass bekommen
        work_path = os.path.dirname(filename)
        file_name = os.path.basename(filename)

		 #Holen Sie sich Einstellungen zum Kompilieren des Speicherorts
        settings = view.settings().get('SublimeLinter', {}).get(self.language, {})
        if(settings):
            dwd = settings.get('working_directory', [])
            if(dwd):
                #Holen Sie es sich, wenn es im Projekt festgelegt ist
                work_path = dwd

        #Die Datei in der Mitte des Schreibens wird als temporäre Datei verwendet..Export direkt unter py
        tempfilePath = os.path.join(TMPPATH_DIR, file_name)

        with open(tempfilePath, 'w') as f:
            f.write(code)

        args = ["dmd", "-c", "-o-", "-w", "-unittest", "-debug", tempfilePath]

        try:
			#kompilieren
            process = subprocess.Popen(args,
                                        cwd=work_path,
                                        stdin=subprocess.PIPE,
                                        stdout=subprocess.PIPE,
                                        stderr=subprocess.STDOUT,
                                        startupinfo=self.get_startupinfo())
            result = process.communicate(None)[0]
        finally:
            if tempfilePath:
                #Gespeicherte Datei löschen
                os.remove(tempfilePath)

        return result.strip()
…

SublimeText2 verfügt über eine Projektverwaltungsfunktion. Wenn Sie jedoch die Einstellungen in die Projektdatei schreiben, können Sie den Speicherort auf dmd festlegen. Wenn Sie ein selbst erstelltes Modul nicht importieren, tritt im Importteil ein Kompilierungsfehler auf (glaube ich). Die Einstellungen sind wie folgt.

xxx.sublime-project


{
	"folders":
	[
		{
			//Projektordner
			"path": "~~~~"
		}
	],

	"settings":
    {
        "SublimeLinter":
        {
            "d":
            {
				//dmd Der Ordner, den Sie verschieben möchten. Dies kann mit dem obigen Ordner identisch sein.
                "working_directory": "~~~~~"
            }
        }
    }
}

Inhalt von parse_errors

Die Fehlermeldung des Kompilierungsfehlers, der bei der Rückgabe von "built_in_check" übergeben wurde, wird an "lines" des Arguments "parse_errors" übergeben. Danach können Sie die Fehlermeldung und die Fehlerzeile aus der Fehlermeldung in jeder Zeile von "Zeilen" ausschneiden und an die Funktion "self.add_message" übergeben. Die hier zu beachtenden Punkte sind wie folgt.

  1. In dmd v2.060 wird ein Kompilierungsfehler an einer anderen Stelle als der von mir geschriebenen Quelle ausgegeben. Dies wird behoben. Zu diesem Zeitpunkt setze ich alle Fehler in die Zeile, die ich importiere, unter der Voraussetzung, dass ich sie importiere, wenn sie ausgespuckt wird.
  2. Ich übergebe errorMessages, aber das macht hier nicht viel Sinn. Ich meine, ich habe nicht überprüft, was kommen wird. Vielleicht ist nichts drin.
  3. Wenn Sie nicht verstehen, lesen Sie "base_linter.py" (es ist wichtig, also das zweite Mal)

Also (ry

d.py


…
    def parse_errors(self, view, errors, lines, errorUnderlines, violationUnderlines, warningUnderlines, errorMessages, violationMessages, warningMessages):
        for line in errors.splitlines():
            match = re.match(r'^(?P<filename>.+\.d)\((?P<line>\d+)\): Error: (?P<error>.+)', line)

            if match:
                tab_filename = os.path.basename(view.file_name())
                error_filename = os.path.basename(match.group('filename'))
                error, line = match.group('error'), match.group('line')
                if(tab_filename == error_filename):
                    self.add_message(int(line), lines, error, errorMessages)
                else:
                    line = 1
                    module_name = error_filename.replace('.d', '')
                    regions = view.find_all(r'import.*\.' + module_name)
                    if(regions):
                        line = view.rowcol(regions[0].a)[0] + 1
                    self.add_message(line, lines, error, errorMessages)

Dies sollte wahrscheinlich funktionieren. Wenn es nicht funktioniert, beheben Sie es bitte.

Recommended Posts

Fügen Sie Sublime Linter D-Sprache (jede andere Sprache) zum Hervorheben hinzu
Hinzufügen von Kv-Sprachsyntax-Highlights zu Spyder in Python IDE
(Für mich) Flask_5 (Zur txt-Datei hinzufügen)
[ESXi (vCenter)] Hinzufügen einer Netzwerkkarte für CentOS 7.3