commit b349809aa5aec46bfe08a7df7ee99d4a9f61e778
parent be8adb6d3bb9594580cd581b5c5435ae7734bf39
Author: Ryan Jeffrey <pwishie@gmail.com>
Date: Fri, 24 May 2019 21:08:55 -0700
moved to lambdas
Diffstat:
M | README.org | | | 12 | +++++++++++- |
M | joestar.el | | | 239 | ++++++++++++++++++++++++++++++++++--------------------------------------------- |
2 files changed, 113 insertions(+), 138 deletions(-)
diff --git a/README.org b/README.org
@@ -1,4 +1,14 @@
* Joestar
Joestar is a minor mode for emacs that seeks to emulate [[https://github.com/jhallen/joe-editor][Joe's Own Editor]], a wordstar-like terminal text editor.
* Tutorial
-See
+** A note on Control key sequences
+Because of the way that Joe works *C-k C-e* is the same as *C-k e*, whereas Emacs considers those to be different key sequences. In joestar mode, just like in joe, these are the same sequence.
+** Help
+Type *C-k h* for help.
+** Buffer manipulation.
+- *C-y*
+Kill the entire line.
+- *C-j*
+Kill the rest of the line from point.
+- *ESC-o*
+Kill the to the beginning of the line from point.
diff --git a/joestar.el b/joestar.el
@@ -1,20 +1,22 @@
-;;; package --- summary
+;;; package --- summary Wordstar/joe compatibility mode.
+
+;;; Copyright (C) Ryan Jeffrey 2019
+
+;;; Author: Ryan Jeffrey <pwishie@gmail.com>
+;;; Keywords: joe wordstar
+;;; Version 0.1
+;;; Package-Requires: ((emacs "24.2"))
;;; Commentary:
-;;; TODO: Confine buffers to certain windows; better relative line number support with goto-line
-;;; TODO: remake with lambdas
+;; Joestar is a minor mode for Emacs that seeks to emulate Joe's Own Editor, a wordstar-like terminal text editor.
;;; Code:
-;;; functions to change the behavior of keymaps
-
+;;; TODO: Confine buffers to certain windows; better relative line number support with goto-line
+;;; TODO: remake with lambdas
;;; set mark variables
-
-;; TODO make a better system
-
-;; TODO make a better system
(defvar joe-mark-0 nil "Mark 0.")
(defvar joe-mark-1 nil "Mark 1.")
(defvar joe-mark-2 nil "Mark 2.")
@@ -57,114 +59,6 @@
(setq joe-mark-1 (point-marker))
(message "Mark 1 set."))
-
-;; fix bug where ivy does not display the full file-name
-(defun joe/save-file (file-path)
- "Prompt the minibuffer to save the current buffer as FILE-PATH."
- (interactive "FName of file to save: ")
- (save-buffer file-path)
- (message "%s saved." file-path))
-
-(defun joe/delete-window ()
- "Delete current window, exit Emacs if only one window."
- (interactive)
- (if (= 1 (length (window-list)))
- (if (buffer-modified-p)
- (if (y-or-n-p "Lose changes to this file? ")
- (kill-emacs)
- nil)
- (kill-emacs))
- (delete-window)))
-
-(defun joe/insert-file (file-path)
- "Prompt the minibuffer to save the current buffer as FILE-PATH."
- (interactive "FName of file to insert: ")
- (insert-file-contents file-path))
-
-(defun joe/scroll-down ()
- "Scroll down while preserving the cursor point."
- (interactive)
- (scroll-down 1))
-
-(defun joe/scroll-up ()
- "Scroll down while preserving the cursor point."
- (interactive)
- (scroll-up 1))
-
-(defun joe/goto-abosolute-line (num)
- "Goto absolute line number NUM."
- (interactive "sGo to line: ")
- (forward-line (* -1 (count-lines 1 (point))))
- (forward-line (1- (string-to-number num))))
-
-(defun joe/enlarge-window ()
- "Enlarge the current window.")
-
-(defun joe/shrink-window ()
- "Shrink the current window.")
-
-(defun joe/next-window ()
- "Move to the next window."
- (interactive)
- (other-window 1))
-
-(defun joe/previous-window ()
- "Move to the previous window."
- (interactive)
- (other-window -1))
-
-(defun joe/backward-delete-char ()
- "Redefine the what the backspace key does to mimic vim."
- (interactive)
- (cond ((bolp)
- (delete-char -1)
- (indent-according-to-mode)
- (when (looking-at "\\([ \t]+\\)[^ \t]")
- (delete-region (point) (match-end 1))))
- ((<= (point) (save-excursion (back-to-indentation) (point)))
- (let ((backward-delete-char-untabify-method 'hungry))
- (call-interactively 'backward-delete-char-untabify)
- (delete-char -1))
- (indent-according-to-mode))
- (t
- (let ((backward-delete-char-untabify-method 'hungry))
- (call-interactively 'backward-delete-char-untabify)))))
-
-(defun joe/control-select-right ()
- "Control selection to right char."
- (interactive)
- (setq this-command-keys-shift-translated t)
- (call-interactively 'forward-char))
-
-
-(defun joe/control-select-left ()
- "Control selection to left char."
- (interactive)
- (setq this-command-keys-shift-translated t)
- (call-interactively 'backward-char))
-
-(defun joe/control-select-up ()
- "Control selection up one line."
- (interactive)
- (setq this-command-keys-shift-translated t)
- (call-interactively 'previous-line))
-
-(defun joe/control-select-down ()
- "Control selection down one line."
- (interactive)
- (setq this-command-keys-shift-translated t)
- (call-interactively 'next-line))
-
-(defun joe/kill-prev-word ()
- "Kill the word to the left of the cursor."
- (interactive)
- (call-interactively 'backward-word)
- (call-interactively 'kill-word))
-
-(defun joe/move-region ()
- "Move the current region to point."
- (interactive))
-
;;; setting joestar's wordstar-like keybindings
(defvar joestar-mode-map
(let ((joe-map (make-sparse-keymap)))
@@ -195,36 +89,98 @@
(define-key joe-map (kbd "C-k C-e") 'find-file)
(define-key joe-map (kbd "C-k e") (kbd "C-k e"))
(define-key joe-map (kbd "C-y") 'kill-whole-line)
- (define-key joe-map (kbd "C-j") 'kill-line)
(define-key joe-map (kbd "ESC C-o") 'kill-line)
(define-key joe-map (kbd "ESC o") (kbd "ESC C-o"))
(define-key joe-map (kbd "C-w") 'kill-word)
- (define-key joe-map (kbd "C-o") 'joe/kill-prev-word) ;; TODO, Test
- (define-key joe-map (kbd "C-^") 'redo)
+ (define-key joe-map (kbd "C-o") '(lambda ()
+ "Kill the word before point."
+ "Kill the word to the left of the cursor."
+ (interactive)
+ (call-interactively 'backward-word)
+ (call-interactively 'kill-word))) ;; TODO, Test
+
+
+ (define-key joe-map (kbd "C-^") '(lambda ()
+ "Undo-tree redo."
+ (call-interactively 'redo)))
+ (define-key joe-map (kbd "C-_") '(lambda ()
+ "Undo-tree undo."
+ (call-interactively 'undo)))
+
(define-key joe-map (kbd "C-k C-x") 'save-buffers-kill-emacs)
(define-key joe-map (kbd "C-k C-x") (kbd "C-k C-x"))
(define-key joe-map (kbd "C-f") 'search-forward)
(define-key joe-map (kbd "C-j") 'kill-line)
- (define-key joe-map (kbd "C-k C-r") 'joe/insert-file)
+ (define-key joe-map (kbd "ESC o") '(lambda ()
+ "Kill to the beginning of the line before point."
+ (kill-line 0)))
+
+ (define-key joe-map (kbd "C-k C-r") '(lambda ()
+ "Prompt the minibuffer to save the current buffer as FILE-PATH."
+ (interactive "FName of file to insert: ")
+ (insert-file-contents file-path)))
(define-key joe-map (kbd "C-k r") (kbd "C-k C-r"))
- (define-key joe-map (kbd "<backspace>") 'joe/backward-delete-char)
- (define-key joe-map (kbd "<C-right>") 'joe/control-select-right)
- (define-key joe-map (kbd "<C-left>") 'joe/control-select-left)
- (define-key joe-map (kbd "<C-up>") 'joe/control-select-up)
- (define-key joe-map (kbd "<C-down>") 'joe/control-select-down)
+ (define-key joe-map (kbd "<backspace>") '(lambda ()
+ "Redefine the what the backspace key does to mimic vim."
+ (interactive)
+ (cond ((bolp)
+ (delete-char -1)
+ (indent-according-to-mode)
+ (when (looking-at "\\([ \t]+\\)[^ \t]")
+ (delete-region (point) (match-end 1))))
+ ((<= (point) (save-excursion (back-to-indentation) (point)))
+ (let ((backward-delete-char-untabify-method 'hungry))
+ (call-interactively 'backward-delete-char-untabify)
+ (delete-char -1))
+ (indent-according-to-mode))
+ (t
+ (let ((backward-delete-char-untabify-method 'hungry))
+ (call-interactively 'backward-delete-char-untabify))))))
+ (define-key joe-map (kbd "<C-right>") '(lambda ()
+ "Control selection to right char."
+ (interactive)
+ (setq this-command-keys-shift-translated t)
+ (call-interactively 'forward-char)))
+ (define-key joe-map (kbd "<C-left>") '(lambda ()
+ "Control selection to left char."
+ (interactive)
+ (setq this-command-keys-shift-translated t)
+ (call-interactively 'backward-char)))
+ (define-key joe-map (kbd "<C-up>") '(lambda ()
+ "Control selection up one line."
+ (interactive)
+ (setq this-command-keys-shift-translated t)
+ (call-interactively 'previous-line)))
+ (define-key joe-map (kbd "<C-down>") '(lambda ()
+ "Control selection down one line."
+ (interactive)
+ (setq this-command-keys-shift-translated t)
+ (call-interactively 'next-line)))
(define-key joe-map (kbd "C-k C-y") 'delete-region)
(define-key joe-map (kbd "C-k y") (kbd "C-k C-y"))
- (define-key joe-map (kbd "C-k C-m") 'joe/move-region)
+ (define-key joe-map (kbd "C-k C-m") '(lambda ()
+ "Move the current block to point."
+ (interactive)))
(define-key joe-map (kbd "C-k m") (kbd "C-k C-m"))
;; editor manipulation
- (define-key joe-map (kbd "C-c") 'joe/delete-window)
+ (define-key joe-map (kbd "C-c") '(lambda ()
+ "Delete current window, exit Emacs if only one window."
+ (interactive)
+ (if (= 1 (length (window-list)))
+ (if (buffer-modified-p)
+ (if (y-or-n-p "Lose changes to this file? ")
+ (kill-emacs)
+ nil)
+ (kill-emacs))
+ (delete-window))))
+
(define-key joe-map (kbd "C-k o") 'split-window-vertically)
(define-key joe-map (kbd "C-k C-c") 'copy-region-as-kill) ;; TODO test
@@ -233,13 +189,24 @@
(define-key joe-map (kbd "C-k C-o") 'split-window-vertically)
(define-key joe-map (kbd "C-k o") (kbd "C-k C-o"))
- (define-key joe-map (kbd "C-k C-n") 'joe/next-window)
+ (define-key joe-map (kbd "C-k C-n") '(lambda ()
+ "Move to the next window."
+ (interactive)
+ (other-window 1)))
(define-key joe-map (kbd "C-k n") (kbd "C-k C-n"))
- (define-key joe-map (kbd "C-k C-p") 'joe/previous-window)
+ (define-key joe-map (kbd "C-k C-p") '(lambda ()
+ "Move to the previous window."
+ (interactive)
+ (other-window -1)))
(define-key joe-map (kbd "C-k p") (kbd "C-k C-p"))
- (define-key joe-map (kbd "C-k C-d") 'joe/save-file)
+ (define-key joe-map (kbd "C-k C-d") '(lambda (file-path)
+ "Prompt the minibuffer to save the current buffer as FILE-PATH."
+ (interactive "FName of file to save: ")
+ (save-buffer file-path)
+ (message "%s saved." file-path)))
+
(define-key joe-map (kbd "C-k d") (kbd "C-c C-d"))
(define-key joe-map (kbd "C-k C-g") 'enlarge-window)
@@ -266,10 +233,7 @@
:lighter " joe"
nil
- ;;; setting default Emacs behaviour
-
- ;; smooth scroll.
- ;; https://www.emacswiki.org/emacs/SmoothScrolling
+ ;; setting default Emacs behaviour
(setq scroll-margin 1
scroll-conservatively 0
scroll-up-aggressively 0.01
@@ -278,8 +242,9 @@
scroll-down-aggressively 0.01)
;; keep cursor position while scrolling
- (setq scroll-preserve-screen-position 'always) ;; TODO fix behavior so that it always scrolls perfectly
- (setq scroll-error-top-bottom t))
+ (setq scroll-preserve-screen-position 'always) ; TODO fix behavior so that it always scrolls perfectly
+ (setq scroll-error-top-bottom t)
+ )
(define-globalized-minor-mode global-joestar-mode joestar-mode
(lambda () (joestar-mode 1)))