diff --git a/doc/emacs/ChangeLog b/doc/emacs/ChangeLog index 1287733b129..13536406158 100644 --- a/doc/emacs/ChangeLog +++ b/doc/emacs/ChangeLog @@ -1,3 +1,19 @@ +2015-02-26 Eli Zaretskii + + * msdog.texi (Windows Files): Document characters invalid in + Windows file names. (Bug#19463) + + * custom.texi (Customization Groups): Update the looks of the + Customize Group buffer. + + * programs.texi (Hungry Delete): Fix a typo: "C-d" instead of + "C-c C-d" in hungry-delete mode. + +2015-02-26 Eli Zaretskii + + * mule.texi (Language Environments): Work around refill bug in + makeinfo 4.x. (Bug#19697) + 2015-01-28 Eli Zaretskii * cmdargs.texi (Action Arguments): Clarify into which buffer diff --git a/doc/emacs/custom.texi b/doc/emacs/custom.texi index 095e49be90c..9fd823bbae1 100644 --- a/doc/emacs/custom.texi +++ b/doc/emacs/custom.texi @@ -82,14 +82,12 @@ top-level @code{Emacs} group. It looks like this, in part: @c @page @smallexample @group -To apply changes, use the Save or Set buttons. -For details, see [Saving Customizations] in the [Emacs manual]. +For help, see [Easy Customization] in the [Emacs manual]. ________________________________________ [ Search ] Operate on all settings in this buffer: - [ Set for current session ] [ Save for future sessions ] - [ Undo edits ] [ Reset to saved ] [ Erase customizations ] [ Exit ] + [ Revert... ] [ Apply ] [ Apply and Save ] Emacs group: Customization of the One True Editor. @@ -97,7 +95,6 @@ Emacs group: Customization of the One True Editor. See also [Manual]. [Editing] : Basic text editing facilities. - [Convenience] : Convenience features for faster editing. @var{more second-level groups} diff --git a/doc/emacs/msdos.texi b/doc/emacs/msdos.texi index b5a66503ca2..10e79236938 100644 --- a/doc/emacs/msdos.texi +++ b/doc/emacs/msdos.texi @@ -249,7 +249,42 @@ removable and remote volumes, where this could potentially slow down Dired and other related features. The value of @code{nil} means never issue those system calls. Non-@code{nil} values are more useful on NTFS volumes, which support hard links and file security, than on FAT, -FAT32, and XFAT volumes. +FAT32, and exFAT volumes. + +@cindex file names, invalid characters on MS-Windows + Unlike Unix, MS-Windows file systems restrict the set of characters +that can be used in a file name. The following characters are not +allowed: + +@itemize @bullet +@item +Shell redirection symbols @samp{<}, @samp{>}, and @samp{|}. + +@item +Colon @samp{:} (except after the drive letter). + +@item +Forward slash @samp{/} and backslash @samp{\} (except as directory +separators). + +@item +Wildcard characters @samp{*} and @samp{?}. + +@item +Control characters whose codepoints are 1 through 31 decimal. In +particular, newlines in file names are not allowed. + +@item +The null character, whose codepoint is zero (this limitation exists on +Unix filesystems as well). +@end itemize + +@noindent +In addition, referencing any file whose name matches a DOS character +device, such as @file{NUL} or @file{LPT1} or @file{PRN} or @file{CON}, +with or without any file-name extension, will always resolve to those +character devices, in any directory. Therefore, only use such file +names when you want to use the corresponding character device. @node ls in Lisp @section Emulation of @code{ls} on MS-Windows diff --git a/doc/emacs/mule.texi b/doc/emacs/mule.texi index bea06f5ff5a..f8b06bdb5d9 100644 --- a/doc/emacs/mule.texi +++ b/doc/emacs/mule.texi @@ -265,123 +265,101 @@ the list of supported language environments, and use the command for more information about the language environment @var{lang-env}. Supported language environments include: +@c @cindex entries below are split between portions of the list to +@c make them more accurate, i.e. land on the line that mentions the +@c language. However, makeinfo 4.x doesn't fill inside @quotation +@c lines that follow a @cindex entry and whose text has no whitespace. +@c To work around, we group the language environments together, so +@c that the blank that separates them triggers refill. @quotation @cindex ASCII -ASCII, @cindex Arabic -Arabic, +ASCII, Arabic, @cindex Belarusian -Belarusian, @cindex Bengali -Bengali, +Belarusian, Bengali, @cindex Brazilian Portuguese -Brazilian Portuguese, @cindex Bulgarian -Bulgarian, +Brazilian Portuguese, Bulgarian, @cindex Burmese -Burmese, @cindex Cham -Cham, +Burmese, Cham, @cindex Chinese Chinese-BIG5, Chinese-CNS, Chinese-EUC-TW, Chinese-GB, Chinese-GB18030, Chinese-GBK, @cindex Croatian -Croatian, @cindex Cyrillic -Cyrillic-ALT, Cyrillic-ISO, Cyrillic-KOI8, +Croatian, Cyrillic-ALT, Cyrillic-ISO, Cyrillic-KOI8, @cindex Czech -Czech, @cindex Devanagari -Devanagari, +Czech, Devanagari, @cindex Dutch -Dutch, @cindex English -English, +Dutch, English, @cindex Esperanto -Esperanto, @cindex Ethiopic -Ethiopic, +Esperanto, Ethiopic, @cindex French -French, @cindex Georgian -Georgian, +French, Georgian, @cindex German -German, @cindex Greek -Greek, @cindex Gujarati -Gujarati, +German, Greek, Gujarati, @cindex Hebrew -Hebrew, @cindex IPA -IPA, +Hebrew, IPA, @cindex Italian Italian, @cindex Japanese -Japanese, @cindex Kannada -Kannada, +Japanese, Kannada, @cindex Khmer -Khmer, @cindex Korean -Korean, @cindex Lao -Lao, +Khmer, Korean, Lao, @cindex Latin Latin-1, Latin-2, Latin-3, Latin-4, Latin-5, Latin-6, Latin-7, Latin-8, Latin-9, @cindex Latvian -Latvian, @cindex Lithuanian -Lithuanian, +Latvian, Lithuanian, @cindex Malayalam -Malayalam, @cindex Oriya -Oriya, +Malayalam, Oriya, @cindex Persian -Persian, @cindex Polish -Polish, +Persian, Polish, @cindex Punjabi -Punjabi, @cindex Romanian -Romanian, +Punjabi, Romanian, @cindex Russian -Russian, @cindex Sinhala -Sinhala, +Russian, Sinhala, @cindex Slovak -Slovak, @cindex Slovenian -Slovenian, @cindex Spanish -Spanish, +Slovak, Slovenian, Spanish, @cindex Swedish -Swedish, @cindex TaiViet -TaiViet, +Swedish, TaiViet, @cindex Tajik -Tajik, @cindex Tamil -Tamil, +Tajik, Tamil, @cindex Telugu -Telugu, @cindex Thai -Thai, +Telugu, Thai, @cindex Tibetan -Tibetan, @cindex Turkish -Turkish, +Tibetan, Turkish, @cindex UTF-8 -UTF-8, @cindex Ukrainian -Ukrainian, +UTF-8, Ukrainian, @cindex Vietnamese -Vietnamese, @cindex Welsh -Welsh, and +Vietnamese, Welsh, @cindex Windows-1255 -Windows-1255. +and Windows-1255. @end quotation To display the script(s) used by your language environment on a diff --git a/doc/emacs/programs.texi b/doc/emacs/programs.texi index 609392f6bb7..73aed087f45 100644 --- a/doc/emacs/programs.texi +++ b/doc/emacs/programs.texi @@ -1666,7 +1666,7 @@ Delete the entire block of whitespace after point (@code{c-hungry-delete-forward As an alternative to the above commands, you can enable @dfn{hungry delete mode}. When this feature is enabled (indicated by @samp{/h} in the mode line after the mode name), a single @key{DEL} deletes all -preceding whitespace, not just one space, and a single @kbd{C-c C-d} +preceding whitespace, not just one space, and a single @kbd{C-d} (but @emph{not} plain @key{Delete}) deletes all following whitespace. @table @kbd diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 33e04807e87..8ccc2c35b1f 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,38 @@ +2015-02-26 Alan Mackenzie + + Handle "#" operator properly inside macro. Fix coding bug. + + * progmodes/cc-mode.el (c-neutralize-syntax-in-and-mark-CPP): On + finding a "#" which looks like the start of a macro, check it + isn't already inside a macro. + + * progmodes/cc-engine.el (c-state-safe-place): Don't record a new + "safe" position into the list of them when this is beyond our + current position. + +2015-02-26 Martin Rudalics + + * menu-bar.el (menu-bar-non-minibuffer-window-p): Return nil when + the menu frame is dead. (Bug#19728) + +2015-02-26 Fabián Ezequiel Gallina + + python.el: Handle tabs in python-indent-dedent-line. + + * progmodes/python.el (python-indent-dedent-line): Fixes for + indentation with tabs. Thanks to (Bug#19730). + +2015-02-26 Fabián Ezequiel Gallina + + * progmodes/python.el (python-indent-context): Respect user + indentation after comment. + +2015-02-26 Tassilo Horn + + * textmodes/reftex-vars.el (featurep): Conditionalize value of + reftex-label-regexps in order to stay compatible with XEmacs 21.5 + which has no explicitly numbered groups in regexps (bug#19714). + 2015-02-26 Daiki Ueno * net/dbus.el (dbus-register-signal): Convert "N" of ":argN" to diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el index cd1a4d05b55..5fdb9377a48 100644 --- a/lisp/menu-bar.el +++ b/lisp/menu-bar.el @@ -1747,12 +1747,14 @@ The menu frame is the frame for which we are updating the menu." (frame-visible-p menu-frame)))) (defun menu-bar-non-minibuffer-window-p () - "Return non-nil if selected window of the menu frame is not a minibuf window. - -See the documentation of `menu-bar-menu-frame-live-and-visible-p' -for the definition of the menu frame." + "Return non-nil if the menu frame's selected window is no minibuffer window. +Return nil if the menu frame is dead or its selected window is a +minibuffer window. The menu frame is the frame for which we are +updating the menu." (let ((menu-frame (or menu-updating-frame (selected-frame)))) - (not (window-minibuffer-p (frame-selected-window menu-frame))))) + (and (frame-live-p menu-frame) + (not (window-minibuffer-p + (frame-selected-window menu-frame)))))) (defun kill-this-buffer () ; for the menu bar "Kill the current buffer. diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index 328e0f79a1c..823d795b6de 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -2277,7 +2277,9 @@ comment at the start of cc-engine.el for more info." (while ;; Add an element to `c-state-nonlit-pos-cache' each iteration. (and - (<= (setq npos (+ pos c-state-nonlit-pos-interval)) here) + (setq npos + (when (<= (+ pos c-state-nonlit-pos-interval) here) + (+ pos c-state-nonlit-pos-interval))) ;; Test for being in a literal. If so, go to after it. (progn @@ -2304,7 +2306,9 @@ comment at the start of cc-engine.el for more info." ;; Add one extra element above HERE so as to to avoid the previous ;; expensive calculation when the next call is close to the current ;; one. This is especially useful when inside a large macro. - (setq c-state-nonlit-pos-cache (cons npos c-state-nonlit-pos-cache))) + (when npos + (setq c-state-nonlit-pos-cache + (cons npos c-state-nonlit-pos-cache)))) (if (> pos c-state-nonlit-pos-cache-limit) (setq c-state-nonlit-pos-cache-limit pos)) @@ -3069,7 +3073,7 @@ comment at the start of cc-engine.el for more info." (setq dropped-cons (consp (car c-state-cache))) (setq c-state-cache (cdr c-state-cache)) (setq pos pa)) - ;; At this stage, (> pos here); + ;; At this stage, (>= pos here); ;; (< (c-state-cache-top-lparen) here) (or is nil). (cond diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el index 01e93b3f202..c02192608b2 100644 --- a/lisp/progmodes/cc-mode.el +++ b/lisp/progmodes/cc-mode.el @@ -968,12 +968,17 @@ Note that the style variables are always made local to the buffer." (let ((pps-position (point)) pps-state mbeg) (while (and (< (point) c-new-END) (search-forward-regexp c-anchored-cpp-prefix c-new-END t)) - ;; If we've found a "#" inside a string/comment, ignore it. - (setq pps-state - (parse-partial-sexp pps-position (point) nil nil pps-state) - pps-position (point)) - (unless (or (nth 3 pps-state) ; in a string? - (nth 4 pps-state)) ; in a comment? + ;; If we've found a "#" inside a macro/string/comment, ignore it. + (unless + (or (save-excursion + (goto-char (match-beginning 0)) + (c-beginning-of-macro)) + (progn + (setq pps-state + (parse-partial-sexp pps-position (point) nil nil pps-state) + pps-position (point)) + (or (nth 3 pps-state) ; in a string? + (nth 4 pps-state)))) ; in a comment? (goto-char (match-beginning 1)) (setq mbeg (point)) (if (> (c-syntactic-end-of-macro) mbeg) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 4420faf3dfc..1c3f7466c8c 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -843,15 +843,6 @@ keyword ;; Beginning of buffer. ((= (line-number-at-pos) 1) (cons :no-indent 0)) - ;; Comment continuation (maybe). - ((save-excursion - (when (and - (or - (python-info-current-line-comment-p) - (python-info-current-line-empty-p)) - (forward-comment -1) - (python-info-current-line-comment-p)) - (cons :after-comment (point))))) ;; Inside a string. ((let ((start (python-syntax-context 'string ppss))) (when start @@ -963,28 +954,29 @@ keyword ((let ((start (python-info-dedenter-statement-p))) (when start (cons :at-dedenter-block-start start)))) - ;; After normal line. - ((let ((start (save-excursion - (back-to-indentation) - (skip-chars-backward " \t\n") - (python-nav-beginning-of-statement) - (point)))) - (when start - (if (save-excursion - (python-util-forward-comment -1) - (python-nav-beginning-of-statement) - (looking-at (python-rx block-ender))) - (cons :after-block-end start) - (cons :after-line start))))) - ;; Default case: do not indent. - (t (cons :no-indent 0)))))) + ;; After normal line, comment or ender (default case). + ((save-excursion + (back-to-indentation) + (skip-chars-backward " \t\n") + (python-nav-beginning-of-statement) + (cons + (cond ((python-info-current-line-comment-p) + :after-comment) + ((save-excursion + (goto-char (line-end-position)) + (python-util-forward-comment -1) + (python-nav-beginning-of-statement) + (looking-at (python-rx block-ender))) + :after-block-end) + (t :after-line)) + (point)))))))) (defun python-indent--calculate-indentation () "Internal implementation of `python-indent-calculate-indentation'. May return an integer for the maximum possible indentation at current context or a list of integers. The latter case is only happening for :at-dedenter-block-start context since the -possibilities can be narrowed to especific indentation points." +possibilities can be narrowed to specific indentation points." (save-restriction (widen) (save-excursion @@ -1075,7 +1067,7 @@ minimum." (defun python-indent-line (&optional previous) "Internal implementation of `python-indent-line-function'. Use the PREVIOUS level when argument is non-nil, otherwise indent -to the maxium available level. When indentation is the minimum +to the maximum available level. When indentation is the minimum possible and PREVIOUS is non-nil, cycle back to the maximum level." (let ((follow-indentation-p @@ -1110,9 +1102,7 @@ indentation levels from right to left." (interactive "*") (when (and (not (bolp)) (not (python-syntax-comment-or-string-p)) - (= (+ (line-beginning-position) - (current-indentation)) - (point))) + (= (current-indentation) (current-column))) (python-indent-line t) t)) diff --git a/lisp/textmodes/reftex-vars.el b/lisp/textmodes/reftex-vars.el index 7fe6882d3ca..7f050e9fd90 100644 --- a/lisp/textmodes/reftex-vars.el +++ b/lisp/textmodes/reftex-vars.el @@ -867,13 +867,17 @@ DOWNCASE t: Downcase words before using them." (string :tag "")) (option (boolean :tag "Downcase words ")))) -(defcustom reftex-label-regexps - '(;; Normal \\label{foo} labels - "\\\\label{\\(?1:[^}]*\\)}" - ;; keyvals [..., label = {foo}, ...] forms used by ctable, - ;; listings, minted, ... - "\\[[^]]*\\ + + * dispextern.h (FACE_FOR_CHAR): Fix the commentary. + +2015-02-26 Hans Wennborg (tiny change) + + * emacs.c (decode_env_path): Add parentheses around ternary + operator to increase readability and pacify compiler warnings. + +2015-02-26 Eli Zaretskii + + * w32.c (sys_readdir): Map ERROR_NOT_READY (as in "device not + ready") to ENOENT. + 2015-02-26 Paul Eggert * xfns.c (x_real_pos_and_offsets): Fix pointer signedness. diff --git a/src/dispextern.h b/src/dispextern.h index 5f730df514b..329572eda22 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -1810,8 +1810,10 @@ struct face_cache ((FACE) == (FACE)->ascii_face) /* Return the id of the realized face on frame F that is like the face - with id ID but is suitable for displaying character CHAR. - This macro is only meaningful for multibyte character CHAR. */ + FACE, but is suitable for displaying character CHAR at buffer or + string position POS. OBJECT is the string object, or nil for + buffer. This macro is only meaningful for multibyte character + CHAR. */ #define FACE_FOR_CHAR(F, FACE, CHAR, POS, OBJECT) \ face_for_char ((F), (FACE), (CHAR), (POS), (OBJECT)) diff --git a/src/emacs.c b/src/emacs.c index c2b698ba50b..cb0c8417794 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -2247,7 +2247,7 @@ decode_env_path (const char *evarname, const char *defalt, bool empty) p = strchr (path, SEPCHAR); if (!p) p = path + strlen (path); - element = (p - path ? make_unibyte_string (path, p - path) + element = ((p - path) ? make_unibyte_string (path, p - path) : empty_element); if (! NILP (element)) { diff --git a/src/w32.c b/src/w32.c index 90096689776..547db0f6dd9 100644 --- a/src/w32.c +++ b/src/w32.c @@ -3455,6 +3455,7 @@ sys_readdir (DIR *dirp) break; case ERROR_PATH_NOT_FOUND: case ERROR_INVALID_DRIVE: + case ERROR_NOT_READY: case ERROR_BAD_NETPATH: case ERROR_BAD_NET_NAME: errno = ENOENT; diff --git a/test/ChangeLog b/test/ChangeLog index 7ba14964c0a..ff3042e8cbf 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,16 @@ +2015-02-26 Fabián Ezequiel Gallina + + * automated/python-tests.el + (python-indent-dedent-line-backspace-2) + (python-indent-dedent-line-backspace-3): New tests. + +2015-02-26 Fabián Ezequiel Gallina + + * automated/python-tests.el (python-indent-pep8-1) + (python-indent-pep8-2, python-indent-pep8-3) + (python-indent-after-comment-2): Fix tests. + (python-indent-after-comment-3): New test. + 2015-02-24 Glenn Morris * automated/f90.el (f90-test-bug-19809): New test. diff --git a/test/automated/python-tests.el b/test/automated/python-tests.el index 47e2a6e8195..b377a26f77a 100644 --- a/test/automated/python-tests.el +++ b/test/automated/python-tests.el @@ -204,7 +204,7 @@ foo = long_function_name(var_one, var_two, (should (eq (car (python-indent-context)) :no-indent)) (should (= (python-indent-calculate-indentation) 0)) (python-tests-look-at "foo = long_function_name(var_one, var_two,") - (should (eq (car (python-indent-context)) :after-line)) + (should (eq (car (python-indent-context)) :after-comment)) (should (= (python-indent-calculate-indentation) 0)) (python-tests-look-at "var_three, var_four)") (should (eq (car (python-indent-context)) :inside-paren)) @@ -222,7 +222,7 @@ def long_function_name( (should (eq (car (python-indent-context)) :no-indent)) (should (= (python-indent-calculate-indentation) 0)) (python-tests-look-at "def long_function_name(") - (should (eq (car (python-indent-context)) :after-line)) + (should (eq (car (python-indent-context)) :after-comment)) (should (= (python-indent-calculate-indentation) 0)) (python-tests-look-at "var_one, var_two, var_three,") (should (eq (car (python-indent-context)) @@ -248,7 +248,7 @@ foo = long_function_name( (should (eq (car (python-indent-context)) :no-indent)) (should (= (python-indent-calculate-indentation) 0)) (python-tests-look-at "foo = long_function_name(") - (should (eq (car (python-indent-context)) :after-line)) + (should (eq (car (python-indent-context)) :after-comment)) (should (= (python-indent-calculate-indentation) 0)) (python-tests-look-at "var_one, var_two,") (should (eq (car (python-indent-context)) :inside-paren-newline-start)) @@ -313,10 +313,10 @@ class Blag(object): def func(arg): # I don't do much return arg - # This comment is badly indented just because. - # But we won't mess with the user in this line. + # This comment is badly indented because the user forced so. + # At this line python.el wont dedent, user is always right. -now_we_do_mess_cause_this_is_not_a_comment = 1 +comment_wins_over_ender = True # yeah, that. " @@ -328,28 +328,49 @@ now_we_do_mess_cause_this_is_not_a_comment = 1 ;; the rules won't apply here. (should (eq (car (python-indent-context)) :after-block-start)) (should (= (python-indent-calculate-indentation) 4)) - (python-tests-look-at "# This comment is badly") + (python-tests-look-at "# This comment is badly indented") (should (eq (car (python-indent-context)) :after-block-end)) - ;; The return keyword moves indentation backwards 4 spaces, but - ;; let's assume this comment was placed there because the user - ;; wanted to (manually adding spaces or whatever). + ;; The return keyword do make indentation lose a level... (should (= (python-indent-calculate-indentation) 0)) - (python-tests-look-at "# but we won't mess") + ;; ...but the current indentation was forced by the user. + (python-tests-look-at "# At this line python.el wont dedent") (should (eq (car (python-indent-context)) :after-comment)) (should (= (python-indent-calculate-indentation) 4)) - ;; Behave the same for blank lines: potentially a comment. + ;; Should behave the same for blank lines: potentially a comment. (forward-line 1) (should (eq (car (python-indent-context)) :after-comment)) (should (= (python-indent-calculate-indentation) 4)) - (python-tests-look-at "now_we_do_mess") - ;; Here is where comment indentation starts to get ignored and - ;; where the user can't freely indent anymore. - (should (eq (car (python-indent-context)) :after-block-end)) - (should (= (python-indent-calculate-indentation) 0)) + (python-tests-look-at "comment_wins_over_ender") + ;; The comment won over the ender because the user said so. + (should (eq (car (python-indent-context)) :after-comment)) + (should (= (python-indent-calculate-indentation) 4)) + ;; The indentation calculated fine for the assignment, but the user + ;; choose to force it back to the first column. Next line should + ;; be aware of that. (python-tests-look-at "# yeah, that.") (should (eq (car (python-indent-context)) :after-line)) (should (= (python-indent-calculate-indentation) 0)))) +(ert-deftest python-indent-after-comment-3 () + "Test after-comment in buggy case." + (python-tests-with-temp-buffer + " +class A(object): + + def something(self, arg): + if True: + return arg + + # A comment + + @adecorator + def method(self, a, b): + pass +" + (python-tests-look-at "@adecorator") + (should (eq (car (python-indent-context)) :after-comment)) + (should (= (python-indent-calculate-indentation) 4)))) + (ert-deftest python-indent-inside-paren-1 () "The most simple inside-paren case that shouldn't fail." (python-tests-with-temp-buffer @@ -2133,6 +2154,55 @@ if True: (call-interactively #'python-indent-dedent-line-backspace) (should (zerop (current-indentation))))) +(ert-deftest python-indent-dedent-line-backspace-2 () + "Check de-indentation with tabs. Bug#19730." + (let ((tab-width 8)) + (python-tests-with-temp-buffer + " +if x: +\tabcdefg +" + (python-tests-look-at "abcdefg") + (goto-char (line-end-position)) + (call-interactively #'python-indent-dedent-line-backspace) + (should + (string= (buffer-substring-no-properties + (line-beginning-position) (line-end-position)) + "\tabcdef"))))) + +(ert-deftest python-indent-dedent-line-backspace-3 () + "Paranoid check of de-indentation with tabs. Bug#19730." + (let ((tab-width 8)) + (python-tests-with-temp-buffer + " +if x: +\tif y: +\t abcdefg +" + (python-tests-look-at "abcdefg") + (goto-char (line-end-position)) + (call-interactively #'python-indent-dedent-line-backspace) + (should + (string= (buffer-substring-no-properties + (line-beginning-position) (line-end-position)) + "\t abcdef")) + (back-to-indentation) + (call-interactively #'python-indent-dedent-line-backspace) + (should + (string= (buffer-substring-no-properties + (line-beginning-position) (line-end-position)) + "\tabcdef")) + (call-interactively #'python-indent-dedent-line-backspace) + (should + (string= (buffer-substring-no-properties + (line-beginning-position) (line-end-position)) + " abcdef")) + (call-interactively #'python-indent-dedent-line-backspace) + (should + (string= (buffer-substring-no-properties + (line-beginning-position) (line-end-position)) + "abcdef"))))) + ;;; Shell integration