Behandle Symbole als Wörter in den Prog-Modi

12

Es gibt eine Reihe von Befehlen in Emacs, die sich auf "Wörter" beziehen. Beispiele hierfür sind forward-word, kill-word, upcase-word, mark-word, transpose-wordsusw. Der Begriff „Wort“ scheint ein wenig zwischen den Befehlen zu variieren. Beispiel: forward-wordStoppt bei einem Unterstrich in einem Wort (z. B. foo_bar), mark-wordhört aber nicht bei dem Unterstrich auf.

Ist es möglich, die Definition von "Wort" im Prog-Modus zu ändern, sodass Emacs die entsprechenden Wortgrenzen für die Syntax der aktuellen Sprache verwendet?

Wenn ich in c-modebin, möchte ich forward-wordUnterstriche überspringen, und wenn ich in lisp-modebin, möchte ich forward-wordsowohl Bindestriche als auch Unterstriche überspringen, usw.

Nispio
quelle

Antworten:

4

Emacs sollte bereits " die entsprechenden Wortgrenzen für die Syntax der aktuellen Sprache " verwenden. Wenn dies nicht der Fall ist, wird ein Fehler für den Hauptmodus für diese Sprache gemeldet.

Aber vielleicht meinst du nicht wirklich Worte . Vielleicht meinst du die Symbolsyntax , nicht die Wortsyntax. Emacs unterscheidet die beiden.

Verwenden Sie für die Symbolsyntax Symbolbefehle und keine Wortbefehle: forward-symbolusw. Nach Ihrer Beschreibung ist dies das, was Sie wirklich wollen.

Wenn Sie der Meinung sind, dass Sie eine Wortfunktion für ein Symbol wirklich verwenden möchten, können Sie die Syntaxkategorie bestimmter Zeichen so ändern, dass die Syntax aus Wörtern und nicht aus Symbolen besteht. Aber im Allgemeinen ist dies nicht das, was Sie tun möchten und Sie sollten es nicht brauchen.

Informationen zur Zeichensyntax finden Sie im Elisp-Handbuch. Im Emacs-Handbuch und im Elisp-Handbuch finden Sie Befehle und andere Funktionen, die mit Symbolen arbeiten (keine Lisp-Symbole, sondern Text mit Symbolsyntax, in welcher Sprache auch immer).

Und denken Sie daran, dass Operationen an Sexps oft auch nützlich sind, um auf Symbole zu reagieren: C-M-f( forward-sexp), C-M-t( transpose-sexps) usw.

Drew
quelle
C-M-fist gebunden an forward-sexpund verhält sich nicht wie das, was Sie beschreiben. Sie haben Recht, ich möchte nur mit Symbolen navigieren, aber ich sehe diese Option nicht.
Nispio
@nispio forward sexpist im Wesentlichen die forward-symbolmeiste Zeit mit der zusätzlichen Vielseitigkeit, auch über passende Zahnspangen zu gehen. Sie sollten es eine Chance geben.
Malabarba
@ Malabarba Ich stimme überhaupt nicht zu, dass dies forward-sexpeine enge Annäherung an ist forward-symbol. Für den Anfang kann es Sie verwirrend über ganze Funktionen springen und Sie Hunderte von Zeilen von wo Sie angefangen haben landen. Außerdem werden Argumentlisten usw. übersprungen. Versuchen Sie Folgendes: Stellen (global-set-key [remap list-buffers] 'ibuffer)Sie den Cursor mit dem folgenden Lisp-Code in die Mitte des Wortes remapund führen Sie ihn forward-sexpeinige Male aus. Es löst einen Fehler aus, wenn es das Schließen erreicht ]. Nein Danke.
Nispio
@nispio Ich benutze immer eine Kombination aus Sexp und Wortnavigation. Auf diese Weise kann ich jedes dieser Probleme vermeiden und gleichzeitig die Vielseitigkeit von beidem nutzen. Aber es ist alles eine Frage der Präferenz. ;-) Wenn du weißt, dass du niemals die Wortnavigation verpassen wirst, ist superword-modedas dein Typ.
Malabarba
Entschuldigung, ich hätte das nicht vorschlagen C-M-fund C-M-tauf Symbole einwirken sollen (sie wirken auf Sexps). Ich werde diesen Eindruck korrigieren. Sie können sich aber auf jeden Fall forward-symbolan einen beliebigen Schlüssel binden , wenn Sie ihn für besonders nützlich halten. Es gibt keine transpose-symbols, aber Sie können auch eine schreiben, wenn Sie dies für nützlich halten.
Drew
11

Schauen Sie sich superword-modeund an subword-mode. Superword behandelt Unterstriche als Teil eines Wortes anstelle einer Grenze und foo_bar würde daher als ein einzelnes Wort behandelt .
Subword macht das Gegenteil, aber für camelCase, so fooBarwird es als zwei Wörter anstelle von einem behandelt.

Es klingt wie das Verhalten Sie wollen , ist cc-modezu verwenden superword-mode.

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

Ich würde empfehlen, die Quelle durchzulesen subword-mode, denn auch wenn diese beiden Modi nicht genau das tun, was Sie wollen, sollten sie Ihnen zeigen, wie Sie das Worterkennungsverhalten ändern können.

Längere Diskussion über Emacsredux und Ergomacs .

dgtized
quelle
Kann man damit superword-modeschön spielen paredit? paredit-forward-kill-wordLöscht beispielsweise nicht das gesamte Wort (mit Unterstrichen), wenn diese superword-modeOption aktiviert ist.
Renan Ranelli
Es ändert die Definition eines Wortes und pareditrespektiert dies, also denke ich, dass es das tut, was von ihm verlangt wird.
Geplant
Die Sache ist, dass paredit das nicht respektiert. paredit-forward-kill-wordtötet nicht das gleiche Wort wie superword-mode.
Renan Ranelli
Oh, ich habe falsch verstanden. Hmm. Wirf einen Blick darauf paredit-forward-kill-wordund es sieht so aus, als würde es sein eigenes Parsen durchführen. Könnte also in der Lage sein, das auszutauschen, aber wahrscheinlich nicht.
10.
3

Wenn ich Ihre Frage verstanden habe, können Sie die Sprachsyntaxtabelle ändern, z. B. für c ++:

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

M-x apropos dann sollte dir das nachschlagen der syntax-tabelle auch helfen.

Nsukami _
quelle