return r;
}
+static void add_bookmark(char *path, char *newpath, int *presel)
+{
+ char *dir = xbasename(path);
+
+ dir = xreadline(dir[0] ? dir : NULL, "name: ");
+ if (dir && *dir) {
+ size_t r = mkpath(cfgpath, toks[TOK_BM], newpath);
+
+ newpath[r - 1] = '/';
+ xstrsncpy(newpath + r, dir, PATH_MAX - r);
+ printwait((symlink(path, newpath) == -1) ? strerror(errno) : newpath, presel);
+ } else
+ printwait(messages[MSG_CANCEL], presel);
+}
+
/*
* The help string tokens (each line) start with a HEX value
* which indicates the number of spaces to print before the
"5Ret Rt l Open%-20c' First file/match\n"
"9g ^A Top%-21c. Toggle hidden\n"
"9G ^E End%-21c+ Toggle auto-advance\n"
- "c, Mark CWD%-13cb ^/ Select bookmark\n"
+ "8B (,) Book(mark)%-11cb ^/ Select bookmark\n"
"a1-4 Context%-11c(Sh)Tab Cycle/new context\n"
"62Esc ^Q Quit%-20cq Quit context\n"
"b^G QuitCD%-18cQ Pick/err, quit\n"
/* SEL_CDLAST: dir pointing to lastdir */
xstrsncpy(newpath, dir, PATH_MAX); // fallthrough
- case SEL_BOOKMARK:
- if (sel == SEL_BOOKMARK) {
+ case SEL_BMOPEN:
+ if (sel == SEL_BMOPEN) {
r = (int)handle_bookmark(mark, newpath);
if (r) {
printwait(messages[r], &presel);
mark = xstrdup(path);
printwait(mark, &presel);
goto nochange;
+ case SEL_BMARK:
+ add_bookmark(path, newpath, &presel);
+ goto nochange;
case SEL_FLTR:
if (!ndents)
goto nochange;
SEL_CDBEGIN,
SEL_CDLAST,
SEL_CDROOT,
- SEL_BOOKMARK,
+ SEL_BMOPEN,
SEL_REMOTE,
SEL_CYCLE,
SEL_CYCLER,
SEL_CTX8,
#endif
SEL_MARK,
+ SEL_BMARK,
SEL_FLTR,
SEL_MFLTR,
SEL_HIDDEN,
/* Go to / */
{ '`', SEL_CDROOT },
/* Leader key */
- { 'b', SEL_BOOKMARK },
- { CONTROL('_'), SEL_BOOKMARK },
+ { 'b', SEL_BMOPEN },
+ { CONTROL('_'), SEL_BMOPEN },
/* Connect to server over SSHFS */
{ 'c', SEL_REMOTE },
/* Cycle contexts in forward direction */
#endif
/* Mark a path to visit later */
{ ',', SEL_MARK },
+ /* Create a bookmark */
+ { 'B', SEL_BMARK },
/* Filter */
{ '/', SEL_FLTR },
/* Toggle filter mode */