Browse Source

Context code '+' to create context smartly

master
Arun Prakash Jana 4 years ago
parent
commit
ebb6f153b5
No known key found for this signature in database GPG Key ID: A75979F35C080412
3 changed files with 32 additions and 16 deletions
  1. +16
    -8
      plugins/README.md
  2. +2
    -2
      plugins/mimelist
  3. +14
    -6
      src/nnn.c

+ 16
- 8
plugins/README.md View File

@@ -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
`nnn` provides a mechanism for plugins to control its active directory.
#### Send data to `nnn`
`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 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.
The plugin should write a single string in the format `<ctxcode><opcode><data>` without a newline at the end. For example, `1c/etc`.


: Char : Operation :
The `ctxcode` indicates the context to change the active directory of.

| Context code | Meaning |
|:---:| --- |
| `1`-`4` | context number |
| `0` | current context |
| `+` | next inactive context or current (if all active) |

The `opcode` indicates the operation type.

| Opcode | Operation |
|:---:| --- | |:---:| --- |
| c | cd |
| l | list files in list mode |
| `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`.


+ 2
- 2
plugins/mimelist View File

@@ -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"

+ 14
- 6
src/nnn.c View File

@@ -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 (ctx > CTX_MAX)
return;
if (g_buf[0] == '+') {
r = cfg.curctx;
do
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…
Cancel
Save