Traktuj symbole jako słowa w trybach prog

12

W Emacsie istnieje wiele poleceń, które dotyczą „słów”. Przykłady obejmują forward-word, kill-word, upcase-word, mark-word, transpose-words, itd. Określenie „słowo” wydaje się różnią się nieco między poleceniami. Na przykład forward-wordzatrzyma się na podkreślenie w środku słowa (np. foo_bar), Ale mark-wordnie zatrzyma się na podkreślenie.

Czy można zmienić definicję „słowa”, gdy jestem w trybie progresywnym, aby Emacs używał odpowiednich granic słów dla składni bieżącego języka?

Kiedy jestem w c-modeśrodku, chcę forward-wordpomijać podkreślenia, a kiedy jestem w lisp-modeśrodku, chcę forward-wordpomijać zarówno myślniki, jak i podkreślenia itp.

nispio
źródło

Odpowiedzi:

4

Emacs powinien już używać „ odpowiednich granic słów dla składni bieżącego języka ”. Jeśli nie, zgłosi błąd w trybie głównym dla tego języka.

Ale może tak naprawdę nie masz na myśli słów . Może masz na myśli składnię symboli , a nie składnię słów. Emacs rozróżnia oba.

W przypadku składni symboli używaj poleceń symboli, a nie poleceń słów: forward-symbolitd. Z opisu tego naprawdę chcesz.

Jeśli uważasz, że naprawdę chcesz użyć funkcji słowa na symbolu, możesz zmienić kategorię składni poszczególnych znaków, aby mieć składnię składającą się ze słów zamiast składni składającej się z symboli. Ale generalnie nie jest to, co chcesz robić i nie powinieneś tego robić.

Informacje na temat składni znaków można znaleźć w instrukcji Elisp. Zobacz też instrukcję Emacsa i Elisp, aby uzyskać informacje na temat poleceń i innych funkcji działających na symbolach (nie symbolach Lispa, ale tekstach ze składnią symboli w dowolnym języku).

I pamiętaj, że operacje na sexps są często przydatne również do działania na symbolach: C-M-f( forward-sexp), C-M-t( transpose-sexps) itp.

Rysował
źródło
C-M-fjest związany forward-sexpi nie zachowuje się tak, jak to opisujesz. Masz rację, że chcę nawigować za pomocą symboli, ale nie widzę tej opcji.
nispio
@nispio forward sexpjest w zasadzie przez forward-symbolwiększość czasu, z dodatkową wszechstronnością przekraczania pasujących nawiasów klamrowych. Powinieneś dać temu szansę.
Malabarba,
@Malabarba Zdecydowanie się nie zgadzam, że forward-sexpjest to przybliżone przybliżenie forward-symbol. Na początek może myląco przeskoczyć przez całe funkcje, lądując setki linii od miejsca, w którym zacząłeś. Przeskakuje także przez listy argumentów itp. I spróbuj tego: biorąc pod uwagę następujący kod lisp, (global-set-key [remap list-buffers] 'ibuffer)umieść kursor w środku słowa remapi uruchom forward-sexpkilka razy. To podnosi błąd , gdy dochodzi do zamknięcia ]. Nie, dziękuję.
nispio
@nispio Zawsze używam kombinacji sexp i nawigacji słów. W ten sposób mogę uniknąć któregokolwiek z tych problemów, mając jednocześnie wszechstronność obu. Ale to wszystko kwestia preferencji. ;-) Jeśli wiesz, że nigdy nie przegapisz nawigacji po słowach, superword-modemoże to być twój facet.
Malabarba,
Przepraszam, nie powinienem tego sugerować C-M-fi C-M-tdziałać na symbolach (działają one na sexps). Będę edytować, aby poprawić to wrażenie. Ale z pewnością możesz przypisać forward-symboldowolny klucz, który ci się spodoba, jeśli okaże się to szczególnie przydatne. Nie ma transpose-symbols, ale możesz napisać jeszcze raz, jeśli uważasz, że jest to przydatne.
Drew,
11

Spójrz na superword-modei subword-mode. Superword traktuje podkreślenia jako część słowa zamiast granicy, więc foo_bar byłby traktowany jako pojedyncze słowo .
Subword robi odwrotnie, ale dla camelCase, dlatego fooBarjest traktowany jak dwa słowa zamiast jednego.

Brzmi jak zachowanie, którego chcesz cc-modeużyć superword-mode.

(add-hook 'c-mode-common-hook 'superword-mode)

Polecam lekturę nad źródłem subword-mode, ponieważ nawet jeśli te dwa tryby nie działają dokładnie tak, jak chcesz, powinny one pokazać, jak zmienić zachowanie wykrywania słów.

Dłuższa dyskusja na temat emacsredux i ergomacs .

zdeterminowany
źródło
Czy można uprzyjemnić superword-modezabawę paredit? Na przykład paredit-forward-kill-wordnie usuwa całego słowa (zawierającego podkreślenia), gdy superword-modejest włączony.
Renan Ranelli,
Zmienia definicję słowa i pareditszanuje to, więc myślę, że robi to, o co go poproszono.
zdiagnozowano
Chodzi o to, że paredit tego nie przestrzega. paredit-forward-kill-wordnie zabija tego samego słowa zdefiniowanego przez superword-mode.
Renan Ranelli,
Och, źle odczytałem. Hmm Wystarczy spojrzeć na paredit-forward-kill-wordto i wygląda na to, że robi własną analizę. Być może uda się to zamienić, ale prawdopodobnie nie.
zdiagnozowano
3

Jeśli zrozumiałem twoje pytanie, możesz zmodyfikować tabelę składni języka, np. Dla c ++:

(modify-syntax-entry ?_ "w" c++-mode-syntax-table)

M-x apropos to poszukaj tabeli składni również powinno ci pomóc.

Nsukami _
źródło