* bug#5560: 23.1.92; parens matching in c-mode broken @ 2010-02-11 3:01 David Reitter 2016-02-17 3:56 ` Andrew Hyatt 0 siblings, 1 reply; 10+ messages in thread From: David Reitter @ 2010-02-11 3:01 UTC (permalink / raw) To: 5560 [-- Attachment #1: Type: text/plain, Size: 11382 bytes --] Parens matching in C mode is sometimes surprising. In the example below, double-clicking on either of the first two opening parentheses will mark the text until the " hyper_modifier : 0)", but that is correct only for the second paren, while the first one is unmatched due to a space following the backslash. #define EV_MODIFIERS(e) \ ((([e modifierFlags] & NSHelpKeyMask) ? \ hyper_modifier : 0) \ ... It would be more useful if an "unmatched parentheses" was shown, or if the region up to the end of the scan process (i.e. the space+newline) was marked. In GNU Emacs 23.1.92.86 (x86_64-apple-darwin10.2.0, NS apple-appkit-1038.25) of 2010-02-08 on scarlett.local - Aquamacs Distribution 2.0dev Windowing system distributor `Apple', version 10.3.1038 configured using `configure '--with-ns' 'CFLAGS=-O0 -g'' Important settings: value of $LC_ALL: nil value of $LC_COLLATE: nil value of $LC_CTYPE: nil value of $LC_MESSAGES: nil value of $LC_MONETARY: nil value of $LC_NUMERIC: nil value of $LC_TIME: nil value of $LANG: en_US.UTF-8 value of $XMODIFIERS: nil locale-coding-system: utf-8-unix default enable-multibyte-characters: t Major mode: ObjC/l Minor modes in effect: diff-auto-refine-mode: t which-function-mode: t savehist-mode: t smart-frame-positioning-mode: t aquamacs-autoface-mode: t recentf-mode: t osx-key-mode: t tabbar-mwheel-mode: t tabbar-mode: t show-paren-mode: t delete-selection-mode: t pc-selection-mode: t cua-mode: t tooltip-mode: t mouse-wheel-mode: t tool-bar-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t blink-cursor-mode: t auto-encryption-mode: t auto-compression-mode: t column-number-mode: t line-number-mode: t transient-mark-mode: t abbrev-mode: t Recent input: <double-wheel-down> <triple-wheel-down> <wheel-down> <wheel-down> <double-wheel-down> <down-mouse-1> <mouse-1> <down-mouse-1> <mouse-movement> <mouse-movement> <drag-mouse-1> <kp-delete> <down> <down> <down> <S-down> <S-down> <S-down> <S-down> <S-down> <S-left> <S-left> <S-left> <S-left> <kp-delete> <kp-delete> <kp-delete> <kp-delete> <kp-delete> <down> <down> <A-left> <S-down> <S-down> <S-down> <S-down> <S-down> <kp-delete> <return> <up> <up> <up> <up> <up> <up> <backspace> <down> <down> <down> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <right> | <down> <down> <down> <down> <down> <left> | <down> <down> <down> <down> <right> <down> | <kp-delete> <up> <up> <up> <up> <up> <up> <kp-delete> <up> <up> <up> <up> <up> <kp-delete> <up> <right> <S-down> <S-down> <S-down> <S-down> <S-down> <S-down> <S-down> <S-down> <S-down> <S-down> <S-down> <S-down> <S-down> <S-down> <S-down> <S-down> <S-down> <S-up> <S-up> ⌘X <down> <down> <down> <down> <down> <down> <down> <down> <down> ⌘V <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <tab> <down> <tab> <down> <tab> <down> <tab> <down> <down> <up> <backspace> SPC \ <right> <tab> <down> <tab> <down> <tab> <down> <tab> <A-right> SPC \ <down> <A-backspace> <A-backspace> <tab> <down> <tab> <down> <tab> <down> <tab> <A-right> ) <backspace> <down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> <mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> <mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> <mouse-1> <down-mouse-1> <mouse-movement> <mouse-movement> <mouse-movement> <mouse-movement> <drag-mouse-1> <down-mouse-1> <mouse-1> <down-mouse-1> <mouse-1> ) <backspace> <wheel-up> <double-wheel-up> <down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> <mouse-1> ⌘S <escape> X C - M O D E <return> <down-mouse-1> <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> <mouse-1> <escape> X <up> O B <return> ⌘S <down-mouse-1> <mouse-movement> <mouse-movement> <drag-mouse-1> ⌘C <menu-bar> <help-menu> <bug-diagnosis> <send-emacs-bug-report> Recent messages: Auto-saving... Mark set [4 times] Auto-saving...done Auto-saving...done Mark set Auto-saving...done Auto-saving...done Saving file /Users/dr/ae.git/src/nsterm.m... Wrote /Users/dr/ae.git/src/nsterm.m (No changes need to be saved) Load-path shadows: /Users/dr/Library/Preferences/Aquamacs Emacs/Recent Files hides /Users/dr/Library/Preferences/Aquamacs Emacs/Aquamacs Emacs2/Recent Files /Users/dr/Library/Preferences/Aquamacs Emacs/Preferences hides /Users/dr/Library/Preferences/Aquamacs Emacs/Aquamacs Emacs2/Preferences /Users/dr/Library/Preferences/Aquamacs Emacs/places hides /Users/dr/Library/Preferences/Aquamacs Emacs/Aquamacs Emacs2/places /Users/dr/Library/Preferences/Aquamacs Emacs/minibuffer-history hides /Users/dr/Library/Preferences/Aquamacs Emacs/Aquamacs Emacs2/minibuffer-history /Users/dr/Library/Preferences/Aquamacs Emacs/frame-positions hides /Users/dr/Library/Preferences/Aquamacs Emacs/Aquamacs Emacs2/frame-positions /Users/dr/Library/Preferences/Aquamacs Emacs/customizations hides /Users/dr/Library/Preferences/Aquamacs Emacs/Aquamacs Emacs2/customizations /Library/Application Support/Aquamacs Emacs/JDEE/site-start hides /Library/Application Support/Aquamacs Emacs/SLIME/site-start /Library/Application Support/Aquamacs Emacs/JDEE/cedet/speedbar/speedbar hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/speedbar /Library/Application Support/Aquamacs Emacs/JDEE/cedet/speedbar/sb-image hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/sb-image /Library/Application Support/Aquamacs Emacs/JDEE/cedet/common/ezimage hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/ezimage /Library/Application Support/Aquamacs Emacs/JDEE/cedet/speedbar/dframe hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/dframe /Library/Application Support/Aquamacs Emacs/JDEE/cedet/eieio/eieio hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/emacs-lisp/eieio /Library/Application Support/Aquamacs Emacs/JDEE/cedet/eieio/eieio-speedbar hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/emacs-lisp/eieio-speedbar /Library/Application Support/Aquamacs Emacs/JDEE/cedet/eieio/eieio-opt hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/emacs-lisp/eieio-opt /Library/Application Support/Aquamacs Emacs/JDEE/cedet/eieio/eieio-custom hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/emacs-lisp/eieio-custom /Library/Application Support/Aquamacs Emacs/JDEE/cedet/eieio/eieio-comp hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/emacs-lisp/eieio-comp /Library/Application Support/Aquamacs Emacs/JDEE/cedet/eieio/eieio-base hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/emacs-lisp/eieio-base /Library/Application Support/Aquamacs Emacs/JDEE/cedet/eieio/chart hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/emacs-lisp/chart /Library/Application Support/Aquamacs Emacs/JDEE/cedet/semantic/semantic hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/cedet/semantic /Library/Application Support/Aquamacs Emacs/JDEE/cedet/common/mode-local hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/cedet/mode-local /Library/Application Support/Aquamacs Emacs/JDEE/cedet/common/inversion hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/cedet/inversion /Library/Application Support/Aquamacs Emacs/JDEE/cedet/ede/ede hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/cedet/ede /Library/Application Support/Aquamacs Emacs/JDEE/cedet/common/cedet hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/cedet/cedet /Library/Application Support/Aquamacs Emacs/JDEE/cedet/common/cedet-files hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/cedet/cedet-files /Library/Application Support/Aquamacs Emacs/JDEE/site-start hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/aquamacs/site-start Features: (shadow sort mail-extr message ecomplete rfc822 mml mml-sec password-cache mm-decode mm-bodies mm-encode mailabbrev nnheader gnus-util netrc gmm-utils mailheader canlock sha1 hex-util hashcash emacsbug cc-mode cc-fonts cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs log-edit ring pcvs-util add-log diff-mode vc vc-dispatcher cl-specs edebug multi-isearch jka-compr find-func vc-git url-http tls url-auth mail-parse rfc2231 rfc2047 rfc2045 qp ietf-drums url-gw url-cache url url-proxy url-privacy url-expand url-methods url-history url-cookie url-util url-parse url-vars mm-util mail-prsvr mailcap mail-utils which-func imenu slime-autoloads load-emacs-plugins aquamacs-mode-defaults auctex-config server tex-site smart-dnd aquamacs-aux savehist mouse-sel one-buffer-one-frame smart-frame-positioning drews_init color-theme-autoloads saveplace visual-line aquamacs-bug aquamacs-autoface-mode aquamacs-editing sendmail recentf tree-widget cus-edit osxkeys emulate-mac-keyboard-mode frame-cmds strings misc-fns thingatpt+ thingatpt frame-fns avoid aquamacs-mac-fontsets fit-frame aquamacs-frame-setup aquamacs-tabbar tabbar-window cl cl-19 tabbar easy-mmode cus-start cus-load load-emacs-pre-plugins aquamacs-site-start cocoa-compatibility filladapt aquamacs-redo check-for-updates aquamacs-menu osx_defaults aquamacs-tool-bar aquamacs mac-extra-functions aquamacs-tools aquamacs-macros parse-time timezone time-date paren delsel pc-select cua-base wid-edit regexp-opt advice advice-preload byte-opt bytecomp byte-compile debug help-fns help-mode view image-file disp-table tooltip ediff-hook vc-hooks lisp-float-type mwheel ns-win easymenu tool-bar dnd fontset image fringe lisp-mode register page menu-bar rfn-eshadow timer select scroll-bar mldrag mouse jit-lock font-lock syntax facemenu font-core frame cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese case-table epa-hook jka-cmpr-hook help simple abbrev loaddefs button minibuffer faces cus-face files text-properties overlay md5 base64 format env code-pages mule custom widget hashtable-print-readable backquote make-network-process ns multi-tty emacs) [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 203 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#5560: 23.1.92; parens matching in c-mode broken 2010-02-11 3:01 bug#5560: 23.1.92; parens matching in c-mode broken David Reitter @ 2016-02-17 3:56 ` Andrew Hyatt 2016-02-20 22:57 ` Alan Mackenzie 0 siblings, 1 reply; 10+ messages in thread From: Andrew Hyatt @ 2016-02-17 3:56 UTC (permalink / raw) To: David Reitter; +Cc: 5560 I can confirm this still doesn't work right in Emacs 25. However, I get a slightly different experience, with clicking on all 3 left parens highlighting until the first right paren only. Similarly, that right paren seems to be the matching paren for all 3 left parens. David Reitter <david.reitter@gmail.com> writes: > Parens matching in C mode is sometimes surprising. In the example > below, double-clicking on either of the first two opening parentheses > will mark the text until the " hyper_modifier : 0)", but that is correct > only for the second paren, while the first one is unmatched due to a space > following the backslash. > > #define EV_MODIFIERS(e) \ > ((([e modifierFlags] & NSHelpKeyMask) ? \ > hyper_modifier : 0) \ > ... > > > It would be more useful if an "unmatched parentheses" was shown, or if the region up to the end of the scan process (i.e. the space+newline) was marked. > > > > > In GNU Emacs 23.1.92.86 (x86_64-apple-darwin10.2.0, NS apple-appkit-1038.25) > of 2010-02-08 on scarlett.local - Aquamacs Distribution 2.0dev > Windowing system distributor `Apple', version 10.3.1038 > configured using `configure '--with-ns' 'CFLAGS=-O0 -g'' > > Important settings: > value of $LC_ALL: nil > value of $LC_COLLATE: nil > value of $LC_CTYPE: nil > value of $LC_MESSAGES: nil > value of $LC_MONETARY: nil > value of $LC_NUMERIC: nil > value of $LC_TIME: nil > value of $LANG: en_US.UTF-8 > value of $XMODIFIERS: nil > locale-coding-system: utf-8-unix > default enable-multibyte-characters: t > > Major mode: ObjC/l > > Minor modes in effect: > diff-auto-refine-mode: t > which-function-mode: t > savehist-mode: t > smart-frame-positioning-mode: t > aquamacs-autoface-mode: t > recentf-mode: t > osx-key-mode: t > tabbar-mwheel-mode: t > tabbar-mode: t > show-paren-mode: t > delete-selection-mode: t > pc-selection-mode: t > cua-mode: t > tooltip-mode: t > mouse-wheel-mode: t > tool-bar-mode: t > menu-bar-mode: t > file-name-shadow-mode: t > global-font-lock-mode: t > font-lock-mode: t > blink-cursor-mode: t > auto-encryption-mode: t > auto-compression-mode: t > column-number-mode: t > line-number-mode: t > transient-mark-mode: t > abbrev-mode: t > > Recent input: > <double-wheel-down> <triple-wheel-down> <wheel-down> > <wheel-down> <double-wheel-down> <down-mouse-1> <mouse-1> > <down-mouse-1> <mouse-movement> <mouse-movement> <drag-mouse-1> > <kp-delete> <down> <down> <down> <S-down> <S-down> > <S-down> <S-down> <S-down> <S-left> <S-left> <S-left> > <S-left> <kp-delete> <kp-delete> <kp-delete> <kp-delete> > <kp-delete> <down> <down> <A-left> <S-down> <S-down> > <S-down> <S-down> <S-down> <kp-delete> <return> <up> > <up> <up> <up> <up> <up> <backspace> <down> <down> > <down> <up> <up> <up> <up> <up> <up> <up> <up> <up> > <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> > <up> <up> <up> <right> | <down> <down> <down> <down> > <down> <left> | <down> <down> <down> <down> <right> > <down> | <kp-delete> <up> <up> <up> <up> <up> <up> > <kp-delete> <up> <up> <up> <up> <up> <kp-delete> <up> > <right> <S-down> <S-down> <S-down> <S-down> <S-down> > <S-down> <S-down> <S-down> <S-down> <S-down> <S-down> > <S-down> <S-down> <S-down> <S-down> <S-down> <S-down> > <S-up> <S-up> ⌘X <down> <down> <down> <down> <down> > <down> <down> <down> <down> ⌘V <up> <up> <up> <up> > <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> <up> > <tab> <down> <tab> <down> <tab> <down> <tab> <down> > <down> <up> <backspace> SPC \ <right> <tab> <down> > <tab> <down> <tab> <down> <tab> <A-right> SPC \ <down> > <A-backspace> <A-backspace> <tab> <down> <tab> <down> > <tab> <down> <tab> <A-right> ) <backspace> <down-mouse-1> > <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> > <mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> > <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> > <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> > <double-mouse-1> <down-mouse-1> <mouse-1> <down-mouse-1> > <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> > <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> > <mouse-1> <double-down-mouse-1> <double-mouse-1> <down-mouse-1> > <mouse-1> <down-mouse-1> <mouse-movement> <mouse-movement> > <mouse-movement> <mouse-movement> <drag-mouse-1> <down-mouse-1> > <mouse-1> <down-mouse-1> <mouse-1> ) <backspace> <wheel-up> > <double-wheel-up> <down-mouse-1> <mouse-1> <double-down-mouse-1> > <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> > <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> > <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> > <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> > <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> > <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> > <double-mouse-1> <down-mouse-1> <mouse-1> <double-down-mouse-1> > <double-mouse-1> <down-mouse-1> <mouse-1> ⌘S <escape> > X C - M O D E <return> <down-mouse-1> <mouse-1> <double-down-mouse-1> > <double-mouse-1> <down-mouse-1> <mouse-1> <escape> > X <up> O B <return> ⌘S <down-mouse-1> <mouse-movement> > <mouse-movement> <drag-mouse-1> ⌘C <menu-bar> <help-menu> > <bug-diagnosis> <send-emacs-bug-report> > > Recent messages: > Auto-saving... > Mark set [4 times] > Auto-saving...done > Auto-saving...done > Mark set > Auto-saving...done > Auto-saving...done > Saving file /Users/dr/ae.git/src/nsterm.m... > Wrote /Users/dr/ae.git/src/nsterm.m > (No changes need to be saved) > > Load-path shadows: > /Users/dr/Library/Preferences/Aquamacs Emacs/Recent Files hides /Users/dr/Library/Preferences/Aquamacs Emacs/Aquamacs Emacs2/Recent Files > /Users/dr/Library/Preferences/Aquamacs Emacs/Preferences hides /Users/dr/Library/Preferences/Aquamacs Emacs/Aquamacs Emacs2/Preferences > /Users/dr/Library/Preferences/Aquamacs Emacs/places hides /Users/dr/Library/Preferences/Aquamacs Emacs/Aquamacs Emacs2/places > /Users/dr/Library/Preferences/Aquamacs Emacs/minibuffer-history hides /Users/dr/Library/Preferences/Aquamacs Emacs/Aquamacs Emacs2/minibuffer-history > /Users/dr/Library/Preferences/Aquamacs Emacs/frame-positions hides /Users/dr/Library/Preferences/Aquamacs Emacs/Aquamacs Emacs2/frame-positions > /Users/dr/Library/Preferences/Aquamacs Emacs/customizations hides /Users/dr/Library/Preferences/Aquamacs Emacs/Aquamacs Emacs2/customizations > /Library/Application Support/Aquamacs Emacs/JDEE/site-start hides /Library/Application Support/Aquamacs Emacs/SLIME/site-start > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/speedbar/speedbar hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/speedbar > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/speedbar/sb-image hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/sb-image > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/common/ezimage hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/ezimage > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/speedbar/dframe hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/dframe > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/eieio/eieio hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/emacs-lisp/eieio > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/eieio/eieio-speedbar hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/emacs-lisp/eieio-speedbar > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/eieio/eieio-opt hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/emacs-lisp/eieio-opt > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/eieio/eieio-custom hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/emacs-lisp/eieio-custom > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/eieio/eieio-comp hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/emacs-lisp/eieio-comp > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/eieio/eieio-base hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/emacs-lisp/eieio-base > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/eieio/chart hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/emacs-lisp/chart > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/semantic/semantic hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/cedet/semantic > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/common/mode-local hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/cedet/mode-local > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/common/inversion hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/cedet/inversion > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/ede/ede hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/cedet/ede > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/common/cedet hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/cedet/cedet > /Library/Application Support/Aquamacs Emacs/JDEE/cedet/common/cedet-files hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/cedet/cedet-files > /Library/Application Support/Aquamacs Emacs/JDEE/site-start hides /Users/dr/ae.git/nextstep/Aquamacs.app/Contents/Resources/lisp/aquamacs/site-start > > Features: > (shadow sort mail-extr message ecomplete rfc822 mml mml-sec > password-cache mm-decode mm-bodies mm-encode mailabbrev nnheader > gnus-util netrc gmm-utils mailheader canlock sha1 hex-util hashcash > emacsbug cc-mode cc-fonts cc-menus cc-cmds cc-styles cc-align cc-engine > cc-vars cc-defs log-edit ring pcvs-util add-log diff-mode vc > vc-dispatcher cl-specs edebug multi-isearch jka-compr find-func vc-git > url-http tls url-auth mail-parse rfc2231 rfc2047 rfc2045 qp ietf-drums > url-gw url-cache url url-proxy url-privacy url-expand url-methods > url-history url-cookie url-util url-parse url-vars mm-util mail-prsvr > mailcap mail-utils which-func imenu slime-autoloads load-emacs-plugins > aquamacs-mode-defaults auctex-config server tex-site smart-dnd > aquamacs-aux savehist mouse-sel one-buffer-one-frame > smart-frame-positioning drews_init color-theme-autoloads saveplace > visual-line aquamacs-bug aquamacs-autoface-mode aquamacs-editing > sendmail recentf tree-widget cus-edit osxkeys emulate-mac-keyboard-mode > frame-cmds strings misc-fns thingatpt+ thingatpt frame-fns avoid > aquamacs-mac-fontsets fit-frame aquamacs-frame-setup aquamacs-tabbar > tabbar-window cl cl-19 tabbar easy-mmode cus-start cus-load > load-emacs-pre-plugins aquamacs-site-start cocoa-compatibility filladapt > aquamacs-redo check-for-updates aquamacs-menu osx_defaults > aquamacs-tool-bar aquamacs mac-extra-functions aquamacs-tools > aquamacs-macros parse-time timezone time-date paren delsel pc-select > cua-base wid-edit regexp-opt advice advice-preload byte-opt bytecomp > byte-compile debug help-fns help-mode view image-file disp-table tooltip > ediff-hook vc-hooks lisp-float-type mwheel ns-win easymenu tool-bar dnd > fontset image fringe lisp-mode register page menu-bar rfn-eshadow timer > select scroll-bar mldrag mouse jit-lock font-lock syntax facemenu > font-core frame cham georgian utf-8-lang misc-lang vietnamese tibetan > thai tai-viet lao korean japanese hebrew greek romanian slovak czech > european ethiopic indian cyrillic chinese case-table epa-hook > jka-cmpr-hook help simple abbrev loaddefs button minibuffer faces > cus-face files text-properties overlay md5 base64 format env code-pages > mule custom widget hashtable-print-readable backquote > make-network-process ns multi-tty emacs) ^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#5560: 23.1.92; parens matching in c-mode broken 2016-02-17 3:56 ` Andrew Hyatt @ 2016-02-20 22:57 ` Alan Mackenzie 2016-02-21 12:35 ` Alan Mackenzie 0 siblings, 1 reply; 10+ messages in thread From: Alan Mackenzie @ 2016-02-20 22:57 UTC (permalink / raw) To: Andrew Hyatt; +Cc: David Reitter, 5560 Hello, David and Andrew. On Tue, Feb 16, 2016 at 10:56:34PM -0500, Andrew Hyatt wrote: > I can confirm this still doesn't work right in Emacs 25. However, I get > a slightly different experience, with clicking on all 3 left parens > highlighting until the first right paren only. Similarly, that right > paren seems to be the matching paren for all 3 left parens. What is (now) happening is this: the C Preprocessor construct ends at the end of the second line (due to the space after the \ there). The first two open parentheses on that line are unmatched. In such circumstances, CC Mode splats the syntax of such characters by setting syntax-table text properties on them. This is to prevent them spuriously matching parens outside the CPP construct. When you double click on one of the non-matching parens, the critical piece of code reached is in `mouse-start-end'. Instead of checking the syntax of the character in its context (i.e. respecting syntax-table text properties), it simply checks the syntax of the bare character '(', and finds it's an open paren. It then does (forward-sexp) to try and find the matching ')'. This ignores the two "dummy" parens and then scans over the real paren pair remaining. One solution would be to replace the (obsolete) form in mouse.el: (char-syntax (char-after start)) with the modern (and correct) form (syntax-after start) . A small problem with this is that `syntax-after' returns a cons of raw numbers rather than the more picturesque character descriptors like ?\(. A bigger problem is that there are still approximately 164 uses of `char-syntax' in our sources, all (or most) of which need superseding by `syntax-after'. If this were to be done, double clicking on one of these unmatched parens would attempt to match the "word it is in". I don't know exactly what would happen. Probably not very much. In fact, I'm going to try it. (A bit later): Double clicking on a "dummy paren" would mark the sequence of three parens. I think this is better than marking up to the single close paren, but not by much. > David Reitter <david.reitter@gmail.com> writes: > > Parens matching in C mode is sometimes surprising. In the example > > below, double-clicking on either of the first two opening parentheses > > will mark the text until the " hyper_modifier : 0)", but that is correct > > only for the second paren, while the first one is unmatched due to a space > > following the backslash. > > #define EV_MODIFIERS(e) \ > > ((([e modifierFlags] & NSHelpKeyMask) ? \ > > hyper_modifier : 0) \ > > ... > > It would be more useful if an "unmatched parentheses" was shown, or > > if the region up to the end of the scan process (i.e. the > > space+newline) was marked. Giving a decent error message here would be difficult. We're down in the depths of the mouse code, but the strategem of giving syntax-table text properties to parentheses is a pure CC Mode one. Signaling an error if a paren has other than paren syntax is liable to have unforseen side effects somewhere, somehow, some time. Do you (plural) think it is worth while fixing the mouse code, as detailed above, or do you have any other ideas for a fix? > > In GNU Emacs 23.1.92.86 (x86_64-apple-darwin10.2.0, NS apple-appkit-1038.25) > > of 2010-02-08 on scarlett.local - Aquamacs Distribution 2.0dev > > Windowing system distributor `Apple', version 10.3.1038 > > configured using `configure '--with-ns' 'CFLAGS=-O0 -g'' > > Major mode: ObjC/l -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#5560: 23.1.92; parens matching in c-mode broken 2016-02-20 22:57 ` Alan Mackenzie @ 2016-02-21 12:35 ` Alan Mackenzie 2016-02-21 21:40 ` David Reitter 0 siblings, 1 reply; 10+ messages in thread From: Alan Mackenzie @ 2016-02-21 12:35 UTC (permalink / raw) To: Andrew Hyatt; +Cc: David Reitter, 5560 Hello again, David and Andrew. On Sat, Feb 20, 2016 at 10:57:23PM +0000, Alan Mackenzie wrote: > On Tue, Feb 16, 2016 at 10:56:34PM -0500, Andrew Hyatt wrote: > > I can confirm this still doesn't work right in Emacs 25. However, I get > > a slightly different experience, with clicking on all 3 left parens > > highlighting until the first right paren only. Similarly, that right > > paren seems to be the matching paren for all 3 left parens. > > David Reitter <david.reitter@gmail.com> writes: > > > Parens matching in C mode is sometimes surprising. In the example > > > below, double-clicking on either of the first two opening parentheses > > > will mark the text until the " hyper_modifier : 0)", but that is correct > > > only for the second paren, while the first one is unmatched due to a space > > > following the backslash. > > > #define EV_MODIFIERS(e) \ > > > ((([e modifierFlags] & NSHelpKeyMask) ? \ > > > hyper_modifier : 0) \ > > > ... > > > It would be more useful if an "unmatched parentheses" was shown, or > > > if the region up to the end of the scan process (i.e. the > > > space+newline) was marked. > Giving a decent error message here would be difficult. We're down in the > depths of the mouse code, but the strategem of giving syntax-table text > properties to parentheses is a pure CC Mode one. Signaling an error if > a paren has other than paren syntax is liable to have unforseen side > effects somewhere, somehow, some time. After a night's sleep, I've changed my mind about the advisability of such a fix. So, here is a fix. It works as indicated last night: if a character whose normal syntax is open/close-paren has a different syntax due to syntax-table text properties, a 'scan-error error is signaled: either "Containing expression ends prematurely" for an open paren, or "Unbalanced parentheses" for a close paren. Here's the patch. Please try it out and let me know if there's anything amiss about it. Otherwise, I'll commit it. diff --git a/lisp/mouse.el b/lisp/mouse.el index 85ffc43..22c5b48 100644 --- a/lisp/mouse.el +++ b/lisp/mouse.el @@ -931,20 +931,29 @@ mouse-start-end (= start end) (char-after start) (= (char-syntax (char-after start)) ?\()) - (list start - (save-excursion - (goto-char start) - (forward-sexp 1) - (point)))) + (if (/= (car (syntax-after start)) 4) + ;; This happens in CC Mode when unbalanced parens in CPP + ;; constructs are given punctuation syntax with + ;; syntax-table text properties. (2016-02-21). + (signal 'scan-error (list "Containing expression ends prematurely" + start start)) + (list start + (save-excursion + (goto-char start) + (forward-sexp 1) + (point))))) ((and (= mode 1) (= start end) (char-after start) (= (char-syntax (char-after start)) ?\))) - (list (save-excursion - (goto-char (1+ start)) - (backward-sexp 1) - (point)) - (1+ start))) + (if (/= (car (syntax-after start)) 5) + ;; See above comment about CC Mode. + (signal 'scan-error (list "Unbalanced parentheses" start start)) + (list (save-excursion + (goto-char (1+ start)) + (backward-sexp 1) + (point)) + (1+ start)))) ((and (= mode 1) (= start end) (char-after start) -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply related [flat|nested] 10+ messages in thread
* bug#5560: 23.1.92; parens matching in c-mode broken 2016-02-21 12:35 ` Alan Mackenzie @ 2016-02-21 21:40 ` David Reitter 2016-02-21 23:21 ` John Wiegley 2016-02-22 10:35 ` Alan Mackenzie 0 siblings, 2 replies; 10+ messages in thread From: David Reitter @ 2016-02-21 21:40 UTC (permalink / raw) To: Alan Mackenzie; +Cc: Andrew Hyatt, 5560 Alan, Your patch works as advertised for my test case. It’s certainly better to error out than to do the wrong thing. I think you are catching the right situations, but my confidence is low because of the readability of the code (what is 4, 5?). I think the question is whether that fix is appropriate for the 25.1 release. If you want to apply it there, I would probably test a whole lot of cases in modes that are derivates of c-mode. - David > On Feb 21, 2016, at 7:35 AM, Alan Mackenzie <acm@muc.de> wrote: > > Hello again, David and Andrew. > > On Sat, Feb 20, 2016 at 10:57:23PM +0000, Alan Mackenzie wrote: >> On Tue, Feb 16, 2016 at 10:56:34PM -0500, Andrew Hyatt wrote: > >>> I can confirm this still doesn't work right in Emacs 25. However, I get >>> a slightly different experience, with clicking on all 3 left parens >>> highlighting until the first right paren only. Similarly, that right >>> paren seems to be the matching paren for all 3 left parens. > >>> David Reitter <david.reitter@gmail.com> writes: > >>>> Parens matching in C mode is sometimes surprising. In the example >>>> below, double-clicking on either of the first two opening parentheses >>>> will mark the text until the " hyper_modifier : 0)", but that is correct >>>> only for the second paren, while the first one is unmatched due to a space >>>> following the backslash. > >>>> #define EV_MODIFIERS(e) \ >>>> ((([e modifierFlags] & NSHelpKeyMask) ? \ >>>> hyper_modifier : 0) \ >>>> ... > > >>>> It would be more useful if an "unmatched parentheses" was shown, or >>>> if the region up to the end of the scan process (i.e. the >>>> space+newline) was marked. > >> Giving a decent error message here would be difficult. We're down in the >> depths of the mouse code, but the strategem of giving syntax-table text >> properties to parentheses is a pure CC Mode one. Signaling an error if >> a paren has other than paren syntax is liable to have unforseen side >> effects somewhere, somehow, some time. > > After a night's sleep, I've changed my mind about the advisability of > such a fix. So, here is a fix. It works as indicated last night: if a > character whose normal syntax is open/close-paren has a different syntax > due to syntax-table text properties, a 'scan-error error is signaled: > either "Containing expression ends prematurely" for an open paren, or > "Unbalanced parentheses" for a close paren. > > Here's the patch. Please try it out and let me know if there's anything > amiss about it. Otherwise, I'll commit it. > > > > diff --git a/lisp/mouse.el b/lisp/mouse.el > index 85ffc43..22c5b48 100644 > --- a/lisp/mouse.el > +++ b/lisp/mouse.el > @@ -931,20 +931,29 @@ mouse-start-end > (= start end) > (char-after start) > (= (char-syntax (char-after start)) ?\()) > - (list start > - (save-excursion > - (goto-char start) > - (forward-sexp 1) > - (point)))) > + (if (/= (car (syntax-after start)) 4) > + ;; This happens in CC Mode when unbalanced parens in CPP > + ;; constructs are given punctuation syntax with > + ;; syntax-table text properties. (2016-02-21). > + (signal 'scan-error (list "Containing expression ends prematurely" > + start start)) > + (list start > + (save-excursion > + (goto-char start) > + (forward-sexp 1) > + (point))))) > ((and (= mode 1) > (= start end) > (char-after start) > (= (char-syntax (char-after start)) ?\))) > - (list (save-excursion > - (goto-char (1+ start)) > - (backward-sexp 1) > - (point)) > - (1+ start))) > + (if (/= (car (syntax-after start)) 5) > + ;; See above comment about CC Mode. > + (signal 'scan-error (list "Unbalanced parentheses" start start)) > + (list (save-excursion > + (goto-char (1+ start)) > + (backward-sexp 1) > + (point)) > + (1+ start)))) > ((and (= mode 1) > (= start end) > (char-after start) > > > > -- > Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#5560: 23.1.92; parens matching in c-mode broken 2016-02-21 21:40 ` David Reitter @ 2016-02-21 23:21 ` John Wiegley 2016-02-22 10:51 ` Alan Mackenzie 2016-02-22 10:35 ` Alan Mackenzie 1 sibling, 1 reply; 10+ messages in thread From: John Wiegley @ 2016-02-21 23:21 UTC (permalink / raw) To: David Reitter; +Cc: Alan Mackenzie, Andrew Hyatt, 5560 >>>>> David Reitter <david.reitter@gmail.com> writes: > I think the question is whether that fix is appropriate for the 25.1 > release. If you want to apply it there, I would probably test a whole lot of > cases in modes that are derivates of c-mode. Does this change past behavior? We still have room for fixes in 25.1, but if it changes past behavior it will need sufficient testing. -- John Wiegley GPG fingerprint = 4710 CF98 AF9B 327B B80F http://newartisans.com 60E1 46C4 BD1A 7AC1 4BA2 ^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#5560: 23.1.92; parens matching in c-mode broken 2016-02-21 23:21 ` John Wiegley @ 2016-02-22 10:51 ` Alan Mackenzie 0 siblings, 0 replies; 10+ messages in thread From: Alan Mackenzie @ 2016-02-22 10:51 UTC (permalink / raw) To: John Wiegley; +Cc: David Reitter, Andrew Hyatt, 5560 Hello, John. On Sun, Feb 21, 2016 at 03:21:52PM -0800, John Wiegley wrote: > >>>>> David Reitter <david.reitter@gmail.com> writes: > > I think the question is whether that fix is appropriate for the 25.1 > > release. If you want to apply it there, I would probably test a whole lot of > > cases in modes that are derivates of c-mode. > Does this change past behavior? We still have room for fixes in 25.1, but if > it changes past behavior it will need sufficient testing. The fix doesn't change past behaviour, beyond fixing the actual bug. What is amazing is that on doing a triple click with mouse-1 on such an unmatched paren, an error is signaled after the second click, but Emacs then goes on to mark the line correctly after the third click. > -- > John Wiegley GPG fingerprint = 4710 CF98 AF9B 327B B80F > http://newartisans.com 60E1 46C4 BD1A 7AC1 4BA2 -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#5560: 23.1.92; parens matching in c-mode broken 2016-02-21 21:40 ` David Reitter 2016-02-21 23:21 ` John Wiegley @ 2016-02-22 10:35 ` Alan Mackenzie 2016-02-22 12:09 ` David Reitter 1 sibling, 1 reply; 10+ messages in thread From: Alan Mackenzie @ 2016-02-22 10:35 UTC (permalink / raw) To: David Reitter; +Cc: Andrew Hyatt, 5560 Hello, David. On Sun, Feb 21, 2016 at 04:40:09PM -0500, David Reitter wrote: > Alan, > Your patch works as advertised for my test case. It’s certainly > better to error out than to do the wrong thing. > I think you are catching the right situations, but my confidence is > low because of the readability of the code (what is 4, 5?). 4 and 5 are the low level codes for "open paren" and "close paren" syntax. I don't like them much either, but `syntax-after' is the only interface available which returns the syntax of a character in a buffer, taking account of syntax-table text properties. 4 and 5 (or, more precisely, (4 . ?\)), (5 . ?\()) are what we have to work with. One way would be to create two constants with fancy names with values 4 and 5, but I don't think that helps much - anybody debugging and suspicious of the values still has to find the page in the elisp manual to check, but has an extra irritating indirection to cope with. How would you feel about explanatory comments on the two lines - something like: + (if (/= (car (syntax-after start)) 4) ; low-level code for ?\( ? What we really need is a better interface. Perhaps `char-syntax-after', which would actually return ?\( and ?\). In fact, I think I'll raise a bug report for this. > I think the question is whether that fix is appropriate for the 25.1 > release. If you want to apply it there, I would probably test a whole > lot of cases in modes that are derivates of c-mode. I think the fix should go into 25.1. I'm confident enough about the mechanism of the bug that I'm not sure extensive testing is warranted. > - David -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#5560: 23.1.92; parens matching in c-mode broken 2016-02-22 10:35 ` Alan Mackenzie @ 2016-02-22 12:09 ` David Reitter 2016-02-25 9:54 ` Alan Mackenzie 0 siblings, 1 reply; 10+ messages in thread From: David Reitter @ 2016-02-22 12:09 UTC (permalink / raw) To: Alan Mackenzie; +Cc: Andrew Hyatt, 5560 On Feb 22, 2016, at 5:35 AM, Alan Mackenzie <acm@muc.de> wrote: > How would you feel about explanatory comments on the two lines - > something like That would help. I didn’t mean to criticize your patch in this sense, as this is a more general interface problem as you point out. What you are explaining though makes more sense to me. So yes, perhaps this needs to be in 25.1. ^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#5560: 23.1.92; parens matching in c-mode broken 2016-02-22 12:09 ` David Reitter @ 2016-02-25 9:54 ` Alan Mackenzie 0 siblings, 0 replies; 10+ messages in thread From: Alan Mackenzie @ 2016-02-25 9:54 UTC (permalink / raw) To: David Reitter, 5560-done; +Cc: Andrew Hyatt, John Wiegley Hello, David. On Mon, Feb 22, 2016 at 07:09:00AM -0500, David Reitter wrote: > On Feb 22, 2016, at 5:35 AM, Alan Mackenzie <acm@muc.de> wrote: > > How would you feel about explanatory comments on the two lines - > > something like > That would help. I didn’t mean to criticize your patch in this sense, > as this is a more general interface problem as you point out. OK. I've added these comments. > What you are explaining though makes more sense to me. So yes, > perhaps this needs to be in 25.1. I've committed the fix to the emacs-25 branch, and am closing the bug. Sorry it took so long to fix. -- Alan Mackenzie (Nuremberg, Germany). ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2016-02-25 9:54 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-02-11 3:01 bug#5560: 23.1.92; parens matching in c-mode broken David Reitter 2016-02-17 3:56 ` Andrew Hyatt 2016-02-20 22:57 ` Alan Mackenzie 2016-02-21 12:35 ` Alan Mackenzie 2016-02-21 21:40 ` David Reitter 2016-02-21 23:21 ` John Wiegley 2016-02-22 10:51 ` Alan Mackenzie 2016-02-22 10:35 ` Alan Mackenzie 2016-02-22 12:09 ` David Reitter 2016-02-25 9:54 ` Alan Mackenzie
Code repositories for project(s) associated with this external index https://git.savannah.gnu.org/cgit/emacs.git https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.