There are many different space characters in unicode, and even more
punctuation characters. Instead of having people list them all in
configuration as delimiters for double-click selection, consider all
'punct' and 'space' class characters delimiters by default (unless
explicitly configured not to be).

This applies on top of my previous diff to use wcschr() instead of
utf8strchr().

>From ce6e5aa60965f9446ee1fe08e17d1c65594ffa2f Mon Sep 17 00:00:00 2001
From: Lauri Tirkkonen <[email protected]>
Date: Wed, 13 Mar 2019 17:15:04 +0200
Subject: [PATCH] use iswspace()/iswpunct() to find word delimiters

this inverts the configuration logic: you no longer provide a list of
delimiters -- all space and punctuation characters are considered
delimiters, unless listed in extrawordchars.
---
 config.def.h | 7 ++++---
 st.c         | 3 ++-
 st.h         | 2 +-
 3 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/config.def.h b/config.def.h
index 482901e..9ce45a7 100644
--- a/config.def.h
+++ b/config.def.h
@@ -28,11 +28,12 @@ static float cwscale = 1.0;
 static float chscale = 1.0;
 
 /*
- * word delimiter string
+ * all space and punctuation characters are considered word delimiters, unless
+ * listed here.
  *
- * More advanced example: L" `'\"()[]{}"
+ * More advanced example: L"#$%&+,-./:=?_~"
  */
-wchar_t *worddelimiters = L" ";
+wchar_t *extrawordchars = L"./:";
 
 /* selection timeouts (in milliseconds) */
 static unsigned int doubleclicktimeout = 300;
diff --git a/st.c b/st.c
index 812f30c..c383b43 100644
--- a/st.c
+++ b/st.c
@@ -16,6 +16,7 @@
 #include <termios.h>
 #include <unistd.h>
 #include <wchar.h>
+#include <wctype.h>
 
 #include "st.h"
 #include "win.h"
@@ -41,7 +42,7 @@
 #define ISCONTROLC0(c)         (BETWEEN(c, 0, 0x1f) || (c) == '\177')
 #define ISCONTROLC1(c)         (BETWEEN(c, 0x80, 0x9f))
 #define ISCONTROL(c)           (ISCONTROLC0(c) || ISCONTROLC1(c))
-#define ISDELIM(u)             (u != 0 && wcschr(worddelimiters, u) != NULL)
+#define ISDELIM(u)             ((iswspace(u) || iswpunct(u)) && 
wcschr(extrawordchars, u) == NULL)
 
 enum term_mode {
        MODE_WRAP        = 1 << 0,
diff --git a/st.h b/st.h
index 4da3051..a3b19de 100644
--- a/st.h
+++ b/st.h
@@ -114,7 +114,7 @@ char *xstrdup(char *);
 extern char *utmp;
 extern char *stty_args;
 extern char *vtiden;
-extern wchar_t *worddelimiters;
+extern wchar_t *extrawordchars;
 extern int allowaltscreen;
 extern char *termname;
 extern unsigned int tabspaces;
-- 
2.20.1

-- 
Lauri Tirkkonen | lotheac @ IRCnet

Reply via email to