Compare commits
40 Commits
Author | SHA1 | Date | |
---|---|---|---|
c15ea92b09 | |||
06afa1efc4 | |||
e30883a708 | |||
0301a3a1ee | |||
6995a7f988 | |||
695d28b24c | |||
31b913666c | |||
d4c664fed9 | |||
c73f35ef9e | |||
e1b620cdde | |||
e42245aa65 | |||
1c13793033 | |||
ff58dadc4c | |||
24a23cbcee | |||
892b368b23 | |||
3883cbf298 | |||
e925e595d5 | |||
47471f561f | |||
fa7d5fe4fe | |||
9c5e0dde16 | |||
d50c5d122f | |||
fa6153bfc4 | |||
78ec3fe3de | |||
e6e20855a8 | |||
8de7717881 | |||
f2640264cd | |||
bab92365cd | |||
c90d005c54 | |||
046b1e897e | |||
0a433edb0d | |||
dc7bcbfa4e | |||
361b2c697a | |||
4f9866fa85 | |||
4757e63fcd | |||
efacea633b | |||
3282e669e9 | |||
21971bb469 | |||
f786360131 | |||
e05ce6bada | |||
4ee34787e6 |
77
.drone.yml
Normal file
77
.drone.yml
Normal file
|
@ -0,0 +1,77 @@
|
|||
kind: pipeline
|
||||
name: Lint package
|
||||
|
||||
volumes:
|
||||
- name: debian-package-cache
|
||||
host:
|
||||
path: /var/cache/debian-package-cache
|
||||
|
||||
trigger:
|
||||
event:
|
||||
exclude:
|
||||
- tag
|
||||
|
||||
steps:
|
||||
- name: Emacs 26.3
|
||||
image: flycheck/emacs-cask:26.3
|
||||
pull: always
|
||||
environment:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
LANG: en_US.UTF-8
|
||||
commands:
|
||||
- rm /etc/apt/apt.conf.d/docker-clean
|
||||
- alias apt-get='rm -f /var/cache/apt/archives/lock && apt-get'
|
||||
- apt-get update -q
|
||||
- apt-get install -qq language-pack-en git aspell-en
|
||||
- ./makem.sh --verbose --sandbox --install-deps --install-linters lint
|
||||
volumes:
|
||||
- name: debian-package-cache
|
||||
path: /var/cache/apt/archives
|
||||
|
||||
- name: Emacs master-branch
|
||||
image: flycheck/emacs-cask:master
|
||||
pull: always
|
||||
environment:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
LANG: en_US.UTF-8
|
||||
commands:
|
||||
- rm /etc/apt/apt.conf.d/docker-clean
|
||||
- alias apt-get='rm -f /var/cache/apt/archives/lock && apt-get'
|
||||
- apt-get update -q
|
||||
- apt-get install -qq language-pack-en git aspell-en
|
||||
- emacs --version
|
||||
- ./makem.sh --verbose --sandbox --install-deps --install-linters lint
|
||||
volumes:
|
||||
- name: debian-package-cache
|
||||
path: /var/cache/apt/archives
|
||||
|
||||
- name: Emacs 25.3
|
||||
image: flycheck/emacs-cask:25.3
|
||||
pull: always
|
||||
environment:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
LANG: C
|
||||
commands:
|
||||
- rm /etc/apt/apt.conf.d/docker-clean
|
||||
- alias apt-get='rm -f /var/cache/apt/archives/lock && apt-get'
|
||||
- apt-get update -q
|
||||
- apt-get install -qq git
|
||||
# Some package or its dependency requires Emacs 26.1,
|
||||
# so we just check if it compiles.
|
||||
- ./makem.sh --verbose --sandbox compile
|
||||
volumes:
|
||||
- name: debian-package-cache
|
||||
path: /var/cache/apt/archives
|
||||
|
||||
- name: notify
|
||||
image: drillster/drone-email
|
||||
pull: always
|
||||
settings:
|
||||
host: cryptoparty-celle.de
|
||||
from: drone@tzend.de
|
||||
username:
|
||||
from_secret: email_username
|
||||
password:
|
||||
from_secret: email_password
|
||||
when:
|
||||
status: [ changed, failure ]
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1,2 +1,2 @@
|
|||
/flycheck*.el*
|
||||
*~
|
||||
*.elc
|
||||
|
|
56
README.md
56
README.md
|
@ -1,55 +1,65 @@
|
|||
# register-quicknav - Quickly jump to next/previous register
|
||||
|
||||
*Author:* tastytea <tastytea@tastytea.de><br>
|
||||
*Version:* 0.1.2<br>
|
||||
*Version:* 0.4.3<br>
|
||||
*URL:* [https://schlomp.space/tastytea/register-quicknav](https://schlomp.space/tastytea/register-quicknav)<br>
|
||||
|
||||
This package is built on top of `register.el` and allows you to quickly jump
|
||||
to the next/previous position register. If you reach the end, the search
|
||||
wraps around and continues with the first (or last) register.
|
||||
wraps around and continues with the first (or last) register. It can be used
|
||||
across all files or individually for each buffer.
|
||||
|
||||
## Features
|
||||
|
||||
* Cycle through all position registers in both directions.
|
||||
* Clear current register.
|
||||
|
||||
## Known limitations
|
||||
|
||||
Works only for as long as the buffer containing the registers is open. If
|
||||
you close and reopen it, it won't work anymore.
|
||||
* Store point in unused register (range configurable).
|
||||
* Clear all registers in the unused registers range.
|
||||
|
||||
## Installation
|
||||
|
||||
**Note:** The function and variable names were previously separated by “/”
|
||||
from the namespace. To conform with MELPA rules the separator has been
|
||||
changed to “-”.
|
||||
|
||||
To use `register-quicknav.el`, put it in your load-path and add the following
|
||||
to your init.el:
|
||||
To use `register-quicknav.el`, get it from
|
||||
[MELPA](https://melpa.org/#/register-quicknav) or put it in your load-path
|
||||
and add the following to your init.el:
|
||||
|
||||
(require 'register-quicknav)
|
||||
(global-set-key (kbd "<C-f5>") #'register-quicknav-prev-register)
|
||||
(global-set-key (kbd "<C-f6>") #'register-quicknav-next-register)
|
||||
(global-set-key (kbd "M-r") #'register-quicknav-clear-current-register)
|
||||
(global-set-key (kbd "<C-f7>") #'register-quicknav-point-to-unused-register)
|
||||
(global-set-key (kbd "<C-S-<f7>") #'register-quicknav-clear-current-register)
|
||||
|
||||
Or, with use-package:
|
||||
|
||||
(use-package register-quicknav
|
||||
:bind (("C-<f5>" . register-quicknav-prev-register)
|
||||
("C-<f6>" . register-quicknav-next-register)
|
||||
("M-r" . register-quicknav-clear-current-register)))
|
||||
|
||||
Instead of manually copying `register-quicknav.el` into your load-path, you
|
||||
can use [quelpa](https://github.com/quelpa/quelpa):
|
||||
|
||||
(quelpa '(register-quicknav
|
||||
:fetcher git
|
||||
:url "https://schlomp.space/tastytea/register-quicknav.git"))
|
||||
("C-<f7>" . register-quicknav-point-to-unused-register)
|
||||
("C-S-<f7>" . register-quicknav-clear-current-register)))
|
||||
|
||||
## Variables
|
||||
|
||||
* `register-quicknav-buffer-only`: Cycle only through position registers in
|
||||
current buffer.
|
||||
current buffer. Can be safely set as file- and/or dir-local variable.
|
||||
* `register-quicknav-unused-registers-begin`: Beginning of the range that is
|
||||
used to search for unused registers. Defaults to `?A`.
|
||||
* `register-quicknav-unused-registers-end`: End of the range that is used to
|
||||
search for unused registers. Defaults to `?Z`.
|
||||
|
||||
## Differences to similar packages
|
||||
|
||||
[iregister](https://github.com/atykhonov/iregister.el):
|
||||
|
||||
* Opens a minibuffer on each jump (thereby requiring an extra keystroke).
|
||||
* Doesn't work with file-query registers
|
||||
* Can't be restricted to the current buffer.
|
||||
* Doesn't look like it's still maintained.
|
||||
|
||||
[register-channel](https://github.com/YangZhao11/register-channel):
|
||||
|
||||
* Is limited to 5 position registers by default, needs an extra keybinding
|
||||
for each additional register.
|
||||
* Can't be restricted to the current buffer.
|
||||
* Has no ability to jump to the next/previous register.
|
||||
|
||||
|
||||
---
|
||||
|
|
|
@ -3,8 +3,8 @@
|
|||
;; Copyright (C) 2020 tastytea
|
||||
|
||||
;; Author: tastytea <tastytea@tastytea.de>
|
||||
;; Version: 0.1.2
|
||||
;; Package-Requires: ((emacs "24"))
|
||||
;; Version: 0.4.3
|
||||
;; Package-Requires: ((emacs "25.3"))
|
||||
;; Keywords: convenience
|
||||
;; URL: https://schlomp.space/tastytea/register-quicknav
|
||||
|
||||
|
@ -25,131 +25,231 @@
|
|||
|
||||
;; This package is built on top of `register.el' and allows you to quickly jump
|
||||
;; to the next/previous position register. If you reach the end, the search
|
||||
;; wraps around and continues with the first (or last) register.
|
||||
;; wraps around and continues with the first (or last) register. It can be used
|
||||
;; across all files or individually for each buffer.
|
||||
|
||||
;; Features:
|
||||
;;
|
||||
;; * Cycle through all position registers in both directions.
|
||||
;; * Clear current register.
|
||||
|
||||
;; Known limitations:
|
||||
;;
|
||||
;; Works only for as long as the buffer containing the registers is open. If
|
||||
;; you close and reopen it, it won't work anymore.
|
||||
;; * Store point in unused register (range configurable).
|
||||
;; * Clear all registers in the unused registers range.
|
||||
|
||||
;; Installation:
|
||||
;;
|
||||
;; **Note:** The function and variable names were previously separated by “/”
|
||||
;; from the namespace. To conform with MELPA rules the separator has been
|
||||
;; changed to “-”.
|
||||
;;
|
||||
;; To use `register-quicknav.el', put it in your load-path and add the following
|
||||
;; to your init.el:
|
||||
;; To use `register-quicknav.el', get it from
|
||||
;; [MELPA](https://melpa.org/#/register-quicknav) or put it in your load-path
|
||||
;; and add the following to your init.el:
|
||||
;;
|
||||
;; (require 'register-quicknav)
|
||||
;; (global-set-key (kbd "<C-f5>") #'register-quicknav-prev-register)
|
||||
;; (global-set-key (kbd "<C-f6>") #'register-quicknav-next-register)
|
||||
;; (global-set-key (kbd "M-r") #'register-quicknav-clear-current-register)
|
||||
;; (global-set-key (kbd "<C-f7>") #'register-quicknav-point-to-unused-register)
|
||||
;; (global-set-key (kbd "<C-S-<f7>") #'register-quicknav-clear-current-register)
|
||||
;;
|
||||
;; Or, with use-package:
|
||||
;;
|
||||
;; (use-package register-quicknav
|
||||
;; :bind (("C-<f5>" . register-quicknav-prev-register)
|
||||
;; ("C-<f6>" . register-quicknav-next-register)
|
||||
;; ("M-r" . register-quicknav-clear-current-register)))
|
||||
;;
|
||||
;; Instead of manually copying `register-quicknav.el' into your load-path, you
|
||||
;; can use [quelpa](https://github.com/quelpa/quelpa):
|
||||
;;
|
||||
;; (quelpa '(register-quicknav
|
||||
;; :fetcher git
|
||||
;; :url "https://schlomp.space/tastytea/register-quicknav.git"))
|
||||
;; ("C-<f7>" . register-quicknav-point-to-unused-register)
|
||||
;; ("C-S-<f7>" . register-quicknav-clear-current-register)))
|
||||
|
||||
;; Variables:
|
||||
;;
|
||||
;; * `register-quicknav-buffer-only': Cycle only through position registers in
|
||||
;; current buffer.
|
||||
;; current buffer. Can be safely set as file- and/or dir-local variable.
|
||||
;; * `register-quicknav-unused-registers-begin': Beginning of the range that is
|
||||
;; used to search for unused registers. Defaults to `?A'.
|
||||
;; * `register-quicknav-unused-registers-end': End of the range that is used to
|
||||
;; search for unused registers. Defaults to `?Z'.
|
||||
|
||||
;; Differences to similar packages:
|
||||
;;
|
||||
;; [iregister](https://github.com/atykhonov/iregister.el):
|
||||
;;
|
||||
;; * Opens a minibuffer on each jump (thereby requiring an extra keystroke).
|
||||
;; * Doesn't work with file-query registers
|
||||
;; * Can't be restricted to the current buffer.
|
||||
;; * Doesn't look like it's still maintained.
|
||||
;;
|
||||
;; [register-channel](https://github.com/YangZhao11/register-channel):
|
||||
;;
|
||||
;; * Is limited to 5 position registers by default, needs an extra keybinding
|
||||
;; for each additional register.
|
||||
;; * Can't be restricted to the current buffer.
|
||||
;; * Has no ability to jump to the next/previous register.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(define-obsolete-variable-alias 'register-quicknav/buffer-only
|
||||
'register-quicknav-buffer-only "0.1.1")
|
||||
(define-obsolete-function-alias 'register-quicknav/next-register
|
||||
#'register-quicknav-next-register "0.1.1")
|
||||
(define-obsolete-function-alias 'register-quicknav/prev-register
|
||||
#'register-quicknav-prev-register "0.1.1")
|
||||
(define-obsolete-function-alias 'register-quicknav/clear-current-register
|
||||
#'register-quicknav-clear-current-register "0.1.1")
|
||||
(require 'cl-lib)
|
||||
|
||||
(defgroup register-quicknav nil
|
||||
"Variables for register-quicknav."
|
||||
:group 'editing)
|
||||
|
||||
;;;###autoload
|
||||
(defcustom register-quicknav-buffer-only nil
|
||||
"Cycle only through position registers in current buffer."
|
||||
:type 'boolean
|
||||
:group 'register-quicknav
|
||||
:safe #'booleanp)
|
||||
|
||||
(defcustom register-quicknav-unused-registers-begin ?A
|
||||
"Begin looking for unused register at this register."
|
||||
:type 'character
|
||||
:group 'register-quicknav)
|
||||
|
||||
(defvar register-quicknav--current-position-register 0
|
||||
"An index to the current position register.")
|
||||
(defcustom register-quicknav-unused-registers-end ?Z
|
||||
"End looking for unused register at this register."
|
||||
:type 'character
|
||||
:group 'register-quicknav)
|
||||
|
||||
(defun register-quicknav--sort-position-register-elements (a b)
|
||||
"Return t if the file name is the same and A < B."
|
||||
(let ((marker-a (cdr a))
|
||||
(marker-b (cdr b)))
|
||||
(and (string= (buffer-file-name (marker-buffer marker-a))
|
||||
(buffer-file-name (marker-buffer marker-b)))
|
||||
(< (marker-position marker-a)
|
||||
(marker-position marker-b)))))
|
||||
(defvar register-quicknav--last-register-v nil
|
||||
"The last jumped-to position register.")
|
||||
|
||||
(defun register-quicknav--last-register (&optional val)
|
||||
"Return `register-quicknav--last-register-v' or set it if VAL is non-nil.
|
||||
Use the local value if `register-quicknav-buffer-only' is set and
|
||||
the global value otherwise."
|
||||
(if val
|
||||
(if register-quicknav-buffer-only
|
||||
(setq register-quicknav--last-register-v val)
|
||||
(setq-default register-quicknav--last-register-v val))
|
||||
(if register-quicknav-buffer-only
|
||||
register-quicknav--last-register-v
|
||||
(default-value 'register-quicknav--last-register-v))))
|
||||
|
||||
(defun register-quicknav--file-name (register)
|
||||
"Return file-name of REGISTER.
|
||||
Works on markers and file-queries."
|
||||
(if (markerp (cdr register))
|
||||
(buffer-file-name (marker-buffer (cdr register)))
|
||||
(nth 2 register)))
|
||||
|
||||
(defun register-quicknav--is-current-buffer? (register)
|
||||
"Return t if REGISTER is in current buffer.
|
||||
Works on markers and file-queries."
|
||||
(if (markerp (cdr register))
|
||||
(eq (current-buffer) (marker-buffer (cdr register)))
|
||||
(string= (buffer-file-name (current-buffer))
|
||||
(register-quicknav--file-name register))))
|
||||
|
||||
(defun register-quicknav--position (register)
|
||||
"Return position of REGISTER.
|
||||
Works on markers and file-queries."
|
||||
(if (markerp (cdr register))
|
||||
(marker-position (cdr register))
|
||||
(nth 3 register)))
|
||||
|
||||
(defun register-quicknav--registers ()
|
||||
"Return all position registers, sorted by file name and position.
|
||||
If `register-quicknav-buffer-only' is t, return only registers in
|
||||
current buffer."
|
||||
(let (result)
|
||||
(dolist (item register-alist)
|
||||
(when (markerp (cdr item))
|
||||
(cl-flet ((sort-registers
|
||||
(lambda (a b)
|
||||
"Return t if position of A is < B.
|
||||
Works on markers and file-queries."
|
||||
(and (string= (register-quicknav--file-name a)
|
||||
(register-quicknav--file-name b))
|
||||
(< (register-quicknav--position a)
|
||||
(register-quicknav--position b))))))
|
||||
(let ((result))
|
||||
(dolist (register register-alist)
|
||||
(if (or (markerp (cdr register))
|
||||
(ignore-errors (eq (nth 1 register) 'file-query)))
|
||||
(if register-quicknav-buffer-only
|
||||
(when (eq (current-buffer) (marker-buffer (cdr item)))
|
||||
(setq result (cons item result)))
|
||||
(setq result (cons item result)))))
|
||||
(sort result #'register-quicknav--sort-position-register-elements)))
|
||||
(when (register-quicknav--is-current-buffer? register)
|
||||
(push register result))
|
||||
(push register result))))
|
||||
(sort result #'sort-registers))))
|
||||
|
||||
(defun register-quicknav--jump-to-register (next)
|
||||
"Jump to next position register if NEXT is t, to previous otherwise."
|
||||
(let* ((register-list (register-quicknav--registers))
|
||||
(index (cl-position (register-quicknav--last-register) register-list))
|
||||
(stop-searching))
|
||||
(when index
|
||||
(if next
|
||||
(cl-incf index)
|
||||
(cl-decf index)))
|
||||
;; Try to find the position register closest to point.
|
||||
(dolist (register register-list)
|
||||
(when (register-quicknav--is-current-buffer? register)
|
||||
(let ((register-pos (register-quicknav--position register)))
|
||||
(if next
|
||||
(when (and (not stop-searching)
|
||||
(> register-pos (point)))
|
||||
(setq index (cl-position register register-list)
|
||||
stop-searching t))
|
||||
(when (< register-pos (point))
|
||||
(setq index (cl-position register register-list)))))))
|
||||
(if index
|
||||
(progn ; If index is invalid, set it to first or last register.
|
||||
(when (or (>= index (length register-list))
|
||||
(< index 0))
|
||||
(if next
|
||||
(setq index 0)
|
||||
(setq index (- (length register-list) 1))))
|
||||
(register-to-point (car (nth index register-list)))
|
||||
(register-quicknav--last-register (nth index register-list)))
|
||||
;; No suitable register found, jump to first register.
|
||||
(register-to-point (car (car register-list)))
|
||||
(register-quicknav--last-register (car register-list)))))
|
||||
|
||||
;;;###autoload
|
||||
(defun register-quicknav-next-register ()
|
||||
"Jump to next position register."
|
||||
(interactive)
|
||||
(let ((pos register-quicknav--current-position-register)
|
||||
(registers (register-quicknav--registers)))
|
||||
(setq pos (+ pos 1))
|
||||
(when (>= pos (length registers))
|
||||
(setq pos 0))
|
||||
(setq register-quicknav--current-position-register pos)
|
||||
(register-to-point (car (nth pos registers)))))
|
||||
(register-quicknav--jump-to-register t))
|
||||
|
||||
;;;###autoload
|
||||
(defun register-quicknav-prev-register ()
|
||||
"Jump to previous position register."
|
||||
(interactive)
|
||||
(let ((pos register-quicknav--current-position-register)
|
||||
(registers (register-quicknav--registers)))
|
||||
(setq pos (- pos 1))
|
||||
(when (< pos 0)
|
||||
(setq pos (- (length registers) 1)))
|
||||
(setq register-quicknav--current-position-register pos)
|
||||
(register-to-point (car (nth pos registers)))))
|
||||
(register-quicknav--jump-to-register nil))
|
||||
|
||||
;;;###autoload
|
||||
(defun register-quicknav-clear-current-register ()
|
||||
"Clear currently selected position register.
|
||||
To be more precise, it deletes the
|
||||
`register-quicknav--current-position-register'th position
|
||||
register, as reported by `register-quicknav--registers', from
|
||||
`register-alist'."
|
||||
"Clear last jumped-to position register from `register-alist'.
|
||||
Deletes the value of `register-quicknav--last-register' from `register-alist'."
|
||||
(interactive)
|
||||
(let ((pos register-quicknav--current-position-register)
|
||||
(registers (register-quicknav--registers)))
|
||||
(setq register-alist (delq (nth pos registers) register-alist))))
|
||||
(setq register-alist
|
||||
(delq (register-quicknav--last-register) register-alist))
|
||||
(message "Cleared register %c." (car (register-quicknav--last-register))))
|
||||
|
||||
;;;###autoload
|
||||
(defun register-quicknav-point-to-unused-register ()
|
||||
"Store current location of point in next unused register.
|
||||
Searches the range between
|
||||
`register-quicknav-unused-registers-begin' and
|
||||
`register-quicknav-unused-registers-end'."
|
||||
(interactive)
|
||||
(let* ((begin register-quicknav-unused-registers-begin)
|
||||
(end register-quicknav-unused-registers-end)
|
||||
(char begin))
|
||||
(while (and (get-register char)
|
||||
(not (> char end)))
|
||||
(cl-incf char))
|
||||
(if (<= char end)
|
||||
(progn
|
||||
(point-to-register char)
|
||||
(register-quicknav--last-register (assoc char register-alist))
|
||||
(message "Position stored in register %c." char))
|
||||
(message "No unused register in the range %c - %c found." begin end))))
|
||||
|
||||
;;;###autoload
|
||||
(defun register-quicknav-clear-unused-registers-range ()
|
||||
"Clear all registers in the range used by `register-quicknav-point-to-unused-register'."
|
||||
(interactive)
|
||||
(let ((begin register-quicknav-unused-registers-begin)
|
||||
(end register-quicknav-unused-registers-end))
|
||||
(dolist (register register-alist)
|
||||
(when (and (>= (car register) begin)
|
||||
(<= (car register) end))
|
||||
(setq register-alist
|
||||
(delq register register-alist))))
|
||||
(message "Cleared unused registers in the range %c - %c." begin end)))
|
||||
|
||||
(provide 'register-quicknav)
|
||||
;;; register-quicknav.el ends here
|
||||
|
|
Loading…
Reference in New Issue
Block a user