diff --git a/README.md b/README.md index 2fd5d65..5dd6a31 100644 --- a/README.md +++ b/README.md @@ -22,12 +22,12 @@ sudo make install
### How to use -If you want to perform file opreations (move, remove etc.) you have to select the entry / entries first. So if you want to remove `foo`, you have to move to it, and when its highlighted you have to press `space` to select it and then `r` to delete it. -The keybinds below will help you understand how the program works. +If you want to perform file operations (move, remove etc.) you have to select the entry / entries first. So if you want to remove `foo`, you have to move to it, and when its highlighted you have to press `space` to select it and then `r` to delete it. +The keybinds can be configured in `config.h`, that will help you understand how to navigate the program.
-### Keybinds -

- -

+### Config +Edit `config.h` then just recompile the program via `make`. + +
diff --git a/config.h b/config.h index 568b74e..b12ae05 100644 --- a/config.h +++ b/config.h @@ -12,10 +12,46 @@ #define RESET "\x1B[0m" #define CLEAR "\e[1;1H\e[2J" +/* Keybinds */ + +#define UP 'w' +#define DOWN 's' +#define LEFT 'a' +#define RIGHT 'd' + +#define UP2 'k' +#define DOWN2 'j' +#define LEFT2 'h' +#define RIGHT2 'l' + +#define SELECT 32 // space +#define REMOVE 'r' +#define COPY 'c' +#define MOVE 'm' // this is rename as well +#define SYMLINK 'y' +#define MAKE_FILE 't' // t as in touch +#define MAKE_DIR 'T' + +#define TEXT_OPEN 'e' +#define MEDIA_OPEN 'v' +#define IMAGE_OPEN 'i' +#define DOCUMENT_OPEN 'n' +#define BROWSER_OPEN 'b' +#define EXECUTE 'x' + +#define SEARCH '/' +#define OPEN 'o' +#define UNHIDE 'u' +#define JUMP_FIRST 'g' +#define JUMP_LAST 'G' + +#define QUIT 'q' +#define NORMAL_RESET 27 // escape + /* Software to open files with */ -const char text_editor[256] = "nano"; -const char media_player[256] = "mpv"; -const char image_viewer[256] = "feh"; -const char document_reader[256] = "firefox"; -const char browser[256] = "firefox"; +#define TEXT_EDITOR "vim" +#define MEDIA_PLAYER "mpv" +#define IMAGE_VIEWER "feh" +#define DOCUMENT_READER "firefox" +#define BROWSER "firefox" diff --git a/fx.c b/fx.c index 427c194..b0f0903 100644 --- a/fx.c +++ b/fx.c @@ -35,7 +35,6 @@ int main(int argc, char *argv[]) char buf[10]; - char software[256]; char entry_name[256]; char search_term[256]; char last_entry_name[256] = { 0 }; @@ -47,8 +46,6 @@ int main(int argc, char *argv[]) char current_entry[4096]; char entry_to_work_with[4096] = { 0 }; - char command[5120]; - char tags[9][4096] = { 0 }; char selected_entries[1024][1024] = { 0 }; @@ -80,7 +77,8 @@ int main(int argc, char *argv[]) dir = opendir(path); if (dir == NULL) { - printf("This directory doesn't exist! (%s)\n", path); + printf("This directory doesn't exist or you lack permissions! (%s)\n", path); + tcsetattr(STDIN_FILENO, TCSANOW, &oldt); return 1; } @@ -88,8 +86,8 @@ int main(int argc, char *argv[]) { switch (c) { - case 'a': // enter the parent directory - case 'h': + case LEFT: // enter the parent directory + case LEFT2: if (strcmp(path, "/") == 0) { break; @@ -99,94 +97,53 @@ int main(int argc, char *argv[]) strcpy(path, temp_path); break; - case 'w': // go up - case 'k': + case UP: // go up + case UP2: if (position) { position--; } break; - case 's': // go down - case 'j': + case DOWN: // go down + case DOWN2: if (entry_count - 1 > position) { position++; } break; - case 'd': // enter a directory or open a file - case 'l': + case RIGHT: // enter a directory + case RIGHT2: stat(current_entry, &st); - if (S_ISDIR(st.st_mode)) { + if (opendir(current_entry) == NULL) + { + break; + } + strcpy(path, current_entry); position = 0; - } - else - { - puts(SECONDARY_FG "\n\nOpen file with:\n"); - puts(SECONDARY_FG "[" PRIMARY_FG "1" SECONDARY_FG"] Text editor"); - puts(SECONDARY_FG "[" PRIMARY_FG "2" SECONDARY_FG"] Media player"); - puts(SECONDARY_FG "[" PRIMARY_FG "3" SECONDARY_FG"] Image viewer"); - puts(SECONDARY_FG "[" PRIMARY_FG "4" SECONDARY_FG"] Document reader"); - puts(SECONDARY_FG "[" PRIMARY_FG "5" SECONDARY_FG"] Browser"); - puts(SECONDARY_FG "\n[" PRIMARY_FG "6" SECONDARY_FG"] Execute it"); - c = getchar(); - switch (c) - { - case '1': - strcpy(software, text_editor); - break; - case '2': - strcpy(software, media_player); - break; - case '3': - strcpy(software, image_viewer); - break; - case '4': - strcpy(software, document_reader); - break; - case '5': - strcpy(software, browser); - break; - case '6': - strcpy(software, current_entry); - break; - } - - if (strcmp(software, current_entry) == 0) - { - strcpy(command, software); - } - else - { - sprintf(command, "%s %s", software, current_entry); - } - - system(command); - - printf(RESET); } break; - case 'g': // go to the top of the directory + case JUMP_FIRST: // go to the top of the directory position = 0; break; - case 'G': // go to the bottom of the directory + case JUMP_LAST: // go to the bottom of the directory position = entry_count - 1; break; - case 'm': // move or rename an entry - case 'y': // create a symlink - case 'c': // copy a file - case 'r': // remove an entry + case MOVE: // move or rename an entry + case SYMLINK: // create a symlink + case COPY: // copy a file + case REMOVE: // remove an entry if (selected_entries[0][0]) { - if (c == 'r') + if (c == REMOVE) { printf(SECONDARY_FG"\n\nAre you sure that you want to remove the selected entries? (" PRIMARY_FG "y" SECONDARY_FG "/" PRIMARY_FG "N" SECONDARY_FG ")" RESET " "); if (getchar() != 'y') @@ -234,13 +191,13 @@ int main(int argc, char *argv[]) switch (c) { - case 'm': + case MOVE: rename(entry_to_work_with, new_path); break; - case 'y': + case SYMLINK: symlink(entry_to_work_with, new_path); break; - case 'c': + case COPY: if (strcmp(entry_to_work_with, new_path) == 0) { @@ -263,7 +220,7 @@ int main(int argc, char *argv[]) fclose(fptr1); break; - case 'r': + case REMOVE: stat(entry_to_work_with, &st); if (S_ISDIR(st.st_mode)) @@ -282,8 +239,8 @@ int main(int argc, char *argv[]) } break; - case 't': // create a new file - case 'T': // create a new directory + case MAKE_FILE: // create a new file + case MAKE_DIR: // create a new directory printf(SECONDARY_FG "\n\nEntry name:" RESET " " PRIMARY_FG); tcsetattr( STDIN_FILENO, TCSANOW, &oldt); scanf("%255s", entry_name); @@ -293,7 +250,7 @@ int main(int argc, char *argv[]) printf(RESET); - if (c == 't') + if (c == MAKE_FILE) { fp = fopen(temp_path, "w"); fclose(fp); @@ -302,10 +259,35 @@ int main(int argc, char *argv[]) { mkdir(temp_path, 0755); } - break; - case '/': // filter entry names + case TEXT_OPEN: // open current file with the text editor + external_open(current_entry, TEXT_EDITOR); + break; + + case MEDIA_OPEN: + external_open(current_entry, MEDIA_PLAYER); + break; + + case IMAGE_OPEN: + external_open(current_entry, IMAGE_VIEWER); + break; + + case DOCUMENT_OPEN: + external_open(current_entry, DOCUMENT_READER); + break; + + case BROWSER_OPEN: + external_open(current_entry, BROWSER); + break; + + case EXECUTE: + tcsetattr( STDIN_FILENO, TCSANOW, &oldt); + external_open(current_entry, current_entry); + tcsetattr( STDIN_FILENO, TCSANOW, &newt); + break; + + case SEARCH: // search entry names printf(SECONDARY_FG "\n\nSearch entry:" RESET " " PRIMARY_FG); tcsetattr( STDIN_FILENO, TCSANOW, &oldt); scanf("%255s", search_term); @@ -313,7 +295,7 @@ int main(int argc, char *argv[]) position = 0; break; - case 'o': // open a given path + case OPEN: // open a given path printf(SECONDARY_FG "\n\nPath to open:" RESET " " PRIMARY_FG); tcsetattr( STDIN_FILENO, TCSANOW, &oldt); scanf("%255s", temp_path); @@ -333,7 +315,7 @@ int main(int argc, char *argv[]) break; - case 'u': // unhide hidden entries + case UNHIDE: // unhide hidden entries if (hidden) { hidden = 0; @@ -363,7 +345,7 @@ int main(int argc, char *argv[]) position = 0; break; - case 32: // space, select entries + case SELECT: // select entries for (int i = 0; 1024 > i; i++) { if (selected_entries[i][0]) @@ -392,7 +374,7 @@ int main(int argc, char *argv[]) } break; - case 27: // escape, resets everything + case NORMAL_RESET: // resets everything position = 0; memset(selected_entries, 0, 1024 * 1024); @@ -466,18 +448,26 @@ int main(int argc, char *argv[]) for (int i = 0; 1024 > i; i++) { + + if (selected_entries[i][0] == 0) + { + break; + } + if (strcmp(selected_entries[i], temp_path) == 0) { printf(SECONDARY_FG); } } + // the user entered the parent directory so we want to highlight that if (strcmp(entry_name, last_entry_name) == 0) { position = entry_count; memset(last_entry_name, 0, 256); printf(SELECTED_BG SELECTED_FG); } + // the user searched for an entry so we want to highlight that else if (search_term[0] && strcasestr(entry_name, search_term)) { @@ -485,7 +475,8 @@ int main(int argc, char *argv[]) memset(search_term, 0, 256); printf(SELECTED_BG SELECTED_FG); } - else if (entry_count == position && last_entry_name[0] == 0) + else if (entry_count == position && + last_entry_name[0] == 0) { printf(SELECTED_BG SELECTED_FG); } @@ -542,10 +533,14 @@ int main(int argc, char *argv[]) printf(RESET SECONDARY_FG "Last changed: " PRIMARY_FG "%s" RESET, ctime(&st.st_ctime)); printf(RESET SECONDARY_FG "\nNumber of entries: " PRIMARY_FG "%d" RESET, entry_count); - printf(SECONDARY_FG "\nFile size sum: " PRIMARY_FG "%s" RESET, readable_file_size(file_size_sum, buf)); + if (file_size_sum != 0) + { + printf(SECONDARY_FG "\nFile size sum: " PRIMARY_FG "%s" RESET, readable_file_size(file_size_sum, buf)); + } - } while((c=getchar()) != 'q'); + } while((c=getchar()) != QUIT); + printf(CLEAR); tcsetattr( STDIN_FILENO, TCSANOW, &oldt); return 0; diff --git a/shortcuts.png b/shortcuts.png deleted file mode 100644 index 3b76189..0000000 Binary files a/shortcuts.png and /dev/null differ diff --git a/utils.c b/utils.c index 11be728..635e61d 100644 --- a/utils.c +++ b/utils.c @@ -19,6 +19,24 @@ int unlink_cb(const char *fpath, const struct stat *sb, int typeflag, struct FTW return rv; } +int external_open(char path[4096], const char *software) +{ + char command[4352]; + + + if (strcmp(path, software) != 0) + { + sprintf(command, "%s \"%s\"", software, path); + } + else + { + strcpy(command, software); + } + + system(command); + return 0; +} + int print_permissions(struct stat st) { mode_t m = st.st_mode; diff --git a/utils.h b/utils.h index cc4ce93..ad06f19 100644 --- a/utils.h +++ b/utils.h @@ -1,4 +1,5 @@ int open_file(char path[4096]); +int external_open(char path[4096], const char *software); int recursive_remove(char path[4096]); int print_permissions(struct stat st); char *remove_path(char path[4096]);