0

I have:

(setq mode-line-end-spaces "string")

That displays string in the mode-line.
How can I get string in red there?

2

You need to create a string with the appropriate face. You do that by attaching a face text property to the string, giving it value of some face (predefined or defined for the specific purpose - you can look at all the predefined faces with M-x list-faces-display and pick one from there, or you can define your own face). E.g. here's a snippet to use a predefined face:

(setq s (copy-sequence "sring"))
(put-text-property 0 6 'face 'custom-invalid s)
(setq mode-line-end-spaces s)
| improve this answer | |
4

@NickD provided a good answer: use a face.

OP's comment to Nick's answer says that he'll try to write a function that, given a string, returns a propertized string. Such functions already exist: propertize does that, and so does add-face-text-property.

For example:

(setq ss  (propertize "abcde" 'face '(:foreground "red")))

or

(setq ss  "abcde")
(add-face-text-property 0 (length ss) '(:foreground "red") nil ss)
| improve this answer | |
  • That's good to know. Thanks. – Gabriele Nicolardi Jul 23 at 21:08
  • You should not try to modify a literal string: (setq ss (copy-sequence "abcde")). – Fólkvangr Jul 25 at 11:42
  • @Fólkvangr: Depends on what behavior you want. Do you want to modify a copy of the original string or the original string? The example of using a literal string here is also for brevity - who knows where the actual original string comes from? But if the intention is to modify the original string, then you don't want to use copy-sequence. – Drew Jul 25 at 16:15
  • @Drew: copy-sequence allows to create a mutable string (c.f. Elisp manual version 27, section 2.9 Mutability). In your sample code, add-face-text-property modifies a literal string. – Fólkvangr Jul 25 at 17:19
  • @Fólkvangr: Yes, I know. And? If you can modify something then it's mutable. But all of this is extraneous. If you prefer, read "Suppose that the value of ss is a string", instead of the setq. The point of the answer is that you can use add-face-text-property to add color to a string. – Drew Jul 25 at 18:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.