struct assoc assocs[] = {
//{ "\\.(avi|mp4|mkv|mp3|ogg|flac|mov)$", "mpv" },
+ { "\\.(c|cpp|h|txt|log)$", "vim" },
{ "\\.(wma|mp3|ogg|flac)$", "fmedia" },
//{ "\\.(png|jpg|gif)$", "feh" },
//{ "\\.(html|svg)$", "firefox" },
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <magic.h>
#include "util.h"
#define MIN(x, y) ((x) < (y) ? (x) : (y))
#define ISODD(x) ((x) & 1)
#define CONTROL(c) ((c) ^ 0x40)
+#define MAX_PATH_LEN 1024
struct assoc {
char *regex; /* Regex to match on filename */
char *bin = NULL;
int i;
- const char *mime;
- magic_t magic;
-
- magic = magic_open(MAGIC_MIME_TYPE);
- magic_load(magic, NULL);
- magic_compile(magic, NULL);
- mime = magic_file(magic, file);
- DPRINTF_S(mime);
-
- if (strcmp(mime, "text/plain") == 0)
- return "vim";
- magic_close(magic);
-
for (i = 0; i < LEN(assocs); i++) {
if (regcomp(®ex, assocs[i].regex,
REG_NOSUB | REG_EXTENDED | REG_ICASE) != 0)
goto begin;
case S_IFREG:
bin = openwith(newpath);
+ char *execvim = "vim";
+
if (bin == NULL) {
- char cmd[512];
+ FILE *fp;
+ char cmd[MAX_PATH_LEN];
int status;
- sprintf(cmd, "xdg-open \"%s\" > /dev/null 2>&1", newpath);
- status = system(cmd);
- continue;
+
+ snprintf(cmd, MAX_PATH_LEN, "file \"%s\"", newpath);
+ fp = popen(cmd, "r");
+ if (fp == NULL)
+ goto nochange;
+ if (fgets(cmd, MAX_PATH_LEN, fp) == NULL) {
+ pclose(fp);
+ goto nochange;
+ }
+ pclose(fp);
+
+ if (strstr(cmd, "ASCII text") != NULL)
+ bin = execvim;
+ else {
+ snprintf(cmd, MAX_PATH_LEN, "xdg-open \"%s\" > /dev/null 2>&1", newpath);
+ status = system(cmd);
+ continue;
+ }
}
exitcurses();
spawn(bin, newpath, NULL);