add st patch "open selected text" - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
commit fda0588d8043bcdb88b887755d9148d0cca4cffb | |
parent 2ccb1b7086bb6c7bd768954079208c49a2e81aef | |
Author: Tim Keller <tjkeller.xyz> | |
Date: Sun, 12 Jan 2025 14:15:16 -0600 | |
add st patch "open selected text" | |
Diffstat: | |
A st.suckless.org/patches/open_selec… | 38 +++++++++++++++++++++++++++… | |
A st.suckless.org/patches/open_selec… | 74 +++++++++++++++++++++++++++… | |
2 files changed, 112 insertions(+), 0 deletions(-) | |
--- | |
diff --git a/st.suckless.org/patches/open_selected_text/index.md b/st.suckless.… | |
@@ -0,0 +1,38 @@ | |
+XDG-Open Selected | |
+================= | |
+This patch adds a function that can be bound to a key or button which attempts | |
+to open the selected text using `xdg-open`. | |
+ | |
+Description | |
+----------- | |
+This functionality is most useful for opening URL's in a web-browser, but also | |
+allows you to open any type of file in the default application for its mimetype | |
+by having its path selected. | |
+ | |
+By default, `CTRL + Mouse2` will open the selected text. | |
+ | |
+OSC 7 | |
+----- | |
+This patch also adds support for the `OSC 7` escape sequence, which allows for | |
+automatically changing the current working directory of st from a shell. | |
+ | |
+This is useful because `xdg-open` is spawned as a child process of st, and so | |
+by default you won't be able to open a file using its relative path (unless | |
+that relative path happens to correspond with the CWD of st). | |
+ | |
+To allow opening files using the relative path of the shell instead, you just | |
+need to add the following to your shell's rc: | |
+ | |
+* zshrc: `function precmd () { builtin print -Pn "\e]7;file://${PWD}\a" }` | |
+* bashrc: `export PROMPT_COMMAND='echo -ne "\e]7;file://${PWD}\a"'` | |
+ | |
+Setting this up will ensure that st's CWD is always synced with the CWD of your | |
+shell. | |
+ | |
+Download | |
+-------- | |
+* [st-open-selected-0.9.2.diff](st-open-selected-0.9.2.diff) | |
+ | |
+Authors | |
+------- | |
+* Tim Keller - <[email protected]> | |
diff --git a/st.suckless.org/patches/open_selected_text/st-open-selected-0.9.2.… | |
@@ -0,0 +1,74 @@ | |
+diff --git a/config.def.h b/config.def.h | |
+index 2cd740a..d362d6b 100644 | |
+--- a/config.def.h | |
++++ b/config.def.h | |
+@@ -176,6 +176,7 @@ static uint forcemousemod = ShiftMask; | |
+ */ | |
+ static MouseShortcut mshortcuts[] = { | |
+ /* mask button function argument relea… | |
++ { ControlMask, Button2, selopen, {.i = 0}, 1 }, | |
+ { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, | |
+ { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, | |
+ { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, | |
+diff --git a/st.c b/st.c | |
+index 2e3800e..f55facb 100644 | |
+--- a/st.c | |
++++ b/st.c | |
+@@ -1903,6 +1903,16 @@ strhandle(void) | |
+ if (narg > 1) | |
+ xsettitle(strescseq.args[1]); | |
+ return; | |
++ case 7: | |
++ if (strstr(strescseq.args[1], "file://") != strescseq… | |
++ fprintf(stderr, "erresc: dir %s must have pre… | |
++ strescseq.args[1]); | |
++ return; | |
++ } | |
++ if (chdir(strescseq.args[1] + 7) != 0) /* +7 to remov… | |
++ fprintf(stderr, "erresc: invalid directory %s… | |
++ strescseq.args[1]); | |
++ return; | |
+ case 52: | |
+ if (narg > 2 && allowwindowops) { | |
+ dec = base64dec(strescseq.args[2]); | |
+diff --git a/x.c b/x.c | |
+index d73152b..e44d61c 100644 | |
+--- a/x.c | |
++++ b/x.c | |
+@@ -5,6 +5,7 @@ | |
+ #include <locale.h> | |
+ #include <signal.h> | |
+ #include <sys/select.h> | |
++#include <sys/wait.h> | |
+ #include <time.h> | |
+ #include <unistd.h> | |
+ #include <libgen.h> | |
+@@ -55,6 +56,7 @@ static void clipcopy(const Arg *); | |
+ static void clippaste(const Arg *); | |
+ static void numlock(const Arg *); | |
+ static void selpaste(const Arg *); | |
++static void selopen(const Arg *); | |
+ static void zoom(const Arg *); | |
+ static void zoomabs(const Arg *); | |
+ static void zoomreset(const Arg *); | |
+@@ -286,6 +288,20 @@ selpaste(const Arg *dummy) | |
+ xw.win, CurrentTime); | |
+ } | |
+ | |
++void | |
++selopen(const Arg *dummy) | |
++{ | |
++ pid_t chpid; | |
++ | |
++ if ((chpid = fork()) == 0) { | |
++ if (fork() == 0) | |
++ execlp("xdg-open", "xdg-open", getsel(), NULL); | |
++ exit(1); | |
++ } | |
++ if (chpid > 0) | |
++ waitpid(chpid, NULL, 0); | |
++} | |
++ | |
+ void | |
+ numlock(const Arg *dummy) | |
+ { |