buggy ANSI escape sequences in R prompt

微笑、不失礼 提交于 2019-12-14 02:35:38

问题


When R is run interactively in a terminal which supports colors, it is possible to use ANSI escape sequences in order to put colors in the prompt, such as

options(prompt = "\033[0;31mThis is red\033[0m> ")

Unfortunately, something goes wrong because for long command lines, the line continuation override the prompt instead of being written in the next line. The problem gets worse when using several colors, because somehow each escape sequence "takes up some space" in the command line, up to the point that the end of the prompt might overwrite the beginning. On my configuration this happens with for instance

options(prompt = paste("\033[0;31m With \033[0;32m multiple",
                   "\033[0;33m colors \033[0;34m this",
                   "\033[0;35m gets \033[0;36m really",
                   "\033[0;37m wrong! \033[0m"))

Why is it so? Is there a workaround?

PS: This rather old post seems related http://r.789695.n4.nabble.com/Xterm-escape-sequences-in-Prompt-td906375.html

update: with R version 3.6.0 and readline 8.0 (don't know which matters here), most of the above described problem disappeared, but some strange behaviors remain. Accepted answer below resolves everything.


回答1:


you need to surround each «invisible» color code with special «marks»: \001 and \002:

options(prompt = "\001\033[0;31m\002This is red\001\033[0m\002> ")

for explanation see $ info readline (or this short answer).




回答2:


Gábor Csárdi on the r-devel mailing list says that I cannot easily change this behavior (http://r.789695.n4.nabble.com/buggy-ANSI-escape-sequences-in-R-prompt-td4728671.html). The workaround he proposes is to use a two lines prompt, which suits me well enough.



来源:https://stackoverflow.com/questions/42072092/buggy-ansi-escape-sequences-in-r-prompt

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!