- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在用 C 编写解释器,它在 ubuntu 控制台中运行。我想在键入时更改 int
、double
、function
等关键字的颜色。
示例:functio
应该是白色的,但是当我输入关键字 function
后,它的颜色应该立即变为蓝色。
可以回答我的问题的简单示例:当字母数为奇数时,我想将终端中的文本颜色设置为蓝色,而当字母数为偶数时,我想将其设置为红色,并且应该在键入时发生(而不是在按回车键之后)。
如何在终端中操作文本并在输入时更改其颜色?
最佳答案
在终端控制台上进行实时文本编辑是一种魔法,因为没有可靠的方法可以确保控制台支持您需要的所有转义序列。对于全屏编辑器,您可以使用 ncurses
,但“内联”比看起来更难。举个例子:我的 Mac OS X 自己的终端可以优雅地处理单行输入,但当文本字符串包含不可打印的内容或跨度超出终端的宽度时,它会感到困惑。
以下不那么快(但仍然很脏)的 C 程序允许非常基本的输入。它需要跳过几个环节:在 OS X 上,getchar
将其输入回显到命令行;在输入 Enter 之前,终端本身 (!) 不会将其输入转发给正在运行的程序。其他控制台可能有其他怪癖。
单线编辑工作,唯一值得注意的是如何处理运行线以彩色显示部分。剩下的就是在显示字符串时遍历它,使用 ANSI 转义码来打开和关闭颜色。我的语法高亮方法非常基础;如果您有更多关键字,您可能希望以更快的方式查找它们。它也无法处理通配符,因此您无法突出显示“任何十进制数”之类的内容。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <termios.h>
#define PP_INVERSE "\x1b[7m"
#define PP_RED "\x1b[31m"
#define PP_BLUE "\x1b[34m"
#define PP_RESET "\x1b[39m\x1b[0m"
const char *keyword_list[] = {
"int",
"double",
"function"
};
/* ha ha */
#define SURELY_LARGE_ENOUGH 256
char line_buf[SURELY_LARGE_ENOUGH] = "";
void display_line (char *text, int cursor)
{
char *startptr, *endptr;
int i;
printf ("\r>");
startptr = text;
do
{
/* hop from one 'word' to another */
/* check for non-word first */
while (*startptr && !isalnum(*startptr))
{
putchar (*startptr);
startptr++;
}
if (*startptr)
{
endptr = startptr;
/* gather next word */
while (*endptr && isalnum(*endptr))
endptr++;
/* check if it's a known keyword */
for (i=0; i<sizeof(keyword_list)/sizeof(keyword_list[0]); i++)
{
if (keyword_list[i][0] == *startptr && strlen(keyword_list[i]) == endptr - startptr)
{
if (!strncmp (startptr, keyword_list[i], strlen(keyword_list[i])))
{
break;
}
}
}
if (i<sizeof(keyword_list)/sizeof(keyword_list[0]))
{
printf (PP_INVERSE "%s" PP_RESET, keyword_list[i]);
startptr = endptr;
} else
{
if ((endptr - startptr) & 1)
{
printf (PP_BLUE);
} else
{
printf (PP_RED);
}
while (startptr < endptr)
{
putchar (*startptr);
startptr++;
}
printf (PP_RESET);
}
}
} while (*startptr);
/* erase any following leftovers */
printf ("\x1B[K");
/* position cursor */
printf ("\r\x1B[%dC", cursor+1);
fflush (stdout);
}
/* turn off echo for getchar
see https://stackoverflow.com/questions/558009/ansi-c-no-echo-keyboard-input
*/
void getch_disable_echo (void)
{
struct termios t;
tcgetattr(STDIN_FILENO, &t);
t.c_lflag &= ~ECHO;
t.c_lflag &= ~ICANON;
tcsetattr(STDIN_FILENO, TCSANOW, &t);
}
void getch_enable_echo (void)
{
struct termios t;
tcgetattr(STDIN_FILENO, &t);
t.c_lflag |= ECHO;
t.c_lflag |= ICANON;
tcsetattr(STDIN_FILENO, TCSANOW, &t);
}
int get_input (void)
{
int cursor_pos = 0;
int key;
do
{
display_line (line_buf, cursor_pos);
key = getchar();
if (isprint(key))
{
if (!line_buf[cursor_pos])
line_buf[cursor_pos+1] = 0;
line_buf[cursor_pos] = key;
cursor_pos++;
}
/* poor man's backspace */
if (key == 127)
{
if (cursor_pos)
{
cursor_pos--;
line_buf[cursor_pos] = 0;
}
}
if (key == '\n')
{
printf ("\r%s \n", line_buf);
line_buf[0] = 0;
cursor_pos = 0;
}
} while (key != EOF);
return 0;
}
int main (void)
{
getch_disable_echo();
strcpy (line_buf, "this is a function test");
get_input ();
getch_enable_echo();
return 0;
}
如您所见,这已经是一个相当大的程序,而且它只允许进行基本的编辑。我省略了制表符完成、光标移动、撤消以及用户可能期望从全行编辑器获得的各种其他细节。与其重新发明轮子,您可以查看 GNU readline
的源代码并检查调整其重绘例程以允许自定义语法突出显示是否更容易。
除此之外,它工作得很好:
关于键入时更改 linux 终端中关键字的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47968822/
我正在阅读 java swing,但在理解它时遇到问题。 Color 是一个类吗? Color[] col= {Color.RED,Color.BLUE}; 这在java中是什么意思? 最佳答案 Is
我正在研究用 python 编写的 pacman 程序。其中一个模块是处理吃 bean 游戏的图形表示。这当然是一些主机颜色。列表如下: GHOST_COLORS = [] ## establishe
本网站:http://pamplonaenglishteacher.com 源代码在这里:https://github.com/Yorkshireman/pamplona_english_teache
我最近将我的手机更新为 Android Marshmallow 并在其上运行了我现有的应用程序,但注意到颜色行为有所不同:将更改应用到 View (可绘制)的背景时,共享相同背景的所有 View (引
所有 X11/w3c 颜色代码在 Android XML 资源文件格式中是什么样的? I know this looks a tad ridiculous as a question, but giv
试图让 ffmpeg 创建音频波形,同时能够控制图像大小、颜色和幅度。我已经尝试过这个(以及许多变体),但它只是返回无与伦比的 "。 ffmpeg -i input -filter_complex "
我很好奇你是否有一些关于 R 中颜色酿造的技巧,对于许多独特的颜色,以某种方式使图表仍然好看。 我需要大量独特的颜色(至少 24 种,可能需要更多,~50 种)用于堆叠区域图(所以不是热图,渐变色不起
我看到的许多 WPF 示例和示例似乎都有硬编码的颜色。这些指南 - http://msdn.microsoft.com/en-us/library/aa350483.aspx建议不要硬编码颜色。在构建
我想更改文件夹的默认蓝色 如何设置? 最佳答案 :hi Directory guifg=#FF0000 ctermfg=red 关于Vim NERDTree 颜色,我们在Stack Overflow上
是否有关于如何将任意字符串哈希为 RGB 颜色值的最佳实践?或者更一般地说:3 个字节。 你问:我什么时候需要这个?这对我来说并不重要,但想象一下任何 GitHub 上的那些管图 network pa
我正在尝试将默认颜色设置为自定义窗口小部件。 这是有问题的代码。 class ReusableCard extends StatelessWidget { ReusableCard({this.
import javax.swing.*; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.Ta
我有一个 less 文件来定义一堆颜色/颜色。每个类名都包含相关颜色的名称,例如 .colourOrange{..} 或 .colourBorderOrange{..} 或 navLeftButtOr
我有一个RelativeLayout,我需要一个黑色背景和一个位于其中间的小图像。我使用了这段代码: 其中@drawable/bottom_box_back是: 这样我就可以将图像居中了。但背
我需要设置 浅色 的 JPanel 背景,只是为了不覆盖文本(粗体黑色)。 此刻我有这个: import java.util.Random; .... private Random random =
我正在尝试制作一个自定义文本编辑器,可以更改特定键入单词的字体和颜色。如何更改使用光标突出显示的文本的字体和/或颜色? 我还没有尝试过突出显示部分。我尝试获取整个 hEdit(HWND) 区域并更改字
我想改变我整个应用程序的颜色。 在我的 AndroidManfiest.xml 中,我有正确的代码: 在 values 文件夹中,我有 app_theme.xml: @style/MyAc
是否可以使用 android 数据绑定(bind)从 xml 中引用颜色? 这很好用: android:textColor="@{inputValue == null ? 0xFFFBC02D : 0
有没有办法在 Android 应用程序中设置“空心”颜色? 我的意思是我想要一个带有某种背景的框,而文本实际上会导致背景透明。换句话说,如果整个 View 在蓝色背景上,文本将是蓝色的,如果它是红色的
我用CGContextStrokePath画在白色背景图片中的一条直线上,描边颜色为红色,alpha为1.0画线后,为什么点不是(255, 0, 0),而是(255, 96, 96)为什么不是纯红色?
我是一名优秀的程序员,十分优秀!