count = cprintf(style,format,...)
CPRINTF processes the specified text using the exact same FORMAT arguments accepted by the built-in SPRINTF and FPRINTF functions.
CPRINTF then displays the text in the Command Window using the specified STYLE argument. The accepted styles are those used for Matlab's syntax highlighting (see: File / Preferences / Colors / M-file Syntax Highlighting Colors), and also user-defined colors.
The possible pre-defined STYLE names are:
'Text' - default: black
'Keywords' - default: blue
'Comments' - default: green
'Strings' - default: purple
'UnterminatedStrings' - default: dark red
'SystemCommands' - default: orange
'Errors' - default: light red
'Hyperlinks' - default: underlined blue
STYLE beginning with '-' o '_' will be underlined. For example:
'-Blue' => underlined blue, like 'Hyperlinks'
'_Comments' => underlined green
STYLE beginning with '*' will be bold (R2011b+ only). For example:
'*Blue' is bold blue;
'*Comments' is bold green etc.
Note: Matlab does not currently support both bold and underline, only one of them can be used in a single cprintf command. But of course bold and underline can be mixed by using separate commands.
STYLE colors can be specified in 3 variants:
[0.1, 0.7, 0.3] - standard Matlab RGB color format in the range 0.0-1.0
[26, 178, 76] - numeric RGB values in the range 0-255
'#1ab34d' - Hexadecimal format in the range '00'-'FF' (case insensitive). 3-digit HTML RGB format is also accepted: 'a5f' = 'aa55ff'
STYLE can be underlined by prefixing - : -[0,1,1] or '-#0FF' is underlined cyan
STYLE can be made bold by prefixing * : '*[1,0,0]' or '*#F00' is bold red
STYLE is case-insensitive and accepts unique (non-ambiguous) partial strings (for example, 'cy' instead of 'cyan').
Examples (see results in the attached screenshot):
cprintf; % displays the demo
cprintf('text', 'regular black text');
cprintf('hyper', 'followed %s','by');
cprintf('key', '%d colored', 4);
cprintf('_green', 'underlined green');
cprintf(-[1,0,1], 'underlined magenta');
cprintf('*blue', 'and *bold* (R2011b+ only)\n');
cprintf([1,0.5,0],'and multi-\nline orange\n');
Bugs and suggestions:
Please send to Yair Altman (altmany at gmail dot com)
This code heavily relies on undocumented and unsupported Matlab functionality. It works on Matlab 7+, but use at your own risk!
A technical description of the implementation can be found at: http://UndocumentedMatlab.com/blog/cprintf
See details & current limitations in the main help section
Yair Altman (2021). cprintf - display formatted colored text in Command Window (https://www.mathworks.com/matlabcentral/fileexchange/24093-cprintf-display-formatted-colored-text-in-command-window), MATLAB Central File Exchange. Retrieved .
Great submission, maintained for many years by a responsive author, and still getting feature updates like the hexadecimal color format. Thanks a lot!
Very useful. Thanks.
@DavidBryers - I have no such plans
Any plans to update so that a cprintf will work for Simulink model output into the Diagnostic Viewer or command window depending on what is current?
THANKS A LOT!! Genius!!
ur a god
Thanks a lot. I have been looking for this for a while
Thank you, excellent function, exactly where I was looking for!
Excellent code, even better it was really easy to CHOOSE ANY COLOR (RGB). Just:
cprintf ([0.54 0.17 0.89],'my error(warning) message in rgb PURPLE!\n');
where [R/255 G/255 B/255] (Matlab uses the normalized rgb)
This is awesome and makes my output so much easier to read. Thank you.
Thank you. The function omits the last character, but otherwise works superbly.
Ronald - the Matlab help will not include any information about changing text color because this functionality is UNDOCUMENTED.
The only way to change the command window text is to use the cprintf utility, which relies on undocumented functionality. You can download cprintf from the File Exchange. Cprintf has been available since 2009 and has worked on all Matlab releases of the past 15 years or so.
this is worthless. Everything so far about changing text color in the matlab help is worthless.
Ivano - after you download the utility you have to add its path to the Matlab path otherwise Matlab cannot find it
I am trying this line of code "cprintf([1,0.5,0],'and multi-\nline orange\n');" in the Command Window in R2018a Update 6 and I get and "Undefined function or variable 'cprintf'."
Am I doing some wrong?
Terrific! Should have discovered this 2009. I'm 9 years late.
@Peter - cprintf relies on a Java-based Desktop. It does not work on the web-based desktop. I have no near-term plans to adapt cprintf for the web.
I've used this for many years, totally brilliant. With MATLAB OnLine everything comes out red, even the case cprintf('text\n') is red. As a sanity check fprintf('text\n') is indeed black. The good news is that there is some control over color.
Fantastic! Once again, I'm in awe!
No - if you do not put spaces in between the words, it does get messy
However, bold does not particularly work for me - only the first 4 characters are bold and all 5 have the proper color
Very nice, elegant function to improve the communication of matlab messages.
Great! I wish matlab would integrate this ability in the next version
can we have a strikethrough formatting option included to this???
sooooo needed thank you very much!!
Works and well documented
In order to maintain an underline through out the entire string a backspace character can be used.
This helps when a space is not wanted. Perhaps a nice addition to the code?
wrnCol = [255,100,0]/255;
Warn = 'blahblah';
cprintf(wrnCol, 'Warning ''');
cprintf(-wrnCol, [Warn ' ']);fprintf('\b');
cprintf(wrnCol, ''' was not found.\n');
Awesome. Just awesome. I remember googling the crap out of this a couple months ago, but forums mostly said it was not possible. Then I came across the undocumented matlab blog. Thank you!
This is great
Thanks Yari, abusing Matlab again! While playing with it, I found out that single character formatting does not work in Matlab 2014b.
You might also want to look at the question in stackoverflow:
This is very useful function. Thanks!
I try to use it color character by character in a string, but it does not color a single character in a string. For example,
test = gene(1);
It does not color first the character 'A'. Could you please check? Would someone help me for this? Thank you!
This is an excellent function that I use all of the time. It is very useful to have color coded text in the command window to make sure the users of the code are watching the most important information. It does have a few minor quirks (like all code does) but that does not take away from it being an excellent tool. The only way to improve this tool is if Mathworks were to take this on as their own function and integrate it so that it handles all the different platforms and upgrades successfully.
@retrobytes - of course it works, you have a bug in YOUR code (a missing '):
cprintf([1,0.5,0], 'text text %.0f text text %d text text\n', -pi, 5);
Sometimes, parts of the displayed text don't come out in the expected color, but the text is always displayed correctly. The invalid colors (when they happen) are due to internal Matlab implementation details over which we simply have no control. In most cases it works well, within those limitations.
Does this mean cprintf is a bad function? No - it simply means that it has some limitations. Within these limitations cprintf provides excellent functionality.
I'm sick and tired of people who do not appreciate the huge effort that went into creating this function, which nobody ever thought possible and nobody ever came even close to replicating. Criticizing it just because it is not 100% perfect in your eyes, although it gives you something much better than you had before is plain ingratitude. I guess that you would complain even if I gave you a brand new Mercedes car as a gift, if you thought its color was imperfect.
If you think that you can implement this function any better then go ahead and try it. Maybe then you'd appreciate all the hard work that went into creating cprintf.
A useful tool, overall.
Unfortunately, does not work (at least not correctly) with passing the variables at the end, e.g.:
cprintf(rgb('DarkOrange'), 'text text %.0f text text %d text text, var1, var2)
Great job! Thanks a lot!
very nice. I use this function to display a matrix that the specific row needs to highlight with color red. very useful. wonderful work...
taking back a previous comment, this works just great on R2013a. Extremely useful, kudos.
I will be happy to hear from somebody who got it to work in newer matlabs - I Couldn't make it work on my R2013a (on mac).
1 issue found:
If I have a string containing an html link, on this line the text before the link is formatted in red. Very strange.
text='Titi <a href="matlab:disp(''toto'')">toto</a>'
Thanks a lot!
Good job! However, I may have found a bug related to cell code mode.
Consider this piece of code
s1 = 'hello\n';
s2 = 'h\n';
if you run it as a normal script (using F5) everything is fine. But if you run the same code in cell mode (using CTRL+Enter) the result is not what you expected.
This is driving me crazy. I use Matlab R2013b and I use lots of cell code in my scripts, so this is giving me some annoyance.
This is even more complicated since if you try to run the code in debug mode, the problem doesn't show up anymore!
I think the problem is related to the fact that, when using cell code mode, the name of the script file is not passed to the command window (while it appears in the cmd window when using F5) and this in some way reflects in the computation of the current position in the command window.
This is a really good submission, thanks!
I was able to add a predefined style 'Warnings' by
a. adding a 'Warnings' entry in the validStyles cell (after the 'Errors' entry) in function processStyleInfo,
b. changing the subsequent 'elseif mathces < 8' to 'elseif matches < 9' and
c. changing the following 'requestedColor = colors(matches-7,:);' to 'requestedColor = colors(matches-8,:);'.
It seems to be working fine so far.
An interesting exploration into the inner workings of MATLAB, beautifully explained by the author on his blog. I particularly like the innovative use of RGB values as the unique color strings, that allows any color to be displayed. (Great blog too!)
Good job! Thanks and congratulations!
There is a minor bug with bold text. The last character of a bold text is displayed as normal text. This is only a problem if the bold text ends with no space or carriage return.
In the exampele below the 'd' of the bold text is shown in normal font.
Nevertheless, a great tool!
Awesome submission. Works perfectly on my 2012b. Thanks alot, Yair!
Sébastien - you are using cprintf incorrectly. Firstly, the extra parameter 4 has no meaning since you are not using any printf fields (e.g. %d) in your string.
Secondly, you don't need (and actually should not use) \r - \r clears the current line to the beginning on some systems, which could explain what you are seeing.
Thanks for your code.
It works well with Matlab 2007 but colors are not displayed on my computer with Matlab 2012b.
The text is displayed but in white in fact.
If I write cprintf('k','test\r\n', 4), the line is written in white with a blue "-" before the string
If I write cprintf('-k','test\r\n', 4), text is displayed in blue and underscored with a blue "-" before the string.
Could you help me please?
Thanks a lot!
Anyway, I have one suggestion: it doesn't turn the colouring back off unless at the end of line, e.g.:
cprintf('r', 'aaa'); fprintf('bbb')
prints everything in red...
This is a fantastic submission. The bugs I have encountered pertain to R2011a. They are, as documented, a space is inserted at the front of each line, and that one must use \n at the end of each string in format. Minor inconveniences for such a good program. Great job Yair!
nice job! thanks.
i had problems using the function (R2012a) in a loop, colors did not work out nicely from iteration to iteration. i added fprintf('\n'); before the cprintf line and that seemed to solve, at least my problems. i also added ; to the end of all of my fprintf and cprintf lines.... that also helped.
@Adam - the version that I uploaded yesterday includes support for *bold* formatting
Unfortunately on win7, R2011b 64bit
>> cprintf([255 175 0]./255, 'warning text')
does not produce the same colored text as on R2009a, WinXP, 32bit. Any idea why?
This is what makes Matlab fun! Thanks Yair
Suggestion - can you add support for bold text to. I presume its doable since the command window already utilizes bold text.
it is just aswm.... thank u ,thank u :)
For all the people who have noted about cprintf's issues with R2011b, the new version that was just uploaded fixes those problems, as well as the issue of the space (on R2011b only)
You might find that changing the fprintf command on line 164 to use the standard output instead of standard error may solve your problem with the text colour
A very useful function. Stopped working under R2011b (as Mark Morehead pointed it out).
Yair, do you plan to update it so that we can have this great stuff in future releases?
I have been using the cprintf function and find it very useful.
I just installed Matlab V 2011b (64bit) and cprintf is no longer working properly.
When I run it, I get:
>> cprintf('text', 'regular black text');
If I highlight it, I get:
>> cprintf('text', 'regular black text');
regular black text>>
So the text is printing in white. There must be a color inversion problem caused by something in the update in Matlab.
@Yair - I've found one bug:
Since I use black background and gray text for the command window, cprintf('text', 'Hello World!\n') was showing the string in black, i.e. invisible with my configurations.
By watching around a little bit, I figured out that the text color is "saved" in the 'ColorsText' preference, so I changed the code around line 242 to:
% Regular text
elseif matches == 1
style = 'ColorsText';
Noew, when I use 'text' as style, I get *exactly* the color I have set in the preferences.
This function is great. I've got only one problem. If I run it on a remote machine by ssh but without X (say via Cygwin), then it reports error:
<a href=""> </a>??? Attempt to reference field of non-structure array.
Error in ==> cprintf at 156
xCmdWndView = cw.getComponent(0).getViewport.getComponent(0);
Obviously, I don't expect to see color when no display is specified. But I do want to my code platform independent. That is, if there is display, then show the colors. Otherwise, please just behave in the same way as fprintf(1, ...) (ie, please don't return error/failure).
This helps me a lot.
However, it cannot cooperate with fprintf.
cprintf('Text', '3D distance error (max):');
cprintf('Keywords', '%f\n', max(EVert));
3D distance error (max): 0.226647
Since I do not want the leading space, when trying
fprintf('3D distance error (max):');
cprintf('Keywords', '%f\n', max(EVert));
3D distance error (max):_
There is underline with the right color, but the number is in WHITE.
Could you help me out, Yair?
This function is great! It is in my todo list to use it, so I know almost nothing about it at this point. However, couldn't you replace the white space on line 145 with a \r for (at least partly) solving your white space issue?
Just had a sneaky look, so I have no idea how it impacts the rest.
@James - unfortunately, blinking text is difficult to implement.
If this is sufficiently important to you, I'll be willing to develop it for you for a fee - contact me by email if this is the case.
Great work. Of course, that means I want more! Is it possible to have blinking text? I know this is generally obnoxious to use, but that is exactly what I want when I put up a warning message and a pause in a piece of code that is about to potentially crash MATLAB (a bug demonstration code).
CPRINTF in ~45 times more slowly than FPRINTF.
There is an opportunity to get rid of calling DRAWNOW in CPRINTF? This greatly reduces the performance.
Thanks a lot.
Bijit - you cannot do that with cprintf, but you can do it via the text properties of the dialog box:
hDlg=helpdlg(Help_str,'Title and Authors');
hText = findall(hDlg,'type','text');
Is it possible to change the text color of a GUI dialog box text with this cprintf function? For example:
helpdlg(Help_str,'Title and Authors');
Now I want to see 'bijit, yair' in different color.
read the description: cprintf prints to the command prompt - NOT TO A FILE !
Sharron - I uploaded a new version that fixed the edge-case that you have reported
This is a great tool!.
However I think the command doesn't work well in printing the back slash, for example
does not generate output \abc
Nice! Although I run almost exclusively on Unix using the -nodesktop flag. Without the Mathworks command window this function doesn't work. In fact, it generates an error. Perhaps it ought to fail gracefully?
This is a great little tool! Thank You!
There seems to be another bug, this one involving the '%' character. For example,
cprintf( 'keyword', '%% keyword\n' )
merely turns the command prompt (double chevron) blue, rather than printing '% keyword' and a newline character.
fprintf( '%% keyword\n' ), on the other hand, prints just what you would expect.
@Karl - this is a corollary of the known issue with non-newline-terminated strings. In this case, the initial fprintf() was non-newline-terminated, getting cprintf confused...
A workaround for this case is to simply use cprintf for the initial black text, instead of fprintf:
cprintf('text', 'Here: ');
This is great! I wish Matlab documented its Java innards better. Anyway, there seems to be another small bug.
results in a blue underscore followed by the word 'Blue' in white (invisible on white background of my command window - but shows up when highlighted).
However, the same code as above, only using '-blue' instead of 'blue', works fine (gives the expected underlined blue text).
I'm using Matlab 2007b on a Linux box.
yes Petter - this is a known limitation of CPRINTF that is mentioned in its help section as well as the TODO list (at the bottom of the file). Unfortunately, it seems that if there is no space separator, then Matlab attempts to combine the adjacent style segments, thereby overrunning the first segment's style with the second's. Adding a separator solves this. If anyone finds a workaround I'll be happy to hear. Until then it's a small price to pay...
OK, I now think that may be required.
The function prints an extra white space after each string. Example:
str = 'Welcome!';
n = length(str);
for k = 1:n
col = [k/n 0 0];
W e l c o m e !
I did not know this was possible
Tested successfully with the current release R2009a under Windows and with R2008b under Linux 64-bits. Just a great submission!
A while ago, a colleague asked me if it was possible to display in a color other than the default, in the Command Window, the values violating some thresholds in an optimization problem. My response was, "That must be doable, because MATLAB does that for, say, error messages. I will look into it." Well, you looked into it alright, Yair!
Inspired: r0oland/motivate-me, setPrompt - Set the Command Window prompt, TXTMENU - Text-Based Menu for the Command Window, tcprintf : ANSI colored output in terminal, ecopath_matlab: A Matlab implementation of Ecopath, Colored Calendar, Spike Extraction Tool, Lynx MATLAB Toolbox, google, English to Turkish Dictionary, Script Execution Notifier using Pushover, JSONRPC2: a set of classes to encode/decode JSON RPC messages, xPlot – Behaves Like Plot But With Built-in Tools for Interactively Displaying/Filtering Metadata
Find the treasures in MATLAB Central and discover how the community can help you!Start Hunting!