Move functions from buf-manipulation.el to the Org config
This commit is contained in:
parent
c16ff8cbc0
commit
46d7a1a731
@ -49,6 +49,266 @@ I set it up early so I can use it in ~use-package~ calls immediately.
|
|||||||
user-emacs-directory))
|
user-emacs-directory))
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
|
* Custom commands and functions
|
||||||
|
|
||||||
|
** Misc text manipulation functions
|
||||||
|
|
||||||
|
*** Delete the current line
|
||||||
|
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defun gpolonkai/delete-current-line ()
|
||||||
|
"Kill the whole line on which point is."
|
||||||
|
(interactive)
|
||||||
|
|
||||||
|
(beginning-of-line)
|
||||||
|
(kill-line 1))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
*** Duplicate current line
|
||||||
|
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defun gpolonkai/duplicate-line()
|
||||||
|
"Duplicate line at point."
|
||||||
|
|
||||||
|
(interactive)
|
||||||
|
|
||||||
|
(save-excursion
|
||||||
|
(move-beginning-of-line 1)
|
||||||
|
(kill-line)
|
||||||
|
(yank)
|
||||||
|
(open-line 1)
|
||||||
|
(forward-line 1)
|
||||||
|
(yank)))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
*** Toggle case of character at point
|
||||||
|
|
||||||
|
Based on [[http://ergoemacs.org/emacs/modernization_upcase-word.html][Xah’s toggle letter case defun version 2015-12-22]]
|
||||||
|
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defun toggle-char-case (arg-move-point)
|
||||||
|
"Toggle the case of the char after point.
|
||||||
|
|
||||||
|
If prefix argument ARG-MOVE-POINT is non-nil, move point after the char."
|
||||||
|
(interactive "P")
|
||||||
|
(let ((case-fold-search nil))
|
||||||
|
(cond
|
||||||
|
((looking-at "[[:lower:]]") (upcase-region (point) (1+ (point))))
|
||||||
|
((looking-at "[[:upper:]]") (downcase-region (point) (1+ (point)))))
|
||||||
|
(cond
|
||||||
|
(arg-move-point (right-char)))))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
*** Open a new line below
|
||||||
|
|
||||||
|
Copied from http://whattheemacsd.com/editing-defuns.el-01.html
|
||||||
|
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defun open-line-below ()
|
||||||
|
"Open a new line below point."
|
||||||
|
|
||||||
|
(interactive)
|
||||||
|
|
||||||
|
(end-of-line)
|
||||||
|
(newline)
|
||||||
|
(indent-for-tab-command))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
*** Open a new line above
|
||||||
|
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defun open-line-above ()
|
||||||
|
"Open a new line above point."
|
||||||
|
|
||||||
|
(interactive)
|
||||||
|
|
||||||
|
(beginning-of-line)
|
||||||
|
(newline)
|
||||||
|
(forward-line -1)
|
||||||
|
(indent-for-tab-command))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
*** TODO Kill or copy the whole line
|
||||||
|
|
||||||
|
Got from Xah’s site (TODO is for adding a link here.)
|
||||||
|
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defun æ-kill-or-copy-whole-line (kill)
|
||||||
|
"Kill or copy the whole line point is on.
|
||||||
|
|
||||||
|
If KILL is non-nil, the line gets killed. Otherwise, it gets just
|
||||||
|
copied to the kill ring."
|
||||||
|
(interactive "P")
|
||||||
|
|
||||||
|
(if kill
|
||||||
|
(kill-whole-line)
|
||||||
|
(let ((beginning (progn (beginning-of-line) (point)))
|
||||||
|
(end (progn (end-of-line) (point))))
|
||||||
|
(copy-region-as-kill beginning end))))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
** Navigation
|
||||||
|
|
||||||
|
*** Move to different beginnings of the current line
|
||||||
|
|
||||||
|
Inspired by Bozhidar Batsov's [[http://emacsredux.com/blog/2013/05/22/smarter-navigation-to-the-beginning-of-a-line/][solution]].
|
||||||
|
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defun gpolonkai/move-to-beginning-of-line ()
|
||||||
|
"Move to different beginnings of the line.
|
||||||
|
|
||||||
|
These are, in order:
|
||||||
|
|
||||||
|
- beginning of the visual line if `visual-line-mode' is active,
|
||||||
|
- the first non-whitespace (indentation),
|
||||||
|
- the actual beginning of the line.
|
||||||
|
|
||||||
|
This function will jump between the first character and the
|
||||||
|
indentation if used multiple times."
|
||||||
|
(interactive)
|
||||||
|
(let ((last-pos (point)))
|
||||||
|
(when visual-line-mode
|
||||||
|
(beginning-of-visual-line))
|
||||||
|
(when (= (point) last-pos)
|
||||||
|
(back-to-indentation))
|
||||||
|
(when (= (point) last-pos)
|
||||||
|
(beginning-of-line))
|
||||||
|
(when (and (eq major-mode 'org-mode)
|
||||||
|
(= (point) last-pos))
|
||||||
|
(org-beginning-of-line))
|
||||||
|
(when (= (point) last-pos)
|
||||||
|
(back-to-indentation))))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
*** Move to the different ends of the current line
|
||||||
|
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defun gpolonkai/move-to-end-of-line ()
|
||||||
|
"Move to the end of the line.
|
||||||
|
|
||||||
|
If `visual-line-mode' is active, jump to the end of the visual
|
||||||
|
line first. Then jump to the actual end of the line."
|
||||||
|
(interactive)
|
||||||
|
(let ((last-pos (point)))
|
||||||
|
(when visual-line-mode
|
||||||
|
(end-of-visual-line))
|
||||||
|
(when (= (point) last-pos)
|
||||||
|
(end-of-line))
|
||||||
|
(when (and (eq major-mode 'org-mode)
|
||||||
|
(= (point) last-pos))
|
||||||
|
(org-end-of-line))))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
** File manipulation
|
||||||
|
|
||||||
|
*** Rename the current file
|
||||||
|
|
||||||
|
Copied from http://whattheemacsd.com/file-defuns.el-01.html
|
||||||
|
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defun rename-current-buffer-file ()
|
||||||
|
"Renames current buffer and file it is visiting."
|
||||||
|
(interactive)
|
||||||
|
|
||||||
|
(let ((name (buffer-name))
|
||||||
|
(filename (buffer-file-name)))
|
||||||
|
(if (not (and filename (file-exists-p filename)))
|
||||||
|
(error "Buffer '%s' is not visiting a file!" name)
|
||||||
|
(let ((new-name (read-file-name "New name: " filename)))
|
||||||
|
(if (get-buffer new-name)
|
||||||
|
(error "A buffer named '%s' already exists!" new-name)
|
||||||
|
(rename-file filename new-name 1)
|
||||||
|
(rename-buffer new-name)
|
||||||
|
(set-visited-file-name new-name)
|
||||||
|
; TODO: this is suspicious for me…
|
||||||
|
(set-buffer-modified-p nil)
|
||||||
|
(message "File '%s' successfully renamed to '%s'"
|
||||||
|
name (file-name-nondirectory new-name)))))))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
*** Delete the current file
|
||||||
|
|
||||||
|
Copied from http://whattheemacsd.com/file-defuns.el-02.html
|
||||||
|
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defun delete-current-buffer-file ()
|
||||||
|
"Remove file connected to current buffer and kill the buffer."
|
||||||
|
(interactive)
|
||||||
|
|
||||||
|
(let ((filename (buffer-file-name))
|
||||||
|
(name (buffer-name))
|
||||||
|
(buffer (current-buffer)))
|
||||||
|
(if (not (and filename (file-exists-p filename)))
|
||||||
|
(kill-buffer buffer)
|
||||||
|
(when (yes-or-no-p "Are you sure you want to remove this file? ")
|
||||||
|
(delete-file filename)
|
||||||
|
(kill-buffer buffer)
|
||||||
|
(message "File '%s' successfully removed" filename)))))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
*** Allow reopening the previously closed file
|
||||||
|
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defvar gpolonkai/last-killed-buffer-file-name
|
||||||
|
nil
|
||||||
|
"The last killed buffer.
|
||||||
|
|
||||||
|
Used by `gpolonkai/kill-this-buffer' and `gpolonkai/undo-buffer-kill'.")
|
||||||
|
|
||||||
|
(defun gpolonkai/kill-this-buffer ()
|
||||||
|
"Kill the current buffer, but save the buffer file name so it can be undone."
|
||||||
|
(interactive)
|
||||||
|
(setq gpolonkai/last-killed-buffer-file-name (buffer-file-name))
|
||||||
|
(kill-this-buffer))
|
||||||
|
|
||||||
|
(defun gpolonkai/undo-buffer-kill ()
|
||||||
|
"Undo killing the last buffer.
|
||||||
|
|
||||||
|
Esentially it visits the file again."
|
||||||
|
(interactive)
|
||||||
|
(if gpolonkai/last-killed-buffer-file-name
|
||||||
|
(progn
|
||||||
|
(find-file gpolonkai/last-killed-buffer-file-name)
|
||||||
|
(setq gpolonkai/last-killed-buffer-file-name nil))
|
||||||
|
(message "The buffer last killed didn’t visit a file.")))
|
||||||
|
#+END_SRC
|
||||||
|
** ~c-mode~ related
|
||||||
|
|
||||||
|
*** Copy the prototype of the current function
|
||||||
|
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defun gpolonkai/copy-func-prototype ()
|
||||||
|
"Copy the current function's prototype to the kill ring."
|
||||||
|
|
||||||
|
(interactive)
|
||||||
|
|
||||||
|
(save-excursion
|
||||||
|
(beginning-of-defun)
|
||||||
|
(let ((protocopy-begin (point)))
|
||||||
|
(forward-list)
|
||||||
|
(let ((protocopy-end (point)))
|
||||||
|
(kill-ring-save protocopy-begin protocopy-end)))))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
** EShell related
|
||||||
|
|
||||||
|
*** Delete a character, or close ~eshell~ if nothing to delet
|
||||||
|
|
||||||
|
Copied from https://ryuslash.org/posts/C-d-to-close-eshell.html
|
||||||
|
|
||||||
|
#+BEGIN_SRC emacs-lisp
|
||||||
|
(defun eshell-C-d ()
|
||||||
|
"Either call `delete-char' interactively or quit."
|
||||||
|
(interactive)
|
||||||
|
|
||||||
|
(condition-case err
|
||||||
|
(call-interactively #'delete-char)
|
||||||
|
(error (if (and (eq (car err) 'end-of-buffer)
|
||||||
|
(looking-back eshell-prompt-regexp nil))
|
||||||
|
(kill-buffer)
|
||||||
|
(signal (car err) (cdr err))))))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
* UI preferences
|
* UI preferences
|
||||||
|
|
||||||
** Tweak window chrome
|
** Tweak window chrome
|
||||||
|
3
init.el
3
init.el
@ -30,7 +30,6 @@
|
|||||||
(load "round-number-to-decimals")
|
(load "round-number-to-decimals")
|
||||||
(load "zim")
|
(load "zim")
|
||||||
(load "enclose-string")
|
(load "enclose-string")
|
||||||
(load "buf-manipulation")
|
|
||||||
(load "text-manip")
|
(load "text-manip")
|
||||||
(load "frame-manip")
|
(load "frame-manip")
|
||||||
(load "file-manip")
|
(load "file-manip")
|
||||||
@ -1154,7 +1153,7 @@ INFO plist."
|
|||||||
("C-M-r" . isearch-backward)
|
("C-M-r" . isearch-backward)
|
||||||
("C-~" . toggle-char-case)
|
("C-~" . toggle-char-case)
|
||||||
:map ctl-x-map
|
:map ctl-x-map
|
||||||
("C-y" . duplicate-line)
|
("C-y" . gpolonkai/duplicate-line)
|
||||||
("_" . maximize-window)
|
("_" . maximize-window)
|
||||||
("C-r" . rename-current-buffer-file)
|
("C-r" . rename-current-buffer-file)
|
||||||
("C-d" . delete-current-buffer-file)
|
("C-d" . delete-current-buffer-file)
|
||||||
|
@ -1,203 +0,0 @@
|
|||||||
;;; buf-manipulation --- Summary
|
|
||||||
;; Some custom functions for buffer content manipulation
|
|
||||||
;;
|
|
||||||
;;; Commentary:
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
(defun delete-current-line ()
|
|
||||||
"Kill the whole line on which point is."
|
|
||||||
(interactive)
|
|
||||||
|
|
||||||
(beginning-of-line)
|
|
||||||
(kill-line 1))
|
|
||||||
|
|
||||||
(defun copy-func-prototype ()
|
|
||||||
"Copy the current function's prototype to the kill ring."
|
|
||||||
|
|
||||||
(interactive)
|
|
||||||
|
|
||||||
(save-excursion
|
|
||||||
(beginning-of-defun)
|
|
||||||
(let ((protocopy-begin (point)))
|
|
||||||
(forward-list)
|
|
||||||
(let ((protocopy-end (point)))
|
|
||||||
(kill-ring-save protocopy-begin protocopy-end)))))
|
|
||||||
|
|
||||||
(defun duplicate-line()
|
|
||||||
"Duplicate line at point."
|
|
||||||
|
|
||||||
(interactive)
|
|
||||||
|
|
||||||
(save-excursion
|
|
||||||
(move-beginning-of-line 1)
|
|
||||||
(kill-line)
|
|
||||||
(yank)
|
|
||||||
(open-line 1)
|
|
||||||
(forward-line 1)
|
|
||||||
(yank)))
|
|
||||||
|
|
||||||
;; Based on Xah's toggle letter case defun version 2015-12-22
|
|
||||||
;;
|
|
||||||
;; URL: http://ergoemacs.org/emacs/modernization_upcase-word.html
|
|
||||||
(defun toggle-char-case (arg-move-point)
|
|
||||||
"Toggle the case of the char after point.
|
|
||||||
|
|
||||||
If prefix argument ARG-MOVE-POINT is non-nil, move point after the char."
|
|
||||||
(interactive "P")
|
|
||||||
(let ((case-fold-search nil))
|
|
||||||
(cond
|
|
||||||
((looking-at "[[:lower:]]") (upcase-region (point) (1+ (point))))
|
|
||||||
((looking-at "[[:upper:]]") (downcase-region (point) (1+ (point)))))
|
|
||||||
(cond
|
|
||||||
(arg-move-point (right-char)))))
|
|
||||||
|
|
||||||
; Copied from http://whattheemacsd.com/editing-defuns.el-01.html
|
|
||||||
(defun open-line-below ()
|
|
||||||
"Open a new line below point."
|
|
||||||
|
|
||||||
(interactive)
|
|
||||||
|
|
||||||
(end-of-line)
|
|
||||||
(newline)
|
|
||||||
(indent-for-tab-command))
|
|
||||||
|
|
||||||
(defun open-line-above ()
|
|
||||||
"Open a new line above point."
|
|
||||||
|
|
||||||
(interactive)
|
|
||||||
|
|
||||||
(beginning-of-line)
|
|
||||||
(newline)
|
|
||||||
(forward-line -1)
|
|
||||||
(indent-for-tab-command))
|
|
||||||
|
|
||||||
; Copied from http://whattheemacsd.com/file-defuns.el-01.html
|
|
||||||
(defun rename-current-buffer-file ()
|
|
||||||
"Renames current buffer and file it is visiting."
|
|
||||||
(interactive)
|
|
||||||
|
|
||||||
(let ((name (buffer-name))
|
|
||||||
(filename (buffer-file-name)))
|
|
||||||
(if (not (and filename (file-exists-p filename)))
|
|
||||||
(error "Buffer '%s' is not visiting a file!" name)
|
|
||||||
(let ((new-name (read-file-name "New name: " filename)))
|
|
||||||
(if (get-buffer new-name)
|
|
||||||
(error "A buffer named '%s' already exists!" new-name)
|
|
||||||
(rename-file filename new-name 1)
|
|
||||||
(rename-buffer new-name)
|
|
||||||
(set-visited-file-name new-name)
|
|
||||||
; TODO: this is suspicious for me…
|
|
||||||
(set-buffer-modified-p nil)
|
|
||||||
(message "File '%s' successfully renamed to '%s'"
|
|
||||||
name (file-name-nondirectory new-name)))))))
|
|
||||||
|
|
||||||
; Copied from http://whattheemacsd.com/file-defuns.el-02.html
|
|
||||||
(defun delete-current-buffer-file ()
|
|
||||||
"Remove file connected to current buffer and kill the buffer."
|
|
||||||
(interactive)
|
|
||||||
|
|
||||||
(let ((filename (buffer-file-name))
|
|
||||||
(name (buffer-name))
|
|
||||||
(buffer (current-buffer)))
|
|
||||||
(if (not (and filename (file-exists-p filename)))
|
|
||||||
(kill-buffer buffer)
|
|
||||||
(when (yes-or-no-p "Are you sure you want to remove this file? ")
|
|
||||||
(delete-file filename)
|
|
||||||
(kill-buffer buffer)
|
|
||||||
(message "File '%s' successfully removed" filename)))))
|
|
||||||
|
|
||||||
;; delete-char or close eshell
|
|
||||||
;; Copied from https://ryuslash.org/posts/C-d-to-close-eshell.html
|
|
||||||
(defun eshell-C-d ()
|
|
||||||
"Either call `delete-char' interactively or quit."
|
|
||||||
(interactive)
|
|
||||||
|
|
||||||
(condition-case err
|
|
||||||
(call-interactively #'delete-char)
|
|
||||||
(error (if (and (eq (car err) 'end-of-buffer)
|
|
||||||
(looking-back eshell-prompt-regexp nil))
|
|
||||||
(kill-buffer)
|
|
||||||
(signal (car err) (cdr err))))))
|
|
||||||
|
|
||||||
(defun æ-kill-or-copy-whole-line (kill)
|
|
||||||
"Kill or copy the whole line point is on.
|
|
||||||
|
|
||||||
If KILL is non-nil, the line gets killed. Otherwise, it gets just
|
|
||||||
copied to the kill ring."
|
|
||||||
(interactive "P")
|
|
||||||
|
|
||||||
(if kill
|
|
||||||
(kill-whole-line)
|
|
||||||
(let ((beginning (progn (beginning-of-line) (point)))
|
|
||||||
(end (progn (end-of-line) (point))))
|
|
||||||
(copy-region-as-kill beginning end))))
|
|
||||||
|
|
||||||
;; Inspired by Bozhidar Batsov's solution:
|
|
||||||
;;
|
|
||||||
;; http://emacsredux.com/blog/2013/05/22/smarter-navigation-to-the-beginning-of-a-line/
|
|
||||||
(defun gpolonkai/move-to-beginning-of-line ()
|
|
||||||
"Move to different beginnings of the line.
|
|
||||||
|
|
||||||
These are, in order:
|
|
||||||
|
|
||||||
- beginning of the visual line if `visual-line-mode' is active,
|
|
||||||
- the first non-whitespace (indentation),
|
|
||||||
- the actual beginning of the line.
|
|
||||||
|
|
||||||
This function will jump between the first character and the
|
|
||||||
indentation if used multiple times."
|
|
||||||
(interactive)
|
|
||||||
(let ((last-pos (point)))
|
|
||||||
(when visual-line-mode
|
|
||||||
(beginning-of-visual-line))
|
|
||||||
(when (= (point) last-pos)
|
|
||||||
(back-to-indentation))
|
|
||||||
(when (= (point) last-pos)
|
|
||||||
(beginning-of-line))
|
|
||||||
(when (and (eq major-mode 'org-mode)
|
|
||||||
(= (point) last-pos))
|
|
||||||
(org-beginning-of-line))
|
|
||||||
(when (= (point) last-pos)
|
|
||||||
(back-to-indentation))))
|
|
||||||
|
|
||||||
(defun gpolonkai/move-to-end-of-line ()
|
|
||||||
"Move to the end of the line.
|
|
||||||
|
|
||||||
If `visual-line-mode' is active, jump to the end of the visual
|
|
||||||
line first. Then jump to the actual end of the line."
|
|
||||||
(interactive)
|
|
||||||
(let ((last-pos (point)))
|
|
||||||
(when visual-line-mode
|
|
||||||
(end-of-visual-line))
|
|
||||||
(when (= (point) last-pos)
|
|
||||||
(end-of-line))
|
|
||||||
(when (and (eq major-mode 'org-mode)
|
|
||||||
(= (point) last-pos))
|
|
||||||
(org-end-of-line))))
|
|
||||||
|
|
||||||
(defvar gpolonkai/last-killed-buffer-file-name
|
|
||||||
nil
|
|
||||||
"The last killed buffer.
|
|
||||||
|
|
||||||
Used by `gpolonkai/kill-this-buffer' and `gpolonkai/undo-buffer-kill'.")
|
|
||||||
|
|
||||||
(defun gpolonkai/kill-this-buffer ()
|
|
||||||
"Kill the current buffer, but save the buffer file name so it can be undone."
|
|
||||||
(interactive)
|
|
||||||
(setq gpolonkai/last-killed-buffer-file-name (buffer-file-name))
|
|
||||||
(kill-this-buffer))
|
|
||||||
|
|
||||||
(defun gpolonkai/undo-buffer-kill ()
|
|
||||||
"Undo killing the last buffer.
|
|
||||||
|
|
||||||
Esentially it visits the file again."
|
|
||||||
(interactive)
|
|
||||||
(if gpolonkai/last-killed-buffer-file-name
|
|
||||||
(progn
|
|
||||||
(find-file gpolonkai/last-killed-buffer-file-name)
|
|
||||||
(setq gpolonkai/last-killed-buffer-file-name nil))
|
|
||||||
(message "The buffer last killed didn’t visit a file.")))
|
|
||||||
|
|
||||||
(provide 'buf-manipulation)
|
|
||||||
|
|
||||||
;;; buf-manipulation.el ends here
|
|
Loading…
Reference in New Issue
Block a user