commit 1b685e7a0bd0e2ae26e9930075b826c9f40aa848 (HEAD, refs/remotes/origin/master) Author: Glenn Morris Date: Tue Feb 14 23:34:49 2017 -0800 Small lispref edit * doc/lispref/os.texi (User Identification): Remove extraneous detail about user-mail-address. diff --git a/doc/lispref/os.texi b/doc/lispref/os.texi index 178822b311..c0a9c81fda 100644 --- a/doc/lispref/os.texi +++ b/doc/lispref/os.texi @@ -1133,11 +1133,7 @@ not load any customization files or user profile. @end defvar @defopt user-mail-address -This holds the nominal email address of the user who is using Emacs. -Emacs normally sets this variable to a default value after reading your -init files, but not if you have already set it. So you can set the -variable to some other value in your init file if you do not -want to use the default value. +This holds the email address of the user who is using Emacs. @end defopt @defun user-login-name &optional uid commit 8a9c468b6f5cf2ffc684270433f8d9173236a22d Author: Katsumi Yamaoka Date: Wed Feb 15 05:59:29 2017 +0000 Document fill-separate-heterogeneous-words-with-space (bug#25685) * doc/lispref/text.texi (Filling): Document fill-separate-heterogeneous-words-with-space (bug#25685). diff --git a/doc/lispref/text.texi b/doc/lispref/text.texi index 438c67be89..9696c73c48 100644 --- a/doc/lispref/text.texi +++ b/doc/lispref/text.texi @@ -1649,6 +1649,13 @@ If this variable is non-@code{nil}, it should be a string of characters that can end a sentence without following spaces. @end defopt +@defopt fill-separate-heterogeneous-words-with-space +If this variable is non-@code{nil}, two words of different kind (e.g., +English and CJK) will be separated with a space when concatenating one +that is in the end of a line and the other that is in the beginning of +the next line for filling. +@end defopt + @defvar fill-paragraph-function This variable provides a way to override the filling of paragraphs. If its value is non-@code{nil}, @code{fill-paragraph} calls this commit 0a64666288e3f32967db4ad683a4bc2f225fb952 Author: Noam Postavsky Date: Sat Feb 11 23:15:13 2017 -0500 Test comment-multi-line = nil auto fill case too * test/lisp/progmodes/js-tests.el (js-mode-auto-fill): Test with `comment-multi-line' both nil and non-nil. * lisp/newcomment.el (comment-multi-line): Mark safe if it's a boolean. * etc/NEWS: Mention that `js-mode' now sets `comment-multi-line'. diff --git a/etc/NEWS b/etc/NEWS index 31b05ddbab..421e5daa3e 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -624,6 +624,9 @@ initialization files. --- ** 'auto-revert-use-notify' is set back to t in 'global-auto-revert-mode'. +--- +** JS mode now sets 'comment-multi-line' to t. + ** CSS mode --- diff --git a/lisp/newcomment.el b/lisp/newcomment.el index 1af89293b6..4b261c34c6 100644 --- a/lisp/newcomment.el +++ b/lisp/newcomment.el @@ -309,6 +309,7 @@ customize this variable. It also affects \\[indent-new-comment-line]. However, if you want this behavior for explicit filling, you might as well use \\[newline-and-indent]." :type 'boolean + :safe #'booleanp :group 'comment) (defcustom comment-empty-lines nil diff --git a/test/lisp/progmodes/js-tests.el b/test/lisp/progmodes/js-tests.el index d61f084e0d..99f5898525 100644 --- a/test/lisp/progmodes/js-tests.el +++ b/test/lisp/progmodes/js-tests.el @@ -89,16 +89,18 @@ if (!/[ (:,='\"]/.test(value)) { (ert-deftest js-mode-auto-fill () (with-temp-buffer (js-mode) - (setq fill-column 70) - (insert "/* ") - (dotimes (_ 16) - (insert "test ")) - (do-auto-fill) - ;; The bug is that, after auto-fill, the second line starts with - ;; "/*", whereas it should start with " * ". - (goto-char (point-min)) - (forward-line) - (should (looking-at " \\* test")))) + (let ((fill-column 10) + (comment-multi-line t)) + (insert "/* test test") + (do-auto-fill) + ;; Filling should continue the multi line comment. + (should (equal (buffer-string) "/* test\n * test")) + (erase-buffer) + (insert "/* test test") + (setq comment-multi-line nil) + (do-auto-fill) + ;; Filling should start a new comment on the next line. + (should (equal (buffer-string) "/* test */\n/* test"))))) (ert-deftest js-mode-regexp-syntax-bug-25529 () (dolist (regexp-contents '("[^[]" commit 61ea36bb37740315dc78ba213db51c508c489f25 Author: Katsumi Yamaoka Date: Wed Feb 15 01:26:59 2017 +0000 Don't delete leading and trailing space from CJK word (bug#25685) * lisp/textmodes/fill.el (fill-delete-newlines): Don't delete leading and trailing space from CJK word. (fill-separate-heterogeneous-words-with-space): New user option that controls it (bug#25685). diff --git a/lisp/textmodes/fill.el b/lisp/textmodes/fill.el index 2957bc62d9..ee523ed5f5 100644 --- a/lisp/textmodes/fill.el +++ b/lisp/textmodes/fill.el @@ -49,6 +49,15 @@ A value of nil means that any change in indentation starts a new paragraph." :group 'fill) (put 'colon-double-space 'safe-local-variable 'booleanp) +(defcustom fill-separate-heterogeneous-words-with-space nil + "Non-nil means that use a space to separate words of different kind. +This will be done with a word in the end of a line and a word in the +beginning of the next line when concatenating them for filling those +lines. Whether to use a space is up to how the words are categorized." + :type 'boolean + :group 'fill + :version "26.1") + (defvar fill-paragraph-function nil "Mode-specific function to fill a paragraph, or nil if there is none. If the function returns nil, then `fill-paragraph' does its normal work. @@ -494,8 +503,11 @@ Point is moved to just past the fill prefix on the first line." (replace-match (get-text-property (match-beginning 0) 'fill-space)) (let ((prev (char-before (match-beginning 0))) (next (following-char))) - (if (and (or (aref (char-category-set next) ?|) - (aref (char-category-set prev) ?|)) + (if (and (if fill-separate-heterogeneous-words-with-space + (and (aref (char-category-set next) ?|) + (aref (char-category-set prev) ?|)) + (or (aref (char-category-set next) ?|) + (aref (char-category-set prev) ?|))) (or (aref fill-nospace-between-words-table next) (aref fill-nospace-between-words-table prev))) (delete-char -1)))))) commit 4e23578127fcb08d8289567dbb7ec3ad12e09382 Author: Juri Linkov Date: Wed Feb 15 01:28:15 2017 +0200 ‘M-s w RET word C-s’ repeats incremental search. * lisp/isearch.el (isearch-new-nonincremental): New variable. (with-isearch-suspended): Bind isearch-new-nonincremental to isearch-nonincremental, and restore it afterwards. (isearch-forward-exit-minibuffer, isearch-reverse-exit-minibuffer): Set isearch-new-nonincremental to nil. (Bug#25562) diff --git a/lisp/isearch.el b/lisp/isearch.el index 4b35f25664..526243554b 100644 --- a/lisp/isearch.el +++ b/lisp/isearch.el @@ -638,6 +638,9 @@ Each element is an `isearch--state' struct where the slots are ;; Should isearch be terminated after doing one search? (defvar isearch-nonincremental nil) +;; New value of isearch-nonincremental after isearch-edit-string. +(defvar isearch-new-nonincremental nil) + ;; New value of isearch-forward after isearch-edit-string. (defvar isearch-new-forward nil) @@ -1228,7 +1231,7 @@ If this is set inside code wrapped by the macro "Exit Isearch mode, run BODY, and reinvoke the pending search. You can update the global isearch variables by setting new values to `isearch-new-string', `isearch-new-message', `isearch-new-forward', -`isearch-new-regexp-function', `isearch-new-case-fold'." +`isearch-new-regexp-function', `isearch-new-case-fold', `isearch-new-nonincremental'." ;; This code is very hairy for several reasons, explained in the code. ;; Mainly, isearch-mode must be terminated while editing and then restarted. ;; If there were a way to catch any change of buffer from the minibuffer, @@ -1236,7 +1239,7 @@ You can update the global isearch variables by setting new values to ;; Editing doesn't back up the search point. Should it? `(condition-case nil (progn - (let ((isearch-nonincremental isearch-nonincremental) + (let ((isearch-new-nonincremental isearch-nonincremental) ;; Locally bind all isearch global variables to protect them ;; from recursive isearching. @@ -1315,6 +1318,7 @@ You can update the global isearch variables by setting new values to (setq isearch-string isearch-new-string isearch-message isearch-new-message isearch-forward isearch-new-forward + isearch-nonincremental isearch-new-nonincremental isearch-regexp-function isearch-new-regexp-function isearch-case-fold-search isearch-new-case-fold multi-isearch-current-buffer multi-isearch-current-buffer-new @@ -1405,22 +1409,22 @@ The following additional command keys are active while editing. (defun isearch-nonincremental-exit-minibuffer () (interactive) - (setq isearch-nonincremental t) + (setq isearch-new-nonincremental t) (exit-minibuffer)) -;; Changing the value of `isearch-nonincremental' has no effect here, -;; because `isearch-edit-string' ignores this change. Thus marked as obsolete. +;; It makes no sense to change the value of `isearch-new-nonincremental' +;; from nil to t during `isearch-edit-string'. Thus marked as obsolete. (make-obsolete 'isearch-nonincremental-exit-minibuffer 'exit-minibuffer "24.4") (defun isearch-forward-exit-minibuffer () "Resume isearching forward from the minibuffer that edits the search string." (interactive) - (setq isearch-new-forward t) + (setq isearch-new-forward t isearch-new-nonincremental nil) (exit-minibuffer)) (defun isearch-reverse-exit-minibuffer () "Resume isearching backward from the minibuffer that edits the search string." (interactive) - (setq isearch-new-forward nil) + (setq isearch-new-forward nil isearch-new-nonincremental nil) (exit-minibuffer)) (defun isearch-cancel () commit 3fb9f5452fbd0458f90115b0a95151b8e7a482a1 Author: Tom Tromey Date: Mon Feb 13 18:09:36 2017 -0700 Make vc-git detect conflict state for vc-dir * lisp/vc/vc-git.el (vc-git-dir-status-state): New struct. (vc-git-dir-status-update-file): New function. (vc-git-after-dir-status-stage, vc-git-dir-status-goto-stage): Use vc-git-dir-status-state; add 'ls-files-conflict state. (vc-git-dir-status-files): Create a vc-git-dir-status-state. diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el index 24dabb6f9f..0f58892eb4 100644 --- a/lisp/vc/vc-git.el +++ b/lisp/vc/vc-git.el @@ -401,11 +401,30 @@ or an empty string if none." (vc-git-file-type-as-string old-perm new-perm) (vc-git-rename-as-string state extra)))) -(defun vc-git-after-dir-status-stage (stage files update-function) +(cl-defstruct (vc-git-dir-status-state + (:copier nil) + (:conc-name vc-git-dir-status-state->)) + ;; Current stage. + stage + ;; List of files still to be processed. + files + ;; Update function to be called at the end. + update-function + ;; Hash table of entries for files we've computed so far. + (hash (make-hash-table :test 'equal))) + +(defsubst vc-git-dir-status-update-file (state filename file-state file-info) + (puthash filename (list file-state file-info) + (vc-git-dir-status-state->hash state)) + (setf (vc-git-dir-status-state->files state) + (delete filename (vc-git-dir-status-state->files state)))) + +(defun vc-git-after-dir-status-stage (git-state) "Process sentinel for the various dir-status stages." - (let (next-stage result) + (let (next-stage + (files (vc-git-dir-status-state->files git-state))) (goto-char (point-min)) - (pcase stage + (pcase (vc-git-dir-status-state->stage git-state) (`update-index (setq next-stage (if (vc-git--empty-db-p) 'ls-files-added 'diff-index))) (`ls-files-added @@ -413,29 +432,40 @@ or an empty string if none." (while (re-search-forward "\\([0-7]\\{6\\}\\) [0-9a-f]\\{40\\} 0\t\\([^\0]+\\)\0" nil t) (let ((new-perm (string-to-number (match-string 1) 8)) (name (match-string 2))) - (push (list name 'added (vc-git-create-extra-fileinfo 0 new-perm)) - result)))) + (vc-git-dir-status-update-file + git-state name 'added + (vc-git-create-extra-fileinfo 0 new-perm))))) (`ls-files-up-to-date (setq next-stage 'ls-files-unknown) - (while (re-search-forward "\\([0-7]\\{6\\}\\) [0-9a-f]\\{40\\} 0\t\\([^\0]+\\)\0" nil t) + (while (re-search-forward "\\([0-7]\\{6\\}\\) [0-9a-f]\\{40\\} \\([0-3]\\)\t\\([^\0]+\\)\0" nil t) + (let ((perm (string-to-number (match-string 1) 8)) + (state (match-string 2)) + (name (match-string 3))) + (vc-git-dir-status-update-file + git-state name (if (equal state "0") + 'up-to-date + 'conflict) + (vc-git-create-extra-fileinfo perm perm))))) + (`ls-files-conflict + (setq next-stage 'ls-files-unknown) + ;; It's enough to look for "3" to notice a conflict. + (while (re-search-forward "\\([0-7]\\{6\\}\\) [0-9a-f]\\{40\\} 3\t\\([^\0]+\\)\0" nil t) (let ((perm (string-to-number (match-string 1) 8)) (name (match-string 2))) - (push (list name 'up-to-date - (vc-git-create-extra-fileinfo perm perm)) - result)))) + (vc-git-dir-status-update-file + git-state name 'conflict + (vc-git-create-extra-fileinfo perm perm))))) (`ls-files-unknown (when files (setq next-stage 'ls-files-ignored)) (while (re-search-forward "\\([^\0]*?\\)\0" nil t 1) - (push (list (match-string 1) 'unregistered - (vc-git-create-extra-fileinfo 0 0)) - result))) + (vc-git-dir-status-update-file git-state (match-string 1) 'unregistered + (vc-git-create-extra-fileinfo 0 0)))) (`ls-files-ignored (while (re-search-forward "\\([^\0]*?\\)\0" nil t 1) - (push (list (match-string 1) 'ignored - (vc-git-create-extra-fileinfo 0 0)) - result))) + (vc-git-dir-status-update-file git-state (match-string 1) 'ignored + (vc-git-create-extra-fileinfo 0 0)))) (`diff-index - (setq next-stage (if files 'ls-files-up-to-date 'ls-files-unknown)) + (setq next-stage (if files 'ls-files-up-to-date 'ls-files-conflict)) (while (re-search-forward ":\\([0-7]\\{6\\}\\) \\([0-7]\\{6\\}\\) [0-9a-f]\\{40\\} [0-9a-f]\\{40\\} \\(\\([ADMUT]\\)\0\\([^\0]+\\)\\|\\([CR]\\)[0-9]*\0\\([^\0]+\\)\0\\([^\0]+\\)\\)\0" nil t 1) @@ -446,30 +476,34 @@ or an empty string if none." (new-name (match-string 8))) (if new-name ; Copy or rename. (if (eq ?C (string-to-char state)) - (push (list new-name 'added - (vc-git-create-extra-fileinfo old-perm new-perm - 'copy name)) - result) - (push (list name 'removed - (vc-git-create-extra-fileinfo 0 0 - 'rename new-name)) - result) - (push (list new-name 'added - (vc-git-create-extra-fileinfo old-perm new-perm - 'rename name)) - result)) - (push (list name (vc-git--state-code state) - (vc-git-create-extra-fileinfo old-perm new-perm)) - result)))))) - (when result - (setq result (nreverse result)) - (when files - (dolist (entry result) (setq files (delete (car entry) files))) - (unless files (setq next-stage nil)))) - (when (or result (not next-stage)) - (funcall update-function result next-stage)) - (when next-stage - (vc-git-dir-status-goto-stage next-stage files update-function)))) + (vc-git-dir-status-update-file + git-state new-name 'added + (vc-git-create-extra-fileinfo old-perm new-perm + 'copy name)) + (vc-git-dir-status-update-file + git-state name 'removed + (vc-git-create-extra-fileinfo 0 0 'rename new-name)) + (vc-git-dir-status-update-file + git-state new-name 'added + (vc-git-create-extra-fileinfo old-perm new-perm + 'rename name))) + (vc-git-dir-status-update-file + git-state name (vc-git--state-code state) + (vc-git-create-extra-fileinfo old-perm new-perm))))))) + ;; If we had files but now we don't, it's time to stop. + (when (and files (not (vc-git-dir-status-state->files git-state))) + (setq next-stage nil)) + (setf (vc-git-dir-status-state->stage git-state) next-stage) + (setf (vc-git-dir-status-state->files git-state) files) + (if next-stage + (vc-git-dir-status-goto-stage git-state) + (funcall (vc-git-dir-status-state->update-function git-state) + (let ((result nil)) + (maphash (lambda (key value) + (push (cons key value) result)) + (vc-git-dir-status-state->hash git-state)) + result) + nil)))) ;; Follows vc-git-command (or vc-do-async-command), which uses vc-do-command ;; from vc-dispatcher. @@ -477,41 +511,48 @@ or an empty string if none." ;; Follows vc-exec-after. (declare-function vc-set-async-update "vc-dispatcher" (process-buffer)) -(defun vc-git-dir-status-goto-stage (stage files update-function) - (erase-buffer) - (pcase stage - (`update-index - (if files - (vc-git-command (current-buffer) 'async files "add" "--refresh" "--") - (vc-git-command (current-buffer) 'async nil - "update-index" "--refresh"))) - (`ls-files-added - (vc-git-command (current-buffer) 'async files - "ls-files" "-z" "-c" "-s" "--")) - (`ls-files-up-to-date - (vc-git-command (current-buffer) 'async files - "ls-files" "-z" "-c" "-s" "--")) - (`ls-files-unknown - (vc-git-command (current-buffer) 'async files - "ls-files" "-z" "-o" "--directory" - "--no-empty-directory" "--exclude-standard" "--")) - (`ls-files-ignored - (vc-git-command (current-buffer) 'async files - "ls-files" "-z" "-o" "-i" "--directory" - "--no-empty-directory" "--exclude-standard" "--")) - ;; --relative added in Git 1.5.5. - (`diff-index - (vc-git-command (current-buffer) 'async files - "diff-index" "--relative" "-z" "-M" "HEAD" "--"))) - (vc-run-delayed - (vc-git-after-dir-status-stage stage files update-function))) +(defun vc-git-dir-status-goto-stage (git-state) + (let ((files (vc-git-dir-status-state->files git-state))) + (erase-buffer) + (pcase (vc-git-dir-status-state->stage git-state) + (`update-index + (if files + (vc-git-command (current-buffer) 'async files "add" "--refresh" "--") + (vc-git-command (current-buffer) 'async nil + "update-index" "--refresh"))) + (`ls-files-added + (vc-git-command (current-buffer) 'async files + "ls-files" "-z" "-c" "-s" "--")) + (`ls-files-up-to-date + (vc-git-command (current-buffer) 'async files + "ls-files" "-z" "-c" "-s" "--")) + (`ls-files-conflict + (vc-git-command (current-buffer) 'async files + "ls-files" "-z" "-c" "-s" "--")) + (`ls-files-unknown + (vc-git-command (current-buffer) 'async files + "ls-files" "-z" "-o" "--directory" + "--no-empty-directory" "--exclude-standard" "--")) + (`ls-files-ignored + (vc-git-command (current-buffer) 'async files + "ls-files" "-z" "-o" "-i" "--directory" + "--no-empty-directory" "--exclude-standard" "--")) + ;; --relative added in Git 1.5.5. + (`diff-index + (vc-git-command (current-buffer) 'async files + "diff-index" "--relative" "-z" "-M" "HEAD" "--"))) + (vc-run-delayed + (vc-git-after-dir-status-stage git-state)))) (defun vc-git-dir-status-files (_dir files update-function) "Return a list of (FILE STATE EXTRA) entries for DIR." ;; Further things that would have to be fixed later: ;; - how to handle unregistered directories ;; - how to support vc-dir on a subdir of the project tree - (vc-git-dir-status-goto-stage 'update-index files update-function)) + (vc-git-dir-status-goto-stage + (make-vc-git-dir-status-state :stage 'update-index + :files files + :update-function update-function))) (defvar vc-git-stash-map (let ((map (make-sparse-keymap))) commit 71b90192dab8de9825904faaabbaf9548d3db2ab Author: Vibhav Pant Date: Tue Feb 14 21:47:59 2017 +0530 byte-opt: Replace merged tags in jump tables too. (bug#25716) * lisp/emacs-lisp/byte-opt.el (byte-optimize-lapcode): While merging adjacent tags, make sure that the old tag is replaced in all jump tables, if any. This fixes the bytecode VM jumping to the wrong address in compiled cond forms where the body of a clause was a loop of any sort. diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el index 38f5dcc993..f3cc3d5992 100644 --- a/lisp/emacs-lisp/byte-opt.el +++ b/lisp/emacs-lisp/byte-opt.el @@ -1752,12 +1752,22 @@ If FOR-EFFECT is non-nil, the return value is assumed to be of no importance." (setcdr tmp2 lap1) (setq tmp3 (cdr (memq tmp2 tmp3)))) (setq lap (delq lap0 lap) - keep-going t)) + keep-going t) + ;; replace references to tag in jump tables, if any + (dolist (table byte-compile-jump-tables) + (catch 'break + (maphash #'(lambda (value tag) + (when (equal tag lap0) + ;; each tag occurs only once in the jump table + (puthash value lap1 table) + (throw 'break nil))) + table)))) ;; ;; unused-TAG: --> ;; ((and (eq 'TAG (car lap0)) (not (rassq lap0 lap)) + ;; make sure this tag isn't used in a jump-table (cl-loop for table in byte-compile-jump-tables when (member lap0 (hash-table-values table)) return nil finally return t)) commit c1eb871e92176092a46b74b68655c3c167ccece9 Author: Eli Zaretskii Date: Tue Feb 14 18:17:51 2017 +0200 ; * test/file-organization.org: Minor copyedits. diff --git a/test/file-organization.org b/test/file-organization.org index dba5f4ff71..8d9c671637 100644 --- a/test/file-organization.org +++ b/test/file-organization.org @@ -21,31 +21,39 @@ C source is stored in the ~src~ directory, which is flat. ** Test Files -Automated tests should be stored in the ~test/automated/lisp~ directory. Tests -should reflect the directory structure of the source tree; so tests for files -in the ~emacs-lisp~ source directory should reside in the +Automated tests should be stored in the ~test/lisp~ directory for +tests of functionality implemented in Lisp, and in the ~test/src~ +directory for functionality implemented in C. Tests should reflect +the directory structure of the source tree; so tests for files in the +~lisp/emacs-lisp~ source directory should reside in the ~test/lisp/emacs-lisp~ directory. -Tests should normally reside in a file with ~-tests~ added to the name of -the tested source file; hence ~ert.el~ is tested in ~ert-tests.el~, or -~pcase.el~ is tested in ~pcase-tests.el~. Exceptionally, tests for a -single feature may be placed into multiple files of any name which are -themselves placed in a directory named after the feature with ~-tests~ -appended, such as ~/test/lisp/emacs-lisp/eieio-tests~ +Tests should normally reside in a file with ~-tests.el~ added to the +base-name of the tested source file; hence ~ert.el~ is tested in +~ert-tests.el~, and ~pcase.el~ is tested in ~pcase-tests.el~. As n +exception, tests for a single feature may be placed into multiple +files of any name which are themselves placed in a directory named +after the feature with ~-tests~ appended, such as +~/test/lisp/emacs-lisp/eieio-tests~ -Where features of the C source are tested using Emacs-Lisp test files, these -should reside in ~/test/src~ and be named after the C file. +Similarly, features implemented in C should reside in ~/test/src~ and +be named after the C file with ~-tests.el~ added to the base-name of +the tested source file. Thus, tests for ~src/fileio.c~ should be in +~test/src/fileio-tests.el~. There are also some test materials that cannot be run automatically -(i.e. via ert). These should be placed in ~/test/manual~ +(i.e. via ert). These should be placed in ~/test/manual~; they are +not run by the "make check" command and its derivatives. ** Resource Files -Resource files for tests (containing test data) should reside in a directory -named after the feature with a ~-resources~ suffix, and located in the same -directory as the feature. Hence, the lisp file ~flymake.el~ should have test -files in ~/test/automated/lisp/progmodes/flymake-tests.el~ should reside in a +Resource files for tests (containing test data) should reside in a +directory named after the feature with a ~-resources~ suffix, and +located in the same directory as the feature. Hence, the lisp file +~flymake.el~ should have test files in +~/test/automated/lisp/progmodes/flymake-tests.el~ should reside in a directory called ~/test/automated/lisp/progmodes/flymake-resources~. No guidance is given for the organization of resource files inside the -~-resource~ directory; files can be organized at the author's discretion. +~-resource~ directory; files can be organized at the author's +discretion.