Commit Diff


commit - d244a6559b664474533c734bb3494bb802f3786f
commit + 2c5122bc37cd83522916d7d0ce331971a636ea7e
blob - f8155b46f303d0a2e54e6cef7182335800008725
blob + a0498c7f8f73465f6111e48162a570d1bca2448f
--- fm.1
+++ fm.1
@@ -100,6 +100,14 @@ Spawn a shell
 View file with a pager.
 .It e
 Edit file with an editor.
+.It o
+Open the file with an external application.
+.It m
+Toggle mark on the file at point.
+.It M
+Mark all files
+.It t
+Toggle marking.
 .It q
 Quit
 .Nm .
blob - 5713113a00b60eaaffc9d119ae286f6c3831ae46
blob + daf0b188ce5c58ffc2bec0d80d40e7df82c7bf0f
--- fm.c
+++ fm.c
@@ -39,6 +39,10 @@
 #define FM_ED "/bin/ed"
 #endif
 
+#ifndef FM_OPENER
+#define FM_OPENER "xdg-open"
+#endif
+
 #include "config.h"
 
 struct option opts[] = {
@@ -1371,9 +1375,61 @@ cmd_edit(void)
 		editor = FM_ED;
 
 	spawn(editor, ENAME(ESEL), NULL);
+}
+
+static void
+cmd_open(void)
+{
+	const char *opener;
+
+	if (!fm.nfiles || S_ISDIR(EMODE(ESEL)))
+		return;
+
+	if ((opener = getenv("OPENER")) == NULL)
+		opener = FM_OPENER;
+
+	spawn(opener, ENAME(ESEL), NULL);
+}
+
+static void
+cmd_mark(void)
+{
+	if (MARKED(ESEL))
+		del_mark(&fm.marks, ENAME(ESEL));
+	else
+		add_mark(&fm.marks, CWD, ENAME(ESEL));
+
+	MARKED(ESEL) = !MARKED(ESEL);
+	ESEL = (ESEL + 1) % fm.nfiles;
+}
+
+static void
+cmd_toggle_mark(void)
+{
+	int i;
+
+	for (i = 0; i < fm.nfiles; ++i) {
+		if (MARKED(i))
+			del_mark(&fm.marks, ENAME(i));
+		else
+			add_mark(&fm.marks, CWD, ENAME(ESEL));
+		MARKED(i) = !MARKED(i);
+	}
 }
 
 static void
+cmd_mark_all(void)
+{
+	int i;
+
+	for (i = 0; i < fm.nfiles; ++i)
+		if (!MARKED(i)) {
+			add_mark(&fm.marks, CWD, ENAME(ESEL));
+			MARKED(i) = 1;
+		}
+}
+
+static void
 loop(void)
 {
 	int meta, ch, c;
@@ -1394,6 +1450,7 @@ loop(void)
 		{'H',		0,	cmd_home,		X_UPDV},
 		{'J',		0,	cmd_scroll_down,	X_UPDV},
 		{'K',		0,	cmd_scroll_up,		X_UPDV},
+		{'M',		0,	cmd_mark_all,		X_UPDV},
 		{'P',		0,	cmd_paste_path,		X_UPDV},
 		{'V',		K_CTRL,	cmd_scroll_down,	X_UPDV},
 		{'Y',		0,	cmd_copy_path,		X_UPDV},
@@ -1410,10 +1467,13 @@ loop(void)
 		{'l',		K_CTRL,	cmd_reload,		X_UPDV},
 		{'n',		0,	cmd_down,		X_UPDV},
 		{'n',		K_CTRL,	cmd_down,		X_UPDV},
+		{'m',		0,	cmd_mark,		X_UPDV},
 		{'m',		K_CTRL,	cmd_shell,		X_UPDV},
+		{'o',		0,	cmd_open,		X_UPDV},
 		{'p',		0,	cmd_up,			X_UPDV},
 		{'p',		K_CTRL,	cmd_up,			X_UPDV},
 		{'q',		0,	NULL,			X_QUIT},
+		{'t',		0,	cmd_toggle_mark,	X_UPDV},
 		{'v',		0,	cmd_view,		X_UPDV},
 		{'v',		K_META,	cmd_scroll_up,		X_UPDV},
 		{KEY_DOWN,	0,	cmd_scroll_down,	X_UPDV},