Transformeer geselecteerde tekst zoals een Python-macro

Ik ben nog maar net begonnen met Emacs (nu ongeveer 6 weken), dus ik ben niet echt bekend met de codeertaal. Ik vroeg me af of het mogelijk was om voor Emacs het equivalent te schrijven van een Python-macro die ik heb in mijn Sublime Text-configuratie.

In Sublime Text heb ik een Python-macro die geselecteerde tekstregels kan transformeren. Als ik de lijnen selecteer

foo
bar
baz

en druk op de door mij gekozen snelkoppeling C-l C-s de tekst wordt omgezet naar ['foo', 'bar', 'baz'] .

Ik vroeg me af hoe ik dit voor Emacs kon doen.

1
Merk op dat Emacs twee verschillende soorten dingen heeft die "macro's" worden genoemd. Ten eerste biedt de Emacs Lisp-taal macro's (zie C-h i g (elisp) macro's ). Ten tweede is er een bewerkingsfunctie die wordt aangeduid als toetsenbordmacro's (zie C-h i g (emacs) toetsenbordmacro's ). Ik denk niet dat je een van deze dingen echt bedoelde, dus je moet absoluut het woord "macro" helemaal vermijden om verwarring te voorkomen.
toegevoegd de auteur Mark Ireland, de bron
Ja natuurlijk kun je het! Je programmeert emacs met elisp, wat als een Lisp dialect een volwaardige programmeertaal is. Je kunt deze en veel gecompliceerdere tekstverwerkingstaken uitvoeren met emacs. Als je het precies kunt beschrijven, kan het worden geprogrammeerd. Wilde je eigenlijk een functie om deze specifieke taak uit te voeren? (In een aparte notitie is uw tag [macro's] verkeerd, hier verwijst het naar een bepaalde taalfunctie van elisp.)
toegevoegd de auteur AttackingHobo, de bron
Ik heb niet aangeboden om deze functie te schrijven (geen macro). Misschien zal iemand anders dat doen. Een korte opmerking echter: als dit moet worden gebruikt voor het maken van lijsten met strings in een bepaalde programmeertaal, zoals het eruit ziet, moet u beslissen of en hoe het moet omgaan met enkele aanhalingstekens die al in de geselecteerde tekst aanwezig zijn. Dat wil zeggen, als een van de regels "voor" bevat, moet dat worden weergegeven als 'voor''c''le' , of 'voor \' c \ 'sle ' of iets heel anders?
toegevoegd de auteur AttackingHobo, de bron
Een macro om deze specifieke taak te doen zou zeer nuttig zijn, dank u. Een van de redenen waarom ik probeer over te stappen naar emacs van Sublime Text is dat het programmeerbaar is en ook open source (dus ik hoef me geen zorgen te maken dat de ontwikkelaar geen interesse meer heeft).
toegevoegd de auteur TomMcW, de bron
Je reactie was nog steeds erg nuttig, ik was op zoek naar emacs-macro's die zich niet realiseerden dat macro's iets anders in emacs betekenden. Ik googel nu elisp-functies en vond veelbelovende antwoorden zoals stackoverflow.com/questions/605846/… Ik zal wat zoeken op basis van wat u ' heb gezegd. Dank je.
toegevoegd de auteur TomMcW, de bron

1 antwoord

Deze methode neemt de geselecteerde regels, verpakt ze in enkele aanhalingstekens en stopt ze in een lijst.

(defun lines-to-list (point mark)
  (interactive "r")
  (let ((text (buffer-substring point mark)))
    (delete-region point mark)
    (insert "[")
    (insert (mapconcat (lambda (line) (format "'%s'" line))
                       (split-string text "\s*\n\s*")
                       ", "))
    (insert "]")))

U kunt ze binden aan een sneltoets als deze:

(define-key python-mode-map (kbd "C-c C-l") #'lines-to-list)
5
toegevoegd