From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Michal Nazarewicz Newsgroups: gmane.emacs.devel Subject: [PATCHv4 3/4] Add `remember-notes' function to store notes across Emacs restarts. Date: Mon, 24 Jun 2013 14:35:47 +0200 Message-ID: References: NNTP-Posting-Host: plane.gmane.org X-Trace: ger.gmane.org 1372077442 24707 80.91.229.3 (24 Jun 2013 12:37:22 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 24 Jun 2013 12:37:22 +0000 (UTC) Cc: emacs-devel@gnu.org To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon Jun 24 14:37:23 2013 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Ur61L-00047Z-As for ged-emacs-devel@m.gmane.org; Mon, 24 Jun 2013 14:37:23 +0200 Original-Received: from localhost ([::1]:38647 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ur61K-0001ul-VJ for ged-emacs-devel@m.gmane.org; Mon, 24 Jun 2013 08:37:22 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:46526) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ur60W-00006t-Hc for emacs-devel@gnu.org; Mon, 24 Jun 2013 08:36:39 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Ur60Q-0004ec-7j for emacs-devel@gnu.org; Mon, 24 Jun 2013 08:36:32 -0400 Original-Received: from mail-la0-x232.google.com ([2a00:1450:4010:c03::232]:48383) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ur60P-0004cu-TB for emacs-devel@gnu.org; Mon, 24 Jun 2013 08:36:26 -0400 Original-Received: by mail-la0-f50.google.com with SMTP id dy20so10046230lab.23 for ; Mon, 24 Jun 2013 05:36:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references:in-reply-to:references; bh=lTNYKtqTAXq9IW/qiwCHmVNla5TpLrtf+aDdEQKmNb0=; b=C4qIVFYvaA85wIYXA1Vlyq67LdaFHJPVQM7ix4NwcTX++3jJUlF3vZnQgism2IrNPW oFNIAw2hGoJZa8Qtj10qDigSbXV660QsifNYDHKDFBjHKJcFzGVZ+H5dpIc8OaJDV5Yp fpE1mZQ4jD5yjmFPHtbuBJXEn473KMUt/tFJXCoyHXuRBS7xHUdI88mksyZX+g6LY9oz w8UhBG9S7ojP/tYFxvTvXekMkR4tBqtWEvC65zGzGrYxB9LLvhZwpmT6NB6zTUDWAXZr mcs3of/UiJry05f3W67f9kmIM4VrEZ/QwbUxRaynvMZqEEdChl1P21NQk2ZQBNF4OPlS ZfdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references:in-reply-to:references:x-gm-message-state; bh=lTNYKtqTAXq9IW/qiwCHmVNla5TpLrtf+aDdEQKmNb0=; b=bfqa4qqA4j8z6MKLuV+vVO01alSWsJHQvQQlUiFypBn1NwI+pboBi6VEnDYFxIqvfC aBXFbfz79D4S0oGjfKJfN8DVwWDhYruZHZR+O2vJqRrTvFoqF/KIzzX8/+ZWHKJegHdq mk3wNVU+htpOYLm3DzZvfXeColFaQhWmbFnD++7J+tN6uGCq/2rSgLlnWWGXeCNK8Yu8 NgGtUMJZTs5w5bk2iiCIv1z43oFv+dgQGMq6hb7qfHhGsKOYJ03fsGJkzPtNMRorihBi qN3iqwyrxzvCB0hWXlAls262wqAOEdtQ6YMpzGK5cHGiHnY8YxEsDo2V9DXaA/u7y54z wa/w== X-Received: by 10.112.150.231 with SMTP id ul7mr12914899lbb.92.1372077384868; Mon, 24 Jun 2013 05:36:24 -0700 (PDT) Original-Received: from mpn-glaptop.corp.google.com ([2620:0:105f:301:2ddc:c978:be37:615e]) by mx.google.com with ESMTPSA id u1sm6672296lag.5.2013.06.24.05.36.23 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 24 Jun 2013 05:36:23 -0700 (PDT) X-Mailer: git-send-email 1.8.3.1 In-Reply-To: In-Reply-To: Original-References: X-Gm-Message-State: ALoCoQnv5xGXEiXyurecqMn0ds0cI9jz49V3z0rDop08+wi3wDqxY0OWQNteyC3oYOh9oKvfWtQposdw1xHhMz+0kDq6B5OgBRleFBbOjoLnSnWCQebEFw3cAknyUUKM6jlec4csIdIl2mYa2ntdg/Xr3t2TIg1YQVqRDYAaxX1SfXRvZHfwDLGzpwPSqR+pTIUvlf8G3nDn X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:4010:c03::232 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:160933 Archived-At: You may think of it as a *scratch* buffer whose content is preserved. In fact, it was designed as a replacement for *scratch* buffer and can be used that way by setting `initial-buffer-choice' to 'notes an `notes-buffer-name' to "*scratch*". Without the second change, *scratch* buffer will still be there for notes that do not need to be preserved. Add `remember-notes' function to store random notes across Emacs restarts. * remember.el (remember-data-file): Added :set callback to affect notes buffer (if any). (remember-notes, toggle-remember-notes): New functions for showing the notes buffer. (remember-notes-buffer-name, bury-remember-notes-on-kill): New defcustoms for the `remember-notes' function. (remember-notes--buffer, remember-notes-map): New variables for the `remember-notes' function. (remember-notes--kill-buffer-query): New helper functions. * startup.el (initial-buffer-choice): Added notes to custom type. * window.el (save-and-bury-buffer): New function doing what the name says. --- etc/NEWS | 8 ++++ lisp/ChangeLog | 17 ++++++++ lisp/startup.el | 3 +- lisp/textmodes/remember.el | 104 ++++++++++++++++++++++++++++++++++++++++++++- lisp/window.el | 8 ++++ 5 files changed, 138 insertions(+), 2 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index d736454..6a2d3f2 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -87,6 +87,14 @@ simply disabling Transient Mark mode does the same thing. ** `initial-buffer-choice' can now specify a function to set up the initial buffer. +** `remember-notes' creates a buffer whose content is saved on kill-emacs. +You may think of it as a *scratch* buffer whose content is preserved. +In fact, it was designed as a replacement for *scratch* buffer and can +be used that way by setting `initial-buffer-choice' to 'remember-notes +and `remember-notes-buffer-name' to "*scratch*". Without the second +change, *scratch* buffer will still be there for notes that do not +need to be preserved. + ** `write-region-inhibit-fsync' now defaults to t in batch mode. ** ACL support has been added. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 75b9533..a7b8fd1 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,22 @@ 2013-06-24 Michal Nazarewicz + Add `remember-notes' function to store random notes across Emacs + restarts. + * remember.el (remember-data-file): Added :set callback to affect + notes buffer (if any). + (remember-notes, toggle-remember-notes): New functions for showing + the notes buffer. + (remember-notes-buffer-name, bury-remember-notes-on-kill): New + defcustoms for the `remember-notes' function. + (remember-notes--buffer, remember-notes-map): New variables for + the `remember-notes' function. + (remember-notes--kill-buffer-query): New helper functions. + * startup.el (initial-buffer-choice): Added notes to custom type. + * window.el (save-and-bury-buffer): New function doing what the + name says. + +2013-06-24 Michal Nazarewicz + * remember.el (remember-append-to-file): Function used `find-buffer-visiting' to check whether a file visiting `remember-data-file` existed but then `get-buffer-visiting' to diff --git a/lisp/startup.el b/lisp/startup.el index 77b2bce..44eea77 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -53,7 +53,8 @@ or directory when no target file is specified." (const :tag "Startup screen" nil) (directory :tag "Directory" :value "~/") (file :tag "File" :value "~/.emacs") - (function :tag "Function") + (const :tag "Notes buffer" remember-notes) + (function :tag "Function") (const :tag "Lisp scratch buffer" t)) :version "24.4" :group 'initialization) diff --git a/lisp/textmodes/remember.el b/lisp/textmodes/remember.el index a14a34c..aa10aeb 100644 --- a/lisp/textmodes/remember.el +++ b/lisp/textmodes/remember.el @@ -381,9 +381,22 @@ Subject: %s\n\n" ;; Remembering to plain files +(defvar remember-notes--buffer nil + "The notes buffer.") + (defcustom remember-data-file (locate-user-emacs-file "notes" ".notes") - "The file in which to store unprocessed data." + "The file in which to store unprocessed data. +When set via customize, visited file of the notes buffer (if it +exists) is changed. This is only of importance if you are using +`remember-notes'." :type 'file + :set (lambda (symbol value) + (set-default symbol value) + (when (buffer-live-p remember-notes--buffer) + (with-current-buffer remember-notes--buffer + (setq buffer-file-name + (expand-file-name remember-data-file))))) + :initialize 'custom-initialize-default :group 'remember) (defcustom remember-leader-text "** " @@ -554,4 +567,93 @@ the data away for latter retrieval, and possible indexing. \\{remember-mode-map}" (set-keymap-parent remember-mode-map nil)) +;; Buffer showing the notes: + +(defcustom remember-notes-buffer-name "*notes*" + "Name of the notes buffer. +Setting it to *scratch* will hijack the *scratch* buffer for the +purpose of storing notes." + :type 'string + :group 'remember) + +(defcustom initial-remember-notes-major-mode t + "Major mode to set to notes buffer when it's created. +If set to t will use the same mode as `initial-major-mode'." + :type '(choice (const :tag "Same as `initial-major-mode'" t) + (function :tag "Major mode" text-mode)) + :group 'remember) + +(defcustom bury-remember-notes-on-kill t + "Whether to bury notes buffer instead of killing." + :type 'boolean + :group 'remember) + +(defvar remember-notes-map + (let ((map (make-sparse-keymap))) + (define-key map "\C-c\C-c" 'save-and-bury-buffer) + map) + "A keymap used in notes buffer.") + +;;;###autoload +(defun remember-notes () + "Creates notes buffer and switches to it if called interactively. + +If a notes buffer created by a previous invocation of this +function already exist, it will be returned. Otherwise a new +buffer will be created whose content will be read from file +pointed by `remember-data-file'. If a buffer visiting this file +already exist, that buffer will be used instead of creating a new +one (see `find-file-noselect' function for more details). + +Name of the created buffer is taken from `remember-notes-buffer-name' +variable and if a buffer with that name already exist (but was not +created by this function), it will be first killed. +\\ +`remember-notes-map' is active in the notes buffer which by default +contains only one \\[save-and-bury-buffer] binding which saves and +buries the buffer. + +Function returns notes buffer. When called interactively, +switches to it as well. + +Notes buffer is meant for keeping random notes which you'd like to +preserve across Emacs restarts. The notes will be stored in the +`remember-data-file'." + (interactive) + (unless (buffer-live-p remember-notes--buffer) + (setq remember-notes--buffer (find-file-noselect remember-data-file)) + (with-current-buffer remember-notes--buffer + (let ((buf (get-buffer remember-notes-buffer-name))) + (if (or (not buf) (kill-buffer buf)) + (rename-buffer remember-notes-buffer-name))) + (funcall (if (eq initial-remember-notes-major-mode t) + initial-major-mode + initial-remember-notes-major-mode)) + (setq buffer-save-without-query t) + (add-hook 'kill-buffer-query-functions 'remember-notes--kill-buffer-query) + (setq minor-mode-overriding-map-alist + (cons (cons 'remember-notes--buffer remember-notes-map) + minor-mode-overriding-map-alist)))) + (when (called-interactively-p 'all) + (switch-to-buffer remember-notes--buffer)) + remember-notes--buffer) + +;;;###autoload +(defun toggle-remember-notes () + "Switches to notes buffer unless already there in which case buries it. +For more information about notes buffer see `remember-notes' function." + (interactive) + (if (eq (current-buffer) remember-notes--buffer) + (bury-buffer) + (switch-to-buffer (remember-notes)))) + +(defun remember-notes--kill-buffer-query () + (if (not (eq (current-buffer) remember-notes--buffer)) + t + (when (buffer-modified-p) + (save-buffer)) + (if bury-remember-notes-on-kill + (bury-buffer) + t))) + ;;; remember.el ends here diff --git a/lisp/window.el b/lisp/window.el index 5b00198..7eda7ea 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -3429,6 +3429,14 @@ displayed there." ;; Always return nil. nil)) +(defun save-and-bury-buffer () + "Saves and buries current buffer. +Buffer is saved only if `buffer-modified-p' returns non-nil." + (interactive) + (when (buffer-modified-p) + (save-buffer)) + (bury-buffer)) + (defun unbury-buffer () "Switch to the last buffer in the buffer list." (interactive) -- 1.8.3.1