From b1e707d5544da0811f602eed125d8d5e64accd65 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Fri, 11 Oct 2024 20:13:06 +1100 Subject: [emacs] Some changes from the past months * emacs/.emacs.d/init/ycp-complete.el: comment why corfu does not work well with gud * emacs/.emacs.d/init/ycp-editing.el: bind my-write-file to C-x C-w; change viper-syntax-preference to 'extended * emacs/.emacs.d/init/ycp-org.el: comment on tab-width * emacs/.emacs.d/lisp/my/my-buffer.el: add a function `my-save-text-and-switch-to-buffer' that Save TEXT to FILE-NAME and switch to the buffer * emacs/.emacs.d/lisp/my/my-editing.el: renamed a function; and override `viper-forward-word-kernel' and `viper-backward-word-kernel' (why?); add function `my-write-file', which is the same as `write-file', but keep the old buffer and remain there. * emacs/.emacs.d/lisp/my/my-mariadb.el: remove sleep in `my-gdb-maria-spider'; add a function to fetch source of a mariadb kb entry * emacs/.emacs.d/lisp/my/my-net.el: extract out local I/O and buffer logic from `my-fetch-url-save-and-switch' to `my-save-text-and-switch-to-buffer'. * emacs/.emacs.d/lisp/my/my-org-jira.el: fix formatting of `my-org-jira--render-issue', and add affected-versions, fix-versions and related-issues for rendering * emacs/.emacs.d/lisp/my/my-prog.el: ensure indent-tabs-mode is by default nil in prog-modes, to protect from c-style-alist overriding * mariadb-server/.dir-locals.el: Moved from sql/.dir-locals.el --- emacs/.emacs.d/init/ycp-complete.el | 1 + emacs/.emacs.d/init/ycp-editing.el | 4 +- emacs/.emacs.d/init/ycp-org.el | 2 + emacs/.emacs.d/lisp/my/my-buffer.el | 13 +++ emacs/.emacs.d/lisp/my/my-editing.el | 50 ++++++++++- emacs/.emacs.d/lisp/my/my-mariadb.el | 23 ++++- emacs/.emacs.d/lisp/my/my-net.el | 13 +-- emacs/.emacs.d/lisp/my/my-org-jira.el | 163 +++++++++++++++++----------------- emacs/.emacs.d/lisp/my/my-prog.el | 1 + 9 files changed, 172 insertions(+), 98 deletions(-) (limited to 'emacs') diff --git a/emacs/.emacs.d/init/ycp-complete.el b/emacs/.emacs.d/init/ycp-complete.el index 16ddbfe..c088356 100644 --- a/emacs/.emacs.d/init/ycp-complete.el +++ b/emacs/.emacs.d/init/ycp-complete.el @@ -155,6 +155,7 @@ #'my-corfu-enable-always-in-minibuffer 1) ;;; corfu does not work well in gud as it "flushes" completion ;;; suggestions to the buffer + ;;; https://github.com/minad/corfu/issues/157 (setq global-corfu-modes '((not gud-mode) t)) ) diff --git a/emacs/.emacs.d/init/ycp-editing.el b/emacs/.emacs.d/init/ycp-editing.el index 81a46b1..8e6a49e 100644 --- a/emacs/.emacs.d/init/ycp-editing.el +++ b/emacs/.emacs.d/init/ycp-editing.el @@ -94,6 +94,7 @@ "" #'backward-kill-sexp "C-M-/" #'my-mark-backward-up-list "C-M-k" #'my-kill-sexp-or-comment + "C-x C-w" #'my-write-file ) (electric-pair-mode) (my-add-hooks #'my-non-special-modes-setup '(text-mode-hook prog-mode-hook)) @@ -108,7 +109,8 @@ (setq viper-mode nil) (my-package viper - (:delay 60)) + (:delay 60) + (setq viper-syntax-preference 'extended)) (define-key global-map [f2] 'revert-buffer) diff --git a/emacs/.emacs.d/init/ycp-org.el b/emacs/.emacs.d/init/ycp-org.el index 2481cab..430335a 100644 --- a/emacs/.emacs.d/init/ycp-org.el +++ b/emacs/.emacs.d/init/ycp-org.el @@ -58,6 +58,8 @@ my-org-doc-dir) ;; disable auto-indent on RET (add-hook 'org-mode-hook (lambda () (electric-indent-local-mode -1))) + ;; tab-width 8 is needed for newer versions of org-mode, which I am + ;; not using due to performance issues (add-hook 'org-mode-hook (lambda () (setq-local tab-width 2))) ;; The world does not end by 2038 (hopefully) diff --git a/emacs/.emacs.d/lisp/my/my-buffer.el b/emacs/.emacs.d/lisp/my/my-buffer.el index ef988f8..21401b5 100644 --- a/emacs/.emacs.d/lisp/my/my-buffer.el +++ b/emacs/.emacs.d/lisp/my/my-buffer.el @@ -458,5 +458,18 @@ With double prefix arguments, create a new indirect buffer." (4 (my-switch-indirect-buffer)) (_ (my-cycle-indirect-buffer)))) +(defun my-save-text-and-switch-to-buffer (text file-name) + "Save TEXT to FILE-NAME and switch to buffer." + (let ((buffer (find-file-noselect file-name)) + (coding-system-for-write 'utf-8)) + (with-current-buffer buffer + (let ((inhibit-read-only t)) + (erase-buffer) + (insert text)) + (goto-char (point-min)) + (save-buffer) + (revert-buffer t t)) + (switch-to-buffer buffer))) + (provide 'my-buffer) ;;; my-buffer.el ends here diff --git a/emacs/.emacs.d/lisp/my/my-editing.el b/emacs/.emacs.d/lisp/my/my-editing.el index aa65ba1..0775063 100644 --- a/emacs/.emacs.d/lisp/my/my-editing.el +++ b/emacs/.emacs.d/lisp/my/my-editing.el @@ -90,7 +90,7 @@ (interactive) (zap-up-to-char -1 ?/)) -(defun my-toggle-forward-word-viper-symbol () +(defun my-toggle-forward-word-symbol () (interactive) (require 'viper) (cond ((eq (lookup-key (current-global-map) "\M-f") 'forward-word) @@ -102,14 +102,47 @@ (progn (define-key global-map "\M-f" 'forward-symbol) (define-key global-map "\M-b" - (lambda () (interactive) - (forward-symbol -1))) + (lambda () (interactive) + (forward-symbol -1))) (message "M-f is forward-symbol"))) (t (progn (define-key global-map "\M-f" 'forward-word) (define-key global-map "\M-b" 'backward-word) (message "M-f is forward-word"))))) +;;; todo: move to my-viper +;;; do not skip underscore +(defun viper-forward-word-kernel (val) + (while (> val 0) + (cond ((viper-looking-at-alpha) + (viper-skip-alpha-forward "") + (viper-skip-separators t)) + ((viper-looking-at-separator) + (viper-skip-separators t)) + ((not (viper-looking-at-alphasep)) + (viper-skip-nonalphasep-forward) + (viper-skip-separators t))) + (setq val (1- val)))) + +(defun viper-backward-word-kernel (val) + (while (> val 0) + (viper-backward-char-carefully) + (cond ((viper-looking-at-alpha) + (viper-skip-alpha-backward "")) + ((viper-looking-at-separator) + (forward-char) + (viper-skip-separators nil) + (viper-backward-char-carefully) + (cond ((viper-looking-at-alpha) + (viper-skip-alpha-backward "_")) + ((not (viper-looking-at-alphasep)) + (viper-skip-nonalphasep-backward)) + ((bobp)) ; could still be at separator, but at beg of buffer + (t (forward-char)))) + ((not (viper-looking-at-alphasep)) + (viper-skip-nonalphasep-backward))) + (setq val (1- val)))) + (defun my--duplicate-buffer-substring (beg end &optional indent) "Duplicate buffer substring between BEG and END positions. With optional INDENT, run `indent-for-tab-command' after @@ -525,5 +558,16 @@ With an prefix-arg, copy the file name relative to project root." (defun my-turn-off-truncate-lines () (setq truncate-lines nil)) +(defun my-write-file () + "Same as `write-file', but keep the old buffer and remain there. + +In other words, create a new buffer with the same content and +execute `write-file', then switch back to the current buffer." + (interactive) + (let ((old-buffer (current-buffer))) + (with-temp-buffer + (insert-buffer-substring old-buffer) + (call-interactively 'write-file)))) + (provide 'my-editing) ;;; my-editing.el ends here diff --git a/emacs/.emacs.d/lisp/my/my-mariadb.el b/emacs/.emacs.d/lisp/my/my-mariadb.el index 52ca8bc..6b0e06b 100644 --- a/emacs/.emacs.d/lisp/my/my-mariadb.el +++ b/emacs/.emacs.d/lisp/my/my-mariadb.el @@ -56,14 +56,14 @@ (when (and (buffer-live-p gud-comint-buffer) (get-buffer-process gud-comint-buffer)) (my-gdb-quit)) - (sleep-for 1) + ;; (sleep-for 1) (my-gdb (format "rr replay %s -d %s" (expand-file-name (replace-regexp-in-string "/src" "/build/mysql-test/var/log/mysqld.1.1.rr/latest-trace" - ;; "/build/mysql-test/var/log/mysqld.3.1.rr/latest-trace" + ;; "/build/mysql-test/var/log/mysqld.2.2.rr/latest-trace" (project-root (project-current t)))) (expand-file-name "~/bin/gdb-mi.sh")))) @@ -251,5 +251,24 @@ enum spider_malloc_id { nil t) (tempel-insert 'ps))) +(defun my-mariadb-fetch-kb-source (url) + "Fetches the source to an maridb kb entry at URL. + +The source is saved in a .wiki file under the /tmp dir, and it +switches to the buffer." + (interactive "sURL: ") + (let* ((term + (progn + (string-match "https://mariadb.com/kb/en/\\([^/]+\\)/" url) + (match-string 1 url))) + (source + (dom-text + (dom-by-id + (my-url-fetch-dom + (format "https://mariadb.com/kb/en/%s/+source/" term)) + "answer_source"))) + (file-name (format "/tmp/%s.wiki" term))) + (my-save-text-and-switch-to-buffer source file-name))) + (provide 'my-mariadb) ;;; my-mariadb.el ends here diff --git a/emacs/.emacs.d/lisp/my/my-net.el b/emacs/.emacs.d/lisp/my/my-net.el index 0eafb7a..1f1cbc6 100644 --- a/emacs/.emacs.d/lisp/my/my-net.el +++ b/emacs/.emacs.d/lisp/my/my-net.el @@ -80,18 +80,9 @@ It checks the STATUS, and if it is ok, saves the payload to FILE-NAME." (when (plist-get status :error) (error "My fetch failed: %s" (plist-get status :error))) (my-delete-http-header) - (let ((to-insert (buffer-string)) - (buffer (find-file-noselect file-name)) - (coding-system-for-write 'utf-8)) + (let ((to-insert (buffer-string))) (kill-buffer) - (with-current-buffer buffer - (let ((inhibit-read-only t)) - (erase-buffer) - (insert to-insert)) - (goto-char (point-min)) - (save-buffer) - (revert-buffer t t)) - (switch-to-buffer buffer)) + (my-save-text-and-switch-to-buffer to-insert file-name)) ) (defun my-kill-http-header () diff --git a/emacs/.emacs.d/lisp/my/my-org-jira.el b/emacs/.emacs.d/lisp/my/my-org-jira.el index 7ff7738..8f716c3 100644 --- a/emacs/.emacs.d/lisp/my/my-org-jira.el +++ b/emacs/.emacs.d/lisp/my/my-org-jira.el @@ -34,91 +34,92 @@ "Render single ISSUE." ;; (org-jira-log "Rendering issue from issue list") ;; (org-jira-log (org-jira-sdk-dump Issue)) + ;; (print Issue) (with-slots (filename proj-key issue-id summary status priority headline id) Issue (let (p) (with-current-buffer (org-jira--get-project-buffer Issue) (org-jira-freeze-ui - (org-jira-maybe-activate-mode) - (org-jira--maybe-render-top-heading proj-key) - (setq p (org-find-entry-with-id issue-id)) - (save-restriction - (if (and p (>= p (point-min)) - (<= p (point-max))) - (progn - (goto-char p) - (forward-thing 'whitespace) - (org-jira-kill-line)) - (goto-char (point-max)) - (unless (looking-at "^") - (insert "\n")) - (insert "** ")) - (org-jira-insert - (concat (org-jira-get-org-keyword-from-status status) - " " - (org-jira-get-org-priority-cookie-from-issue priority) - issue-id " " headline)) - (save-excursion - (unless (search-forward "\n" (point-max) 1) - (insert "\n"))) - (org-narrow-to-subtree) - (save-excursion - (org-back-to-heading t) - (org-set-tags-to (replace-regexp-in-string "-" "_" issue-id))) - (mapc (lambda (entry) - (let ((val (slot-value Issue entry))) - (when (or (and val (not (string= val ""))) - (eq entry 'assignee)) ;; Always show assignee - (org-jira-entry-put (point) (symbol-name entry) val)))) - '(assignee filename reporter type type-id priority labels resolution status components created updated sprint)) - - (org-jira-entry-put (point) "ID" issue-id) - (org-jira-entry-put (point) "CUSTOM_ID" issue-id) - - ;; Insert the duedate as a deadline if it exists - (when org-jira-deadline-duedate-sync-p - (let ((duedate (oref Issue duedate))) - (when (> (length duedate) 0) - (org-deadline nil duedate)))) - - (mapc - (lambda (heading-entry) - (ensure-on-issue-id-with-filename issue-id filename - (let* ((entry-heading - (concat (symbol-name heading-entry) - (format ": [[%s][%s]]" - (concat jiralib-url "/browse/" issue-id) issue-id)))) - (setq p (org-find-exact-headline-in-buffer entry-heading)) - (if (and p (>= p (point-min)) - (<= p (point-max))) - (progn - (goto-char p) - (org-narrow-to-subtree) - (goto-char (point-min)) - (forward-line 1) - (delete-region (point) (point-max))) - (if (org-goto-first-child) - (org-insert-heading) - (goto-char (point-max)) - (org-insert-subheading t)) - (org-jira-insert entry-heading "\n")) - - ;; Insert 2 spaces of indentation so Jira markup won't cause org-markup - (org-jira-insert - (replace-regexp-in-string - "^" " " - (format "%s" (slot-value Issue heading-entry))))))) - '(description)) - - (when org-jira-download-comments - (org-jira-update-comments-for-issue Issue) - - ;; FIXME: Re-enable when attachments are not erroring. - ;;(org-jira-update-attachments-for-current-issue) - ) - - ;; only sync worklog clocks when the user sets it to be so. - (when org-jira-worklog-sync-p - (org-jira-update-worklogs-for-issue issue-id filename)))))))) + (org-jira-maybe-activate-mode) + (org-jira--maybe-render-top-heading proj-key) + (setq p (org-find-entry-with-id issue-id)) + (save-restriction + (if (and p (>= p (point-min)) + (<= p (point-max))) + (progn + (goto-char p) + (forward-thing 'whitespace) + (org-jira-kill-line)) + (goto-char (point-max)) + (unless (looking-at "^") + (insert "\n")) + (insert "** ")) + (org-jira-insert + (concat (org-jira-get-org-keyword-from-status status) + " " + (org-jira-get-org-priority-cookie-from-issue priority) + issue-id " " headline)) + (save-excursion + (unless (search-forward "\n" (point-max) 1) + (insert "\n"))) + (org-narrow-to-subtree) + (save-excursion + (org-back-to-heading t) + (org-set-tags-to (replace-regexp-in-string "-" "_" issue-id))) + (mapc (lambda (entry) + (let ((val (slot-value Issue entry))) + (when (or (and val (not (string= val ""))) + (eq entry 'assignee)) ;; Always show assignee + (org-jira-entry-put (point) (symbol-name entry) val)))) + '(assignee filename reporter type type-id priority affected-versions fix-versions labels resolution status components created updated sprint related-issues)) + + (org-jira-entry-put (point) "ID" issue-id) + (org-jira-entry-put (point) "CUSTOM_ID" issue-id) + + ;; Insert the duedate as a deadline if it exists + (when org-jira-deadline-duedate-sync-p + (let ((duedate (oref Issue duedate))) + (when (> (length duedate) 0) + (org-deadline nil duedate)))) + + (mapc + (lambda (heading-entry) + (ensure-on-issue-id-with-filename issue-id filename + (let* ((entry-heading + (concat (symbol-name heading-entry) + (format ": [[%s][%s]]" + (concat jiralib-url "/browse/" issue-id) issue-id)))) + (setq p (org-find-exact-headline-in-buffer entry-heading)) + (if (and p (>= p (point-min)) + (<= p (point-max))) + (progn + (goto-char p) + (org-narrow-to-subtree) + (goto-char (point-min)) + (forward-line 1) + (delete-region (point) (point-max))) + (if (org-goto-first-child) + (org-insert-heading) + (goto-char (point-max)) + (org-insert-subheading t)) + (org-jira-insert entry-heading "\n")) + + ;; Insert 2 spaces of indentation so Jira markup won't cause org-markup + (org-jira-insert + (replace-regexp-in-string + "^" " " + (format "%s" (slot-value Issue heading-entry))))))) + '(description)) + + (when org-jira-download-comments + (org-jira-update-comments-for-issue Issue) + + ;; FIXME: Re-enable when attachments are not erroring. + ;;(org-jira-update-attachments-for-current-issue) + ) + + ;; only sync worklog clocks when the user sets it to be so. + (when org-jira-worklog-sync-p + (org-jira-update-worklogs-for-issue issue-id filename)))))))) ;; Overload `org-jira-update-worklogs-from-org-clocks'. (defun my-org-jira-update-worklogs-from-org-clocks () diff --git a/emacs/.emacs.d/lisp/my/my-prog.el b/emacs/.emacs.d/lisp/my/my-prog.el index 9c75a22..ffb0d26 100644 --- a/emacs/.emacs.d/lisp/my/my-prog.el +++ b/emacs/.emacs.d/lisp/my/my-prog.el @@ -461,6 +461,7 @@ left and the source buffer on the right. (auto-fill-mode) (display-line-numbers-mode) (setq tab-width 2) + (setq indent-tabs-mode nil) (bug-reference-prog-mode) (flyspell-prog-mode)) -- cgit v1.2.3