add support for plugin command to LAMMPS shell

This commit is contained in:
Axel Kohlmeyer
2021-03-13 12:18:07 -05:00
parent dd94bac0c8
commit 79d438e090

View File

@ -128,6 +128,7 @@ const char *cmdlist[] = {"clear",
"pair_modify",
"pair_style",
"pair_write",
"plugin",
"processors",
"region",
"reset_timestep",
@ -347,6 +348,59 @@ static char *variable_expand_generator(const char *text, int state)
return nullptr;
}
static char *plugin_generator(const char *text, int state)
{
const char *subcmd[] = {"load", "unload", "list", NULL};
const char *sub;
static std::size_t idx, len;
if (!state) idx = 0;
len = strlen(text);
while ((sub = subcmd[idx]) != NULL) {
++idx;
if (strncmp(text,sub,len) == 0)
return dupstring(sub);
}
return nullptr;
}
static char *plugin_style_generator(const char *text, int state)
{
const char *styles[] = {"pair", "fix", "command", NULL};
const char *s;
static std::size_t idx, len;
if (!state) idx = 0;
len = strlen(text);
while ((s = styles[idx]) != NULL) {
++idx;
if (strncmp(text,s,len) == 0)
return dupstring(s);
}
return nullptr;
}
static char *plugin_name_generator(const char *text, int state)
{
auto words = utils::split_words(text);
if (words.size() < 4) return nullptr;
static std::size_t idx, len;
if (!state) idx = 0;
len = words[3].size();
int nmax = lammps_plugin_count();
while (idx < nmax) {
char style[buflen], name[buflen];
lammps_plugin_name(idx, style, name, buflen);
++idx;
if (words[2] == style) {
if (strncmp(name, words[3].c_str(), len) == 0)
return dupstring(name);
}
}
return nullptr;
}
static char *atom_generator(const char *text, int state)
{
return style_generator<ATOM_STYLE>(text, state);
@ -477,14 +531,21 @@ static char **cmd_completion(const char *text, int start, int)
matches = rl_completion_matches(text, dump_id_generator);
} else if (words[0] == "fix_modify") {
matches = rl_completion_matches(text, fix_id_generator);
} else if (words[0] == "plugin") {
matches = rl_completion_matches(text, plugin_generator);
}
} else if (words.size() == 2) { // expand third word
// these commands have a group name as 3rd word
if ((words[0] == "fix") || (words[0] == "compute") || (words[0] == "dump")) {
if ((words[0] == "fix")
|| (words[0] == "compute")
|| (words[0] == "dump")) {
matches = rl_completion_matches(text, group_generator);
} else if (words[0] == "region") {
matches = rl_completion_matches(text, region_generator);
// plugin style is the third word
} else if ((words[0] == "plugin") && (words[1] == "unload")) {
matches = rl_completion_matches(text, plugin_style_generator);
}
} else if (words.size() == 3) { // expand fourth word
@ -495,6 +556,9 @@ static char **cmd_completion(const char *text, int start, int)
matches = rl_completion_matches(text, compute_generator);
} else if (words[0] == "dump") {
matches = rl_completion_matches(text, dump_generator);
// plugin name is the fourth word
} else if ((words[0] == "plugin") && (words[1] == "unload")) {
matches = rl_completion_matches(rl_line_buffer, plugin_name_generator);
}
}
}