mirror of
https://gitlab.com/sortix/sortix.git
synced 2023-02-13 20:55:38 -05:00
Add editor(5).
This commit is contained in:
parent
ee971b463b
commit
01ee906d25
6 changed files with 107 additions and 4 deletions
|
@ -38,6 +38,8 @@ install: all
|
||||||
install $(BINARY) $(DESTDIR)$(BINDIR)
|
install $(BINARY) $(DESTDIR)$(BINDIR)
|
||||||
mkdir -p $(DESTDIR)$(MANDIR)/man1
|
mkdir -p $(DESTDIR)$(MANDIR)/man1
|
||||||
install editor.1 $(DESTDIR)$(MANDIR)/man1/editor.1
|
install editor.1 $(DESTDIR)$(MANDIR)/man1/editor.1
|
||||||
|
mkdir -p $(DESTDIR)$(MANDIR)/man5
|
||||||
|
install editor.5 $(DESTDIR)$(MANDIR)/man5/editor.5
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f $(BINARY) $(OBJS) *.o
|
rm -f $(BINARY) $(OBJS) *.o
|
||||||
|
|
|
@ -54,8 +54,22 @@ Open new file containing output of running
|
||||||
.It Sy tabsize Ar tab-size
|
.It Sy tabsize Ar tab-size
|
||||||
Select tab size.
|
Select tab size.
|
||||||
.El
|
.El
|
||||||
|
.Pp
|
||||||
|
A subset of these commands can be stored in the
|
||||||
|
.Xr editor 5
|
||||||
|
configuration file loaded on
|
||||||
|
.Nm
|
||||||
|
startup.
|
||||||
|
.Sh FILES
|
||||||
|
.Bl -tag -width "$HOME/.editor" -compact
|
||||||
|
.It Pa /etc/editor
|
||||||
|
Global configuration.
|
||||||
|
.It Pa ~/.editor
|
||||||
|
User configuration.
|
||||||
|
.El
|
||||||
.Sh SEE ALSO
|
.Sh SEE ALSO
|
||||||
.Xr pager 1
|
.Xr pager 1 ,
|
||||||
|
.Xr editor 5
|
||||||
.Sh BUGS
|
.Sh BUGS
|
||||||
.Nm
|
.Nm
|
||||||
lacks a number of crucial features, such as undo and redo, ability to open
|
lacks a number of crucial features, such as undo and redo, ability to open
|
||||||
|
|
26
editor/editor.5
Normal file
26
editor/editor.5
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
.Dd $Mdocdate: January 8 2015 $
|
||||||
|
.Dt EDITOR 5
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm editor
|
||||||
|
.Nd editor configuration
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.Nm /etc/editor
|
||||||
|
.Nm ~/.editor
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
.Xr editor 1
|
||||||
|
loads these files on startup and executes the commands therein as described in
|
||||||
|
.Xr editor 1 . Only commands applicable as global configuration are executed to
|
||||||
|
avoid undesirable side effects. For instance,
|
||||||
|
.Sy popen
|
||||||
|
isn't executed as that would open another file than the current one. Unknown
|
||||||
|
commands are silently ignored.
|
||||||
|
.Sh FILES
|
||||||
|
.Bl -tag -width "$HOME/.editor" -compact
|
||||||
|
.It Pa /etc/editor
|
||||||
|
Global configuration.
|
||||||
|
.It Pa ~/.editor
|
||||||
|
User configuration.
|
||||||
|
.El
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr editor 1
|
|
@ -1,6 +1,6 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
|
|
||||||
Copyright(C) Jonas 'Sortie' Termansen 2013, 2014, 2015.
|
Copyright(C) Jonas 'Sortie' Termansen 2013, 2014, 2015, 2016.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it
|
This program is free software: you can redistribute it and/or modify it
|
||||||
under the terms of the GNU General Public License as published by the Free
|
under the terms of the GNU General Public License as published by the Free
|
||||||
|
@ -31,6 +31,7 @@
|
||||||
#include <error.h>
|
#include <error.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
#include <pwd.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -44,6 +45,7 @@
|
||||||
#include "editor.h++"
|
#include "editor.h++"
|
||||||
#include "highlight.h++"
|
#include "highlight.h++"
|
||||||
#include "input.h++"
|
#include "input.h++"
|
||||||
|
#include "modal.h++"
|
||||||
#include "terminal.h++"
|
#include "terminal.h++"
|
||||||
|
|
||||||
void initialize_editor(struct editor* editor)
|
void initialize_editor(struct editor* editor)
|
||||||
|
@ -88,6 +90,47 @@ void initialize_editor(struct editor* editor)
|
||||||
editor->color_lines = NULL;
|
editor->color_lines = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void editor_load_config_path(struct editor* editor, const char* path)
|
||||||
|
{
|
||||||
|
FILE* fp = fopen(path, "r");
|
||||||
|
if ( !fp )
|
||||||
|
{
|
||||||
|
if ( errno != ENOENT )
|
||||||
|
error(0, errno, "%s", path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
char* line = NULL;
|
||||||
|
size_t line_size = 0;
|
||||||
|
ssize_t line_length = 0;
|
||||||
|
while ( 0 <= (errno = 0, line_length = getline(&line, &line_size, fp)) )
|
||||||
|
{
|
||||||
|
if ( line[line_length - 1] == '\n' )
|
||||||
|
line[--line_length] = '\0';
|
||||||
|
line_length = strcspn(line, "#");
|
||||||
|
line[line_length] = '\0';
|
||||||
|
editor_modal_command_config(editor, line);
|
||||||
|
}
|
||||||
|
if ( errno != 0 )
|
||||||
|
error(0, errno, "getline: %s", path);
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void editor_load_config(struct editor* editor)
|
||||||
|
{
|
||||||
|
editor_load_config_path(editor, "/etc/editor");
|
||||||
|
const char* home = getenv("HOME");
|
||||||
|
if ( !home )
|
||||||
|
return;
|
||||||
|
char* path;
|
||||||
|
if ( asprintf(&path, "%s/.editor", home) < 0 )
|
||||||
|
{
|
||||||
|
error(0, errno, "malloc");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
editor_load_config_path(editor, path);
|
||||||
|
free(path);
|
||||||
|
}
|
||||||
|
|
||||||
void editor_reset_contents(struct editor* editor)
|
void editor_reset_contents(struct editor* editor)
|
||||||
{
|
{
|
||||||
for ( size_t i = 0; i < editor->lines_used; i++ )
|
for ( size_t i = 0; i < editor->lines_used; i++ )
|
||||||
|
@ -242,6 +285,8 @@ int main(int argc, char* argv[])
|
||||||
struct editor editor;
|
struct editor editor;
|
||||||
initialize_editor(&editor);
|
initialize_editor(&editor);
|
||||||
|
|
||||||
|
editor_load_config(&editor);
|
||||||
|
|
||||||
if ( 2 <= argc && !editor_load_file(&editor, argv[1]) )
|
if ( 2 <= argc && !editor_load_file(&editor, argv[1]) )
|
||||||
error(1, errno, "`%s'", argv[1]);
|
error(1, errno, "`%s'", argv[1]);
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
|
|
||||||
Copyright(C) Jonas 'Sortie' Termansen 2013, 2014, 2015.
|
Copyright(C) Jonas 'Sortie' Termansen 2013, 2014, 2015, 2016.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it
|
This program is free software: you can redistribute it and/or modify it
|
||||||
under the terms of the GNU General Public License as published by the Free
|
under the terms of the GNU General Public License as published by the Free
|
||||||
|
@ -282,6 +282,21 @@ void editor_modal_command(struct editor* editor, const char* cmd)
|
||||||
editor->modal_error = true;
|
editor->modal_error = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void editor_modal_command_config(struct editor* editor, const char* cmd)
|
||||||
|
{
|
||||||
|
while ( *cmd && isspace((unsigned char) *cmd) )
|
||||||
|
cmd++;
|
||||||
|
if ( is_modal_command(cmd, "margin", &cmd) )
|
||||||
|
editor_modal_margin(editor, cmd);
|
||||||
|
else if ( is_modal_command(cmd, "tabsize", &cmd) )
|
||||||
|
editor_modal_tabsize(editor, cmd);
|
||||||
|
else if ( is_modal_command(cmd, "language", &cmd) )
|
||||||
|
editor_modal_language(editor, cmd);
|
||||||
|
else if ( is_modal_command(cmd, "line-numbering", &cmd) )
|
||||||
|
editor_modal_line_numbering(editor, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void editor_modal_character(struct editor* editor, wchar_t c)
|
void editor_modal_character(struct editor* editor, wchar_t c)
|
||||||
{
|
{
|
||||||
if ( editor->control )
|
if ( editor->control )
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
|
|
||||||
Copyright(C) Jonas 'Sortie' Termansen 2013, 2014.
|
Copyright(C) Jonas 'Sortie' Termansen 2013, 2014, 2016.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it
|
This program is free software: you can redistribute it and/or modify it
|
||||||
under the terms of the GNU General Public License as published by the Free
|
under the terms of the GNU General Public License as published by the Free
|
||||||
|
@ -47,6 +47,7 @@ void editor_modal_line_numbering(struct editor* editor, const char* truth);
|
||||||
|
|
||||||
bool is_modal_command(const char* cmd, const char* candidate, const char** rest);
|
bool is_modal_command(const char* cmd, const char* candidate, const char** rest);
|
||||||
void editor_modal_command(struct editor* editor, const char* cmd);
|
void editor_modal_command(struct editor* editor, const char* cmd);
|
||||||
|
void editor_modal_command_config(struct editor* editor, const char* cmd);
|
||||||
void editor_modal_character(struct editor* editor, wchar_t c);
|
void editor_modal_character(struct editor* editor, wchar_t c);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue