joestar

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | LICENSE

commit b349809aa5aec46bfe08a7df7ee99d4a9f61e778
parent be8adb6d3bb9594580cd581b5c5435ae7734bf39
Author: Ryan Jeffrey <pwishie@gmail.com>
Date:   Fri, 24 May 2019 21:08:55 -0700

moved to lambdas

Diffstat:
MREADME.org | 12+++++++++++-
Mjoestar.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)))