Compare commits
3 Commits
d6846e6327
...
f3fffe4b25
Author | SHA1 | Date | |
---|---|---|---|
f3fffe4b25 | |||
77313663a3 | |||
5f2eaa88e0 |
@ -11,8 +11,8 @@ commands. It enables you to:
|
||||
can be simply forwarded if it is to be edited. What's more, it will always
|
||||
be obvious whether the navigator is running.
|
||||
|
||||
Development has just started and the only supported platform is Linux.
|
||||
I wanted to try a different, simpler approach here.
|
||||
The only supported platform is Linux. I wanted to try a different, simpler
|
||||
approach here, and the end result is very friendly to tinkering.
|
||||
|
||||
Building
|
||||
--------
|
||||
|
31
sdn.cpp
31
sdn.cpp
@ -38,6 +38,7 @@
|
||||
#include <fcntl.h>
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
#include <libgen.h>
|
||||
|
||||
#include <sys/inotify.h>
|
||||
#include <sys/xattr.h>
|
||||
@ -252,9 +253,11 @@ fun xdg_config_find (const string &suffix) -> unique_ptr<ifstream> {
|
||||
fun xdg_config_write (const string &suffix) -> unique_ptr<fstream> {
|
||||
auto dir = xdg_config_home ();
|
||||
if (dir[0] == '/') {
|
||||
// TODO: try to create the end directory
|
||||
if (fstream fs {dir + "/" PROJECT_NAME "/" + suffix,
|
||||
fstream::in | fstream::out | fstream::trunc})
|
||||
auto path = dir + "/" PROJECT_NAME "/" + suffix;
|
||||
if (!fork ())
|
||||
_exit (-execlp ("mkdir", "mkdir", "-p",
|
||||
dirname (strdup (path.c_str ())), NULL));
|
||||
if (fstream fs {path, fstream::in | fstream::out | fstream::trunc})
|
||||
return make_unique<fstream> (move (fs));
|
||||
}
|
||||
return nullptr;
|
||||
@ -368,7 +371,8 @@ enum { ALT = 1 << 24, SYM = 1 << 25 }; // Outside the range of Unicode
|
||||
#define KEY(name) (SYM | KEY_ ## name)
|
||||
#define CTRL 31 &
|
||||
|
||||
#define ACTIONS(XX) XX(NONE) XX(CHOOSE) XX(CHOOSE_FULL) XX(HELP) XX(QUIT) \
|
||||
#define ACTIONS(XX) XX(NONE) XX(HELP) XX(QUIT) XX(QUIT_NO_CHDIR) \
|
||||
XX(CHOOSE) XX(CHOOSE_FULL) \
|
||||
XX(UP) XX(DOWN) XX(TOP) XX(BOTTOM) XX(PAGE_PREVIOUS) XX(PAGE_NEXT) \
|
||||
XX(SCROLL_UP) XX(SCROLL_DOWN) XX(CHDIR) XX(GO_START) XX(GO_HOME) \
|
||||
XX(SEARCH) XX(RENAME) XX(RENAME_PREFILL) \
|
||||
@ -386,8 +390,9 @@ static const char *g_action_names[] = {ACTIONS(XX)};
|
||||
static map<wint_t, action> g_normal_actions {
|
||||
{ALT | '\r', ACTION_CHOOSE_FULL}, {ALT | KEY (ENTER), ACTION_CHOOSE_FULL},
|
||||
{'\r', ACTION_CHOOSE}, {KEY (ENTER), ACTION_CHOOSE}, {'h', ACTION_HELP},
|
||||
{'q', ACTION_QUIT}, {ALT | 'q', ACTION_QUIT_NO_CHDIR},
|
||||
// M-o ought to be the same shortcut the navigator is launched with
|
||||
{ALT | 'o', ACTION_QUIT}, {'q', ACTION_QUIT},
|
||||
{ALT | 'o', ACTION_QUIT},
|
||||
{'k', ACTION_UP}, {CTRL 'p', ACTION_UP}, {KEY (UP), ACTION_UP},
|
||||
{'j', ACTION_DOWN}, {CTRL 'n', ACTION_DOWN}, {KEY (DOWN), ACTION_DOWN},
|
||||
{'g', ACTION_TOP}, {ALT | '<', ACTION_TOP}, {KEY (HOME), ACTION_TOP},
|
||||
@ -465,7 +470,7 @@ static struct {
|
||||
int message_ttl; ///< Time to live for the message
|
||||
|
||||
string chosen; ///< Chosen item for the command line
|
||||
bool chosen_full; ///< Use the full path
|
||||
bool no_chdir; ///< Do not tell the shell to chdir
|
||||
|
||||
int inotify_fd, inotify_wd = -1; ///< File watch
|
||||
bool out_of_date; ///< Entries may be out of date
|
||||
@ -896,8 +901,8 @@ fun handle (wint_t c) -> bool {
|
||||
auto i = g_normal_actions.find (c);
|
||||
switch (i == g_normal_actions.end () ? ACTION_NONE : i->second) {
|
||||
case ACTION_CHOOSE_FULL:
|
||||
g.chosen_full = true;
|
||||
g.chosen = current.filename;
|
||||
g.chosen = g.cwd + "/" + current.filename;
|
||||
g.no_chdir = true;
|
||||
return false;
|
||||
case ACTION_CHOOSE:
|
||||
if (choose (current))
|
||||
@ -906,6 +911,9 @@ fun handle (wint_t c) -> bool {
|
||||
case ACTION_HELP:
|
||||
show_help ();
|
||||
return true;
|
||||
case ACTION_QUIT_NO_CHDIR:
|
||||
g.no_chdir = true;
|
||||
return false;
|
||||
case ACTION_QUIT:
|
||||
return false;
|
||||
|
||||
@ -1326,12 +1334,7 @@ int main (int argc, char *argv[]) {
|
||||
// We can't portably create a standard stream from an FD, so modify the FD
|
||||
dup2 (output_fd, STDOUT_FILENO);
|
||||
|
||||
if (g.chosen_full) {
|
||||
auto full_path = g.cwd + "/" + g.chosen;
|
||||
cout << "local insert=" << shell_escape (full_path) << endl;
|
||||
return 0;
|
||||
}
|
||||
if (g.cwd != g.start_dir)
|
||||
if (g.cwd != g.start_dir && !g.no_chdir)
|
||||
cout << "local cd=" << shell_escape (g.cwd) << endl;
|
||||
if (!g.chosen.empty ())
|
||||
cout << "local insert=" << shell_escape (g.chosen) << endl;
|
||||
|
Loading…
x
Reference in New Issue
Block a user