emacs/common/generic_functions.el

290 lines
10 KiB
EmacsLisp

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; generic functions
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; open org agenda in top side window
; BUGGED AND UNUSED, agenda does NOT work properly in side windows
(defun kmn/org-agenda-on-top ()
(defvar parameters
'(window-parameters . ((no-other-window . t)
(no-delete-other-windows . t))))
(setq fit-window-to-buffer-horizontally t)
(setq window-resize-pixelwise t)
(interactive)
(display-buffer-in-side-window
(get-buffer "*Org Agenda*") `((side . top) (slot . 0)
(window-width . fit-window-to-buffer)
(preserve-size . (t . nil)) , parameters))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; open dired with default directory in left side window
(defun kmn/dired-directory-on-left (&optional dir_path no-win no-del-o-win slot-num)
(defvar parameters
'(window-parameters . ((no-other-window . ,(or no-win (setq no-win t)))
(no-delete-other-windows . ,(or no-del-o-win (setq no-del-o-win t))))))
(setq fit-window-to-buffer-horizontally t)
(setq window-resize-pixelwise t)
"Display `default-directory' in side window on left, hiding details."
(interactive)
(let ((buffer (dired-noselect (or dir_path (setq dir_path default-directory)))))
(with-current-buffer buffer (dired-hide-details-mode t))
(display-buffer-in-side-window
buffer `((side . left) (slot . ,(or slot-num (setq slot-num -1)))
(window-width . fit-window-to-buffer)
, parameters)
)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; open eshell in left side window
(defun kmn/eshell-on-left (&optional shell-directory no-win no-del-o-win slot-num)
(defvar parameters
'(window-parameters . ((no-other-window . ,(or no-win (setq no-win t)))
(no-delete-other-windows . ,(or no-del-o-win (setq no-del-o-win t))))))
(setq fit-window-to-buffer-horizontally t)
(setq window-resize-pixelwise t)
(setq default-directory (or shell-directory (setq shell-directory default-directory)))
(interactive)
(let ((buffer (eshell)))
(display-buffer-in-side-window
buffer `((side . left) (slot . ,(or slot-num (setq slot-num -1)))
(window-width . fit-window-to-buffer)
, parameters)
)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; open eww in right side window
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; open eww in right side window
(defun kmn/eww-on-right (url &optional no-win no-del-o-win slot-num)
(defvar parameters
'(window-parameters . ((no-other-window . ,(or no-win (setq no-win t)))
(no-delete-other-windows . ,(or no-del-o-win (setq no-del-o-win t))))))
(setq fit-window-to-buffer-horizontally t)
(setq window-resize-pixelwise t)
(interactive)
(eww url)
(let ((buffer (current-buffer)))
(previous-buffer)
(display-buffer-in-side-window
buffer `((side . right) (slot . ,(or slot-num (setq slot-num -1)))
(window-width . fit-window-to-buffer)
, parameters)
)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; open text-mode scratch in right side window
(defun kmn/scratch-text-on-right ()
(defvar parameters
'(window-parameters . ((no-other-window . t)
(no-delete-other-windows . t))))
(setq fit-window-to-buffer-horizontally t)
(setq window-resize-pixelwise t)
"Display `default-directory' in side window on right, hiding details."
(interactive)
(let ((buffer (scratch 'text-mode)))
(display-buffer-in-side-window
buffer `((side . right) (slot . -1)
(window-width . fit-window-to-buffer)
, parameters)
)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; open text-mode scratch in left side window
(defun kmn/scratch-text-on-left ()
(defvar parameters
'(window-parameters . ((no-other-window . t)
(no-delete-other-windows . t))))
(setq fit-window-to-buffer-horizontally t)
(setq window-resize-pixelwise t)
"Display `default-directory' in side window on left, hiding details."
(interactive)
(let ((buffer (scratch 'text-mode)))
(display-buffer-in-side-window
buffer `((side . left) (slot . -1)
(window-width . fit-window-to-buffer)
, parameters)
)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; open text-mode scratch in right side window
(defun kmn/scratch-prompt-on-right ()
(defvar parameters
'(window-parameters . ((no-other-window . t)
(no-delete-other-windows . t))))
(setq fit-window-to-buffer-horizontally t)
(setq window-resize-pixelwise t)
"Display `default-directory' in side window on left, hiding details."
(interactive)
(let ((buffer (scratch (let ((current-prefix-arg t)) (scratch--buffer-querymode)))))
(display-buffer-in-side-window
buffer `((side . right) (slot . -1)
(window-width . fit-window-to-buffer)
, parameters)
)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; quick reference notes as a pop up window
(defun kmn/popwin-quick-ref ()
(interactive)
(when (eq system-type 'windows-nt)
(popwin:find-file "~/org/_quick_reference.org"))
(when kmn/is-termux
(popwin:find-file "~/storage/shared/org/_quick_reference.org")))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; modern home/end via C-a and C-e
(defun kmn/smart-beginning-of-line ()
"Move point to `beginning-of-line'. If repeat command it cycle
position between `back-to-indentation' and `beginning-of-line'."
(interactive "^")
(if (eq last-command 'smart-beginning-of-line)
(if (= (line-beginning-position) (point))
(back-to-indentation)
(beginning-of-line))
(back-to-indentation)))
(defun kmn/smart-end-of-line ()
"Move point to `end-of-line'. If repeat command it cycle
position between last non-whitespace and `end-of-line'."
(interactive "^")
(if (and (eq last-command 'kmn/smart-end-of-line)
(= (line-end-position) (point)))
(skip-syntax-backward " " (line-beginning-position))
(end-of-line)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; function to kill all non special, non active buffers
(defun kmn/kill-other-buffers ()
"Kill all buffers but the current one. Don't mess with special buffers. Kill dired buffers"
(interactive)
; dired buffer cleanup
(mapc
(lambda (buffer)
(when (eq 'dired-mode (buffer-local-value 'major-mode buffer))
(kill-buffer buffer)))
(buffer-list))
; non special buffer cleanup
(dolist (buffer (buffer-list))
(unless (or (eql buffer (current-buffer)) (not (buffer-file-name buffer)))
(kill-buffer buffer))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; find/replace all (interactive)
(defun kmn/query-replace-region-or-from-top ()
"If marked, query-replace for the region, else for the whole buffer (start from the top)"
(interactive)
(progn
(let ((orig-point (point)))
(if (use-region-p)
(call-interactively 'query-replace)
(save-excursion
(goto-char (point-min))
(call-interactively 'query-replace)))
(message "Back to old point.")
(goto-char orig-point))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; dock current buffer in given side panel
(defun kmn/dock-current-buffer-on-side (selected_side)
(defvar parameters
'(window-parameters . ((no-delete-other-windows . t))))
(setq fit-window-to-buffer-horizontally t)
(setq window-resize-pixelwise t)
"Display `default-directory' in side window on left, hiding details."
(interactive)
(let ((buffer (current-buffer)))
(display-buffer-in-side-window
buffer `((side . ,selected_side) (slot . -1)
(window-width . fit-window-to-buffer)
, parameters)
)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; dock current buffer on right
(defun kmn/dock-current-buffer-on-right ()
(interactive)
(kmn/dock-current-buffer-on-side 'right)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; dock current buffer on right
(defun kmn/dock-current-buffer-on-left ()
(interactive)
(kmn/dock-current-buffer-on-side 'left)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; dock current buffer on right
(defun kmn/dock-current-buffer-on-top ()
(interactive)
(kmn/dock-current-buffer-on-side 'top)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; dock current buffer on right
(defun kmn/dock-current-buffer-on-bottom ()
(interactive)
(kmn/dock-current-buffer-on-side 'bottom)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; perform days math on a date string
(defun kmn/date-string-days-math (date-string days-to-subtract)
(format-time-string "%Y-%m-%d"
(encode-time
(decoded-time-add (parse-time-string date-string) (make-decoded-time :day days-to-subtract))
)
))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; subtract 7 days from a date string
(defun kmn/date-string-minus-seven-days (date-string)
(kmn/date-string-days-math date-string -7)
)
; subtract 3 days from a date string
(defun kmn/date-string-minus-three-days (date-string)
(kmn/date-string-days-math date-string -3)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; create new frame if not inside termux
(defun kmn/possibly-create-frame ()
(interactive)
(when (not kmn/is-termux)
(let ((frame (make-frame)))
(select-frame-set-input-focus frame)))
)