commit - 02a74b53e44f8ba0e628fa5857c930f436c8e581
commit + c4c8200352fa44cde50cbd6d44b395be3da28959
blob - b5cff45710f8bacfe9d23f92805d6e7fe19748f0
blob + 242f12b3b1b4cf4c6980d1e2668fb1218cfc7654
--- cmd.c
+++ cmd.c
#include "telescope.h"
-void
-cmd_previous_line(struct buffer *buffer)
+/* return 1 if moved, 0 otherwise */
+static inline int
+forward_line(struct buffer *buffer, int n)
{
- struct vline *vl;
+ struct vline *vl;
+ int did;
- if (buffer->current_line == NULL
- || (vl = TAILQ_PREV(buffer->current_line, vhead, vlines)) == NULL)
- return;
+ if (buffer->current_line == NULL)
+ return 0;
- if (--buffer->curs_y < 0) {
- buffer->curs_y = 0;
- cmd_scroll_line_up(buffer);
- return;
+ did = 0;
+ while (n != 0) {
+ if (n > 0) {
+ vl = TAILQ_NEXT(buffer->current_line, vlines);
+ if (vl == NULL)
+ return did;
+ buffer->current_line = vl;
+ n--;
+ } else {
+ vl = TAILQ_PREV(buffer->current_line, vhead, vlines);
+ if (vl == NULL)
+ return did;
+ if (buffer->current_line == buffer->top_line)
+ buffer->top_line = vl;
+ buffer->current_line = vl;
+ n++;
+ }
+
+ did = 1;
}
- buffer->current_line = vl;
- restore_cursor(buffer);
+ return did;
}
void
-cmd_next_line(struct buffer *buffer)
+cmd_previous_line(struct buffer *buffer)
{
- struct vline *vl;
+ forward_line(buffer, -1);
+}
- if (buffer->current_line == NULL
- || (vl = TAILQ_NEXT(buffer->current_line, vlines)) == NULL)
- return;
-
- if (++buffer->curs_y > body_lines-1) {
- buffer->curs_y = body_lines-1;
- cmd_scroll_line_down(buffer);
- return;
- }
-
- buffer->current_line = vl;
- restore_cursor(buffer);
+void
+cmd_next_line(struct buffer *buffer)
+{
+ forward_line(buffer, +1);
}
void
{
if (buffer->cpoff != 0)
buffer->cpoff--;
- restore_cursor(buffer);
}
void
len = utf8_cplen(buffer->current_line->line);
if (++buffer->cpoff > len)
buffer->cpoff = len;
- restore_cursor(buffer);
}
void
cmd_backward_paragraph(struct buffer *buffer)
{
do {
- if (buffer->current_line == NULL ||
- buffer->current_line == TAILQ_FIRST(&buffer->head)) {
+ if (!forward_line(buffer, -1)) {
message("No previous paragraph");
return;
}
- cmd_previous_line(buffer);
} while (buffer->current_line->line != NULL ||
buffer->current_line->parent->type != LINE_TEXT);
}
cmd_forward_paragraph(struct buffer *buffer)
{
do {
- if (buffer->current_line == NULL ||
- buffer->current_line == TAILQ_LAST(&buffer->head, vhead)) {
+ if (!forward_line(buffer, +1)) {
message("No next paragraph");
return;
}
- cmd_next_line(buffer);
} while (buffer->current_line->line != NULL ||
buffer->current_line->parent->type != LINE_TEXT);
}
cmd_move_beginning_of_line(struct buffer *buffer)
{
buffer->cpoff = 0;
- restore_cursor(buffer);
}
void
if (vl->line == NULL)
return;
buffer->cpoff = utf8_cplen(vl->line);
- restore_cursor(buffer);
}
void
void
cmd_scroll_line_up(struct buffer *buffer)
{
- if (buffer->current_line == NULL)
+ if (!forward_line(buffer, -1))
return;
- if (buffer->line_off == 0)
- return;
-
buffer->line_off--;
buffer->top_line = TAILQ_PREV(buffer->top_line, vhead, vlines);
- buffer->current_line = TAILQ_PREV(buffer->current_line, vhead, vlines);
- restore_cursor(buffer);
}
void
cmd_scroll_line_down(struct buffer *buffer)
{
- struct vline *vl;
-
- if (buffer->current_line == NULL)
+ if (!forward_line(buffer, +1))
return;
- if ((vl = TAILQ_NEXT(buffer->current_line, vlines)) == NULL)
- return;
-
- buffer->current_line = vl;
-
buffer->top_line = TAILQ_NEXT(buffer->top_line, vlines);
buffer->line_off++;
-
- restore_cursor(buffer);
}
void
cmd_scroll_up(struct buffer *buffer)
{
- size_t off;
-
- off = body_lines-1;
-
- for (; off > 0; --off)
- cmd_scroll_line_up(buffer);
+ forward_line(buffer, -1*(body_lines-1));
}
void
cmd_scroll_down(struct buffer *buffer)
{
- size_t off;
-
- off = body_lines-1;
-
- for (; off > 0; --off)
- cmd_scroll_line_down(buffer);
+ forward_line(buffer, body_lines-1);
}
void
cmd_beginning_of_buffer(struct buffer *buffer)
{
buffer->current_line = TAILQ_FIRST(&buffer->head);
+ buffer->cpoff = 0;
buffer->top_line = buffer->current_line;
buffer->line_off = 0;
- buffer->curs_y = 0;
- buffer->cpoff = 0;
- restore_cursor(buffer);
}
void
cmd_end_of_buffer(struct buffer *buffer)
{
- ssize_t off;
-
- off = buffer->line_max - body_lines;
- off = MAX(0, off);
-
- while (buffer->line_off > (size_t)off) {
- buffer->line_off--;
- buffer->top_line = TAILQ_PREV(buffer->top_line, vhead, vlines);
- }
- while (buffer->line_off < (size_t)off) {
- buffer->line_off++;
- buffer->top_line = TAILQ_NEXT(buffer->top_line, vlines);
- }
-
- buffer->line_off = off;
- buffer->curs_y = MIN((size_t)body_lines-1, buffer->line_max-1);
-
buffer->current_line = TAILQ_LAST(&buffer->head, vhead);
buffer->cpoff = body_cols;
- restore_cursor(buffer);
}
void
save_excursion(&place, buffer);
do {
- if (buffer->current_line == NULL ||
- buffer->current_line == TAILQ_FIRST(&buffer->head)) {
+ if (!forward_line(buffer, -1)) {
restore_excursion(&place, buffer);
message("No previous link");
return;
}
- cmd_previous_line(buffer);
} while (buffer->current_line->parent->type != LINE_LINK);
}
save_excursion(&place, buffer);
do {
- if (buffer->current_line == NULL ||
- buffer->current_line == TAILQ_LAST(&buffer->head, vhead)) {
+ if (!forward_line(buffer, +1)){
restore_excursion(&place, buffer);
message("No next link");
return;
}
- cmd_next_line(buffer);
} while (buffer->current_line->parent->type != LINE_LINK);
}
save_excursion(&place, buffer);
do {
- if (buffer->current_line == NULL ||
- buffer->current_line == TAILQ_FIRST(&buffer->head)) {
+ if (!forward_line(buffer, -1)) {
restore_excursion(&place, buffer);
message("No previous heading");
return;
}
- cmd_previous_line(buffer);
} while (!is_heading(buffer->current_line->parent));
}
save_excursion(&place, buffer);
do {
- if (buffer->current_line == NULL ||
- buffer->current_line == TAILQ_LAST(&buffer->head, vhead)) {
+ if (!forward_line(buffer, +1)) {
restore_excursion(&place, buffer);
message("No next heading");
return;
}
- cmd_next_line(buffer);
} while (!is_heading(buffer->current_line->parent));
}