diff options
| author | Joakim Verona | 2013-04-10 08:30:26 +0200 |
|---|---|---|
| committer | Joakim Verona | 2013-04-10 08:30:26 +0200 |
| commit | a1002a150a8497832b98f167cb4ecd807f1684e7 (patch) | |
| tree | da28ae5ac8a521b688e0d8eb60e9ea287edcdd5c | |
| parent | b7ef53c752790136ca12dcca9e291bf88c0e5bee (diff) | |
| parent | b60e25d6bc17deb6b553afb2cebe96e79dfadab5 (diff) | |
| download | emacs-a1002a150a8497832b98f167cb4ecd807f1684e7.tar.gz emacs-a1002a150a8497832b98f167cb4ecd807f1684e7.zip | |
auto upstream
| -rwxr-xr-x | autogen/configure | 2 | ||||
| -rw-r--r-- | etc/ChangeLog | 8 | ||||
| -rw-r--r-- | etc/NEWS | 5 | ||||
| -rw-r--r-- | etc/PROBLEMS | 5 | ||||
| -rw-r--r-- | etc/themes/tsdh-dark-theme.el | 3 | ||||
| -rw-r--r-- | lisp/ChangeLog | 11 | ||||
| -rw-r--r-- | lisp/pcmpl-x.el | 10 | ||||
| -rw-r--r-- | lisp/progmodes/sh-script.el | 23 | ||||
| -rw-r--r-- | lisp/simple.el | 4 | ||||
| -rw-r--r-- | src/ChangeLog | 5 | ||||
| -rw-r--r-- | src/minibuf.c | 8 | ||||
| -rw-r--r-- | test/ChangeLog | 4 | ||||
| -rw-r--r-- | test/automated/add-log-tests.el | 84 |
13 files changed, 161 insertions, 11 deletions
diff --git a/autogen/configure b/autogen/configure index db574207d75..d4df3a49174 100755 --- a/autogen/configure +++ b/autogen/configure | |||
| @@ -9842,7 +9842,7 @@ fi | |||
| 9842 | W32_RES="emacs.res" | 9842 | W32_RES="emacs.res" |
| 9843 | # Tell the linker that emacs.res is an object (which we compile from | 9843 | # Tell the linker that emacs.res is an object (which we compile from |
| 9844 | # the rc file), not a linker script. | 9844 | # the rc file), not a linker script. |
| 9845 | W32_RES_LINK="-Wl,-bpe-i386 -Wl,emacs.res" | 9845 | W32_RES_LINK="-Wl,emacs.res" |
| 9846 | fi | 9846 | fi |
| 9847 | 9847 | ||
| 9848 | 9848 | ||
diff --git a/etc/ChangeLog b/etc/ChangeLog index 85b365695fd..493095e9621 100644 --- a/etc/ChangeLog +++ b/etc/ChangeLog | |||
| @@ -1,3 +1,11 @@ | |||
| 1 | 2013-04-09 Tassilo Horn <tsdh@gnu.org> | ||
| 2 | |||
| 3 | * themes/tsdh-dark-theme.el (tsdh-dark): Add some more faces. | ||
| 4 | |||
| 5 | 2013-04-09 Masatake YAMATO <yamato@redhat.com> | ||
| 6 | |||
| 7 | * NEWS: Mention `sh-mode' own `add-log-current-defun-function'. | ||
| 8 | |||
| 1 | 2013-04-07 Jan Djärv <jan.h.d@swipnet.se> | 9 | 2013-04-07 Jan Djärv <jan.h.d@swipnet.se> |
| 2 | 10 | ||
| 3 | * PROBLEMS: Mention Ubuntu warnings about libdbusmenu. | 11 | * PROBLEMS: Mention Ubuntu warnings about libdbusmenu. |
| @@ -84,6 +84,11 @@ Eg View mode, etc. | |||
| 84 | 84 | ||
| 85 | ** New command `kmacro-to-register' to store keyboard macros in registers. | 85 | ** New command `kmacro-to-register' to store keyboard macros in registers. |
| 86 | 86 | ||
| 87 | ** Shell Script mode | ||
| 88 | |||
| 89 | *** `sh-mode' now has the mode own `add-log-current-defun-function'. | ||
| 90 | You can pick the name of the function and the variables with `C-x 4 a'. | ||
| 91 | |||
| 87 | 92 | ||
| 88 | * Changes in Specialized Modes and Packages in Emacs 24.4 | 93 | * Changes in Specialized Modes and Packages in Emacs 24.4 |
| 89 | 94 | ||
diff --git a/etc/PROBLEMS b/etc/PROBLEMS index bc86c7cb373..0cfc0ad0c14 100644 --- a/etc/PROBLEMS +++ b/etc/PROBLEMS | |||
| @@ -1412,17 +1412,16 @@ When you start Emacs you may see something like this: | |||
| 1412 | (emacs:2286): LIBDBUSMENU-GTK-CRITICAL **: watch_submenu: assertion | 1412 | (emacs:2286): LIBDBUSMENU-GTK-CRITICAL **: watch_submenu: assertion |
| 1413 | `GTK_IS_MENU_SHELL(menu)' failed | 1413 | `GTK_IS_MENU_SHELL(menu)' failed |
| 1414 | 1414 | ||
| 1415 | This happens if the Emacs binary has been renamed. The cause it the Ubuntu | 1415 | This happens if the Emacs binary has been renamed. The cause is the Ubuntu |
| 1416 | appmenu concept. It tries to track Emacs menus and show them in the top | 1416 | appmenu concept. It tries to track Emacs menus and show them in the top |
| 1417 | panel, instead of in each Emacs window. This is not properly implemented, | 1417 | panel, instead of in each Emacs window. This is not properly implemented, |
| 1418 | so it fails for Emacs. The order of menus is wrong, and things like copy/paste | 1418 | so it fails for Emacs. The order of menus is wrong, and things like copy/paste |
| 1419 | that depends on what state Emacs is in, is usually wrong (i.e. paste disabled | 1419 | that depend on what state Emacs is in are usually wrong (i.e. paste disabled |
| 1420 | even if you should be able to paste, and similar). | 1420 | even if you should be able to paste, and similar). |
| 1421 | 1421 | ||
| 1422 | You can get back menus on each frame by starting emacs like this: | 1422 | You can get back menus on each frame by starting emacs like this: |
| 1423 | % env UBUNTU_MENUPROXY= emacs | 1423 | % env UBUNTU_MENUPROXY= emacs |
| 1424 | 1424 | ||
| 1425 | |||
| 1426 | * Runtime problems on character terminals | 1425 | * Runtime problems on character terminals |
| 1427 | 1426 | ||
| 1428 | ** The meta key does not work on xterm. | 1427 | ** The meta key does not work on xterm. |
diff --git a/etc/themes/tsdh-dark-theme.el b/etc/themes/tsdh-dark-theme.el index 011133808a2..879f8f10e8a 100644 --- a/etc/themes/tsdh-dark-theme.el +++ b/etc/themes/tsdh-dark-theme.el | |||
| @@ -64,7 +64,10 @@ Used and created by Tassilo Horn.") | |||
| 64 | '(highlight ((t (:background "sea green")))) | 64 | '(highlight ((t (:background "sea green")))) |
| 65 | '(hl-line ((t (:background "grey25")))) | 65 | '(hl-line ((t (:background "grey25")))) |
| 66 | '(hl-paren-face ((t (:weight bold))) t) | 66 | '(hl-paren-face ((t (:weight bold))) t) |
| 67 | '(icomplete-first-match ((t (:foreground "deep sky blue" :weight bold)))) | ||
| 67 | '(lusty-file-face ((t (:foreground "SpringGreen1"))) t) | 68 | '(lusty-file-face ((t (:foreground "SpringGreen1"))) t) |
| 69 | '(magit-header ((t (:box 1 :weight bold)))) | ||
| 70 | '(magit-section-title ((t (:inherit magit-header :background "dark slate blue")))) | ||
| 68 | '(menu ((t (:background "gray30" :foreground "gray70")))) | 71 | '(menu ((t (:background "gray30" :foreground "gray70")))) |
| 69 | '(minibuffer-prompt ((t (:background "yellow" :foreground "medium blue" :box (:line-width -1 :color "red" :style released-button) :weight bold)))) | 72 | '(minibuffer-prompt ((t (:background "yellow" :foreground "medium blue" :box (:line-width -1 :color "red" :style released-button) :weight bold)))) |
| 70 | '(mode-line ((t (:box (:line-width 1 :color "red") :family "DejaVu Sans")))) | 73 | '(mode-line ((t (:box (:line-width 1 :color "red") :family "DejaVu Sans")))) |
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 95aadd40fd6..01887620250 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,3 +1,14 @@ | |||
| 1 | 2013-04-10 Masatake YAMATO <yamato@redhat.com> | ||
| 2 | |||
| 3 | * progmodes/sh-script.el: Implement `sh-mode' own | ||
| 4 | `add-log-current-defun-function' (bug#14112). | ||
| 5 | (sh-current-defun-name): New function. | ||
| 6 | (sh-mode): Use the function. | ||
| 7 | |||
| 8 | 2013-04-09 Bastien Guerry <bzg@gnu.org> | ||
| 9 | |||
| 10 | * simple.el (choose-completion-string): Fix docstring (bug#14163). | ||
| 11 | |||
| 1 | 2013-04-08 Stefan Monnier <monnier@iro.umontreal.ca> | 12 | 2013-04-08 Stefan Monnier <monnier@iro.umontreal.ca> |
| 2 | 13 | ||
| 3 | * emacs-lisp/edebug.el (edebug-mode): Fix typo (bug#14144). | 14 | * emacs-lisp/edebug.el (edebug-mode): Fix typo (bug#14144). |
diff --git a/lisp/pcmpl-x.el b/lisp/pcmpl-x.el index 6ef592b969d..86d8dc652c3 100644 --- a/lisp/pcmpl-x.el +++ b/lisp/pcmpl-x.el | |||
| @@ -1,23 +1,25 @@ | |||
| 1 | ;;; pcmpl-x.el --- completion for miscellaneous tools -*- lexical-binding: t; -*- | 1 | ;;; pcmpl-x.el --- completion for miscellaneous tools -*- lexical-binding: t; -*- |
| 2 | 2 | ||
| 3 | ;; Copyright (C) 2013 Free Software Foundation, Inc. | 3 | ;; Copyright (C) 2013 Free Software Foundation, Inc. |
| 4 | 4 | ||
| 5 | ;; Author: Leo Liu <sdl.web@gmail.com> | 5 | ;; Author: Leo Liu <sdl.web@gmail.com> |
| 6 | ;; Keywords: processes, tools, convenience | 6 | ;; Keywords: processes, tools, convenience |
| 7 | ;; Package: pcomplete | 7 | ;; Package: pcomplete |
| 8 | 8 | ||
| 9 | ;; This program is free software; you can redistribute it and/or modify | 9 | ;; This file is part of GNU Emacs. |
| 10 | |||
| 11 | ;; GNU Emacs is free software: you can redistribute it and/or modify | ||
| 10 | ;; it under the terms of the GNU General Public License as published by | 12 | ;; it under the terms of the GNU General Public License as published by |
| 11 | ;; the Free Software Foundation, either version 3 of the License, or | 13 | ;; the Free Software Foundation, either version 3 of the License, or |
| 12 | ;; (at your option) any later version. | 14 | ;; (at your option) any later version. |
| 13 | 15 | ||
| 14 | ;; This program is distributed in the hope that it will be useful, | 16 | ;; GNU Emacs is distributed in the hope that it will be useful, |
| 15 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | 17 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 16 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 18 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 17 | ;; GNU General Public License for more details. | 19 | ;; GNU General Public License for more details. |
| 18 | 20 | ||
| 19 | ;; You should have received a copy of the GNU General Public License | 21 | ;; You should have received a copy of the GNU General Public License |
| 20 | ;; along with this program. If not, see <http://www.gnu.org/licenses/>. | 22 | ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. |
| 21 | 23 | ||
| 22 | ;;; Code: | 24 | ;;; Code: |
| 23 | 25 | ||
diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el index 8f1954402e5..e197f9cfabe 100644 --- a/lisp/progmodes/sh-script.el +++ b/lisp/progmodes/sh-script.el | |||
| @@ -353,6 +353,28 @@ See `sh-feature' and `imenu-generic-expression'." | |||
| 353 | :group 'sh-script | 353 | :group 'sh-script |
| 354 | :version "20.4") | 354 | :version "20.4") |
| 355 | 355 | ||
| 356 | (defun sh-current-defun-name () | ||
| 357 | "Find the name of function or variable at point. | ||
| 358 | For use in `add-log-current-defun-function'." | ||
| 359 | (save-excursion | ||
| 360 | (end-of-line) | ||
| 361 | (when (re-search-backward | ||
| 362 | (concat "\\(?:" | ||
| 363 | ;; function FOO | ||
| 364 | ;; function FOO() | ||
| 365 | "^\\s-*function\\s-+\\\([[:alpha:]_][[:alnum:]_]*\\)\\s-*\\(?:()\\)?" | ||
| 366 | "\\)\\|\\(?:" | ||
| 367 | ;; FOO() | ||
| 368 | "^\\s-*\\([[:alpha:]_][[:alnum:]_]*\\)\\s-*()" | ||
| 369 | "\\)\\|\\(?:" | ||
| 370 | ;; FOO= | ||
| 371 | "^\\([[:alpha:]_][[:alnum:]_]*\\)=" | ||
| 372 | "\\)") | ||
| 373 | nil t) | ||
| 374 | (or (match-string-no-properties 1) | ||
| 375 | (match-string-no-properties 2) | ||
| 376 | (match-string-no-properties 3))))) | ||
| 377 | |||
| 356 | (defvar sh-shell-variables nil | 378 | (defvar sh-shell-variables nil |
| 357 | "Alist of shell variable names that should be included in completion. | 379 | "Alist of shell variable names that should be included in completion. |
| 358 | These are used for completion in addition to all the variables named | 380 | These are used for completion in addition to all the variables named |
| @@ -1533,6 +1555,7 @@ with your script for an edit-interpret-debug cycle." | |||
| 1533 | (setq-local skeleton-newline-indent-rigidly t) | 1555 | (setq-local skeleton-newline-indent-rigidly t) |
| 1534 | (setq-local defun-prompt-regexp | 1556 | (setq-local defun-prompt-regexp |
| 1535 | (concat "^\\(function[ \t]\\|[[:alnum:]]+[ \t]+()[ \t]+\\)")) | 1557 | (concat "^\\(function[ \t]\\|[[:alnum:]]+[ \t]+()[ \t]+\\)")) |
| 1558 | (setq-local add-log-current-defun-function #'sh-current-defun-name) | ||
| 1536 | ;; Parse or insert magic number for exec, and set all variables depending | 1559 | ;; Parse or insert magic number for exec, and set all variables depending |
| 1537 | ;; on the shell thus determined. | 1560 | ;; on the shell thus determined. |
| 1538 | (sh-set-shell | 1561 | (sh-set-shell |
diff --git a/lisp/simple.el b/lisp/simple.el index 9baa1b7c884..5adb634e195 100644 --- a/lisp/simple.el +++ b/lisp/simple.el | |||
| @@ -6628,7 +6628,9 @@ the default method of inserting the completion in BUFFER.") | |||
| 6628 | (defun choose-completion-string (choice &optional | 6628 | (defun choose-completion-string (choice &optional |
| 6629 | buffer base-position insert-function) | 6629 | buffer base-position insert-function) |
| 6630 | "Switch to BUFFER and insert the completion choice CHOICE. | 6630 | "Switch to BUFFER and insert the completion choice CHOICE. |
| 6631 | BASE-POSITION, says where to insert the completion." | 6631 | BASE-POSITION says where to insert the completion. |
| 6632 | INSERT-FUNCTION says how to insert the completion and falls | ||
| 6633 | back on `completion-list-insert-choice-function' when nil." | ||
| 6632 | 6634 | ||
| 6633 | ;; If BUFFER is the minibuffer, exit the minibuffer | 6635 | ;; If BUFFER is the minibuffer, exit the minibuffer |
| 6634 | ;; unless it is reading a file name and CHOICE is a directory, | 6636 | ;; unless it is reading a file name and CHOICE is a directory, |
diff --git a/src/ChangeLog b/src/ChangeLog index 04dcee7b6eb..402792b5460 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,8 @@ | |||
| 1 | 2013-04-09 Stefan Monnier <monnier@iro.umontreal.ca> | ||
| 2 | |||
| 3 | * minibuf.c (Ftest_completion): Ignore non-string/symbol keys in hash | ||
| 4 | tables (bug#14054). | ||
| 5 | |||
| 1 | 2013-04-08 Stefan Monnier <monnier@iro.umontreal.ca> | 6 | 2013-04-08 Stefan Monnier <monnier@iro.umontreal.ca> |
| 2 | 7 | ||
| 3 | * window.c (select_window): Don't record_buffer while the invariant is | 8 | * window.c (select_window): Don't record_buffer while the invariant is |
diff --git a/src/minibuf.c b/src/minibuf.c index 68c39310f01..4cc1f8d435a 100644 --- a/src/minibuf.c +++ b/src/minibuf.c | |||
| @@ -1800,17 +1800,21 @@ the values STRING, PREDICATE and `lambda'. */) | |||
| 1800 | { | 1800 | { |
| 1801 | struct Lisp_Hash_Table *h = XHASH_TABLE (collection); | 1801 | struct Lisp_Hash_Table *h = XHASH_TABLE (collection); |
| 1802 | i = hash_lookup (h, string, NULL); | 1802 | i = hash_lookup (h, string, NULL); |
| 1803 | Lisp_Object key = Qnil; | ||
| 1803 | if (i >= 0) | 1804 | if (i >= 0) |
| 1804 | tem = HASH_KEY (h, i); | 1805 | tem = HASH_KEY (h, i); |
| 1805 | else | 1806 | else |
| 1806 | for (i = 0; i < HASH_TABLE_SIZE (h); ++i) | 1807 | for (i = 0; i < HASH_TABLE_SIZE (h); ++i) |
| 1807 | if (!NILP (HASH_HASH (h, i)) | 1808 | if (!NILP (HASH_HASH (h, i)) |
| 1809 | && (key = HASH_KEY (h, i), | ||
| 1810 | SYMBOLP (key) ? key = Fsymbol_name (key) : key, | ||
| 1811 | STRINGP (key)) | ||
| 1808 | && EQ (Fcompare_strings (string, make_number (0), Qnil, | 1812 | && EQ (Fcompare_strings (string, make_number (0), Qnil, |
| 1809 | HASH_KEY (h, i), make_number (0) , Qnil, | 1813 | key, make_number (0) , Qnil, |
| 1810 | completion_ignore_case ? Qt : Qnil), | 1814 | completion_ignore_case ? Qt : Qnil), |
| 1811 | Qt)) | 1815 | Qt)) |
| 1812 | { | 1816 | { |
| 1813 | tem = HASH_KEY (h, i); | 1817 | tem = key; |
| 1814 | break; | 1818 | break; |
| 1815 | } | 1819 | } |
| 1816 | if (!STRINGP (tem)) | 1820 | if (!STRINGP (tem)) |
diff --git a/test/ChangeLog b/test/ChangeLog index cd4414cd079..bf68984e9e8 100644 --- a/test/ChangeLog +++ b/test/ChangeLog | |||
| @@ -1,3 +1,7 @@ | |||
| 1 | 2013-04-09 Masatake YAMATO <yamato@redhat.com> | ||
| 2 | |||
| 3 | * automated/add-log-tests.el: New file. (Bug#14112) | ||
| 4 | |||
| 1 | 2013-03-30 Fabián Ezequiel Gallina <fabian@anue.biz> | 5 | 2013-03-30 Fabián Ezequiel Gallina <fabian@anue.biz> |
| 2 | 6 | ||
| 3 | * automated/python-tests.el (python-indent-block-enders): New test. | 7 | * automated/python-tests.el (python-indent-block-enders): New test. |
diff --git a/test/automated/add-log-tests.el b/test/automated/add-log-tests.el new file mode 100644 index 00000000000..28029e18b99 --- /dev/null +++ b/test/automated/add-log-tests.el | |||
| @@ -0,0 +1,84 @@ | |||
| 1 | ;;; add-log-tests.el --- Test suite for add-log. | ||
| 2 | |||
| 3 | ;; Copyright (C) 2013 Free Software Foundation, Inc. | ||
| 4 | |||
| 5 | ;; Author: Masatake YAMATO <yamato@redhat.com> | ||
| 6 | ;; Keywords: vc tools | ||
| 7 | |||
| 8 | ;; This file is part of GNU Emacs. | ||
| 9 | |||
| 10 | ;; GNU Emacs is free software: you can redistribute it and/or modify | ||
| 11 | ;; it under the terms of the GNU General Public License as published by | ||
| 12 | ;; the Free Software Foundation, either version 3 of the License, or | ||
| 13 | ;; (at your option) any later version. | ||
| 14 | |||
| 15 | ;; GNU Emacs is distributed in the hope that it will be useful, | ||
| 16 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 17 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 18 | ;; GNU General Public License for more details. | ||
| 19 | |||
| 20 | ;; You should have received a copy of the GNU General Public License | ||
| 21 | ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. | ||
| 22 | |||
| 23 | ;;; Code: | ||
| 24 | |||
| 25 | (require 'add-log) | ||
| 26 | |||
| 27 | (defmacro add-log-current-defun-deftest (name doc major-mode | ||
| 28 | content marker expected-defun) | ||
| 29 | "Generate an ert test for mode-own `add-log-current-defun-function'. | ||
| 30 | Run `add-log-current-defun' at the point where MARKER specifies in a | ||
| 31 | buffer which content is CONTENT under MAJOR-MODE. Then it compares the | ||
| 32 | result with EXPECTED-DEFUN." | ||
| 33 | (let ((xname (intern (concat "add-log-current-defun-test-" | ||
| 34 | (symbol-name name) | ||
| 35 | )))) | ||
| 36 | `(ert-deftest ,xname () | ||
| 37 | ,doc | ||
| 38 | (with-temp-buffer | ||
| 39 | (insert ,content) | ||
| 40 | (goto-char (point-min)) | ||
| 41 | (funcall ',major-mode) | ||
| 42 | (should (equal (when (search-forward ,marker nil t) | ||
| 43 | (replace-match "" nil t) | ||
| 44 | (add-log-current-defun)) | ||
| 45 | ,expected-defun)))))) | ||
| 46 | |||
| 47 | (add-log-current-defun-deftest | ||
| 48 | sh-func1 | ||
| 49 | "Test sh-current-defun-name can find function." | ||
| 50 | sh-mode " | ||
| 51 | function foo | ||
| 52 | { | ||
| 53 | >< | ||
| 54 | }" "><" "foo") | ||
| 55 | |||
| 56 | (add-log-current-defun-deftest | ||
| 57 | sh-func2 | ||
| 58 | "Test sh-current-defun-name can find function." | ||
| 59 | sh-mode " | ||
| 60 | foo() | ||
| 61 | { | ||
| 62 | >< | ||
| 63 | }" "><" "foo") | ||
| 64 | |||
| 65 | (add-log-current-defun-deftest | ||
| 66 | sh-func3 | ||
| 67 | "Test sh-current-defun-name can find function." | ||
| 68 | sh-mode " | ||
| 69 | function foo() | ||
| 70 | { | ||
| 71 | >< | ||
| 72 | }" "><" "foo") | ||
| 73 | |||
| 74 | (add-log-current-defun-deftest | ||
| 75 | sh-var | ||
| 76 | "Test sh-current-defun-name can find variabe definition." | ||
| 77 | sh-mode " | ||
| 78 | PATH=a:/ab:/usr/abc | ||
| 79 | DIR=/pr><oc" | ||
| 80 | "><" "DIR") | ||
| 81 | |||
| 82 | (provide 'add-log-tests) | ||
| 83 | |||
| 84 | ;;; add-log-tests.el ends here | ||