Naprawianie DOuble CApitals jako typu I.


23

Mam trochę powolnego pinky. Gdy moje inne palce stają się coraz szybsze w pisaniu, mój mały palec nie może nadążyć. To często prowadzi mnie do wpisywania zdań, których pierwsze słowo zaczyna się od dwóch wielkich liter. Oto krótki przykład.

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

Zwykle to, co robię, to trafianie M-b M-c(zakładając, że natychmiast to zauważę), ale mam już tego dość.

Jak mogę ustawić Emacsa, aby naprawił to automatycznie dla mnie?

To znaczy, chciałbym, aby Emacs wykrył, kiedy wpisuję słowo, które zaczyna się od dwóch wielkich liter, po których następuje co najmniej jedna mała litera, i naprawię to automatycznie.

Odpowiedzi:


19

Oto funkcja, która przekształci DOuble CApitals w Single Capitals. Początkowo zasugerowałem dodanie go post-self-insert-hook, ale poniżej znajduje się opcja gloryfikowanego trybu pomniejszego, abyś mógł dodawać do tego haka tylko wtedy, gdy naprawdę chcesz:

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

I definicja trybu pomocniczego:

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

Za co warto skorzystać z tej wersji:

  • jest proste: wystarczy włączyć / wyłączyć ręcznie lub w trybie haka;
  • nie wymaga zmian w powiązaniach klawiszy, więc nie tracisz żadnej innej funkcjonalności.

Nawet jeśli go dodasz post-self-insert-hook, koszty ogólne prawie nie istnieją, przynajmniej według niektórych prostych testów porównawczych. Na mojej maszynie otrzymuję 10 000 powtórzeń w absurdalnie prostej formie i dcaps-to-scapsfunkcji:

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

Tak, tak, jest wolniejszy niż dodawanie 1 + 1, ale w wartościach bezwzględnych nigdy tego nie zauważysz.


Możesz użyć looking-at-p, który w ogóle nie ustawia danych dopasowania (w porządku, ponieważ nie potrzebujesz go ani nie używasz tutaj).
YoungFrog,

Jeszcze kilka uwag, głównie nieistotne (ale wolę swoją odpowiedź więc chcę przyczynić się; p): wykorzystanie forward-wordnie będzie dobrze pracować subword-mode, używając (char-syntax (char-before))będzie (chyba) ignoruje wszelkie klasy zestaw właściwości (składnia z alternatywnego rozwiązania: (syntax-after (1- (point))) i (ostatnie, ale nie mniej ważne) wyrażenie regularne nie znajdzie liter akcentowanych (np. „ÉMincer”, w języku francuskim)
YoungFrog

@YoungFrog: zaktualizowano, aby rozwiązać forward-wordproblem, i zmieniono wyrażenie regularne, aby uwzględnić akcentowane stolice.
Dan

Czy istnieje powód do preferowania andprzez when, w szczególności w pierwszej kolejności?
Clément

@ Clément: andjest zwarty, więc logika działa jak whentutaj. Nie jestem pewien, czy istnieją najlepsze praktyki korzystania z jednego kontra drugiego, ale wygląda na to, że byłoby to dobre pytanie na tej stronie (i tak głosowałbym).
Dan

8

Wolę po prostu stworzyć nową funkcję, która robi to, co zwykle self-insert-command, i więcej .

Oto kilka powodów:

  • Lepsza kontrola, które główne tryby powinny mieć tę funkcję automatycznej korekty. W tym przypadku użycia mogą to być tryby tekstowe org-mode, takie jak text-modeitp.
  • Na rodzaj korekty wymagane w pytaniu, użytkownik będzie typowo uderzyć SPClub RETczy .klucz po słowie. Więc użycie czegoś takiego post-self-insert-hookmoże być przesadą, i zrobilibyśmy to dodatkowe przetwarzanie za każdym razem, gdy naciśniemy dowolny klawisz.

Dlatego poniższe proponowane rozwiązanie wiąże tę funkcję tylko z SPCklawiszem in org-mode-map(ignorując przypadek narożny, w którym słowo może być ostatnim słowem w linii). W razie potrzeby użytkownik może powiązać podobne funkcje opakowania z większą liczbą klawiszy.

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

To ciekawe ćwiczenie elisp :)

Osobiście nie chciałbym tego wiązać, RETponieważ wtedy utraciłbym domyślne wiązania org-modei prawdopodobnie także inne główne tryby. Ale interesujące było poznawanie elti 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))))

O tak, ograniczenie do trybów tekstowych jest zdecydowanie dobrym pomysłem. :)
Malabarba

@Malabarba, czy nie chcesz tego zachowania w ciągach znaków dla trybów pochodnych z trybu prog?
YoungFrog,

@YoungFrog na pewno, ale wtedy będzie musiał sprawdzić, czy rzeczywiście znajduje się w ciągu, w przeciwnym razie po prostu przeszkodzi.
Malabarba

0

Być może ta odpowiedź nie zapewnia oczekiwanego rozwiązania (interaktywna korekta słów podczas pisania), chciałbym podzielić się moimi sposobami walki z takimi problemami.

Przede wszystkim nie lubię rzeczy, które cicho zmieniają mój tekst (wielkie litery itp., Co jeśli chcesz wpisać słowo IBuffer, myślę, że taki „korektor” jest niewłaściwy), więc radzę dwie rzeczy:

Najpierw spróbuj włączyć funkcję „Sticky Keys”. Z początku może się to wydawać dziwne, ale używam go cały czas. Ta funkcja jest dostępna na poziomie systemu operacyjnego / pulpitu, nie jest to Emacs. Gdy ta funkcja jest włączona, najpierw naciskasz, ⇧ Shifta następnie naciskasz inny klawisz, który chcesz zapisać wielką literą. W ten sposób Twój problem nie może nawet powstać, tylko jedna litera jest pisana wielkimi literami w tym sekwencyjnym podejściu! Zmniejsza to również pracę, którą muszą wykonać ręce, trzymając ⇧ Shiftklucz. Myślę, że teraz łatwiej jest pisać.

Po drugie, nadal możesz ⇧ Shiftnormalnie używać klucza (trzymając go), kiedy uważasz, że jest to konieczne, ale chciałbym zaproponować Ci pakiet Emacsa o nazwie Fix Word . Nawet jeśli nie podoba Ci się „Sticky Keys”, możesz z łatwością korygować słowa do odpowiednich form i możesz poprawić kilka słów z rzędu bez zbędnych ruchów kursora. Spróbuj, używam go cały czas. (Nadal trudno jest poprawić rzeczy, jeśli wprowadziłeś kilka słów, a słowo, które musisz wpisać wielkie litery, znajduje się gdzieś pośrodku).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.