mirror of
https://github.com/jarun/nnn.git
synced 2024-11-28 05:41:31 +00:00
Context code '+' to create context smartly
This commit is contained in:
parent
3f60a1931f
commit
ebb6f153b5
|
@ -161,17 +161,25 @@ Plugins can be written in any scripting language. However, POSIX-compliant shell
|
||||||
|
|
||||||
Drop the plugin in `${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins` and make it executable. Optionally add a hotkey in `$NNN_PLUG` for frequent usage.
|
Drop the plugin in `${XDG_CONFIG_HOME:-$HOME/.config}/nnn/plugins` and make it executable. Optionally add a hotkey in `$NNN_PLUG` for frequent usage.
|
||||||
|
|
||||||
#### Controlling `nnn`'s active directory
|
#### Send data to `nnn`
|
||||||
`nnn` provides a mechanism for plugins to control its active directory.
|
`nnn` provides a mechanism for plugins to send data to `nnn` to control its active directory or invoke the list mode.
|
||||||
The way to do so is by writing to the pipe pointed by the environment variable `NNN_PIPE`.
|
The way to do so is by writing to the pipe pointed by the environment variable `NNN_PIPE`.
|
||||||
The plugin should write a single string in the format `<context number><char><path>` without a newline at the end. For example, `1c/etc`.
|
The plugin should write a single string in the format `<ctxcode><opcode><data>` without a newline at the end. For example, `1c/etc`.
|
||||||
The context number indicates the context to change the active directory of (0 is used to indicate the current context).
|
|
||||||
The `<char>` indicates the operation type.
|
|
||||||
|
|
||||||
: Char : Operation :
|
The `ctxcode` indicates the context to change the active directory of.
|
||||||
|
|
||||||
|
| Context code | Meaning |
|
||||||
|:---:| --- |
|
|:---:| --- |
|
||||||
| c | cd |
|
| `1`-`4` | context number |
|
||||||
| l | list files in list mode |
|
| `0` | current context |
|
||||||
|
| `+` | next inactive context or current (if all active) |
|
||||||
|
|
||||||
|
The `opcode` indicates the operation type.
|
||||||
|
|
||||||
|
| Opcode | Operation |
|
||||||
|
|:---:| --- |
|
||||||
|
| `c` | change directory |
|
||||||
|
| `l` | list files in list mode |
|
||||||
|
|
||||||
For convenience, we provided a helper script named `.nnn-plugin-helper` and a function named `nnn_cd` to ease this process. `nnn_cd` receives the path to change to as the first argument, and the context as an optional second argument.
|
For convenience, we provided a helper script named `.nnn-plugin-helper` and a function named `nnn_cd` to ease this process. `nnn_cd` receives the path to change to as the first argument, and the context as an optional second argument.
|
||||||
If a context is not provided, it is asked for explicitly. To skip this and choose the current context, set the `CUR_CTX` variable in `.nnn-plugin-helper` to `1`.
|
If a context is not provided, it is asked for explicitly. To skip this and choose the current context, set the `CUR_CTX` variable in `.nnn-plugin-helper` to `1`.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
# Description: Run fd/find in subtree and list files by mime type in current context
|
# Description: Run fd/find in subtree and list files by mime type in smart context
|
||||||
# Requires: fd/find
|
# Requires: fd/find
|
||||||
#
|
#
|
||||||
# Shell: POSIX compliant
|
# Shell: POSIX compliant
|
||||||
|
@ -17,5 +17,5 @@ fi
|
||||||
printf "mime: "
|
printf "mime: "
|
||||||
read -r mime
|
read -r mime
|
||||||
|
|
||||||
printf "%s" "0l" > "$NNN_PIPE"
|
printf "%s" "+l" > "$NNN_PIPE"
|
||||||
$fd | file -if- | grep "$mime" | awk -F: '{printf "%s\0", $1}' > "$NNN_PIPE"
|
$fd | file -if- | grep "$mime" | awk -F: '{printf "%s\0", $1}' > "$NNN_PIPE"
|
||||||
|
|
20
src/nnn.c
20
src/nnn.c
|
@ -4234,16 +4234,24 @@ static void rmlistpath()
|
||||||
|
|
||||||
static void readpipe(int fd, char **path, char **lastname, char **lastdir)
|
static void readpipe(int fd, char **path, char **lastname, char **lastdir)
|
||||||
{
|
{
|
||||||
char *nextpath = NULL;
|
int r;
|
||||||
|
char ctx, *nextpath = NULL;
|
||||||
ssize_t len = read(fd, g_buf, 1);
|
ssize_t len = read(fd, g_buf, 1);
|
||||||
|
|
||||||
if (len != 1)
|
if (len != 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
char ctx = g_buf[0] - '0';
|
if (g_buf[0] == '+') {
|
||||||
|
r = cfg.curctx;
|
||||||
if (ctx > CTX_MAX)
|
do
|
||||||
return;
|
r = (r + 1) & ~CTX_MAX;
|
||||||
|
while (g_ctx[r].c_cfg.ctxactive && (r != cfg.curctx));
|
||||||
|
ctx = r + 1;
|
||||||
|
} else {
|
||||||
|
ctx = g_buf[0] - '0';
|
||||||
|
if (ctx > CTX_MAX)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
len = read(fd, g_buf, 1);
|
len = read(fd, g_buf, 1);
|
||||||
if (len != 1)
|
if (len != 1)
|
||||||
|
@ -4269,7 +4277,7 @@ static void readpipe(int fd, char **path, char **lastname, char **lastdir)
|
||||||
xstrsncpy(*lastdir, *path, PATH_MAX);
|
xstrsncpy(*lastdir, *path, PATH_MAX);
|
||||||
xstrsncpy(*path, nextpath, PATH_MAX);
|
xstrsncpy(*path, nextpath, PATH_MAX);
|
||||||
} else {
|
} else {
|
||||||
int r = ctx - 1;
|
r = ctx - 1;
|
||||||
|
|
||||||
g_ctx[r].c_cfg.ctxactive = 0;
|
g_ctx[r].c_cfg.ctxactive = 0;
|
||||||
savecurctx(&cfg, nextpath, dents[cur].name, r);
|
savecurctx(&cfg, nextpath, dents[cur].name, r);
|
||||||
|
|
Loading…
Reference in a new issue