Yazarken DOuble CApital'leri Tespit Etmek


23

Biraz yavaş pembemsiğim var. Diğer parmaklarım yazmada daha hızlı ve daha hızlı hale geldikçe, pembemsi tahammül edemiyor. Bu sık sık beni ilk kelimesi iki büyük harfle başlayan cümleleri yazmamı sağlıyor. İşte kısa bir örnek.

THere's nothing in there. DEfinitely not a body.

Genelde yaptığım şey vurulur M-b M-c(derhal tespit ettiğimi varsayarsak), ama bundan biraz sıkılıyorum.

Emacs'ın bunu benim için otomatik olarak nasıl düzeltmesini sağlayabilirim?

Yani, Emacs'ın iki büyük harf ve ardından en az bir küçük harf ile başlayan bir kelimeyi yazdığımda algılamasını ve otomatik olarak düzeltmesini istiyorum.

Yanıtlar:


19

İşte DOuble CApital'leri Single Capitals'e dönüştürecek bir fonksiyon. Başlangıçta bunu eklemeyi önerdim post-self-insert-hook, ancak aşağıda yüceltilmiş bir küçük kip için bir seçenek var; böylece yalnızca gerçekten istediğiniz zaman bu kancayı ekleyebiliyorsunuz:

(defun dcaps-to-scaps ()
  "Convert word in DOuble CApitals to Single Capitals."
  (interactive)
  (and (= ?w (char-syntax (char-before)))
       (save-excursion
         (and (if (called-interactively-p)
                  (skip-syntax-backward "w")
                (= -3 (skip-syntax-backward "w")))
              (let (case-fold-search)
                (looking-at "\\b[[:upper:]]\\{2\\}[[:lower:]]"))
              (capitalize-word 1)))))

(add-hook 'post-self-insert-hook #'dcaps-to-scaps nil 'local)

Ve küçük mod tanımı:

(define-minor-mode dubcaps-mode
  "Toggle `dubcaps-mode'.  Converts words in DOuble CApitals to
Single Capitals as you type."
  :init-value nil
  :lighter (" DC")
  (if dubcaps-mode
      (add-hook 'post-self-insert-hook #'dcaps-to-scaps nil 'local)
    (remove-hook 'post-self-insert-hook #'dcaps-to-scaps 'local)))

Ne olursa olsun, bu sürümü kullanarak:

  • basittir: sadece manuel olarak veya mod kancasında açın / kapatın;
  • Anahtar ciltlerinde değişiklik yapılmasını gerektirmediğinden, başka hiçbir işlevselliği kaybetmezsiniz.

Bunu eklediğiniz zaman bile post-self-insert-hook, ek yük neredeyse yoktur, en azından bazı basit kıyaslamalara göre. Makinemde, işte her biri inanılmaz derecede basit bir form ve dcaps-to-scapsişlevden oluşan 10.000 tekrar ile aldığım şey :

(benchmark-run-compiled 10000 (+ 1 1))          ; => .001 to .003 -ish
(benchmark-run-compiled 10000 (dcaps-to-scaps)) ; => .003 to .006 -ish

Yani, evet, 1 + 1 eklemekten daha yavaştır, ancak kesin olarak asla farketmezsiniz.


Sen kullanabilirsiniz looking-at-p(eğer gerek yoktur çünkü sakınca olmadığını ya da burada kullanmak) hiç maç verilerini set etmeyen,.
YoungFrog

Birkaç sözleri (I katkıda bulunmak istiyorum bu yüzden ama senin cevabı tercih; p) çoğunlukla önemsiz: kullanımı forward-wordile de çalışmaz subword-modekullanarak, (char-syntax (char-before))(sanırım) herhangi sözdizimi sınıf özelliklere sahip set göz ardı eder (alternatif çözüm: (syntax-after (1- (point))) ve (son fakat en az değil), regexp aksanlı harfleri bulamaz (örneğin, "Fransız" da "ÉMincer")
YoungFrog

@YoungFrog: forward-wordsorunla başa çıkmak için güncellendi ve regexp aksanlı başkentlerle baş etmek için değişti.
Dan

Tercih için bir neden var mı andüzerinde whenilk etapta özellikle?
Clément

@ Clément: andkısa devre yapmış, mantık whenburada olduğu gibi çalışıyor . Birini diğerine karşı kullanma konusunda en iyi uygulamaların olup olmadığından emin değilim, ancak bu sitede iyi bir soru soracak gibi görünüyor (yine de abartırım).
Dan

8

Tercihim, normalin self-insert-commandyapabileceği her şeyi artı daha fazlasını yapan yeni bir fonksiyon oluşturmak .

İşte birkaç neden:

  • Hangi ana modların bu otomatik düzeltme özelliğine sahip olması gerektiği üzerinde daha ince kontrol. Bu kullanım durumunda için, bu olabilir mi salt metin modları org-mode, text-modevb
  • Soruda istenen düzeltme türü için, kullanıcı kelimeden sonra tipik olarak SPCveya RETveya .tuşunu tuşlar. Bu nedenle, böyle bir şeyi kullanmak post-self-insert-hookbir engel olabilir ve herhangi bir tuşa her basışımızda bu ekstra işlemi yapardık.

Bu nedenle aşağıda önerilen çözüm, bu işlevi sadece SPCanahtarın içine org-mode-mapsokar (kelimenin satırdaki son kelime olabileceği köşe durumunu görmezden gelir). Gerekirse, kullanıcı benzer sarmalayıcı işlevlerini daha fazla tuşa bağlayabilir.

(defun space-plus-more ()
  (interactive)
  (save-excursion
    (backward-word 1)
    (let ((case-fold-search))
      (when (looking-at-p "[A-Z]\\{2\\}.*?[a-z]+.*?\\b")
        (capitalize-word 1))))
  (self-insert-command 1))

(define-key org-mode-map (kbd "<SPC>") #'space-plus-more)

Bu ilginç bir elisp egzersizi :)

Kişisel olarak bunu bağlamak istemem RET, o zamanki varsayılan bağlantıları org-modeve muhtemelen diğer ana modları da kaybederdim . Ama eltve hakkında bilgi edinmek ilginçti this-command-keys-vector.

(defun my/fix-double-caps ()
  (interactive)
  (save-excursion
    (backward-word 1)
    (let ((case-fold-search))
      (when (looking-at-p "[A-Z]\\{2\\}.*?[a-z]+.*?\\b")
        (capitalize-word 1))))
  (if (eq 13 (elt (this-command-keys-vector) 0)) ; detect RET
      (newline)
    (self-insert-command 1)))

(let ((maps-list (list org-mode-map
                       text-mode-map))
      (keys-list (list "<SPC>" "<RET>" ".")))
  (dolist (map maps-list)
    (dolist (key keys-list)
      (define-key map (kbd key) #'my/fix-double-caps))))

Oh evet, onu metin türetilmiş modlarla sınırlamak kesinlikle iyi bir fikir. :)
Malabarba

@Malabarba bu davranışı prog modundan türetilen modlar için dizelerde istemez mi?
YoungFrog

@YoungFrog emin, ancak o zaman aslında bir dizgenin içinde olduğunu kontrol etmek zorunda kalacaktı, aksi halde sadece yoluna girecekti.
Malabarba

0

Belki bu cevap beklediğiniz çözümü sağlamaz (yazarken kelimelerin etkileşimli düzeltilmesi), bu tür problemlerle mücadele yolumu paylaşmak istiyorum.

Her şeyden önce, metnimi sessizce değiştiren şeyleri sevmiyorum (büyük harf, vb., Kelimeyi yazmak istiyorsanız IBuffer, bu tür "düzeltici" nin yanlış bir yol olduğunu düşünüyorum), bu yüzden iki şey öneririm:

İlk önce "Yapışkan Tuşlar" özelliğini etkinleştirmeyi deneyin. İlk başta garip gelebilir ama ben her zaman kullanırım. Bu özellik işletim sistemi / masaüstü ortamı düzeyinde mevcuttur, Emacs ürünü değildir. Bu şey etkinleştirildiğinde, önce tuşuna basıp ⇧ Shiftardından büyük harf yapmak istediğiniz başka bir tuşa basarsınız. Bu şekilde, probleminiz bile ortaya çıkamaz, bu sıralı yaklaşımda sadece bir harf büyük harfle yazılır! Ayrıca, ellerinizi ⇧ Shifttuşunu basılı tutmanız gereken işleri azaltır . Bence şimdi yazmak daha kolay.

İkincisi, artık gerekli olduğunu düşündüğünüzde hala ⇧ Shiftanahtarı normal olarak kullanabilirsiniz (tutma), ancak size Fix Word adlı bir Emacs paketi önermek istiyorum . "Yapışkan Tuşlar" ı sevmeseniz bile, kelimeleri uygun biçimlerine kolayca düzeltebilir ve imlecin yararsız hareketleri olmadan üst üste birkaç kelimeyi düzeltebilirsiniz. Bir deneyin, her zaman kullanırım. (Birkaç kelime girdiyseniz ve büyük harf kullanmanız gereken kelime ortada bir yerde ise, bunları düzeltmek hala zor.)

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.