Seçilen metni Python makrosu gibi dönüştür

Sadece Emacs ile yeni başladım (yaklaşık 6 hafta) bu yüzden kodlama dilini gerçekten bilmiyorum. Emacs için, benim Sublime Text kurulumunda sahip olduğum bir Python makrosunun eşdeğerini yazmanın mümkün olup olmadığını merak ediyordum.

Sublime Metninde, seçilen metin satırlarını dönüştürebilecek bir Python makrosu var. Eğer çizgileri seçersem

foo
bar
baz

ve C-l C-s seçilen kısayoluma basın, metin ['foo', 'bar', 'baz'] 'a dönüştürülür.

Bunu Emacs için nasıl yapabileceğini merak ediyordum.

1
Emacs'in "makrolar" adı verilen iki farklı türü olduğuna dikkat edin. Öncelikle Emacs Lisp dili makrolar sağlar (bkz. C-h i g (elisp) Makrolar ). İkinci olarak, Klavye Makroları olarak adlandırılan bir düzenleme özelliği vardır (bkz. C-h i g (emacs) Klavye Makroları ). Aslında bu şeylerden herhangi birini kastettiğinizi sanmıyorum, bu yüzden karışıklığı önlemek için kesinlikle "makro" kelimesinden kaçınmalısınız.
katma yazar Mark Ireland, kaynak
Evet tabiki yapabilirsin! Bir Lisp lehçesi olarak tam teşekküllü bir programlama dili olan elisp ile emacs programlayabilirsiniz. Bu ve çok daha karmaşık metin işleme görevlerini emacs ile gerçekleştirebilirsiniz. Eğer tam olarak tanımlayabilirseniz, programlanabilir. Bu özel görevi yapmak için gerçekten bir işlev istediniz mi? (Ayrı bir notta, etiketiniz [makrolar] yanlıştır; burada, elisp'in belirli bir dil özelliğini ifade eder.)
katma yazar AttackingHobo, kaynak
Um, bu fonksiyonu yazmayı teklif etmedim (makro değil). Belki başkası yapacak. Bununla birlikte, kısa bir not: Bu, bazı programlama dillerinde dizelerin listelenmesi için kullanılacaksa, göründüğü gibi, seçilen metinde zaten mevcut olan tek tırnaklarla nasıl başa çıkılacağına ve bunun nasıl ele alınması gerektiğine karar vermelisiniz. Yani, satırlardan biri “fo'c'sle” içeriyorsa, bu 'fo''c''sle' veya 'fo \' c \ 'sle olarak oluşturulmalıdır. ' veya tamamen farklı bir şey?
katma yazar AttackingHobo, kaynak
Bu özel görevi yapmak için bir makro çok yararlı olurdu, teşekkürler. Sublime Text'ten gelen emaclara taşınmaya çalışmamın nedenlerinden biri de programlanabilir ve aynı zamanda açık kaynak olmasıdır (bu yüzden geliştiriciyi faizleri kaybetme konusunda endişelenmem gerekmeyecektir).
katma yazar TomMcW, kaynak
Cevabınız hala çok kullanışlıdır, makroların makroların emaclarda başka bir şey ifade ettiğini farketmeden emacs makroları arıyordum. Şimdi elisp işlevlerini araştırıyorum ve
katma yazar TomMcW, kaynak

1 cevap

Bu yöntem seçilen satırları alacak, bunları tek tırnak içine alacak ve bir listenin içine koyacaktır.

(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 "]")))

Bunları aşağıdaki gibi bir kısayola bağlayabilirsiniz:

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