There is a related bug: #38749. 在 2020年1月4日 +0800 PM6:49,Alan Mackenzie ,写道: > Hello, Alan. > > On Wed, Jan 01, 2020 at 11:27:57 +0000, Alan Third wrote: > > One small annoyance I’ve had with developing Emacs is that the > > helpers for filling in the changelog entries don’t work with Objective > > C methods. I’ve tried writing a patch to make it work. > > > For reference, an Objective C class looks something like: > > > @implementation ClassName > > > - (int)doSomething > > { > > /* do that something */ > > return 1; > > } > > > - (void)doSomethingTo: (SomeClass *)object with: (int)someParam > > { > > return; > > } > > > @end > > > And I think the methods’ names should be written something like: > > > -[ClassName doSomething] > > -[ClassName doSomethingTo:with:] > > > The ‘-’ means it’s an instance method and a ‘+’ would mean it was a > > class method. > > If either ClassName or doSomethingTo is long, you might be taking up too > much space on, for example, the first line of a commit message. But > you've probably already thought this through. How long are these > extended names in practice? > > > It appears to work for me, but I’m not great at Emacs lisp so I > > thought it best to run this by the mailing list in case I’ve made any > > boneheaded errors. > > I've got just a few comments to add to Eli's and Stefan's, so .... > > > Thanks! > > -- > > Alan Third > > > > > From 2945f1c6c57eeabdbeb8e7c058070587a9bf4c0a Mon Sep 17 00:00:00 2001 > > From: Alan Third > > Date: Mon, 30 Dec 2019 16:38:47 +0000 > > Subject: [PATCH] Add ability to find ObjC method names > > > * lisp/progmodes/cc-cmds.el (c-defun-name-1): Add Objective-C method > > name ability. > > --- > > lisp/progmodes/cc-cmds.el | 30 ++++++++++++++++++++++++++++++ > > 1 file changed, 30 insertions(+) > > > diff --git a/lisp/progmodes/cc-cmds.el b/lisp/progmodes/cc-cmds.el > > index 0343f9df32..9165398132 100644 > > --- a/lisp/progmodes/cc-cmds.el > > +++ b/lisp/progmodes/cc-cmds.el > > @@ -2024,6 +2024,36 @@ c-defun-name-1 > > (c-backward-syntactic-ws) > > (point)))) > > > + ((looking-at "[-+]\\s-*(") ; Objective-C method > > I'd be happier here if you could also check we're really in Objc with > (c-major-mode-is 'objc-mode). > > > + (let ((class > > + (save-excursion > > + (re-search-backward "@\\(implementation\\|class\\|interface\\)") > > Here, you might want to give a NOERROR argument to re-search-backward, > so that if implementation etc., isn't found, you can handle the error > gracefully. Something like > > (if (re-search-backward "@\\(....\\)" nil t) > (progn > (c-forward-token-2) > .....) > "") > > > + (c-forward-token-2) > > + (thing-at-point 'word t))) > > + (type (buffer-substring-no-properties (point) (+ (point) 1))) > > + (name > > + (save-excursion > > + (c-forward-token-2 2 t) > > c-forward-token-2 might not be the best function, here. It moves to the > next token, but if there isn't a next token it doesn't move at all. > c-forward-over-token-and-ws might be better. Alternatively, you could > check the result of c-forward-token-2 (say, with zerop) and take special > action if the call has failed. This comment also applies to the later > uses of c-forward-token-2. > > > + (let ((name "")) > > I feel there ought to be a standard CC Mode function which would do the > following scanning to the {, but I can't find it at the moment. > > > + (while (not (looking-at "[{;]")) > > Or, (not (memq (char-after) '(?{ ?\;))), which would be minutely faster. > It would also not change the match-data if you cared about that (which > you don't, here). > > > + (let ((start (point)) > > + (end > > + (progn > > + (c-forward-syntactic-ws) > > + (forward-word) > > + (if (looking-at ":") > > + (+ (point) 1) > > + (point))))) > > + (when (looking-at ":") > > + (c-forward-token-2) > > + (if (looking-at "(") > > + (c-forward-token-2 2 t) > > + (c-forward-token-2 1 t))) > > + (c-forward-syntactic-ws) > > + (setq name (concat name (buffer-substring-no-properties start end))))) > > Just a small point: isn't name always the empty string before this form? > If so, you could get rid of the concat and just use > buffer-substring-no-properties. > > > + name)))) > > + (format "%s[%s %s]" type class name))) > > As an alternative to format, you could use (concat type "[" class " " > name "]") > , which is more direct, but probably doesn't matter here. > > > + > > (t ; Normal function or initializer. > > (when (looking-at c-defun-type-name-decl-key) ; struct, etc. > > (goto-char (match-end 0)) > > -- > > 2.24.0 > > -- > Alan Mackenzie (Nuremberg, Germany). >