[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Nano-devel] [PATCH V2] possible new feature: a tab command to define wh
From: |
Benno Schulenberg |
Subject: |
[Nano-devel] [PATCH V2] possible new feature: a tab command to define what the Tab key produces |
Date: |
Tue, 30 Oct 2018 16:51:33 +0100 |
V2: Indenting and unindenting a marked region should work too: it must
add and remove the exact contents of the specified tab string. But this
also means that, when a tab string is specfied, the unindenting is no
longer flexible: it will no longer see tabsize spaces as equivalent to
a tab, nor the other way around.
The 'tab' command is syntax-specific and should be followed by a string
containing the character(s) that a single press of the <Tab> key should
produce -- most likely a single TAB or a small bunch of spaces, but any
string is allowed. This overrides the 'tabstospaces' option/toggle.
This addresses https://savannah.gnu.org/bugs/?53661,
and addresses https://savannah.gnu.org/bugs/?54760,
and addresses part of https://savannah.gnu.org/bugs/?54775.
---
src/nano.h | 2 ++
src/rcfile.c | 3 +++
src/text.c | 24 ++++++++++++++++++++++++
3 files changed, 29 insertions(+)
diff --git a/src/nano.h b/src/nano.h
index 3007881d..b53d4e86 100644
--- a/src/nano.h
+++ b/src/nano.h
@@ -227,6 +227,8 @@ typedef struct syntaxtype {
/* The list of libmagic results that this syntax applies to. */
char *linter;
/* The command with which to lint this type of file. */
+ char *tab;
+ /* What the Tab key should produce; NULL for default behavior.
*/
#ifdef ENABLE_COMMENT
char *comment;
/* The line comment prefix (and postfix) for this type of file.
*/
diff --git a/src/rcfile.c b/src/rcfile.c
index d8a2d1fe..6c434a96 100644
--- a/src/rcfile.c
+++ b/src/rcfile.c
@@ -300,6 +300,7 @@ void parse_syntax(char *ptr)
live_syntax->headers = NULL;
live_syntax->magics = NULL;
live_syntax->linter = NULL;
+ live_syntax->tab = NULL;
#ifdef ENABLE_COMMENT
live_syntax->comment = mallocstrcpy(NULL, GENERAL_COMMENT_CHARACTER);
#endif
@@ -993,6 +994,8 @@ void parse_rcfile(FILE *rcstream, bool syntax_only)
parse_colors(ptr, NANO_REG_EXTENDED | REG_ICASE);
else if (strcasecmp(keyword, "linter") == 0)
pick_up_name("linter", ptr, &live_syntax->linter);
+ else if (strcasecmp(keyword, "tab") == 0)
+ pick_up_name("tab", ptr, &live_syntax->tab);
else if (syntax_only && (strcasecmp(keyword, "set") == 0 ||
strcasecmp(keyword, "unset") == 0 ||
strcasecmp(keyword, "bind") == 0 ||
diff --git a/src/text.c b/src/text.c
index 8302c7dd..a89180f6 100644
--- a/src/text.c
+++ b/src/text.c
@@ -267,6 +267,11 @@ void do_cut_next_word(void)
* of spaces that a tab would normally take up. */
void do_tab(void)
{
+#ifdef ENABLE_COLOR
+ if (openfile->syntax && openfile->syntax->tab)
+ do_output(openfile->syntax->tab, strlen(openfile->syntax->tab),
TRUE);
+ else
+#endif
#ifndef NANO_TINY
if (ISSET(TABS_TO_SPACES)) {
char *spaces = charalloc(tabsize + 1);
@@ -332,6 +337,11 @@ void do_indent(void)
indentation = charalloc(tabsize + 1);
/* Set the indentation to either a bunch of spaces or a single tab. */
+#ifdef ENABLE_COLOR
+ if (openfile->syntax && openfile->syntax->tab)
+ indentation = mallocstrcpy(indentation, openfile->syntax->tab);
+ else
+#endif
if (ISSET(TABS_TO_SPACES)) {
charset(indentation, ' ', tabsize);
indentation[tabsize] = '\0';
@@ -364,6 +374,20 @@ size_t length_of_white(const char *text)
{
size_t bytes_of_white = 0;
+#ifdef ENABLE_COLOR
+ if (openfile->syntax && openfile->syntax->tab) {
+ size_t thelength = strlen(openfile->syntax->tab);
+
+ while (bytes_of_white < thelength) {
+ if (text[bytes_of_white] !=
openfile->syntax->tab[bytes_of_white])
+ return 0;
+ bytes_of_white++;
+ }
+
+ return thelength;
+ }
+#endif
+
while (TRUE) {
if (*text == '\t')
return ++bytes_of_white;
--
2.19.1
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Nano-devel] [PATCH V2] possible new feature: a tab command to define what the Tab key produces,
Benno Schulenberg <=