aboutsummaryrefslogtreecommitdiff
path: root/sam.c
diff options
context:
space:
mode:
Diffstat (limited to 'sam.c')
-rw-r--r--sam.c181
1 files changed, 131 insertions, 50 deletions
diff --git a/sam.c b/sam.c
index b7339fe..b321ffd 100644
--- a/sam.c
+++ b/sam.c
@@ -123,61 +123,142 @@ static bool cmd_unmap(Vis*, Win*, Command*, const char *argv[], Cursor*, Fileran
static bool cmd_langmap(Vis*, Win*, Command*, const char *argv[], Cursor*, Filerange*);
static bool cmd_user(Vis*, Win*, Command*, const char *argv[], Cursor*, Filerange*);
-/* command recognized at the ':'-prompt. commands are found using a unique
- * prefix match. that is if a command should be available under an abbreviation
- * which is a prefix for another command it has to be added as an alias. the
- * long human readable name should always come first */
static const CommandDef cmds[] = {
- /* name, help flags, default command, implementation */
- { "a", "Append text after range", CMD_TEXT, NULL, cmd_append },
- { "c", "Change text in range", CMD_TEXT, NULL, cmd_change },
- { "d", "Delete text in range", CMD_NONE, NULL, cmd_delete },
- { "g", "If range contains regexp, run command", CMD_CMD|CMD_REGEX, "p", cmd_guard },
- { "i", "Insert text before range", CMD_TEXT, NULL, cmd_insert },
- { "p", "Create selection covering range", CMD_NONE, NULL, cmd_print },
- { "s", "Substitute text for regexp in range", CMD_SHELL, NULL, cmd_substitute },
- { "v", "If range does not contain regexp, run command", CMD_CMD|CMD_REGEX, "p", cmd_guard },
- { "x", "Set range and run command on each match", CMD_CMD|CMD_REGEX|CMD_REGEX_DEFAULT, "p", cmd_extract },
- { "y", "As `x` but select unmatched text", CMD_CMD|CMD_REGEX, "p", cmd_extract },
- { "X", "Run command on files whose name matches", CMD_CMD|CMD_REGEX|CMD_REGEX_DEFAULT, NULL, cmd_files },
- { "Y", "As `X` but select unmatched files", CMD_CMD|CMD_REGEX, NULL, cmd_files },
- { ">", "Send range to stdin of command", CMD_SHELL|CMD_ADDRESS_LINE, NULL, cmd_pipeout },
- { "<", "Replace range by stdout of command", CMD_SHELL|CMD_ADDRESS_POS, NULL, cmd_pipein },
- { "|", "Pipe range through command", CMD_SHELL|CMD_ADDRESS_POS, NULL, cmd_filter },
- { "!", "Run the command", CMD_SHELL|CMD_ONCE, NULL, cmd_launch },
- { "w", "Write range to named file", CMD_ARGV|CMD_FORCE|CMD_ADDRESS_NONE|CMD_ONCE, NULL, cmd_write},
- { "r", "Replace range by contents of file", CMD_ARGV|CMD_ADDRESS_AFTER, NULL, cmd_read },
- { "{", "Start of command group", CMD_NONE, NULL, NULL },
- { "}", "End of command group" , CMD_NONE, NULL, NULL },
- { "e", "Edit file", CMD_ARGV|CMD_FORCE|CMD_ONCE, NULL, cmd_edit },
- { "q", "Quit the current window", CMD_FORCE|CMD_ONCE, NULL, cmd_quit },
- { "cd", "Change directory", CMD_ARGV|CMD_ONCE, NULL, cmd_cd },
+ // name help
+ // flags, default command, implemenation
+ {
+ "a", "Append text after range",
+ CMD_TEXT, NULL, cmd_append
+ }, {
+ "c", "Change text in range",
+ CMD_TEXT, NULL, cmd_change
+ }, {
+ "d", "Delete text in range",
+ CMD_NONE, NULL, cmd_delete
+ }, {
+ "g", "If range contains regexp, run command",
+ CMD_CMD|CMD_REGEX, "p", cmd_guard
+ }, {
+ "i", "Insert text before range",
+ CMD_TEXT, NULL, cmd_insert
+ }, {
+ "p", "Create selection covering range",
+ CMD_NONE, NULL, cmd_print
+ }, {
+ "s", "Substitute text for regexp in range",
+ CMD_SHELL, NULL, cmd_substitute
+ }, {
+ "v", "If range does not contain regexp, run command",
+ CMD_CMD|CMD_REGEX, "p", cmd_guard
+ }, {
+ "x", "Set range and run command on each match",
+ CMD_CMD|CMD_REGEX|CMD_REGEX_DEFAULT, "p", cmd_extract
+ }, {
+ "y", "As `x` but select unmatched text",
+ CMD_CMD|CMD_REGEX, "p", cmd_extract
+ }, {
+ "X", "Run command on files whose name matches",
+ CMD_CMD|CMD_REGEX|CMD_REGEX_DEFAULT, NULL, cmd_files
+ }, {
+ "Y", "As `X` but select unmatched files",
+ CMD_CMD|CMD_REGEX, NULL, cmd_files
+ }, {
+ ">", "Send range to stdin of command",
+ CMD_SHELL|CMD_ADDRESS_LINE, NULL, cmd_pipeout
+ }, {
+ "<", "Replace range by stdout of command",
+ CMD_SHELL|CMD_ADDRESS_POS, NULL, cmd_pipein
+ }, {
+ "|", "Pipe range through command",
+ CMD_SHELL|CMD_ADDRESS_POS, NULL, cmd_filter
+ }, {
+ "!", "Run the command",
+ CMD_SHELL|CMD_ONCE, NULL, cmd_launch
+ }, {
+ "w", "Write range to named file",
+ CMD_ARGV|CMD_FORCE|CMD_ADDRESS_NONE|CMD_ONCE, NULL, cmd_write
+ }, {
+ "r", "Replace range by contents of file",
+ CMD_ARGV|CMD_ADDRESS_AFTER, NULL, cmd_read
+ }, {
+ "{", "Start of command group",
+ CMD_NONE, NULL, NULL
+ }, {
+ "}", "End of command group" ,
+ CMD_NONE, NULL, NULL
+ }, {
+ "e", "Edit file",
+ CMD_ARGV|CMD_FORCE|CMD_ONCE, NULL, cmd_edit
+ }, {
+ "q", "Quit the current window",
+ CMD_FORCE|CMD_ONCE, NULL, cmd_quit
+ }, {
+ "cd", "Change directory",
+ CMD_ARGV|CMD_ONCE, NULL, cmd_cd
+ },
/* vi(m) related commands */
- { "bdelete", "Unload file", CMD_FORCE|CMD_ONCE, NULL, cmd_bdelete },
- { "help", "Show this help", CMD_ONCE, NULL, cmd_help },
- { "map", "Map key binding `:map <mode> <lhs> <rhs>`", CMD_ARGV|CMD_FORCE|CMD_ONCE, NULL, cmd_map },
- { "map-window", "As `map` but window local", CMD_ARGV|CMD_FORCE|CMD_ONCE, NULL, cmd_map },
- { "unmap", "Unmap key binding `:unmap <mode> <lhs>`", CMD_ARGV|CMD_ONCE, NULL, cmd_unmap },
- { "unmap-window", "As `unmap` but window local", CMD_ARGV|CMD_ONCE, NULL, cmd_unmap },
- { "langmap", "Map keyboard layout `:langmap <locale-keys> <latin-keys>`", CMD_ARGV|CMD_FORCE|CMD_ONCE, NULL, cmd_langmap },
- { "new", "Create new window", CMD_ARGV|CMD_ONCE, NULL, cmd_new },
- { "open", "Open file", CMD_ARGV|CMD_ONCE, NULL, cmd_open },
- { "qall", "Exit vis", CMD_FORCE|CMD_ONCE, NULL, cmd_qall },
- { "set", "Set option", CMD_ARGV|CMD_ONCE, NULL, cmd_set },
- { "split", "Horizontally split window", CMD_ARGV|CMD_ONCE, NULL, cmd_split },
- { "vnew", "As `:new` but split vertically", CMD_ARGV|CMD_ONCE, NULL, cmd_vnew },
- { "vsplit", "Vertically split window", CMD_ARGV|CMD_ONCE, NULL, cmd_vsplit },
- { "wq", "Write file and quit", CMD_ARGV|CMD_FORCE|CMD_ADDRESS_NONE|CMD_ONCE, NULL, cmd_wq },
- { "earlier", "Go to older text state", CMD_ARGV|CMD_ONCE, NULL, cmd_earlier_later },
- { "later", "Go to newer text state", CMD_ARGV|CMD_ONCE, NULL, cmd_earlier_later },
- { NULL, NULL, CMD_NONE, NULL, NULL },
+ {
+ "bdelete", "Unload file",
+ CMD_FORCE|CMD_ONCE, NULL, cmd_bdelete
+ }, {
+ "help", "Show this help",
+ CMD_ONCE, NULL, cmd_help
+ }, {
+ "map", "Map key binding `:map <mode> <lhs> <rhs>`",
+ CMD_ARGV|CMD_FORCE|CMD_ONCE, NULL, cmd_map
+ }, {
+ "map-window", "As `map` but window local",
+ CMD_ARGV|CMD_FORCE|CMD_ONCE, NULL, cmd_map
+ }, {
+ "unmap", "Unmap key binding `:unmap <mode> <lhs>`",
+ CMD_ARGV|CMD_ONCE, NULL, cmd_unmap
+ }, {
+ "unmap-window", "As `unmap` but window local",
+ CMD_ARGV|CMD_ONCE, NULL, cmd_unmap
+ }, {
+ "langmap", "Map keyboard layout `:langmap <locale-keys> <latin-keys>`",
+ CMD_ARGV|CMD_FORCE|CMD_ONCE, NULL, cmd_langmap
+ }, {
+ "new", "Create new window",
+ CMD_ARGV|CMD_ONCE, NULL, cmd_new
+ }, {
+ "open", "Open file",
+ CMD_ARGV|CMD_ONCE, NULL, cmd_open
+ }, {
+ "qall", "Exit vis",
+ CMD_FORCE|CMD_ONCE, NULL, cmd_qall
+ }, {
+ "set", "Set option",
+ CMD_ARGV|CMD_ONCE, NULL, cmd_set
+ }, {
+ "split", "Horizontally split window",
+ CMD_ARGV|CMD_ONCE, NULL, cmd_split
+ }, {
+ "vnew", "As `:new` but split vertically",
+ CMD_ARGV|CMD_ONCE, NULL, cmd_vnew
+ }, {
+ "vsplit", "Vertically split window",
+ CMD_ARGV|CMD_ONCE, NULL, cmd_vsplit
+ }, {
+ "wq", "Write file and quit",
+ CMD_ARGV|CMD_FORCE|CMD_ADDRESS_NONE|CMD_ONCE, NULL, cmd_wq
+ }, {
+ "earlier", "Go to older text state",
+ CMD_ARGV|CMD_ONCE, NULL, cmd_earlier_later
+ }, {
+ "later", "Go to newer text state",
+ CMD_ARGV|CMD_ONCE, NULL, cmd_earlier_later
+ },
+ { NULL, NULL, CMD_NONE, NULL, NULL },
};
-static const CommandDef cmddef_select =
- { NULL, NULL, CMD_NONE, NULL, cmd_select };
+static const CommandDef cmddef_select = {
+ NULL, NULL, CMD_NONE, NULL, cmd_select
+};
-static const CommandDef cmddef_user =
- { NULL, NULL, CMD_ARGV|CMD_FORCE|CMD_ONCE, NULL, cmd_user };
+static const CommandDef cmddef_user = {
+ NULL, NULL, CMD_ARGV|CMD_FORCE|CMD_ONCE, NULL, cmd_user
+};
/* :set command options */
typedef struct {