do_first_line(), do_last_line()
- Simplify by only using edit_redraw(), and also make them call
check_statusblank(). (DLR)
- do_para_begin(), do_para_begin_void(), do_para_end(),
- do_para_end_void()
- - Move here from nano.c, as they're movement functions, and also
- make them call check_statusblank().
do_page_up(), do_page_down()
- If there's less than a page of text onscreen, just call
do_(first|last)_line(). (DLR)
+ do_para_begin(), do_para_begin_void(), do_para_end(),
+ do_para_end_void(), do_next_word(), do_next_word_void(),
+ do_prev_word(), do_prev_word_void()
+ - Move here from nano.c, as they're movement functions, and also
+ make them call check_statusblank().
- nano.c:
usage()
- Properly mention the support for "[+LINE,COLUMN]" on the
}
#endif /* !DISABLE_JUSTIFY */
+#ifndef NANO_SMALL
+/* Move to the next word in the current filestruct. If allow_punct is
+ * TRUE, treat punctuation as part of a word. If allow_update is TRUE,
+ * update the screen afterward. Return TRUE if we started on a word,
+ * and FALSE otherwise. */
+bool do_next_word(bool allow_punct, bool allow_update)
+{
+ size_t pww_save = openfile->placewewant;
+ const filestruct *current_save = openfile->current;
+ char *char_mb;
+ int char_mb_len;
+ bool end_line = FALSE, started_on_word = FALSE;
+
+ assert(openfile->current != NULL && openfile->current->data != NULL);
+
+ check_statusblank();
+
+ char_mb = charalloc(mb_cur_max());
+
+ /* Move forward until we find the character after the last letter of
+ * the current word. */
+ while (!end_line) {
+ char_mb_len = parse_mbchar(openfile->current->data +
+ openfile->current_x, char_mb, NULL, NULL);
+
+ /* If we've found it, stop moving forward through the current
+ * line. */
+ if (!is_word_mbchar(char_mb, allow_punct))
+ break;
+
+ /* If we haven't found it, then we've started on a word, so set
+ * started_on_word to TRUE. */
+ started_on_word = TRUE;
+
+ if (openfile->current->data[openfile->current_x] == '\0')
+ end_line = TRUE;
+ else
+ openfile->current_x += char_mb_len;
+ }
+
+ /* Move forward until we find the first letter of the next word. */
+ if (openfile->current->data[openfile->current_x] == '\0')
+ end_line = TRUE;
+ else
+ openfile->current_x += char_mb_len;
+
+ for (; openfile->current != NULL;
+ openfile->current = openfile->current->next) {
+ while (!end_line) {
+ char_mb_len = parse_mbchar(openfile->current->data +
+ openfile->current_x, char_mb, NULL, NULL);
+
+ /* If we've found it, stop moving forward through the
+ * current line. */
+ if (is_word_mbchar(char_mb, allow_punct))
+ break;
+
+ if (openfile->current->data[openfile->current_x] == '\0')
+ end_line = TRUE;
+ else
+ openfile->current_x += char_mb_len;
+ }
+
+ /* If we've found it, stop moving forward to the beginnings of
+ * subsequent lines. */
+ if (!end_line)
+ break;
+
+ if (openfile->current->next != NULL) {
+ end_line = FALSE;
+ openfile->current_x = 0;
+ }
+ }
+
+ free(char_mb);
+
+ /* If we haven't found it, leave the cursor at the end of the
+ * file. */
+ if (openfile->current == NULL)
+ openfile->current = openfile->filebot;
+
+ openfile->placewewant = xplustabs();
+
+ /* If allow_update is TRUE, update the screen. */
+ if (allow_update)
+ edit_redraw(current_save, pww_save);
+
+ /* Return whether we started on a word. */
+ return started_on_word;
+}
+
+void do_next_word_void(void)
+{
+ do_next_word(FALSE, TRUE);
+}
+
+/* Move to the previous word in the current filestruct. If allow_punct
+ * is TRUE, treat punctuation as part of a word. If allow_update is
+ * TRUE, update the screen afterward. Return TRUE if we started on a
+ * word, and FALSE otherwise. */
+bool do_prev_word(bool allow_punct, bool allow_update)
+{
+ size_t pww_save = openfile->placewewant;
+ const filestruct *current_save = openfile->current;
+ char *char_mb;
+ int char_mb_len;
+ bool begin_line = FALSE, started_on_word = FALSE;
+
+ assert(openfile->current != NULL && openfile->current->data != NULL);
+
+ check_statusblank();
+
+ char_mb = charalloc(mb_cur_max());
+
+ /* Move backward until we find the character before the first letter
+ * of the current word. */
+ while (!begin_line) {
+ char_mb_len = parse_mbchar(openfile->current->data +
+ openfile->current_x, char_mb, NULL, NULL);
+
+ /* If we've found it, stop moving backward through the current
+ * line. */
+ if (!is_word_mbchar(char_mb, allow_punct))
+ break;
+
+ /* If we haven't found it, then we've started on a word, so set
+ * started_on_word to TRUE. */
+ started_on_word = TRUE;
+
+ if (openfile->current_x == 0)
+ begin_line = TRUE;
+ else
+ openfile->current_x = move_mbleft(openfile->current->data,
+ openfile->current_x);
+ }
+
+ /* Move backward until we find the last letter of the previous
+ * word. */
+ if (openfile->current_x == 0)
+ begin_line = TRUE;
+ else
+ openfile->current_x = move_mbleft(openfile->current->data,
+ openfile->current_x);
+
+ for (; openfile->current != NULL;
+ openfile->current = openfile->current->prev) {
+ while (!begin_line) {
+ char_mb_len = parse_mbchar(openfile->current->data +
+ openfile->current_x, char_mb, NULL, NULL);
+
+ /* If we've found it, stop moving backward through the
+ * current line. */
+ if (is_word_mbchar(char_mb, allow_punct))
+ break;
+
+ if (openfile->current_x == 0)
+ begin_line = TRUE;
+ else
+ openfile->current_x =
+ move_mbleft(openfile->current->data,
+ openfile->current_x);
+ }
+
+ /* If we've found it, stop moving backward to the ends of
+ * previous lines. */
+ if (!begin_line)
+ break;
+
+ if (openfile->current->prev != NULL) {
+ begin_line = FALSE;
+ openfile->current_x = strlen(openfile->current->prev->data);
+ }
+ }
+
+ /* If we haven't found it, leave the cursor at the beginning of the
+ * file. */
+ if (openfile->current == NULL)
+ openfile->current = openfile->fileage;
+ /* If we've found it, move backward until we find the character
+ * before the first letter of the previous word. */
+ else if (!begin_line) {
+ if (openfile->current_x == 0)
+ begin_line = TRUE;
+ else
+ openfile->current_x = move_mbleft(openfile->current->data,
+ openfile->current_x);
+
+ while (!begin_line) {
+ char_mb_len =
+ parse_mbchar(openfile->current->data +
+ openfile->current_x, char_mb, NULL, NULL);
+
+ /* If we've found it, stop moving backward through the
+ * current line. */
+ if (!is_word_mbchar(char_mb, allow_punct))
+ break;
+
+ if (openfile->current_x == 0)
+ begin_line = TRUE;
+ else
+ openfile->current_x =
+ move_mbleft(openfile->current->data,
+ openfile->current_x);
+ }
+
+ /* If we've found it, move forward to the first letter of the
+ * previous word. */
+ if (!begin_line)
+ openfile->current_x += char_mb_len;
+ }
+
+ free(char_mb);
+
+ openfile->placewewant = xplustabs();
+
+ /* If allow_update is TRUE, update the screen. */
+ if (allow_update)
+ edit_redraw(current_save, pww_save);
+
+ /* Return whether we started on a word. */
+ return started_on_word;
+}
+
+void do_prev_word_void(void)
+{
+ do_prev_word(FALSE, TRUE);
+}
+#endif /* !NANO_SMALL */
+
void do_home(void)
{
size_t pww_save = openfile->placewewant;
}
#ifndef NANO_SMALL
-/* Move to the next word in the current filestruct. If allow_punct is
- * TRUE, treat punctuation as part of a word. If allow_update is TRUE,
- * update the screen afterward. Return TRUE if we started on a word,
- * and FALSE otherwise. */
-bool do_next_word(bool allow_punct, bool allow_update)
-{
- size_t pww_save = openfile->placewewant;
- const filestruct *current_save = openfile->current;
- char *char_mb;
- int char_mb_len;
- bool end_line = FALSE, started_on_word = FALSE;
-
- assert(openfile->current != NULL && openfile->current->data != NULL);
-
- char_mb = charalloc(mb_cur_max());
-
- /* Move forward until we find the character after the last letter of
- * the current word. */
- while (!end_line) {
- char_mb_len = parse_mbchar(openfile->current->data +
- openfile->current_x, char_mb, NULL, NULL);
-
- /* If we've found it, stop moving forward through the current
- * line. */
- if (!is_word_mbchar(char_mb, allow_punct))
- break;
-
- /* If we haven't found it, then we've started on a word, so set
- * started_on_word to TRUE. */
- started_on_word = TRUE;
-
- if (openfile->current->data[openfile->current_x] == '\0')
- end_line = TRUE;
- else
- openfile->current_x += char_mb_len;
- }
-
- /* Move forward until we find the first letter of the next word. */
- if (openfile->current->data[openfile->current_x] == '\0')
- end_line = TRUE;
- else
- openfile->current_x += char_mb_len;
-
- for (; openfile->current != NULL;
- openfile->current = openfile->current->next) {
- while (!end_line) {
- char_mb_len = parse_mbchar(openfile->current->data +
- openfile->current_x, char_mb, NULL, NULL);
-
- /* If we've found it, stop moving forward through the
- * current line. */
- if (is_word_mbchar(char_mb, allow_punct))
- break;
-
- if (openfile->current->data[openfile->current_x] == '\0')
- end_line = TRUE;
- else
- openfile->current_x += char_mb_len;
- }
-
- /* If we've found it, stop moving forward to the beginnings of
- * subsequent lines. */
- if (!end_line)
- break;
-
- if (openfile->current->next != NULL) {
- end_line = FALSE;
- openfile->current_x = 0;
- }
- }
-
- free(char_mb);
-
- /* If we haven't found it, leave the cursor at the end of the
- * file. */
- if (openfile->current == NULL)
- openfile->current = openfile->filebot;
-
- openfile->placewewant = xplustabs();
-
- /* If allow_update is TRUE, update the screen. */
- if (allow_update)
- edit_redraw(current_save, pww_save);
-
- /* Return whether we started on a word. */
- return started_on_word;
-}
-
-/* Move to the next word in the current filestruct, not counting
- * punctuation as part of a word, and updating the screen afterward. */
-void do_next_word_void(void)
-{
- do_next_word(FALSE, TRUE);
-}
-
-/* Move to the previous word in the current filestruct. If allow_punct
- * is TRUE, treat punctuation as part of a word. If allow_update is
- * TRUE, update the screen afterward. Return TRUE if we started on a
- * word, and FALSE otherwise. */
-bool do_prev_word(bool allow_punct, bool allow_update)
-{
- size_t pww_save = openfile->placewewant;
- const filestruct *current_save = openfile->current;
- char *char_mb;
- int char_mb_len;
- bool begin_line = FALSE, started_on_word = FALSE;
-
- assert(openfile->current != NULL && openfile->current->data != NULL);
-
- char_mb = charalloc(mb_cur_max());
-
- /* Move backward until we find the character before the first letter
- * of the current word. */
- while (!begin_line) {
- char_mb_len = parse_mbchar(openfile->current->data +
- openfile->current_x, char_mb, NULL, NULL);
-
- /* If we've found it, stop moving backward through the current
- * line. */
- if (!is_word_mbchar(char_mb, allow_punct))
- break;
-
- /* If we haven't found it, then we've started on a word, so set
- * started_on_word to TRUE. */
- started_on_word = TRUE;
-
- if (openfile->current_x == 0)
- begin_line = TRUE;
- else
- openfile->current_x = move_mbleft(openfile->current->data,
- openfile->current_x);
- }
-
- /* Move backward until we find the last letter of the previous
- * word. */
- if (openfile->current_x == 0)
- begin_line = TRUE;
- else
- openfile->current_x = move_mbleft(openfile->current->data,
- openfile->current_x);
-
- for (; openfile->current != NULL;
- openfile->current = openfile->current->prev) {
- while (!begin_line) {
- char_mb_len = parse_mbchar(openfile->current->data +
- openfile->current_x, char_mb, NULL, NULL);
-
- /* If we've found it, stop moving backward through the
- * current line. */
- if (is_word_mbchar(char_mb, allow_punct))
- break;
-
- if (openfile->current_x == 0)
- begin_line = TRUE;
- else
- openfile->current_x =
- move_mbleft(openfile->current->data,
- openfile->current_x);
- }
-
- /* If we've found it, stop moving backward to the ends of
- * previous lines. */
- if (!begin_line)
- break;
-
- if (openfile->current->prev != NULL) {
- begin_line = FALSE;
- openfile->current_x = strlen(openfile->current->prev->data);
- }
- }
-
- /* If we haven't found it, leave the cursor at the beginning of the
- * file. */
- if (openfile->current == NULL)
- openfile->current = openfile->fileage;
- /* If we've found it, move backward until we find the character
- * before the first letter of the previous word. */
- else if (!begin_line) {
- if (openfile->current_x == 0)
- begin_line = TRUE;
- else
- openfile->current_x = move_mbleft(openfile->current->data,
- openfile->current_x);
-
- while (!begin_line) {
- char_mb_len =
- parse_mbchar(openfile->current->data +
- openfile->current_x, char_mb, NULL, NULL);
-
- /* If we've found it, stop moving backward through the
- * current line. */
- if (!is_word_mbchar(char_mb, allow_punct))
- break;
-
- if (openfile->current_x == 0)
- begin_line = TRUE;
- else
- openfile->current_x =
- move_mbleft(openfile->current->data,
- openfile->current_x);
- }
-
- /* If we've found it, move forward to the first letter of the
- * previous word. */
- if (!begin_line)
- openfile->current_x += char_mb_len;
- }
-
- free(char_mb);
-
- openfile->placewewant = xplustabs();
-
- /* If allow_update is TRUE, update the screen. */
- if (allow_update)
- edit_redraw(current_save, pww_save);
-
- /* Return whether we started on a word. */
- return started_on_word;
-}
-
-/* Move to the previous word in the current filestruct, not counting
- * punctuation as part of a word, and updating the screen afterward. */
-void do_prev_word_void(void)
-{
- do_prev_word(FALSE, TRUE);
-}
-
void do_word_count(void)
{
size_t words = 0, current_x_save = openfile->current_x;
void do_para_end(bool allow_update);
void do_para_end_void(void);
#endif
+#ifndef NANO_SMALL
+bool do_next_word(bool allow_punct, bool allow_update);
+void do_next_word_void(void);
+bool do_prev_word(bool allow_punct, bool allow_update);
+void do_prev_word_void(void);
+#endif
void do_home(void);
void do_end(void);
void do_up(void);
void do_tab(void);
void do_enter(void);
#ifndef NANO_SMALL
-bool do_next_word(bool allow_punct, bool allow_update);
-void do_next_word_void(void);
-bool do_prev_word(bool allow_punct, bool allow_update);
-void do_prev_word_void(void);
void do_word_count(void);
void do_mark(void);
#endif