Redo lib/defuns-org.el and org-mode keybindings

This commit is contained in:
Henrik Lissner 2015-11-19 00:53:38 -05:00
parent 7c4c9ea5da
commit ab8fad93e7
2 changed files with 170 additions and 172 deletions

View file

@ -1,81 +1,69 @@
;;; defuns-org.el ;;; defuns-org.el
;;;###autoload ;;;###autoload
(defun narf/org-cycle-hide-drawers (state) (defun narf/org-insert-item (direction)
"Re-hide all drawers after a visibility state change. Hides properties permanently."
(when (and (derived-mode-p 'org-mode)
(not (memq state '(overview folded contents))))
(save-excursion
(let* ((globalp (memq state '(contents all)))
(beg (if globalp (point-min) (point)))
(end (if globalp (point-max)
(if (eq state 'children)
(save-excursion (outline-next-heading) (point))
(org-end-of-subtree t)))))
(goto-char beg)
(while (re-search-forward org-drawer-regexp end t)
(save-excursion
(beginning-of-line 1)
(backward-char 1)
(let ((b (point)))
(if (re-search-forward
"^[ \t]*:END:"
(save-excursion (outline-next-heading) (point)) t)
(outline-flag-region b (point-at-eol) t)
(user-error ":END: line missing at position %s" b)))))))))
(defun narf--org-in-list-p ()
(and (save-excursion (search-backward-regexp "^ *\\([0-9]+[\.)]\\|[-*+]\\) "
(line-beginning-position) t))
(org-in-item-p)))
;;;###autoload
(defun narf/org-insert-item-after ()
"Inserts a new heading or item, depending on the context." "Inserts a new heading or item, depending on the context."
(interactive) (interactive)
(org-end-of-line) (let* ((context (org-element-lineage
(cond ((org-at-item-checkbox-p) (org-element-context)
(org-insert-heading) '(table table-row headline inlinetask
(insert "[ ] ")) item plain-list)
((narf--org-in-list-p) t))
(org-insert-heading)) (type (org-element-type context)))
((org-on-heading-p) (cond ((eq type 'item)
(org-insert-heading-respect-content)) (cl-case direction
(t ('below
(org-insert-heading-after-current) (org-end-of-line)
(delete-char 1))) (org-insert-heading))
(evil-insert-state)) ('above
(evil-first-non-blank)
;; TODO Check if this and -forward can be combined (org-insert-heading)))
;;;###autoload (when (org-element-property :checkbox context)
(defun narf/org-insert-item-before () (insert "[ ] ")))
"Inserts a new heading or item, depending on the context." ((memq type '(table table-row))
(interactive) (cl-case direction
(evil-first-non-blank) ('below
(cond ((org-at-item-checkbox-p) (org-table-insert-row))
(org-insert-heading) ('above
(insert "[ ] ")) (narf/org-table-prepend-row-or-shift-up))))
((narf--org-in-list-p) (t
(org-insert-heading)) (org-back-to-heading)
(t (org-insert-heading))) (let ((first-p (org-first-sibling-p))
(evil-insert-state)) (orig-char (point)))
(cl-case direction
('below
(org-insert-heading-after-current)
(unless first-p
(save-excursion
(goto-char orig-char)
(evil-insert-newline-above)))
(save-excursion
(evil-insert-newline-below)))
('above
(save-excursion
(evil-insert-newline-below))
(unless first-p
(save-excursion
(evil-insert-newline-above))))))))
(evil-append-line 1)))
;;;###autoload ;;;###autoload
(defun narf/org-toggle-checkbox () (defun narf/org-toggle-checkbox ()
(interactive) (interactive)
(save-excursion (let ((context (org-element-lineage (org-element-context) '(item) t)))
(org-end-of-line) (when context
(cond ((org-in-item-p) (org-end-of-line)
(if (search-backward-regexp "\\[[ +-]\\]" (line-beginning-position) t) (org-beginning-of-line)
(delete-char 4) (if (org-element-property :checkbox context)
(org-beginning-of-line))) (when (search-backward-regexp "\\[[ +-]\\]" (line-beginning-position) t)
(t (org-insert-heading))) (delete-char 4))
(insert "[ ] "))) (insert "[ ] ")))))
;;;###autoload ;;;###autoload
(defun narf/org-execute-at-point () (defun narf/org-dwim-at-point ()
(interactive) (interactive)
(let* ((context (org-element-lineage (let* ((scroll-pt (window-start))
(context (org-element-lineage
(org-element-context) (org-element-context)
'(table table-row clock comment comment-block footnote-definition '(table table-row clock comment comment-block footnote-definition
footnote-reference headline inlinetask keyword link footnote-reference headline inlinetask keyword link
@ -95,9 +83,15 @@
((and (memq type '(headline)) ((and (memq type '(headline))
(org-element-property :todo-type context)) (org-element-property :todo-type context))
(if (eq (org-element-property :todo-type context) 'done) (org-todo
(org-todo 'todo) (if (eq (org-element-property :todo-type context) 'done) 'todo 'done)))
(org-todo 'done)))
((memq type '(headline))
(org-remove-latex-fragment-image-overlays
(save-excursion (org-beginning-of-line) (point))
(save-excursion (org-end-of-subtree) (point)))
(org-map-entries 'org-toggle-latex-fragment t 'tree)
(narf/org-refresh-inline-images))
((memq type '(babel-call)) ((memq type '(babel-call))
(org-babel-lob-execute-maybe)) (org-babel-lob-execute-maybe))
@ -111,14 +105,18 @@
((memq type '(link)) ((memq type '(link))
(org-open-at-point)) (org-open-at-point))
(t (org-toggle-inline-images))))) (t (narf/org-refresh-inline-images)))
(set-window-start nil scroll-pt)))
;;;###autoload ;;;###autoload
(defun narf/org-toggle-inline-images-at-point () (defun narf/org-refresh-inline-images ()
(interactive) (interactive)
(if (> (length org-inline-image-overlays) 0) (if (> (length org-inline-image-overlays) 0)
(org-remove-inline-images) (org-remove-inline-images)
(org-display-inline-images nil t (line-beginning-position) (line-end-position)))) (org-display-inline-images
nil t
(save-excursion (org-back-to-heading) (point))
(save-excursion (org-end-of-subtree) (point)))))
;; Formatting shortcuts ;; Formatting shortcuts
;;;###autoload ;;;###autoload
@ -291,26 +289,26 @@ COUNT-FOOTNOTES? is non-nil."
;;;###autoload ;;;###autoload
(defun narf/org-table-append-row-or-shift-right () (defun narf/org-table-append-field-or-shift-right ()
(interactive) (interactive)
(org-shiftmetaright) (org-shiftmetaright)
(when (org-at-table-p) (org-metaright))) (when (org-at-table-p) (org-metaright)))
;;;###autoload ;;;###autoload
(defun narf/org-table-prepend-row-or-shift-left () (defun narf/org-table-prepend-field-or-shift-left ()
(interactive) (interactive)
(if (org-at-table-p) (if (org-at-table-p)
(org-shiftmetaright) (org-shiftmetaright)
(org-shiftmetaleft))) (org-shiftmetaleft)))
;;;###autoload ;;;###autoload
(defun narf/org-table-append-field-or-shift-down () (defun narf/org-table-append-row-or-shift-down ()
(interactive) (interactive)
(org-shiftmetadown) (org-shiftmetadown)
(when (org-at-table-p) (org-metadown))) (when (org-at-table-p) (org-metadown)))
;;;###autoload ;;;###autoload
(defun narf/org-table-prepend-field-or-shift-up () (defun narf/org-table-prepend-row-or-shift-up ()
(interactive) (interactive)
(if (org-at-table-p) (if (org-at-table-p)
(org-shiftmetadown) (org-shiftmetadown)

View file

@ -397,120 +397,120 @@
(define-text-object! "=" "=" "=") (define-text-object! "=" "=" "=")
(define-text-object! "~" "~" "~") (define-text-object! "~" "~" "~")
(define-key org-mode-map (kbd "RET") nil)
(define-key org-mode-map (kbd "C-j") nil)
(define-key org-mode-map (kbd "C-k") nil)
;; Keybinds ;; Keybinds
(bind! (bind! (:map org-mode-map
(:map org-mode-map :i [remap narf/inflate-space-maybe] 'org-self-insert-command
"RET" nil :i "RET" 'org-return-indent)
"C-j" nil
"C-k" nil
:i [remap narf/inflate-space-maybe] 'org-self-insert-command (:map evil-org-mode-map
:i "RET" 'org-return-indent) :ni "A-l" 'org-metaright
:ni "A-h" 'org-metaleft
:ni "A-k" 'org-metaup
:ni "A-j" 'org-metadown
;; Expand tables (or shiftmeta move)
:ni "A-L" 'narf/org-table-append-field-or-shift-right
:ni "A-H" 'narf/org-table-prepend-field-or-shift-left
:ni "A-K" 'narf/org-table-prepend-row-or-shift-up
:ni "A-J" 'narf/org-table-append-row-or-shift-down
(:map evil-org-mode-map :i "C-L" 'narf/org-table-next-field
:ni "A-l" 'org-metaright :i "C-H" 'narf/org-table-previous-field
:ni "A-h" 'org-metaleft :i "C-K" 'narf/org-table-previous-row
:ni "A-k" 'org-metaup :i "C-J" 'narf/org-table-next-row
:ni "A-j" 'org-metadown
;; Expand tables (or shiftmeta move)
:ni "A-L" 'narf/org-table-append-row-or-shift-right
:ni "A-H" 'narf/org-table-prepend-row-or-shift-left
:ni "A-K" 'narf/org-table-prepend-field-or-shift-up
:ni "A-J" 'narf/org-table-append-field-or-shift-down
:i "C-L" 'narf/org-table-next-field :i "C-e" 'org-end-of-line
:i "C-H" 'narf/org-table-previous-field :i "C-a" 'org-beginning-of-line
:i "C-K" 'narf/org-table-previous-row
:i "C-J" 'narf/org-table-next-row
:i "C-e" 'org-end-of-line :nv "j" 'evil-next-visual-line
:i "C-a" 'org-beginning-of-line :nv "k" 'evil-previous-visual-line
:v "<S-tab>" 'narf/yas-insert-snippet
:nv "j" 'evil-next-visual-line :i "M-a" (λ (evil-visual-state) (org-mark-element))
:nv "k" 'evil-previous-visual-line :n "M-a" 'org-mark-element
:v "<S-tab>" 'narf/yas-insert-snippet :v "M-a" 'mark-whole-buffer
:i "M-a" (λ (evil-visual-state) (org-mark-element)) :i "<M-return>" (λ (narf/org-insert-item 'below))
:n "M-a" 'org-mark-element :i "<S-M-return>" (λ (narf/org-insert-item 'above))
:v "M-a" 'mark-whole-buffer
:i "<M-return>" 'narf/org-insert-item-after :i "M-b" (λ (narf/org-surround "*")) ; bold
:i "<S-M-return>" 'narf/org-insert-item-before :i "M-u" (λ (narf/org-surround "_")) ; underline
:i "M-i" (λ (narf/org-surround "/")) ; italics
:i "M-`" (λ (narf/org-surround "+")) ; strikethrough
:i "M-b" (λ (narf/org-surround "*")) ; bold :v "M-b" "S*"
:i "M-u" (λ (narf/org-surround "_")) ; underline :v "M-u" "S_"
:i "M-i" (λ (narf/org-surround "/")) ; italics :v "M-i" "S/"
:i "M-`" (λ (narf/org-surround "+")) ; strikethrough :v "M-`" "S+"
:v "M-b" "S*" :n ",;" 'helm-org-in-buffer-headings
:v "M-u" "S_" :nv ",l" 'org-insert-link
:v "M-i" "S/" :n ",L" 'org-store-link
:v "M-`" "S+" ;; TODO narf/org-replace-link-by-link-description
:n ",=" 'org-align-all-tags
:n ",f" 'org-sparse-tree
:n ",?" 'org-tags-view
:n ",a" 'org-attach
:n ",A" 'org-agenda
:n ",D" 'org-time-stamp-inactive
:n ",i" 'narf/org-toggle-inline-images-at-point
:n ",t" 'org-todo
:n ",T" 'org-show-todo-tree
:n ",d" 'org-time-stamp
:n ",r" 'org-refile
:n ",s" 'org-schedule
:n ", SPC" 'narf/org-toggle-checkbox
:n ", RET" 'org-archive-subtree
:n ",;" 'helm-org-in-buffer-headings :n "za" 'org-cycle
:nv ",l" 'org-insert-link :n "zA" 'org-shifttab
:nv ",L" 'narf/org-replace-link-by-link-description :n "zm" 'hide-body
:n ",=" 'org-align-all-tags :n "zr" 'show-all
:n ",f" 'org-sparse-tree :n "zo" 'show-subtree
:n ",?" 'org-tags-view :n "zO" 'show-all
:n ",a" 'org-attach :n "zc" 'hide-subtree
:n ",A" 'org-agenda :n "zC" 'hide-all
:n ",D" 'org-time-stamp-inactive
:n ",i" 'narf/org-toggle-inline-images-at-point
:n ",t" 'org-todo
:n ",T" 'org-show-todo-tree
:n ",d" 'org-time-stamp
:n ",r" 'org-refile
:n ",s" 'org-schedule
:n ",SPC" 'narf/org-toggle-checkbox
:n ",<return>" 'org-archive-subtree
:n "za" 'org-cycle :m "]]" (λ (call-interactively 'org-forward-heading-same-level) (org-beginning-of-line))
:n "zA" 'org-shifttab :m "[[" (λ (call-interactively 'org-backward-heading-same-level) (org-beginning-of-line))
:n "zm" 'hide-body :m "]l" 'org-next-link
:n "zr" 'show-all :m "[l" 'org-previous-link
:n "zo" 'show-subtree
:n "zO" 'show-all
:n "zc" 'hide-subtree
:n "zC" 'hide-all
:m "]]" (λ (call-interactively 'org-forward-heading-same-level) (org-beginning-of-line)) :n "RET" 'narf/org-dwim-at-point
:m "[[" (λ (call-interactively 'org-backward-heading-same-level) (org-beginning-of-line))
:m "]l" 'org-next-link
:m "[l" 'org-previous-link
:n "RET" 'narf/org-execute-at-point :m "gh" 'outline-up-heading
:m "gj" (λ (hide-subtree) (call-interactively 'org-forward-heading-same-level) (show-children))
:m "gk" (λ (hide-subtree) (call-interactively 'org-backward-heading-same-level) (show-children))
:m "gl" (λ (call-interactively 'outline-next-visible-heading) (show-children))
:m "gh" 'outline-up-heading :n "go" 'org-open-at-point
:m "gj" (λ (hide-subtree) (call-interactively 'org-forward-heading-same-level) (show-children)) :n "gO" (λ (let ((org-link-frame-setup (append '((file . find-file-other-window)) org-link-frame-setup))
:m "gk" (λ (hide-subtree) (call-interactively 'org-backward-heading-same-level) (show-children)) (org-file-apps '(("\\.org$" . emacs)
:m "gl" (λ (call-interactively 'outline-next-visible-heading) (show-children)) (t . "qlmanage -p \"%s\""))))
(call-interactively 'org-open-at-point)))
:n "go" 'org-open-at-point :n "gQ" 'org-fill-paragraph
:n "gO" (λ (let ((org-link-frame-setup (append '((file . find-file-other-window)) org-link-frame-setup)) :m "$" 'org-end-of-line
(org-file-apps '(("\\.org$" . emacs) :m "^" 'org-beginning-of-line
(t . "qlmanage -p \"%s\"")))) :n "<" 'org-metaleft
(call-interactively 'org-open-at-point))) :n ">" 'org-metaright
:v "<" (λ (org-metaleft) (evil-visual-restore))
:v ">" (λ (org-metaright) (evil-visual-restore))
:n "-" 'org-cycle-list-bullet
:n "<S-M-return>" 'narf/org-insert-item-before
:n "<M-return>" 'narf/org-insert-item-after
:n [tab] 'org-cycle)
:n "gQ" 'org-fill-paragraph (:after org-agenda
:m "$" 'org-end-of-line (:map org-agenda-mode-map
:m "^" 'org-beginning-of-line :e "<escape>" 'org-agenda-Quit
:n "<" 'org-metaleft :e "C-j" 'org-agenda-next-item
:n ">" 'org-metaright :e "C-k" 'org-agenda-previous-item
:v "<" (λ (org-metaleft) (evil-visual-restore)) :e "C-n" 'org-agenda-next-item
:v ">" (λ (org-metaright) (evil-visual-restore)) :e "C-p" 'org-agenda-previous-item)))
:n "-" 'org-cycle-list-bullet
:n "<S-M-return>" 'narf/org-insert-item-before
:n "<M-return>" 'narf/org-insert-item-after
:n [tab] 'org-cycle)
(:after org-agenda
(:map org-agenda-mode-map
:e "<escape>" 'org-agenda-Quit
:e "C-j" 'org-agenda-next-item
:e "C-k" 'org-agenda-previous-item
:e "C-n" 'org-agenda-next-item
:e "C-p" 'org-agenda-previous-item)))
(progn ;; Org hacks (progn ;; Org hacks
;; Redefining this function so it doesn't open that "links" help buffer ;; Redefining this function so it doesn't open that "links" help buffer