> Thanks, here are some comments on it. I wish someone who has worked on
> ERC could say something. I never use(d) IRC and have hence no clue what is
> a "user mode prefix", for example.A user mode prefix is referring to a symbol prefixed to your nickname to display to other users that you have a certain user mode.Take "&nickname" for instance. The "&" is the user mode prefix showing you have +a (admin) user mode.
> > ***************
> > *** 1244,1250 ****
> > (erc-format-message
> > 'JOIN ?n nick ?u login ?h host ?c chnl))))))
> > (when buffer (set-buffer buffer))
> > ! (erc-update-channel-member chnl nick nick t nil nil host login)
> > ;; on join, we want to stay in the new channel buffer
> > ;;(set-buffer ob)
> > (erc-display-message parsed nil buffer str))))))
> > --- 1244,1250 ----
> > (erc-format-message
> > 'JOIN ?n nick ?u login ?h host ?c chnl))))))
> > (when buffer (set-buffer buffer))
> > ! (erc-update-channel-member chnl nick nick t nil nil nil nil nil host login)
> > ;; on join, we want to stay in the new channel buffer
> > ;;(set-buffer ob)
> > (erc-display-message parsed nil buffer str))))))
>
> In my opinion, erc-update-channel-member had too many arguments already.
> Maybe some of these args should be combined into an erc-channel-user object?
My first approach was to change the erc-channel-user struct to use a list of modes,eliminating some of the args, but it seemed to cause issues elsewhere. I'll revisit this again soon.> > + (defsubst erc-channel-user-owner-p (nick)
> > + "Return t if NICK is an owner of the current channel.">
> Usually we say "non-nil" rather than "t", unless the callers need to> rely on the return value being t rather than some other non-nil value.Indeed, the callers do rely on the value being t in this case. rather than just non-nil> > + (defface erc-nick-prefix-face '((t :weight bold))
> > + "ERC face used for user mode prefix."
> > + :group 'erc-faces)
> > +
> > + (defface erc-my-nick-prefix-face '((t :weight bold))
> > + "ERC face used for my user mode prefix."
> > + :group 'erc-faces)
>
> Try to use the :inherit property at least to link those two (so users
> who just want to change the two without making them different only need
> to change one of the two) and ideally by inheriting from some other face.
Good idea. I have updated this so each of these two faces inherits from the appropriate nick faces.By default the prefix will be the same color unless these are changed individually.> > + (defun erc-get-user-mode-prefix (user)
> > + (when user
> > + (cond ((erc-channel-user-voice-p user) "+")
> > + ((erc-channel-user-half-op-p user) "%")
> > + ((erc-channel-user-op-p user) "@")
> > + ((erc-channel-user-admin-p user) "&")
> > + ((erc-channel-user-owner-p user) "~")
> > + (t ""))))
>
> Here I assume there's some kind of logic or convention. If not, maybe
> it would be appropriate to do something like add some `help-echo'
> property to those extra chars?Sure, I've updated the patch to add help-echo props> One more thing: the above suggests that maybe
> voice/halfop/op/admin/owner are mutually exclusive. Is that the case?
> Could these be collapsed into a single element which could have values
> `voice', `halfop', `op', `admin', or `owner' (or nil)?These are actually not mutually exclusive. A user could have all of these modes enabled, but it isn't typical.In that case we only want to display the most valuable. If a user has +vo we want to display @.If a user has +oa we display &. etc. Glad you noticed this though, this should check in reverse order.> > (defun erc-format-@nick (&optional user channel-data)Ok
> > "Format the nickname of USER showing if USER is an operator or has voice.
> > Operators have \"@\" and users with voice have \"+\" as a prefix.
> > Use CHANNEL-DATA to determine op and voice status.
> > See also `erc-format-nick-function'."
> > (when user
> > ! (let ((nick (erc-server-user-nickname user)))
> > ! (concat (erc-propertize (erc-get-user-mode-prefix nick) 'face 'erc-nick-prefix-face) nick))))
> Please try to stay with 80 columns.
> BTW, IIUC, ERC is not distributed separately from Emacs any more, so we
> don't need to use compatibility crutches like erc-propertize any more
> (tho it's fine to use it as well for now, and it could be removed "all at
> once" in another patch).Good point, I'll clean that up in another patch.> > ! "(ov)@+"))
> [...]
> > ! "(qaohv)~&@%+"))
>Yay! Magic!;D these are the default user modes> ! (let (prefix op-ch voice-ch names name op voice)
> (setq prefix (erc-parse-prefix))
> ! (setq op-ch (cdr (assq ?o prefix))
> ! voice-ch (cdr (assq ?v prefix)))
>
> this should have been
>
> (let* ((prefix (erc-parse-prefix))
> (op-ch (cdr (assq ?o prefix)))
> (voice-ch (cdr (assq ?v prefix)))
> names name op voice)
>
> Which is both cleaner and faster.
>
> So when you change such code, you can take advantage of the change to
> try and reduce occurrences of those "let-without-init followed by setq".This has been updated, thanks.
> This also makes it sound like those op/voice/admin/owner are mutually> exclusive and should be combined into a single element.
> Otherwise, please simplify the code with:
> (setq op 'off voice 'off halfop 'off admin 'off owner 'off)
> (cond
> ((eq (elt item 0) voice-ch)
> (setq name (substring item 1)
> voice 'on))
> [...])Yes, I agree. I have simplified it.> > + (when (and voice
> > + (not (eq (erc-channel-user-voice cuser) voice)))
> > + (setq changed t)
> > + (setf (erc-channel-user-voice cuser)
> > + (cond ((eq voice 'on) t)
> > + ((eq voice 'off) nil)
> > + (t voice))))
>
> Won't this cause `changed' to "always" be set to t, since
> (erc-channel-user-voice cuser) will never be `on' or `off' and hence
> never be equal to `voice'?> Also, instead of using on/off and converting them from&to nil/t, maybe
> it would be simpler to use nil/t plus a special value
> (e.g. `:unspecified') for the case where the value is simply
> not provided.Sure, I will look at revising this in a separate patch. I tried to keep this as simpleas possible but I have noticed things like this and others that could be simplifiedand cleaned up a bit.Attached is the new patch cleaned up per your suggestions.Thanks