From a709f502f88821bdef956cebfb304010f46503c0 Mon Sep 17 00:00:00 2001 From: Tom Willemse Date: Tue, 7 Apr 2020 02:09:43 -0700 Subject: [PATCH] Add navigation functions for end-of-line and beginning-of-line --- .gitlab-ci.yml | 13 ++++++++ oni-core.el | 29 +++++++++++++++- test/integration/oni-core.bats | 28 ++++++++++++++++ test/oni-core-test.el | 61 ++++++++++++++++++++++++++++++++++ 4 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 test/integration/oni-core.bats create mode 100644 test/oni-core-test.el diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 483a12f..6812273 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -168,6 +168,12 @@ unit-test-oni-conf: - package script: make unit-test-oni-conf TEST_ARCHIVE=$(realpath bin/) +unit-test-oni-core: + stage: unit-test + dependencies: + - package + script: make unit-test-oni-core TEST_ARCHIVE=$(realpath bin/) + unit-test-oni-elisp: stage: unit-test dependencies: @@ -254,6 +260,13 @@ integration-test-oni-browse-url: - package script: make integration-test-oni-browse-url TEST_ARCHIVE=$(realpath bin/) +integration-test-oni-core: + stage: integration-test + image: registry.gitlab.com/ryuslash/emacs-config + dependencies: + - package + script: make integration-test-oni-core TEST_ARCHIVE=$(realpath bin/) + integration-test-oni-cpp: stage: integration-test image: registry.gitlab.com/ryuslash/emacs-config diff --git a/oni-core.el b/oni-core.el index 7ff16bc..dbea8c3 100644 --- a/oni-core.el +++ b/oni-core.el @@ -4,7 +4,7 @@ ;; Author: Tom Willemse ;; Keywords: local -;; Version: 2020.0225.095408 +;; Version: 2020.0407.015402 ;; Package-Requires: (oni-data-dir expand-region multiple-cursors embrace helpful) ;; This program is free software; you can redistribute it and/or modify @@ -53,6 +53,31 @@ "Create the autosave directory if doesn't exist." (mkdir oni-core--auto-save-directory t)) +(defun oni-core-move-beginning-of-dwim () + "Move to beginning of line either after indentation or before." + (interactive) + (let ((start (point))) + (back-to-indentation) + (unless (/= start (point)) + (move-beginning-of-line 1)))) + +(defun oni-core-move-end-of-dwim () + "Move to end of line, either before any comments or after." + (interactive) + (let ((start (point)) + (eolpos (line-end-position))) + (beginning-of-line) + (if (and comment-start + (not (looking-at (regexp-quote comment-start))) + (comment-search-forward eolpos t)) + (progn + (search-backward-regexp (concat "[^ \t" comment-start "]")) + (forward-char) + (when (or (bolp) + (= start (point))) + (end-of-line))) + (end-of-line)))) + (add-to-list 'auto-save-file-name-transforms `(".*" ,oni-core--auto-save-directory t) :append) @@ -108,6 +133,8 @@ (global-set-key (kbd "C-c (") 'embrace-commander) (global-set-key (kbd "C-x M-f") 'ffap) (global-set-key (kbd "C-x C-b") 'ibuffer-jump) +(global-set-key [remap move-beginning-of-line] #'oni-core-move-beginning-of-dwim) +(global-set-key [remap move-end-of-line] #'oni-core-move-end-of-dwim) (global-set-key [remap describe-function] 'helpful-callable) (global-set-key [remap describe-key] 'helpful-key) diff --git a/test/integration/oni-core.bats b/test/integration/oni-core.bats new file mode 100644 index 0000000..7e52d86 --- /dev/null +++ b/test/integration/oni-core.bats @@ -0,0 +1,28 @@ +#!/usr/bin/env bats + +@test "Opening emacs loads oni-core" { + run emacs -batch -l package -f package-initialize \ + -eval "(prin1 (featurep 'oni-core))" + + echo "$output" + + [[ "$output" == *"t" ]] +} + +@test "C-a is bound to oni-core-move-to-beginning-of-dwim" { + run emacs -batch -l package -f package-initialize \ + -eval "(prin1 (key-binding (kbd \"C-a\")))" + + echo "$output" + + [[ "$output" == *"oni-core-move-beginning-of-dwim" ]] +} + +@test "C-e is bound to oni-core-move-to-end-of-dwim" { + run emacs -batch -l package -f package-initialize \ + -eval "(prin1 (key-binding (kbd \"C-e\")))" + + echo "$output" + + [[ "$output" == *"oni-core-move-end-of-dwim" ]] +} diff --git a/test/oni-core-test.el b/test/oni-core-test.el new file mode 100644 index 0000000..0672fb3 --- /dev/null +++ b/test/oni-core-test.el @@ -0,0 +1,61 @@ +(require 'oni-core) + +(ert-deftest oni-core-move-beginning-of-dwim-moves-to-beginning-of-indentation () + "Test that ‘oni-core-move-beginning-of-dwim’ moves to the beginning of indentation." + (with-temp-buffer + (emacs-lisp-mode) + (insert "(defun test-defun ()\n \"Just testing a function\")") + (goto-char (point-max)) + (oni-core-move-beginning-of-dwim) + (should (equal 24 (point))))) + +(ert-deftest oni-core-move-beginning-of-dwim-moves-to-beginning-of-line () + "Test that ‘oni-core-move-beginning-of-dwim’ moves to the beginning of the line." + (with-temp-buffer + (emacs-lisp-mode) + (insert "(defun test-defun ()\n \"Just testing a function\")") + (goto-char (point-max)) + (oni-core-move-beginning-of-dwim) + (oni-core-move-beginning-of-dwim) + (should (equal 22 (point))))) + +(ert-deftest oni-core-move-beginning-of-dwim-moves-to-beginning-of-indentation-again () + "Test that ‘oni-core-move-beginning-of-dwim’ moves to the beginning of indentation again." + (with-temp-buffer + (emacs-lisp-mode) + (insert "(defun test-defun ()\n \"Just testing a function\")") + (goto-char (point-max)) + (oni-core-move-beginning-of-dwim) + (oni-core-move-beginning-of-dwim) + (oni-core-move-beginning-of-dwim) + (should (equal 24 (point))))) + +(ert-deftest oni-core-move-end-of-dwim-moves-to-end-of-code () + "Test that ‘oni-core-move-end-of-dwim’ moves to the end of the code before a comment." + (with-temp-buffer + (emacs-lisp-mode) + (insert "(defun test-defun () ;; Just testing\n \"Just testing a function\")") + (goto-char (point-min)) + (oni-core-move-end-of-dwim) + (should (equal 21 (point))))) + +(ert-deftest oni-core-move-end-of-dwim-moves-to-end-of-line () + "Test that ‘oni-core-move-end-of-dwim’ moves to the end of the line." + (with-temp-buffer + (emacs-lisp-mode) + (insert "(defun test-defun () ;; Just testing\n \"Just testing a function\")") + (goto-char (point-min)) + (oni-core-move-end-of-dwim) + (oni-core-move-end-of-dwim) + (should (equal 38 (point))))) + +(ert-deftest oni-core-move-end-of-dwim-moves-to-end-of-code-again () + "Test that ‘oni-core-move-end-of-dwim’ moves to the end of the code before a comment again." + (with-temp-buffer + (emacs-lisp-mode) + (insert "(defun test-defun () ;; Just testing\n \"Just testing a function\")") + (goto-char (point-min)) + (oni-core-move-end-of-dwim) + (oni-core-move-end-of-dwim) + (oni-core-move-end-of-dwim) + (should (equal 21 (point)))))