Compare commits

...
Author SHA1 Message Date
github-actions[bot] 693e85d974 chore: weekly flake update 2026-07-27 06:37:15 +00:00
tomasrandGitHub b9f71f580a Merge pull request #55 from tomasriveral/flake-update/2026-07-13 2026-07-13 19:24:40 -05:00
github-actions[bot] c6aac80951 chore: weekly flake update 2026-07-13 06:26:42 +00:00
tomasrandGitHub b395fe1072 Merge pull request #52 from tomasriveral/flake-update/2026-06-22 2026-06-23 01:43:20 +00:00
github-actions[bot] 27cc3de27d chore: weekly flake update 2026-06-22 09:18:09 +00:00
tomasrandGitHub 18538f3250 Merge pull request #51 from tomasriveral/flake-update/2026-06-15 2026-06-15 09:34:33 +00:00
github-actions[bot] 6c7cc413da chore: weekly flake update 2026-06-15 09:31:17 +00:00
tomasrandGitHub e670ef935f Merge pull request #50 from tomasriveral/flake-update/2026-06-08
[Automated] Weekly flake update 2026-06-08
2026-06-08 08:53:32 +00:00
github-actions[bot] 29d86955f4 chore: weekly flake update 2026-06-08 08:19:19 +00:00
tomasrandGitHub 0f9ec32bfc Merge (#49) from tomasriveral/release/v2.3.0
[Automatic] Release PR v2.3.0
2026-06-02 14:41:02 +02:00
github-actions[bot] 5ad8f2f99e chore(release): v2.3.0 2026-06-02 12:40:33 +00:00
tomasrandGitHub c6e590e57c Merge (#48) from tomasriveral/vault-indicator
feat: vault indicator
2026-06-02 14:39:23 +02:00
tomasr d47bdb82eb feat: vault indicator 2026-06-02 14:37:39 +02:00
tomasrandGitHub 50748eeac0 Merge (#47) from tomasriveral/ncurse-quick-selection
feat: ncurses quick select
2026-06-02 14:32:43 +02:00
tomasr 19a8f7e07f feat: ncurses quick select 2026-06-02 14:30:16 +02:00
tomasrandGitHub 1c17c62835 Merge (#46) from tomasriveral/journal-return-to-vault
feat: button return to note selection from journal entry selection
2026-06-02 14:05:49 +02:00
tomasr e666ca32de feat: button return to note selection from journal entry selection 2026-06-02 14:03:05 +02:00
tomasrandGitHub 2a8392ac2e Merge (#45) from tomasriveral/vault-fzf-search
feat: fzf search inside vaults
2026-06-02 13:51:45 +02:00
tomasr 292688296e format: fix 2026-06-02 13:46:03 +02:00
tomasr 4c18c2dda4 feat: fzf search inside vaults 2026-06-02 13:42:46 +02:00
tomasr 1bfb7f82a5 fix: fzfSearch when journal entry 2026-06-02 13:42:37 +02:00
tomasrandGitHub a32f97d229 Merge (#44) from tomasriveral/release/v2.2.1
[Automatic] Release PR v2.2.1
2026-06-01 11:46:28 +02:00
github-actions[bot] 6555b7247e chore(release): v2.2.1 2026-06-01 09:42:58 +00:00
tomasrandGitHub 2b2a3455d2 Merge (#43) from tomasriveral/fix-flake-src
fix: flake src
2026-06-01 11:41:29 +02:00
tomasr d8a11bbc16 fix: flake src 2026-06-01 11:37:47 +02:00
tomasrandGitHub 1d95983d5d Merge (#42) from tomasriveral/flake-update/2026-06-01
[Automated] Weekly flake update 2026-06-01
2026-06-01 11:10:45 +02:00
github-actions[bot] 30449ca473 chore: weekly flake update 2026-06-01 08:42:14 +00:00
tomasrandGitHub 7af79c76b1 Merge pull request #41 from tomasriveral/release/v2.2
[Automatic] Release PR v2.2
2026-05-27 17:42:59 +02:00
6 changed files with 137 additions and 107 deletions
Generated
+4 -21
View File
@@ -20,11 +20,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1779560665, "lastModified": 1785090369,
"narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=", "narHash": "sha256-m0pDuRJG7EDo9ri+4Ksu83VsI+PlxNC9lNBfydejce4=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786", "rev": "624af665418d3c65d544145b4d34ad696439570e",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -34,27 +34,10 @@
"type": "github" "type": "github"
} }
}, },
"notewrapper": {
"flake": false,
"locked": {
"lastModified": 1779896337,
"narHash": "sha256-Xw5vkiN4ei2dkzIRXP0DLSYG8QRjQ0MLvFx2akt96kk=",
"owner": "tomasriveral",
"repo": "NoteWrapper",
"rev": "4d228fb9118f22264863716ac2d74c4ad67edbf8",
"type": "github"
},
"original": {
"owner": "tomasriveral",
"repo": "NoteWrapper",
"type": "github"
}
},
"root": { "root": {
"inputs": { "inputs": {
"flake-utils": "flake-utils", "flake-utils": "flake-utils",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs"
"notewrapper": "notewrapper"
} }
}, },
"systems": { "systems": {
+3 -7
View File
@@ -4,22 +4,18 @@
inputs = { inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils"; flake-utils.url = "github:numtide/flake-utils";
notewrapper = {
url = "github:tomasriveral/NoteWrapper";
flake = false;
};
}; };
outputs = { self, nixpkgs, flake-utils, notewrapper }: outputs = { self, nixpkgs, flake-utils}:
flake-utils.lib.eachDefaultSystem (system: flake-utils.lib.eachDefaultSystem (system:
let let
pkgs = import nixpkgs { inherit system; }; pkgs = import nixpkgs { inherit system; };
in { in {
packages.default = pkgs.stdenv.mkDerivation (finalAttrs: { packages.default = pkgs.stdenv.mkDerivation (finalAttrs: {
pname = "notewrapper"; pname = "notewrapper";
version = "v2.2"; version = "v2.3.0";
src = notewrapper; src = ./.;
nativeBuildInputs = with pkgs; [ nativeBuildInputs = with pkgs; [
pkg-config pkg-config
+28 -10
View File
@@ -598,7 +598,8 @@ backup_config_end:
*backupMessage = 0; // we reset it to show the message only once *backupMessage = 0; // we reset it to show the message only once
vaultSelected = ncursesSelect(vaultsArray, "Select vault to open (Use arrows or WASD, Enter to select):", vaultsCount, extraOptions, " ", "Or select an option below", "", shouldDebug); vaultSelected = ncursesSelect(vaultsArray, "Select vault to open (Use arrows or WASD, Enter to select or use 1-9 to quick select or use 1-9 to quick select):", vaultsCount, extraOptions, " ",
"Or select an option below", "", shouldDebug);
// now that we won't use vaultsArray in this iteration of the loop, we should free it and // now that we won't use vaultsArray in this iteration of the loop, we should free it and
// all its elements. (As this is memory in the heap and not the stack and thus is our // all its elements. (As this is memory in the heap and not the stack and thus is our
@@ -644,12 +645,13 @@ backup_config_end:
altDebug("└------------------------------\n"); altDebug("└------------------------------\n");
} }
// adds options // adds options
int extraNotesOptions = 4; int extraNotesOptions = 5;
filesArray = realloc(filesArray, (filesCount + extraNotesOptions) * sizeof(char *)); // resize filesArray to fit the extra options filesArray = realloc(filesArray, (filesCount + extraNotesOptions) * sizeof(char *)); // resize filesArray to fit the extra options
filesArray[filesCount] = "Create new note"; filesArray[filesCount] = "Create new note";
filesArray[filesCount + 1] = "Back to vault selection"; filesArray[filesCount + 1] = "Search inside the vault";
filesArray[filesCount + 2] = "Delete vault"; filesArray[filesCount + 2] = "Back to vault selection";
filesArray[filesCount + 3] = "Quit (Ctrl+C)"; filesArray[filesCount + 3] = "Delete vault";
filesArray[filesCount + 4] = "Quit (Ctrl+C)";
char *noteSelected; char *noteSelected;
// if we set to bypass the note selector // if we set to bypass the note selector
if (bypassSelectionNote) { if (bypassSelectionNote) {
@@ -665,8 +667,9 @@ backup_config_end:
goto note_creation; goto note_creation;
} }
} }
noteSelected = char vaultMessage[PATH_MAX];
ncursesSelect(filesArray, "Select note or journal to open (Use arrows or WASD, Enter to select):", filesCount, extraNotesOptions, " ", "Or select an option below", "", shouldDebug); snprintf(vaultMessage, PATH_MAX, "%s: Select note or journal to open (Use arrows or WASD, Enter to select or use 1-9 to quick select):", vaultSelected);
noteSelected = ncursesSelect(filesArray, vaultMessage, filesCount, extraNotesOptions, " ", "Or select an option below", "", shouldDebug);
// now that we won't use filesArray in this iteration of the loop, we should free it // now that we won't use filesArray in this iteration of the loop, we should free it
// and all its elements. (As this is memory in the heap and not the stack and thus // and all its elements. (As this is memory in the heap and not the stack and thus
// is our responsability to manage) // is our responsability to manage)
@@ -680,7 +683,7 @@ backup_config_end:
free(filesArray); free(filesArray);
debug("Selected note: %s", noteSelected); debug("Selected note: %s", noteSelected);
if (strcmp(noteSelected, "Create new note") != 0 && strcmp(noteSelected, "Back to vault selection") != 0 && strcmp(noteSelected, "Delete vault") != 0 && if (strcmp(noteSelected, "Create new note") != 0 && strcmp(noteSelected, "Back to vault selection") != 0 && strcmp(noteSelected, "Delete vault") != 0 &&
strcmp(noteSelected, "Quit (Ctrl+C)") != 0) { strcmp(noteSelected, "Quit (Ctrl+C)") != 0 && strcmp(noteSelected, "Search inside the vault") != 0) {
open_note: open_note:
bypassSelectionNote = 0; // we must reset bypassSelectionNote to avoid getting into an infinite bypassSelectionNote = 0; // we must reset bypassSelectionNote to avoid getting into an infinite
// loop of bypassing the note selection // loop of bypassing the note selection
@@ -694,12 +697,18 @@ backup_config_end:
int *journalWasUpdated = malloc(sizeof(int)); int *journalWasUpdated = malloc(sizeof(int));
*journalWasUpdated = 0; *journalWasUpdated = 0;
// used to go back to note selection
int *returnNoteSelection = malloc(sizeof(int));
*returnNoteSelection = 0;
if (!regexReturn) { // if the regex matches -> it's a journal if (!regexReturn) { // if the regex matches -> it's a journal
debug("%s is a journal. Updating it...", noteSelected); debug("%s is a journal. Updating it...", noteSelected);
fullPath = updateJournal(fullPath, noteSelected, timeFormat, journalWasUpdated, fullPath = updateJournal(fullPath, noteSelected, timeFormat, journalWasUpdated, returnNoteSelection,
shouldDebug); // we return the path. As if it is a divided journal we shouldDebug); // we return the path. As if it is a divided journal we
// must point to the correct entry // must point to the correct entry
} }
if (!*returnNoteSelection) { // if we don't need to return to the note selection
if (newLineOnOpening) { if (newLineOnOpening) {
if (*journalWasUpdated) { if (*journalWasUpdated) {
appendToFile(fullPath, "\n", appendToFile(fullPath, "\n",
@@ -712,11 +721,20 @@ backup_config_end:
} }
openEditor(fullPath, editorToOpen, shouldRender, shouldJumpToEnd, shouldDebug); openEditor(fullPath, editorToOpen, shouldRender, shouldJumpToEnd, shouldDebug);
free(fullPath); free(fullPath);
}
free(returnNoteSelection);
} else if (strcmp(noteSelected, "Create new note") == 0) { } else if (strcmp(noteSelected, "Create new note") == 0) {
note_creation: note_creation:
noteSelected = createNewNote(notesDirectoryString, vaultSelected, bypassSelectionNote, bypassSelectionNoteValue, journalRegex, shouldDebug); noteSelected = createNewNote(notesDirectoryString, vaultSelected, bypassSelectionNote, bypassSelectionNoteValue, journalRegex, shouldDebug);
// we can just go back to open_note // we can just go back to open_note
goto open_note; goto open_note;
} else if (strcmp(noteSelected, "Search inside the vault") == 0) {
char *vaultPath = malloc(PATH_MAX);
snprintf(vaultPath, PATH_MAX, "%s/%s/", notesDirectoryString, vaultSelected);
char *result = fzfSelect(vaultPath, "Input text to be searched", shouldDebug);
bypassSelectionNote = 1;
bypassSelectionNoteValue = result;
free(vaultPath);
} else if (strcmp(noteSelected, "Back to vault selection") == 0) { } else if (strcmp(noteSelected, "Back to vault selection") == 0) {
shouldChangeVault = 1; shouldChangeVault = 1;
} else if (strcmp(noteSelected, "Delete vault") == 0) { } else if (strcmp(noteSelected, "Delete vault") == 0) {
@@ -725,7 +743,7 @@ backup_config_end:
const char *yesNo[] = {"No, go back to note selection.", "Yes."}; const char *yesNo[] = {"No, go back to note selection.", "Yes."};
char *answer = ncursesSelect((char **)yesNo, char *answer = ncursesSelect((char **)yesNo,
"Are you sure you want to delete the entire vault? This can " "Are you sure you want to delete the entire vault? This can "
"not be undone (Use arrows or WASD, Enter to select):", "not be undone (Use arrows or WASD, Enter to select or use 1-9 to quick select):",
1, 1, " ", "", "", shouldDebug); 1, 1, " ", "", "", shouldDebug);
debug("You answered: %s for deleting the vault %s", answer, vaultSelected); debug("You answered: %s for deleting the vault %s", answer, vaultSelected);
if (strcmp(answer, "Yes.") == 0) { if (strcmp(answer, "Yes.") == 0) {
+7 -3
View File
@@ -188,7 +188,7 @@ char **getVaultsFromDirectories(char **directoryStringArray, int directoryNumber
return vaultsArray; return vaultsArray;
} }
char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWasUpdated, int shouldDebug) { char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWasUpdated, int *returnNoteSelection, int shouldDebug) {
path[PATH_MAX] = '\0'; // it assures it is a string (Most cases this does nothing). But rewriting at least path[PATH_MAX] = '\0'; // it assures it is a string (Most cases this does nothing). But rewriting at least
// one bytes make the compile happy. He doesn't want to return an unchanged input. // one bytes make the compile happy. He doesn't want to return an unchanged input.
debug("Handling the journal %s", path); debug("Handling the journal %s", path);
@@ -221,13 +221,14 @@ char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWas
that the Create new entry in journal is on top entryArray = realloc(entryArray, that the Create new entry in journal is on top entryArray = realloc(entryArray,
sizeof(char*));*/ sizeof(char*));*/
// simpler to just malloc 2 and later realloc // simpler to just malloc 2 and later realloc
const int extraOptions = 3; const int extraOptions = 4;
char **entryArray = malloc(extraOptions * sizeof(char *)); char **entryArray = malloc(extraOptions * sizeof(char *));
char *createEntryMessage = malloc(PATH_MAX); char *createEntryMessage = malloc(PATH_MAX);
snprintf(createEntryMessage, PATH_MAX, "Create new entry for the journal %s", journal); snprintf(createEntryMessage, PATH_MAX, "Create new entry for the journal %s", journal);
entryArray[0] = createEntryMessage; entryArray[0] = createEntryMessage;
entryArray[1] = "Open random entry"; entryArray[1] = "Open random entry";
entryArray[2] = "Search inside entries"; entryArray[2] = "Search inside entries";
entryArray[3] = "Return to the note selection";
int entryCount = extraOptions; // we need to count how many dirs there is to always readjust int entryCount = extraOptions; // we need to count how many dirs there is to always readjust
// how many memory we alloc // how many memory we alloc
// Refer https://pubs.opengroup.org/onlinepubs/7990989775/xsh/readdir.html // Refer https://pubs.opengroup.org/onlinepubs/7990989775/xsh/readdir.html
@@ -259,7 +260,8 @@ char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWas
// element // element
// we must now select to create new entry or to enter in old one // we must now select to create new entry or to enter in old one
char *selectedOption = ncursesSelect(entryArray, "Create new entry or acces old entry (Use arrows or WASD, Enter to select):", extraOptions, entryCount - extraOptions, " ", " ", "", char *selectedOption =
ncursesSelect(entryArray, "Create new entry or acces old entry (Use arrows or WASD, Enter to select or use 1-9 to quick select):", extraOptions, entryCount - extraOptions, " ", " ", "",
shouldDebug); // the "Create new entry for the journal %s" will be the only options. All shouldDebug); // the "Create new entry for the journal %s" will be the only options. All
// other will be extraOptions. This is made so that "Create [...] %s" will // other will be extraOptions. This is made so that "Create [...] %s" will
// always be on top // always be on top
@@ -301,6 +303,8 @@ char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWas
snprintf(selectedOption, PATH_MAX, "%s/%s", path, temp); snprintf(selectedOption, PATH_MAX, "%s/%s", path, temp);
path = strdup(selectedOption); path = strdup(selectedOption);
free(selectedOption); free(selectedOption);
} else if (strcmp(selectedOption, "Return to the note selection") == 0) {
*returnNoteSelection = 1;
} else { // we just recreate the path to the selected entry } else { // we just recreate the path to the selected entry
// snprintf does not like to have the same variable as input and output so we use a // snprintf does not like to have the same variable as input and output so we use a
// buffer // buffer
+2 -1
View File
@@ -25,6 +25,7 @@ char **getVaultsFromDirectories(char **directoryStringArray, int directoryNumber
// handles both type of journal (divided and unified). // handles both type of journal (divided and unified).
// creates new entry with date. // creates new entry with date.
// for divided select if we want to acces to a new entry or a old one. // for divided select if we want to acces to a new entry or a old one.
// returnNoteSelection tells us if the user wants to go back to the note selection.
// returns the path to the file that needs to be opened. // returns the path to the file that needs to be opened.
char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWasUpdated, int shouldDebug); char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWasUpdated, int *returnNoteSelection, int shouldDebug);
#endif #endif
+80 -52
View File
@@ -6,7 +6,8 @@ void createNewVault(char **directoriesArray, int directoryCount, char **vaultsAr
int emptyWarning = 0; // set to 1 later if inpted empty name int emptyWarning = 0; // set to 1 later if inpted empty name
input_screen: input_screen:
// choose in which directory the vault will be created // choose in which directory the vault will be created
char *dirToVault = ncursesSelect(directoriesArray, "Select a directory, in which the vault will remain (Use arrows or WASD, Enter to select)", directoryCount, 0, "", "", " ", shouldDebug); char *dirToVault =
ncursesSelect(directoriesArray, "Select a directory, in which the vault will remain (Use arrows or WASD, Enter to select or use 1-9 to quick select)", directoryCount, 0, "", "", " ", shouldDebug);
char *vaultName = malloc(PATH_MAX); char *vaultName = malloc(PATH_MAX);
if (!bypass) { // if won't bypass (if -v or --vault weren't set) if (!bypass) { // if won't bypass (if -v or --vault weren't set)
echo(); echo();
@@ -179,13 +180,7 @@ char *fzfSelect(char *pathToFiles, char *selectText, int shouldDebug) {
error(fd == -1, "program", "mkstemp failed"); error(fd == -1, "program", "mkstemp failed");
close(fd); close(fd);
/*
* STEP 1:
* Build index once into temp file
* format: file:line:content
*/
snprintf(command, sizeof(command), "rg --line-number --no-heading --color=never . \"%s\" > %s", pathToFiles, indexFile); snprintf(command, sizeof(command), "rg --line-number --no-heading --color=never . \"%s\" > %s", pathToFiles, indexFile);
debug("INDEX CMD: %s", command); debug("INDEX CMD: %s", command);
if (system(command) != 0) { if (system(command) != 0) {
@@ -193,45 +188,6 @@ char *fzfSelect(char *pathToFiles, char *selectText, int shouldDebug) {
error(1, "program", "rg indexing failed"); error(1, "program", "rg indexing failed");
} }
/*
* STEP 2:
* Use fzf on the index file (NO rg anymore)
*/
/*
EXPLANATION:
cat %s
→ feeds prebuilt index file (format: file:line:content) into fzf
fzf --delimiter ':'
→ splits each line into fields:
{1} = file path
{2} = line number
{3} = content
--prompt
→ UI prompt text shown in fzf
--preview
→ runs a shell command for selected item:
file={1} → current file
line={2} → line number of match
nl -ba "$file"
→ prints file with line numbers
sed -n "$((line-5)),$((line+5))p"
→ extracts a window of 5 lines above and below match
sed "... -> ..."
→ highlights the matched line (middle of window) with red arrow
--preview-window=right:60%:hidden
→ preview appears on right, 60% width, initially hidden
--bind 'change:show-preview'
→ preview only appears after first selection change (not at startup)
*/
snprintf(command, sizeof(command), snprintf(command, sizeof(command),
"cat %s | fzf --delimiter ':' --prompt='%s' " "cat %s | fzf --delimiter ':' --prompt='%s' "
"--preview 'file={1}; line={2}; nl -ba \"$file\" | sed -n \"$((line-5)),$((line+5))p\" | " "--preview 'file={1}; line={2}; nl -ba \"$file\" | sed -n \"$((line-5)),$((line+5))p\" | "
@@ -254,16 +210,25 @@ char *fzfSelect(char *pathToFiles, char *selectText, int shouldDebug) {
buffer[strcspn(buffer, "\n")] = '\0'; buffer[strcspn(buffer, "\n")] = '\0';
result = strdup(buffer); result = strdup(buffer);
} }
debug("Buffer: %s", buffer);
debug("result: %s", result);
// cut at first ':' // cut at first ':'
result = strtok(result, ":"); result = strtok(result, ":");
// cut at / (because we need the full paths before and we only need to return the journal entry) // we need to cut out the whole pathToFiles
char *token = strtok(result, "/"); int pathToFilesLen = strlen(pathToFiles);
result = NULL; int cutOut = 0;
while (token != NULL) { for (int i = 0; i < pathToFilesLen; i++) {
result = token; if (pathToFiles[i] == result[i]) {
token = strtok(NULL, "/"); // Passing NULL means “dont start a new string, resume cutOut = i;
} }
}
result += cutOut + 1; // the + 1 cuts the first /
// in case we select a journal, we won't open the entry just yet. We only need to return the journal name (everything before [now the first] /
result = strtok(result, "/");
debug("Cleaned note: %s", result);
// clean up // clean up
pclose(fzfPipe); pclose(fzfPipe);
@@ -345,6 +310,69 @@ char *ncursesSelect(char **options, char *optionsText, int optionsNumber, int ex
highlight = 0; highlight = 0;
} }
break; break;
case '1':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 1.");
highlight = 0;
goto end_loop;
}
break;
case '2':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 2.");
highlight = 1;
goto end_loop;
}
break;
case '3':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 3.");
highlight = 2;
goto end_loop;
}
break;
case '4':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 4.");
highlight = 3;
goto end_loop;
}
break;
case '5':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 5.");
highlight = 4;
goto end_loop;
}
break;
case '6':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 6.");
highlight = 5;
goto end_loop;
}
break;
case '7':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 7.");
highlight = 6;
goto end_loop;
}
break;
case '8':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 8.");
highlight = 7;
goto end_loop;
}
break;
case '9':
if (optionsNumber + extraOptionsNumber >= 1) {
debug("Quickselected option 9.");
highlight = 8;
goto end_loop;
}
break;
case 10: //\n case 10: //\n
goto end_loop; goto end_loop;
} }