Parantez içinde kaybolmadan elisp nasıl düzenlenir


13

Linum.el bazı elisp kodunu değiştiriyorum:

(custom-set-variables '(linum-format 'dynamic))
(defadvice linum-update-window (around linum-dynamic activate)
   (let* ((w (length (number-to-string
      (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) "d ")))
            ad-do-it))

Ben girinti kapalı-birer idi değiştirerek bir hatayı düzeltmek başardı (count-lines (point-min) (point-max))için (+ (count-lines (point-min) (point-max)) 1). Kolaydı.

Ama şimdi bunu değiştirmek istiyorum, böylece eğer minimum (concat " %" (number-to-string w) "2d ")sayı 2 olacaksa, eğer koşullu sayı eklenirse, burada satır sayısı sayısı <10 ise.

Bu kolay olmalı! Bir koşul ekleyin ve concat'ı kopyalayın / yapıştırın. Çocuk oyuncağı, değil mi? Demek istediğim, ne yapmam gerektiğini biliyorum ama nadiren elisp'e dokunuyorum ve çok fazla parantez ile herhangi bir şeyi değiştirmem gerektiğinde hep göz korkuyorum.

Anladığım kadarıyla "doğru" stil, kodu girintiye göre yapılandırmak ve sondaki parantezleri kendi yerine bir satırın sonuna sarmaktır. Diğer 'C' tarzı dillerden gelince, kodu hem okuma hem de yazma ile bu şekilde mücadele ediyorum. Benim sorum şu: neyi yanlış yapıyorum? Nasıl orada oturup her parantez saymak zorunda kalmayacak şekilde elisp düzenlemek ve kod etrafında gezinmek için nasıl?

Elisp'te çok derinleşen bir şeyle çalıştığımda, kapımı kapatmam, panjurları çekmem ve K & R-tarzı parantezini konumlandırmaya başlamalıyım, böylece lanet şeyi korkutmadan okuyamaz, değiştiremem.

Açıkçası tüm bunları yanlış yapıyorum. Korkmadan böyle elisp'e nasıl dokunabilirim?

Sorumun stil hakkında bir soru olarak değil, elisp'de nasıl gezinileceği ve düzenleneceği olduğunu lütfen unutmayın. Şimdiden bir stil kılavuzu olarak aşağıdakileri kullanıyorum: https://github.com/bbatsov/emacs-lisp-style-guide

Güncellemeler:

Emacs.stackexchange'e kendinizi zorlamadan önce elisp nasıl düzgün biçimlendirilir:

Elisp'inizi işaretleyin ve performans gösterin M-x indent-region.

Sorun Çözümü:

Minimum iki genişliğe sahip linum için doğru bir yaslama gerçekleştirmeyi bilmek isteyenler için işte çözüm:

(defadvice linum-update-window (around linum-dynamic activate)
  (let* ((w (length (number-to-string
                     (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (if (> w 1)
                           (concat " %" (number-to-string w) "d ")
                         " %2d ")))
    ad-do-it))

1
Herkes C'den gelen lisp okuma ile mücadele eder. Sadece zaman alır, ama sonunda son derece doğal hale gelir. Ayrıca, linum biçimini "% 2d" gibi bir biçim dizesiyle değiştirerek sorununuzu muhtemelen çözebilirsiniz.
Jordon Biondo

Bunu kullanamıyorum %2dçünkü genişlik 3 veya daha fazla karaktere yuvarlandıktan sonra sağa yaslanmış getirmeden sola yaslanmış getir.
Zhro

(Bence) paha biçilmez eşleşen parantezleri vurgulayan birkaç kütüphane vardır, örneğin highlight-parentheses; rainbow-delimiters; vb. highlight-parenthesesSon renklendirilmiş parantezleri kaldırmadan kaydırmaya izin veren kendi basitleştirilmiş sürümüm: stackoverflow.com/a/23998965/2112489 Gelecekte, müşteri / iş parçacığı başına bir soru.
hukukçu

1
Görünüşe göre, probleminiz Elisp kodunu değil , gerçekten okuyor . Lisp'in yapısını anlamada sorunlarınız var gibi görünüyor ve bu da düzenlemenizi bozuyor.
PythonNut

1
Savunmanızda, bu oldukça kötü girintili bir kod parçası. Bu yüzden ilk 3 kez kendimi yanlış okudum. Ayrıca, paredit .
Malabarba

Yanıtlar:


12

Paredit, smartparens ve lispy gibi yardımcı olabilecek bir dizi eklenti paketi vardır. Bu paketler lisp kodunda gezinmeyi ve değiştirmeyi kolaylaştırır, böylece s ifadelerinde düşünebilir ve editörün parenleri dengeleme konusunda endişelenmesine izin verebilirsiniz.

Emacs ayrıca öğrenmeye değer ve lisp kodunun yapısına daha fazla alışmanıza yardımcı olabilecek sexps ve listelerle uğraşmak için birçok yerleşik komut içerir. Bunlar genellikle aşağıdaki C-M-gibi bir önekle bağlanır :

  • C-M-f/ C-M-bsexp ile ileri / geri gitmek için
  • C-M-n/ C-M-plisteye göre ileri / geri gitmek için
  • C-M-u/ C-M-dbir seviye yukarı / aşağı gitmek için
  • C-M-t nokta etrafında iki sexps takas etmek
  • C-M-k sexp'i öldürmek
  • C-M-SPC seks yapmak
  • C-M-q bir sexp yeniden girintilemek

Girintiyi düzeltirseniz, sağladığınız örnek kod daha açık olabilir: ifadenin başlangıcındaki put ve tüm ifadeyi yeniden girintilemek için (defadvice...tuşuna C-M-qbasın. (concat...Ben değiştirmek için o sexp başlangıcına nokta koyarak C-M-ove girinti koruyarak hattı bölmek isabet başlayacaktı . Sonra ekleyin (if...ve yukarıdaki komutları kullanarak başka bir kapanış pareneni eklemek için listenin sonuna atlayın, yeniden girinti eklemek için başlangıca geri dönün vb.

show-paren-modeNokta, listenin başında veya sonundayken karşılık gelen pareyi vurgulayacak şekilde de açmak isteyebilirsiniz . Eşleşen parantez yerine tüm ifadeyi vurgulamayı tercih edebilirsiniz, bu nedenle özelleştirmeyi deneyin show-paren-style.

@Tyler'in başka bir cevabın yorumlarında belirttiği gibi, bu ve ilgili komutlar hakkında daha fazla bilgi edinmek için kılavuza bakmalısınız .


İfadeyi noktaya güzel yazdırmak için C-M-qbir önek argümanı ( C-u C-M-q) ile çağrılabileceğini unutmayın . Bu, satırları ayırmak ve girintilemek için her şeyi kıracak ve böylece iç içe yerleştirme çok açık olacaktır. Genellikle lisp kodunuzun böyle görünmesini istemezsiniz, ancak üzerinde tam K&R girmeden manuel olarak biraz kod anlamak yararlı olabilir. (Ve her zaman C-x ugeri alabilirsin).
glucas

6

LISP'yi düzenlemenin iyi bir yolu, tek tek karakterler veya satırlar yerine AST'yi manipüle etmektir. Bunu 2 yıl önce başladığım paket lispy ile yapıyorum . Bunun nasıl iyi bir şekilde yapılacağını öğrenmek aslında biraz pratik gerektirebilir, ancak sadece temel bilgileri kullanmak bile size yardımcı olacaktır.

Bu değişikliği nasıl yapacağımı açıklayabilirim:

Aşama 1

Başlangıç ​​pozisyonu genellikle en üst seviye sexp'den önceki noktaya sahip olmaktır. İşte, |nokta.

|(defadvice linum-update-window (around linum-dynamic activate)
   (let* ((w (length (number-to-string
      (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) "d ")))
            ad-do-it))

Kodun düzgün girintili olmasını istersiniz, bu yüzden bir ikez basın . Güzel bir şekilde yeniden girintili olacak.

Adım 2

"d "Manüle edilebilen bir nesne, lispyişaretlenmesi gerekmeyen bir liste veya bir bölge ile işaretlenmesi gereken bir dizi sembol veya listeden bir bölge ile işaretlemek isteyeceksiniz .

atBunu yapmak için tuşuna basın . aKomut ebeveyn liste içinde herhangi bir tek sembolü işaretlemek için izin verir ve tbu özel sembolün endeksidir.

Aşama 3

  1. Geçerli bölgeyi kaydırmak için ()tuşuna basın (.
  2. C-fBir karakter ileri gitmek ve eklemek için basın if.
  3. Takmak için (tekrar basın ().
  4. Ekle > w 10.
  5. C-f C-m dizeyi yeni bir satıra taşımak için.

4. Adım

Dizeyi klonlamak için:

  1. Noktadaki sembol veya dize ile işaretleyin M-m.
  2. Düğmesine basın c.

Bölgeyi süslü bir şekilde devre dışı bırakmak ve noktayı dizenin en başına koymak istiyorsanız, tuşuna basabilirsiniz idm:

  1. i dizenin iç içeriğini seçecektir.
  2. d nokta ve işaret takas eder.
  3. m bölgeyi devre dışı bırakacak

Veya m C-b C-b C-bbu durumda yapabilirsin, ya da C-g C-b C-b C-b. Bence idmdaha iyi, çünkü ipin uzunluğu ne olursa olsun aynı. Ben C-x C-x C-f C-g de dize uzunluğu ne olursa olsun işe yarayacağını düşünüyorum .

Son olarak, 2bitiş kodunu almak için ekleyin :

(defadvice linum-update-window (around linum-dynamic activate)
  (let* ((w (length (number-to-string
                     (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) (if (> w 10)
                                                             "2|d "
                                                           "d "))))
    ad-do-it))

özet

Tam sekans vardı: at( C-f, if, (, > w 10, C-f C-m M-m cidm, 2.

Kod eklemeyi dikkate alırsanız, AST manipülasyonu ile ilgili olmayan tek tuşların iki C-fve bir olduğunu unutmayın C-m.


3
Lispy kulağa ilginç geliyor! OP'ye: paredit: emacsrocks.com/e14.html ile benzer iş akışları geliştirebilir ve bölgeyi genişletebilirsiniz: github.com/magnars/expand-region.el veya yalnızca yerleşik parantez eşleme komutları: gnu
Tyler

Sorunu benim için çözmek için bağlandığınızda tahmin ettiğinizden eminim; teşebbüs için teşekkürler. Örnek olarak kodunuzu kullanarak yolumu karıştırmayı başardım. Doğru çözüm için güncellememe bakın.
Zhro

6

Zamanla buna alışacaksınız, ancak elbette hızlandırmaya yardımcı olmak için yapabileceğiniz çok şey var:

girinti

Bu deliliğin bir yöntemi var. Lisp'te bunu yapabilirsiniz:

(a-fun (another-fun (magic-macro 1)))

Diyelim ki 1bu gerçekten büyük bir ifade ve bunu kendi satırında girinti yapmak istiyorsunuz.

(a-fun (another-fun (magic-macro 
  1)))

Bu yanıltıcı. 1daha yüksek yuvalama düzeylerinin üçü olmasına rağmen, yalnızca bir yuva girintilidir! Ebeveyninin başına koysan iyi olur.

(a-fun (another-fun (magic-macro 
                      1)))

Bu şemayı kendi kodunuzda kullanırsak, şunu elde ederiz:

(custom-set-variables '(linum-format 'dynamic))
(defadvice linum-update-window (around linum-dynamic activate)
  (let* ((w (length (number-to-string
                      (+ (count-lines (point-min) (point-max)) 1))))       
          (linum-format 
            (concat " %" (number-to-string w) "d ")))
     ad-do-it))

Girinti ve yuvalanma seviyesi arasındaki güçlü korelasyona dikkat edin. İç içe yerleştirme düzeyi daha yüksek olan satırlar her zaman daha az satır içeren satırlardan daha fazla girintilidir.

Bu tek başına çok yardımcı olacaktır. Kodun "şeklini" kolayca görebilirsiniz ve diğer birçok dil, girintiyi bloklarla ve bloklarla bir çeşit yuvalama (açık veya zımni) ile ilişkilendirmek için eğitmiştir.

Bir alıştırma olarak, gereksiz parantezleri koddan kaldırdım. Elisp hakkında temel bilgi (yani, işlevlerin ve değerlerin ne olduğu ve yapısı let*) hakkında bilgi sahibi olmanız gerekir .

custom-set-variables '(linum-format 'dynamic)
defadvice linum-update-window (around linum-dynamic activate)
  let* w length number-to-string
                  + 
                    count-lines (point-min) (point-max) 
                    1       
         linum-format 
           concat " %" (number-to-string w) "d "
     ad-do-it

1
Emacs'ta, vurma sekmesinin neredeyse her zaman girintiyi burada açıklandığı gibi ayarlayacağını unutmayın - bunu elle boşluk ekleyerek asla yapmamalısınız!
Tyler

newline-and-indentEmacs-lisp-mode için "Cm" ye bağlanır ve lisp-etkileşim-mode ilk örneğiniz olan PythonNut'u çözer. Ve TAB işi her zaman yapacak.
Davor Cubranic

5

Bunu farklı bir cevap olarak ekliyorum.

Bazen girinti başarısız olur. Bu durumda başvurunuz şunun gibi bir şey kullanmaktır rainbow-delimiters:

resim açıklamasını buraya girin

Bu, herhangi bir parenin yuvalama seviyesini açık ve kolayca taranır.

Yine de oldukça büyük bir sorun var: parens gülünç derecede dikkat dağıtıcı. Burada bir vurgu dengesi var. rainbow-delimitersnormalde kodun geri kalanı pahasına parens üzerinde çok vurgu yapacak! Ancak gökkuşağının yüzlerini aşağı çevirirseniz, taranması giderek zorlaşır.

Bunu iyi dengeleyen bir yüz kümesi bulursanız, elbette kullanın.

Bununla birlikte, bir çözüm (beni neşeyle kenetleyen çözüm), iki yüz setine sahip olmak ve bunlar arasında anında geçiş yapmaktır. Başka şeyler yaparken, yüzler seyreltilir ve arka planda solmaya başlar:

resim açıklamasını buraya girin

Ancak noktayı bir paren üzerine koyduğunuzda , yuvalama düzeylerini görebilmeniz için parens'i yumruklar:

resim açıklamasını buraya girin

Ve işte bunu yapmak için kod:

(defvar rainbow-delimiters-switch nil
  "t if rainbow-delimiters are currently punched")
(defvar rainbow-delimiters-face-cookies nil
  "a list of face-remap-add-relative cookies to reset")

(make-variable-buffer-local 'rainbow-delimiters-switch)
(make-variable-buffer-local 'rainbow-delimiters-face-cookies)

(add-hook 'prog-mode-hook #'rainbow-delimiters-mode)
(add-hook 'text-mode-hook #'rainbow-delimiters-mode)

(with-eval-after-load 'rainbow-delimiters
  (set-face-foreground 'rainbow-delimiters-depth-1-face "#889899")
  (set-face-foreground 'rainbow-delimiters-depth-2-face "#9b7b6b")
  (set-face-foreground 'rainbow-delimiters-depth-3-face "#7b88a5")
  (set-face-foreground 'rainbow-delimiters-depth-4-face "#889899")
  (set-face-foreground 'rainbow-delimiters-depth-5-face "#839564")
  (set-face-foreground 'rainbow-delimiters-depth-6-face "#6391aa")
  (set-face-foreground 'rainbow-delimiters-depth-7-face "#9d748f")
  (set-face-foreground 'rainbow-delimiters-depth-8-face "#7b88a5")
  (set-face-foreground 'rainbow-delimiters-depth-9-face "#659896")

  (defun rainbow-delimiters-focus-on ()
    "Punch the rainbow-delimiters"
    (setq rainbow-delimiters-face-cookies
      (list
        (face-remap-add-relative 'rainbow-delimiters-depth-1-face
          '((:foreground "#3B9399") rainbow-delimiters-depth-1-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-2-face
          '((:foreground "#9B471D") rainbow-delimiters-depth-2-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-3-face
          '((:foreground "#284FA5") rainbow-delimiters-depth-3-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-4-face
          '((:foreground "#3B9399") rainbow-delimiters-depth-4-face))
            (face-remap-add-relative 'rainbow-delimiters-depth-5-face
          '((:foreground "#679519") rainbow-delimiters-depth-5-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-6-face
          '((:foreground "#0E73AA") rainbow-delimiters-depth-6-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-7-face
          '((:foreground "#9D2574") rainbow-delimiters-depth-7-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-8-face
          '((:foreground "#284FA5") rainbow-delimiters-depth-8-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-9-face
          '((:foreground "#199893") rainbow-delimiters-depth-9-face)))
      rainbow-delimiters-switch t))

  (defun rainbow-delimiters-focus-off ()
    "Reset the rainbow-delimiters faces"
    (mapc #'face-remap-remove-relative rainbow-delimiters-face-cookies)
    (setq rainbow-delimiters-switch nil))

  (defun rainbow-delimiters-focus-on-maybe ()
    "Punch the rainbow-delimiters if the point is on a paren"
    (when (looking-at "[][(){}]")
      (unless (or rainbow-delimiters-switch (minibufferp))
        (rainbow-delimiters-focus-on))))

  (defun rainbow-delimiters-focus-off-maybe ()
    "Reset the rainbow-delimiters if the point is not on a paren"
    (unless (looking-at "[][(){}]")
      (when rainbow-delimiters-switch
        (rainbow-delimiters-focus-off))))

  (run-with-idle-timer 0.6 t 'rainbow-delimiters-focus-on-maybe)
  (run-with-idle-timer 0.1 t 'rainbow-delimiters-focus-off-maybe))

Bu havalı! Başlamak için vurgulama parantezleri üzerinden gökkuşağı sınırlayıcılarını seçmenizin herhangi bir nedeni var mı?
Tyler

@Tyler, şu anda hala gökkuşağı sınırlayıcılarına bağlı kalmamıza rağmen özel bir neden yok (ancak bu sadece alışkın olduğum için olabilir). Çok yakın zamana kadar vurgulama-parantez duymamıştım.
PythonNut

4

Kodunuzu girintiliyorsanız, gerçekten düzgün girintilemeniz gerekir. Lisp geliştiricileri, düzgün bir şekilde girintili olması gerektiği gibi beklentilere sahiptir. Bu, kodun tamamen aynı olduğu anlamına gelmez. Kodu biçimlendirmenin hala farklı yolları vardır.

  • bir hat ne kadar olmalı?
  • bir fonksiyon / makro çağrısı hatlar üzerinden nasıl dağıtılır?
  • kaç tane girinti alanı olmalı?
(defadvice linum-update-window (around linum-dynamic activate)
   (let* ((w (length (number-to-string
      (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) "d ")))
            ad-do-it))

Girintinin bir şekilde çevreleme gösterdiğini umuyorum. Ancak kodunuzda değil.

Varsayılan olarak kodunuz bu şekilde girintili olabilir. Diğer cevaplar Emacs'ın yardımıyla bunu nasıl yapabileceğinizi açıkladı:

(defadvice linum-update-window (around linum-dynamic activate)
  (let* ((w (length (number-to-string
                     (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) "d ")))
    ad-do-it))

Ben bu beklenir letbağlı değişkenler aynı dikey sütun üzerinde başlar. Ben de bu beklenir vücut arasında letdaha az girintili edilir. A'nın nasıl letgirintili olması gerektiğini öğreniyoruz . Biraz antrenman yaptıktan sonra, tanınması kolay görsel bir örüntü.

Koddaki ana görsel yapı taşları defadvice, let*ve bir grup işlev çağrısıdır. defAdına bir isim, bir argüman listesi ve vücut tarafından takip edilen bir tanım olduğunu söylüyor.

Bu yüzden görmek isterim

defadvice name arglist
  body

let*: Olacaktı let*, bağlar ve vücudun bir listesi.

Böylece görmek istiyorum:

let*  list of bindings
  body

Daha detaylı:

let*   binding1
       binding2
       binding3
  body

Bir işlev çağrısı için görmek istiyorum:

FUNCTIONNAME ARG1 ARG2 ARG3

veya

FUNCTIONNAME ARG1
             ARG2
             ARG3

veya

FUNCTIONNAME
  ARG1
  ARG2
  ARG3

Hangisinin kullanılacağı argümanların süresine bağlıdır. Çizgileri çok uzun yapmak istemiyoruz ve her bir argüman kendi çizgisinde daha fazla yapıya sahip olmamızı sağlıyor.

Bu nedenle, bu kalıpları kullanarak kodunuzu yazmanız ve okuyucunun kodunuzdaki bu kalıpları kolayca tanımlayabildiğinden emin olmanız gerekir.

Parantezler yapılarını doğrudan kapsamalıdır.

(sin 10)

(sin
  10)

Boşluk örneklerinden kaçının:

(  sin 10  )

veya

(
   sin
)

veya

(sin 10
)

Lisp'de, parantezlerin dil sözdizimsel işlevi yoktur, bunlar liste veri yapısının (s-ifadeleri) sözdiziminin bir parçasıdır. Böylece listeler yazar ve listeleri biçimlendiririz. Liste içeriğini biçimlendirmek için Lisp programlama dili hakkında bilgi kullanırız. Bir letifade, işlev çağrısından farklı biçimlendirilmelidir. Yine de her ikisi de listedir ve parantezler doğrudan listeleri kapsamalıdır. Bir satırda tek bir parantezin bulunmasının mantıklı olduğu bazı örnekler vardır, ancak bunu nadiren kullanın.

İfade sınırlarını bulmanıza yardımcı olması için parantezleri kullanın. Listeden listeye gitmenize, listeleri düzenlemenize, listeleri kesip kopyalamanıza, listeleri değiştirmenize, listeleri girintiye almanıza / formatlamanıza, listeleri seçmenize ...


2

Girintiyle ilgili temel yardım için SEKME ve "CMq" ( indent-pp-sexp) kullanın; "Cm" bağlanması newline-and-indent, yeni satırdan sonra SEKME tuşuna basmanız gerektiğini kaydedecektir.

Çok yararlı olan "CM-sol / sağ / yukarı / aşağı / ev / son" ile sexp ile gezinebilirsiniz.

Parantez dengesini korumaktan endişe ediyorsanız, smartparens gibi bir şey kullanın ( başlangıçta deli gömleği giymek gibi hissedebilecek olan paredit biraz daha affedicidir ). Ayrıca, sexp düzeyinde gezinme ve düzenleme için birçok ciltleme ile birlikte gelir.

Son olarak, parenleri vurgulamak için, seçeneği (Seçenekler menüsü-> Eşleşen parantezleri vurgulayın veya show-paren-modeişaretini açın) başlatın. Yorumunda kanun listesinin bahsettiği paketlerden birini, örneğin "vurgu-parantez" veya "gökkuşağı sınırlayıcılar" ".


1

Başkalarının cevap olarak verdiklerine ek olarak, işte 2 sentim:

  • Tarafından sağlanan otomatik girinti emacs-lisp-modeesastır.
  • blink-matching-parennilvarsayılan olarak açıktır (non- ). Bırak onu.
  • Kullandığım show-paren-modeimlecin önce Sağ parantez tekabül sol paren vurgulamak için.
  • Eşleşen sol parenin nerede olduğunu daha iyi görmek istersem, imlecin önündeki sağ pareyi geçici olarak silip yeniden yazarım.

Ben do not elektrik eşleştirme veya gökkuşağı şey ya da başka herhangi bir tür "yardım" kullanın. Bana göre bunlar rahatsız edici, yardım değil.

Özellikle, electric-pair-modebenim için rahatsız edici bir rahatsızlık. Ama bazı insanlar bunu seviyor. Ve Lisp parantezleri dışında bazı eşleştirme bağlamlarında yardımcı olabileceğini hayal ediyorum (öyle düşünüyorum, ama bu tür kullanım durumları için de ikna olmadım).

Sizin için en uygun olanı bulacaksınız. Söylemek istediğim ana şeyler şunlardır: (1) otomatik girinti, arkadaşınızdır, tıpkı noktadan önce sağ parenle eşleşen sol pareni tespit etmenin bir yolu.

Özellikle, otomatik girintinin sizin için ne yaptığını görmek, size derhal bir satırda doğru parens koymak istemediğinizi hemen öğretir. Diğer dillerde her yerde bulunan bu kodlama tarzı sadece gürültülüdür.

Otomatik girinti yanında sizinle olsun RETve TABkullanan rahat olsun C-M-q. (Kullanım C-h kiçinde emacs-lisp-modebu tuşlar ne yaptığını bulmak için.)


1

Bazı insanların gökkuşağı sınırlayıcılardan bahsettiğini fark ettim, bu da lisp kodunu düzenlerken en sevdiğim mod.

Aslında parantezleri seviyorum, Lisp ile ilgili en iyi şey bu parantezler, nasıl yapılacağını biliyorsanız onlarla uğraşmak eğlenceli:

  • kötü modu ve eklenti kötü surround'u kurun, böylece parantezleri kolayca düzenleyebilirsiniz, örneğin, basın ci(içindeki her şeyi kaldıracak (), va("()" ve "()" kendileri tarafından sarılmış olanı seçecektir. ve %eşleşen parantezler arasında geçiş yapmak için tuşuna basabilirsiniz

  • flycheck veya flymake kullanın, eşsiz parantezler gerçek zamanlı olarak altı çizilecektir


0

Buradaki zorluk, belirli bir koddan önce ve sonra bir miktar kod eklemek istemenizdir sexp. Bu durumda sexp olur (concat " %" (number-to-string w) "d "). İf -ifadesini (if (> w 1) önüne ve else-ifadesini önüne eklemek istiyorsunuz " %2d ").

Zorluk büyük bir kısmı için izole bu sexp, şahsen ben a izole etmek için komuta altında kullanmaksexp

(defun isolate-sexp () (interactive)
       (save-excursion (forward-sexp) (if (not (eolp-almost))
               (split-line) nil)))
(defun eolp-almost () (interactive)
(save-excursion (while (equal (char-after) ? ) (forward-char 1))
        (if (eolp) t nil )      ))

Sadece imleci başlangıcına (concat " %" (number-to-string w) "d "), yani ilk başta koyun (, sonra yukarıdakileri uygulayın isolate-sexp. Elde edersiniz

(defadvice linum-update-window (around linum-dynamic activate)
   (let* ((w (length (number-to-string
      (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) "d ")
                                  ))
            ad-do-it))

Sonra bundan önce ve sonra uygun kodu ekleyin sexp, yani

(defadvice linum-update-window (around linum-dynamic activate)
   (let* ((w (length (number-to-string
      (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (if (> w 1) (concat " %" (number-to-string w) "d ") " %2d ")
                                  ))
            ad-do-it))

Ve işte. Bu şekilde elde edilen kod belki de güzel değildir, ancak kaybolma şansı daha azdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.