editorFindCallback prevents search results navigation

Aperta Adatta ai principianti
#127 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
76/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
c
Ambito
cli

Direzione di ricerca

Inizia dal punto di ingresso editorFindCallback nel codice sorgente di kilo e riproduci il problema effettuando una ricerca, quindi usando i tasti freccia per spostarti tra i risultati. Il lavoro è completo quando la navigazione sia al risultato precedente sia a quello successivo lascia l’editor sul risultato selezionato invece di tornare immediatamente a quello originale.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Heyy, while doing the kilo guide, i stumbled across a bug with my editor, for some reason when i press the arrow keys to navigate to the previous and next search result the editor jumped to the next result (as expected) but then imediately jumps back to the previous result where we were originally (preventing search navigation)

To fix this, simply edit the editorFindCallback with the changes...

void editorFindCallback(char *query, int key) {
  static int last_match = -1;
  static int direction = 1;


  // Empty queries reset searching from top
  if (strlen(query) == 0) {
	  last_match = -1;
	  return;
  }

  int current;

  if (key == '\r' || key == '\x1b') {
    last_match = -1;
    direction = 1;
    return;
  } else if (key == ARROW_RIGHT || key == ARROW_DOWN) {
	current = last_match+1; // Search from next row
    direction = 1;
  } else if (key == ARROW_LEFT || key == ARROW_UP) {
	current = last_match-1; // Search from previous row
    direction = -1;
  } else {
    direction = 1;
	current = last_match; // Keep search on current row with current result to terminate early
  }

  if (last_match == -1) direction = 1;
  int i;
  for (i = 0; i < E.numrows; i++) {
	// Clamp current
    if (current == -1) current = E.numrows - 1;
    else if (current == E.numrows) current = 0;

	// Immediately search without moving current positon
    erow *row = &E.row[current];
    char *match = strstr(row->render, query);
    if (match) {
      last_match = current;
      E.cy = current;
      E.cx = editorRowRxToCx(row, match - row->render);
      E.rowoff = E.numrows;
      break;
    }

    current += direction;
  }
}
Lingua principale
C
Stelle
9.2k
Fork
1k
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di antirez/kilo

Tutte le issue di antirez/kilo

Issue simili

Altre issue su C

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.