Syntaxis-highlight vernauwde letterlijke python-tekenreeks als code

Ik heb een python-code, die een aantal lange string-letterwoorden bevat met meer python-code. Deze strings moeten meestal uniform zijn gekleurd, zoals standaard gebeurt.

Ik zou echter graag in staat zijn om mijn buffer soms te vernauwen tot een van deze strings, en dan de emacs-syntaxis te laten markeren alsof het code is, niet strings binnen code (dwz alsof de "" " waren er niet in de oorspronkelijke buffer)

Is er een manier om dat te doen, dan zijn er niet veel elisp?

LET OP: ik hoef niet per se verengd te worden, het leek me gewoon beter om de syntax highlighting op deze manier te veranderen, want in de volledige buffer zou het verwarrend zijn ...

5
Zou het niet versmallen tot alleen de inhoud van de string, niet inclusief de aanhalingstekens, het probleem oplossen?
toegevoegd de auteur Louis Salin, de bron
@jmlorenzi nadat je hebt verkleind, kun je de hoofdmodus wijzigen om elke gewenste markering te ondersteunen. Verander het dan terug zodra je groter wordt. @lindydancer heeft het over het string-edit -pakket, maar het ondersteunt niet zoals je wilt.
toegevoegd de auteur Louis Salin, de bron
Een tijdje geleden zag ik iemand iets soortgelijks in de HTML-modus doen, maar op dit moment herinner ik me waar ik het zag. Hoe dan ook, het basisidee was om de ingesloten code naar een nieuwe buffer te kopiëren en deze in de juiste hoofdmodus weer te geven. Als het eenmaal klaar is, kopieert een toonsoortsequentie (zoals C-c C-c) het resultaat waar het oorspronkelijk vandaan kwam. Helaas zou het schrijven van wat elisp verplicht zijn, vrees ik.
toegevoegd de auteur Daniel McPherson, de bron
@JordonBiondo In mijn, versmalling naar de tekenreeks (zonder aanhalingstekens) verandert de markering niet ... ook het uitvoeren van font-lock-fontify-buffer helpt niet
toegevoegd de auteur Faito Dayo, de bron
@Lindydancer Bedankt! Ik dacht dat zoiets uitvoerbaar zou moeten zijn, maar mijn elisp-vaardigheid is erg laag ... Ik hoop dat ik wat tijd krijg om dit te proberen en dit te doen ...
toegevoegd de auteur Faito Dayo, de bron

1 antwoord

Dit kan gedaan worden met polymode .

(require 'polymode)
(defcustom pm-host/python
  (pm-bchunkmode "python"
                 :mode 'python-mode
                 :font-lock-narrow nil)
  "Python host chunkmode"
  :group 'hostmodes
  :type 'object)

(defcustom pm-inner/python
  (pm-hbtchunkmode "python"
                   :mode 'python-mode
                   :head-reg  "\"\"\""
                   :tail-reg  "\"\"\"")
  "Python typical chunk."
  :group 'innermodes
  :type 'object)

(defcustom pm-poly/python
  (pm-polymode-one "python"
                   :hostmode 'pm-host/python
                   :innermode 'pm-inner/python)
  "Python typical polymode."
  :group 'polymodes
  :type 'object)

(define-polymode poly-python-mode pm-poly/python)
  1. C-x b test.py RET
  2. M-x poly-python-mode RET

Met deze modus worden drievoudig genoteerde strings gemarkeerd als python-code. (Normaal gesproken geen goed idee, maar u kunt het wel wisselen).

enter image description here

Momenteel lijkt polymode problemen te hebben met het bijwerken van de lettertypevergrendeling. Dit zou echter in de praktijk moeten werken.

4
toegevoegd
@PythonNut Dit werkt niet voor mij ... Misschien zijn er de problemen met lettertype-vergrendeling die u noemt? Welke zijn deze problemen? Ik gebruik Emacs 24.3.1
toegevoegd de auteur Faito Dayo, de bron
Ik zie het nu ... Inderdaad, het wijzigen van de tekst dwingt de update ... het is jammer dat dit niet automatisch is. Hoe dan ook, bedankt voor het antwoord !!
toegevoegd de auteur Faito Dayo, de bron
@elethan, zoals ik aan het einde opmerkte, er lijkt een probleem te zijn met betrekking tot het vergrendelen van lettertypen bij het omschakelen. Ik onderzoek het en zal waarschijnlijk een probleem veroorzaken om te zien of het kan worden opgelost.
toegevoegd de auteur PythonNut, de bron
@elethan Ah, belangrijke modi schakelen niet. ;) Je moet python-modus gebruiken om terug te keren naar de niet-polymode.
toegevoegd de auteur PythonNut, de bron
@jmlorenzi wat is precies het probleem? Als het probleem is dat het in eerste instantie niet kan worden ingeschakeld, probeer dan een wijziging aan te brengen in de python-code in de aanhalingstekens. Dat zou het moeten opdringen. Dat is de fout waarnaar ik verwees.
toegevoegd de auteur PythonNut, de bron
Ik hoop dat dit werkt voor het OP, maar voor mij lijkt het geweldig te werken! Je zegt dat je het wel kunt wisselen, maar hoe doe je dat? Ik kan het inschakelen, maar ik weet niet hoe ik het moet uitschakelen ...
toegevoegd de auteur Lord Loh., de bron
Maar als ik zeg dat ik het niet kan uitschakelen, bedoel ik dat ik het commando niet kan achterhalen. Ik begrijp dat de syntaxisaccentuering niet verdwijnt, maar als ik polypython-modus een tweede keer aanroept, zie ik nog steeds PM in mijn modusregel, het is nog steeds actief
toegevoegd de auteur Lord Loh., de bron
OK, terugschakelen naar python-modus werkt als een charme! Ik realiseerde me niet dat ik ooit de python-modus had verlaten ... (tussen haakjes, ik zal de premie toekennen zodra de site me dat ook toestaat. Bedankt voor het antwoord ... ook al is het niet mijn vraag, haha!)
toegevoegd de auteur Lord Loh., de bron