commit 44ba8278a64dec8f3fbec7c5eec613013d418f4c (HEAD, refs/remotes/origin/master) Author: Dmitry Gutov Date: Fri Sep 10 03:44:49 2021 +0300 * lisp/progmodes/ruby-mode.el (ruby-current-indentation): Tweak obsoletion. diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el index d3e4077069..6a03856eaf 100644 --- a/lisp/progmodes/ruby-mode.el +++ b/lisp/progmodes/ruby-mode.el @@ -836,7 +836,7 @@ The style of the comment is controlled by `ruby-encoding-magic-comment-style'." ;; `ruby-calculate-indent' in user init files still call it. (defun ruby-current-indentation () "Return the indentation level of current line." - (declare (obsolete nil "28.1")) + (declare (obsolete current-indentation "28.1")) (save-excursion (beginning-of-line) (back-to-indentation) commit b2c44706b69fff4b80cfd78a5cd94a3da1c87fa7 Author: Dmitry Gutov Date: Fri Sep 10 03:16:14 2021 +0300 Support tags-apropos-additional-actions in etags Xref backend * lisp/progmodes/etags.el (xref-etags-apropos-location): New class. (xref-location-marker): New method definition. (xref-make-etags-apropos-location): New function. (etags--xref-apropos-additional): New function. (xref-backend-apropos): Use it here. diff --git a/etc/NEWS b/etc/NEWS index 416a51bd63..8f20db7a76 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2382,6 +2382,9 @@ binding in 'xref--xref-buffer-mode-map'. When non-nil, matches for identifiers in the file visited by the current buffer will be shown first in the "*xref*" buffer. +*** The etags Xref backend now honors 'tags-apropos-additional-actions'. +You can customize it to augment the output of 'xref-find-apropos'. + ** Battery --- diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el index a1f806ae8c..7efa88546d 100644 --- a/lisp/progmodes/etags.el +++ b/lisp/progmodes/etags.el @@ -2096,7 +2096,10 @@ file name, add `tag-partial-file-name-match-p' to the list value.") definitions)) (cl-defmethod xref-backend-apropos ((_backend (eql 'etags)) pattern) - (etags--xref-find-definitions (xref-apropos-regexp pattern) t)) + (let ((regexp (xref-apropos-regexp pattern))) + (nconc + (etags--xref-find-definitions regexp t) + (etags--xref-apropos-additional regexp)))) (defun etags--xref-find-definitions (pattern &optional regexp?) ;; This emulates the behavior of `find-tag-in-order' but instead of @@ -2131,6 +2134,32 @@ file name, add `tag-partial-file-name-match-p' to the list value.") (puthash mark-key t marks)))))))))) (nreverse xrefs))) +(defun etags--xref-apropos-additional (regexp) + (cl-mapcan + (lambda (oba) + (pcase-let* ((`(,group ,goto-fun ,symbs) oba) + (res nil) + (add-xref (lambda (sym) + (let ((sn (symbol-name sym))) + (when (string-match-p regexp sn) + (push + (xref-make + sn + (xref-make-etags-apropos-location + sym goto-fun group)) + res)))))) + (when (symbolp symbs) + (if (boundp symbs) + (setq symbs (symbol-value symbs)) + (warn "symbol `%s' has no value" symbs) + (setq symbs nil)) + (if (vectorp symbs) + (mapatoms add-xref symbs) + (dolist (sy symbs) + (funcall add-xref (car sy)))) + (nreverse res)))) + tags-apropos-additional-actions)) + (defclass xref-etags-location (xref-location) ((tag-info :type list :initarg :tag-info) (file :type string :initarg :file @@ -2155,6 +2184,25 @@ file name, add `tag-partial-file-name-match-p' to the list value.") (with-slots (tag-info) l (nth 1 tag-info))) +(defclass xref-etags-apropos-location (xref-location) + ((symbol :type symbol :initarg :symbol) + (goto-fun :type function :initarg :goto-fun) + (group :type string :initarg :group + :reader xref-location-group)) + :documentation "Location of an additional apropos etags symbol.") + +(defun xref-make-etags-apropos-location (symbol goto-fun group) + (make-instance 'xref-etags-apropos-location + :symbol symbol + :goto-fun goto-fun + :group group)) + +(cl-defmethod xref-location-marker ((l xref-etags-apropos-location)) + (save-window-excursion + (with-slots (goto-fun symbol) l + (funcall goto-fun symbol) + (point-marker)))) + (provide 'etags) commit ceb60225bacc7650b5e52032c0c33b9d67f9a6d7 Author: Eli Zaretskii Date: Thu Sep 9 21:04:13 2021 +0300 ; * lisp/progmodes/python.el (python-shell-send-string): Fix last change. diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 3fc2700663..e342ce7f56 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -3152,7 +3152,7 @@ t when called interactively." (python-shell--encode-string string) (python-shell--encode-string (or (buffer-file-name) ""))))) - (if (or (null (process-connection-type process)) + (if (or (null (process-tty-name process)) (<= (string-bytes code) comint-max-line-length)) (comint-send-string process code) (let* ((temp-file-name (with-current-buffer (process-buffer process) commit d92db04a9de4f917a16b8cf1e6f0072d1bf697d5 Author: Eli Zaretskii Date: Thu Sep 9 21:01:53 2021 +0300 Improve documentation of tab-bar functions and variables * etc/NEWS: Improve wording of tab-bar related entries. * lisp/tab-bar.el (tab-bar-show, tab-bar-select-tab-modifiers): Improve and clarify the doc strings. diff --git a/etc/NEWS b/etc/NEWS index ff4908af47..416a51bd63 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -403,13 +403,6 @@ both modes are on). ** Tab Bars and Tab Lines -*** The tab bar now supports more mouse commands. -Clicking 'mouse-2' closes the tab, 'mouse-3' displays the context menu -with items that operate on the clicked tab. Dragging the tab with -'mouse-1' moves it to another position on the tab bar. Mouse wheel -scrolling switches to the previous/next tab, and holding the Shift key -during scrolling moves the tab to the left/right. - *** The prefix key 'C-x t t' can be used to display a buffer in a new tab. Typing 'C-x t t' before a command will cause the buffer shown by that command to be displayed in a new tab. 'C-x t t" is bound to the @@ -418,10 +411,17 @@ command 'other-tab-prefix'. +++ *** New command 'C-x t C-r' to open file read-only in the other tab. +*** The tab bar now supports more mouse commands. +Clicking 'mouse-2' closes the tab, 'mouse-3' displays the context menu +with items that operate on the clicked tab. Dragging the tab with +'mouse-1' moves it to another position on the tab bar. Mouse wheel +scrolling switches to the previous/next tab, and holding the Shift key +during scrolling moves the tab to the left/right. + --- *** The tab bar is frame-local when 'tab-bar-show' is a number. -Show/hide the tab bar independently for each frame, according to the -value of 'tab-bar-show'. +You can show/hide the tab bar independently for each frame, according +to the value of 'tab-bar-show'. --- *** New command 'toggle-frame-tab-bar'. @@ -438,8 +438,14 @@ When 'tab-bar-format-tabs' is replaced with 'tab-bar-format-tabs-groups', the tab bar displays tab groups. --- -*** 'Mod-9' bound to 'tab-last' now switches to the last tab. -It also supports a negative argument. +*** New optional key binding for 'tab-last'. +If you customize the variable 'tab-bar-select-tab-modifiers' for +selecting tabs using its index numbers, the '-9' key is +bound to 'tab-last', and switches to the last tab. Here is +any of the modifiers in the list that is the value of +'tab-bar-select-tab-modifiers'. You can also use negative indices, +which count from the last tab: -1 is the last tab, -2 the one before +that, etc. --- *** New command 'tab-duplicate' bound to 'C-x t n'. diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el index 63b1f15e09..faa155c53f 100644 --- a/lisp/tab-bar.el +++ b/lisp/tab-bar.el @@ -89,10 +89,13 @@ (defcustom tab-bar-select-tab-modifiers '() - "List of modifier keys for selecting a tab by its index digit. + "List of modifier keys for selecting tab-bar tabs by index numbers. Possible modifier keys are `control', `meta', `shift', `hyper', `super' and -`alt'. To help you to select a tab by its number, you can customize -`tab-bar-tab-hints' that will show tab numbers alongside the tab name." +`alt'. Presiing one of the modifiers in the list and a digit selects +the tab whose index equals the digit. Negative numbers count from +the end of the tab bar. The digit 9 selects the last (rightmost) tab. +For easier selection of tabs by their numbers, consider customizing +`tab-bar-tab-hints', which will show tab numbers alongside the tab name." :type '(set :tag "Tab selection modifier keys" (const control) (const meta) @@ -353,8 +356,12 @@ and to bind mouse events to the commands." "Defines when to show the tab bar. If t, enable `tab-bar-mode' automatically on using the commands that create new window configurations (e.g. `tab-new'). -If the value is `1', then hide the tab bar when it has only one tab, -and show it again once more tabs are created. +If a non-negative integer, hide the tab bar when the number of the +tabs does not exceed the value of this variable. In particular, +if the value is 1, hide the tab bar when it has only one tab, and +show it again once more tabs are created. A value that is a +non-negative integer also makes the tab bar frame-local: the tab +bar can be shown or hidden independently for each frame. If nil, always keep the tab bar hidden. In this case it's still possible to use persistent named window configurations by relying on keyboard commands `tab-new', `tab-close', `tab-next', `tab-switcher', etc. commit bac632aaec3add5c8ecaf75ea481b93ac8c1a2cb Author: Eli Zaretskii Date: Thu Sep 9 20:08:56 2021 +0300 Fix a recent change wrt 'comint-max-line-length' * lisp/progmodes/python.el (python-shell-send-string): Only heed 'comint-max-line-length' for subprocesses with which we communicate via PTYs. (Bug#49822) * lisp/comint.el (comint-max-line-length): Doc fix. Add a value for MS-Windows. diff --git a/lisp/comint.el b/lisp/comint.el index c2e528a5d5..02878cc641 100644 --- a/lisp/comint.el +++ b/lisp/comint.el @@ -482,8 +482,11 @@ executed once, when the buffer is created." (defconst comint-max-line-length (pcase system-type ('gnu/linux 4096) + ('windows-nt 8196) (_ 1024)) - "Maximum line length, in bytes, accepted by the inferior process.") + "Maximum line length, in bytes, accepted by the inferior process. +This setting is only meaningful when communicating with subprocesses +via PTYs.") (defvar comint-mode-map (let ((map (make-sparse-keymap))) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 8f7bb7a8b6..3fc2700663 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -3152,7 +3152,8 @@ t when called interactively." (python-shell--encode-string string) (python-shell--encode-string (or (buffer-file-name) ""))))) - (if (<= (string-bytes code) comint-max-line-length) + (if (or (null (process-connection-type process)) + (<= (string-bytes code) comint-max-line-length)) (comint-send-string process code) (let* ((temp-file-name (with-current-buffer (process-buffer process) (python-shell--save-temp-file string))) commit 8c023e5ea159c6756c92fd02643983aa449e0da9 Author: Stefan Monnier Date: Thu Sep 9 16:24:57 2021 +0200 Change ruby-align-chained-calls indendation * lisp/progmodes/ruby-mode.el (ruby-smie-rules): Align with the first sibling on the previous line instead of the last (bug#32496). That is, before it used to be one.two.three .four and now it is one.two.three .four diff --git a/etc/NEWS b/etc/NEWS index 7a924a860f..ff4908af47 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2785,6 +2785,19 @@ different timezone causing a difference in the date. Instead you need to do "emacs -f dun-batch" to start the game in batch mode. +** Ruby Mode + +--- +** 'ruby-use-smie' is declared obsolete. +SMIE is now always enabled and 'ruby-use-smie' only controls whether +indentation is done using SMIE or with the old ad-hoc code. + +--- +** Indentation has changed when 'ruby-align-chained-calls' is non-nil. +This previously used to align subsequent lines with the last sibling, +but it now aligns with the first sibling (which is the preferred style +in Ruby). + * New Modes and Packages in Emacs 28.1 @@ -3108,11 +3121,6 @@ back in Emacs 23.1. The affected functions are: 'make-obsolete', 'replace-regexp-in-string', 'catch', 'throw', 'error', 'signal' and 'play-sound-file'. ---- -** 'ruby-use-smie' is declared obsolete. -SMIE is now always enabled and 'ruby-use-smie' only controls whether -indentation is done using SMIE or with the old ad-hoc code. - --- ** 'sql-*-statement-starters' are no longer user options. These variables describe facts about the SQL standard and diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el index c09f007a5e..d3e4077069 100644 --- a/lisp/progmodes/ruby-mode.el +++ b/lisp/progmodes/ruby-mode.el @@ -640,7 +640,15 @@ It is used when `ruby-encoding-magic-comment-style' is set to `custom'." ('(:before . "do") (ruby-smie--indent-to-stmt)) ('(:before . ".") (if (smie-rule-sibling-p) - (and ruby-align-chained-calls 0) + (when ruby-align-chained-calls + (while + (let ((pos (point)) + (parent (smie-backward-sexp "."))) + (if (not (equal (nth 2 parent) ".")) + (progn (goto-char pos) nil) + (goto-char (nth 1 parent)) + (not (smie-rule-bolp))))) + (cons 'column (current-column))) (smie-backward-sexp ".") (cons 'column (+ (current-column) ruby-indent-level)))) @@ -828,6 +836,7 @@ The style of the comment is controlled by `ruby-encoding-magic-comment-style'." ;; `ruby-calculate-indent' in user init files still call it. (defun ruby-current-indentation () "Return the indentation level of current line." + (declare (obsolete nil "28.1")) (save-excursion (beginning-of-line) (back-to-indentation) diff --git a/test/lisp/progmodes/ruby-mode-tests.el b/test/lisp/progmodes/ruby-mode-tests.el index 8bdfdc310f..2168b38484 100644 --- a/test/lisp/progmodes/ruby-mode-tests.el +++ b/test/lisp/progmodes/ruby-mode-tests.el @@ -357,7 +357,7 @@ VALUES-PLIST is a list with alternating index and value elements." (let ((ruby-align-chained-calls t)) (ruby-should-indent-buffer "one.two.three - | .four + | .four | |my_array.select { |str| str.size > 5 } | .map { |str| str.downcase }" @@ -908,6 +908,33 @@ VALUES-PLIST is a list with alternating index and value elements." (should (equal (buffer-string) orig)))) (kill-buffer buf)))) +(ert-deftest ruby--test-chained-indentation () + (with-temp-buffer + (ruby-mode) + (setq-local ruby-align-chained-calls t) + (insert "some_variable.where +.not(x: nil) +.where(y: 2) +") + (indent-region (point-min) (point-max)) + (should (equal (buffer-string) + "some_variable.where + .not(x: nil) + .where(y: 2) +"))) + + (with-temp-buffer + (ruby-mode) + (setq-local ruby-align-chained-calls t) + (insert "some_variable.where.not(x: nil) +.where(y: 2) +") + (indent-region (point-min) (point-max)) + (should (equal (buffer-string) + "some_variable.where.not(x: nil) + .where(y: 2) +")))) + (provide 'ruby-mode-tests) ;;; ruby-mode-tests.el ends here commit e27385ec372b36822958ebed6792ca806b1a0c3d Author: Augusto Stoffel Date: Thu Sep 9 15:48:37 2021 +0200 Better treatment of line length limits for the Python inferior * lisp/comint.el (comint-max-line-length): New constant reflecting a safe maximum line size that can be sent to an inferior process. * lisp/progmodes/python.el (python-shell-comint-watch-for-first-prompt-output-filter): Send setup code to the inferior process only once and at this stage. (python-shell-eval-setup-code, python-shell-eval-file-setup-code): Move, unchanged, to an earlier point to avoid byte-compiler warnings. (python-shell-send-string-no-output): Revert changes of e32c7d2a8d (python-shell-send-string): Use 'comint-max-line-length' to decide when to resort to temp files. (python-shell-send-string, python-shell-send-file): Don't send setup code each time (bug#49822). diff --git a/lisp/comint.el b/lisp/comint.el index e058e6b8cf..c2e528a5d5 100644 --- a/lisp/comint.el +++ b/lisp/comint.el @@ -479,6 +479,12 @@ executed once, when the buffer is created." :group 'comint :version "26.1") +(defconst comint-max-line-length + (pcase system-type + ('gnu/linux 4096) + (_ 1024)) + "Maximum line length, in bytes, accepted by the inferior process.") + (defvar comint-mode-map (let ((map (make-sparse-keymap))) ;; Keys: diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index db7008df24..8f7bb7a8b6 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -2811,6 +2811,44 @@ eventually provide a shell." :type 'hook :group 'python) +(defconst python-shell-eval-setup-code + "\ +def __PYTHON_EL_eval(source, filename): + import ast, sys + if sys.version_info[0] == 2: + from __builtin__ import compile, eval, globals + else: + from builtins import compile, eval, globals + sys.stdout.write('\\n') + try: + p, e = ast.parse(source, filename), None + except SyntaxError: + t, v, tb = sys.exc_info() + sys.excepthook(t, v, tb.tb_next) + return + if p.body and isinstance(p.body[-1], ast.Expr): + e = p.body.pop() + try: + g = globals() + exec(compile(p, filename, 'exec'), g, g) + if e: + return eval(compile(ast.Expression(e.value), filename, 'eval'), g, g) + except Exception: + t, v, tb = sys.exc_info() + sys.excepthook(t, v, tb.tb_next)" + "Code used to evaluate statements in inferior Python processes.") + +(defconst python-shell-eval-file-setup-code + "\ +def __PYTHON_EL_eval_file(filename, tempname, encoding, delete): + import codecs, os + with codecs.open(tempname or filename, encoding=encoding) as file: + source = file.read().encode(encoding) + if delete and tempname: + os.remove(tempname) + return __PYTHON_EL_eval(source, filename)" + "Code used to evaluate files in inferior Python processes.") + (defun python-shell-comint-watch-for-first-prompt-output-filter (output) "Run `python-shell-first-prompt-hook' when first prompt is found in OUTPUT." (when (not python-shell--first-prompt-received) @@ -2826,6 +2864,15 @@ eventually provide a shell." (setq python-shell--first-prompt-received-output-buffer nil) (setq-local python-shell--first-prompt-received t) (setq python-shell--first-prompt-received-output-buffer nil) + (cl-letf (((symbol-function 'python-shell-send-string) + (lambda (string process) + (comint-send-string + process + (format "exec(%s)\n" (python-shell--encode-string string)))))) + ;; Bootstrap: the normal definition of `python-shell-send-string' + ;; depends on the Python code sent here. + (python-shell-send-string-no-output python-shell-eval-setup-code) + (python-shell-send-string-no-output python-shell-eval-file-setup-code)) (with-current-buffer (current-buffer) (let ((inhibit-quit nil)) (run-hooks 'python-shell-first-prompt-hook)))))) @@ -3081,33 +3128,6 @@ there for compatibility with CEDET.") (delete-trailing-whitespace)) temp-file-name)) -(defconst python-shell-eval-setup-code - "\ -def __PYTHON_EL_eval(source, filename): - import ast, sys - if sys.version_info[0] == 2: - from __builtin__ import compile, eval, globals - else: - from builtins import compile, eval, globals - sys.stdout.write('\\n') - try: - p, e = ast.parse(source, filename), None - except SyntaxError: - t, v, tb = sys.exc_info() - sys.excepthook(t, v, tb.tb_next) - return - if p.body and isinstance(p.body[-1], ast.Expr): - e = p.body.pop() - try: - g = globals() - exec(compile(p, filename, 'exec'), g, g) - if e: - return eval(compile(ast.Expression(e.value), filename, 'eval'), g, g) - except Exception: - t, v, tb = sys.exc_info() - sys.excepthook(t, v, tb.tb_next)" - "Code used to evaluate statements in inferior Python processes.") - (defalias 'python-shell--encode-string (let ((fun (if (and (fboundp 'json-serialize) (>= emacs-major-version 28)) @@ -3128,12 +3148,11 @@ t when called interactively." (interactive (list (read-string "Python command: ") nil t)) (let ((process (or process (python-shell-get-process-or-error msg))) - (code (format "exec(%s);__PYTHON_EL_eval(%s, %s)\n" - (python-shell--encode-string python-shell-eval-setup-code) + (code (format "__PYTHON_EL_eval(%s, %s)\n" (python-shell--encode-string string) (python-shell--encode-string (or (buffer-file-name) ""))))) - (if (<= (string-bytes code) 4096) + (if (<= (string-bytes code) comint-max-line-length) (comint-send-string process code) (let* ((temp-file-name (with-current-buffer (process-buffer process) (python-shell--save-temp-file string))) @@ -3180,8 +3199,7 @@ Return the output." (inhibit-quit t)) (or (with-local-quit - (comint-send-string - process (format "exec(%s)\n" (python-shell--encode-string string))) + (python-shell-send-string string process) (while python-shell-output-filter-in-progress ;; `python-shell-output-filter' takes care of setting ;; `python-shell-output-filter-in-progress' to NIL after it @@ -3378,18 +3396,6 @@ t when called interactively." nil ;; noop msg)))) - -(defconst python-shell-eval-file-setup-code - "\ -def __PYTHON_EL_eval_file(filename, tempname, encoding, delete): - import codecs, os - with codecs.open(tempname or filename, encoding=encoding) as file: - source = file.read().encode(encoding) - if delete and tempname: - os.remove(tempname) - return __PYTHON_EL_eval(source, filename)" - "Code used to evaluate files in inferior Python processes.") - (defun python-shell-send-file (file-name &optional process temp-file-name delete msg) "Send FILE-NAME to inferior Python PROCESS. @@ -3419,9 +3425,7 @@ t when called interactively." (comint-send-string process (format - "exec(%s);exec(%s);__PYTHON_EL_eval_file(%s, %s, %s, %s)\n" - (python-shell--encode-string python-shell-eval-setup-code) - (python-shell--encode-string python-shell-eval-file-setup-code) + "__PYTHON_EL_eval_file(%s, %s, %s, %s)\n" (python-shell--encode-string file-name) (python-shell--encode-string (or temp-file-name "")) (python-shell--encode-string (symbol-name encoding)) commit 2be75990a7ae611e8596a91b5e124dc421ec93b4 Author: Lars Ingebrigtsen Date: Thu Sep 9 15:42:00 2021 +0200 Clarify Gnus vs. font locking in the Gnus manual * doc/misc/gnus.texi (Formatting Variables): Explicitly mention that font locking doesn't work in Gnus buffers (bug#50474). diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi index b384764740..4559ae8e31 100644 --- a/doc/misc/gnus.texi +++ b/doc/misc/gnus.texi @@ -22727,6 +22727,13 @@ output lines in the various buffers. There's quite a lot of them. Fortunately, they all use the same syntax, so there's not that much to be annoyed by. +Gnus does not use the font locking machinery used by most modes in +Emacs, so switching @code{font-lock-mode} on in the Gnus +group/summary/article buffers usually doesn't do anything +useful---instead it'll just mess up the faces that Gnus has already +put in the buffer. (This is also the case for other minor modes that +use the font locking machinery, like @code{whitespace-mode}.) + Here's an example format spec (from the group buffer): @samp{%M%S%5y: %(%g%)\n}. We see that it is indeed extremely ugly, and that there are lots of percentages everywhere. commit 8da1f03151f6b98d349fa8eb169514fd1f4bbe02 Author: Lars Ingebrigtsen Date: Thu Sep 9 15:19:56 2021 +0200 Remove the "Real meaning of copyleft" node in efaq * doc/misc/efaq.texi (Real meaning of copyleft): Remove the section (bug#50446). (Common acronyms): Add a link to the GNU site's page about licenses. diff --git a/doc/misc/efaq.texi b/doc/misc/efaq.texi index 9b8fc86508..d5d1eb5e65 100644 --- a/doc/misc/efaq.texi +++ b/doc/misc/efaq.texi @@ -294,6 +294,9 @@ Richard Matthew Stallman @item GPL GNU General Public License +See @uref{https://gnu.org/licenses/, the GNU web site} for more +information about the GPL. + @end table The word ``free'' in the title of the Free Software Foundation refers to @@ -312,7 +315,6 @@ This chapter contains general questions having to do with Emacs, the Free Software Foundation, and related organizations. @menu -* Real meaning of copyleft:: * Guidelines for mailing list postings:: * Mailing list archives:: * Reporting bugs:: @@ -320,36 +322,6 @@ Free Software Foundation, and related organizations. * Contacting the FSF:: @end menu -@node Real meaning of copyleft -@section What is the real legal meaning of the GNU copyleft? -@cindex Copyleft, real meaning of -@cindex GPL, real meaning of -@cindex General Public License, real meaning of -@cindex Discussion of the GPL - -The real legal meaning of the GNU General Public License (copyleft) will -only be known if and when a judge rules on its validity and scope. -There has never been a copyright infringement case involving the GPL to -set any precedents. Although legal actions have been brought against -companies for violating the terms of the GPL, so far all have been -settled out of court (in favor of the plaintiffs). Please take any -discussion regarding this issue to -@uref{https://lists.gnu.org/mailman/listinfo/gnu-misc-discuss, the -gnu-misc-discuss mailing list}, which was created to hold the -extensive flame wars on the subject. - -RMS writes: - -@quotation -The legal meaning of the GNU copyleft is less important than the spirit, -which is that Emacs is a free software project and that work pertaining -to Emacs should also be free software. ``Free'' means that all users -have the freedom to study, share, change and improve Emacs. To make -sure everyone has this freedom, pass along source code when you -distribute any version of Emacs or a related program, and give the -recipients the same freedom that you enjoyed. -@end quotation - @node Guidelines for mailing list postings @section What are appropriate messages for the various Emacs mailing lists? @cindex Mailing lists, appropriate messages for