summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog4989
-rw-r--r--lisp/ChangeLog.102
-rw-r--r--lisp/ChangeLog.156
-rw-r--r--lisp/Makefile.in14
-rw-r--r--lisp/abbrev.el57
-rw-r--r--lisp/allout.el7
-rw-r--r--lisp/apropos.el40
-rw-r--r--lisp/arc-mode.el5
-rw-r--r--lisp/autorevert.el227
-rw-r--r--lisp/battery.el76
-rw-r--r--lisp/bindings.el2
-rw-r--r--lisp/bookmark.el121
-rw-r--r--lisp/button.el75
-rw-r--r--lisp/calc/README293
-rw-r--r--lisp/calc/README.prev998
-rw-r--r--lisp/calc/calc-ext.el88
-rw-r--r--lisp/calc/calc-forms.el546
-rw-r--r--lisp/calc/calc-graph.el1
-rw-r--r--lisp/calc/calc-help.el20
-rw-r--r--lisp/calc/calc-math.el8
-rw-r--r--lisp/calc/calc-units.el100
-rw-r--r--lisp/calc/calc.el58
-rw-r--r--lisp/calc/calcalg2.el18
-rw-r--r--lisp/calendar/calendar.el13
-rw-r--r--lisp/calendar/time-date.el4
-rw-r--r--lisp/calendar/timeclock.el2
-rw-r--r--lisp/calendar/todo-mode.el6
-rw-r--r--lisp/case-table.el40
-rw-r--r--lisp/cedet/ChangeLog204
-rw-r--r--lisp/cedet/cedet-files.el18
-rw-r--r--lisp/cedet/ede.el65
-rw-r--r--lisp/cedet/ede/auto.el4
-rw-r--r--lisp/cedet/ede/base.el36
-rw-r--r--lisp/cedet/ede/cpp-root.el67
-rw-r--r--lisp/cedet/ede/emacs.el4
-rw-r--r--lisp/cedet/ede/files.el25
-rw-r--r--lisp/cedet/ede/locate.el2
-rw-r--r--lisp/cedet/ede/pconf.el2
-rw-r--r--lisp/cedet/ede/proj-elisp.el5
-rw-r--r--lisp/cedet/ede/proj.el4
-rw-r--r--lisp/cedet/ede/util.el2
-rw-r--r--lisp/cedet/semantic.el10
-rw-r--r--lisp/cedet/semantic/analyze.el2
-rw-r--r--lisp/cedet/semantic/analyze/fcn.el2
-rw-r--r--lisp/cedet/semantic/bovine/c.el73
-rw-r--r--lisp/cedet/semantic/bovine/gcc.el6
-rw-r--r--lisp/cedet/semantic/complete.el18
-rw-r--r--lisp/cedet/semantic/db-el.el5
-rw-r--r--lisp/cedet/semantic/db-file.el4
-rw-r--r--lisp/cedet/semantic/db-find.el6
-rw-r--r--lisp/cedet/semantic/db.el6
-rw-r--r--lisp/cedet/semantic/decorate/include.el4
-rw-r--r--lisp/cedet/semantic/ede-grammar.el2
-rw-r--r--lisp/cedet/semantic/find.el9
-rw-r--r--lisp/cedet/semantic/fw.el14
-rw-r--r--lisp/cedet/semantic/grammar.el3
-rw-r--r--lisp/cedet/semantic/sb.el12
-rw-r--r--lisp/cedet/semantic/senator.el8
-rw-r--r--lisp/cedet/semantic/sort.el2
-rw-r--r--lisp/cedet/semantic/tag-ls.el66
-rw-r--r--lisp/cedet/semantic/wisent/javat-wy.elbin19300 -> 19273 bytes
-rw-r--r--lisp/cedet/semantic/wisent/wisent.el4
-rw-r--r--lisp/cedet/srecode/args.el24
-rw-r--r--lisp/cedet/srecode/compile.el10
-rw-r--r--lisp/cedet/srecode/cpp.el3
-rw-r--r--lisp/cedet/srecode/dictionary.el8
-rw-r--r--lisp/cedet/srecode/insert.el4
-rw-r--r--lisp/cedet/srecode/java.el21
-rw-r--r--lisp/cedet/srecode/map.el3
-rw-r--r--lisp/cedet/srecode/mode.el2
-rw-r--r--lisp/cedet/srecode/srt-mode.el6
-rw-r--r--lisp/cedet/srecode/srt.el6
-rw-r--r--lisp/cedet/srecode/table.el2
-rw-r--r--lisp/cmuscheme.el6
-rw-r--r--lisp/color.el13
-rw-r--r--lisp/comint.el176
-rw-r--r--lisp/cus-edit.el41
-rw-r--r--lisp/cus-face.el44
-rw-r--r--lisp/cus-start.el43
-rw-r--r--lisp/cus-theme.el2
-rw-r--r--lisp/custom.el79
-rw-r--r--lisp/descr-text.el5
-rw-r--r--lisp/desktop.el108
-rw-r--r--lisp/dired-aux.el14
-rw-r--r--lisp/dired-x.el22
-rw-r--r--lisp/dired.el122
-rw-r--r--lisp/dirtrack.el3
-rw-r--r--lisp/doc-view.el462
-rw-r--r--lisp/dos-w32.el90
-rw-r--r--lisp/ehelp.el1
-rw-r--r--lisp/electric.el28
-rw-r--r--lisp/emacs-lisp/advice.el1151
-rw-r--r--lisp/emacs-lisp/byte-opt.el34
-rw-r--r--lisp/emacs-lisp/byte-run.el29
-rw-r--r--lisp/emacs-lisp/bytecomp.el86
-rw-r--r--lisp/emacs-lisp/cl-extra.el11
-rw-r--r--lisp/emacs-lisp/cl-lib.el31
-rw-r--r--lisp/emacs-lisp/cl-loaddefs.el29
-rw-r--r--lisp/emacs-lisp/cl-macs.el334
-rw-r--r--lisp/emacs-lisp/cl-seq.el9
-rw-r--r--lisp/emacs-lisp/cl.el44
-rw-r--r--lisp/emacs-lisp/crm.el65
-rw-r--r--lisp/emacs-lisp/debug.el187
-rw-r--r--lisp/emacs-lisp/derived.el34
-rw-r--r--lisp/emacs-lisp/easy-mmode.el56
-rw-r--r--lisp/emacs-lisp/edebug.el97
-rw-r--r--lisp/emacs-lisp/eieio-base.el20
-rw-r--r--lisp/emacs-lisp/eieio-custom.el38
-rw-r--r--lisp/emacs-lisp/eieio-datadebug.el71
-rw-r--r--lisp/emacs-lisp/eieio-opt.el44
-rw-r--r--lisp/emacs-lisp/eieio-speedbar.el8
-rw-r--r--lisp/emacs-lisp/eieio.el733
-rw-r--r--lisp/emacs-lisp/eldoc.el70
-rw-r--r--lisp/emacs-lisp/elp.el332
-rw-r--r--lisp/emacs-lisp/ert-x.el47
-rw-r--r--lisp/emacs-lisp/ert.el795
-rw-r--r--lisp/emacs-lisp/gv.el20
-rw-r--r--lisp/emacs-lisp/lisp-mnt.el48
-rw-r--r--lisp/emacs-lisp/lisp-mode.el148
-rw-r--r--lisp/emacs-lisp/lisp.el80
-rw-r--r--lisp/emacs-lisp/macroexp.el5
-rw-r--r--lisp/emacs-lisp/nadvice.el464
-rw-r--r--lisp/emacs-lisp/package.el65
-rw-r--r--lisp/emacs-lisp/pcase.el29
-rw-r--r--lisp/emacs-lisp/shadow.el128
-rw-r--r--lisp/emacs-lisp/smie.el36
-rw-r--r--lisp/emacs-lisp/tabulated-list.el4
-rw-r--r--lisp/emacs-lisp/timer.el147
-rw-r--r--lisp/emacs-lisp/trace.el245
-rw-r--r--lisp/emulation/vip.el3
-rw-r--r--lisp/emulation/viper-cmd.el18
-rw-r--r--lisp/emulation/viper.el2
-rw-r--r--lisp/env.el23
-rw-r--r--lisp/epa.el1
-rw-r--r--lisp/epg.el80
-rw-r--r--lisp/erc/ChangeLog57
-rw-r--r--lisp/erc/erc-backend.el226
-rw-r--r--lisp/erc/erc-capab.el1
-rw-r--r--lisp/erc/erc-dcc.el73
-rw-r--r--lisp/erc/erc-ezbounce.el1
-rw-r--r--lisp/erc/erc-join.el1
-rw-r--r--lisp/erc/erc-log.el7
-rw-r--r--lisp/erc/erc-match.el19
-rw-r--r--lisp/erc/erc-netsplit.el7
-rw-r--r--lisp/erc/erc-networks.el14
-rw-r--r--lisp/erc/erc-notify.el4
-rw-r--r--lisp/erc/erc-pcomplete.el1
-rw-r--r--lisp/erc/erc-services.el2
-rw-r--r--lisp/erc/erc-speedbar.el1
-rw-r--r--lisp/erc/erc-track.el26
-rw-r--r--lisp/erc/erc.el197
-rw-r--r--lisp/eshell/em-cmpl.el2
-rw-r--r--lisp/eshell/em-ls.el22
-rw-r--r--lisp/eshell/em-tramp.el143
-rw-r--r--lisp/eshell/em-unix.el84
-rw-r--r--lisp/eshell/esh-proc.el67
-rw-r--r--lisp/eshell/esh-util.el1
-rw-r--r--lisp/face-remap.el2
-rw-r--r--lisp/facemenu.el17
-rw-r--r--lisp/faces.el330
-rw-r--r--lisp/ffap.el323
-rw-r--r--lisp/filecache.el178
-rw-r--r--lisp/files.el401
-rw-r--r--lisp/filesets.el6
-rw-r--r--lisp/find-cmd.el15
-rw-r--r--lisp/find-dired.el15
-rw-r--r--lisp/font-lock.el40
-rw-r--r--lisp/frame.el53
-rw-r--r--lisp/generic-x.el3
-rw-r--r--lisp/gnus/ChangeLog542
-rw-r--r--lisp/gnus/ChangeLog.118
-rw-r--r--lisp/gnus/ChangeLog.2302
-rw-r--r--lisp/gnus/auth-source.el2
-rw-r--r--lisp/gnus/deuglify.el4
-rw-r--r--lisp/gnus/gmm-utils.el25
-rw-r--r--lisp/gnus/gnus-agent.el3
-rw-r--r--lisp/gnus/gnus-art.el54
-rw-r--r--lisp/gnus/gnus-async.el2
-rw-r--r--lisp/gnus/gnus-bookmark.el2
-rw-r--r--lisp/gnus/gnus-cite.el24
-rw-r--r--lisp/gnus/gnus-delay.el4
-rw-r--r--lisp/gnus/gnus-dired.el4
-rw-r--r--lisp/gnus/gnus-group.el5
-rw-r--r--lisp/gnus/gnus-int.el30
-rw-r--r--lisp/gnus/gnus-msg.el27
-rw-r--r--lisp/gnus/gnus-registry.el18
-rw-r--r--lisp/gnus/gnus-salt.el54
-rw-r--r--lisp/gnus/gnus-score.el53
-rw-r--r--lisp/gnus/gnus-spec.el17
-rw-r--r--lisp/gnus/gnus-srvr.el11
-rw-r--r--lisp/gnus/gnus-start.el14
-rw-r--r--lisp/gnus/gnus-sum.el70
-rw-r--r--lisp/gnus/gnus-sync.el30
-rw-r--r--lisp/gnus/gnus-util.el63
-rw-r--r--lisp/gnus/gnus.el40
-rw-r--r--lisp/gnus/html2text.el6
-rw-r--r--lisp/gnus/mail-source.el21
-rw-r--r--lisp/gnus/message.el57
-rw-r--r--lisp/gnus/mm-decode.el32
-rw-r--r--lisp/gnus/mml-smime.el92
-rw-r--r--lisp/gnus/mml.el8
-rw-r--r--lisp/gnus/mml1991.el4
-rw-r--r--lisp/gnus/mml2015.el118
-rw-r--r--lisp/gnus/nndir.el3
-rw-r--r--lisp/gnus/nndraft.el18
-rw-r--r--lisp/gnus/nnfolder.el29
-rw-r--r--lisp/gnus/nnimap.el28
-rw-r--r--lisp/gnus/nnir.el628
-rw-r--r--lisp/gnus/nntp.el2
-rw-r--r--lisp/gnus/pop3.el314
-rw-r--r--lisp/gnus/shr.el52
-rw-r--r--lisp/gnus/sieve-mode.el9
-rw-r--r--lisp/gnus/smiley.el5
-rw-r--r--lisp/gnus/spam-stat.el14
-rw-r--r--lisp/gnus/spam.el32
-rw-r--r--lisp/gnus/utf7.el6
-rw-r--r--lisp/help-fns.el16
-rw-r--r--lisp/help-macro.el2
-rw-r--r--lisp/help-mode.el5
-rw-r--r--lisp/help.el4
-rw-r--r--lisp/hi-lock.el304
-rw-r--r--lisp/hilit-chg.el88
-rw-r--r--lisp/htmlfontify.el2
-rw-r--r--lisp/ibuffer.el27
-rw-r--r--lisp/icomplete.el175
-rw-r--r--lisp/ido.el38
-rw-r--r--lisp/image-dired.el4
-rw-r--r--lisp/image-mode.el236
-rw-r--r--lisp/image.el88
-rw-r--r--lisp/imenu.el51
-rw-r--r--lisp/info-look.el22
-rw-r--r--lisp/info.el446
-rw-r--r--lisp/informat.el20
-rw-r--r--lisp/international/characters.el16
-rw-r--r--lisp/international/iso-cvt.el1222
-rw-r--r--lisp/international/iso-transl.el294
-rw-r--r--lisp/international/ja-dic-cnv.el33
-rw-r--r--lisp/international/kkc.el2
-rw-r--r--lisp/international/latexenc.el4
-rw-r--r--lisp/international/latin1-disp.el5716
-rw-r--r--lisp/international/mule-cmds.el36
-rw-r--r--lisp/international/mule-util.el50
-rw-r--r--lisp/international/mule.el30
-rw-r--r--lisp/isearch.el109
-rw-r--r--lisp/iswitchb.el2
-rw-r--r--lisp/jit-lock.el153
-rw-r--r--lisp/jka-cmpr-hook.el10
-rw-r--r--lisp/jka-compr.el2
-rw-r--r--lisp/json.el137
-rw-r--r--lisp/kmacro.el34
-rw-r--r--lisp/language/china-util.el2
-rw-r--r--lisp/language/chinese.el10
-rw-r--r--lisp/language/cyril-util.el216
-rw-r--r--lisp/language/cyrillic.el10
-rw-r--r--lisp/language/czech.el6
-rw-r--r--lisp/language/european.el32
-rw-r--r--lisp/language/ind-util.el1098
-rw-r--r--lisp/language/korean.el4
-rw-r--r--lisp/language/lao-util.el436
-rw-r--r--lisp/language/romanian.el4
-rw-r--r--lisp/language/slovak.el8
-rw-r--r--lisp/language/thai-word.el21311
-rw-r--r--lisp/language/thai.el10
-rw-r--r--lisp/language/tibet-util.el78
-rw-r--r--lisp/language/tibetan.el822
-rw-r--r--lisp/language/viet-util.el292
-rw-r--r--lisp/language/vietnamese.el4
-rw-r--r--lisp/ldefs-boot.el2369
-rw-r--r--lisp/locate.el1
-rw-r--r--lisp/mail/emacsbug.el121
-rw-r--r--lisp/mail/feedmail.el23
-rw-r--r--lisp/mail/mailabbrev.el11
-rw-r--r--lisp/mail/rmail.el121
-rw-r--r--lisp/mail/rmailedit.el24
-rw-r--r--lisp/mail/rmailmm.el17
-rw-r--r--lisp/mail/rmailsum.el1
-rw-r--r--lisp/mail/sendmail.el3
-rw-r--r--lisp/mail/smtpmail.el27
-rw-r--r--lisp/mail/unrmail.el40
-rw-r--r--lisp/makefile.w32-in106
-rw-r--r--lisp/man.el80
-rw-r--r--lisp/menu-bar.el6
-rw-r--r--lisp/mh-e/ChangeLog155
-rw-r--r--lisp/mh-e/ChangeLog.16
-rw-r--r--lisp/mh-e/mh-acros.el2
-rw-r--r--lisp/mh-e/mh-comp.el186
-rw-r--r--lisp/mh-e/mh-compat.el40
-rw-r--r--lisp/mh-e/mh-e.el128
-rw-r--r--lisp/mh-e/mh-folder.el120
-rw-r--r--lisp/mh-e/mh-junk.el112
-rw-r--r--lisp/mh-e/mh-letter.el130
-rw-r--r--lisp/mh-e/mh-mime.el125
-rw-r--r--lisp/mh-e/mh-scan.el50
-rw-r--r--lisp/mh-e/mh-search.el31
-rw-r--r--lisp/mh-e/mh-show.el16
-rw-r--r--lisp/mh-e/mh-thread.el27
-rw-r--r--lisp/mh-e/mh-xface.el2
-rw-r--r--lisp/minibuf-eldef.el11
-rw-r--r--lisp/minibuffer.el142
-rw-r--r--lisp/misearch.el2
-rw-r--r--lisp/mouse.el102
-rw-r--r--lisp/mpc.el200
-rw-r--r--lisp/net/ange-ftp.el29
-rw-r--r--lisp/net/eudc-bob.el4
-rw-r--r--lisp/net/eudc-export.el4
-rw-r--r--lisp/net/eudc-hotlist.el4
-rw-r--r--lisp/net/eudc-vars.el4
-rw-r--r--lisp/net/eudc.el4
-rw-r--r--lisp/net/eudcb-bbdb.el4
-rw-r--r--lisp/net/eudcb-ldap.el4
-rw-r--r--lisp/net/eudcb-ph.el4
-rw-r--r--lisp/net/net-utils.el81
-rw-r--r--lisp/net/newst-plainview.el3
-rw-r--r--lisp/net/quickurl.el6
-rw-r--r--lisp/net/rcirc.el38
-rw-r--r--lisp/net/soap-client.el6
-rw-r--r--lisp/net/socks.el2
-rw-r--r--lisp/net/tls.el16
-rw-r--r--lisp/net/tramp-adb.el1165
-rw-r--r--lisp/net/tramp-cache.el103
-rw-r--r--lisp/net/tramp-cmds.el8
-rw-r--r--lisp/net/tramp-compat.el93
-rw-r--r--lisp/net/tramp-ftp.el2
-rw-r--r--lisp/net/tramp-gvfs.el865
-rw-r--r--lisp/net/tramp-sh.el649
-rw-r--r--lisp/net/tramp-smb.el27
-rw-r--r--lisp/net/tramp.el396
-rw-r--r--lisp/net/trampver.el4
-rw-r--r--lisp/newcomment.el3
-rw-r--r--lisp/notifications.el307
-rw-r--r--lisp/novice.el1
-rw-r--r--lisp/nxml/nxml-mode.el8
-rw-r--r--lisp/nxml/nxml-outln.el4
-rw-r--r--lisp/nxml/nxml-rap.el4
-rw-r--r--lisp/nxml/nxml-util.el21
-rw-r--r--lisp/nxml/rng-maint.el2
-rw-r--r--lisp/nxml/rng-nxml.el4
-rw-r--r--lisp/nxml/rng-valid.el79
-rw-r--r--lisp/obsolete/iso-insert.el194
-rw-r--r--lisp/obsolete/longlines.el (renamed from lisp/longlines.el)11
-rw-r--r--lisp/obsolete/terminal.el (renamed from lisp/terminal.el)15
-rw-r--r--lisp/obsolete/yow.el (renamed from lisp/play/yow.el)3
-rw-r--r--lisp/org/ChangeLog1436
-rw-r--r--lisp/org/org-agenda.el4
-rw-r--r--lisp/org/org-bibtex.el3
-rw-r--r--lisp/org/org-freemind.el3
-rw-r--r--lisp/org/org-indent.el7
-rw-r--r--lisp/outline.el12
-rw-r--r--lisp/paren.el37
-rw-r--r--lisp/pcmpl-x.el251
-rw-r--r--lisp/play/bubbles.el4
-rw-r--r--lisp/play/fortune.el11
-rw-r--r--lisp/play/gamegrid.el23
-rw-r--r--lisp/play/gametree.el2
-rw-r--r--lisp/play/handwrite.el20
-rw-r--r--lisp/printing.el16
-rw-r--r--lisp/profiler.el74
-rw-r--r--lisp/progmodes/autoconf.el29
-rw-r--r--lisp/progmodes/cc-align.el22
-rw-r--r--lisp/progmodes/cc-awk.el71
-rw-r--r--lisp/progmodes/cc-cmds.el30
-rw-r--r--lisp/progmodes/cc-defs.el7
-rw-r--r--lisp/progmodes/cc-engine.el103
-rw-r--r--lisp/progmodes/cc-fonts.el14
-rw-r--r--lisp/progmodes/cc-langs.el8
-rw-r--r--lisp/progmodes/cc-menus.el159
-rw-r--r--lisp/progmodes/cc-mode.el13
-rw-r--r--lisp/progmodes/cfengine.el132
-rw-r--r--lisp/progmodes/compile.el52
-rw-r--r--lisp/progmodes/cperl-mode.el15
-rw-r--r--lisp/progmodes/cpp.el1
-rw-r--r--lisp/progmodes/delphi.el2033
-rw-r--r--lisp/progmodes/etags.el11
-rw-r--r--lisp/progmodes/f90.el33
-rw-r--r--lisp/progmodes/flymake.el12
-rw-r--r--lisp/progmodes/gdb-mi.el674
-rw-r--r--lisp/progmodes/grep.el24
-rw-r--r--lisp/progmodes/gud.el39
-rw-r--r--lisp/progmodes/hideshow.el4
-rw-r--r--lisp/progmodes/idlw-help.el1
-rw-r--r--lisp/progmodes/idlwave.el4
-rw-r--r--lisp/progmodes/inf-lisp.el4
-rw-r--r--lisp/progmodes/js.el121
-rw-r--r--lisp/progmodes/m4-mode.el14
-rw-r--r--lisp/progmodes/make-mode.el107
-rw-r--r--lisp/progmodes/octave-inf.el386
-rw-r--r--lisp/progmodes/octave.el (renamed from lisp/progmodes/octave-mod.el)529
-rw-r--r--lisp/progmodes/opascal.el1787
-rw-r--r--lisp/progmodes/pascal.el3
-rw-r--r--lisp/progmodes/perl-mode.el157
-rw-r--r--lisp/progmodes/prolog.el12
-rw-r--r--lisp/progmodes/ps-mode.el9
-rw-r--r--lisp/progmodes/python.el403
-rw-r--r--lisp/progmodes/ruby-mode.el306
-rw-r--r--lisp/progmodes/scheme.el68
-rw-r--r--lisp/progmodes/sh-script.el116
-rw-r--r--lisp/progmodes/simula.el34
-rw-r--r--lisp/progmodes/sql.el979
-rw-r--r--lisp/progmodes/subword.el125
-rw-r--r--lisp/progmodes/tcl.el4
-rw-r--r--lisp/progmodes/vera-mode.el3
-rw-r--r--lisp/progmodes/which-func.el6
-rw-r--r--lisp/progmodes/xscheme.el39
-rw-r--r--lisp/ps-bdf.el7
-rw-r--r--lisp/ps-print.el16
-rw-r--r--lisp/recentf.el2
-rw-r--r--lisp/register.el13
-rw-r--r--lisp/replace.el116
-rw-r--r--lisp/ruler-mode.el10
-rw-r--r--lisp/saveplace.el6
-rw-r--r--lisp/server.el21
-rw-r--r--lisp/ses.el118
-rw-r--r--lisp/shadowfile.el10
-rw-r--r--lisp/shell.el34
-rw-r--r--lisp/simple.el390
-rw-r--r--lisp/sort.el56
-rw-r--r--lisp/speedbar.el1
-rw-r--r--lisp/startup.el164
-rw-r--r--lisp/strokes.el2
-rw-r--r--lisp/subr.el330
-rw-r--r--lisp/term.el6
-rw-r--r--lisp/term/ns-win.el24
-rw-r--r--lisp/term/pc-win.el2
-rw-r--r--lisp/term/w32-win.el10
-rw-r--r--lisp/term/x-win.el11
-rw-r--r--lisp/term/xterm.el420
-rw-r--r--lisp/textmodes/artist.el2
-rw-r--r--lisp/textmodes/bibtex.el51
-rw-r--r--lisp/textmodes/conf-mode.el4
-rw-r--r--lisp/textmodes/css-mode.el32
-rw-r--r--lisp/textmodes/fill.el6
-rw-r--r--lisp/textmodes/flyspell.el46
-rw-r--r--lisp/textmodes/ispell.el848
-rw-r--r--lisp/textmodes/po.el4
-rw-r--r--lisp/textmodes/reftex-cite.el8
-rw-r--r--lisp/textmodes/reftex-parse.el16
-rw-r--r--lisp/textmodes/reftex-toc.el2
-rw-r--r--lisp/textmodes/reftex-vars.el54
-rw-r--r--lisp/textmodes/reftex.el34
-rw-r--r--lisp/textmodes/remember.el28
-rw-r--r--lisp/textmodes/sgml-mode.el173
-rw-r--r--lisp/textmodes/table.el2
-rw-r--r--lisp/textmodes/tex-mode.el117
-rw-r--r--lisp/textmodes/texinfo.el112
-rw-r--r--lisp/textmodes/tildify.el4
-rw-r--r--lisp/thingatpt.el344
-rw-r--r--lisp/tmm.el109
-rw-r--r--lisp/tutorial.el10
-rw-r--r--lisp/type-break.el6
-rw-r--r--lisp/uniquify.el29
-rw-r--r--lisp/url/ChangeLog28
-rw-r--r--lisp/url/url-cache.el1
-rw-r--r--lisp/url/url-expand.el2
-rw-r--r--lisp/url/url-http.el11
-rw-r--r--lisp/url/url-misc.el36
-rw-r--r--lisp/url/url-parse.el5
-rw-r--r--lisp/vc/add-log.el104
-rw-r--r--lisp/vc/compare-w.el6
-rw-r--r--lisp/vc/diff-mode.el40
-rw-r--r--lisp/vc/diff.el27
-rw-r--r--lisp/vc/ediff-diff.el145
-rw-r--r--lisp/vc/ediff-ptch.el6
-rw-r--r--lisp/vc/ediff-util.el32
-rw-r--r--lisp/vc/log-edit.el15
-rw-r--r--lisp/vc/pcvs.el20
-rw-r--r--lisp/vc/vc-arch.el2
-rw-r--r--lisp/vc/vc-bzr.el55
-rw-r--r--lisp/vc/vc-cvs.el17
-rw-r--r--lisp/vc/vc-dir.el29
-rw-r--r--lisp/vc/vc-dispatcher.el49
-rw-r--r--lisp/vc/vc-git.el12
-rw-r--r--lisp/vc/vc-hg.el46
-rw-r--r--lisp/vc/vc-hooks.el46
-rw-r--r--lisp/vc/vc-mtn.el6
-rw-r--r--lisp/vc/vc-rcs.el12
-rw-r--r--lisp/vc/vc-sccs.el3
-rw-r--r--lisp/vc/vc-svn.el55
-rw-r--r--lisp/vc/vc.el78
-rw-r--r--lisp/vcursor.el2
-rw-r--r--lisp/view.el37
-rw-r--r--lisp/wdired.el4
-rw-r--r--lisp/whitespace.el440
-rw-r--r--lisp/wid-edit.el11
-rw-r--r--lisp/window.el33
-rw-r--r--lisp/winner.el6
-rw-r--r--lisp/woman.el23
-rw-r--r--lisp/xt-mouse.el26
487 files changed, 45709 insertions, 33610 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 2e0645e5156..340dc41a744 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,58 +1,1611 @@
-2013-04-24 Glenn Morris <rgm@gnu.org>
+2013-04-26 Glenn Morris <rgm@gnu.org>
* subr.el (read-number): Once more use `read' rather than
`string-to-number', to trap non-numeric input. (Bug#14254)
-2013-04-22 Erik Charlebois <erikcharlebois@gmail.com>
+2013-04-26 Erik Charlebois <erikcharlebois@gmail.com>
* emacs-lisp/syntax.el (syntax-propertize-multiline):
Use `syntax-multiline' text property consistently instead of
`font-lock-multiline'. (bug#14237).
-2013-04-06 Stefan Monnier <monnier@iro.umontreal.ca>
+2013-04-26 Glenn Morris <rgm@gnu.org>
- * eshell/em-prompt.el (eshell-emit-prompt): Make sure we can't insert
- into the prompt either (bug#13963).
+ * emacs-lisp/shadow.el (list-load-path-shadows):
+ No longer necessary to check for duplicate simple.el, since
+ 2012-07-07 change to init_lread to not include installation lisp
+ directories in load-path when running uninstalled. (Bug#14270)
+
+2013-04-26 Leo Liu <sdl.web@gmail.com>
+
+ * progmodes/octave.el (octave-submit-bug-report): Obsolete.
+ (octave-mode, inferior-octave-mode): Use setq-local.
+ (octave-not-in-string-or-comment-p): Renamed to
+ octave-in-string-or-comment-p.
+ (octave-in-comment-p, octave-in-string-p)
+ (octave-in-string-or-comment-p): Replace defsubst with defun.
+
+2013-04-25 Paul Eggert <eggert@cs.ucla.edu>
+
+ * Makefile.in (distclean): Remove $(lisp)/loaddefs.el~.
+
+2013-04-25 Bastien Guerry <bzg@gnu.org>
+
+ * textmodes/remember.el (remember-data-directory)
+ (remember-directory-file-name-format): Fix custom types.
+
+2013-04-25 Leo Liu <sdl.web@gmail.com>
+
+ * progmodes/octave.el (octave-completion-at-point-function): Make
+ use of inferior octave process.
+ (octave-initialize-completions): Remove.
+ (inferior-octave-completion-table): New function.
+ (inferior-octave-completion-at-point): Use it.
+ (octave-completion-alist): Remove.
+
+2013-04-25 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * progmodes/opascal.el: Use font-lock and syntax-propertize.
+ (opascal-mode-syntax-table): New var.
+ (opascal-literal-kind, opascal-is-literal-end)
+ (opascal-literal-token-at): Rewrite.
+ (opascal--literal-start-re, opascal-font-lock-keywords)
+ (opascal--syntax-propertize): New constants.
+ (opascal-font-lock-defaults): Adjust.
+ (opascal-mode): Use them. Set comment-<foo> variables as well.
+ (delphi-comment-face, opascal-comment-face, delphi-string-face)
+ (opascal-string-face, delphi-keyword-face, opascal-keyword-face)
+ (delphi-other-face, opascal-other-face): Remove face variables.
+ (opascal-save-state): Remove macro.
+ (opascal-fontifying-progress-step): Remove constant.
+ (opascal--ignore-changes): Remove var.
+ (opascal-set-token-property, opascal-parse-next-literal)
+ (opascal-is-stable-literal, opascal-complete-literal)
+ (opascal-is-literal-start, opascal-face-of)
+ (opascal-parse-region, opascal-parse-region-until-stable)
+ (opascal-fontify-region, opascal-after-change)
+ (opascal-debug-show-is-stable, opascal-debug-unparse-buffer)
+ (opascal-debug-parse-region, opascal-debug-parse-window)
+ (opascal-debug-parse-buffer, opascal-debug-fontify-window)
+ (opascal-debug-fontify-buffer): Remove.
+ (opascal-debug-mode-map): Adjust accordingly.
+
+2013-04-25 Leo Liu <sdl.web@gmail.com>
+
+ Merge octave-mod.el and octave-inf.el into octave.el with some
+ cleanups.
+ * progmodes/octave.el: New file renamed from octave-mod.el.
+ * progmodes/octave-inf.el: Merged into octave.el.
+ * progmodes/octave-mod.el: Renamed to octave.el.
+
+2013-04-25 Tassilo Horn <tsdh@gnu.org>
+
+ * textmodes/reftex-vars.el
+ (reftex-label-ignored-macros-and-environments): New defcustom.
+
+ * textmodes/reftex-parse.el (reftex-parse-from-file): Use it.
+
+2013-04-25 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/smie.el (smie-indent--hanging-p): Don't burp at EOB.
+ (smie-indent-keyword): Improve the check to ensure that the next
+ comment is really on the same line.
+ (smie-indent-comment): Don't align with a subsequent closer (or eob).
+
+ * progmodes/octave-mod.el (octave-smie-forward-token): Only emit
+ semi-colons if the line is not otherwise empty (bug#14218).
+
+2013-04-25 Glenn Morris <rgm@gnu.org>
+
+ * vc/vc-bzr.el (vc-bzr-print-log): Tweak LIMIT = 1 case.
+
+2013-04-24 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * progmodes/opascal.el (opascal-set-token-property): Rename from
+ opascal-set-text-properties and only set `token' (bug#14134).
+ Suggested by Erik Knowles <eknowles@geosystemsoftware.com>.
+ (opascal-literal-text-properties): Remove.
+ (opascal-parse-next-literal, opascal-debug-unparse-buffer):
+ Adjust callers.
+
+2013-04-24 Reuben Thomas <rrt@sc3d.org>
+
+ * textmodes/remember.el (remember-handler-functions): Add an
+ option for a new handler `remember-store-in-files'.
+ (remember-data-directory, remember-directory-file-name-format):
+ New options.
+ (remember-store-in-files): New function to store remember notes
+ as separate files within a directory.
+
+2013-04-24 Magnus Henoch <magnus.henoch@gmail.com>
+
+ * progmodes/compile.el (compilation-next-error-function):
+ Pass "formats" to compilation-find-file (bug#11777).
+
+2013-04-24 Glenn Morris <rgm@gnu.org>
+
+ * vc/vc-bzr.el (vc-bzr-print-log):
+ * vc/vc-hg.el (vc-hg-print-log):
+ * vc/vc-svn.el (vc-svn-print-log):
+ Fix START-REVISION with LIMIT != 1. (Bug#14168)
+
+ * vc/vc-bzr.el (vc-bzr-print-log):
+ * vc/vc-cvs.el (vc-cvs-print-log):
+ * vc/vc-git.el (vc-git-print-log):
+ * vc/vc-hg.el (vc-hg-print-log):
+ * vc/vc-mtn.el (vc-mtn-print-log):
+ * vc/vc-rcs.el (vc-rcs-print-log):
+ * vc/vc-sccs.el (vc-sccs-print-log):
+ * vc/vc-svn.el (vc-svn-print-log):
+ * vc/vc.el (vc-print-log-internal): Doc fixes.
+
+2013-04-23 Glenn Morris <rgm@gnu.org>
+
+ * startup.el (normal-no-mouse-startup-screen, normal-about-screen):
+ Remove venerable code attempting to avoid substitute-command-keys.
+
+2013-04-23 Tassilo Horn <tsdh@gnu.org>
+
+ * textmodes/reftex-vars.el (reftex-label-regexps):
+ Call `reftex-compile-variables' after changes to this variable.
+
+2013-04-23 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * jit-lock.el: Fix signals in jit-lock-force-redisplay (bug#13542).
+ Use lexical-binding.
+ (jit-lock-force-redisplay): Use markers, check buffer's continued
+ existence and beware narrowed buffers.
+ (jit-lock-fontify-now): Adjust call accordingly.
+
+2013-04-22 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * minibuffer.el (minibuffer-completion-contents): Fix obsolescence info
+ to avoid misleading the user.
+
+2013-04-22 Leo Liu <sdl.web@gmail.com>
+
+ * info-look.el: Prefer latex2e.info. (Bug#14240)
+
+2013-04-22 Michael Albinus <michael.albinus@gmx.de>
+
+ Fix pack/unpack coding. Reported by David Smith <davidsmith@acm.org>.
+
+ * net/tramp-compat.el (tramp-compat-call-process): Move function ...
+ * net/tramp.el (tramp-call-process): ... here
+ (tramp-set-completion-function, tramp-parse-putty):
+ * net/tramp-adb.el (tramp-adb-execute-adb-command):
+ * net/tramp-gvfs.el (tramp-gvfs-send-command):
+ * net/tramp-sh.el (tramp-sh-handle-set-file-times)
+ (tramp-set-file-uid-gid, tramp-sh-handle-write-region)
+ (tramp-call-local-coding-command): Use `tramp-call-process'
+ instead of `tramp-compat-call-process'.
+
+ * net/tramp-sh.el (tramp-perl-pack, tramp-perl-unpack): New defconst.
+ (tramp-local-coding-commands, tramp-remote-coding-commands): Use them.
+ (tramp-sh-handle-file-local-copy, tramp-sh-handle-write-region):
+ (tramp-find-inline-compress):Improve traces.
+ (tramp-maybe-send-script): Check for Perl binary.
+ (tramp-get-inline-coding): Do not redirect STDOUT for local decoding.
+
+2013-04-22 Daiki Ueno <ueno@gnu.org>
+
+ * epg.el (epg-context-pinentry-mode): New function.
+ (epg-context-set-pinentry-mode): New function.
+ (epg--start): Pass --pinentry-mode option to gpg command.
+
+2013-04-21 Xue Fuqiao <xfq.free@gmail.com>
+
+ * comint.el: (comint-dynamic-complete-functions, comint-mode-map):
+ `comint-dynamic-complete' is obsolete since 24.1, replaced by
+ `completion-at-point'. (Bug#13774)
+
+ * startup.el (normal-no-mouse-startup-screen): Bug fix, the
+ default key binding for `describe-distribution' has been moved to
+ `C-h C-o'. (Bug#13970)
+
+2013-04-21 Glenn Morris <rgm@gnu.org>
+
+ * vc/vc.el (vc-print-log-setup-buttons, vc-print-log-internal):
+ Add doc strings.
+ (vc-print-log): Clarify interactive prompt.
+
+2013-04-20 Glenn Morris <rgm@gnu.org>
+
+ * emacs-lisp/bytecomp.el (byte-compile-insert-header):
+ No longer include timestamp etc information.
+
+2013-04-20 Roland Winkler <winkler@gnu.org>
+
+ * faces.el (read-face-name): Bug fix, return just one face if arg
+ multiple is nil. (Bug#14209)
+
+2013-04-20 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/nadvice.el (advice--where-alist): Add :override.
+ (remove-function): Autoload.
+
+ * comint.el (comint-redirect-original-filter-function): Remove.
+ (comint-redirect-cleanup, comint-redirect-send-command-to-process):
+ * vc/vc-cvs.el (vc-cvs-annotate-process-filter,vc-cvs-annotate-command):
+ * progmodes/octave-inf.el (inferior-octave-send-list-and-digest):
+ * progmodes/prolog.el (prolog-consult-compile):
+ * progmodes/gdb-mi.el (gdb, gdb--check-interpreter):
+ Use add/remove-function instead.
+ * progmodes/gud.el (gud-tooltip-original-filter): Remove.
+ (gud-tooltip-process-output, gud-tooltip-tips):
+ Use add/remove-function instead.
+ * progmodes/xscheme.el (xscheme-previous-process-state): Remove.
+ (scheme-interaction-mode, exit-scheme-interaction-mode):
+ Use add/remove-function instead.
+
+ * vc/vc-dispatcher.el: Use lexical-binding.
+ (vc--process-sentinel): Rename from vc-process-sentinel.
+ Change last arg to be the code to run. Don't use vc-previous-sentinel
+ and vc-sentinel-commands any more.
+ (vc-exec-after): Allow code to be a function. Use add/remove-function.
+ (compilation-error-regexp-alist, view-old-buffer-read-only): Declare.
+
+2013-04-19 Masatake YAMATO <yamato@redhat.com>
+
+ * progmodes/sh-script.el (sh-imenu-generic-expression):
+ Handle function names with a single character. (Bug#14111)
+
+2013-04-19 Dima Kogan <dima@secretsauce.net> (tiny change)
+
+ * progmodes/gud.el (gud-perldb-marker-filter): Understand position info
+ for subroutines defined in an eval (bug#14182).
+
+2013-04-19 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+
+ * bookmark.el (bookmark-completing-read): Improve handling of empty
+ string (bug#14176).
+
+2013-04-19 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * vc/vc-dispatcher.el (vc-do-command): Get rid of default sentinel msg.
+
+2013-04-19 Fabián Ezequiel Gallina <fgallina@gnu.org>
+
+ New faster Imenu implementation (bug#14058).
+ * progmodes/python.el:
+ (python-imenu-prev-index-position):
+ (python-imenu-format-item-label-function)
+ (python-imenu-format-parent-item-label-function)
+ (python-imenu-format-parent-item-jump-label-function):
+ New vars.
+ (python-imenu-format-item-label)
+ (python-imenu-format-parent-item-label)
+ (python-imenu-format-parent-item-jump-label)
+ (python-imenu--put-parent, python-imenu--build-tree)
+ (python-imenu-create-index, python-imenu-create-flat-index)
+ (python-util-popn): New functions.
+ (python-mode): Set imenu-create-index-function to
+ python-imenu-create-index.
+
+2013-04-18 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * winner.el (winner-active-region): Use region-active-p, activate-mark
+ and deactivate-mark (bug#14225).
+
+ * simple.el (deactivate-mark): Don't inline it.
+
+2013-04-18 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-sh.el (tramp-remote-process-environment): Add "TMOUT=0".
+
+2013-04-18 Tassilo Horn <tsdh@gnu.org>
-2013-03-26 Fabián Ezequiel Gallina <fabian@anue.biz>
+ * files.el (auto-mode-alist): Delete OpenDocument and StarOffice
+ file extensions from the archive-mode entry in order to prefer
+ doc-view-mode-maybe with archive-mode as fallback (bug#14188).
+
+2013-04-18 Leo Liu <sdl.web@gmail.com>
+
+ * bindings.el (help-event-list): Add ?\?.
+
+2013-04-18 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * subr.el (with-wrapper-hook): Declare obsolete.
+ * simple.el (filter-buffer-substring-function): New hook.
+ (filter-buffer-substring): Use it.
+ (filter-buffer-substring-functions): Mark obsolete.
+ * minibuffer.el (completion-in-region-function): New hook.
+ (completion-in-region): Use it.
+ (completion-in-region-functions): Mark obsolete.
+ * mail/mailabbrev.el (mail-abbrevs-setup): Use abbrev-expand-function.
+ * abbrev.el (abbrev-expand-function): New hook.
+ (expand-abbrev): Use it.
+ (abbrev-expand-functions): Mark obsolete.
+ * emacs-lisp/nadvice.el (advice--where-alist): Add :filter-args
+ and :filter-return.
+
+2013-04-17 Fabián Ezequiel Gallina <fgallina@gnu.org>
+
+ * progmodes/python.el (python-nav--syntactically): Fix cornercases
+ and do not care about match data.
+
+2013-04-17 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/lisp.el (lisp-completion-at-point): Provide specialized
+ completion tables when completing error conditions and
+ `declare' arguments.
+ (lisp-complete-symbol, field-complete): Mark as obsolete.
+ (check-parens): Unmatched parens are user errors.
+ * minibuffer.el (minibuffer-completion-contents): Mark as obsolete.
+
+2013-04-17 Michal Nazarewicz <mina86@mina86.com>
+
+ * textmodes/flyspell.el (flyspell-check-pre-word-p): Return nil if
+ command changed buffer (ie. `flyspell-pre-buffer' is not current
+ buffer), which prevents making decisions based on invalid value of
+ `flyspell-pre-point' in the wrong buffer. Most notably, this used to
+ cause an error when `flyspell-pre-point' was nil after switching
+ buffers.
+ (flyspell-post-command-hook): No longer needs to change buffers when
+ checking pre-word. While at it remove unnecessary progn.
+
+2013-04-17 Nicolas Richard <theonewiththeevillook@yahoo.fr> (tiny change)
+
+ * textmodes/ispell.el (ispell-add-per-file-word-list):
+ Fix `flyspell-correct-word-before-point' error when accepting
+ words and `coment-padding' is an integer by using
+ `comment-normalize-vars' (Bug #14214).
+
+2013-04-17 Fabián Ezequiel Gallina <fgallina@gnu.org>
+
+ New defun movement commands.
+ * progmodes/python.el (python-nav--syntactically)
+ (python-nav--forward-defun, python-nav-backward-defun)
+ (python-nav-forward-defun): New functions.
+
+2013-04-17 Fabián Ezequiel Gallina <fgallina@gnu.org>
+
+ * progmodes/python.el (python-syntax--context-compiler-macro): New defun.
+ (python-syntax-context): Use named compiler-macro for backwards
+ compatibility with Emacs 24.x.
+
+2013-04-17 Leo Liu <sdl.web@gmail.com>
+
+ * progmodes/octave-mod.el (octave-mode-map): Fix key binding to
+ octave-hide-process-buffer.
+
+2013-04-17 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * vc/vc-hg.el (vc-hg-annotate-re): Disallow ": " in file names
+ (bug#14216).
+
+2013-04-17 Jean-Philippe Gravel <jpgravel@gmail.com>
+
+ * progmodes/gdb-mi.el (gdbmi-bnf-incomplete-record-result):
+ Fix adjustment of offset when receiving incomplete responses from GDB
+ (bug#14129).
+
+2013-04-16 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * progmodes/python.el (python-mode-skeleton-abbrev-table): Rename from
+ python-mode-abbrev-table.
+ (python-skeleton-define): Adjust accordingly.
+ (python-mode-abbrev-table): New table that inherits from it so that
+ python-skeleton-autoinsert does not affect non-skeleton abbrevs.
+
+ * abbrev.el (abbrev--symbol): New function, extracted from abbrev-symbol.
+ (abbrev-symbol): Use it.
+ (abbrev--before-point): Use it since we already handle inheritance.
+
+2013-04-16 Leo Liu <sdl.web@gmail.com>
+
+ * progmodes/octave-mod.el (octave-mode-map): Remove redundant key
+ binding to info-lookup-symbol.
+
+2013-04-16 Juanma Barranquero <lekktu@gmail.com>
+
+ * minibuffer.el (completion--twq-all):
+ * term/ns-win.el (ns-initialize-window-system):
+ * term/w32-win.el (w32-initialize-window-system): Silence byte-compiler.
+
+2013-04-16 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/nadvice.el (add-function): Default simple vars to their
+ global bindings.
+
+ * doc-view.el (doc-view-start-process): Handle url-handler directories.
+
+2013-04-15 Dmitry Gutov <dgutov@yandex.ru>
+
+ * progmodes/ruby-mode.el (ruby-beginning-of-defun)
+ (ruby-end-of-defun, ruby-move-to-block): Bind `case-fold-search'
+ to nil.
+ (ruby-end-of-defun): Remove the unused arg, change the docstring
+ to reflect that this function is only used as the value of
+ `end-of-defun-function'.
+ (ruby-beginning-of-defun): Remove "top-level" from the docstring,
+ to reflect an earlier change that beginning/end-of-defun functions
+ jump between methods in a class definition, as well as top-level
+ functions.
+
+2013-04-15 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * minibuffer.el (minibuffer-complete): Don't just scroll
+ a *Completions* that's been iconified.
+ (minibuffer-force-complete): Make sure repetitions do cycle when going
+ through completion-in-region -> minibuffer-complete.
+
+2013-04-15 Alan Mackenzie <acm@muc.de>
+
+ Correct the placement of c-cpp-delimiters when there're #s not at
+ col 0.
+
+ * progmodes/cc-langs.el (c-anchored-cpp-prefix): Reformulate and
+ place a submatch around the #.
+ * progmodes/cc-mode.el(c-neutralize-syntax-in-and-mark-CPP):
+ Start a search at BOL. Put the c-cpp-delimiter category text propertiy
+ on the #, not BOL.
+
+2013-04-15 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/nadvice.el: Properly test names when adding advice.
+ (advice--member-p): New arg `name'.
+ (advice--add-function, advice-member-p): Use it (bug#14202).
+
+2013-04-15 Filipp Gunbin <fgunbin@fastmail.fm>
+
+ Reformulate java imenu-generic-expression.
+ The old expression contained ill formed regexps.
+
+ * progmodes/cc-menus.el (cc-imenu-java-ellipsis-regexp)
+ (cc-imenu-java-type-spec-regexp, cc-imenu-java-comment-regexp)
+ (cc-imenu-java-method-arg-regexp): New defconsts.
+ (cc-imenu-java-build-type-args-regex): New defun.
+ (cc-imenu-java-generic-expression): Fix, to remove "ambiguous"
+ handling of spaces in the regexp.
+
+2013-03-15 Agustín Martín Domingo <agustin.martin@hispalinux.es>
+
+ * textmodes/ispell.el (ispell-command-loop): Remove
+ flyspell highlight of a word when ispell accepts it (bug #14178).
+
+2013-04-15 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/ange-ftp.el (ange-ftp-run-real-handler-orig): New defun,
+ uses code from the previous `ange-ftp-run-real-handler'.
+ (ange-ftp-run-real-handler): Set it to `tramp-run-real-handler'
+ only in case that function exist. This is needed for proper
+ unloading of Tramp.
+
+2013-04-15 Tassilo Horn <tsdh@gnu.org>
+
+ * textmodes/reftex-vars.el (reftex-label-regexps): New defcustom.
+
+ * textmodes/reftex.el (reftex-compile-variables): Use it.
+
+2013-04-14 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * files.el (normal-mode): Only use default major-mode if no other mode
+ was specified.
+
+ * emacs-lisp/trace.el (trace-values): New function.
+
+ * files.el: Allow : in local variables (bug#14089).
+ (hack-local-variable-regexp): New var.
+ (hack-local-variables-prop-line, hack-local-variables): Use it.
+
+2013-04-13 Roland Winkler <winkler@gnu.org>
+
+ * textmodes/bibtex.el (bibtex-search-entries): Bug fix. Use match
+ data before it gets modified by bibtex-beginning-of-entry.
+
+2013-04-13 Roland Winkler <winkler@gnu.org>
+
+ * textmodes/bibtex.el (bibtex-url): Doc fix.
+
+2013-04-13 Roland Winkler <winkler@gnu.org>
+
+ * textmodes/bibtex.el (bibtex-initialize): If the current buffer
+ does not visit a BibTeX file, exclude it from the list of buffers
+ returned by bibtex-initialize.
+
+2013-04-13 Stephen Berman <stephen.berman@gmx.net>
+
+ * window.el (split-window): Remove interactive form, since as a
+ command this function is a special case of split-window-below.
+ Correct doc string.
+
+2013-04-12 Roland Winkler <winkler@gnu.org>
+
+ * faces.el (read-face-name): Do not override value of arg default.
+ Allow single faces and strings as default values. Remove those
+ elements from return value that are not faces.
+ (describe-face): Simplify.
+ (face-at-point): New optional args thing and multiple so that this
+ function can provide the same functionality previously provided by
+ read-face-name.
+ (make-face-bold, make-face-unbold, make-face-italic)
+ (make-face-unitalic, make-face-bold-italic, invert-face)
+ (modify-face, read-face-and-attribute): Use face-at-point.
+
+ * cus-edit.el (customize-face, customize-face-other-window)
+ * cus-theme.el (custom-theme-add-face)
+ * face-remap.el (buffer-face-set)
+ * facemenu.el (facemenu-set-face): Use face-at-point.
+
+2013-04-12 Michael Albinus <michael.albinus@gmx.de>
+
+ * info.el (Info-file-list-for-emacs): Add "tramp" and "dbus".
+
+2013-04-10 Tassilo Horn <tsdh@gnu.org>
+
+ * textmodes/reftex-cite.el (reftex-parse-bibtex-entry): Don't cut
+ off leading { and trailing } from field values.
+
+2013-04-10 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/timer.el (timer--check): New function.
+ (timer--time, timer-set-function, timer-event-handler): Use it.
+ (timer-set-idle-time): Simplify.
+ (timer--activate): CSE.
+ (timer-event-handler): Give more info in error message.
+ (internal-timer-start-idle): New function, moved from C.
+
+ * mpc.el (mpc-proc): Add `restart' argument.
+ (mpc-proc-cmd): Use it.
+ (mpc--status-timer-run): Also catch signals from `mpc-proc'.
+ (mpc-status-buffer-show, mpc-tagbrowser-dir-toggle): Call `mpc-proc'
+ less often.
+
+2013-04-10 Masatake YAMATO <yamato@redhat.com>
+
+ * progmodes/sh-script.el: Implement `sh-mode' own
+ `add-log-current-defun-function' (bug#14112).
+ (sh-current-defun-name): New function.
+ (sh-mode): Use the function.
+
+2013-04-09 Bastien Guerry <bzg@gnu.org>
+
+ * simple.el (choose-completion-string): Fix docstring (bug#14163).
+
+2013-04-08 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/edebug.el (edebug-mode): Fix typo (bug#14144).
+
+ * emacs-lisp/timer.el (timer-event-handler): Don't retrigger a canceled
+ timer (bug#14156).
+
+2013-04-07 Nic Ferrier <nferrier@ferrier.me.uk>
+
+ * emacs-lisp/ert.el (should, should-not, should-error): Add edebug
+ declaration.
+
+2013-04-07 Leo Liu <sdl.web@gmail.com>
+
+ * pcmpl-x.el: New file.
+
+2013-04-06 Dmitry Antipov <dmantipov@yandex.ru>
+
+ Do not set x-display-name until X connection is established.
+ This is needed to prevent from weird situation described at
+ <http://lists.gnu.org/archive/html/emacs-devel/2013-04/msg00212.html>.
+ * frame.el (make-frame): Set x-display-name after call to
+ window system initialization function, not before.
+ * term/x-win.el (x-initialize-window-system): Add optional
+ display argument and use it.
+ * term/w32-win.el (w32-initialize-window-system):
+ * term/ns-win.el (ns-initialize-window-system):
+ * term/pc-win.el (msdos-initialize-window-system):
+ Add compatible optional display argument.
+
+2013-04-06 Eli Zaretskii <eliz@gnu.org>
+
+ * files.el (normal-backup-enable-predicate): On MS-Windows and
+ MS-DOS compare truenames of temporary-file-directory and of the
+ file, so that 8+3 aliases (usually found in $TEMP on Windows)
+ don't fail comparison by compare-strings. Also, compare file
+ names case-insensitively on MS-Windows and MS-DOS.
+
+2013-04-05 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/package.el (package-compute-transaction): Fix last fix.
+ Suggested by Donald Curtis <dcurtis@coe.edu> (bug#14082).
+
+2013-04-05 Dmitry Gutov <dgutov@yandex.ru>
+
+ * whitespace.el (whitespace-color-on, whitespace-color-off):
+ Only call `font-lock-fontify-buffer' when `font-lock-mode' is on.
+
+2013-04-05 Jacek ChrzÄ…szcz <chrzaszcz@mimuw.edu.pl> (tiny change)
+
+ * ispell.el (ispell-set-spellchecker-params):
+ Really set `ispell-args' for all equivs.
+
+2013-04-05 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * ido.el (ido-completions): Use extra elements of ido-decorations
+ (bug#14143).
+ (ido-decorations): Update docstring.
+
+2013-04-05 Michael Albinus <michael.albinus@gmx.de>
+
+ * autorevert.el (auto-revert-mode, auto-revert-tail-mode)
+ (global-auto-revert-mode): Let-bind `auto-revert-use-notify' to
+ nil during initialization, in order not to miss changes since the
+ file was opened. (Bug#14140)
+
+2013-04-05 Leo Liu <sdl.web@gmail.com>
+
+ * kmacro.el (kmacro-call-macro): Fix bug#14135.
+
+2013-04-05 Jay Belanger <jay.p.belanger@gmail.com>
+
+ * calc/calc-units.el (calc-convert-units): Rewrite conditional.
+
+2013-04-04 Glenn Morris <rgm@gnu.org>
+
+ * electric.el (electric-pair-inhibit-predicate): Add :version.
+
+2013-04-04 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/package.el (package-compute-transaction): Fix ordering
+ when a package is required several times (bug#14082).
+
+2013-04-04 Roland Winkler <winkler@gnu.org>
+
+ * faces.el (read-face-name): Behave as promised by the docstring.
+ Assume that arg default is a list of faces.
+ (describe-face): Call read-face-name with list of default faces.
+
+2013-04-04 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+
+ * bookmark.el: Fix deletion of bookmarks (bug#13972).
+ (bookmark-bmenu-list): Don't toggle filenames if alist is empty.
+ (bookmark-bmenu-execute-deletions): Only skip first line if it's
+ the header.
+ (bookmark-exit-hook-internal): Save even if list is empty.
+
+2013-04-04 Yann Hodique <yann.hodique@gmail.com> (tiny change)
+
+ * emacs-lisp/package.el (package-pinned-packages): New var.
+ (package--add-to-archive-contents): Obey it (bug#14118).
+
+2013-04-03 Alan Mackenzie <acm@muc.de>
+
+ Handle `parse-partial-sexp' landing inside a comment opener
+ (Bug#13244). Also adapt to the new values of element 7 of a parse
+ state.
+
+ * progmodes/cc-engine.el (c-state-pp-to-literal): New optional
+ parameter `not-in-delimiter'. Handle being inside comment opener.
+ (c-invalidate-state-cache-1): Reckon with an extra "invalid"
+ character in case we're typing a '*' after a '/'.
+ (c-literal-limits): Handle the awkward "not-in-delimiter" cond arm
+ instead by passing the parameter to c-state-pp-to-literal.
+
+ * progmodes/cc-fonts.el (c-font-lock-doc-comments): New handling
+ for elt. 7 of a parse state.
+
+2013-04-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ Use UTF-8 for most files with non-ASCII characters (Bug#13936).
+ * international/latin1-disp.el, international/mule-util.el:
+ * language/cyril-util.el, language/european.el, language/ind-util.el:
+ * language/lao-util.el, language/thai.el, language/tibet-util.el:
+ * language/tibetan.el, language/viet-util.el:
+ Switch from iso-2022-7bit to utf-8 or (if needed) utf-8-emacs.
+
+2013-04-01 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * electric.el (electric-pair-inhibit-predicate): New var (bug#14000).
+ (electric-pair-post-self-insert-function): Use it.
+ (electric-pair-default-inhibit): New function, extracted from
+ electric-pair-post-self-insert-function.
+
+2013-03-31 Roland Winkler <winkler@gnu.org>
+
+ * emacs-lisp/crm.el (completing-read-multiple): Doc fix.
+
+2013-03-31 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * hi-lock.el (hi-lock-mode): Cleanup after revert-buffer (bug#13891).
+
+2013-03-30 Fabián Ezequiel Gallina <fabian@anue.biz>
Un-indent after "pass" and "return" statements (Bug#13888)
* progmodes/python.el (python-indent-block-enders): New var.
(python-indent-calculate-indentation): Use it.
-2013-03-25 Michael Albinus <michael.albinus@gmx.de>
+2013-03-30 Michael Albinus <michael.albinus@gmx.de>
* net/tramp.el (tramp-drop-volume-letter): Make it an ordinary
defun. Defining it as defalias could introduce too eager
byte-compiler optimization. (Bug#14030)
-2013-03-25 Chong Yidong <cyd@gnu.org>
+2013-03-30 Chong Yidong <cyd@gnu.org>
* iswitchb.el (iswitchb-read-buffer): Fix typo.
+2013-03-30 Leo Liu <sdl.web@gmail.com>
+
+ * kmacro.el (kmacro-call-macro): Add optional arg MACRO.
+ (kmacro-execute-from-register): Pass the keyboard macro to
+ kmacro-call-macro or repeating won't work correctly.
+
+2013-03-30 Teodor Zlatanov <tzz@lifelogs.com>
+
+ * progmodes/subword.el: Back to using `forward-symbol'.
+
+ * subr.el (forward-whitespace, forward-symbol)
+ (forward-same-syntax): Move from thingatpt.el.
+
+2013-03-29 Leo Liu <sdl.web@gmail.com>
+
+ * kmacro.el (kmacro-to-register): New command.
+ (kmacro-execute-from-register): New function.
+ (kmacro-keymap): Bind to 'x'. (Bug#14071)
+
+2013-03-29 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * mpc.el: Use defvar-local and setq-local.
+ (mpc--proc-connect): Connection failures are not bugs.
+ (mpc-mode-map): `follow-link' only applies to the buffer's content.
+ (mpc-volume-map): Bind to the up-events.
+
+2013-03-29 Teodor Zlatanov <tzz@lifelogs.com>
+
+ * progmodes/subword.el (superword-mode): Use `forward-sexp'
+ instead of `forward-symbol'.
+
+2013-03-28 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/edebug.el (edebug-mode): Make it a minor mode.
+ (edebug--recursive-edit): Use it.
+ (edebug-kill-buffer): Don't let-bind kill-buffer-hook.
+ (edebug-temp-display-freq-count): Don't let-bind buffer-read-only.
+
+2013-03-28 Leo Liu <sdl.web@gmail.com>
+
+ * vc/vc-bzr.el (vc-bzr-revert): Don't backup. (Bug#14066)
+
+2013-03-27 Eli Zaretskii <eliz@gnu.org>
+
+ * facemenu.el (list-colors-callback): New defvar.
+ (list-colors-redisplay): New function.
+ (list-colors-display): Install list-colors-redisplay as the
+ revert-buffer-function. (Bug#14063)
+
+2013-03-27 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * minibuffer.el (completion-pcm--merge-completions): Make sure prefixes
+ and suffixes don't overlap (bug#14061).
+
+ * case-table.el: Use lexical-binding.
+ (case-table-get-table): New function.
+ (get-upcase-table): Use it. Mark as obsolete. Adjust callers.
+
+2013-03-27 Teodor Zlatanov <tzz@lifelogs.com>
+
+ * progmodes/subword.el: Add `superword-mode' to do word motion
+ over symbol_words (parallels and leverages `subword-mode' which
+ does word motion inside MixedCaseWords).
+
+2013-03-27 Aidan Gauland <aidalgol@no8wireless.co.nz>
+
+ * eshell/em-unix.el: Move su and sudo to...
+ * eshell/em-tramp.el: ...Eshell tramp module.
+
+2013-03-26 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * desktop.el (desktop--v2s): Rename from desktop-internal-v2s.
+ Change return value to be a sexp. Delay `get-buffer' to after
+ restoring the desktop (bug#13951).
+
+2013-03-26 Leo Liu <sdl.web@gmail.com>
+
+ * register.el: Move semantic tag handling back to
+ cedet/semantic/senator.el. (Bug#14052)
+
+2013-03-26 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * eshell/em-prompt.el (eshell-emit-prompt): Make sure we can't insert
+ into the prompt either (bug#13963).
+
+2013-03-25 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * font-lock.el (lisp-font-lock-keywords-2): Don't highlight the "error"
+ part of "(error-foo)".
+
+2013-03-24 Juri Linkov <juri@jurta.org>
+
+ * replace.el (list-matching-lines-prefix-face): New defcustom.
+ (occur-1): Pass `list-matching-lines-prefix-face' to the function
+ `occur-engine' if `face-differs-from-default-p' returns t.
+ (occur-engine): Add `,' inside backquote construct to evaluate
+ `prefix-face'. Propertize the prefix with the `prefix-face' face.
+ Pass `prefix-face' to the functions `occur-context-lines' and
+ `occur-engine-add-prefix'.
+ (occur-engine-add-prefix, occur-context-lines): Add optional arg
+ `prefix-face' and propertize the prefix with `prefix-face'.
+ (Bug#14017)
+
+2013-03-24 Leo Liu <sdl.web@gmail.com>
+
+ * nxml/rng-valid.el (rng-validate-while-idle)
+ (rng-validate-quick-while-idle): Guard against deleted buffer.
+ (Bug#13999)
+
+ * emacs-lisp/edebug.el (edebug-mode): Make sure edebug-kill-buffer
+ is the last entry in kill-buffer-hook.
+
+ * files.el (kill-buffer-hook): Doc fix.
+
+2013-03-23 Dmitry Gutov <dgutov@yandex.ru>
+
+ * emacs-lisp/lisp-mode.el (emacs-lisp-docstring-fill-column):
+ Make it safe-local.
+
+ * vc/diff-mode.el (diff-mode-shared-map): Unbind "/" (Bug#14034).
+
+2013-03-23 Leo Liu <sdl.web@gmail.com>
+
+ * nxml/nxml-util.el (nxml-with-unmodifying-text-property-changes):
+ Remove.
+
+ * nxml/rng-valid.el (rng-validate-mode)
+ (rng-after-change-function, rng-do-some-validation):
+ * nxml/rng-maint.el (rng-validate-buffer):
+ * nxml/nxml-rap.el (nxml-tokenize-forward, nxml-ensure-scan-up-to-date):
+ * nxml/nxml-outln.el (nxml-show-all, nxml-set-outline-state):
+ * nxml/nxml-mode.el (nxml-mode, nxml-degrade, nxml-after-change)
+ (nxml-extend-after-change-region): Use with-silent-modifications.
+
+ * nxml/rng-nxml.el (rng-set-state-after): Do not let-bind
+ timer-idle-list.
+
+ * nxml/rng-valid.el (rng-validate-while-idle-continue-p)
+ (rng-next-error-1, rng-previous-error-1): Do not let-bind
+ timer-idle-list. (Bug#13999)
+
+2013-03-23 Juri Linkov <juri@jurta.org>
+
+ * info.el (info-index-match): New face.
+ (Info-index, Info-apropos-matches): Add a nested subgroup to the
+ main pattern and add text properties with the new face to matches
+ in index entries relative to the beginning of the index entry.
+ (Bug#14015)
+
+2013-03-21 Eric Ludlam <zappo@gnu.org>
+
+ * eieio/eieio-datadebug.el (data-debug/eieio-insert-slots):
+ Inhibit read only while inserting objects.
+
+2013-03-22 Teodor Zlatanov <tzz@lifelogs.com>
+
+ * progmodes/cfengine.el: Update docs to mention
+ `cfengine-auto-mode'. Use \_> and \_< instead of \> and \< for
+ symbol motion. Remove "_" from the word syntax.
+
+2013-03-21 Teodor Zlatanov <tzz@lifelogs.com>
+
+ * progmodes/cfengine.el (cfengine-common-syntax): Add "_" to word
+ syntax for both `cfengine2-mode' and `cfengine3-mode'.
+
+2013-03-20 Juri Linkov <juri@jurta.org>
+
+ * info.el (Info-next-reference-or-link)
+ (Info-prev-reference-or-link): New functions.
+ (Info-next-reference, Info-prev-reference): Use them.
+ (Info-try-follow-nearest-node): Handle footnote navigation.
+ (Info-fontify-node): Fontify footnotes. (Bug#13989)
+
+2013-03-20 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * subr.el (posn-point, posn-string): Fix it here instead (bug#13979).
+ * mouse.el (mouse-on-link-p): Undo scroll-bar fix.
+
+2013-03-20 Paul Eggert <eggert@cs.ucla.edu>
+
+ Suppress unnecessary non-ASCII chatter during build process.
+ * international/ja-dic-cnv.el (skkdic-collect-okuri-nasi)
+ (batch-skkdic-convert): Suppress most of the chatter.
+ It's not needed so much now that machines are faster,
+ and its non-ASCII component was confusing; see Dmitry Gutov in
+ <http://lists.gnu.org/archive/html/emacs-devel/2013-03/msg00508.html>.
+
+2013-03-20 Leo Liu <sdl.web@gmail.com>
+
+ * ido.el (ido-chop): Fix bug#10994.
+
+2013-03-19 Dmitry Gutov <dgutov@yandex.ru>
+
+ * whitespace.el (whitespace-font-lock, whitespace-font-lock-mode):
+ Remove vars.
+ (whitespace-color-on, whitespace-color-off):
+ Use `font-lock-fontify-buffer' (Bug#13817).
+
+2013-03-19 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * mouse.el (mouse--down-1-maybe-follows-link): Fix follow-link
+ remapping in mode-line.
+ (mouse-on-link-p): Also check [mode-line follow-link] bindings.
+
+2013-03-19 Dmitry Gutov <dgutov@yandex.ru>
+
+ * whitespace.el (whitespace-color-on): Use `prepend' OVERRIDE
+ value for `whitespace-line' face (Bug#13875).
+ (whitespace-font-lock-keywords): Change description.
+ (whitespace-color-on): Don't save `font-lock-keywords' value, save
+ the constructed keywords instead.
+ (whitespace-color-off): Use `font-lock-remove-keywords' (Bug#13817).
+
+2013-03-19 Leo Liu <sdl.web@gmail.com>
+
+ * progmodes/compile.el (compilation-display-error): New command.
+ (compilation-mode-map, compilation-minor-mode-map): Bind it to
+ C-o. (Bug#13992)
+
+2013-03-18 Paul Eggert <eggert@cs.ucla.edu>
+
+ * term/x-win.el (x-keysym-pair): Add a Fixme (Bug#13936).
+
+2013-03-18 Jan Djärv <jan.h.d@swipnet.se>
+
+ * mouse.el (mouse-on-link-p): Check for scroll bar (Bug#13979).
+
+2013-03-18 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-compat.el (tramp-compat-user-error): New defun.
+
+ * net/tramp-adb.el (tramp-adb-handle-shell-command):
+ * net/tramp-gvfs.el (top):
+ * net/tramp.el (tramp-find-method, tramp-dissect-file-name)
+ (tramp-handle-shell-command): Use it.
+ (tramp-dissect-file-name): Raise an error when hostname is a
+ method name, and neither method nor user is specified.
+
+ * net/trampver.el: Update release number.
+
+2013-03-18 Leo Liu <sdl.web@gmail.com>
+
+ Make sure eldoc can be turned off properly.
+ * emacs-lisp/eldoc.el (eldoc-schedule-timer): Conditionalize on
+ eldoc-mode.
+ (eldoc-display-message-p): Revert last change.
+ (eldoc-display-message-no-interference-p)
+ (eldoc-print-current-symbol-info): Tweak.
+
+2013-03-18 Tassilo Horn <tsdh@gnu.org>
+
+ * doc-view.el (doc-view-new-window-function): Check the new window
+ overlay's display property instead the char property of the
+ buffer's first char. Use `with-selected-window' instead of
+ `save-window-excursion' with `select-window'.
+ (doc-view-document->bitmap): Check the current doc-view overlay's
+ display property instead the char property of the buffer's first char.
+
+2013-03-18 Paul Eggert <eggert@cs.ucla.edu>
+
+ Automate the build of ja-dic.el (Bug#13984).
+ * international/ja-dic-cnv.el (skkdic-convert): Remove the annotations
+ from the input, rather than assume that it's been done for us by the
+ SKK script unannotate.awk. Switch ja-dic.el to UTF-8. Don't put
+ the current date into a ja-dic.el comment, as that complicates
+ regression testing.
+
+2013-03-18 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * whitespace.el: Fix double evaluation.
+ (whitespace-space, whitespace-hspace, whitespace-tab)
+ (whitespace-newline, whitespace-trailing, whitespace-line)
+ (whitespace-space-before-tab, whitespace-indentation)
+ (whitespace-empty, whitespace-space-after-tab): Turn defcustoms into
+ obsolete defvars.
+ (whitespace-hspace-regexp): Fix regexp for emacs-unicode.
+ (whitespace-color-on): Use a single font-lock-add-keywords call.
+ Fix double-evaluation of face variables.
+
+2013-03-17 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-adb.el (tramp-adb-parse-device-names):
+ Use `start-process' instead of `call-process'. Otherwise, the
+ function might be blocked under MS Windows. (Bug#13299)
+
+2013-03-17 Leo Liu <sdl.web@gmail.com>
+
+ Extend eldoc to display info in the mode-line. (Bug#13978)
+ * emacs-lisp/eldoc.el (eldoc-post-insert-mode): New minor mode.
+ (eldoc-mode-line-string): New variable.
+ (eldoc-minibuffer-message): New function.
+ (eldoc-message-function): New variable.
+ (eldoc-message): Use it.
+ (eldoc-display-message-p)
+ (eldoc-display-message-no-interference-p):
+ Support eldoc-post-insert-mode.
+
+ * simple.el (eval-expression-minibuffer-setup-hook): New hook.
+ (eval-expression): Run it.
+
+2013-03-17 Roland Winkler <winkler@gnu.org>
+
+ * emacs-lisp/crm.el (completing-read-multiple): Ignore empty
+ strings in the list of return values.
+
+2013-03-17 Jay Belanger <jay.p.belanger@gmail.com>
+
+ * calc/calc-ext.el (math-read-number-fancy): Check for an explicit
+ radix before checking for HMS forms.
+
2013-03-16 Leo Liu <sdl.web@gmail.com>
* progmodes/scheme.el: Add indentation and font-locking for λ.
(Bug#13975)
-2013-03-14 Stefan Monnier <monnier@iro.umontreal.ca>
+2013-03-16 Stefan Monnier <monnier@iro.umontreal.ca>
* emacs-lisp/smie.el (smie-auto-fill): Don't inf-loop if there's no
token before point (bug#13942).
-2013-03-14 Leo Liu <sdl.web@gmail.com>
+2013-03-16 Leo Liu <sdl.web@gmail.com>
* thingatpt.el (end-of-sexp): Fix bug#13952. Use syntax-after.
-2013-03-11 Glenn Morris <rgm@gnu.org>
+2013-03-16 Eli Zaretskii <eliz@gnu.org>
+
+ * startup.el (command-line-normalize-file-name): Fix handling of
+ backslashes in DOS and Windows file names. Reported by Xue Fuqiao
+ <xfq.free@gmail.com> in
+ http://lists.gnu.org/archive/html/help-gnu-emacs/2013-03/msg00245.html.
+
+2013-03-15 Michael Albinus <michael.albinus@gmx.de>
+
+ Sync with Tramp 2.2.7.
+
+ * net/trampver.el: Update release number.
+
+2013-03-14 Tassilo Horn <tsdh@gnu.org>
+
+ * doc-view.el Fix bug#13887.
+ (doc-view-insert-image): Don't modify overlay associated to
+ non-live windows, and implement horizontal centering of image in
+ case it's smaller than the window.
+ (doc-view-new-window-function): Force redisplay of new windows on
+ doc-view buffers.
+
+2013-03-13 Karl Fogel <kfogel@red-bean.com>
+
+ * saveplace.el (save-place-alist-to-file): Don't sort
+ `save-place-alist', just pretty-print it (bug#13882).
+
+2013-03-13 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-sh.el (tramp-sh-handle-insert-directory): Check,
+ whether `default-file-name-coding-system' is bound. It isn't in
+ XEmacs.
+
+2013-03-13 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/byte-run.el (defun-declarations-alist): Don't use
+ backquotes for `obsolete' (bug#13929).
+
+ * international/mule.el (find-auto-coding): Include file name in
+ obsolescence warning (bug#13922).
+
+2013-03-12 Teodor Zlatanov <tzz@lifelogs.com>
+
+ * progmodes/cfengine.el (cfengine-parameters-indent): New variable
+ for CFEngine 3-specific indentation.
+ (cfengine3-indent-line): Use it. Fix up category regex.
+ (cfengine3-font-lock-keywords): Add bundle and namespace characters.
+
+2013-03-12 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * type-break.el (type-break-file-name):
+ * textmodes/remember.el (remember-data-file):
+ * strokes.el (strokes-file):
+ * shadowfile.el (shadow-initialize):
+ * saveplace.el (save-place-file):
+ * ps-bdf.el (bdf-cache-file):
+ * progmodes/idlwave.el (idlwave-config-directory):
+ * net/quickurl.el (quickurl-url-file):
+ * international/kkc.el (kkc-init-file-name):
+ * ido.el (ido-save-directory-list-file):
+ * emulation/viper.el (viper-custom-file-name):
+ * emulation/vip.el (vip-startup-file):
+ * calendar/todo-mode.el (todo-file-do, todo-file-done, todo-file-top):
+ * calendar/timeclock.el (timeclock-file): Use locate-user-emacs-file.
+
+2013-03-12 Paul Eggert <eggert@cs.ucla.edu>
+
+ Switch encodings of tutorials, thai-word to UTF-8 (Bug#13880).
+ * language/thai-word.el: Switch to UTF-8.
+
+2013-03-11 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * recentf.el (recentf-save-file): Use locate-user-emacs-file (bug#13870).
+
+2013-03-11 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+
+ * net/net-utils.el (net-utils-remove-ctrl-m-filter):
+ Use with-current-buffer and don't move point.
+ (net-utils-run-simple): Remove useless code.
+ (net-utils-remove-ctl-m): Remove unused custom.
+
+2013-03-11 Per Starbäck <starback@stp.lingfil.uu.se>
+
+ * international/characters.el (glyphless-set-char-table-range): New fun.
+ (update-glyphless-char-display): Use it (bug#13744).
+
+2013-03-11 Teodor Zlatanov <tzz@lifelogs.com>
+
+ * progmodes/cfengine.el: Update for CFEngine 3.4.2 and higher:
+ namespaces in the syntax, indent closer for hanging brace
+ correctly, allow single-quote delimited 'strings', and make
+ `cfengine3-mode' the default.
+
+2013-03-11 Jean-Philippe Gravel <jpgravel@gmail.com>
+
+ * progmodes/gdb-mi.el: Speed up initialization (bug#10580).
+ Use lexical-binding. Fix up docstring according to conventions.
+ (gdbmi-debug-mode): New var.
+ (gdbmi-start-with, gdbmi-same-start, gdbmi-is-number, gdbmi-bnf-init)
+ (gdbmi-bnf-output, gdbmi-bnf-skip-unrecognized, gdbmi-bnf-gdb-prompt)
+ (gdbmi-bnf-result-record, gdbmi-bnf-out-of-band-record)
+ (gdbmi-bnf-async-record, gdbmi-bnf-stream-record)
+ (gdbmi-bnf-console-stream-output, gdbmi-bnf-target-stream-output)
+ (gdbmi-bnf-log-stream-output, gdbmi-bnf-result-and-async-record-impl)
+ (gdbmi-bnf-incomplete-record-result): New functions.
+ (gdb-car<): Remove function.
+ (gdbmi-record-list): Remove variable.
+ (gdbmi-bnf-state, gdbmi-bnf-offset): New vars.
+ (gdbmi-bnf-result-state-configs): New const.
+ (gud-gdbmi-marker-filter): Rewrite.
+ (gdb-ignored-notification, gdb-thread-created, gdb-thread-exited)
+ (gdb-thread-selected, gdb-running, gdb-starting, gdb-stopped):
+ Add `token' argument.
+ (gdb-done, gdb-error): New functions.
+ (gdb-done-or-error): Add `is-complete' argument. Change arg order.
+
+2013-03-11 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * term/xterm.el (xterm--report-background-handler): Don't burp
+ upon timeout.
+ (xterm--version-handler): Extract from terminal-init-xterm.
+ (xterm--query): Don't mishandle timeout. Remove debugging messages.
+ Allow multiple handlers.
+ (terminal-init-xterm): Handle OSX's Terminal.app's incorrect answer.
+
+ * term/xterm.el: Don't discard input (bug#6758). Use lexical-binding.
+ (xterm--report-background-handler, xterm--query): New functions.
+ (terminal-init-xterm): Use them.
+
+2013-03-11 Michael R. Mauger <michael@mauger.com>
+
+ * progmodes/sql.el Version 3.2
+ Please note that my address changed to <michael@mauger.com>;
+ the <mmaug@yahoo.com> address remains active.
+ (sql-connection-alist): Updates documentation to fix bug#13715.
+ (sql-connect): Handle missing `sql-connection-alist' correctly.
+ (sql-mode-oracle-font-lock-keywords): Add missing keywords.
+ (sql-magic-go, sql-magic-semicolon): Mark with `delete-selection'
+ property.
+ (sql-default-value): New function.
+ (sql-get-login-ext, sql-get-login): Fixes bug where buffer-local
+ values were not used.
+ (sql-rename-buffer): Make sure alternate buffer name has no text
+ properties.
+ (sql-input-sender, sql-execute-feature): Fetch variable with
+ `buffer-local-value' rather than `with-current-buffer'.
+ (sql-*): Use #' function syntax consistently.
+ (sql-*): Use message/error/user-error consistently.
+
+2013-03-11 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * xt-mouse.el (xterm-mouse-event-read): Remove.
+ (xterm-mouse--read-event-sequence-1000)
+ (xterm-mouse--read-event-sequence-1006): Use read-event instead.
+
+2013-03-10 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * term/xterm.el (xterm-function-map): Support format used with
+ formatOtherKeys=1 (bug#13839).
+
+ * emacs-lisp/byte-run.el (dont-compile): Declare obsolete.
+ (with-no-warnings): Use `declare'.
+
+ * whitespace.el (whitespace-enable-predicate): New variable.
+ (whitespace-enable-predicate): Use it.
+
+ * comint.el (comint-send-input, comint-snapshot-last-prompt)
+ (comint-output-filter, comint-update-fence):
+ Use with-silent-modifications.
+
+2013-03-10 Jambunathan K <kjambunathan@gmail.com>
+
+ * replace.el (occur-read-regexp-defaults-function): New var.
+ (occur-read-regexp-defaults): New defun.
+ (occur-read-primary-args): Propagate above change (bug#13892).
+
+2013-03-09 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * mouse.el (mouse-drag-track): Remove left-over debugging code.
+
+2013-03-09 Michael Albinus <michael.albinus@gmx.de>
+
+ Major rewrite due to changed D-Bus interface of GVFS 1.14.
+
+ * net/tramp-gvfs.el (top): Extend check for gvfs availability.
+ (tramp-gvfs-methods-mounttracker, tramp-gvfs-listmounts)
+ (tramp-gvfs-mountlocation, tramp-gvfs-mountlocation-signature):
+ New defconst.
+ (tramp-gvfs-file-name-handler-alist) [directory-files]
+ [directory-files-and-attributes, file-exists-p, file-modes]:
+ Use Tramp default handler.
+ [file-acl, file-selinux-context, process-file, set-file-acl]:
+ [set-file-modes, set-file-selinux-context, shell-command]:
+ [start-file-process]: Remove handler.
+ [verify-visited-file-modtime]: New handler.
+ (tramp-gvfs-dbus-string-to-byte-array)
+ (tramp-gvfs-dbus-byte-array-to-string): New defuns. Replace all
+ calls of `dbus-string-to-byte-array' and
+ `tramp-gvfs-dbus-byte-array-to-string'.
+ (tramp-gvfs-handle-copy-file)
+ (tramp-gvfs-handle-delete-directory)
+ (tramp-gvfs-handle-delete-file, tramp-gvfs-handle-file-attributes)
+ (tramp-gvfs-handle-file-directory-p)
+ (tramp-gvfs-handle-file-executable-p)
+ (tramp-gvfs-handle-file-name-all-completions)
+ (tramp-gvfs-handle-file-readable-p)
+ (tramp-gvfs-handle-file-writable-p)
+ (tramp-gvfs-handle-insert-directory)
+ (tramp-gvfs-handle-insert-file-contents)
+ (tramp-gvfs-handle-make-directory, tramp-gvfs-handle-rename-file)
+ (tramp-gvfs-handle-set-visited-file-modtime)
+ (tramp-gvfs-handle-write-region): Rewrite.
+ (tramp-gvfs-handle-file-acl)
+ (tramp-gvfs-handle-file-selinux-context)
+ (tramp-gvfs-handle-process-file, tramp-gvfs-handle-set-file-acl)
+ (tramp-gvfs-handle-set-file-modes)
+ (tramp-gvfs-handle-set-file-selinux-context)
+ (tramp-gvfs-handle-shell-command)
+ (tramp-gvfs-handle-start-file-process)
+ (tramp-gvfs-handle-verify-visited-file-modtime): Remove defuns.
+ (tramp-gvfs-url-file-name): Do not use `file-truename', we work
+ over the symlinks. Fix user handling.
+ (top, tramp-gvfs-handler-mounted-unmounted): Handle different names
+ of the D-Bus signals.
+ (tramp-gvfs-connection-mounted-p): Handle different names of the
+ D-Bus methods.
+ (tramp-gvfs-mount-spec-entry): New defun.
+ (tramp-gvfs-mount-spec): Use it.
+ (tramp-gvfs-maybe-open-connection): Check, that in case of "smb"
+ there is a share name. Handle different names of the D-Bus
+ signals and methods. Set connection properties needed for
+ `tramp-check-cached-permissions'.
+ (tramp-gvfs-send-command): Apply `tramp-gvfs-maybe-open-connection'.
+ Return t or nil.
+
+ * net/tramp.el (tramp-backtrace): Move up.
+ (tramp-error): Dump a backtrace into the debug buffer when
+ `tramp-verbose > 9.
+ (tramp-file-mode-type-map, tramp-file-mode-from-int)
+ (tramp-file-mode-permissions, tramp-get-local-uid)
+ (tramp-get-local-gid, tramp-check-cached-permissions): Move from
+ tramp-sh.el.
+
+ * net/tramp-sh.el (tramp-file-mode-type-map)
+ (tramp-check-cached-permissions, tramp-file-mode-from-int)
+ (tramp-file-mode-permissions, tramp-get-local-uid)
+ (tramp-get-local-gid): Move to tramp.el.
+
+2013-03-09 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ Separate mouse-1-click-follows-link from mouse-drag-region.
+ * mouse.el (mouse--down-1-maybe-follows-link): New function.
+ (key-translation-map): Use it to implement mouse-1-click-follows-link.
+ (mouse-drag-line, mouse-drag-track):
+ Remove mouse-1-click-follows-link code.
+ (mouse--remap-link-click-p): Remove.
+
+2013-03-08 Jambunathan K <kjambunathan@gmail.com>
+
+ * hi-lock.el (hi-lock-read-regexp-defaults-function): New var.
+ (hi-lock-read-regexp-defaults): New defun.
+ (hi-lock-line-face-buffer, hi-lock-face-buffer)
+ (hi-lock-face-phrase-buffer): Propagate above change.
+ Update docstring (bug#13892).
+
+ * subr.el (find-tag-default-as-regexp): New defun.
+ * replace.el (read-regexp): Propagate above change.
+
+2013-03-08 Jay Belanger <jay.p.belanger@gmail.com>
+
+ * calc/calc-units.el (calc-convert-units): Fix the way that default
+ new units are stored.
+
+2013-03-07 Matthias Meulien <orontee@gmail.com>
+
+ * bookmark.el: Define a face to highlight bookmark names in
+ bookmark menu buffers, where the default is a bold face similarly
+ to buffer names in buffer menu buffers.
+ (bookmark-menu-bookmark): New face to highlight bookmark names.
+ (bookmark-insert-location): Remove duplicated text property to
+ conform to buffer list (see `list-buffers').
+ (bookmark-bmenu-list, bookmark-bmenu-hide-filenames): Apply face
+ `bookmark-menu-bookmark' to bookmark names.
+
+2013-03-07 Matthias Meulien <orontee@gmail.com>
+ Karl Fogel <kfogel@red-bean.com>
+
+ * bookmark.el: Display the bookmark list header similarly to the
+ buffer list header (see `list-buffers'), where the default is now
+ an immovable/immutable header line.
+ (bookmark-bmenu-use-header-line): New variable.
+ (bookmark-bmenu-inline-header-height): New name for
+ `bookmark-bmenu-header-height', to avoid confusion with the code
+ for the new immovable header. All references changed.
+ (bookmark-bmenu-set-header): New function.
+ (bookmark-bmenu-list, bookmark-bmenu-toggle-filenames):
+ Conditionalize header construction accordingly.
+ (bookmark-bmenu-ensure-position): Conditionalize the skipping of
+ the inline header height.
+ (bookmark-bmenu-show-filenames, bookmark-bmenu-hide-filenames):
+ Conditionalize the skipping of the inline header height.
+
+2013-03-07 Dmitry Gutov <dgutov@yandex.ru>
+
+ * progmodes/js.el (js--multi-line-declaration-indentation):
+ Merge from js2-mode (https://github.com/mooz/js2-mode/issues/89).
+
+2013-03-06 Dmitry Gutov <dgutov@yandex.ru>
+
+ * progmodes/ruby-mode.el (ruby-syntax-propertize-function):
+ Only propertize regexp when not inside a string (Bug#13885).
+
+2013-03-06 Alan Mackenzie <acm@muc.de>
+
+ Correct the position of point in some line-up functions.
+ * progmodes/cc-align.el (c-lineup-whitesmith-in-block)
+ (c-lineup-assignments, c-lineup-gcc-asm-reg ): take position of
+ point at column 0 rather than at a random place in the line.
+
+2013-03-05 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-compat.el (tramp-compat-delete-directory):
+ Implement TRASH argument.
+
+2013-03-05 Dmitry Gutov <dgutov@yandex.ru>
+
+ Keep pre-existing highlighting in completion candidates (Bug#13250).
+ * minibuffer.el (completions-first-difference): State that the
+ face is "added" in the docstring.
+ (completions-common-part): Same. And don't inherit from default.
+ (completion-hilit-commonality): Prepend 'completions-common-part
+ and 'completion-first-difference faces to the 'face property,
+ instead of replacing the value(s).
+ (completion--insert-strings): Same with 'completions-annotations face.
+ (completion-hilit-commonality): Use 'face instead of
+ 'font-lock-face, because it gets priority if the completion
+ strings already have 'face set.
+
+2013-03-04 Alan Mackenzie <acm@muc.de>
+
+ Replace `last-command-event' by `last-command-char' in XEmacs.
+ * progmodes/cc-defs.el (c-last-command-char): New macro.
+ * progmodes/cc-align.el (c-semi&comma-inside-parenlist)
+ (c-semi&comma-no-newlines-before-nonblanks)
+ (c-semi&comma-no-newlines-for-oneline-inliners): Use the new macro
+ in place of `last-command-event'.
+ * progmodes/cc-cmds.el (c-electric-pound, c-electric-brace)
+ (c-electric-slash, c-electric-semi&comma, c-electric-lt-gt)
+ (c-electric-paren, c-electric-continued-statement): Use the new
+ macro in place of `last-command-event'.
- * Version 24.3 released.
+2013-03-04 Glenn Morris <rgm@gnu.org>
-2013-02-25 Glenn Morris <rgm@gnu.org>
+ * files.el (inhibit-local-variables-regexps):
+ Add .diff and .patch. (Bug#13862)
+
+2013-03-03 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-adb.el (tramp-adb-maybe-open-connection): Cache,
+ whether the "su" command is available on the device.
+
+2013-03-01 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-adb.el (tramp-adb-prompt): Extend regexp.
+ (tramp-adb-handle-process-file): Remove superfluous setting.
+ (tramp-adb-command-exit-status): Handle case that COMMAND is nil.
+ (tramp-adb-barf-unless-okay): Use `tramp-adb-command-exit-status'.
+ (tramp-adb-maybe-open-connection): Apply "su" if user is defined.
+
+2013-03-01 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * textmodes/ispell.el: Fix nitpicks and byte-compiler warnings.
+ (ispell-print-if-debug): Build `format' in. Avoid end-of-buffer.
+ (ispell-parse-hunspell-affix-file): Avoid beginning-of-buffer.
+ Use dict-key rather than dict-name for the error message.
+
+2013-03-01 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+
+ * net/net-utils.el (net-utils-run-simple): Don't display-buffer
+ when reverting (bug#13831).
+
+2013-03-01 Agustín Martín Domingo <agustin.martin@hispalinux.es>
+
+ * textmodes/ispell.el (ispell-find-hunspell-dictionaries):
+ Always expand affix-file before storing to protect against changed
+ `default-directory'.
+ (ispell-print-if-debug): Make sure message is printed at the end
+ of the debug buffer.
+
+2013-03-01 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp.el (tramp-obsolete-methods): New defconst.
+ (tramp-warned-obsolete-methods): New defvar.
+ (tramp-find-method): Check for obsolete methods. Map them to a
+ replacement method if appropriate.
+
+ * net/tramp-sh.el (tramp-methods) [scp1, scp2, ssh1, ssh2, plink1]:
+ Remove methods.
+ (top): Remove completion functions for "scp1", "scp2", "ssh1",
+ "ssh2" and "plink1".
+
+2013-02-28 Dale Sedivec <dale@codefu.org>
+
+ * textmodes/sgml-mode.el (sgml-syntax-propertize-function):
+ Return valid syntax-table property value when converting
+ quotes within text from string syntax to punctuation syntax (bug#13844).
+
+2013-02-28 Juri Linkov <juri@jurta.org>
+
+ * dired-aux.el (dired-diff): If file at point is a backup file,
+ use its original as the default value, and reverse the order
+ of arguments to the `diff' call. Doc fix. (Bug#13772)
+
+2013-02-28 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-adb.el (tramp-adb-sdk-dir): Remove. Replaced by ...
+ (tramp-adb-program): New defcustom. Remove function. Adapt calls.
+
+2013-02-28 Agustín Martín Domingo <agustin.martin@hispalinux.es>
+
+ Initial support for hunspell dictionaries auto-detection (Bug#13639)
+
+ * textmodes/ispell.el (ispell-find-hunspell-dictionaries):
+ Ask hunspell about available and default dictionaries.
+ (ispell-parse-hunspell-affix-file): Extract relevant info from
+ hunspell affix file.
+ (ispell-hunspell-fill-dictionary-entry): Fill non-initialized
+ `ispell-dictionary-alist' entry for given dictionary after info
+ provided by `ispell-parse-hunspell-affix-file'.
+ (ispell-hunspell-dict-paths-alist): New defvar to contain an alist
+ of parsed hunspell dicts and associated affix files.
+ (ispell-hunspell-dictionary-alist): New defvar to contain an alist
+ of parsed hunspell dicts and associated parameters.
+ (ispell-set-spellchecker-params):
+ Call `ispell-find-hunspell-dictionaries' if hunspell and not
+ previously done.
+ (ispell-start-process):
+ Call `ispell-hunspell-fill-dictionary-entry' for current
+ dictionary if it is not initialized.
+
+2013-02-28 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * imenu.el: Comment nitpicks.
+
+2013-02-28 Sam Steingold <sds@gnu.org>
+
+ * vc/diff-mode.el (diff-hunk-file-names): Handle filenames with spaces.
+ See <http://stackoverflow.com/questions/14720205>.
+
+2013-02-28 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+
+ * net/net-utils.el (net-utils--revert-function): New fun (bug#13831).
+ (net-utils-mode): Use it.
+ (net-utils--revert-cmd): New var.
+ (net-utils-run-simple): Set it, and remove bogus interactive spec.
+ (traceroute): Use net-utils-run-simple.
+
+2013-02-28 Glenn Morris <rgm@gnu.org>
* textmodes/paragraphs.el (mark-paragraph): Doc fix.
-2013-02-21 Juri Linkov <juri@jurta.org>
+2013-02-28 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * doc-view.el: Preserve h&v scroll across C-c C-c C-c C-c.
+ (doc-view-fallback-mode): Remove overlays here.
+ (doc-view-toggle-display): Instead of here. Don't throw away
+ image-mode-winprops-alist.
+ (doc-view-goto-page): Don't mess with hscroll.
+
+2013-02-27 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+
+ * font-lock.el (lisp-font-lock-keywords-2): Fix highlighting of
+ &optional (bug#13819).
+
+2013-02-27 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-adb.el (tramp-adb-parse-device-names)
+ (tramp-adb-maybe-open-connection): Add timeouts. (Bug#13299)
+
+2013-02-26 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-sh.el (tramp-sh-handle-insert-directory):
+ Add "2>/dev/null" to the ls command, in case "en_US.utf8" is not
+ defined. POSIX environments fall back to the "C" locale then and
+ emit a warning, which shall be suppressed.
+
+2013-02-26 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/easy-mmode.el (define-globalized-minor-mode): Tweak logic.
+ (easy-mmode-set-keymap-parents): Use make-composed-keymap.
+
+2013-02-25 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/bytecomp.el (byte-compile-file): Use let.
+
+2013-02-25 Juri Linkov <juri@jurta.org>
+
+ * replace.el (read-regexp): Let-bind `default' to the first
+ element of `defaults' if it's a list, otherwise it should be
+ a string or nil. Let-bind `suggestions' to `defaults' if it's
+ a list, otherwise make a list with the string value. Doc fix.
+ (Bug#13805)
+
+2013-02-25 Eli Zaretskii <eliz@gnu.org>
+
+ * emacs-lisp/bytecomp.el (byte-recompile-directory): Reject files
+ that match "\`\.#", to avoid compiling lock files, even if they
+ are readable (as they are on MS-Windows).
+
+2013-02-25 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * files.el (basic-save-buffer): Remove redundant directory-creation.
+
+2013-02-24 Jay Belanger <jay.p.belanger@gmail.com>
+
+ * calc/calc-ext.el (math-to-radians-2, math-from-radians-2):
+ Add option to force `pi' to remain symbolic.
+ * calc/calcalg2.el (calcFunc-sin, calcFunc-cos, calcFunc-tan)
+ (calcFunc-cot, calcFunc-csc, calcFunc-sec, calcFunc-arcsin)
+ (calcFunc-arccos, calcFunc-arctan): Use symbolic `pi' in the
+ derivatives, when necessary.
+
+2013-02-23 Peter Kleiweg <p.c.j.kleiweg@rug.nl>
+
+ * progmodes/ps-mode.el (ps-mode-version): Bump to 1.1i.
+ (ps-mode-octal-region): Use string-make-unibyte.
+
+2013-02-23 Glenn Morris <rgm@gnu.org>
+
+ * emulation/viper-cmd.el (viper-submit-report):
+ * progmodes/ps-mode.el (ps-mode-maintainer-address):
+ * progmodes/vera-mode.el (vera-mode-help-address):
+ * textmodes/artist.el (artist-maintainer-address):
+ * textmodes/reftex.el (reftex-report-bug):
+ * vc/ediff-util.el (ediff-submit-report):
+ Add bug-gnu-emacs to bug report address.
+
+ * progmodes/simula.el (simula-mode-menu, simula-mode-map):
+ Remove bug report entries.
+ (simula-mode-help-address, simula-submit-bug-report): Make obsolete.
+
+ * emacs-lisp/bytecomp.el (byte-compile-level): New.
+ (byte-compile-file, byte-compile-from-buffer):
+ Use separate input/output buffers for each level of recursive
+ byte-compile-file calls. (Bug#13787)
+
+2013-02-23 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp.el (tramp-methods): Fix docstring.
+ (tramp-ssh-controlmaster-options): Rename it from
+ `tramp-ssh-controlmaster-template'. Return a string.
+ (tramp-default-method): Adapt check for
+ `tramp-ssh-controlmaster-options'.
+
+ * net/tramp-sh.el (tramp-methods):
+ Replace `tramp-ssh-controlmaster-template' by "%c".
+ (tramp-do-copy-or-rename-file-out-of-band)
+ (tramp-maybe-open-connection): Use it in format spec. Ensure,
+ that it is applied for the first hop only.
+
+2013-02-22 Juri Linkov <juri@jurta.org>
* isearch.el (isearch-lazy-highlight-new-loop):
Set `isearch-lazy-highlight-start' and `isearch-lazy-highlight-end'
@@ -65,34 +1618,133 @@
Let-bind `isearch-other-end' to `start', `isearch-forward' to t
and `isearch-error' to nil.
-2013-02-20 Fabián Ezequiel Gallina <fgallina@cuca>
+2013-03-16 Fabián Ezequiel Gallina <fgallina@cuca>
* progmodes/python.el (python-info-current-defun):
Enhance match-data cluttering prevention.
-2013-02-19 Glenn Morris <rgm@gnu.org>
+2013-02-22 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp.el (tramp-tramp-file-p): Fix docstring.
+
+ * net/tramp-sh.el (tramp-sh-handle-insert-directory):
+ Handle multibyte file names.
+
+2013-02-22 Glenn Morris <rgm@gnu.org>
+
+ * textmodes/sgml-mode.el (sgml-xml-mode): Move before use.
+ (sgml-transformation-function): Give it a :set function.
+ (sgml-tag): Doc fix.
+
+ * cmuscheme.el (scheme-buffer):
+ * progmodes/inf-lisp.el (inferior-lisp-buffer):
+ * progmodes/tcl.el (inferior-tcl-buffer):
+ * textmodes/tex-mode.el (tex-command): Doc fixes.
+
+ * image-mode.el (image-mode): Add mouse bindings for mode-line-process.
+
+ * htmlfontify.el (hfy-default-header): Encode title string. (Bug#7457)
+
+2013-02-21 Bastien Guerry <bzg@gnu.org>
+
+ * cmuscheme.el (scheme-buffer): Fix docstring. (Bug#13778)
+
+2013-02-21 Fabián Ezequiel Gallina <fgallina@cuca>
+
+ * progmodes/python.el (python-info-current-defun):
+ Enhance match-data cluttering prevention.
+
+2013-02-21 Glenn Morris <rgm@gnu.org>
* net/tramp.el (tramp-get-debug-buffer): Ensure outline.el is not
loaded while outline-regexp is let bound. (Bug#9584)
-2013-02-19 Fabián Ezequiel Gallina <fgallina@cuca>
+2013-02-21 Fabián Ezequiel Gallina <fgallina@cuca>
* progmodes/python.el (python-info-current-defun): Fix failed
defun name retrieval because of unwanted match-data cluttering.
+2013-02-21 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp.el (tramp-ssh-controlmaster-template): Make it a
+ defconst. Apply independent check for ControlPersist.
+
+ * net/tramp-sh.el (tramp-sh-handle-set-file-times): Set $UTC only
+ temporarily, via "env".
+
+2013-02-21 Glenn Morris <rgm@gnu.org>
+
+ * info.el (Info-enable-edit): Remove.
+ (Info-edit): Disable it rather than using Info-enable.
+ (Info-edit-mode-hook, Info-edit-map, Info-edit-mode, Info-edit)
+ (Info-cease-edit): Make editing of Info files obsolete.
+
+ * informat.el (Info-tagify):
+ Handle buffers not visiting files. (Bug#13763)
+
+2013-02-21 Juanma Barranquero <lekktu@gmail.com>
+
+ * calc/calc-graph.el (calc-graph-show-dumb): Fix typo.
+
+2013-02-21 Glenn Morris <rgm@gnu.org>
+
+ * files.el (basic-save-buffer): Move check for existing parent
+ directory after hooks. (Bug#13773)
+
+2013-02-20 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * simple.el (command-execute): Move from C. Add obsolete check.
+ (extended-command-history): Move from C.
+
+2013-02-20 Ulrich Müller <ulm@gentoo.org>
+
+ * jka-cmpr-hook.el (jka-compr-compression-info-list)
+ (jka-compr-mode-alist-additions): Handle .txz suffix for
+ XZ-compressed tar archives (bug#13770).
+
+2013-02-20 Bastien Guerry <bzg@gnu.org>
+
+ * outline.el (outline-regexp, outline-heading-end-regexp):
+ Make variables, not options (bug#13731).
+
+2013-02-20 Glenn Morris <rgm@gnu.org>
+
+ * image.el (image-current-frame): Change from variable to function.
+ (image-show-frame): Rename from image-nth-frame. Update callers.
+ * image-mode.el (image-multi-frame): New variable.
+ (image-mode-map, image-mode, image-goto-frame):
+ Use image-multi-frame rather than image-current-frame.
+ (image-mode, image-goto-frame): Use image-current-frame as
+ function rather than as variable.
+
+ * emacs-lisp/cl-lib.el (cl-floatp-safe): Make it an alias for floatp.
+ * emacs-lisp/cl-macs.el (cl--make-type-test)
+ (cl--compiler-macro-assoc): Use floatp rather than cl-floatp-safe.
+
+2013-02-19 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-cache.el (tramp-get-hash-table): New defun.
+ (tramp-get-file-property, tramp-set-file-property)
+ (tramp-get-connection-property, tramp-set-connection-property): Use it.
+ (tramp-flush-file-property, tramp-flush-directory-property):
+ Rename argument to KEY.
+ (tramp-flush-connection-property): Simplify a little bit.
+ (tramp-connection-property-p): New defun.
+ (top): Reapply saved values only if there isn't a corresponding
+ entry in `tramp-connection-properties'.
+
2013-02-19 Fabián Ezequiel Gallina <fgallina@cuca>
* progmodes/python.el (python-indent-context):
Fix python-info-line-ends-backslash-p call.
(python-info-line-ends-backslash-p)
- (python-info-beginning-of-backslash): Respect line-number
- argument.
- (python-info-current-line-comment-p): Fix behavior when not at
- beginning-of-line.
+ (python-info-beginning-of-backslash): Respect line-number argument.
+ (python-info-current-line-comment-p):
+ Fix behavior when not at beginning-of-line.
(python-util-position): Remove function.
(python-util-goto-line): New function.
-2013-02-18 Michael Albinus <michael.albinus@gmx.de>
+2013-02-19 Michael Albinus <michael.albinus@gmx.de>
* eshell/em-unix.el (eshell/su): Require tramp.
(eshell/sudo): Require tramp. Remove now unnecessary check.
@@ -101,61 +1753,526 @@
`tramp-current-connection' in order to avoid an error when several
commands are invoked in a short time in eshell and friends.
-2013-02-16 Didier Verna <didier@didierverna.net>
+2013-02-19 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ Cleanup some of EIEIO's namespace.
+ * emacs-lisp/eieio.el (eieio--define-field-accessors): New macro.
+ Use it to define all the class-* and object-* field accessors (renamed
+ to eieio--class-* and eieio--object-*). Update all uses.
+ (eieio--class-num-slots, eieio--object-num-slots): Rename from
+ class-num-slots and object-num-slots.
+ (eieio--check-type): New macro.
+ (eieio-defclass, eieio-oref, eieio-oref-default, same-class-p)
+ (object-of-class-p, child-of-class-p, object-slots, class-slot-initarg)
+ (eieio-oset, eieio-oset-default, object-assoc, object-assoc-list)
+ (object-assoc-list-safe): Use it.
+ (eieio-defclass): Tighten regexp.
+ (eieio--defmethod): Use `memq'. Signal an error for unknown method kind.
+ Remove unreachable code.
+ (object-class-fast): Declare obsolete.
+ (eieio-class-name, eieio-object-name, eieio-object-set-name-string)
+ (eieio-object-class, eieio-object-class-name, eieio-class-parents)
+ (eieio-class-children, eieio-class-precedence-list, eieio-class-parent):
+ Rename from class-name, object-name, object-set-name-string,
+ object-class, object-class-name, class-parents, class-children,
+ class-precedence-list, class-parent; with obsolete alias.
+ (class-of, class-direct-superclasses, class-direct-subclasses):
+ Declare obsolete.
+ (eieio-defmethod): Use `memq'; remove unreachable code.
+ * emacs-lisp/eieio-base.el (eieio-persistent-read):
+ * emacs-lisp/eieio-opt.el (eieio-class-button, eieio-describe-generic)
+ (eieio-browse-tree, eieio-browse): Use eieio--check-type.
+
+2013-02-18 Aidan Gauland <aidalgol@no8wireless.co.nz>
+
+ * eshell/em-cmpl.el: Correct "context-related help" keybinding in
+ commentary.
+
+2013-02-18 Michael Heerdegen <michael_heerdegen@web.de>
+
+ * emacs-lisp/eldoc.el (eldoc-highlight-function-argument):
+ Use font-lock-keyword-face for macros and special forms (bug#8345).
+
+2013-02-17 Didier Verna <didier@didierverna.net>
* net/network-stream.el (network-stream-open-starttls):
Check that response to the starttls-command is non-nil. (Bug#13706)
-2013-02-14 Glenn Morris <rgm@gnu.org>
+2013-02-17 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * font-lock.el (lisp-font-lock-keywords-1, lisp-font-lock-keywords-2):
+ Don't assume all identifier chars have syntax word.
+ * emacs-lisp/lisp-mode.el (lisp-mode-variables):
+ Remove bar-not-symbol. Adjust callers.
+ (lisp-mode-variables): Don't set a font-lock-syntax-table.
+
+2013-02-17 Leo Liu <sdl.web@gmail.com>
+
+ * net/rcirc.el (rcirc-keepalive): Fix invalid timer error.
+
+2013-02-17 Glenn Morris <rgm@gnu.org>
+
+ * menu-bar.el (menu-bar-tools-menu): Fix case of EDE entry.
+
+ * image-mode.el (image-mode-map): Add image-dired menu entry.
+
+ * image-dired.el (tumme): Make this alias obsolete.
+
+2013-02-16 Glenn Morris <rgm@gnu.org>
+
+ * image.el (image-animated-types): Remove.
+ (image-multi-frame-p): Rename from image-animated-p, and generalize.
+ (image-animated-p): Make obsolete alias.
+ (image-animate, image-nth-frame, image-animate-timeout):
+ Use image-multi-frame-p.
+ (image-animate-timeout): If no delay, use image-default-frame-delay.
+ * image-mode.el (image-mode, image-toggle-animation):
+ Use image-multi-frame-p. (Bug#763, bug#10739)
+ (image-mode): Adjust startup message for a multi-frame image.
+
+ * image-mode.el (image-mode-map): Give it a menu.
+
+2013-02-16 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-cache.el (tramp-connection-properties): New customer
+ option.
+ (tramp-get-connection-property): Use it.
+
+ * net/tramp-compat.el (top): Require 'trampver.
+
+ * net/tramp-sh.el (tramp-remote-process-environment):
+ Set tramp-autoload cookie.
+
+2013-02-16 Kevin Ryde <user42@zip.com.au>
+
+ * info-look.el (info-lookup-select-mode): If major-mode has no
+ info-lookup-alist entry then search up derived-mode-parent (bug#8660).
+
+2013-02-16 Jambunathan K <kjambunathan@gmail.com>
+
+ * replace.el (read-regexp): Tighten the regexp that matches tag.
+ When tag is retrieved with `find-tag-default', use regexp that
+ matches tag at point. Also update docstring (Bug#13687).
+
+2013-02-16 Eli Zaretskii <eliz@gnu.org>
+
+ * autorevert.el (auto-revert-notify-add-watch): With 'w32notify',
+ add watch for the file, not its parent directory, since w32notify
+ sets up the watch for the directory internally. (Bug#13725)
+
+2013-02-16 Glenn Morris <rgm@gnu.org>
+
+ * image.el (image-default-frame-delay): New variable.
+ (image-animated-p): Use image-default-frame-delay.
+ (image-minimum-frame-delay): New constant.
+ (image-animate-timeout): Use image-minimum-frame-delay.
+
+ * image.el (image-nth-frame): New, split from image-animate-timeout.
+ (image-animate-timeout): Use image-nth-frame.
+ * image-mode.el (image-goto-frame, image-next-frame)
+ (image-previous-frame): New commands.
+ (image-mode-map): Add new frame commands.
+
+2013-02-16 Jonas Bernoulli <jonas@bernoul.li>
+
+ * emacs-lisp/tabulated-list.el (tabulated-list-print-col):
+ If col-desc already has help-echo, use it. (Bug#13563)
+
+2013-02-16 Glenn Morris <rgm@gnu.org>
+
+ * image.el (image-current-frame): New variable.
+ (image-animate-timeout): Set image-current-frame.
+ * image-mode.el (image-mode): For animated images,
+ display a frame counter via mode-line-process.
+
+ * font-lock.el (lisp-font-lock-keywords-1): Add defvar-local.
+
+2013-02-15 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * simple.el (eval-expression): Let `exp' set the mark (bug#13724).
+
+2013-02-15 Alan Mackenzie <acm@muc.de>
+
+ * emacs-lisp/easy-mmode.el (define-globalized-minor-mode): When a
+ global minor mode has been enabled, call the minor mode function
+ for a new buffer once only, after the major mode hook, whilst
+ allowing that hook explicitly to disable the minor mode.
+ (MODE-disable-in-buffer): New (generated) function.
+ (disable-MODE): New (generated) buffer local variable.
+
+2013-02-15 Jambunathan K <kjambunathan@gmail.com>
+
+ * iswitchb.el (iswitchb-read-buffer): Bind `C-.' and `C-,' to
+ `iswitchb-next-match' and `iswitchb-prev-match' resply.
+ * ido.el (ido-init-completion-maps): Bind `C-.' and `C-,' to
+ `ido-next-match' and `ido-prev-match' resply.
+ * icomplete.el (icomplete-minibuffer-map): Unbind `C-s' and `C-r'.
+ Bind `C-.' and `C-,' to `icomplete-forward-completions' and
+ `icomplete-backward-completions' (Bug#13708).
+
+2013-02-15 Glenn Morris <rgm@gnu.org>
* emacs-lisp/easy-mmode.el (define-minor-mode): Doc fix.
-2013-02-14 Stefan Monnier <monnier@iro.umontreal.ca>
+2013-02-15 Stefan Monnier <monnier@iro.umontreal.ca>
* net/goto-addr.el (goto-address-fontify): Add start and end args.
(goto-address-fontify-region): Use them instead of narrowing, so
syntax-ppss has access to the whole buffer.
-2013-02-14 Fabián Ezequiel Gallina <fgallina@cuca>
+2013-02-15 Fabián Ezequiel Gallina <fgallina@cuca>
* progmodes/python.el: Explain how to restore "cc-mode"-like
forward-sexp movement in header documentation (Bug#13642).
(python-nav--forward-sexp): Behave like emacs-lisp-mode in
comments and strings (GH bug 114).
-2013-02-13 Fabián Ezequiel Gallina <fgallina@cuca>
+2013-02-15 Fabián Ezequiel Gallina <fgallina@cuca>
* progmodes/python.el (python-info-current-defun): Fix current
defun detection (Bug#13618).
-2013-02-13 Chong Yidong <cyd@gnu.org>
+2013-02-15 Chong Yidong <cyd@gnu.org>
* xml.el (xml-parse-string): Fix typo in handling of bad character
references.
-2013-02-10 Michael Albinus <michael.albinus@gmx.de>
+2013-02-15 Glenn Morris <rgm@gnu.org>
+
+ * play/fortune.el (fortune-compile): Simplify and fix previous change.
+
+2013-02-14 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp.el (tramp-debug-message):
+ Add `tramp-condition-case-unless-debug'.
+ (tramp-debug-on-error): New defvar.
+ (tramp-condition-case-unless-debug): New defun.
+ (tramp-file-name-handler): Use it.
+
+2013-02-14 Juri Linkov <juri@jurta.org>
+
+ * info.el (Info-isearch-filter): Treat non-nil values of
+ `search-invisible' including its default value `open'
+ like the value `t' to match hidden text. (Bug#13402)
+
+2013-02-14 Glenn Morris <rgm@gnu.org>
+
+ * help-fns.el (find-lisp-object-file-name): Give special treatment
+ to all ~/.foo.elc files, not just ~/.emacs. (Bug#9007)
+
+2013-02-14 David Biesack <sasdjb@d72933.na.sas.com> (tiny change)
+
+ * net/quickurl.el (quickurl-save-urls):
+ Ensure quickurl-urls is not truncated on printing. (Bug#9276)
+
+2013-02-14 Dmitry Gutov <dgutov@yandex.ru>
+
+ * progmodes/ruby-mode.el (ruby-parse-partial): Don't increase
+ depth for unfinished percent literal. Not using it in the caller.
+ (ruby-move-to-block): Jump over multiline literals of all types,
+ ignoring code-looking contents inside them.
+ (ruby-add-log-current-method): Improve performance at the expense
+ of accuracy. `ruby-block-contains-point' is relatively slow, so
+ only use it for method and singleton class blocks.
+
+2013-02-13 Michael Albinus <michael.albinus@gmx.de>
+
+ Use ControlMaster where applicable. (Bug#13677)
+
+ * net/tramp.el (tramp-ssh-controlmaster-template): New defvar,
+ replacing `tramp-detect-ssh-controlmaster'.
+ (tramp-default-method): Use it.
+
+ * net/tramp-sh.el (tramp-methods) [scp, scp1, scp2, scpx, sftp]:
+ [rsync, ssh, ssh1, ssh2, sshx]: Add ControlPath and ControlMaster
+ arguments.
+ [scpc, rsyncc]: Remove methods.
+ (top): Remove completion functions for "scpc", "rsyncc", "ssh1_old"
+ and "ssh2_old".
+ (tramp-do-copy-or-rename-file-out-of-band): Change trace level.
+ (tramp-maybe-open-connection): Reuse tmpfile for ControlPath.
+
+2013-02-13 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/package.el (package--initialized): Move before first use.
+
+2013-02-13 Jambunathan K <kjambunathan@gmail.com>
+
+ * icomplete.el (icomplete-hide-common-prefix): New user option.
+ (icomplete-first-match): New face.
+ (icomplete-completions): Correct handling of "complete but not
+ unique" (Bug#12638).
+
+2013-02-13 YE Qianchuan <stool.ye@gmail.com> (tiny change)
+
+ * descr-text.el (describe-char): Display the script (bug#13698).
+
+2013-02-13 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * tmm.el: Use lexical-binding and current-active-maps.
+ (tmm-menubar): Use map-keymap and pcase.
+ (tmm--completion-table): New function.
+ (tmm-prompt): Use it to fix the menu order.
+ (tmm-get-keybind): Use current-active-maps.
+
+2013-02-12 Christopher Schmidt <christopher@ch.ristopher.com>
+
+ Add dired-hide-details-mode. (Bug#6799)
+
+ * locate.el (locate-mode): Set parent mode property to dired-mode.
+
+ * find-dired.el (find-dired): Call dired-insert-set-properties on
+ initial information line. Set process mark on end of buffer.
+ (find-dired-sentinel):
+ Call dired-insert-set-properties on summary.
+
+ * dired.el (dired-hide-details-hide-symlink-targets)
+ (dired-hide-details-hide-information-lines): New options.
+ (dired-insert-directory):
+ Set properties after final treatment of output.
+ (dired-insert-set-properties):
+ Set dired-hide-details-* properties.
+ (dired-mode-map): Bind dired-hide-details-mode.
+ (dired-mode): Set buffer-invisibility-spec to a list.
+ (dired-next-line): Skip hidden lines.
+ (dired-previous-line): Use dired-next-line.
+ (dired-hide-details-mode): New minor mode.
+ (dired-hide-details-update-invisibility-spec): New function.
+
+2013-02-13 Glenn Morris <rgm@gnu.org>
+
+ * play/yow.el: Move to obsolete/. (Bug#9384)
+
+2013-02-13 Juri Linkov <juri@jurta.org>
+
+ * vc/ediff-util.el (ediff-recenter): Use `select-frame-set-input-focus'
+ to select `ediff-control-frame' and set input focus correctly on Xfce.
+ (Bug#12218)
+
+2013-02-13 Juri Linkov <juri@jurta.org>
+
+ * image-mode.el (image-mode-map):
+ * doc-view.el (doc-view-mode-map):
+ * vc/ediff-util.el (ediff-setup-keymap):
+ Make S-SPC scroll in the opposite sense to SPC. (Bug#2145)
+
+2013-02-13 Dmitry Gutov <dgutov@yandex.ru>
+
+ * progmodes/ruby-mode.el (ruby-move-to-block): Improve
+ performance. Instead of recalculating indentation fully for each
+ line, sum up indentation depth based only on visited lines.
+ (ruby-parse-partial): Increase the depth after "do" even when END
+ is right after it.
+ (ruby-parse-partial): When END is in the middle of a percent
+ literal, increase the depth if the delimiter chars belong to the
+ paren syntax class.
+
+2013-02-13 Kirill A. Korinskiy <catap@catap.ru>
+
+ * play/fortune.el (fortune-compile): Also make the compiled file
+ if it does not exist at all, not just if it is old. (Bug#5338)
+
+2013-02-13 Glenn Morris <rgm@gnu.org>
+
+ * emacs-lisp/package.el (package-menu-execute): Doc fix.
+
+2013-02-13 Yves Baumes <ybaumes@gmail.com> (tiny change)
+
+ * lisp/emacs-lisp/package.el (package-menu-execute):
+ Add optional noquery argument. (Bug#13625)
+
+2013-02-13 Michael Albinus <michael.albinus@gmx.de>
* net/ange-ftp.el (ange-ftp-make-directory): Don't raise an error,
if DIR exists and PARENTS is non-nil.
-2013-02-09 Chong Yidong <cyd@gnu.org>
+2013-02-13 Juanma Barranquero <lekktu@gmail.com>
+
+ * progmodes/js.el (js--multi-line-declaration-indentation):
+ Silence byte-compiler warning.
+
+2013-02-12 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-adb.el (tramp-adb-handle-start-file-process): Rewrite.
+
+ * net/tramp-compat.el (top): Declare `remote-file-name-inhibit-cache'
+ only if it doesn't exist.
+
+ * net/tramp-sh.el (tramp-sh-handle-start-file-process):
+ Set process marker.
+
+2013-02-12 Tassilo Horn <tsdh@gnu.org>
+
+ * doc-view.el (doc-view-odf->pdf-converter-soffice): Use separate
+ UserInstallation when calling soffice to work around LibreOffice
+ bug 37531.
+
+2013-02-12 Glenn Morris <rgm@gnu.org>
+
+ * files.el (basic-save-buffer):
+ Offer to create a non-existing directory. (Bug#3016)
+
+ * calc/calc-graph.el (calc-graph-show-dumb):
+ * calendar/calendar.el (calendar-mode-map):
+ * cus-edit.el (custom-mode-map):
+ * ehelp.el (electric-help-map):
+ * emulation/vip.el (vip-mode-map):
+ * epa.el (epa-key-list-mode-map):
+ * info.el (Info-mode-map):
+ * mail/rmail.el (rmail-mode-map):
+ * mail/rmailsum.el (rmail-summary-mode-map):
+ * man.el (Man-mode-map):
+ * net/newst-plainview.el (newsticker-mode-map):
+ * progmodes/cpp.el (cpp-edit-mode-map):
+ * progmodes/grep.el (grep-mode-map):
+ * progmodes/idlw-help.el (idlwave-help-mode-map):
+ * simple.el (special-mode-map):
+ * startup.el (splash-screen-keymap):
+ * view.el (view-mode-map):
+ Make S-SPC scroll in the opposite sense to SPC. (Bug#2145)
+
+2013-02-11 Elias Pipping <pipping@lavabit.com>
+
+ * doc-view.el (doc-view-current-cache-dir): Beware % escapes
+ (bug#13679).
+
+2013-02-11 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * cus-start.el (all): Remove inhibit-local-menu-bar-menus.
+
+2013-02-11 Glenn Morris <rgm@gnu.org>
+
+ * vc/diff.el (diff-use-labels): New variable.
+ (diff-no-select): Use --label rather than -L, and first
+ check that it is supported. (Bug#11067)
+
+ * files.el (enable-dir-local-variables): New variable.
+ (hack-dir-local-variables): Respect enable-dir-local-variables.
+ * tutorial.el (help-with-tutorial):
+ Ignore directory-local variables. (Bug#11127)
+
+ * vc/vc-svn.el (vc-svn-command): Move --non-interactive from here...
+ (vc-svn-global-switches): ... to here. (Bug#13513)
+
+2013-02-10 Christopher Schmidt <christopher@ch.ristopher.com>
+
+ * minibuf-eldef.el (minibuffer-default--in-prompt-regexps):
+ Handle "foo (bar, default: xxx): " prompts.
+
+2013-02-10 Chong Yidong <cyd@gnu.org>
+
+ * files.el (basic-save-buffer-1): Do not set
+ buffer-file-coding-system-explicit (Bug#4533).
* mail/emacsbug.el (report-emacs-bug): Change binding of
report-emacs-bug-insert-to-mailer to C-c M-i (Bug#13510).
-2013-02-02 Alan Mackenzie <acm@muc.de>
+2013-02-09 Jay Belanger <jay.p.belanger@gmail.com>
+
+ * calc/calc.el (calc-allow-units-as-numbers): New variable.
+ * calc/calc-units.el (calc-convert-units): Use new variable.
+
+2013-02-09 Eli Zaretskii <eliz@gnu.org>
- Fix bug in the state cache mechanism. Remove 'BOD "strategy". Refactor.
+ * subr.el (buffer-file-type, default-buffer-file-type): Remove.
+
+ * net/ange-ftp.el (ange-ftp-insert-file-contents): Don't reference
+ buffer-file-type.
+
+ * mail/feedmail.el (feedmail-force-binary-write): Doc fix.
+ (feedmail-run-the-queue, feedmail-dump-message-to-queue)
+ (feedmail-send-it-immediately): Don't bind buffer-file-type, bind
+ coding-system-for-write instead.
+
+ * jka-compr.el (jka-compr-write-region): Don't bind
+ buffer-file-type.
+
+ * emacs-lisp/bytecomp.el (byte-compile-file): Don't bind
+ buffer-file-type.
+
+ * files.el (file-name-buffer-file-type-alist): Remove defvar.
+ (insert-file-contents-literally): Remove reference to
+ file-name-buffer-file-type-alist.
+
+ * dos-w32.el (file-name-buffer-file-type-alist): Deprecate and
+ make-obsolete.
+ (find-buffer-file-type-match, find-buffer-file-type): Remove.
+ (find-buffer-file-type-coding-system): Remove references to
+ find-buffer-file-type-match, find-buffer-file-type, and
+ buffer-file-type.
+ Don't put find-buffer-file-type-coding-system into
+ file-coding-system-alist.
+ (find-file-binary, find-file-text): Bind coding-system-for-read
+ instead of file-name-buffer-file-type-alist.
+
+2013-02-09 Jambunathan K <kjambunathan@gmail.com>
+
+ * doc-view.el: Use (and prefer) soffice as default ODF->PDF
+ converter (Bug#13622).
+ (doc-view-unoconv-program): Make obsolete alias.
+ (doc-view-odf->pdf-converter-program): New variable.
+ (doc-view-odf->pdf-converter-function): New variable.
+ (doc-view-mode-p): Use it.
+ (doc-view-odf->pdf-converter-unoconv):
+ Rename from `doc-view-odf->pdf-converter-unoconv'.
+ (doc-view-odf->pdf-converter-soffice): New function.
+ (doc-view-convert-current-doc):
+ Use `doc-view-odf->pdf-converter-function'.
+
+2013-02-09 Chong Yidong <cyd@gnu.org>
+
+ * minibuffer.el (minibuffer-inactive-mode-map): Bind mouse-1 to
+ view-echo-area-messages (Bug#13340).
+
+ * help.el (view-echo-area-messages): Use display-buffer.
+
+ * dired-x.el (dired-do-run-mail): Prompt for confirmation
+ (Bug#13561).
+
+2013-02-08 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/byte-run.el (eval-when-compile, eval-and-compile):
+ Eval body right away, now that we do eager macroexpansion (bug#13605).
+
+ * simple.el (end-of-buffer): Don't touch unrelated windows (bug#13466).
+ (fundamental-mode): Use run-mode-hooks.
+
+ * eshell/esh-proc.el (eshell/kill): Fix last change.
+ * eshell/em-ls.el (eshell-ls-dir): Fix use of CL in last change.
+
+2013-02-08 Aidan Gauland <aidalgol@no8wireless.co.nz>
+
+ * eshell/esh-proc.el (eshell/kill): Rewrite.
+
+ * eshell/em-ls.el (show-almost-all): Declare.
+ (eshell-do-ls): Add support for -A argument.
+
+2013-02-08 Jambunathan K <kjambunathan@gmail.com>
+
+ * icomplete.el (icomplete-forward-completions)
+ (icomplete-backward-completions): Handle corner case (bug#13602).
+
+2013-02-07 Michael Albinus <michael.albinus@gmx.de>
+
+ * vc/vc-hooks.el (vc-find-file-hook): `buffer-file-truename' can
+ be nil. Handle this. (Bug#13636)
+
+2013-02-07 Richard Stallman <rms@gnu.org>
+
+ * mail/rmail.el (rmail-variables): Specify `no-conversion' for
+ `save-buffer-coding-system'.
+
+2013-02-07 Alan Mackenzie <acm@muc.de>
+
+ Fix bug in state cache mechanism. Remove 'BOD "strategy". Refactor.
* progmodes/cc-engine.el (c-get-fallback-scan-pos): Remove.
(c-parse-state-get-strategy): Don't return 'BOD any more.
- (c-append-lower-brace-pair-to-state-cache): Extra parameter HERE
- instead of narrowing. Widen to top of buffer before searching
- backwards for a brace pair.
- (c-state-push-any-brace-pair): Add HERE parameter to function
- call.
- (c-append-to-state-cache): Extra parameter HERE in place of
- narrowing. Narrow to parameter HERE, in place of being called
- narrowed.
+ (c-append-lower-brace-pair-to-state-cache):
+ Extra parameter HERE instead of narrowing.
+ Widen to top of buffer before searching backwards for a brace pair.
+ (c-state-push-any-brace-pair): Add HERE parameter to function call.
+ (c-append-to-state-cache): Extra parameter HERE in place of narrowing.
+ Narrow to parameter HERE, in place of being called narrowed.
(c-remove-stale-state-cache): Extra parameter HERE in place of
narrowing. Check there's an open brace in the cache before
searching for its match.
@@ -164,13 +2281,103 @@
instead passing extra parameter HERE to several functions.
Remove 'BOD strategy.
-2013-02-01 Stefan Monnier <monnier@iro.umontreal.ca>
+2013-02-06 Nicolas Richard <theonewiththeevillook@yahoo.fr> (tiny change)
+
+ * emacs-lisp/package.el (describe-package-1): Tell what archive is
+ used to install the package.
+
+2013-02-06 Glenn Morris <rgm@gnu.org>
+
+ * vc/vc-hooks.el (vc-find-file-hook): Don't ask about following links
+ if we can't get user input. (Bug#6567)
+
+ * startup.el (command-line): If simple.el is missing,
+ test and warn about for some possible causes.
+
+2013-02-05 Jan Djärv <jan.h.d@swipnet.se>
+
+ * cus-start.el (all): Add ns-use-native-fullscreen.
+
+2013-02-05 Glenn Morris <rgm@gnu.org>
+
+ * profiler.el (profiler-report-mode-map): Add a restart menu entry.
+
+ * play/gamegrid.el (gamegrid-add-score-with-update-game-score):
+ Fix directory creation in fallback case.
+
+2013-02-04 Thierry Volpiatto <thierry.volpiatto@gmail.com>
+
+ * vc/vc.el (vc-next-action): Fix inf-loop (bug#13610).
+ (vc-update-change-log): Use dolist.
+
+2013-02-04 Chong Yidong <cyd@gnu.org>
+
+ * thingatpt.el: Rewrite the URL detection routines, absorbing some
+ code from ffap.el.
+ (thing-at-point-beginning-of-url-regexp): New var.
+ (thing-at-point-uri-schemes): Update list of URI schemes.
+ (thing-at-point-url-regexp): Variable deleted.
+ (thing-at-point-markedup-url-regexp): Disallow newlines.
+ (thing-at-point-newsgroup-regexp)
+ (thing-at-point-newsgroup-heads)
+ (thing-at-point-default-mail-uri-scheme): New variables.
+ (thing-at-point-bounds-of-url-at-point): Rewrite. Use ffap's
+ method to find the possible bounds of the URI at point.
+ New optional argument to find ill-formed URIs.
+ (thing-at-point-url-at-point): Rewrite. New arguments for finding
+ ill-formed URIs. Use thing-at-point-bounds-of-url-at-point, and
+ the scheme-adding heuristics from ffap-url-at-point.
+ (thing-at-point--bounds-of-well-formed-url): New function.
+ Do parens matching to decide whether to include parens in the URI
+ (Bug#9153).
+
+ * ffap.el: Require thingatpt.
+ (ffap-url-at-point): Delegate URI detection to thing-at-point.
+ All URI-valid characters are now recognized (Bug#5673).
+ (ffap-string-at-point): Use use-region-p.
+ (ffap-url-regexp): Extra character is handled by thing-at-point.
+ (ffap-string-at-point-mode-alist): Allow parentheses.
+ (ffap-newsgroup-regexp, ffap-newsgroup-heads, ffap-newsgroup-p):
+ Convert to aliases; code moved to thingatpt.el.
+ (ffap-gnus-hook): Use setq-local.
+
+2013-02-04 Glenn Morris <rgm@gnu.org>
+
+ * emacs-lisp/ert.el (ert--explain-format-atom):
+ Don't try to print non-characters as characters. (Bug#13543)
+
+2013-02-03 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp.el (tramp-debug-message): Extend function exclude list.
+ (tramp-backtrace): New defun.
+ (tramp-handle-insert-file-contents): Use `visit' when inserting
+ the local copy.
+
+ * net/tramp-sh.el (tramp-sh-handle-set-visited-file-modtime):
+ Use `remote-file-name-inhibit-cache'.
+
+2013-02-03 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * progmodes/cperl-mode.el (cperl-mode): Avoid byte-compile warning
+ (bug#13614).
+
+ * subr.el (internal--called-interactively-p--get-frame): Avoid filling
+ current-load-list (bug#13366).
+
+2013-02-02 Christopher Schmidt <christopher@ch.ristopher.com>
+
+ * progmodes/compile.el (compilation-error-regexp-alist-alist):
+ Identify g++ template instantiation trace. (Bug#12287)
+ (compilation-mode-hook, compilation-start-hook)
+ (compilation-window-height): Simplify docstrings. (Bug#13379)
+
+2013-02-02 Stefan Monnier <monnier@iro.umontreal.ca>
* mouse.el (mouse-drag-track): Always deactivate the mark before
running the final event's command since that command is in charge of
activating the mark if needed (bug#13523).
-2013-02-01 Juri Linkov <juri@jurta.org>
+2013-02-02 Juri Linkov <juri@jurta.org>
* replace.el (perform-replace): Move let-bindings of isearch-*
variables deeper to the loop that searches for the next match.
@@ -182,21 +2389,117 @@
first element of isearch-cmds as a precaution when it's used
with inactive isearch.
-2013-02-01 Andrew W. Nosenko <andrew.w.nosenko@gmail.com> (tiny change)
+2013-02-02 Andrew W. Nosenko <andrew.w.nosenko@gmail.com> (tiny change)
* net/tramp.el (tramp-check-for-regexp): Avoid "Args out of range"
error when buffer in question is narrowed so position 1 is out of
visible part.
-2013-01-31 Glenn Morris <rgm@gnu.org>
+2013-02-02 Glenn Morris <rgm@gnu.org>
* textmodes/remember.el (remember-clipboard): Doc fix.
-2013-01-30 Stefan Monnier <monnier@iro.umontreal.ca>
+2013-02-02 Stefan Monnier <monnier@iro.umontreal.ca>
* progmodes/make-mode.el (makefile-fill-paragraph): Reset syntax-table
properties (bug#13179).
+2013-02-02 Juri Linkov <juri@jurta.org>
+
+ * progmodes/grep.el (grep-regexp-alist): Use variable grep-match-face
+ instead of hard-coded default face `match'. (Bug#9438)
+
+2012-02-01 Christopher Schmidt <christopher@ch.ristopher.com>
+
+ * vc/vc-arch.el (vc-arch-registered):
+ * vc/vc-bzr.el (vc-bzr-registered):
+ * vc/vc-cvs.el (vc-cvs-registered):
+ * vc/vc-git.el (vc-git-registered):
+ * vc/vc-hg.el (vc-hg-registered):
+ * vc/vc-mtn.el (vc-mtn-registered):
+ * vc/vc-svn.el (vc-svn-registered): Suppress load messages.
+ (Bug#13139)
+
+ * info.el (Info-next-reference, Info-prev-reference): Add numeric
+ prefix argument. (Bug#11656)
+
+2013-02-01 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * help-fns.el (help-split-fundoc): Don't insert byte-compiled body.
+
+2013-02-01 Glenn Morris <rgm@gnu.org>
+
+ * vc/vc-hooks.el (vc-menu-map): Disable vc-rollback menu item
+ if the backend is known not to support it.
+
+ * imenu.el (imenu-default-create-index-function):
+ Tweak infinite loop test to check for forward motion as well as none.
+
+2013-02-01 Alex Harsanyi <AlexHarsanyi@gmail.com>
+
+ * net/soap-client.el (soap-invoke): Encode the string for
+ `url-request-data' as UTF-8.
+ Fixes <http://code.google.com/p/emacs-soap-client/issues/detail?id=16>.
+
+2013-02-01 Glenn Morris <rgm@gnu.org>
+
+ * calc/calc-help.el (calc-view-news): Use view-emacs-news.
+
+ * calc/README, calc/README.prev: Rename/merge to etc/CALC-NEWS.
+
+2013-01-31 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp.el (tramp-tramp-file-p): Comment check for
+ `string-as-unibyte'. The function does not exist on XEmacs, and
+ likely we need another approach.
+
+ * net/tramp-sh.el (tramp-compute-multi-hops): Check, whether
+ `tramp-gw-*' variables are bound.
+
+2013-01-31 Glenn Morris <rgm@gnu.org>
+
+ * files.el (basic-save-buffer-2): Choose coding system for
+ writing the file before backing it up, to reduce delay between
+ backing up and writing the new version. (Bug#13522)
+
+2013-01-31 Michal Nazarewicz <mina86@mina86.com>
+
+ * simple.el (cycle-spacing): New command.
+ (just-one-space): Use it.
+
+2013-01-31 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * progmodes/opascal.el: Rename from delphi.el. Use lexical-binding.
+ (opascal-newline-always-indents): Remove custom.
+ (opascal-tab, opascal-newline): Remove commands.
+ (opascal-new-comment-line): Insert "\n" instead of calling newline.
+ (opascal-mode-map): Keep default bindings for RET and TAB and DEL.
+ (opascal-save-match-data): Remove, use save-match-data instead.
+ (opascal-save-state): Use with-silent-modifications.
+
+ * progmodes/pascal.el (pascal-mode-syntax-table): Accept //..\n comments
+ (bug#13585).
+
+2013-01-30 Juri Linkov <juri@jurta.org>
+
+ * frame.el (toggle-frame-maximized, toggle-frame-fullscreen):
+ Use fullboth as an alias for fullscreen. Suggested by Jan Djärv in
+ <http://lists.gnu.org/archive/html/emacs-devel/2013-01/msg00203.html>.
+
+2013-01-30 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * progmodes/make-mode.el (makefile-backslash-region): Don't compute
+ column if we're just deleting the backslashes.
+ (makefile-fill-paragraph): Use eolp.
+
+2013-01-30 Michael Albinus <michael.albinus@gmx.de>
+
+ * autorevert.el (auto-revert-use-notify): Fix docstring.
+
+2013-01-30 Leo Liu <sdl.web@gmail.com>
+
+ * imenu.el (imenu--truncate-items): Fix subalist checking (bug#13576).
+
2013-01-30 Glenn Morris <rgm@gnu.org>
* mouse.el (mouse-drag-line): Avoid pushing same event onto
@@ -209,31 +2512,147 @@
(python-pdbtrack-comint-output-filter-function): Enhancements on
stacktrace detection. (thanks @gnovak)
+2013-01-30 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * jit-lock.el (jit-lock-stealth-chunk-start): Don't widen (bug#13542).
+ (jit-lock-mode, jit-lock-functions, jit-lock-context-unfontify-pos):
+ Use defvar-local.
+ (jit-lock-register): Use setq-local.
+
+2013-01-30 Jay Belanger <jay.p.belanger@gmail.com>
+
+ * calc-units.el (math-default-units-table): Remove initial value.
+ (calc-convert-units): Treat expressions where all the units cancel as
+ if they didn't have units.
+
+2013-01-30 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp.el (tramp-process-connection-type): Fix docstring.
+ (tramp-completion-reread-directory-timeout): Fix type.
+ (tramp-connection-min-time-diff): New defcustom.
+
+ * net/tramp-sh.el (tramp-maybe-open-connection): Use it.
+
2013-01-30 Glenn Morris <rgm@gnu.org>
* imenu.el (imenu-default-create-index-function):
Put back a version of the infinite loop test removed 2013-01-23.
-2013-01-28 Fabián Ezequiel Gallina <fgallina@cuca>
+2013-01-30 Fabián Ezequiel Gallina <fgallina@cuca>
* progmodes/python.el (python-shell-parse-command):
Find python-shell-interpreter with modified environment.
-2013-01-26 Stefan Monnier <monnier@iro.umontreal.ca>
+2013-01-30 Stefan Monnier <monnier@iro.umontreal.ca>
* emacs-lisp/cl.el (cl-set-getf): Add compatibility alias.
-2013-01-24 Fabián Ezequiel Gallina <fgallina@cuca>
+2013-01-29 Alan Mackenzie <acm@muc.de>
+
+ Amend to fontify /regexp/s in actions correctly.
+ * cc-awk.el (c-awk-harmless-char-re, c-awk-harmless-string*-re):
+ (c-awk-harmless-string*-here-re): Braces, parens and semicolons
+ are no longer included.
+ (c-awk-harmless-line-char-re, c-awk-harmless-line-string*-re):
+ What used to be these variables without "-line" in the name.
+ (c-awk-neutral-re): { is no longer neutral. Escaped newlines now are.
+ (c-awk-non-arith-op-bra-re): Now also matches {.
+ (c-awk-pre-exp-alphanum-kwd-re): New regexp to match "print",
+ "return", and "case".
+ (c-awk-kwd-regexp-sign-re): New, to match "print", etc., followed
+ by /.
+ (c-awk-syntax-tablify-/): Check special cases "print /re/", etc.
+ (c-awk-set-syntax-table-properties): Extend FSM to handle {,},(,),;.
+
+2013-01-29 Michael Albinus <michael.albinus@gmx.de>
+
+ * autorevert.el (auto-revert-use-notify):
+ Use `custom-initialize-default' for initialization. (Bug#13583)
+
+ * net/ange-ftp.el (ange-ftp-skip-msgs): Add another message.
+
+ * net/tramp-sh.el (tramp-sh-handle-start-file-process):
+ Catch `suppress'. Otherwise, `tramp-run-real-handler' might be called
+ in `tramp-file-name-handler'.
+ (tramp-gw-tunnel-method, tramp-gw-socks-method): Declare for
+ compatibility.
+ (tramp-compute-multi-hops): Check, whether
+ `tramp-gw-tunnel-method' and `tramp-gw-socks-method' are non-nil.
+
+2013-01-28 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * hi-lock.el (hi-lock-unface-buffer): Don't assume `face' is a symbol
+ (bug#13297).
+
+2013-01-27 Dmitry Gutov <dgutov@yandex.ru>
+
+ * progmodes/ruby-mode.el (ruby-font-lock-keywords): Remove some
+ checks made superfluous by the \_< operator.
+ * progmodes/ruby-mode.el (ruby-move-to-block): Work with (maybe
+ temporarily) broken indentation.
+ * progmodes/ruby-mode.el (ruby-font-lock-keywords):
+ Highlight nested constants, too. \_< broke that.
+
+2013-01-27 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * progmodes/ruby-mode.el (ruby-font-lock-keywords): Use "\\_<"
+ instead of "\\b".
+
+2013-01-27 Michael Albinus <michael.albinus@gmx.de>
+
+ * autorevert.el (auto-revert-handler): Notifications which result
+ from a saved file shall not be taken into account. (Bug#13557)
+
+2013-01-26 Andreas Schwab <schwab@linux-m68k.org>
+
+ * emacs-lisp/lisp-mode.el (lisp-mode-variables): Add optional
+ parameter BAR-NOT-SYMBOL to control syntax of | for font-lock.
+ (lisp-mode): Pass t for it. (Bug#13556)
+
+2013-01-25 Alan Mackenzie <acm@muc.de>
+
+ AWK Mode: Fix indentation bug at top level. Bug #12274.
+
+ * progmodes/cc-engine.el (c-guess-basic-syntax): Move CASE 5P to
+ just before CASE 5D.
+
+2013-01-25 Dmitry Antipov <dmantipov@yandex.ru>
+
+ * net/socks.el (socks-nslookup-host): Use string-to-number.
+
+2013-01-25 Michael Albinus <michael.albinus@gmx.de>
+
+ * autorevert.el (auto-revert-remote-files)
+ (auto-revert-notify-exclude-dir-regexp): New defcustoms.
+ (auto-revert-notify-enabled, auto-revert-use-notify)
+ (auto-revert-notify-watch-descriptor-hash-list)
+ (auto-revert-notify-modified-p, auto-revert-notify-event-p)
+ (auto-revert-notify-event-descriptor)
+ (auto-revert-notify-event-action)
+ (auto-revert-notify-event-file-name): Doc fix.
+ (global-auto-revert-mode): Reorder checks.
+ (auto-revert-notify-rm-watch): Respect changed values of
+ `auto-revert-notify-watch-descriptor-hash-list'.
+ (auto-revert-notify-add-watch): Check for
+ `auto-revert-notify-exclude-dir-regexp'. Adapt filters for
+ `inotify-add-watch'. Watch `default-directory' instead of
+ `buffer-file-name'. `auto-revert-notify-watch-descriptor-hash-list'
+ has a changed meaning now. (Bug#13540)
+ (auto-revert-notify-handler): Change implementation wrt events
+ returning from a directory.
+ (auto-revert-handler): Reorder implementation for checks of remote
+ files.
+ (auto-revert-buffers): Fix parentheses error.
+
+2013-01-25 Fabián Ezequiel Gallina <fgallina@cuca>
* progmodes/python.el: Enhancements to header documentation about
skeletons. (Bug#5716)
-2013-01-23 Fabián Ezequiel Gallina <fgallina@cuca>
-
* imenu.el (imenu-default-create-index-function): Remove useless
infinite loop check. (Bug#13438)
-2013-01-23 Alan Mackenzie <acm@muc.de>
+2013-01-25 Alan Mackenzie <acm@muc.de>
Fix a bug in the state cache mechanism. Refactor this a bit.
@@ -250,45 +2669,412 @@
(c-parse-state-1): Change the calling conventions to the two
defuns involving `cache-pos'.
-2013-01-23 Chong Yidong <cyd@gnu.org>
+2013-01-25 Chong Yidong <cyd@gnu.org>
* xml.el (xml-entity-or-char-ref-re): Fix regexp.
-2013-01-18 Leo Liu <sdl.web@gmail.com>
+2013-01-24 Aaron Ecay <aaronecay@gmail.com> (tiny change)
+
+ * paren.el (show-paren-function): Make sure to set 'priority and
+ 'face only if the overlay does exist.
+
+2013-01-24 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp.el (tramp-tramp-file-p): Check, whether NAME is unibyte.
+
+ * net/tramp-sh.el (tramp-sh-handle-set-file-acl): Do not suppress
+ basic attributes.
+ (tramp-sh-handle-set-file-acl): Improve error checking.
+
+2013-01-24 Dmitry Antipov <dmantipov@yandex.ru>
+
+ * doc-view.el (doc-view-display): Force mode line update until all
+ document is converted. Suggested by Stefan Monnier (Bug#13164).
+
+2013-01-23 Bastien Guerry <bzg@gnu.org>
+
+ * paren.el (show-paren-function): Make sure an overlay exists
+ before trying to delete it. Also use `pos' as a position only
+ when it is an integer.
+
+2013-01-23 Dmitry Antipov <dmantipov@yandex.ru>
+
+ * play/gametree.el (gametree-break-line-here): Use point-marker.
+
+2013-01-22 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-cmds.el (tramp-bug, tramp-append-tramp-buffers):
+ Mark descriptive parts with `display' property.
+
+2013-01-21 Agustín Martín Domingo <agustin.martin@hispalinux.es>
+
+ * textmodes/ispell.el (ispell-hunspell-dictionary-equivs-alist):
+ New variable to map standard dict names to hunspell ones.
+ (ispell-set-spellchecker-params): Make sure specific dict names
+ are used for standard dicts with hunspell.
+
+2013-01-21 Tassilo Horn <tsdh@gnu.org>
+
+ * textmodes/reftex-cite.el (reftex-format-citation): Add format
+ chars for note (%N) and url (%U).
+ * textmodes/reftex-vars.el (reftex-cite-format): Document them.
+
+2013-01-21 Juri Linkov <juri@jurta.org>
+
+ * frame.el: Bind `f10' in `esc-map' to `toggle-frame-maximized'
+ in addition to existing separate binding `meta f10' in `global-map'.
+ (Bug#13484)
+
+2013-01-21 Michael Albinus <michael.albinus@gmx.de>
+
+ Improve XEmacs compatibility.
+
+ * net/tramp.el (tramp-replace-environment-variables): Make it a defun.
+
+ * net/tramp-adb.el (top): Require `time-date'.
+ (tramp-adb-ls-output-time-less-p): Use `tramp-time-less-p'.
+ (tramp-adb-handle-copy-file, tramp-adb-handle-rename-file):
+ Use `tramp-file-name-handler'.
+ (tramp-adb-maybe-open-connection):
+ Use `tramp-compat-set-process-query-on-exit-flag'.
+
+ * net/tramp-sh.el (tramp-sh-handle-file-acl):
+ Use `tramp-compat-funcall'.
+
+ * net/tramp-smb.el (tramp-smb-handle-file-acl): Use `looking-at' and
+ `tramp-compat-funcall'.
+
+2013-01-21 Jürgen Hötzel <juergen@archlinux.org>
+
+ * net/tramp-adb.el (tramp-adb-handle-start-file-process): Complete
+ reimplementation using "adb shell command ..." instead of running
+ remote shell interactively.
+
+2013-01-20 Glenn Morris <rgm@gnu.org>
+
+ * emacs-lisp/lisp-mode.el (emacs-lisp-mode-map):
+ Add native profiler menu entries.
+
+ * profiler.el (profiler-running-p): New function.
+ (profiler-cpu-profile): Use profiler-running-p.
+ (profiler-report-mode-map): Add some more menu entries.
+
+2013-01-19 Glenn Morris <rgm@gnu.org>
+
+ * mail/unrmail.el (unrmail): Do not mangle the mbox From line;
+ fixes 2012-12-07 change. (Bug#13499)
+
+2013-01-19 Leo Liu <sdl.web@gmail.com>
* dired.el (dired-get-marked-files): Prune erroneous values due to
last change. (Bug#13152)
-2013-01-17 Glenn Morris <rgm@gnu.org>
+2013-01-19 Glenn Morris <rgm@gnu.org>
* progmodes/etags.el (tags-table-check-computed-list):
Preserve point in tags buffer. (Bug#13412)
-2013-01-16 Glenn Morris <rgm@gnu.org>
-
* emacs-lisp/lisp-mode.el (lisp-indent-function): Doc fix.
- * mail/rmailmm.el (rmail-insert-mime-forwarded-message):
- Revert 2012-12-29 change. Ref:
- <http://lists.gnu.org/archive/html/emacs-devel/2013-01/msg00360.html>
+2013-01-19 Christian Wittern <cwittern@gmail.com> (tiny change)
+ Chong Yidong <cyd@gnu.org>
+
+ * image-mode.el (image-next-file, image-previous-file):
+ New commands (Bug#8453).
+ (image-mode-map): Bind them to n and p.
+ (image-mode--images-in-directory): New helper function.
+
+2013-01-19 Chong Yidong <cyd@gnu.org>
+
+ * image-mode.el (image-mode-fit-frame): Add a frame argument.
+ Suggested by Drew Adams (Bug#7730). Handle window decorations;
+ save and restore the old window configuration.
+
+2013-01-18 Leo Liu <sdl.web@gmail.com>
+
+ * progmodes/js.el: Tweak autoload cookie for alias.
-2013-01-10 Fabián Ezequiel Gallina <fgallina@cuca>
+2013-01-17 Michael Albinus <michael.albinus@gmx.de>
+
+ * autorevert.el (auto-revert-notify-watch-descriptor): Make it
+ buffer local, again. This was lost with the fix on 2013-01-12.
+
+2013-01-17 Jürgen Hötzel <juergen@archlinux.org>
+
+ * eshell/esh-util.el (eshell-path-env): Make it buffer local, in
+ order to support several eshell buffers in parallel.
+
+2013-01-17 Michael Albinus <michael.albinus@gmx.de>
+
+ * autorevert.el (auto-revert-use-notify): In the :set function, do
+ not modify `kill-buffer-hook'.
+ (auto-revert-notify-rm-watch):
+ Remove `auto-revert-notify-rm-watch' from `kill-buffer-hook'.
+ (auto-revert-notify-add-watch): Do not call
+ `auto-revert-notify-rm-watch', but add it to a buffer local
+ `kill-buffer-hook'.
+
+2013-01-16 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/trace.el (trace--read-args): Use a closure and an honest
+ call to `eval' rather than a backquoted lambda.
+
+2013-01-15 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/nadvice.el (advice--tweak): Make it possible for `tweak'
+ to return an explicit nil.
+ (advice--remove-function): Change accordingly.
+
+ * emacs-lisp/advice.el (ad-preactivate-advice): Adjust the cleanup to
+ the use of nadvice.el.
+
+ * progmodes/which-func.el (which-function): Silence imenu errors
+ (bug#13433).
+
+2013-01-15 Michael R. Mauger <mmaug@yahoo.com>
+
+ * progmodes/sql.el (sql-imenu-generic-expression):
+ (sql-mode-font-lock-object-name): Match schema qualified names.
+ (sql-connect): Use string keys.
+ (sql-product-interactive): Wait for interpreter prompt.
+ (sql-comint-oracle): Set process coding based on NLS_LANG.
+
+2013-01-15 Michael R. Mauger <mmaug@yahoo.com>
+
+ * progmodes/sql.el (sql-output-to-send): Remove, unused.
+ (sql-interactive-remove-continuation-prompt):
+ (sql-send-magic-terminator, sql-interactive-mode): Remove references.
+
+2013-01-14 Leo Liu <sdl.web@gmail.com>
+
+ * calendar/calendar.el (calendar-redraw): Sync window-point and point.
+ (Bug#13420)
+
+2013-01-14 Glenn Morris <rgm@gnu.org>
+
+ * progmodes/compile.el (compilation-error-regexp-alist-alist):
+ Fix interpretation of gnu line.col1-col2 format. (Bug#13335)
+
+2013-01-13 Fabián Ezequiel Gallina <fgallina@cuca>
* progmodes/python.el (python-nav-end-of-statement):
Fix cornercase when handling multiline strings.
+2013-01-13 Richard Stallman <rms@gnu.org>
+
+ * mail/sendmail.el (mail-position-on-field): Add doc string.
+
+ * mail/rmailmm.el (rmail-insert-mime-forwarded-message):
+ Get current message boundaries and pass them to
+ message-forward-make-body-mime. Minor style changes.
+
+2013-01-13 Eli Zaretskii <eliz@gnu.org>
+
+ * cus-start.el (all): Avoid warnings about
+ scroll-bar-adjust-thumb-portion on platforms where it is not defined.
+
+2013-01-11 Jan Djärv <jan.h.d@swipnet.se>
+
+ * cus-start.el (all): Add scroll-bar-adjust-thumb-portion.
+
+2013-01-13 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * jit-lock.el (jit-lock-debug-mode): New minor mode.
+ (jit-lock--debug-fontifying): New var.
+ (jit-lock--debug-fontify): New function.
+ * subr.el (condition-case-unless-debug): Don't prevent catching the
+ error, just let the debbugger run.
+ * emacs-lisp/timer.el (timer-event-handler): Don't prevent debugging
+ timer code and don't drop errors silently.
+
+2013-01-12 Michael Albinus <michael.albinus@gmx.de>
+
+ * autorevert.el (auto-revert-notify-watch-descriptor): Give it
+ `permanent-local' property.
+ (auto-revert-notify-handler): Use `file-equal-p'.
+
+2013-01-12 Eli Zaretskii <eliz@gnu.org>
+
+ * autorevert.el (auto-revert-notify-handler): Fix filtering of
+ file notification by ACTION. For filtering by file name, compare
+ only the non-directory part of the file name.
+
+2013-01-12 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * autorevert.el: Use cl-lib instead of cl.
+
+ * vc/vc-bzr.el (vc-bzr--sanitize-header): New function (bug#13307).
+ (vc-bzr-checkin): Use it.
+ * vc/log-edit.el (log-edit-extract-headers): Don't presume FUNCTION
+ will preserve match-data.
+
+2013-01-11 Felix H. Dahlke <fhd@ubercode.de>
+
+ * progmodes/js.el: Fix multiline declarations's indentation (bug#8576).
+ (js--declaration-keyword-re): New var.
+ (js--multi-line-declaration-indentation): New function.
+ (js--proper-indentation): Use it.
+
+2013-01-11 Aaron S. Hawley <Aaron.Hawley@vtinfo.com>
+
+ * calc/calc.el (calc-highlight-selections-with-faces)
+ (calc-dispatch):
+ * comint.el (comint-history-isearch-message):
+ * emacs-lisp/edebug.el (edebug-read, edebug-eval-defun):
+ * ffap.el (ffap-string-at-point-region, ffap-next)
+ (ffap-string-at-point, ffap-string-around)
+ (ffap-copy-string-as-kill, ffap-highlight-overlay)
+ (ffap-literally):
+ * font-lock.el (font-lock-keywords-alist)
+ (font-lock-removed-keywords-alist):
+ * help-mode.el (help-xref-symbol-regexp):
+ * info.el (Info-find-emacs-command-nodes):
+ * international/mule.el (add-to-coding-system-list):
+ * isearch.el (isearch-message-function, isearch-fail-pos):
+ * misearch.el (multi-isearch-next-buffer-function):
+ * newcomment.el (comment-box):
+ * printing.el (pr-txt-printer-alist, pr-ps-printer-alist)
+ (pr-setting-database):
+ * progmodes/cc-fonts.el (c-font-lock-keywords-3)
+ (c++-font-lock-keywords-3, objc-font-lock-keywords-3)
+ (java-font-lock-keywords-3, idl-font-lock-keywords-3)
+ (pike-font-lock-keywords-3):
+ * progmodes/compile.el (compile):
+ * progmodes/etags.el (tags-table-files)
+ (tags-table-files-function, tags-included-tables-function):
+ * progmodes/gdb-mi.el (gdb, gdb-setup-windows)
+ (gdb-restore-windows):
+ * ps-print.el (ps-even-or-odd-pages, ps-spool-buffer-with-faces)
+ (ps-n-up-filling-database):
+ * server.el (server-buffer, server-log):
+ * simple.el (newline, delete-backward-char, delete-forward-char)
+ (minibuffer-history-isearch-message, kill-line, track-eol)
+ (temporary-goal-column):
+ * textmodes/flyspell.el (flyspell-mark-duplications-flag)
+ (flyspell-default-deplacement-commands):
+ * textmodes/ispell.el (ispell-accept-output):
+ * textmodes/sgml-mode.el (html-tag-help):
+ * vc/compare-w.el (compare-ignore-whitespace)
+ (compare-ignore-case, compare-windows-dehighlight):
+ * vc/diff.el (diff):
+ * whitespace.el (whitespace-point)
+ (whitespace-font-lock-refontify, whitespace-bob-marker)
+ (whitespace-eob-marker): Fix ambiguous doc string cross-reference(s).
+
+2013-01-11 Michael Albinus <michael.albinus@gmx.de>
+
+ * autorevert.el (top): Require 'cl in order to pacify byte compiler.
+ (auto-revert-notify-rm-watch): Ignore errors.
+ (auto-revert-notify-add-watch): Ignore errors. Use '(modify) for
+ inotify, and '(size last-write-time) for w32notify.
+ Set buffer-local `auto-revert-use-notify' to nil when adding a file
+ watch fails - this is a fallback to the file modification check.
+ (auto-revert-notify-event-p, auto-revert-notify-event-descriptor)
+ (auto-revert-notify-event-action)
+ (auto-revert-notify-event-file-name): New defuns.
+ (auto-revert-notify-handler): Use them. Implement first
+ plausibility checks.
+ (auto-revert-handler): Handle also `auto-revert-tail-mode'.
+
+2013-01-11 Julien Danjou <julien@danjou.info>
+
+ * color.el (color-rgb-to-hsv): Fix conversion computing in case min and
+ max are almost equal. Also return the correct value for V which is
+ already between 0 and 1.
+
+2013-01-11 Dmitry Antipov <dmantipov@yandex.ru>
+
+ * emacs-lisp/ert.el (ert-run-test): Use point-max-marker.
+
+2013-01-11 Eli Zaretskii <eliz@gnu.org>
+
+ * autorevert.el (auto-revert-notify-rm-watch)
+ (auto-revert-notify-add-watch): Fix typos in w32notify function
+ names.
+
+2013-01-10 Michael Albinus <michael.albinus@gmx.de>
+
+ * autorevert.el (auto-revert-notify-enabled): Move up.
+ (auto-revert-use-notify): New defcustom.
+ (auto-revert-mode, global-auto-revert-mode)
+ (auto-revert-notify-add-watch, auto-revert-handler)
+ (auto-revert-buffers): Use `auto-revert-use-notify' instead of
+ `auto-revert-notify-enabled'.
+
+2013-01-10 Elias Pipping <pipping@exherbo.org>
+
+ * files.el (auto-mode-alist): Use doc-view for djvu files (bug#13164).
+ * doc-view.el (doc-view-document->bitmap):
+ Use doc-view-single-page-converter-function instead of
+ single-page-converter arg; adjust callers.
+
+2013-01-10 Feng Li <fengli@gmail.com> (tiny change)
+
+ * progmodes/which-func.el (which-function): Understand Semantic's use
+ of overlays in imenu--index-alist.
+
+2013-01-10 Wolfgang Jenkner <wjenkner@inode.at>
+
+ * man.el: Handle different "man -k" behaviors (bug#13160). Use utf-8.
+ (Man-man-k-use-anchor): New var.
+ (Man-parse-man-k): New function.
+ (Man-completion-table): Use it.
+ (man): Flush the completion cache between uses.
+
+2013-01-10 Michael Albinus <michael.albinus@gmx.de>
+
+ * autorevert.el: Add file watch support.
+ (auto-revert-notify-enabled): New defconst.
+ (auto-revert-notify-watch-descriptor-hash-list)
+ (auto-revert-notify-watch-descriptor)
+ (auto-revert-notify-modified-p): New defvars.
+ (auto-revert-notify-rm-watch, auto-revert-notify-add-watch)
+ (auto-revert-notify-handler): New defuns.
+ (auto-revert-mode, global-auto-revert-mode): Remove file watches
+ when mode is disabled.
+ (auto-revert-handler): Check for `auto-revert-notify-modified-p'.
+ (auto-revert-buffers): Add file watches for active buffers.
+
+2013-01-10 Dmitry Antipov <dmantipov@yandex.ru>
+
+ * cus-start.el (toplevel): Only allow float values for
+ scroll-up-aggressively and scroll-down-aggressively.
+ Allow any number for line-spacing.
+
+2013-01-10 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * doc-view.el (doc-view-pdfdraw-program): Allow "pdfdraw" name.
+ (doc-view-pdf->png-converter-function): Use mupdf if available.
+ (doc-view-djvu->png-converter-function)
+ (doc-view-ps->png-converter-function): Remove.
+ (doc-view--image-file-pattern): Replace doc-view--image-file-extension.
+ (doc-view-goto-page, doc-view-convert-current-doc, doc-view-display)
+ (doc-view-already-converted-p): Adjust accordingly.
+ (doc-view-mode-p): Simplify.
+ (doc-view-enlarge): Use setq-local.
+ (doc-view-pdf->png-converter-ghostscript)
+ (doc-view-djvu->png-converter-ddjvu)
+ (doc-view-pdf->png-converter-mupdf): Rework to call
+ doc-view-start-process directly.
+ (doc-view-pdf/ps->png): Simplify accordingly.
+ (doc-view-pdf->png-1, doc-view-djvu->png-1): Remove.
+ (doc-view-document->bitmap): Rename from doc-view-document->png.
+ (doc-view-convert-current-doc): Merge pdf and djvu cases.
+ (doc-view-set-slice-from-bounding-box): Fix completion table.
+ (doc-view-mode): Use add-hook for after-revert-hook.
+
2013-01-10 Glenn Morris <rgm@gnu.org>
* emacs-lisp/authors.el (authors-ignored-files)
(authors-valid-file-names, authors-renamed-files-alist):
Add some more entries.
-2013-01-09 Stefan Monnier <monnier@iro.umontreal.ca>
+2013-01-10 Stefan Monnier <monnier@iro.umontreal.ca>
* image-mode.el (image-mode-winprops): Don't throw away the fallback
`t' pseudo-window entry.
-2013-01-09 Alan Mackenzie <acm@muc.de>
+2013-01-10 Alan Mackenzie <acm@muc.de>
Fix bugs in the c-parse-state mechanism. Reuse some markers
instead of continually generating new ones.
@@ -302,19 +3088,62 @@
(c-state-maybe-marker): New macro.
(c-parse-state): Reuse markers when appropriate.
-2013-01-09 Glenn Morris <rgm@gnu.org>
+2013-01-10 Glenn Morris <rgm@gnu.org>
* simple.el (execute-extended-command): Doc fix.
Bind prefix-arg around read-extended-command, for prompt. (Bug#13395)
-2013-01-09 Chong Yidong <cyd@gnu.org>
+2013-01-10 Chong Yidong <cyd@gnu.org>
* faces.el (read-face-name): Doc fix.
+2013-01-10 Roland Winkler <winkler@gnu.org>
+
+ * emacs-lisp/crm.el: Allow any regexp for separators.
+ (crm-default-separator): All spaces around the default comma separator.
+ (crm--completion-command): New macro.
+ (crm-completion-help, crm-complete, crm-complete-word): Use it.
+ (crm-complete-and-exit): Handle non-single-char separators.
+
+2013-01-09 Elias Pipping <pipping@lavabit.com>
+
+ * doc-view.el: Add support for DjVu (bug#13164).
+ (doc-view-djvu->png-converter-function): New config var.
+ (doc-view-single-page-converter-function, doc-view--image-type)
+ (doc-view--image-file-extension): New vars.
+ (doc-view-mode): Initialize them.
+ (doc-view-goto-page): Use them.
+ (doc-view-mode-p): Add support for ddjvu.
+ (doc-view-djvu->png-converter-ddjvu, doc-view-djvu->png-1)
+ (doc-view-set-up-single-converter): New funs.
+ (doc-view-pdf/ps->png): Extend for djvu.
+ (doc-view-document->png): Rename from doc-view-pdf->png.
+ (doc-view-convert-current-doc): Handle djvu.
+ (doc-view-insert-image, doc-view-display)
+ (doc-view-already-converted-p): Don't hardcode png.
+ (doc-view-set-doc-type): Recognize djvu docs.
+
+2013-01-09 Elias Pipping <pipping@lavabit.com>
+
+ * doc-view.el: Add support for mupdf converter (bug#13164).
+ (doc-view-pdfdraw-program, doc-view-pdf->png-converter-function)
+ (doc-view-ps->png-converter-function): New config vars.
+ (doc-view-pdf->png-converter-ghostscript)
+ (doc-view-ps->png-converter-ghostscript)
+ (doc-view-pdf->png-converter-mupdf): New functions.
+ (doc-view-pdf/ps->png, doc-view-pdf->png-1): Use them.
+
+2013-01-09 Jürgen Hötzel <juergen@archlinux.org>
+
+ * net/tramp.el (tramp-eshell-directory-change): Check remote-path
+ first in session cache: When `tramp-own-remote-path' is in
+ `tramp-remote-path', the remote path is only set in the session
+ cache.
+
2013-01-09 Glenn Morris <rgm@gnu.org>
- * emacs-lisp/trace.el (trace-function, trace-function-background):
- Doc fix.
+ * emacs-lisp/trace.el (trace-function-foreground)
+ (trace-function-background): Doc fix.
2013-01-09 Juri Linkov <juri@jurta.org>
@@ -325,23 +3154,179 @@
`completion-ignore-case' in `completion-pcm--all-completions'.
(Bug#12615).
-2013-01-07 Glenn Morris <rgm@gnu.org>
+2013-01-09 Glenn Morris <rgm@gnu.org>
* progmodes/compile.el (compilation-parse-errors):
Fix typo. (Bug#13369)
-2013-01-07 Vitalie Spinu <spinuvit@gmail.com> (tiny change)
+2013-01-09 Vitalie Spinu <spinuvit@gmail.com> (tiny change)
* comint.el (comint-send-input): Check size of buffer before
waiting for process output, in case already accepted. (Bug#13290)
+2013-01-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ Spelling fixes.
+ * net/tramp-adb.el (tramp-adb-get-toolbox):
+ Fix misspelling of 'unknown'.
+
+2013-01-08 Juri Linkov <juri@jurta.org>
+
+ * textmodes/flyspell.el (flyspell-incorrect, flyspell-duplicate):
+ * progmodes/flymake.el (flymake-errline, flymake-warnline):
+ Use underline style wave on terminals that support it. (Bug#13000)
+
+2013-01-08 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/pcase.el (pcase--split-equal): Also take advantage if
+ the predicate returns nil.
+
+ * simple.el: Use lexical-binding.
+ (primitive-undo): Use pcase.
+ (minibuffer-history-isearch-push-state): Use a closure.
+
+2013-01-08 Aaron S. Hawley <aaron.s.hawley@gmail.com>
+
+ * simple.el (primitive-undo): Move from undo.c.
+
+2013-01-08 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * vc/pcvs.el (cvs-cleanup-collection): Extend meaning of `rm-handled'.
+ (cvs-mode-remove-handled): Use it (bug#13380).
+
+ * emacs-lisp/nadvice.el (advice--tweak): New function.
+ (advice--remove-function, advice--subst-main): Use it.
+
+ * emacs-lisp/advice.el: Update commentary.
+
+2013-01-08 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-adb.el (tramp-adb-file-name-handler-alist):
+ Remove spurious entry.
+
+2013-01-08 Glenn Morris <rgm@gnu.org>
+
+ * net/tramp.el (tramp-default-host-alist): Add :version.
+
+2013-01-08 Juri Linkov <juri@jurta.org>
+
+ * info.el (Info-read-node-name-2): Don't duplicate suffixes for
+ single completion. (Bug#12456)
+ (info--manual-names): Expand node completions into an explicit list
+ before appending it to another list. Filter out internal buffers
+ with the leading space in the buffer name. (Bug#10771)
+
+2013-01-08 Juri Linkov <juri@jurta.org>
+
+ * info.el (Info-read-node-name-1): Allow empty node name in (FILENAME)
+ that defaults to the Top node.
+ (Info-goto-node, Info-read-node-name): Doc fix to mention that
+ the short format (FILENAME) goes to the Top node.
+ (Info-build-node-completions): Rename arg `file' to `filename'.
+ (Bug#13365)
+
+2013-01-07 Bastien Guerry <bzg@gnu.org>
+
+ * menu-bar.el (menu-bar-search-documentation-menu):
+ Use `apropos-user-option' and fix the help message.
+
+2013-01-07 Bastien Guerry <bzg@gnu.org>
+
+ * apropos.el (apropos-do-all): Update docstring.
+ (apropos-user-option-button): New face.
+ (apropos-user-option): Rename from `apropos-variable' and update
+ docstring.
+ (apropos-variable): Rewrite, now show all variables by default.
+ (apropos-print): Mention "User option" instead of "Variable" when
+ printing doc for user options. (Bug#13276)
+
+2013-01-07 Jürgen Hötzel <juergen@archlinux.org>
+
+ * net/tramp-adb.el (tramp-do-parse-file-attributes-with-ls):
+ Handle filename correctly, when parsing "source -> target" symlink
+ output.
+ (tramp-adb-handle-set-file-times): New defun.
+
+2013-01-07 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/advice.el (ad-activate-advised-definition): Refresh the
+ advice list when the interactive-spec of ad-Advice-* changes.
+
+2013-01-07 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * wid-edit.el (widget-default-get): Work for inlined elements.
+ (Bug#12670)
+
+2013-01-07 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp.el (tramp-default-host-alist): New defcustom.
+ (tramp-find-host): Use it.
+ (tramp-eshell-directory-change): Move from tramp-sh.el. Add to
+ `eshell-directory-change-hook'.
+
+ * net/tramp-adb.el (top): Add adb specific entry in
+ `tramp-default-host-alist'.
+ (tramp-adb-file-name-host): Remove function.
+ (tramp-adb-execute-adb-command, tramp-adb-maybe-open-connection):
+ Use `tramp-file-name-host' instead of `tramp-adb-file-name-host'.
+
+ * net/tramp-sh.el: Move eshell integration code to tramp.el.
+
+2013-01-06 Jürgen Hötzel <juergen@archlinux.org>
+
+ * net/tramp-adb.el (tramp-methods): Add `tramp-tmpdir' entry.
+
+2013-01-06 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-adb.el (tramp-adb-ls-toolbox-regexp): The file size can
+ consist of more than one digit.
+ (tramp-adb-file-name-handler-alist):
+ Use `tramp-handle-file-exists-p' consistently.
+ (tramp-adb-file-name-handler): Don't tweak `tramp-default-host'.
+ (tramp-adb-handle-file-exists-p): Remove function.
+ (tramp-adb-file-name-host): New defun.
+ (tramp-adb-execute-adb-command, tramp-adb-maybe-open-connection):
+ Use it.
+ (tramp-adb-maybe-open-connection): Set "remote-path" property.
+
+2013-01-06 Chong Yidong <cyd@gnu.org>
+
+ * vc/vc.el (vc-next-action): Detect buffer modifications
+ conflicting with locking VCS operation (Bug#11490).
+
+ * vc/vc-hooks.el (vc-after-save): DTRT for locking VCSes.
+
+2013-01-05 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-adb.el (tramp-do-parse-file-attributes-with-ls):
+ (tramp-adb-handle-directory-files-and-attributes): Fix typos.
+
+2013-01-05 Jürgen Hötzel <juergen@archlinux.org>
+
+ * net/tramp-adb.el (tramp-adb-handle-file-attributes): More robust
+ parsing of ls output using regular expression (handle filenames
+ with spaces). Use virtual device number.
+ (tramp-do-parse-file-attributes-with-ls): New defun (Code
+ cleanup).
+
+2013-01-04 Daiki Ueno <ueno@gnu.org>
+
+ * epg.el: Silence byte-compiler warnings.
+ (epg--start): Use delete-char instead of delete-backward-char.
+ (epg-wait-for-completion): Pass FRAME arg to redraw-frame.
+
+2013-01-04 Daiki Ueno <ueno@gnu.org>
+
+ * epg.el (epg--start): Don't call "tty" program on W32 platforms.
+ Suggested by Eli Zaretskii <eliz@gnu.org>.
+
2013-01-04 Michael Albinus <michael.albinus@gmx.de>
* net/tramp-sh.el (tramp-set-file-uid-gid): UID and GID must be
non-negative integers. Otherwise, the default values are used.
(tramp-convert-file-attributes): Convert uid and gid to integers.
-2013-01-03 Glenn Morris <rgm@gnu.org>
+2013-01-04 Glenn Morris <rgm@gnu.org>
* term.el (term-handle-colors-array): Ensure face attributes
are fully specified, not nil. (Bug#13337)
@@ -353,19 +3338,54 @@
(tag-find-file-of-tag-noselect): Check auto-compression-mode
rather than 'jka-compr being loaded. (Bug#13338)
+2013-01-04 Wesley Dawson <whd@lavabit.com> (tiny change)
+
+ * icomplete.el (icomplete-completions):
+ Honor icomplete-prospects-height once more following
+ 2012-11-29 changes. (Bug#13224)
+
+2013-01-04 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * subr.el (internal--called-interactively-p--get-frame): Find aliases
+ of called-interactively-p as well (bug#13237).
+
+ * view.el (view--enable, view--disable): Rename from view-mode-enable
+ and view-mode-disable and assume it's called from view-mode.
+ (view-mode-enable, view-mode-disable): Redefine as obsolete
+ compatibility layer above view-mode.
+ (view-mode-enter): Call `view-mode'.
+
+ * files.el (after-find-file): Call `view-mode'.
+
+ * doc-view.el (doc-view-scale-internally): New var.
+ (doc-view-enlarge, doc-view-insert-image): Obey it.
+
+2013-01-03 Daiki Ueno <ueno@gnu.org>
+
+ * epg.el (epg--start): Ignore errors when /dev/fd/0 does not
+ exist. (Bug#13344)
+
+2013-01-03 Glenn Morris <rgm@gnu.org>
+
+ * mail/rmail.el (rmail-set-header-1): Ignore case.
+ Handle multi-line headers. (Bug#13330)
+
+ * progmodes/make-mode.el (makefile-fill-paragraph): Add doc.
+ Handle paragraph starting at beginning of buffer.
+
* subr.el (eval-after-load): Don't purecopy the form, so that it
can be nconc'd later on; reverts 2009-11-11 change. (Bug#13331)
* emacs-lisp/byte-run.el (defun): Place cl declarations
after any interactive spec. (Bug#13265)
-2012-12-31 Andreas Schwab <schwab@linux-m68k.org>
+2013-01-02 Andreas Schwab <schwab@linux-m68k.org>
* emacs-lisp/byte-run.el (defmacro): Use same argument parsing as
defun. Don't check for DECL if DOCSTRING isn't a string.
(defun): Likewise.
-2012-12-31 Glenn Morris <rgm@gnu.org>
+2013-01-02 Glenn Morris <rgm@gnu.org>
* eshell/em-cmpl.el (eshell-pcomplete):
More thoroughly imitate pcomplete. (Bug#13293)
@@ -373,32 +3393,67 @@
* files.el (parse-colon-path): Doc fix. (Bug#12351)
Return nil for empty path elements. (Bug#13296)
-2012-12-31 Fabián Ezequiel Gallina <fgallina@cuca>
+2013-01-02 Fabián Ezequiel Gallina <fgallina@cuca>
* progmodes/python.el (python-nav-end-of-statement): Rewrite in
order to improve efficiency (Based on Daniel Colascione's
<dancol@dancol.org> patch). (Bug#13182)
-2012-12-31 Glenn Morris <rgm@gnu.org>
+2013-01-02 Glenn Morris <rgm@gnu.org>
* vc/log-edit.el (log-edit-header-contents-regexp): Add doc string.
-2012-12-31 Fabián Ezequiel Gallina <fgallina@cuca>
+2013-01-02 Andreas Schwab <schwab@linux-m68k.org>
- * progmodes/python.el: Support other commands triggering
- python-indent-line so indentation cycling continues to work.
- (python-indent-trigger-commands): New defcustom.
- (python-indent-line): Use it.
+ * emacs-lisp/byte-run.el (defmacro): Don't lose final nil if
+ neither DOCSTRING nor DECL was given. (Bug#13316)
-2012-12-31 Fabián Ezequiel Gallina <fgallina@cuca>
+2013-01-02 Michael Albinus <michael.albinus@gmx.de>
- * progmodes/python.el (python-shell-send-region): Add blank lines
- for non sent code so backtraces remain correct.
+ * net/tramp-sh.el (tramp-sh-handle-set-file-acl): Add argument to
+ `error' call.
+ (tramp-do-copy-or-rename-file): Ignore errors when calling
+ `set-file-extended-attributes'.
-2012-12-31 Andreas Schwab <schwab@linux-m68k.org>
+ * net/tramp-smb.el (tramp-smb-file-name-handler-alist):
+ Add handler for `file-acl'.
+ (tramp-smb-handle-file-acl): New defun.
- * emacs-lisp/byte-run.el (defmacro): Don't lose final nil if
- neither DOCSTRING nor DECL was given. (Bug#13316)
+2013-01-02 Jay Belanger <jay.p.belanger@gmail.com>
+
+ * calc/README: Mention ISO 8601 week-numbering dates.
+
+2013-01-01 Martin Rudalics <rudalics@gmx.at>
+
+ * view.el (view-mode-enable): New argument run-view-mode-hook.
+ Run view-mode-hook only when it's non-nil (Bug#13315).
+ (view-mode-enter): Call view-mode-enable with run-view-mode-hook
+ argument t.
+
+2012-12-31 Jürgen Hötzel <juergen@archlinux.org>
+
+ * net/tramp-adb.el (tramp-adb-maybe-open-connection): Handle errors
+ (No device connected, invalid device name). (Bug #13299)
+
+2012-12-31 Martin Rudalics <rudalics@gmx.at>
+
+ * window.el (window-resizable--p): Rename to window-resizable-p.
+ (window-resize-no-error): New function.
+
+ * mail/rmail.el (rmail-maybe-display-summary): Restore behavior
+ broken in fix from 2012-12-28.
+
+2012-12-31 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * subr.el (special-form-p): Don't signal errors on undef aliases.
+
+2012-12-31 Jay Belanger <jay.p.belanger@gmail.com>
+
+ * calc/calc-forms.el (math-parse-date): Try using
+ `math-parse-iso-date' when it looks like it might be needed.
+ Allow times of 24:00.
+ (math-parse-date-validate, math-parse-iso-date-validate): Allow times
+ of 24:00.
2012-12-30 Glenn Morris <rgm@gnu.org>
@@ -407,157 +3462,1062 @@
(rmail-summary-displayed, rmail-summary): Declare.
(mairix-rmail-display): Just require rmail.
-2012-12-29 Chong Yidong <cyd@gnu.org>
+2012-12-30 Chong Yidong <cyd@gnu.org>
* emacs-lisp/package.el (package-untar-buffer): Improve integrity
check for the tarball contents.
-2012-12-29 Matt Fidler <matt.fidler@alcon.com> (tiny change)
+2012-12-30 Matt Fidler <matt.fidler@alcon.com> (tiny change)
* emacs-lisp/package.el (package-untar-buffer): Handle problematic
tarfile content listings (Bug#13136).
-2012-12-29 Mark Lillibridge <mark.lillibridge@hp.com>
+2012-12-30 Mark Lillibridge <mark.lillibridge@hp.com>
* mail/rmailmm.el (rmail-insert-mime-forwarded-message):
Insert the undecoded text of the message being forwarded. (Bug#9521)
-2012-12-28 Michael Albinus <michael.albinus@gmx.de>
+2012-12-30 Michael Albinus <michael.albinus@gmx.de>
* net/tramp-sh.el (tramp-set-file-uid-gid): Convert UID and GID to
integers, if they are real numbers. (Bug#13282)
-2012-12-26 Dmitry Gutov <dgutov@yandex.ru>
+ * net/tramp-sh.el (tramp-sh-handle-set-file-selinux-context):
+ Return `t' on success.
+
+ * net/tramp-smb.el (tramp-smb-file-name-handler-alist):
+ Add handler for `set-file-selinux-context'.
+
+2012-12-29 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-sh.el (tramp-sh-handle-file-acl): Suppress basic attributes.
+ (tramp-sh-handle-set-file-acl): Return `t' on success.
+
+2012-12-29 Eli Zaretskii <eliz@gnu.org>
+
+ * files.el (backup-buffer-copy, basic-save-buffer-2):
+ If set-file-extended-attributes fails, fall back on set-file-modes
+ instead of signaling an error. (Bug#13298)
+ (basic-save-buffer): Likewise.
+
+2012-12-29 Fabián Ezequiel Gallina <fgallina@cuca>
+
+ * progmodes/python.el: Support other commands triggering
+ python-indent-line so indentation cycling continues to work.
+ (python-indent-trigger-commands): New defcustom.
+ (python-indent-line): Use it.
+
+2012-12-29 Fabián Ezequiel Gallina <fgallina@cuca>
+
+ * progmodes/python.el (python-shell-send-region): Add blank lines
+ for non sent code so backtraces remain correct.
+
+2012-12-29 Fabián Ezequiel Gallina <fgallina@cuca>
+
+ * progmodes/python.el: Remove cl dependency.
+ (python-syntax-count-quotes): Replace incf call.
+ (python-fill-string): Replace setf call.
+
+2012-12-29 Damien Cassou <damien.cassou@gmail.com>
+
+ * info.el (info-other-window): New arg, for consistency with info.
+
+2012-12-28 Martin Rudalics <rudalics@gmx.at>
+
+ * mail/rmail.el (rmail-maybe-display-summary):
+ Rewrite (Bug#13066).
+
+2012-12-28 Andreas Schwab <schwab@linux-m68k.org>
+
+ * epg.el (epg--start): Modify process-environment locally.
+
+2012-12-28 Daiki Ueno <ueno@gnu.org>
+
+ * epg.el: Support pinentry-curses.
+ Suggested by Werner Koch in
+ <http://lists.gnu.org/archive/html/emacs-devel/2007-02/msg00755.html>.
+ (epg-agent-file, epg-agent-mtime): New variable.
+ (epg--start): Record the modified time of gpg-agent socket file,
+ to restore Emacs frame after pinentry-curses termination.
+ (epg-wait-for-completion): Restore Emacs frame here.
+
+2012-12-27 Juri Linkov <juri@jurta.org>
+
+ * info.el (Info-file-completions): New variable.
+ (Info-read-node-name-1): Complete node names in the Info file
+ when a file name is given. Call `Info-build-node-completions'
+ with a file name.
+ (Info-build-node-completions): Add new arg `file'. When it is
+ non-nil, visit it in a temporary buffer and cache its completions in
+ `Info-current-file-completions'. Move most of the function body to
+ `Info-build-node-completions-1'.
+ (Info-build-node-completions-1): New function with the body from
+ `Info-build-node-completions'. (Bug#12456)
+
+2012-12-27 Juri Linkov <juri@jurta.org>
+
+ * frame.el (frame-maximization-style): Remove user option.
+ (cycle-frame-maximized): Remove function.
+ (toggle-frame-maximized): Rewrite and bind to M-<f10>.
+ (toggle-frame-fullscreen): New command bound to <f11> instead of
+ `toggle-frame-maximized'.
+ http://lists.gnu.org/archive/html/emacs-devel/2012-12/msg00703.html
+
+2012-12-27 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp.el (tramp-handle-file-accessible-directory-p): New defun.
+
+ * net/tramp-adb.el (tramp-adb-file-name-handler-alist):
+ * net/tramp-gvfs.el (tramp-gvfs-file-name-handler-alist):
+ * net/tramp-sh.el (tramp-sh-file-name-handler-alist): Add handler
+ for `file-accessible-directory-p'. (Bug#13275)
+
+2012-12-27 Sam Steingold <sds@gnu.org>
+
+ * progmodes/cperl-mode.el (cperl-calculate-indent): Do not stagger
+ continuations, see <http://stackoverflow.com/questions/3582436>.
+
+2012-12-27 Dmitry Gutov <dgutov@yandex.ru>
* progmodes/ruby-mode.el (ruby-indent-beg-re): Only allow "class",
"module" and "def" to have indentation before them.
- Regression from 109911 (see the new test).
-
-2012-12-24 Dmitry Gutov <dgutov@yandex.ru>
+ Regression from 2012-09-07T04:15:56Z!dgutov@yandex.ru (see the new test).
* progmodes/ruby-mode.el: Bump the version to 1.2 (Bug#13200).
-2012-12-23 Alan Mackenzie <acm@muc.de>
+2012-12-27 Alan Mackenzie <acm@muc.de>
Speed up fontification where there's large brace blocks.
* progmodes/cc-fonts.el (c-font-lock-enclosing-decls): Add a limit
to a call of c-beginning-of-decl-1.
+2012-12-27 Vitalie Spinu <spinuvit@gmail.com> (tiny change)
+
+ * comint.el (comint-adjust-window-point): New function.
+ (comint-postoutput-scroll-to-bottom):
+ Call comint-adjust-window-point (Bug#13248).
+
+2012-12-26 Dmitry Gutov <dgutov@yandex.ru>
+
+ * progmodes/ruby-mode.el (auto-mode-alist): `purecopy' the
+ Rakefile regexp.
+ (auto-mode-alist): Associate .gemspec files with ruby-mode
+ (https://bugs.ruby-lang.org/issues/5453).
+
+2012-12-26 Jürgen Hötzel <juergen@archlinux.org>
+
+ * net/tramp-adb.el (tramp-adb-get-ls-command): New defun.
+ Suppress coloring, if possible (required for BusyBox based systems like
+ CyanogenMod).
+ (tramp-adb-handle-file-attributes)
+ (tramp-adb-handle-insert-directory)
+ (tramp-adb-handle-file-name-all-completions): Use it.
+ (tramp-adb-get-toolbox): New defun. Check for remote shell
+ implementation (BusyBox or Toolbox).
+
+2012-12-24 Constantin Kulikov <zxnotdead@gmail.com> (tiny change)
+
+ * startup.el (initial-buffer-choice): Allow function as value
+ (Bug#13251).
+ (command-line-1): Handle case where initial-buffer-choice
+ specifies a function.
+ * server.el (server-execute): Handle case where
+ initial-buffer-choice specifies a function.
+
+2012-12-24 Lars Ingebrigtsen <larsi@gnus.org>
+
+ * mail/smtpmail.el (smtpmail-try-auth-method): Refactored out into
+ its own function.
+ (smtpmail-try-auth-methods): Forget the user name/password if the
+ login is unsuccessful (bug#12424).
+
+2012-12-22 Michael Albinus <michael.albinus@gmx.de>
+
+ * notifications.el (notifications-notify): Protect body with
+ `with-demoted-errors'.
+
+ * net/tramp-adb.el (tramp-adb-maybe-open-connection):
+ Check properties of remote device. Restart connection, if there is a
+ change.
+
2012-12-21 Chong Yidong <cyd@gnu.org>
* sort.el (sort-subr): Doc fix (Bug#13056).
-2012-12-20 Bastien Guerry <bzg@gnu.org>
+2012-12-21 Bastien Guerry <bzg@gnu.org>
* progmodes/etags.el (tags-search): Fix typo. Bug #13232.
-2012-12-11 Alan Mackenzie <acm@muc.de>
+2012-12-21 Michael Albinus <michael.albinus@gmx.de>
+
+ * simple.el (process-file): Overwrite stderr file, if exists.
+
+2012-12-21 Daiki Ueno <ueno@gnu.org>
+
+ * epg.el (epg--start): Print GPG_AGENT_INFO in the debug buffer.
+ (epg-error): Set `error-message' property.
+
+2012-12-21 Chong Yidong <cyd@gnu.org>
+
+ * international/mule-cmds.el (read-char-by-name): Signal an error
+ if the user does not supply a valid character (Bug#13177).
+
+ * simple.el (transpose-subr-1): Preserve marker positions by
+ changing the insertion sequence (Bug#13122).
+
+2012-12-21 Kelly Dean <kellydeanch@yahoo.com> (tiny change)
+
+ * simple.el (kill-region): Deactivate mark even for empty regions
+ (Bug#13169).
+
+2012-12-21 Chong Yidong <cyd@gnu.org>
+
+ * help-fns.el (describe-variable): Make sure we get the right
+ buffer name (Bug#13105). Suggested by Kelly Dean.
+
+2012-12-20 Michael R. Mauger <mmaug@yahoo.com>
+
+ * comint.el (comint-redirect-previous-input-string): New variable.
+ (comint-redirect-setup, comint-redirect-cleanup)
+ (comint-redirect-preoutput-filter): Use it. Fixes redirection bug.
+ (comint-redirect-preoutput-filter): Fix verbose message.
+
+2012-12-20 Michael Albinus <michael.albinus@gmx.de>
+
+ * progmodes/grep.el (rgrep): Escape command line. Sometimes, it
+ is too long for Tramp. See discussion in
+ <http://thread.gmane.org/gmane.emacs.tramp/8233/focus=8244>.
+
+ * progmodes/compile.el (compilation-start): Remove line escape
+ template.
+
+2012-12-20 Dmitry Antipov <dmantipov@yandex.ru>
+
+ * vc/ediff-ptch.el (ediff-map-patch-buffer): Use `point-min-marker'.
+ Adjust comment.
+
+2012-12-19 Jonas Bernoulli <jonas@bernoul.li>
+
+ * emacs-lisp/lisp-mnt.el (lm-section-end): Always end before the
+ following non-comment text (bug#13207).
+ (lm-header-multiline): Continuation lines need to be indented more than
+ the first line.
+ (lm-homepage): New function.
+ (lm-with-file): Don't be confused if narrowing is in effect.
+
+2012-12-19 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * vc/diff-mode.el (diff-post-command-hook): Don't ignore changes at the
+ very beginning of a hunk (e.g. killing the first line).
+
+2012-12-19 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-sh.el (tramp-sh-handle-file-acl): Delete empty lines
+ and text properties from returned ACL string.
+ (tramp-sh-handle-set-file-acl): Do not use additional parentheses
+ for "setfacl" command.
+
+2012-12-18 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp.el (tramp-error-with-buffer): Give a hint to use
+ `tramp-cleanup-this-connection', when the process has died.
+ (Bug#13151)
+
+2012-12-17 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * icomplete.el (icomplete-completions): Also use … to truncate prefix.
+
+2012-12-17 Kevin Ryde <user42@zip.com.au>
+
+ * files.el (auto-save-file-name-p): Use \` and \' (bug#13186).
+
+2012-12-17 Michael Albinus <michael.albinus@gmx.de>
+
+ Add support for preserving ACL entries of files.
+
+ * net/tramp.el (tramp-file-name-for-operation): Add `file-acl' and
+ `set-file-acl' handlers.
+
+ * net/tramp-adb.el (tramp-adb-handle-copy-file):
+ Handle PRESERVE-EXTENDED-ATTRIBUTES.
+
+ * net/tramp-compat.el (tramp-compat-copy-file):
+ Handle PRESERVE-EXTENDED-ATTRIBUTES.
+
+ * net/tramp-gvfs.el (tramp-gvfs-file-name-handler-alist):
+ Add `file-acl' and `set-file-acl' handlers.
+ (tramp-gvfs-handle-copy-file):
+ Handle PRESERVE-EXTENDED-ATTRIBUTES.
+ (tramp-gvfs-handle-file-acl, tramp-gvfs-handle-set-file-acl):
+ New defuns.
+
+ * net/tramp-sh.el (tramp-sh-file-name-handler-alist):
+ Add `file-acl' and `set-file-acl' handlers.
+ (tramp-remote-acl-p, tramp-sh-handle-file-acl)
+ (tramp-sh-handle-set-file-acl): New defuns.
+ (tramp-sh-handle-copy-file, tramp-do-copy-or-rename-file):
+ Handle PRESERVE-EXTENDED-ATTRIBUTES.
+
+ * net/tramp-smb.el (tramp-smb-file-name-handler-alist):
+ Add `file-acl' and `set-file-acl' handlers.
+ (tramp-smb-handle-copy-file): Handle PRESERVE-EXTENDED-ATTRIBUTES.
+
+2012-12-17 Kelly Dean <kellydeanch@yahoo.com> (tiny change)
+
+ * help-macro.el (make-help-screen): Instead of switch-to-buffer
+ use pop-to-buffer with NORECORD argument t. As buffer name, use
+ *Metahelp* with a leading space (Bug#13190).
+
+2012-12-16 Romain Francoise <romain@orebokech.com>
+
+ * files.el (file-extended-attributes)
+ (set-file-extended-attributes): New functions.
+ (backup-buffer): Use them to handle both SELinux context and ACL
+ entries.
+ (backup-buffer-copy): Work with an alist of extended attributes,
+ rather than an SELinux context.
+ (basic-save-buffer-2): Ditto.
+
+2012-12-16 Timo Myyrä <timo.myyra@gmail.com>
+
+ * battery.el (battery-bsd-apm): New function.
+
+2012-12-16 Jay Belanger <jay.p.belanger@gmail.com>
+
+ * calc/calc.el (calc-standard-date-formats): Adjust one of the
+ standard date formats.
+
+2012-12-15 Juri Linkov <juri@jurta.org>
+
+ * isearch.el (isearch-mode-map): Bind `C-x 8 RET' to
+ `isearch-insert-char-by-name'.
+ (with-isearch-suspended): New defmacro with body mostly from
+ `isearch-edit-string' except the part that sets
+ `isearch-new-string' and `isearch-new-message'.
+ (isearch-edit-string): Use new macro `with-isearch-suspended' with
+ body that sets `isearch-new-string' and `isearch-new-message'.
+ (isearch-insert-char-by-name): New command.
+ * international/mule-cmds.el (read-char-by-name): Let-bind
+ `enable-recursive-minibuffers' to t.
+ http://lists.gnu.org/archive/html/emacs-devel/2012-12/msg00234.html
+
+2012-12-15 Juri Linkov <juri@jurta.org>
+
+ * isearch.el (isearch-delete-char, isearch-del-char): Doc fix.
+ (Bug#13175)
+
+2012-12-15 Christopher Schmidt <christopher@ch.ristopher.com>
+
+ * dired-x.el (dired-guess-shell-command): Put colon at the end of
+ the prompt. (Bug#13045)
+
+2012-12-14 Glenn Morris <rgm@gnu.org>
+
+ * emacs-lisp/macroexp.el (macroexp--warn-and-return):
+ Try to include filename in non-bytecomp warning. (Bug#13132)
+
+2012-12-14 Paul Eggert <eggert@cs.ucla.edu>
+
+ Fix permissions bugs with setgid directories etc. (Bug#13125)
+ * files.el (backup-buffer): Don't rely on 9th output of
+ file-attributes, as it's now a placeholder. Instead, use the new
+ optional arg of file-ownership-preserved-p.
+ (file-ownership-preserved-p): New optional arg GROUP.
+ Fix mishandling of setuid directories that would cause this
+ function to return t when it should have returned nil.
+ Document what happens if the file does not exist, and when
+ it's not known whether the ownership will be preserved.
+ * net/tramp-sh.el (tramp-sh-handle-file-ownership-preserved-p):
+ Likewise.
+ (tramp-get-local-gid): Use group-gid for integer, as that's
+ faster and more reliable.
+
+2012-12-14 Julien Danjou <julien@danjou.info>
+
+ * progmodes/sql.el (sql-mode-postgres-font-lock-keywords):
+ Update keywords list, data type and PL/pgSQL.
+
+2012-12-14 Dave Abrahams <dave@boostpro.com>
+
+ * vc/ediff-util.el (ediff-buffer-type): New function.
+ (ediff-clone-buffer-for-current-diff-comparison): Compute the buf-type
+ rather than taking it as as argument.
+ (ediff-inferior-compare-regions): Adjust calls accordingly (bug#11319).
+
+2012-12-14 Ryan Crum <ryan.crum@eleostech.com>
+
+ * json.el: Add pretty-print option (bug#12634).
+ (json-encoding-separator, json-encoding-default-indentation)
+ (json--encoding-current-indentation, json-encoding-pretty-print)
+ (json-encoding-lisp-style-closings): New vars.
+ (json--with-indentation): New macro.
+ (json-encode-hash-table, json-encode-alist, json-encode-plist)
+ (json-encode-array): Use it to obey json-encoding-pretty-print.
+ (json-pretty-print-buffer, json-pretty-print): New commands.
+
+2012-12-14 Dmitry Gutov <dgutov@yandex.ru>
+
+ * progmodes/ruby-mode.el (ruby-syntax-propertize-function):
+ Extract `ruby-syntax-propertize-expansions'.
+ (ruby-syntax-propertize-expansions): Only change syntax on
+ certain string delimiters, to punctuation. This way the common
+ functions like forward-word and thing-at-point still work.
+ (ruby-match-expression-expansion): Improve readability.
+ (ruby-block-contains-point): New function.
+ (ruby-add-log-current-method): Handle several edge cases.
+
+2012-12-13 Juanma Barranquero <lekktu@gmail.com>
+
+ * emacs-lisp/edebug.el (edebug-unload-function): Make sure that
+ unload-feature finishes even when aborting an ongoing edebug session.
+ Also, do not worry about edebug-mode, unload-feature takes care of it.
+
+2012-12-13 Andreas Schwab <schwab@suse.de>
+
+ * net/tls.el (tls-program): Update customize type.
+
+2012-12-13 Juanma Barranquero <lekktu@gmail.com>
+
+ * emacs-lisp/edebug.el (edebug--require-cl-read): New function.
+ (edebug-setup-hook, cl-read-load-hooks): Use it.
+ (edebug-unload-function): New function. (Bug#13163)
+
+2012-12-13 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-adb.el (tramp-adb-file-name-p): Make it a defsubst.
+ Otherwise, there could be errors in autoloading. (Bug#13151)
+
+2012-12-13 Jürgen Hötzel <juergen@archlinux.org>
+
+ * net/tramp-adb.el (tramp-adb-wait-for-output): Remove spurious " ^H"
+ sequences.
+
+2012-12-13 Alan Mackenzie <acm@muc.de>
Make CC Mode not hang when _some_ lines end in CRLF. Bug #11841.
* progmodes/cc-engine.el (c-backward-comments): Add code to work
around `forward-comment' not recognizing ^M as whitespace.
-2012-12-11 Fabián Ezequiel Gallina <fgallina@cuca>
+2012-12-13 Fabián Ezequiel Gallina <fgallina@cuca>
* progmodes/python.el (python-skeleton-class)
(python-skeleton-def): Do not add space after defun name.
-2012-12-09 Chong Yidong <cyd@gnu.org>
+2012-12-13 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/cl.el (letf): Make it an alias of cl-letf.
+ (cl--symbol-function): Remove (now that funbound is like nil).
+
+2012-12-12 Glenn Morris <rgm@gnu.org>
+
+ * button.el (button--area-button-p): Fix typo.
+
+2012-12-12 Sam Steingold <sds@gnu.org>
+
+ * frame.el (frame-maximization-style): New user option.
+ (toggle-frame-maximized): Toggle frame maximization according to
+ `frame-maximization-style', bound to <f11>.
+ (cycle-frame-maximized): Cycle between all maximization styles and
+ non-maximized frame, bound to shift-<f11>.
+
+2012-12-12 David Cadé <codename68@gmail.com>
+
+ * mpc.el (mpc-format): Use truncate-string-to-width (bug#13143).
+
+2012-12-12 Jonas Bernoulli <jonas@bernoul.li>
+
+ * lisp/emacs-lisp/eieio.el: Prettier object pretty-printing (bug#13115).
+ (eieio-override-prin1): Don't quote kewords and booleans.
+ (object-write) <eieio-default-superclass>: Don't put closing parens
+ on new line, avoid needless empty lines, align values that are objects
+ with the slot keyword (instead of beginning on the same line).
+ (eieio-list-prin1): Align value with slot keyword; increase
+ eieio-print-depth before printing members of the list.
+
+2012-12-11 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * mail/emacsbug.el (report-emacs-bug): Move the intangible text to
+ a display text-property.
+ (report-emacs-bug-hook): Don't bother deleting it any more.
+
+ * hilit-chg.el (highlight-save-buffer-state): Delete.
+ Use with-silent-modifications instead.
+ (hilit-chg-set-face-on-change): Only fixup the text that's modified.
+
+ * button.el: Handle buttons in display text-properties.
+ (button--area-button-p, button--area-button-string):
+ Use (STRING . STRING-POS) representation instead of just STRING.
+
+2012-12-11 Eli Zaretskii <eliz@gnu.org>
+
+ * makefile.w32-in (compile4-SH): Fix a typo that caused term
+ subdirectory be skipped.
- * simple.el (set-mark-default-inactive): Mark as obsolete, for
- removal after 24.3.
+2012-12-11 Glenn Morris <rgm@gnu.org>
-2012-12-08 Dani Moncayo <dmoncayo@gmail.com>
+ * net/rcirc.el (rcirc-urls, rcirc-condition-filter): Doc fixes.
+
+ * progmodes/f90.el (f90-line-continued, f90-indent-region):
+ Treat preprocessor lines embedded in continuations like comments.
+ (f90-indent-line): Special-case preprocessor lines. (Bug#13138)
+
+2012-12-11 Jay Belanger <jay.p.belanger@gmail.com>
+
+ * calc/calc.el (calc-standard-date-formats): Add more date
+ formats.
+ * calc/calc-forms.el (math-parse-iso-date): New function.
+ (math-parse-date): Use `math-parse-iso-date' when appropriate.
+ (math-parse-iso-date-validate): Add extra error checking.
+ (calc-date-notation): Add ability to access new date formats.
+
+2012-12-10 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * hi-lock.el (hi-lock--regexps-at-point): Fix boundary case for
+ font-lock as well as when there's no text-property.
+
+2012-12-10 Jambunathan K <kjambunathan@gmail.com>
+
+ * hi-lock.el: Refine the choice of default face.
+ (hi-lock-keyword->face): New function. Use it wherever we used
+ cadadadr instead.
+ (hi-lock--regexps-at-point): Ignore faces that can't come from hi-lock.
+ (hi-lock--last-face): Remove var.
+ (hi-lock--unused-faces): New var to replace it.
+ (hi-lock-read-face-name): Use/maintain it.
+ (hi-lock-unface-buffer): Maintain it. Fix error for the C-u case.
+ (hi-lock-set-pattern): Ignore new rule if it has the same regexp even
+ if it has another face.
+
+2012-12-10 Eli Zaretskii <eliz@gnu.org>
+
+ * subr.el (w32notify-handle-event): New function.
+ (inotify-handle-event): Doc fix.
+
+2012-12-10 Rüdiger Sonderfeld <ruediger@c-plusplus.de>
+
+ * subr.el (inotify-event-p, inotify-handle-event): New functions.
+
+2012-12-10 Dani Moncayo <dmoncayo@gmail.com>
* simple.el (just-one-space): Doc fix.
-2012-12-07 Eli Zaretskii <eliz@gnu.org>
+2012-12-10 Eli Zaretskii <eliz@gnu.org>
- * textmodes/texinfo.el (texinfo-enable-quote-envs):
- Add "smallexample".
+ * textmodes/texinfo.el (texinfo-enable-quote-envs): Add "smallexample".
-2012-12-07 Le Wang <l26wang@gmail.com>
+2012-12-10 Le Wang <l26wang@gmail.com>
* hilit-chg.el (hilit-chg-set-face-on-change): Don't burp in
narrowed buffer (bug#12361).
-2012-12-07 Michael Heerdegen <michael_heerdegen@web.de>
-
- * emacs-lisp/debug.el (debug): Fix hard-coded frame counts (bug#10025).
- Virtually backported from trunk.
-
-2012-12-07 Juanma Barranquero <lekktu@gmail.com>
+2012-12-10 Juanma Barranquero <lekktu@gmail.com>
* vc/vc-hooks.el (vc-state): Doc fix.
-2012-12-06 Glenn Morris <rgm@gnu.org>
+2012-12-10 Glenn Morris <rgm@gnu.org>
* mail/rmail.el (rmail-maybe-display-summary):
Preserve buffer, in case select-window changes it. (Bug#13066)
-2012-12-06 Stefan Monnier <monnier@iro.umontreal.ca>
+2012-12-10 Stefan Monnier <monnier@iro.umontreal.ca>
* emacs-lisp/cl.el, emacs-lisp/cl-lib.el: Move cl-unload-function and
cl-load-hook where they belong.
+2012-12-10 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/cl-lib.el (cl-declaim): Paren typo.
+
+2012-12-09 Eli Zaretskii <eliz@gnu.org>
+
+ Parallelize byte compilation on MS-Windows.
+ * makefile.w32-in (WINS_BASIC1, WINS_BASIC2, WINS_BASIC3)
+ (WINS_BASIC4): New variables, subdivide subdirectories into 4 parts.
+ (WINS_BASIC): Define as concatenation of the above.
+ (compile): Subdivide into 4 separate and independent jobs that can
+ be run in parallel.
+ (compile0-CMD, compile0-SH): New targets for compiling
+ COMPILE_FIRST files, which are prerequisites for the rest of the
+ byte-compilation.
+ (compile1-CMD, compile2-CMD, compile3-CMD, compile4-CMD):
+ New targets for parallel compilation with cmd.exe.
+ (compile1-SH, compile2-SH, compile3-SH, compile4-SH): Ditto for
+ compiling under a Unixy shell.
+
+2012-12-09 Chong Yidong <cyd@gnu.org>
+
+ * simple.el (set-mark-default-inactive): Delete this
+ accidentally-introduced option.
+ (set-mark-command, exchange-point-and-mark): Remove calls.
+
+2012-12-09 Glenn Morris <rgm@gnu.org>
+
+ * emacs-lisp/lisp-mode.el (eval-defun-1): Doc fix.
+ Respect a defcustom's :set function, if appropriate. (Bug#109)
+ (eval-defun): Doc fix.
+
+2012-12-08 Juri Linkov <juri@jurta.org>
+
+ * info.el (Info-copy-current-node-name, Info-breadcrumbs)
+ (Info-fontify-node, Info-bookmark-make-record): Remove the
+ file extension from Info-current-file (Bug#13016).
+
+2012-12-07 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * hi-lock.el (hi-lock-unface-buffer): If there's no matching regexp at
+ point, still provide some default.
+ (hi-lock--regexps-at-point): Don't enforce a "hi-lock-" prefix on face
+ names, since we don't use it right now. Actually return the list.
+ (hi-lock-file-patterns, hi-lock-interactive-patterns): Use defvar-local.
+
+2012-12-07 Chong Yidong <cyd@gnu.org>
+
+ * novice.el (disabled-command-function): Remove a spurious help
+ xref (Bug#13043). Suggested by Kelly Dean.
+
+ * subr.el (text-clone-maintain): Fix clone overlay deletion when a
+ syntax is specified (Bug#13025).
+
+ * info.el (Info-set-mode-line): Remove the file extension from
+ Info-current-file if there is one (Bug#13016).
+
+2012-12-07 Glenn Morris <rgm@gnu.org>
+
+ * mail/rmail.el (rmail-mime-decoded): New permanent local.
+ (rmail-show-message-1): Set rmail-mime-decoded when appropriate.
+ * mail/rmailedit.el (rmail-cease-edit): Respect rmail-mbox-format
+ and rmail-mime-decoded. (Bug#9841)
+
+ * mail/unrmail.el (unrmail-mbox-format): New option. (Bug#6574)
+ (batch-unrmail, unrmail): Doc fixes.
+ (unrmail): Respect unrmail-mbox-format.
+ * mail/rmail.el (rmail-mbox-format): New option.
+ (rmail-show-message-1): Respect rmail-mbox-format.
+
+2012-12-07 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/cl-macs.el (cl-tagbody): New macro.
+
+2012-12-06 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ Further cleanup of the "cl-" namespace. Fit CL in 80 columns.
+ * emacs-lisp/cl-macs.el (cl--pop2, cl--optimize-safety)
+ (cl--optimize-speed, cl--not-toplevel, cl--parse-loop-clause)
+ (cl--expand-do-loop, cl--proclaim-history, cl--declare-stack)
+ (cl--do-proclaim, cl--proclaims-deferred): Rename from the "cl-" prefix.
+ (cl-progv): Don't rely on dynamic scoping to find the body.
+ * emacs-lisp/cl-lib.el (cl--optimize-speed, cl--optimize-safety)
+ (cl--proclaims-deferred): Rename from the "cl-" prefix.
+ (cl-declaim): Use backquotes.
+ * emacs-lisp/cl-extra.el (cl-make-random-state, cl-random-state-p):
+ Use "cl--" prefix for the object's tag.
+
+ * ses.el: Use advice-add/remove.
+ (ses--advice-copy-region-as-kill, ses--advice-yank): New functions.
+ (copy-region-as-kill, yank): Use advice-add.
+ (ses-unload-function): Use advice-remove.
+
+2012-12-06 Jonas Bernoulli <jonas@bernoul.li>
+
+ * button.el: Make them work in header-lines (bug#12817).
+ (button-map): Add bindings for header-line and mode-line use.
+ (button-get, button-put, button-label): `button' may now be a string.
+ (button-activate): Don't make it a defsubst.
+ (button--area-button-p, button--area-button-string): New functions.
+ (make-text-button): Fix the return value when `beg' was a string.
+ (push-button): Handle the mode-line case.
+
+2012-12-06 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * progmodes/sql.el: Use cl-lib and lexical-binding; various cleanup.
+ (sql-signum): Remove. Use `cl-signum' instead.
+ (sql-read-passwd): Remove; use read-passwd instread.
+ (sql-get-login-ext): Use read-string.
+ (sql-get-login): Use dolist and pcase.
+ (sql--completion-table): Rename from sql-try-completion.
+ Use complete-with-action.
+ (sql-mode): Don't change abbrev-all-caps globally.
+ (sql-connect): Don't rely on dynamic scoping for `new-name'.
+ (sql-postgres-completion-object): Initialize vars in their `let'.
+ (sql-comint-sybase, sql-comint-sqlite, sql-comint-mysql)
+ (sql-comint-solid, sql-comint-ms, sql-comint-postgres)
+ (sql-comint-interbase): Use a single append, without setq.
+ (sql-comint-linter): Same, and unwind-protect the LINTER_MBX var.
+
+ * hi-lock.el: Rework the default face and the serialize regexp code.
+ (hi-lock--auto-select-face-defaults): Remove.
+ (hi-lock-string-serialize-serial): Remove.
+ (hi-lock--hashcons-hash): Rename from hi-lock-string-serialize-hash;
+ make weak.
+ (hi-lock--hashcons): Rename from hi-lock-string-serialize, return an
+ equal string.
+ (hi-lock-set-pattern): Adjust accordingly.
+ (hi-lock--regexps-at-point): Simplify accordingly.
+ (hi-lock--auto-select-face-defaults): Remove.
+ (hi-lock--last-face): New var to replace it.
+ (hi-lock-read-face-name): Rewrite (bug#11095).
+ (hi-lock-unface-buffer): Arrange for the face to be the next default.
+
+2012-12-06 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp.el (tramp-replace-environment-variables):
+ Hide compiler warning.
+ (tramp-file-name-for-operation): Remove `executable-find',
+ `start-process', `call-process' and `call-process-region'.
+
+ * net/tramp-compat.el (top): Don't require 'tramp-util and 'tramp-vc.
+
+ * net/tramp-gvfs.el (tramp-gvfs-dbus-event-error): Ensure backward
+ compatibility.
+
+ * net/tramp-sh.el (top): Remove `tramp-sh-handle-call-process-region'.
+
2012-12-06 Chong Yidong <cyd@gnu.org>
* ffap.el (ffap-replace-file-component): Fix typo.
-2012-12-05 Stefan Monnier <monnier@iro.umontreal.ca>
+2012-12-06 Stefan Monnier <monnier@iro.umontreal.ca>
* progmodes/octave-mod.el (octave-mark-block): Move out of tokens and
fix open-paren-like token test (bug#12785).
-2012-12-04 Glenn Morris <rgm@gnu.org>
+2012-12-06 Glenn Morris <rgm@gnu.org>
* mail/rmailsum.el (rmail-new-summary): Tweak for
rmail-maybe-display-summary changing buffer. (Bug#13066)
-2012-12-03 Juri Linkov <juri@jurta.org>
+2012-12-06 Juri Linkov <juri@jurta.org>
* info.el (Info-fontify-node): Don't hide the last newline.
(Bug#12272)
-2012-12-01 Leo Liu <sdl.web@gmail.com>
+2012-12-06 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mail/mailabbrev.el (mail-abbrev-expand-wrapper): Work in minibuffer
+ so as to enable message-read-from-minibuffer to expand mail aliases.
+
+2012-12-06 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * minibuf-eldef.el (minibuf-eldef-update-minibuffer): Don't mess with
+ the `intangible' property.
+ Suggested by Christopher Schmidt <christopher@ch.ristopher.com>
+
+2012-12-05 Deniz Dogan <deniz@dogan.se>
+
+ * net/rcirc.el (rcirc-urls): Update documentation.
+ (rcirc-condition-filter): New function.
+ (rcirc-browse-url, rcirc-markup-urls): Use only URLs before point
+ and exclude consecutive duplicate URLs (Bug#6082).
+
+2012-12-05 Michael Albinus <michael.albinus@gmx.de>
+
+ * net/tramp-sh.el (tramp-do-copy-or-rename-file-out-of-band):
+ Check return code of copy command.
+
+ * net/tramp-adb.el (tramp-adb-sdk-dir, tramp-adb-prompt):
+ Use group `tramp'. Add version.
+
+2012-12-05 Chong Yidong <cyd@gnu.org>
+
+ * ffap.el (ffap-url-regexp): Don't require matching at front of
+ string (Bug#4952).
+ (ffap-url-p): If only a substring matches, return that.
+ (ffap-url-at-point): Use the return value of ffap-url-p.
+ (ffap-read-file-or-url, ffap-read-file-or-url-internal)
+ (find-file-at-point, dired-at-point, dired-at-point-prompter)
+ (ffap-guess-file-name-at-point): Likewise.
+ (ffap-replace-file-component): Fix typo.
+
+ * info.el (info-display-manual): Add existing Info buffers, whose
+ files may not be in Info-directory-list, to the completion.
+ (info--manual-names): New helper function.
+
+2012-12-05 Glenn Morris <rgm@gnu.org>
+
+ * vc/vc-hg.el (vc-hg-resolve-when-done, vc-hg-find-file-hook):
+ New functions, for detecting and resolving conflicts. (Bug#10709)
+
+2012-12-04 Jambunathan K <kjambunathan@gmail.com>
+
+ * hi-lock.el (hi-lock-auto-select-face): New user variable.
+ (hi-lock-auto-select-face-defaults): New buffer local variable.
+ (hi-lock-read-face-name): Honor `hi-lock-auto-select-face'.
+ (hi-lock-unface-buffer): Prompt user with useful defaults.
+ With prefix arg, unhighlight all hi-lock patterns in buffer.
+
+2012-12-04 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * obsolete/terminal.el, obsolete/longlines.el: Add obsolecence info.
+
+2012-12-04 Michael Albinus <michael.albinus@gmx.de>
+
+ * Makefile.in (TRAMP_SRC):
+ * makefile.w32-in (TRAMP_SRC): Add tramp-adb.el.
+
+2012-12-04 Juergen Hoetzel <juergen@archlinux.org>
+
+ * net/tramp-adb.el: New package.
+
+2012-12-04 Chong Yidong <cyd@gnu.org>
+
+ * terminal.el: Move to obsolete/.
+
+ * longlines.el: Move to obsolete/.
+
+ * vc/ediff-diff.el (ediff-extract-diffs, ediff-extract-diffs3):
+ Remove code referring to longlines mode.
+
+2012-12-03 Juri Linkov <juri@jurta.org>
+
+ * sort.el (delete-duplicate-lines): New command. (Bug#13032)
+
+2012-12-03 Agustín Martín Domingo <agustin.martin@hispalinux.es>
+
+ * textmodes/ispell.el (ispell-init-process)
+ (ispell-start-process, ispell-internal-change-dictionary):
+ Make sure personal dictionary name is expanded after initial
+ `default-directory' value. Use expanded strings for
+ keep/restart checks and for value (Bug#13019).
+
+2012-12-03 Jay Belanger <jay.p.belanger@gmail.com>
+
+ * calc/calc-forms.el (math-date-to-iso-dt): Fix weekday number.
+
+2012-12-03 Leo Liu <sdl.web@gmail.com>
* files.el (dir-locals-read-from-file): Check file non-empty
before reading. (Bug#13038)
-2012-11-28 Glenn Morris <rgm@gnu.org>
+2012-12-03 Glenn Morris <rgm@gnu.org>
* jka-cmpr-hook.el (jka-compr-get-compression-info):
Remove any version extension before checking filename. (Bug#13006)
(jka-compr-compression-info-list): Belated :version bump.
-2012-11-28 Chong Yidong <cyd@gnu.org>
+2012-12-03 Chong Yidong <cyd@gnu.org>
* simple.el (transient-mark-mode): Doc fix (Bug#11523).
* buff-menu.el (Buffer-menu-delete-backwards, Buffer-menu-mode)
(buffer-menu): Doc fix (Bug#12294).
-2012-11-27 Roland Winkler <winkler@gnu.org>
+2012-12-03 Roland Winkler <winkler@gnu.org>
* calendar/diary-lib.el (diary-header-line-format): Use keybinding
of diary-show-all-entries in the diary buffer (Bug#12994).
-2012-11-27 Michael Albinus <michael.albinus@gmx.de>
+2012-12-03 Michael Albinus <michael.albinus@gmx.de>
* net/tramp-sh.el (tramp-perl-encode): Use "read STDIN" instead of
"<STDIN>". This is binary safe.
+2012-12-03 Jay Belanger <jay.p.belanger@gmail.com>
+
+ * calc/calc-forms.el (math-absolute-from-iso-dt)
+ (math-date-to-iso-dt, math-parse-iso-date-validate)
+ (math-iso-dt-to-date): New functions.
+ (math-fd-iso-dt, math-fd-isoyear, math-fd-isoweek)
+ (math-fd-isoweekday): New variables.
+ (calc-date-notation, math-parse-standard-date, math-format-date)
+ (math-format-date-part): Add support for more formatting codes.
+
+2012-12-02 Dmitry Gutov <dgutov@yandex.ru>
+
+ * vc/vc.el (vc-delete-file, vc-rename-file): Default to the
+ current buffer's file name when called interactively (Bug#12488).
+
+2012-12-02 Juri Linkov <juri@jurta.org>
+
+ * info.el (info-display-manual): Don't clobber an existing Info
+ buffer (Bug#10770). Add completion (Bug#10771).
+
+2012-12-01 Yuya Nishihara <yuya@tcha.org> (tiny change)
+
+ * vc/vc-hooks.el (vc-find-file-hook): Expand buffer-file-truename
+ before using it for comparison (Bug#5297).
+
+2012-12-01 Jari Aalto <jari.aalto@cante.net>
+
+ * textmodes/css-mode.el (css-current-defun-name): New function.
+ (css-mode): Use it.
+
+ * textmodes/sgml-mode.el (html-current-defun-name): New function.
+ (html-mode): Use it.
+
+2012-12-01 Chong Yidong <cyd@gnu.org>
+
+ Modularize add-log-current-defun (Bug#2224).
+ Suggested by Jari Aalto.
+
+ * vc/add-log.el (add-log-current-defun-function): Doc fix.
+ (add-log-current-defun): Move mode-specific code to other files.
+ (add-log-lisp-like-modes, add-log-c-like-modes)
+ (add-log-tex-like-modes): Variables deleted.
+
+ * emacs-lisp/lisp-mode.el (lisp-current-defun-name): New.
+ (lisp-mode-variables): Use it.
+
+ * progmodes/cc-mode.el (c-common-init):
+ * progmodes/cperl-mode.el (cperl-mode): Set a value for
+ add-log-current-defun-function.
+
+ * progmodes/m4-mode.el (m4-current-defun-name): New function.
+ (m4-mode): Use it.
+
+ * progmodes/perl-mode.el (perl-current-defun-name): New.
+ (perl-mode): Use it.
+
+ * progmodes/scheme.el (scheme-mode-variables, dsssl-mode):
+ Use lisp-current-defun-name.
+
+ * textmodes/tex-mode.el (tex-current-defun-name): New.
+ (tex-common-initialization): Use it.
+
+ * textmodes/texinfo.el (texinfo-current-defun-name): New.
+ (texinfo-mode): Use it.
+
+2012-12-01 Chong Yidong <cyd@gnu.org>
+
+ * emacs-lisp/lisp-mode.el (lisp-mode-variables, lisp-mode):
+ * progmodes/autoconf.el (autoconf-mode):
+ * progmodes/js.el (js-mode):
+ * progmodes/make-mode.el (makefile-mode, makefile-makepp-mode)
+ (makefile-bsdmake-mode, makefile-imake-mode, makefile-browse):
+ * progmodes/perl-mode.el (perl-mode):
+ * progmodes/sh-script.el (sh-mode, sh-set-shell):
+ * textmodes/css-mode.el (css-mode):
+ * textmodes/sgml-mode.el (html-mode, sgml-mode)
+ (sgml-tags-invisible, sgml-guess-indent):
+ * textmodes/tex-mode.el (tex-common-initialization)
+ (latex-complete-bibtex-keys, tex-shell, tex-main-file)
+ (doctex-mode, plain-tex-mode, latex-mode):
+ * textmodes/texinfo.el (texinfo-mode): Use setq-local.
+
+2012-12-01 Kirk Kelsey <kirk.kelsey@0x4b.net>
+
+ * vc/vc-hg.el (vc-hg-next-revision):
+ Ensure use of default "tip" output format. (Bug#6968)
+
+2012-12-01 Kim F. Storm <storm@cua.dk>
+
+ * startup.el (fancy-startup-tail): Add a clickable link
+ (Bug#2176).
+
+2012-12-01 Chong Yidong <cyd@gnu.org>
+
+ * startup.el (fancy-startup-tail): Improve the message about
+ auto-save files (Bug#2176).
+
+ * files.el (recover-session): Improve the descriptive message, and
+ use substitute-command-keys.
+
+2012-12-01 Glenn Morris <rgm@gnu.org>
+
+ * ido.el (ido-file-internal):
+ Handle other-window, other-frame for dired. (Bug#13036)
+
+2012-11-30 Glenn Morris <rgm@gnu.org>
+
+ * icomplete.el (icomplete-separator): Fix :version.
+
+2012-11-30 Chong Yidong <cyd@gnu.org>
+
+ * shell.el (shell): For C-u M-x shell, use an inactive shell
+ buffer as the default (Bug#1975).
+ (shell-apply-ansi-color, shell-reapply-ansi-color): New functions.
+ (shell-mode): Use them to reapply ansi colorization if Shell mode
+ is re-enabled.
+
+2012-11-30 Yuriy Vostrikov <delamonpansie@gmail.com> (tiny change)
+
+ * vc/vc-git.el (vc-git-command): Disable the pager (Bug#6137).
+
+2012-11-30 Samuel Bronson <naesten@gmail.com>
+
+ * progmodes/grep.el (grep-compute-defaults): Do not pass the -e
+ flag to xargs, for compatibility with BSD xargs (Bug#11703).
+
+2012-11-30 Toru TSUNEYOSHI <t_tuneyosi@hotmail.com>
+
+ * textmodes/fill.el (fill-region-as-paragraph): Handle overshoot
+ by move-to-column (Bug#3234).
+
+2012-11-30 Chong Yidong <cyd@gnu.org>
+
+ * longlines.el (longlines-wrap-line, longlines-encode-region):
+ Preserve text properties (Bug#1425).
+
+2012-11-30 OKAZAKI Tetsurou <okazaki.tetsurou@gmail.com> (tiny change)
+
+ * vc/vc.el (vc-register): Allow registering a file which is
+ already registered with a different backend (Bug#10589).
+
+2012-11-29 Jambunathan K <kjambunathan@gmail.com>
+ Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * icomplete.el: Change separator; add ido-style commands.
+ (icomplete-show-key-bindings): Remove custom var.
+ (icomplete-get-keys): Remove function.
+ (icomplete-forward-completions, icomplete-backward-completions):
+ New commands.
+ (icomplete-minibuffer-map): New var.
+ (icomplete-minibuffer-setup): Use it.
+ (icomplete-exhibit): Don't delay if the list of completions is known.
+ (icomplete-separator): New custom.
+ (icomplete-completions): Use it.
+ * minibuffer.el (completion-all-sorted-completions): Delete duplicates.
+ (minibuffer-force-complete-and-exit): New command.
+ (minibuffer--complete-and-exit): New function extracted from
+ minibuffer-complete-and-exit.
+ (minibuffer-complete-and-exit): Use it.
+
+ * progmodes/etags.el (visit-tags-table-buffer): Give a more precise
+ error message when the file doesn't exist (bug#12974).
+
+2012-11-29 Kelly Dean <kellydeanch@yahoo.com> (tiny change)
+
+ * simple.el (activate-mark): Run activate-mark-hook (bug#13027).
+
+2012-11-29 Glenn Morris <rgm@gnu.org>
+
+ * files.el (hack-dir-local-variables): Warn if try to set
+ coding via dir-locals, since it doesn't work. (Bug#7169)
+
+ Add desktop support for restoring vc-dir buffers. (Bug#10606)
+ * vc/vc-dir.el (vc-dir-mode): Autoload it (for desktop restore).
+ Set buffer-local value of desktop-save-buffer.
+ (vc-dir-desktop-buffer-misc-data, vc-dir-restore-desktop-buffer):
+ New functions.
+ (desktop-buffer-mode-handlers): Add vc-dir-mode entry.
+ * desktop.el (desktop-save-buffer-p): Treat vc-dir like dired.
+
+ * files.el (inhibit-local-variables-ignore-case): New. (Bug#10610)
+ (inhibit-local-variables-p): Use inhibit-local-variables-ignore-case.
+ Doc fix.
+ (inhibit-local-variables-regexps, inhibit-local-variables-suffixes):
+ Doc fixes.
+
+2012-11-28 Jay Belanger <jay.p.belanger@gmail.com>
+
+ * calc/calc-forms.el (calc-date-notation): Fix regexp
+ used to find time codes. Fix symbol for seconds.
+
+2012-11-27 Glenn Morris <rgm@gnu.org>
+
+ * emacs-lisp/derived.el (derived-mode-make-docstring):
+ Don't mention "abbrev" or "syntax" if nil. (Bug#11277)
+
2012-11-27 Stefan Monnier <monnier@iro.umontreal.ca>
* textmodes/table.el (table-insert): Don't use `symbol-name' on
lexically scoped variables (bug#13005).
-2012-11-26 Glenn Morris <rgm@gnu.org>
+2012-11-27 Glenn Morris <rgm@gnu.org>
* vc/vc-hooks.el (vc-mistrust-permissions):
Default to t, to avoid data-loss. (Bug#11490)
-2012-11-26 Fabián Ezequiel Gallina <fgallina@cuca>
+2012-11-27 Fabián Ezequiel Gallina <fgallina@cuca>
* progmodes/python.el (python-indent-guess-indent-offset):
If indentation is guessed make python-indent-offset buffer-local.
@@ -567,45 +4527,115 @@
Fix forward movement when statement(s) separates point from defun.
(python-imenu-prev-index-position): New function.
-2012-11-26 Eli Zaretskii <eliz@gnu.org>
+2012-11-27 Eli Zaretskii <eliz@gnu.org>
* subr.el (buffer-file-type): Declare with defvar-local. Doc fix.
* dos-w32.el (find-file-not-found-set-buffer-file-coding-system):
Don't set buffer-file-type. Return nil. (Bug#12989)
-2012-11-26 Glenn Morris <rgm@gnu.org>
+2012-11-27 Glenn Morris <rgm@gnu.org>
* hippie-exp.el (hippie-expand-try-functions-list):
Re-autoload it. (Bug#12982)
-2012-11-25 Eli Zaretskii <eliz@gnu.org>
+2012-11-27 Eli Zaretskii <eliz@gnu.org>
* descr-text.el (describe-char-padded-string):
Call internal-char-font only on GUI frames. (Bug#11964)
-2012-11-24 Andreas Schwab <schwab@linux-m68k.org>
+2012-11-27 Andreas Schwab <schwab@linux-m68k.org>
* buff-menu.el (Buffer-menu-buffer+size-width): Fix customize type
and obsoletion message.
-2012-11-24 Stefan Monnier <monnier@iro.umontreal.ca>
+2012-11-27 Stefan Monnier <monnier@iro.umontreal.ca>
* emacs-lisp/cl-macs.el (cl--transform-lambda): Add back `declare' in
the constructs to keep outside of the `cl-block' (bug#12977).
-2012-11-24 Chong Yidong <cyd@gnu.org>
+2012-11-27 Chong Yidong <cyd@gnu.org>
* mouse.el (mouse-drag-line): Even if the line is not draggable,
keep reading until we get the up-event anyway, in order to process
the up-event for mouse-1-click-follows-link (Bug#12971).
-2012-11-23 Stefan Monnier <monnier@iro.umontreal.ca>
+2012-11-26 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/advice.el (ad-should-compile): Don't compile advice if the
+ base function is not yet defined (bug#12965).
+ (ad-activate-advised-definition): Use ad-compile-function.
+ (ad-activate): Use cond.
+
+2012-11-25 Leo Liu <sdl.web@gmail.com>
+
+ * textmodes/sgml-mode.el (sgml-tag): Fix indentation for closing tag.
+ (Bug#12979)
+
+2012-11-24 Vincent Belaïche <vincentb1@users.sourceforge.net>
+
+ * textmodes/reftex-parse.el (reftex-parse-from-file): Use variable
+ reftex-section-info-function in order to be compatible with
+ Texinfo integration.
+
+ * textmodes/reftex.el (reftex-section-pre-regexp)
+ (reftex-section-post-regexp, reftex-section-info-function):
+ New variable.
+ (reftex-compile-variables): Use variables reftex-section-pre-regexp,
+ reftex-section-post-regexp, and reftex-section-info-function in order
+ to be compatible with Texinfo integration.
+
+ * textmodes/reftex-toc.el (reftex-toc-promote-action):
+ use reftex-section-pre-regexp variable in order to be compatible with
+ Texinfo integration.
+
+2012-11-25 Chong Yidong <cyd@gnu.org>
+
+ * faces.el: Make face-spec-set more analogous to setq.
+ (face-spec-set): Change the third arg to specify whether this
+ function is being called via defface, customize, or a third party.
+ Set the appropriate symbol properties. Clear the override spec if
+ setting via Custom. Initialize face if necessary. (Bug#4988)
+ (face-spec-recalc): Allow theme faces to completely replace the
+ defface spec, in the same way as custom faces (Bug#8454).
+
+ * cus-face.el (custom-declare-face): Move face initialization to
+ face-spec-set.
+ (custom-theme-set-faces): Don't initialize the face name here, as
+ that is now done in face-spec-set.
+
+ * cus-edit.el (custom-face-set, custom-face-mark-to-save)
+ (custom-face-reset-saved, custom-face-mark-to-reset-standard):
+ Simplify by using the new arg to face-spec-set.
+
+ * emacs-lisp/lisp-mode.el (eval-defun-1): When evaluating defface,
+ reset face-override-spec too, and use custom-declare-face.
+
+2012-11-24 Jan Djärv <jan.h.d@swipnet.se>
+
+ * term/ns-win.el (ns-initialize-window-system): Move creation of
+ fontsets here (Bug#11964).
+
+2012-11-24 Vincent Belaïche <vincentb1@users.sourceforge.net>
+
+ * ses.el (ses-rename-cell): Correct bug on mode-line update after
+ cell renaming.
+
+2012-11-24 Chong Yidong <cyd@gnu.org>
+
+ * woman.el (woman-default-faces, woman-monochrome-faces): Mark as
+ obsolete.
+
+ * custom.el (custom-theme-set-variables): Use a topological sort
+ for ordering by custom dependencies (Bug#12952).
+ (custom--sort-vars, custom--sort-vars-1): New functions.
+
+2012-11-24 Stefan Monnier <monnier@iro.umontreal.ca>
* emacs-lisp/bytecomp.el (byte-compile-file): Setup default value for
lexical-binding (bug#12938).
-2012-11-23 Wolfgang Jenkner <wjenkner@inode.at>
+2012-11-24 Wolfgang Jenkner <wjenkner@inode.at>
* image-mode.el (image-transform-check-size): Use assertions only
for images of type imagemagick.
@@ -613,11 +4643,11 @@
Otherwise no error, image-transform-fit-to-{width,height} is
silently ignored, as before. Doc fix.
-2012-11-23 Chong Yidong <cyd@gnu.org>
+2012-11-24 Chong Yidong <cyd@gnu.org>
* faces.el (color-defined-p): Doc fix (Bug#12853).
-2012-11-23 Juri Linkov <juri@jurta.org>
+2012-11-24 Juri Linkov <juri@jurta.org>
* dired.el (dired-mark): Add optional arg `interactive'.
Check for `use-region-p' if `interactive' is non-nil.
@@ -625,8 +4655,6 @@
`interactive'. Call `dired-mark' with the arg `interactive'.
(Bug#10624)
-2012-11-23 Juri Linkov <juri@jurta.org>
-
* wdired.el: Revert 2012-10-17 change partly and replace it with
Patch by Christopher Schmidt <christopher@ch.ristopher.com>.
(wdired-finish-edit): Add marks for new file names to
@@ -635,7 +4663,7 @@
(wdired-do-renames): Remove calls to `dired-remove-file',
`dired-add-file', `dired-add-entry'. (Bug#11795)
-2012-11-21 Alan Mackenzie <acm@muc.de>
+2012-11-24 Alan Mackenzie <acm@muc.de>
* progmodes/cc-defs.el (c-version): Bump to 5.32.4.
@@ -654,26 +4682,59 @@
Call c-invalidate-state-cache from `c-before-change' instead of
`c-after-change'.
-2012-11-20 Daniel Colascione <dancol@dancol.org>
+2012-11-23 Chong Yidong <cyd@gnu.org>
- * term/w32-win.el (cygwin-convert-path-from-windows):
- Accomodate rename of cygwin_convert_path* to cygwin_convert_file_name*.
- This change is a backport from trunk.
+ * find-cmd.el (find-constituents): Add executable, ipath,
+ readable, samefile, writable, daystart, regextype (Bug#12856).
+
+2012-11-23 Stefan Monnier <monnier@iro.umontreal.ca>
-2012-11-20 Eli Zaretskii <eliz@gnu.org>
+ * emacs-lisp/ert.el, emacs-lisp/ert-x.el: Use cl-lib and lexical-binding.
- * simple.el (line-move): Don't call line-move-partial if
- scroll-conservatively is in effect. (Bug#12927)
+2012-11-22 Paul Eggert <eggert@cs.ucla.edu>
-2012-11-20 Michael Albinus <michael.albinus@gmx.de>
+ * calc/calc.el (calc-gregorian-switch): Move to after calc-refresh
+ definition. This fixes a bootstrap failure.
+ (calc-gregorian-switch): In menu, put dates before regions.
+ This is easier to follow, lines up better in the menu, and lets us
+ coalesce regions that switch at the same time. Give country
+ names, not "Vatican", as that's better for non-expert users.
+ Use names that are stable between the date of switch and now, e.g.,
+ Bohemia and Moravia (which existed then and now) and not
+ Czechoslovakia (which didn't exist then and doesn't exist now).
+ What is now the U.S. mostly did not switch at the same time as
+ Britain, so omit the U.S. Correct spelling of "Britain".
+ Catholic Switzerland was too much of a mess, so omit it.
- * net/trampver.el (tramp-version): Downgrade to 2.2.6-24.3, in
- order to distinguish from trunk.
+2012-11-22 Jay Belanger <jay.p.belanger@gmail.com>
-2012-11-19 Stefan Monnier <monnier@iro.umontreal.ca>
+ * calc/calc.el (calc-gregorian-switch): Refresh the Calc buffer
+ after the variable is changed.
+
+2012-11-21 Daniel Colascione <dancol@dancol.org>
+
+ * progmodes/sql.el (sql-mode-font-lock-object-name): Support IF NOT EXISTS
+ in SQL declarations for font-lock.
+ (sql-imenu-generic-expression): Teach imenu about IF NOT EXISTS.
- * emacs-lisp/byte-run.el (defun-declarations-alist): Don't accept
- non-symbols for compiler macros (yet).
+2012-11-21 Glenn Morris <rgm@gnu.org>
+
+ * faces.el (face-underline-p, face-inverse-video-p, face-bold-p)
+ (face-italic-p): Add optional argument "inherit".
+
+ * faces.el (set-face-inverse-video, set-face-bold, set-face-italic):
+ Remove -p suffix from names, for consistency with other set-face-*.
+ (set-face-inverse-video): Fix interactive spec.
+ * play/gamegrid.el (gamegrid-make-mono-tty-face):
+ * textmodes/table.el (table--update-cell-face):
+ Use set-face-inverse-video rather than now obsolete alias.
+
+2012-11-21 Eli Zaretskii <eliz@gnu.org>
+
+ * simple.el (line-move): Don't call line-move-partial if
+ scroll-conservatively is in effect. (Bug#12927)
+
+2012-11-21 Stefan Monnier <monnier@iro.umontreal.ca>
* eshell/em-cmpl.el (eshell-pcomplete): Refine fix for bug#12838:
Fallback on completion-at-point rather than
@@ -684,17 +4745,17 @@
* emacs-lisp/ert.el (ert--expand-should-1): Adapt to cl-lib.
-2012-11-19 Michael Albinus <michael.albinus@gmx.de>
+2012-11-21 Michael Albinus <michael.albinus@gmx.de>
* net/tramp-sh.el (tramp-do-copy-or-rename-file): If both files
are remote, check out-of-band property for both.
-2012-11-19 Stefan Monnier <monnier@iro.umontreal.ca>
+2012-11-21 Stefan Monnier <monnier@iro.umontreal.ca>
* window.el (switch-to-buffer): Re-add the warning that was lost in the
code rewrite.
-2012-11-18 Paul Eggert <eggert@cs.ucla.edu>
+2012-11-21 Paul Eggert <eggert@cs.ucla.edu>
More minor time fixes.
* calendar/time-date.el: Commentary fix.
@@ -711,27 +4772,114 @@
* ps-bdf.el (bdf-file-newer-than-time):
Process four-integers time stamps, not two. Doc fixes.
+2012-11-20 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * uniquify.el (uniquify-managed): Use defvar-local.
+ (rename-buffer, create-file-buffer): Advise with advice-add.
+ (uniquify-unload-function): Unadvise accordingly.
+
+ * emacs-lisp/trace.el: Rewrite, use nadvice and lexical-binding.
+ (trace-buffer): Don't purecopy.
+ (trace-entry-message, trace-exit-message): Add `context' arg.
+ (trace--timer): New var.
+ (trace-make-advice): Adjust for use in nadvice.
+ Add `context' argument. Delay `display-buffer' via a timer.
+ (trace-function-internal): Use advice-add.
+ (trace--read-args): New function.
+ (trace-function-foreground, trace-function-background): Use it.
+ (trace-function): Rename to trace-function-foreground and redefine as
+ an alias to that new name.
+ (untrace-function, untrace-all): Adjust to the use of nadvice.
+
+ * emacs-lisp/bytecomp.el (byte-compile): Fix handling of closures.
+
+ * emacs-lisp/byte-run.el (defun-declarations-alist): Fix last change.
+
+ * subr.el (called-interactively-p-functions): New var.
+ (internal--called-interactively-p--get-frame): New macro.
+ (called-interactively-p, interactive-p): Rewrite in Lisp.
+ * emacs-lisp/nadvice.el (advice--called-interactively-skip): New fun.
+ (called-interactively-p-functions): Use it.
+ * emacs-lisp/edebug.el (edebug--called-interactively-skip): New fun.
+ (called-interactively-p-functions): Use it.
+ * allout.el (allout-called-interactively-p): Don't assume
+ called-interactively-p is a subr.
+
+2012-11-20 Glenn Morris <rgm@gnu.org>
+
+ * profiler.el (profiler-report-mode-map): Add a menu.
+ No need to bind `q' because we derive from special-mode.
+ (profiler-report-find-entry): Handle calls from the menu-bar.
+
+2012-11-19 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/byte-run.el (defun-declarations-alist):
+ Allow a compiler-macro to be a lambda expression.
+
+ * progmodes/python.el: Use cl-lib. Move var declarations outside of
+ eval-when-compile.
+ (python-syntax-context): Add compiler-macro.
+ (python-font-lock-keywords): Simplify with De Morgan.
+
+ * vc/diff-mode.el (diff-hunk): Don't make useless timers.
+
+ * files.el (load-file): Require match in minibuffer selection, as was
+ the case in Emacs-20 before we changed the spec to allow .elc files
+ (bug#12935).
+
+ * json.el: Don't require cl since we don't use it.
+ * color.el: Don't require cl.
+ (color-complement): `caddr' -> `nth 2'.
+
+ * calendar/time-date.el (time-to-seconds): De-obsolete.
+
+2012-11-19 Jay Belanger <jay.p.belanger@gmail.com>
+
+ * calc/calc-forms.el (math-leap-year-p): Fix formula for negative
+ year numbers.
+ (math-date-to-julian-dt): Adjust the initial approximation for the
+ year to deal with the new definition of the DATE.
+
+2012-11-19 Daniel Colascione <dancol@dancol.org>
+
+ * term/w32-win.el (cygwin-convert-path-from-windows):
+ Accomodate rename of cygwin_convert_path* to cygwin_convert_file_name*.
+
+2012-11-18 Chong Yidong <cyd@gnu.org>
+
+ * filecache.el (file-cache--read-list): New function.
+ (file-cache-add-directory-list, file-cache-add-file-list)
+ (file-cache-delete-file-list, file-cache-delete-directory-list):
+ Use it to read a list of files or directories (Bug#12846).
+ (file-cache-add-file, file-cache-add-directory)
+ (file-cache-delete-file-list, file-cache-delete-file-regexp)
+ (file-cache-delete-directory): Print an message.
+
+2012-11-18 Jay Belanger <jay.p.belanger@gmail.com>
+
+ * calc/calc-forms.el (math-date-to-dt): Use integer date when
+ calling `math-date-to-julian-dt' and 'math-date-to-gregorian-dt'.
+
2012-11-18 Glenn Morris <rgm@gnu.org>
* image.el (insert-image, insert-sliced-image): Doc fix.
-2012-11-17 Chong Yidong <cyd@gnu.org>
+2012-11-18 Chong Yidong <cyd@gnu.org>
* emacs-lisp/syntax.el (syntax-propertize-function): Doc fix
(Bug#12810).
-2012-11-17 OKAZAKI Tetsurou <okazaki.tetsurou@gmail.com> (tiny change)
+2012-11-18 OKAZAKI Tetsurou <okazaki.tetsurou@gmail.com> (tiny change)
* vc/vc-svn.el (vc-svn-merge-news): Properly parse the merge
response when the target file is in a subdirectory (Bug#12757).
-2012-11-17 Chong Yidong <cyd@gnu.org>
+2012-11-18 Chong Yidong <cyd@gnu.org>
* filecache.el (file-cache-add-file-list): Doc fix (Bug#12694).
-2012-11-17 Glenn Morris <rgm@gnu.org>
+2012-11-18 Glenn Morris <rgm@gnu.org>
- * woman.el (woman-non-underline-faces):
* emacs-lisp/cl-lib.el (face-underline-p):
Use set-face-underline rather than the alias set-face-underline-p.
@@ -739,8 +4887,94 @@
* subr.el (with-output-to-temp-buffer):
Add doc xref to with-temp-buffer-window.
+2012-11-18 Juanma Barranquero <lekktu@gmail.com>
+
+ * woman.el (woman-non-underline-faces): Use `set-face-underline'.
+ * calc/calc.el (math-format-date-cache): Declare.
+
+2012-11-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ Calc by default uses the Gregorian calendar for all dates (Bug#12633).
+ It also uses January 1, 1 AD as its day number 1.
+ * calc/calc-forms.el (math-julian-date-beginning)
+ (math-julian-date-beginning-int): Implement this.
+
+2012-11-17 Juanma Barranquero <lekktu@gmail.com>
+
+ * descr-text.el (quail-find-key):
+ * dired.el (desktop-file-name):
+ * dirtrack.el (shell-prefixed-directory-name, shell-process-cd):
+ * generic-x.el (comint-mode, comint-exec):
+ * image-dired.el (widget-forward):
+ * info.el (speedbar-add-expansion-list, speedbar-center-buffer-smartly)
+ (speedbar-change-expand-button-char)
+ (speedbar-change-initial-expansion-list, speedbar-delete-subblock)
+ (speedbar-make-specialized-keymap, speedbar-make-tag-line):
+ * printing.el (easy-menu-add-item, easy-menu-remove-item)
+ (widget-field-action, widget-value-set):
+ * speedbar.el (imenu--make-index-alist):
+ * term.el (ring-empty-p, ring-ref, ring-insert-at-beginning)
+ (ring-length, ring-insert):
+ * vcursor.el (compare-windows-skip-whitespace):
+ * woman.el (dired-get-filename):
+ Declare functions.
+
+ * term/w32-win.el (cygwin-convert-path-from-windows): Fix declaration.
+
+2012-11-17 Jay Belanger <jay.p.belanger@gmail.com>
+
+ * calc/calc.el (calc-gregorian-switch): New variable.
+
+ * calc/calc-forms.el (math-day-in-year, math-dt-before-p)
+ (math-absolute-from-gregorian-dt, math-absolute-from-julian-dt)
+ (math-date-to-julian-dt, math-date-to-gregorian-dt): New functions.
+ (math-leap-year-p): Add option to distinguish between Julian
+ and Gregorian calendars.
+ (math-day-number): Use `math-day-in-year' to do the computations.
+ (math-absolute-from-dt): Rename from `math-absolute-from-date'.
+ Use `math-absolute-from-gregorian' and `math-absolute-from-julian'
+ to do the computations.
+ (math-date-to-dt): Use `math-date-to-julian-dt' and
+ `math-date-to-gregorian-dt' to do the computations.
+ (calcFunc-weekday, math-format-date-part): Use the new version of
+ the DATE to determine the weekday.
+ (calcFunc-newmonth, calcFunc-newyear): Use `calc-gregorian-switch'
+ when necessary.
+
+2012-11-17 Eli Zaretskii <eliz@gnu.org>
+
+ * term/w32-win.el (w32-handle-dropped-file): Use 'file://' only on
+ Cygwin; otherwise use 'file:'. (Bug#12914)
+ (cygwin-convert-path-from-windows): Declare, to avoid
+ byte-compiler warnings.
+
+2012-11-17 Andreas Politz <politza@fh-trier.de>
+
+ * ibuffer.el (ibuffer-mark-forward, ibuffer-unmark-forward)
+ (ibuffer-unmark-backward, ibuffer-mark-interactive): Support plain
+ prefix and negative numeric prefix args (Bug#12795).
+
+2012-11-17 Stephen Berman <stephen.berman@gmx.net>
+
+ * play/gamegrid.el (gamegrid-add-score-with-update-game-score-1):
+ Don't signal an error with a score that is too low to add to the
+ list of top scores. (Bug#12779)
+
+2012-11-17 Chong Yidong <cyd@gnu.org>
+
+ * help-mode.el (help-xref-interned): End on point-min (Bug#12737).
+
+ * filecache.el (file-cache-add-file): Handle relative file name in
+ the argument (Bug#12694).
+
+2012-11-16 Jürgen Hötzel <juergen@archlinux.org> (tiny change)
+
+ * eshell/em-unix.el (eshell/mkdir): Handle "--parents" (bug#12897).
+
2012-11-16 Stefan Monnier <monnier@iro.umontreal.ca>
+ * emacs-lisp/advice.el (ad-make-advised-definition): Improve last fix.
+
* emacs-lisp/cl-lib.el: Set more meaningful version number.
2012-11-16 Martin Rudalics <rudalics@gmx.at>
@@ -763,15 +4997,15 @@
* faces.el (face-underline-p): Use face-attribute-specified-or.
-2012-11-15 Juanma Barranquero <lekktu@gmail.com>
+2012-11-16 Juanma Barranquero <lekktu@gmail.com>
* emacs-lisp/cl-macs.el (cl-loop, cl-do, cl-do*): Doc fixes.
-2012-11-15 Stefan Monnier <monnier@iro.umontreal.ca>
+2012-11-16 Stefan Monnier <monnier@iro.umontreal.ca>
* emacs-lisp/cl-macs.el (cl-flet, cl-flet*): Fix docstring (bug#12895).
-2012-11-15 Glenn Morris <rgm@gnu.org>
+2012-11-16 Glenn Morris <rgm@gnu.org>
* eshell/em-cmpl.el (eshell-pcomplete): New command. (Bug#12838)
(eshell-cmpl-initialize): Bind eshell-pcomplete to TAB, C-i.
@@ -787,39 +5021,162 @@
* term.el (ansi-term): Don't let C-x escape-char binding
clobber the more standard C-c binding. (Bug#12842)
-2012-11-15 Stefan Monnier <monnier@iro.umontreal.ca>
-
- * emacs-lisp/gv.el (setf): Fix debug spec for multiple assignments
- (bug#12879).
-
-2012-11-14 Glenn Morris <rgm@gnu.org>
-
* subr.el (set-temporary-overlay-map): Doc fix.
-2012-11-13 Martin Rudalics <rudalics@gmx.at>
+2012-11-16 Martin Rudalics <rudalics@gmx.at>
* window.el (record-window-buffer)
(display-buffer-record-window): When copying the markers to
window-point preserve window-point-insertion-type. (Bug#12588)
-2012-11-13 Glenn Morris <rgm@gnu.org>
+2012-11-16 Glenn Morris <rgm@gnu.org>
* emacs-lisp/eieio-datadebug.el (eieio-debug-methodinvoke):
* net/tramp-gvfs.el (tramp-gvfs-dbus-event-error):
Use new names for hooks rather than obsolete aliases.
-2012-11-12 Stefan Monnier <monnier@iro.umontreal.ca>
+2012-11-15 Daniel Colascione <dancol@dancol.org>
+
+ * term/w32-win.el (w32-handle-dropped-file): Use a "file://"
+ prefix instead of "file:" so that when FILE-NAME begins with "//",
+ as it does when the target file is on a network share, url-handler
+ isn't confused.
+
+2012-11-15 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/advice.el (ad-definition-type): Make sure we don't use
+ a preactivated advice from an old advice.el; they're not compatible!
+
+2012-11-15 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * emacs-lisp/nadvice.el (advice--make-interactive-form):
+ Fix string-spec case.
+
+ * emacs-lisp/advice.el (ad-make-advised-definition): Fix undefined case.
+
+2012-11-15 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/nadvice.el: Add buffer-local support to add-function.
+ (advice--buffer-local-function-sample): New var.
+ (advice--set-buffer-local, advice--buffer-local): New functions.
+ (add-function, remove-function): Use them.
+
+2012-11-15 Drew Adams <drew.adams@oracle.com>
+
+ * imenu.el (imenu--split-submenus): Use imenu--subalist-p (bug#12717).
+
+2012-11-15 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/cl-macs.el (cl--transform-lambda): Defend against
+ potential binding of print-gensym to t, and prettify (back)quotes in
+ case they appear in args's default values (bug#12884).
+
+2012-11-14 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/nadvice.el: Add around advice for interactive specs.
+ (advice-eval-interactive-spec): New function.
+ (advice--make-interactive-form): Support around advice (bug#12844).
+
+2012-11-14 Dmitry Gutov <dgutov@yandex.ru>
+
+ * progmodes/ruby-mode.el (ruby-expr-beg): Make heredoc detection
+ more strict. Add docstring.
+ (ruby-expression-expansion-re): Extract from
+ `ruby-match-expression-expansion'.
+ (ruby-syntax-propertize-function): After everything else, search
+ for expansions in string literals, mark their insides as
+ whitespace syntax and save match data for font-lock.
+ (ruby-font-lock-keywords): Use the 2nd group from expression
+ expansion matches.
+ (ruby-match-expression-expansion): Use the match data saved to the
+ text property in ruby-syntax-propertize-function.
+
+2012-11-14 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/gv.el (setf): Fix debug spec for multiple assignments
+ (bug#12879).
+
+2012-11-13 Dmitry Gutov <dgutov@yandex.ru>
+
+ * progmodes/ruby-mode.el (ruby-move-to-block): Looks for a block
+ start/end keyword a bit harder. Works with different values of N.
+ Add more comments.
+ (ruby-end-of-block): Update accordingly.
+
+2012-11-13 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * woman.el (woman-file-name): Don't mess with unread-command-events
+ (bug#12861).
+
+ * emacs-lisp/advice.el: Layer on top of nadvice.el.
+ Remove out of date self-require hack.
+ (ad-do-advised-functions): Use simple `dolist'.
+ (ad-advice-name, ad-advice-protected, ad-advice-enabled)
+ (ad-advice-definition): Redefine as functions.
+ (ad-advice-classes): Move before first use.
+ (ad-make-origname, ad-set-orig-definition, ad-clear-orig-definition)
+ (ad-make-mapped-call, ad-make-advised-docstring,ad-make-plain-docstring)
+ (ad--defalias-fset): Remove functions.
+ (ad-make-advicefunname, ad-clear-advicefunname-definition): New funs.
+ (ad-get-orig-definition): Rewrite.
+ (ad-make-advised-definition-docstring): Change base docstring.
+ (ad-real-orig-definition): Rewrite.
+ (ad-map-arglists): Change name of called function.
+ (ad--make-advised-docstring): Redirect `function' from ad-Advice-...
+ (ad-make-advised-definition): Simplify.
+ (ad-assemble-advised-definition): Tweak for new calling context.
+ (ad-activate-advised-definition): Setup ad-Advice-* i.s.o ad-Orig-*.
+ (ad--defalias-fset): Rename from ad-handle-definition. Make it set the
+ function and call ad-activate if needed.
+ (ad-activate, ad-deactivate): Don't call ad-handle-definition any more.
+ (ad-recover): Clear ad-Advice-* instead of ad-Orig-*.
+ (ad-compile-function): Compile ad-Advice-*.
+ (ad-activate-on-top-level, ad-with-auto-activation-disabled): Remove.
+ (ad-start-advice, ad-stop-advice): Remove.
+
+2012-11-13 Dmitry Gutov <dgutov@yandex.ru>
+
+ * progmodes/ruby-mode.el (ruby-add-log-current-method): Print the
+ period before class method names, not after. Remove handling of
+ one impossible case. Add comments.
+
+2012-11-13 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/advice.el: Remove support for freezing.
+ (ad-make-freeze-docstring, ad-make-freeze-definition): Remove functions.
+ (ad-make-single-advice-docstring, ad-defadvice-flags, defadvice):
+ Remove support for `freeze'.
+
+ * emacs-lisp/cl.el (dolist, dotimes, declare): Use advice-add to
+ override the default.
+ * emacs-lisp/cl-macs.el (cl-dolist, cl-dotimes): Rewrite without using
+ cl--dotimes/dolist.
+ * subr.el (dolist, dotimes, declare): Redefine them normally, even when
+ `cl' is loaded.
+
+ * emacs-lisp/nadvice.el (advice--normalize): New function, extracted
+ from add-advice.
+ (advice--strip-macro): New function.
+ (advice--defalias-fset): Use them to handle macros.
+ (advice-add): Use them.
+ (advice-member-p): Correctly handle macros.
+
+2012-11-13 Dmitry Gutov <dgutov@yandex.ru>
+
+ * progmodes/ruby-mode.el (ruby-font-lock-keywords):
+ Never font-lock the beginning of singleton class as heredoc.
+
+2012-11-13 Stefan Monnier <monnier@iro.umontreal.ca>
* emacs-lisp/gv.el (gv-define-simple-setter): One more fix (bug#12871).
-2012-11-12 Wolfgang Jenkner <wjenkner@inode.at>
+2012-11-13 Wolfgang Jenkner <wjenkner@inode.at>
* ansi-color.el (ansi-color-apply-sequence): Implement SGR codes
- 39 and 49. This fixes bug#12792. Also, treat unimplemented
- parameters as 0, thereby restoring the behavior of revisions prior
- to 2012-08-15T03:33:55Z!monnier@iro.umontreal.ca.
+ 39 and 49 (bug#12792). Also, treat unimplemented parameters as 0,
+ thereby restoring the behavior of revisions prior to 2012-08-15T03:33:55Z!monnier@iro.umontreal.ca.
-2012-11-12 Fabián Ezequiel Gallina <fgallina@cuca>
+2012-11-13 Fabián Ezequiel Gallina <fgallina@cuca>
Fix end-of-defun misbehavior.
* progmodes/python.el (python-nav-beginning-of-defun): Rename from
@@ -831,19 +5188,19 @@
with new fixed python-nav-{end,beginning}-of-defun. Stop scanning
parent defuns as soon as possible.
-2012-11-12 Glenn Morris <rgm@gnu.org>
+2012-11-13 Glenn Morris <rgm@gnu.org>
* progmodes/flymake.el (flymake-error-bitmap)
(flymake-warning-bitmap, flymake-fringe-indicator-position): Doc fixes.
(flymake-error-bitmap, flymake-warning-bitmap): Fix :types.
-2012-11-12 Dmitry Gutov <dgutov@yandex.ru>
+2012-11-13 Dmitry Gutov <dgutov@yandex.ru>
* progmodes/ruby-mode.el (ruby-move-to-block): When moving
backward, always stop at indentation. Reverts the change from
2012-08-12T22:06:56Z!monnier@iro.umontreal.ca (Bug#12851).
-2012-11-11 Glenn Morris <rgm@gnu.org>
+2012-11-13 Glenn Morris <rgm@gnu.org>
* ibuffer.el (ibuffer-mode-map, ibuffer-mode):
Add ibuffer-filter-by-derived-mode.
@@ -859,13 +5216,51 @@
* window.el (fit-frame-to-buffer, fit-frame-to-buffer-bottom-margin):
* emacs-lisp/debug.el (debugger-bury-or-kill): Fix :version.
-2012-11-10 Leo Liu <sdl.web@gmail.com>
+2012-11-12 Stefan Monnier <monnier@iro.umontreal.ca>
- * ido.el (ido-set-matches-1): Fix split-string args to avoid
- performance issue. (Bug#12796)
+ * emacs-lisp/nadvice.el: New package.
+ * subr.el (special-form-p): New function.
+ * emacs-lisp/elp.el: Use lexical-binding and advice-add.
+ (elp-all-instrumented-list): Remove var.
+ (elp-not-profilable): Remove elp-wrapper.
+ (elp-profilable-p): Use autoloadp and special-form-p.
+ (elp--advice-name): New const.
+ (elp-instrument-function): Use advice-add.
+ (elp--instrumented-p): New predicate.
+ (elp-restore-function): Use advice-remove.
+ (elp-restore-all, elp-reset-all): Use mapatoms.
+ (elp-set-master): Use elp--instrumented-p.
+ (elp--make-wrapper): Rename from elp-wrapper, return a function
+ suitable for advice-add. Use cl-inf.
+ (elp-results): Use mapatoms+elp--instrumented-p.
+ * emacs-lisp/debug.el: Use lexical-binding and advice-add.
+ (debug-function-list): Remove var.
+ (debug): Rename arg, and then let-bind it explicitly inside.
+ (debugger-setup-buffer): Rename arg.
+ (debugger-setup-buffer): Adjust counts to new debug-on-entry setup.
+ (debugger-frame-number): Adjust to new debug-on-entry setup.
+ (debug--implement-debug-on-entry): Rename from
+ implement-debug-on-entry, add argument.
+ (debugger-special-form-p): Remove, use special-form-p instead.
+ (debug-on-entry): Use advice-add.
+ (debug--function-list): New function.
+ (cancel-debug-on-entry): Use it, along with advice-remove.
+ (debug-arglist, debug-convert-byte-code, debug-on-entry-1): Remove.
+ (debugger-list-functions): Use debug--function-list instead of
+ debug-function-list.
+ * emacs-lisp/advice.el (ad-save-real-definition): Remove, unused.
+ (ad-special-form-p): Remove, use special-form-p instead.
+ (ad-set-advice-info): Use add-function and remove-function.
+ (ad--defalias-fset): Adjust accordingly.
2012-11-10 Glenn Morris <rgm@gnu.org>
+ * mail/emacsbug.el (report-emacs-bug-tracker-url)
+ (report-emacs-bug-bug-alist, report-emacs-bug-choice-widget)
+ (report-emacs-bug-create-existing-bugs-buffer)
+ (report-emacs-bug-parse-query-results)
+ (report-emacs-bug-query-existing-bugs): Remove. (Bug#7449)
+
* term.el (term-default-fg-color, term-default-bg-color):
Make obsolete, rather than just saying "deprecated" in the doc.
@@ -874,46 +5269,42 @@
(term-default-fg-color, term-default-bg-color, term-ansi-reset):
Update all users.
-2012-11-09 Jan Djärv <jan.h.d@swipnet.se>
-
- * server.el (server-create-window-system-frame): Improve comment.
-
-2012-11-08 Jan Djärv <jan.h.d@swipnet.se>
+2012-11-10 Jan Djärv <jan.h.d@swipnet.se>
* server.el (server-create-window-system-frame): Handle Nextstep
specially (Bug#12780).
-2012-11-08 Glenn Morris <rgm@gnu.org>
+2012-11-10 Glenn Morris <rgm@gnu.org>
* mail/emacsbug.el (report-emacs-bug-query-existing-bugs):
Unautoload, and make obsolete. (Bug#7449)
-2012-11-08 Chong Yidong <cyd@gnu.org>
+2012-11-10 Chong Yidong <cyd@gnu.org>
* vc/diff-mode.el (diff-delete-trailing-whitespace): Rewrite, and
rename from diff-remove-trailing-whitespace (Bug#12831).
-2012-11-08 Stefan Monnier <monnier@iro.umontreal.ca>
+2012-11-10 Stefan Monnier <monnier@iro.umontreal.ca>
* emacs-lisp/advice.el: Require `cl-lib' at run-time to fix
miscompilation of trace.el.
-2012-11-08 Glenn Morris <rgm@gnu.org>
+2012-11-10 Glenn Morris <rgm@gnu.org>
* vc/diff-mode.el (diff-remove-trailing-whitespace): Doc fix.
-2012-11-08 Stefan Monnier <monnier@iro.umontreal.ca>
+2012-11-10 Stefan Monnier <monnier@iro.umontreal.ca>
* emacs-lisp/gv.el (gv-define-simple-setter): Fix last change
(bug#12812).
-2012-11-07 Chong Yidong <cyd@gnu.org>
+2012-11-10 Chong Yidong <cyd@gnu.org>
* minibuf-eldef.el (minibuffer-eldef-shorten-default): Convert to
a defcustom with an appropriate :set function.
(minibuffer-default--in-prompt-regexps): New function.
-2012-11-07 Glenn Morris <rgm@gnu.org>
+2012-11-10 Glenn Morris <rgm@gnu.org>
* emacs-lisp/cl.el (define-setf-expander, defsetf)
(define-modify-macro): Doc fixes.
@@ -921,7 +5312,7 @@
* emacs-lisp/gv.el (gv-letplace): Fix doc typo.
(gv-define-simple-setter): Update doc of `fix-return'.
-2012-11-07 Stefan Monnier <monnier@iro.umontreal.ca>
+2012-11-10 Stefan Monnier <monnier@iro.umontreal.ca>
* emacs-lisp/gv.el (gv-define-simple-setter): Don't evaluate `val'
twice when `fix-return' is set (bug#12813).
@@ -929,17 +5320,13 @@
* emacs-lisp/cl.el (defsetf): Pass the third arg to
gv-define-simple-setter (bug#12812).
-2012-11-06 Stefan Monnier <monnier@iro.umontreal.ca>
-
* woman.el (woman-decode-region): Disable adaptive-fill when rendering
(bug#12756).
-2012-11-06 Glenn Morris <rgm@gnu.org>
+2012-11-10 Glenn Morris <rgm@gnu.org>
* emacs-lisp/gv.el (gv-define-setter): Fix doc typo.
-2012-11-05 Glenn Morris <rgm@gnu.org>
-
* emacs-lisp/cl-extra.el (cl-prettyexpand):
* emacs-lisp/cl-lib.el (cl-proclaim, cl-declaim):
* emacs-lisp/cl-macs.el (cl-destructuring-bind, cl-locally)
@@ -947,6 +5334,178 @@
* emacs-lisp/cl-extra.el (cl-maplist, cl-mapcan): Doc fix.
+2012-11-10 Leo Liu <sdl.web@gmail.com>
+
+ * ido.el (ido-set-matches-1): Improve flex matching performance by
+ removing backtracking in the regexp (suggested by Stefan). (Bug#12796)
+
+2012-11-09 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/advice.el (ad-set-advice-info): Set defalias-fset-function.
+ (ad--defalias-fset): New function.
+ (ad-safe-fset): Remove.
+ (ad-make-freeze-definition): Use cl-letf*.
+
+2012-11-09 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * subr.el (dolist): Don't bind VAR in RESULT.
+
+ * emacs-lisp/advice.el: Miscellaneous cleanup. Use lexical-binding.
+ (fset, documentation): Don't save real def since we don't advise.
+ (ad-do-advised-functions): Remove problematic `result-form'.
+ (ad-safe-fset): `ad-real-fset' => `fset'.
+ (ad-read-advised-function): Don't assume that ad-do-advised-functions
+ uses CL's dolist internally.
+ (ad-arglist): Remove unused arg `name'.
+ (ad-docstring, ad-make-advised-docstring):
+ `ad-real-documentation' => `documentation'.
+ (warning-suppress-types): Declare.
+ (ad-set-arguments): Simple CSE.
+ (ad-recover-normality): Sanity check.
+
+ * emacs-lisp/bytecomp.el (byte-compile-out-toplevel): Don't turn
+ (funcall '(lambda ..) ..) into ((lambda ..) ..).
+
+2012-11-09 Vincent Belaïche <vincentb1@users.sourceforge.net>
+
+ * ses.el: symbol to coordinate mapping is made by symbol property
+ `ses-cell'. This means that the same mapping is done for all SES
+ sheets. That is good enough for cells with standard A1 names, but
+ not for named cell. So a hash map is added for the latter.
+ (defconst ses-localvars): Add local variable ses--named-cell-hashmap
+ (ses-sym-rowcol): Use hashmap for named cell.
+ (ses-is-cell-sym-p): New defun.
+ (ses-decode-cell-symbol): New defun.
+ (ses-create-cell-variable): Add cell to hashmap when name is not
+ A1-like.
+ (ses-rename-cell): Check that cell new name is not already in
+ spreadsheet with the use of ses-is-cell-sym-p
+ (ses-rename-cell): Use hash map for named cells, but accept also
+ renaming back to A1-like.
+
+2012-11-09 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/advice.el: Use new dynamic docstrings.
+ (ad-make-advised-definition-docstring, ad-advised-definition-p):
+ Use dynamic-docstring-function instead of ad-advice-info.
+ (ad--make-advised-docstring): New function extracted from
+ ad-make-advised-docstring.
+ (ad-make-advised-docstring): Use it.
+ * progmodes/sql.el (sql--make-help-docstring): New function, extracted
+ from sql-help.
+ (sql-help): Use it with dynamic-docstring-function.
+
+ * env.el (env--substitute-vars-regexp): Don't use rx (for bootstrap).
+
+2012-11-08 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * files.el (hack-one-local-variable--obsolete): New function.
+ (hack-one-local-variable): Use it for obsolete settings.
+
+ * subr.el (locate-user-emacs-file): If both old and new name exist, use
+ the new name.
+
+ * progmodes/js.el (js--filling-paragraph): New var.
+ (c-forward-sws, c-backward-sws, c-beginning-of-macro): Advise.
+ (js-c-fill-paragraph): Prefer advice to cl-letf so the rebinding is
+ less sneaky.
+
+2012-11-08 Julien Danjou <julien@danjou.info>
+
+ * progmodes/ruby-mode.el (auto-mode-alist): Add Rakefile in
+ `auto-mode-alist' (Bug#12835).
+
+2012-11-08 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * progmodes/perl-mode.el (perl-prettify-symbols): New defcustom.
+ (perl--prettify-symbols-alist): New const.
+ (perl--font-lock-compose-symbol, perl--font-lock-symbols-keywords):
+ New functions.
+ (perl-font-lock-keywords-2): Use them.
+ (perl-electric-noindent-p): New function.
+ (perl-mode): Use it to set up electric-indent-mode.
+ (perl-electric-terminator, perl-indent-command): Mark obsolete.
+ (perl-mode-map): Remove bindings for them.
+ (perl-imenu-generic-expression, perl-outline-level):
+ Match functions&packages in column>0.
+
+ * env.el (env--substitute-vars-regexp): New const.
+ (substitute-env-vars): Use it. Add `only-defined' arg.
+ * net/tramp.el (tramp-replace-environment-variables): Use it.
+
+ * emacs-lisp/bytecomp.el (byte-compile-initial-macro-environment):
+ Byte-compile *before* eval in eval-and-compile.
+ (byte-compile-log-warning): Remove redundant inhibit-read-only.
+ (byte-compile-file-form-autoload): Don't hide actual definition.
+ (byte-compile-maybe-guarded): Accept `functionp' as well.
+
+ * emacs-lisp/gv.el (gv-ref, gv-deref): New function and macro.
+
+2012-11-07 Michael Albinus <michael.albinus@gmx.de>
+
+ * notifications.el (notifications-get-server-information-method):
+ New defconst.
+ (notifications-get-capabilities): Fix docstring.
+ (notifications-get-server-information): New defun.
+
+2012-11-06 Agustín Martín Domingo <agustin.martin@hispalinux.es>
+
+ * textmodes/ispell.el (ispell-region): Standard re-indent for better
+ readability.
+
+ * textmodes/ispell.el: Experimental support for support debugging.
+ (ispell-create-debug-buffer): Create a `ispell-debug-buffer' debug
+ buffer for ispell.
+ (ispell-print-if-debug): New function to print stuff to
+ `ispell-debug-buffer' if debugging is enabled.
+ (ispell-region, ispell-process-line): Use `ispell-print-if-debug' to
+ show some debugging info.
+ (ispell-buffer-with-debug): New function that creates a debugging
+ buffer and calls `ispell-buffer' with debugging enabled.
+
+ * textmodes/ispell.el (ispell-region): Do not prefix sent string by
+ comment in autoconf mode. (Bug#12768)
+
+2012-11-06 Dmitry Antipov <dmantipov@yandex.ru>
+
+ * emacs-lisp/byte-opt.el (toplevel): Add compare-window-configurations,
+ frame-first-window, frame-root-window, frame-selected-window,
+ minibuffer-selected-window, minibuffer-window,
+ window-absolute-pixel-edges, window-at, window-body-height,
+ window-body-width, window-display-table, window-combination-limit,
+ window-frame, window-fringes, window-inside-absolute-pixel-edges,
+ window-inside-edges, window-inside-pixel-edges, window-left-child,
+ window-left-column, window-margins, window-next-buffers,
+ window-next-sibling, window-new-normal, window-new-total,
+ window-normal-size, window-parameter, window-parameters, window-parent,
+ window-pixel-edges, window-point, window-prev-buffers,
+ window-prev-sibling, window-redisplay-end-trigger, window-scroll-bars,
+ window-start, window-text-height, window-top-child, window-top-line,
+ window-total-height, window-total-width and window-use-time to the list
+ of functions without side-effects.
+ (toplevel): Add window-valid-p to the list of error-free functions
+ without side-effects.
+
+2012-11-05 Agustín Martín Domingo <agustin.martin@hispalinux.es>
+
+ * textmodes/ispell.el (ispell-program-name):
+ Update spellchecker parameters when customized.
+
+2012-11-04 Glenn Morris <rgm@gnu.org>
+
+ * vc/vc-svn.el (vc-svn-state-heuristic): Avoid calling svn. (Bug#7850)
+
+2012-11-04 Chong Yidong <cyd@gnu.org>
+
+ * bookmark.el (bookmark-bmenu-switch-other-window): Avoid binding
+ same-window-* variables.
+
+2012-11-04 Juri Linkov <juri@jurta.org>
+
+ * isearch.el (isearch-help-for-help, isearch-describe-bindings)
+ (isearch-describe-key, isearch-describe-mode): Use a display
+ action instead of binding same-window-* variables (Bug#10040).
+
2012-11-03 Glenn Morris <rgm@gnu.org>
* emacs-lisp/cl-macs.el (cl-parse-loop-clause):
@@ -970,6 +5529,28 @@
* window.el (switch-to-visible-buffer)
(switch-to-buffer-preserve-window-point): Fix doc-strings.
+2012-11-03 Glenn Morris <rgm@gnu.org>
+
+ * emacs-lisp/cl-lib.el (cl--random-time):
+ Rename from cl-random-time. (Bug#12773)
+ (cl--gensym-counter, cl--random-state): Update callers.
+ * emacs-lisp/cl-extra.el (cl-make-random-state): Update callers.
+
+2012-11-03 Chong Yidong <cyd@gnu.org>
+
+ * cus-start.el: Make cursor-type customizable (Bug#11633).
+
+2012-11-02 Glenn Morris <rgm@gnu.org>
+
+ * filecache.el: No need to load find-lisp when compiling.
+ (find-lisp-find-files): Autoload it.
+ (file-cache-add-directory-recursively): Don't require find-lisp.
+
+ * image.el (image-type-from-file-name): Trivial simplification.
+
+ * emacs-lisp/bytecomp.el (byte-compile-eval):
+ Decouple "noruntime" and "cl-functions" warnings.
+
2012-11-01 Stephen Berman <stephen.berman@gmx.net>
* play/gomoku.el (gomoku-display-statistics): Update mode line
@@ -1302,7 +5883,7 @@
2012-10-19 Stefan Monnier <monnier@iro.umontreal.ca>
* minibuffer.el (minibuffer-force-complete): Make the next completion use
- the same completion-field (bug@12221).
+ the same completion-field (bug#12221).
2012-10-19 Martin Rudalics <rudalics@gmx.at>
@@ -1339,7 +5920,7 @@
Recover input meta mode when the new coding system doesn not use 8-bit.
Supply TERMINAL arg to set-input-meta-mode.
-2012-10-17 Michael Heerdegen <michael_heerdegen@web.de>
+2012-10-17 Michael Heerdegen <michael_heerdegen@web.de>
* wdired.el (wdired-old-marks): New variable.
(wdired-change-to-wdired-mode): Locally set wdired-old-marks.
@@ -1621,7 +6202,7 @@
* term/ns-win.el (ns-read-file-name): Update declaration to match
nsfns.m.
- (ns-respond-to-change-font): Change fontsize separatly so we are sure
+ (ns-respond-to-change-font): Change fontsize separately so we are sure
it is set when font is acted upon.
2012-10-07 Fabián Ezequiel Gallina <fgallina@cuca>
@@ -10200,7 +14781,7 @@
2012-03-16 Alan Mackenzie <acm@muc.de>
- Further optimise the handling of large macros.
+ Further optimize the handling of large macros.
* progmodes/cc-engine.el (c-crosses-statement-barrier-p): Use a
limit to a call of `c-literal-limits'.
@@ -11468,7 +16049,7 @@
* dynamic-setting.el (font-setting-change-default-font): Don't
change the default face if SET-FONT argument is non-nil (Bug#9982).
-2012-01-29 Samuel Bronson <naesten@gmail.com> (tiny change)
+2012-01-29 Samuel Bronson <naesten@gmail.com>
* custom.el (defcustom): Add doc link to Lisp manual (Bug#10635).
@@ -11852,7 +16433,7 @@
2012-01-08 Alan Mackenzie <acm@muc.de>
- Optimise font locking in long enum definitions.
+ Optimize font locking in long enum definitions.
* progmodes/cc-fonts.el (c-font-lock-declarations): Add an extra
arm to a cond form to handle enums.
diff --git a/lisp/ChangeLog.10 b/lisp/ChangeLog.10
index 641ab617043..2d331a2819d 100644
--- a/lisp/ChangeLog.10
+++ b/lisp/ChangeLog.10
@@ -19493,7 +19493,7 @@
* menu-bar.el (menu-bar-showhide-scroll-bar-menu):
Quote `window-system'.
- * tmm.el (tmm-get-keymap): Honour :visible in `menu-item'.
+ * tmm.el (tmm-get-keymap): Honor :visible in `menu-item'.
Add Keywords header. Update Commentary section.
Update copyright notice.
diff --git a/lisp/ChangeLog.15 b/lisp/ChangeLog.15
index 43ab3f8617d..4d0ff9a40e2 100644
--- a/lisp/ChangeLog.15
+++ b/lisp/ChangeLog.15
@@ -324,7 +324,7 @@
(ert-run-tests-batch, ert--print-test-for-ewoc):
Handle `ert-test-quit'.
-2011-03-03 David Abrahams <dave@boostpro.com> (tiny change)
+2011-03-03 David Abrahams <dave@boostpro.com>
* vc/ediff-init.el (ediff-use-faces, ediff-highlight-all-diffs):
Move ediff-defvar-local calls after defcustoms. (Bug#1821)
@@ -7979,7 +7979,7 @@
Remember the buffers at head, rather than their name.
* iswitchb.el (iswitchb-kill-buffer): Re-make the list.
-2010-08-22 Kirk Kelsey <kirk.kelsey@0x4b.net> (tiny change)
+2010-08-22 Kirk Kelsey <kirk.kelsey@0x4b.net>
Stefan Monnier <monnier@iro.umontreal.ca>
* progmodes/make-mode.el (makefile-fill-paragraph): Account for the
@@ -13597,7 +13597,7 @@
* textmodes/artist.el (artist-compute-popup-menu-table):
Remove duplicated words in doc-strings.
-2010-01-15 David Abrahams <dave@boostpro.com> (tiny change)
+2010-01-15 David Abrahams <dave@boostpro.com>
* net/mairix.el (mairix-widget-send-query): Send -1 instead of nil
to mairix-search to suppress threading (Bug#5342).
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index d8a91461bfe..c8707df15df 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -377,12 +377,12 @@ $(MH_E_DIR)/mh-loaddefs.el: $(MH_E_SRC)
# an own subdirectory. OTOH, it does not hurt to keep them in
# lisp/net.
TRAMP_DIR = $(lisp)/net
-TRAMP_SRC = $(TRAMP_DIR)/tramp.el $(TRAMP_DIR)/tramp-cache.el \
- $(TRAMP_DIR)/tramp-cmds.el $(TRAMP_DIR)/tramp-compat.el \
- $(TRAMP_DIR)/tramp-ftp.el $(TRAMP_DIR)/tramp-gvfs.el \
- $(TRAMP_DIR)/tramp-gw.el $(TRAMP_DIR)/tramp-sh.el \
- $(TRAMP_DIR)/tramp-smb.el $(TRAMP_DIR)/tramp-uu.el \
- $(TRAMP_DIR)/trampver.el
+TRAMP_SRC = $(TRAMP_DIR)/tramp.el $(TRAMP_DIR)/tramp-adb.el \
+ $(TRAMP_DIR)/tramp-cache.el $(TRAMP_DIR)/tramp-cmds.el \
+ $(TRAMP_DIR)/tramp-compat.el $(TRAMP_DIR)/tramp-ftp.el \
+ $(TRAMP_DIR)/tramp-gvfs.el $(TRAMP_DIR)/tramp-gw.el \
+ $(TRAMP_DIR)/tramp-sh.el $(TRAMP_DIR)/tramp-smb.el \
+ $(TRAMP_DIR)/tramp-uu.el $(TRAMP_DIR)/trampver.el
$(TRAMP_DIR)/tramp-loaddefs.el: $(TRAMP_SRC)
$(emacs) -l autoload \
@@ -433,7 +433,7 @@ bootstrap-clean:
cd $(lisp); rm -f *.elc */*.elc */*/*.elc */*/*/*.elc $(AUTOGENEL)
distclean:
- -rm -f ./Makefile
+ -rm -f ./Makefile $(lisp)/loaddefs.el~
maintainer-clean: distclean bootstrap-clean
diff --git a/lisp/abbrev.el b/lisp/abbrev.el
index bd09653103f..27cd7089a07 100644
--- a/lisp/abbrev.el
+++ b/lisp/abbrev.el
@@ -532,7 +532,7 @@ This is the first thing that `expand-abbrev' does, and so this may change
the current abbrev table before abbrev lookup happens."
:type 'hook
:group 'abbrev-mode)
-(make-obsolete-variable 'pre-abbrev-expand-hook 'abbrev-expand-functions "23.1")
+(make-obsolete-variable 'pre-abbrev-expand-hook 'abbrev-expand-function "23.1")
(defun clear-abbrev-table (table)
"Undefine all abbrevs in abbrev table TABLE, leaving it empty."
@@ -669,6 +669,26 @@ either a single abbrev table or a list of abbrev tables."
tables))))
+(defun abbrev--symbol (abbrev table)
+ "Return the symbol representing abbrev named ABBREV in TABLE.
+This symbol's name is ABBREV, but it is not the canonical symbol of that name;
+it is interned in the abbrev-table TABLE rather than the normal obarray.
+The value is nil if that abbrev is not defined."
+ (let* ((case-fold (not (abbrev-table-get table :case-fixed)))
+ ;; In case the table doesn't set :case-fixed but some of the
+ ;; abbrevs do, we have to be careful.
+ (sym
+ ;; First try without case-folding.
+ (or (intern-soft abbrev table)
+ (when case-fold
+ ;; We didn't find any abbrev, try case-folding.
+ (let ((sym (intern-soft (downcase abbrev) table)))
+ ;; Only use it if it doesn't require :case-fixed.
+ (and sym (not (abbrev-get sym :case-fixed))
+ sym))))))
+ (if (symbol-value sym)
+ sym)))
+
(defun abbrev-symbol (abbrev &optional table)
"Return the symbol representing abbrev named ABBREV.
This symbol's name is ABBREV, but it is not the canonical symbol of that name;
@@ -678,23 +698,11 @@ Optional second arg TABLE is abbrev table to look it up in.
The default is to try buffer's mode-specific abbrev table, then global table."
(let ((tables (abbrev--active-tables table))
sym)
- (while (and tables (not (symbol-value sym)))
- (let* ((table (pop tables))
- (case-fold (not (abbrev-table-get table :case-fixed))))
+ (while (and tables (not sym))
+ (let* ((table (pop tables)))
(setq tables (append (abbrev-table-get table :parents) tables))
- ;; In case the table doesn't set :case-fixed but some of the
- ;; abbrevs do, we have to be careful.
- (setq sym
- ;; First try without case-folding.
- (or (intern-soft abbrev table)
- (when case-fold
- ;; We didn't find any abbrev, try case-folding.
- (let ((sym (intern-soft (downcase abbrev) table)))
- ;; Only use it if it doesn't require :case-fixed.
- (and sym (not (abbrev-get sym :case-fixed))
- sym)))))))
- (if (symbol-value sym)
- sym)))
+ (setq sym (abbrev--symbol abbrev table))))
+ sym))
(defun abbrev-expansion (abbrev &optional table)
@@ -748,7 +756,7 @@ then ABBREV is looked up in that table only."
(setq start (match-beginning 1))
(setq end (match-end 1)))))
(setq name (buffer-substring start end))
- (let ((abbrev (abbrev-symbol name table)))
+ (let ((abbrev (abbrev--symbol name table)))
(when abbrev
(setq enable-fun (abbrev-get abbrev :enable-function))
(and (or (not enable-fun) (funcall enable-fun))
@@ -824,10 +832,12 @@ see `define-abbrev' for details."
value))
(defvar abbrev-expand-functions nil
- "Wrapper hook around `expand-abbrev'.
-The functions on this special hook are called with one argument:
-a function that performs the abbrev expansion. It should return
-the abbrev symbol if expansion took place.")
+ "Wrapper hook around `expand-abbrev'.")
+(make-obsolete-variable 'abbrev-expand-functions 'abbrev-expand-function "24.4")
+
+(defvar abbrev-expand-function #'abbrev--default-expand
+ "Function to perform abbrev expansion.
+Takes no argument and should return the abbrev symbol if expansion took place.")
(defun expand-abbrev ()
"Expand the abbrev before point, if there is an abbrev there.
@@ -836,6 +846,9 @@ Returns the abbrev symbol, if expansion took place. (The actual
return value is that of `abbrev-insert'.)"
(interactive)
(run-hooks 'pre-abbrev-expand-hook)
+ (funcall abbrev-expand-function))
+
+(defun abbrev--default-expand ()
(with-wrapper-hook abbrev-expand-functions ()
(pcase-let ((`(,sym ,name ,wordstart ,wordend) (abbrev--before-point)))
(when sym
diff --git a/lisp/allout.el b/lisp/allout.el
index 22e4d0bc59c..9ca72514fd2 100644
--- a/lisp/allout.el
+++ b/lisp/allout.el
@@ -1657,10 +1657,9 @@ and the place for the cursor after the decryption is done."
(defmacro allout-called-interactively-p ()
"A version of `called-interactively-p' independent of Emacs version."
;; ... to ease maintenance of allout without betraying deprecation.
- (if (equal (subr-arity (symbol-function 'called-interactively-p))
- '(0 . 0))
- '(called-interactively-p)
- '(called-interactively-p 'interactive)))
+ (if (ignore-errors (called-interactively-p 'interactive) t)
+ '(called-interactively-p 'interactive)
+ '(called-interactively-p)))
;;;_ = allout-inhibit-aberrance-doublecheck nil
;; In some exceptional moments, disparate topic depths need to be allowed
;; momentarily, eg when one topic is being yanked into another and they're
diff --git a/lisp/apropos.el b/lisp/apropos.el
index 5f481f54e57..000d2d87d05 100644
--- a/lisp/apropos.el
+++ b/lisp/apropos.el
@@ -69,7 +69,7 @@
"Non nil means apropos commands will search more extensively.
This may be slower. This option affects the following commands:
-`apropos-variable' will search all variables, not just user variables.
+`apropos-user-option' will search all variables, not just user options.
`apropos-command' will also search non-interactive functions.
`apropos' will search all symbols, not just functions, variables, faces,
and those with property lists.
@@ -115,6 +115,12 @@ include key-binding information in its output."
:group 'apropos
:version "24.3")
+(defface apropos-user-option-button
+ '((t (:inherit (font-lock-variable-name-face button))))
+ "Button face indicating a user option in Apropos."
+ :group 'apropos
+ :version "24.4")
+
(defface apropos-misc-button
'((t (:inherit (font-lock-constant-face button))))
"Button face indicating a miscellaneous object type in Apropos."
@@ -261,6 +267,15 @@ term, and the rest of the words are alternative terms.")
'action (lambda (button)
(describe-variable (button-get button 'apropos-symbol))))
+(define-button-type 'apropos-user-option
+ 'apropos-label "User option"
+ 'apropos-short-label "o"
+ 'face 'apropos-user-option-button
+ 'help-echo "mouse-2, RET: Display more help on this user option"
+ 'follow-link t
+ 'action (lambda (button)
+ (describe-variable (button-get button 'apropos-symbol))))
+
(define-button-type 'apropos-face
'apropos-label "Face"
'apropos-short-label "F"
@@ -461,15 +476,15 @@ This requires that at least 2 keywords (unless only one was given)."
This is used to decide whether to print the result's type or not.")
;;;###autoload
-(defun apropos-variable (pattern &optional do-all)
- "Show user variables that match PATTERN.
+(defun apropos-user-option (pattern &optional do-all)
+ "Show user options that match PATTERN.
PATTERN can be a word, a list of words (separated by spaces),
or a regexp (using some regexp special characters). If it is a word,
search for matches for that word as a substring. If it is a list of words,
search for matches for any two (or more) of those words.
With \\[universal-argument] prefix, or if `apropos-do-all' is non-nil, also show
-normal variables."
+variables, not just user options."
(interactive (list (apropos-read-pattern
(if (or current-prefix-arg apropos-do-all)
"variable" "user option"))
@@ -481,6 +496,17 @@ normal variables."
(get symbol 'variable-documentation)))
'custom-variable-p)))
+;;;###autoload
+(defun apropos-variable (pattern &optional do-not-all)
+ "Show variables that match PATTERN.
+When DO-NOT-ALL is not-nil, show user options only, i.e. behave
+like `apropos-user-option'."
+ (interactive (list (apropos-read-pattern
+ (if current-prefix-arg "user option" "variable"))
+ current-prefix-arg))
+ (let ((apropos-do-all (if do-not-all nil t)))
+ (apropos-user-option pattern)))
+
;; For auld lang syne:
;;;###autoload
(defalias 'command-apropos 'apropos-command)
@@ -1099,7 +1125,11 @@ If non-nil TEXT is a string that will be printed as a heading."
'apropos-macro
'apropos-function))
(not nosubst))
- (apropos-print-doc 3 'apropos-variable (not nosubst))
+ (apropos-print-doc 3
+ (if (custom-variable-p symbol)
+ 'apropos-user-option
+ 'apropos-variable)
+ (not nosubst))
(apropos-print-doc 7 'apropos-group t)
(apropos-print-doc 6 'apropos-face t)
(apropos-print-doc 5 'apropos-widget t)
diff --git a/lisp/arc-mode.el b/lisp/arc-mode.el
index 8849fb85244..4fc04b706b5 100644
--- a/lisp/arc-mode.el
+++ b/lisp/arc-mode.el
@@ -975,11 +975,6 @@ using `make-temp-file', and the generated name is returned."
(save-excursion
(funcall set-auto-coding-function
filename (- (point-max) (point-min)))))
- ;; dos-w32.el defines the function
- ;; find-buffer-file-type-coding-system for DOS/Windows
- ;; systems which preserves the coding-system of existing files.
- ;; (That function is called via file-coding-system-alist.)
- ;; Here, we want it to act as if the extracted file existed.
;; The following let-binding of file-name-handler-alist forces
;; find-file-not-found-set-buffer-file-coding-system to ignore
;; the file's name (see dos-w32.el).
diff --git a/lisp/autorevert.el b/lisp/autorevert.el
index f491f2427be..02a99ce98e7 100644
--- a/lisp/autorevert.el
+++ b/lisp/autorevert.el
@@ -39,8 +39,11 @@
;; Auto-Revert Mode applies to all file buffers. (If the user option
;; `global-auto-revert-non-file-buffers' is non-nil, it also applies
;; to some non-file buffers. This option is disabled by default.)
-;; Since checking a remote file is too slow, these modes do not check
-;; or revert remote files.
+;;
+;; Since checking a remote file is slow, these modes check or revert
+;; remote files only if the user option `auto-revert-remote-files' is
+;; non-nil. It is recommended to disable version control for remote
+;; files.
;;
;; Both modes operate by checking the time stamp of all files at
;; intervals of `auto-revert-interval'. The default is every five
@@ -48,6 +51,13 @@
;; Emacs. You should never even notice that this package is active
;; (except that your buffers will be reverted, of course).
;;
+;; If Emacs is compiled with file notification support, notifications
+;; are used instead of checking the time stamp of the files. You can
+;; disable this by setting the user option `auto-revert-use-notify' to
+;; nil. Alternatively, a regular expression of directories to be
+;; excluded from file notifications can be specified by
+;; `auto-revert-notify-exclude-dir-regexp'.
+;;
;; After reverting a file buffer, Auto Revert Mode normally puts point
;; at the same position that a regular manual revert would. However,
;; there is one exception to this rule. If point is at the end of the
@@ -65,7 +75,6 @@
;; change by growing at the end. It only appends the new output,
;; instead of reverting the entire buffer. It does so even if the
;; buffer contains unsaved changes. (Because they will not be lost.)
-;; Auto Revert Tail Mode works also for remote files.
;; Usage:
;;
@@ -92,6 +101,7 @@
;; Dependencies:
+(eval-when-compile (require 'cl-lib))
(require 'timer)
;; Custom Group:
@@ -254,6 +264,45 @@ buffers. CPU usage depends on the version control system."
This variable becomes buffer local when set in any fashion.")
(make-variable-buffer-local 'global-auto-revert-ignore-buffer)
+(defcustom auto-revert-remote-files nil
+ "If non-nil remote files are also reverted."
+ :group 'auto-revert
+ :type 'boolean
+ :version "24.4")
+
+(defconst auto-revert-notify-enabled
+ (or (featurep 'inotify) (featurep 'w32notify))
+ "Non-nil when Emacs has been compiled with file notification support.")
+
+(defcustom auto-revert-use-notify auto-revert-notify-enabled
+ "If non-nil Auto Revert Mode uses file notification functions.
+This requires Emacs being compiled with file notification
+support (see `auto-revert-notify-enabled'). You should set this
+variable through Custom."
+ :group 'auto-revert
+ :type 'boolean
+ :set (lambda (variable value)
+ (set-default variable (and auto-revert-notify-enabled value))
+ (unless (symbol-value variable)
+ (when auto-revert-notify-enabled
+ (dolist (buf (buffer-list))
+ (with-current-buffer buf
+ (when (symbol-value 'auto-revert-notify-watch-descriptor)
+ (auto-revert-notify-rm-watch)))))))
+ :initialize 'custom-initialize-default
+ :version "24.4")
+
+(defcustom auto-revert-notify-exclude-dir-regexp
+ (concat
+ ;; No mounted file systems.
+ "^" (regexp-opt '("/afs/" "/media/" "/mnt" "/net/" "/tmp_mnt/"))
+ ;; No remote files.
+ (unless auto-revert-remote-files "\\|^/[^/|:][^/|]+:"))
+ "Regular expression of directories to be excluded from file notifications."
+ :group 'auto-revert
+ :type 'regexp
+ :version "24.4")
+
;; Internal variables:
(defvar auto-revert-buffer-list ()
@@ -276,6 +325,23 @@ the list of old buffers.")
(set (make-local-variable 'auto-revert-tail-pos)
(nth 7 (file-attributes buffer-file-name)))))
+(defvar auto-revert-notify-watch-descriptor-hash-list
+ (make-hash-table :test 'equal)
+ "A hash table collecting all file watch descriptors.
+Hash key is a watch descriptor, hash value is a list of buffers
+which are related to files being watched and carrying the same
+default directory.")
+
+(defvar auto-revert-notify-watch-descriptor nil
+ "The file watch descriptor active for the current buffer.")
+(make-variable-buffer-local 'auto-revert-notify-watch-descriptor)
+(put 'auto-revert-notify-watch-descriptor 'permanent-local t)
+
+(defvar auto-revert-notify-modified-p nil
+ "Non-nil when file has been modified on the file system.
+This has been reported by a file notification event.")
+(make-variable-buffer-local 'auto-revert-notify-modified-p)
+
;; Functions:
;;;###autoload
@@ -296,12 +362,14 @@ without being changed in the part that is already in the buffer."
(if auto-revert-mode
(if (not (memq (current-buffer) auto-revert-buffer-list))
(push (current-buffer) auto-revert-buffer-list))
+ (when auto-revert-use-notify (auto-revert-notify-rm-watch))
(setq auto-revert-buffer-list
(delq (current-buffer) auto-revert-buffer-list)))
(auto-revert-set-timer)
(when auto-revert-mode
- (auto-revert-buffers)
- (setq auto-revert-tail-mode nil)))
+ (let (auto-revert-use-notify)
+ (auto-revert-buffers)
+ (setq auto-revert-tail-mode nil))))
;;;###autoload
@@ -355,7 +423,8 @@ Use `auto-revert-mode' for changes other than appends!"
(y-or-n-p "File changed on disk, content may be missing. \
Perform a full revert? ")
;; Use this (not just revert-buffer) for point-preservation.
- (auto-revert-handler))
+ (let (auto-revert-use-notify)
+ (auto-revert-handler)))
;; else we might reappend our own end when we save
(add-hook 'before-save-hook (lambda () (auto-revert-tail-mode 0)) nil t)
(or (local-variable-p 'auto-revert-tail-pos) ; don't lose prior position
@@ -399,9 +468,13 @@ It displays the text that `global-auto-revert-mode-text'
specifies in the mode line."
:global t :group 'auto-revert :lighter global-auto-revert-mode-text
(auto-revert-set-timer)
- (when global-auto-revert-mode
- (auto-revert-buffers)))
-
+ (if global-auto-revert-mode
+ (let (auto-revert-use-notify)
+ (auto-revert-buffers))
+ (dolist (buf (buffer-list))
+ (with-current-buffer buf
+ (when auto-revert-use-notify
+ (auto-revert-notify-rm-watch))))))
(defun auto-revert-set-timer ()
"Restart or cancel the timer used by Auto-Revert Mode.
@@ -418,6 +491,109 @@ will use an up-to-date value of `auto-revert-interval'"
auto-revert-interval
'auto-revert-buffers))))
+(defun auto-revert-notify-rm-watch ()
+ "Disable file notification for current buffer's associated file."
+ (when auto-revert-notify-watch-descriptor
+ (maphash
+ (lambda (key value)
+ (when (equal key auto-revert-notify-watch-descriptor)
+ (setq value (delete (current-buffer) value))
+ (if value
+ (puthash key value auto-revert-notify-watch-descriptor-hash-list)
+ (remhash key auto-revert-notify-watch-descriptor-hash-list)
+ (ignore-errors
+ (funcall (if (fboundp 'inotify-rm-watch)
+ 'inotify-rm-watch 'w32notify-rm-watch)
+ auto-revert-notify-watch-descriptor)))))
+ auto-revert-notify-watch-descriptor-hash-list)
+ (remove-hook 'kill-buffer-hook 'auto-revert-notify-rm-watch))
+ (setq auto-revert-notify-watch-descriptor nil
+ auto-revert-notify-modified-p nil))
+
+(defun auto-revert-notify-add-watch ()
+ "Enable file notification for current buffer's associated file."
+ (when (string-match auto-revert-notify-exclude-dir-regexp
+ (expand-file-name default-directory))
+ ;; Fallback to file checks.
+ (set (make-local-variable 'auto-revert-use-notify) nil))
+
+ (when (and buffer-file-name auto-revert-use-notify
+ (not auto-revert-notify-watch-descriptor))
+ (let ((func (if (fboundp 'inotify-add-watch)
+ 'inotify-add-watch 'w32notify-add-watch))
+ (aspect (if (fboundp 'inotify-add-watch)
+ '(create modify moved-to) '(size last-write-time)))
+ (file (if (fboundp 'inotify-add-watch)
+ (directory-file-name (expand-file-name default-directory))
+ (buffer-file-name))))
+ (setq auto-revert-notify-watch-descriptor
+ (ignore-errors
+ (funcall func file aspect 'auto-revert-notify-handler)))
+ (if auto-revert-notify-watch-descriptor
+ (progn
+ (puthash
+ auto-revert-notify-watch-descriptor
+ (cons (current-buffer)
+ (gethash auto-revert-notify-watch-descriptor
+ auto-revert-notify-watch-descriptor-hash-list))
+ auto-revert-notify-watch-descriptor-hash-list)
+ (add-hook (make-local-variable 'kill-buffer-hook)
+ 'auto-revert-notify-rm-watch))
+ ;; Fallback to file checks.
+ (set (make-local-variable 'auto-revert-use-notify) nil)))))
+
+(defun auto-revert-notify-event-p (event)
+ "Check that event is a file notification event."
+ (cond ((featurep 'inotify)
+ (and (listp event) (= (length event) 4)))
+ ((featurep 'w32notify)
+ (and (listp event) (= (length event) 3) (stringp (nth 2 event))))))
+
+(defun auto-revert-notify-event-descriptor (event)
+ "Return watch descriptor of file notification event, or nil."
+ (and (auto-revert-notify-event-p event) (car event)))
+
+(defun auto-revert-notify-event-action (event)
+ "Return action of file notification event, or nil."
+ (and (auto-revert-notify-event-p event) (nth 1 event)))
+
+(defun auto-revert-notify-event-file-name (event)
+ "Return file name of file notification event, or nil."
+ (and (auto-revert-notify-event-p event)
+ (cond ((featurep 'inotify) (nth 3 event))
+ ((featurep 'w32notify) (nth 2 event)))))
+
+(defun auto-revert-notify-handler (event)
+ "Handle an event returned from file notification."
+ (when (auto-revert-notify-event-p event)
+ (let* ((descriptor (auto-revert-notify-event-descriptor event))
+ (action (auto-revert-notify-event-action event))
+ (file (auto-revert-notify-event-file-name event))
+ (buffers (gethash descriptor
+ auto-revert-notify-watch-descriptor-hash-list)))
+ (ignore-errors
+ ;; Check, that event is meant for us.
+ ;; TODO: Filter events which stop watching, like `move' or `removed'.
+ (cl-assert descriptor)
+ (when (featurep 'inotify)
+ (cl-assert (or (memq 'create action)
+ (memq 'modify action)
+ (memq 'moved-to action))))
+ (when (featurep 'w32notify) (cl-assert (eq 'modified action)))
+ ;; Since we watch a directory, a file name must be returned.
+ (cl-assert (stringp file))
+ (dolist (buffer buffers)
+ (when (buffer-live-p buffer)
+ (with-current-buffer buffer
+ (when (and (stringp buffer-file-name)
+ (string-equal
+ (file-name-nondirectory file)
+ (file-name-nondirectory buffer-file-name)))
+ ;; Mark buffer modified.
+ (setq auto-revert-notify-modified-p t)
+ ;; No need to check other buffers.
+ (cl-return)))))))))
+
(defun auto-revert-active-p ()
"Check if auto-revert is active (in current buffer or globally)."
(or auto-revert-mode
@@ -433,20 +609,23 @@ will use an up-to-date value of `auto-revert-interval'"
This is an internal function used by Auto-Revert Mode."
(when (or auto-revert-tail-mode (not (buffer-modified-p)))
(let* ((buffer (current-buffer)) size
+ ;; Tramp caches the file attributes. Setting
+ ;; `remote-file-name-inhibit-cache' forces Tramp to reread
+ ;; the values.
+ (remote-file-name-inhibit-cache t)
(revert
(or (and buffer-file-name
+ (or auto-revert-remote-files
+ (not (file-remote-p buffer-file-name)))
+ (or (not auto-revert-use-notify)
+ auto-revert-notify-modified-p)
(if auto-revert-tail-mode
- ;; Tramp caches the file attributes. Setting
- ;; `remote-file-name-inhibit-cache' forces Tramp
- ;; to reread the values.
- (let ((remote-file-name-inhibit-cache t))
- (and (file-readable-p buffer-file-name)
- (/= auto-revert-tail-pos
- (setq size
- (nth 7 (file-attributes
- buffer-file-name))))))
- (and (not (file-remote-p buffer-file-name))
- (file-readable-p buffer-file-name)
+ (and (file-readable-p buffer-file-name)
+ (/= auto-revert-tail-pos
+ (setq size
+ (nth 7 (file-attributes
+ buffer-file-name)))))
+ (and (file-readable-p buffer-file-name)
(not (verify-visited-file-modtime buffer)))))
(and (or auto-revert-mode
global-auto-revert-non-file-buffers)
@@ -455,6 +634,7 @@ This is an internal function used by Auto-Revert Mode."
(functionp buffer-stale-function)
(funcall buffer-stale-function t))))
eob eoblist)
+ (setq auto-revert-notify-modified-p nil)
(when revert
(when (and auto-revert-verbose
(not (eq revert 'fast)))
@@ -561,7 +741,12 @@ the timer when no buffers need to be checked."
(memq buf auto-revert-buffer-list))
(setq auto-revert-buffer-list
(delq buf auto-revert-buffer-list)))
- (when (auto-revert-active-p) (auto-revert-handler)))
+ (when (auto-revert-active-p)
+ ;; Enable file notification.
+ (when (and auto-revert-use-notify buffer-file-name
+ (not auto-revert-notify-watch-descriptor))
+ (auto-revert-notify-add-watch))
+ (auto-revert-handler)))
;; Remove dead buffer from `auto-revert-buffer-list'.
(setq auto-revert-buffer-list
(delq buf auto-revert-buffer-list))))
diff --git a/lisp/battery.el b/lisp/battery.el
index 696b1214652..d4e4d8b3a31 100644
--- a/lisp/battery.el
+++ b/lisp/battery.el
@@ -1,4 +1,4 @@
-;;; battery.el --- display battery status information -*- coding: iso-8859-1 -*-
+;;; battery.el --- display battery status information -*- coding: utf-8 -*-
;; Copyright (C) 1997-1998, 2000-2013 Free Software Foundation, Inc.
@@ -53,6 +53,9 @@
(directory-files "/sys/class/power_supply/" nil
battery--linux-sysfs-regexp))
'battery-linux-sysfs)
+ ((and (eq system-type 'berkeley-unix)
+ (file-executable-p "/usr/sbin/apm"))
+ 'battery-bsd-apm)
((and (eq system-type 'darwin)
(condition-case nil
(with-temp-buffer
@@ -113,7 +116,7 @@ string are substituted as defined by the current value of the variable
(defcustom battery-mode-line-format
(cond ((eq battery-status-function 'battery-linux-proc-acpi)
- "[%b%p%%,%d°C]")
+ "[%b%p%%,%d°C]")
(battery-status-function
"[%b%p%%]"))
"Control string formatting the string to display in the mode line.
@@ -523,6 +526,75 @@ The following %-sequences are provided:
"AC"
"BAT")
"N/A")))))
+
+
+;;; `apm' interface for BSD.
+(defun battery-bsd-apm ()
+ "Get APM status information from BSD apm binary.
+The following %-sequences are provided:
+%L AC line status (verbose)
+%B Battery status (verbose)
+%b Battery status, empty means high, `-' means low,
+ `!' means critical, and `+' means charging
+%P Advanced power saving mode state (verbose)
+%p Battery charge percentage
+%s Remaining battery charge time in seconds
+%m Remaining battery charge time in minutes
+%h Remaining battery charge time in hours
+%t Remaining battery charge time in the form `h:min'"
+ (let* ((os-name (car (split-string
+ (shell-command-to-string "/usr/bin/uname"))))
+ (apm-flag (if (equal os-name "OpenBSD") "P" "s"))
+ (apm-cmd (concat "/usr/sbin/apm -ablm" apm-flag))
+ (apm-output (split-string (shell-command-to-string apm-cmd)))
+ ;; Battery status
+ (battery-status
+ (let ((stat (string-to-number (nth 0 apm-output))))
+ (cond ((eq stat 0) '("high" . ""))
+ ((eq stat 1) '("low" . "-"))
+ ((eq stat 2) '("critical" . "!"))
+ ((eq stat 3) '("charging" . "+"))
+ ((eq stat 4) '("absent" . nil)))))
+ ;; Battery percentage
+ (battery-percentage (nth 1 apm-output))
+ ;; Battery life
+ (battery-life (nth 2 apm-output))
+ ;; AC status
+ (line-status
+ (let ((ac (string-to-number (nth 3 apm-output))))
+ (cond ((eq ac 0) "disconnected")
+ ((eq ac 1) "connected")
+ ((eq ac 2) "backup power"))))
+ ;; Advanced power savings mode
+ (apm-mode
+ (let ((apm (string-to-number (nth 4 apm-output))))
+ (if (string= os-name "OpenBSD")
+ (cond ((eq apm 0) "manual")
+ ((eq apm 1) "automatic")
+ ((eq apm 2) "cool running"))
+ (if (eq apm 1) "on" "off"))))
+ seconds minutes hours remaining-time)
+ (unless (member battery-life '("unknown" "-1"))
+ (if (member os-name '("OpenBSD" "NetBSD"))
+ (setq minutes (string-to-number battery-life)
+ seconds (* 60 minutes))
+ (setq seconds (string-to-number battery-life)
+ minutes (truncate (/ seconds 60))))
+ (setq hours (truncate (/ minutes 60))
+ remaining-time (format "%d:%02d" hours
+ (- minutes (* 60 hours)))))
+ (list (cons ?L (or line-status "N/A"))
+ (cons ?B (or (car battery-status) "N/A"))
+ (cons ?b (or (cdr battery-status) "N/A"))
+ (cons ?p (if (string= battery-percentage "255")
+ "N/A"
+ battery-percentage))
+ (cons ?P (or apm-mode "N/A"))
+ (cons ?s (or (and seconds (number-to-string seconds)) "N/A"))
+ (cons ?m (or (and minutes (number-to-string minutes)) "N/A"))
+ (cons ?h (or (and hours (number-to-string hours)) "N/A"))
+ (cons ?t (or remaining-time "N/A")))))
+
;;; `pmset' interface for Darwin (OS X).
diff --git a/lisp/bindings.el b/lisp/bindings.el
index 5c95bcd0baa..fe0eabb77af 100644
--- a/lisp/bindings.el
+++ b/lisp/bindings.el
@@ -675,7 +675,7 @@ language you are using."
(garbage-collect)
-(setq help-event-list '(help f1))
+(setq help-event-list '(help f1 ?\?))
(make-variable-buffer-local 'minor-mode-overriding-map-alist)
diff --git a/lisp/bookmark.el b/lisp/bookmark.el
index 9ee3ff65b57..482cdf92752 100644
--- a/lisp/bookmark.el
+++ b/lisp/bookmark.el
@@ -129,9 +129,15 @@ recently set ones come first, oldest ones come last)."
:type 'boolean
:group 'bookmark)
+(defcustom bookmark-bmenu-use-header-line t
+ "Non-nil means to use an immovable header line, as opposed to inline
+text at the top of the buffer."
+ :type 'boolean
+ :group 'bookmark)
-(defconst bookmark-bmenu-header-height 2
- "Number of lines used for the *Bookmark List* header.")
+(defconst bookmark-bmenu-inline-header-height 2
+ "Number of lines used for the *Bookmark List* header
+\(only significant when `bookmark-bmenu-use-header-line' is nil\).")
(defconst bookmark-bmenu-marks-width 2
"Number of columns (chars) used for the *Bookmark List* marks column,
@@ -150,6 +156,10 @@ A non-nil value may result in truncated bookmark names."
:type 'boolean
:group 'bookmark)
+(defface bookmark-menu-bookmark
+ '((t (:weight bold)))
+ "Face used to highlight bookmark names in bookmark menu buffers."
+ :group 'bookmark)
(defcustom bookmark-menu-length 70
"Maximum length of a bookmark name displayed on a popup menu."
@@ -417,8 +427,8 @@ just return it."
"Prompting with PROMPT, read a bookmark name in completion.
PROMPT will get a \": \" stuck on the end no matter what, so you
probably don't want to include one yourself.
-Optional second arg DEFAULT is a string to return if the user enters
-the empty string."
+Optional arg DEFAULT is a string to return if the user input is empty.
+If DEFAULT is nil then return empty string for empty input."
(bookmark-maybe-load-default-file) ; paranoia
(if (listp last-nonmenu-event)
(bookmark-menu-popup-paned-menu t prompt
@@ -427,22 +437,17 @@ the empty string."
'string-lessp)
(bookmark-all-names)))
(let* ((completion-ignore-case bookmark-completion-ignore-case)
- (default default)
+ (default (unless (equal "" default) default))
(prompt (concat prompt (if default
(format " (%s): " default)
- ": ")))
- (str
- (completing-read prompt
- (lambda (string pred action)
- (if (eq action 'metadata)
- '(metadata (category . bookmark))
- (complete-with-action
- action bookmark-alist string pred)))
- nil
- 0
- nil
- 'bookmark-history)))
- (if (string-equal "" str) default str))))
+ ": "))))
+ (completing-read prompt
+ (lambda (string pred action)
+ (if (eq action 'metadata)
+ '(metadata (category . bookmark))
+ (complete-with-action
+ action bookmark-alist string pred)))
+ nil 0 nil 'bookmark-history default))))
(defmacro bookmark-maybe-historicize-string (string)
@@ -1176,18 +1181,7 @@ Optional second arg NO-HISTORY means don't record this in the
minibuffer history list `bookmark-history'."
(interactive (list (bookmark-completing-read "Insert bookmark location")))
(or no-history (bookmark-maybe-historicize-string bookmark-name))
- (let ((start (point)))
- (prog1
- (insert (bookmark-location bookmark-name))
- (if (display-mouse-p)
- (add-text-properties
- start
- (save-excursion (re-search-backward
- "[^ \t]")
- (1+ (point)))
- '(mouse-face highlight
- follow-link t
- help-echo "mouse-2: go to this bookmark in other window"))))))
+ (insert (bookmark-location bookmark-name)))
;;;###autoload
(defalias 'bookmark-locate 'bookmark-insert-location)
@@ -1552,7 +1546,8 @@ deletion, or > if it is flagged for displaying."
(set-buffer buf)))
(let ((inhibit-read-only t))
(erase-buffer)
- (insert "% Bookmark\n- --------\n")
+ (if (not bookmark-bmenu-use-header-line)
+ (insert "% Bookmark\n- --------\n"))
(add-text-properties (point-min) (point)
'(font-lock-face bookmark-menu-heading))
(dolist (full-record (bookmark-maybe-sort-alist))
@@ -1571,23 +1566,44 @@ deletion, or > if it is flagged for displaying."
(when (display-mouse-p)
(add-text-properties
(+ bookmark-bmenu-marks-width start) end
- '(mouse-face highlight
+ '(font-lock-face bookmark-menu-bookmark
+ mouse-face highlight
follow-link t
help-echo "mouse-2: go to this bookmark in other window")))
(insert "\n")))
(set-buffer-modified-p (not (= bookmark-alist-modification-count 0)))
(goto-char (point-min))
- (forward-line 2)
(bookmark-bmenu-mode)
- (if bookmark-bmenu-toggle-filenames
- (bookmark-bmenu-toggle-filenames t))))
+ (if bookmark-bmenu-use-header-line
+ (bookmark-bmenu-set-header)
+ (forward-line bookmark-bmenu-inline-header-height))
+ (when (and bookmark-alist bookmark-bmenu-toggle-filenames)
+ (bookmark-bmenu-toggle-filenames t))))
;;;###autoload
(defalias 'list-bookmarks 'bookmark-bmenu-list)
;;;###autoload
(defalias 'edit-bookmarks 'bookmark-bmenu-list)
-
+(defun bookmark-bmenu-set-header ()
+ "Sets the immutable header line."
+ (let ((header (concat "%% " "Bookmark")))
+ (when bookmark-bmenu-toggle-filenames
+ (setq header (concat header
+ (make-string (- bookmark-bmenu-file-column
+ (- (length header) 3)) ?\s)
+ "File")))
+ (let ((pos 0))
+ (while (string-match "[ \t\n]+" header pos)
+ (setq pos (match-end 0))
+ (put-text-property (match-beginning 0) pos 'display
+ (list 'space :align-to (- pos 1))
+ header)))
+ (put-text-property 0 2 'face 'fixed-pitch header)
+ (setq header (concat (propertize " " 'display '(space :align-to 0))
+ header))
+ ;; Code derived from `buff-menu.el'.
+ (setq header-line-format header)))
(define-derived-mode bookmark-bmenu-mode special-mode "Bookmark Menu"
"Major mode for editing a list of bookmarks.
@@ -1640,7 +1656,9 @@ Optional argument SHOW means show them unconditionally."
(setq bookmark-bmenu-toggle-filenames nil))
(t
(bookmark-bmenu-show-filenames)
- (setq bookmark-bmenu-toggle-filenames t))))
+ (setq bookmark-bmenu-toggle-filenames t)))
+ (when bookmark-bmenu-use-header-line
+ (bookmark-bmenu-set-header)))
(defun bookmark-bmenu-show-filenames (&optional force)
@@ -1653,7 +1671,8 @@ mainly for debugging, and should not be necessary in normal use."
(save-excursion
(save-window-excursion
(goto-char (point-min))
- (forward-line 2)
+ (if (not bookmark-bmenu-use-header-line)
+ (forward-line bookmark-bmenu-inline-header-height))
(setq bookmark-bmenu-hidden-bookmarks ())
(let ((inhibit-read-only t))
(while (< (point) (point-max))
@@ -1681,7 +1700,8 @@ mainly for debugging, and should not be necessary in normal use."
(with-buffer-modified-unmodified
(save-excursion
(goto-char (point-min))
- (forward-line 2)
+ (if (not bookmark-bmenu-use-header-line)
+ (forward-line bookmark-bmenu-inline-header-height))
(setq bookmark-bmenu-hidden-bookmarks
(nreverse bookmark-bmenu-hidden-bookmarks))
(let ((inhibit-read-only t))
@@ -1695,8 +1715,9 @@ mainly for debugging, and should not be necessary in normal use."
(if (display-mouse-p)
(add-text-properties
start (point)
- '(mouse-face
- highlight follow-link t help-echo
+ '(font-lock-face bookmark-menu-bookmark
+ mouse-face highlight
+ follow-link t help-echo
"mouse-2: go to this bookmark in other window"))))
(forward-line 1)))))))
@@ -1705,9 +1726,11 @@ mainly for debugging, and should not be necessary in normal use."
"If point is not on a bookmark line, move it to one.
If before the first bookmark line, move to the first; if after the
last full line, move to the last full line. The return value is undefined."
- (cond ((< (count-lines (point-min) (point)) bookmark-bmenu-header-height)
+ (cond ((and (not bookmark-bmenu-use-header-line)
+ (< (count-lines (point-min) (point))
+ bookmark-bmenu-inline-header-height))
(goto-char (point-min))
- (forward-line bookmark-bmenu-header-height))
+ (forward-line bookmark-bmenu-inline-header-height))
((and (bolp) (eobp))
(beginning-of-line 0))))
@@ -1873,10 +1896,8 @@ With a prefix arg, prompts for a file to save them in."
The current window remains selected."
(interactive)
(let ((bookmark (bookmark-bmenu-bookmark))
- (pop-up-windows t)
- same-window-buffer-names
- same-window-regexps)
- (bookmark--jump-via bookmark 'display-buffer)))
+ (fun (lambda (b) (display-buffer b t))))
+ (bookmark--jump-via bookmark fun)))
(defun bookmark-bmenu-other-window-with-mouse (event)
"Select bookmark at the mouse pointer in other window, leaving bookmark menu visible."
@@ -1972,7 +1993,8 @@ To carry out the deletions that you've marked, use \\<bookmark-bmenu-mode-map>\\
(progn (end-of-line) (point))))))
(o-col (current-column)))
(goto-char (point-min))
- (forward-line 1)
+ (unless bookmark-bmenu-use-header-line
+ (forward-line 1))
(while (re-search-forward "^D" (point-max) t)
(bookmark-delete (bookmark-bmenu-bookmark) t)) ; pass BATCH arg
(bookmark-bmenu-list)
@@ -2160,8 +2182,7 @@ strings returned are not."
"Save bookmark state, if necessary, at Emacs exit time.
This also runs `bookmark-exit-hook'."
(run-hooks 'bookmark-exit-hook)
- (and bookmark-alist
- (bookmark-time-to-save-p t)
+ (and (bookmark-time-to-save-p t)
(bookmark-save)))
(unless noninteractive
diff --git a/lisp/button.el b/lisp/button.el
index 0676ba86957..433c3990d59 100644
--- a/lisp/button.el
+++ b/lisp/button.el
@@ -64,6 +64,11 @@
;; might get converted to ^M when building loaddefs.el
(define-key map [(control ?m)] 'push-button)
(define-key map [mouse-2] 'push-button)
+ ;; FIXME: You'd think that for keymaps coming from text-properties on the
+ ;; mode-line or header-line, the `mode-line' or `header-line' prefix
+ ;; shouldn't be necessary!
+ (define-key map [mode-line mouse-2] 'push-button)
+ (define-key map [header-line mouse-2] 'push-button)
map)
"Keymap used by buttons.")
@@ -184,10 +189,13 @@ changes to a supertype are not reflected in its subtypes)."
(defun button-get (button prop)
"Get the property of button BUTTON named PROP."
- (if (overlayp button)
- (overlay-get button prop)
- ;; Must be a text-property button.
- (get-text-property button prop)))
+ (cond ((overlayp button)
+ (overlay-get button prop))
+ ((button--area-button-p button)
+ (get-text-property (cdr button)
+ prop (button--area-button-string button)))
+ (t ; Must be a text-property button.
+ (get-text-property button prop))))
(defun button-put (button prop val)
"Set BUTTON's PROP property to VAL."
@@ -202,21 +210,30 @@ changes to a supertype are not reflected in its subtypes)."
;; Disallow updating the `category' property directly.
(error "Button `category' property may not be set directly")))
;; Add the property.
- (if (overlayp button)
- (overlay-put button prop val)
- ;; Must be a text-property button.
- (put-text-property
- (or (previous-single-property-change (1+ button) 'button)
- (point-min))
- (or (next-single-property-change button 'button)
- (point-max))
- prop val)))
-
-(defsubst button-activate (button &optional use-mouse-action)
+ (cond ((overlayp button)
+ (overlay-put button prop val))
+ ((button--area-button-p button)
+ (setq button (button--area-button-string button))
+ (put-text-property 0 (length button) prop val button))
+ (t ; Must be a text-property button.
+ (put-text-property
+ (or (previous-single-property-change (1+ button) 'button)
+ (point-min))
+ (or (next-single-property-change button 'button)
+ (point-max))
+ prop val))))
+
+(defun button-activate (button &optional use-mouse-action)
"Call BUTTON's action property.
If USE-MOUSE-ACTION is non-nil, invoke the button's mouse-action
instead of its normal action; if the button has no mouse-action,
-the normal action is used instead."
+the normal action is used instead.
+
+The action can either be a marker or a function. If it's a
+marker then goto it. Otherwise it it is a function then it is
+called with BUTTON as only argument. BUTTON is either an
+overlay, a buffer position, or (for buttons in the mode-line or
+header-line) a string."
(let ((action (or (and use-mouse-action (button-get button 'mouse-action))
(button-get button 'action))))
(if (markerp action)
@@ -228,7 +245,10 @@ the normal action is used instead."
(defun button-label (button)
"Return BUTTON's text label."
- (buffer-substring-no-properties (button-start button) (button-end button)))
+ (if (button--area-button-p button)
+ (substring-no-properties (button--area-button-string button))
+ (buffer-substring-no-properties (button-start button)
+ (button-end button))))
(defsubst button-type (button)
"Return BUTTON's button-type."
@@ -238,6 +258,13 @@ the normal action is used instead."
"Return t if BUTTON has button-type TYPE, or one of TYPE's subtypes."
(button-type-subtype-p (button-get button 'type) type))
+(defun button--area-button-p (b)
+ "Return non-nil if BUTTON is an area button.
+Such area buttons are used for buttons in the mode-line and header-line."
+ (stringp (car-safe b)))
+
+(defalias 'button--area-button-string #'car
+ "Return area button BUTTON's button-string.")
;; Creating overlay buttons
@@ -324,7 +351,7 @@ Also see `insert-text-button'."
(cons 'button (cons (list t) properties))
object)
;; Return something that can be used to get at the button.
- beg))
+ (or object beg)))
(defun insert-text-button (label &rest properties)
"Insert a button with the label LABEL.
@@ -405,7 +432,9 @@ POS may be either a buffer position or a mouse-event. If
USE-MOUSE-ACTION is non-nil, invoke the button's mouse-action
instead of its normal action; if the button has no mouse-action,
the normal action is used instead. The action may be either a
-function to call or a marker to display.
+function to call or a marker to display and is invoked using
+`button-activate' (which see).
+
POS defaults to point, except when `push-button' is invoked
interactively as the result of a mouse-event, in which case, the
mouse event is used.
@@ -417,11 +446,13 @@ return t."
;; POS is a mouse event; switch to the proper window/buffer
(let ((posn (event-start pos)))
(with-current-buffer (window-buffer (posn-window posn))
- (push-button (posn-point posn) t)))
+ (if (posn-string posn)
+ ;; mode-line, header-line, or display string event.
+ (button-activate (posn-string posn) t)
+ (push-button (posn-point posn)) t)))
;; POS is just normal position
(let ((button (button-at (or pos (point)))))
- (if (not button)
- nil
+ (when button
(button-activate button use-mouse-action)
t))))
diff --git a/lisp/calc/README b/lisp/calc/README
deleted file mode 100644
index 85181899f2a..00000000000
--- a/lisp/calc/README
+++ /dev/null
@@ -1,293 +0,0 @@
-Copyright (C) 2001-2013 Free Software Foundation, Inc.
-See the end of the file for license conditions.
-
-
-This directory contains Calc, an advanced desk calculator for GNU
-Emacs.
-
-"Calc" Copyright (C) 1990-1993, 2001-2013 Free Software Foundation, Inc.
-
-Written by:
- Dave Gillespie
- c/o Synaptics, Inc.
- 2698 Orchard Parkway
- San Jose CA 95134
- daveg@synaptics.com, uunet!synaptx!daveg
-
-Currently maintained by:
- Jay Belanger <jay.p.belanger@gmail.com>
-
-From the introduction to the manual:
-
- "Calc" is an advanced calculator and mathematical tool that runs as
- part of the GNU Emacs environment. Very roughly based on the HP-28/48
- series of calculators, its many features include:
-
- * Choice of algebraic or RPN (stack-based) entry of calculations.
-
- * Arbitrary precision integers and floating-point numbers.
-
- * Arithmetic on rational numbers, complex numbers (rectangular and
- polar), error forms with standard deviations, open and closed
- intervals, vectors and matrices, dates and times, infinities,
- sets, quantities with units, and algebraic formulas.
-
- * Mathematical operations such as logarithms and trigonometric functions.
-
- * Programmer's features (bitwise operations, non-decimal numbers).
-
- * Financial functions such as future value and internal rate of return.
-
- * Number theoretical features such as prime factorization and
- arithmetic modulo M for any M.
-
- * Algebraic manipulation features, including symbolic calculus.
-
- * Moving data to and from regular editing buffers.
-
- * "Embedded mode" for manipulating Calc formulas and data directly
- inside any editing buffer.
-
- * Graphics using GNUPLOT, a versatile (and free) plotting program.
-
- * Easy programming using keyboard macros, algebraic formulas,
- algebraic rewrite rules, or extended Emacs Lisp.
-
-
-Calc is written entirely in Emacs Lisp, for maximum portability.
-
-I am anxious to hear about your experiences using Calc. Send mail to
-"jay.p.belanger@gmail.com". A bug report is most useful if you include the
-exact input and output that occurred, any modes in effect (such as the
-current precision), and so on. If you find Calc is difficult to operate
-in any way, or if you have other suggestions, don't hesitate to let me
-know. If you find errors (including simple typos) in the manual, let
-me know. Even if you find no bugs at all I would love to hear your
-opinions.
-
-
-
-Summary of changes to "Calc"
-------- -- ------- -- ----
-
-Emacs 24.3
-
-Algebraic simplification mode is now the default.
-To restrict to the limited simplifications given by the former
-default simplification mode, use `m I'.
-
-Emacs 24.1
-
-* Support for musical notes added.
-
-* Support for logarithmic units added.
-
-* Calc no longer uses the tex prefix for TeX specific unit
-names when using TeX or LaTeX mode.
-
-* Added option to highlight selections using faces.
-
-* Gave `calc-histogram' the option of using a vector to determine the bins.
-
-* Added "O" option prefix.
-
-* Used "O" prefix to "d r" (`calc-radix') to turn on twos-complement mode.
-
-Emacs 23.2
-
-* Added twos-complement display.
-
-Emacs 23.1:
-
-* Gave `j *' (cal-sel-mult-both-sides) an option to expand the
- denominator.
-
-* Use `calc-embedded-word-regexp' for finding words in
- `calc-embedded-word' in place of delimiters.
-
-* Remove version numbering; use Emacs version for reference.
-
-* Added support for using registers.
-
-* Added support for Yacas, Maxima and Giac languages.
-
-* Added a menu.
-
-* Added logistic non-linear curves to curve-fitting.
-
-* Added option of plotting data points and curve when curve-fitting.
-
-* Made unit conversions exact when possible.
-
-* Lowered the precedence of negation.
-
-Version 2.1:
-
-* New matrix mode for square matrices. Improved handling of
- non-commutative products.
-
-* New functions: powerexpand and ldiv.
-
-* Added new functions: sec, csc, cot, sech, csch, coth.
-
-* 0^0 now evaluates to 1.
-
-* Added a new language mode for LaTeX.
-
-* Calc now tries to use an appropriate language mode in embedded mode.
-
-* Calc now restores original modes when leaving embedded mode.
-
-* User settable variables which are not set with keystrokes are now
- customizable.
-
-* Made ~/.calc.el the default Calc settings file.
-
-* Miscellaneous updates and bugfixes.
-
-
-Version 2.02f:
-
- * Fixed a bug which broke `I', `H', `K' prefix keys in recent Emacs.
-
- * Fixed a bug in calc.texinfo which prevented "make tex2" from working.
-
- * Updated `C-y' (calc-yank) to understand Emacs 19 generalized kill ring.
-
- * Added a copy of "calccard.tex", the Calc quick reference card.
-
-
-Version 2.02e:
-
- * Fixed an installation bug caused by recent changes to `write-region'.
-
-
-Version 2.02d:
-
- * Fixed a minor installation problem with a Emacs 19.29 byte-compiler bug.
-
- * Removed archaic "macedit" package (superseded by "edmacro").
-
-
-Version 2.02c:
-
- * Patch to port Calc to Lucid Emacs 19; still works with GNU 18 and GNU 19.
-
- * Fixed a bug that broke `C-x C-c' after Calc graphics had been used.
-
-
-Version 2.02b:
-
- * Minor patch to port Calc to GNU Emacs 19. Will be superseded by Calc 3.00.
-
-
-Version 2.02:
-
- * Revamped the manual a bit; rearranged some sections.
-
- * Added marginal notes for Key/Function Index refs in printed manual.
-
- * Changed `M-# r' to deal more gracefully with blank lines.
-
- * Made reductions like `V R +' and `M-# :' considerably faster.
-
- * Improved parsing and display of cases like "[a + b]".
-
- * Added `t +' and `t -' for doing business date arithmetic.
-
- * Added "syntax tables," the opposite of compositions.
-
- * Added another Rewrites Tutorial exercise.
-
- * Added the "vmatches" function.
-
- * Added the `Modes' variable and `m g' command.
-
- * Improved `u s' to cancel, e.g., "11 mph hr / yd" to get a number.
-
- * Added "quick units" commands "u 0" through "u 9".
-
- * Moved `M-%' to calc.el to avoid autoloading problems.
-
- * Added `M-=' during algebraic entry, acts like `RET ='.
-
- * Made `LFD' prevent evaluation when finishing a calc-edit command.
-
- * Changed calc-store commands to use `t .' mode for trail display.
-
- * Improved integrator to understand forms involving "erf".
-
- * Fixed parser to make sense of "[1....1e2]" input.
-
- * Fixed FORTRAN parser to treat a(i,j) as a_i_j if a is declared matrix.
-
- * Got rid of some version number stamps to reduce size of patches.
-
- * Fixed a bug in defmath treating "<=" and ">=" predicates.
-
- * Fixed a bug in which Calc crashed multiplying two date forms.
-
- * Fixed a bug in line breaker that crashed for large, nested formulas.
-
- * Fixed a bug using ` to edit string("foo").
-
- * Fixed a bug where `M-# y' in Big mode copied stack level number.
-
- * Fixed a bug where `g O' used wrong default directory, no completion.
-
- * Fixed a bug where "foo_bar(i)" parsed in C mode but showed as foo#bar.
-
- * Fixed several bugs where large calculations got "computation too long."
-
-
-Version 2.01:
-
- * Added percentage commands `M-%', `b %', and `c %'.
-
- * Changed Big mode to force radix-10 in superscripts.
-
- * Improved display of fractions in various language modes.
-
- * Changed `a n' to work properly with equations and inequalities.
-
- * The problem with cross references to Index nodes in TeX has been fixed.
-
- * Fixed a bug where recursive esc-maps make calc-ext/-aent unloadable.
-
- * Fixed a bug in `M-# k', then `OFF' right away, with fresh Emacs.
-
- * Fixed a bug in which "S_i_j" was formatted wrong after `j s'.
-
- * Fixed a bug in which `h k u c' positioned cursor on wrong line.
-
- * Fixed a bug where `z ?' crashed if `z %' was defined.
-
- * Fixed a bug in `j O' (calc-select-once-maybe).
-
- * Fixed "make private" not to ask "Delete excess versions" and crash.
-
-
-Version 2.00:
-
- * First complete posting of Calc since 1.01.
-
- * Most parts of Calc have seen changes since version 1.07. See
- section "New for Calc 2.00" in the manual for a summary. In
- the FTP version of the Calc distribution, the file README.prev
- contains a detailed change history from 1.00 up to 2.00.
-
-
-This file is part of GNU Emacs.
-
-GNU Emacs is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-GNU Emacs is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
diff --git a/lisp/calc/README.prev b/lisp/calc/README.prev
deleted file mode 100644
index eae72cbbe6c..00000000000
--- a/lisp/calc/README.prev
+++ /dev/null
@@ -1,998 +0,0 @@
-Copyright (C) 2001-2013 Free Software Foundation, Inc.
-See the end of the file for license conditions.
-
-
-Summary of changes to "Calc" Preceding 2.00
-------- -- ------- -- ---- --------- ----
-
-
-Version 2.00:
-
- * Changed to compile calc-macs/-maint, to allow "cp *.elc new-dir".
-
- * Improved calc-describe-bindings to avoid showing redundant ESC maps.
-
-
-Version 2.00 beta 3:
-
- * Removed version numbers from most .el files to reduce size of patches.
-
- * Added a "calc-version" command.
-
- * Changed `M-# ? ?' to allow for modified describe-function.
-
- * Changed date parser to accept "Sept" as an alternative for "Sep".
-
- * Inhibited answers to exercise from showing up in table of contents.
-
- * Changed Makefile to say "texindex calc.[cfkptv]?" to avoid "calc.el".
-
- * Fixed up the Makefile in various other ways.
-
- * Rearranged banner at top of `h h' command's output.
-
- * Changed "make summary" to print "Calc Summary" on the title page.
-
- * Added "IntegSimpRules".
-
- * Added `M-# :', `M-# _', and `M-# Z' options.
-
- * Changed `^' to evaluate "[-3..-1]^-2" properly.
-
- * Improved `f g' to give symbolic answers for, e.g., 101:2 and -3:2.
-
- * Fixed a bug where `h k RET' didn't find the right place on the page.
-
- * Fixed a bug that formatted "x*(y ? a : b)" as "x y ? a : b".
-
- * Fixed a bug where defmath translated (< x 0) as (math-posp x)!
-
- * Fixed a bug that prevented quick-calc from working sometimes.
-
- * Fixed the `z ?' bug again (maybe this time for good?).
-
- * Fixed a bug in which `V ^' (vint) was just plain wrong, wrong, wrong!
-
- * Scanned for and fixed remaining bugs relating to autoloading.
-
-
-Version 2.00 beta 2:
-
- * Changed "make info" to try "make texinfo" if "makeinfo" not found.
-
- * Changed to "New for Calc 2.00"; texinfo.tex chokes on apostrophes.
-
- * Added List Tutorial Exercise 14 (just in case there weren't enough!).
-
- * Added a discussion of the `Z F' command to the Programming Tutorial.
-
- * Improved `H a f' not to lose info if input is partially pre-factored.
-
- * Improved simplification of expressions like sqrt(3) + 3^3:2.
-
- * Changed Big mode to omit "*" in expressions like 2 sqrt(3) 5^3:4.
-
- * Replaced European date format D/M/Y with D.M.Y.
-
- * Changed `a N' and `a X' to consider the endpoints of the interval.
-
- * Fixed a bug where TeX mode made c*(1+a/b) look like a function call.
-
- * Fixed a bug formatting top-level evalto's while using selections.
-
- * Fixed a bug that caused `z ?' to crash.
-
- * Fixed a bug where `Z F' broke for argument names "t" and "nil".
-
- * Fixed several bugs relating to autoloading.
-
-
-Version 2.00 beta 1:
-
- * Added "What's new in Calc 2.00" to the manual (summary of info below).
-
- * Added support for many GNUPLOT 3.0 features.
-
- * Tweaked the Makefile and calc-compile a bit more.
-
- * Modified to work with Zawinski's/Furuseth's optimizing byte compiler.
-
- * Modified Calc to garbage-collect less often (raised gc-cons-threshold).
-
- * Changed quick-calc to avoid autoloading so many parts of Calc.
-
- * Changed Calc subfiles to work properly if not byte-compiled.
-
- * Renamed `M-# s' to `M-# j', made `M-# s' be equivalent to `h s'.
-
- * Changed calc-quit to avoid reapportioning space among other windows.
-
- * Added `M-DEL' (calc-pop-above) key, to DEL as LFD is to RET.
-
- * Added `{' and `}' to scroll vertically, analogous to `<' and `>'.
-
- * Added `m t' for "total" algebraic mode.
-
- * Added `d , \' option to group digits with "\,".
-
- * Improved support of "prime" accent in "eqn" language mode.
-
- * Changed macedit's read-kbd-macro to accept a string argument in Lisp.
-
- * Changed calc-check-defines to use a more concise run-hooks linkage.
-
- * Changed auto-why mode not to say [w=more] if next msg is not urgent.
-
- * Made `a d' able to differentiate "a?b:c" and "a_i" formulas.
-
- * Changed probability dist. functions to work with `a f' and `a d'.
-
- * Added special constants "phi" and "gamma".
-
- * Added "poly" function, simpler cousin of "gpoly".
-
- * Added "pdeg", "plead", "pcont", "pprim"; cleaned up "pdiv" and "pgcd".
-
- * Added `a p' command for polynomial interpolation.
-
- * Added `a I' command for numerical integration; made IntegLimit variable.
-
- * Added `a f' to factor polynomials; moved old `a f' to `a "'.
-
- * Added `a a' to do partial fraction decompositions.
-
- * Improved `a i' to integrate many more kinds of formulas.
-
- * Modified `a P' to find numerical roots of high-degree polynomials.
-
- * Modified `c 0' through `c 9' to convert int-valued floats to integers.
-
- * Made sinh, arctanh, etc., expandable into exps/logs by `a f'.
-
- * Added more algebraic simplifications having to do with logs and exps.
-
- * Changed `s s', `s t', `s x', `s l' to accept an equation at prompt.
-
- * Changed `s i' not to store Decls if its value is the default, [].
-
- * Changed `s i' to store in `d O' language mode if in Normal or Big mode.
-
- * Rearranged `V M'/`V R' matrix mapping modes.
-
- * Added <#1+#2> notation for lambda expressions.
-
- * Extended `b l' and other binary shifts to have a 2-argument version.
-
- * Changed `u c' and `u t' to give unitless result for unitless input.
-
- * Changed sqrt(1-cos(x)^2)-to-sin(x) to be an unsafe simplification.
-
- * Improved simplification of sqrts, e.g., sqrt(a^2 x + a^2 y).
-
- * Changed solver to treat (x-a)(x-b)(x-c) more intelligently.
-
- * Changed Pascal language mode to use "$FFFF" for hexadecimal numbers.
-
- * Added support for non-decimal display of floats.
-
- * Changed `p' to refresh stack display if current float format uses it.
-
- * Changed Big mode to use subscript notation for log10(x), log(x,b), r#nnn.
-
- * Changed Big mode to format deriv(u,x) and tderiv(u,x) as du/dx.
-
- * Changed Big mode to format integ(1/x,x) as "dx/x" instead of "1/x dx".
-
- * Added "tty" output type for graphics commands.
-
- * Documented Calc's random number generation algorithm in the manual.
-
- * Fixed a bug involving having "(setq calc-timing t)" in .emacs.
-
- * Fixed a bug that incorrectly parsed "|x| - 1" in TeX mode.
-
- * Fixed bugs and made improvements in `a R' when widening the guess.
-
- * Fixed a bug that where `a S' didn't solve (x - a)^2 = (x - b)^2.
-
- * Fixed a bug that sometimes crashed `a P' on systems of equations.
-
- * Fixed a bug that prevented `b p' (calc-pack-bits) from working.
-
- * Fixed some bugs in which certain functions didn't get autoloaded.
-
- * Fixed a bug in which the date <1/1/13> was incorrectly parsed.
-
- * Fixed a bug which prevented `j D' from expanding (a+b)/c.
-
- * Fixed a bug in solver: bad inverses for sinh and cosh.
-
- * Fixed a bug in math-possible-signs that failed for x*0.
-
- * Fixed a bug where sqrt(-a) was rewritten sqrt(a)*i even if a<0.
-
- * Fixed a bug in line breaker when first "word" of line was too long.
-
- * Worked around a makeinfo bug that handled @end group/@group badly.
-
-
-Version 2.00 alpha 3:
-
- * Changed logic for locating component .elc files to be even smarter.
-
- * Changed "make install" to "make compile"; added different "make install".
-
- * Improved "make compile" to check file dates and compile only when needed.
-
- * Made output of "make compile" in batch mode more compact and readable.
-
- * Replaced "Quick Overview" in manual with "Demonstration of Calc".
-
- * Changed to use keymaps for dispatching M-# and h prefix keys.
-
- * Added TAGS target to the Calc Makefile.
-
- * Removed most doc strings from functions; new help commands are better.
-
- * Got rid of some crufty "fset" calls that were cluttering the code.
-
- * Split calc-grab-region into two functions, calc-grab-region/-rectangle.
-
- * Swapped positions of stack and trail in full-calc-keypad display.
-
- * Improved line-breaking algorithm for displaying long formulas.
-
- * Improved display of control characters in vectors shown as strings.
-
- * Changed `d o' to allow fraction format to specify desired denominator.
-
- * Changed `M-# y' to respect overwrite mode in target buffer.
-
- * Added `H' prefix to display-mode commands to suppress stack refresh.
-
- * Changed "calc-why" mechanism to display urgent messages automatically.
-
- * Handled taking derivatives of symbolic integrals and vice-versa.
-
- * Handled integrating vectors of formulas.
-
- * Incorporated Ewerlid's polynomial division and GCD functions into Calc.
-
- * Improved algebraic operations on "mod" forms, esp. polynomials.
-
- * Added some more financial functions (sln, syd, ddb).
-
- * Added nest, anest, fixp, and afixp (`H V R' and `H V U') functions.
-
- * Added `a .' (calc-remove-equal) command to take apart equations.
-
- * Generalized dfact to work for negative odd integers; added !! syntax.
-
- * Changed `k f' to factor 1, 0, and negative integers.
-
- * Changed `u M', etc., to accept +/- and [ .. ] forms as distributions.
-
- * Changed `g q' to remove *Gnuplot Commands/Trail* window if present.
-
- * Added support for Francois Pinard's "dumb terminal" driver for GNUPLOT.
-
- * Added ":: remember" feature for rewrite rules.
-
- * Changed rewrites to let pattern "a*b" match "x/2" with a=x, b=1/2.
-
- * Added ability to put function names like "simplify" in rewrite schedule.
-
- * Added "Rewrites Tutorial" to the manual.
-
- * Changed ` to bind RET as newline instead of finish if editing a vector.
-
- * Added some new exercises to the List Tutorial.
-
- * Changed `Z F', `V M', etc. not to remove stored vars from def arg list.
-
- * Added parsing for /1, 2, 3/ notation for Fortran mode vectors.
-
- * Added a "%%" syntax for comments in formulas being read.
-
- * Fixed a bug in which failing `h k' removed an existing Info window.
-
- * Fixed a bug in `j /' operating on subformulas like "a + b".
-
- * Fixed a bug in which "inf = inf" undesirably evaluated to 1.
-
- * Fixed a bug that simplified "0 = 1 + a + 2" to "0 = a".
-
- * Fixed a bug that failed for rewrite patterns like "fib(1 ||| 2)".
-
- * Fixed a bug that arose because rewrite programs are non-reentrant.
-
-
-Version 2.00 alpha 2:
-
- * Changed LFD terminating algebraic entry to push in no-simplify mode.
-
- * Changed so that `K -' interprets `-' as calc-minus, not neg prefix arg.
-
- * Improved `h c' command to understand all Calc key sequences.
-
- * Fixed problems with DistribRules, NegateRules, and FitRules.
-
- * Fixed several bad node pointers in the manual.
-
- * Fixed a bug in `h C-w' when used with makeinfo-formatted manuals.
-
- * Fixed a bug in sqrt(-1) when Polar and HMS modes are enabled.
-
- * Fixed/improved dscalar and deven functions; added dodd.
-
- * Fixed a bug in polynomial handling that also affected sum(sin(k),k,1,n).
-
- * Fixed various other glitches in the manual.
-
-
-Version 2.00 alpha 1:
-
- * Calc's tar file now creates a calc-(version) directory to unpack into.
-
- * Calc now comes with a Makefile; install with "make install".
-
- * Calc now comes already split into many files; installation is much simpler.
-
- * Changed base file name of the manual from "calc-info" to "calc.info".
-
- * Key binding for `M-# w' was documented but not implemented.
-
- * Bound M-# ' to be synonymous with `M-# f' (used to be `M-# q').
-
- * Changed M-# M-# to use last interface of C or K; E no longer counts.
-
- * Changed `i' (and `M-# i') not to return to Top node unnecessarily.
-
- * Changed `h' to be a prefix key with various help commands.
-
- * Changed `s' to be a prefix key with various store and recall commands.
-
- * Keys `i', `r', and `l' are obsolete (moved to `h' and `s' prefixes).
-
- * Rearranged `K', `X', and `M-RET' keys; `K' is now calc-keep-args.
-
- * Changed quick-calc to display input formula as well as output if room.
-
- * Changed quick-calc to interact with the editing buffer and kill ring.
-
- * Created pack, unpack, unpackt function equivalents of `v p', `v u'.
-
- * Changed to expand (a/b)^x to a^x/b^x only if b > 0 (not if a > 0).
-
- * Changed math-possible-signs to understand sqrt function.
-
- * Changed Z [, rewrites to consider any provably non-zero value as true.
-
- * Changed normal language modes to accept ** as a synonym for ^.
-
- * Added "maple" language mode.
-
- * Changed, e.g., Mathematica "(2 + 3 I)^(1.23*10^20)" to include parens.
-
- * Generalized math-compose-big properties for all language modes.
-
- * Introduced "string" and other function for composing expressions.
-
- * Changed many recursive vector routines to use loops instead.
-
- * Added evalv, evalvn function equivalents to `=', `N'.
-
- * Changed "expr =>" not to evaluate at all if in no-simplify mode.
-
- * Redesigned user interface of `a F' (calc-curve-fit) command.
-
- * Added "phase" feature to the rewrite rule system.
-
- * Added "&&&", "|||", "!!!" to the rewrite rule system.
-
- * Introduced a new notation for rewrites: LHS := RHS :: COND.
-
- * Changed `a r' (but not `j r') to repeat 100 times by default.
-
- * Integrated EvalRules more cleanly into the default simplifications.
-
- * Added `H v l' [mdims] to measure the dimensions of a matrix.
-
- * Changed `u c' to interpret "/units" as "1/units".
-
- * Added `u a' to adjust unit prefix letters automatically.
-
- * Changed `u s' to enable scalar mode while simplifying.
-
- * Changed `c f' [pfloat] not to float integer powers or subscripts.
-
- * Added a three-argument form for the "hms" function.
-
- * Changed, e.g., sin(90) degrees to produce 1 instead of 1.0.
-
- * Changed symbolic mode to prefer sqrt(int): abs([1 2 3]) => sqrt(14).
-
- * Enhanced solver to handle, e.g., x + 1/x = a; exp(x) + exp(-x) = a.
-
- * Enhanced simplifier to handle, e.g., exp(a+2) / e^a => e^2.
-
- * Enhanced `a s' to simplify sqrt(x) - x^1:2 and exp(x) - e^x to 0.
-
- * Added -(a + b) to -a - b as a default simplification.
-
- * Added rules for differentiating sum() and prod() functions.
-
- * Added a few more energy units (due to Przemek Klosowski).
-
- * Added overflow/underflow checking for all floating-point arithmetic.
-
- * Extended error forms to work with complex numbers.
-
- * Generalized GCD to handle fractional arguments.
-
- * Changed graphics routines to evaluate "x" values, e.g., [-pi .. pi].
-
- * Added `g q', like `g K' but without viewing the Gnuplot Trail.
-
- * Changed `g p' and `V M' to display better "Working..." messages.
-
- * Modified `M-# g' to be more robust about grabbing formulas.
-
- * Added `Y' prefix key reserved for user-written extensions.
-
- * Added calc-load-hook and calc-ext-load-hook.
-
- * Prevented calc-install from leaving large ~ files behind.
-
- * Changed @bullet to @bullet{} in manual to conform to texinfo spec.
-
- * Rearranged some chapters in the manual to be a bit more logical.
-
- * Added calc-split-summary command.
-
- * Fixed several bugs in embedded mode.
-
- * Fixed a bug in calc-vector-covariance that required a prefix arg.
-
- * Fixed a bug that prevented parsing "a=>" with no right-hand side.
-
- * Fixed a bug which allowed incorrectly dividing a vector by a vector.
-
- * Fixed a bug formatting sum(...)^2 in Big mode.
-
- * Fixed a bug that prevented Calc from deleting old graphics temp files.
-
- * Fixed some typos calling calc-inverse-func instead of calc-invert-func.
-
- * Fixed bugs in the derivatives of conj, deg, and rad; added re, im.
-
- * Fixed a bug where (r;theta) parsed as r exp(theta i) even in Deg mode.
-
- * Fixed a bug which gave wrong answer for exp of a polar complex number.
-
- * Fixed a bug in `Z F' that failed if formula used non-arg variables.
-
- * Fixed a bad pointer to Info node "Assignments in Embedded Mode".
-
- * Fixed several errors in the Calc Summary.
-
-
-Version 1.08 beta 1:
-
- * Calc's copyright has been assigned to FSF, for inclusion in Emacs 19!
-
- * Changed M-# to be a two-key sequence; use M-# M-# to start Calc now.
-
- * Rewrote and expanded the introductory chapter of the manual.
-
- * Added a key and function summary to the manual.
-
- * Changed the manual to take better advantage of TeX's math formatting.
-
- * Changed manual to be printable in @smallbook format.
-
- * Added "calc-embedded" mode.
-
- * Added "=>" [evalto] operator.
-
- * Added facilities for date and date/time arithmetic.
-
- * Added a set of financial functions (pv, fv, etc.).
-
- * Added infinite quantities inf, uinf, and nan (plus infinite intervals).
-
- * Added "EvalRules", "SimpRules", and "ExtSimpRules" variables.
-
- * Added sum and product commands `a +', `a -', `a *', `a T'.
-
- * Enhanced `a S' and `a P' to solve systems of equations.
-
- * Enhanced solver to handle eqns like sin(x) = cos(2 x), sqrt(x) + x = 1.
-
- * Added `a M' (calc-map-equation) command.
-
- * Added new statistical functions: mean, standard deviation, etc.
-
- * Added line, polynomial, and curve fitting commands (`a L' and `a F').
-
- * Added support for composite units, e.g., "mi+ft+in".
-
- * Enhanced "Big" mode to format square roots, choose, and powers better.
-
- * Enhanced "Big" mode to display fractions in large notation.
-
- * Added several alternate formats for matrix display.
-
- * Changed TeX mode to write "(1 + x^2)" instead of "\left(1 + x^2\right)".
-
- * Added support for relational operators in TeX and FORTRAN modes.
-
- * Added recognition of accents like \dot, \tilde, \underline in TeX mode.
-
- * Added "eqn" language mode.
-
- * Added extra control over display justification with `d <', `d =', `d >'.
-
- * Added calc-left-label and calc-right-label (`d {', `d }').
-
- * Added "nn%" syntax for algebraic formulas; equivalent to "nn * .01".
-
- * Added input syntaxes like a = b = c, a != b != c, a <= b < c.
-
- * Changed "_" to mean subscripts; old use of "_" in vars is now "#".
-
- * Introduced "matrix mode" and "scalar mode" (`m v').
-
- * Introduced generic identity matrices (idn(1)).
-
- * Added a method for declaring variables to be real, integer, > 0, etc.
-
- * Added `Z S' command for editing stored value of a variable.
-
- * Added "subst" algebraic function equivalent to the `a b' command.
-
- * Added `a f' command, changed deriv/integ/solve-for to use it.
-
- * Improved `a s' to simplify (x + y) (y + x) to (x + y)^2.
-
- * Improved `a s' to simplify i^2 to -1.
-
- * Improved `a s' to simplify, e.g., sin(pi/3) in Symbolic mode.
-
- * Improved `a s' to simplify sqrt(8) to 2 sqrt(2), 1/sqrt(2) to sqrt(2)/2.
-
- * Moved sin(arccos(x)) from `a e' to `a s'; not unsafe after all!
-
- * Changed (x y)^z => x^z y^z to be a usually-unsafe simplification.
-
- * Added thorough documentation of `a s' and `a e' to the manual.
-
- * Improved `a c' to collect "f(a)" even if "a" also appears elsewhere.
-
- * Introduced lin, linnt, islin, islinnt functions for linearity testing.
-
- * Improved `a x' to use binomial theorem to give simpler answers.
-
- * Improved `j D' to distribute powers of sums: (a + b)^n.
-
- * Improved `j M' to merge products of powers (may need no-simplify mode).
-
- * Changed to use defvar for DistribRules etc. so `Z V' works with them.
-
- * Improved `j *' and `j /' to work properly in a few more cases.
-
- * Improved `V R' to use identity value when reducing empty vectors.
-
- * Improved `v p' and `v u' to support more complex packing operations.
-
- * Disabled automatic simplification of sqrt(2)/2 to 1/sqrt(2).
-
- * Bound SPC and RET to press, TAB to next-menu in *Calc Keypad* buffer.
-
- * Added C-u ' to do algebraic entry with language mode forced to normal.
-
- * Added "$1", "$2", etc. input notation for algebraic entry.
-
- * Changed unary operators like `n', `&' to treat neg prefix args like RET.
-
- * Changed ` (calc-edit) to show full precision regardless of float format.
-
- * Enhanced quick-calc to display integers in several formats.
-
- * Documented `g H' (calc-graph-hide) command (had been left from manual).
-
- * Enhanced floor/ceil/trunc/round in several ways.
-
- * Added rounde and roundu functions.
-
- * Changed `c 1' through `c 9' to change small floats to 0.0; added `c 0'.
-
- * Enhanced set operations to work on sets of intervals.
-
- * Fixed erf(0), utpn(x,x,y), and arccosh(-1) to work properly.
-
- * Changed complex arctan and arctanh to follow Steele 2nd edition.
-
- * Expanded "Branch Cuts" section of the manual with some useful tables.
-
- * Rearranged order of words in mode line to be a bit more logical.
-
- * Changed `m N' (num-simplify) mode to evaluate constant vectors, too.
-
- * Changed `a r'/`j r' to prompt twice for separate LHS/RHS if necessary.
-
- * Enhanced `let(v,x)' in rewrites by allowing arbitrary patterns for v.
-
- * Changed cursor positioning in second prompt for `a b' (calc-substitute).
-
- * Changed `y' to omit line numbers more consistently.
-
- * Changed `o' (calc-realign) to reset horizontal scrolling to zero, also.
-
- * Added "pred" mode for calc-eval.
-
- * Added "calc-report-bug" as an alias for "report-calc-bug".
-
- * Added `Z T' and "calc-pass-errors" to aid debugging Calc-related code.
-
- * Added "calc-load-everything" (`m X' or `M-# L') command.
-
- * Enhanced calc-install to pre-build units table, CommuteRules, etc.
-
- * Changed Calc to interact more gracefully with load-path.
-
- * Changed Lisp Variable Index in manual to include user variables, too.
-
- * Fixed a bug that prevented calc-install from working under VMS.
-
- * Fixed a bug that sometimes crashed rewrites dealing with subtractions.
-
- * Fixed a bug that prevented `a S' from solving "3 - x = 1 + x"!
-
- * Fixed a bug in solver that crashed for certain cubics and quartics.
-
- * Fixed a bug in calc-simplify that crashed for equations and ineqs.
-
- * Fixed a bug which placed the "[" oddly in `d B' + `v /' mode.
-
- * Fixed a bug where finishing calc-edit improperly obeyed language mode.
-
- * Fixed a bug formatting (-1)^n in Big mode after selection commands.
-
- * Fixed a bug that got ">=" and "<=" backwards in rewrite conditions.
-
- * Fixed a bug that broke the `"x"' key in calc-keypad mode.
-
- * Fixed a bug in which `MAP$' in calc-keypad didn't display "Working...".
-
- * Fixed a bug where matrix division gave bad result for singular matrix.
-
- * Fixed a bug which closed Calc window if calc-grab-region got an error.
-
- * Fixed a bug where `a s' failed on formulas containing dimension errors.
-
- * Fixed a bug that caused `m F' to hang.
-
- * Fixed a bug in complex arithmetic that caused problems with solver.
-
- * Fixed a bug which raised intervals to interval powers incorrectly.
-
- * Fixed a bug in utpp/ltpp (order of arguments did not match the manual).
-
- * Fixed a bug in which `t y' rounded yanked data with old precision.
-
- * Fixed a bug in which "in(3, [3 .. 3))" returned true.
-
- * Fixed a bug which simplified abs(abs(x)) incorrectly.
-
- * Fixed a bug in which (a^2)^1:3 was unsafely simplified to a^2:3.
-
- * Fixed a bug in rewrite system which missed pattern "2 sin(x) cos(x)".
-
- * Fixed a bug in rewrite system which missed pattern "a - a cos(x)^2".
-
- * Fixed obsolete trail tags gsmp, gneg, ginv to jsmp, jneg, jinv.
-
- * Fixed some errors and made improvements in units table [Ulrich Mueller].
-
-
-Version 1.07:
-
- * Added `m F' (calc-settings-file-name) command.
-
- * Added calc-autoload-directory variable.
-
- * Extended Z ` to accept a prefix argument.
-
- * Added keystrokes (v h, v k) for head, tail, cons.
-
- * Extended `v e' to accept a vector as the filler.
-
- * Changed `V M', `V R' to accept mapping-mode keys in uppercase, too.
-
- * Changed V M ' etc. to accept $, $$, ... as argument indicators.
-
- * Changed `t y' to accept a prefix argument.
-
- * Put in a cleaner and safer random number generator for `k r' et al.
-
- * Fixed a bug which completely broke `a r' command!
-
- * Fixed "0 * matrix" to generate a zero matrix instead of 0.
-
- * Fixed a bug in `a R' which sometimes caused it to crash.
-
- * Fixed a fatal typo in the TeX version of the manual.
-
- * Fixed a bug that prevented C-k, C-w, M-w from working in Trail buffer.
-
- * Fixed another bug in `Z P' command.
-
- * Fixed a bug in `u s' which incorrectly simplified subtractions.
-
- * Fixed an argument-name aliasing bug evaluating lambda( ) formulas.
-
- * Fixed overfull hboxes in the manual.
-
- * Fixed various other bugs in the manual.
-
-
-Version 1.06:
-
- * Added "calc-keypad" mode for X window system users (try it!).
-
- * Improved "calc-eval" for calling/operating Calc from user-written Lisp.
-
- * Moved vector accumulate command to `V U' (old `H V R' still supported).
-
- * Added right-to-left reductions: `I V R' and `I V U'.
-
- * Added set operations on vectors: intersect, union, diff, xor.
-
- * Added `I v s' to remove a subvector from a vector.
-
- * Introduced `H |' to append two vectors with no magical special cases.
-
- * Introduced rhead, rtail, and rcons for isolating last vector element.
-
- * Changed `g p' to keep temp files around until data actually change.
-
- * Improved `a S' to solve many higher-order polynomial equations.
-
- * Added `a P' to produce a vector of all solutions to an equation.
-
- * Enhanced `a v' and `j v' to allow top-level-only evaluation.
-
- * Changed `j DEL' to delete a side of an eqn or ineq, leaving other side.
-
- * Fixed binding for keys `j 1' through `j 9'.
-
- * Introduced "let" marker in rewrite rules.
-
- * Enhanced the "sign" function to provide a two-argument version.
-
- * Changed "max-specpdl-size exceeded" error message to be user-friendly.
-
- * Put "<Aborted>" in the trail in above case and when user presses C-g.
-
- * Changed TeX mode to generate \ldots instead of \dots, recognize both.
-
- * Changed "sin(0)" etc. (for integer 0) to generate "0" instead of "0.".
-
- * Enhanced Programming Tutorial exercise 2.
-
- * Fixed an error in the answer to Types Tutorial exercise 3.
-
- * Fixed several bugs relating to head, tail, and cons functions.
-
- * Fixed some other minor typos in the manual.
-
- * Fixed several bugs in `Z P' (calc-user-define-permanent).
-
- * Fixed several bugs that broke the `g P' command.
-
-
-Version 1.05:
-
- * Created a calc-install command to ease installation.
-
- * Added lots of exercises to the Tutorial section of the manual.
-
- * Added ability to select and operate on sub-formulas.
-
- * Substantially improved the algebraic rewrite-rule system.
-
- * Added a set of graphing commands that use GNUPLOT.
-
- * Added a command (`a R') for finding numerical roots to equations.
-
- * Added several new math functions, such as erf and Bessel functions.
-
- * Added key bindings for miscellaneous commands using the "f" prefix key.
-
- * Added lots of new vector operations, many of them in the spirit of APL.
-
- * Added more control over vector display, including an abbreviated mode.
-
- * Improved keyboard macro editing; added read-kbd-macro to macedit.el.
-
- * Introduced the `m S' (calc-shift-prefix) command.
-
- * Enhanced the calc-edit command in several ways.
-
- * Made it possible to hit ` (calc-edit) during numeric/algebraic entry.
-
- * Enhanced the calc-solve-for command to handle inequalities.
-
- * Enhanced calc-simplify to handle equations and inequalities.
-
- * Taught log10 and log to look for exact integer or rational results.
-
- * Added ability to take Nth roots directly.
-
- * Added "increment" and "decrement" commands for integers and floats.
-
- * Added "full-help" command, changed "h" key to invoke it.
-
- * Added special help for Inverse and Hyperbolic prefixes.
-
- * Added an optional prefix argument to `o' (calc-realign).
-
- * Changed `t s' and `t r' to use RET as the search exit key.
-
- * Made handling of operator keys for V M, V R, etc. more regular.
-
- * Improved TeX mode; added support for \matrix format.
-
- * Added a variant of `m a' mode that only affects ( and [ keys.
-
- * Fixed "Mismatch" message for algebraic entry of semi-open intervals.
-
- * Trimmed fat from calc.el to speed loading, moved more to calc-ext.el.
-
- * Fixed a bug in which minibuffer entry rounded to out-of-date precision.
-
- * Fixed a bug which crashed Calc 1.04 under Epoch.
-
- * Fixed a bug which messed up Calc Trail's mode line, among other things.
-
- * Fixed a bug which caused trail ">" to show only when in Trail buffer.
-
- * Fixed a bug in which "calc" called "calc-grab-region" with too few args.
-
- * Fixed bugs in both implementation and documentation of calc-perm.
-
- * Fixed a bug in which calc-simplify-extended always used radians.
-
- * Fixed a bug where calc-comma failed to override "polar" mode.
-
- * Fixed a bug doing mixed arithmetic on rectangular+polar complex numbers.
-
- * Fixed several bugs in transcendental functions with complex arguments.
-
- * Fixed a bug in which `a s' simplified "x / .5" to ".5 x".
-
- * Fixed numerous other bugs in various parts of Calc.
-
- * Completed the "Hooks" section of the "Internals" chapter of the manual.
-
-
-Version 1.04:
-
- * Included a copy of revision history (from README) in calc.el.
-
- * Added the "calc-split" feature to split calc-ext.el into smaller bits.
-
- * Changed calc-unpack to unpack floats and fractions, too.
-
- * Added "mant", "xpon", and "scf" functions for decomposing floats.
-
- * Fixed a bug in the "y" command with positive prefix arguments.
-
- * Rearranged binary shift/rotate command keys to be a bit more convenient.
-
- * Fixed a bug in which simplifying "(0/0) * 2" crashed with a Lisp error.
-
- * Made `H F' [ffloor] and friends faster for very large arguments.
-
- * Made calc-define-del more robust.
-
- * Handled pasting of data into the Calculator using the mouse under X.
-
- * Made overlay-arrow variables buffer-local to avoid interference.
-
- * Fixed a problem in which Calc Trail buffer got stuck after a C-x C-w.
-
-
-Version 1.03:
-
- * Changed math-choose to compute n-choose-m faster when m is large.
-
- * Fixed some problems with TeX mode.
-
- * Fixed a bug that prevented `b s' from working without a prefix argument.
-
- * Added "calc-eval" function.
-
- * Improved calc-grab-region.
-
-
-Version 1.02:
-
- * Fixed a bug in Tutorial: telephone pole height/distance were switched!
-
- * Fixed a few other things in the manual.
-
- * Added "full-calc" command.
-
- * Added "calc-insert-variables" (`Z I') command.
-
- * Quick Calc now works even if you are already in the minibuffer.
-
- * Fixed a bug in math-mul-bignum-digit which affected math-and, etc.
-
- * Definition of "Hectares" was wrong in units table.
-
- * Fixed a bug in calc-execute-kbd-macro concerning undo and refresh.
-
- * Bound "calc-undo" to `C-x u' as well as `C-_' and `U'.
-
-Version 1.01:
-
- * Added a tutorial section to the manual.
-
- * Next and Prev for node Strings in the manual were reversed; fixed.
-
- * Changed "'bignum" in calc-isqrt-bignum-iter to "'bigpos".
-
- * Fixed a bug that prevented "$" from working during algebraic entry.
-
- * Fixed a bug caused by an X (last-X) command following a K (macro) cmd.
-
- * Fixed a bug in which K command incorrectly formatted stack in Big mode.
-
- * Added space between unary operators and non-flat compositions.
- (Otherwise, "-(a/b)" in Big mode blended the minus sign into the rule!)
-
- * Fixed formatting of (-1)^n in Big mode.
-
- * Fixed some problems relating to "not" operator in Pascal language mode.
-
- * Fixed several bugs relating to V M ' and V M $ sequences.
-
- * Fixed matrix-vector multiplication to produce a vector.
-
- * Introduced Z ` ... Z ' commands; renamed old Z ' to Z #.
-
- * Fixed various other bugs.
-
- * Added calc-settings-file variable suggested by C. Witty.
-
-
-Version 1.00:
-
- * First official release of Calc.
-
- * If you used the Beta test version (0.01), you will find that this
- version of Calc is over 50% larger than the original release.
- General areas of improvement include much better algebra features;
- operations on units; language modes; simplification modes; interval
- arithmetic; vector mapping and reduction. Other new commands include
- calc-fraction and calc-grab-region. The program has been split into
- two parts for faster loading, and the manual is more complete.
-
-
-This file is part of GNU Emacs.
-
-GNU Emacs is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-GNU Emacs is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
diff --git a/lisp/calc/calc-ext.el b/lisp/calc/calc-ext.el
index 57de072fdc7..2cb5bf450d5 100644
--- a/lisp/calc/calc-ext.el
+++ b/lisp/calc/calc-ext.el
@@ -2945,50 +2945,6 @@ If X is not an error form, return 1."
(and x sigma (math-scalarp x) (math-anglep sigma)
(list 'sdev x sigma))))
- ;; Hours (or degrees)
- ((or (string-match "^\\([^#^]+\\)[@oOhH]\\(.*\\)$" s)
- (string-match "^\\([^#^]+\\)[dD][eE]?[gG]?\\(.*\\)$" s))
- (let* ((hours (math-match-substring s 1))
- (minsec (math-match-substring s 2))
- (hours (math-read-number hours))
- (minsec (if (> (length minsec) 0) (math-read-number minsec) 0)))
- (and hours minsec
- (math-num-integerp hours)
- (not (math-negp hours)) (not (math-negp minsec))
- (cond ((math-num-integerp minsec)
- (and (Math-lessp minsec 60)
- (list 'hms hours minsec 0)))
- ((and (eq (car-safe minsec) 'hms)
- (math-zerop (nth 1 minsec)))
- (math-add (list 'hms hours 0 0) minsec))
- (t nil)))))
-
- ;; Minutes
- ((string-match "^\\([^'#^]+\\)[mM']\\(.*\\)$" s)
- (let* ((minutes (math-match-substring s 1))
- (seconds (math-match-substring s 2))
- (minutes (math-read-number minutes))
- (seconds (if (> (length seconds) 0) (math-read-number seconds) 0)))
- (and minutes seconds
- (math-num-integerp minutes)
- (not (math-negp minutes)) (not (math-negp seconds))
- (cond ((math-realp seconds)
- (and (Math-lessp minutes 60)
- (list 'hms 0 minutes seconds)))
- ((and (eq (car-safe seconds) 'hms)
- (math-zerop (nth 1 seconds))
- (math-zerop (nth 2 seconds)))
- (math-add (list 'hms 0 minutes 0) seconds))
- (t nil)))))
-
- ;; Seconds
- ((string-match "^\\([^\"#^]+\\)[sS\"]$" s)
- (let ((seconds (math-read-number (math-match-substring s 1))))
- (and seconds (math-realp seconds)
- (not (math-negp seconds))
- (Math-lessp seconds 60)
- (list 'hms 0 0 seconds))))
-
;; Integer+fraction with explicit radix
((string-match "^\\([0-9]+\\)\\(#\\|\\^\\^\\)\\([0-9a-zA-Z]*\\)[:/]\\([0-9a-zA-Z]*\\)[:/]\\([0-9a-zA-Z]\\)$" s)
(let ((radix (string-to-number (math-match-substring s 1)))
@@ -3061,6 +3017,50 @@ If X is not an error form, return 1."
(let ((digs (math-match-substring s 1)))
(math-read-radix digs 16)))
+ ;; Hours (or degrees)
+ ((or (string-match "^\\([^#^]+\\)[@oOhH]\\(.*\\)$" s)
+ (string-match "^\\([^#^]+\\)[dD][eE]?[gG]?\\(.*\\)$" s))
+ (let* ((hours (math-match-substring s 1))
+ (minsec (math-match-substring s 2))
+ (hours (math-read-number hours))
+ (minsec (if (> (length minsec) 0) (math-read-number minsec) 0)))
+ (and hours minsec
+ (math-num-integerp hours)
+ (not (math-negp hours)) (not (math-negp minsec))
+ (cond ((math-num-integerp minsec)
+ (and (Math-lessp minsec 60)
+ (list 'hms hours minsec 0)))
+ ((and (eq (car-safe minsec) 'hms)
+ (math-zerop (nth 1 minsec)))
+ (math-add (list 'hms hours 0 0) minsec))
+ (t nil)))))
+
+ ;; Minutes
+ ((string-match "^\\([^'#^]+\\)[mM']\\(.*\\)$" s)
+ (let* ((minutes (math-match-substring s 1))
+ (seconds (math-match-substring s 2))
+ (minutes (math-read-number minutes))
+ (seconds (if (> (length seconds) 0) (math-read-number seconds) 0)))
+ (and minutes seconds
+ (math-num-integerp minutes)
+ (not (math-negp minutes)) (not (math-negp seconds))
+ (cond ((math-realp seconds)
+ (and (Math-lessp minutes 60)
+ (list 'hms 0 minutes seconds)))
+ ((and (eq (car-safe seconds) 'hms)
+ (math-zerop (nth 1 seconds))
+ (math-zerop (nth 2 seconds)))
+ (math-add (list 'hms 0 minutes 0) seconds))
+ (t nil)))))
+
+ ;; Seconds
+ ((string-match "^\\([^\"#^]+\\)[sS\"]$" s)
+ (let ((seconds (math-read-number (math-match-substring s 1))))
+ (and seconds (math-realp seconds)
+ (not (math-negp seconds))
+ (Math-lessp seconds 60)
+ (list 'hms 0 0 seconds))))
+
;; Fraction using "/" instead of ":"
((string-match "^\\([0-9]+\\)/\\([0-9/]+\\)$" s)
(math-read-number (concat (math-match-substring s 1) ":"
diff --git a/lisp/calc/calc-forms.el b/lisp/calc/calc-forms.el
index e14d2c8d215..77efb1efc84 100644
--- a/lisp/calc/calc-forms.el
+++ b/lisp/calc/calc-forms.el
@@ -82,19 +82,20 @@
(calc-wrapper
(if (string-match-p "\\`\\s-*\\'" fmt)
(setq fmt "1"))
- (if (string-match "\\` *[0-9] *\\'" fmt)
+ (if (string-match "\\` *\\([0-9]\\|10\\|11\\) *\\'" fmt)
(setq fmt (nth (string-to-number fmt) calc-standard-date-formats)))
(or (string-match "[a-zA-Z]" fmt)
(error "Bad date format specifier"))
(and arg
(>= (setq arg (prefix-numeric-value arg)) 0)
- (<= arg 9)
+ (<= arg 11)
(setq calc-standard-date-formats
(copy-sequence calc-standard-date-formats))
(setcar (nthcdr arg calc-standard-date-formats) fmt))
(let ((case-fold-search nil))
(and (not (string-match "<.*>" fmt))
- (string-match "\\`[^hHspP]*\\([^ac-gi-lnoqrt-zAC-GI-OQRT-Z]*[bBhHmpPsS]+[^ac-gi-lnoqrt-zAC-GI-OQRT-Z]*\\)[^hHspP]*\\'" fmt)
+ ;; Find time part to put in <...>
+ (string-match "\\`[^hHspPT]*\\([^ac-gi-lnoqrt-zAC-GI-OQRU-Z]*\\(bs\\|bm\\|bh\\|BS\\|BH\\|[hHmpPsST]\\)+[^ac-gi-lnoqrt-zAC-GI-OQRU-Z]*\\)[^hHspPT]*\\'" fmt)
(string-match (concat "[^ac-gi-lnoqrt-zAC-GI-OQRT-Z]*"
(regexp-quote (math-match-substring fmt 1))
"[^ac-gi-lnoqrt-zAC-GI-OQRT-Z]*") fmt)
@@ -125,7 +126,7 @@
lfmt nil))
(setq time nil))
(t
- (if (string-match "\\`[^a-zA-Z]*[bB][a-zA-Z]" fmt)
+ (if (string-match "\\`[^a-zA-Z]*[bBZI][a-zA-Z]" fmt)
(setq pos2 (1+ pos2)))
(while (and (< pos2 (length fmt))
(= (upcase (aref fmt pos2))
@@ -133,6 +134,7 @@
(setq pos2 (1+ pos2)))
(setq sym (intern (substring fmt pos pos2)))
(or (memq sym '(Y YY BY YYY YYYY
+ ZYYY IYYY Iww w
aa AA aaa AAA aaaa AAAA
bb BB bbb BBB bbbb BBBB
M MM BM mmm Mmm Mmmm MMM MMMM
@@ -140,8 +142,8 @@
W www Www Wwww WWW WWWW
h hh bh H HH BH
p P pp PP pppp PPPP
- m mm bm s ss bss SS BS C
- N n J j U b))
+ m mm bm s ss bs SS BS C
+ N n J j U b T))
(and (eq sym 'X) (not lfmt) (not fullfmt))
(error "Bad format code: %s" sym))
(and (memq sym '(bb BB bbb BBB bbbb BBBB))
@@ -369,17 +371,68 @@
;;; Some of these functions are adapted from Edward Reingold's "calendar.el".
;;; These versions are rewritten to use arbitrary-size integers.
-;;; The Julian calendar is used up to 9/2/1752, after which the Gregorian
-;;; calendar is used; the first day after 9/2/1752 is 9/14/1752.
;;; A numerical date is the number of days since midnight on
-;;; the morning of January 1, 1 A.D. If the date is a non-integer,
-;;; it represents a specific date and time.
+;;; the morning of December 31, 1 B.C. (Gregorian) or January 2, 1 A.D. (Julian).
+;;; Emacs's calendar refers to such a date as an absolute date, some Calc function
+;;; names also use that terminology. If the date is a non-integer, it represents
+;;; a specific date and time.
;;; A "dt" is a list of the form, (year month day), corresponding to
;;; an integer code, or (year month day hour minute second), corresponding
;;; to a non-integer code.
+(defun math-date-to-gregorian-dt (date)
+ "Return the day (YEAR MONTH DAY) in the Gregorian calendar.
+DATE is the number of days since December 31, -1 in the Gregorian calendar."
+ (let* ((month 1)
+ day
+ (year (math-quotient (math-add date (if (Math-lessp date 711859)
+ 365 ; for speed, we take
+ -108)) ; >1950 as a special case
+ (if (math-negp date) 366 365)))
+ ; this result may be an overestimate
+ temp)
+ (while (Math-lessp date (setq temp (math-absolute-from-gregorian-dt year 1 1)))
+ (setq year (math-add year -1)))
+ (if (eq year 0) (setq year -1))
+ (setq date (1+ (math-sub date temp)))
+ (setq temp
+ (if (math-leap-year-p year)
+ [1 32 61 92 122 153 183 214 245 275 306 336 999]
+ [1 32 60 91 121 152 182 213 244 274 305 335 999]))
+ (while (>= date (aref temp month))
+ (setq month (1+ month)))
+ (setq day (1+ (- date (aref temp (1- month)))))
+ (list year month day)))
+
+(defun math-date-to-julian-dt (date)
+ "Return the day (YEAR MONTH DAY) in the Julian calendar.
+DATE is the number of days since December 31, -1 in the Gregorian calendar."
+ (let* ((month 1)
+ day
+ (year (math-quotient (math-add date (if (Math-lessp date 711859)
+ 367 ; for speed, we take
+ -106)) ; >1950 as a special case
+ (if (math-negp date) 366 365)))
+ ; this result may be an overestimate
+ temp)
+ (while (Math-lessp date (setq temp (math-absolute-from-julian-dt year 1 1)))
+ (setq year (math-add year -1)))
+ (if (eq year 0) (setq year -1))
+ (setq date (1+ (math-sub date temp)))
+ (setq temp
+ (if (math-leap-year-p year t)
+ [1 32 61 92 122 153 183 214 245 275 306 336 999]
+ [1 32 60 91 121 152 182 213 244 274 305 335 999]))
+ (while (>= date (aref temp month))
+ (setq month (1+ month)))
+ (setq day (1+ (- date (aref temp (1- month)))))
+ (list year month day)))
+
(defun math-date-to-dt (value)
+ "Return the day and time of VALUE.
+The integer part of VALUE is the number of days since Dec 31, -1
+in the Gregorian calendar and the remaining part determines the time."
(if (eq (car-safe value) 'date)
(setq value (nth 1 value)))
(or (math-realp value)
@@ -387,32 +440,42 @@
(let* ((parts (math-date-parts value))
(date (car parts))
(time (nth 1 parts))
- (month 1)
- day
- (year (math-quotient (math-add date (if (Math-lessp date 711859)
- 365 ; for speed, we take
- -108)) ; >1950 as a special case
- (if (math-negp value) 366 365)))
- ; this result may be an overestimate
- temp)
- (while (Math-lessp date (setq temp (math-absolute-from-date year 1 1)))
- (setq year (math-add year -1)))
- (if (eq year 0) (setq year -1))
- (setq date (1+ (math-sub date temp)))
- (and (eq year 1752) (>= date 247)
- (setq date (+ date 11)))
- (setq temp (if (math-leap-year-p year)
- [1 32 61 92 122 153 183 214 245 275 306 336 999]
- [1 32 60 91 121 152 182 213 244 274 305 335 999]))
- (while (>= date (aref temp month))
- (setq month (1+ month)))
- (setq day (1+ (- date (aref temp (1- month)))))
+ (dt (if (and calc-gregorian-switch
+ (Math-lessp value
+ (or
+ (nth 3 calc-gregorian-switch)
+ (apply 'math-absolute-from-gregorian-dt calc-gregorian-switch))
+))
+ (math-date-to-julian-dt date)
+ (math-date-to-gregorian-dt date))))
(if (math-integerp value)
- (list year month day)
- (list year month day
- (/ time 3600)
- (% (/ time 60) 60)
- (math-add (% time 60) (nth 2 parts))))))
+ dt
+ (append dt
+ (list
+ (/ time 3600)
+ (% (/ time 60) 60)
+ (math-add (% time 60) (nth 2 parts)))))))
+
+(defun math-date-to-iso-dt (date)
+ "Return the ISO8601 date (year week day) of DATE."
+ (unless (Math-integerp date)
+ (setq date (math-floor date)))
+ (let* ((approx (nth 0 (math-date-to-gregorian-dt (math-sub date 3))))
+ (year (math-add approx
+ (let ((y approx)
+ (sum 0))
+ (while (>= (math-compare date
+ (math-absolute-from-iso-dt (setq y (math-add y 1)) 1 1)) 0)
+ (setq sum (+ sum 1)))
+ sum))))
+ (list
+ year
+ (math-add (car (math-idivmod
+ (math-sub date (math-absolute-from-iso-dt year 1 1))
+ 7))
+ 1)
+ (let ((day (calcFunc-mod date 7)))
+ (if (= day 0) 7 day)))))
(defun math-dt-to-date (dt)
(or (integerp (nth 1 dt))
@@ -423,7 +486,17 @@
(math-reject-arg (nth 2 dt) 'fixnump))
(if (or (< (nth 2 dt) 1) (> (nth 2 dt) 31))
(math-reject-arg (nth 2 dt) "Day value is out of range"))
- (let ((date (math-absolute-from-date (car dt) (nth 1 dt) (nth 2 dt))))
+ (let ((date (math-absolute-from-dt (car dt) (nth 1 dt) (nth 2 dt))))
+ (if (nth 3 dt)
+ (math-add (math-float date)
+ (math-div (math-add (+ (* (nth 3 dt) 3600)
+ (* (nth 4 dt) 60))
+ (nth 5 dt))
+ '(float 864 2)))
+ date)))
+
+(defun math-iso-dt-to-date (dt)
+ (let ((date (math-absolute-from-iso-dt (car dt) (nth 1 dt) (nth 2 dt))))
(if (nth 3 dt)
(math-add (math-float date)
(math-div (math-add (+ (* (nth 3 dt) 3600)
@@ -446,11 +519,17 @@
(defun math-this-year ()
(nth 5 (decode-time)))
-(defun math-leap-year-p (year)
- (if (Math-lessp year 1752)
+(defun math-leap-year-p (year &optional julian)
+ "Non-nil if YEAR is a leap year.
+If JULIAN is non-nil, then use the criterion for leap years
+in the Julian calendar, otherwise use the criterion in the
+Gregorian calendar."
+ (if julian
(if (math-negp year)
(= (math-imod (math-neg year) 4) 1)
(= (math-imod year 4) 0))
+ (if (math-negp year)
+ (setq year (math-sub -1 year)))
(setq year (math-imod year 400))
(or (and (= (% year 4) 0) (/= (% year 100) 0))
(= year 0))))
@@ -460,39 +539,112 @@
29
(aref [31 28 31 30 31 30 31 31 30 31 30 31] (1- month))))
-(defun math-day-number (year month day)
+(defun math-day-in-year (year month day &optional julian)
+ "Return the number of days of the year up to YEAR MONTH DAY.
+The count includes the given date.
+If JULIAN is non-nil, use the Julian calendar, otherwise
+use the Gregorian calendar."
(let ((day-of-year (+ day (* 31 (1- month)))))
(if (> month 2)
(progn
(setq day-of-year (- day-of-year (/ (+ 23 (* 4 month)) 10)))
- (if (math-leap-year-p year)
+ (if (math-leap-year-p year julian)
(setq day-of-year (1+ day-of-year)))))
- (and (eq year 1752)
- (or (> month 9)
- (and (= month 9) (>= day 14)))
- (setq day-of-year (- day-of-year 11)))
day-of-year))
-(defun math-absolute-from-date (year month day)
+(defun math-day-number (year month day)
+ "Return the number of days of the year up to YEAR MONTH DAY.
+The count includes the given date."
+ (if calc-gregorian-switch
+ (cond ((eq year (nth 0 calc-gregorian-switch))
+ (1+
+ (- (math-absolute-from-dt year month day)
+ (math-absolute-from-dt year 1 1))))
+ ((Math-lessp year (nth 0 calc-gregorian-switch))
+ (math-day-in-year year month day t))
+ (t
+ (math-day-in-year year month day)))
+ (math-day-in-year year month day)))
+
+(defun math-dt-before-p (dt1 dt2)
+ "Non-nil if DT1 occurs before DT2.
+A DT is a list of the form (YEAR MONTH DAY)."
+ (or (Math-lessp (nth 0 dt1) (nth 0 dt2))
+ (and (equal (nth 0 dt1) (nth 0 dt2))
+ (or (< (nth 1 dt1) (nth 1 dt2))
+ (and (= (nth 1 dt1) (nth 1 dt2))
+ (< (nth 2 dt1) (nth 2 dt2)))))))
+
+(defun math-absolute-from-gregorian-dt (year month day)
+ "Return the DATE of the day given by the Gregorian day YEAR MONTH DAY.
+Recall that DATE is the number of days since December 31, -1
+in the Gregorian calendar."
(if (eq year 0) (setq year -1))
(let ((yearm1 (math-sub year 1)))
- (math-sub (math-add (math-day-number year month day)
- (math-add (math-mul 365 yearm1)
- (if (math-posp year)
- (math-quotient yearm1 4)
- (math-sub 365
- (math-quotient (math-sub 3 year)
- 4)))))
- (if (or (Math-lessp year 1753)
- (and (eq year 1752) (<= month 9)))
- 1
- (let ((correction (math-mul (math-quotient yearm1 100) 3)))
- (let ((res (math-idivmod correction 4)))
- (math-add (if (= (cdr res) 0)
- -1
- 0)
- (car res))))))))
-
+ (math-sub
+ ;; Add the number of days of the year and the numbers of days
+ ;; in the previous years (leap year days to be added separately)
+ (math-add (math-day-in-year year month day)
+ (math-add (math-mul 365 yearm1)
+ ;; Add the number of Julian leap years
+ (if (math-posp year)
+ (math-quotient yearm1 4)
+ (math-sub 365
+ (math-quotient (math-sub 3 year)
+ 4)))))
+ ;; Subtract the number of Julian leap years which are not
+ ;; Gregorian leap years. In C=4N+r centuries, there will
+ ;; be 3N+r of these days. The following will compute
+ ;; 3N+r.
+ (let* ((correction (math-mul (math-quotient yearm1 100) 3))
+ (res (math-idivmod correction 4)))
+ (math-add (if (= (cdr res) 0)
+ 0
+ 1)
+ (car res))))))
+
+(defun math-absolute-from-julian-dt (year month day)
+ "Return the DATE of the day given by the Julian day YEAR MONTH DAY.
+Recall that DATE is the number of days since December 31, -1
+in the Gregorian calendar."
+ (if (eq year 0) (setq year -1))
+ (let ((yearm1 (math-sub year 1)))
+ (math-sub
+ ;; Add the number of days of the year and the numbers of days
+ ;; in the previous years (leap year days to be added separately)
+ (math-add (math-day-in-year year month day)
+ (math-add (math-mul 365 yearm1)
+ ;; Add the number of Julian leap years
+ (if (math-posp year)
+ (math-quotient yearm1 4)
+ (math-sub 365
+ (math-quotient (math-sub 3 year)
+ 4)))))
+ ;; Adjustment, since January 1, 1 (Julian) is absolute day -1
+ 2)))
+
+;; calc-gregorian-switch is a customizable variable defined in calc.el
+(defvar calc-gregorian-switch)
+
+(defun math-absolute-from-iso-dt (year week day)
+ "Return the DATE of the day given by the iso8601 day YEAR WEEK DAY."
+ (let* ((janfour (math-absolute-from-gregorian-dt year 1 4))
+ (prevmon (math-sub janfour
+ (cdr (math-idivmod (math-sub janfour 1) 7)))))
+ (math-add
+ (math-add prevmon (* (1- week) 7))
+ (if (zerop day) 6 (1- day)))))
+
+(defun math-absolute-from-dt (year month day)
+ "Return the DATE of the day given by the day YEAR MONTH DAY.
+Recall that DATE is the number of days since December 31, -1
+in the Gregorian calendar."
+ (if (and calc-gregorian-switch
+ ;; The next few lines determine if the given date
+ ;; occurs before the switch to the Gregorian calendar.
+ (math-dt-before-p (list year month day) calc-gregorian-switch))
+ (math-absolute-from-julian-dt year month day)
+ (math-absolute-from-gregorian-dt year month day)))
;;; It is safe to redefine these in your init file to use a different
;;; language.
@@ -526,6 +678,10 @@
(defvar math-fd-minute)
(defvar math-fd-second)
(defvar math-fd-bc-flag)
+(defvar math-fd-iso-dt)
+(defvar math-fd-isoyear)
+(defvar math-fd-isoweek)
+(defvar math-fd-isoweekday)
(defun math-format-date (math-fd-date)
(if (eq (car-safe math-fd-date) 'date)
@@ -533,12 +689,14 @@
(let ((entry (list math-fd-date calc-internal-prec calc-date-format)))
(or (cdr (assoc entry math-format-date-cache))
(let* ((math-fd-dt nil)
+ (math-fd-iso-dt nil)
(calc-group-digits nil)
(calc-leading-zeros nil)
(calc-number-radix 10)
(calc-twos-complement-mode nil)
math-fd-year math-fd-month math-fd-day math-fd-weekday
math-fd-hour math-fd-minute math-fd-second
+ math-fd-isoyear math-fd-isoweek math-fd-isoweekday
(math-fd-bc-flag nil)
(fmt (apply 'concat (mapcar 'math-format-date-part
calc-date-format))))
@@ -548,13 +706,13 @@
(setcdr math-fd-dt nil))
fmt))))
-(defconst math-julian-date-beginning '(float 17214235 -1)
- "The beginning of the Julian calendar,
-as measured in the number of days before January 1 of the year 1AD.")
+(defconst math-julian-date-beginning '(float 17214225 -1)
+ "The beginning of the Julian date calendar,
+as measured in the number of days before December 31, 1 BC (Gregorian).")
-(defconst math-julian-date-beginning-int 1721424
- "The beginning of the Julian calendar,
-as measured in the integer number of days before January 1 of the year 1AD.")
+(defconst math-julian-date-beginning-int 1721423
+ "The beginning of the Julian date calendar,
+as measured in the integer number of days before December 31, 1 BC (Gregorian).")
(defun math-format-date-part (x)
(cond ((stringp x)
@@ -578,6 +736,23 @@ as measured in the integer number of days before January 1 of the year 1AD.")
math-julian-date-beginning-int)))
((eq x 'U)
(math-format-number (nth 1 (math-date-parts math-fd-date 719164))))
+ ((memq x '(IYYY Iww w))
+ (progn
+ (or math-fd-iso-dt
+ (setq math-fd-iso-dt (math-date-to-iso-dt math-fd-date)
+ math-fd-isoyear (car math-fd-iso-dt)
+ math-fd-isoweek (nth 1 math-fd-iso-dt)
+ math-fd-isoweekday (nth 2 math-fd-iso-dt)))
+ (cond ((eq x 'IYYY)
+ (let* ((neg (Math-negp math-fd-isoyear))
+ (pyear (calcFunc-abs math-fd-isoyear)))
+ (if (and (natnump pyear) (< pyear 10000))
+ (concat (if neg "-" "") (format "%04d" pyear))
+ (concat (if neg "-" "+") (math-format-number pyear)))))
+ ((eq x 'Iww)
+ (concat "W" (format "%02d" math-fd-isoweek)))
+ ((eq x 'w)
+ (format "%d" math-fd-isoweekday)))))
((progn
(or math-fd-dt
(progn
@@ -585,8 +760,7 @@ as measured in the integer number of days before January 1 of the year 1AD.")
math-fd-year (car math-fd-dt)
math-fd-month (nth 1 math-fd-dt)
math-fd-day (nth 2 math-fd-dt)
- math-fd-weekday (math-mod
- (math-add (math-floor math-fd-date) 6) 7)
+ math-fd-weekday (math-mod (math-floor math-fd-date) 7)
math-fd-hour (nth 3 math-fd-dt)
math-fd-minute (nth 4 math-fd-dt)
math-fd-second (nth 5 math-fd-dt))
@@ -609,6 +783,15 @@ as measured in the integer number of days before January 1 of the year 1AD.")
(if (and (natnump math-fd-year) (< math-fd-year 100))
(format "+%d" math-fd-year)
(math-format-number math-fd-year)))
+ ((eq x 'ZYYY)
+ (let* ((year (if (Math-negp math-fd-year)
+ (math-add math-fd-year 1)
+ math-fd-year))
+ (neg (Math-negp year))
+ (pyear (calcFunc-abs year)))
+ (if (and (natnump pyear) (< pyear 10000))
+ (concat (if neg "-" "") (format "%04d" pyear))
+ (concat (if neg "-" "+") (math-format-number pyear)))))
((eq x 'b) "")
((eq x 'aa)
(and (not math-fd-bc-flag) "ad"))
@@ -634,6 +817,7 @@ as measured in the integer number of days before January 1 of the year 1AD.")
(and math-fd-bc-flag "b.c."))
((eq x 'BBBB)
(and math-fd-bc-flag "B.C."))
+ ((eq x 'T) "T")
((eq x 'M)
(format "%d" math-fd-month))
((eq x 'MM)
@@ -734,6 +918,8 @@ as measured in the integer number of days before January 1 of the year 1AD.")
(catch 'syntax
(or (math-parse-standard-date math-pd-str t)
(math-parse-standard-date math-pd-str nil)
+ (and (string-match "W[0-9][0-9]" math-pd-str)
+ (math-parse-iso-date math-pd-str))
(and (string-match "\\`[^-+/0-9a-zA-Z]*\\([-+]?[0-9]+\\.?[0-9]*\\([eE][-+]?[0-9]+\\)?\\)[^-+/0-9a-zA-Z]*\\'" math-pd-str)
(list 'date (math-read-number (math-match-substring math-pd-str 1))))
(let ((case-fold-search t)
@@ -757,8 +943,12 @@ as measured in the integer number of days before January 1 of the year 1AD.")
(setq second 0)
(setq second (math-read-number second)))
(if (equal ampm "")
- (if (> hour 23)
- (throw 'syntax "Hour value out of range"))
+ (if (or
+ (> hour 24)
+ (and (= hour 24)
+ (not (= minute 0))
+ (not (eq second 0))))
+ (throw 'syntax "Hour value is out of range"))
(setq ampm (upcase (aref ampm 0)))
(if (memq ampm '(?N ?M))
(if (and (= hour 12) (= minute 0) (eq second 0))
@@ -766,7 +956,7 @@ as measured in the integer number of days before January 1 of the year 1AD.")
(throw 'syntax
"Time must be 12:00:00 in this context"))
(if (or (= hour 0) (> hour 12))
- (throw 'syntax "Hour value out of range"))
+ (throw 'syntax "Hour value is out of range"))
(if (eq (= ampm ?A) (= hour 12))
(setq hour (% (+ hour 12) 24)))))))
@@ -889,7 +1079,11 @@ as measured in the integer number of days before January 1 of the year 1AD.")
(throw 'syntax "Day value is out of range"))
(and hour
(progn
- (if (or (< hour 0) (> hour 23))
+ (if (or (< hour 0)
+ (> hour 24)
+ (and (= hour 24)
+ (not (= minute 0))
+ (not (eq second 0))))
(throw 'syntax "Hour value is out of range"))
(if (or (< minute 0) (> minute 59))
(throw 'syntax "Minute value is out of range"))
@@ -898,6 +1092,26 @@ as measured in the integer number of days before January 1 of the year 1AD.")
(list 'date (math-dt-to-date (append (list year month day)
(and hour (list hour minute second))))))
+(defun math-parse-iso-date-validate (isoyear isoweek isoweekday hour minute second)
+ (if (or (< isoweek 1) (> isoweek 53))
+ (throw 'syntax "Week value is out of range"))
+ (if (or (< isoweekday 1) (> isoweekday 7))
+ (throw 'syntax "Weekday value is out of range"))
+ (and hour
+ (progn
+ (if (or (< hour 0)
+ (> hour 24)
+ (and (= hour 24)
+ (not (= minute 0))
+ (not (eq second 0))))
+ (throw 'syntax "Hour value is out of range"))
+ (if (or (< minute 0) (> minute 59))
+ (throw 'syntax "Minute value is out of range"))
+ (if (or (math-negp second) (not (Math-lessp second 60)))
+ (throw 'syntax "Seconds value is out of range"))))
+ (list 'date (math-iso-dt-to-date (append (list isoyear isoweek isoweekday)
+ (and hour (list hour minute second))))))
+
(defun math-parse-date-word (names &optional front)
(let ((n 1))
(while (and names (not (string-match (if (equal (car names) "Sep")
@@ -918,6 +1132,7 @@ as measured in the integer number of days before January 1 of the year 1AD.")
(let ((case-fold-search t)
(okay t) num
(fmt calc-date-format) this next (gnext nil)
+ (isoyear nil) (isoweek nil) (isoweekday nil)
(year nil) (month nil) (day nil) (bigyear nil) (yearday nil)
(hour nil) (minute nil) (second nil) (bc-flag nil))
(while (and fmt okay)
@@ -994,19 +1209,35 @@ as measured in the integer number of days before January 1 of the year 1AD.")
(if (string-match "\\`pm\\|p\\.m\\." math-pd-str)
(setq hour (if (= hour 12) 12 (% (+ hour 12) 24))
math-pd-str (substring math-pd-str (match-end 0))))))
- ((memq this '(Y YY BY YYY YYYY))
+ ((memq this '(Y YY BY YYY YYYY ZYYY))
(and (if (memq next '(MM DD ddd hh HH mm ss SS))
(if (memq this '(Y YY BYY))
(string-match "\\` *[0-9][0-9]" math-pd-str)
(string-match "\\`[0-9][0-9][0-9][0-9]" math-pd-str))
(string-match "\\`[-+]?[0-9]+" math-pd-str))
(setq year (math-match-substring math-pd-str 0)
- bigyear (or (eq this 'YYY)
+ bigyear (or (eq this 'YYY)
(memq (aref math-pd-str 0) '(?\+ ?\-)))
math-pd-str (substring math-pd-str (match-end 0))
- year (math-read-number year))))
+ year (math-read-number year))
+ (if (and (eq this 'ZYYY) (eq year 0))
+ (setq year (math-sub year 1)
+ bigyear t)
+ t)))
+ ((eq this 'IYYY)
+ (if (string-match "\\`[-+]?[0-9]+" math-pd-str)
+ (setq isoyear (string-to-number (math-match-substring math-pd-str 0))
+ math-pd-str (substring math-pd-str (match-end 0)))))
+ ((eq this 'Iww)
+ (if (string-match "W\\([0-9][0-9]\\)" math-pd-str)
+ (setq isoweek (string-to-number (math-match-substring math-pd-str 1))
+ math-pd-str (substring math-pd-str 3))))
((eq this 'b)
t)
+ ((eq this 'T)
+ (if (eq (aref math-pd-str 0) ?T)
+ (setq math-pd-str (substring math-pd-str 1))
+ t))
((memq this '(aa AA aaaa AAAA))
(if (string-match "\\` *\\(ad\\|a\\.d\\.\\)" math-pd-str)
(setq math-pd-str (substring math-pd-str (match-end 0)))))
@@ -1041,7 +1272,9 @@ as measured in the integer number of days before January 1 of the year 1AD.")
nil))
nil)
((eq this 'W)
- (and (>= num 0) (< num 7)))
+ (and (>= num 0) (< num 7)))
+ ((eq this 'w)
+ (setq isoweekday num))
((memq this '(d ddd bdd))
(setq yearday num))
((memq this '(M MM BM))
@@ -1058,19 +1291,46 @@ as measured in the integer number of days before January 1 of the year 1AD.")
(setq yearday nil)
(setq month 1 day 1)))
(if (and okay (equal math-pd-str ""))
- (and month day (or (not (or hour minute second))
- (and hour minute))
- (progn
- (or year (setq year (math-this-year)))
- (or second (setq second 0))
- (if bc-flag
- (setq year (math-neg (math-abs year))))
- (setq day (math-parse-date-validate year bigyear month day
- hour minute second))
- (if yearday
- (setq day (math-add day (1- yearday))))
- day)))))
-
+ (if isoyear
+ (math-parse-iso-date-validate isoyear isoweek isoweekday hour minute second)
+ (and month day (or (not (or hour minute second))
+ (and hour minute))
+ (progn
+ (or year (setq year (math-this-year)))
+ (or second (setq second 0))
+ (if bc-flag
+ (setq year (math-neg (math-abs year))))
+ (setq day (math-parse-date-validate year bigyear month day
+ hour minute second))
+ (if yearday
+ (setq day (math-add day (1- yearday))))
+ day))))))
+
+(defun math-parse-iso-date (math-pd-str)
+ "Parse MATH-PD-STR as an ISO week date, or return nil."
+ (let ((case-fold-search t)
+ (isoyear nil) (isoweek nil) (isoweekday nil)
+ (hour nil) (minute nil) (second nil))
+ ;; Extract the time, if any.
+ (if (string-match "T[^0-9]*\\([0-9][0-9]\\)[^0-9]*\\([0-9][0-9]\\)?[^0-9]*\\([0-9][0-9]\\(\\.[0-9]+\\)?\\)?" math-pd-str)
+ (progn
+ (setq hour (string-to-number (math-match-substring math-pd-str 1))
+ minute (math-match-substring math-pd-str 2)
+ second (math-match-substring math-pd-str 3)
+ math-pd-str (substring math-pd-str 0 (match-beginning 0)))
+ (if (equal minute "")
+ (setq minute 0)
+ (setq minute (string-to-number minute)))
+ (if (equal second "")
+ (setq second 0)
+ (setq second (math-read-number second)))))
+ ;; Next, the year, week and weekday
+ (if (string-match "\\(-?[0-9]*\\)[^0-9]*W\\([0-9][0-9]\\)[^0-9]*\\([0-9]\\)[^0-9]*\\'" math-pd-str)
+ (progn
+ (setq isoyear (string-to-number (math-match-substring math-pd-str 1))
+ isoweek (string-to-number (math-match-substring math-pd-str 2))
+ isoweekday (string-to-number (math-match-substring math-pd-str 3)))
+ (math-parse-iso-date-validate isoyear isoweek isoweekday hour minute second)))))
(defun calcFunc-now (&optional zone)
(let ((date (let ((calc-date-format nil))
@@ -1098,7 +1358,7 @@ as measured in the integer number of days before January 1 of the year 1AD.")
(setq date (nth 1 date)))
(or (math-realp date)
(math-reject-arg date 'datep))
- (math-mod (math-add (math-floor date) 6) 7))
+ (math-mod (math-floor date) 7))
(defun calcFunc-yearday (date)
(let ((dt (math-date-to-dt date)))
@@ -1298,7 +1558,7 @@ second, the number of seconds offset for daylight savings."
0)))
(rounded-abs-date
(+
- (calendar-absolute-from-gregorian
+ (calendar-absolute-from-gregorian
(list (nth 1 dt) (nth 2 dt) (nth 0 dt)))
(/ (round (* 60 time)) 60.0 24.0))))
(if (dst-in-effect rounded-abs-date)
@@ -1434,28 +1694,100 @@ and ends on the last Sunday of October at 2 a.m."
(and (math-messy-integerp day) (setq day (math-trunc day)))
(or (integerp day) (math-reject-arg day 'fixnump))
(and (or (< day 0) (> day 31)) (math-reject-arg day 'range))
- (let ((dt (math-date-to-dt date)))
- (if (or (= day 0) (> day (math-days-in-month (car dt) (nth 1 dt))))
- (setq day (math-days-in-month (car dt) (nth 1 dt))))
- (and (eq (car dt) 1752) (= (nth 1 dt) 9)
- (if (>= day 14) (setq day (- day 11))))
- (list 'date (math-add (math-dt-to-date (list (car dt) (nth 1 dt) 1))
- (1- day)))))
+ (let* ((dt (math-date-to-dt date))
+ (dim (math-days-in-month (car dt) (nth 1 dt)))
+ (julian (if calc-gregorian-switch
+ (math-date-to-dt (math-sub
+ (or (nth 3 calc-gregorian-switch)
+ (apply 'math-absolute-from-gregorian-dt calc-gregorian-switch))
+ 1)))))
+ (if (or (= day 0) (> day dim))
+ (setq day (1- dim))
+ (setq day (1- day)))
+ ;; Adjust if this occurs near the switch to the Gregorian calendar
+ (if calc-gregorian-switch
+ (cond
+ ((and (math-dt-before-p (list (car dt) (nth 1 dt) 1) calc-gregorian-switch)
+ (math-dt-before-p julian (list (car dt) (nth 1 dt) 1)))
+ ;; In this case, CALC-GREGORIAN-SWITCH is the first day of the month
+ (list 'date
+ (math-dt-to-date (list (car calc-gregorian-switch)
+ (nth 1 calc-gregorian-switch)
+ (if (> (+ (nth 2 calc-gregorian-switch) day) dim)
+ dim
+ (+ (nth 2 calc-gregorian-switch) day))))))
+ ((and (eq (car dt) (car calc-gregorian-switch))
+ (= (nth 1 dt) (nth 1 calc-gregorian-switch)))
+ ;; In this case, the switch to the Gregorian calendar occurs in the given month
+ (if (< (+ (nth 2 julian) day) (nth 2 calc-gregorian-switch))
+ ;; If the DAYth day occurs before the switch, use it
+ (list 'date (math-dt-to-date (list (car dt) (nth 1 dt) (1+ day))))
+ ;; Otherwise do some computations
+ (let ((tm (+ day (- (nth 2 calc-gregorian-switch) (nth 2 julian)))))
+ (list 'date (math-dt-to-date
+ (list (car dt)
+ (nth 1 dt)
+ ;;
+ (if (> tm dim) dim tm)))))))
+ ((and (eq (car dt) (car julian))
+ (= (nth 1 dt) (nth 1 julian)))
+ ;; In this case, the current month is truncated because of the switch
+ ;; to the Gregorian calendar
+ (list 'date (math-dt-to-date
+ (list (car dt)
+ (nth 1 dt)
+ (if (>= day (nth 2 julian))
+ (nth 2 julian)
+ (1+ day))))))
+ (t
+ ;; The default
+ (list 'date (math-add (math-dt-to-date (list (car dt) (nth 1 dt) 1)) day))))
+ (list 'date (math-add (math-dt-to-date (list (car dt) (nth 1 dt) 1)) day)))))
(defun calcFunc-newyear (date &optional day)
+ (if (eq (car-safe date) 'date) (setq date (nth 1 date)))
(or day (setq day 1))
(and (math-messy-integerp day) (setq day (math-trunc day)))
(or (integerp day) (math-reject-arg day 'fixnump))
- (let ((dt (math-date-to-dt date)))
+ (let* ((dt (math-date-to-dt date))
+ (gregbeg (if calc-gregorian-switch
+ (or (nth 3 calc-gregorian-switch)
+ (apply 'math-absolute-from-gregorian-dt calc-gregorian-switch))))
+ (julianend (if calc-gregorian-switch (math-sub gregbeg 1)))
+ (julian (if calc-gregorian-switch
+ (math-date-to-dt julianend))))
(if (and (>= day 0) (<= day 366))
- (let ((max (if (eq (car dt) 1752) 355
- (if (math-leap-year-p (car dt)) 366 365))))
+ (let ((max (if (math-leap-year-p (car dt)) 366 365)))
(if (or (= day 0) (> day max)) (setq day max))
- (list 'date (math-add (math-dt-to-date (list (car dt) 1 1))
- (1- day))))
+ (if calc-gregorian-switch
+ ;; Now to break this down into cases
+ (cond
+ ((and (math-dt-before-p (list (car dt) 1 1) calc-gregorian-switch)
+ (math-dt-before-p julian (list (car dt) 1 1)))
+ ;; In this case, CALC-GREGORIAN-SWITCH is the first day of the year
+ (list 'date (math-min (math-add gregbeg (1- day))
+ (math-dt-to-date (list (car calc-gregorian-switch) 12 31)))))
+ ((eq (car dt) (car julian))
+ ;; In this case, the switch to the Gregorian calendar occurs in the given year
+ (if (Math-lessp (car julian) (car calc-gregorian-switch))
+ ;; Here, the last Julian day is the last day of the year.
+ (list 'date (math-min (math-add (math-dt-to-date (list (car dt) 1 1)) (1- day))
+ julianend))
+ ;; Otherwise, just make sure the date doesn't go past the end of the year
+ (list 'date (math-min (math-add (math-dt-to-date (list (car dt) 1 1)) (1- day))
+ (math-dt-to-date (list (car dt) 12 31))))))
+ (t
+ (list 'date (math-add (math-dt-to-date (list (car dt) 1 1))
+ (1- day)))))
+ (list 'date (math-add (math-dt-to-date (list (car dt) 1 1))
+ (1- day)))))
(if (and (>= day -12) (<= day -1))
- (list 'date (math-dt-to-date (list (car dt) (- day) 1)))
- (math-reject-arg day 'range)))))
+ (if (and calc-gregorian-switch
+ (math-dt-before-p (list (car dt) (- day) 1) calc-gregorian-switch)
+ (math-dt-before-p julian (list (car dt) (- day) 1)))
+ (list 'date gregbeg)
+ (list 'date (math-dt-to-date (list (car dt) (- day) 1))))
+ (math-reject-arg day 'range)))))
(defun calcFunc-incmonth (date &optional step)
(or step (setq step 1))
diff --git a/lisp/calc/calc-graph.el b/lisp/calc/calc-graph.el
index 4376e21b4ca..16fc6c09dbe 100644
--- a/lisp/calc/calc-graph.el
+++ b/lisp/calc/calc-graph.el
@@ -948,6 +948,7 @@ This \"dumb\" driver will be present in Gnuplot 3.0."
(setq calc-dumb-map (make-sparse-keymap))
(define-key calc-dumb-map "\n" 'scroll-up-command)
(define-key calc-dumb-map " " 'scroll-up-command)
+ (define-key calc-dumb-map [?\S-\ ] 'scroll-down-command)
(define-key calc-dumb-map "\177" 'scroll-down-command)
(define-key calc-dumb-map "<" 'scroll-left)
(define-key calc-dumb-map ">" 'scroll-right)
diff --git a/lisp/calc/calc-help.el b/lisp/calc/calc-help.el
index 512faefa78f..2b7b56c3f89 100644
--- a/lisp/calc/calc-help.el
+++ b/lisp/calc/calc-help.el
@@ -386,23 +386,9 @@ C-w Describe how there is no warranty for Calc."
(defun calc-view-news ()
(interactive)
- (let ((path load-path))
- (while (and path
- (not (file-exists-p (expand-file-name "calc.el" (car path)))))
- (setq path (cdr path)))
- (or (and path
- (file-exists-p (expand-file-name "README" (car path))))
- (error "Can't locate Calc sources"))
- (calc-quit)
- (switch-to-buffer "*Help*")
- (let ((inhibit-read-only t))
- (erase-buffer)
- (insert-file-contents (expand-file-name "README" (car path)))
- (search-forward "Summary of changes")
- (forward-line -1)
- (delete-region (point-min) (point))
- (goto-char (point-min)))
- (help-mode)))
+ (calc-quit)
+ (view-emacs-news)
+ (re-search-forward "^\*+ .*\\<Calc\\>" nil t))
(defvar calc-help-long-names '((?b . "binary/business")
(?g . "graphics")
diff --git a/lisp/calc/calc-math.el b/lisp/calc/calc-math.el
index 94b3f645785..3b845f563a1 100644
--- a/lisp/calc/calc-math.el
+++ b/lisp/calc/calc-math.el
@@ -777,18 +777,18 @@ If this can't be done, return NIL."
(math-to-hms a 'rad))
(t a)))
-(defun math-to-radians-2 (a) ; [N N]
+(defun math-to-radians-2 (a &optional force-symbolic) ; [N N]
(cond ((eq (car-safe a) 'hms)
(math-from-hms a 'rad))
((memq calc-angle-mode '(deg hms))
- (if calc-symbolic-mode
+ (if (or calc-symbolic-mode force-symbolic)
(math-div (math-mul a '(var pi var-pi)) 180)
(math-mul a (math-pi-over-180))))
(t a)))
-(defun math-from-radians-2 (a) ; [N N]
+(defun math-from-radians-2 (a &optional force-symbolic) ; [N N]
(cond ((memq calc-angle-mode '(deg hms))
- (if calc-symbolic-mode
+ (if (or calc-symbolic-mode force-symbolic)
(math-div (math-mul 180 a) '(var pi var-pi))
(math-div a (math-pi-over-180))))
(t a)))
diff --git a/lisp/calc/calc-units.el b/lisp/calc/calc-units.el
index a3d037ee042..0d6f0b0e535 100644
--- a/lisp/calc/calc-units.el
+++ b/lisp/calc/calc-units.el
@@ -404,7 +404,7 @@ If EXPR is nil, return nil."
(math-composition-to-string cexpr))))))
(defvar math-default-units-table
- #s(hash-table test equal data (1 (1)))
+ (make-hash-table :test 'equal)
"A table storing previously converted units.")
(defun math-get-default-units (expr)
@@ -437,20 +437,34 @@ If COMP or STD is non-nil, put that in the units table instead."
(list new-units (car default-units))
math-default-units-table))))))
+(defvar calc-allow-units-as-numbers t)
+
(defun calc-convert-units (&optional old-units new-units)
(interactive)
(calc-slow-wrapper
(let ((expr (calc-top-n 1))
(uoldname nil)
+ (unitscancel nil)
+ (nouold nil)
unew
units
defunits)
- (unless (math-units-in-expr-p expr t)
+ (if (or (not (math-units-in-expr-p expr t))
+ (setq unitscancel (and
+ (if (get 'calc-allow-units-as-numbers 'saved-value)
+ (car (get 'calc-allow-units-as-numbers 'saved-value))
+ calc-allow-units-as-numbers)
+ (eq (math-get-standard-units expr) 1))))
(let ((uold (or old-units
(progn
- (setq uoldname (read-string "Old units: "))
+ (setq uoldname
+ (if unitscancel
+ (read-string
+ "(The expression is unitless when simplified) Old Units: ")
+ (read-string "Old units: ")))
(if (equal uoldname "")
(progn
+ (setq nouold unitscancel)
(setq uoldname "1")
1)
(if (string-match "\\` */" uoldname)
@@ -460,47 +474,45 @@ If COMP or STD is non-nil, put that in the units table instead."
(error "Bad format in units expression: %s" (nth 1 uold)))
(setq expr (math-mul expr uold))))
(setq defunits (math-get-default-units expr))
- (if (equal defunits "1")
- (progn
- (calc-enter-result 1 "cvun" (math-simplify-units expr))
- (message "All units in expression cancel"))
- (unless new-units
- (setq new-units
- (read-string (concat
- (if uoldname
- (concat "Old units: "
- uoldname
- ", new units")
- "New units")
- (if defunits
- (concat
- " (default "
- defunits
- "): ")
- ": "))))
- (if (and
- (string= new-units "")
- defunits)
- (setq new-units defunits)))
- (when (string-match "\\` */" new-units)
- (setq new-units (concat "1" new-units)))
- (setq units (math-read-expr new-units))
- (when (eq (car-safe units) 'error)
- (error "Bad format in units expression: %s" (nth 2 units)))
- (if calc-ensure-consistent-units
- (math-check-unit-consistency expr units))
- (let ((unew (math-units-in-expr-p units t))
- (std (and (eq (car-safe units) 'var)
- (assq (nth 1 units) math-standard-units-systems)))
- (comp (eq (car-safe units) '+)))
- (unless (or unew std)
- (error "No units specified"))
- (let ((res
- (if std
- (math-simplify-units (math-to-standard-units expr (nth 1 std)))
- (math-convert-units expr units (and uoldname (not (equal uoldname "1")))))))
- (math-put-default-units res (if comp units))
- (calc-enter-result 1 "cvun" res)))))))
+ (unless new-units
+ (setq new-units
+ (read-string (concat
+ (if (and uoldname (not nouold))
+ (concat "Old units: "
+ uoldname
+ ", new units")
+ "New units")
+ (if defunits
+ (concat
+ " (default "
+ defunits
+ "): ")
+ ": "))))
+ (if (and
+ (string= new-units "")
+ defunits)
+ (setq new-units defunits)))
+ (when (string-match "\\` */" new-units)
+ (setq new-units (concat "1" new-units)))
+ (setq units (math-read-expr new-units))
+ (when (eq (car-safe units) 'error)
+ (error "Bad format in units expression: %s" (nth 2 units)))
+ (if calc-ensure-consistent-units
+ (math-check-unit-consistency expr units))
+ (let ((unew (math-units-in-expr-p units t))
+ (std (and (eq (car-safe units) 'var)
+ (assq (nth 1 units) math-standard-units-systems)))
+ (comp (eq (car-safe units) '+)))
+ (unless (or unew std)
+ (error "No units specified"))
+ (let* ((noold (and uoldname (not (equal uoldname "1"))))
+ (res
+ (if std
+ (math-simplify-units (math-to-standard-units expr (nth 1 std)))
+ (math-convert-units expr units noold))))
+ (unless std
+ (math-put-default-units (if noold units res) (if comp units)))
+ (calc-enter-result 1 "cvun" res))))))
(defun calc-autorange-units (arg)
(interactive "P")
diff --git a/lisp/calc/calc.el b/lisp/calc/calc.el
index ddba0fecfea..c35e7650254 100644
--- a/lisp/calc/calc.el
+++ b/lisp/calc/calc.el
@@ -435,9 +435,9 @@ when converting units."
(defcustom calc-highlight-selections-with-faces
nil
"If non-nil, use a separate face to indicate selected sub-formulas.
-If `calc-show-selections' is non-nil, then selected sub-formulas are shown
-by displaying the rest of the formula in `calc-nonselected-face'.
-If `calc-show-selections' is nil, then selected sub-formulas are shown
+If option `calc-show-selections' is non-nil, then selected sub-formulas are
+shown by displaying the rest of the formula in `calc-nonselected-face'.
+If option `calc-show-selections' is nil, then selected sub-formulas are shown
by displaying the sub-formula in `calc-selected-face'."
:version "24.1"
:group 'calc
@@ -464,6 +464,8 @@ to be identified as that note."
:type 'string
:group 'calc)
+(defvar math-format-date-cache) ; calc-forms.el
+
(defface calc-nonselected-face
'((t :inherit shadow
:slant italic))
@@ -785,7 +787,9 @@ If nil, selections displayed but ignored.")
"M-D-Y< H:mm:SSpp>"
"D-M-Y< h:mm:SS>"
"j<, h:mm:SS>"
- "YYddd< hh:mm:ss>"))
+ "YYddd< hh:mm:ss>"
+ "ZYYY-MM-DD Www< hh:mm>"
+ "IYYY-Iww-w<Thh:mm:ss>"))
(defcalcmodevar calc-autorange-units nil
"If non-nil, automatically set unit prefixes to keep units in a reasonable range.")
@@ -1179,7 +1183,7 @@ Used by `calc-user-invocation'.")
;;;###autoload
(defun calc-dispatch (&optional arg)
- "Invoke the GNU Emacs Calculator. See `calc-dispatch-help' for details."
+ "Invoke the GNU Emacs Calculator. See \\[calc-dispatch-help] for details."
(interactive "P")
; (sit-for echo-keystrokes)
(condition-case err ; look for other keys bound to calc-dispatch
@@ -2020,6 +2024,50 @@ See calc-keypad for details."
(calc-refresh align)))
(setq calc-refresh-count (1+ calc-refresh-count)))
+;; Dates that are built-in options for `calc-gregorian-switch' should be
+;; (YEAR MONTH DAY math-date-from-gregorian-dt(YEAR MONTH DAY)) for speed.
+(defcustom calc-gregorian-switch nil
+ "The first day the Gregorian calendar is used by Calc's date forms.
+This is `nil' (the default) if the Gregorian calendar is the only one used.
+Otherwise, it should be a list `(YEAR MONTH DAY)' when Calc begins to use
+the Gregorian calendar; Calc will use the Julian calendar for earlier dates.
+The dates in which different regions of the world began to use the
+Gregorian calendar vary quite a bit, even within a single country.
+If you want Calc's date forms to switch between the Julian and
+Gregorian calendar, you can specify the date or choose from several
+common choices. Some of these choices should be taken with a grain
+of salt; for example different parts of France changed calendars at
+different times, and Sweden's change to the Gregorian calendar was
+complicated. Also, the boundaries of the countries were different at
+the times of the calendar changes than they are now.
+The Vatican decided that the Gregorian calendar should take effect
+on 15 October 1582 (Gregorian), and many Catholic countries made
+the change then. Great Britain and its colonies had the Gregorian
+calendar take effect on 14 September 1752 (Gregorian); this includes
+the United States."
+ :group 'calc
+ :version "24.4"
+ :type '(choice (const :tag "Always use the Gregorian calendar" nil)
+ (const :tag "1582-10-15 - Italy, Poland, Portugal, Spain" (1582 10 15 577736))
+ (const :tag "1582-12-20 - France" (1582 12 20 577802))
+ (const :tag "1582-12-25 - Luxemburg" (1582 12 25 577807))
+ (const :tag "1584-01-17 - Bohemia and Moravia" (1584 1 17 578195))
+ (const :tag "1587-11-01 - Hungary" (1587 11 1 579579))
+ (const :tag "1700-03-01 - Denmark" (1700 3 1 620607))
+ (const :tag "1701-01-12 - Protestant Switzerland" (1701 1 12 620924))
+ (const :tag "1752-09-14 - Great Britain and dominions" (1752 9 14 639797))
+ (const :tag "1753-03-01 - Sweden" (1753 3 1 639965))
+ (const :tag "1918-02-14 - Russia" (1918 2 14 700214))
+ (const :tag "1919-04-14 - Romania" (1919 4 14 700638))
+ (list :tag "(YEAR MONTH DAY)"
+ (integer :tag "Year")
+ (integer :tag "Month (integer)")
+ (integer :tag "Day")))
+ :set (lambda (symbol value)
+ (set-default symbol value)
+ (setq math-format-date-cache nil)
+ (calc-refresh)))
+
;;;; The Calc Trail buffer.
(defun calc-check-trail-aligned ()
diff --git a/lisp/calc/calcalg2.el b/lisp/calc/calcalg2.el
index 58a82bcf143..cd962e7dbed 100644
--- a/lisp/calc/calcalg2.el
+++ b/lisp/calc/calcalg2.el
@@ -401,18 +401,18 @@
(put 'calcFunc-sin\' 'math-derivative-1
(function (lambda (u) (math-to-radians-2 (math-normalize
- (list 'calcFunc-cos u))))))
+ (list 'calcFunc-cos u)) t))))
(put 'calcFunc-cos\' 'math-derivative-1
(function (lambda (u) (math-neg (math-to-radians-2
(math-normalize
- (list 'calcFunc-sin u)))))))
+ (list 'calcFunc-sin u)) t)))))
(put 'calcFunc-tan\' 'math-derivative-1
(function (lambda (u) (math-to-radians-2
(math-sqr
(math-normalize
- (list 'calcFunc-sec u)))))))
+ (list 'calcFunc-sec u))) t))))
(put 'calcFunc-sec\' 'math-derivative-1
(function (lambda (u) (math-to-radians-2
@@ -420,7 +420,7 @@
(math-normalize
(list 'calcFunc-sec u))
(math-normalize
- (list 'calcFunc-tan u)))))))
+ (list 'calcFunc-tan u))) t))))
(put 'calcFunc-csc\' 'math-derivative-1
(function (lambda (u) (math-neg
@@ -429,32 +429,32 @@
(math-normalize
(list 'calcFunc-csc u))
(math-normalize
- (list 'calcFunc-cot u))))))))
+ (list 'calcFunc-cot u))) t)))))
(put 'calcFunc-cot\' 'math-derivative-1
(function (lambda (u) (math-neg
(math-to-radians-2
(math-sqr
(math-normalize
- (list 'calcFunc-csc u))))))))
+ (list 'calcFunc-csc u))) t)))))
(put 'calcFunc-arcsin\' 'math-derivative-1
(function (lambda (u)
(math-from-radians-2
(math-div 1 (math-normalize
(list 'calcFunc-sqrt
- (math-sub 1 (math-sqr u)))))))))
+ (math-sub 1 (math-sqr u))))) t))))
(put 'calcFunc-arccos\' 'math-derivative-1
(function (lambda (u)
(math-from-radians-2
(math-div -1 (math-normalize
(list 'calcFunc-sqrt
- (math-sub 1 (math-sqr u)))))))))
+ (math-sub 1 (math-sqr u))))) t))))
(put 'calcFunc-arctan\' 'math-derivative-1
(function (lambda (u) (math-from-radians-2
- (math-div 1 (math-add 1 (math-sqr u)))))))
+ (math-div 1 (math-add 1 (math-sqr u))) t))))
(put 'calcFunc-sinh\' 'math-derivative-1
(function (lambda (u) (math-normalize (list 'calcFunc-cosh u)))))
diff --git a/lisp/calendar/calendar.el b/lisp/calendar/calendar.el
index 9b0eb3e9bff..20a8684e387 100644
--- a/lisp/calendar/calendar.el
+++ b/lisp/calendar/calendar.el
@@ -1562,11 +1562,13 @@ line."
(defun calendar-redraw ()
"Redraw the calendar display, if `calendar-buffer' is live."
(interactive)
- (if (get-buffer calendar-buffer)
- (with-current-buffer calendar-buffer
- (let ((cursor-date (calendar-cursor-to-nearest-date)))
- (calendar-generate-window displayed-month displayed-year)
- (calendar-cursor-to-visible-date cursor-date)))))
+ (when (get-buffer calendar-buffer)
+ (with-current-buffer calendar-buffer
+ (let ((cursor-date (calendar-cursor-to-nearest-date)))
+ (calendar-generate-window displayed-month displayed-year)
+ (calendar-cursor-to-visible-date cursor-date))
+ (when (window-live-p (get-buffer-window))
+ (set-window-point (get-buffer-window) (point))))))
(defvar calendar-mode-map
(let ((map (make-keymap)))
@@ -1633,6 +1635,7 @@ line."
(define-key map "S" 'calendar-sunrise-sunset)
(define-key map "M" 'calendar-lunar-phases)
(define-key map " " 'scroll-other-window)
+ (define-key map [?\S-\ ] 'scroll-other-window-down)
(define-key map "\d" 'scroll-other-window-down)
(define-key map "\C-c\C-l" 'calendar-redraw)
(define-key map "." 'calendar-goto-today)
diff --git a/lisp/calendar/time-date.el b/lisp/calendar/time-date.el
index af84f30dd46..71c8117364a 100644
--- a/lisp/calendar/time-date.el
+++ b/lisp/calendar/time-date.el
@@ -133,9 +133,7 @@ If DATE lacks timezone information, GMT is assumed."
;;;###autoload(if (or (featurep 'emacs)
;;;###autoload (and (fboundp 'float-time)
;;;###autoload (subrp (symbol-function 'float-time))))
-;;;###autoload (progn
-;;;###autoload (defalias 'time-to-seconds 'float-time)
-;;;###autoload (make-obsolete 'time-to-seconds 'float-time "21.1"))
+;;;###autoload (defalias 'time-to-seconds 'float-time)
;;;###autoload (autoload 'time-to-seconds "time-date"))
(eval-when-compile
diff --git a/lisp/calendar/timeclock.el b/lisp/calendar/timeclock.el
index a872e86dcf2..70d064143dc 100644
--- a/lisp/calendar/timeclock.el
+++ b/lisp/calendar/timeclock.el
@@ -81,7 +81,7 @@
;;; User Variables:
-(defcustom timeclock-file (convert-standard-filename "~/.timelog")
+(defcustom timeclock-file (locate-user-emacs-file "timelog" ".timelog")
"The file used to store timeclock data in."
:type 'file
:group 'timeclock)
diff --git a/lisp/calendar/todo-mode.el b/lisp/calendar/todo-mode.el
index fdbcb04c9db..c109ecefb7d 100644
--- a/lisp/calendar/todo-mode.el
+++ b/lisp/calendar/todo-mode.el
@@ -281,11 +281,11 @@ show and mark todo entries for today, but may slow down processing of
the diary file somewhat."
:type 'string
:group 'todo)
-(defcustom todo-file-do (convert-standard-filename "~/.todo-do")
+(defcustom todo-file-do (locate-user-emacs-file "todo-do" ".todo-do")
"TODO mode list file."
:type 'file
:group 'todo)
-(defcustom todo-file-done (convert-standard-filename "~/.todo-done")
+(defcustom todo-file-done (locate-user-emacs-file "todo-done" ".todo-done")
"TODO mode archive file."
:type 'file
:group 'todo)
@@ -315,7 +315,7 @@ window."
:group 'todo)
(defvar todo-edit-buffer " *TODO Edit*"
"TODO Edit buffer name.")
-(defcustom todo-file-top (convert-standard-filename "~/.todo-top")
+(defcustom todo-file-top (locate-user-emacs-file "todo-top" ".todo-top")
"TODO mode top priorities file.
Not in TODO format, but diary compatible.
diff --git a/lisp/case-table.el b/lisp/case-table.el
index 711d4e4ec8c..7d4aa27de1c 100644
--- a/lisp/case-table.el
+++ b/lisp/case-table.el
@@ -1,4 +1,4 @@
-;;; case-table.el --- code to extend the character set and support case tables
+;;; case-table.el --- code to extend the character set and support case tables -*- lexical-binding: t -*-
;; Copyright (C) 1988, 1994, 2001-2013 Free Software Foundation, Inc.
@@ -65,18 +65,26 @@
(describe-vector description)
(help-mode)))))
+(defun case-table-get-table (case-table table)
+ "Return the TABLE of CASE-TABLE.
+TABLE can be `down', `up', `eqv' or `canon'."
+ (let ((slot-nb (cdr (assq table '((up . 0) (canon . 1) (eqv . 2))))))
+ (or (if (eq table 'down) case-table)
+ (char-table-extra-slot case-table slot-nb)
+ ;; Setup all extra slots of CASE-TABLE by temporarily selecting
+ ;; it as the standard case table.
+ (let ((old (standard-case-table)))
+ (unwind-protect
+ (progn
+ (set-standard-case-table case-table)
+ (char-table-extra-slot case-table slot-nb))
+ (or (eq case-table old)
+ (set-standard-case-table old)))))))
+
(defun get-upcase-table (case-table)
"Return the upcase table of CASE-TABLE."
- (or (char-table-extra-slot case-table 0)
- ;; Setup all extra slots of CASE-TABLE by temporarily selecting
- ;; it as the standard case table.
- (let ((old (standard-case-table)))
- (unwind-protect
- (progn
- (set-standard-case-table case-table)
- (char-table-extra-slot case-table 0))
- (or (eq case-table old)
- (set-standard-case-table old))))))
+ (case-table-get-table case-table 'up))
+(make-obsolete 'get-upcase-table 'case-table-get-table "24.4")
(defun copy-case-table (case-table)
(let ((copy (copy-sequence case-table))
@@ -97,7 +105,7 @@ It also modifies `standard-syntax-table' to
indicate left and right delimiters."
(aset table l l)
(aset table r r)
- (let ((up (get-upcase-table table)))
+ (let ((up (case-table-get-table table 'up)))
(aset up l l)
(aset up r r))
;; Clear out the extra slots so that they will be
@@ -117,7 +125,7 @@ It also modifies `standard-syntax-table' to give them the syntax of
word constituents."
(aset table uc lc)
(aset table lc lc)
- (let ((up (get-upcase-table table)))
+ (let ((up (case-table-get-table table 'up)))
(aset up uc uc)
(aset up lc uc))
;; Clear out the extra slots so that they will be
@@ -132,7 +140,7 @@ word constituents."
It also modifies `standard-syntax-table' to give them the syntax of
word constituents."
(aset table lc lc)
- (let ((up (get-upcase-table table)))
+ (let ((up (case-table-get-table table 'up)))
(aset up uc uc)
(aset up lc uc))
;; Clear out the extra slots so that they will be
@@ -148,7 +156,7 @@ It also modifies `standard-syntax-table' to give them the syntax of
word constituents."
(aset table uc lc)
(aset table lc lc)
- (let ((up (get-upcase-table table)))
+ (let ((up (case-table-get-table table 'up)))
(aset up uc uc))
;; Clear out the extra slots so that they will be
;; recomputed from the main (downcase) table and upcase table.
@@ -164,7 +172,7 @@ that will be used as the downcase part of a case table.
It also modifies `standard-syntax-table'.
SYNTAX should be \" \", \"w\", \".\" or \"_\"."
(aset table c c)
- (let ((up (get-upcase-table table)))
+ (let ((up (case-table-get-table table 'up)))
(aset up c c))
;; Clear out the extra slots so that they will be
;; recomputed from the main (downcase) table and upcase table.
diff --git a/lisp/cedet/ChangeLog b/lisp/cedet/ChangeLog
index 6f0b0133873..8b914e8843e 100644
--- a/lisp/cedet/ChangeLog
+++ b/lisp/cedet/ChangeLog
@@ -1,21 +1,205 @@
-2013-03-11 Glenn Morris <rgm@gnu.org>
+2013-03-26 Leo Liu <sdl.web@gmail.com>
- * Version 24.3 released.
+ * semantic/senator.el (senator-copy-tag-to-register): Move
+ register handling logic from register.el. (Bug#14052)
-2012-11-14 David Engster <deng@randomsample.de>
+2013-03-21 Eric Ludlam <zappo@gnu.org>
- * semantic/symref/list.el (semantic-symref-symbol): Use
- `semantic-complete-read-tag-project' instead of
+ * semantic.el (navigate-menu): Yank Tag :enable. Make sure
+ `senator-tag-ring' is bound.
+ (semantic-parse-region-default): Stop reversing the output of
+ parse-whole-stream.
+ (semantic-repeat-parse-whole-stream): Append returned tags
+ differently, so they come out in the right order.
+
+ * semantic/sb.el (semantic-sb-filter-tags-of-class): New option.
+ (semantic-sb-fetch-tag-table): Filter tags being bucketed to
+ exclude tags belonging to above filtered classes.
+
+ * semantic/find.el (semantic-filter-tags-by-class): New function.
+
+ * semantic/tag-ls.el (semantic-tag-similar-p-default): Add
+ short-circuit in case tag1 and 2 are identical.
+
+ * semantic/analyze/fcn.el
+ (semantic-analyze-dereference-metatype-stack): Use
+ `semantic-tag-similar-p' instead of 'eq' when comparing two tags
+ during metatype evaluation in case they are the same, but not the
+ same node. (Tweaked patch from Tomasz Gajewski) (Tiny change)
+
+ * semantic/db-find.el (semanticdb-partial-synchronize): Fix
+ require to semantic/db-typecache to be correct.
+ (semanticdb-find-tags-external-children-of-type): Make this a
+ brutish search by default.
+
+ * semantic/sort.el
+ (semantic-tag-external-member-children-default): When calling
+ `semanticdb-find-tags-external-children-of-type', pass in the
+ input tag as the place to start searching for externally defined
+ methods.
+
+ * semantic/db-file.el (semanticdb-default-save-directory): Doc
+ fix: Add ref to default value.
+
+ * semantic/complete.el (semantic-complete-post-command-hook): When
+ detecting if cursor is outside completion area, do so if cursor
+ moves before start of overlay, or the original starting location
+ of the overlay (i.e., if user deletes past beginning of the
+ overlay region).
+ (semantic-complete-inline-tag-engine): Initialize original start
+ of `semantic-complete-inline-overlay'.
+
+ * semantic/bovine/c.el (semantic-c-describe-environment): Update
+ some section titles. Test semanticdb table before printing it.
+ (semantic-c-reset-preprocessor-symbol-map): Update
+ `semantic-lex-spp-macro-symbol-obarray' outside the loop over all
+ the files contributing to its value.
+ (semantic-c-describe-environment): If there is an EDE project but
+ no spp symbols from it, say so.
+
+ * srecode/args.el (srecode-semantic-handle-:project): New argument
+ handler. Provide variable values if not in an EDE project.
+
+ * srecode/srt-mode.el (srecode-template-mode): Fix typo on srecode
+ name.
+
+ * srecode/cpp.el (srecode-semantic-handle-:c): Replace all
+ characters in FILENAME_SYMBOL that aren't valid CPP symbol chars.
+
+ * srecode/map.el (srecode-map-validate-file-for-mode): Force
+ semantic to load if it is not active in the template being added
+ to the map.
+
+ * srecode/srt.el: Add local variables for setting the autoload
+ file name.
+ (srecode-semantic-handle-:srt): New autoload cookie
+
+ * ede.el (ede-apply-preprocessor-map): Apply map to
+ `semantic-lex-spp-project-macro-symbol-obarray' instead of the
+ system one. Add require for semantic.
+
+ * ede/proj-elisp.el (ede-update-version-in-source): In case a file
+ has both a version variable and a Version: comment, always use
+ `call-next-method'.
+
+ * ede/cpp-root.el (ede-set-project-variables): Deleted.
+ `ede-preprocessor-map' does the job this function was attempting
+ to do with :spp-table.
+ (ede-preprocessor-map): Update file tests to provide better
+ messages. Do not try to get symbols from a file that is the file
+ in the current buffer.
+
+ * ede/base.el (ede-project-placeholder): Add more documentation to
+ :file slot.
+ (ede-load-cache): Use `insert-file-contents' instead of
+ `find-file-noselect' in order to avoid activating other tools.
+
+2013-03-21 David Engster <deng@randomsample.de>
+
+ * semantic/bovine/c.el (semantic-get-local-variables): Also add a
+ new variable 'this' if we are in an inline member function. For
+ detecting this, we check overlays at point if there is a class
+ spanning the current function. Also, the variable 'this' has to
+ be a pointer.
+
+ * semantic/bovine/gcc.el (semantic-gcc-setup): Fail gracefully
+ when querying g++ for defines returns an error.
+
+ * srecode/srt-mode.el:
+ * srecode/compile.el:
+ * semantic/elp.el:
+ * semantic/db-el.el:
+ * semantic/complete.el:
+ * ede.el:
+ * cogre.el:
+ * srecode/table.el:
+ * srecode/mode.el:
+ * srecode/insert.el:
+ * srecode/compile.el:
+ * semantic/decorate/include.el:
+ * semantic/db.el:
+ * semantic/adebug.el:
+ * ede/auto.el:
+ * srecode/dictionary.el:
+ * semantic/ede-grammar.el:
+ * semantic/db.el:
+ * semantic/db-find.el:
+ * semantic/db-file.el:
+ * semantic/complete.el:
+ * semantic/bovine/c.el:
+ * semantic/analyze.el:
+ * ede/util.el:
+ * ede/proj.el:
+ * ede/proj-elisp.el:
+ * ede/pconf.el:
+ * ede/locate.el:
+ * ede.el: Adapt to EIEIO namespace cleanup: Rename `object-name'
+ to `eieio-object-name', `object-set-name-string' to
+ `eieio-object-set-name-string', `object-class' to
+ `eieio-object-class', `class-parent' to `eieio-class-parent',
+ `class-parents' to `eieio-class-parents', `class-children' to
+ `eieio-class-children', `object-name-string' to
+ `eieio-object-name-string', `object-class-fast' to
+ `eieio--object-class'. Also replace direct access with new
+ accessor functions.
+
+2013-03-21 Tomasz Gajewski <tomga@wp.pl> (tiny change)
+
+ * ede/cpp-root.el (ede-project-autoload, initialize-instance): Fix
+ EDE file symbol to match rename. Fix ede-cpp-root symbol to
+ include -project in name.
+
+2013-03-21 Alex Ott <alexott@gmail.com>
+
+ * cedet-files.el (cedet-files-list-recursively): New. Recursively
+ find files whose names are matching to given regex
+
+ * ede.el (ede-current-project): Rewrite to avoid imperative style.
+
+ * ede/files.el (ede-find-file): Simplify code.
+
+ * ede/base.el (ede-normalize-file/directory): Add function to
+ normalize :file or :directory slots if they are missing.
+
+ * ede/cpp-root.el (ede-cpp-root-project): Add compile-command
+ slot.
+ (project-compile-project): Compiles project using value specified
+ in :compule-command slot or in compile-command local variable.
+ Value of slot or local variable could be string or function that
+ receives project and should return string that will be invoked as
+ command.
+ (project-compile-target): Invokes compilation of whole project
+
+ * ede/files.el (ede-find-project-root): New function to
+ find root of project that contains specific file.
+ (ede-files-find-existing): New function which checks presence of
+ given directory in the list of registered projects.
+
+2013-03-04 Paul Eggert <eggert@cs.ucla.edu>
+
+ * semantic/wisent/wisent.el (wisent): Stick to ASCII in the ASCII art.
+
+ * semantic/wisent/javat-wy.el: Regenerate.
+
+2012-11-19 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * semantic/fw.el (semantic-make-local-hook, semantic-mode-line-update):
+ Simplify via CSE.
+
+2012-11-16 David Engster <deng@randomsample.de>
+
+ * semantic/symref/list.el (semantic-symref-symbol):
+ Use `semantic-complete-read-tag-project' instead of
`semantic-complete-read-tag-buffer-deep', since the latter is not
working correctly.
- * semantic/symref.el (semantic-symref-result-get-tags): Use
- `find-buffer-visiting' to follow symbolic links.
+ * semantic/symref.el (semantic-symref-result-get-tags):
+ Use `find-buffer-visiting' to follow symbolic links.
* semantic/fw.el (semantic-find-file-noselect): Always set
`enable-local-variables' to `:safe' when loading files.
-2012-11-13 Glenn Morris <rgm@gnu.org>
+2012-11-16 Glenn Morris <rgm@gnu.org>
* semantic/lex-spp.el (semantic-lex-spp-lex-text-string):
* semantic/util.el (semantic-describe-buffer):
@@ -23,7 +207,7 @@
(semantic-default-c-setup):
Use new names for hooks rather than obsolete aliases.
-2012-11-12 Stefan Monnier <monnier@iro.umontreal.ca>
+2012-11-13 Stefan Monnier <monnier@iro.umontreal.ca>
* semantic/mru-bookmark.el (semantic-mru-bookmark-mode):
* semantic/grammar.el (semantic-grammar-mode):
@@ -31,7 +215,7 @@
(semantic-show-parser-state-mode): Avoid obsolete name
semantic-edits-new-change-hooks (bug#12869).
-2012-11-10 Glenn Morris <rgm@gnu.org>
+2012-11-13 Glenn Morris <rgm@gnu.org>
* srecode/srt-mode.el (srecode-template-mode):
Don't change global values of comment-start, comment-end. (Bug#12781)
diff --git a/lisp/cedet/cedet-files.el b/lisp/cedet/cedet-files.el
index 36561090bd2..236040befb8 100644
--- a/lisp/cedet/cedet-files.el
+++ b/lisp/cedet/cedet-files.el
@@ -88,6 +88,24 @@ specific conversions during tests."
(setq file (concat "//" (substring file 1)))))
file))
+(defun cedet-files-list-recursively (dir re)
+ "Returns list of files in directory matching to given regex"
+ (when (file-accessible-directory-p dir)
+ (let ((files (directory-files dir t))
+ matched)
+ (dolist (file files matched)
+ (let ((fname (file-name-nondirectory file)))
+ (cond
+ ((or (string= fname ".")
+ (string= fname "..")) nil)
+ ((and (file-regular-p file)
+ (string-match re fname))
+ (setq matched (cons file matched)))
+ ((file-directory-p file)
+ (let ((tfiles (cedet-files-list-recursively file re)))
+ (when tfiles (setq matched (append matched tfiles)))))))))))
+
+
(provide 'cedet-files)
;;; cedet-files.el ends here
diff --git a/lisp/cedet/ede.el b/lisp/cedet/ede.el
index 3867f628b93..5fecd8b994f 100644
--- a/lisp/cedet/ede.el
+++ b/lisp/cedet/ede.el
@@ -330,14 +330,14 @@ Argument MENU-DEF is the menu definition to use."
(easy-menu-create-menu
"Project Forms"
(let* ((obj (ede-current-project))
- (class (if obj (object-class obj)))
+ (class (if obj (eieio-object-class obj)))
(menu nil))
(condition-case err
(progn
(while (and class (slot-exists-p class 'menu))
;;(message "Looking at class %S" class)
(setq menu (append menu (oref class menu))
- class (class-parent class))
+ class (eieio-class-parent class))
(if (listp class) (setq class (car class))))
(append
'( [ "Add Target" ede-new-target (ede-current-project) ]
@@ -382,7 +382,7 @@ but can also be used interactively."
(oref proj configuration-default)))))
(oset (ede-current-project) configuration-default newconfig)
(message "%s will now build in %s mode."
- (object-name (ede-current-project))
+ (eieio-object-name (ede-current-project))
newconfig))
(defun ede-customize-forms-menu (menu-def)
@@ -727,7 +727,7 @@ Optional argument NAME is the name to give this project."
'name
(let* ((l ede-project-class-files)
(cp (ede-current-project))
- (cs (when cp (object-class cp)))
+ (cs (when cp (eieio-object-class cp)))
(r nil))
(while l
(if cs
@@ -779,7 +779,7 @@ Optional argument NAME is the name to give this project."
:targets nil)))
(inits (oref obj initializers)))
;; Force the name to match for new objects.
- (object-set-name-string nobj (oref nobj :name))
+ (eieio-object-set-name-string nobj (oref nobj :name))
;; Handle init args.
(while inits
(eieio-oset nobj (car inits) (car (cdr inits)))
@@ -885,7 +885,7 @@ a string \"y\" or \"n\", which answers the y/n question done interactively."
(when (not ede-object)
(error "Can't add %s to target %s: Wrong file type"
(file-name-nondirectory (buffer-file-name))
- (object-name target)))
+ (eieio-object-name target)))
(ede-apply-target-options))
(defun ede-remove-file (&optional force)
@@ -979,12 +979,12 @@ Argument PROMPT is the prompt to use when querying the user for a target."
(defmethod project-add-file ((ot ede-target) file)
"Add the current buffer into project project target OT.
Argument FILE is the file to add."
- (error "add-file not supported by %s" (object-name ot)))
+ (error "add-file not supported by %s" (eieio-object-name ot)))
(defmethod project-remove-file ((ot ede-target) fnnd)
"Remove the current buffer from project target OT.
Argument FNND is an argument."
- (error "remove-file not supported by %s" (object-name ot)))
+ (error "remove-file not supported by %s" (eieio-object-name ot)))
(defmethod project-edit-file-target ((ot ede-target))
"Edit the target OT associated with this file."
@@ -992,45 +992,45 @@ Argument FNND is an argument."
(defmethod project-new-target ((proj ede-project) &rest args)
"Create a new target. It is up to the project PROJ to get the name."
- (error "new-target not supported by %s" (object-name proj)))
+ (error "new-target not supported by %s" (eieio-object-name proj)))
(defmethod project-new-target-custom ((proj ede-project))
"Create a new target. It is up to the project PROJ to get the name."
- (error "New-target-custom not supported by %s" (object-name proj)))
+ (error "New-target-custom not supported by %s" (eieio-object-name proj)))
(defmethod project-delete-target ((ot ede-target))
"Delete the current target OT from its parent project."
- (error "add-file not supported by %s" (object-name ot)))
+ (error "add-file not supported by %s" (eieio-object-name ot)))
(defmethod project-compile-project ((obj ede-project) &optional command)
"Compile the entire current project OBJ.
Argument COMMAND is the command to use when compiling."
- (error "compile-project not supported by %s" (object-name obj)))
+ (error "compile-project not supported by %s" (eieio-object-name obj)))
(defmethod project-compile-target ((obj ede-target) &optional command)
"Compile the current target OBJ.
Argument COMMAND is the command to use for compiling the target."
- (error "compile-target not supported by %s" (object-name obj)))
+ (error "compile-target not supported by %s" (eieio-object-name obj)))
(defmethod project-debug-target ((obj ede-target))
"Run the current project target OBJ in a debugger."
- (error "debug-target not supported by %s" (object-name obj)))
+ (error "debug-target not supported by %s" (eieio-object-name obj)))
(defmethod project-run-target ((obj ede-target))
"Run the current project target OBJ."
- (error "run-target not supported by %s" (object-name obj)))
+ (error "run-target not supported by %s" (eieio-object-name obj)))
(defmethod project-make-dist ((this ede-project))
"Build a distribution for the project based on THIS project."
- (error "Make-dist not supported by %s" (object-name this)))
+ (error "Make-dist not supported by %s" (eieio-object-name this)))
(defmethod project-dist-files ((this ede-project))
"Return a list of files that constitute a distribution of THIS project."
- (error "Dist-files is not supported by %s" (object-name this)))
+ (error "Dist-files is not supported by %s" (eieio-object-name this)))
(defmethod project-rescan ((this ede-project))
"Rescan the EDE project THIS."
- (error "Rescanning a project is not supported by %s" (object-name this)))
+ (error "Rescanning a project is not supported by %s" (eieio-object-name this)))
(defun ede-ecb-project-paths ()
"Return a list of all paths for all active EDE projects.
@@ -1157,18 +1157,15 @@ Optional argument OBJ is an object to find the parent of."
(defun ede-current-project (&optional dir)
"Return the current project file.
If optional DIR is provided, get the project for DIR instead."
- (let ((ans nil))
- ;; If it matches the current directory, do we have a pre-existing project?
- (when (and (or (not dir) (string= dir default-directory))
- ede-object-project)
- (setq ans ede-object-project)
- )
+ ;; If it matches the current directory, do we have a pre-existing project?
+ (let ((proj (when (and (or (not dir) (string= dir default-directory))
+ ede-object-project)
+ ede-object-project)))
;; No current project.
- (when (not ans)
+ (if proj
+ proj
(let* ((ldir (or dir default-directory)))
- (setq ans (ede-directory-get-open-project ldir))))
- ;; Return what we found.
- ans))
+ (ede-directory-get-open-project ldir)))))
(defun ede-buffer-object (&optional buffer projsym)
"Return the target object for BUFFER.
@@ -1372,20 +1369,24 @@ and <root>/doc for doc sources."
;; C/C++
(defun ede-apply-preprocessor-map ()
"Apply preprocessor tables onto the current buffer."
+ ;; TODO - what if semantic-mode isn't enabled?
+ ;; what if we never want to load a C mode? Does this matter?
+ ;; Note: This require is needed for the case where EDE ends up
+ ;; in the hook order before Semantic based hooks.
+ (require 'semantic/lex-spp)
(when (and ede-object
- (boundp 'semantic-lex-spp-macro-symbol-obarray)
- semantic-lex-spp-macro-symbol-obarray)
+ (boundp 'semantic-lex-spp-project-macro-symbol-obarray))
(let* ((objs ede-object)
(map (ede-preprocessor-map (if (consp objs)
(car objs)
objs))))
(when map
;; We can't do a require for the below symbol.
- (setq semantic-lex-spp-macro-symbol-obarray
+ (setq semantic-lex-spp-project-macro-symbol-obarray
(semantic-lex-make-spp-table map)))
(when (consp objs)
(message "Choosing preprocessor syms for project %s"
- (object-name (car objs)))))))
+ (eieio-object-name (car objs)))))))
(defmethod ede-system-include-path ((this ede-project))
"Get the system include path used by project THIS."
diff --git a/lisp/cedet/ede/auto.el b/lisp/cedet/ede/auto.el
index 22fce372e24..c0baf0fc8f8 100644
--- a/lisp/cedet/ede/auto.el
+++ b/lisp/cedet/ede/auto.el
@@ -199,8 +199,8 @@ added. Possible values are:
front of the list so more generic projects don't get priority."
;; First, can we identify PROJAUTO as already in the list? If so, replace.
(let ((projlist ede-project-class-files)
- (projname (object-name-string projauto)))
- (while (and projlist (not (string= (object-name-string (car projlist)) projname)))
+ (projname (eieio-object-name-string projauto)))
+ (while (and projlist (not (string= (eieio-object-name-string (car projlist)) projname)))
(setq projlist (cdr projlist)))
(if projlist
diff --git a/lisp/cedet/ede/base.el b/lisp/cedet/ede/base.el
index 1368ea348a0..5302ac3207a 100644
--- a/lisp/cedet/ede/base.el
+++ b/lisp/cedet/ede/base.el
@@ -135,7 +135,9 @@ other desired outcome.")
(dirinode :documentation "The inode id for :directory.")
(file :type string
:initarg :file
- :documentation "File name where this project is stored.")
+ :documentation "The File uniquely tagging this project instance.
+For some project types, this will be the file that stores the project configuration.
+In other projects types, this file is merely a unique identifier to this type of project.")
(rootproject ; :initarg - no initarg, don't save this slot!
:initform nil
:type (or null ede-project-placeholder-child)
@@ -350,12 +352,12 @@ All specific project types must derive from this project."
(defun ede-load-cache ()
"Load the cache of EDE projects."
(save-excursion
- (let ((cachebuffer nil))
+ (let ((cachebuffer (get-buffer-create "*ede cache*")))
(condition-case nil
- (progn
- (setq cachebuffer
- (find-file-noselect ede-project-placeholder-cache-file t))
- (set-buffer cachebuffer)
+ (with-current-buffer cachebuffer
+ (erase-buffer)
+ (when (file-exists-p ede-project-placeholder-cache-file)
+ (insert-file-contents ede-project-placeholder-cache-file))
(goto-char (point-min))
(let ((c (read (current-buffer)))
(new nil)
@@ -610,6 +612,28 @@ instead of the current project."
cp)))))
+;;; Utility functions
+;;
+
+(defun ede-normalize-file/directory (this project-file-name)
+ "Fills :directory or :file slots if they're missing in project THIS.
+The other slot will be used to calculate values.
+PROJECT-FILE-NAME is a name of project file (short name, like 'pom.xml', etc."
+ (when (and (or (not (slot-boundp this :file))
+ (not (oref this :file)))
+ (slot-boundp this :directory)
+ (oref this :directory))
+ (oset this :file (expand-file-name project-file-name (oref this :directory))))
+ (when (and (or (not (slot-boundp this :directory))
+ (not (oref this :directory)))
+ (slot-boundp this :file)
+ (oref this :file))
+ (oset this :directory (file-name-directory (oref this :file))))
+ )
+
+
+
+
;;; Hooks & Autoloads
;;
;; These let us watch various activities, and respond appropriately.
diff --git a/lisp/cedet/ede/cpp-root.el b/lisp/cedet/ede/cpp-root.el
index d31ede723cc..47ba16ade7f 100644
--- a/lisp/cedet/ede/cpp-root.el
+++ b/lisp/cedet/ede/cpp-root.el
@@ -242,11 +242,11 @@ ROOTPROJ is nil, since there is only one project."
(ede-add-project-autoload
(ede-project-autoload "cpp-root"
:name "CPP ROOT"
- :file 'ede-cpp-root
+ :file 'ede/cpp-root
:proj-file 'ede-cpp-root-project-file-for-dir
:proj-root 'ede-cpp-root-project-root
:load-type 'ede-cpp-root-load
- :class-sym 'ede-cpp-root
+ :class-sym 'ede-cpp-root-project
:new-p nil
:safe-p t)
;; When a user creates one of these, it should override any other project
@@ -272,10 +272,12 @@ ROOTPROJ is nil, since there is only one project."
;; level include paths, and PreProcessor macro tables.
(defclass ede-cpp-root-target (ede-target)
- ()
+ ((project :initform nil
+ :initarg :project))
"EDE cpp-root project target.
All directories need at least one target.")
+;;;###autoload
(defclass ede-cpp-root-project (ede-project eieio-instance-tracker)
((tracking-symbol :initform 'ede-cpp-root-project-list)
(include-path :initarg :include-path
@@ -339,6 +341,15 @@ The function symbol must take two arguments:
It should return the fully qualified file name passed in from NAME. If that file does not
exist, it should return nil."
)
+ (compile-command :initarg :compile-command
+ :initform nil
+ :type (or null string function)
+ :documentation
+ "Compilation command that will be used for this project.
+It could be string or function that will accept proj argument and should return string.
+The string will be passed to 'compile' function that will be issued in root
+directory of project."
+ )
)
"EDE cpp-root project class.
Each directory needs a project file to control it.")
@@ -366,7 +377,7 @@ Each directory needs a project file to control it.")
(when (or (not (file-exists-p f))
(file-directory-p f))
(delete-instance this)
- (error ":file for ede-cpp-root must be a file"))
+ (error ":file for ede-cpp-root-project must be a file"))
(oset this :file f)
(oset this :directory (file-name-directory f))
(ede-project-directory-remove-hash (file-name-directory f))
@@ -404,7 +415,8 @@ If one doesn't exist, create a new one for this directory."
:name (file-name-nondirectory
(directory-file-name dir))
:path dir
- :source nil))
+ :source nil
+ :project proj))
(object-add-to-list proj :targets ans)
)
ans))
@@ -481,15 +493,6 @@ This is for project include paths and spp source files."
filename))
-(defmethod ede-set-project-variables ((project ede-cpp-root-project) &optional buffer)
- "Set variables local to PROJECT in BUFFER.
-Also set up the lexical preprocessor map."
- (call-next-method)
- (when (and (featurep 'semantic/bovine/c) (featurep 'semantic/lex-spp))
- (setq semantic-lex-spp-project-macro-symbol-obarray
- (semantic-lex-make-spp-table (oref project spp-table)))
- ))
-
(defmethod ede-system-include-path ((this ede-cpp-root-project))
"Get the system include path used by project THIS."
(oref this system-include-path))
@@ -506,11 +509,18 @@ Also set up the lexical preprocessor map."
(table (when expfile
(semanticdb-file-table-object expfile)))
)
- (if (not table)
- (message "Cannot find file %s in project." F)
+ (cond
+ ((not (file-exists-p expfile))
+ (message "Cannot find file %s in project." F))
+ ((string= expfile (buffer-file-name))
+ ;; Don't include this file in it's own spp table.
+ )
+ ((not table)
+ (message "No db table available for %s." expfile))
+ (t
(when (semanticdb-needs-refresh-p table)
(semanticdb-refresh-table table))
- (setq spp (append spp (oref table lexical-table))))))
+ (setq spp (append spp (oref table lexical-table)))))))
(oref this spp-files))
spp))
@@ -522,6 +532,29 @@ Also set up the lexical preprocessor map."
"Get the pre-processor map for project THIS."
(ede-preprocessor-map (ede-target-parent this)))
+(defmethod project-compile-project ((proj ede-cpp-root-project) &optional command)
+ "Compile the entire current project PROJ.
+Argument COMMAND is the command to use when compiling."
+ ;; we need to be in the proj root dir for this to work
+ (let* ((cmd (oref proj :compile-command))
+ (ov (oref proj :local-variables))
+ (lcmd (when ov (cdr (assoc 'compile-command ov))))
+ (cmd-str (cond
+ ((stringp cmd) cmd)
+ ((functionp cmd) (funcall cmd proj))
+ ((stringp lcmd) lcmd)
+ ((functionp lcmd) (funcall lcmd proj)))))
+ (when cmd-str
+ (let ((default-directory (ede-project-root-directory proj)))
+ (compile cmd-str)))))
+
+(defmethod project-compile-target ((obj ede-cpp-root-target) &optional command)
+ "Compile the current target OBJ.
+Argument COMMAND is the command to use for compiling the target."
+ (when (oref obj :project)
+ (project-compile-project (oref obj :project) command)))
+
+
;;; Quick Hack
(defun ede-create-lots-of-projects-under-dir (dir projfile &rest attributes)
"Create a bunch of projects under directory DIR.
diff --git a/lisp/cedet/ede/emacs.el b/lisp/cedet/ede/emacs.el
index 925730c8121..f5a85f4a01b 100644
--- a/lisp/cedet/ede/emacs.el
+++ b/lisp/cedet/ede/emacs.el
@@ -59,7 +59,7 @@ DIR is the directory to search from."
"Get the root directory for DIR."
(when (not dir) (setq dir default-directory))
(let ((case-fold-search t)
- (proj (ede-emacs-file-existing dir)))
+ (proj (ede-files-find-existing dir ede-emacs-project-list)))
(if proj
(ede-up-directory (file-name-directory
(oref proj :file)))
@@ -134,7 +134,7 @@ m4_define(\\[SXEM4CS_BETA_VERSION\\], \\[\\([0-9]+\\)\\])")
Return nil if there isn't one.
Argument DIR is the directory it is created for.
ROOTPROJ is nil, since there is only one project."
- (or (ede-emacs-file-existing dir)
+ (or (ede-files-find-existing dir ede-emacs-project-list)
;; Doesn't already exist, so let's make one.
(let* ((vertuple (ede-emacs-version dir))
(proj (ede-emacs-project
diff --git a/lisp/cedet/ede/files.el b/lisp/cedet/ede/files.el
index 015f4fd9663..91433add7b0 100644
--- a/lisp/cedet/ede/files.el
+++ b/lisp/cedet/ede/files.el
@@ -50,12 +50,13 @@
There is no completion at the prompt. FILE is searched for within
the current EDE project."
(interactive "sFile: ")
- (let ((fname (ede-expand-filename (ede-current-project) file))
+ (let* ((proj (ede-current-project))
+ (fname (ede-expand-filename proj file))
)
(unless fname
(error "Could not find %s in %s"
file
- (ede-project-root-directory (ede-current-project))))
+ (ede-project-root-directory proj)))
(find-file fname)))
(defun ede-flush-project-hash ()
@@ -508,6 +509,26 @@ Argument DIR is the directory to trim upwards."
nil
fnd)))
+(defun ede-find-project-root (prj-file-name &optional dir)
+ "Tries to find directory with given project file"
+ (let ((prj-dir (locate-dominating-file (or dir default-directory)
+ prj-file-name)))
+ (when prj-dir
+ (expand-file-name prj-dir))))
+
+(defun ede-files-find-existing (dir prj-list)
+ "Find a project in the list of projects stored in given variable.
+DIR is the directory to search from."
+ (let ((projs prj-list)
+ (ans nil))
+ (while (and projs (not ans))
+ (let ((root (ede-project-root-directory (car projs))))
+ (when (string-match (concat "^" (regexp-quote root)) dir)
+ (setq ans (car projs))))
+ (setq projs (cdr projs)))
+ ans))
+
+
(provide 'ede/files)
;; Local variables:
diff --git a/lisp/cedet/ede/locate.el b/lisp/cedet/ede/locate.el
index 072e2c2666a..3dbe3153680 100644
--- a/lisp/cedet/ede/locate.el
+++ b/lisp/cedet/ede/locate.el
@@ -163,7 +163,7 @@ that created this EDE locate object."
"Create or update the database for the current project.
You cannot create projects for the baseclass."
(error "Cannot create/update a database of type %S"
- (object-name loc)))
+ (eieio-object-name loc)))
;;; LOCATE
;;
diff --git a/lisp/cedet/ede/pconf.el b/lisp/cedet/ede/pconf.el
index 310014a0b64..a29e3720ea2 100644
--- a/lisp/cedet/ede/pconf.el
+++ b/lisp/cedet/ede/pconf.el
@@ -152,7 +152,7 @@ don't do it. A value of nil means to just do it.")
(defmethod ede-proj-configure-recreate ((this ede-proj-project))
"Delete project THIS's configure script and start over."
(if (not (ede-proj-configure-file this))
- (error "Could not determine configure.ac for %S" (object-name this)))
+ (error "Could not determine configure.ac for %S" (eieio-object-name this)))
(let ((b (get-file-buffer (ede-proj-configure-file this))))
;; Destroy all evidence of the old configure.ac
(delete-file (ede-proj-configure-file this))
diff --git a/lisp/cedet/ede/proj-elisp.el b/lisp/cedet/ede/proj-elisp.el
index 8b426aa183f..d7720f25681 100644
--- a/lisp/cedet/ede/proj-elisp.el
+++ b/lisp/cedet/ede/proj-elisp.el
@@ -170,7 +170,7 @@ Bonus: Return a cons cell: (COMPILED . UPTODATE)."
(setq utd (1+ utd)))))))
(oref obj source))
- (message "All Emacs Lisp sources are up to date in %s" (object-name obj))
+ (message "All Emacs Lisp sources are up to date in %s" (eieio-object-name obj))
(cons comp utd)))
(defmethod ede-update-version-in-source ((this ede-proj-target-elisp) version)
@@ -194,7 +194,8 @@ is found, such as a `-version' variable, or the standard header."
(goto-char (match-beginning 1))
(insert version)))))
(setq vs (cdr vs)))
- (if (not match) (call-next-method)))))
+ ;; The next method will include comments such as "Version:"
+ (call-next-method))))
;;; Makefile generation functions
diff --git a/lisp/cedet/ede/proj.el b/lisp/cedet/ede/proj.el
index 2da2737d377..702e35f0b1f 100644
--- a/lisp/cedet/ede/proj.el
+++ b/lisp/cedet/ede/proj.el
@@ -512,11 +512,11 @@ Optional argument COMMAND is the s the alternate command to use."
(defmethod project-debug-target ((obj ede-proj-target))
"Run the current project target OBJ in a debugger."
- (error "Debug-target not supported by %s" (object-name obj)))
+ (error "Debug-target not supported by %s" (eieio-object-name obj)))
(defmethod project-run-target ((obj ede-proj-target))
"Run the current project target OBJ."
- (error "Run-target not supported by %s" (object-name obj)))
+ (error "Run-target not supported by %s" (eieio-object-name obj)))
(defmethod ede-proj-makefile-target-name ((this ede-proj-target))
"Return the name of the main target for THIS target."
diff --git a/lisp/cedet/ede/util.el b/lisp/cedet/ede/util.el
index 88a3e0a4512..71a79a1b706 100644
--- a/lisp/cedet/ede/util.el
+++ b/lisp/cedet/ede/util.el
@@ -49,7 +49,7 @@ Argument NEWVERSION is the version number to use in the current project."
(defmethod project-update-version ((ot ede-project))
"The :version of the project OT has been updated.
Handle saving, or other detail."
- (error "project-update-version not supported by %s" (object-name ot)))
+ (error "project-update-version not supported by %s" (eieio-object-name ot)))
(defmethod ede-update-version-in-source ((this ede-project) version)
"Change occurrences of a version string in sources.
diff --git a/lisp/cedet/semantic.el b/lisp/cedet/semantic.el
index edf2d0cb21a..3c93a8794b1 100644
--- a/lisp/cedet/semantic.el
+++ b/lisp/cedet/semantic.el
@@ -466,11 +466,10 @@ unterminated syntax."
(widen)
(when (or (< end start) (> end (point-max)))
(error "Invalid parse region bounds %S, %S" start end))
- (nreverse
- (semantic-repeat-parse-whole-stream
+ (semantic-repeat-parse-whole-stream
(or (cdr (assq start semantic-lex-block-streams))
(semantic-lex start end depth))
- nonterminal returnonerror))))
+ nonterminal returnonerror)))
;;; Parsing functions
;;
@@ -756,7 +755,7 @@ This function returns semantic tags without overlays."
tag 'reparse-symbol nonterm))
tag)
(semantic--tag-expand tag))
- result (append tag result))
+ result (append result tag))
;; No error in this case, a purposeful nil means don't
;; store anything.
)
@@ -934,7 +933,8 @@ Throw away all the old tags, and recreate the tag database."
'("--"))
(define-key edit-menu [senator-yank-tag]
'(menu-item "Yank Tag" senator-yank-tag
- :enable (not (ring-empty-p senator-tag-ring))
+ :enable (and (boundp 'senator-tag-ring)
+ (not (ring-empty-p senator-tag-ring)))
:help "Yank the head of the tag ring into the buffer"))
(define-key edit-menu [senator-copy-tag-to-register]
'(menu-item "Copy Tag To Register" senator-copy-tag-to-register
diff --git a/lisp/cedet/semantic/analyze.el b/lisp/cedet/semantic/analyze.el
index d1476111403..000193d4a55 100644
--- a/lisp/cedet/semantic/analyze.el
+++ b/lisp/cedet/semantic/analyze.el
@@ -800,7 +800,7 @@ CONTEXT's content is described in `semantic-analyze-current-context'."
(semantic-analyze-pulse context)
(with-output-to-temp-buffer "*Semantic Context Analysis*"
(princ "Context Type: ")
- (princ (object-name context))
+ (princ (eieio-object-name context))
(princ "\n")
(princ "Bounds: ")
(princ (oref context bounds))
diff --git a/lisp/cedet/semantic/analyze/fcn.el b/lisp/cedet/semantic/analyze/fcn.el
index 6ee85b298a2..42bc482a1df 100644
--- a/lisp/cedet/semantic/analyze/fcn.el
+++ b/lisp/cedet/semantic/analyze/fcn.el
@@ -255,7 +255,7 @@ Optional argument TYPE-DECLARATION is how TYPE was found referenced."
(nexttype (semantic-analyze-dereference-metatype type scope type-declaration))
(idx 0))
(catch 'metatype-recursion
- (while (and nexttype (not (eq (car nexttype) lasttype)))
+ (while (and nexttype (not (semantic-tag-similar-p (car nexttype) lasttype)))
(setq lasttype (car nexttype)
lasttypedeclaration (cadr nexttype))
(setq nexttype (semantic-analyze-dereference-metatype lasttype scope lasttypedeclaration))
diff --git a/lisp/cedet/semantic/bovine/c.el b/lisp/cedet/semantic/bovine/c.el
index 7aa93a0c942..2f8cf08af3e 100644
--- a/lisp/cedet/semantic/bovine/c.el
+++ b/lisp/cedet/semantic/bovine/c.el
@@ -155,15 +155,16 @@ part of the preprocessor map.")
;; not be in a buffer.
(semanticdb-refresh-table table t)
(error (message "Error updating tables for %S"
- (object-name table)))))
+ (eieio-object-name table)))))
(setq filemap (append filemap (oref table lexical-table)))
- ;; Update symbol obarray
- (setq-mode-local c-mode
- semantic-lex-spp-macro-symbol-obarray
- (semantic-lex-make-spp-table
- (append semantic-lex-c-preprocessor-symbol-map-builtin
- semantic-lex-c-preprocessor-symbol-map
- filemap)))))))))))
+ )))))
+ ;; Update symbol obarray
+ (setq-mode-local c-mode
+ semantic-lex-spp-macro-symbol-obarray
+ (semantic-lex-make-spp-table
+ (append semantic-lex-c-preprocessor-symbol-map-builtin
+ semantic-lex-c-preprocessor-symbol-map
+ filemap))))))
;; Make sure the preprocessor symbols are set up when mode-local kicks
;; in.
@@ -1946,15 +1947,17 @@ have to be wrapped in that namespace."
"Do what `semantic-get-local-variables' does, plus add `this' if needed."
(let* ((origvar (semantic-get-local-variables-default))
(ct (semantic-current-tag))
- (p (semantic-tag-function-parent ct)))
+ (p (when (semantic-tag-of-class-p ct 'function)
+ (or (semantic-tag-function-parent ct)
+ (car-safe (semantic-find-tags-by-type
+ "class" (semantic-find-tag-by-overlay)))))))
;; If we have a function parent, then that implies we can
- (if (and p (semantic-tag-of-class-p ct 'function))
- ;; Append a new tag THIS into our space.
- (cons (semantic-tag-new-variable "this" p nil)
+ (if p
+ ;; Append a new tag THIS into our space.
+ (cons (semantic-tag-new-variable "this" p nil :pointer 1)
origvar)
;; No parent, just return the usual
- origvar)
- ))
+ origvar)))
(define-mode-local-override semantic-idle-summary-current-symbol-info
c-mode ()
@@ -2151,14 +2154,18 @@ actually in their parent which is not accessible.")
(princ "\n")))
(princ "\n\nMacro Summary:\n")
+
(when semantic-lex-c-preprocessor-symbol-file
- (princ "\n Your CPP table is primed from these files:\n")
+ (princ "\n Your CPP table is primed from these system files:\n")
(dolist (file semantic-lex-c-preprocessor-symbol-file)
(princ " ")
(princ file)
(princ "\n")
(princ " in table: ")
- (princ (object-print (semanticdb-file-table-object file)))
+ (let ((fto (semanticdb-file-table-object file)))
+ (if fto
+ (princ (object-print fto))
+ (princ "No Table")))
(princ "\n")
))
@@ -2173,7 +2180,7 @@ actually in their parent which is not accessible.")
))
(when semantic-lex-c-preprocessor-symbol-map
- (princ "\n User symbol map:\n")
+ (princ "\n User symbol map (primed from system files):\n")
(dolist (S semantic-lex-c-preprocessor-symbol-map)
(princ " ")
(princ (car S))
@@ -2183,25 +2190,27 @@ actually in their parent which is not accessible.")
))
(when (and (boundp 'ede-object)
- ede-object
- (arrayp semantic-lex-spp-project-macro-symbol-obarray))
+ ede-object)
(princ "\n Project symbol map:\n")
(when (and (boundp 'ede-object) ede-object)
- (princ " Your project symbol map is derived from the EDE object:\n ")
+ (princ " Your project symbol map is also derived from the EDE object:\n ")
(princ (object-print ede-object)))
(princ "\n\n")
- (let ((macros nil))
- (mapatoms
- #'(lambda (symbol)
- (setq macros (cons symbol macros)))
- semantic-lex-spp-project-macro-symbol-obarray)
- (dolist (S macros)
- (princ " ")
- (princ (symbol-name S))
- (princ " = ")
- (princ (symbol-value S))
- (princ "\n")
- )))
+ (if (arrayp semantic-lex-spp-project-macro-symbol-obarray)
+ (let ((macros nil))
+ (mapatoms
+ #'(lambda (symbol)
+ (setq macros (cons symbol macros)))
+ semantic-lex-spp-project-macro-symbol-obarray)
+ (dolist (S macros)
+ (princ " ")
+ (princ (symbol-name S))
+ (princ " = ")
+ (princ (symbol-value S))
+ (princ "\n")
+ ))
+ ;; Else, not map
+ (princ " No Symbols.\n")))
(princ "\n\n Use: M-x semantic-lex-spp-describe RET\n")
(princ "\n to see the complete macro table.\n")
diff --git a/lisp/cedet/semantic/bovine/gcc.el b/lisp/cedet/semantic/bovine/gcc.el
index 82876adb37e..7beb8ff3203 100644
--- a/lisp/cedet/semantic/bovine/gcc.el
+++ b/lisp/cedet/semantic/bovine/gcc.el
@@ -157,7 +157,11 @@ It should also include other symbols GCC was compiled with.")
;; `cpp' command in `semantic-gcc-setup' doesn't work on
;; Mac, try `gcc'.
(apply 'semantic-gcc-query "gcc" cpp-options))))
- (defines (semantic-cpp-defs query))
+ (defines (if (stringp query)
+ (semantic-cpp-defs query)
+ (message (concat "Could not query gcc for defines. "
+ "Maybe g++ is not installed."))
+ nil))
(ver (cdr (assoc 'version fields)))
(host (or (cdr (assoc 'target fields))
(cdr (assoc '--target fields))
diff --git a/lisp/cedet/semantic/complete.el b/lisp/cedet/semantic/complete.el
index 194e0ee5f66..1c2ddf45c9d 100644
--- a/lisp/cedet/semantic/complete.el
+++ b/lisp/cedet/semantic/complete.el
@@ -678,7 +678,8 @@ a reasonable distance."
;;(message "Inline Hook installed, but overlay deleted.")
(semantic-complete-inline-exit))
;; Exit if commands caused us to exit the area of interest
- (let ((s (semantic-overlay-start semantic-complete-inline-overlay))
+ (let ((os (semantic-overlay-get semantic-complete-inline-overlay 'semantic-original-start))
+ (s (semantic-overlay-start semantic-complete-inline-overlay))
(e (semantic-overlay-end semantic-complete-inline-overlay))
(b (semantic-overlay-buffer semantic-complete-inline-overlay))
(txt nil)
@@ -686,8 +687,10 @@ a reasonable distance."
(cond
;; EXIT when we are no longer in a good place.
((or (not (eq b (current-buffer)))
- (<= (point) s)
- (> (point) e))
+ (< (point) s)
+ (< (point) os)
+ (> (point) e)
+ )
;;(message "Exit: %S %S %S" s e (point))
(semantic-complete-inline-exit)
)
@@ -710,7 +713,6 @@ a reasonable distance."
(t
;; Else, show completions now
(semantic-complete-inline-force-display)
-
))))
;; If something goes terribly wrong, clean up after ourselves.
(error (semantic-complete-inline-exit))))
@@ -761,6 +763,10 @@ END is at the end of the current symbol being completed."
(semantic-overlay-put semantic-complete-inline-overlay
'window-config-start
(current-window-configuration))
+ ;; Save the original start. We need to exit completion if START
+ ;; moves.
+ (semantic-overlay-put semantic-complete-inline-overlay
+ 'semantic-original-start start)
;; Install our command hooks
(add-hook 'pre-command-hook 'semantic-complete-pre-command-hook)
(add-hook 'post-command-hook 'semantic-complete-post-command-hook)
@@ -1171,7 +1177,7 @@ These collectors track themselves on a per-buffer basis."
(let ((old nil)
(bl semantic-collector-per-buffer-list))
(while (and bl (null old))
- (if (eq (object-class (car bl)) this)
+ (if (eq (eieio-object-class (car bl)) this)
(setq old (car bl))))
(unless old
(let ((new (call-next-method)))
@@ -1510,7 +1516,7 @@ one in the source buffer."
(insert (semantic-format-tag-summarize tag nil t) "\n\n")
(when table
(insert "From table: \n")
- (insert (object-name table) "\n\n"))
+ (insert (eieio-object-name table) "\n\n"))
(when buf
(insert "In buffer: \n\n")
(insert (format "%S" buf)))
diff --git a/lisp/cedet/semantic/db-el.el b/lisp/cedet/semantic/db-el.el
index 260f964c191..1b0f3292ad3 100644
--- a/lisp/cedet/semantic/db-el.el
+++ b/lisp/cedet/semantic/db-el.el
@@ -216,9 +216,8 @@ TOKTYPE is a hint to the type of tag desired."
(symbol-name sym)
"class"
(semantic-elisp-desymbolify
- (aref (class-v semanticdb-project-database)
- class-public-a)) ;; slots
- (semantic-elisp-desymbolify (class-parents sym)) ;; parents
+ (eieio--class-public-a (class-v semanticdb-project-database))) ;; slots
+ (semantic-elisp-desymbolify (eieio-class-parents sym)) ;; parents
))
((not toktype)
;; Figure it out on our own.
diff --git a/lisp/cedet/semantic/db-file.el b/lisp/cedet/semantic/db-file.el
index 269ff264126..2ef4fba1288 100644
--- a/lisp/cedet/semantic/db-file.el
+++ b/lisp/cedet/semantic/db-file.el
@@ -44,6 +44,8 @@
(defcustom semanticdb-default-save-directory
(locate-user-emacs-file "semanticdb" ".semanticdb")
"Directory name where semantic cache files are stored.
+By default, it is either ~/.emacs.d/semanticdb, or ~/.semanticdb depending
+on which exists.
If this value is nil, files are saved in the current directory. If the value
is a valid directory, then it overrides `semanticdb-default-file-name' and
stores caches in a coded file name in this directory."
@@ -316,7 +318,7 @@ Argument OBJ is the object to write."
(data-debug-new-buffer (concat "*SEMANTICDB ERROR*"))
(data-debug-insert-thing obj "*" "")
(setq semanticdb-data-debug-on-write-error nil))
- (message "Error Writing Table: %s" (object-name obj))
+ (message "Error Writing Table: %s" (eieio-object-name obj))
(error "%S" (car (cdr tableerror)))))
;; Clear the dirty bit.
diff --git a/lisp/cedet/semantic/db-find.el b/lisp/cedet/semantic/db-find.el
index 77fd10fc7aa..2e4ca319a9d 100644
--- a/lisp/cedet/semantic/db-find.el
+++ b/lisp/cedet/semantic/db-find.el
@@ -244,7 +244,7 @@ This class will cache data derived during various searches.")
(let ((tab-idx (semanticdb-get-table-index tab)))
;; Not a full reset?
(when (oref tab-idx type-cache)
- (require 'db-typecache)
+ (require 'semantic/db-typecache)
(semanticdb-typecache-notify-reset
(oref tab-idx type-cache)))
)))
@@ -919,7 +919,7 @@ but should be good enough for debugging assertions."
(if (< (length result) 2)
(concat "#<FIND RESULT "
(mapconcat (lambda (a)
- (concat "(" (object-name (car a) ) " . "
+ (concat "(" (eieio-object-name (car a) ) " . "
"#<TAG LIST " (number-to-string (length (cdr a))) ">)"))
result
" ")
@@ -1285,7 +1285,7 @@ associated with that tag should be loaded into a buffer."
(semanticdb-find-tags-collector
(lambda (table tags)
(semanticdb-find-tags-external-children-of-type-method table type tags))
- path find-file-match))
+ path find-file-match t))
(defun semanticdb-find-tags-subclasses-of-type
(type &optional path find-file-match)
diff --git a/lisp/cedet/semantic/db.el b/lisp/cedet/semantic/db.el
index a6088231c61..e8784c4f85c 100644
--- a/lisp/cedet/semantic/db.el
+++ b/lisp/cedet/semantic/db.el
@@ -190,7 +190,7 @@ If one doesn't exist, create it."
(oref obj index)
(let ((idx nil))
(setq idx (funcall semanticdb-default-find-index-class
- (concat (object-name obj) " index")
+ (concat (eieio-object-name obj) " index")
;; Fill in the defaults
:table obj
))
@@ -469,7 +469,7 @@ other than :table."
(let ((cache (oref table cache))
(obj nil))
(while (and (not obj) cache)
- (if (eq (object-class-fast (car cache)) desired-class)
+ (if (eq (eieio--object-class (car cache)) desired-class)
(setq obj (car cache)))
(setq cache (cdr cache)))
(if obj
@@ -520,7 +520,7 @@ other than :table."
(let ((cache (oref db cache))
(obj nil))
(while (and (not obj) cache)
- (if (eq (object-class-fast (car cache)) desired-class)
+ (if (eq (eieio--object-class (car cache)) desired-class)
(setq obj (car cache)))
(setq cache (cdr cache)))
(if obj
diff --git a/lisp/cedet/semantic/decorate/include.el b/lisp/cedet/semantic/decorate/include.el
index 3a08db2b0d0..0451ad44fe8 100644
--- a/lisp/cedet/semantic/decorate/include.el
+++ b/lisp/cedet/semantic/decorate/include.el
@@ -797,7 +797,7 @@ Argument EVENT describes the event that caused this function to be called."
(dolist (p path)
(if (slot-boundp p 'tags)
(princ (format "\n %s :\t%d tags, %d are includes. %s"
- (object-name-string p)
+ (eieio-object-name-string p)
(length (oref p tags))
(length (semantic-find-tags-by-class
'include p))
@@ -810,7 +810,7 @@ Argument EVENT describes the event that caused this function to be called."
" Needs to be parsed.")
(t ""))))
(princ (format "\n %s :\tUnparsed"
- (object-name-string p))))
+ (eieio-object-name-string p))))
)))
)))
diff --git a/lisp/cedet/semantic/ede-grammar.el b/lisp/cedet/semantic/ede-grammar.el
index 094832a8258..cb2a1faaac0 100644
--- a/lisp/cedet/semantic/ede-grammar.el
+++ b/lisp/cedet/semantic/ede-grammar.el
@@ -162,7 +162,7 @@ Lays claim to all -by.el, and -wy.el files."
(setq comp (1+ comp))
(setq utd (1+ utd))))))))
(oref obj source))
- (message "All Semantic Grammar sources are up to date in %s" (object-name obj))
+ (message "All Semantic Grammar sources are up to date in %s" (eieio-object-name obj))
(cons comp utd)))
;;; Makefile generation functions
diff --git a/lisp/cedet/semantic/find.el b/lisp/cedet/semantic/find.el
index aa42a77725e..f660c69ec3d 100644
--- a/lisp/cedet/semantic/find.el
+++ b/lisp/cedet/semantic/find.el
@@ -313,6 +313,15 @@ TABLE is a tag table. See `semantic-something-to-tag-table'."
(eq ,class (semantic-tag-class (car tags)))
,table))
+(defmacro semantic-filter-tags-by-class (class &optional table)
+ "Find all tags of class not in the list CLASS in TABLE.
+CLASS is a list of symbols representing the class of the token,
+such as 'variable, of 'function..
+TABLE is a tag table. See `semantic-something-to-tag-table'."
+ `(semantic--find-tags-by-macro
+ (not (memq (semantic-tag-class (car tags)) ,class))
+ ,table))
+
(defmacro semantic-find-tags-by-type (type &optional table)
"Find all tags of with a type TYPE in TABLE.
TYPE is a string or tag representing a data type as defined in the
diff --git a/lisp/cedet/semantic/fw.el b/lisp/cedet/semantic/fw.el
index 5e050112a54..dadf181ce21 100644
--- a/lisp/cedet/semantic/fw.el
+++ b/lisp/cedet/semantic/fw.el
@@ -122,15 +122,13 @@
)
- (if (and (not (featurep 'xemacs))
- (>= emacs-major-version 21))
- (defalias 'semantic-make-local-hook 'identity)
- (defalias 'semantic-make-local-hook 'make-local-hook)
- )
+ (defalias 'semantic-make-local-hook
+ (if (and (not (featurep 'xemacs))
+ (>= emacs-major-version 21))
+ #'identity #'make-local-hook))
- (if (featurep 'xemacs)
- (defalias 'semantic-mode-line-update 'redraw-modeline)
- (defalias 'semantic-mode-line-update 'force-mode-line-update))
+ (defalias 'semantic-mode-line-update
+ (if (featurep 'xemacs) #'redraw-modeline #'force-mode-line-update))
;; Since Emacs 22 major mode functions should use `run-mode-hooks' to
;; run major mode hooks.
diff --git a/lisp/cedet/semantic/grammar.el b/lisp/cedet/semantic/grammar.el
index ba4570e692b..9cb0f60b80a 100644
--- a/lisp/cedet/semantic/grammar.el
+++ b/lisp/cedet/semantic/grammar.el
@@ -51,6 +51,9 @@
(declare-function semantic-grammar-wy--install-parser
"semantic/gram-wy-fallback")
+(declare-function semantic-grammar-wy--install-parser
+ "semantic/gram-wy-fallback")
+
;;;;
;;;; Set up lexer
diff --git a/lisp/cedet/semantic/sb.el b/lisp/cedet/semantic/sb.el
index e2d143b529e..32117da1af5 100644
--- a/lisp/cedet/semantic/sb.el
+++ b/lisp/cedet/semantic/sb.el
@@ -43,6 +43,11 @@ This will replace the named bucket that would have usually occurred here."
:group 'speedbar
:type 'integer)
+(defvar semantic-sb-filter-tags-of-class '(code)
+ "Tags classes to not display in speedbar.
+Make this buffer local for modes that have different types of tags
+that should be ignored.")
+
(defcustom semantic-sb-button-format-tag-function 'semantic-format-tag-abbreviate
"*Function called to create the text for a but from a token."
:group 'speedbar
@@ -405,7 +410,12 @@ Returns the tag list, or t for an error."
(setq out (semantic-adopt-external-members out))
;; Dump all the tokens into buckets.
(semantic-sb-with-tag-buffer (car out)
- (semantic-bucketize out)))
+ (semantic-bucketize out nil
+ (lambda (tagsin)
+ ;; Remove all boring tags.
+ (semantic-filter-tags-by-class
+ semantic-sb-filter-tags-of-class
+ tagsin)))))
(error t))
t)))
diff --git a/lisp/cedet/semantic/senator.el b/lisp/cedet/semantic/senator.el
index a79e70a7f61..157223ff192 100644
--- a/lisp/cedet/semantic/senator.el
+++ b/lisp/cedet/semantic/senator.el
@@ -727,7 +727,13 @@ kill ring."
(semantic-fetch-tags)
(let ((ft (semantic-obtain-foreign-tag)))
(when ft
- (set-register register ft)
+ (set-register
+ register (registerv-make
+ ft
+ :insert-func #'semantic-insert-foreign-tag
+ :jump-func (lambda (v)
+ (switch-to-buffer (semantic-tag-buffer v))
+ (goto-char (semantic-tag-start v)))))
(if kill-flag
(kill-region (semantic-tag-start ft)
(semantic-tag-end ft))))))
diff --git a/lisp/cedet/semantic/sort.el b/lisp/cedet/semantic/sort.el
index 6b58689524c..b32e11290ac 100644
--- a/lisp/cedet/semantic/sort.el
+++ b/lisp/cedet/semantic/sort.el
@@ -522,7 +522,7 @@ See `semantic-tag-external-member-children' for details."
(semanticdb-minor-mode-p)
(require 'semantic/db-find))
(let ((m (semanticdb-find-tags-external-children-of-type
- (semantic-tag-name tag))))
+ (semantic-tag-name tag) tag)))
(if m (apply #'append (mapcar #'cdr m))))
(semantic--find-tags-by-function
`(lambda (tok)
diff --git a/lisp/cedet/semantic/tag-ls.el b/lisp/cedet/semantic/tag-ls.el
index 7e5913334ea..bc7be980998 100644
--- a/lisp/cedet/semantic/tag-ls.el
+++ b/lisp/cedet/semantic/tag-ls.el
@@ -146,36 +146,42 @@ are the same.
IGNORABLE-ATTRIBUTES are tag attributes that can be ignored.
See `semantic-tag-similar-p' for details."
- (let* ((ignore (append ignorable-attributes semantic-tag-similar-ignorable-attributes))
- (A1 (and (semantic--tag-similar-names-p tag1 tag2 (memq :name ignore))
- (semantic--tag-similar-types-p tag1 tag2)
- (semantic-tag-of-class-p tag1 (semantic-tag-class tag2))))
- (attr1 (semantic-tag-attributes tag1))
- (attr2 (semantic-tag-attributes tag2))
- (A2 t)
- (A3 t)
- )
- ;; Test if there are non-ignorable attributes in A2 which are not present in A1
- (while (and A2 attr2)
- (let ((a (car attr2)))
- (unless (or (eq a :type) (memq a ignore))
- (setq A2 (semantic-tag-get-attribute tag1 a)))
- (setq attr2 (cdr (cdr attr2)))))
- (while (and A2 attr1 A3)
- (let ((a (car attr1)))
-
- (cond ((or (eq a :type) ;; already tested above.
- (memq a ignore)) ;; Ignore them...
- nil)
-
- (t
- (setq A3
- (semantic--tag-attribute-similar-p
- a (car (cdr attr1)) (semantic-tag-get-attribute tag2 a)
- ignorable-attributes)))
- ))
- (setq attr1 (cdr (cdr attr1))))
- (and A1 A2 A3)))
+ (or
+ ;; Tags are similar if they have the exact same lisp object
+ ;; Added for performance when testing a relatively common case in some uses
+ ;; of this code.
+ (eq tag1 tag2)
+ ;; More complex similarity test.
+ (let* ((ignore (append ignorable-attributes semantic-tag-similar-ignorable-attributes))
+ (A1 (and (semantic--tag-similar-names-p tag1 tag2 (memq :name ignore))
+ (semantic--tag-similar-types-p tag1 tag2)
+ (semantic-tag-of-class-p tag1 (semantic-tag-class tag2))))
+ (attr1 (semantic-tag-attributes tag1))
+ (attr2 (semantic-tag-attributes tag2))
+ (A2 t)
+ (A3 t)
+ )
+ ;; Test if there are non-ignorable attributes in A2 which are not present in A1
+ (while (and A2 attr2)
+ (let ((a (car attr2)))
+ (unless (or (eq a :type) (memq a ignore))
+ (setq A2 (semantic-tag-get-attribute tag1 a)))
+ (setq attr2 (cdr (cdr attr2)))))
+ (while (and A2 attr1 A3)
+ (let ((a (car attr1)))
+
+ (cond ((or (eq a :type) ;; already tested above.
+ (memq a ignore)) ;; Ignore them...
+ nil)
+
+ (t
+ (setq A3
+ (semantic--tag-attribute-similar-p
+ a (car (cdr attr1)) (semantic-tag-get-attribute tag2 a)
+ ignorable-attributes)))
+ ))
+ (setq attr1 (cdr (cdr attr1))))
+ (and A1 A2 A3))))
;;; FULL NAMES
;;
diff --git a/lisp/cedet/semantic/wisent/javat-wy.el b/lisp/cedet/semantic/wisent/javat-wy.el
index e666b9c4191..f082358c4f5 100644
--- a/lisp/cedet/semantic/wisent/javat-wy.el
+++ b/lisp/cedet/semantic/wisent/javat-wy.el
Binary files differ
diff --git a/lisp/cedet/semantic/wisent/wisent.el b/lisp/cedet/semantic/wisent/wisent.el
index 1cb039f9750..32788381b23 100644
--- a/lisp/cedet/semantic/wisent/wisent.el
+++ b/lisp/cedet/semantic/wisent/wisent.el
@@ -46,8 +46,8 @@
\\_ _/
( `o ` (European ;-) Bison
\\ ` /
- ( D ,¨ for Emacs!
- ` ~ ,¨
+ ( D ,\" for Emacs!
+ ` ~ ,\"
`\"\""
:group 'semantic)
diff --git a/lisp/cedet/srecode/args.el b/lisp/cedet/srecode/args.el
index b91f96f611d..d6798f7523d 100644
--- a/lisp/cedet/srecode/args.el
+++ b/lisp/cedet/srecode/args.el
@@ -157,6 +157,30 @@ do not contain any text from preceding or following text."
(srecode-dictionary-show-section dict "RCS")
)))
+;;; :project ARGUMENT HANDLING
+;;
+;; When the :project argument is required, fill the dictionary with
+;; information that the current project (from EDE) might know
+(defun srecode-semantic-handle-:project (dict)
+ "Add macros into the dictionary DICT based on the current ede project."
+ (let* ((bfn (buffer-file-name))
+ (dir (file-name-directory bfn)))
+ (if (ede-toplevel)
+ (let* ((projecttop (ede-toplevel-project default-directory))
+ (relfname (file-relative-name bfn projecttop))
+ (reldir (file-relative-name dir projecttop))
+ )
+ (srecode-dictionary-set-value dict "PROJECT_FILENAME" relfname)
+ (srecode-dictionary-set-value dict "PROJECT_DIRECTORY" reldir)
+ (srecode-dictionary-set-value dict "PROJECT_NAME" (ede-name (ede-toplevel)))
+ (srecode-dictionary-set-value dict "PROJECT_VERSION" (oref (ede-toplevel) :version))
+ )
+ ;; If there is no EDE project, then put in some base values.
+ (srecode-dictionary-set-value dict "PROJECT_FILENAME" bfn)
+ (srecode-dictionary-set-value dict "PROJECT_DIRECTORY" dir)
+ (srecode-dictionary-set-value dict "PROJECT_NAME" "N/A")
+ (srecode-dictionary-set-value dict "PROJECT_VERSION" "1.0"))))
+
;;; :system ARGUMENT HANDLING
;;
;; When a :system argument is required, fill the dictionary with
diff --git a/lisp/cedet/srecode/compile.el b/lisp/cedet/srecode/compile.el
index 170b99c1fd2..0d68036c433 100644
--- a/lisp/cedet/srecode/compile.el
+++ b/lisp/cedet/srecode/compile.el
@@ -510,12 +510,12 @@ to the inserter constructor."
;;(message "Compile: %s %S" name props)
(if (not key)
(apply 'srecode-template-inserter-variable name props)
- (let ((classes (class-children srecode-template-inserter))
+ (let ((classes (eieio-class-children srecode-template-inserter))
(new nil))
;; Loop over the various subclasses and
;; create the correct inserter.
(while (and (not new) classes)
- (setq classes (append classes (class-children (car classes))))
+ (setq classes (append classes (eieio-class-children (car classes))))
;; Do we have a match?
(when (and (not (class-abstract-p (car classes)))
(equal (oref (car classes) key) key))
@@ -594,7 +594,7 @@ A list of defined variables VARS provides a variable table."
(defmethod srecode-dump ((tmp srecode-template))
"Dump the contents of the SRecode template tmp."
(princ "== Template \"")
- (princ (object-name-string tmp))
+ (princ (eieio-object-name-string tmp))
(princ "\" in context ")
(princ (oref tmp context))
(princ "\n")
@@ -640,12 +640,12 @@ Argument INDENT specifies the indentation level for the list."
(defmethod srecode-dump ((ins srecode-template-inserter) indent)
"Dump the state of the SRecode template inserter INS."
(princ "INS: \"")
- (princ (object-name-string ins))
+ (princ (eieio-object-name-string ins))
(when (oref ins :secondname)
(princ "\" : \"")
(princ (oref ins :secondname)))
(princ "\" type \"")
- (let* ((oc (symbol-name (object-class ins)))
+ (let* ((oc (symbol-name (eieio-object-class ins)))
(junk (string-match "srecode-template-inserter-" oc))
(on (if junk
(substring oc (match-end 0))
diff --git a/lisp/cedet/srecode/cpp.el b/lisp/cedet/srecode/cpp.el
index 94b394a1631..fd500b6d9a3 100644
--- a/lisp/cedet/srecode/cpp.el
+++ b/lisp/cedet/srecode/cpp.el
@@ -70,8 +70,7 @@ HEADER - Shown section if in a header file."
(srecode-dictionary-show-section dict "NOTHEADER"))
;; Strip out bad characters
- (while (string-match "\\.\\| " fsym)
- (setq fsym (replace-match "_" t t fsym)))
+ (setq fsym (replace-regexp-in-string "[^a-zA-Z0-9_]" "_" fsym))
(srecode-dictionary-set-value dict "FILENAME_SYMBOL" fsym)
)
)
diff --git a/lisp/cedet/srecode/dictionary.el b/lisp/cedet/srecode/dictionary.el
index bac05666726..bbc791f09d8 100644
--- a/lisp/cedet/srecode/dictionary.el
+++ b/lisp/cedet/srecode/dictionary.el
@@ -175,7 +175,7 @@ associated with a buffer or parent."
((srecode-dictionary-child-p buffer-or-parent)
(setq parent buffer-or-parent
buffer (oref buffer-or-parent buffer)
- origin (concat (object-name buffer-or-parent) " in "
+ origin (concat (eieio-object-name buffer-or-parent) " in "
(if buffer (buffer-name buffer)
"no buffer")))
(when buffer
@@ -454,12 +454,12 @@ If you subclass `srecode-dictionary-compound-value' then this
method could return nil, but if it does that, it must insert
the value itself using `princ', or by detecting if the current
standard out is a buffer, and using `insert'."
- (object-name cp))
+ (eieio-object-name cp))
(defmethod srecode-dump ((cp srecode-dictionary-compound-value)
&optional indent)
"Display information about this compound value."
- (princ (object-name cp))
+ (princ (eieio-object-name cp))
)
(defmethod srecode-compound-toString ((cp srecode-dictionary-compound-variable)
@@ -654,7 +654,7 @@ STATE is the current compiler state."
4)))
(while entry
(princ " --> SUBDICTIONARY ")
- (princ (object-name dict))
+ (princ (eieio-object-name dict))
(princ "\n")
(srecode-dump (car entry) newindent)
(setq entry (cdr entry))
diff --git a/lisp/cedet/srecode/insert.el b/lisp/cedet/srecode/insert.el
index 466efae3b9c..0d647bb56c5 100644
--- a/lisp/cedet/srecode/insert.el
+++ b/lisp/cedet/srecode/insert.el
@@ -809,7 +809,7 @@ Arguments ESCAPE-START and ESCAPE-END are the current escape sequences in use."
(srecode-insert-report-error
dict
"Only section dictionaries allowed for `%s'"
- (object-name-string sti)))
+ (eieio-object-name-string sti)))
;; Output the code from the sub-template.
(srecode-insert-method (slot-value sti slot) dict))
@@ -866,7 +866,7 @@ Return the remains of INPUT."
(let* ((out (srecode-compile-split-code tag input STATE
(oref ins :object-name))))
(oset ins template (srecode-template
- (object-name-string ins)
+ (eieio-object-name-string ins)
:context nil
:args nil
:code (cdr out)))
diff --git a/lisp/cedet/srecode/java.el b/lisp/cedet/srecode/java.el
index db4d2deee28..29a8465c45c 100644
--- a/lisp/cedet/srecode/java.el
+++ b/lisp/cedet/srecode/java.el
@@ -42,9 +42,24 @@ FILENAME_AS_CLASS - file converted to a Java class name."
)
(while (string-match "\\.\\| " fpak)
(setq fpak (replace-match "_" t t fpak)))
- (if (string-match "src/" dir)
- (setq dir (substring dir (match-end 0)))
- (setq dir (file-name-nondirectory (directory-file-name dir))))
+ ;; We can extract package from:
+ ;; 1) a java EDE project source paths,
+ (cond ((ede-current-project)
+ (let* ((proj (ede-current-project))
+ (pths (ede-source-paths proj 'java-mode))
+ (pth)
+ (res))
+ (while (and (not res)
+ (setq pth (expand-file-name (car pths))))
+ (when (string-match pth dir)
+ (setq res (substring dir (match-end 0))))
+ (setq pths (cdr pths)))
+ (setq dir res)))
+ ;; 2) a simple heuristic
+ ((string-match "src/" dir)
+ (setq dir (substring dir (match-end 0))))
+ ;; 3) outer directory as a fallback
+ (t (setq dir (file-name-nondirectory (directory-file-name dir)))))
(setq dir (directory-file-name dir))
(while (string-match "/" dir)
(setq dir (replace-match "." t t dir)))
diff --git a/lisp/cedet/srecode/map.el b/lisp/cedet/srecode/map.el
index cbe602f3299..1dd9ba4cf47 100644
--- a/lisp/cedet/srecode/map.el
+++ b/lisp/cedet/srecode/map.el
@@ -363,6 +363,9 @@ Return non-nil if the map changed."
(let ((semantic-init-hook nil))
(semantic-new-buffer-fcn))
)
+ ;; Force semantic to be enabled in this buffer.
+ (unless (semantic-active-p)
+ (semantic-new-buffer-fcn))
(semantic-fetch-tags)
(let* ((mode-tag
diff --git a/lisp/cedet/srecode/mode.el b/lisp/cedet/srecode/mode.el
index 8c4a53ec891..e8e1c78198e 100644
--- a/lisp/cedet/srecode/mode.el
+++ b/lisp/cedet/srecode/mode.el
@@ -225,7 +225,7 @@ MENU-DEF is the menu to bind this into."
(ctxtcons (assoc ctxt alltabs))
(bind (if (slot-boundp temp 'binding)
(oref temp binding)))
- (name (object-name-string temp)))
+ (name (eieio-object-name-string temp)))
(when (not ctxtcons)
(if (string= context ctxt)
diff --git a/lisp/cedet/srecode/srt-mode.el b/lisp/cedet/srecode/srt-mode.el
index 455895c003d..2f43dc3872b 100644
--- a/lisp/cedet/srecode/srt-mode.el
+++ b/lisp/cedet/srecode/srt-mode.el
@@ -187,7 +187,7 @@ we can tell font lock about them.")
"Keymap used in srecode mode.")
;;;###autoload
-(define-derived-mode srecode-template-mode fundamental-mode "SRecorder"
+(define-derived-mode srecode-template-mode fundamental-mode "SRecode"
"Major-mode for writing SRecode macros."
(set (make-local-variable 'comment-start) ";;")
(set (make-local-variable 'comment-end) "")
@@ -232,7 +232,7 @@ we can tell font lock about them.")
"Provide help for working with macros in a template."
(interactive)
(let* ((root 'srecode-template-inserter)
- (chl (aref (class-v root) class-children))
+ (chl (eieio--class-children (class-v root)))
(ess (srecode-template-get-escape-start))
(ees (srecode-template-get-escape-end))
)
@@ -248,7 +248,7 @@ we can tell font lock about them.")
(showexample t)
)
(setq chl (cdr chl))
- (setq chl (append (aref (class-v C) class-children) chl))
+ (setq chl (append (eieio--class-children (class-v C)) chl))
(catch 'skip
(when (eq C 'srecode-template-inserter-section-end)
diff --git a/lisp/cedet/srecode/srt.el b/lisp/cedet/srecode/srt.el
index 3875246cb37..1fad31dafd6 100644
--- a/lisp/cedet/srecode/srt.el
+++ b/lisp/cedet/srecode/srt.el
@@ -69,6 +69,7 @@ DEFAULT is the default if RET is hit."
nil initial (or hist 'srecode-read-major-mode-history))
)
+;;;###autoload
(defun srecode-semantic-handle-:srt (dict)
"Add macros into the dictionary DICT based on the current SRT file.
Adds the following:
@@ -104,4 +105,9 @@ MODE - The mode of this buffer. If not declared yet, guess."
(provide 'srecode/srt)
+;; Local variables:
+;; generated-autoload-file: "loaddefs.el"
+;; generated-autoload-load-name: "srecode/srt"
+;; End:
+
;;; srecode/srt.el ends here
diff --git a/lisp/cedet/srecode/table.el b/lisp/cedet/srecode/table.el
index 802740ba063..26163bd1e51 100644
--- a/lisp/cedet/srecode/table.el
+++ b/lisp/cedet/srecode/table.el
@@ -251,7 +251,7 @@ Use PREDICATE is the same as for the `sort' function."
(defmethod srecode-dump ((tab srecode-template-table))
"Dump the contents of the SRecode template table TAB."
(princ "Template Table for ")
- (princ (object-name-string tab))
+ (princ (eieio-object-name-string tab))
(princ "\nPriority: ")
(prin1 (oref tab :priority))
(when (oref tab :application)
diff --git a/lisp/cmuscheme.el b/lisp/cmuscheme.el
index d40822188ee..0f89eae8828 100644
--- a/lisp/cmuscheme.el
+++ b/lisp/cmuscheme.el
@@ -447,7 +447,7 @@ in the next one.")
"\"\)\n")))
-(defvar scheme-buffer nil "*The current scheme process buffer.
+(defvar scheme-buffer nil "The current scheme process buffer.
MULTIPLE PROCESS SUPPORT
===========================================================================
@@ -478,8 +478,8 @@ This process selection is performed by function `scheme-proc'.
Whenever \\[run-scheme] fires up a new process, it resets `scheme-buffer'
to be the new process's buffer. If you only run one process, this will
-do the right thing. If you run multiple processes, you can change
-`scheme-buffer' to another process buffer with \\[set-variable].
+do the right thing. If you run multiple processes, you might need to
+set `scheme-buffer' to whichever process buffer you want to use.
More sophisticated approaches are, of course, possible. If you find yourself
needing to switch back and forth between multiple processes frequently,
diff --git a/lisp/color.el b/lisp/color.el
index 70379611c4f..50f6675bf4b 100644
--- a/lisp/color.el
+++ b/lisp/color.el
@@ -33,9 +33,6 @@
;;; Code:
-(eval-when-compile
- (require 'cl))
-
;; Emacs < 23.3
(eval-and-compile
(unless (boundp 'float-pi)
@@ -69,9 +66,9 @@ RED, GREEN, and BLUE should be numbers between 0.0 and 1.0, inclusive."
COLOR-NAME should be a string naming a color (e.g. \"white\"), or
a string specifying a color's RGB components (e.g. \"#ff12ec\")."
(let ((color (color-name-to-rgb color-name)))
- (list (- 1.0 (car color))
- (- 1.0 (cadr color))
- (- 1.0 (caddr color)))))
+ (list (- 1.0 (nth 0 color))
+ (- 1.0 (nth 1 color))
+ (- 1.0 (nth 2 color)))))
(defun color-gradient (start stop step-number)
"Return a list with STEP-NUMBER colors from START to STOP.
@@ -133,7 +130,7 @@ inclusive."
(max (max r g b))
(min (min r g b)))
(if (< (- max min) 1e-8)
- (list 0.0 0.0 0.0)
+ (list 0.0 0.0 min)
(list
(/ (* 2 float-pi
(cond ((and (= r g) (= g b)) 0)
@@ -149,7 +146,7 @@ inclusive."
(+ 240 (* 60 (/ (- r g) (- max min)))))))
360)
(if (= max 0) 0 (- 1 (/ min max)))
- (/ max 255.0)))))
+ max))))
(defun color-rgb-to-hsl (red green blue)
"Convert RGB colors to their HSL representation.
diff --git a/lisp/comint.el b/lisp/comint.el
index eda73af3501..d5d95f8cbc0 100644
--- a/lisp/comint.el
+++ b/lisp/comint.el
@@ -213,7 +213,7 @@ This mirrors the optional behavior of tcsh (its autoexpand and histlist).
If the value is `input', then the expansion is seen on input.
If the value is `history', then the expansion is only when inserting
into the buffer's input ring. See also `comint-magic-space' and
-`comint-dynamic-complete'.
+`completion-at-point'.
This variable is buffer-local."
:type '(choice (const :tag "off" nil)
@@ -371,7 +371,7 @@ text matching `comint-prompt-regexp', depending on the value of
'(comint-c-a-p-replace-by-expanded-history comint-filename-completion)
"List of functions called to perform completion.
Works like `completion-at-point-functions'.
-See also `comint-dynamic-complete'.
+See also `completion-at-point'.
This is a good thing to set in mode hooks.")
@@ -616,7 +616,7 @@ Input ring expansion is controlled by the variable `comint-input-autoexpand',
and addition is controlled by the variable `comint-input-ignoredups'.
Commands with no default key bindings include `send-invisible',
-`comint-dynamic-complete', `comint-dynamic-list-filename-completions', and
+`completion-at-point', `comint-dynamic-list-filename-completions', and
`comint-magic-space'.
Input to, and output from, the subprocess can cause the window to scroll to
@@ -1521,7 +1521,7 @@ Intended to be added to `isearch-mode-hook' in `comint-mode'."
If there are no search errors, this function displays an overlay with
the Isearch prompt which replaces the original comint prompt.
Otherwise, it displays the standard Isearch message returned from
-`isearch-message'."
+the function `isearch-message'."
(if (not (and isearch-success (not isearch-error)))
;; Use standard function `isearch-message' when not in comint prompt,
;; or search fails, or has an error (like incomplete regexp).
@@ -1805,28 +1805,28 @@ Similarly for Soar, Scheme, etc."
(concat input "\n")))
(let ((beg (marker-position pmark))
- (end (if no-newline (point) (1- (point))))
- (inhibit-modification-hooks t))
- (when (> end beg)
- (add-text-properties beg end
- '(front-sticky t
- font-lock-face comint-highlight-input))
- (unless comint-use-prompt-regexp
- ;; Give old user input a field property of `input', to
- ;; distinguish it from both process output and unsent
- ;; input. The terminating newline is put into a special
- ;; `boundary' field to make cursor movement between input
- ;; and output fields smoother.
- (add-text-properties
- beg end
- '(mouse-face highlight
- help-echo "mouse-2: insert after prompt as new input"))))
- (unless (or no-newline comint-use-prompt-regexp)
- ;; Cover the terminating newline
- (add-text-properties end (1+ end)
- '(rear-nonsticky t
- field boundary
- inhibit-line-move-field-capture t))))
+ (end (if no-newline (point) (1- (point)))))
+ (with-silent-modifications
+ (when (> end beg)
+ (add-text-properties beg end
+ '(front-sticky t
+ font-lock-face comint-highlight-input))
+ (unless comint-use-prompt-regexp
+ ;; Give old user input a field property of `input', to
+ ;; distinguish it from both process output and unsent
+ ;; input. The terminating newline is put into a special
+ ;; `boundary' field to make cursor movement between input
+ ;; and output fields smoother.
+ (add-text-properties
+ beg end
+ '(mouse-face highlight
+ help-echo "mouse-2: insert after prompt as new input"))))
+ (unless (or no-newline comint-use-prompt-regexp)
+ ;; Cover the terminating newline
+ (add-text-properties end (1+ end)
+ '(rear-nonsticky t
+ field boundary
+ inhibit-line-move-field-capture t)))))
(comint-snapshot-last-prompt)
@@ -1909,11 +1909,12 @@ See `comint-carriage-motion' for details.")
Freeze its attributes in place, even when more input comes along
and moves the prompt overlay."
(when comint-last-prompt-overlay
- (let ((inhibit-read-only t)
- (inhibit-modification-hooks t))
- (add-text-properties (overlay-start comint-last-prompt-overlay)
- (overlay-end comint-last-prompt-overlay)
- (overlay-properties comint-last-prompt-overlay)))))
+ (let ((inhibit-read-only t))
+ (with-silent-modifications
+ (add-text-properties
+ (overlay-start comint-last-prompt-overlay)
+ (overlay-end comint-last-prompt-overlay)
+ (overlay-properties comint-last-prompt-overlay))))))
(defun comint-carriage-motion (start end)
"Interpret carriage control characters in the region from START to END.
@@ -2036,11 +2037,10 @@ Make backspaces delete the previous character."
(run-hook-with-args 'comint-output-filter-functions string)
(set-marker saved-point (point))
- (goto-char (process-mark process)) ; in case a filter moved it
+ (goto-char (process-mark process)) ; In case a filter moved it.
(unless comint-use-prompt-regexp
- (let ((inhibit-read-only t)
- (inhibit-modification-hooks t))
+ (with-silent-modifications
(add-text-properties comint-last-output-start (point)
'(front-sticky
(field inhibit-line-move-field-capture)
@@ -2051,16 +2051,16 @@ Make backspaces delete the previous character."
;; Highlight the prompt, where we define `prompt' to mean
;; the most recent output that doesn't end with a newline.
(let ((prompt-start (save-excursion (forward-line 0) (point)))
- (inhibit-read-only t)
- (inhibit-modification-hooks t))
+ (inhibit-read-only t))
(when comint-prompt-read-only
- (or (= (point-min) prompt-start)
- (get-text-property (1- prompt-start) 'read-only)
- (put-text-property
- (1- prompt-start) prompt-start 'read-only 'fence))
- (add-text-properties
- prompt-start (point)
- '(read-only t rear-nonsticky t front-sticky (read-only))))
+ (with-silent-modifications
+ (or (= (point-min) prompt-start)
+ (get-text-property (1- prompt-start) 'read-only)
+ (put-text-property
+ (1- prompt-start) prompt-start 'read-only 'fence))
+ (add-text-properties
+ prompt-start (point)
+ '(read-only t rear-nonsticky t front-sticky (read-only)))))
(unless (and (bolp) (null comint-last-prompt-overlay))
;; Need to create or move the prompt overlay (in the case
;; where there is no prompt ((bolp) == t), we still do
@@ -2120,19 +2120,31 @@ This function should be in the list `comint-output-filter-functions'."
((bound-and-true-p follow-mode)
(follow-comint-scroll-to-bottom))
(t
- (let ((selected (selected-window)))
- (dolist (w (get-buffer-window-list current nil t))
- (select-window w)
- (unwind-protect
- (progn
- (comint-adjust-point selected)
- ;; Optionally scroll to the bottom of the window.
- (and comint-scroll-show-maximum-output
- (eobp)
- (recenter (- -1 scroll-margin))))
- (select-window selected))))))
+ (dolist (w (get-buffer-window-list current nil t))
+ (comint-adjust-window-point w process)
+ ;; Optionally scroll to the bottom of the window.
+ (and comint-scroll-show-maximum-output
+ (eq (window-point w) (point-max))
+ (with-selected-window w
+ (recenter (- -1 scroll-margin)))))))
(set-buffer current))))
+
+(defun comint-adjust-window-point (window process)
+ "Move point in WINDOW based on Comint settings.
+For point adjustment use the process-mark of PROCESS."
+ (and (< (window-point window) (process-mark process))
+ (or (memq comint-move-point-for-output '(t all))
+ ;; Maybe user wants point to jump to end.
+ (eq comint-move-point-for-output
+ (if (eq (selected-window) window) 'this 'others))
+ ;; If point was at the end, keep it at end.
+ (and (marker-position comint-last-output-start)
+ (>= (window-point window) comint-last-output-start)))
+ (set-window-point window (process-mark process))))
+
+
+;; this function is nowhere used
(defun comint-adjust-point (selected)
"Move point in the selected window based on Comint settings.
SELECTED is the window that was originally selected."
@@ -2643,16 +2655,16 @@ read-only property of `fence', unless it already is read-only.
If the character after point does not have a front-sticky
read-only property, any read-only property of `fence' on the
preceding newline is removed."
- (let* ((pt (point)) (lst (get-text-property pt 'front-sticky))
- (inhibit-modification-hooks t))
+ (let* ((pt (point)) (lst (get-text-property pt 'front-sticky)))
(and (bolp)
(not (bobp))
- (if (and (get-text-property pt 'read-only)
- (if (listp lst) (memq 'read-only lst) t))
- (unless (get-text-property (1- pt) 'read-only)
- (put-text-property (1- pt) pt 'read-only 'fence))
- (when (eq (get-text-property (1- pt) 'read-only) 'fence)
- (remove-list-of-text-properties (1- pt) pt '(read-only)))))))
+ (with-silent-modifications
+ (if (and (get-text-property pt 'read-only)
+ (if (listp lst) (memq 'read-only lst) t))
+ (unless (get-text-property (1- pt) 'read-only)
+ (put-text-property (1- pt) pt 'read-only 'fence))
+ (when (eq (get-text-property (1- pt) 'read-only) 'fence)
+ (remove-list-of-text-properties (1- pt) pt '(read-only))))))))
(defun comint-kill-whole-line (&optional count)
"Kill current line, ignoring read-only and field properties.
@@ -2880,7 +2892,7 @@ its response can be seen."
;; Useful completion functions, courtesy of the Ergo group.
;; Six commands:
-;; comint-dynamic-complete Complete or expand command, filename,
+;; completion-at-point Complete or expand command, filename,
;; history at point.
;; comint-dynamic-complete-filename Complete filename at point.
;; comint-dynamic-list-filename-completions List completions in help buffer.
@@ -2889,7 +2901,7 @@ its response can be seen."
;; These are not installed in the comint-mode keymap. But they are
;; available for people who want them. Shell-mode installs them:
-;; (define-key shell-mode-map "\t" 'comint-dynamic-complete)
+;; (define-key shell-mode-map "\t" 'completion-at-point)
;; (define-key shell-mode-map "\M-?"
;; 'comint-dynamic-list-filename-completions)))
;;
@@ -3479,17 +3491,17 @@ buffer. The idea is that this regular expression should match a prompt
string, and that there ought to be at least one copy of your prompt string
in the process buffer already.")
-(defvar comint-redirect-original-filter-function nil
- "The process filter that was in place when redirection is started.
-When redirection is completed, the process filter is restored to
-this value.")
-
(defvar comint-redirect-subvert-readonly nil
"Non-nil means `comint-redirect' can insert into read-only buffers.
This works by binding `inhibit-read-only' around the insertion.
This is useful, for instance, for insertion into Help mode buffers.
You probably want to set it locally to the output buffer.")
+(defvar comint-redirect-previous-input-string nil
+ "Last redirected line of text.
+Allows detection of the end of the redirection in case the
+completion string is split between two output segments.")
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Functions
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -3527,6 +3539,9 @@ and does not normally need to be invoked by the end user or programmer."
(make-local-variable 'comint-redirect-completed)
(setq comint-redirect-completed nil)
+ (make-local-variable 'comint-redirect-previous-input-string)
+ (setq comint-redirect-previous-input-string "")
+
(setq mode-line-process
(if mode-line-process
(list (concat (elt mode-line-process 0) " Redirection"))
@@ -3535,9 +3550,11 @@ and does not normally need to be invoked by the end user or programmer."
(defun comint-redirect-cleanup ()
"End a Comint redirection. See `comint-redirect-send-command'."
(interactive)
+ ;; Release the last redirected string
+ (setq comint-redirect-previous-input-string nil)
;; Restore the process filter
- (set-process-filter (get-buffer-process (current-buffer))
- comint-redirect-original-filter-function)
+ (remove-function (process-filter (get-buffer-process (current-buffer)))
+ #'comint-redirect-filter)
;; Restore the mode line
(setq mode-line-process comint-redirect-original-mode-line-process)
;; Set the completed flag
@@ -3616,18 +3633,21 @@ This function does not need to be invoked by the end user."
;; Message
(and comint-redirect-verbose
- (message "Redirected output to buffer(s) %s"
- (mapconcat 'identity output-buffer-list " ")))
+ (message "Redirected output to buffer(s) %s" output-buffer-list))
;; If we see the prompt, tidy up
;; We'll look for the prompt in the original string, so nobody can
;; clobber it
- (and (string-match comint-redirect-finished-regexp input-string)
+ (and (string-match comint-redirect-finished-regexp
+ (concat comint-redirect-previous-input-string
+ input-string))
(progn
(and comint-redirect-verbose
(message "Redirection completed"))
(comint-redirect-cleanup)
(run-hooks 'comint-redirect-hook)))
+ (setq comint-redirect-previous-input-string input-string)
+
;; Echo input?
(if comint-redirect-echo-input
filtered-input-string
@@ -3676,10 +3696,8 @@ If NO-DISPLAY is non-nil, do not show the output buffer."
comint-prompt-regexp ; Finished Regexp
echo) ; Echo input
- ;; Set the filter
- (setq comint-redirect-original-filter-function ; Save the old filter
- (process-filter proc))
- (set-process-filter proc 'comint-redirect-filter)
+ ;; Set the filter.
+ (add-function :override (process-filter proc) #'comint-redirect-filter)
;; Send the command
(process-send-string (current-buffer) (concat command "\n"))
@@ -3787,7 +3805,7 @@ REGEXP-GROUP is the regular expression group in REGEXP to use."
;; (setq shell-mode-map (copy-keymap comint-mode-map))
;; (define-key shell-mode-map "\C-c\C-f" 'shell-forward-command)
;; (define-key shell-mode-map "\C-c\C-b" 'shell-backward-command)
-;; (define-key shell-mode-map "\t" 'comint-dynamic-complete)
+;; (define-key shell-mode-map "\t" 'completion-at-point)
;; (define-key shell-mode-map "\M-?"
;; 'comint-dynamic-list-filename-completions)))
;;
diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el
index 55c824cfe27..ac9408b1081 100644
--- a/lisp/cus-edit.el
+++ b/lisp/cus-edit.el
@@ -443,6 +443,7 @@
(define-key map [remap self-insert-command] 'Custom-no-edit)
(define-key map "\^m" 'Custom-newline)
(define-key map " " 'scroll-up-command)
+ (define-key map [?\S-\ ] 'scroll-down-command)
(define-key map "\177" 'scroll-down-command)
(define-key map "\C-c\C-c" 'Custom-set)
(define-key map "\C-x\C-s" 'Custom-save)
@@ -1318,7 +1319,8 @@ If OTHER-WINDOW is non-nil, display in another window.
Interactively, when point is on text which has a face specified,
suggest to customize that face, if it's customizable."
- (interactive (list (read-face-name "Customize face" "all faces" t)))
+ (interactive (list (read-face-name "Customize face"
+ (or (face-at-point t t) "all faces") t)))
(if (member face '(nil ""))
(setq face (face-list)))
(if (and (listp face) (null (cdr face)))
@@ -1349,7 +1351,8 @@ If FACE is actually a face-alias, customize the face it is aliased to.
Interactively, when point is on text which has a face specified,
suggest to customize that face, if it's customizable."
- (interactive (list (read-face-name "Customize face" "all faces" t)))
+ (interactive (list (read-face-name "Customize face"
+ (or (face-at-point t t) "all faces") t)))
(customize-face face t))
(defalias 'customize-customized 'customize-unsaved)
@@ -3679,15 +3682,10 @@ Optional EVENT is the location for the menu."
(setq comment nil)
;; Make the comment invisible by hand if it's empty
(custom-comment-hide comment-widget))
- (put symbol 'customized-face value)
(custom-push-theme 'theme-face symbol 'user 'set value)
- (if (face-spec-choose value)
- (face-spec-set symbol value t)
- ;; face-set-spec ignores empty attribute lists, so just give it
- ;; something harmless instead.
- (face-spec-set symbol '((t :foreground unspecified)) t))
- (put symbol 'customized-face-comment comment)
+ (face-spec-set symbol value 'customized-face)
(put symbol 'face-comment comment)
+ (put symbol 'customized-face-comment comment)
(custom-face-state-set widget)
(custom-redraw-magic widget)))
@@ -3696,20 +3694,14 @@ Optional EVENT is the location for the menu."
(let* ((symbol (widget-value widget))
(value (custom-face-widget-to-spec widget))
(comment-widget (widget-get widget :comment-widget))
- (comment (widget-value comment-widget)))
+ (comment (widget-value comment-widget))
+ (standard (eq (widget-get widget :custom-state) 'standard)))
(when (equal comment "")
(setq comment nil)
;; Make the comment invisible by hand if it's empty
(custom-comment-hide comment-widget))
(custom-push-theme 'theme-face symbol 'user 'set value)
- (if (face-spec-choose value)
- (face-spec-set symbol value t)
- ;; face-set-spec ignores empty attribute lists, so just give it
- ;; something harmless instead.
- (face-spec-set symbol '((t :foreground unspecified)) t))
- (unless (eq (widget-get widget :custom-state) 'standard)
- (put symbol 'saved-face value))
- (put symbol 'customized-face nil)
+ (face-spec-set symbol value (if standard 'reset 'saved-face))
(put symbol 'face-comment comment)
(put symbol 'customized-face-comment nil)
(put symbol 'saved-face-comment comment)))
@@ -3738,13 +3730,12 @@ uncustomized (themed or standard) face."
(saved-face (get face 'saved-face))
(comment (get face 'saved-face-comment))
(comment-widget (widget-get widget :comment-widget)))
- (put face 'customized-face nil)
- (put face 'customized-face-comment nil)
(custom-push-theme 'theme-face face 'user
(if saved-face 'set 'reset)
saved-face)
- (face-spec-set face saved-face t)
+ (face-spec-set face saved-face 'saved-face)
(put face 'face-comment comment)
+ (put face 'customized-face-comment nil)
(widget-value-set child saved-face)
;; This call manages the comment visibility
(widget-value-set comment-widget (or comment ""))
@@ -3764,11 +3755,10 @@ redraw the widget immediately."
(comment-widget (widget-get widget :comment-widget)))
(unless value
(user-error "No standard setting for this face"))
- (put symbol 'customized-face nil)
- (put symbol 'customized-face-comment nil)
(custom-push-theme 'theme-face symbol 'user 'reset)
- (face-spec-set symbol value t)
- (custom-theme-recalc-face symbol)
+ (face-spec-set symbol value 'reset)
+ (put symbol 'face-comment nil)
+ (put symbol 'customized-face-comment nil)
(if (and custom-reset-standard-faces-list
(or (get symbol 'saved-face) (get symbol 'saved-face-comment)))
;; Do this later.
@@ -3784,7 +3774,6 @@ redraw the widget immediately."
(put symbol 'saved-face nil)
(put symbol 'saved-face-comment nil)
(custom-save-all))
- (put symbol 'face-comment nil)
(widget-value-set child
(custom-pre-filter-face-spec
(list (list t (custom-face-attributes-get
diff --git a/lisp/cus-face.el b/lisp/cus-face.el
index 772a57e54fd..e1f1668d1ad 100644
--- a/lisp/cus-face.el
+++ b/lisp/cus-face.el
@@ -32,35 +32,14 @@
;;; Declaring a face.
(defun custom-declare-face (face spec doc &rest args)
- "Like `defface', but FACE is evaluated as a normal argument."
+ "Like `defface', but with FACE evaluated as a normal argument."
(unless (get face 'face-defface-spec)
- (let ((facep (facep face)))
- (unless facep
- ;; If the user has already created the face, respect that.
- (let ((value (or (get face 'saved-face) spec))
- (have-window-system (memq initial-window-system '(x w32))))
- ;; Create global face.
- (make-empty-face face)
- ;; Create frame-local faces
- (dolist (frame (frame-list))
- (face-spec-set-2 face frame value)
- (when (memq (window-system frame) '(x w32 ns))
- (setq have-window-system t)))
- ;; When making a face after frames already exist
- (if have-window-system
- (make-face-x-resource-internal face))))
- ;; Don't record SPEC until we see it causes no errors.
- (put face 'face-defface-spec (purecopy spec))
- (push (cons 'defface face) current-load-list)
- (when (and doc (null (face-documentation face)))
- (set-face-documentation face (purecopy doc)))
- (custom-handle-all-keywords face args 'custom-face)
- (run-hooks 'custom-define-hook)
- ;; If the face had existing settings, recalculate it. For
- ;; example, the user might load a theme with a face setting, and
- ;; later load a library defining that face.
- (if facep
- (custom-theme-recalc-face face))))
+ (face-spec-set face (purecopy spec) 'face-defface-spec)
+ (push (cons 'defface face) current-load-list)
+ (when doc
+ (set-face-documentation face (purecopy doc)))
+ (custom-handle-all-keywords face args 'custom-face)
+ (run-hooks 'custom-define-hook))
face)
;;; Face attributes.
@@ -343,10 +322,7 @@ Several properties of THEME and FACE are used in the process:
If THEME property `theme-immediate' is non-nil, this is equivalent of
providing the NOW argument to all faces in the argument list: FACE is
-created now. The only difference is FACE property `force-face': if NOW
-is non-nil, FACE property `force-face' is set to the symbol `rogue', else
-if THEME property `theme-immediate' is non-nil, FACE property `force-face'
-is set to the symbol `immediate'.
+created now.
SPEC itself is saved in FACE property `saved-face' and it is stored in
FACE's list property `theme-face' \(using `custom-push-theme')."
@@ -371,15 +347,11 @@ FACE's list property `theme-face' \(using `custom-push-theme')."
(when (not (and oldspec (eq 'user (caar oldspec))))
(put face 'saved-face spec)
(put face 'saved-face-comment comment))
- ;; Do this AFTER checking the `theme-face' property.
(custom-push-theme 'theme-face face theme 'set spec)
(when (or now immediate)
(put face 'force-face (if now 'rogue 'immediate)))
(when (or now immediate (facep face))
- (unless (facep face)
- (make-empty-face face))
(put face 'face-comment comment)
- (put face 'face-override-spec nil)
(face-spec-set face spec t))))))))
;; XEmacs compatibility function. In XEmacs, when you reset a Custom
diff --git a/lisp/cus-start.el b/lisp/cus-start.el
index 964c1185971..2e442b6c944 100644
--- a/lisp/cus-start.el
+++ b/lisp/cus-start.el
@@ -51,6 +51,19 @@
(gc-cons-percentage alloc float)
(garbage-collection-messages alloc boolean)
;; buffer.c
+ (cursor-type
+ display
+ (choice
+ (const :tag "Frame default" t)
+ (const :tag "Filled box" box)
+ (const :tag "Hollow cursor" hollow)
+ (const :tag "Vertical bar" bar)
+ (cons :tag "Vertical bar with specified width"
+ (const bar) integer)
+ (const :tag "Horizontal bar" hbar)
+ (cons :tag "Horizontal bar with specified width"
+ (const hbar) integer)
+ (const :tag "None "nil)))
(mode-line-format mode-line sexp) ;Hard to do right.
(major-mode internal function)
(case-fold-search matching boolean)
@@ -102,12 +115,12 @@ Leaving \"Default\" unchecked is equivalent with specifying a default of
(const :tag "On the right" (down . right))))
(other :tag "On left, no arrows" t)))
(scroll-up-aggressively windows
- (choice (const :tag "off" nil) number)
+ (choice (const :tag "off" nil) float)
"21.1")
(scroll-down-aggressively windows
- (choice (const :tag "off" nil) number)
+ (choice (const :tag "off" nil) float)
"21.1")
- (line-spacing display (choice (const :tag "none" nil) integer)
+ (line-spacing display (choice (const :tag "none" nil) number)
"22.1")
(cursor-in-non-selected-windows
cursor boolean nil
@@ -273,7 +286,6 @@ Leaving \"Default\" unchecked is equivalent with specifying a default of
(double-click-time mouse (restricted-sexp
:match-alternatives (integerp 'nil 't)))
(double-click-fuzz mouse integer "22.1")
- (inhibit-local-menu-bar-menus menu boolean)
(help-char keyboard character)
(help-event-list keyboard (repeat (sexp :format "%v")))
(menu-prompting menu boolean)
@@ -288,15 +300,15 @@ Leaving \"Default\" unchecked is equivalent with specifying a default of
(const :tag "When sent SIGUSR2" sigusr2))
"24.1")
-;; This is not good news because it will use the wrong
-;; version-specific directories when you upgrade. We need
-;; customization of the front of the list, maintaining the standard
-;; value intact at the back.
-;;; (load-path environment
-;;; (repeat (choice :tag "[Current dir?]"
-;;; :format "%[Current dir?%] %v"
-;;; (const :tag " current dir" nil)
-;;; (directory :format "%v"))))
+ ;; This is not good news because it will use the wrong
+ ;; version-specific directories when you upgrade. We need
+ ;; customization of the front of the list, maintaining the
+ ;; standard value intact at the back.
+ ;;(load-path environment
+ ;; (repeat (choice :tag "[Current dir?]"
+ ;; :format "%[Current dir?%] %v"
+ ;; (const :tag " current dir" nil)
+ ;; (directory :format "%v"))))
;; minibuf.c
(enable-recursive-minibuffers minibuffer boolean)
(history-length minibuffer
@@ -385,6 +397,7 @@ Leaving \"Default\" unchecked is equivalent with specifying a default of
(const super)) "23.1")
(ns-antialias-text ns boolean "23.1")
(ns-auto-hide-menu-bar ns boolean "24.0")
+ (ns-use-native-fullscreen ns boolean "24.4")
;; process.c
(delete-exited-processes processes-basics boolean)
;; syntax.c
@@ -500,6 +513,7 @@ since it could result in memory overflow and make Emacs crash."
(x-use-underline-position-properties display boolean "22.1")
(x-underline-at-descent-line display boolean "22.1")
(x-stretch-cursor display boolean "21.1")
+ (scroll-bar-adjust-thumb-portion windows boolean "24.4")
;; xselect.c
(x-select-enable-clipboard-manager killing boolean "24.1")
;; xsettings.c
@@ -562,6 +576,9 @@ since it could result in memory overflow and make Emacs crash."
(symbol-name symbol))
;; Any function from fontset.c will do.
(fboundp 'new-fontset))
+ ((equal "scroll-bar-adjust-thumb-portion"
+ (symbol-name symbol))
+ (featurep 'x))
(t t))))
(if (not (boundp symbol))
;; If variables are removed from C code, give an error here!
diff --git a/lisp/cus-theme.el b/lisp/cus-theme.el
index cc1046eddc5..dbe4fa42d8e 100644
--- a/lisp/cus-theme.el
+++ b/lisp/cus-theme.el
@@ -263,7 +263,7 @@ interactively, this defaults to the current value of VAR."
(defun custom-theme-add-face (face &optional spec)
"Add a widget for FACE (a symbol) to the *New Custom Theme* buffer.
SPEC, if non-nil, should be a face spec to which to set the widget."
- (interactive (list (read-face-name "Face name" nil nil) nil))
+ (interactive (list (read-face-name "Face name" (face-at-point t))))
(unless (or (facep face) spec)
(error "`%s' has no face definition" face))
(let ((entry (assq face custom-theme-faces)))
diff --git a/lisp/custom.el b/lisp/custom.el
index 9c18c827d41..4cf9609123a 100644
--- a/lisp/custom.el
+++ b/lisp/custom.el
@@ -949,7 +949,6 @@ prior to evaluating EXP).
COMMENT is a comment string about SYMBOL."
(custom-check-theme theme)
-
;; Process all the needed autoloads before anything else, so that the
;; subsequent code has all the info it needs (e.g. which var corresponds
;; to a minor mode), regardless of the ordering of the variables.
@@ -959,29 +958,7 @@ COMMENT is a comment string about SYMBOL."
(memq (get symbol 'custom-autoload) '(nil noset)))
;; This symbol needs to be autoloaded, even just for a `set'.
(custom-load-symbol symbol))))
-
- ;; Move minor modes and variables with explicit requires to the end.
- (setq args
- (sort args
- (lambda (a1 a2)
- (let* ((sym1 (car a1))
- (sym2 (car a2))
- (1-then-2 (memq sym1 (get sym2 'custom-dependencies)))
- (2-then-1 (memq sym2 (get sym1 'custom-dependencies))))
- (cond ((and 1-then-2 2-then-1)
- (error "Circular custom dependency between `%s' and `%s'"
- sym1 sym2))
- (2-then-1 nil)
- ;; 1 is a dependency of 2, so needs to be set first.
- (1-then-2)
- ;; Put minor modes and symbols with :require last.
- ;; Putting minor modes last ensures that the mode
- ;; function will see other customized values rather
- ;; than default values.
- (t (or (nth 3 a2)
- (eq (get sym2 'custom-set)
- 'custom-set-minor-mode))))))))
-
+ (setq args (custom--sort-vars args))
(dolist (entry args)
(unless (listp entry)
(error "Incompatible Custom theme spec"))
@@ -1015,6 +992,60 @@ COMMENT is a comment string about SYMBOL."
(and (or now (default-boundp symbol))
(put symbol 'variable-comment comment)))))))
+(defvar custom--sort-vars-table)
+(defvar custom--sort-vars-result)
+
+(defun custom--sort-vars (vars)
+ "Sort VARS based on custom dependencies.
+VARS is a list whose elements have the same form as the ARGS
+arguments to `custom-theme-set-variables'. Return the sorted
+list, in which A occurs before B if B was defined with a
+`:set-after' keyword specifying A (see `defcustom')."
+ (let ((custom--sort-vars-table (make-hash-table))
+ (dependants (make-hash-table))
+ (custom--sort-vars-result nil)
+ last)
+ ;; Construct a pair of tables keyed with the symbols of VARS.
+ (dolist (var vars)
+ (puthash (car var) (cons t var) custom--sort-vars-table)
+ (puthash (car var) var dependants))
+ ;; From the second table, remove symbols that are depended-on.
+ (dolist (var vars)
+ (dolist (dep (get (car var) 'custom-dependencies))
+ (remhash dep dependants)))
+ ;; If a variable is "stand-alone", put it last if it's a minor
+ ;; mode or has a :require flag. This is not really necessary, but
+ ;; putting minor modes last helps ensure that the mode function
+ ;; sees other customized values rather than default values.
+ (maphash (lambda (sym var)
+ (when (and (null (get sym 'custom-dependencies))
+ (or (nth 3 var)
+ (eq (get sym 'custom-set)
+ 'custom-set-minor-mode)))
+ (remhash sym dependants)
+ (push var last)))
+ dependants)
+ ;; The remaining symbols depend on others but are not
+ ;; depended-upon. Do a depth-first topological sort.
+ (maphash #'custom--sort-vars-1 dependants)
+ (nreverse (append last custom--sort-vars-result))))
+
+(defun custom--sort-vars-1 (sym &optional _ignored)
+ (let ((elt (gethash sym custom--sort-vars-table)))
+ ;; The car of the hash table value is nil if the variable has
+ ;; already been processed, `dependant' if it is a dependant in the
+ ;; current graph descent, and t otherwise.
+ (when elt
+ (cond
+ ((eq (car elt) 'dependant)
+ (error "Circular custom dependency on `%s'" sym))
+ ((car elt)
+ (setcar elt 'dependant)
+ (dolist (dep (get sym 'custom-dependencies))
+ (custom--sort-vars-1 dep))
+ (setcar elt nil)
+ (push (cdr elt) custom--sort-vars-result))))))
+
;;; Defining themes.
diff --git a/lisp/descr-text.el b/lisp/descr-text.el
index 005f5d8cb72..2aea0a96215 100644
--- a/lisp/descr-text.el
+++ b/lisp/descr-text.el
@@ -375,6 +375,8 @@ This function is semi-obsolete. Use `get-char-code-property'."
(format "%c:%s" x doc)))
mnemonics ", ")))))
+(declare-function quail-find-key "quail" (char))
+
;;;###autoload
(defun describe-char (pos &optional buffer)
"Describe position POS (interactively, point) and the char after POS.
@@ -572,6 +574,9 @@ relevant to POS."
'help-echo
"mouse-2, RET: show this character in its character set")
str)))
+ ,@(let ((script (aref char-script-table char)))
+ (if script
+ (list (list "script" (symbol-name script)))))
("syntax"
,(let ((syntax (syntax-after pos)))
(with-temp-buffer
diff --git a/lisp/desktop.el b/lisp/desktop.el
index 9a55bcc4283..9c95f597fff 100644
--- a/lisp/desktop.el
+++ b/lisp/desktop.el
@@ -697,83 +697,69 @@ is nil, ask the user where to save the desktop."
ll)))
;; ----------------------------------------------------------------------------
-(defun desktop-internal-v2s (value)
- "Convert VALUE to a pair (QUOTE . TXT); (eval (read TXT)) gives VALUE.
-TXT is a string that when read and evaluated yields VALUE.
+(defun desktop--v2s (value)
+ "Convert VALUE to a pair (QUOTE . SEXP); (eval SEXP) gives VALUE.
+SEXP is an sexp that when evaluated yields VALUE.
QUOTE may be `may' (value may be quoted),
`must' (value must be quoted), or nil (value must not be quoted)."
(cond
((or (numberp value) (null value) (eq t value) (keywordp value))
- (cons 'may (prin1-to-string value)))
+ (cons 'may value))
((stringp value)
(let ((copy (copy-sequence value)))
(set-text-properties 0 (length copy) nil copy)
- ;; Get rid of text properties because we cannot read them
- (cons 'may (prin1-to-string copy))))
+ ;; Get rid of text properties because we cannot read them.
+ (cons 'may copy)))
((symbolp value)
- (cons 'must (prin1-to-string value)))
+ (cons 'must value))
((vectorp value)
- (let* ((special nil)
- (pass1 (mapcar
- (lambda (el)
- (let ((res (desktop-internal-v2s el)))
- (if (null (car res))
- (setq special t))
- res))
- value)))
+ (let* ((pass1 (mapcar #'desktop--v2s value))
+ (special (assq nil pass1)))
(if special
- (cons nil (concat "(vector "
- (mapconcat (lambda (el)
- (if (eq (car el) 'must)
- (concat "'" (cdr el))
- (cdr el)))
- pass1
- " ")
- ")"))
- (cons 'may (concat "[" (mapconcat 'cdr pass1 " ") "]")))))
+ (cons nil `(vector
+ ,@(mapcar (lambda (el)
+ (if (eq (car el) 'must)
+ `',(cdr el) (cdr el)))
+ pass1)))
+ (cons 'may `[,@(mapcar #'cdr pass1)]))))
((consp value)
(let ((p value)
newlist
use-list*
anynil)
(while (consp p)
- (let ((q.txt (desktop-internal-v2s (car p))))
- (or anynil (setq anynil (null (car q.txt))))
- (setq newlist (cons q.txt newlist)))
+ (let ((q.sexp (desktop--v2s (car p))))
+ (push q.sexp newlist))
(setq p (cdr p)))
- (if p
- (let ((last (desktop-internal-v2s p)))
- (or anynil (setq anynil (null (car last))))
- (or anynil
- (setq newlist (cons '(must . ".") newlist)))
- (setq use-list* t)
- (setq newlist (cons last newlist))))
- (setq newlist (nreverse newlist))
- (if anynil
+ (when p
+ (let ((last (desktop--v2s p)))
+ (setq use-list* t)
+ (push last newlist)))
+ (if (assq nil newlist)
(cons nil
- (concat (if use-list* "(desktop-list* " "(list ")
- (mapconcat (lambda (el)
- (if (eq (car el) 'must)
- (concat "'" (cdr el))
- (cdr el)))
- newlist
- " ")
- ")"))
+ `(,(if use-list* 'desktop-list* 'list)
+ ,@(mapcar (lambda (el)
+ (if (eq (car el) 'must)
+ `',(cdr el) (cdr el)))
+ (nreverse newlist))))
(cons 'must
- (concat "(" (mapconcat 'cdr newlist " ") ")")))))
+ `(,@(mapcar #'cdr
+ (nreverse (if use-list* (cdr newlist) newlist)))
+ ,@(if use-list* (cdar newlist)))))))
((subrp value)
- (cons nil (concat "(symbol-function '"
- (substring (prin1-to-string value) 7 -1)
- ")")))
+ (cons nil `(symbol-function
+ ',(intern-soft (substring (prin1-to-string value) 7 -1)))))
((markerp value)
- (let ((pos (prin1-to-string (marker-position value)))
- (buf (prin1-to-string (buffer-name (marker-buffer value)))))
- (cons nil (concat "(let ((mk (make-marker)))"
- " (add-hook 'desktop-delay-hook"
- " (list 'lambda '() (list 'set-marker mk "
- pos " (get-buffer " buf ")))) mk)"))))
- (t ; save as text
- (cons 'may "\"Unprintable entity\""))))
+ (let ((pos (marker-position value))
+ (buf (buffer-name (marker-buffer value))))
+ (cons nil
+ `(let ((mk (make-marker)))
+ (add-hook 'desktop-delay-hook
+ `(lambda ()
+ (set-marker ,mk ,,pos (get-buffer ,,buf))))
+ mk))))
+ (t ; Save as text.
+ (cons 'may "Unprintable entity"))))
;; ----------------------------------------------------------------------------
(defun desktop-value-to-string (value)
@@ -781,9 +767,11 @@ QUOTE may be `may' (value may be quoted),
Not all types of values are supported."
(let* ((print-escape-newlines t)
(float-output-format nil)
- (quote.txt (desktop-internal-v2s value))
- (quote (car quote.txt))
- (txt (cdr quote.txt)))
+ (quote.sexp (desktop--v2s value))
+ (quote (car quote.sexp))
+ (txt
+ (let ((print-quoted t))
+ (prin1-to-string (cdr quote.sexp)))))
(if (eq quote 'must)
(concat "'" txt)
txt)))
@@ -826,7 +814,7 @@ MODE is the major mode.
(or (and filename
(stringp desktop-files-not-to-save)
(not (string-match desktop-files-not-to-save filename)))
- (and (eq mode 'dired-mode)
+ (and (memq mode '(dired-mode vc-dir-mode))
(with-current-buffer bufname
(not (setq dired-skip
(string-match desktop-files-not-to-save
diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index 13443419bd7..f6ff32b0b01 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -55,7 +55,8 @@ into this list; they also should call `dired-log' to log the errors.")
(defun dired-diff (file &optional switches)
"Compare file at point with file FILE using `diff'.
If called interactively, prompt for FILE. If the file at point
-has a backup file, use that as the default. If the mark is active
+has a backup file, use that as the default. If the file at point
+is a backup file, use its original. If the mark is active
in Transient Mark mode, use the file at the mark as the default.
\(That's the mark set by \\[set-mark-command], not by Dired's
\\[dired-mark] command.)
@@ -67,8 +68,10 @@ With prefix arg, prompt for second argument SWITCHES, which is
the string of command switches for the third argument of `diff'."
(interactive
(let* ((current (dired-get-filename t))
- ;; Get the latest existing backup file.
- (oldf (diff-latest-backup-file current))
+ ;; Get the latest existing backup file or its original.
+ (oldf (if (backup-file-name-p current)
+ (file-name-sans-versions current)
+ (diff-latest-backup-file current)))
;; Get the file at the mark.
(file-at-mark (if (and transient-mark-mode mark-active)
(save-excursion (goto-char (mark t))
@@ -107,7 +110,10 @@ the string of command switches for the third argument of `diff'."
(equal (expand-file-name current file)
(expand-file-name current))))
(error "Attempt to compare the file to itself"))
- (diff file current switches)))
+ (if (and (backup-file-name-p current)
+ (equal file (file-name-sans-versions current)))
+ (diff current file switches)
+ (diff file current switches))))
;;;###autoload
(defun dired-backup-diff (&optional switches)
diff --git a/lisp/dired-x.el b/lisp/dired-x.el
index 7c0def7f809..3cf6654da2b 100644
--- a/lisp/dired-x.el
+++ b/lisp/dired-x.el
@@ -1115,6 +1115,7 @@ See `dired-guess-shell-alist-user'."
(if (null default)
;; Nothing to guess
(read-shell-command prompt nil 'dired-shell-command-history)
+ (setq prompt (replace-regexp-in-string ": $" " " prompt))
(if (listp default)
;; More than one guess
(setq default-list default
@@ -1125,7 +1126,7 @@ See `dired-guess-shell-alist-user'."
;; Just one guess
(setq default-list (list default)))
;; Put the first guess in the prompt but not in the initial value.
- (setq prompt (concat prompt (format "[%s] " default)))
+ (setq prompt (concat prompt (format "[%s]: " default)))
;; All guesses can be retrieved with M-n
(setq val (read-shell-command prompt nil
'dired-shell-command-history
@@ -1343,13 +1344,20 @@ Otherwise obeys the value of `dired-vm-read-only-folders'."
(rmail (dired-get-filename)))
(defun dired-do-run-mail ()
- "If `dired-bind-vm' is non-nil, call `dired-vm', else call `dired-rmail'."
+ "Visit the current file as a mailbox, using VM or RMAIL.
+Prompt for confirmation first; if the user says yes, call
+`dired-vm' if `dired-bind-vm' is non-nil, `dired-rmail'
+otherwise."
(interactive)
- (if dired-bind-vm
- ;; Read mail folder using vm.
- (dired-vm)
- ;; Read mail folder using rmail.
- (dired-rmail)))
+ (let ((file (dired-get-filename t)))
+ (if dired-bind-vm
+ (if (y-or-n-p (concat "Visit `" file
+ "' as a mail folder with VM?"))
+ (dired-vm))
+ ;; Read mail folder using rmail.
+ (if (y-or-n-p (concat "Visit `" file
+ "' as a mailbox with RMAIL?"))
+ (dired-rmail)))))
;;; MISCELLANEOUS INTERNAL FUNCTIONS.
diff --git a/lisp/dired.el b/lisp/dired.el
index 76809f992cc..f03e0aca475 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -230,6 +230,18 @@ new dired buffers."
:version "22.1"
:group 'dired)
+(defcustom dired-hide-details-hide-symlink-targets t
+ "If non-nil, `dired-hide-details-mode' hides symbolic link targets."
+ :type 'boolean
+ :version "24.4"
+ :group 'dired)
+
+(defcustom dired-hide-details-hide-information-lines t
+ "Non-nil means hide lines other than header and file/dir lines."
+ :type 'boolean
+ :version "24.4"
+ :group 'dired)
+
;; Internal variables
(defvar dired-marker-char ?* ; the answer is 42
@@ -1196,7 +1208,6 @@ see `dired-use-ls-dired' for more details.")
;; Note: adjust dired-build-subdir-alist if you change this.
(setq dir (replace-regexp-in-string "\\\\" "\\\\" dir nil t)
dir (replace-regexp-in-string "\n" "\\n" dir nil t)))
- (dired-insert-set-properties opoint (point))
;; If we used --dired and it worked, the lines are already indented.
;; Otherwise, indent them.
(unless (save-excursion
@@ -1205,18 +1216,21 @@ see `dired-use-ls-dired' for more details.")
(let ((indent-tabs-mode nil))
(indent-rigidly opoint (point) 2)))
;; Insert text at the beginning to standardize things.
- (save-excursion
- (goto-char opoint)
- (if (and (or hdr wildcard)
- (not (and (looking-at "^ \\(.*\\):$")
- (file-name-absolute-p (match-string 1)))))
+ (let ((content-point opoint))
+ (save-excursion
+ (goto-char opoint)
+ (when (and (or hdr wildcard)
+ (not (and (looking-at "^ \\(.*\\):$")
+ (file-name-absolute-p (match-string 1)))))
;; Note that dired-build-subdir-alist will replace the name
;; by its expansion, so it does not matter whether what we insert
;; here is fully expanded, but it should be absolute.
- (insert " " (directory-file-name (file-name-directory dir)) ":\n"))
- (when wildcard
- ;; Insert "wildcard" line where "total" line would be for a full dir.
- (insert " wildcard " (file-name-nondirectory dir) "\n")))))
+ (insert " " (directory-file-name (file-name-directory dir)) ":\n")
+ (setq content-point (point)))
+ (when wildcard
+ ;; Insert "wildcard" line where "total" line would be for a full dir.
+ (insert " wildcard " (file-name-nondirectory dir) "\n")))
+ (dired-insert-set-properties content-point (point)))))
(defun dired-insert-set-properties (beg end)
"Add various text properties to the lines in the region."
@@ -1224,15 +1238,24 @@ see `dired-use-ls-dired' for more details.")
(goto-char beg)
(while (< (point) end)
(condition-case nil
- (if (dired-move-to-filename)
- (add-text-properties
- (point)
- (save-excursion
- (dired-move-to-end-of-filename)
- (point))
- '(mouse-face highlight
- dired-filename t
- help-echo "mouse-2: visit this file in other window")))
+ (if (not (dired-move-to-filename))
+ (put-text-property (line-beginning-position)
+ (1+ (line-end-position))
+ 'invisible 'dired-hide-details-information)
+ (put-text-property (+ (line-beginning-position) 1) (1- (point))
+ 'invisible 'dired-hide-details-detail)
+ (add-text-properties
+ (point)
+ (progn
+ (dired-move-to-end-of-filename)
+ (point))
+ '(mouse-face
+ highlight
+ dired-filename t
+ help-echo "mouse-2: visit this file in other window"))
+ (when (< (+ (point) 4) (line-end-position))
+ (put-text-property (+ (point) 4) (line-end-position)
+ 'invisible 'dired-hide-details-link)))
(error nil))
(forward-line 1))))
@@ -1496,6 +1519,7 @@ Do so according to the former subdir alist OLD-SUBDIR-ALIST."
;; hiding
(define-key map "$" 'dired-hide-subdir)
(define-key map "\M-$" 'dired-hide-all)
+ (define-key map "(" 'dired-hide-details-mode)
;; isearch
(define-key map (kbd "M-s a C-s") 'dired-do-isearch)
(define-key map (kbd "M-s a M-C-s") 'dired-do-isearch-regexp)
@@ -1586,6 +1610,10 @@ Do so according to the former subdir alist OLD-SUBDIR-ALIST."
'(menu-item "Toggle Image Thumbnails in This Buffer" image-dired-dired-toggle-marked-thumbs
:help "Add or remove image thumbnails in front of marked file names"))
+ (define-key map [menu-bar immediate hide-details]
+ '(menu-item "Hide Details" dired-hide-details-mode
+ :help "Hide details in buffer"
+ :button (:toggle . dired-hide-details-mode)))
(define-key map [menu-bar immediate revert-buffer]
'(menu-item "Refresh" revert-buffer
:help "Update contents of shown directories"))
@@ -1914,6 +1942,9 @@ Keybindings:
selective-display t ; for subdirectory hiding
mode-line-buffer-identification
(propertized-buffer-identification "%17b"))
+ ;; Ignore dired-hide-details-* value of invisible text property by default.
+ (when (eq buffer-invisibility-spec t)
+ (setq buffer-invisibility-spec (list t)))
(set (make-local-variable 'revert-buffer-function)
(function dired-revert))
(set (make-local-variable 'buffer-stale-function)
@@ -1978,15 +2009,20 @@ Otherwise, call `toggle-read-only'."
"Move down lines then position at filename.
Optional prefix ARG says how many lines to move; default is one line."
(interactive "p")
- (forward-line arg)
+ (let ((line-move-visual)
+ (goal-column))
+ (line-move arg t))
+ ;; We never want to move point into an invisible line.
+ (while (and (invisible-p (point))
+ (not (if (and arg (< arg 0)) (bobp) (eobp))))
+ (forward-char (if (and arg (< arg 0)) -1 1)))
(dired-move-to-filename))
(defun dired-previous-line (arg)
"Move up lines then position at filename.
Optional prefix ARG says how many lines to move; default is one line."
(interactive "p")
- (forward-line (- arg))
- (dired-move-to-filename))
+ (dired-next-line (- (or arg 1))))
(defun dired-next-dirline (arg &optional opoint)
"Goto ARG'th next directory file line."
@@ -2230,6 +2266,40 @@ unchanged."
(substring file (match-end 0))
file))
+;;; Minor mode for hiding details
+;;;###autoload
+(define-minor-mode dired-hide-details-mode
+ "Hide details in `dired-mode'."
+ :group 'dired
+ (unless (derived-mode-p 'dired-mode)
+ (error "Not a Dired buffer"))
+ (dired-hide-details-update-invisibility-spec)
+ (if dired-hide-details-mode
+ (add-hook 'wdired-mode-hook
+ 'dired-hide-details-update-invisibility-spec
+ nil
+ t)
+ (remove-hook 'wdired-mode-hook
+ 'dired-hide-details-update-invisibility-spec
+ t)))
+
+(defun dired-hide-details-update-invisibility-spec ()
+ (funcall (if dired-hide-details-mode
+ 'add-to-invisibility-spec
+ 'remove-from-invisibility-spec)
+ 'dired-hide-details-detail)
+ (funcall (if (and dired-hide-details-mode
+ dired-hide-details-hide-information-lines)
+ 'add-to-invisibility-spec
+ 'remove-from-invisibility-spec)
+ 'dired-hide-details-information)
+ (funcall (if (and dired-hide-details-mode
+ dired-hide-details-hide-symlink-targets
+ (not (derived-mode-p 'wdired-mode)))
+ 'add-to-invisibility-spec
+ 'remove-from-invisibility-spec)
+ 'dired-hide-details-link))
+
;;; Functions for finding the file name in a dired buffer line.
(defvar dired-permission-flags-regexp
@@ -3734,6 +3804,7 @@ Ask means pop up a menu for the user to select one of copy, move or link."
;;;; Desktop support
(eval-when-compile (require 'desktop))
+(declare-function desktop-file-name "desktop" (filename dirname))
(defun dired-desktop-buffer-misc-data (dirname)
"Auxiliary information to be saved in desktop file."
@@ -3793,13 +3864,14 @@ Ask means pop up a menu for the user to select one of copy, move or link."
;;;;;; dired-run-shell-command dired-do-shell-command dired-do-async-shell-command
;;;;;; dired-clean-directory dired-do-print dired-do-touch dired-do-chown
;;;;;; dired-do-chgrp dired-do-chmod dired-compare-directories dired-backup-diff
-;;;;;; dired-diff) "dired-aux" "dired-aux.el" "066bb17769887a7fbc0490003f59e4b3")
+;;;;;; dired-diff) "dired-aux" "dired-aux.el" "d6a694b6d13fa948465fde52a9ffb3ba")
;;; Generated autoloads from dired-aux.el
(autoload 'dired-diff "dired-aux" "\
Compare file at point with file FILE using `diff'.
If called interactively, prompt for FILE. If the file at point
-has a backup file, use that as the default. If the mark is active
+has a backup file, use that as the default. If the file at point
+is a backup file, use its original. If the mark is active
in Transient Mark mode, use the file at the mark as the default.
\(That's the mark set by \\[set-mark-command], not by Dired's
\\[dired-mark] command.)
@@ -4296,7 +4368,7 @@ instead.
;;;***
;;;### (autoloads (dired-do-relsymlink dired-jump-other-window dired-jump)
-;;;;;; "dired-x" "dired-x.el" "ce753ade80ea9f4e64ab3569e3a5421e")
+;;;;;; "dired-x" "dired-x.el" "90ba5245f6f5df3bdbda6303c725ef45")
;;; Generated autoloads from dired-x.el
(autoload 'dired-jump "dired-x" "\
diff --git a/lisp/dirtrack.el b/lisp/dirtrack.el
index 4cc1cebd3b8..e73cf279e51 100644
--- a/lisp/dirtrack.el
+++ b/lisp/dirtrack.el
@@ -220,6 +220,9 @@ the mode if ARG is omitted or nil."
(goto-char (point-max))
(insert msg1 msg2 "\n"))))
+(declare-function shell-prefixed-directory-name "shell" (dir))
+(declare-function shell-process-cd "shell" (arg))
+
;;;###autoload
(defun dirtrack (input)
"Determine the current directory from the process output for a prompt.
diff --git a/lisp/doc-view.el b/lisp/doc-view.el
index ad1ff848112..b1f399d5b73 100644
--- a/lisp/doc-view.el
+++ b/lisp/doc-view.el
@@ -145,7 +145,7 @@
;;;; Customization Options
(defgroup doc-view nil
- "In-buffer viewer for PDF, PostScript and DVI files."
+ "In-buffer viewer for PDF, PostScript, DVI, and DJVU files."
:link '(function-link doc-view)
:version "22.2"
:group 'applications
@@ -158,6 +158,27 @@
:type 'file
:group 'doc-view)
+(defcustom doc-view-pdfdraw-program
+ (cond
+ ((executable-find "pdfdraw") "pdfdraw")
+ (t "mudraw"))
+ "Name of MuPDF's program to convert PDF files to PNG."
+ :type 'file
+ :version "24.4")
+
+(defcustom doc-view-pdf->png-converter-function
+ (if (executable-find doc-view-pdfdraw-program)
+ #'doc-view-pdf->png-converter-mupdf
+ #'doc-view-pdf->png-converter-ghostscript)
+ "Function to call to convert a PDF file into a PNG file."
+ :type '(radio
+ (function-item doc-view-pdf->png-converter-ghostscript
+ :doc "Use ghostscript")
+ (function-item doc-view-pdf->png-converter-mupdf
+ :doc "Use mupdf")
+ function)
+ :version "24.4")
+
(defcustom doc-view-ghostscript-options
'("-dSAFER" ;; Avoid security problems when rendering files from untrusted
;; sources.
@@ -173,9 +194,17 @@ Higher values result in larger images."
:type 'number
:group 'doc-view)
+(defcustom doc-view-scale-internally t
+ "Whether we should try to rescale images ourselves.
+If nil, the document is re-rendered every time the scaling factor is modified.
+This only has an effect if the image libraries linked with Emacs support
+scaling."
+ :type 'boolean)
+
(defcustom doc-view-image-width 850
"Default image width.
-Has only an effect if imagemagick support is compiled into emacs."
+Has only an effect if `doc-view-scale-internally' is non-nil and support for
+scaling is compiled into emacs."
:version "24.1"
:type 'number
:group 'doc-view)
@@ -202,14 +231,37 @@ If this and `doc-view-dvipdfm-program' are set,
:type 'file
:group 'doc-view)
-(defcustom doc-view-unoconv-program "unoconv"
+(define-obsolete-variable-alias 'doc-view-unoconv-program
+ 'doc-view-odf->pdf-converter-program
+ "24.4")
+
+(defcustom doc-view-odf->pdf-converter-program
+ (cond
+ ((executable-find "soffice") "soffice")
+ ((executable-find "unoconv") "unoconv")
+ (t "soffice"))
"Program to convert any file type readable by OpenOffice.org to PDF.
Needed for viewing OpenOffice.org (and MS Office) files."
- :version "24.1"
+ :version "24.4"
:type 'file
:group 'doc-view)
+(defcustom doc-view-odf->pdf-converter-function
+ (cond
+ ((string-match "unoconv\\'" doc-view-odf->pdf-converter-program)
+ #'doc-view-odf->pdf-converter-unoconv)
+ ((string-match "soffice\\'" doc-view-odf->pdf-converter-program)
+ #'doc-view-odf->pdf-converter-soffice))
+ "Function to call to convert a ODF file into a PDF file."
+ :type '(radio
+ (function-item doc-view-odf->pdf-converter-unoconv
+ :doc "Use unoconv")
+ (function-item doc-view-odf->pdf-converter-soffice
+ :doc "Use LibreOffice")
+ function)
+ :version "24.4")
+
(defcustom doc-view-ps2pdf-program "ps2pdf"
"Program to convert PS files to PDF.
@@ -272,7 +324,25 @@ of the page moves to the previous page."
;; `window' property is only effective if its value is a window).
(cl-assert (eq t (car winprops)))
(delete-overlay ol))
- (image-mode-window-put 'overlay ol winprops)))
+ (image-mode-window-put 'overlay ol winprops)
+ (when (windowp (car winprops))
+ (if (stringp (overlay-get ol 'display))
+ ;; We're not already displaying an image, so this is the
+ ;; initial window showing the document.
+ (run-with-timer nil nil
+ (lambda ()
+ ;; In case a conversion is running, the
+ ;; refresh will happen as defined by
+ ;; `doc-view-conversion-refresh-interval'.
+ (unless doc-view-current-converter-processes
+ (with-selected-window (car winprops)
+ (doc-view-goto-page 1)))))
+ ;; We've split the window showing the document. All we need
+ ;; to do is selecting the new window to cause a redisplay to
+ ;; make the image appear there, too.
+ (run-with-timer nil nil
+ (lambda ()
+ (with-selected-window (car winprops))))))))
(defvar doc-view-current-files nil
"Only used internally.")
@@ -312,6 +382,19 @@ the (uncompressed, extracted) file residing in
"The type of document in the current buffer.
Can be `dvi', `pdf', or `ps'.")
+(defvar doc-view-single-page-converter-function nil
+ "Function to call to convert a single page of the document to a bitmap file.
+May operate on the source document or on some intermediate (typically PDF)
+conversion of it.")
+
+(defvar-local doc-view--image-type nil
+ "The type of image in the current buffer.
+Can be `png' or `tiff'.")
+
+(defvar-local doc-view--image-file-pattern nil
+ "The `format' pattern of image file names.
+Typically \"page-%s.png\".")
+
;;;; DocView Keymaps
(defvar doc-view-mode-map
@@ -325,6 +408,7 @@ Can be `dvi', `pdf', or `ps'.")
(define-key map [remap forward-page] 'doc-view-next-page)
(define-key map [remap backward-page] 'doc-view-previous-page)
(define-key map (kbd "SPC") 'doc-view-scroll-up-or-next-page)
+ (define-key map (kbd "S-SPC") 'doc-view-scroll-down-or-previous-page)
(define-key map (kbd "DEL") 'doc-view-scroll-down-or-previous-page)
(define-key map (kbd "C-n") 'doc-view-next-line-or-next-page)
(define-key map (kbd "<down>") 'doc-view-next-line-or-next-page)
@@ -419,8 +503,7 @@ Can be `dvi', `pdf', or `ps'.")
(defun doc-view-goto-page (page)
"View the page given by PAGE."
(interactive "nPage: ")
- (let ((len (doc-view-last-page-number))
- (hscroll (window-hscroll)))
+ (let ((len (doc-view-last-page-number)))
(if (< page 1)
(setq page 1)
(when (and (> page len)
@@ -450,26 +533,27 @@ Can be `dvi', `pdf', or `ps'.")
;; We used to find the file name from doc-view-current-files but
;; that's not right if the pages are not generated sequentially
;; or if the page isn't in doc-view-current-files yet.
- (let ((file (expand-file-name (format "page-%d.png" page)
- (doc-view-current-cache-dir))))
+ (let ((file (expand-file-name
+ (format doc-view--image-file-pattern page)
+ (doc-view-current-cache-dir))))
(doc-view-insert-image file :pointer 'arrow)
- (set-window-hscroll (selected-window) hscroll)
(when (and (not (file-exists-p file))
doc-view-current-converter-processes)
;; The PNG file hasn't been generated yet.
- (doc-view-pdf->png-1 doc-view-buffer-file-name file page
- (let ((win (selected-window)))
- (lambda ()
- (and (eq (current-buffer) (window-buffer win))
- ;; If we changed page in the mean
- ;; time, don't mess things up.
- (eq (doc-view-current-page win) page)
- ;; Make sure we don't infloop.
- (file-readable-p file)
- (with-selected-window win
- (doc-view-goto-page page))))))))
+ (funcall doc-view-single-page-converter-function
+ doc-view-buffer-file-name file page
+ (let ((win (selected-window)))
+ (lambda ()
+ (and (eq (current-buffer) (window-buffer win))
+ ;; If we changed page in the mean
+ ;; time, don't mess things up.
+ (eq (doc-view-current-page win) page)
+ ;; Make sure we don't infloop.
+ (file-readable-p file)
+ (with-selected-window win
+ (doc-view-goto-page page))))))))
(overlay-put (doc-view-current-overlay)
- 'help-echo (doc-view-current-info))))
+ 'help-echo (doc-view-current-info))))
(defun doc-view-next-page (&optional arg)
"Browse ARG pages forward."
@@ -619,7 +703,8 @@ It's a subdirectory of `doc-view-cache-directory'."
(setq doc-view-current-cache-dir
(file-name-as-directory
(expand-file-name
- (concat (file-name-nondirectory doc-view-buffer-file-name)
+ (concat (subst-char-in-string ?% ?_ ;; bug#13679
+ (file-name-nondirectory doc-view-buffer-file-name))
"-"
(let ((file doc-view-buffer-file-name))
(with-temp-buffer
@@ -651,14 +736,16 @@ OpenDocument format)."
(executable-find doc-view-dvipdf-program))
(and doc-view-dvipdfm-program
(executable-find doc-view-dvipdfm-program)))))
- ((or (eq type 'postscript) (eq type 'ps) (eq type 'eps)
- (eq type 'pdf))
+ ((memq type '(postscript ps eps pdf))
+ ;; FIXME: allow mupdf here
(and doc-view-ghostscript-program
(executable-find doc-view-ghostscript-program)))
((eq type 'odf)
- (and doc-view-unoconv-program
- (executable-find doc-view-unoconv-program)
+ (and doc-view-odf->pdf-converter-program
+ (executable-find doc-view-odf->pdf-converter-program)
(doc-view-mode-p 'pdf)))
+ ((eq type 'djvu)
+ (executable-find "ddjvu"))
(t ;; unknown image type
nil))))
@@ -669,18 +756,19 @@ OpenDocument format)."
(defun doc-view-enlarge (factor)
"Enlarge the document by FACTOR."
(interactive (list doc-view-shrink-factor))
- (if (eq (plist-get (cdr (doc-view-current-image)) :type)
- 'imagemagick)
+ (if (and doc-view-scale-internally
+ (eq (plist-get (cdr (doc-view-current-image)) :type)
+ 'imagemagick))
;; ImageMagick supports on-the-fly-rescaling.
(let ((new (ceiling (* factor doc-view-image-width))))
(unless (equal new doc-view-image-width)
- (set (make-local-variable 'doc-view-image-width) new)
+ (setq-local doc-view-image-width new)
(doc-view-insert-image
(plist-get (cdr (doc-view-current-image)) :file)
:width doc-view-image-width)))
(let ((new (ceiling (* factor doc-view-resolution))))
(unless (equal new doc-view-resolution)
- (set (make-local-variable 'doc-view-resolution) new)
+ (setq-local doc-view-resolution new)
(doc-view-reconvert-doc)))))
(defun doc-view-shrink (factor)
@@ -793,8 +881,8 @@ Should be invoked when the cached images aren't up-to-date."
(defun doc-view-start-process (name program args callback)
;; Make sure the process is started in an existing directory, (rather than
;; some file-name-handler-managed dir, for example).
- (let* ((default-directory (if (file-readable-p default-directory)
- default-directory
+ (let* ((default-directory (or (unhandled-file-name-directory
+ default-directory)
(expand-file-name "~/")))
(proc (apply 'start-process name doc-view-conversion-buffer
program args)))
@@ -817,22 +905,82 @@ Should be invoked when the cached images aren't up-to-date."
(list "-o" pdf dvi)
callback)))
-(defun doc-view-odf->pdf (odf callback)
+(defun doc-view-pdf->png-converter-ghostscript (pdf png page callback)
+ (doc-view-start-process
+ "pdf/ps->png" doc-view-ghostscript-program
+ `(,@doc-view-ghostscript-options
+ ,(format "-r%d" (round doc-view-resolution))
+ ,@(if page `(,(format "-dFirstPage=%d" page)))
+ ,@(if page `(,(format "-dLastPage=%d" page)))
+ ,(concat "-sOutputFile=" png)
+ ,pdf)
+ callback))
+
+(defalias 'doc-view-ps->png-converter-ghostscript
+ 'doc-view-pdf->png-converter-ghostscript)
+
+(defun doc-view-djvu->tiff-converter-ddjvu (djvu tiff page callback)
+ "Convert PAGE of a DJVU file to bitmap(s) asynchronously.
+Call CALLBACK with no arguments when done.
+If PAGE is nil, convert the whole document."
+ (doc-view-start-process
+ "djvu->tiff" "ddjvu"
+ `("-format=tiff"
+ ;; ddjvu only accepts the range 1-999.
+ ,(format "-scale=%d" (round doc-view-resolution))
+ ;; -eachpage was only added after djvulibre-3.5.25.3!
+ ,@(unless page '("-eachpage"))
+ ,@(if page `(,(format "-page=%d" page)))
+ ,djvu
+ ,tiff)
+ callback))
+
+(defun doc-view-pdf->png-converter-mupdf (pdf png page callback)
+ (doc-view-start-process
+ "pdf->png" doc-view-pdfdraw-program
+ `(,(concat "-o" png)
+ ,(format "-r%d" (round doc-view-resolution))
+ ,pdf
+ ,@(if page `(,(format "%d" page))))
+ callback))
+
+(defun doc-view-odf->pdf-converter-unoconv (odf callback)
"Convert ODF to PDF asynchronously and call CALLBACK when finished.
The converted PDF is put into the current cache directory, and it
is named like ODF with the extension turned to pdf."
- (doc-view-start-process "odf->pdf" doc-view-unoconv-program
+ (doc-view-start-process "odf->pdf" doc-view-odf->pdf-converter-program
(list "-f" "pdf" "-o" (doc-view-current-cache-dir) odf)
callback))
+(defun doc-view-odf->pdf-converter-soffice (odf callback)
+ "Convert ODF to PDF asynchronously and call CALLBACK when finished.
+The converted PDF is put into the current cache directory, and it
+is named like ODF with the extension turned to pdf."
+ ;; FIXME: soffice doesn't work when there's another running
+ ;; LibreOffice instance, in which case it returns success without
+ ;; actually doing anything. See LibreOffice bug
+ ;; https://bugs.freedesktop.org/show_bug.cgi?id=37531. A workaround
+ ;; is to start soffice with a separate UserInstallation directory.
+ (let ((tmp-user-install-dir (make-temp-file "libreoffice-docview" t)))
+ (doc-view-start-process "odf->pdf" doc-view-odf->pdf-converter-program
+ (list
+ (concat "-env:UserInstallation=file://"
+ tmp-user-install-dir)
+ "--headless" "--convert-to" "pdf"
+ "--outdir" (doc-view-current-cache-dir) odf)
+ (lambda ()
+ (delete-directory tmp-user-install-dir t)
+ (funcall callback)))))
+
(defun doc-view-pdf/ps->png (pdf-ps png)
+ ;; FIXME: Fix name and docstring to account for djvu&tiff.
"Convert PDF-PS to PNG asynchronously."
- (doc-view-start-process
- "pdf/ps->png" doc-view-ghostscript-program
- (append doc-view-ghostscript-options
- (list (format "-r%d" (round doc-view-resolution))
- (concat "-sOutputFile=" png)
- pdf-ps))
+ (funcall
+ (pcase doc-view-doc-type
+ (`pdf doc-view-pdf->png-converter-function)
+ (`djvu #'doc-view-djvu->tiff-converter-ddjvu)
+ (_ #'doc-view-ps->png-converter-ghostscript))
+ pdf-ps png nil
(let ((resolution doc-view-resolution))
(lambda ()
;; Only create the resolution file when it's all done, so it also
@@ -845,6 +993,7 @@ is named like ODF with the extension turned to pdf."
(cancel-timer doc-view-current-timer)
(setq doc-view-current-timer nil))
(doc-view-display (current-buffer) 'force))))
+
;; Update the displayed pages as soon as they're done generating.
(when doc-view-conversion-refresh-interval
(setq doc-view-current-timer
@@ -852,25 +1001,10 @@ is named like ODF with the extension turned to pdf."
'doc-view-display
(current-buffer)))))
-(defun doc-view-pdf->png-1 (pdf png page callback)
- "Convert a PAGE of a PDF file to PNG asynchronously.
-Call CALLBACK with no arguments when done."
- (doc-view-start-process
- "pdf->png-1" doc-view-ghostscript-program
- (append doc-view-ghostscript-options
- (list (format "-r%d" (round doc-view-resolution))
- ;; Sadly, `gs' only supports the page-range
- ;; for PDF files.
- (format "-dFirstPage=%d" page)
- (format "-dLastPage=%d" page)
- (concat "-sOutputFile=" png)
- pdf))
- callback))
-
(declare-function clear-image-cache "image.c" (&optional filter))
-(defun doc-view-pdf->png (pdf png pages)
- "Convert a PDF file to PNG asynchronously.
+(defun doc-view-document->bitmap (pdf png pages)
+ "Convert a document file to bitmap images asynchronously.
Start by converting PAGES, and then the rest."
(if (null pages)
(doc-view-pdf/ps->png pdf png)
@@ -879,11 +1013,11 @@ Start by converting PAGES, and then the rest."
;; a single page anyway, and of the remaining 1%, few cases will have
;; consecutive pages, it's not worth the trouble.
(let ((rest (cdr pages)))
- (doc-view-pdf->png-1
- pdf (format png (car pages)) (car pages)
+ (funcall doc-view-single-page-converter-function
+ pdf (format png (car pages)) (car pages)
(lambda ()
(if rest
- (doc-view-pdf->png pdf png rest)
+ (doc-view-document->bitmap pdf png rest)
;; Yippie, the important pages are done, update the display.
(clear-image-cache)
;; For the windows that have a message (like "Welcome to
@@ -891,8 +1025,8 @@ Start by converting PAGES, and then the rest."
;; not sufficient.
(dolist (win (get-buffer-window-list (current-buffer) nil 'visible))
(with-selected-window win
- (when (stringp (get-char-property (point-min) 'display))
- (doc-view-goto-page (doc-view-current-page)))))
+ (when (stringp (overlay-get (doc-view-current-overlay) 'display))
+ (doc-view-goto-page (doc-view-current-page)))))
;; Convert the rest of the pages.
(doc-view-pdf/ps->png pdf png)))))))
@@ -962,8 +1096,9 @@ Those files are saved in the directory given by the function
;; preserves the horizontal/vertical scroll settings (which are otherwise
;; resets during the redisplay).
(setq doc-view-pending-cache-flush t)
- (let ((png-file (expand-file-name "page-%d.png"
- (doc-view-current-cache-dir))))
+ (let ((png-file (expand-file-name
+ (format doc-view--image-file-pattern "%d")
+ (doc-view-current-cache-dir))))
(make-directory (doc-view-current-cache-dir) t)
(pcase doc-view-doc-type
(`dvi
@@ -976,22 +1111,23 @@ Those files are saved in the directory given by the function
;; ODF files have to be converted to PDF before Ghostscript can
;; process it.
(let ((pdf (doc-view-current-cache-doc-pdf))
- (opdf (expand-file-name (concat (file-name-base doc-view-buffer-file-name)
- ".pdf")
- doc-view-current-cache-dir))
+ (opdf (expand-file-name
+ (concat (file-name-base doc-view-buffer-file-name)
+ ".pdf")
+ doc-view-current-cache-dir))
(png-file png-file))
- ;; The unoconv tool only supports a output directory, but no
+ ;; The unoconv tool only supports an output directory, but no
;; file name. It's named like the input file with the
;; extension replaced by pdf.
- (doc-view-odf->pdf doc-view-buffer-file-name
+ (funcall doc-view-odf->pdf-converter-function doc-view-buffer-file-name
(lambda ()
;; Rename to doc.pdf
(rename-file opdf pdf)
(doc-view-pdf/ps->png pdf png-file)))))
- (`pdf
+ ((or `pdf `djvu)
(let ((pages (doc-view-active-pages)))
- ;; Convert PDF to PNG images starting with the active pages.
- (doc-view-pdf->png doc-view-buffer-file-name png-file pages)))
+ ;; Convert doc to bitmap images starting with the active pages.
+ (doc-view-document->bitmap doc-view-buffer-file-name png-file pages)))
(_
;; Convert to PNG images.
(doc-view-pdf/ps->png doc-view-buffer-file-name png-file)))))
@@ -1102,9 +1238,10 @@ much more accurate than could be done manually using
(let* ((is (image-size (doc-view-current-image) t))
(iw (car is))
(ih (cdr is))
- (ps (or (and (null force-paper-size) (doc-view-guess-paper-size iw ih))
+ (ps (or (and (null force-paper-size)
+ (doc-view-guess-paper-size iw ih))
(intern (completing-read "Paper size: "
- (mapcar #'car doc-view-paper-sizes)
+ doc-view-paper-sizes
nil t))))
(bb (doc-view-scale-bounding-box ps iw ih bb))
(x1 (nth 0 bb))
@@ -1131,43 +1268,59 @@ ARGS is a list of image descriptors."
(when doc-view-pending-cache-flush
(clear-image-cache)
(setq doc-view-pending-cache-flush nil))
- (let ((ol (doc-view-current-overlay))
- (image (if (and file (file-readable-p file))
- (if (not (fboundp 'imagemagick-types))
- (apply 'create-image file 'png nil args)
- (unless (member :width args)
- (setq args (append args (list :width doc-view-image-width))))
- (apply 'create-image file 'imagemagick nil args))))
- (slice (doc-view-current-slice)))
- (setf (doc-view-current-image) image)
- (move-overlay ol (point-min) (point-max))
- (overlay-put ol 'display
- (cond
- (image
- (if slice
- (list (cons 'slice slice) image)
- image))
- ;; We're trying to display a page that doesn't exist.
- (doc-view-current-converter-processes
- ;; Maybe the page doesn't exist *yet*.
- "Cannot display this page (yet)!")
- (t
- ;; Typically happens if the conversion process somehow
- ;; failed. Better not signal an error here because it
- ;; could prevent a subsequent reconversion from fixing
- ;; the problem.
- (concat "Cannot display this page!\n"
- "Maybe because of a conversion failure!"))))
- (let ((win (overlay-get ol 'window)))
- (if (stringp (overlay-get ol 'display))
- (progn ;Make sure the text is not scrolled out of view.
- (set-window-hscroll win 0)
- (set-window-vscroll win 0))
- (let ((hscroll (image-mode-window-get 'hscroll win))
- (vscroll (image-mode-window-get 'vscroll win)))
- ;; Reset scroll settings, in case they were changed.
- (if hscroll (set-window-hscroll win hscroll))
- (if vscroll (set-window-vscroll win vscroll)))))))
+ (let ((ol (doc-view-current-overlay)))
+ ;; Only insert the image if the buffer is visible.
+ (when (window-live-p (overlay-get ol 'window))
+ (let* ((image (if (and file (file-readable-p file))
+ (if (not (and doc-view-scale-internally
+ (fboundp 'imagemagick-types)))
+ (apply 'create-image file doc-view--image-type nil args)
+ (unless (member :width args)
+ (setq args `(,@args :width ,doc-view-image-width)))
+ (apply 'create-image file 'imagemagick nil args))))
+ (slice (doc-view-current-slice))
+ (img-width (and image (car (image-size image))))
+ (displayed-img-width (if (and image slice)
+ (* (/ (float (nth 2 slice))
+ (car (image-size image 'pixels)))
+ img-width)
+ img-width))
+ (window-width (window-width (selected-window))))
+ (setf (doc-view-current-image) image)
+ (move-overlay ol (point-min) (point-max))
+ ;; In case the window is wider than the image, center the image
+ ;; horizontally.
+ (overlay-put ol 'before-string
+ (when (and image (> window-width displayed-img-width))
+ (propertize " " 'display
+ `(space :align-to (+ center (-0.5 . ,displayed-img-width))))))
+ (overlay-put ol 'display
+ (cond
+ (image
+ (if slice
+ (list (cons 'slice slice) image)
+ image))
+ ;; We're trying to display a page that doesn't exist.
+ (doc-view-current-converter-processes
+ ;; Maybe the page doesn't exist *yet*.
+ "Cannot display this page (yet)!")
+ (t
+ ;; Typically happens if the conversion process somehow
+ ;; failed. Better not signal an error here because it
+ ;; could prevent a subsequent reconversion from fixing
+ ;; the problem.
+ (concat "Cannot display this page!\n"
+ "Maybe because of a conversion failure!"))))
+ (let ((win (overlay-get ol 'window)))
+ (if (stringp (overlay-get ol 'display))
+ (progn ;Make sure the text is not scrolled out of view.
+ (set-window-hscroll win 0)
+ (set-window-vscroll win 0))
+ (let ((hscroll (image-mode-window-get 'hscroll win))
+ (vscroll (image-mode-window-get 'vscroll win)))
+ ;; Reset scroll settings, in case they were changed.
+ (if hscroll (set-window-hscroll win hscroll))
+ (if vscroll (set-window-vscroll win vscroll)))))))))
(defun doc-view-sort (a b)
"Return non-nil if A should be sorted before B.
@@ -1184,13 +1337,18 @@ have the page we want to view."
(let ((prev-pages doc-view-current-files))
(setq doc-view-current-files
(sort (directory-files (doc-view-current-cache-dir) t
- "page-[0-9]+\\.png" t)
+ (format doc-view--image-file-pattern
+ "[0-9]+")
+ t)
'doc-view-sort))
+ (unless (eq (length prev-pages) (length doc-view-current-files))
+ (force-mode-line-update))
(dolist (win (or (get-buffer-window-list buffer nil t)
(list t)))
(let* ((page (doc-view-current-page win))
- (pagefile (expand-file-name (format "page-%d.png" page)
- (doc-view-current-cache-dir))))
+ (pagefile (expand-file-name
+ (format doc-view--image-file-pattern page)
+ (doc-view-current-cache-dir))))
(when (or force
(and (not (member pagefile prev-pages))
(member pagefile doc-view-current-files)))
@@ -1254,8 +1412,6 @@ For now these keys are useful:
(progn
(doc-view-kill-proc)
(setq buffer-read-only nil)
- (remove-overlays (point-min) (point-max) 'doc-view t)
- (set (make-local-variable 'image-mode-winprops-alist) t)
;; Switch to the previously used major mode or fall back to
;; normal mode.
(doc-view-fallback-mode)
@@ -1383,12 +1539,13 @@ If BACKWARD is non-nil, jump to the previous match."
;; the conversion is incomplete.
(file-readable-p (expand-file-name "resolution.el"
(doc-view-current-cache-dir)))
- (> (length (directory-files (doc-view-current-cache-dir)
- nil "\\.png\\'"))
+ (> (length (directory-files
+ (doc-view-current-cache-dir)
+ nil (format doc-view--image-file-pattern "[0-9]+")))
0)))
(defun doc-view-initiate-display ()
- ;; Switch to image display if possible
+ ;; Switch to image display if possible.
(if (doc-view-mode-p doc-view-doc-type)
(progn
(doc-view-buffer-message)
@@ -1396,7 +1553,7 @@ If BACKWARD is non-nil, jump to the previous match."
(if (doc-view-already-converted-p)
(progn
(message "DocView: using cached files!")
- ;; Load the saved resolution
+ ;; Load the saved resolution.
(let* ((res-file (expand-file-name "resolution.el"
(doc-view-current-cache-dir)))
(res
@@ -1405,7 +1562,7 @@ If BACKWARD is non-nil, jump to the previous match."
(insert-file-contents res-file)
(read (current-buffer))))))
(when (numberp res)
- (set (make-local-variable 'doc-view-resolution) res)))
+ (setq-local doc-view-resolution res)))
(doc-view-display (current-buffer) 'force))
(doc-view-convert-current-doc))
(message
@@ -1457,6 +1614,8 @@ If BACKWARD is non-nil, jump to the previous match."
("pdf" pdf) ("epdf" pdf)
;; PostScript
("ps" ps) ("eps" ps)
+ ;; DjVu
+ ("djvu" djvu)
;; OpenDocument formats
("odt" odf) ("ods" odf) ("odp" odf) ("odg" odf)
("odc" odf) ("odi" odf) ("odm" odf) ("ott" odf)
@@ -1471,14 +1630,25 @@ If BACKWARD is non-nil, jump to the previous match."
(cond
((looking-at "%!") '(ps))
((looking-at "%PDF") '(pdf))
- ((looking-at "\367\002") '(dvi))))))
- (set (make-local-variable 'doc-view-doc-type)
- (car (or (doc-view-intersection name-types content-types)
- (when (and name-types content-types)
- (error "Conflicting types: name says %s but content says %s"
- name-types content-types))
- name-types content-types
- (error "Cannot determine the document type"))))))
+ ((looking-at "\367\002") '(dvi))
+ ((looking-at "AT&TFORM") '(djvu))))))
+ (setq-local doc-view-doc-type
+ (car (or (doc-view-intersection name-types content-types)
+ (when (and name-types content-types)
+ (error "Conflicting types: name says %s but content says %s"
+ name-types content-types))
+ name-types content-types
+ (error "Cannot determine the document type"))))))
+
+(defun doc-view-set-up-single-converter ()
+ "Find the right single-page converter for the current document type"
+ (pcase-let ((`(,conv-function ,type ,extension)
+ (pcase doc-view-doc-type
+ (`djvu (list #'doc-view-djvu->tiff-converter-ddjvu 'tiff "tif"))
+ (_ (list doc-view-pdf->png-converter-function 'png "png")))))
+ (setq-local doc-view-single-page-converter-function conv-function)
+ (setq-local doc-view--image-type type)
+ (setq-local doc-view--image-file-pattern (concat "page-%s." extension))))
;;;###autoload
(defun doc-view-mode ()
@@ -1503,8 +1673,7 @@ toggle between displaying the document or editing it as text.
(unless (eq major-mode 'fundamental-mode)
major-mode))))
(kill-all-local-variables)
- (set (make-local-variable 'doc-view-previous-major-mode)
- prev-major-mode))
+ (setq-local doc-view-previous-major-mode prev-major-mode))
(dolist (var doc-view-saved-settings)
(set (make-local-variable (car var)) (cdr var)))
@@ -1512,10 +1681,11 @@ toggle between displaying the document or editing it as text.
;; Figure out the document type.
(unless doc-view-doc-type
(doc-view-set-doc-type))
+ (doc-view-set-up-single-converter)
(doc-view-make-safe-dir doc-view-cache-directory)
;; Handle compressed files, remote files, files inside archives
- (set (make-local-variable 'doc-view-buffer-file-name)
+ (setq-local doc-view-buffer-file-name
(cond
(jka-compr-really-do-compress
;; FIXME: there's a risk of name conflicts here.
@@ -1554,20 +1724,19 @@ toggle between displaying the document or editing it as text.
'doc-view-new-window-function nil t)
(image-mode-setup-winprops)
- (set (make-local-variable 'mode-line-position)
- '(" P" (:eval (number-to-string (doc-view-current-page)))
- "/" (:eval (number-to-string (doc-view-last-page-number)))))
+ (setq-local mode-line-position
+ '(" P" (:eval (number-to-string (doc-view-current-page)))
+ "/" (:eval (number-to-string (doc-view-last-page-number)))))
;; Don't scroll unless the user specifically asked for it.
- (set (make-local-variable 'auto-hscroll-mode) nil)
- (set (make-local-variable 'mwheel-scroll-up-function)
- 'doc-view-scroll-up-or-next-page)
- (set (make-local-variable 'mwheel-scroll-down-function)
- 'doc-view-scroll-down-or-previous-page)
- (set (make-local-variable 'cursor-type) nil)
+ (setq-local auto-hscroll-mode nil)
+ (setq-local mwheel-scroll-up-function #'doc-view-scroll-up-or-next-page)
+ (setq-local mwheel-scroll-down-function
+ #'doc-view-scroll-down-or-previous-page)
+ (setq-local cursor-type nil)
(use-local-map doc-view-mode-map)
- (set (make-local-variable 'after-revert-hook) 'doc-view-reconvert-doc)
- (set (make-local-variable 'bookmark-make-record-function)
- 'doc-view-bookmark-make-record)
+ (add-hook 'after-revert-hook 'doc-view-reconvert-doc nil t)
+ (setq-local bookmark-make-record-function
+ #'doc-view-bookmark-make-record)
(setq mode-name "DocView"
buffer-read-only t
major-mode 'doc-view-mode)
@@ -1576,7 +1745,7 @@ toggle between displaying the document or editing it as text.
;; canonical view mode for PDF/PS/DVI files. This could be
;; switched on automatically depending on the value of
;; `view-read-only'.
- (set (make-local-variable 'view-read-only) nil)
+ (setq-local view-read-only nil)
(run-mode-hooks 'doc-view-mode-hook)))
(defun doc-view-fallback-mode ()
@@ -1585,6 +1754,7 @@ toggle between displaying the document or editing it as text.
(mapcar (lambda (var) (cons var (symbol-value var)))
'(doc-view-resolution
image-mode-winprops-alist)))))
+ (remove-overlays (point-min) (point-max) 'doc-view t)
(if doc-view-previous-major-mode
(funcall doc-view-previous-major-mode)
(let ((auto-mode-alist
diff --git a/lisp/dos-w32.el b/lisp/dos-w32.el
index 5866edfc3d6..d6788ffe028 100644
--- a/lisp/dos-w32.el
+++ b/lisp/dos-w32.el
@@ -37,7 +37,7 @@
;; Set the null device (for compile.el).
(setq null-device "NUL")
-;; For distinguishing file types based upon suffixes.
+;; For distinguishing file types based upon suffixes. DEPRECATED, DO NOT USE!
(defcustom file-name-buffer-file-type-alist
'(("[:/].*config.sys$" . nil) ; config.sys text
("\\.\\(obj\\|exe\\|com\\|lib\\|sys\\|bin\\|ico\\|pif\\|class\\)$" . t)
@@ -54,36 +54,18 @@
("\\.tp[ulpw]$" . t) ; borland Pascal stuff
("[:/]tags$" . nil) ; emacs TAGS file
)
- "Alist for distinguishing text files from binary files.
+ "Alist used in the past for distinguishing text files from binary files.
Each element has the form (REGEXP . TYPE), where REGEXP is matched
-against the file name, and TYPE is nil for text, t for binary."
+against the file name, and TYPE is nil for text, t for binary.
+
+This variable is deprecated, not used anywhere, and will soon be deleted."
:type '(repeat (cons regexp boolean))
:group 'dos-fns
:group 'w32)
-;; Return the pair matching filename on file-name-buffer-file-type-alist,
-;; or nil otherwise.
-(defun find-buffer-file-type-match (filename)
- (let ((alist file-name-buffer-file-type-alist)
- (found nil))
- (let ((case-fold-search t))
- (setq filename (file-name-sans-versions filename))
- (while (and (not found) alist)
- (if (string-match (car (car alist)) filename)
- (setq found (car alist)))
- (setq alist (cdr alist)))
- found)))
-
-;; Don't check for untranslated file systems here.
-(defun find-buffer-file-type (filename)
- (let ((match (find-buffer-file-type-match filename))
- (code))
- (if (not match)
- (default-value 'buffer-file-type)
- (setq code (cdr match))
- (cond ((memq code '(nil t)) code)
- ((and (symbolp code) (fboundp code))
- (funcall code filename))))))
+(make-obsolete-variable 'file-name-buffer-file-type-alist
+ 'file-coding-system-alist
+ "24.4")
(setq-default buffer-file-coding-system 'undecided-dos)
@@ -99,9 +81,6 @@ and whether the file exists:
If it matches in `untranslated-filesystem-list':
If the file exists: `undecided'
If the file does not exist: `undecided-unix'
- If it matches in `file-name-buffer-file-type-alist':
- If the match is t (for binary): `no-conversion'
- If the match is nil (for dos-text): `undecided-dos'
Otherwise:
If the file exists: `undecided'
If the file does not exist default value of `buffer-file-coding-system'
@@ -110,25 +89,23 @@ Note that the CAR of arguments to `insert-file-contents' operation could
be a cons cell of the form \(FILENAME . BUFFER\), where BUFFER is a buffer
into which the file's contents were already read, but not yet decoded.
-If operation is `write-region', the coding system is chosen based upon
-the value of `buffer-file-coding-system' and `buffer-file-type'. If
-`buffer-file-coding-system' is non-nil, its value is used. If it is
-nil and `buffer-file-type' is t, the coding system is `no-conversion'.
+If operation is `write-region', the coding system is chosen based
+upon the value of `buffer-file-coding-system'. If
+`buffer-file-coding-system' is non-nil, its value is used.
Otherwise, it is `undecided-dos'.
-The two most common situations are when DOS and Unix files are read
-and written, and their names do not match in
-`untranslated-filesystem-list' and `file-name-buffer-file-type-alist'.
-In these cases, the coding system initially will be `undecided'. As
-the file is read in the DOS case, the coding system will be changed to
-`undecided-dos' as CR/LFs are detected. As the file is read in the
-Unix case, the coding system will be changed to `undecided-unix' as
-LFs are detected. In both cases, `buffer-file-coding-system' will be
-set to the appropriate coding system, and the value of
-`buffer-file-coding-system' will be used when writing the file."
+The most common situation is when DOS and Unix files are read and
+written, and their names do not match in `untranslated-filesystem-list'.
+In these cases, the coding system initially will be `undecided'.
+As the file is read in the DOS case, the coding system will be
+changed to `undecided-dos' as CR/LFs are detected. As the file
+is read in the Unix case, the coding system will be changed to
+`undecided-unix' as LFs are detected. In both cases,
+`buffer-file-coding-system' will be set to the appropriate coding
+system, and the value of `buffer-file-coding-system' will be used
+when writing the file."
(let ((op (nth 0 command))
- (binary nil) (text nil)
(undecided nil) (undecided-unix nil)
target target-buf)
(cond ((eq op 'insert-file-contents)
@@ -144,15 +121,8 @@ set to the appropriate coding system, and the value of
(and (bufferp (cdr target))
(buffer-name (cdr target))))
(setq target (car target)))
- ;; First check for a file name that indicates
- ;; it is truly binary.
- (setq binary (find-buffer-file-type target))
- (cond (binary)
- ;; Next check for files that MUST use DOS eol conversion.
- ((find-buffer-file-type-match target)
- (setq text t))
- ;; For any other existing file, decide based on contents.
- ((or
+ (cond ((or
+ ;; For any existing file, decide based on contents.
(file-exists-p target)
;; If TARGET does not exist as a file, replace its
;; base name with TARGET-BUF and try again. This
@@ -167,9 +137,7 @@ set to the appropriate coding system, and the value of
;; Next check for a non-DOS file system.
((untranslated-file-p target)
(setq undecided-unix t)))
- (cond (binary '(no-conversion . no-conversion))
- (text '(undecided-dos . undecided-dos))
- (undecided-unix '(undecided-unix . undecided-unix))
+ (cond (undecided-unix '(undecided-unix . undecided-unix))
(undecided '(undecided . undecided))
(t (cons (default-value 'buffer-file-coding-system)
(default-value 'buffer-file-coding-system)))))
@@ -180,22 +148,18 @@ set to the appropriate coding system, and the value of
;; Normally this is used only in a non-file-visiting
;; buffer, because normally buffer-file-coding-system is non-nil
;; in a file-visiting buffer.
- (if buffer-file-type
- '(no-conversion . no-conversion)
- '(undecided-dos . undecided-dos)))))))
-
-(modify-coding-system-alist 'file "" 'find-buffer-file-type-coding-system)
+ '(undecided-dos . undecided-dos))))))
(defun find-file-binary (filename)
"Visit file FILENAME and treat it as binary."
(interactive "FFind file binary: ")
- (let ((file-name-buffer-file-type-alist '(("" . t))))
+ (let ((coding-system-for-read 'no-conversion))
(find-file filename)))
(defun find-file-text (filename)
"Visit file FILENAME and treat it as a text file."
(interactive "FFind file text: ")
- (let ((file-name-buffer-file-type-alist '(("" . nil))))
+ (let ((coding-system-for-read 'undecided-dos))
(find-file filename)))
(defun find-file-not-found-set-buffer-file-coding-system ()
diff --git a/lisp/ehelp.el b/lisp/ehelp.el
index 416666f918c..88fc87b5b7a 100644
--- a/lisp/ehelp.el
+++ b/lisp/ehelp.el
@@ -80,6 +80,7 @@
(define-key map (char-to-string help-char) 'electric-help-help)
(define-key map "?" 'electric-help-help)
(define-key map " " 'scroll-up)
+ (define-key map [?\S-\ ] 'scroll-down)
(define-key map "\^?" 'scroll-down)
(define-key map "." 'beginning-of-buffer)
(define-key map "<" 'beginning-of-buffer)
diff --git a/lisp/electric.el b/lisp/electric.el
index 58b8e10cb71..86997d4aac7 100644
--- a/lisp/electric.el
+++ b/lisp/electric.el
@@ -302,6 +302,27 @@ This can be convenient for people who find it easier to hit ) than C-f."
:version "24.1"
:type 'boolean)
+(defcustom electric-pair-inhibit-predicate
+ #'electric-pair-default-inhibit
+ "Predicate to prevent insertion of a matching pair.
+The function is called with a single char (the opening char just inserted).
+If it returns non-nil, then `electric-pair-mode' will not insert a matching
+closer."
+ :version "24.4"
+ :type '(choice
+ (const :tag "Default" electric-pair-default-inhibit)
+ (const :tag "Always pair" ignore)
+ function))
+
+(defun electric-pair-default-inhibit (char)
+ (or
+ ;; I find it more often preferable not to pair when the
+ ;; same char is next.
+ (eq char (char-after))
+ (eq char (char-before (1- (point))))
+ ;; I also find it often preferable not to pair next to a word.
+ (eq (char-syntax (following-char)) ?w)))
+
(defun electric-pair-syntax (command-event)
(and electric-pair-mode
(let ((x (assq command-event electric-pair-pairs)))
@@ -351,12 +372,7 @@ This can be convenient for people who find it easier to hit ) than C-f."
;; Insert matching pair.
((not (or (not (memq syntax `(?\( ?\" ?\$)))
overwrite-mode
- ;; I find it more often preferable not to pair when the
- ;; same char is next.
- (eq last-command-event (char-after))
- (eq last-command-event (char-before (1- (point))))
- ;; I also find it often preferable not to pair next to a word.
- (eq (char-syntax (following-char)) ?w)))
+ (funcall electric-pair-inhibit-predicate last-command-event)))
(save-excursion (insert closer))))))
(defun electric-pair-will-use-region ()
diff --git a/lisp/emacs-lisp/advice.el b/lisp/emacs-lisp/advice.el
index eb95fae2339..3d03e894534 100644
--- a/lisp/emacs-lisp/advice.el
+++ b/lisp/emacs-lisp/advice.el
@@ -1,4 +1,4 @@
-;;; advice.el --- An overloading mechanism for Emacs Lisp functions
+;;; advice.el --- An overloading mechanism for Emacs Lisp functions -*- lexical-binding: t -*-
;; Copyright (C) 1993-1994, 2000-2013 Free Software Foundation, Inc.
@@ -47,14 +47,12 @@
;; @ Highlights:
;; =============
;; - Clean definition of multiple, named before/around/after advices
-;; for functions, macros, subrs and special forms
+;; for functions and macros.
;; - Full control over the arguments an advised function will receive,
;; the binding environment in which it will be executed, as well as the
;; value it will return.
-;; - Allows re/definition of interactive behavior for functions and subrs
-;; - Every piece of advice can have its documentation string which will be
-;; combined with the original documentation of the advised function at
-;; call-time of `documentation' for proper command-key substitution.
+;; - Allows re/definition of interactive behavior for commands.
+;; - Every piece of advice can have its documentation string.
;; - The execution of every piece of advice can be protected against error
;; and non-local exits in preceding code or advices.
;; - Simple argument access either by name, or, more portable but as
@@ -63,7 +61,7 @@
;; version of a function.
;; - Advised functions can be byte-compiled either at file-compile time
;; (see preactivation) or activation time.
-;; - Separation of advice definition and activation
+;; - Separation of advice definition and activation.
;; - Forward advice is possible, that is
;; as yet undefined or autoload functions can be advised without having to
;; preload the file in which they are defined.
@@ -77,7 +75,7 @@
;; - En/disablement mechanism allows the use of different "views" of advised
;; functions depending on what pieces of advice are currently en/disabled
;; - Provides manipulation mechanisms for sets of advised functions via
-;; regular expressions that match advice names
+;; regular expressions that match advice names.
;; @ Overview, or how to read this file:
;; =====================================
@@ -113,23 +111,12 @@
;; others come from the various Lisp advice mechanisms I've come across
;; so far, and a few are simply mine.
-;; @ Comments, suggestions, bug reports:
-;; =====================================
-;; If you find any bugs, have suggestions for new advice features, find the
-;; documentation wrong, confusing, incomplete, or otherwise unsatisfactory,
-;; have any questions about Advice, or have otherwise enlightening
-;; comments feel free to send me email at <hans@cs.buffalo.edu>.
-
;; @ Safety Rules and Emergency Exits:
;; ===================================
;; Before we begin: CAUTION!!
;; Advice provides you with a lot of rope to hang yourself on very
;; easily accessible trees, so, here are a few important things you
-;; should know: Once Advice has been started with `ad-start-advice'
-;; (which happens automatically when you load this file), it
-;; generates an advised definition of the `documentation' function, and
-;; it will enable automatic advice activation when functions get defined.
-;; All of this can be undone at any time with `M-x ad-stop-advice'.
+;; should know:
;;
;; If you experience any strange behavior/errors etc. that you attribute to
;; Advice or to some ill-advised function do one of the following:
@@ -137,45 +124,37 @@
;; - M-x ad-deactivate FUNCTION (if you have a definite suspicion what
;; function gives you problems)
;; - M-x ad-deactivate-all (if you don't have a clue what's going wrong)
-;; - M-x ad-stop-advice (if you think the problem is related to the
-;; advised functions used by Advice itself)
;; - M-x ad-recover-normality (for real emergencies)
;; - If none of the above solves your Advice-related problem go to another
;; terminal, kill your Emacs process and send me some hate mail.
-;; The first three measures have restarts, i.e., once you've figured out
+;; The first two measures have restarts, i.e., once you've figured out
;; the problem you can reactivate advised functions with either `ad-activate',
-;; `ad-activate-all', or `ad-start-advice'. `ad-recover-normality' unadvises
+;; or `ad-activate-all'. `ad-recover-normality' unadvises
;; everything so you won't be able to reactivate any advised functions, you'll
;; have to stick with their standard incarnations for the rest of the session.
-;; IMPORTANT: With Advice loaded always do `M-x ad-deactivate-all' before
-;; you byte-compile a file, because advised special forms and macros can lead
-;; to unwanted compilation results. When you are done compiling use
-;; `M-x ad-activate-all' to go back to the advised state of all your
-;; advised functions.
-
;; RELAX: Advice is pretty safe even if you are oblivious to the above.
;; I use it extensively and haven't run into any serious trouble in a long
-;; time. Just wanted you to be warned.
+;; time. Just wanted you to be warned.
;; @ Customization:
;; ================
;; Look at the documentation of `ad-redefinition-action' for possible values
-;; of this variable. Its default value is `warn' which will print a warning
+;; of this variable. Its default value is `warn' which will print a warning
;; message when an already defined advised function gets redefined with a
;; new original definition and de/activated.
;; Look at the documentation of `ad-default-compilation-action' for possible
-;; values of this variable. Its default value is `maybe' which will compile
+;; values of this variable. Its default value is `maybe' which will compile
;; advised definitions during activation in case the byte-compiler is already
-;; loaded. Otherwise, it will leave them uncompiled.
+;; loaded. Otherwise, it will leave them uncompiled.
;; @ Motivation:
;; =============
;; Before I go on explaining how advice works, here are four simple examples
-;; how this package can be used. The first three are very useful, the last one
+;; how this package can be used. The first three are very useful, the last one
;; is just a joke:
;;(defadvice switch-to-buffer (before existing-buffers-only activate)
@@ -206,13 +185,12 @@
;; @ Advice documentation:
;; =======================
-;; Below is general documentation of the various features of advice. For more
+;; Below is general documentation of the various features of advice. For more
;; concrete examples check the corresponding sections in the tutorial part.
;; @@ Terminology:
;; ===============
;; - Emacs: Emacs as released by the GNU Project
-;; - jwz: Jamie Zawinski - creator of the byte-compiler used in v19s.
;; - Advice: The name of this package.
;; - advices: Short for "pieces of advice".
@@ -236,22 +214,22 @@
;; <name> is the name of the advice which has to be a non-nil symbol.
;; Names uniquely identify a piece of advice in a certain advice class,
;; hence, advices can be redefined by defining an advice with the same class
-;; and name. Advice names are global symbols, hence, the same name space
+;; and name. Advice names are global symbols, hence, the same name space
;; conventions used for function names should be applied.
;; An optional <position> specifies where in the current list of advices of
-;; the specified <class> this new advice will be placed. <position> has to
+;; the specified <class> this new advice will be placed. <position> has to
;; be either `first', `last' or a number that specifies a zero-based
-;; position (`first' is equivalent to 0). If no position is specified
-;; `first' will be used as a default. If this call to `defadvice' redefines
+;; position (`first' is equivalent to 0). If no position is specified
+;; `first' will be used as a default. If this call to `defadvice' redefines
;; an already existing advice (see above) then the position argument will
;; be ignored and the position of the already existing advice will be used.
;; An optional <arglist> which has to be a list can be used to define the
-;; argument list of the advised function. This argument list should of
+;; argument list of the advised function. This argument list should of
;; course be compatible with the argument list of the original function,
;; otherwise functions that call the advised function with the original
-;; argument list in mind will break. If more than one advice specify an
+;; argument list in mind will break. If more than one advice specify an
;; argument list then the first one (the one with the smallest position)
;; found in the list of before/around/after advices will be used.
@@ -267,10 +245,10 @@
;; `disable': Specifies that the defined advice should be disabled, hence,
;; it will not be used in an activation until somebody enables it.
;; `preactivate': Specifies that the advised function should get preactivated
-;; at macro-expansion/compile time of this `defadvice'. This
+;; at macro-expansion/compile time of this `defadvice'. This
;; generates a compiled advised definition according to the
;; current advice state which will be used during activation
-;; if appropriate. Only use this if the `defadvice' gets
+;; if appropriate. Only use this if the `defadvice' gets
;; actually compiled.
;; An optional <documentation-string> can be supplied to document the advice.
@@ -278,20 +256,20 @@
;; documentation strings of the original function and other advices.
;; An optional <interactive-form> form can be supplied to change/add
-;; interactive behavior of the original function. If more than one advice
+;; interactive behavior of the original function. If more than one advice
;; has an `(interactive ...)' specification then the first one (the one
;; with the smallest position) found in the list of before/around/after
;; advices will be used.
;; A possibly empty list of <body-forms> specifies the body of the advice in
-;; an implicit progn. The body of an advice can access/change arguments,
+;; an implicit progn. The body of an advice can access/change arguments,
;; the return value, the binding environment, and can have all sorts of
;; other side effects.
;; @@ Assembling advised definitions:
;; ==================================
;; Suppose a function/macro/subr/special-form has N pieces of before advice,
-;; M pieces of around advice and K pieces of after advice. Assuming none of
+;; M pieces of around advice and K pieces of after advice. Assuming none of
;; the advices is protected, its advised definition will look like this
;; (body-form indices correspond to the position of the respective advice in
;; that advice class):
@@ -330,11 +308,11 @@
;; be expanded into a proper documentation string upon call of `documentation'.
;; (interactive ...) is an optional interactive form either taken from the
-;; original function or from a before/around/after advice. For advised
+;; original function or from a before/around/after advice. For advised
;; interactive subrs that do not have an interactive form specified in any
;; advice we have to use (interactive) and then call the subr interactively
;; if the advised function was called interactively, because the
-;; interactive specification of subrs is not accessible. This is the only
+;; interactive specification of subrs is not accessible. This is the only
;; case where changing the values of arguments will not have an affect
;; because they will be reset by the interactive specification of the subr.
;; If this is a problem one can always specify an interactive form in a
@@ -343,45 +321,44 @@
;;
;; Then the body forms of the various advices in the various classes of advice
;; are assembled in order. The forms of around advice L are normally part of
-;; one of the forms of around advice L-1. An around advice can specify where
+;; one of the forms of around advice L-1. An around advice can specify where
;; the forms of the wrapped or surrounded forms should go with the special
-;; keyword `ad-do-it', which will be substituted with a `progn' containing the
-;; forms of the surrounded code.
+;; keyword `ad-do-it', which will run the forms of the surrounded code.
;; The innermost part of the around advice onion is
;; <apply original definition to <arglist>>
-;; whose form depends on the type of the original function. The variable
-;; `ad-return-value' will be set to its result. This variable is visible to
+;; whose form depends on the type of the original function. The variable
+;; `ad-return-value' will be set to its result. This variable is visible to
;; all pieces of advice which can access and modify it before it gets returned.
;;
;; The semantic structure of advised functions that contain protected pieces
-;; of advice is the same. The only difference is that `unwind-protect' forms
+;; of advice is the same. The only difference is that `unwind-protect' forms
;; make sure that the protected advice gets executed even if some previous
-;; piece of advice had an error or a non-local exit. If any around advice is
+;; piece of advice had an error or a non-local exit. If any around advice is
;; protected then the whole around advice onion will be protected.
;; @@ Argument access in advised functions:
;; ========================================
;; As already mentioned, the simplest way to access the arguments of an
-;; advised function in the body of an advice is to refer to them by name. To
-;; do that, the advice programmer needs to know either the names of the
+;; advised function in the body of an advice is to refer to them by name.
+;; To do that, the advice programmer needs to know either the names of the
;; argument variables of the original function, or the names used in the
-;; argument list redefinition given in a piece of advice. While this simple
+;; argument list redefinition given in a piece of advice. While this simple
;; method might be sufficient in many cases, it has the disadvantage that it
;; is not very portable because it hardcodes the argument names into the
;; advice. If the definition of the original function changes the advice
-;; might break even though the code might still be correct. Situations like
+;; might break even though the code might still be correct. Situations like
;; that arise, for example, if one advises a subr like `eval-region' which
;; gets redefined in a non-advice style into a function by the edebug
-;; package. If the advice assumes `eval-region' to be a subr it might break
-;; once edebug is loaded. Similar situations arise when one wants to use the
+;; package. If the advice assumes `eval-region' to be a subr it might break
+;; once edebug is loaded. Similar situations arise when one wants to use the
;; same piece of advice across different versions of Emacs.
;; As a solution to that advice provides argument list access macros that get
;; translated into the proper access forms at activation time, i.e., when the
-;; advised definition gets constructed. Access macros access actual arguments
+;; advised definition gets constructed. Access macros access actual arguments
;; by position regardless of how these actual argument get distributed onto
-;; the argument variables of a function. The rational behind this is that in
+;; the argument variables of a function. The rational behind this is that in
;; Emacs Lisp the semantics of an argument is strictly determined by its
;; position (there are no keyword arguments).
@@ -393,9 +370,9 @@
;;
;; (foo 0 1 2 3 4 5 6)
-;; which means that X=0, Y=1, Z=2 and R=(3 4 5 6). The assumption is that
-;; the semantics of an actual argument is determined by its position. It is
-;; this semantics that has to be known by the advice programmer. Then s/he
+;; which means that X=0, Y=1, Z=2 and R=(3 4 5 6). The assumption is that
+;; the semantics of an actual argument is determined by its position. It is
+;; this semantics that has to be known by the advice programmer. Then s/he
;; can access these arguments in a piece of advice with some of the
;; following macros (the arrows indicate what value they will return):
@@ -408,17 +385,17 @@
;; `(ad-get-arg <position>)' will return the actual argument that was supplied
;; at <position>, `(ad-get-args <position>)' will return the list of actual
-;; arguments supplied starting at <position>. Note that these macros can be
+;; arguments supplied starting at <position>. Note that these macros can be
;; used without any knowledge about the form of the actual argument list of
;; the original function.
;; Similarly, `(ad-set-arg <position> <value-form>)' can be used to set the
-;; value of the actual argument at <position> to <value-form>. For example,
+;; value of the actual argument at <position> to <value-form>. For example,
;;
;; (ad-set-arg 5 "five")
;;
;; will have the effect that R=(3 4 "five" 6) once the original function is
-;; called. `(ad-set-args <position> <value-list-form>)' can be used to set
+;; called. `(ad-set-args <position> <value-list-form>)' can be used to set
;; the list of actual arguments starting at <position> to <value-list-form>.
;; For example,
;;
@@ -427,7 +404,7 @@
;; will have the effect that X=5, Y=4, Z=3 and R=(2 1 0) once the original
;; function is called.
-;; All these access macros are text macros rather than real Lisp macros. When
+;; All these access macros are text macros rather than real Lisp macros. When
;; the advised definition gets constructed they get replaced with actual access
;; forms depending on the argument list of the advised function, i.e., after
;; that argument access is in most cases as efficient as using the argument
@@ -437,7 +414,7 @@
;; =======================================================
;; Some functions (such as `trace-function' defined in trace.el) need a
;; method of accessing the names and bindings of the arguments of an
-;; arbitrary advised function. To do that within an advice one can use the
+;; arbitrary advised function. To do that within an advice one can use the
;; special keyword `ad-arg-bindings' which is a text macro that will be
;; substituted with a form that will evaluate to a list of binding
;; specifications, one for every argument variable. These binding
@@ -463,7 +440,7 @@
;; ==========================
;; Because `defadvice' allows the specification of the argument list
;; of the advised function we need a mapping mechanism that maps this
-;; argument list onto that of the original function. Hence SYM and
+;; argument list onto that of the original function. Hence SYM and
;; NEWDEF have to be properly mapped onto the &rest variable when the
;; original definition is called. Advice automatically takes care of
;; that mapping, hence, the advice programmer can specify an argument
@@ -474,11 +451,10 @@
;; @@ Activation and deactivation:
;; ===============================
;; The definition of an advised function does not change until all its advice
-;; gets actually activated. Activation can either happen with the `activate'
+;; gets actually activated. Activation can either happen with the `activate'
;; flag specified in the `defadvice', with an explicit call or interactive
-;; invocation of `ad-activate', or if forward advice is enabled (i.e., the
-;; value of `ad-activate-on-definition' is t) at the time an already advised
-;; function gets defined.
+;; invocation of `ad-activate', or at the time an already advised function
+;; gets defined.
;; When a function gets first activated its original definition gets saved,
;; all defined and enabled pieces of advice will get combined with the
@@ -496,7 +472,7 @@
;; the file that contained the `defadvice' with the `preactivate' flag.
;; `ad-deactivate' can be used to back-define an advised function to its
-;; original definition. It can be called interactively or directly. Because
+;; original definition. It can be called interactively or directly. Because
;; `ad-activate' caches the advised definition the function can be
;; reactivated via `ad-activate' with only minor overhead (it is checked
;; whether the current advice state is consistent with the cached
@@ -504,12 +480,12 @@
;; `ad-activate-regexp' and `ad-deactivate-regexp' can be used to de/activate
;; all currently advised function that have a piece of advice with a name that
-;; contains a match for a regular expression. These functions can be used to
+;; contains a match for a regular expression. These functions can be used to
;; de/activate sets of functions depending on certain advice naming
;; conventions.
;; Finally, `ad-activate-all' and `ad-deactivate-all' can be used to
-;; de/activate all currently advised functions. These are useful to
+;; de/activate all currently advised functions. These are useful to
;; (temporarily) return to an un/advised state.
;; @@@ Reasons for the separation of advice definition and activation:
@@ -521,26 +497,26 @@
;; The advantage of this is that various pieces of advice can be defined
;; before they get combined into an advised definition which avoids
-;; unnecessary constructions of intermediate advised definitions. The more
+;; unnecessary constructions of intermediate advised definitions. The more
;; important advantage is that it allows the implementation of forward advice.
;; Advice information for a certain function accumulates as the value of the
-;; `advice-info' property of the function symbol. This accumulation is
+;; `advice-info' property of the function symbol. This accumulation is
;; completely independent of the fact that that function might not yet be
-;; defined. The special forms `defun' and `defmacro' have been advised to
-;; check whether the function/macro they defined had advice information
-;; associated with it. If so and forward advice is enabled, the original
+;; defined. The macros `defun' and `defmacro' check whether the
+;; function/macro they defined had advice information
+;; associated with it. If so and forward advice is enabled, the original
;; definition will be saved, and then the advice will be activated.
;; @@ Enabling/disabling pieces or sets of advice:
;; ===============================================
;; A major motivation for the development of this advice package was to bring
;; a little bit more structure into the function overloading chaos in Emacs
-;; Lisp. Many packages achieve some of their functionality by adding a little
+;; Lisp. Many packages achieve some of their functionality by adding a little
;; bit (or a lot) to the standard functionality of some Emacs Lisp function.
-;; ange-ftp is a very popular package that achieves its magic by overloading
-;; most Emacs Lisp functions that deal with files. A popular function that's
-;; overloaded by many packages is `expand-file-name'. The situation that one
-;; function is multiply overloaded can arise easily.
+;; ange-ftp is a very popular package that used to achieve its magic by
+;; overloading most Emacs Lisp functions that deal with files. A popular
+;; function that's overloaded by many packages is `expand-file-name'.
+;; The situation that one function is multiply overloaded can arise easily.
;; Once in a while it would be desirable to be able to disable some/all
;; overloads of a particular package while keeping all the rest. Ideally -
@@ -548,7 +524,7 @@
;; I know I am dreaming right now... In that ideal case the enable/disable
;; mechanism of advice could be used to achieve just that.
-;; Every piece of advice is associated with an enablement flag. When the
+;; Every piece of advice is associated with an enablement flag. When the
;; advised definition of a particular function gets constructed (e.g., during
;; activation) only the currently enabled pieces of advice will be considered.
;; This mechanism allows one to have different "views" of an advised function
@@ -556,17 +532,15 @@
;; Another motivation for this mechanism is that it allows one to define a
;; piece of advice for some function yet keep it dormant until a certain
-;; condition is met. Until then activation of the function will not make use
-;; of that piece of advice. Once the condition is met the advice can be
+;; condition is met. Until then activation of the function will not make use
+;; of that piece of advice. Once the condition is met the advice can be
;; enabled and a reactivation of the function will add its functionality as
-;; part of the new advised definition. For example, the advices of `defun'
-;; etc. used by advice itself will stay disabled until `ad-start-advice' is
-;; called and some variables have the proper values. Hence, if somebody
+;; part of the new advised definition. Hence, if somebody
;; else advised these functions too and activates them the advices defined
;; by advice will get used only if they are intended to be used.
;; The main interface to this mechanism are the interactive functions
-;; `ad-enable-advice' and `ad-disable-advice'. For example, the following
+;; `ad-enable-advice' and `ad-disable-advice'. For example, the following
;; would disable a particular advice of the function `foo':
;;
;; (ad-disable-advice 'foo 'before 'my-advice)
@@ -576,28 +550,28 @@
;;
;; (ad-activate 'foo)
;;
-;; or interactively. To disable whole sets of advices one can use a regular
-;; expression mechanism. For example, let us assume that ange-ftp actually
+;; or interactively. To disable whole sets of advices one can use a regular
+;; expression mechanism. For example, let us assume that ange-ftp actually
;; used advice to overload all its functions, and that it used the
;; "ange-ftp-" prefix for all its advice names, then we could temporarily
;; disable all its advices with
;;
-;; (ad-disable-regexp "^ange-ftp-")
+;; (ad-disable-regexp "\\`ange-ftp-")
;;
;; and the following call would put that actually into effect:
;;
-;; (ad-activate-regexp "^ange-ftp-")
+;; (ad-activate-regexp "\\`ange-ftp-")
;;
;; A safer way would have been to use
;;
-;; (ad-update-regexp "^ange-ftp-")
+;; (ad-update-regexp "\\`ange-ftp-")
;;
;; instead which would have only reactivated currently actively advised
-;; functions, but not functions that were currently inactive. All these
+;; functions, but not functions that were currently inactive. All these
;; functions can also be called interactively.
;; A certain piece of advice is considered a match if its name contains a
-;; match for the regular expression. To enable ange-ftp again we would use
+;; match for the regular expression. To enable ange-ftp again we would use
;; `ad-enable-regexp' and then activate or update again.
;; @@ Forward advice, automatic advice activation:
@@ -615,26 +589,19 @@
;; Advice implements forward advice mainly via the following: 1) Separation
;; of advice definition and activation that makes it possible to accumulate
;; advice information without having the original function already defined,
-;; 2) special versions of the built-in functions `fset/defalias' which check
-;; for advice information whenever they define a function. If advice
-;; information was found then the advice will immediately get activated when
-;; the function gets defined.
+;; 2) Use of the `defalias-fset-function' symbol property which lets
+;; us advise the function when it gets defined.
;; Automatic advice activation means, that whenever a function gets defined
-;; with either `defun', `defmacro', `fset' or by loading a byte-compiled
+;; with either `defun', `defmacro', `defalias' or by loading a byte-compiled
;; file, and the function has some advice-info stored with it then that
;; advice will get activated right away.
-;; @@@ Enabling automatic advice activation:
-;; =========================================
-;; Automatic advice activation is enabled by default. It can be disabled with
-;; `M-x ad-stop-advice' and enabled again with `M-x ad-start-advice'.
-
;; @@ Caching of advised definitions:
;; ==================================
;; After an advised definition got constructed it gets cached as part of the
;; advised function's advice-info so it can be reused, for example, after an
-;; intermediate deactivation. Because the advice-info of a function might
+;; intermediate deactivation. Because the advice-info of a function might
;; change between the time of caching and reuse a cached definition gets
;; a cache-id associated with it so it can be verified whether the cached
;; definition is still valid (the main application of this is preactivation
@@ -642,19 +609,19 @@
;; When an advised function gets activated and a verifiable cached definition
;; is available, then that definition will be used instead of creating a new
-;; advised definition from scratch. If you want to make sure that a new
+;; advised definition from scratch. If you want to make sure that a new
;; definition gets constructed then you should use `ad-clear-cache' before you
;; activate the advised function.
;; @@ Preactivation:
;; =================
-;; Constructing an advised definition is moderately expensive. In a situation
+;; Constructing an advised definition is moderately expensive. In a situation
;; where one package defines a lot of advised functions it might be
;; prohibitively expensive to do all the advised definition construction at
-;; runtime. Preactivation is a mechanism that allows compile-time construction
+;; runtime. Preactivation is a mechanism that allows compile-time construction
;; of compiled advised definitions that can be activated cheaply during
-;; runtime. Preactivation uses the caching mechanism to do that. Here's how it
-;; works:
+;; runtime. Preactivation uses the caching mechanism to do that. Here's how
+;; it works:
;; When the byte-compiler compiles a `defadvice' that has the `preactivate'
;; flag specified, it uses the current original definition of the advised
@@ -665,27 +632,27 @@
;; byte-compiler.
;; When the file with the compiled, preactivating `defadvice' gets loaded the
;; precompiled advised definition will be cached on the advised function's
-;; advice-info. When it gets activated (can be immediately on execution of the
+;; advice-info. When it gets activated (can be immediately on execution of the
;; `defadvice' or any time later) the cache-id gets checked against the
;; current state of advice and if it is verified the precompiled definition
-;; will be used directly (the verification is pretty cheap). If it couldn't get
-;; verified a new advised definition for that function will be built from
-;; scratch, hence, the efficiency added by the preactivation mechanism does
-;; not at all impair the flexibility of the advice mechanism.
+;; will be used directly (the verification is pretty cheap). If it couldn't
+;; get verified a new advised definition for that function will be built from
+;; scratch, hence, the efficiency added by the preactivation mechanism does not
+;; at all impair the flexibility of the advice mechanism.
;; MORAL: In order get all the efficiency out of preactivation the advice
;; state of an advised function at the time the file with the
;; preactivating `defadvice' gets byte-compiled should be exactly
;; the same as it will be when the advice of that function gets
-;; actually activated. If it is not there is a high chance that the
+;; actually activated. If it is not there is a high chance that the
;; cache-id will not match and hence a new advised definition will
;; have to be constructed at runtime.
-;; Preactivation and forward advice do not contradict each other. It is
+;; Preactivation and forward advice do not contradict each other. It is
;; perfectly ok to load a file with a preactivating `defadvice' before the
-;; original definition of the advised function is available. The constructed
+;; original definition of the advised function is available. The constructed
;; advised definition will be used once the original function gets defined and
-;; its advice gets activated. The only constraint is that at the time the
+;; its advice gets activated. The only constraint is that at the time the
;; file with the preactivating `defadvice' got compiled the original function
;; definition was available.
@@ -697,18 +664,18 @@
;; - `byte-compile' is part of the `features' variable even though you
;; did not use the byte-compiler
;; Right now advice does not provide an elegant way to find out whether
-;; and why a preactivation failed. What you can do is to trace the
+;; and why a preactivation failed. What you can do is to trace the
;; function `ad-cache-id-verification-code' (with the function
;; `trace-function-background' defined in my trace.el package) before
-;; any of your advised functions get activated. After they got
+;; any of your advised functions get activated. After they got
;; activated check whether all calls to `ad-cache-id-verification-code'
-;; returned `verified' as a result. Other values indicate why the
+;; returned `verified' as a result. Other values indicate why the
;; verification failed which should give you enough information to
;; fix your preactivation/compile/load/activation sequence.
;; IMPORTANT: There is one case (that I am aware of) that can make
;; preactivation fail, i.e., a preconstructed advised definition that does
-;; NOT match the current state of advice gets used nevertheless. That case
+;; NOT match the current state of advice gets used nevertheless. That case
;; arises if one package defines a certain piece of advice which gets used
;; during preactivation, and another package incompatibly redefines that
;; very advice (i.e., same function/class/name), and it is the second advice
@@ -720,30 +687,20 @@
;; MORAL-II: Redefining somebody else's advice is BAAAAD (to speak with
;; George Walker Bush), and why would you redefine your own advice anyway?
;; Advice is a mechanism to facilitate function redefinition, not advice
-;; redefinition (wait until I write Meta-Advice :-). If you really have
-;; to undo somebody else's advice try to write a "neutralizing" advice.
+;; redefinition (wait until I write Meta-Advice :-). If you really have
+;; to undo somebody else's advice, try to write a "neutralizing" advice.
-;; @@ Advising macros and special forms and other dangerous things:
-;; ================================================================
+;; @@ Advising macros and other dangerous things:
+;; ==============================================
;; Look at the corresponding tutorial sections for more information on
-;; these topics. Here it suffices to point out that the special treatment
-;; of macros and special forms by the byte-compiler can lead to problems
-;; when they get advised. Macros can create problems because they get
-;; expanded at compile time, hence, they might not have all the necessary
-;; runtime support and such advice cannot be de/activated or changed as
-;; it is possible for functions. Special forms create problems because they
-;; have to be advised "into" macros, i.e., an advised special form is a
-;; implemented as a macro, hence, in most cases the byte-compiler will
-;; not recognize it as a special form anymore which can lead to very strange
-;; results.
-;;
-;; MORAL: - Only advise macros or special forms when you are absolutely sure
-;; what you are doing.
-;; - As a safety measure, always do `ad-deactivate-all' before you
-;; byte-compile a file to make sure that even if some inconsiderate
-;; person advised some special forms you'll get proper compilation
-;; results. After compilation do `ad-activate-all' to get back to
-;; the previous state.
+;; these topics. Here it suffices to point out that the special treatment
+;; of macros can lead to problems when they get advised. Macros can create
+;; problems because they get expanded at compile or load time, hence, they
+;; might not have all the necessary runtime support and such advice cannot be
+;; de/activated or changed as it is possible for functions.
+;; Special forms cannot be advised.
+;;
+;; MORAL: - Only advise macros when you are absolutely sure what you are doing.
;; @@ Adding a piece of advice with `ad-add-advice':
;; =================================================
@@ -754,10 +711,10 @@
;; @@ Activation/deactivation advices, file load hooks:
;; ====================================================
;; There are two special classes of advice called `activation' and
-;; `deactivation'. The body forms of these advices are not included into the
+;; `deactivation'. The body forms of these advices are not included into the
;; advised definition of a function, rather they are assembled into a hook
;; form which will be evaluated whenever the advice-info of the advised
-;; function gets activated or deactivated. One application of this mechanism
+;; function gets activated or deactivated. One application of this mechanism
;; is to define file load hooks for files that do not provide such hooks.
;; For example, suppose you want to print a message whenever `file-x' gets
;; loaded, and suppose the last function defined in `file-x' is
@@ -769,7 +726,7 @@
;;
;; This will constitute a forward advice for function `file-x-last-fn' which
;; will get activated when `file-x' is loaded (only if forward advice is
-;; enabled of course). Because there are no "real" pieces of advice
+;; enabled of course). Because there are no "real" pieces of advice
;; available for it, its definition will not be changed, but the activation
;; advice will be run during its activation which is equivalent to having a
;; file load hook for `file-x'.
@@ -784,14 +741,14 @@
;; enabled advices are considered during construction of an advised
;; definition.
;; - Activation:
-;; Redefine an advised function with its advised definition. Constructs
+;; Redefine an advised function with its advised definition. Constructs
;; an advised definition from scratch if no verifiable cached advised
;; definition is available and caches it.
;; - Deactivation:
;; Back-define an advised function to its original definition.
;; - Update:
;; Reactivate an advised function but only if its advice is currently
-;; active. This can be used to bring all currently advised function up
+;; active. This can be used to bring all currently advised function up
;; to date with the current state of advice without also activating
;; currently inactive functions.
;; - Caching:
@@ -800,7 +757,7 @@
;; - Preactivation:
;; Is the construction of an advised definition according to the current
;; state of advice during byte-compilation of a file with a preactivating
-;; `defadvice'. That advised definition can then rather cheaply be used
+;; `defadvice'. That advised definition can then rather cheaply be used
;; during activation without having to construct an advised definition
;; from scratch at runtime.
@@ -860,12 +817,8 @@
;; @ Foo games: An advice tutorial
;; ===============================
-;; The following tutorial was created in Emacs 18.59. Left-justified
+;; The following tutorial was created in Emacs 18.59. Left-justified
;; s-expressions are input forms followed by one or more result forms.
-;; First we have to start the advice magic:
-;;
-;; (ad-start-advice)
-;; nil
;;
;; We start by defining an innocent looking function `foo' that simply
;; adds 1 to its argument X:
@@ -988,19 +941,6 @@
;; (call-interactively 'foo)
;; 6
;;
-;; Let's have a look at what the definition of `foo' looks like now
-;; (indentation added by hand for legibility):
-;;
-;; (symbol-function 'foo)
-;; (lambda (x)
-;; "$ad-doc: foo$"
-;; (interactive (list 5))
-;; (let (ad-return-value)
-;; (setq x (1- x))
-;; (setq x (1+ x))
-;; (setq ad-return-value (ad-Orig-foo x))
-;; ad-return-value))
-;;
;; @@ Around advices:
;; ==================
;; Now we'll try some `around' advices. An around advice is a wrapper around
@@ -1038,20 +978,6 @@
;; (foo 3)
;; 8
;;
-;; Again, let's see what the definition of `foo' looks like so far:
-;;
-;; (symbol-function 'foo)
-;; (lambda (x)
-;; "$ad-doc: foo$"
-;; (interactive (list 5))
-;; (let (ad-return-value)
-;; (setq x (1- x))
-;; (setq x (1+ x))
-;; (let ((x (* x 2)))
-;; (let ((x (1+ x)))
-;; (setq ad-return-value (ad-Orig-foo x))))
-;; ad-return-value))
-;;
;; @@ Controlling advice activation:
;; =================================
;; In every `defadvice' so far we have used the flag `activate' to activate
@@ -1071,9 +997,9 @@
;; 8
;;
;; Now we define another advice and activate which will also activate the
-;; previous advice `fg-times-x'. Note the use of the special variable
+;; previous advice `fg-times-x'. Note the use of the special variable
;; `ad-return-value' in the body of the advice which is set to the result of
-;; the original function. If we change its value then the value returned by
+;; the original function. If we change its value then the value returned by
;; the advised function will be changed accordingly:
;;
;; (defadvice foo (after fg-times-x-again act)
@@ -1121,24 +1047,6 @@
;; "Let's clean up now!"
;; error-in-foo
;;
-;; Again, let's see what `foo' looks like:
-;;
-;; (symbol-function 'foo)
-;; (lambda (x)
-;; "$ad-doc: foo$"
-;; (interactive (list 5))
-;; (let (ad-return-value)
-;; (unwind-protect
-;; (progn (setq x (1- x))
-;; (setq x (1+ x))
-;; (let ((x (* x 2)))
-;; (let ((x (1+ x)))
-;; (setq ad-return-value (ad-Orig-foo x))))
-;; (setq ad-return-value (* ad-return-value x))
-;; (setq ad-return-value (* ad-return-value x)))
-;; (print "Let's clean up now!"))
-;; ad-return-value))
-;;
;; @@ Compilation of advised definitions:
;; ======================================
;; Finally, we can specify the `compile' keyword in a `defadvice' to say
@@ -1150,13 +1058,10 @@
;; (print "Let's clean up now!"))
;; foo
;;
-;; Now `foo' is byte-compiled:
+;; Now `foo's advice is byte-compiled:
;;
-;; (symbol-function 'foo)
-;; (lambda (x)
-;; "$ad-doc: foo$"
-;; (interactive (byte-code "....." [5] 1))
-;; (byte-code "....." [ad-return-value x nil ((byte-code "....." [print "Let's clean up now!"] 2)) * 2 ad-Orig-foo] 6))
+;; (byte-code-function-p 'ad-Advice-foo)
+;; t
;;
;; (foo 3)
;; "Let's clean up now!"
@@ -1262,7 +1167,7 @@
;; deactivate functions that have a piece of advice defined by a certain
;; package (we save the old definition to check out caching):
;;
-;; (setq old-definition (symbol-function 'foo))
+;; (setq old-definition (symbol-function 'ad-Advice-foo))
;; (lambda (x) ....)
;;
;; (ad-deactivate-regexp "^fg-")
@@ -1274,7 +1179,7 @@
;; (ad-activate-regexp "^fg-")
;; nil
;;
-;; (eq old-definition (symbol-function 'foo))
+;; (eq old-definition (symbol-function 'ad-Advice-foo))
;; t
;;
;; (foo 3)
@@ -1283,14 +1188,6 @@
;;
;; @@ Forward advice:
;; ==================
-;; To enable automatic activation of forward advice we first have to set
-;; `ad-activate-on-definition' to t and restart advice:
-;;
-;; (setq ad-activate-on-definition t)
-;; t
-;;
-;; (ad-start-advice)
-;; (ad-activate-defined-function)
;;
;; Let's define a piece of advice for an undefined function:
;;
@@ -1303,9 +1200,7 @@
;; (fboundp 'bar)
;; nil
;;
-;; Now we define it and the forward advice will get activated (only because
-;; `ad-activate-on-definition' was t when we started advice above with
-;; `ad-start-advice'):
+;; Now we define it and the forward advice will get activated:
;;
;; (defun bar (x)
;; "Subtract 1 from X."
@@ -1357,7 +1252,7 @@
;; (ad-activate 'fie)
;; fie
;;
-;; (eq cached-definition (symbol-function 'fie))
+;; (eq cached-definition (symbol-function 'ad-Advice-fie))
;; t
;;
;; (fie 2)
@@ -1365,7 +1260,7 @@
;;
;; If you put a preactivating `defadvice' into a Lisp file that gets byte-
;; compiled then the constructed advised definition will get compiled by
-;; the byte-compiler. For that to occur in a v18 Emacs you had to put the
+;; the byte-compiler. For that to occur in a v18 Emacs you had to put the
;; `defadvice' inside a `defun' because the v18 compiler did not compile
;; top-level forms other than `defun' or `defmacro', for example,
;;
@@ -1407,18 +1302,16 @@
;; constructed during preactivation was used, even though we did not specify
;; the `compile' flag:
;;
-;; (symbol-function 'fum)
-;; (lambda (x)
-;; "$ad-doc: fum$"
-;; (byte-code "....." [ad-return-value x nil * 2 ad-Orig-fum] 4))
+;; (byte-code-function-p 'ad-Advice-fum)
+;; t
;;
;; (fum 2)
;; 8
;;
;; A preactivated definition will only be used if it matches the current
-;; function definition and advice information. If it does not match it
+;; function definition and advice information. If it does not match it
;; will simply be discarded and a new advised definition will be constructed
-;; from scratch. For example, let's first remove all advice-info for `fum':
+;; from scratch. For example, let's first remove all advice-info for `fum':
;;
;; (ad-unadvise 'fum)
;; (("fie") ("bar") ("foo") ...)
@@ -1431,7 +1324,7 @@
;; fum
;;
;; When we now try to use a preactivation it will not be used because the
-;; current advice state is different from the one at preactivation time. This
+;; current advice state is different from the one at preactivation time. This
;; is no tragedy, everything will work as expected just not as efficient,
;; because a new advised definition has to be constructed from scratch:
;;
@@ -1440,7 +1333,7 @@
;;
;; A new uncompiled advised definition got constructed:
;;
-;; (ad-compiled-p (symbol-function 'fum))
+;; (byte-code-function-p 'ad-Advice-fum)
;; nil
;;
;; (fum 2)
@@ -1448,7 +1341,7 @@
;;
;; MORAL: To get all the efficiency out of preactivation the function
;; definition and advice state at preactivation time must be the same as the
-;; state at activation time. Preactivation does work with forward advice, all
+;; state at activation time. Preactivation does work with forward advice, all
;; that's necessary is that the definition of the forward advised function is
;; available when the `defadvice' with the preactivation gets compiled.
;;
@@ -1702,15 +1595,9 @@
;; @@ Compilation idiosyncrasies:
;; ==============================
-;; `defadvice' expansion needs quite a few advice functions and variables,
-;; hence, I need to preload the file before it can be compiled. To avoid
-;; interference of bogus compiled files I always preload the source file:
-(provide 'advice-preload)
-;; During a normal load this is a noop:
-(require 'advice-preload "advice.el")
(require 'macroexp)
;; At run-time also, since ad-do-advised-functions returns code that uses it.
-(require 'cl-lib)
+(eval-when-compile (require 'cl-lib))
;; @@ Variable definitions:
;; ========================
@@ -1776,36 +1663,6 @@ generates a copy of TREE."
(funcall fUnCtIoN tReE))
(t tReE)))
-;; @@ Save real definitions of subrs used by Advice:
-;; =================================================
-;; Advice depends on the real, unmodified functionality of various subrs,
-;; we save them here so advised versions will not interfere (eventually,
-;; we will save all subrs used in code generated by Advice):
-
-(defmacro ad-save-real-definition (function)
- (let ((saved-function (intern (format "ad-real-%s" function))))
- ;; Make sure the compiler is loaded during macro expansion:
- (require 'byte-compile "bytecomp")
- `(if (not (fboundp ',saved-function))
- (progn (fset ',saved-function (symbol-function ',function))
- ;; Copy byte-compiler properties:
- ,@(if (get function 'byte-compile)
- `((put ',saved-function 'byte-compile
- ',(get function 'byte-compile))))
- ,@(if (get function 'byte-opcode)
- `((put ',saved-function 'byte-opcode
- ',(get function 'byte-opcode))))))))
-
-(defun ad-save-real-definitions ()
- ;; Macro expansion will hardcode the values of the various byte-compiler
- ;; properties into the compiled version of this function such that the
- ;; proper values will be available at runtime without loading the compiler:
- (ad-save-real-definition fset)
- (ad-save-real-definition documentation))
-
-(ad-save-real-definitions)
-
-
;; @@ Advice info access fns:
;; ==========================
@@ -1819,7 +1676,7 @@ generates a copy of TREE."
;; (after adv1 adv2 ...)
;; (activation adv1 adv2 ...)
;; (deactivation adv1 adv2 ...)
-;; (origname . <symbol fbound to origdef>)
+;; (advicefunname . <symbol fbound to assembled advice function>)
;; (cache . (<advised-definition> . <id>)))
;; List of currently advised though not necessarily activated functions
@@ -1840,15 +1697,13 @@ generates a copy of TREE."
ad-advised-functions)))
(defmacro ad-do-advised-functions (varform &rest body)
- "`dolist'-style iterator that maps over `ad-advised-functions'.
-\(ad-do-advised-functions (VAR [RESULT-FORM])
+ "`dolist'-style iterator that maps over advised functions.
+\(ad-do-advised-functions (VAR)
BODY-FORM...)
On each iteration VAR will be bound to the name of an advised function
\(a symbol)."
(declare (indent 1))
- `(cl-dolist (,(car varform)
- ad-advised-functions
- ,(car (cdr varform)))
+ `(dolist (,(car varform) ad-advised-functions)
(setq ,(car varform) (intern (car ,(car varform))))
,@body))
@@ -1858,8 +1713,15 @@ On each iteration VAR will be bound to the name of an advised function
(defmacro ad-get-advice-info-macro (function)
`(get ,function 'ad-advice-info))
-(defmacro ad-set-advice-info (function advice-info)
- `(put ,function 'ad-advice-info ,advice-info))
+(defsubst ad-set-advice-info (function advice-info)
+ (cond
+ (advice-info
+ (add-function :around (get function 'defalias-fset-function)
+ #'ad--defalias-fset))
+ ((get function 'defalias-fset-function)
+ (remove-function (get function 'defalias-fset-function)
+ #'ad--defalias-fset)))
+ (put function 'ad-advice-info advice-info))
(defmacro ad-copy-advice-info (function)
`(copy-tree (get ,function 'ad-advice-info)))
@@ -1867,7 +1729,7 @@ On each iteration VAR will be bound to the name of an advised function
(defmacro ad-is-advised (function)
"Return non-nil if FUNCTION has any advice info associated with it.
This does not mean that the advice is also active."
- (list 'ad-get-advice-info-macro function))
+ `(ad-get-advice-info-macro ,function))
(defun ad-initialize-advice-info (function)
"Initialize the advice info for FUNCTION.
@@ -1907,18 +1769,17 @@ either t or nil, and DEFINITION should be a list of the form
;; ad-find-advice uses the alist structure directly ->
;; change if this data structure changes!!
-(defmacro ad-advice-name (advice)
- (list 'car advice))
-(defmacro ad-advice-protected (advice)
- (list 'nth 1 advice))
-(defmacro ad-advice-enabled (advice)
- (list 'nth 2 advice))
-(defmacro ad-advice-definition (advice)
- (list 'nth 3 advice))
+(defsubst ad-advice-name (advice) (car advice))
+(defsubst ad-advice-protected (advice) (nth 1 advice))
+(defsubst ad-advice-enabled (advice) (nth 2 advice))
+(defsubst ad-advice-definition (advice) (nth 3 advice))
(defun ad-advice-set-enabled (advice flag)
(rplaca (cdr (cdr advice)) flag))
+(defvar ad-advice-classes '(before around after activation deactivation)
+ "List of defined advice classes.")
+
(defun ad-class-p (thing)
(memq thing ad-advice-classes))
(defun ad-name-p (thing)
@@ -1931,9 +1792,6 @@ either t or nil, and DEFINITION should be a list of the form
;; @@ Advice access functions:
;; ===========================
-;; List of defined advice classes:
-(defvar ad-advice-classes '(before around after activation deactivation))
-
(defun ad-has-enabled-advice (function class)
"True if at least one of FUNCTION's advices in CLASS is enabled."
(cl-dolist (advice (ad-get-advice-info-field function class))
@@ -1950,7 +1808,7 @@ Redefining advices affect the construction of an advised definition."
(defun ad-has-any-advice (function)
"True if the advice info of FUNCTION defines at least one advice."
(and (ad-is-advised function)
- (cl-dolist (class ad-advice-classes nil)
+ (cl-dolist (class ad-advice-classes)
(if (ad-get-advice-info-field function class)
(cl-return t)))))
@@ -1966,76 +1824,30 @@ Redefining advices affect the construction of an advised definition."
;; @@ Dealing with automatic advice activation via `fset/defalias':
;; ================================================================
-;; Since Emacs 19.26 the built-in versions of `fset' and `defalias'
-;; take care of automatic advice activation, hence, we don't have to
-;; hack it anymore by advising `fset/defun/defmacro/byte-code/etc'.
+;; Automatic activation happens when a function gets defined via `defalias',
+;; which calls the `defalias-fset-function' (which we set to
+;; `ad--defalias-fset') instead of `fset', if non-nil.
-;; The functionality of the new `fset' is as follows:
-;;
-;; fset(sym,newdef)
-;; assign NEWDEF to SYM
-;; if (get SYM 'ad-advice-info)
-;; ad-activate-internal(SYM, nil)
-;; return (symbol-function SYM)
-;;
;; Whether advised definitions created by automatic activations will be
;; compiled depends on the value of `ad-default-compilation-action'.
-;; Since calling `ad-activate-internal' in the built-in definition of `fset' can
-;; create major disasters we have to be a bit careful. One precaution is
-;; to provide a dummy definition for `ad-activate-internal' which can be used to
-;; turn off automatic advice activation (e.g., when `ad-stop-advice' or
-;; `ad-recover-normality' are called). Another is to avoid recursive calls
-;; to `ad-activate' by using `ad-with-auto-activation-disabled' where
-;; appropriate, especially in a safe version of `fset'.
-
-;; For now define `ad-activate-internal' to the dummy definition:
-(defun ad-activate-internal (function &optional compile)
- "Automatic advice activation is disabled. `ad-start-advice' enables it."
- nil)
-
-;; This is just a copy of the above:
-(defun ad-activate-internal-off (function &optional compile)
- "Automatic advice activation is disabled. `ad-start-advice' enables it."
- nil)
-
-;; This will be t for top-level calls to `ad-activate-internal-on':
-(defvar ad-activate-on-top-level t)
-
-(defmacro ad-with-auto-activation-disabled (&rest body)
- `(let ((ad-activate-on-top-level nil))
- ,@body))
+(defalias 'ad-activate-internal 'ad-activate)
-(defun ad-safe-fset (symbol definition)
- "A safe `fset' which will never call `ad-activate-internal' recursively."
- (ad-with-auto-activation-disabled
- (ad-real-fset symbol definition)))
+(defun ad-make-advicefunname (function)
+ "Make name to be used to call the assembled advice function."
+ (intern (format "ad-Advice-%s" function)))
+(defun ad-get-orig-definition (function) ;FIXME: Rename to "-unadvised-".
+ (if (symbolp function)
+ (setq function (if (fboundp function)
+ (advice--strip-macro (symbol-function function)))))
+ (while (advice--p function) (setq function (advice--cdr function)))
+ function)
-;; @@ Access functions for original definitions:
-;; ============================================
-;; The advice-info of an advised function contains its `origname' which is
-;; a symbol that is fbound to the original definition available at the first
-;; proper activation of the function after a valid re/definition. If the
-;; original was defined via fcell indirection then `origname' will be defined
-;; just so. Hence, to get hold of the actual original definition of a function
-;; we need to use `ad-real-orig-definition'.
-
-(defun ad-make-origname (function)
- "Make name to be used to call the original FUNCTION."
- (intern (format "ad-Orig-%s" function)))
-
-(defmacro ad-get-orig-definition (function)
- `(let ((origname (ad-get-advice-info-field ,function 'origname)))
- (if (fboundp origname)
- (symbol-function origname))))
-
-(defmacro ad-set-orig-definition (function definition)
- `(ad-safe-fset
- (ad-get-advice-info-field ,function 'origname) ,definition))
-
-(defmacro ad-clear-orig-definition (function)
- `(fmakunbound (ad-get-advice-info-field ,function 'origname)))
+(defun ad-clear-advicefunname-definition (function)
+ (let ((advicefunname (ad-get-advice-info-field function 'advicefunname)))
+ (advice-remove function advicefunname)
+ (fmakunbound advicefunname)))
;; @@ Interactive input functions:
@@ -2053,7 +1865,7 @@ function at point for which PREDICATE returns non-nil)."
(error "ad-read-advised-function: There are no advised functions"))
(setq default
(or default
- ;; Prefer func name at point, if it's in ad-advised-functions etc.
+ ;; Prefer func name at point, if it's an advised function etc.
(let ((function (progn
(require 'help)
(function-called-at-point))))
@@ -2062,24 +1874,20 @@ function at point for which PREDICATE returns non-nil)."
(or (null predicate)
(funcall predicate function))
function))
- (ad-do-advised-functions (function)
- (if (or (null predicate)
- (funcall predicate function))
- (cl-return function)))
+ (cl-block nil
+ (ad-do-advised-functions (function)
+ (if (or (null predicate)
+ (funcall predicate function))
+ (cl-return function))))
(error "ad-read-advised-function: %s"
"There are no qualifying advised functions")))
- (let* ((ad-pReDiCaTe predicate)
- (function
+ (let* ((function
(completing-read
(format "%s (default %s): " (or prompt "Function") default)
ad-advised-functions
(if predicate
- (function
- (lambda (function)
- ;; Oops, no closures - the joys of dynamic scoping:
- ;; `predicate' clashed with the `predicate' argument
- ;; of `completing-read'.....
- (funcall ad-pReDiCaTe (intern (car function))))))
+ (lambda (function)
+ (funcall predicate (intern (car function)))))
t)))
(if (equal function "")
(if (ad-is-advised default)
@@ -2299,7 +2107,7 @@ See Info node `(elisp)Computed Advice' for detailed documentation."
(cond ((not (ad-is-advised function))
(ad-initialize-advice-info function)
(ad-set-advice-info-field
- function 'origname (ad-make-origname function))))
+ function 'advicefunname (ad-make-advicefunname function))))
(let* ((previous-position
(ad-advice-position function class (ad-advice-name advice)))
(advices (ad-get-advice-info-field function class))
@@ -2332,12 +2140,6 @@ See Info node `(elisp)Computed Advice' for detailed documentation."
"Take a macro function DEFINITION and make a lambda out of it."
`(cdr ,definition))
-(defun ad-special-form-p (definition)
- "Non-nil if and only if DEFINITION is a special form."
- (if (and (symbolp definition) (fboundp definition))
- (setq definition (indirect-function definition)))
- (and (subrp definition) (eq (cdr (subr-arity definition)) 'unevalled)))
-
(defmacro ad-subr-p (definition)
;;"non-nil if DEFINITION is a subr."
(list 'subrp definition))
@@ -2377,10 +2179,8 @@ See Info node `(elisp)Computed Advice' for detailed documentation."
(cdr definition))
(t nil)))
-(defun ad-arglist (definition &optional name)
- "Return the argument list of DEFINITION.
-If DEFINITION could be from a subr then its NAME should be
-supplied to make subr arglist lookup more efficient."
+(defun ad-arglist (definition)
+ "Return the argument list of DEFINITION."
(require 'help-fns)
(help-function-arglist
(if (or (ad-macro-p definition) (ad-advice-p definition))
@@ -2392,7 +2192,7 @@ supplied to make subr arglist lookup more efficient."
"Return the unexpanded docstring of DEFINITION."
(let ((docstring
(if (ad-compiled-p definition)
- (ad-real-documentation definition t)
+ (documentation definition t)
(car (cdr (cdr (ad-lambda-expression definition)))))))
(if (or (stringp docstring)
(natnump docstring))
@@ -2415,13 +2215,16 @@ Like `interactive-form', but also works on pieces of advice."
(if (ad-interactive-form definition) 1 0))
(cdr (cdr (ad-lambda-expression definition)))))))
-(defun ad-make-advised-definition-docstring (function)
+(defun ad-make-advised-definition-docstring (_function)
"Make an identifying docstring for the advised definition of FUNCTION.
Put function name into the documentation string so we can infer
the name of the advised function from the docstring. This is needed
to generate a proper advised docstring even if we are just given a
definition (see the code for `documentation')."
- (propertize "Advice doc string" 'ad-advice-info function))
+ (eval-when-compile
+ (propertize "Advice function assembled by advice.el."
+ 'dynamic-docstring-function
+ #'ad--make-advised-docstring)))
(defun ad-advised-definition-p (definition)
"Return non-nil if DEFINITION was generated from advice information."
@@ -2430,20 +2233,19 @@ definition (see the code for `documentation')."
(ad-compiled-p definition))
(let ((docstring (ad-docstring definition)))
(and (stringp docstring)
- (get-text-property 0 'ad-advice-info docstring)))))
+ (get-text-property 0 'dynamic-docstring-function docstring)))))
(defun ad-definition-type (definition)
"Return symbol that describes the type of DEFINITION."
+ ;; These symbols are only ever used to check a cache entry's validity.
+ ;; The suffix `2' reflects the fact that we're using version 2 of advice
+ ;; representations, so cache entries preactivated with version
+ ;; 1 can't be used.
(cond
- ((ad-macro-p definition) 'macro)
- ((ad-subr-p definition)
- (if (ad-special-form-p definition)
- 'special-form
- 'subr))
- ((or (ad-lambda-p definition)
- (ad-compiled-p definition))
- 'function)
- ((ad-advice-p definition) 'advice)))
+ ((ad-macro-p definition) 'macro2)
+ ((ad-subr-p definition) 'subr2)
+ ((or (ad-lambda-p definition) (ad-compiled-p definition)) 'fun2)
+ ((ad-advice-p definition) 'advice2))) ;; FIXME: Can this ever happen?
(defun ad-has-proper-definition (function)
"True if FUNCTION is a symbol with a proper definition.
@@ -2463,9 +2265,9 @@ For that it has to be fbound with a non-autoload definition."
definition))))
(defun ad-real-orig-definition (function)
- "Find FUNCTION's real original definition starting from its `origname'."
- (if (ad-is-advised function)
- (ad-real-definition (ad-get-advice-info-field function 'origname))))
+ (let* ((fun1 (ad-get-orig-definition function))
+ (fun2 (indirect-function fun1)))
+ (unless (autoloadp fun2) fun2)))
(defun ad-is-compilable (function)
"True if FUNCTION has an interpreted definition that can be compiled."
@@ -2474,25 +2276,17 @@ For that it has to be fbound with a non-autoload definition."
(ad-macro-p (symbol-function function)))
(not (ad-compiled-p (symbol-function function)))))
+(defvar warning-suppress-types) ;From warnings.el.
(defun ad-compile-function (function)
- "Byte-compiles FUNCTION (or macro) if it is not yet compiled."
- (interactive "aByte-compile function: ")
- (if (ad-is-compilable function)
- ;; Need to turn off auto-activation
- ;; because `byte-compile' uses `fset':
- (ad-with-auto-activation-disabled
- (require 'bytecomp)
- (require 'warnings) ;To define warning-suppress-types
- ;before we let-bind it.
- (let ((symbol (make-symbol "advice-compilation"))
- (byte-compile-warnings byte-compile-warnings)
- ;; Don't pop up windows showing byte-compiler warnings.
- (warning-suppress-types '((bytecomp))))
- (if (featurep 'cl)
- (byte-compile-disable-warning 'cl-functions))
- (fset symbol (symbol-function function))
- (byte-compile symbol)
- (fset function (symbol-function symbol))))))
+ "Byte-compile the assembled advice function."
+ (require 'bytecomp)
+ (require 'warnings) ;To define warning-suppress-types before we let-bind it.
+ (let ((byte-compile-warnings byte-compile-warnings)
+ ;; Don't pop up windows showing byte-compiler warnings.
+ (warning-suppress-types '((bytecomp))))
+ (if (featurep 'cl)
+ (byte-compile-disable-warning 'cl-functions))
+ (byte-compile (ad-get-advice-info-field function 'advicefunname))))
;; @@@ Accessing argument lists:
;; =============================
@@ -2604,24 +2398,20 @@ The assignment starts at position INDEX."
(let ((values-index 0)
argument-access set-forms)
(while (setq argument-access (ad-access-argument arglist index))
- (if (symbolp argument-access)
- (setq set-forms
- (cons (ad-set-argument
- arglist index
- (ad-element-access values-index 'ad-vAlUeS))
- set-forms))
- (setq set-forms
- (cons (if (= (car argument-access) 0)
- (list 'setq
- (car (cdr argument-access))
- (ad-list-access values-index 'ad-vAlUeS))
- (list 'setcdr
- (ad-list-access (1- (car argument-access))
- (car (cdr argument-access)))
- (ad-list-access values-index 'ad-vAlUeS)))
- set-forms))
- ;; terminate loop
- (setq arglist nil))
+ (push (if (symbolp argument-access)
+ (ad-set-argument
+ arglist index
+ (ad-element-access values-index 'ad-vAlUeS))
+ (setq arglist nil) ;; Terminate loop.
+ (if (= (car argument-access) 0)
+ `(setq
+ ,(car (cdr argument-access))
+ ,(ad-list-access values-index 'ad-vAlUeS))
+ `(setcdr
+ ,(ad-list-access (1- (car argument-access))
+ (car (cdr argument-access)))
+ ,(ad-list-access values-index 'ad-vAlUeS))))
+ set-forms)
(setq index (1+ index))
(setq values-index (1+ values-index)))
(if (null set-forms)
@@ -2630,8 +2420,8 @@ The assignment starts at position INDEX."
(if (= (length set-forms) 1)
;; For exactly one set-form we can use values-form directly,...
(ad-substitute-tree
- (function (lambda (form) (eq form 'ad-vAlUeS)))
- (function (lambda (form) values-form))
+ (lambda (form) (eq form 'ad-vAlUeS))
+ (lambda (_form) values-form)
(car set-forms))
;; ...if we have more we have to bind it to a variable:
`(let ((ad-vAlUeS ,values-form))
@@ -2683,7 +2473,7 @@ Excess source arguments will be neglected, missing source arguments will be
supplied as nil. Returns a `funcall' or `apply' form with the second element
being `function' which has to be replaced by an actual function argument.
Example: `(ad-map-arglists '(a &rest args) '(w x y z))' will return
- `(funcall function a (car args) (car (cdr args)) (nth 2 args))'."
+ `(funcall ad--addoit-function a (car args) (car (cdr args)) (nth 2 args))'."
(let* ((parsed-source-arglist (ad-parse-arglist source-arglist))
(source-reqopt-args (append (nth 0 parsed-source-arglist)
(nth 1 parsed-source-arglist)))
@@ -2697,15 +2487,14 @@ Example: `(ad-map-arglists '(a &rest args) '(w x y z))' will return
;; This produces ``error-proof'' target function calls with the exception
;; of a case like (&rest a) mapped onto (x &rest y) where the actual args
;; supplied to A might not be enough to supply the required target arg X
- (append (list (if need-apply 'apply 'funcall) 'function)
+ (append (list (if need-apply 'apply 'funcall) 'ad--addoit-function)
(cond (need-apply
;; `apply' can take care of that directly:
(append source-reqopt-args (list source-rest-arg)))
- (t (mapcar (function
- (lambda (arg)
- (setq target-arg-index (1+ target-arg-index))
- (ad-get-argument
- source-arglist target-arg-index)))
+ (t (mapcar (lambda (_arg)
+ (setq target-arg-index (1+ target-arg-index))
+ (ad-get-argument
+ source-arglist target-arg-index))
(append target-reqopt-args
(and target-rest-arg
;; If we have a rest arg gobble up
@@ -2713,13 +2502,6 @@ Example: `(ad-map-arglists '(a &rest args) '(w x y z))' will return
(nthcdr (length target-reqopt-args)
source-reqopt-args)))))))))
-(defun ad-make-mapped-call (source-arglist target-arglist target-function)
- "Make form to call TARGET-FUNCTION with args from SOURCE-ARGLIST."
- (let ((mapped-form (ad-map-arglists source-arglist target-arglist)))
- (if (eq (car mapped-form) 'funcall)
- (cons target-function (cdr (cdr mapped-form)))
- (prog1 mapped-form
- (setcar (cdr mapped-form) (list 'quote target-function))))))
;; @@@ Making an advised documentation string:
;; ===========================================
@@ -2736,11 +2518,6 @@ Example: `(ad-map-arglists '(a &rest args) '(w x y z))' will return
(let ((advice-docstring (ad-docstring (ad-advice-definition advice))))
(cond ((eq style 'plain)
advice-docstring)
- ((eq style 'freeze)
- (format "Permanent %s-advice `%s':%s%s"
- class (ad-advice-name advice)
- (if advice-docstring "\n" "")
- (or advice-docstring "")))
(t (if advice-docstring
(format "%s-advice `%s':\n%s"
(capitalize (symbol-name class))
@@ -2752,25 +2529,22 @@ Example: `(ad-map-arglists '(a &rest args) '(w x y z))' will return
(require 'help-fns) ;For help-split-fundoc and help-add-fundoc-usage.
-(defun ad-make-advised-docstring (function &optional style)
+(defun ad--make-advised-docstring (origdoc function &optional style)
"Construct a documentation string for the advised FUNCTION.
It concatenates the original documentation with the documentation
strings of the individual pieces of advice which will be formatted
-according to STYLE. STYLE can be `plain' or `freeze', everything else
+according to STYLE. STYLE can be `plain', everything else
will be interpreted as `default'. The order of the advice documentation
strings corresponds to before/around/after and the individual ordering
in any of these classes."
- (let* ((origdef (ad-real-orig-definition function))
- (origtype (symbol-name (ad-definition-type origdef)))
- (origdoc
- ;; Retrieve raw doc, key substitution will be taken care of later:
- (ad-real-documentation origdef t))
- (usage (help-split-fundoc origdoc function))
- paragraphs advice-docstring ad-usage)
+ (if (and (symbolp function)
+ (string-match "\\`ad-+Advice-" (symbol-name function)))
+ (setq function
+ (intern (substring (symbol-name function) (match-end 0)))))
+ (let* ((usage (help-split-fundoc origdoc function))
+ paragraphs advice-docstring)
(setq usage (if (null usage) t (setq origdoc (cdr usage)) (car usage)))
(if origdoc (setq paragraphs (list origdoc)))
- (unless (eq style 'plain)
- (push (concat "This " origtype " is advised.") paragraphs))
(dolist (class ad-advice-classes)
(dolist (advice (ad-get-enabled-advices function class))
(setq advice-docstring
@@ -2781,13 +2555,11 @@ in any of these classes."
(propertize
;; separate paragraphs with blank lines:
(mapconcat 'identity (nreverse paragraphs) "\n\n")
- 'ad-advice-info function)))
+ ;; FIXME: what is this for?
+ 'dynamic-docstring-function
+ #'ad--make-advised-docstring)))
(help-add-fundoc-usage origdoc usage)))
-(defun ad-make-plain-docstring (function)
- (ad-make-advised-docstring function 'plain))
-(defun ad-make-freeze-docstring (function)
- (ad-make-advised-docstring function 'freeze))
;; @@@ Accessing overriding arglists and interactive forms:
;; ========================================================
@@ -2821,64 +2593,18 @@ in any of these classes."
(if (and (ad-is-advised function)
(ad-has-redefining-advice function))
(let* ((origdef (ad-real-orig-definition function))
- (origname (ad-get-advice-info-field function 'origname))
- (orig-interactive-p (commandp origdef))
- (orig-subr-p (ad-subr-p origdef))
- (orig-special-form-p (ad-special-form-p origdef))
- (orig-macro-p (ad-macro-p origdef))
;; Construct the individual pieces that we need for assembly:
- (orig-arglist (ad-arglist origdef function))
+ (orig-arglist (let ((args (ad-arglist origdef)))
+ ;; The arglist may still be unknown.
+ (if (listp args) args '(&rest args))))
(advised-arglist (or (ad-advised-arglist function)
orig-arglist))
- (advised-interactive-form (ad-advised-interactive-form function))
- (interactive-form
- (cond (orig-macro-p nil)
- (advised-interactive-form)
- ((interactive-form origdef)
- (interactive-form
- (if (and (symbolp function) (get function 'elp-info))
- (aref (get function 'elp-info) 2)
- origdef)))))
+ (interactive-form (ad-advised-interactive-form function))
(orig-form
- (cond ((or orig-special-form-p orig-macro-p)
- ;; Special forms and macros will be advised into macros.
- ;; The trick is to construct an expansion for the advised
- ;; macro that does the correct thing when it gets eval'ed.
- ;; For macros we'll just use the expansion of the original
- ;; macro and return that. This way compiled advised macros
- ;; will be expanded into something useful. Note that after
- ;; advices have full control over whether they want to
- ;; evaluate the expansion (the value of `ad-return-value')
- ;; at macro expansion time or not. For special forms there
- ;; is no solution that interacts reasonably with the
- ;; compiler, hence we just evaluate the original at macro
- ;; expansion time and return the result. The moral of that
- ;; is that one should always deactivate advised special
- ;; forms before one byte-compiles a file.
- `(,(if orig-macro-p 'macroexpand 'eval)
- (cons ',origname
- ,(ad-get-arguments advised-arglist 0))))
- ((and orig-subr-p
- orig-interactive-p
- (not interactive-form)
- (not advised-interactive-form))
- ;; Check whether we were called interactively
- ;; in order to do proper prompting:
- `(if (called-interactively-p 'any)
- (call-interactively ',origname)
- ,(ad-make-mapped-call advised-arglist
- orig-arglist
- origname)))
- ;; And now for normal functions and non-interactive subrs
- ;; (or subrs whose interactive behavior was advised):
- (t (ad-make-mapped-call
- advised-arglist orig-arglist origname)))))
+ (ad-map-arglists advised-arglist orig-arglist)))
;; Finally, build the sucker:
(ad-assemble-advised-definition
- (cond (orig-macro-p 'macro)
- (orig-special-form-p 'special-form)
- (t 'function))
advised-arglist
(ad-make-advised-definition-docstring function)
interactive-form
@@ -2888,13 +2614,11 @@ in any of these classes."
(ad-get-enabled-advices function 'after)))))
(defun ad-assemble-advised-definition
- (type args docstring interactive orig &optional befores arounds afters)
-
- "Assembles an original and its advices into an advised function.
-It constructs a function or macro definition according to TYPE which has to
-be either `macro', `function' or `special-form'. ARGS is the argument list
-that has to be used, DOCSTRING if non-nil defines the documentation of the
-definition, INTERACTIVE if non-nil is the interactive form to be used,
+ (args docstring interactive orig &optional befores arounds afters)
+ "Assemble the advices into an overall advice function.
+ARGS is the argument list that has to be used,
+DOCSTRING if non-nil defines the documentation of the definition,
+INTERACTIVE if non-nil is the interactive form to be used,
ORIG is a form that calls the body of the original unadvised function,
and BEFORES, AROUNDS and AFTERS are the lists of advices with which ORIG
should be modified. The assembled function will be returned."
@@ -2922,8 +2646,8 @@ should be modified. The assembled function will be returned."
(setq around-form-protected t))
(setq around-form
(ad-substitute-tree
- (function (lambda (form) (eq form 'ad-do-it)))
- (function (lambda (form) around-form))
+ (lambda (form) (eq form 'ad-do-it))
+ (lambda (_form) around-form)
(macroexp-progn (ad-body-forms (ad-advice-definition advice))))))
(setq after-forms
@@ -2945,16 +2669,12 @@ should be modified. The assembled function will be returned."
(ad-body-forms (ad-advice-definition advice)))))))
(setq definition
- `(,@(if (memq type '(macro special-form)) '(macro))
- lambda
- ,args
+ `(lambda (ad--addoit-function ,@args)
,@(if docstring (list docstring))
,@(if interactive (list interactive))
(let (ad-return-value)
,@after-forms
- ,(if (eq type 'special-form)
- '(list 'quote ad-return-value)
- 'ad-return-value))))
+ ad-return-value)))
(ad-insert-argument-access-forms definition args)))
@@ -3051,17 +2771,17 @@ advised definition from scratch."
"Generate an identifying image of the current advices of FUNCTION."
(let ((original-definition (ad-real-orig-definition function))
(cached-definition (ad-get-cache-definition function)))
- (list (mapcar (function (lambda (advice) (ad-advice-name advice)))
+ (list (mapcar #'ad-advice-name
(ad-get-enabled-advices function 'before))
- (mapcar (function (lambda (advice) (ad-advice-name advice)))
+ (mapcar #'ad-advice-name
(ad-get-enabled-advices function 'around))
- (mapcar (function (lambda (advice) (ad-advice-name advice)))
+ (mapcar #'ad-advice-name
(ad-get-enabled-advices function 'after))
(ad-definition-type original-definition)
- (if (equal (ad-arglist original-definition function)
+ (if (equal (ad-arglist original-definition)
(ad-arglist cached-definition))
t
- (ad-arglist original-definition function))
+ (ad-arglist original-definition))
(if (eq (ad-definition-type original-definition) 'function)
(equal (interactive-form original-definition)
(interactive-form cached-definition))))))
@@ -3106,7 +2826,7 @@ advised definition from scratch."
(and (eq (nth 3 cache-id) (ad-definition-type original-definition))
(setq code 'arglist-mismatch)
(equal (if (eq (nth 4 cache-id) t)
- (ad-arglist original-definition function)
+ (ad-arglist original-definition)
(nth 4 cache-id) )
(ad-arglist cached-definition))
(setq code 'interactive-form-mismatch)
@@ -3146,10 +2866,8 @@ advised definition from scratch."
(defun ad-preactivate-advice (function advice class position)
"Preactivate FUNCTION and returns the constructed cache."
- (let* ((function-defined-p (fboundp function))
- (old-definition
- (if function-defined-p
- (symbol-function function)))
+ (let* ((advicefunname (ad-get-advice-info-field function 'advicefunname))
+ (old-advice (symbol-function advicefunname))
(old-advice-info (ad-copy-advice-info function))
(ad-advised-functions ad-advised-functions))
(unwind-protect
@@ -3163,94 +2881,9 @@ advised definition from scratch."
(list (ad-get-cache-definition function)
(ad-get-cache-id function))))
(ad-set-advice-info function old-advice-info)
- ;; Don't `fset' function to nil if it was previously unbound:
- (if function-defined-p
- (ad-safe-fset function old-definition)
- (fmakunbound function)))))
-
-
-;; @@ Freezing:
-;; ============
-;; Freezing transforms a `defadvice' into a redefining `defun/defmacro'
-;; for the advised function without keeping any advice information. This
-;; feature was jwz's idea: It generates a dumpable function definition
-;; whose documentation can be written to the DOC file, and the generated
-;; code does not need any Advice runtime support. Of course, frozen advices
-;; cannot be undone.
-
-;; Freezing only considers the advice of the particular `defadvice', other
-;; already existing advices for the same function will be ignored. To ensure
-;; proper interaction when an already advised function gets redefined with
-;; a frozen advice, frozen advices always use the actual original definition
-;; of the function, i.e., they are always at the core of the onion. E.g., if
-;; an already advised function gets redefined with a frozen advice and then
-;; unadvised, the frozen advice remains as the new definition of the function.
-
-;; While multiple freeze advices for a single function or freeze-advising
-;; of an already advised function are possible, they are better avoided,
-;; because definition/compile/load ordering is relevant, and it becomes
-;; incomprehensible pretty quickly.
-
-(defun ad-make-freeze-definition (function advice class position)
- (if (not (ad-has-proper-definition function))
- (error
- "ad-make-freeze-definition: `%s' is not yet defined"
- function))
- (let* ((name (ad-advice-name advice))
- ;; With a unique origname we can have multiple freeze advices
- ;; for the same function, each overloading the previous one:
- (unique-origname
- (intern (format "%s-%s-%s" (ad-make-origname function) class name)))
- (orig-definition
- ;; If FUNCTION is already advised, we'll use its current origdef
- ;; as the original definition of the frozen advice:
- (or (ad-get-orig-definition function)
- (symbol-function function)))
- (old-advice-info
- (if (ad-is-advised function)
- (ad-copy-advice-info function)))
- (real-docstring-fn
- (symbol-function 'ad-make-advised-definition-docstring))
- (real-origname-fn
- (symbol-function 'ad-make-origname))
- (frozen-definition
- (unwind-protect
- (progn
- ;; Make sure we construct a proper docstring:
- (ad-safe-fset 'ad-make-advised-definition-docstring
- 'ad-make-freeze-docstring)
- ;; Make sure `unique-origname' is used as the origname:
- (ad-safe-fset 'ad-make-origname (lambda (x) unique-origname))
- ;; No we reset all current advice information to nil and
- ;; generate an advised definition that's solely determined
- ;; by ADVICE and the current origdef of FUNCTION:
- (ad-set-advice-info function nil)
- (ad-add-advice function advice class position)
- ;; The following will provide proper real docstrings as
- ;; well as a definition that will make the compiler happy:
- (ad-set-orig-definition function orig-definition)
- (ad-make-advised-definition function))
- ;; Restore the old advice state:
- (ad-set-advice-info function old-advice-info)
- ;; Restore functions:
- (ad-safe-fset
- 'ad-make-advised-definition-docstring real-docstring-fn)
- (ad-safe-fset 'ad-make-origname real-origname-fn))))
- (if frozen-definition
- (let* ((macro-p (ad-macro-p frozen-definition))
- (body (cdr (if macro-p
- (ad-lambdafy frozen-definition)
- frozen-definition))))
- `(progn
- (if (not (fboundp ',unique-origname))
- (fset ',unique-origname
- ;; avoid infinite recursion in case the function
- ;; we want to freeze is already advised:
- (or (ad-get-orig-definition ',function)
- (symbol-function ',function))))
- (,(if macro-p 'defmacro 'defun)
- ,function
- ,@body))))))
+ (advice-remove function advicefunname)
+ (fset advicefunname old-advice)
+ (if old-advice (advice-add function :around advicefunname)))))
;; @@ Activation and definition handling:
@@ -3262,45 +2895,56 @@ If COMPILE is non-nil and not a negative number then it returns t.
If COMPILE is a negative number then it returns nil.
If COMPILE is nil then the result depends on the value of
`ad-default-compilation-action' (which see)."
- (if (integerp compile)
- (>= compile 0)
- (if compile
- compile
- (cond ((eq ad-default-compilation-action 'never)
- nil)
- ((eq ad-default-compilation-action 'always)
- t)
- ((eq ad-default-compilation-action 'like-original)
- (or (ad-subr-p (ad-get-orig-definition function))
- (ad-compiled-p (ad-get-orig-definition function))))
- ;; everything else means `maybe':
- (t (featurep 'byte-compile))))))
+ (cond
+ ;; Don't compile until the real function definition is known (bug#12965).
+ ((not (ad-real-orig-definition function)) nil)
+ ((integerp compile) (>= compile 0))
+ (compile)
+ ((eq ad-default-compilation-action 'never) nil)
+ ((eq ad-default-compilation-action 'always) t)
+ ((eq ad-default-compilation-action 'like-original)
+ (or (ad-subr-p (ad-get-orig-definition function))
+ (ad-compiled-p (ad-get-orig-definition function))))
+ ;; everything else means `maybe':
+ (t (featurep 'byte-compile))))
(defun ad-activate-advised-definition (function compile)
"Redefine FUNCTION with its advised definition from cache or scratch.
The resulting FUNCTION will be compiled if `ad-should-compile' returns t.
The current definition and its cache-id will be put into the cache."
- (let ((verified-cached-definition
- (if (ad-verify-cache-id function)
- (ad-get-cache-definition function))))
- (ad-safe-fset function
- (or verified-cached-definition
- (ad-make-advised-definition function)))
+ (let* ((verified-cached-definition
+ (if (ad-verify-cache-id function)
+ (ad-get-cache-definition function)))
+ (advicefunname (ad-get-advice-info-field function 'advicefunname))
+ (old-ispec (interactive-form advicefunname)))
+ (fset advicefunname
+ (or verified-cached-definition
+ (ad-make-advised-definition function)))
+ (unless (equal (interactive-form advicefunname) old-ispec)
+ ;; If the interactive-spec of advicefunname has changed, force nadvice to
+ ;; refresh its copy.
+ (advice-remove function advicefunname))
+ (advice-add function :around advicefunname)
(if (ad-should-compile function compile)
(ad-compile-function function))
(if verified-cached-definition
- (if (not (eq verified-cached-definition (symbol-function function)))
+ (if (not (eq verified-cached-definition
+ (symbol-function advicefunname)))
;; we must have compiled, cache the compiled definition:
- (ad-set-cache
- function (symbol-function function) (ad-get-cache-id function)))
+ (ad-set-cache function (symbol-function advicefunname)
+ (ad-get-cache-id function)))
;; We created a new advised definition, cache it with a proper id:
(ad-clear-cache function)
;; ad-make-cache-id needs the new cached definition:
- (ad-set-cache function (symbol-function function) nil)
+ (ad-set-cache function (symbol-function advicefunname) nil)
(ad-set-cache
- function (symbol-function function) (ad-make-cache-id function)))))
+ function (symbol-function advicefunname) (ad-make-cache-id function)))))
-(defun ad-handle-definition (function)
+(defun ad--defalias-fset (fsetfun function newdef)
+ ;; Besides ad-redefinition-action we use this defalias-fset-function hook
+ ;; for two other reasons:
+ ;; - for `activation/deactivation' advices.
+ ;; - to rebuild the ad-Advice-* function with the right argument names.
"Handle re/definition of an advised FUNCTION during de/activation.
If FUNCTION does not have an original definition associated with it and
the current definition is usable, then it will be stored as FUNCTION's
@@ -3312,33 +2956,27 @@ associated with it but got redefined with a new definition and then
de/activated. If you do not like the current redefinition action change
the value of `ad-redefinition-action' and de/activate again."
(let ((original-definition (ad-get-orig-definition function))
- (current-definition (if (ad-real-definition function)
- (symbol-function function))))
+ (current-definition (ad-get-orig-definition newdef)))
(if original-definition
(if current-definition
- (if (and (not (eq current-definition original-definition))
- ;; Redefinition with an advised definition from a
- ;; different function won't count as such:
- (not (ad-advised-definition-p current-definition)))
- ;; we have a redefinition:
+ (if (not (eq current-definition original-definition))
+ ;; We have a redefinition:
(if (not (memq ad-redefinition-action '(accept discard warn)))
- (error "ad-handle-definition (see its doc): `%s' %s"
+ (error "ad-redefinition-action: `%s' %s"
function "invalidly redefined")
(if (eq ad-redefinition-action 'discard)
- (ad-safe-fset function original-definition)
- (ad-set-orig-definition function current-definition)
+ nil ;; Just drop it!
+ (funcall (or fsetfun #'fset) function newdef)
+ (ad-activate-internal function)
(if (eq ad-redefinition-action 'warn)
(message "ad-handle-definition: `%s' got redefined"
function))))
;; either advised def or correct original is in place:
nil)
- ;; we have an undefinition, ignore it:
- nil)
- (if current-definition
- ;; we have a first definition, save it as original:
- (ad-set-orig-definition function current-definition)
- ;; we don't have anything noteworthy:
- nil))))
+ ;; We have an undefinition, ignore it:
+ (funcall (or fsetfun #'fset) function newdef))
+ (funcall (or fsetfun #'fset) function newdef)
+ (when current-definition (ad-activate-internal function)))))
;; @@ The top-level advice interface:
@@ -3364,24 +3002,20 @@ definition will always be cached for later usage."
(interactive
(list (ad-read-advised-function "Activate advice of")
current-prefix-arg))
- (if ad-activate-on-top-level
- ;; avoid recursive calls to `ad-activate':
- (ad-with-auto-activation-disabled
- (if (not (ad-is-advised function))
- (error "ad-activate: `%s' is not advised" function)
- (ad-handle-definition function)
- ;; Just return for forward advised and not yet defined functions:
- (if (ad-get-orig-definition function)
- (if (not (ad-has-any-advice function))
- (ad-unadvise function)
- ;; Otherwise activate the advice:
- (cond ((ad-has-redefining-advice function)
- (ad-activate-advised-definition function compile)
- (ad-set-advice-info-field function 'active t)
- (eval (ad-make-hook-form function 'activation))
- function)
- ;; Here we are if we have all disabled advices:
- (t (ad-deactivate function)))))))))
+ (cond
+ ((not (ad-is-advised function))
+ (error "ad-activate: `%s' is not advised" function))
+ ;; Just return for forward advised and not yet defined functions:
+ ((not (ad-get-orig-definition function)) nil)
+ ((not (ad-has-any-advice function)) (ad-unadvise function))
+ ;; Otherwise activate the advice:
+ ((ad-has-redefining-advice function)
+ (ad-activate-advised-definition function compile)
+ (ad-set-advice-info-field function 'active t)
+ (eval (ad-make-hook-form function 'activation))
+ function)
+ ;; Here we are if we have all disabled advices:
+ (t (ad-deactivate function))))
(defalias 'ad-activate-on 'ad-activate)
@@ -3396,11 +3030,10 @@ a call to `ad-activate'."
(if (not (ad-is-advised function))
(error "ad-deactivate: `%s' is not advised" function)
(cond ((ad-is-active function)
- (ad-handle-definition function)
(if (not (ad-get-orig-definition function))
(error "ad-deactivate: `%s' has no original definition"
function)
- (ad-safe-fset function (ad-get-orig-definition function))
+ (ad-clear-advicefunname-definition function)
(ad-set-advice-info-field function 'active nil)
(eval (ad-make-hook-form function 'deactivation))
function)))))
@@ -3422,7 +3055,7 @@ If FUNCTION was not advised this will be a noop."
(cond ((ad-is-advised function)
(if (ad-is-active function)
(ad-deactivate function))
- (ad-clear-orig-definition function)
+ (ad-clear-advicefunname-definition function)
(ad-set-advice-info function nil)
(ad-pop-advised-function function))))
@@ -3437,9 +3070,7 @@ Use in emergencies."
(list (intern
(completing-read "Recover advised function: " obarray nil t))))
(cond ((ad-is-advised function)
- (cond ((ad-get-orig-definition function)
- (ad-safe-fset function (ad-get-orig-definition function))
- (ad-clear-orig-definition function)))
+ (ad-clear-advicefunname-definition function)
(ad-set-advice-info function nil)
(ad-pop-advised-function function))))
@@ -3519,7 +3150,7 @@ deactivation, which might run hooks and get into other trouble."
;; Completion alist of valid `defadvice' flags
(defvar ad-defadvice-flags
'(("protect") ("disable") ("activate")
- ("compile") ("preactivate") ("freeze")))
+ ("compile") ("preactivate")))
;;;###autoload
(defmacro defadvice (function args &rest body)
@@ -3538,7 +3169,7 @@ POSITION ::= `first' | `last' | NUMBER. Optional, defaults to `first',
ARGLIST ::= An optional argument list to be used for the advised function
instead of the argument list of the original. The first one found in
before/around/after-advices will be used.
-FLAG ::= `protect'|`disable'|`activate'|`compile'|`preactivate'|`freeze'.
+FLAG ::= `protect'|`disable'|`activate'|`compile'|`preactivate'.
All flags can be specified with unambiguous initial substrings.
DOCSTRING ::= Optional documentation for this piece of advice.
INTERACTIVE-FORM ::= Optional interactive form to be used for the advised
@@ -3564,13 +3195,6 @@ time. This generates a compiled advised definition according to the current
advice state that will be used during activation if appropriate. Only use
this if the `defadvice' gets actually compiled.
-`freeze': Expands the `defadvice' into a redefining `defun/defmacro' according
-to this particular single advice. No other advice information will be saved.
-Frozen advices cannot be undone, they behave like a hard redefinition of
-the advised function. `freeze' implies `activate' and `preactivate'. The
-documentation of the advised function can be dumped onto the `DOC' file
-during preloading.
-
See Info node `(elisp)Advising Functions' for comprehensive documentation.
usage: (defadvice FUNCTION (CLASS NAME [POSITION] [ARGLIST] FLAG...)
[DOCSTRING] [INTERACTIVE-FORM]
@@ -3620,29 +3244,24 @@ usage: (defadvice FUNCTION (CLASS NAME [POSITION] [ARGLIST] FLAG...)
(ad-preactivate-advice
function advice class position))))
;; Now for the things to be done at evaluation time:
- (if (memq 'freeze flags)
- ;; jwz's idea: Freeze the advised definition into a dumpable
- ;; defun/defmacro whose docs can be written to the DOC file:
- (ad-make-freeze-definition function advice class position)
- ;; the normal case:
- `(progn
- (ad-add-advice ',function ',advice ',class ',position)
- ,@(if preactivation
- `((ad-set-cache
- ',function
- ;; the function will get compiled:
- ,(cond ((ad-macro-p (car preactivation))
- `(ad-macrofy
- (function
- ,(ad-lambdafy
- (car preactivation)))))
- (t `(function
- ,(car preactivation))))
- ',(car (cdr preactivation)))))
- ,@(if (memq 'activate flags)
- `((ad-activate ',function
- ,(if (memq 'compile flags) t))))
- ',function))))
+ `(progn
+ (ad-add-advice ',function ',advice ',class ',position)
+ ,@(if preactivation
+ `((ad-set-cache
+ ',function
+ ;; the function will get compiled:
+ ,(cond ((ad-macro-p (car preactivation))
+ `(ad-macrofy
+ (function
+ ,(ad-lambdafy
+ (car preactivation)))))
+ (t `(function
+ ,(car preactivation))))
+ ',(car (cdr preactivation)))))
+ ,@(if (memq 'activate flags)
+ `((ad-activate ',function
+ ,(if (memq 'compile flags) t))))
+ ',function)))
;; @@ Tools:
@@ -3670,59 +3289,35 @@ undone on exit of this macro."
;; Make forms to redefine functions to their
;; original definitions if they are advised:
(setq index -1)
- (mapcar
- (function
- (lambda (function)
- (setq index (1+ index))
- `(ad-safe-fset
- ',function
- (or (ad-get-orig-definition ',function)
- ,(car (nth index current-bindings))))))
- functions))
+ (mapcar (lambda (function)
+ (setq index (1+ index))
+ `(fset ',function
+ (or (ad-get-orig-definition ',function)
+ ,(car (nth index current-bindings)))))
+ functions))
,@body)
,@(progn
;; Make forms to back-define functions to the definitions
;; they had outside this macro call:
(setq index -1)
- (mapcar
- (function
- (lambda (function)
- (setq index (1+ index))
- `(ad-safe-fset
- ',function
- ,(car (nth index current-bindings)))))
- functions))))))
+ (mapcar (lambda (function)
+ (setq index (1+ index))
+ `(fset ',function
+ ,(car (nth index current-bindings))))
+ functions))))))
;; @@ Starting, stopping and recovering from the advice package magic:
;; ===================================================================
-(defun ad-start-advice ()
- "Start the automatic advice handling magic."
- (interactive)
- ;; Advising `ad-activate-internal' means death!!
- (ad-set-advice-info 'ad-activate-internal nil)
- (ad-safe-fset 'ad-activate-internal 'ad-activate))
-
-(defun ad-stop-advice ()
- "Stop the automatic advice handling magic.
-You should only need this in case of Advice-related emergencies."
- (interactive)
- ;; Advising `ad-activate-internal' means death!!
- (ad-set-advice-info 'ad-activate-internal nil)
- (ad-safe-fset 'ad-activate-internal 'ad-activate-internal-off))
-
(defun ad-recover-normality ()
"Undo all advice related redefinitions and unadvises everything.
Use only in REAL emergencies."
(interactive)
- ;; Advising `ad-activate-internal' means death!!
- (ad-set-advice-info 'ad-activate-internal nil)
- (ad-safe-fset 'ad-activate-internal 'ad-activate-internal-off)
(ad-recover-all)
- (setq ad-advised-functions nil))
-
-(ad-start-advice)
+ (ad-do-advised-functions (function)
+ (message "Oops! Left over advised function %S" function)
+ (ad-pop-advised-function function)))
(provide 'advice)
diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
index 0ddc78242ac..7375c2176ba 100644
--- a/lisp/emacs-lisp/byte-opt.el
+++ b/lisp/emacs-lisp/byte-opt.el
@@ -1187,8 +1187,8 @@
boundp buffer-file-name buffer-local-variables buffer-modified-p
buffer-substring byte-code-function-p
capitalize car-less-than-car car cdr ceiling char-after char-before
- char-equal char-to-string char-width
- compare-strings concat coordinates-in-window-p
+ char-equal char-to-string char-width compare-strings
+ compare-window-configurations concat coordinates-in-window-p
copy-alist copy-sequence copy-marker cos count-lines
decode-char
decode-time default-boundp default-value documentation downcase
@@ -1196,17 +1196,18 @@
fboundp fceiling featurep ffloor
file-directory-p file-exists-p file-locked-p file-name-absolute-p
file-newer-than-file-p file-readable-p file-symlink-p file-writable-p
- float float-time floor format format-time-string frame-visible-p
- fround ftruncate
+ float float-time floor format format-time-string frame-first-window
+ frame-root-window frame-selected-window
+ frame-visible-p fround ftruncate
get gethash get-buffer get-buffer-window getenv get-file-buffer
hash-table-count
int-to-string intern-soft
keymap-parent
length local-variable-if-set-p local-variable-p log log10 logand
logb logior lognot logxor lsh langinfo
- make-list make-string make-symbol
- marker-buffer max member memq min mod multibyte-char-to-unibyte
- next-window nth nthcdr number-to-string
+ make-list make-string make-symbol marker-buffer max member memq min
+ minibuffer-selected-window minibuffer-window
+ mod multibyte-char-to-unibyte next-window nth nthcdr number-to-string
parse-colon-path plist-get plist-member
prefix-numeric-value previous-window prin1-to-string propertize
degrees-to-radians
@@ -1221,9 +1222,19 @@
unibyte-char-to-multibyte upcase user-full-name
user-login-name user-original-login-name custom-variable-p
vconcat
- window-buffer window-dedicated-p window-edges window-height
- window-hscroll window-minibuffer-p window-width
- zerop))
+ window-absolute-pixel-edges window-at window-body-height
+ window-body-width window-buffer window-dedicated-p window-display-table
+ window-combination-limit window-edges window-frame window-fringes
+ window-height window-hscroll window-inside-edges
+ window-inside-absolute-pixel-edges window-inside-pixel-edges
+ window-left-child window-left-column window-margins window-minibuffer-p
+ window-next-buffers window-next-sibling window-new-normal
+ window-new-total window-normal-size window-parameter window-parameters
+ window-parent window-pixel-edges window-point window-prev-buffers
+ window-prev-sibling window-redisplay-end-trigger window-scroll-bars
+ window-start window-text-height window-top-child window-top-line
+ window-total-height window-total-width window-use-time window-vscroll
+ window-width zerop))
(side-effect-and-error-free-fns
'(arrayp atom
bobp bolp bool-vector-p
@@ -1256,7 +1267,8 @@
this-single-command-raw-keys
user-real-login-name user-real-uid user-uid
vector vectorp visible-frame-list
- wholenump window-configuration-p window-live-p windowp)))
+ wholenump window-configuration-p window-live-p
+ window-valid-p windowp)))
(while side-effect-free-fns
(put (car side-effect-free-fns) 'side-effect-free t)
(setq side-effect-free-fns (cdr side-effect-free-fns)))
diff --git a/lisp/emacs-lisp/byte-run.el b/lisp/emacs-lisp/byte-run.el
index 7322c0fbe6f..8f0999b2f80 100644
--- a/lisp/emacs-lisp/byte-run.el
+++ b/lisp/emacs-lisp/byte-run.el
@@ -79,12 +79,17 @@ The return value of this function is not used."
(list 'quote f) (list 'quote arglist) (list 'quote when))))
(list 'obsolete
#'(lambda (f _args new-name when)
- `(make-obsolete ',f ',new-name ,when)))
+ (list 'make-obsolete
+ (list 'quote f) (list 'quote new-name) (list 'quote when))))
(list 'compiler-macro
- #'(lambda (f _args compiler-function)
- (if (not (symbolp compiler-function))
- (error "Only symbols are supported in `compiler-macro'")
- `(put ',f 'compiler-macro #',compiler-function))))
+ #'(lambda (f args compiler-function)
+ ;; FIXME: Make it possible to just reuse `args'.
+ `(eval-and-compile
+ (put ',f 'compiler-macro
+ ,(if (eq (car-safe compiler-function) 'lambda)
+ `(lambda ,(append (cadr compiler-function) args)
+ ,@(cddr compiler-function))
+ `#',compiler-function)))))
(list 'doc-string
#'(lambda (f _args pos)
(list 'put (list 'quote f) ''doc-string-elt (list 'quote pos))))
@@ -374,7 +379,7 @@ obsolete."
(defmacro dont-compile (&rest body)
"Like `progn', but the body always runs interpreted (not compiled).
If you think you need this, you're probably making a mistake somewhere."
- (declare (debug t) (indent 0))
+ (declare (debug t) (indent 0) (obsolete nil "24.4"))
(list 'eval (list 'quote (if (cdr body) (cons 'progn body) (car body)))))
@@ -388,19 +393,19 @@ If you think you need this, you're probably making a mistake somewhere."
Thus, the result of the body appears to the compiler as a quoted constant.
In interpreted code, this is entirely equivalent to `progn'."
(declare (debug t) (indent 0))
- ;; Not necessary because we have it in b-c-initial-macro-environment
- ;; (list 'quote (eval (cons 'progn body)))
- (cons 'progn body))
+ (list 'quote (eval (cons 'progn body) lexical-binding)))
(defmacro eval-and-compile (&rest body)
"Like `progn', but evaluates the body at compile time and at load time."
(declare (debug t) (indent 0))
- ;; Remember, it's magic.
- (cons 'progn body))
+ ;; When the byte-compiler expands code, this macro is not used, so we're
+ ;; either about to run `body' (plain interpretation) or we're doing eager
+ ;; macroexpansion.
+ (list 'quote (eval (cons 'progn body) lexical-binding)))
-(put 'with-no-warnings 'lisp-indent-function 0)
(defun with-no-warnings (&rest body)
"Like `progn', but prevents compiler warnings in the body."
+ (declare (indent 0))
;; The implementation for the interpreter is basically trivial.
(car (last body)))
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index ce3a3324e18..755d5f716d3 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -419,8 +419,8 @@ This list lives partly on the stack.")
(defconst byte-compile-initial-macro-environment
'(
-;; (byte-compiler-options . (lambda (&rest forms)
-;; (apply 'byte-compiler-options-handler forms)))
+ ;; (byte-compiler-options . (lambda (&rest forms)
+ ;; (apply 'byte-compiler-options-handler forms)))
(declare-function . byte-compile-macroexpand-declare-function)
(eval-when-compile . (lambda (&rest body)
(list
@@ -429,8 +429,19 @@ This list lives partly on the stack.")
(byte-compile-top-level
(byte-compile-preprocess (cons 'progn body)))))))
(eval-and-compile . (lambda (&rest body)
- (byte-compile-eval-before-compile (cons 'progn body))
- (cons 'progn body))))
+ ;; Byte compile before running it. Do it piece by
+ ;; piece, in case further expressions need earlier
+ ;; ones to be evaluated already, as is the case in
+ ;; eieio.el.
+ `(progn
+ ,@(mapcar (lambda (exp)
+ (let ((cexp
+ (byte-compile-top-level
+ (byte-compile-preprocess
+ exp))))
+ (eval cexp)
+ cexp))
+ body)))))
"The default macro-environment passed to macroexpand by the compiler.
Placing a macro here will cause a macro to have different semantics when
expanded by the compiler as when expanded by the interpreter.")
@@ -731,9 +742,11 @@ otherwise pop it")
;; Also, this lets us notice references to free variables.
(defmacro byte-compile-push-bytecodes (&rest args)
- "Push BYTE... onto BYTES, and increment PC by the number of bytes pushed.
-ARGS is of the form (BYTE... BYTES PC), where BYTES and PC are variable names.
-BYTES and PC are updated after evaluating all the arguments."
+ "Push bytes onto BVAR, and increment CVAR by the number of bytes pushed.
+BVAR and CVAR are variables which are updated after evaluating
+all the arguments.
+
+\(fn BYTE1 BYTE2 ... BYTEn BVAR CVAR)"
(let ((byte-exprs (butlast args 2))
(bytes-var (car (last args 2)))
(pc-var (car (last args))))
@@ -863,16 +876,7 @@ Each function's symbol gets added to `byte-compile-noruntime-functions'."
(let ((xs (pop hist-new))
old-autoloads)
;; Make sure the file was not already loaded before.
- (unless (or (assoc (car xs) hist-orig)
- ;; Don't give both the "noruntime" and
- ;; "cl-functions" warning for the same function.
- ;; FIXME This seems incorrect - these are two
- ;; independent warnings. For example, you may be
- ;; choosing to see the cl warnings but ignore them.
- ;; You probably don't want to ignore noruntime in the
- ;; same way.
- (and (byte-compile-warning-enabled-p 'cl-functions)
- (byte-compile-cl-file-p (car xs))))
+ (unless (assoc (car xs) hist-orig)
(dolist (s xs)
(cond
((and (consp s) (eq t (car s)))
@@ -1106,8 +1110,7 @@ Each function's symbol gets added to `byte-compile-noruntime-functions'."
(defun byte-compile-log-warning (string &optional fill level)
(let ((warning-prefix-function 'byte-compile-warning-prefix)
(warning-type-format "")
- (warning-fill-prefix (if fill " "))
- (inhibit-read-only t))
+ (warning-fill-prefix (if fill " ")))
(display-warning 'bytecomp string level byte-compile-log-buffer)))
(defun byte-compile-warn (format &rest args)
@@ -1591,7 +1594,9 @@ that already has a `.elc' file."
(setq directories (nconc directories (list source))))
;; It is an ordinary file. Decide whether to compile it.
(if (and (string-match emacs-lisp-file-regexp source)
+ ;; The next 2 tests avoid compiling lock files
(file-readable-p source)
+ (not (string-match "\\`\\.#" file))
(not (auto-save-file-name-p source))
(not (string-equal dir-locals-file
(file-name-nondirectory source))))
@@ -1672,6 +1677,9 @@ If compilation is needed, this functions returns the result of
(load (if (file-exists-p dest) dest filename)))
'no-byte-compile)))
+(defvar byte-compile-level 0 ; bug#13787
+ "Depth of a recursive byte compilation.")
+
;;;###autoload
(defun byte-compile-file (filename &optional load)
"Compile a file of Lisp code named FILENAME into a file of byte code.
@@ -1714,7 +1722,13 @@ The value is non-nil if there were no errors, nil if errors."
(setq target-file (byte-compile-dest-file filename))
(setq byte-compile-dest-file target-file)
(with-current-buffer
- (setq input-buffer (get-buffer-create " *Compiler Input*"))
+ ;; It would be cleaner to use a temp buffer, but if there was
+ ;; an error, we leave this buffer around for diagnostics.
+ ;; Its name is documented in the lispref.
+ (setq input-buffer (get-buffer-create
+ (concat " *Compiler Input*"
+ (if (zerop byte-compile-level) ""
+ (format "-%s" byte-compile-level)))))
(erase-buffer)
(setq buffer-file-coding-system nil)
;; Always compile an Emacs Lisp file as multibyte
@@ -1772,7 +1786,8 @@ The value is non-nil if there were no errors, nil if errors."
;; within byte-compile-from-buffer lingers in that buffer.
(setq output-buffer
(save-current-buffer
- (byte-compile-from-buffer input-buffer)))
+ (let ((byte-compile-level (1+ byte-compile-level)))
+ (byte-compile-from-buffer input-buffer))))
(if byte-compiler-error-flag
nil
(when byte-compile-verbose
@@ -1792,8 +1807,6 @@ The value is non-nil if there were no errors, nil if errors."
(kill-emacs-hook
(cons (lambda () (ignore-errors (delete-file tempfile)))
kill-emacs-hook)))
- (if (memq system-type '(ms-dos 'windows-nt))
- (setq buffer-file-type t))
(write-region (point-min) (point-max) tempfile nil 1)
;; This has the intentional side effect that any
;; hard-links to target-file continue to
@@ -1880,7 +1893,10 @@ With argument ARG, insert value in current buffer after the form."
(byte-compile-close-variables
(with-current-buffer
(setq byte-compile--outbuffer
- (get-buffer-create " *Compiler Output*"))
+ (get-buffer-create
+ (concat " *Compiler Output*"
+ (if (<= byte-compile-level 1) ""
+ (format "-%s" (1- byte-compile-level))))))
(set-buffer-multibyte t)
(erase-buffer)
;; (emacs-lisp-mode)
@@ -1981,11 +1997,7 @@ Call from the source buffer."
;; >4 byte x version %d
(insert
";ELC" 23 "\000\000\000\n"
- ";;; Compiled by "
- (or (and (boundp 'user-mail-address) user-mail-address)
- (concat (user-login-name) "@" (system-name)))
- " on " (current-time-string) "\n"
- ";;; from file " filename "\n"
+ ";;; Compiled\n"
";;; in Emacs version " emacs-version "\n"
";;; with"
(cond
@@ -2201,7 +2213,10 @@ list that represents a doc string reference.
(when (and (consp (nth 1 form))
(eq (car (nth 1 form)) 'quote)
(consp (cdr (nth 1 form)))
- (symbolp (nth 1 (nth 1 form))))
+ (symbolp (nth 1 (nth 1 form)))
+ ;; Don't add it if it's already defined. Otherwise, it might
+ ;; hide the actual definition.
+ (not (fboundp (nth 1 (nth 1 form)))))
(push (cons (nth 1 (nth 1 form))
(cons 'autoload (cdr (cdr form))))
byte-compile-function-environment)
@@ -2506,8 +2521,8 @@ If FORM is a lambda or a macro, byte-compile it as a function."
(when (symbolp form)
(unless (memq (car-safe fun) '(closure lambda))
(error "Don't know how to compile %S" fun))
- (setq fun (byte-compile--reify-function fun))
- (setq lexical-binding (eq (car fun) 'closure)))
+ (setq lexical-binding (eq (car fun) 'closure))
+ (setq fun (byte-compile--reify-function fun)))
(unless (eq (car-safe fun) 'lambda)
(error "Don't know how to compile %S" fun))
;; Expand macros.
@@ -2820,7 +2835,8 @@ for symbols generated by the byte compiler itself."
(setq body (nreverse body))
(setq body (list
(if (and (eq tmp 'funcall)
- (eq (car-safe (car body)) 'quote))
+ (eq (car-safe (car body)) 'quote)
+ (symbolp (nth 1 (car body))))
(cons (nth 1 (car body)) (cdr body))
(cons tmp body))))
(or (eq output-type 'file)
@@ -3701,10 +3717,10 @@ If CONDITION's value is (not (featurep 'emacs)) or (featurep 'xemacs),
that suppresses all warnings during execution of BODY."
(declare (indent 1) (debug t))
`(let* ((fbound-list (byte-compile-find-bound-condition
- ,condition (list 'fboundp)
+ ,condition '(fboundp functionp)
byte-compile-unresolved-functions))
(bound-list (byte-compile-find-bound-condition
- ,condition (list 'boundp 'default-boundp)))
+ ,condition '(boundp default-boundp)))
;; Maybe add to the bound list.
(byte-compile-bound-variables
(append bound-list byte-compile-bound-variables)))
diff --git a/lisp/emacs-lisp/cl-extra.el b/lisp/emacs-lisp/cl-extra.el
index b90df7092ea..34892bf2fef 100644
--- a/lisp/emacs-lisp/cl-extra.el
+++ b/lisp/emacs-lisp/cl-extra.el
@@ -51,7 +51,8 @@ TYPE is a Common Lisp type specifier.
((eq type 'string) (if (stringp x) x (concat x)))
((eq type 'array) (if (arrayp x) x (vconcat x)))
((and (eq type 'character) (stringp x) (= (length x) 1)) (aref x 0))
- ((and (eq type 'character) (symbolp x)) (cl-coerce (symbol-name x) type))
+ ((and (eq type 'character) (symbolp x))
+ (cl-coerce (symbol-name x) type))
((eq type 'float) (float x))
((cl-typep x type) x)
(t (error "Can't coerce %s to type %s" x type))))
@@ -69,7 +70,7 @@ strings case-insensitively."
((stringp x)
(and (stringp y) (= (length x) (length y))
(or (string-equal x y)
- (string-equal (downcase x) (downcase y))))) ; lazy but simple!
+ (string-equal (downcase x) (downcase y))))) ;Lazy but simple!
((numberp x)
(and (numberp y) (= x y)))
((consp x)
@@ -439,14 +440,14 @@ Optional second arg STATE is a random-state object."
If STATE is t, return a new state object seeded from the time of day."
(cond ((null state) (cl-make-random-state cl--random-state))
((vectorp state) (copy-tree state t))
- ((integerp state) (vector 'cl-random-state-tag -1 30 state))
- (t (cl-make-random-state (cl-random-time)))))
+ ((integerp state) (vector 'cl--random-state-tag -1 30 state))
+ (t (cl-make-random-state (cl--random-time)))))
;;;###autoload
(defun cl-random-state-p (object)
"Return t if OBJECT is a random-state object."
(and (vectorp object) (= (length object) 4)
- (eq (aref object 0) 'cl-random-state-tag)))
+ (eq (aref object 0) 'cl--random-state-tag)))
;; Implementation limits.
diff --git a/lisp/emacs-lisp/cl-lib.el b/lisp/emacs-lisp/cl-lib.el
index 226e9607b40..f3bf70b0190 100644
--- a/lisp/emacs-lisp/cl-lib.el
+++ b/lisp/emacs-lisp/cl-lib.el
@@ -93,8 +93,8 @@
(require 'macroexp)
-(defvar cl-optimize-speed 1)
-(defvar cl-optimize-safety 1)
+(defvar cl--optimize-speed 1)
+(defvar cl--optimize-safety 1)
;;;###autoload
(define-obsolete-variable-alias
@@ -242,42 +242,36 @@ one value.
(equal (buffer-name (symbol-value 'byte-compile--outbuffer))
" *Compiler Output*"))))
-(defvar cl-proclaims-deferred nil)
+(defvar cl--proclaims-deferred nil)
(defun cl-proclaim (spec)
"Record a global declaration specified by SPEC."
- (if (fboundp 'cl-do-proclaim) (cl-do-proclaim spec t)
- (push spec cl-proclaims-deferred))
+ (if (fboundp 'cl--do-proclaim) (cl--do-proclaim spec t)
+ (push spec cl--proclaims-deferred))
nil)
(defmacro cl-declaim (&rest specs)
"Like `cl-proclaim', but takes any number of unevaluated, unquoted arguments.
Puts `(cl-eval-when (compile load eval) ...)' around the declarations
so that they are registered at compile-time as well as run-time."
- (let ((body (mapcar (function (lambda (x)
- (list 'cl-proclaim (list 'quote x))))
- specs)))
- (if (cl--compiling-file) (cl-list* 'cl-eval-when '(compile load eval) body)
- (cons 'progn body)))) ; avoid loading cl-macs.el for cl-eval-when
+ (let ((body (mapcar (lambda (x) `(cl-proclaim ',x)) specs)))
+ (if (cl--compiling-file) `(cl-eval-when (compile load eval) ,@body)
+ `(progn ,@body)))) ; Avoid loading cl-macs.el for cl-eval-when.
;;; Symbols.
-(defun cl-random-time ()
+(defun cl--random-time ()
(let* ((time (copy-sequence (current-time-string))) (i (length time)) (v 0))
(while (>= (cl-decf i) 0) (setq v (+ (* v 3) (aref time i))))
v))
-(defvar cl--gensym-counter (* (logand (cl-random-time) 1023) 100))
+(defvar cl--gensym-counter (* (logand (cl--random-time) 1023) 100))
;;; Numbers.
-(defun cl-floatp-safe (object)
- "Return t if OBJECT is a floating point number.
-On Emacs versions that lack floating-point support, this function
-always returns nil."
- (and (numberp object) (not (integerp object))))
+(define-obsolete-function-alias 'cl-floatp-safe 'floatp "24.4")
(defsubst cl-plusp (number)
"Return t if NUMBER is positive."
@@ -295,7 +289,8 @@ always returns nil."
"Return t if INTEGER is even."
(eq (logand integer 1) 0))
-(defvar cl--random-state (vector 'cl-random-state-tag -1 30 (cl-random-time)))
+(defvar cl--random-state
+ (vector 'cl--random-state-tag -1 30 (cl--random-time)))
(defconst cl-most-positive-float nil
"The largest value that a Lisp float can hold.
diff --git a/lisp/emacs-lisp/cl-loaddefs.el b/lisp/emacs-lisp/cl-loaddefs.el
index 4198c0e0063..8ab2abec67e 100644
--- a/lisp/emacs-lisp/cl-loaddefs.el
+++ b/lisp/emacs-lisp/cl-loaddefs.el
@@ -11,7 +11,7 @@
;;;;;; cl--map-overlays cl--map-intervals cl--map-keymap-recursively
;;;;;; cl-notevery cl-notany cl-every cl-some cl-mapcon cl-mapcan
;;;;;; cl-mapl cl-mapc cl-maplist cl-map cl--mapcar-many cl-equalp
-;;;;;; cl-coerce) "cl-extra" "cl-extra.el" "6c7926a10c377679687a2ab6a4d1c186")
+;;;;;; cl-coerce) "cl-extra" "cl-extra.el" "c5730f2a706cb1efc5fec0a790d3ca72")
;;; Generated autoloads from cl-extra.el
(autoload 'cl-coerce "cl-extra" "\
@@ -224,7 +224,7 @@ Return the value of SYMBOL's PROPNAME property, or DEFAULT if none.
\(fn SYMBOL PROPNAME &optional DEFAULT)" nil nil)
-(put 'cl-get 'compiler-macro #'cl--compiler-macro-get)
+(eval-and-compile (put 'cl-get 'compiler-macro #'cl--compiler-macro-get))
(autoload 'cl-getf "cl-extra" "\
Search PROPLIST for property PROPNAME; return its value or DEFAULT.
@@ -262,12 +262,12 @@ including `cl-block' and `cl-eval-when'.
;;;;;; cl-rotatef cl-shiftf cl-remf cl-psetf cl-declare cl-the cl-locally
;;;;;; cl-multiple-value-setq cl-multiple-value-bind cl-symbol-macrolet
;;;;;; cl-macrolet cl-labels cl-flet* cl-flet cl-progv cl-psetq
-;;;;;; cl-do-all-symbols cl-do-symbols cl-dotimes cl-dolist cl-do*
-;;;;;; cl-do cl-loop cl-return-from cl-return cl-block cl-etypecase
+;;;;;; cl-do-all-symbols cl-do-symbols cl-tagbody cl-dotimes cl-dolist
+;;;;;; cl-do* cl-do cl-loop cl-return-from cl-return cl-block cl-etypecase
;;;;;; cl-typecase cl-ecase cl-case cl-load-time-value cl-eval-when
;;;;;; cl-destructuring-bind cl-function cl-defmacro cl-defun cl-gentemp
;;;;;; cl-gensym cl--compiler-macro-cXXr cl--compiler-macro-list*)
-;;;;;; "cl-macs" "cl-macs.el" "ad8afd35d8d75f5f22e7547b02bac556")
+;;;;;; "cl-macs" "cl-macs.el" "8a90c81a400a2846e7b4c3da07626d94")
;;; Generated autoloads from cl-macs.el
(autoload 'cl--compiler-macro-list* "cl-macs" "\
@@ -465,6 +465,19 @@ nil.
(put 'cl-dotimes 'lisp-indent-function '1)
+(autoload 'cl-tagbody "cl-macs" "\
+Execute statements while providing for control transfers to labels.
+Each element of LABELS-OR-STMTS can be either a label (integer or symbol)
+or a `cons' cell, in which case it's taken to be a statement.
+This distinction is made before performing macroexpansion.
+Statements are executed in sequence left to right, discarding any return value,
+stopping only when reaching the end of LABELS-OR-STMTS.
+Any statement can transfer control at any time to the statements that follow
+one of the labels with the special form (go LABEL).
+Labels have lexical scope and dynamic extent.
+
+\(fn &rest LABELS-OR-STMTS)" nil t)
+
(autoload 'cl-do-symbols "cl-macs" "\
Loop over all symbols.
Evaluate BODY with VAR bound to each interned symbol, or to each symbol
@@ -759,7 +772,7 @@ surrounded by (cl-block NAME ...).
;;;;;; cl-nsubstitute-if cl-nsubstitute cl-substitute-if-not cl-substitute-if
;;;;;; cl-substitute cl-delete-duplicates cl-remove-duplicates cl-delete-if-not
;;;;;; cl-delete-if cl-delete cl-remove-if-not cl-remove-if cl-remove
-;;;;;; cl-replace cl-fill cl-reduce) "cl-seq" "cl-seq.el" "5ce2761d9a21845a7f6a2da0e4543844")
+;;;;;; cl-replace cl-fill cl-reduce) "cl-seq" "cl-seq.el" "51a70dea9cbc225165a50135956609aa")
;;; Generated autoloads from cl-seq.el
(autoload 'cl-reduce "cl-seq" "\
@@ -1020,7 +1033,7 @@ Keywords supported: :test :test-not :key
\(fn ITEM LIST [KEYWORD VALUE]...)" nil nil)
-(put 'cl-member 'compiler-macro #'cl--compiler-macro-member)
+(eval-and-compile (put 'cl-member 'compiler-macro #'cl--compiler-macro-member))
(autoload 'cl-member-if "cl-seq" "\
Find the first item satisfying PREDICATE in LIST.
@@ -1050,7 +1063,7 @@ Keywords supported: :test :test-not :key
\(fn ITEM LIST [KEYWORD VALUE]...)" nil nil)
-(put 'cl-assoc 'compiler-macro #'cl--compiler-macro-assoc)
+(eval-and-compile (put 'cl-assoc 'compiler-macro #'cl--compiler-macro-assoc))
(autoload 'cl-assoc-if "cl-seq" "\
Find the first item whose car satisfies PREDICATE in LIST.
diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
index ab474ebb0db..e9cc200baaa 100644
--- a/lisp/emacs-lisp/cl-macs.el
+++ b/lisp/emacs-lisp/cl-macs.el
@@ -48,13 +48,13 @@
;; `gv' is required here because cl-macs can be loaded before loaddefs.el.
(require 'gv)
-(defmacro cl-pop2 (place)
+(defmacro cl--pop2 (place)
(declare (debug edebug-sexps))
`(prog1 (car (cdr ,place))
(setq ,place (cdr (cdr ,place)))))
-(defvar cl-optimize-safety)
-(defvar cl-optimize-speed)
+(defvar cl--optimize-safety)
+(defvar cl--optimize-speed)
;;; Initialization.
@@ -265,9 +265,11 @@ FORM is of the form (ARGS . BODY)."
(require 'help-fns)
(cons (help-add-fundoc-usage
(if (stringp (car hdr)) (pop hdr))
- (format "%S"
- (cons 'fn
- (cl--make-usage-args orig-args))))
+ ;; Be careful with make-symbol and (back)quote,
+ ;; see bug#12884.
+ (let ((print-gensym nil) (print-quoted t))
+ (format "%S" (cons 'fn (cl--make-usage-args
+ orig-args)))))
hdr)))
(list `(let* ,cl--bind-lets
,@(nreverse cl--bind-forms)
@@ -429,7 +431,7 @@ its argument list allows full Common Lisp conventions."
(if (memq '&environment args) (error "&environment used incorrectly"))
(let ((save-args args)
(restarg (memq '&rest args))
- (safety (if (cl--compiling-file) cl-optimize-safety 3))
+ (safety (if (cl--compiling-file) cl--optimize-safety 3))
(keys nil)
(laterarg nil) (exactarg nil) minarg)
(or num (setq num 0))
@@ -438,7 +440,7 @@ its argument list allows full Common Lisp conventions."
(setq restarg (cadr restarg)))
(push (list restarg expr) cl--bind-lets)
(if (eq (car args) '&whole)
- (push (list (cl-pop2 args) restarg) cl--bind-lets))
+ (push (list (cl--pop2 args) restarg) cl--bind-lets))
(let ((p args))
(setq minarg restarg)
(while (and p (not (memq (car p) cl--lambda-list-keywords)))
@@ -474,7 +476,7 @@ its argument list allows full Common Lisp conventions."
(if def `(if ,restarg ,poparg ,def) poparg))
(setq num (1+ num))))))
(if (eq (car args) '&rest)
- (let ((arg (cl-pop2 args)))
+ (let ((arg (cl--pop2 args)))
(if (consp arg) (cl--do-arglist arg restarg)))
(or (eq (car args) '&key) (= safety 0) exactarg
(push `(if ,restarg
@@ -572,7 +574,7 @@ its argument list allows full Common Lisp conventions."
;;; The `cl-eval-when' form.
-(defvar cl-not-toplevel nil)
+(defvar cl--not-toplevel nil)
;;;###autoload
(defmacro cl-eval-when (when &rest body)
@@ -584,9 +586,9 @@ If `eval' is in WHEN, BODY is evaluated when interpreted or at non-top-level.
\(fn (WHEN...) BODY...)"
(declare (indent 1) (debug ((&rest &or "compile" "load" "eval") body)))
(if (and (fboundp 'cl--compiling-file) (cl--compiling-file)
- (not cl-not-toplevel) (not (boundp 'for-effect))) ; horrible kludge
+ (not cl--not-toplevel) (not (boundp 'for-effect))) ;Horrible kludge.
(let ((comp (or (memq 'compile when) (memq :compile-toplevel when)))
- (cl-not-toplevel t))
+ (cl--not-toplevel t))
(if (or (memq 'load when) (memq :load-toplevel when))
(if comp (cons 'progn (mapcar 'cl--compile-time-too body))
`(if nil nil ,@body))
@@ -757,7 +759,8 @@ This is compatible with Common Lisp, but note that `defun' and
(defvar cl--loop-first-flag)
(defvar cl--loop-initially) (defvar cl--loop-map-form) (defvar cl--loop-name)
(defvar cl--loop-result) (defvar cl--loop-result-explicit)
-(defvar cl--loop-result-var) (defvar cl--loop-steps) (defvar cl--loop-symbol-macs)
+(defvar cl--loop-result-var) (defvar cl--loop-steps)
+(defvar cl--loop-symbol-macs)
;;;###autoload
(defmacro cl-loop (&rest loop-args)
@@ -790,7 +793,8 @@ Valid clauses are:
"return"] form]
;; Simple default, which covers 99% of the cases.
symbolp form)))
- (if (not (memq t (mapcar 'symbolp (delq nil (delq t (cl-copy-list loop-args))))))
+ (if (not (memq t (mapcar #'symbolp
+ (delq nil (delq t (cl-copy-list loop-args))))))
`(cl-block nil (while t ,@loop-args))
(let ((cl--loop-args loop-args) (cl--loop-name nil) (cl--loop-bindings nil)
(cl--loop-body nil) (cl--loop-steps nil)
@@ -801,14 +805,16 @@ Valid clauses are:
(cl--loop-map-form nil) (cl--loop-first-flag nil)
(cl--loop-destr-temps nil) (cl--loop-symbol-macs nil))
(setq cl--loop-args (append cl--loop-args '(cl-end-loop)))
- (while (not (eq (car cl--loop-args) 'cl-end-loop)) (cl-parse-loop-clause))
+ (while (not (eq (car cl--loop-args) 'cl-end-loop))
+ (cl--parse-loop-clause))
(if cl--loop-finish-flag
(push `((,cl--loop-finish-flag t)) cl--loop-bindings))
(if cl--loop-first-flag
(progn (push `((,cl--loop-first-flag t)) cl--loop-bindings)
(push `(setq ,cl--loop-first-flag nil) cl--loop-steps)))
(let* ((epilogue (nconc (nreverse cl--loop-finally)
- (list (or cl--loop-result-explicit cl--loop-result))))
+ (list (or cl--loop-result-explicit
+ cl--loop-result))))
(ands (cl--loop-build-ands (nreverse cl--loop-body)))
(while-body (nconc (cadr ands) (nreverse cl--loop-steps)))
(body (append
@@ -828,7 +834,8 @@ Valid clauses are:
`((if ,cl--loop-finish-flag
(progn ,@epilogue) ,cl--loop-result-var)))
epilogue))))
- (if cl--loop-result-var (push (list cl--loop-result-var) cl--loop-bindings))
+ (if cl--loop-result-var
+ (push (list cl--loop-result-var) cl--loop-bindings))
(while cl--loop-bindings
(if (cdar cl--loop-bindings)
(setq body (list (cl--loop-let (pop cl--loop-bindings) body t)))
@@ -838,7 +845,8 @@ Valid clauses are:
(push (car (pop cl--loop-bindings)) lets))
(setq body (list (cl--loop-let lets body nil))))))
(if cl--loop-symbol-macs
- (setq body (list `(cl-symbol-macrolet ,cl--loop-symbol-macs ,@body))))
+ (setq body
+ (list `(cl-symbol-macrolet ,cl--loop-symbol-macs ,@body))))
`(cl-block ,cl--loop-name ,@body)))))
;; Below is a complete spec for cl-loop, in several parts that correspond
@@ -993,7 +1001,7 @@ Valid clauses are:
-(defun cl-parse-loop-clause () ; uses loop-*
+(defun cl--parse-loop-clause () ; uses loop-*
(let ((word (pop cl--loop-args))
(hash-types '(hash-key hash-keys hash-value hash-values))
(key-types '(key-code key-codes key-seq key-seqs
@@ -1008,17 +1016,21 @@ Valid clauses are:
((eq word 'initially)
(if (memq (car cl--loop-args) '(do doing)) (pop cl--loop-args))
- (or (consp (car cl--loop-args)) (error "Syntax error on `initially' clause"))
+ (or (consp (car cl--loop-args))
+ (error "Syntax error on `initially' clause"))
(while (consp (car cl--loop-args))
(push (pop cl--loop-args) cl--loop-initially)))
((eq word 'finally)
(if (eq (car cl--loop-args) 'return)
- (setq cl--loop-result-explicit (or (cl-pop2 cl--loop-args) '(quote nil)))
+ (setq cl--loop-result-explicit
+ (or (cl--pop2 cl--loop-args) '(quote nil)))
(if (memq (car cl--loop-args) '(do doing)) (pop cl--loop-args))
- (or (consp (car cl--loop-args)) (error "Syntax error on `finally' clause"))
+ (or (consp (car cl--loop-args))
+ (error "Syntax error on `finally' clause"))
(if (and (eq (caar cl--loop-args) 'return) (null cl--loop-name))
- (setq cl--loop-result-explicit (or (nth 1 (pop cl--loop-args)) '(quote nil)))
+ (setq cl--loop-result-explicit
+ (or (nth 1 (pop cl--loop-args)) '(quote nil)))
(while (consp (car cl--loop-args))
(push (pop cl--loop-args) cl--loop-finally)))))
@@ -1034,7 +1046,8 @@ Valid clauses are:
(if (eq word 'being) (setq word (pop cl--loop-args)))
(if (memq word '(the each)) (setq word (pop cl--loop-args)))
(if (memq word '(buffer buffers))
- (setq word 'in cl--loop-args (cons '(buffer-list) cl--loop-args)))
+ (setq word 'in
+ cl--loop-args (cons '(buffer-list) cl--loop-args)))
(cond
((memq word '(from downfrom upfrom to downto upto
@@ -1043,15 +1056,19 @@ Valid clauses are:
(if (memq (car cl--loop-args) '(downto above))
(error "Must specify `from' value for downward cl-loop"))
(let* ((down (or (eq (car cl--loop-args) 'downfrom)
- (memq (cl-caddr cl--loop-args) '(downto above))))
+ (memq (cl-caddr cl--loop-args)
+ '(downto above))))
(excl (or (memq (car cl--loop-args) '(above below))
- (memq (cl-caddr cl--loop-args) '(above below))))
- (start (and (memq (car cl--loop-args) '(from upfrom downfrom))
- (cl-pop2 cl--loop-args)))
+ (memq (cl-caddr cl--loop-args)
+ '(above below))))
+ (start (and (memq (car cl--loop-args)
+ '(from upfrom downfrom))
+ (cl--pop2 cl--loop-args)))
(end (and (memq (car cl--loop-args)
'(to upto downto above below))
- (cl-pop2 cl--loop-args)))
- (step (and (eq (car cl--loop-args) 'by) (cl-pop2 cl--loop-args)))
+ (cl--pop2 cl--loop-args)))
+ (step (and (eq (car cl--loop-args) 'by)
+ (cl--pop2 cl--loop-args)))
(end-var (and (not (macroexp-const-p end))
(make-symbol "--cl-var--")))
(step-var (and (not (macroexp-const-p step))
@@ -1085,7 +1102,7 @@ Valid clauses are:
loop-for-sets))))
(push (list temp
(if (eq (car cl--loop-args) 'by)
- (let ((step (cl-pop2 cl--loop-args)))
+ (let ((step (cl--pop2 cl--loop-args)))
(if (and (memq (car-safe step)
'(quote function
cl-function))
@@ -1097,7 +1114,8 @@ Valid clauses are:
((eq word '=)
(let* ((start (pop cl--loop-args))
- (then (if (eq (car cl--loop-args) 'then) (cl-pop2 cl--loop-args) start)))
+ (then (if (eq (car cl--loop-args) 'then)
+ (cl--pop2 cl--loop-args) start)))
(push (list var nil) loop-for-bindings)
(if (or ands (eq (car cl--loop-args) 'and))
(progn
@@ -1134,14 +1152,15 @@ Valid clauses are:
(let ((ref (or (memq (car cl--loop-args) '(in-ref of-ref))
(and (not (memq (car cl--loop-args) '(in of)))
(error "Expected `of'"))))
- (seq (cl-pop2 cl--loop-args))
+ (seq (cl--pop2 cl--loop-args))
(temp-seq (make-symbol "--cl-seq--"))
- (temp-idx (if (eq (car cl--loop-args) 'using)
- (if (and (= (length (cadr cl--loop-args)) 2)
- (eq (cl-caadr cl--loop-args) 'index))
- (cadr (cl-pop2 cl--loop-args))
- (error "Bad `using' clause"))
- (make-symbol "--cl-idx--"))))
+ (temp-idx
+ (if (eq (car cl--loop-args) 'using)
+ (if (and (= (length (cadr cl--loop-args)) 2)
+ (eq (cl-caadr cl--loop-args) 'index))
+ (cadr (cl--pop2 cl--loop-args))
+ (error "Bad `using' clause"))
+ (make-symbol "--cl-idx--"))))
(push (list temp-seq seq) loop-for-bindings)
(push (list temp-idx 0) loop-for-bindings)
(if ref
@@ -1164,15 +1183,17 @@ Valid clauses are:
loop-for-steps)))
((memq word hash-types)
- (or (memq (car cl--loop-args) '(in of)) (error "Expected `of'"))
- (let* ((table (cl-pop2 cl--loop-args))
- (other (if (eq (car cl--loop-args) 'using)
- (if (and (= (length (cadr cl--loop-args)) 2)
- (memq (cl-caadr cl--loop-args) hash-types)
- (not (eq (cl-caadr cl--loop-args) word)))
- (cadr (cl-pop2 cl--loop-args))
- (error "Bad `using' clause"))
- (make-symbol "--cl-var--"))))
+ (or (memq (car cl--loop-args) '(in of))
+ (error "Expected `of'"))
+ (let* ((table (cl--pop2 cl--loop-args))
+ (other
+ (if (eq (car cl--loop-args) 'using)
+ (if (and (= (length (cadr cl--loop-args)) 2)
+ (memq (cl-caadr cl--loop-args) hash-types)
+ (not (eq (cl-caadr cl--loop-args) word)))
+ (cadr (cl--pop2 cl--loop-args))
+ (error "Bad `using' clause"))
+ (make-symbol "--cl-var--"))))
(if (memq word '(hash-value hash-values))
(setq var (prog1 other (setq other var))))
(setq cl--loop-map-form
@@ -1180,16 +1201,19 @@ Valid clauses are:
((memq word '(symbol present-symbol external-symbol
symbols present-symbols external-symbols))
- (let ((ob (and (memq (car cl--loop-args) '(in of)) (cl-pop2 cl--loop-args))))
+ (let ((ob (and (memq (car cl--loop-args) '(in of))
+ (cl--pop2 cl--loop-args))))
(setq cl--loop-map-form
`(mapatoms (lambda (,var) . --cl-map) ,ob))))
((memq word '(overlay overlays extent extents))
(let ((buf nil) (from nil) (to nil))
(while (memq (car cl--loop-args) '(in of from to))
- (cond ((eq (car cl--loop-args) 'from) (setq from (cl-pop2 cl--loop-args)))
- ((eq (car cl--loop-args) 'to) (setq to (cl-pop2 cl--loop-args)))
- (t (setq buf (cl-pop2 cl--loop-args)))))
+ (cond ((eq (car cl--loop-args) 'from)
+ (setq from (cl--pop2 cl--loop-args)))
+ ((eq (car cl--loop-args) 'to)
+ (setq to (cl--pop2 cl--loop-args)))
+ (t (setq buf (cl--pop2 cl--loop-args)))))
(setq cl--loop-map-form
`(cl--map-overlays
(lambda (,var ,(make-symbol "--cl-var--"))
@@ -1201,11 +1225,13 @@ Valid clauses are:
(var1 (make-symbol "--cl-var1--"))
(var2 (make-symbol "--cl-var2--")))
(while (memq (car cl--loop-args) '(in of property from to))
- (cond ((eq (car cl--loop-args) 'from) (setq from (cl-pop2 cl--loop-args)))
- ((eq (car cl--loop-args) 'to) (setq to (cl-pop2 cl--loop-args)))
+ (cond ((eq (car cl--loop-args) 'from)
+ (setq from (cl--pop2 cl--loop-args)))
+ ((eq (car cl--loop-args) 'to)
+ (setq to (cl--pop2 cl--loop-args)))
((eq (car cl--loop-args) 'property)
- (setq prop (cl-pop2 cl--loop-args)))
- (t (setq buf (cl-pop2 cl--loop-args)))))
+ (setq prop (cl--pop2 cl--loop-args)))
+ (t (setq buf (cl--pop2 cl--loop-args)))))
(if (and (consp var) (symbolp (car var)) (symbolp (cdr var)))
(setq var1 (car var) var2 (cdr var))
(push (list var `(cons ,var1 ,var2)) loop-for-sets))
@@ -1215,15 +1241,17 @@ Valid clauses are:
,buf ,prop ,from ,to))))
((memq word key-types)
- (or (memq (car cl--loop-args) '(in of)) (error "Expected `of'"))
- (let ((cl-map (cl-pop2 cl--loop-args))
- (other (if (eq (car cl--loop-args) 'using)
- (if (and (= (length (cadr cl--loop-args)) 2)
- (memq (cl-caadr cl--loop-args) key-types)
- (not (eq (cl-caadr cl--loop-args) word)))
- (cadr (cl-pop2 cl--loop-args))
- (error "Bad `using' clause"))
- (make-symbol "--cl-var--"))))
+ (or (memq (car cl--loop-args) '(in of))
+ (error "Expected `of'"))
+ (let ((cl-map (cl--pop2 cl--loop-args))
+ (other
+ (if (eq (car cl--loop-args) 'using)
+ (if (and (= (length (cadr cl--loop-args)) 2)
+ (memq (cl-caadr cl--loop-args) key-types)
+ (not (eq (cl-caadr cl--loop-args) word)))
+ (cadr (cl--pop2 cl--loop-args))
+ (error "Bad `using' clause"))
+ (make-symbol "--cl-var--"))))
(if (memq word '(key-binding key-bindings))
(setq var (prog1 other (setq other var))))
(setq cl--loop-map-form
@@ -1243,7 +1271,8 @@ Valid clauses are:
loop-for-steps)))
((memq word '(window windows))
- (let ((scr (and (memq (car cl--loop-args) '(in of)) (cl-pop2 cl--loop-args)))
+ (let ((scr (and (memq (car cl--loop-args) '(in of))
+ (cl--pop2 cl--loop-args)))
(temp (make-symbol "--cl-var--"))
(minip (make-symbol "--cl-minip--")))
(push (list var (if scr
@@ -1338,7 +1367,8 @@ Valid clauses are:
((memq word '(minimize minimizing maximize maximizing))
(let* ((what (pop cl--loop-args))
- (temp (if (cl--simple-expr-p what) what (make-symbol "--cl-var--")))
+ (temp (if (cl--simple-expr-p what) what
+ (make-symbol "--cl-var--")))
(var (cl--loop-handle-accum nil))
(func (intern (substring (symbol-name word) 0 3)))
(set `(setq ,var (if ,var (,func ,var ,temp) ,temp))))
@@ -1349,7 +1379,8 @@ Valid clauses are:
((eq word 'with)
(let ((bindings nil))
(while (progn (push (list (pop cl--loop-args)
- (and (eq (car cl--loop-args) '=) (cl-pop2 cl--loop-args)))
+ (and (eq (car cl--loop-args) '=)
+ (cl--pop2 cl--loop-args)))
bindings)
(eq (car cl--loop-args) 'and))
(pop cl--loop-args))
@@ -1362,19 +1393,23 @@ Valid clauses are:
(push `(not ,(pop cl--loop-args)) cl--loop-body))
((eq word 'always)
- (or cl--loop-finish-flag (setq cl--loop-finish-flag (make-symbol "--cl-flag--")))
+ (or cl--loop-finish-flag
+ (setq cl--loop-finish-flag (make-symbol "--cl-flag--")))
(push `(setq ,cl--loop-finish-flag ,(pop cl--loop-args)) cl--loop-body)
(setq cl--loop-result t))
((eq word 'never)
- (or cl--loop-finish-flag (setq cl--loop-finish-flag (make-symbol "--cl-flag--")))
+ (or cl--loop-finish-flag
+ (setq cl--loop-finish-flag (make-symbol "--cl-flag--")))
(push `(setq ,cl--loop-finish-flag (not ,(pop cl--loop-args)))
cl--loop-body)
(setq cl--loop-result t))
((eq word 'thereis)
- (or cl--loop-finish-flag (setq cl--loop-finish-flag (make-symbol "--cl-flag--")))
- (or cl--loop-result-var (setq cl--loop-result-var (make-symbol "--cl-var--")))
+ (or cl--loop-finish-flag
+ (setq cl--loop-finish-flag (make-symbol "--cl-flag--")))
+ (or cl--loop-result-var
+ (setq cl--loop-result-var (make-symbol "--cl-var--")))
(push `(setq ,cl--loop-finish-flag
(not (setq ,cl--loop-result-var ,(pop cl--loop-args))))
cl--loop-body))
@@ -1382,11 +1417,11 @@ Valid clauses are:
((memq word '(if when unless))
(let* ((cond (pop cl--loop-args))
(then (let ((cl--loop-body nil))
- (cl-parse-loop-clause)
+ (cl--parse-loop-clause)
(cl--loop-build-ands (nreverse cl--loop-body))))
(else (let ((cl--loop-body nil))
(if (eq (car cl--loop-args) 'else)
- (progn (pop cl--loop-args) (cl-parse-loop-clause)))
+ (progn (pop cl--loop-args) (cl--parse-loop-clause)))
(cl--loop-build-ands (nreverse cl--loop-body))))
(simple (and (eq (car then) t) (eq (car else) t))))
(if (eq (car cl--loop-args) 'end) (pop cl--loop-args))
@@ -1408,8 +1443,10 @@ Valid clauses are:
(push (cons 'progn (nreverse (cons t body))) cl--loop-body)))
((eq word 'return)
- (or cl--loop-finish-flag (setq cl--loop-finish-flag (make-symbol "--cl-var--")))
- (or cl--loop-result-var (setq cl--loop-result-var (make-symbol "--cl-var--")))
+ (or cl--loop-finish-flag
+ (setq cl--loop-finish-flag (make-symbol "--cl-var--")))
+ (or cl--loop-result-var
+ (setq cl--loop-result-var (make-symbol "--cl-var--")))
(push `(setq ,cl--loop-result-var ,(pop cl--loop-args)
,cl--loop-finish-flag nil) cl--loop-body))
@@ -1419,7 +1456,7 @@ Valid clauses are:
(or handler (error "Expected a cl-loop keyword, found %s" word))
(funcall handler))))
(if (eq (car cl--loop-args) 'and)
- (progn (pop cl--loop-args) (cl-parse-loop-clause)))))
+ (progn (pop cl--loop-args) (cl--parse-loop-clause)))))
(defun cl--loop-let (specs body par) ; uses loop-*
(let ((p specs) (temps nil) (new nil))
@@ -1438,10 +1475,12 @@ Valid clauses are:
(if (and (consp (car specs)) (listp (caar specs)))
(let* ((spec (caar specs)) (nspecs nil)
(expr (cadr (pop specs)))
- (temp (cdr (or (assq spec cl--loop-destr-temps)
- (car (push (cons spec (or (last spec 0)
- (make-symbol "--cl-var--")))
- cl--loop-destr-temps))))))
+ (temp
+ (cdr (or (assq spec cl--loop-destr-temps)
+ (car (push (cons spec
+ (or (last spec 0)
+ (make-symbol "--cl-var--")))
+ cl--loop-destr-temps))))))
(push (list temp expr) new)
(while (consp spec)
(push (list (pop spec)
@@ -1450,24 +1489,27 @@ Valid clauses are:
(setq specs (nconc (nreverse nspecs) specs)))
(push (pop specs) new)))
(if (eq body 'setq)
- (let ((set (cons (if par 'cl-psetq 'setq) (apply 'nconc (nreverse new)))))
+ (let ((set (cons (if par 'cl-psetq 'setq)
+ (apply 'nconc (nreverse new)))))
(if temps `(let* ,(nreverse temps) ,set) set))
`(,(if par 'let 'let*)
,(nconc (nreverse temps) (nreverse new)) ,@body))))
-(defun cl--loop-handle-accum (def &optional func) ; uses loop-*
+(defun cl--loop-handle-accum (def &optional func) ; uses loop-*
(if (eq (car cl--loop-args) 'into)
- (let ((var (cl-pop2 cl--loop-args)))
+ (let ((var (cl--pop2 cl--loop-args)))
(or (memq var cl--loop-accum-vars)
(progn (push (list (list var def)) cl--loop-bindings)
(push var cl--loop-accum-vars)))
var)
(or cl--loop-accum-var
(progn
- (push (list (list (setq cl--loop-accum-var (make-symbol "--cl-var--")) def))
- cl--loop-bindings)
+ (push (list (list
+ (setq cl--loop-accum-var (make-symbol "--cl-var--"))
+ def))
+ cl--loop-bindings)
(setq cl--loop-result (if func (list func cl--loop-accum-var)
- cl--loop-accum-var))
+ cl--loop-accum-var))
cl--loop-accum-var))))
(defun cl--loop-build-ands (clauses)
@@ -1514,7 +1556,7 @@ such that COMBO is equivalent to (and . CLAUSES)."
((&rest &or symbolp (symbolp &optional form form))
(form body)
cl-declarations body)))
- (cl-expand-do-loop steps endtest body nil))
+ (cl--expand-do-loop steps endtest body nil))
;;;###autoload
(defmacro cl-do* (steps endtest &rest body)
@@ -1522,9 +1564,9 @@ such that COMBO is equivalent to (and . CLAUSES)."
\(fn ((VAR INIT [STEP])...) (END-TEST [RESULT...]) BODY...)"
(declare (indent 2) (debug cl-do))
- (cl-expand-do-loop steps endtest body t))
+ (cl--expand-do-loop steps endtest body t))
-(defun cl-expand-do-loop (steps endtest body star)
+(defun cl--expand-do-loop (steps endtest body star)
`(cl-block nil
(,(if star 'let* 'let)
,(mapcar (lambda (c) (if (consp c) (list (car c) (nth 1 c)) c))
@@ -1552,9 +1594,9 @@ An implicit nil block is established around the loop.
\(fn (VAR LIST [RESULT]) BODY...)"
(declare (debug ((symbolp form &optional form) cl-declarations body))
(indent 1))
- `(cl-block nil
- (,(if (eq 'cl-dolist (symbol-function 'dolist)) 'cl--dolist 'dolist)
- ,spec ,@body)))
+ (let ((loop `(dolist ,spec ,@body)))
+ (if (advice-member-p #'cl--wrap-in-nil-block 'dolist)
+ loop `(cl-block nil ,loop))))
;;;###autoload
(defmacro cl-dotimes (spec &rest body)
@@ -1565,9 +1607,55 @@ nil.
\(fn (VAR COUNT [RESULT]) BODY...)"
(declare (debug cl-dolist) (indent 1))
- `(cl-block nil
- (,(if (eq 'cl-dotimes (symbol-function 'dotimes)) 'cl--dotimes 'dotimes)
- ,spec ,@body)))
+ (let ((loop `(dotimes ,spec ,@body)))
+ (if (advice-member-p #'cl--wrap-in-nil-block 'dotimes)
+ loop `(cl-block nil ,loop))))
+
+(defvar cl--tagbody-alist nil)
+
+;;;###autoload
+(defmacro cl-tagbody (&rest labels-or-stmts)
+ "Execute statements while providing for control transfers to labels.
+Each element of LABELS-OR-STMTS can be either a label (integer or symbol)
+or a `cons' cell, in which case it's taken to be a statement.
+This distinction is made before performing macroexpansion.
+Statements are executed in sequence left to right, discarding any return value,
+stopping only when reaching the end of LABELS-OR-STMTS.
+Any statement can transfer control at any time to the statements that follow
+one of the labels with the special form (go LABEL).
+Labels have lexical scope and dynamic extent."
+ (let ((blocks '())
+ (first-label (if (consp (car labels-or-stmts))
+ 'cl--preamble (pop labels-or-stmts))))
+ (let ((block (list first-label)))
+ (dolist (label-or-stmt labels-or-stmts)
+ (if (consp label-or-stmt) (push label-or-stmt block)
+ ;; Add a "go to next block" to implement the fallthrough.
+ (unless (eq 'go (car-safe (car-safe block)))
+ (push `(go ,label-or-stmt) block))
+ (push (nreverse block) blocks)
+ (setq block (list label-or-stmt))))
+ (unless (eq 'go (car-safe (car-safe block)))
+ (push `(go cl--exit) block))
+ (push (nreverse block) blocks))
+ (let ((catch-tag (make-symbol "cl--tagbody-tag")))
+ (push (cons 'cl--exit catch-tag) cl--tagbody-alist)
+ (dolist (block blocks)
+ (push (cons (car block) catch-tag) cl--tagbody-alist))
+ (macroexpand-all
+ `(let ((next-label ',first-label))
+ (while
+ (not (eq (setq next-label
+ (catch ',catch-tag
+ (cl-case next-label
+ ,@blocks)))
+ 'cl--exit))))
+ `((go . ,(lambda (label)
+ (let ((catch-tag (cdr (assq label cl--tagbody-alist))))
+ (unless catch-tag
+ (error "Unknown cl-tagbody go label `%S'" label))
+ `(throw ',catch-tag ',label))))
+ ,@macroexpand-all-environment)))))
;;;###autoload
(defmacro cl-do-symbols (spec &rest body)
@@ -1618,19 +1706,18 @@ second list (or to nil if VALUES is shorter than SYMBOLS); then the
BODY forms are executed and their result is returned. This is much like
a `let' form, except that the list of symbols can be computed at run-time."
(declare (indent 2) (debug (form form body)))
- (let ((bodyfun (make-symbol "cl--progv-body"))
+ (let ((bodyfun (make-symbol "body"))
(binds (make-symbol "binds"))
(syms (make-symbol "syms"))
(vals (make-symbol "vals")))
`(progn
- (defvar ,bodyfun)
(let* ((,syms ,symbols)
(,vals ,values)
(,bodyfun (lambda () ,@body))
(,binds ()))
(while ,syms
(push (list (pop ,syms) (list 'quote (pop ,vals))) ,binds))
- (eval (list 'let ,binds '(funcall ,bodyfun)))))))
+ (eval (list 'let ,binds (list 'funcall (list 'quote ,bodyfun))))))))
(defvar cl--labels-convert-cache nil)
@@ -1901,11 +1988,11 @@ values. For compatibility, (cl-values A B C) is a synonym for (list A B C).
(declare (indent 1) (debug (cl-type-spec form)))
form)
-(defvar cl-proclaim-history t) ; for future compilers
-(defvar cl-declare-stack t) ; for future compilers
+(defvar cl--proclaim-history t) ; for future compilers
+(defvar cl--declare-stack t) ; for future compilers
-(defun cl-do-proclaim (spec hist)
- (and hist (listp cl-proclaim-history) (push spec cl-proclaim-history))
+(defun cl--do-proclaim (spec hist)
+ (and hist (listp cl--proclaim-history) (push spec cl--proclaim-history))
(cond ((eq (car-safe spec) 'special)
(if (boundp 'byte-compile-bound-variables)
(setq byte-compile-bound-variables
@@ -1930,9 +2017,9 @@ values. For compatibility, (cl-values A B C) is a synonym for (list A B C).
'((0 nil) (1 t) (2 t) (3 t))))
(safety (assq (nth 1 (assq 'safety (cdr spec)))
'((0 t) (1 t) (2 t) (3 nil)))))
- (if speed (setq cl-optimize-speed (car speed)
+ (if speed (setq cl--optimize-speed (car speed)
byte-optimize (nth 1 speed)))
- (if safety (setq cl-optimize-safety (car safety)
+ (if safety (setq cl--optimize-safety (car safety)
byte-compile-delete-errors (nth 1 safety)))))
((and (eq (car-safe spec) 'warn) (boundp 'byte-compile-warnings))
@@ -1944,10 +2031,10 @@ values. For compatibility, (cl-values A B C) is a synonym for (list A B C).
nil)
;;; Process any proclamations made before cl-macs was loaded.
-(defvar cl-proclaims-deferred)
-(let ((p (reverse cl-proclaims-deferred)))
- (while p (cl-do-proclaim (pop p) t))
- (setq cl-proclaims-deferred nil))
+(defvar cl--proclaims-deferred)
+(let ((p (reverse cl--proclaims-deferred)))
+ (while p (cl--do-proclaim (pop p) t))
+ (setq cl--proclaims-deferred nil))
;;;###autoload
(defmacro cl-declare (&rest specs)
@@ -1960,8 +2047,8 @@ will turn off byte-compile warnings in the function.
See Info node `(cl)Declarations' for details."
(if (cl--compiling-file)
(while specs
- (if (listp cl-declare-stack) (push (car specs) cl-declare-stack))
- (cl-do-proclaim (pop specs) nil)))
+ (if (listp cl--declare-stack) (push (car specs) cl--declare-stack))
+ (cl--do-proclaim (pop specs) nil)))
nil)
;;; The standard modify macros.
@@ -2207,7 +2294,7 @@ value, that slot cannot be set via `setf'.
(copier (intern (format "copy-%s" name)))
(predicate (intern (format "%s-p" name)))
(print-func nil) (print-auto nil)
- (safety (if (cl--compiling-file) cl-optimize-safety 3))
+ (safety (if (cl--compiling-file) cl--optimize-safety 3))
(include nil)
(tag (intern (format "cl-struct-%s" name)))
(tag-symbol (intern (format "cl-struct-%s-tags" name)))
@@ -2433,7 +2520,7 @@ The type name can then be used in `cl-typecase', `cl-check-type', etc."
((memq type '(nil t)) type)
((eq type 'null) `(null ,val))
((eq type 'atom) `(atom ,val))
- ((eq type 'float) `(cl-floatp-safe ,val))
+ ((eq type 'float) `(floatp ,val))
((eq type 'real) `(numberp ,val))
((eq type 'fixnum) `(integerp ,val))
;; FIXME: Should `character' accept things like ?\C-\M-a ? --Stef
@@ -2452,7 +2539,8 @@ The type name can then be used in `cl-typecase', `cl-check-type', etc."
(if (consp (cadr type)) `(> ,val ,(cl-caadr type))
`(>= ,val ,(cadr type))))
,(if (memq (cl-caddr type) '(* nil)) t
- (if (consp (cl-caddr type)) `(< ,val ,(cl-caaddr type))
+ (if (consp (cl-caddr type))
+ `(< ,val ,(cl-caaddr type))
`(<= ,val ,(cl-caddr type)))))))
((memq (car type) '(and or not))
(cons (car type)
@@ -2477,7 +2565,7 @@ TYPE is a Common Lisp-style type specifier."
STRING is an optional description of the desired type."
(declare (debug (place cl-type-spec &optional stringp)))
(and (or (not (cl--compiling-file))
- (< cl-optimize-speed 3) (= cl-optimize-safety 3))
+ (< cl--optimize-speed 3) (= cl--optimize-safety 3))
(let* ((temp (if (cl--simple-expr-p form 3)
form (make-symbol "--cl-var--")))
(body `(or ,(cl--make-type-test temp type)
@@ -2497,7 +2585,7 @@ They are not evaluated unless the assertion fails. If STRING is
omitted, a default message listing FORM itself is used."
(declare (debug (form &rest form)))
(and (or (not (cl--compiling-file))
- (< cl-optimize-speed 3) (= cl-optimize-safety 3))
+ (< cl--optimize-speed 3) (= cl--optimize-safety 3))
(let ((sargs (and show-args
(delq nil (mapcar (lambda (x)
(unless (macroexp-const-p x)
@@ -2651,7 +2739,7 @@ surrounded by (cl-block NAME ...).
(cond ((eq test 'eq) `(assq ,a ,list))
((eq test 'equal) `(assoc ,a ,list))
((and (macroexp-const-p a) (or (null keys) (eq test 'eql)))
- (if (cl-floatp-safe (cl--const-expr-val a))
+ (if (floatp (cl--const-expr-val a))
`(assoc ,a ,list) `(assq ,a ,list)))
(t form))))
@@ -2688,19 +2776,19 @@ surrounded by (cl-block NAME ...).
(put y 'side-effect-free t))
;;; Things that are inline.
-(cl-proclaim '(inline cl-floatp-safe cl-acons cl-map cl-concatenate cl-notany
+(cl-proclaim '(inline cl-acons cl-map cl-concatenate cl-notany
cl-notevery cl--set-elt cl-revappend cl-nreconc gethash))
;;; Things that are side-effect-free.
(mapc (lambda (x) (put x 'side-effect-free t))
- '(cl-oddp cl-evenp cl-signum last butlast cl-ldiff cl-pairlis cl-gcd cl-lcm
- cl-isqrt cl-floor cl-ceiling cl-truncate cl-round cl-mod cl-rem cl-subseq
- cl-list-length cl-get cl-getf))
+ '(cl-oddp cl-evenp cl-signum last butlast cl-ldiff cl-pairlis cl-gcd
+ cl-lcm cl-isqrt cl-floor cl-ceiling cl-truncate cl-round cl-mod cl-rem
+ cl-subseq cl-list-length cl-get cl-getf))
;;; Things that are side-effect-and-error-free.
(mapc (lambda (x) (put x 'side-effect-free 'error-free))
- '(eql cl-floatp-safe cl-list* cl-subst cl-acons cl-equalp cl-random-state-p
- copy-tree cl-sublis))
+ '(eql cl-list* cl-subst cl-acons cl-equalp
+ cl-random-state-p copy-tree cl-sublis))
(run-hooks 'cl-macs-load-hook)
diff --git a/lisp/emacs-lisp/cl-seq.el b/lisp/emacs-lisp/cl-seq.el
index c0c2db0d9ae..fbf68f62b4a 100644
--- a/lisp/emacs-lisp/cl-seq.el
+++ b/lisp/emacs-lisp/cl-seq.el
@@ -105,6 +105,9 @@
(eq (not (funcall cl-test ,x ,y)) cl-test-not)
(eql ,x ,y)))
+;; Yuck! These vars are set/bound by cl--parsing-keywords to match :if :test
+;; and :key keyword args, and they are also accessed (sometimes) via dynamic
+;; scoping (and some of those accesses are from macro-expanded code).
(defvar cl-test) (defvar cl-test-not)
(defvar cl-if) (defvar cl-if-not)
(defvar cl-key)
@@ -333,7 +336,8 @@ This is a destructive function; it reuses the storage of SEQ whenever possible.
(defun cl--delete-duplicates (cl-seq cl-keys cl-copy)
(if (listp cl-seq)
- (cl--parsing-keywords (:test :test-not :key (:start 0) :end :from-end :if)
+ (cl--parsing-keywords
+ (:test :test-not :key (:start 0) :end :from-end :if)
()
(if cl-from-end
(let ((cl-p (nthcdr cl-start cl-seq)) cl-i)
@@ -776,7 +780,8 @@ to avoid corrupting the original LIST1 and LIST2.
(setq cl-list1 (prog1 cl-list2 (setq cl-list2 cl-list1))))
(while cl-list2
(if (or cl-keys (numberp (car cl-list2)))
- (setq cl-list1 (apply 'cl-adjoin (car cl-list2) cl-list1 cl-keys))
+ (setq cl-list1
+ (apply 'cl-adjoin (car cl-list2) cl-list1 cl-keys))
(or (memq (car cl-list2) cl-list1)
(push (car cl-list2) cl-list1)))
(pop cl-list2))
diff --git a/lisp/emacs-lisp/cl.el b/lisp/emacs-lisp/cl.el
index 0ad7d4b1592..ea4d9511f9d 100644
--- a/lisp/emacs-lisp/cl.el
+++ b/lisp/emacs-lisp/cl.el
@@ -113,14 +113,6 @@
))
(defvaralias var (intern (format "cl-%s" var))))
-;; Before overwriting subr.el's `dotimes' and `dolist', let's remember
-;; them under a different name, so we can use them in our implementation
-;; of `dotimes' and `dolist'.
-(unless (fboundp 'cl--dotimes)
- (defalias 'cl--dotimes (symbol-function 'dotimes) "The non-CL `dotimes'."))
-(unless (fboundp 'cl--dolist)
- (defalias 'cl--dolist (symbol-function 'dolist) "The non-CL `dolist'."))
-
(dolist (fun '(
(get* . cl-get)
(random* . cl-random)
@@ -228,13 +220,12 @@
callf2
callf
letf*
- ;; letf
+ letf
rotatef
shiftf
remf
psetf
(define-setf-method . define-setf-expander)
- declare
the
locally
multiple-value-setq
@@ -245,8 +236,6 @@
psetq
do-all-symbols
do-symbols
- dotimes
- dolist
do*
do
loop
@@ -328,6 +317,15 @@
(intern (format "cl-%s" fun)))))
(defalias fun new)))
+(defun cl--wrap-in-nil-block (fun &rest args)
+ `(cl-block nil ,(apply fun args)))
+(advice-add 'dolist :around #'cl--wrap-in-nil-block)
+(advice-add 'dotimes :around #'cl--wrap-in-nil-block)
+
+(defun cl--pass-args-to-cl-declare (&rest specs)
+ (macroexpand `(cl-declare ,@specs)))
+(advice-add 'declare :after #'cl--pass-args-to-cl-declare)
+
;;; Features provided a bit differently in Elisp.
;; First, the old lexical-let is now better served by `lexical-binding', tho
@@ -506,28 +504,6 @@ rather than relying on `lexical-binding'."
;; not 100% compatible: not worth the trouble to add them to cl-lib.el, but we
;; still need to support old users of cl.el.
-(defmacro cl--symbol-function (symbol)
- "Like `symbol-function' but return `cl--unbound' if not bound."
- ;; (declare (gv-setter (lambda (store)
- ;; `(if (eq ,store 'cl--unbound)
- ;; (fmakunbound ,symbol) (fset ,symbol ,store)))))
- `(if (fboundp ,symbol) (symbol-function ,symbol) 'cl--unbound))
-(gv-define-setter cl--symbol-function (store symbol)
- `(if (eq ,store 'cl--unbound) (fmakunbound ,symbol) (fset ,symbol ,store)))
-
-(defmacro letf (bindings &rest body)
- "Dynamically scoped let-style bindings for places.
-For more details, see `cl-letf'. This macro behaves like that one
-in almost every respect (apart from details that relate to some
-deprecated usage of `symbol-function' in place forms)." ; bug#12760
- (declare (indent 1) (debug cl-letf))
- ;; Like cl-letf, but with special handling of symbol-function.
- `(cl-letf ,(mapcar (lambda (x) (if (eq (car-safe (car x)) 'symbol-function)
- `((cl--symbol-function ,@(cdar x)) ,@(cdr x))
- x))
- bindings)
- ,@body))
-
(defun cl--gv-adapt (cl-gv do)
;; This function is used by all .elc files that use define-setf-expander and
;; were compiled with Emacs>=24.3.
diff --git a/lisp/emacs-lisp/crm.el b/lisp/emacs-lisp/crm.el
index 5607c9b0698..b8e327625e7 100644
--- a/lisp/emacs-lisp/crm.el
+++ b/lisp/emacs-lisp/crm.el
@@ -30,12 +30,12 @@
;; a single prompt, optionally using completion.
;; Multiple strings are specified by separating each of the strings
-;; with a prespecified separator character. For example, if the
-;; separator character is a comma, the strings 'alice', 'bob', and
+;; with a prespecified separator regexp. For example, if the
+;; separator regexp is ",", the strings 'alice', 'bob', and
;; 'eve' would be specified as 'alice,bob,eve'.
-;; The default value for the separator character is the value of
-;; `crm-default-separator' (comma). The separator character may be
+;; The default value for the separator regexp is the value of
+;; `crm-default-separator' (comma). The separator regexp may be
;; changed by modifying the value of `crm-separator'.
;; Contiguous strings of non-separator-characters are referred to as
@@ -96,14 +96,14 @@
;; first revamped version
;;; Code:
-(defconst crm-default-separator ","
- "Default separator for `completing-read-multiple'.")
+(defconst crm-default-separator "[ \t]*,[ \t]*"
+ "Default separator regexp for `completing-read-multiple'.")
(defvar crm-separator crm-default-separator
- "Separator used for separating strings in `completing-read-multiple'.
-It should be a single character string that doesn't appear in the list of
-completion candidates. Modify this value to make `completing-read-multiple'
-use a separator other than `crm-default-separator'.")
+ "Separator regexp used for separating strings in `completing-read-multiple'.
+It should be a regexp that does not match the list of completion candidates.
+Modify this value to make `completing-read-multiple' use a separator other
+than `crm-default-separator'.")
(defvar crm-local-completion-map
(let ((map (make-sparse-keymap)))
@@ -173,13 +173,17 @@ Place an overlay on the element, with a `field' property, and return it."
(overlay-put ol 'field (make-symbol "crm"))
ol))
+(defmacro crm--completion-command (command)
+ "Make COMMAND a completion command for `completing-read-multiple'."
+ `(let ((ol (crm--select-current-element)))
+ (unwind-protect
+ ,command
+ (delete-overlay ol))))
+
(defun crm-completion-help ()
"Display a list of possible completions of the current minibuffer element."
(interactive)
- (let ((ol (crm--select-current-element)))
- (unwind-protect
- (minibuffer-completion-help)
- (delete-overlay ol)))
+ (crm--completion-command (minibuffer-completion-help))
nil)
(defun crm-complete ()
@@ -188,19 +192,13 @@ If no characters can be completed, display a list of possible completions.
Return t if the current element is now a valid match; otherwise return nil."
(interactive)
- (let ((ol (crm--select-current-element)))
- (unwind-protect
- (minibuffer-complete)
- (delete-overlay ol))))
+ (crm--completion-command (minibuffer-complete)))
(defun crm-complete-word ()
"Complete the current element at most a single word.
Like `minibuffer-complete-word' but for `completing-read-multiple'."
(interactive)
- (let ((ol (crm--select-current-element)))
- (unwind-protect
- (minibuffer-complete-word)
- (delete-overlay ol))))
+ (crm--completion-command (minibuffer-complete-word)))
(defun crm-complete-and-exit ()
"If all of the minibuffer elements are valid completions then exit.
@@ -222,9 +220,10 @@ This function is modeled after `minibuffer-complete-and-exit'."
(setq doexit nil))
(goto-char (overlay-end ol))
(delete-overlay ol))
- (not (eobp))))
+ (not (eobp)))
+ (looking-at crm-separator))
;; Skip to the next element.
- (forward-char 1))
+ (goto-char (match-end 0)))
(if doexit (exit-minibuffer))))
(defun crm--choose-completion-string (choice buffer base-position
@@ -248,12 +247,12 @@ By using this functionality, a user may specify multiple strings at a
single prompt, optionally using completion.
Multiple strings are specified by separating each of the strings with
-a prespecified separator character. For example, if the separator
-character is a comma, the strings 'alice', 'bob', and 'eve' would be
+a prespecified separator regexp. For example, if the separator
+regexp is \",\", the strings 'alice', 'bob', and 'eve' would be
specified as 'alice,bob,eve'.
-The default value for the separator character is the value of
-`crm-default-separator' (comma). The separator character may be
+The default value for the separator regexp is the value of
+`crm-default-separator' (comma). The separator regexp may be
changed by modifying the value of `crm-separator'.
Contiguous strings of non-separator-characters are referred to as
@@ -264,7 +263,8 @@ Completion is available on a per-element basis. For example, if the
contents of the minibuffer are 'alice,bob,eve' and point is between
'l' and 'i', pressing TAB operates on the element 'alice'.
-The return value of this function is a list of the read strings.
+The return value of this function is a list of the read strings
+with empty strings removed.
See the documentation for `completing-read' for details on the arguments:
PROMPT, TABLE, PREDICATE, REQUIRE-MATCH, INITIAL-INPUT, HIST, DEF, and
@@ -282,13 +282,14 @@ INHERIT-INPUT-METHOD."
(map (if require-match
crm-local-must-match-map
crm-local-completion-map))
- ;; If the user enters empty input, read-from-minibuffer returns
- ;; the empty string, not DEF.
+ ;; If the user enters empty input, `read-from-minibuffer'
+ ;; returns the empty string, not DEF.
(input (read-from-minibuffer
prompt initial-input map
nil hist def inherit-input-method)))
(and def (string-equal input "") (setq input def))
- (split-string input crm-separator)))
+ ;; Remove empty strings in the list of read strings.
+ (split-string input crm-separator t)))
(remove-hook 'choose-completion-string-functions
'crm--choose-completion-string)))
diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el
index 472706d886b..0728e86d072 100644
--- a/lisp/emacs-lisp/debug.el
+++ b/lisp/emacs-lisp/debug.el
@@ -1,4 +1,4 @@
-;;; debug.el --- debuggers and related commands for Emacs
+;;; debug.el --- debuggers and related commands for Emacs -*- lexical-binding: t -*-
;; Copyright (C) 1985-1986, 1994, 2001-2013 Free Software Foundation,
;; Inc.
@@ -82,9 +82,6 @@ The value used here is passed to `quit-restore-window'."
:group 'debugger
:version "24.3")
-(defvar debug-function-list nil
- "List of functions currently set for debug on entry.")
-
(defvar debugger-step-after-exit nil
"Non-nil means \"single-step\" after the debugger exits.")
@@ -147,7 +144,7 @@ where CAUSE can be:
;;;###autoload
(setq debugger 'debug)
;;;###autoload
-(defun debug (&rest debugger-args)
+(defun debug (&rest args)
"Enter debugger. \\<debugger-mode-map>`\\[debugger-continue]' returns from the debugger.
Arguments are mainly for use when this is called from the internals
of the evaluator.
@@ -166,6 +163,7 @@ first will be printed into the backtrace buffer."
(if (get-buffer "*Backtrace*")
(with-current-buffer (get-buffer "*Backtrace*")
(list major-mode (buffer-string)))))
+ (debugger-args args)
(debugger-buffer (get-buffer-create "*Backtrace*"))
(debugger-old-buffer (current-buffer))
(debugger-window nil)
@@ -220,11 +218,11 @@ first will be printed into the backtrace buffer."
(save-excursion
(when (eq (car debugger-args) 'debug)
;; Skip the frames for backtrace-debug, byte-code,
- ;; and implement-debug-on-entry.
- (backtrace-debug 3 t)
+ ;; debug--implement-debug-on-entry and the advice's `apply'.
+ (backtrace-debug 4 t)
;; Place an extra debug-on-exit for macro's.
- (when (eq 'lambda (car-safe (cadr (backtrace-frame 3))))
- (backtrace-debug 4 t)))
+ (when (eq 'lambda (car-safe (cadr (backtrace-frame 4))))
+ (backtrace-debug 5 t)))
(pop-to-buffer
debugger-buffer
`((display-buffer-reuse-window
@@ -319,7 +317,7 @@ first will be printed into the backtrace buffer."
(setq debug-on-next-call debugger-step-after-exit)
debugger-value)))
-(defun debugger-setup-buffer (debugger-args)
+(defun debugger-setup-buffer (args)
"Initialize the `*Backtrace*' buffer for entry to the debugger.
That buffer should be current already."
(setq buffer-read-only nil)
@@ -335,20 +333,22 @@ That buffer should be current already."
(delete-region (point)
(progn
(search-forward "\n debug(")
- (forward-line (if (eq (car debugger-args) 'debug)
- 2 ; Remove implement-debug-on-entry frame.
+ (forward-line (if (eq (car args) 'debug)
+ ;; Remove debug--implement-debug-on-entry
+ ;; and the advice's `apply' frame.
+ 3
1))
(point)))
(insert "Debugger entered")
;; lambda is for debug-on-call when a function call is next.
;; debug is for debug-on-entry function called.
- (pcase (car debugger-args)
+ (pcase (car args)
((or `lambda `debug)
(insert "--entering a function:\n"))
;; Exiting a function.
(`exit
(insert "--returning value: ")
- (setq debugger-value (nth 1 debugger-args))
+ (setq debugger-value (nth 1 args))
(prin1 debugger-value (current-buffer))
(insert ?\n)
(delete-char 1)
@@ -357,7 +357,7 @@ That buffer should be current already."
;; Debugger entered for an error.
(`error
(insert "--Lisp error: ")
- (prin1 (nth 1 debugger-args) (current-buffer))
+ (prin1 (nth 1 args) (current-buffer))
(insert ?\n))
;; debug-on-call, when the next thing is an eval.
(`t
@@ -365,8 +365,8 @@ That buffer should be current already."
;; User calls debug directly.
(_
(insert ": ")
- (prin1 (if (eq (car debugger-args) 'nil)
- (cdr debugger-args) debugger-args)
+ (prin1 (if (eq (car args) 'nil)
+ (cdr args) args)
(current-buffer))
(insert ?\n)))
;; After any frame that uses eval-buffer,
@@ -526,9 +526,10 @@ removes itself from that hook."
(count 0))
(while (not (eq (cadr (backtrace-frame count)) 'debug))
(setq count (1+ count)))
- ;; Skip implement-debug-on-entry frame.
- (when (eq 'implement-debug-on-entry (cadr (backtrace-frame (1+ count))))
- (setq count (1+ count)))
+ ;; Skip debug--implement-debug-on-entry frame.
+ (when (eq 'debug--implement-debug-on-entry
+ (cadr (backtrace-frame (1+ count))))
+ (setq count (+ 2 count)))
(goto-char (point-min))
(when (looking-at "Debugger entered--\\(Lisp error\\|returning value\\):")
(goto-char (match-end 0))
@@ -695,10 +696,10 @@ Applies to the frame whose line point is on in the backtrace."
:help "Continue to exit from this frame, with all debug-on-entry suspended"))
(define-key menu-map [deb-cont]
'(menu-item "Continue" debugger-continue
- :help "Continue, evaluating this expression without stopping"))
+ :help "Continue, evaluating this expression without stopping"))
(define-key menu-map [deb-step]
'(menu-item "Step through" debugger-step-through
- :help "Proceed, stepping through subexpressions of this expression"))
+ :help "Proceed, stepping through subexpressions of this expression"))
map))
(put 'debugger-mode 'mode-class 'special)
@@ -778,7 +779,7 @@ For the cross-reference format, see `help-make-xrefs'."
;; When you change this, you may also need to change the number of
;; frames that the debugger skips.
-(defun implement-debug-on-entry ()
+(defun debug--implement-debug-on-entry (&rest _ignore)
"Conditionally call the debugger.
A call to this function is inserted by `debug-on-entry' to cause
functions to break on entry."
@@ -786,12 +787,6 @@ functions to break on entry."
nil
(funcall debugger 'debug)))
-(defun debugger-special-form-p (symbol)
- "Return whether SYMBOL is a special form."
- (and (fboundp symbol)
- (subrp (symbol-function symbol))
- (eq (cdr (subr-arity (symbol-function symbol))) 'unevalled)))
-
;;;###autoload
(defun debug-on-entry (function)
"Request FUNCTION to invoke debugger each time it is called.
@@ -809,7 +804,7 @@ Use \\[cancel-debug-on-entry] to cancel the effect of this command.
Redefining FUNCTION also cancels it."
(interactive
(let ((fn (function-called-at-point)) val)
- (when (debugger-special-form-p fn)
+ (when (special-form-p fn)
(setq fn nil))
(setq val (completing-read
(if fn
@@ -818,36 +813,21 @@ Redefining FUNCTION also cancels it."
obarray
#'(lambda (symbol)
(and (fboundp symbol)
- (not (debugger-special-form-p symbol))))
+ (not (special-form-p symbol))))
t nil nil (symbol-name fn)))
(list (if (equal val "") fn (intern val)))))
- ;; FIXME: Use advice.el.
- (when (debugger-special-form-p function)
- (error "Function %s is a special form" function))
- (if (or (symbolp (symbol-function function))
- (subrp (symbol-function function)))
- ;; The function is built-in or aliased to another function.
- ;; Create a wrapper in which we can add the debug call.
- (fset function `(lambda (&rest debug-on-entry-args)
- ,(interactive-form (symbol-function function))
- (apply ',(symbol-function function)
- debug-on-entry-args)))
- (when (autoloadp (symbol-function function))
- ;; The function is autoloaded. Load its real definition.
- (autoload-do-load (symbol-function function) function))
- (when (or (not (consp (symbol-function function)))
- (and (eq (car (symbol-function function)) 'macro)
- (not (consp (cdr (symbol-function function))))))
- ;; The function is byte-compiled. Create a wrapper in which
- ;; we can add the debug call.
- (debug-convert-byte-code function)))
- (unless (consp (symbol-function function))
- (error "Definition of %s is not a list" function))
- (fset function (debug-on-entry-1 function t))
- (unless (memq function debug-function-list)
- (push function debug-function-list))
+ (advice-add function :before #'debug--implement-debug-on-entry)
function)
+(defun debug--function-list ()
+ "List of functions currently set for debug on entry."
+ (let ((funs '()))
+ (mapatoms
+ (lambda (s)
+ (when (advice-member-p #'debug--implement-debug-on-entry s)
+ (push s funs))))
+ funs))
+
;;;###autoload
(defun cancel-debug-on-entry (&optional function)
"Undo effect of \\[debug-on-entry] on FUNCTION.
@@ -858,80 +838,16 @@ To specify a nil argument interactively, exit with an empty minibuffer."
(list (let ((name
(completing-read
"Cancel debug on entry to function (default all functions): "
- (mapcar 'symbol-name debug-function-list) nil t)))
+ (mapcar #'symbol-name (debug--function-list)) nil t)))
(when name
(unless (string= name "")
(intern name))))))
- (if (and function
- (not (string= function ""))) ; Pre 22.1 compatibility test.
+ (if function
(progn
- (let ((defn (debug-on-entry-1 function nil)))
- (condition-case nil
- (when (and (equal (nth 1 defn) '(&rest debug-on-entry-args))
- (eq (car (nth 3 defn)) 'apply))
- ;; `defn' is a wrapper introduced in debug-on-entry.
- ;; Get rid of it since we don't need it any more.
- (setq defn (nth 1 (nth 1 (nth 3 defn)))))
- (error nil))
- (fset function defn))
- (setq debug-function-list (delq function debug-function-list))
+ (advice-remove function #'debug--implement-debug-on-entry)
function)
(message "Cancelling debug-on-entry for all functions")
- (mapcar 'cancel-debug-on-entry debug-function-list)))
-
-(defun debug-arglist (definition)
- ;; FIXME: copied from ad-arglist.
- "Return the argument list of DEFINITION."
- (require 'help-fns)
- (help-function-arglist definition 'preserve-names))
-
-(defun debug-convert-byte-code (function)
- (let* ((defn (symbol-function function))
- (macro (eq (car-safe defn) 'macro)))
- (when macro (setq defn (cdr defn)))
- (when (byte-code-function-p defn)
- (let* ((args (debug-arglist defn))
- (body
- `((,(if (memq '&rest args) #'apply #'funcall)
- ,defn
- ,@(remq '&rest (remq '&optional args))))))
- (if (> (length defn) 5)
- ;; The mere presence of field 5 is sufficient to make
- ;; it interactive.
- (push `(interactive ,(aref defn 5)) body))
- (if (and (> (length defn) 4) (aref defn 4))
- ;; Use `documentation' here, to get the actual string,
- ;; in case the compiled function has a reference
- ;; to the .elc file.
- (setq body (cons (documentation function) body)))
- (setq defn `(closure (t) ,args ,@body)))
- (when macro (setq defn (cons 'macro defn)))
- (fset function defn))))
-
-(defun debug-on-entry-1 (function flag)
- (let* ((defn (symbol-function function))
- (tail defn))
- (when (eq (car-safe tail) 'macro)
- (setq tail (cdr tail)))
- (if (not (memq (car-safe tail) '(closure lambda)))
- ;; Only signal an error when we try to set debug-on-entry.
- ;; When we try to clear debug-on-entry, we are now done.
- (when flag
- (error "%s is not a user-defined Lisp function" function))
- (if (eq (car tail) 'closure) (setq tail (cdr tail)))
- (setq tail (cdr tail))
- ;; Skip the docstring.
- (when (and (stringp (cadr tail)) (cddr tail))
- (setq tail (cdr tail)))
- ;; Skip the interactive form.
- (when (eq 'interactive (car-safe (cadr tail)))
- (setq tail (cdr tail)))
- (unless (eq flag (equal (cadr tail) '(implement-debug-on-entry)))
- ;; Add/remove debug statement as needed.
- (setcdr tail (if flag
- (cons '(implement-debug-on-entry) (cdr tail))
- (cddr tail)))))
- defn))
+ (mapcar #'cancel-debug-on-entry (debug--function-list))))
(defun debugger-list-functions ()
"Display a list of all the functions now set to debug on entry."
@@ -941,17 +857,18 @@ To specify a nil argument interactively, exit with an empty minibuffer."
(called-interactively-p 'interactive))
(with-output-to-temp-buffer (help-buffer)
(with-current-buffer standard-output
- (if (null debug-function-list)
- (princ "No debug-on-entry functions now\n")
- (princ "Functions set to debug on entry:\n\n")
- (dolist (fun debug-function-list)
- (make-text-button (point) (progn (prin1 fun) (point))
- 'type 'help-function
- 'help-args (list fun))
- (terpri))
- (terpri)
- (princ "Note: if you have redefined a function, then it may no longer\n")
- (princ "be set to debug on entry, even if it is in the list.")))))
+ (let ((funs (debug--function-list)))
+ (if (null funs)
+ (princ "No debug-on-entry functions now\n")
+ (princ "Functions set to debug on entry:\n\n")
+ (dolist (fun funs)
+ (make-text-button (point) (progn (prin1 fun) (point))
+ 'type 'help-function
+ 'help-args (list fun))
+ (terpri))
+ (terpri)
+ (princ "Note: if you have redefined a function, then it may no longer\n")
+ (princ "be set to debug on entry, even if it is in the list."))))))
(provide 'debug)
diff --git a/lisp/emacs-lisp/derived.el b/lisp/emacs-lisp/derived.el
index a5876ee0bda..684f9d90878 100644
--- a/lisp/emacs-lisp/derived.el
+++ b/lisp/emacs-lisp/derived.el
@@ -296,16 +296,32 @@ is not very useful."
;; Use a default docstring.
(setq docstring
(if (null parent)
- (format "Major-mode.
-Uses keymap `%s', abbrev table `%s' and syntax-table `%s'." map abbrev syntax)
+ ;; FIXME filling.
+ (format "Major-mode.\nUses keymap `%s'%s%s." map
+ (if abbrev (format "%s abbrev table `%s'"
+ (if syntax "," " and") abbrev) "")
+ (if syntax (format " and syntax-table `%s'" syntax) ""))
(format "Major mode derived from `%s' by `define-derived-mode'.
-It inherits all of the parent's attributes, but has its own keymap,
-abbrev table and syntax table:
-
- `%s', `%s' and `%s'
-
-which more-or-less shadow %s's corresponding tables."
- parent map abbrev syntax parent))))
+It inherits all of the parent's attributes, but has its own keymap%s:
+
+ `%s'%s
+
+which more-or-less shadow%s %s's corresponding table%s."
+ parent
+ (cond ((and abbrev syntax)
+ ",\nabbrev table and syntax table")
+ (abbrev "\nand abbrev table")
+ (syntax "\nand syntax table")
+ (t ""))
+ map
+ (cond ((and abbrev syntax)
+ (format ", `%s' and `%s'" abbrev syntax))
+ ((or abbrev syntax)
+ (format " and `%s'" (or abbrev syntax)))
+ (t ""))
+ (if (or abbrev syntax) "" "s")
+ parent
+ (if (or abbrev syntax) "s" "")))))
(unless (string-match (regexp-quote (symbol-name hook)) docstring)
;; Make sure the docstring mentions the mode's hook.
diff --git a/lisp/emacs-lisp/easy-mmode.el b/lisp/emacs-lisp/easy-mmode.el
index 166c093f37b..abe7b1ea741 100644
--- a/lisp/emacs-lisp/easy-mmode.el
+++ b/lisp/emacs-lisp/easy-mmode.el
@@ -341,9 +341,14 @@ If MODE's set-up depends on the major mode in effect when it was
enabled, then disabling and reenabling MODE should make MODE work
correctly with the current major mode. This is important to
prevent problems with derived modes, that is, major modes that
-call another major mode in their body."
+call another major mode in their body.
+
+When a major mode is initialized, MODE is actually turned on just
+after running the major mode's hook. However, MODE is not turned
+on if the hook has explicitly disabled it."
(declare (doc-string 2))
(let* ((global-mode-name (symbol-name global-mode))
+ (mode-name (symbol-name mode))
(pretty-name (easy-mmode-pretty-mode-name mode))
(pretty-global-name (easy-mmode-pretty-mode-name global-mode))
(group nil)
@@ -354,6 +359,8 @@ call another major mode in their body."
(MODE-check-buffers
(intern (concat global-mode-name "-check-buffers")))
(MODE-cmhh (intern (concat global-mode-name "-cmhh")))
+ (minor-MODE-hook (intern (concat mode-name "-hook")))
+ (MODE-set-explicitly (intern (concat mode-name "-set-explicitly")))
(MODE-major-mode (intern (concat (symbol-name mode) "-major-mode")))
keyw)
@@ -397,13 +404,9 @@ See `%s' for more information on %s."
(progn
(add-hook 'after-change-major-mode-hook
',MODE-enable-in-buffers)
- (add-hook 'change-major-mode-after-body-hook
- ',MODE-enable-in-buffers)
(add-hook 'find-file-hook ',MODE-check-buffers)
(add-hook 'change-major-mode-hook ',MODE-cmhh))
(remove-hook 'after-change-major-mode-hook ',MODE-enable-in-buffers)
- (remove-hook 'change-major-mode-after-body-hook
- ',MODE-enable-in-buffers)
(remove-hook 'find-file-hook ',MODE-check-buffers)
(remove-hook 'change-major-mode-hook ',MODE-cmhh))
@@ -416,6 +419,10 @@ See `%s' for more information on %s."
;; up-to-here.
:autoload-end
+ ;; A function which checks whether MODE has been disabled in the major
+ ;; mode hook which has just been run.
+ (add-hook ',minor-MODE-hook ',MODE-set-explicitly)
+
;; List of buffers left to process.
(defvar ,MODE-buffers nil)
@@ -424,14 +431,14 @@ See `%s' for more information on %s."
(dolist (buf ,MODE-buffers)
(when (buffer-live-p buf)
(with-current-buffer buf
- (unless (eq ,MODE-major-mode major-mode)
- (if ,mode
- (progn
- (,mode -1)
- (,turn-on)
- (setq ,MODE-major-mode major-mode))
- (,turn-on)
- (setq ,MODE-major-mode major-mode)))))))
+ (unless ,MODE-set-explicitly
+ (unless (eq ,MODE-major-mode major-mode)
+ (if ,mode
+ (progn
+ (,mode -1)
+ (,turn-on))
+ (,turn-on))))
+ (setq ,MODE-major-mode major-mode)))))
(put ',MODE-enable-in-buffers 'definition-name ',global-mode)
(defun ,MODE-check-buffers ()
@@ -444,24 +451,21 @@ See `%s' for more information on %s."
(defun ,MODE-cmhh ()
(add-to-list ',MODE-buffers (current-buffer))
(add-hook 'post-command-hook ',MODE-check-buffers))
- (put ',MODE-cmhh 'definition-name ',global-mode))))
+ (put ',MODE-cmhh 'definition-name ',global-mode)
+ ;; MODE-set-explicitly is set in MODE-set-explicitly and cleared by
+ ;; kill-all-local-variables.
+ (defvar-local ,MODE-set-explicitly nil)
+ (defun ,MODE-set-explicitly ()
+ (setq ,MODE-set-explicitly t))
+ (put ',MODE-set-explicitly 'definition-name ',global-mode))))
;;;
;;; easy-mmode-defmap
;;;
-(eval-and-compile
- (if (fboundp 'set-keymap-parents)
- (defalias 'easy-mmode-set-keymap-parents 'set-keymap-parents)
- (defun easy-mmode-set-keymap-parents (m parents)
- (set-keymap-parent
- m
- (cond
- ((not (consp parents)) parents)
- ((not (cdr parents)) (car parents))
- (t (let ((m (copy-keymap (pop parents))))
- (easy-mmode-set-keymap-parents m parents)
- m)))))))
+(defun easy-mmode-set-keymap-parents (m parents)
+ (set-keymap-parent
+ m (if (cdr parents) (make-composed-keymap parents) (car parents))))
;;;###autoload
(defun easy-mmode-define-keymap (bs &optional name m args)
diff --git a/lisp/emacs-lisp/edebug.el b/lisp/emacs-lisp/edebug.el
index e3888db2a57..867f079ce5f 100644
--- a/lisp/emacs-lisp/edebug.el
+++ b/lisp/emacs-lisp/edebug.el
@@ -54,6 +54,7 @@
(require 'macroexp)
(eval-when-compile (require 'cl-lib))
+(eval-when-compile (require 'pcase))
;;; Options
@@ -461,8 +462,8 @@ STREAM or the value of `standard-input' may be:
This version, from Edebug, maybe instruments the expression. But the
STREAM must be the current buffer to do so. Whether it instruments is
-also dependent on the values of `edebug-all-defs' and
-`edebug-all-forms'."
+also dependent on the values of the option `edebug-all-defs' and
+the option `edebug-all-forms'."
(or stream (setq stream standard-input))
(if (eq stream (current-buffer))
(edebug-read-and-maybe-wrap-form)
@@ -484,8 +485,8 @@ similarly. Reinitialize the face according to `defface' specification.
With a prefix argument, instrument the code for Edebug.
-Setting `edebug-all-defs' to a non-nil value reverses the meaning of
-the prefix argument. Code is then instrumented when this function is
+Setting option `edebug-all-defs' to a non-nil value reverses the meaning
+of the prefix argument. Code is then instrumented when this function is
invoked without a prefix argument
If acting on a `defun' for FUNCTION, and the function was instrumented,
@@ -2072,11 +2073,6 @@ expressions; a `progn' form will be returned enclosing these forms."
(defvar edebug-active nil) ;; Non-nil when edebug is active
-;;; add minor-mode-alist entry
-(or (assq 'edebug-active minor-mode-alist)
- (setq minor-mode-alist (cons (list 'edebug-active " *Debugging*")
- minor-mode-alist)))
-
(defvar edebug-stack nil)
;; Stack of active functions evaluated via edebug.
;; Should be nil at the top level.
@@ -2715,8 +2711,7 @@ MSG is printed after `::::} '."
;; Start up a recursive edit inside of edebug.
;; The current buffer is the edebug-buffer, which is put into edebug-mode.
;; Assume that none of the variables below are buffer-local.
- (let ((edebug-buffer-read-only buffer-read-only)
- ;; match-data must be done in the outside buffer
+ (let (;; match-data must be done in the outside buffer
(edebug-outside-match-data
(with-current-buffer edebug-outside-buffer ; in case match buffer different
(match-data)))
@@ -2730,8 +2725,6 @@ MSG is printed after `::::} '."
;; during a recursive-edit
edebug-inside-windows
- (edebug-outside-map (current-local-map))
-
;; Save the outside value of executing macro. (here??)
(edebug-outside-executing-macro executing-kbd-macro)
(edebug-outside-pre-command-hook
@@ -2804,10 +2797,9 @@ MSG is printed after `::::} '."
(not (memq arg-mode '(after error))))
(message "Break"))
- (setq buffer-read-only t)
(setq signal-hook-function nil)
- (edebug-mode)
+ (edebug-mode 1)
(unwind-protect
(recursive-edit) ; <<<<<<<<<< Recursive edit
@@ -2828,10 +2820,7 @@ MSG is printed after `::::} '."
(set-buffer edebug-buffer)
(if (memq edebug-execution-mode '(go Go-nonstop))
(edebug-overlay-arrow))
- (setq buffer-read-only edebug-buffer-read-only)
- (use-local-map edebug-outside-map)
- (remove-hook 'kill-buffer-hook 'edebug-kill-buffer t)
- )
+ (edebug-mode -1))
;; gotta have a buffer to let its buffer local variables be set
(get-buffer-create " bogus edebug buffer"))
));; inner let
@@ -3773,7 +3762,9 @@ be installed in `emacs-lisp-mode-map'.")
(interactive)
(describe-function 'edebug-mode))
-(defun edebug-mode ()
+(defvar edebug--mode-saved-vars nil)
+
+(define-minor-mode edebug-mode
"Mode for Emacs Lisp buffers while in Edebug.
In addition to all Emacs Lisp commands (except those that modify the
@@ -3807,17 +3798,32 @@ Options:
`edebug-on-signal'
`edebug-unwrap-results'
`edebug-global-break-condition'"
+ :lighter " *Debugging*"
+ :keymap edebug-mode-map
;; If the user kills the buffer in which edebug is currently active,
;; exit to top level, because the edebug command loop can't usefully
;; continue running in such a case.
- (add-hook 'kill-buffer-hook 'edebug-kill-buffer nil t)
- (use-local-map edebug-mode-map))
+ ;;
+ (if (not edebug-mode)
+ (progn
+ (while edebug--mode-saved-vars
+ (let ((setting (pop edebug--mode-saved-vars)))
+ (if (consp setting)
+ (set (car setting) (cdr setting))
+ (kill-local-variable setting))))
+ (remove-hook 'kill-buffer-hook 'edebug-kill-buffer t))
+ (pcase-dolist (`(,var . ,val) '((buffer-read-only . t)))
+ (push
+ (if (local-variable-p var) (cons var (symbol-value var)) var)
+ edebug--mode-saved-vars)
+ (set (make-local-variable var) val))
+ ;; Append `edebug-kill-buffer' to the hook to avoid interfering with
+ ;; other entries that are unguarded against deleted buffer.
+ (add-hook 'kill-buffer-hook 'edebug-kill-buffer t t)))
(defun edebug-kill-buffer ()
"Used on `kill-buffer-hook' when Edebug is operating in a buffer of Lisp code."
- (let (kill-buffer-hook)
- (kill-buffer (current-buffer)))
- (top-level))
+ (run-with-timer 0 nil #'top-level))
;;; edebug eval list mode
@@ -4140,7 +4146,7 @@ reinstrument it."
It is removed when you hit any char."
;; This seems not to work with Emacs 18.59. It undoes too far.
(interactive)
- (let ((buffer-read-only nil))
+ (let ((inhibit-read-only t))
(undo-boundary)
(edebug-display-freq-count)
(setq unread-command-events
@@ -4259,22 +4265,53 @@ With prefix argument, make it a temporary breakpoint."
;;; Autoloading of Edebug accessories
;; edebug-cl-read and cl-read are available from liberte@cs.uiuc.edu
+(defun edebug--require-cl-read ()
+ (require 'edebug-cl-read))
+
(if (featurep 'cl-read)
- (add-hook 'edebug-setup-hook
- (function (lambda () (require 'edebug-cl-read))))
+ (add-hook 'edebug-setup-hook #'edebug--require-cl-read)
;; The following causes edebug-cl-read to be loaded when you load cl-read.el.
- (add-hook 'cl-read-load-hooks
- (function (lambda () (require 'edebug-cl-read)))))
+ (add-hook 'cl-read-load-hooks #'edebug--require-cl-read))
;;; Finalize Loading
+;; When edebugging a function, some of the sub-expressions are
+;; wrapped in (edebug-enter (lambda () ..)), so we need to teach
+;; called-interactively-p that calls within the inner lambda should refer to
+;; the outside function.
+(add-hook 'called-interactively-p-functions
+ #'edebug--called-interactively-skip)
+(defun edebug--called-interactively-skip (i frame1 frame2)
+ (when (and (eq (car-safe (nth 1 frame1)) 'lambda)
+ (eq (nth 1 (nth 1 frame1)) '())
+ (eq (nth 1 frame2) 'edebug-enter))
+ ;; `edebug-enter' calls itself on its first invocation.
+ (if (eq (nth 1 (internal--called-interactively-p--get-frame i))
+ 'edebug-enter)
+ 2 1)))
+
;; Finally, hook edebug into the rest of Emacs.
;; There are probably some other things that could go here.
;; Install edebug read and eval functions.
(edebug-install-read-eval-functions)
+(defun edebug-unload-function ()
+ "Unload the Edebug source level debugger."
+ (when edebug-active
+ (setq edebug-active nil)
+ (unwind-protect
+ (abort-recursive-edit)
+ ;; We still want to run unload-feature to completion
+ (run-with-idle-timer 0 nil #'(lambda () (unload-feature 'edebug)))))
+ (remove-hook 'called-interactively-p-functions
+ 'edebug--called-interactively-skip)
+ (remove-hook 'cl-read-load-hooks 'edebug--require-cl-read)
+ (edebug-uninstall-read-eval-functions)
+ ;; continue standard unloading
+ nil)
+
(provide 'edebug)
;;; edebug.el ends here
diff --git a/lisp/emacs-lisp/eieio-base.el b/lisp/emacs-lisp/eieio-base.el
index 24d680181bb..c8ae3f4bf1a 100644
--- a/lisp/emacs-lisp/eieio-base.el
+++ b/lisp/emacs-lisp/eieio-base.el
@@ -65,19 +65,19 @@ SLOT-NAME is the offending slot. FN is the function signaling the error."
"Clone OBJ, initializing `:parent' to OBJ.
All slots are unbound, except those initialized with PARAMS."
(let ((nobj (make-vector (length obj) eieio-unbound))
- (nm (aref obj object-name))
+ (nm (eieio--object-name obj))
(passname (and params (stringp (car params))))
(num 1))
(aset nobj 0 'object)
- (aset nobj object-class (aref obj object-class))
+ (setf (eieio--object-class nobj) (eieio--object-class obj))
;; The following was copied from the default clone.
(if (not passname)
(save-match-data
(if (string-match "-\\([0-9]+\\)" nm)
(setq num (1+ (string-to-number (match-string 1 nm)))
nm (substring nm 0 (match-beginning 0))))
- (aset nobj object-name (concat nm "-" (int-to-string num))))
- (aset nobj object-name (car params)))
+ (setf (eieio--object-name nobj) (concat nm "-" (int-to-string num))))
+ (setf (eieio--object-name nobj) (car params)))
;; Now initialize from params.
(if params (shared-initialize nobj (if passname (cdr params) params)))
(oset nobj parent-instance obj)
@@ -232,8 +232,7 @@ for CLASS. Optional ALLOW-SUBCLASS says that it is ok for
being pedantic."
(unless class
(message "Unsafe call to `eieio-persistent-read'."))
- (when (and class (not (class-p class)))
- (signal 'wrong-type-argument (list 'class-p class)))
+ (when class (eieio--check-type class-p class))
(let ((ret nil)
(buffstr nil))
(unwind-protect
@@ -308,7 +307,7 @@ Second, any text properties will be stripped from strings."
(type nil)
(classtype nil))
(setq slot-idx (- slot-idx 3))
- (setq type (aref (aref (class-v class) class-public-type)
+ (setq type (aref (eieio--class-public-type (class-v class))
slot-idx))
(setq classtype (eieio-persistent-slot-type-is-class-p
@@ -482,14 +481,13 @@ Argument SLOT-NAME is the slot that was attempted to be accessed.
OPERATION is the type of access, such as `oref' or `oset'.
NEW-VALUE is the value that was being set into SLOT if OPERATION were
a set type."
- (if (or (eq slot-name 'object-name)
- (eq slot-name :object-name))
+ (if (memq slot-name '(object-name :object-name))
(cond ((eq operation 'oset)
(if (not (stringp new-value))
(signal 'invalid-slot-type
(list obj slot-name 'string new-value)))
- (object-set-name-string obj new-value))
- (t (object-name-string obj)))
+ (eieio-object-set-name-string obj new-value))
+ (t (eieio-object-name-string obj)))
(call-next-method)))
(provide 'eieio-base)
diff --git a/lisp/emacs-lisp/eieio-custom.el b/lisp/emacs-lisp/eieio-custom.el
index 46dc34d6d45..f9917bddd42 100644
--- a/lisp/emacs-lisp/eieio-custom.el
+++ b/lisp/emacs-lisp/eieio-custom.el
@@ -192,22 +192,22 @@ Optional argument IGNORE is an extraneous parameter."
(let* ((chil nil)
(obj (widget-get widget :value))
(master-group (widget-get widget :eieio-group))
- (cv (class-v (object-class-fast obj)))
- (slots (aref cv class-public-a))
- (flabel (aref cv class-public-custom-label))
- (fgroup (aref cv class-public-custom-group))
- (fdoc (aref cv class-public-doc))
- (fcust (aref cv class-public-custom)))
+ (cv (class-v (eieio--object-class obj)))
+ (slots (eieio--class-public-a cv))
+ (flabel (eieio--class-public-custom-label cv))
+ (fgroup (eieio--class-public-custom-group cv))
+ (fdoc (eieio--class-public-doc cv))
+ (fcust (eieio--class-public-custom cv)))
;; First line describes the object, but may not editable.
(if (widget-get widget :eieio-show-name)
(setq chil (cons (widget-create-child-and-convert
widget 'string :tag "Object "
:sample-face 'bold
- (object-name-string obj))
+ (eieio-object-name-string obj))
chil)))
;; Display information about the group being shown
(when master-group
- (let ((groups (class-option (object-class-fast obj) :custom-groups)))
+ (let ((groups (class-option (eieio--object-class obj) :custom-groups)))
(widget-insert "Groups:")
(while groups
(widget-insert " ")
@@ -260,7 +260,7 @@ Optional argument IGNORE is an extraneous parameter."
(let ((s (symbol-name
(or
(class-slot-initarg
- (object-class-fast obj)
+ (eieio--object-class obj)
(car slots))
(car slots)))))
(capitalize
@@ -287,17 +287,17 @@ Optional argument IGNORE is an extraneous parameter."
"Get the value of WIDGET."
(let* ((obj (widget-get widget :value))
(master-group eieio-cog)
- (cv (class-v (object-class-fast obj)))
- (fgroup (aref cv class-public-custom-group))
+ (cv (class-v (eieio--object-class obj)))
+ (fgroup (eieio--class-public-custom-group cv))
(wids (widget-get widget :children))
(name (if (widget-get widget :eieio-show-name)
(car (widget-apply (car wids) :value-inline))
nil))
(chil (if (widget-get widget :eieio-show-name)
(nthcdr 1 wids) wids))
- (cv (class-v (object-class-fast obj)))
- (slots (aref cv class-public-a))
- (fcust (aref cv class-public-custom)))
+ (cv (class-v (eieio--object-class obj)))
+ (slots (eieio--class-public-a cv))
+ (fcust (eieio--class-public-custom cv)))
;; If there are any prefix widgets, clear them.
;; -- None yet
;; Create a batch of initargs for each slot.
@@ -316,7 +316,7 @@ Optional argument IGNORE is an extraneous parameter."
fgroup (cdr fgroup)
fcust (cdr fcust)))
;; Set any name updates on it.
- (if name (aset obj object-name name))
+ (if name (setf (eieio--object-name obj) name))
;; This is the same object we had before.
obj))
@@ -354,7 +354,7 @@ These groups are specified with the `:group' slot flag."
(let* ((g (or group 'default)))
(switch-to-buffer (get-buffer-create
(concat "*CUSTOMIZE "
- (object-name obj) " "
+ (eieio-object-name obj) " "
(symbol-name g) "*")))
(setq buffer-read-only nil)
(kill-all-local-variables)
@@ -367,7 +367,7 @@ These groups are specified with the `:group' slot flag."
;; Add an apply reset option at the top of the buffer.
(eieio-custom-object-apply-reset obj)
(widget-insert "\n\n")
- (widget-insert "Edit object " (object-name obj) "\n\n")
+ (widget-insert "Edit object " (eieio-object-name obj) "\n\n")
;; Create the widget editing the object.
(make-local-variable 'eieio-wo)
(setq eieio-wo (eieio-custom-widget-insert obj :eieio-group g))
@@ -452,7 +452,7 @@ Must return the created widget."
(vector (concat "Group " (symbol-name group))
(list 'customize-object obj (list 'quote group))
t))
- (class-option (object-class-fast obj) :custom-groups)))
+ (class-option (eieio--object-class obj) :custom-groups)))
(defvar eieio-read-custom-group-history nil
"History for the custom group reader.")
@@ -460,7 +460,7 @@ Must return the created widget."
(defmethod eieio-read-customization-group ((obj eieio-default-superclass))
"Do a completing read on the name of a customization group in OBJ.
Return the symbol for the group, or nil"
- (let ((g (class-option (object-class-fast obj) :custom-groups)))
+ (let ((g (class-option (eieio--object-class obj) :custom-groups)))
(if (= (length g) 1)
(car g)
;; Make the association list
diff --git a/lisp/emacs-lisp/eieio-datadebug.el b/lisp/emacs-lisp/eieio-datadebug.el
index e23bbb07fe2..d3ae8b191e1 100644
--- a/lisp/emacs-lisp/eieio-datadebug.el
+++ b/lisp/emacs-lisp/eieio-datadebug.el
@@ -58,9 +58,9 @@ PREBUTTONTEXT is some text between PREFIX and the object button."
(end nil)
(str (object-print object))
(tip (format "Object %s\nClass: %S\nParent(s): %S\n%d slots"
- (object-name-string object)
- (object-class object)
- (class-parents (object-class object))
+ (eieio-object-name-string object)
+ (eieio-object-class object)
+ (eieio-class-parents (eieio-object-class object))
(length (object-slots object))
))
)
@@ -80,38 +80,39 @@ PREBUTTONTEXT is some text between PREFIX and the object button."
;; Each object should have an opportunity to show stuff about itself.
(defmethod data-debug/eieio-insert-slots ((obj eieio-default-superclass)
- prefix)
+ prefix)
"Insert the slots of OBJ into the current DDEBUG buffer."
- (data-debug-insert-thing (object-name-string obj)
- prefix
- "Name: ")
- (let* ((cl (object-class obj))
- (cv (class-v cl)))
- (data-debug-insert-thing (class-constructor cl)
- prefix
- "Class: ")
- ;; Loop over all the public slots
- (let ((publa (aref cv class-public-a))
- )
- (while publa
- (if (slot-boundp obj (car publa))
- (let* ((i (class-slot-initarg cl (car publa)))
- (v (eieio-oref obj (car publa))))
- (data-debug-insert-thing
- v prefix (concat
- (if i (symbol-name i)
- (symbol-name (car publa)))
- " ")))
- ;; Unbound case
- (let ((i (class-slot-initarg cl (car publa))))
- (data-debug-insert-custom
- "#unbound" prefix
- (concat (if i (symbol-name i)
- (symbol-name (car publa)))
- " ")
- 'font-lock-keyword-face))
- )
- (setq publa (cdr publa))))))
+ (let ((inhibit-read-only t))
+ (data-debug-insert-thing (eieio-object-name-string obj)
+ prefix
+ "Name: ")
+ (let* ((cl (eieio-object-class obj))
+ (cv (class-v cl)))
+ (data-debug-insert-thing (class-constructor cl)
+ prefix
+ "Class: ")
+ ;; Loop over all the public slots
+ (let ((publa (eieio--class-public-a cv))
+ )
+ (while publa
+ (if (slot-boundp obj (car publa))
+ (let* ((i (class-slot-initarg cl (car publa)))
+ (v (eieio-oref obj (car publa))))
+ (data-debug-insert-thing
+ v prefix (concat
+ (if i (symbol-name i)
+ (symbol-name (car publa)))
+ " ")))
+ ;; Unbound case
+ (let ((i (class-slot-initarg cl (car publa))))
+ (data-debug-insert-custom
+ "#unbound" prefix
+ (concat (if i (symbol-name i)
+ (symbol-name (car publa)))
+ " ")
+ 'font-lock-keyword-face))
+ )
+ (setq publa (cdr publa)))))))
;;; Augment the Data debug thing display list.
(data-debug-add-specialized-thing (lambda (thing) (object-p thing))
@@ -123,7 +124,7 @@ PREBUTTONTEXT is some text between PREFIX and the object button."
;;
(defmethod data-debug-show ((obj eieio-default-superclass))
"Run ddebug against any EIEIO object OBJ."
- (data-debug-new-buffer (format "*%s DDEBUG*" (object-name obj)))
+ (data-debug-new-buffer (format "*%s DDEBUG*" (eieio-object-name obj)))
(data-debug-insert-object-slots obj "]"))
;;; DEBUG FUNCTIONS
diff --git a/lisp/emacs-lisp/eieio-opt.el b/lisp/emacs-lisp/eieio-opt.el
index 8867d88cc3a..29ad980991b 100644
--- a/lisp/emacs-lisp/eieio-opt.el
+++ b/lisp/emacs-lisp/eieio-opt.el
@@ -45,7 +45,7 @@ variable `eieio-default-superclass'."
nil t)))
nil))
(if (not root-class) (setq root-class 'eieio-default-superclass))
- (if (not (class-p root-class)) (signal 'wrong-type-argument (list 'class-p root-class)))
+ (eieio--check-type class-p root-class)
(display-buffer (get-buffer-create "*EIEIO OBJECT BROWSE*") t)
(with-current-buffer (get-buffer "*EIEIO OBJECT BROWSE*")
(erase-buffer)
@@ -58,9 +58,9 @@ variable `eieio-default-superclass'."
Argument THIS-ROOT is the local root of the tree.
Argument PREFIX is the character prefix to use.
Argument CH-PREFIX is another character prefix to display."
- (if (not (class-p (eval this-root))) (signal 'wrong-type-argument (list 'class-p this-root)))
+ (eieio--check-type class-p this-root)
(let ((myname (symbol-name this-root))
- (chl (aref (class-v this-root) class-children))
+ (chl (eieio--class-children (class-v this-root)))
(fprefix (concat ch-prefix " +--"))
(mprefix (concat ch-prefix " | "))
(lprefix (concat ch-prefix " ")))
@@ -99,7 +99,7 @@ Optional HEADERFCN should be called to insert a few bits of info first."
(princ "'"))
(terpri)
;; Inheritance tree information
- (let ((pl (class-parents class)))
+ (let ((pl (eieio-class-parents class)))
(when pl
(princ " Inherits from ")
(while pl
@@ -107,7 +107,7 @@ Optional HEADERFCN should be called to insert a few bits of info first."
(setq pl (cdr pl))
(if pl (princ ", ")))
(terpri)))
- (let ((ch (class-children class)))
+ (let ((ch (eieio-class-children class)))
(when ch
(princ " Children ")
(while ch
@@ -177,13 +177,13 @@ Optional HEADERFCN should be called to insert a few bits of info first."
"Describe the slots in CLASS.
Outputs to the standard output."
(let* ((cv (class-v class))
- (docs (aref cv class-public-doc))
- (names (aref cv class-public-a))
- (deflt (aref cv class-public-d))
- (types (aref cv class-public-type))
- (publp (aref cv class-public-printer))
+ (docs (eieio--class-public-doc cv))
+ (names (eieio--class-public-a cv))
+ (deflt (eieio--class-public-d cv))
+ (types (eieio--class-public-type cv))
+ (publp (eieio--class-public-printer cv))
(i 0)
- (prot (aref cv class-protection))
+ (prot (eieio--class-protection cv))
)
(princ "Instance Allocated Slots:")
(terpri)
@@ -213,11 +213,11 @@ Outputs to the standard output."
publp (cdr publp)
prot (cdr prot)
i (1+ i)))
- (setq docs (aref cv class-class-allocation-doc)
- names (aref cv class-class-allocation-a)
- types (aref cv class-class-allocation-type)
+ (setq docs (eieio--class-class-allocation-doc cv)
+ names (eieio--class-class-allocation-a cv)
+ types (eieio--class-class-allocation-type cv)
i 0
- prot (aref cv class-class-allocation-protection))
+ prot (eieio--class-class-allocation-protection cv))
(when names
(terpri)
(princ "Class Allocated Slots:"))
@@ -281,7 +281,7 @@ Uses `eieio-describe-class' to describe the class being constructed."
(mapcar
(lambda (c)
(append (list c) (eieio-build-class-list c)))
- (class-children-fast class)))
+ (eieio-class-children-fast class)))
(list class)))
(defun eieio-build-class-alist (&optional class instantiable-only buildlist)
@@ -291,7 +291,7 @@ If INSTANTIABLE-ONLY is non nil, only allow names of classes which
are not abstract, otherwise allow all classes.
Optional argument BUILDLIST is more list to attach and is used internally."
(let* ((cc (or class eieio-default-superclass))
- (sublst (aref (class-v cc) class-children)))
+ (sublst (eieio--class-children (class-v cc))))
(unless (assoc (symbol-name cc) buildlist)
(when (or (not instantiable-only) (not (class-abstract-p cc)))
(setq buildlist (cons (cons (symbol-name cc) 1) buildlist))))
@@ -335,8 +335,7 @@ are not abstract."
"Describe the generic function GENERIC.
Also extracts information about all methods specific to this generic."
(interactive (list (eieio-read-generic "Generic Method: ")))
- (if (not (generic-p generic))
- (signal 'wrong-type-argument '(generic-p generic)))
+ (eieio--check-type generic-p generic)
(with-output-to-temp-buffer (help-buffer) ; "*Help*"
(help-setup-xref (list #'eieio-describe-generic generic)
(called-interactively-p 'interactive))
@@ -757,9 +756,8 @@ current expansion depth."
(defun eieio-class-button (class depth)
"Draw a speedbar button at the current point for CLASS at DEPTH."
- (if (not (class-p class))
- (signal 'wrong-type-argument (list 'class-p class)))
- (let ((subclasses (aref (class-v class) class-children)))
+ (eieio--check-type class-p class)
+ (let ((subclasses (eieio--class-children (class-v class))))
(if subclasses
(speedbar-make-tag-line 'angle ?+
'eieio-sb-expand
@@ -784,7 +782,7 @@ Argument INDENT is the depth of indentation."
(speedbar-with-writable
(save-excursion
(end-of-line) (forward-char 1)
- (let ((subclasses (aref (class-v class) class-children)))
+ (let ((subclasses (eieio--class-children (class-v class))))
(while subclasses
(eieio-class-button (car subclasses) (1+ indent))
(setq subclasses (cdr subclasses)))))))
diff --git a/lisp/emacs-lisp/eieio-speedbar.el b/lisp/emacs-lisp/eieio-speedbar.el
index 27c7d01f3b8..c230226eae4 100644
--- a/lisp/emacs-lisp/eieio-speedbar.el
+++ b/lisp/emacs-lisp/eieio-speedbar.el
@@ -198,7 +198,7 @@ that path."
(defmethod eieio-speedbar-description (object)
"Return a string describing OBJECT."
- (object-name-string object))
+ (eieio-object-name-string object))
(defmethod eieio-speedbar-derive-line-path (object)
"Return the path which OBJECT has something to do with."
@@ -206,7 +206,7 @@ that path."
(defmethod eieio-speedbar-object-buttonname (object)
"Return a string to use as a speedbar button for OBJECT."
- (object-name-string object))
+ (eieio-object-name-string object))
(defmethod eieio-speedbar-make-tag-line (object depth)
"Insert a tag line into speedbar at point for OBJECT.
@@ -324,7 +324,7 @@ Argument DEPTH is the depth at which the tag line is inserted."
(defmethod eieio-speedbar-child-make-tag-lines ((object eieio-speedbar) depth)
"Base method for creating tag lines for non-object children."
(error "You must implement `eieio-speedbar-child-make-tag-lines' for %s"
- (object-name object)))
+ (eieio-object-name object)))
(defmethod eieio-speedbar-expand ((object eieio-speedbar) depth)
"Expand OBJECT at indentation DEPTH.
@@ -365,7 +365,7 @@ TOKEN is the object. INDENT is the current indentation level."
(defmethod eieio-speedbar-child-description ((obj eieio-speedbar))
"Return a description for a child of OBJ which is not an object."
(error "You must implement `eieio-speedbar-child-description' for %s"
- (object-name obj)))
+ (eieio-object-name obj)))
(defun eieio-speedbar-item-info ()
"Display info for the current line when in EDE display mode."
diff --git a/lisp/emacs-lisp/eieio.el b/lisp/emacs-lisp/eieio.el
index f112de13253..37b1ec5fa94 100644
--- a/lisp/emacs-lisp/eieio.el
+++ b/lisp/emacs-lisp/eieio.el
@@ -105,49 +105,67 @@ default setting for optimization purposes.")
;; This is a bootstrap for eieio-default-superclass so it has a value
;; while it is being built itself.
-(defvar eieio-default-superclass nil)
-
-;; FIXME: The constants below should have an `eieio-' prefix added!!
-(defconst class-symbol 1 "Class's symbol (self-referencing.).")
-(defconst class-parent 2 "Class parent slot.")
-(defconst class-children 3 "Class children class slot.")
-(defconst class-symbol-obarray 4 "Obarray permitting fast access to variable position indexes.")
-;; @todo
-;; the word "public" here is leftovers from the very first version.
-;; Get rid of it!
-(defconst class-public-a 5 "Class attribute index.")
-(defconst class-public-d 6 "Class attribute defaults index.")
-(defconst class-public-doc 7 "Class documentation strings for attributes.")
-(defconst class-public-type 8 "Class type for a slot.")
-(defconst class-public-custom 9 "Class custom type for a slot.")
-(defconst class-public-custom-label 10 "Class custom group for a slot.")
-(defconst class-public-custom-group 11 "Class custom group for a slot.")
-(defconst class-public-printer 12 "Printer for a slot.")
-(defconst class-protection 13 "Class protection for a slot.")
-(defconst class-initarg-tuples 14 "Class initarg tuples list.")
-(defconst class-class-allocation-a 15 "Class allocated attributes.")
-(defconst class-class-allocation-doc 16 "Class allocated documentation.")
-(defconst class-class-allocation-type 17 "Class allocated value type.")
-(defconst class-class-allocation-custom 18 "Class allocated custom descriptor.")
-(defconst class-class-allocation-custom-label 19 "Class allocated custom descriptor.")
-(defconst class-class-allocation-custom-group 20 "Class allocated custom group.")
-(defconst class-class-allocation-printer 21 "Class allocated printer for a slot.")
-(defconst class-class-allocation-protection 22 "Class allocated protection list.")
-(defconst class-class-allocation-values 23 "Class allocated value vector.")
-(defconst class-default-object-cache 24
- "Cache index of what a newly created object would look like.
+(defvar eieio-default-superclass nil))
+
+(defmacro eieio--define-field-accessors (prefix fields)
+ (declare (indent 1))
+ (let ((index 0)
+ (defs '()))
+ (dolist (field fields)
+ (let ((doc (if (listp field)
+ (prog1 (cadr field) (setq field (car field))))))
+ (push `(defmacro ,(intern (format "eieio--%s-%s" prefix field)) (x)
+ ,@(if doc (list (format (if (string-match "\n" doc)
+ "Return %s" "Return %s of a %s.")
+ doc prefix)))
+ (list 'aref x ,index))
+ defs)
+ (setq index (1+ index))))
+ `(eval-and-compile
+ ,@(nreverse defs)
+ (defconst ,(intern (format "eieio--%s-num-slots" prefix)) ,index))))
+
+(eieio--define-field-accessors class
+ (-unused-0 ;;FIXME: not sure, but at least there was no accessor!
+ (symbol "symbol (self-referencing)")
+ parent children
+ (symbol-obarray "obarray permitting fast access to variable position indexes")
+ ;; @todo
+ ;; the word "public" here is leftovers from the very first version.
+ ;; Get rid of it!
+ (public-a "class attribute index")
+ (public-d "class attribute defaults index")
+ (public-doc "class documentation strings for attributes")
+ (public-type "class type for a slot")
+ (public-custom "class custom type for a slot")
+ (public-custom-label "class custom group for a slot")
+ (public-custom-group "class custom group for a slot")
+ (public-printer "printer for a slot")
+ (protection "protection for a slot")
+ (initarg-tuples "initarg tuples list")
+ (class-allocation-a "class allocated attributes")
+ (class-allocation-doc "class allocated documentation")
+ (class-allocation-type "class allocated value type")
+ (class-allocation-custom "class allocated custom descriptor")
+ (class-allocation-custom-label "class allocated custom descriptor")
+ (class-allocation-custom-group "class allocated custom group")
+ (class-allocation-printer "class allocated printer for a slot")
+ (class-allocation-protection "class allocated protection list")
+ (class-allocation-values "class allocated value vector")
+ (default-object-cache "what a newly created object would look like.
This will speed up instantiation time as only a `copy-sequence' will
be needed, instead of looping over all the values and setting them
from the default.")
-(defconst class-options 25
- "Storage location of tagged class options.
-Stored outright without modifications or stripping.")
+ (options "storage location of tagged class options.
+Stored outright without modifications or stripping.")))
-(defconst class-num-slots 26
- "Number of slots in the class definition object.")
+(eieio--define-field-accessors object
+ (-unused-0 ;;FIXME: not sure, but at least there was no accessor!
+ (class "class struct defining OBJ")
+ name))
-(defconst object-class 1 "Index in an object vector where the class is stored.")
-(defconst object-name 2 "Index in an object where the name is stored.")
+(eval-and-compile
+;; FIXME: The constants below should have an `eieio-' prefix added!!
(defconst method-static 0 "Index into :static tag on a method.")
(defconst method-before 1 "Index into :before tag on a method.")
@@ -188,13 +206,13 @@ CLASS is a symbol."
`(condition-case nil
(let ((tobj ,obj))
(and (eq (aref tobj 0) 'object)
- (class-p (aref tobj object-class))))
+ (class-p (eieio--object-class tobj))))
(error nil)))
(defalias 'object-p 'eieio-object-p)
(defmacro class-constructor (class)
"Return the symbol representing the constructor of CLASS."
- `(aref (class-v ,class) class-symbol))
+ `(eieio--class-symbol (class-v ,class)))
(defmacro generic-p (method)
"Return t if symbol METHOD is a generic function.
@@ -241,7 +259,7 @@ Methods with only primary implementations are executed in an optimized way."
(defmacro class-option (class option)
"Return the value stored for CLASS' OPTION.
Return nil if that option doesn't exist."
- `(class-option-assoc (aref (class-v ,class) class-options) ',option))
+ `(class-option-assoc (eieio--class-options (class-v ,class)) ',option))
(defmacro class-abstract-p (class)
"Return non-nil if CLASS is abstract.
@@ -334,14 +352,14 @@ It creates an autoload function for CNAME's constructor."
;; Assume we've already debugged inputs.
(let* ((oldc (when (class-p cname) (class-v cname)))
- (newc (make-vector class-num-slots nil))
+ (newc (make-vector eieio--class-num-slots nil))
)
(if oldc
nil ;; Do nothing if we already have this class.
;; Create the class in NEWC, but don't fill anything else in.
(aset newc 0 'defclass)
- (aset newc class-symbol cname)
+ (setf (eieio--class-symbol newc) cname)
(let ((clear-parent nil))
;; No parents?
@@ -371,12 +389,12 @@ It creates an autoload function for CNAME's constructor."
)
;; We have a parent, save the child in there.
- (when (not (member cname (aref (class-v SC) class-children)))
- (aset (class-v SC) class-children
- (cons cname (aref (class-v SC) class-children)))))
+ (when (not (member cname (eieio--class-children (class-v SC))))
+ (setf (eieio--class-children (class-v SC))
+ (cons cname (eieio--class-children (class-v SC))))))
;; save parent in child
- (aset newc class-parent (cons SC (aref newc class-parent)))
+ (setf (eieio--class-parent newc) (cons SC (eieio--class-parent newc)))
)
;; turn this into a usable self-pointing symbol
@@ -389,7 +407,7 @@ It creates an autoload function for CNAME's constructor."
(put cname 'eieio-class-definition newc)
;; Clear the parent
- (if clear-parent (aset newc class-parent nil))
+ (if clear-parent (setf (eieio--class-parent newc) nil))
;; Create an autoload on top of our constructor function.
(autoload cname filename doc nil nil)
@@ -404,6 +422,15 @@ It creates an autoload function for CNAME's constructor."
(when (eq (car-safe (symbol-function cname)) 'autoload)
(load-library (car (cdr (symbol-function cname))))))
+(defmacro eieio--check-type (type obj)
+ (unless (symbolp obj)
+ (error "eieio--check-type wants OBJ to be a variable"))
+ `(if (not ,(cond
+ ((eq 'or (car-safe type))
+ `(or ,@(mapcar (lambda (type) `(,type ,obj)) (cdr type))))
+ (t `(,type ,obj))))
+ (signal 'wrong-type-argument (list ',type ,obj))))
+
(defun eieio-defclass (cname superclasses slots options-and-doc)
;; FIXME: Most of this should be moved to the `defclass' macro.
"Define CNAME as a new subclass of SUPERCLASSES.
@@ -416,18 +443,17 @@ See `defclass' for more information."
(run-hooks 'eieio-hook)
(setq eieio-hook nil)
- (if (not (listp superclasses))
- (signal 'wrong-type-argument '(listp superclasses)))
+ (eieio--check-type listp superclasses)
(let* ((pname superclasses)
- (newc (make-vector class-num-slots nil))
+ (newc (make-vector eieio--class-num-slots nil))
(oldc (when (class-p cname) (class-v cname)))
(groups nil) ;; list of groups id'd from slots
(options nil)
(clearparent nil))
(aset newc 0 'defclass)
- (aset newc class-symbol cname)
+ (setf (eieio--class-symbol newc) cname)
;; If this class already existed, and we are updating its structure,
;; make sure we keep the old child list. This can cause bugs, but
@@ -435,13 +461,13 @@ See `defclass' for more information."
;; method table breakage, particularly when the users is only
;; byte compiling an EIEIO file.
(if oldc
- (aset newc class-children (aref oldc class-children))
+ (setf (eieio--class-children newc) (eieio--class-children oldc))
;; If the old class did not exist, but did exist in the autoload map, then adopt those children.
;; This is like the above, but deals with autoloads nicely.
(let ((sym (intern-soft (symbol-name cname) eieio-defclass-autoload-map)))
(when sym
(condition-case nil
- (aset newc class-children (symbol-value sym))
+ (setf (eieio--class-children newc) (symbol-value sym))
(error nil))
(unintern (symbol-name cname) eieio-defclass-autoload-map)
))
@@ -469,30 +495,30 @@ See `defclass' for more information."
(error "Given parent class %s is not a class" (car pname))
;; good parent class...
;; save new child in parent
- (when (not (member cname (aref (class-v (car pname)) class-children)))
- (aset (class-v (car pname)) class-children
- (cons cname (aref (class-v (car pname)) class-children))))
+ (when (not (member cname (eieio--class-children (class-v (car pname)))))
+ (setf (eieio--class-children (class-v (car pname)))
+ (cons cname (eieio--class-children (class-v (car pname))))))
;; Get custom groups, and store them into our local copy.
(mapc (lambda (g) (add-to-list 'groups g))
(class-option (car pname) :custom-groups))
;; save parent in child
- (aset newc class-parent (cons (car pname) (aref newc class-parent))))
+ (setf (eieio--class-parent newc) (cons (car pname) (eieio--class-parent newc))))
(error "Invalid parent class %s" pname))
(setq pname (cdr pname)))
;; Reverse the list of our parents so that they are prioritized in
;; the same order as specified in the code.
- (aset newc class-parent (nreverse (aref newc class-parent))) )
+ (setf (eieio--class-parent newc) (nreverse (eieio--class-parent newc))) )
;; If there is nothing to loop over, then inherit from the
;; default superclass.
(unless (eq cname 'eieio-default-superclass)
;; adopt the default parent here, but clear it later...
(setq clearparent t)
;; save new child in parent
- (if (not (member cname (aref (class-v 'eieio-default-superclass) class-children)))
- (aset (class-v 'eieio-default-superclass) class-children
- (cons cname (aref (class-v 'eieio-default-superclass) class-children))))
+ (if (not (member cname (eieio--class-children (class-v 'eieio-default-superclass))))
+ (setf (eieio--class-children (class-v 'eieio-default-superclass))
+ (cons cname (eieio--class-children (class-v 'eieio-default-superclass)))))
;; save parent in child
- (aset newc class-parent (list eieio-default-superclass))))
+ (setf (eieio--class-parent newc) (list eieio-default-superclass))))
;; turn this into a usable self-pointing symbol
(set cname cname)
@@ -714,26 +740,26 @@ See `defclass' for more information."
;; Now that everything has been loaded up, all our lists are backwards!
;; Fix that up now.
- (aset newc class-public-a (nreverse (aref newc class-public-a)))
- (aset newc class-public-d (nreverse (aref newc class-public-d)))
- (aset newc class-public-doc (nreverse (aref newc class-public-doc)))
- (aset newc class-public-type
- (apply 'vector (nreverse (aref newc class-public-type))))
- (aset newc class-public-custom (nreverse (aref newc class-public-custom)))
- (aset newc class-public-custom-label (nreverse (aref newc class-public-custom-label)))
- (aset newc class-public-custom-group (nreverse (aref newc class-public-custom-group)))
- (aset newc class-public-printer (nreverse (aref newc class-public-printer)))
- (aset newc class-protection (nreverse (aref newc class-protection)))
- (aset newc class-initarg-tuples (nreverse (aref newc class-initarg-tuples)))
+ (setf (eieio--class-public-a newc) (nreverse (eieio--class-public-a newc)))
+ (setf (eieio--class-public-d newc) (nreverse (eieio--class-public-d newc)))
+ (setf (eieio--class-public-doc newc) (nreverse (eieio--class-public-doc newc)))
+ (setf (eieio--class-public-type newc)
+ (apply 'vector (nreverse (eieio--class-public-type newc))))
+ (setf (eieio--class-public-custom newc) (nreverse (eieio--class-public-custom newc)))
+ (setf (eieio--class-public-custom-label newc) (nreverse (eieio--class-public-custom-label newc)))
+ (setf (eieio--class-public-custom-group newc) (nreverse (eieio--class-public-custom-group newc)))
+ (setf (eieio--class-public-printer newc) (nreverse (eieio--class-public-printer newc)))
+ (setf (eieio--class-protection newc) (nreverse (eieio--class-protection newc)))
+ (setf (eieio--class-initarg-tuples newc) (nreverse (eieio--class-initarg-tuples newc)))
;; The storage for class-class-allocation-type needs to be turned into
;; a vector now.
- (aset newc class-class-allocation-type
- (apply 'vector (aref newc class-class-allocation-type)))
+ (setf (eieio--class-class-allocation-type newc)
+ (apply 'vector (eieio--class-class-allocation-type newc)))
;; Also, take class allocated values, and vectorize them for speed.
- (aset newc class-class-allocation-values
- (apply 'vector (aref newc class-class-allocation-values)))
+ (setf (eieio--class-class-allocation-values newc)
+ (apply 'vector (eieio--class-class-allocation-values newc)))
;; Attach slot symbols into an obarray, and store the index of
;; this slot as the variable slot in this new symbol. We need to
@@ -741,8 +767,8 @@ See `defclass' for more information."
;; prime number length, and we also need to make our vector small
;; to save space, and also optimal for the number of items we have.
(let* ((cnt 0)
- (pubsyms (aref newc class-public-a))
- (prots (aref newc class-protection))
+ (pubsyms (eieio--class-public-a newc))
+ (prots (eieio--class-protection newc))
(l (length pubsyms))
(vl (let ((primes '( 3 5 7 11 13 17 19 23 29 31 37 41 43 47
53 59 61 67 71 73 79 83 89 97 101 )))
@@ -758,7 +784,7 @@ See `defclass' for more information."
(if (car prots) (put newsym 'protection (car prots)))
(setq pubsyms (cdr pubsyms)
prots (cdr prots)))
- (aset newc class-symbol-obarray oa)
+ (setf (eieio--class-symbol-obarray newc) oa)
)
;; Create the constructor function
@@ -790,7 +816,7 @@ See `defclass' for more information."
buffer-file-name))
loc)
(when fname
- (when (string-match "\\.elc$" fname)
+ (when (string-match "\\.elc\\'" fname)
(setq fname (substring fname 0 (1- (length fname)))))
(put cname 'class-location fname)))
@@ -802,23 +828,23 @@ See `defclass' for more information."
(setq options (cons :custom-groups (cons g options)))))
;; Set up the options we have collected.
- (aset newc class-options options)
+ (setf (eieio--class-options newc) options)
;; if this is a superclass, clear out parent (which was set to the
;; default superclass eieio-default-superclass)
- (if clearparent (aset newc class-parent nil))
+ (if clearparent (setf (eieio--class-parent newc) nil))
;; Create the cached default object.
- (let ((cache (make-vector (+ (length (aref newc class-public-a))
- 3) nil)))
+ (let ((cache (make-vector (+ (length (eieio--class-public-a newc)) 3)
+ nil)))
(aset cache 0 'object)
- (aset cache object-class cname)
- (aset cache object-name 'default-cache-object)
+ (setf (eieio--object-class cache) cname)
+ (setf (eieio--object-name cache) 'default-cache-object)
(let ((eieio-skip-typecheck t))
;; All type-checking has been done to our satisfaction
;; before this call. Don't waste our time in this call..
(eieio-set-defaults cache t))
- (aset newc class-default-object-cache cache))
+ (setf (eieio--class-default-object-cache newc) cache))
;; Return our new class object
;; newc
@@ -855,7 +881,7 @@ if default value is nil."
;; To prevent override information w/out specification of storage,
;; we need to do this little hack.
- (if (member a (aref newc class-class-allocation-a)) (setq alloc ':class))
+ (if (member a (eieio--class-class-allocation-a newc)) (setq alloc ':class))
(if (or (not alloc) (and (symbolp alloc) (eq alloc ':instance)))
;; In this case, we modify the INSTANCE version of a given slot.
@@ -863,31 +889,31 @@ if default value is nil."
(progn
;; Only add this element if it is so-far unique
- (if (not (member a (aref newc class-public-a)))
+ (if (not (member a (eieio--class-public-a newc)))
(progn
(eieio-perform-slot-validation-for-default a type d skipnil)
- (aset newc class-public-a (cons a (aref newc class-public-a)))
- (aset newc class-public-d (cons d (aref newc class-public-d)))
- (aset newc class-public-doc (cons doc (aref newc class-public-doc)))
- (aset newc class-public-type (cons type (aref newc class-public-type)))
- (aset newc class-public-custom (cons cust (aref newc class-public-custom)))
- (aset newc class-public-custom-label (cons label (aref newc class-public-custom-label)))
- (aset newc class-public-custom-group (cons custg (aref newc class-public-custom-group)))
- (aset newc class-public-printer (cons print (aref newc class-public-printer)))
- (aset newc class-protection (cons prot (aref newc class-protection)))
- (aset newc class-initarg-tuples (cons (cons init a) (aref newc class-initarg-tuples)))
+ (setf (eieio--class-public-a newc) (cons a (eieio--class-public-a newc)))
+ (setf (eieio--class-public-d newc) (cons d (eieio--class-public-d newc)))
+ (setf (eieio--class-public-doc newc) (cons doc (eieio--class-public-doc newc)))
+ (setf (eieio--class-public-type newc) (cons type (eieio--class-public-type newc)))
+ (setf (eieio--class-public-custom newc) (cons cust (eieio--class-public-custom newc)))
+ (setf (eieio--class-public-custom-label newc) (cons label (eieio--class-public-custom-label newc)))
+ (setf (eieio--class-public-custom-group newc) (cons custg (eieio--class-public-custom-group newc)))
+ (setf (eieio--class-public-printer newc) (cons print (eieio--class-public-printer newc)))
+ (setf (eieio--class-protection newc) (cons prot (eieio--class-protection newc)))
+ (setf (eieio--class-initarg-tuples newc) (cons (cons init a) (eieio--class-initarg-tuples newc)))
)
;; When defaultoverride is true, we are usually adding new local
;; attributes which must override the default value of any slot
;; passed in by one of the parent classes.
(when defaultoverride
;; There is a match, and we must override the old value.
- (let* ((ca (aref newc class-public-a))
+ (let* ((ca (eieio--class-public-a newc))
(np (member a ca))
(num (- (length ca) (length np)))
- (dp (if np (nthcdr num (aref newc class-public-d))
+ (dp (if np (nthcdr num (eieio--class-public-d newc))
nil))
- (tp (if np (nth num (aref newc class-public-type))))
+ (tp (if np (nth num (eieio--class-public-type newc))))
)
(if (not np)
(error "EIEIO internal error overriding default value for %s"
@@ -904,7 +930,7 @@ if default value is nil."
(setcar dp d))
;; If we have a new initarg, check for it.
(when init
- (let* ((inits (aref newc class-initarg-tuples))
+ (let* ((inits (eieio--class-initarg-tuples newc))
(inita (rassq a inits)))
;; Replace the CAR of the associate INITA.
;;(message "Initarg: %S replace %s" inita init)
@@ -920,7 +946,7 @@ if default value is nil."
;; EML - We used to have (if prot... here,
;; but a prot of 'nil means public.
;;
- (let ((super-prot (nth num (aref newc class-protection)))
+ (let ((super-prot (nth num (eieio--class-protection newc)))
)
(if (not (eq prot super-prot))
(error "Child slot protection `%s' does not match inherited protection `%s' for `%s'"
@@ -932,7 +958,7 @@ if default value is nil."
;; groups and new ones.
(when custg
(let* ((groups
- (nthcdr num (aref newc class-public-custom-group)))
+ (nthcdr num (eieio--class-public-custom-group newc)))
(list1 (car groups))
(list2 (if (listp custg) custg (list custg))))
(if (< (length list1) (length list2))
@@ -947,20 +973,20 @@ if default value is nil."
;; set, simply replaces the old one.
(when cust
;; (message "Custom type redefined to %s" cust)
- (setcar (nthcdr num (aref newc class-public-custom)) cust))
+ (setcar (nthcdr num (eieio--class-public-custom newc)) cust))
;; If a new label is specified, it simply replaces
;; the old one.
(when label
;; (message "Custom label redefined to %s" label)
- (setcar (nthcdr num (aref newc class-public-custom-label)) label))
+ (setcar (nthcdr num (eieio--class-public-custom-label newc)) label))
;; End PLN
;; PLN Sat Jun 30 17:24:42 2007 : when a new
;; doc is specified, simply replaces the old one.
(when doc
;;(message "Documentation redefined to %s" doc)
- (setcar (nthcdr num (aref newc class-public-doc))
+ (setcar (nthcdr num (eieio--class-public-doc newc))
doc))
;; End PLN
@@ -968,38 +994,38 @@ if default value is nil."
;; the old one.
(when print
;; (message "printer redefined to %s" print)
- (setcar (nthcdr num (aref newc class-public-printer)) print))
+ (setcar (nthcdr num (eieio--class-public-printer newc)) print))
)))
))
;; CLASS ALLOCATED SLOTS
(let ((value (eieio-default-eval-maybe d)))
- (if (not (member a (aref newc class-class-allocation-a)))
+ (if (not (member a (eieio--class-class-allocation-a newc)))
(progn
(eieio-perform-slot-validation-for-default a type value skipnil)
;; Here we have found a :class version of a slot. This
;; requires a very different approach.
- (aset newc class-class-allocation-a (cons a (aref newc class-class-allocation-a)))
- (aset newc class-class-allocation-doc (cons doc (aref newc class-class-allocation-doc)))
- (aset newc class-class-allocation-type (cons type (aref newc class-class-allocation-type)))
- (aset newc class-class-allocation-custom (cons cust (aref newc class-class-allocation-custom)))
- (aset newc class-class-allocation-custom-label (cons label (aref newc class-class-allocation-custom-label)))
- (aset newc class-class-allocation-custom-group (cons custg (aref newc class-class-allocation-custom-group)))
- (aset newc class-class-allocation-protection (cons prot (aref newc class-class-allocation-protection)))
+ (setf (eieio--class-class-allocation-a newc) (cons a (eieio--class-class-allocation-a newc)))
+ (setf (eieio--class-class-allocation-doc newc) (cons doc (eieio--class-class-allocation-doc newc)))
+ (setf (eieio--class-class-allocation-type newc) (cons type (eieio--class-class-allocation-type newc)))
+ (setf (eieio--class-class-allocation-custom newc) (cons cust (eieio--class-class-allocation-custom newc)))
+ (setf (eieio--class-class-allocation-custom-label newc) (cons label (eieio--class-class-allocation-custom-label newc)))
+ (setf (eieio--class-class-allocation-custom-group newc) (cons custg (eieio--class-class-allocation-custom-group newc)))
+ (setf (eieio--class-class-allocation-protection newc) (cons prot (eieio--class-class-allocation-protection newc)))
;; Default value is stored in the 'values section, since new objects
;; can't initialize from this element.
- (aset newc class-class-allocation-values (cons value (aref newc class-class-allocation-values))))
+ (setf (eieio--class-class-allocation-values newc) (cons value (eieio--class-class-allocation-values newc))))
(when defaultoverride
;; There is a match, and we must override the old value.
- (let* ((ca (aref newc class-class-allocation-a))
+ (let* ((ca (eieio--class-class-allocation-a newc))
(np (member a ca))
(num (- (length ca) (length np)))
(dp (if np
(nthcdr num
- (aref newc class-class-allocation-values))
+ (eieio--class-class-allocation-values newc))
nil))
- (tp (if np (nth num (aref newc class-class-allocation-type))
+ (tp (if np (nth num (eieio--class-class-allocation-type newc))
nil)))
(if (not np)
(error "EIEIO internal error overriding default value for %s"
@@ -1023,7 +1049,7 @@ if default value is nil."
;; I wonder if a more flexible schedule might be
;; implemented.
(let ((super-prot
- (car (nthcdr num (aref newc class-class-allocation-protection)))))
+ (car (nthcdr num (eieio--class-class-allocation-protection newc)))))
(if (not (eq prot super-prot))
(error "Child slot protection `%s' does not match inherited protection `%s' for `%s'"
prot super-prot a)))
@@ -1031,7 +1057,7 @@ if default value is nil."
;; and new ones.
(when custg
(let* ((groups
- (nthcdr num (aref newc class-class-allocation-custom-group)))
+ (nthcdr num (eieio--class-class-allocation-custom-group newc)))
(list1 (car groups))
(list2 (if (listp custg) custg (list custg))))
(if (< (length list1) (length list2))
@@ -1045,7 +1071,7 @@ if default value is nil."
;; doc is specified, simply replaces the old one.
(when doc
;;(message "Documentation redefined to %s" doc)
- (setcar (nthcdr num (aref newc class-class-allocation-doc))
+ (setcar (nthcdr num (eieio--class-class-allocation-doc newc))
doc))
;; End PLN
@@ -1053,7 +1079,7 @@ if default value is nil."
;; the old one.
(when print
;; (message "printer redefined to %s" print)
- (setcar (nthcdr num (aref newc class-class-allocation-printer)) print))
+ (setcar (nthcdr num (eieio--class-class-allocation-printer newc)) print))
))
))
@@ -1063,22 +1089,22 @@ if default value is nil."
"Copy into NEWC the slots of PARENTS.
Follow the rules of not overwriting early parents when applying to
the new child class."
- (let ((ps (aref newc class-parent))
- (sn (class-option-assoc (aref newc class-options)
+ (let ((ps (eieio--class-parent newc))
+ (sn (class-option-assoc (eieio--class-options newc)
':allow-nil-initform)))
(while ps
;; First, duplicate all the slots of the parent.
(let ((pcv (class-v (car ps))))
- (let ((pa (aref pcv class-public-a))
- (pd (aref pcv class-public-d))
- (pdoc (aref pcv class-public-doc))
- (ptype (aref pcv class-public-type))
- (pcust (aref pcv class-public-custom))
- (plabel (aref pcv class-public-custom-label))
- (pcustg (aref pcv class-public-custom-group))
- (printer (aref pcv class-public-printer))
- (pprot (aref pcv class-protection))
- (pinit (aref pcv class-initarg-tuples))
+ (let ((pa (eieio--class-public-a pcv))
+ (pd (eieio--class-public-d pcv))
+ (pdoc (eieio--class-public-doc pcv))
+ (ptype (eieio--class-public-type pcv))
+ (pcust (eieio--class-public-custom pcv))
+ (plabel (eieio--class-public-custom-label pcv))
+ (pcustg (eieio--class-public-custom-group pcv))
+ (printer (eieio--class-public-printer pcv))
+ (pprot (eieio--class-protection pcv))
+ (pinit (eieio--class-initarg-tuples pcv))
(i 0))
(while pa
(eieio-add-new-slot newc
@@ -1099,15 +1125,15 @@ the new child class."
pinit (cdr pinit))
)) ;; while/let
;; Now duplicate all the class alloc slots.
- (let ((pa (aref pcv class-class-allocation-a))
- (pdoc (aref pcv class-class-allocation-doc))
- (ptype (aref pcv class-class-allocation-type))
- (pcust (aref pcv class-class-allocation-custom))
- (plabel (aref pcv class-class-allocation-custom-label))
- (pcustg (aref pcv class-class-allocation-custom-group))
- (printer (aref pcv class-class-allocation-printer))
- (pprot (aref pcv class-class-allocation-protection))
- (pval (aref pcv class-class-allocation-values))
+ (let ((pa (eieio--class-class-allocation-a pcv))
+ (pdoc (eieio--class-class-allocation-doc pcv))
+ (ptype (eieio--class-class-allocation-type pcv))
+ (pcust (eieio--class-class-allocation-custom pcv))
+ (plabel (eieio--class-class-allocation-custom-label pcv))
+ (pcustg (eieio--class-class-allocation-custom-group pcv))
+ (printer (eieio--class-class-allocation-printer pcv))
+ (pprot (eieio--class-class-allocation-protection pcv))
+ (pval (eieio--class-class-allocation-values pcv))
(i 0))
(while pa
(eieio-add-new-slot newc
@@ -1252,7 +1278,7 @@ IMPL is the symbol holding the method implementation."
;; We do have an object. Make sure it is the right type.
(if ,(if (eq class eieio-default-superclass)
nil ; default superclass means just an obj. Already asked.
- `(not (child-of-class-p (aref (car local-args) object-class)
+ `(not (child-of-class-p (eieio--object-class (car local-args))
',class)))
;; If not the right kind of object, call no applicable
@@ -1335,27 +1361,20 @@ Summary:
(defun eieio--defmethod (method kind argclass code)
"Work part of the `defmethod' macro defining METHOD with ARGS."
(let ((key
- ;; find optional keys
- (cond ((or (eq ':BEFORE kind)
- (eq ':before kind))
- method-before)
- ((or (eq ':AFTER kind)
- (eq ':after kind))
- method-after)
- ((or (eq ':PRIMARY kind)
- (eq ':primary kind))
- method-primary)
- ((or (eq ':STATIC kind)
- (eq ':static kind))
- method-static)
- ;; Primary key
- (t method-primary))))
+ ;; Find optional keys.
+ (cond ((memq kind '(:BEFORE :before)) method-before)
+ ((memq kind '(:AFTER :after)) method-after)
+ ((memq kind '(:STATIC :static)) method-static)
+ ((memq kind '(:PRIMARY :primary nil)) method-primary)
+ ;; Primary key.
+ ;; (t method-primary)
+ (t (error "Unknown method kind %S" kind)))))
;; Make sure there is a generic (when called from defclass).
(eieio--defalias
method (eieio--defgeneric-init-form
method (or (documentation code)
(format "Generically created method `%s'." method))))
- ;; create symbol for property to bind to. If the first arg is of
+ ;; Create symbol for property to bind to. If the first arg is of
;; the form (varname vartype) and `vartype' is a class, then
;; that class will be the type symbol. If not, then it will fall
;; under the type `primary' which is a non-specific calling of the
@@ -1364,11 +1383,9 @@ Summary:
(if (not (class-p argclass))
(error "Unknown class type %s in method parameters"
argclass))
- (if (= key -1)
- (signal 'wrong-type-argument (list :static 'non-class-arg)))
- ;; generics are higher
+ ;; Generics are higher.
(setq key (eieio-specialized-key-to-generic-key key)))
- ;; Put this lambda into the symbol so we can find it
+ ;; Put this lambda into the symbol so we can find it.
(eieiomt-add method code key argclass)
)
@@ -1449,7 +1466,7 @@ an error."
nil
;; Trim off object IDX junk added in for the object index.
(setq slot-idx (- slot-idx 3))
- (let ((st (aref (aref (class-v class) class-public-type) slot-idx)))
+ (let ((st (aref (eieio--class-public-type (class-v class)) slot-idx)))
(if (not (eieio-perform-slot-validation st value))
(signal 'invalid-slot-type (list class slot st value))))))
@@ -1460,7 +1477,7 @@ SLOT is the slot that is being checked, and is only used when throwing
an error."
(if eieio-skip-typecheck
nil
- (let ((st (aref (aref (class-v class) class-class-allocation-type)
+ (let ((st (aref (eieio--class-class-allocation-type (class-v class))
slot-idx)))
(if (not (eieio-perform-slot-validation st value))
(signal 'invalid-slot-type (list class slot st value))))))
@@ -1471,7 +1488,7 @@ INSTANCE is the object being referenced. SLOTNAME is the offending
slot. If the slot is ok, return VALUE.
Argument FN is the function calling this verifier."
(if (and (eq value eieio-unbound) (not eieio-skip-typecheck))
- (slot-unbound instance (object-class instance) slotname fn)
+ (slot-unbound instance (eieio-object-class instance) slotname fn)
value))
;;; Get/Set slots in an object.
@@ -1484,27 +1501,24 @@ created by the :initarg tag."
(defun eieio-oref (obj slot)
"Return the value in OBJ at SLOT in the object vector."
- (if (not (or (eieio-object-p obj) (class-p obj)))
- (signal 'wrong-type-argument (list '(or eieio-object-p class-p) obj)))
- (if (not (symbolp slot))
- (signal 'wrong-type-argument (list 'symbolp slot)))
+ (eieio--check-type (or eieio-object-p class-p) obj)
+ (eieio--check-type symbolp slot)
(if (class-p obj) (eieio-class-un-autoload obj))
- (let* ((class (if (class-p obj) obj (aref obj object-class)))
+ (let* ((class (if (class-p obj) obj (eieio--object-class obj)))
(c (eieio-slot-name-index class obj slot)))
(if (not c)
;; It might be missing because it is a :class allocated slot.
;; Let's check that info out.
(if (setq c (eieio-class-slot-name-index class slot))
;; Oref that slot.
- (aref (aref (class-v class) class-class-allocation-values) c)
+ (aref (eieio--class-class-allocation-values (class-v class)) c)
;; The slot-missing method is a cool way of allowing an object author
;; to intercept missing slot definitions. Since it is also the LAST
;; thing called in this fn, its return value would be retrieved.
(slot-missing obj slot 'oref)
- ;;(signal 'invalid-slot-name (list (object-name obj) slot))
+ ;;(signal 'invalid-slot-name (list (eieio-object-name obj) slot))
)
- (if (not (eieio-object-p obj))
- (signal 'wrong-type-argument (list 'eieio-object-p obj)))
+ (eieio--check-type eieio-object-p obj)
(eieio-barf-if-slot-unbound (aref obj c) obj slot 'oref))))
(defalias 'slot-value 'eieio-oref)
@@ -1520,9 +1534,9 @@ tag in the `defclass' call."
(defun eieio-oref-default (obj slot)
"Do the work for the macro `oref-default' with similar parameters.
Fills in OBJ's SLOT with its default value."
- (if (not (or (eieio-object-p obj) (class-p obj))) (signal 'wrong-type-argument (list 'eieio-object-p obj)))
- (if (not (symbolp slot)) (signal 'wrong-type-argument (list 'symbolp slot)))
- (let* ((cl (if (eieio-object-p obj) (aref obj object-class) obj))
+ (eieio--check-type (or eieio-object-p class-p) obj)
+ (eieio--check-type symbolp slot)
+ (let* ((cl (if (eieio-object-p obj) (eieio--object-class obj) obj))
(c (eieio-slot-name-index cl obj slot)))
(if (not c)
;; It might be missing because it is a :class allocated slot.
@@ -1530,13 +1544,13 @@ Fills in OBJ's SLOT with its default value."
(if (setq c
(eieio-class-slot-name-index cl slot))
;; Oref that slot.
- (aref (aref (class-v cl) class-class-allocation-values)
+ (aref (eieio--class-class-allocation-values (class-v cl))
c)
(slot-missing obj slot 'oref-default)
;;(signal 'invalid-slot-name (list (class-name cl) slot))
)
(eieio-barf-if-slot-unbound
- (let ((val (nth (- c 3) (aref (class-v cl) class-public-d))))
+ (let ((val (nth (- c 3) (eieio--class-public-d (class-v cl)))))
(eieio-default-eval-maybe val))
obj cl 'oref-default))))
@@ -1590,62 +1604,78 @@ variable name of the same name as the slot."
;;; Simple generators, and query functions. None of these would do
;; well embedded into an object.
;;
-(defmacro object-class-fast (obj) "Return the class struct defining OBJ with no check."
- `(aref ,obj object-class))
+(define-obsolete-function-alias
+ 'object-class-fast #'eieio--object-class "24.4")
-(defun class-name (class) "Return a Lisp like symbol name for CLASS."
- (if (not (class-p class)) (signal 'wrong-type-argument (list 'class-p class)))
+(defun eieio-class-name (class) "Return a Lisp like symbol name for CLASS."
+ (eieio--check-type class-p class)
;; I think this is supposed to return a symbol, but to me CLASS is a symbol,
;; and I wanted a string. Arg!
(format "#<class %s>" (symbol-name class)))
+(define-obsolete-function-alias 'class-name #'eieio-class-name "24.4")
-(defun object-name (obj &optional extra)
+(defun eieio-object-name (obj &optional extra)
"Return a Lisp like symbol string for object OBJ.
If EXTRA, include that in the string returned to represent the symbol."
- (if (not (eieio-object-p obj)) (signal 'wrong-type-argument (list 'eieio-object-p obj)))
- (format "#<%s %s%s>" (symbol-name (object-class-fast obj))
- (aref obj object-name) (or extra "")))
-
-(defun object-name-string (obj) "Return a string which is OBJ's name."
- (if (not (eieio-object-p obj)) (signal 'wrong-type-argument (list 'eieio-object-p obj)))
- (aref obj object-name))
-
-(defun object-set-name-string (obj name) "Set the string which is OBJ's NAME."
- (if (not (eieio-object-p obj)) (signal 'wrong-type-argument (list 'eieio-object-p obj)))
- (if (not (stringp name)) (signal 'wrong-type-argument (list 'stringp name)))
- (aset obj object-name name))
-
-(defun object-class (obj) "Return the class struct defining OBJ."
- (if (not (eieio-object-p obj)) (signal 'wrong-type-argument (list 'eieio-object-p obj)))
- (object-class-fast obj))
-(defalias 'class-of 'object-class)
-
-(defun object-class-name (obj) "Return a Lisp like symbol name for OBJ's class."
- (if (not (eieio-object-p obj)) (signal 'wrong-type-argument (list 'eieio-object-p obj)))
- (class-name (object-class-fast obj)))
-
-(defmacro class-parents-fast (class) "Return parent classes to CLASS with no check."
- `(aref (class-v ,class) class-parent))
-
-(defun class-parents (class)
+ (eieio--check-type eieio-object-p obj)
+ (format "#<%s %s%s>" (symbol-name (eieio--object-class obj))
+ (eieio--object-name obj) (or extra "")))
+(define-obsolete-function-alias 'object-name #'eieio-object-name "24.4")
+
+(defun eieio-object-name-string (obj) "Return a string which is OBJ's name."
+ (eieio--check-type eieio-object-p obj)
+ (eieio--object-name obj))
+(define-obsolete-function-alias
+ 'object-name-string #'eieio-object-name-string "24.4")
+
+(defun eieio-object-set-name-string (obj name)
+ "Set the string which is OBJ's NAME."
+ (eieio--check-type eieio-object-p obj)
+ (eieio--check-type stringp name)
+ (setf (eieio--object-name obj) name))
+(define-obsolete-function-alias
+ 'object-set-name-string 'eieio-object-set-name-string "24.4")
+
+(defun eieio-object-class (obj) "Return the class struct defining OBJ."
+ (eieio--check-type eieio-object-p obj)
+ (eieio--object-class obj))
+(define-obsolete-function-alias 'object-class #'eieio-object-class "24.4")
+;; CLOS name, maybe?
+(define-obsolete-function-alias 'class-of #'eieio-object-class "24.4")
+
+(defun eieio-object-class-name (obj)
+ "Return a Lisp like symbol name for OBJ's class."
+ (eieio--check-type eieio-object-p obj)
+ (eieio-class-name (eieio--object-class obj)))
+(define-obsolete-function-alias
+ 'object-class-name 'eieio-object-class-name "24.4")
+
+(defmacro eieio-class-parents-fast (class)
+ "Return parent classes to CLASS with no check."
+ `(eieio--class-parent (class-v ,class)))
+
+(defun eieio-class-parents (class)
"Return parent classes to CLASS. (overload of variable).
The CLOS function `class-direct-superclasses' is aliased to this function."
- (if (not (class-p class)) (signal 'wrong-type-argument (list 'class-p class)))
- (class-parents-fast class))
+ (eieio--check-type class-p class)
+ (eieio-class-parents-fast class))
+(define-obsolete-function-alias 'class-parents #'eieio-class-parents "24.4")
-(defmacro class-children-fast (class) "Return child classes to CLASS with no check."
- `(aref (class-v ,class) class-children))
+(defmacro eieio-class-children-fast (class) "Return child classes to CLASS with no check."
+ `(eieio--class-children (class-v ,class)))
-(defun class-children (class)
-"Return child classes to CLASS.
+(defun eieio-class-children (class)
+ "Return child classes to CLASS.
The CLOS function `class-direct-subclasses' is aliased to this function."
- (if (not (class-p class)) (signal 'wrong-type-argument (list 'class-p class)))
- (class-children-fast class))
+ (eieio--check-type class-p class)
+ (eieio-class-children-fast class))
+(define-obsolete-function-alias
+ 'class-children #'eieio-class-children "24.4")
(defun eieio-c3-candidate (class remaining-inputs)
- "Returns CLASS if it can go in the result now, otherwise nil"
+ "Return CLASS if it can go in the result now, otherwise nil"
;; Ensure CLASS is not in any position but the first in any of the
;; element lists of REMAINING-INPUTS.
(and (not (let ((found nil))
@@ -1691,7 +1721,7 @@ If a consistent order does not exist, signal an error."
(defun eieio-class-precedence-dfs (class)
"Return all parents of CLASS in depth-first order."
- (let* ((parents (class-parents-fast class))
+ (let* ((parents (eieio-class-parents-fast class))
(classes (copy-sequence
(apply #'append
(list class)
@@ -1712,21 +1742,21 @@ If a consistent order does not exist, signal an error."
(defun eieio-class-precedence-bfs (class)
"Return all parents of CLASS in breadth-first order."
(let ((result)
- (queue (or (class-parents-fast class)
+ (queue (or (eieio-class-parents-fast class)
'(eieio-default-superclass))))
(while queue
(let ((head (pop queue)))
(unless (member head result)
(push head result)
(unless (eq head 'eieio-default-superclass)
- (setq queue (append queue (or (class-parents-fast head)
+ (setq queue (append queue (or (eieio-class-parents-fast head)
'(eieio-default-superclass))))))))
(cons class (nreverse result)))
)
(defun eieio-class-precedence-c3 (class)
"Return all parents of CLASS in c3 order."
- (let ((parents (class-parents-fast class)))
+ (let ((parents (eieio-class-parents-fast class)))
(eieio-c3-merge-lists
(list class)
(append
@@ -1739,7 +1769,7 @@ If a consistent order does not exist, signal an error."
(list parents))))
)
-(defun class-precedence-list (class)
+(defun eieio-class-precedence-list (class)
"Return (transitively closed) list of parents of CLASS.
The order, in which the parents are returned depends on the
method invocation orders of the involved classes."
@@ -1753,52 +1783,56 @@ method invocation orders of the involved classes."
(:c3
(eieio-class-precedence-c3 class))))
)
+(define-obsolete-function-alias
+ 'class-precedence-list 'eieio-class-precedence-list "24.4")
;; Official CLOS functions.
-(defalias 'class-direct-superclasses 'class-parents)
-(defalias 'class-direct-subclasses 'class-children)
-
-(defmacro class-parent-fast (class) "Return first parent class to CLASS with no check."
- `(car (class-parents-fast ,class)))
+(define-obsolete-function-alias
+ 'class-direct-superclasses #'eieio-class-parents "24.4")
+(define-obsolete-function-alias
+ 'class-direct-subclasses #'eieio-class-children "24.4")
-(defmacro class-parent (class) "Return first parent class to CLASS. (overload of variable)."
- `(car (class-parents ,class)))
+(defmacro eieio-class-parent (class)
+ "Return first parent class to CLASS. (overload of variable)."
+ `(car (eieio-class-parents ,class)))
+(define-obsolete-function-alias 'class-parent #'eieio-class-parent "24.4")
-(defmacro same-class-fast-p (obj class) "Return t if OBJ is of class-type CLASS with no error checking."
- `(eq (aref ,obj object-class) ,class))
+(defmacro same-class-fast-p (obj class)
+ "Return t if OBJ is of class-type CLASS with no error checking."
+ `(eq (eieio--object-class ,obj) ,class))
(defun same-class-p (obj class) "Return t if OBJ is of class-type CLASS."
- (if (not (class-p class)) (signal 'wrong-type-argument (list 'class-p class)))
- (if (not (eieio-object-p obj)) (signal 'wrong-type-argument (list 'eieio-object-p obj)))
+ (eieio--check-type class-p class)
+ (eieio--check-type eieio-object-p obj)
(same-class-fast-p obj class))
(defun object-of-class-p (obj class)
"Return non-nil if OBJ is an instance of CLASS or CLASS' subclasses."
- (if (not (eieio-object-p obj)) (signal 'wrong-type-argument (list 'eieio-object-p obj)))
+ (eieio--check-type eieio-object-p obj)
;; class will be checked one layer down
- (child-of-class-p (aref obj object-class) class))
+ (child-of-class-p (eieio--object-class obj) class))
;; Backwards compatibility
(defalias 'obj-of-class-p 'object-of-class-p)
(defun child-of-class-p (child class)
"Return non-nil if CHILD class is a subclass of CLASS."
- (if (not (class-p class)) (signal 'wrong-type-argument (list 'class-p class)))
- (if (not (class-p child)) (signal 'wrong-type-argument (list 'class-p child)))
+ (eieio--check-type class-p class)
+ (eieio--check-type class-p child)
(let ((p nil))
(while (and child (not (eq child class)))
- (setq p (append p (aref (class-v child) class-parent))
+ (setq p (append p (eieio--class-parent (class-v child)))
child (car p)
p (cdr p)))
(if child t)))
(defun object-slots (obj)
"Return list of slots available in OBJ."
- (if (not (eieio-object-p obj)) (signal 'wrong-type-argument (list 'eieio-object-p obj)))
- (aref (class-v (object-class-fast obj)) class-public-a))
+ (eieio--check-type eieio-object-p obj)
+ (eieio--class-public-a (class-v (eieio--object-class obj))))
(defun class-slot-initarg (class slot) "Fetch from CLASS, SLOT's :initarg."
- (if (not (class-p class)) (signal 'wrong-type-argument (list 'class-p class)))
- (let ((ia (aref (class-v class) class-initarg-tuples))
+ (eieio--check-type class-p class)
+ (let ((ia (eieio--class-initarg-tuples (class-v class)))
(f nil))
(while (and ia (not f))
(if (eq (cdr (car ia)) slot)
@@ -1817,25 +1851,24 @@ with in the :initarg slot. VALUE can be any Lisp object."
(defun eieio-oset (obj slot value)
"Do the work for the macro `oset'.
Fills in OBJ's SLOT with VALUE."
- (if (not (eieio-object-p obj)) (signal 'wrong-type-argument (list 'eieio-object-p obj)))
- (if (not (symbolp slot)) (signal 'wrong-type-argument (list 'symbolp slot)))
- (let ((c (eieio-slot-name-index (object-class-fast obj) obj slot)))
+ (eieio--check-type eieio-object-p obj)
+ (eieio--check-type symbolp slot)
+ (let ((c (eieio-slot-name-index (eieio--object-class obj) obj slot)))
(if (not c)
;; It might be missing because it is a :class allocated slot.
;; Let's check that info out.
(if (setq c
- (eieio-class-slot-name-index (aref obj object-class) slot))
+ (eieio-class-slot-name-index (eieio--object-class obj) slot))
;; Oset that slot.
(progn
- (eieio-validate-class-slot-value (object-class-fast obj) c value slot)
- (aset (aref (class-v (aref obj object-class))
- class-class-allocation-values)
+ (eieio-validate-class-slot-value (eieio--object-class obj) c value slot)
+ (aset (eieio--class-class-allocation-values (class-v (eieio--object-class obj)))
c value))
;; See oref for comment on `slot-missing'
(slot-missing obj slot 'oset value)
- ;;(signal 'invalid-slot-name (list (object-name obj) slot))
+ ;;(signal 'invalid-slot-name (list (eieio-object-name obj) slot))
)
- (eieio-validate-slot-value (object-class-fast obj) c value slot)
+ (eieio-validate-slot-value (eieio--object-class obj) c value slot)
(aset obj c value))))
(defmacro oset-default (class slot value)
@@ -1848,8 +1881,8 @@ after they are created."
(defun eieio-oset-default (class slot value)
"Do the work for the macro `oset-default'.
Fills in the default value in CLASS' in SLOT with VALUE."
- (if (not (class-p class)) (signal 'wrong-type-argument (list 'class-p class)))
- (if (not (symbolp slot)) (signal 'wrong-type-argument (list 'symbolp slot)))
+ (eieio--check-type class-p class)
+ (eieio--check-type symbolp slot)
(let* ((scoped-class class)
(c (eieio-slot-name-index class nil slot)))
(if (not c)
@@ -1859,15 +1892,15 @@ Fills in the default value in CLASS' in SLOT with VALUE."
(progn
;; Oref that slot.
(eieio-validate-class-slot-value class c value slot)
- (aset (aref (class-v class) class-class-allocation-values) c
+ (aset (eieio--class-class-allocation-values (class-v class)) c
value))
- (signal 'invalid-slot-name (list (class-name class) slot)))
+ (signal 'invalid-slot-name (list (eieio-class-name class) slot)))
(eieio-validate-slot-value class c value slot)
;; Set this into the storage for defaults.
- (setcar (nthcdr (- c 3) (aref (class-v class) class-public-d))
+ (setcar (nthcdr (- c 3) (eieio--class-public-d (class-v class)))
value)
;; Take the value, and put it into our cache object.
- (eieio-oset (aref (class-v class) class-default-object-cache)
+ (eieio-oset (eieio--class-default-object-cache (class-v class))
slot value)
)))
@@ -1894,12 +1927,12 @@ OBJECT can be an instance or a class."
(defun slot-exists-p (object-or-class slot)
"Return non-nil if OBJECT-OR-CLASS has SLOT."
(let ((cv (class-v (cond ((eieio-object-p object-or-class)
- (object-class object-or-class))
+ (eieio-object-class object-or-class))
((class-p object-or-class)
object-or-class))
)))
- (or (memq slot (aref cv class-public-a))
- (memq slot (aref cv class-class-allocation-a)))
+ (or (memq slot (eieio--class-public-a cv))
+ (memq slot (eieio--class-class-allocation-a cv)))
))
(defun find-class (symbol &optional errorp)
@@ -1919,7 +1952,7 @@ LIST is a list of objects whose slots are searched.
Objects in LIST do not need to have a slot named SLOT, nor does
SLOT need to be bound. If these errors occur, those objects will
be ignored."
- (if (not (listp list)) (signal 'wrong-type-argument (list 'listp list)))
+ (eieio--check-type listp list)
(while (and list (not (condition-case nil
;; This prevents errors for missing slots.
(equal key (eieio-oref (car list) slot))
@@ -1931,7 +1964,7 @@ be ignored."
"Return an association list with the contents of SLOT as the key element.
LIST must be a list of objects with SLOT in it.
This is useful when you need to do completing read on an object group."
- (if (not (listp list)) (signal 'wrong-type-argument (list 'listp list)))
+ (eieio--check-type listp list)
(let ((assoclist nil))
(while list
(setq assoclist (cons (cons (eieio-oref (car list) slot)
@@ -1945,7 +1978,7 @@ This is useful when you need to do completing read on an object group."
LIST must be a list of objects, but those objects do not need to have
SLOT in it. If it does not, then that element is left out of the association
list."
- (if (not (listp list)) (signal 'wrong-type-argument (list 'listp list)))
+ (eieio--check-type listp list)
(let ((assoclist nil))
(while list
(if (slot-exists-p (car list) slot)
@@ -1993,14 +2026,13 @@ If SLOT is unbound, do nothing."
"Return non-nil if START-CLASS is the first class to define SLOT.
This is for testing if `scoped-class' is the class that defines SLOT
so that we can protect private slots."
- (let ((par (class-parents start-class))
+ (let ((par (eieio-class-parents start-class))
(ret t))
(if (not par)
t
(while (and par ret)
(if (intern-soft (symbol-name slot)
- (aref (class-v (car par))
- class-symbol-obarray))
+ (eieio--class-symbol-obarray (class-v (car par))))
(setq ret nil))
(setq par (cdr par)))
ret)))
@@ -2015,8 +2047,7 @@ If SLOT is the value created with :initarg instead,
reverse-lookup that name, and recurse with the associated slot value."
;; Removed checks to outside this call
(let* ((fsym (intern-soft (symbol-name slot)
- (aref (class-v class)
- class-symbol-obarray)))
+ (eieio--class-symbol-obarray (class-v class))))
(fsi (if (symbolp fsym) (symbol-value fsym) nil)))
(if (integerp fsi)
(cond
@@ -2026,7 +2057,7 @@ reverse-lookup that name, and recurse with the associated slot value."
(bound-and-true-p scoped-class)
(or (child-of-class-p class scoped-class)
(and (eieio-object-p obj)
- (child-of-class-p class (object-class obj)))))
+ (child-of-class-p class (eieio-object-class obj)))))
(+ 3 fsi))
((and (eq (get fsym 'protection) 'private)
(or (and (bound-and-true-p scoped-class)
@@ -2044,7 +2075,7 @@ call. If SLOT is the value created with :initarg instead,
reverse-lookup that name, and recurse with the associated slot value."
;; This will happen less often, and with fewer slots. Do this the
;; storage cheap way.
- (let* ((a (aref (class-v class) class-class-allocation-a))
+ (let* ((a (eieio--class-class-allocation-a (class-v class)))
(l1 (length a))
(af (memq slot a))
(l2 (length af)))
@@ -2099,7 +2130,7 @@ This should only be called from a generic function."
(load (nth 1 (symbol-function firstarg))))
;; Determine the class to use.
(cond ((eieio-object-p firstarg)
- (setq mclass (object-class-fast firstarg)))
+ (setq mclass (eieio--object-class firstarg)))
((class-p firstarg)
(setq mclass firstarg))
)
@@ -2236,7 +2267,7 @@ for this common case to improve performance."
;; Determine the class to use.
(cond ((eieio-object-p firstarg)
- (setq mclass (object-class-fast firstarg)))
+ (setq mclass (eieio--object-class firstarg)))
((not firstarg)
(error "Method %s called on nil" method))
((not (eieio-object-p firstarg))
@@ -2303,7 +2334,7 @@ If CLASS is nil, then an empty list of methods should be returned."
;; Collect lambda expressions stored for the class and its parent
;; classes.
(let (lambdas)
- (dolist (ancestor (class-precedence-list class))
+ (dolist (ancestor (eieio-class-precedence-list class))
;; Lookup the form to use for the PRIMARY object for the next level
(let ((tmpl (eieio-generic-form method key ancestor)))
(when (and tmpl
@@ -2447,7 +2478,7 @@ This is different from function `class-parent' as class parent returns
nil for superclasses. This function performs no type checking!"
;; No type-checking because all calls are made from functions which
;; are safe and do checking for us.
- (or (class-parents-fast class)
+ (or (eieio-class-parents-fast class)
(if (eq class 'eieio-default-superclass)
nil
'(eieio-default-superclass))))
@@ -2460,7 +2491,7 @@ nil for superclasses. This function performs no type checking!"
;; we replace the nil from above.
(let ((external-symbol (intern-soft (symbol-name s))))
(catch 'done
- (dolist (ancestor (rest (class-precedence-list external-symbol)))
+ (dolist (ancestor (rest (eieio-class-precedence-list external-symbol)))
(let ((ov (intern-soft (symbol-name ancestor)
eieiomt-optimizing-obarray)))
(when (fboundp ov)
@@ -2489,7 +2520,7 @@ is memorized for faster future use."
(eieiomt-sym-optimize cs))))
;; 3) If it's bound return this one.
(if (fboundp cs)
- (cons cs (aref (class-v class) class-symbol))
+ (cons cs (eieio--class-symbol (class-v class)))
;; 4) If it's not bound then this variable knows something
(if (symbol-value cs)
(progn
@@ -2499,8 +2530,7 @@ is memorized for faster future use."
;; 4.2) The optimizer should always have chosen a
;; function-symbol
;;(if (fboundp cs)
- (cons cs (aref (class-v (intern (symbol-name class)))
- class-symbol))
+ (cons cs (eieio--class-symbol (class-v (intern (symbol-name class)))))
;;(error "EIEIO optimizer: erratic data loss!"))
)
;; There never will be a funcall...
@@ -2523,9 +2553,9 @@ is memorized for faster future use."
If SET-ALL is non-nil, then when a default is nil, that value is
reset. If SET-ALL is nil, the slots are only reset if the default is
not nil."
- (let ((scoped-class (aref obj object-class))
+ (let ((scoped-class (eieio--object-class obj))
(eieio-initializing-object t)
- (pub (aref (class-v (aref obj object-class)) class-public-a)))
+ (pub (eieio--class-public-a (class-v (eieio--object-class obj)))))
(while pub
(let ((df (eieio-oref-default obj (car pub))))
(if (or df set-all)
@@ -2536,7 +2566,7 @@ not nil."
"For CLASS, convert INITARG to the actual attribute name.
If there is no translation, pass it in directly (so we can cheat if
need be... May remove that later...)"
- (let ((tuple (assoc initarg (aref (class-v class) class-initarg-tuples))))
+ (let ((tuple (assoc initarg (eieio--class-initarg-tuples (class-v class)))))
(if tuple
(cdr tuple)
nil)))
@@ -2544,7 +2574,7 @@ need be... May remove that later...)"
(defun eieio-attribute-to-initarg (class attribute)
"In CLASS, convert the ATTRIBUTE into the corresponding init argument tag.
This is usually a symbol that starts with `:'."
- (let ((tuple (rassoc attribute (aref (class-v class) class-initarg-tuples))))
+ (let ((tuple (rassoc attribute (eieio--class-initarg-tuples (class-v class)))))
(if tuple
(car tuple)
nil)))
@@ -2632,10 +2662,9 @@ SLOTS are the initialization slots used by `shared-initialize'.
This static method is called when an object is constructed.
It allocates the vector used to represent an EIEIO object, and then
calls `shared-initialize' on that object."
- (let* ((new-object (copy-sequence (aref (class-v class)
- class-default-object-cache))))
+ (let* ((new-object (copy-sequence (eieio--class-default-object-cache (class-v class)))))
;; Update the name for the newly created object.
- (aset new-object object-name newname)
+ (setf (eieio--object-name new-object) newname)
;; Call the initialize method on the new object with the slots
;; that were passed down to us.
(initialize-instance new-object slots)
@@ -2649,9 +2678,9 @@ Called from the constructor routine.")
(defmethod shared-initialize ((obj eieio-default-superclass) slots)
"Set slots of OBJ with SLOTS which is a list of name/value pairs.
Called from the constructor routine."
- (let ((scoped-class (aref obj object-class)))
+ (let ((scoped-class (eieio--object-class obj)))
(while slots
- (let ((rn (eieio-initarg-to-attribute (object-class-fast obj)
+ (let ((rn (eieio-initarg-to-attribute (eieio--object-class obj)
(car slots))))
(if (not rn)
(slot-missing obj (car slots) 'oset (car (cdr slots)))
@@ -2673,9 +2702,9 @@ not taken, then new objects of your class will not have their values
dynamically set from SLOTS."
;; First, see if any of our defaults are `lambda', and
;; re-evaluate them and apply the value to our slots.
- (let* ((scoped-class (class-v (aref this object-class)))
- (slot (aref scoped-class class-public-a))
- (defaults (aref scoped-class class-public-d)))
+ (let* ((scoped-class (class-v (eieio--object-class this)))
+ (slot (eieio--class-public-a scoped-class))
+ (defaults (eieio--class-public-d scoped-class)))
(while slot
;; For each slot, see if we need to evaluate it.
;;
@@ -2705,7 +2734,7 @@ to be set.
This method is called from `oref', `oset', and other functions which
directly reference slots in EIEIO objects."
- (signal 'invalid-slot-name (list (object-name object)
+ (signal 'invalid-slot-name (list (eieio-object-name object)
slot-name)))
(defgeneric slot-unbound (object class slot-name fn)
@@ -2723,7 +2752,7 @@ Use `slot-boundp' to determine if a slot is bound or not.
In CLOS, the argument list is (CLASS OBJECT SLOT-NAME), but
EIEIO can only dispatch on the first argument, so the first two are swapped."
- (signal 'unbound-slot (list (class-name class) (object-name object)
+ (signal 'unbound-slot (list (eieio-class-name class) (eieio-object-name object)
slot-name fn)))
(defgeneric no-applicable-method (object method &rest args)
@@ -2737,7 +2766,7 @@ ARGS are the arguments that were passed to METHOD.
Implement this for a class to block this signal. The return
value becomes the return value of the original method call."
- (signal 'no-method-definition (list method (object-name object)))
+ (signal 'no-method-definition (list method (eieio-object-name object)))
)
(defgeneric no-next-method (object &rest args)
@@ -2751,7 +2780,7 @@ ARGS are the arguments it is called by.
This method signals `no-next-method' by default. Override this
method to not throw an error, and its return value becomes the
return value of `call-next-method'."
- (signal 'no-next-method (list (object-name object) args))
+ (signal 'no-next-method (list (eieio-object-name object) args))
)
(defgeneric clone (obj &rest params)
@@ -2764,7 +2793,7 @@ first and modify the returned object.")
(defmethod clone ((obj eieio-default-superclass) &rest params)
"Make a copy of OBJ, and then apply PARAMS."
(let ((nobj (copy-sequence obj))
- (nm (aref obj object-name))
+ (nm (eieio--object-name obj))
(passname (and params (stringp (car params))))
(num 1))
(if params (shared-initialize nobj (if passname (cdr params) params)))
@@ -2773,8 +2802,8 @@ first and modify the returned object.")
(if (string-match "-\\([0-9]+\\)" nm)
(setq num (1+ (string-to-number (match-string 1 nm)))
nm (substring nm 0 (match-beginning 0))))
- (aset nobj object-name (concat nm "-" (int-to-string num))))
- (aset nobj object-name (car params)))
+ (setf (eieio--object-name nobj) (concat nm "-" (int-to-string num))))
+ (setf (eieio--object-name nobj) (car params)))
nobj))
(defgeneric destructor (this &rest params)
@@ -2806,7 +2835,7 @@ Implement this function and specify STRINGS in a call to
`call-next-method' to provide additional summary information.
When passing in extra strings from child classes, always remember
to prepend a space."
- (object-name this (apply 'concat strings)))
+ (eieio-object-name this (apply 'concat strings)))
(defvar eieio-print-depth 0
"When printing, keep track of the current indentation depth.")
@@ -2823,11 +2852,11 @@ object are discouraged from being written.
this object."
(when comment
(princ ";; Object ")
- (princ (object-name-string this))
+ (princ (eieio-object-name-string this))
(princ "\n")
(princ comment)
(princ "\n"))
- (let* ((cl (object-class this))
+ (let* ((cl (eieio-object-class this))
(cv (class-v cl)))
;; Now output readable lisp to recreate this object
;; It should look like this:
@@ -2835,14 +2864,14 @@ this object."
;; Each slot's slot is writen using its :writer.
(princ (make-string (* eieio-print-depth 2) ? ))
(princ "(")
- (princ (symbol-name (class-constructor (object-class this))))
+ (princ (symbol-name (class-constructor (eieio-object-class this))))
(princ " ")
- (prin1 (object-name-string this))
+ (prin1 (eieio-object-name-string this))
(princ "\n")
;; Loop over all the public slots
- (let ((publa (aref cv class-public-a))
- (publd (aref cv class-public-d))
- (publp (aref cv class-public-printer))
+ (let ((publa (eieio--class-public-a cv))
+ (publd (eieio--class-public-d cv))
+ (publp (eieio--class-public-printer cv))
(eieio-print-depth (1+ eieio-print-depth)))
(while publa
(when (slot-boundp this (car publa))
@@ -2850,28 +2879,36 @@ this object."
(v (eieio-oref this (car publa)))
)
(unless (or (not i) (equal v (car publd)))
+ (unless (bolp)
+ (princ "\n"))
(princ (make-string (* eieio-print-depth 2) ? ))
(princ (symbol-name i))
- (princ " ")
(if (car publp)
;; Use our public printer
- (funcall (car publp) v)
+ (progn
+ (princ " ")
+ (funcall (car publp) v))
;; Use our generic override prin1 function.
- (eieio-override-prin1 v))
- (princ "\n"))))
+ (princ (if (or (eieio-object-p v)
+ (eieio-object-p (car-safe v)))
+ "\n" " "))
+ (eieio-override-prin1 v)))))
(setq publa (cdr publa) publd (cdr publd)
- publp (cdr publp)))
- (princ (make-string (* eieio-print-depth 2) ? )))
- (princ ")\n")))
+ publp (cdr publp))))
+ (princ ")")
+ (when (= eieio-print-depth 0)
+ (princ "\n"))))
(defun eieio-override-prin1 (thing)
"Perform a `prin1' on THING taking advantage of object knowledge."
(cond ((eieio-object-p thing)
(object-write thing))
- ((listp thing)
+ ((consp thing)
(eieio-list-prin1 thing))
((class-p thing)
- (princ (class-name thing)))
+ (princ (eieio-class-name thing)))
+ ((or (keywordp thing) (booleanp thing))
+ (prin1 thing))
((symbolp thing)
(princ (concat "'" (symbol-name thing))))
(t (prin1 thing))))
@@ -2882,16 +2919,16 @@ this object."
(progn
(princ "'")
(prin1 list))
- (princ "(list ")
- (if (eieio-object-p (car list)) (princ "\n "))
- (while list
- (if (eieio-object-p (car list))
- (object-write (car list))
- (princ "'")
- (prin1 (car list)))
- (princ " ")
- (setq list (cdr list)))
(princ (make-string (* eieio-print-depth 2) ? ))
+ (princ "(list")
+ (let ((eieio-print-depth (1+ eieio-print-depth)))
+ (while list
+ (princ "\n")
+ (if (eieio-object-p (car list))
+ (object-write (car list))
+ (princ (make-string (* eieio-print-depth 2) ? ))
+ (eieio-override-prin1 (car list)))
+ (setq list (cdr list))))
(princ ")")))
@@ -2913,34 +2950,30 @@ of `eq'."
(let ((key nil) (body nil) (firstarg nil) (argfix nil) (argclass nil) loopa)
;; find optional keys
(setq key
- (cond ((or (eq ':BEFORE (car args))
- (eq ':before (car args)))
+ (cond ((memq (car args) '(:BEFORE :before))
(setq args (cdr args))
method-before)
- ((or (eq ':AFTER (car args))
- (eq ':after (car args)))
+ ((memq (car args) '(:AFTER :after))
(setq args (cdr args))
method-after)
- ((or (eq ':PRIMARY (car args))
- (eq ':primary (car args)))
- (setq args (cdr args))
- method-primary)
- ((or (eq ':STATIC (car args))
- (eq ':static (car args)))
+ ((memq (car args) '(:STATIC :static))
(setq args (cdr args))
method-static)
- ;; Primary key
+ ((memq (car args) '(:PRIMARY :primary))
+ (setq args (cdr args))
+ method-primary)
+ ;; Primary key.
(t method-primary)))
- ;; get body, and fix contents of args to be the arguments of the fn.
+ ;; Get body, and fix contents of args to be the arguments of the fn.
(setq body (cdr args)
args (car args))
(setq loopa args)
- ;; Create a fixed version of the arguments
+ ;; Create a fixed version of the arguments.
(while loopa
(setq argfix (cons (if (listp (car loopa)) (car (car loopa)) (car loopa))
argfix))
(setq loopa (cdr loopa)))
- ;; make sure there is a generic
+ ;; Make sure there is a generic.
(eieio-defgeneric
method
(if (stringp (car body))
@@ -2957,11 +2990,9 @@ of `eq'."
(if (not (class-p argclass))
(error "Unknown class type %s in method parameters"
(nth 1 firstarg))))
- (if (= key -1)
- (signal 'wrong-type-argument (list :static 'non-class-arg)))
- ;; generics are higher
+ ;; Generics are higher.
(setq key (eieio-specialized-key-to-generic-key key)))
- ;; Put this lambda into the symbol so we can find it
+ ;; Put this lambda into the symbol so we can find it.
(if (byte-code-function-p (car-safe body))
(eieiomt-add method (car-safe body) key argclass)
(eieiomt-add method (append (list 'lambda (reverse argfix)) body)
@@ -3011,7 +3042,7 @@ of `eq'."
"Display EIEIO OBJECT in fancy format.
Overrides the edebug default.
Optional argument NOESCAPE is passed to `prin1-to-string' when appropriate."
- (cond ((class-p object) (class-name object))
+ (cond ((class-p object) (eieio-class-name object))
((eieio-object-p object) (object-print object))
((and (listp object) (or (class-p (car object))
(eieio-object-p (car object))))
diff --git a/lisp/emacs-lisp/eldoc.el b/lisp/emacs-lisp/eldoc.el
index 0f01857381c..4efbdcb22cb 100644
--- a/lisp/emacs-lisp/eldoc.el
+++ b/lisp/emacs-lisp/eldoc.el
@@ -146,6 +146,10 @@ directly. Instead, use `eldoc-add-command' and `eldoc-remove-command'.")
"Idle time delay currently in use by timer.
This is used to determine if `eldoc-idle-delay' is changed by the user.")
+(defvar eldoc-message-function 'eldoc-minibuffer-message
+ "The function used by `eldoc-message' to display messages.
+It should receive the same arguments as `message'.")
+
;;;###autoload
(define-minor-mode eldoc-mode
@@ -170,6 +174,20 @@ expression point is on."
(remove-hook 'pre-command-hook 'eldoc-pre-command-refresh-echo-area)))
;;;###autoload
+(define-minor-mode eldoc-post-insert-mode nil
+ :group 'eldoc :lighter (:eval (if eldoc-mode ""
+ (concat eldoc-minor-mode-string "|i")))
+ (setq eldoc-last-message nil)
+ (let ((prn-info (lambda ()
+ (unless eldoc-mode
+ (eldoc-print-current-symbol-info)))))
+ (if eldoc-post-insert-mode
+ (add-hook 'post-self-insert-hook prn-info nil t)
+ (remove-hook 'post-self-insert-hook prn-info t))))
+
+(add-hook 'eval-expression-minibuffer-setup-hook 'eldoc-post-insert-mode)
+
+;;;###autoload
(defun turn-on-eldoc-mode ()
"Unequivocally turn on ElDoc mode (see command `eldoc-mode')."
(interactive)
@@ -180,14 +198,46 @@ expression point is on."
(or (and eldoc-timer
(memq eldoc-timer timer-idle-list))
(setq eldoc-timer
- (run-with-idle-timer eldoc-idle-delay t
- 'eldoc-print-current-symbol-info)))
+ (run-with-idle-timer
+ eldoc-idle-delay t
+ (lambda () (and eldoc-mode (eldoc-print-current-symbol-info))))))
;; If user has changed the idle delay, update the timer.
(cond ((not (= eldoc-idle-delay eldoc-current-idle-delay))
(setq eldoc-current-idle-delay eldoc-idle-delay)
(timer-set-idle-time eldoc-timer eldoc-idle-delay t))))
+(defvar eldoc-mode-line-string nil)
+(put 'eldoc-mode-line-string 'risky-local-variable t)
+
+(defun eldoc-minibuffer-message (format-string &rest args)
+ "Display messages in the mode-line when in the minibuffer.
+Otherwise work like `message'."
+ (if (minibufferp)
+ (progn
+ (with-current-buffer
+ (window-buffer
+ (or (window-in-direction 'above (minibuffer-window))
+ (minibuffer-selected-window)
+ (get-largest-window)))
+ (unless (and (listp mode-line-format)
+ (assq 'eldoc-mode-line-string mode-line-format))
+ (setq mode-line-format
+ (list "" '(eldoc-mode-line-string
+ (" " eldoc-mode-line-string " "))
+ mode-line-format))))
+ (add-hook 'minibuffer-exit-hook
+ (lambda () (setq eldoc-mode-line-string nil))
+ nil t)
+ (cond
+ ((null format-string)
+ (setq eldoc-mode-line-string nil))
+ ((stringp format-string)
+ (setq eldoc-mode-line-string
+ (apply 'format format-string args))))
+ (force-mode-line-update))
+ (apply 'message format-string args)))
+
(defun eldoc-message (&rest args)
(let ((omessage eldoc-last-message))
(setq eldoc-last-message
@@ -203,8 +253,9 @@ expression point is on."
;; they are Legion.
;; Emacs way of preventing log messages.
(let ((message-log-max nil))
- (cond (eldoc-last-message (message "%s" eldoc-last-message))
- (omessage (message nil)))))
+ (cond (eldoc-last-message
+ (funcall eldoc-message-function "%s" eldoc-last-message))
+ (omessage (funcall eldoc-message-function nil)))))
eldoc-last-message)
;; This function goes on pre-command-hook for XEmacs or when using idle
@@ -236,11 +287,7 @@ expression point is on."
(defun eldoc-display-message-no-interference-p ()
(and eldoc-mode
(not executing-kbd-macro)
- (not (and (boundp 'edebug-active) edebug-active))
- ;; Having this mode operate in an active minibuffer/echo area causes
- ;; interference with what's going on there.
- (not cursor-in-echo-area)
- (not (eq (selected-window) (minibuffer-window)))))
+ (not (and (boundp 'edebug-active) edebug-active))))
;;;###autoload
@@ -262,7 +309,7 @@ Emacs Lisp mode) that support ElDoc.")
(defun eldoc-print-current-symbol-info ()
(condition-case err
- (and (eldoc-display-message-p)
+ (and (or (eldoc-display-message-p) eldoc-post-insert-mode)
(if eldoc-documentation-function
(eldoc-message (funcall eldoc-documentation-function))
(let* ((current-symbol (eldoc-current-symbol))
@@ -356,7 +403,8 @@ In the absence of INDEX, just call `eldoc-docstring-format-sym-doc'."
(setq doc (copy-sequence args))
(add-text-properties start end (list 'face argument-face) doc))
(setq doc (eldoc-docstring-format-sym-doc
- sym doc 'font-lock-function-name-face))
+ sym doc (if (functionp sym) 'font-lock-function-name-face
+ 'font-lock-keyword-face)))
doc)))
;; Return a string containing a brief (one-line) documentation string for
diff --git a/lisp/emacs-lisp/elp.el b/lisp/emacs-lisp/elp.el
index bc02d9a7551..f1321eb4e6d 100644
--- a/lisp/emacs-lisp/elp.el
+++ b/lisp/emacs-lisp/elp.el
@@ -1,4 +1,4 @@
-;;; elp.el --- Emacs Lisp Profiler
+;;; elp.el --- Emacs Lisp Profiler -*- lexical-binding: t -*-
;; Copyright (C) 1994-1995, 1997-1998, 2001-2013 Free Software
;; Foundation, Inc.
@@ -124,6 +124,7 @@
;;; Code:
+(eval-when-compile (require 'cl-lib))
;; start of user configuration variables
;; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
@@ -148,9 +149,9 @@ Results are displayed with the `elp-results' command."
"Non-nil specifies ELP results sorting function.
These functions are currently available:
- elp-sort-by-call-count -- sort by the highest call count
- elp-sort-by-total-time -- sort by the highest total time
- elp-sort-by-average-time -- sort by the highest average times
+ `elp-sort-by-call-count' -- sort by the highest call count
+ `elp-sort-by-total-time' -- sort by the highest total time
+ `elp-sort-by-average-time' -- sort by the highest average times
You can write your own sort function. It should adhere to the
interface specified by the PREDICATE argument for `sort'.
@@ -167,7 +168,7 @@ If a number, no function that has been called fewer than that number
of times will be displayed in the output buffer. If nil, all
functions will be displayed."
:type '(choice integer
- (const :tag "Show All" nil))
+ (const :tag "Show All" nil))
:group 'elp)
(defcustom elp-use-standard-output nil
@@ -193,9 +194,6 @@ In other words, a new unique buffer is create every time you run
(defconst elp-timer-info-property 'elp-info
"ELP information property name.")
-(defvar elp-all-instrumented-list nil
- "List of all functions currently being instrumented.")
-
(defvar elp-record-p t
"Controls whether functions should record times or not.
This variable is set by the master function.")
@@ -205,7 +203,7 @@ This variable is set by the master function.")
(defvar elp-not-profilable
;; First, the functions used inside each instrumented function:
- '(elp-wrapper called-interactively-p
+ '(called-interactively-p
;; Then the functions used by the above functions. I used
;; (delq nil (mapcar (lambda (x) (and (symbolp x) (fboundp x) x))
;; (aref (symbol-function 'elp-wrapper) 2)))
@@ -223,60 +221,21 @@ them would thus lead to infinite recursion.")
(fboundp fun)
(not (or (memq fun elp-not-profilable)
(keymapp fun)
- (memq (car-safe (symbol-function fun)) '(autoload macro))
- (condition-case nil
- (when (subrp (indirect-function fun))
- (eq 'unevalled
- (cdr (subr-arity (indirect-function fun)))))
- (error nil))))))
+ (autoloadp (symbol-function fun)) ;FIXME: Why not just load it?
+ (special-form-p fun)))))
+(defconst elp--advice-name 'ELP-instrumentation\ )
;;;###autoload
(defun elp-instrument-function (funsym)
"Instrument FUNSYM for profiling.
FUNSYM must be a symbol of a defined function."
(interactive "aFunction to instrument: ")
- ;; restore the function. this is necessary to avoid infinite
- ;; recursion of already instrumented functions (i.e. elp-wrapper
- ;; calling elp-wrapper ad infinitum). it is better to simply
- ;; restore the function than to throw an error. this will work
- ;; properly in the face of eval-defun because if the function was
- ;; redefined, only the timer info will be nil'd out since
- ;; elp-restore-function is smart enough not to trash the new
- ;; definition.
- (elp-restore-function funsym)
- (let* ((funguts (symbol-function funsym))
- (infovec (vector 0 0 funguts))
- (newguts '(lambda (&rest args))))
- ;; we cannot profile macros
- (and (eq (car-safe funguts) 'macro)
- (error "ELP cannot profile macro: %s" funsym))
- ;; TBD: at some point it might be better to load the autoloaded
- ;; function instead of throwing an error. if we do this, then we
- ;; probably want elp-instrument-package to be updated with the
- ;; newly loaded list of functions. i'm not sure it's smart to do
- ;; the autoload here, since that could have side effects, and
- ;; elp-instrument-function is similar (in my mind) to defun-ish
- ;; type functionality (i.e. it shouldn't execute the function).
- (and (autoloadp funguts)
- (error "ELP cannot profile autoloaded function: %s" funsym))
+ (let* ((infovec (vector 0 0)))
;; We cannot profile functions used internally during profiling.
(unless (elp-profilable-p funsym)
(error "ELP cannot profile the function: %s" funsym))
- ;; put rest of newguts together
- (if (commandp funsym)
- (setq newguts (append newguts '((interactive)))))
- (setq newguts (append newguts `((elp-wrapper
- (quote ,funsym)
- ,(when (commandp funsym)
- '(called-interactively-p 'any))
- args))))
- ;; to record profiling times, we set the symbol's function
- ;; definition so that it runs the elp-wrapper function with the
- ;; function symbol as an argument. We place the old function
- ;; definition on the info vector.
- ;;
- ;; The info vector data structure is a 3 element vector. The 0th
+ ;; The info vector data structure is a 2 element vector. The 0th
;; element is the call-count, i.e. the total number of times this
;; function has been entered. This value is bumped up on entry to
;; the function so that non-local exists are still recorded. TBD:
@@ -285,72 +244,45 @@ FUNSYM must be a symbol of a defined function."
;; The 1st element is the total amount of time in seconds that has
;; been spent inside this function. This number is added to on
;; function exit.
- ;;
- ;; The 2nd element is the old function definition list. This gets
- ;; funcall'd in between start/end time retrievals. I believe that
- ;; this lets us profile even byte-compiled functions.
- ;; put the info vector on the property list
+ ;; Put the info vector on the property list.
(put funsym elp-timer-info-property infovec)
;; Set the symbol's new profiling function definition to run
- ;; elp-wrapper.
- (let ((advice-info (get funsym 'ad-advice-info)))
- (if advice-info
- (progn
- ;; If function is advised, don't let Advice change
- ;; its definition from under us during the `fset'.
- (put funsym 'ad-advice-info nil)
- (fset funsym newguts)
- (put funsym 'ad-advice-info advice-info))
- (fset funsym newguts)))
-
- ;; add this function to the instrumentation list
- (unless (memq funsym elp-all-instrumented-list)
- (push funsym elp-all-instrumented-list))))
+ ;; ELP wrapper.
+ (advice-add funsym :around (elp--make-wrapper funsym)
+ `((name . ,elp--advice-name)))))
+
+(defun elp--instrumented-p (sym)
+ (advice-member-p elp--advice-name sym))
(defun elp-restore-function (funsym)
"Restore an instrumented function to its original definition.
Argument FUNSYM is the symbol of a defined function."
- (interactive "aFunction to restore: ")
- (let ((info (get funsym elp-timer-info-property)))
- ;; delete the function from the all instrumented list
- (setq elp-all-instrumented-list
- (delq funsym elp-all-instrumented-list))
-
- ;; if the function was the master, reset the master
- (if (eq funsym elp-master)
- (setq elp-master nil
- elp-record-p t))
-
- ;; zap the properties
- (put funsym elp-timer-info-property nil)
-
- ;; restore the original function definition, but if the function
- ;; wasn't instrumented do nothing. we do this after the above
- ;; because its possible the function got un-instrumented due to
- ;; circumstances beyond our control. Also, check to make sure
- ;; that the current function symbol points to elp-wrapper. If
- ;; not, then the user probably did an eval-defun, or loaded a
- ;; byte-compiled version, while the function was instrumented and
- ;; we don't want to destroy the new definition. can it ever be
- ;; the case that a lisp function can be compiled instrumented?
- (and info
- (functionp funsym)
- (not (byte-code-function-p (symbol-function funsym)))
- (assq 'elp-wrapper (symbol-function funsym))
- (fset funsym (aref info 2)))))
+ (interactive
+ (list
+ (intern
+ (completing-read "Function to restore: " obarray
+ #'elp--instrumented-p t))))
+ ;; If the function was the master, reset the master.
+ (if (eq funsym elp-master)
+ (setq elp-master nil
+ elp-record-p t))
+
+ ;; Zap the properties.
+ (put funsym elp-timer-info-property nil)
+
+ (advice-remove funsym elp--advice-name))
;;;###autoload
(defun elp-instrument-list (&optional list)
"Instrument, for profiling, all functions in `elp-function-list'.
Use optional LIST if provided instead.
If called interactively, read LIST using the minibuffer."
- (interactive "PList of functions to instrument: ")
+ (interactive "PList of functions to instrument: ") ;FIXME: Doesn't work?!
(unless (listp list)
(signal 'wrong-type-argument (list 'listp list)))
- (let ((list (or list elp-function-list)))
- (mapcar 'elp-instrument-function list)))
+ (mapcar #'elp-instrument-function (or list elp-function-list)))
;;;###autoload
(defun elp-instrument-package (prefix)
@@ -371,15 +303,13 @@ For example, to instrument all ELP functions, do the following:
(defun elp-restore-list (&optional list)
"Restore the original definitions for all functions in `elp-function-list'.
Use optional LIST if provided instead."
- (interactive "PList of functions to restore: ")
- (let ((list (or list elp-function-list)))
- (mapcar 'elp-restore-function list)))
+ (interactive "PList of functions to restore: ") ;FIXME: Doesn't work!?
+ (mapcar #'elp-restore-function (or list elp-function-list)))
(defun elp-restore-all ()
"Restore the original definitions of all functions being profiled."
(interactive)
- (elp-restore-list elp-all-instrumented-list))
-
+ (mapatoms #'elp-restore-function))
(defun elp-reset-function (funsym)
"Reset the profiling information for FUNSYM."
@@ -395,30 +325,36 @@ Use optional LIST if provided instead."
(defun elp-reset-list (&optional list)
"Reset the profiling information for all functions in `elp-function-list'.
Use optional LIST if provided instead."
- (interactive "PList of functions to reset: ")
+ (interactive "PList of functions to reset: ") ;FIXME: Doesn't work!?
(let ((list (or list elp-function-list)))
(mapcar 'elp-reset-function list)))
(defun elp-reset-all ()
"Reset the profiling information for all functions being profiled."
(interactive)
- (elp-reset-list elp-all-instrumented-list))
+ (mapatoms (lambda (sym)
+ (if (get sym elp-timer-info-property)
+ (elp-reset-function sym)))))
(defun elp-set-master (funsym)
"Set the master function for profiling."
- (interactive "aMaster function: ")
- ;; when there's a master function, recording is turned off by
- ;; default
+ (interactive
+ (list
+ (intern
+ (completing-read "Master function: " obarray
+ #'elp--instrumented-p
+ t nil nil (if elp-master (symbol-name elp-master))))))
+ ;; When there's a master function, recording is turned off by default.
(setq elp-master funsym
elp-record-p nil)
- ;; make sure master function is instrumented
- (or (memq funsym elp-all-instrumented-list)
+ ;; Make sure master function is instrumented.
+ (or (elp--instrumented-p funsym)
(elp-instrument-function funsym)))
(defun elp-unset-master ()
"Unset the master function."
(interactive)
- ;; when there's no master function, recording is turned on by default.
+ ;; When there's no master function, recording is turned on by default.
(setq elp-master nil
elp-record-p t))
@@ -426,49 +362,40 @@ Use optional LIST if provided instead."
(defsubst elp-elapsed-time (start end)
(float-time (time-subtract end start)))
-(defun elp-wrapper (funsym interactive-p args)
- "This function has been instrumented for profiling by the ELP.
+(defun elp--make-wrapper (funsym)
+ "Make the piece of advice that instruments FUNSYM."
+ (lambda (func &rest args)
+ "This function has been instrumented for profiling by the ELP.
ELP is the Emacs Lisp Profiler. To restore the function to its
original definition, use \\[elp-restore-function] or \\[elp-restore-all]."
- ;; turn on recording if this is the master function
- (if (and elp-master
- (eq funsym elp-master))
- (setq elp-record-p t))
- ;; get info vector and original function symbol
- (let* ((info (get funsym elp-timer-info-property))
- (func (aref info 2))
- result)
- (or func
- (error "%s is not instrumented for profiling" funsym))
- (if (not elp-record-p)
- ;; when not recording, just call the original function symbol
- ;; and return the results.
- (setq result
- (if interactive-p
- (call-interactively func)
- (apply func args)))
- ;; we are recording times
- (let (enter-time exit-time)
- ;; increment the call-counter
- (aset info 0 (1+ (aref info 0)))
- ;; now call the old symbol function, checking to see if it
- ;; should be called interactively. make sure we return the
- ;; correct value
- (if interactive-p
- (setq enter-time (current-time)
- result (call-interactively func)
- exit-time (current-time))
+ ;; turn on recording if this is the master function
+ (if (and elp-master
+ (eq funsym elp-master))
+ (setq elp-record-p t))
+ ;; get info vector and original function symbol
+ (let* ((info (get funsym elp-timer-info-property))
+ result)
+ (or func
+ (error "%s is not instrumented for profiling" funsym))
+ (if (not elp-record-p)
+ ;; when not recording, just call the original function symbol
+ ;; and return the results.
+ (setq result (apply func args))
+ ;; we are recording times
+ (let (enter-time exit-time)
+ ;; increment the call-counter
+ (cl-incf (aref info 0))
(setq enter-time (current-time)
result (apply func args)
- exit-time (current-time)))
- ;; calculate total time in function
- (aset info 1 (+ (aref info 1) (elp-elapsed-time enter-time exit-time)))
- ))
- ;; turn off recording if this is the master function
- (if (and elp-master
- (eq funsym elp-master))
- (setq elp-record-p nil))
- result))
+ exit-time (current-time))
+ ;; calculate total time in function
+ (cl-incf (aref info 1) (elp-elapsed-time enter-time exit-time))
+ ))
+ ;; turn off recording if this is the master function
+ (if (and elp-master
+ (eq funsym elp-master))
+ (setq elp-record-p nil))
+ result)))
;; shut the byte-compiler up
@@ -582,57 +509,58 @@ displayed."
(elp-et-len (length et-header))
(at-header "Average Time")
(elp-at-len (length at-header))
- (resvec
- (mapcar
- (function
- (lambda (funsym)
- (let* ((info (get funsym elp-timer-info-property))
- (symname (format "%s" funsym))
- (cc (aref info 0))
- (tt (aref info 1)))
- (if (not info)
- (insert "No profiling information found for: "
- symname)
- (setq longest (max longest (length symname)))
- (vector cc tt (if (zerop cc)
- 0.0 ;avoid arithmetic div-by-zero errors
- (/ (float tt) (float cc)))
- symname)))))
- elp-all-instrumented-list))
+ (resvec '())
) ; end let*
+ (mapatoms
+ (lambda (funsym)
+ (when (elp--instrumented-p funsym)
+ (let* ((info (get funsym elp-timer-info-property))
+ (symname (format "%s" funsym))
+ (cc (aref info 0))
+ (tt (aref info 1)))
+ (if (not info)
+ (insert "No profiling information found for: "
+ symname)
+ (setq longest (max longest (length symname)))
+ (push
+ (vector cc tt (if (zerop cc)
+ 0.0 ;avoid arithmetic div-by-zero errors
+ (/ (float tt) (float cc)))
+ symname)
+ resvec))))))
;; If printing to stdout, insert the header so it will print.
;; Otherwise use header-line-format.
(setq elp-field-len (max titlelen longest))
(if (or elp-use-standard-output noninteractive)
- (progn
- (insert title)
- (if (> longest titlelen)
- (progn
- (insert-char 32 (- longest titlelen))))
- (insert " " cc-header " " et-header " " at-header "\n")
- (insert-char ?= elp-field-len)
- (insert " ")
- (insert-char ?= elp-cc-len)
- (insert " ")
- (insert-char ?= elp-et-len)
- (insert " ")
- (insert-char ?= elp-at-len)
- (insert "\n"))
- (let ((column 0))
- (setq header-line-format
- (mapconcat
- (lambda (title)
- (prog1
- (concat
- (propertize " "
- 'display (list 'space :align-to column)
- 'face 'fixed-pitch)
- title)
- (setq column (+ column 2
- (if (= column 0)
- elp-field-len
- (length title))))))
- (list title cc-header et-header at-header) ""))))
+ (progn
+ (insert title)
+ (if (> longest titlelen)
+ (progn
+ (insert-char 32 (- longest titlelen))))
+ (insert " " cc-header " " et-header " " at-header "\n")
+ (insert-char ?= elp-field-len)
+ (insert " ")
+ (insert-char ?= elp-cc-len)
+ (insert " ")
+ (insert-char ?= elp-et-len)
+ (insert " ")
+ (insert-char ?= elp-at-len)
+ (insert "\n"))
+ (let ((column 0))
+ (setq header-line-format
+ (mapconcat
+ (lambda (title)
+ (prog1
+ (concat
+ (propertize " "
+ 'display (list 'space :align-to column)
+ 'face 'fixed-pitch)
+ title)
+ (setq column (+ column 2
+ (if (= column 0)
+ elp-field-len
+ (length title))))))
+ (list title cc-header et-header at-header) ""))))
;; if sorting is enabled, then sort the results list. in either
;; case, call elp-output-result to output the result in the
;; buffer
@@ -644,7 +572,7 @@ displayed."
(pop-to-buffer resultsbuf)
;; copy results to standard-output?
(if (or elp-use-standard-output noninteractive)
- (princ (buffer-substring (point-min) (point-max)))
+ (princ (buffer-substring (point-min) (point-max)))
(goto-char (point-min)))
;; reset profiling info if desired
(and elp-reset-after-results
diff --git a/lisp/emacs-lisp/ert-x.el b/lisp/emacs-lisp/ert-x.el
index 00100c0f6fb..531e83c1e6a 100644
--- a/lisp/emacs-lisp/ert-x.el
+++ b/lisp/emacs-lisp/ert-x.el
@@ -1,4 +1,4 @@
-;;; ert-x.el --- Staging area for experimental extensions to ERT
+;;; ert-x.el --- Staging area for experimental extensions to ERT -*- lexical-binding: t -*-
;; Copyright (C) 2008, 2010-2013 Free Software Foundation, Inc.
@@ -28,8 +28,7 @@
;;; Code:
-(eval-when-compile
- (require 'cl))
+(eval-when-compile (require 'cl-lib))
(require 'ert)
@@ -90,8 +89,8 @@ ERT--THUNK with that buffer as current."
(kill-buffer ert--buffer)
(remhash ert--buffer ert--test-buffers))))
-(defmacro* ert-with-test-buffer ((&key ((:name name-form)))
- &body body)
+(cl-defmacro ert-with-test-buffer ((&key ((:name name-form)))
+ &body body)
"Create a test buffer and run BODY in that buffer.
To be used in ERT tests. If BODY finishes successfully, the test
@@ -116,10 +115,10 @@ the name of the test and the result of NAME-FORM."
"Kill all test buffers that are still live."
(interactive)
(let ((count 0))
- (maphash (lambda (buffer dummy)
+ (maphash (lambda (buffer _dummy)
(when (or (not (buffer-live-p buffer))
(kill-buffer buffer))
- (incf count)))
+ (cl-incf count)))
ert--test-buffers)
(message "%s out of %s test buffers killed"
count (hash-table-count ert--test-buffers)))
@@ -149,9 +148,9 @@ the rest are arguments to the command.
NOTE: Since the command is not called by `call-interactively'
test for `called-interactively' in the command will fail."
- (assert (listp command) t)
- (assert (commandp (car command)) t)
- (assert (not unread-command-events) t)
+ (cl-assert (listp command) t)
+ (cl-assert (commandp (car command)) t)
+ (cl-assert (not unread-command-events) t)
(let (return-value)
;; For the order of things here see command_loop_1 in keyboard.c.
;;
@@ -175,7 +174,7 @@ test for `called-interactively' in the command will fail."
(when (boundp 'last-repeatable-command)
(setq last-repeatable-command real-last-command))
(when (and deactivate-mark transient-mark-mode) (deactivate-mark))
- (assert (not unread-command-events) t)
+ (cl-assert (not unread-command-events) t)
return-value))
(defun ert-run-idle-timers ()
@@ -198,7 +197,7 @@ rather than the entire match."
(with-temp-buffer
(insert s)
(dolist (x regexps)
- (destructuring-bind (regexp subexp) (if (listp x) x `(,x nil))
+ (cl-destructuring-bind (regexp subexp) (if (listp x) x `(,x nil))
(goto-char (point-min))
(while (re-search-forward regexp nil t)
(replace-match "" t t nil subexp))))
@@ -224,15 +223,15 @@ would return the string \"foo bar baz quux\" where the substring
None of the ARGS are modified, but the return value may share
structure with the plists in ARGS."
(with-temp-buffer
- (loop with current-plist = nil
- for x in args do
- (etypecase x
- (string (let ((begin (point)))
- (insert x)
- (set-text-properties begin (point) current-plist)))
- (list (unless (zerop (mod (length x) 2))
- (error "Odd number of args in plist: %S" x))
- (setq current-plist x))))
+ (cl-loop with current-plist = nil
+ for x in args do
+ (cl-etypecase x
+ (string (let ((begin (point)))
+ (insert x)
+ (set-text-properties begin (point) current-plist)))
+ (list (unless (zerop (mod (length x) 2))
+ (error "Odd number of args in plist: %S" x))
+ (setq current-plist x))))
(buffer-string)))
@@ -245,8 +244,8 @@ buffer, and renames the original buffer back to BUFFER-NAME.
This is useful if THUNK has undesirable side-effects on an Emacs
buffer with a fixed name such as *Messages*."
- (lexical-let ((new-buffer-name (generate-new-buffer-name
- (format "%s orig buffer" buffer-name))))
+ (let ((new-buffer-name (generate-new-buffer-name
+ (format "%s orig buffer" buffer-name))))
(with-current-buffer (get-buffer-create buffer-name)
(rename-buffer new-buffer-name))
(unwind-protect
@@ -258,7 +257,7 @@ buffer with a fixed name such as *Messages*."
(with-current-buffer new-buffer-name
(rename-buffer buffer-name)))))
-(defmacro* ert-with-buffer-renamed ((buffer-name-form) &body body)
+(cl-defmacro ert-with-buffer-renamed ((buffer-name-form) &body body)
"Protect the buffer named BUFFER-NAME from side-effects and run BODY.
See `ert-call-with-buffer-renamed' for details."
diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el
index 134dbc1b6a6..656cb0a6a14 100644
--- a/lisp/emacs-lisp/ert.el
+++ b/lisp/emacs-lisp/ert.el
@@ -1,4 +1,4 @@
-;;; ert.el --- Emacs Lisp Regression Testing
+;;; ert.el --- Emacs Lisp Regression Testing -*- lexical-binding: t -*-
;; Copyright (C) 2007-2008, 2010-2013 Free Software Foundation, Inc.
@@ -54,8 +54,7 @@
;;; Code:
-(eval-when-compile
- (require 'cl))
+(eval-when-compile (require 'cl-lib))
(require 'button)
(require 'debug)
(require 'easymenu)
@@ -105,33 +104,33 @@
"A reimplementation of `remove-if-not'.
ERT-PRED is a predicate, ERT-LIST is the input list."
- (loop for ert-x in ert-list
- if (funcall ert-pred ert-x)
- collect ert-x))
+ (cl-loop for ert-x in ert-list
+ if (funcall ert-pred ert-x)
+ collect ert-x))
(defun ert--intersection (a b)
"A reimplementation of `intersection'. Intersect the sets A and B.
Elements are compared using `eql'."
- (loop for x in a
- if (memql x b)
- collect x))
+ (cl-loop for x in a
+ if (memql x b)
+ collect x))
(defun ert--set-difference (a b)
"A reimplementation of `set-difference'. Subtract the set B from the set A.
Elements are compared using `eql'."
- (loop for x in a
- unless (memql x b)
- collect x))
+ (cl-loop for x in a
+ unless (memql x b)
+ collect x))
(defun ert--set-difference-eq (a b)
"A reimplementation of `set-difference'. Subtract the set B from the set A.
Elements are compared using `eq'."
- (loop for x in a
- unless (memq x b)
- collect x))
+ (cl-loop for x in a
+ unless (memq x b)
+ collect x))
(defun ert--union (a b)
"A reimplementation of `union'. Compute the union of the sets A and B.
@@ -149,7 +148,7 @@ Elements are compared using `eql'."
(make-symbol (format "%s%s"
prefix
(prog1 ert--gensym-counter
- (incf ert--gensym-counter))))))
+ (cl-incf ert--gensym-counter))))))
(defun ert--coerce-to-vector (x)
"Coerce X to a vector."
@@ -158,19 +157,19 @@ Elements are compared using `eql'."
x
(vconcat x)))
-(defun* ert--remove* (x list &key key test)
+(cl-defun ert--remove* (x list &key key test)
"Does not support all the keywords of remove*."
(unless key (setq key #'identity))
(unless test (setq test #'eql))
- (loop for y in list
- unless (funcall test x (funcall key y))
- collect y))
+ (cl-loop for y in list
+ unless (funcall test x (funcall key y))
+ collect y))
(defun ert--string-position (c s)
"Return the position of the first occurrence of C in S, or nil if none."
- (loop for i from 0
- for x across s
- when (eql x c) return i))
+ (cl-loop for i from 0
+ for x across s
+ when (eql x c) return i))
(defun ert--mismatch (a b)
"Return index of first element that differs between A and B.
@@ -184,29 +183,30 @@ Like `mismatch'. Uses `equal' for comparison."
(t
(let ((la (length a))
(lb (length b)))
- (assert (arrayp a) t)
- (assert (arrayp b) t)
- (assert (<= la lb) t)
- (loop for i below la
- when (not (equal (aref a i) (aref b i))) return i
- finally (return (if (/= la lb)
- la
- (assert (equal a b) t)
- nil)))))))
+ (cl-assert (arrayp a) t)
+ (cl-assert (arrayp b) t)
+ (cl-assert (<= la lb) t)
+ (cl-loop for i below la
+ when (not (equal (aref a i) (aref b i))) return i
+ finally (cl-return (if (/= la lb)
+ la
+ (cl-assert (equal a b) t)
+ nil)))))))
(defun ert--subseq (seq start &optional end)
"Return a subsequence of SEQ from START to END."
(when (char-table-p seq) (error "Not supported"))
(let ((vector (substring (ert--coerce-to-vector seq) start end)))
- (etypecase seq
+ (cl-etypecase seq
(vector vector)
(string (concat vector))
(list (append vector nil))
- (bool-vector (loop with result = (make-bool-vector (length vector) nil)
- for i below (length vector) do
- (setf (aref result i) (aref vector i))
- finally (return result)))
- (char-table (assert nil)))))
+ (bool-vector (cl-loop with result
+ = (make-bool-vector (length vector) nil)
+ for i below (length vector) do
+ (setf (aref result i) (aref vector i))
+ finally (cl-return result)))
+ (char-table (cl-assert nil)))))
(defun ert-equal-including-properties (a b)
"Return t if A and B have similar structure and contents.
@@ -225,10 +225,10 @@ Emacs bug 6581 at URL `http://debbugs.gnu.org/cgi/bugreport.cgi?bug=6581'."
;;; Defining and locating tests.
;; The data structure that represents a test case.
-(defstruct ert-test
+(cl-defstruct ert-test
(name nil)
(documentation nil)
- (body (assert nil))
+ (body (cl-assert nil))
(most-recent-result nil)
(expected-result-type ':passed)
(tags '()))
@@ -273,7 +273,7 @@ Returns a two-element list containing the keys-and-values plist
and the body."
(let ((extracted-key-accu '())
(remaining keys-and-body))
- (while (and (consp remaining) (keywordp (first remaining)))
+ (while (keywordp (car-safe remaining))
(let ((keyword (pop remaining)))
(unless (consp remaining)
(error "Value expected after keyword %S in %S"
@@ -283,13 +283,13 @@ and the body."
keys-and-body))
(push (cons keyword (pop remaining)) extracted-key-accu)))
(setq extracted-key-accu (nreverse extracted-key-accu))
- (list (loop for (key . value) in extracted-key-accu
- collect key
- collect value)
+ (list (cl-loop for (key . value) in extracted-key-accu
+ collect key
+ collect value)
remaining)))
;;;###autoload
-(defmacro* ert-deftest (name () &body docstring-keys-and-body)
+(cl-defmacro ert-deftest (name () &body docstring-keys-and-body)
"Define NAME (a symbol) as a test.
BODY is evaluated as a `progn' when the test is run. It should
@@ -313,12 +313,13 @@ description of valid values for RESULT-TYPE.
(indent 2))
(let ((documentation nil)
(documentation-supplied-p nil))
- (when (stringp (first docstring-keys-and-body))
+ (when (stringp (car docstring-keys-and-body))
(setq documentation (pop docstring-keys-and-body)
documentation-supplied-p t))
- (destructuring-bind ((&key (expected-result nil expected-result-supplied-p)
- (tags nil tags-supplied-p))
- body)
+ (cl-destructuring-bind
+ ((&key (expected-result nil expected-result-supplied-p)
+ (tags nil tags-supplied-p))
+ body)
(ert--parse-keys-and-body docstring-keys-and-body)
`(progn
(ert-set-test ',name
@@ -405,10 +406,10 @@ DATA is displayed to the user and should state the reason of the failure."
(t
(let ((fn-name (car form))
(arg-forms (cdr form)))
- (assert (or (symbolp fn-name)
- (and (consp fn-name)
- (eql (car fn-name) 'lambda)
- (listp (cdr fn-name)))))
+ (cl-assert (or (symbolp fn-name)
+ (and (consp fn-name)
+ (eql (car fn-name) 'lambda)
+ (listp (cdr fn-name)))))
(let ((fn (ert--gensym "fn-"))
(args (ert--gensym "args-"))
(value (ert--gensym "value-"))
@@ -446,35 +447,36 @@ should return code that calls INNER-FORM and performs the checks
and error signaling specific to the particular variant of
`should'. The code that INNER-EXPANDER returns must not call
FORM-DESCRIPTION-FORM before it has called INNER-FORM."
- (lexical-let ((inner-expander inner-expander))
- (ert--expand-should-1
- whole form
- (lambda (inner-form form-description-form value-var)
- (let ((form-description (ert--gensym "form-description-")))
- `(let (,form-description)
- ,(funcall inner-expander
- `(unwind-protect
- ,inner-form
- (setq ,form-description ,form-description-form)
- (ert--signal-should-execution ,form-description))
- `,form-description
- value-var)))))))
-
-(defmacro* should (form)
+ (ert--expand-should-1
+ whole form
+ (lambda (inner-form form-description-form value-var)
+ (let ((form-description (ert--gensym "form-description-")))
+ `(let (,form-description)
+ ,(funcall inner-expander
+ `(unwind-protect
+ ,inner-form
+ (setq ,form-description ,form-description-form)
+ (ert--signal-should-execution ,form-description))
+ `,form-description
+ value-var))))))
+
+(cl-defmacro should (form)
"Evaluate FORM. If it returns nil, abort the current test as failed.
Returns the value of FORM."
+ (declare (debug t))
(ert--expand-should `(should ,form) form
- (lambda (inner-form form-description-form value-var)
+ (lambda (inner-form form-description-form _value-var)
`(unless ,inner-form
(ert-fail ,form-description-form)))))
-(defmacro* should-not (form)
+(cl-defmacro should-not (form)
"Evaluate FORM. If it returns non-nil, abort the current test as failed.
Returns nil."
+ (declare (debug t))
(ert--expand-should `(should-not ,form) form
- (lambda (inner-form form-description-form value-var)
+ (lambda (inner-form form-description-form _value-var)
`(unless (not ,inner-form)
(ert-fail ,form-description-form)))))
@@ -485,10 +487,10 @@ Returns nil."
Determines whether CONDITION matches TYPE and EXCLUDE-SUBTYPES,
and aborts the current test as failed if it doesn't."
(let ((signaled-conditions (get (car condition) 'error-conditions))
- (handled-conditions (etypecase type
+ (handled-conditions (cl-etypecase type
(list type)
(symbol (list type)))))
- (assert signaled-conditions)
+ (cl-assert signaled-conditions)
(unless (ert--intersection signaled-conditions handled-conditions)
(ert-fail (append
(funcall form-description-fn)
@@ -507,7 +509,7 @@ and aborts the current test as failed if it doesn't."
;; FIXME: The expansion will evaluate the keyword args (if any) in
;; nonstandard order.
-(defmacro* should-error (form &rest keys &key type exclude-subtypes)
+(cl-defmacro should-error (form &rest keys &key type exclude-subtypes)
"Evaluate FORM and check that it signals an error.
The error signaled needs to match TYPE. TYPE should be a list
@@ -520,6 +522,7 @@ non-nil, the error matches TYPE if it is an element of TYPE.
If the error matches, returns (ERROR-SYMBOL . DATA) from the
error. If not, or if no error was signaled, abort the test as
failed."
+ (declare (debug t))
(unless type (setq type ''error))
(ert--expand-should
`(should-error ,form ,@keys)
@@ -555,20 +558,21 @@ failed."
(defun ert--proper-list-p (x)
"Return non-nil if X is a proper list, nil otherwise."
- (loop
+ (cl-loop
for firstp = t then nil
for fast = x then (cddr fast)
for slow = x then (cdr slow) do
- (when (null fast) (return t))
- (when (not (consp fast)) (return nil))
- (when (null (cdr fast)) (return t))
- (when (not (consp (cdr fast))) (return nil))
- (when (and (not firstp) (eq fast slow)) (return nil))))
+ (when (null fast) (cl-return t))
+ (when (not (consp fast)) (cl-return nil))
+ (when (null (cdr fast)) (cl-return t))
+ (when (not (consp (cdr fast))) (cl-return nil))
+ (when (and (not firstp) (eq fast slow)) (cl-return nil))))
(defun ert--explain-format-atom (x)
"Format the atom X for `ert--explain-equal'."
- (typecase x
- (fixnum (list x (format "#x%x" x) (format "?%c" x)))
+ (cl-typecase x
+ (character (list x (format "#x%x" x) (format "?%c" x)))
+ (fixnum (list x (format "#x%x" x)))
(t x)))
(defun ert--explain-equal-rec (a b)
@@ -576,7 +580,7 @@ failed."
Returns nil if they are."
(if (not (equal (type-of a) (type-of b)))
`(different-types ,a ,b)
- (etypecase a
+ (cl-etypecase a
(cons
(let ((a-proper-p (ert--proper-list-p a))
(b-proper-p (ert--proper-list-p b)))
@@ -588,19 +592,19 @@ Returns nil if they are."
,a ,b
first-mismatch-at
,(ert--mismatch a b))
- (loop for i from 0
- for ai in a
- for bi in b
- for xi = (ert--explain-equal-rec ai bi)
- do (when xi (return `(list-elt ,i ,xi)))
- finally (assert (equal a b) t)))
+ (cl-loop for i from 0
+ for ai in a
+ for bi in b
+ for xi = (ert--explain-equal-rec ai bi)
+ do (when xi (cl-return `(list-elt ,i ,xi)))
+ finally (cl-assert (equal a b) t)))
(let ((car-x (ert--explain-equal-rec (car a) (car b))))
(if car-x
`(car ,car-x)
(let ((cdr-x (ert--explain-equal-rec (cdr a) (cdr b))))
(if cdr-x
`(cdr ,cdr-x)
- (assert (equal a b) t)
+ (cl-assert (equal a b) t)
nil))))))))
(array (if (not (equal (length a) (length b)))
`(arrays-of-different-length ,(length a) ,(length b)
@@ -608,12 +612,12 @@ Returns nil if they are."
,@(unless (char-table-p a)
`(first-mismatch-at
,(ert--mismatch a b))))
- (loop for i from 0
- for ai across a
- for bi across b
- for xi = (ert--explain-equal-rec ai bi)
- do (when xi (return `(array-elt ,i ,xi)))
- finally (assert (equal a b) t))))
+ (cl-loop for i from 0
+ for ai across a
+ for bi across b
+ for xi = (ert--explain-equal-rec ai bi)
+ do (when xi (cl-return `(array-elt ,i ,xi)))
+ finally (cl-assert (equal a b) t))))
(atom (if (not (equal a b))
(if (and (symbolp a) (symbolp b) (string= a b))
`(different-symbols-with-the-same-name ,a ,b)
@@ -632,10 +636,10 @@ Returns nil if they are."
(defun ert--significant-plist-keys (plist)
"Return the keys of PLIST that have non-null values, in order."
- (assert (zerop (mod (length plist) 2)) t)
- (loop for (key value . rest) on plist by #'cddr
- unless (or (null value) (memq key accu)) collect key into accu
- finally (return accu)))
+ (cl-assert (zerop (mod (length plist) 2)) t)
+ (cl-loop for (key value . rest) on plist by #'cddr
+ unless (or (null value) (memq key accu)) collect key into accu
+ finally (cl-return accu)))
(defun ert--plist-difference-explanation (a b)
"Return a programmer-readable explanation of why A and B are different plists.
@@ -643,8 +647,8 @@ Returns nil if they are."
Returns nil if they are equivalent, i.e., have the same value for
each key, where absent values are treated as nil. The order of
key/value pairs in each list does not matter."
- (assert (zerop (mod (length a) 2)) t)
- (assert (zerop (mod (length b) 2)) t)
+ (cl-assert (zerop (mod (length a) 2)) t)
+ (cl-assert (zerop (mod (length b) 2)) t)
;; Normalizing the plists would be another way to do this but it
;; requires a total ordering on all lisp objects (since any object
;; is valid as a text property key). Perhaps defining such an
@@ -654,21 +658,21 @@ key/value pairs in each list does not matter."
(keys-b (ert--significant-plist-keys b))
(keys-in-a-not-in-b (ert--set-difference-eq keys-a keys-b))
(keys-in-b-not-in-a (ert--set-difference-eq keys-b keys-a)))
- (flet ((explain-with-key (key)
- (let ((value-a (plist-get a key))
- (value-b (plist-get b key)))
- (assert (not (equal value-a value-b)) t)
- `(different-properties-for-key
- ,key ,(ert--explain-equal-including-properties value-a
- value-b)))))
+ (cl-flet ((explain-with-key (key)
+ (let ((value-a (plist-get a key))
+ (value-b (plist-get b key)))
+ (cl-assert (not (equal value-a value-b)) t)
+ `(different-properties-for-key
+ ,key ,(ert--explain-equal-including-properties value-a
+ value-b)))))
(cond (keys-in-a-not-in-b
- (explain-with-key (first keys-in-a-not-in-b)))
+ (explain-with-key (car keys-in-a-not-in-b)))
(keys-in-b-not-in-a
- (explain-with-key (first keys-in-b-not-in-a)))
+ (explain-with-key (car keys-in-b-not-in-a)))
(t
- (loop for key in keys-a
- when (not (equal (plist-get a key) (plist-get b key)))
- return (explain-with-key key)))))))
+ (cl-loop for key in keys-a
+ when (not (equal (plist-get a key) (plist-get b key)))
+ return (explain-with-key key)))))))
(defun ert--abbreviate-string (s len suffixp)
"Shorten string S to at most LEN chars.
@@ -692,29 +696,30 @@ Returns a programmer-readable explanation of why A and B are not
`ert-equal-including-properties', or nil if they are."
(if (not (equal a b))
(ert--explain-equal a b)
- (assert (stringp a) t)
- (assert (stringp b) t)
- (assert (eql (length a) (length b)) t)
- (loop for i from 0 to (length a)
- for props-a = (text-properties-at i a)
- for props-b = (text-properties-at i b)
- for difference = (ert--plist-difference-explanation props-a props-b)
- do (when difference
- (return `(char ,i ,(substring-no-properties a i (1+ i))
- ,difference
- context-before
- ,(ert--abbreviate-string
- (substring-no-properties a 0 i)
- 10 t)
- context-after
- ,(ert--abbreviate-string
- (substring-no-properties a (1+ i))
- 10 nil))))
- ;; TODO(ohler): Get `equal-including-properties' fixed in
- ;; Emacs, delete `ert-equal-including-properties', and
- ;; re-enable this assertion.
- ;;finally (assert (equal-including-properties a b) t)
- )))
+ (cl-assert (stringp a) t)
+ (cl-assert (stringp b) t)
+ (cl-assert (eql (length a) (length b)) t)
+ (cl-loop for i from 0 to (length a)
+ for props-a = (text-properties-at i a)
+ for props-b = (text-properties-at i b)
+ for difference = (ert--plist-difference-explanation
+ props-a props-b)
+ do (when difference
+ (cl-return `(char ,i ,(substring-no-properties a i (1+ i))
+ ,difference
+ context-before
+ ,(ert--abbreviate-string
+ (substring-no-properties a 0 i)
+ 10 t)
+ context-after
+ ,(ert--abbreviate-string
+ (substring-no-properties a (1+ i))
+ 10 nil))))
+ ;; TODO(ohler): Get `equal-including-properties' fixed in
+ ;; Emacs, delete `ert-equal-including-properties', and
+ ;; re-enable this assertion.
+ ;;finally (cl-assert (equal-including-properties a b) t)
+ )))
(put 'ert-equal-including-properties
'ert-explainer
'ert--explain-equal-including-properties)
@@ -729,8 +734,8 @@ Returns a programmer-readable explanation of why A and B are not
Bound dynamically. This is a list of (PREFIX . MESSAGE) pairs.")
-(defmacro* ert-info ((message-form &key ((:prefix prefix-form) "Info: "))
- &body body)
+(cl-defmacro ert-info ((message-form &key ((:prefix prefix-form) "Info: "))
+ &body body)
"Evaluate MESSAGE-FORM and BODY, and report the message if BODY fails.
To be used within ERT tests. MESSAGE-FORM should evaluate to a
@@ -750,18 +755,19 @@ and is displayed in front of the value of MESSAGE-FORM."
"Non-nil means enter debugger when a test fails or terminates with an error.")
;; The data structures that represent the result of running a test.
-(defstruct ert-test-result
+(cl-defstruct ert-test-result
(messages nil)
(should-forms nil)
)
-(defstruct (ert-test-passed (:include ert-test-result)))
-(defstruct (ert-test-result-with-condition (:include ert-test-result))
- (condition (assert nil))
- (backtrace (assert nil))
- (infos (assert nil)))
-(defstruct (ert-test-quit (:include ert-test-result-with-condition)))
-(defstruct (ert-test-failed (:include ert-test-result-with-condition)))
-(defstruct (ert-test-aborted-with-non-local-exit (:include ert-test-result)))
+(cl-defstruct (ert-test-passed (:include ert-test-result)))
+(cl-defstruct (ert-test-result-with-condition (:include ert-test-result))
+ (condition (cl-assert nil))
+ (backtrace (cl-assert nil))
+ (infos (cl-assert nil)))
+(cl-defstruct (ert-test-quit (:include ert-test-result-with-condition)))
+(cl-defstruct (ert-test-failed (:include ert-test-result-with-condition)))
+(cl-defstruct (ert-test-aborted-with-non-local-exit
+ (:include ert-test-result)))
(defun ert--record-backtrace ()
@@ -774,7 +780,7 @@ and is displayed in front of the value of MESSAGE-FORM."
;; `ert-results-pop-to-backtrace-for-test-at-point' given that we
;; already have `ert-results-rerun-test-debugging-errors-at-point'.
;; For batch use, however, printing the backtrace may be useful.
- (loop
+ (cl-loop
;; 6 is the number of frames our own debugger adds (when
;; compiled; more when interpreted). FIXME: Need to describe a
;; procedure for determining this constant.
@@ -791,33 +797,33 @@ and is displayed in front of the value of MESSAGE-FORM."
(print-level 8)
(print-length 50))
(dolist (frame backtrace)
- (ecase (first frame)
+ (cl-ecase (car frame)
((nil)
;; Special operator.
- (destructuring-bind (special-operator &rest arg-forms)
+ (cl-destructuring-bind (special-operator &rest arg-forms)
(cdr frame)
(insert
- (format " %S\n" (list* special-operator arg-forms)))))
+ (format " %S\n" (cons special-operator arg-forms)))))
((t)
;; Function call.
- (destructuring-bind (fn &rest args) (cdr frame)
+ (cl-destructuring-bind (fn &rest args) (cdr frame)
(insert (format " %S(" fn))
- (loop for firstp = t then nil
- for arg in args do
- (unless firstp
- (insert " "))
- (insert (format "%S" arg)))
+ (cl-loop for firstp = t then nil
+ for arg in args do
+ (unless firstp
+ (insert " "))
+ (insert (format "%S" arg)))
(insert ")\n")))))))
;; A container for the state of the execution of a single test and
;; environment data needed during its execution.
-(defstruct ert--test-execution-info
- (test (assert nil))
- (result (assert nil))
+(cl-defstruct ert--test-execution-info
+ (test (cl-assert nil))
+ (result (cl-assert nil))
;; A thunk that may be called when RESULT has been set to its final
;; value and test execution should be terminated. Should not
;; return.
- (exit-continuation (assert nil))
+ (exit-continuation (cl-assert nil))
;; The binding of `debugger' outside of the execution of the test.
next-debugger
;; The binding of `ert-debug-on-error' that is in effect for the
@@ -826,7 +832,7 @@ and is displayed in front of the value of MESSAGE-FORM."
;; don't remember whether this feature is important.)
ert-debug-on-error)
-(defun ert--run-test-debugger (info debugger-args)
+(defun ert--run-test-debugger (info args)
"During a test run, `debugger' is bound to a closure that calls this function.
This function records failures and errors and either terminates
@@ -834,21 +840,21 @@ the test silently or calls the interactive debugger, as
appropriate.
INFO is the ert--test-execution-info corresponding to this test
-run. DEBUGGER-ARGS are the arguments to `debugger'."
- (destructuring-bind (first-debugger-arg &rest more-debugger-args)
- debugger-args
- (ecase first-debugger-arg
+run. ARGS are the arguments to `debugger'."
+ (cl-destructuring-bind (first-debugger-arg &rest more-debugger-args)
+ args
+ (cl-ecase first-debugger-arg
((lambda debug t exit nil)
- (apply (ert--test-execution-info-next-debugger info) debugger-args))
+ (apply (ert--test-execution-info-next-debugger info) args))
(error
- (let* ((condition (first more-debugger-args))
- (type (case (car condition)
+ (let* ((condition (car more-debugger-args))
+ (type (cl-case (car condition)
((quit) 'quit)
(otherwise 'failed)))
(backtrace (ert--record-backtrace))
(infos (reverse ert--infos)))
(setf (ert--test-execution-info-result info)
- (ecase type
+ (cl-ecase type
(quit
(make-ert-test-quit :condition condition
:backtrace backtrace
@@ -859,39 +865,42 @@ run. DEBUGGER-ARGS are the arguments to `debugger'."
:infos infos))))
;; Work around Emacs's heuristic (in eval.c) for detecting
;; errors in the debugger.
- (incf num-nonmacro-input-events)
+ (cl-incf num-nonmacro-input-events)
;; FIXME: We should probably implement more fine-grained
;; control a la non-t `debug-on-error' here.
(cond
((ert--test-execution-info-ert-debug-on-error info)
- (apply (ert--test-execution-info-next-debugger info) debugger-args))
+ (apply (ert--test-execution-info-next-debugger info) args))
(t))
(funcall (ert--test-execution-info-exit-continuation info)))))))
-(defun ert--run-test-internal (ert-test-execution-info)
- "Low-level function to run a test according to ERT-TEST-EXECUTION-INFO.
+(defun ert--run-test-internal (test-execution-info)
+ "Low-level function to run a test according to TEST-EXECUTION-INFO.
This mainly sets up debugger-related bindings."
- (lexical-let ((info ert-test-execution-info))
- (setf (ert--test-execution-info-next-debugger info) debugger
- (ert--test-execution-info-ert-debug-on-error info) ert-debug-on-error)
- (catch 'ert--pass
- ;; For now, each test gets its own temp buffer and its own
- ;; window excursion, just to be safe. If this turns out to be
- ;; too expensive, we can remove it.
- (with-temp-buffer
- (save-window-excursion
- (let ((debugger (lambda (&rest debugger-args)
- (ert--run-test-debugger info debugger-args)))
- (debug-on-error t)
- (debug-on-quit t)
- ;; FIXME: Do we need to store the old binding of this
- ;; and consider it in `ert--run-test-debugger'?
- (debug-ignored-errors nil)
- (ert--infos '()))
- (funcall (ert-test-body (ert--test-execution-info-test info))))))
- (ert-pass))
- (setf (ert--test-execution-info-result info) (make-ert-test-passed)))
+ (setf (ert--test-execution-info-next-debugger test-execution-info) debugger
+ (ert--test-execution-info-ert-debug-on-error test-execution-info)
+ ert-debug-on-error)
+ (catch 'ert--pass
+ ;; For now, each test gets its own temp buffer and its own
+ ;; window excursion, just to be safe. If this turns out to be
+ ;; too expensive, we can remove it.
+ (with-temp-buffer
+ (save-window-excursion
+ (let ((debugger (lambda (&rest args)
+ (ert--run-test-debugger test-execution-info
+ args)))
+ (debug-on-error t)
+ (debug-on-quit t)
+ ;; FIXME: Do we need to store the old binding of this
+ ;; and consider it in `ert--run-test-debugger'?
+ (debug-ignored-errors nil)
+ (ert--infos '()))
+ (funcall (ert-test-body (ert--test-execution-info-test
+ test-execution-info))))))
+ (ert-pass))
+ (setf (ert--test-execution-info-result test-execution-info)
+ (make-ert-test-passed))
nil)
(defun ert--force-message-log-buffer-truncation ()
@@ -929,18 +938,18 @@ The elements are of type `ert-test'.")
Returns the result and stores it in ERT-TEST's `most-recent-result' slot."
(setf (ert-test-most-recent-result ert-test) nil)
- (block error
- (lexical-let ((begin-marker
- (with-current-buffer (get-buffer-create "*Messages*")
- (set-marker (make-marker) (point-max)))))
+ (cl-block error
+ (let ((begin-marker
+ (with-current-buffer (get-buffer-create "*Messages*")
+ (point-max-marker))))
(unwind-protect
- (lexical-let ((info (make-ert--test-execution-info
- :test ert-test
- :result
- (make-ert-test-aborted-with-non-local-exit)
- :exit-continuation (lambda ()
- (return-from error nil))))
- (should-form-accu (list)))
+ (let ((info (make-ert--test-execution-info
+ :test ert-test
+ :result
+ (make-ert-test-aborted-with-non-local-exit)
+ :exit-continuation (lambda ()
+ (cl-return-from error nil))))
+ (should-form-accu (list)))
(unwind-protect
(let ((ert--should-execution-observer
(lambda (form-description)
@@ -982,32 +991,32 @@ t -- Always matches.
RESULT."
;; It would be easy to add `member' and `eql' types etc., but I
;; haven't bothered yet.
- (etypecase result-type
+ (cl-etypecase result-type
((member nil) nil)
((member t) t)
((member :failed) (ert-test-failed-p result))
((member :passed) (ert-test-passed-p result))
(cons
- (destructuring-bind (operator &rest operands) result-type
- (ecase operator
+ (cl-destructuring-bind (operator &rest operands) result-type
+ (cl-ecase operator
(and
- (case (length operands)
+ (cl-case (length operands)
(0 t)
(t
- (and (ert-test-result-type-p result (first operands))
- (ert-test-result-type-p result `(and ,@(rest operands)))))))
+ (and (ert-test-result-type-p result (car operands))
+ (ert-test-result-type-p result `(and ,@(cdr operands)))))))
(or
- (case (length operands)
+ (cl-case (length operands)
(0 nil)
(t
- (or (ert-test-result-type-p result (first operands))
- (ert-test-result-type-p result `(or ,@(rest operands)))))))
+ (or (ert-test-result-type-p result (car operands))
+ (ert-test-result-type-p result `(or ,@(cdr operands)))))))
(not
- (assert (eql (length operands) 1))
- (not (ert-test-result-type-p result (first operands))))
+ (cl-assert (eql (length operands) 1))
+ (not (ert-test-result-type-p result (car operands))))
(satisfies
- (assert (eql (length operands) 1))
- (funcall (first operands) result)))))))
+ (cl-assert (eql (length operands) 1))
+ (funcall (car operands) result)))))))
(defun ert-test-result-expected-p (test result)
"Return non-nil if TEST's expected result type matches RESULT."
@@ -1048,9 +1057,9 @@ set implied by them without checking whether it is really
contained in UNIVERSE."
;; This code needs to match the etypecase in
;; `ert-insert-human-readable-selector'.
- (etypecase selector
+ (cl-etypecase selector
((member nil) nil)
- ((member t) (etypecase universe
+ ((member t) (cl-etypecase universe
(list universe)
((member t) (ert-select-tests "" universe))))
((member :new) (ert-select-tests
@@ -1078,7 +1087,7 @@ contained in UNIVERSE."
universe))
((member :unexpected) (ert-select-tests `(not :expected) universe))
(string
- (etypecase universe
+ (cl-etypecase universe
((member t) (mapcar #'ert-get-test
(apropos-internal selector #'ert-test-boundp)))
(list (ert--remove-if-not (lambda (test)
@@ -1088,51 +1097,51 @@ contained in UNIVERSE."
universe))))
(ert-test (list selector))
(symbol
- (assert (ert-test-boundp selector))
+ (cl-assert (ert-test-boundp selector))
(list (ert-get-test selector)))
(cons
- (destructuring-bind (operator &rest operands) selector
- (ecase operator
+ (cl-destructuring-bind (operator &rest operands) selector
+ (cl-ecase operator
(member
(mapcar (lambda (purported-test)
- (etypecase purported-test
- (symbol (assert (ert-test-boundp purported-test))
+ (cl-etypecase purported-test
+ (symbol (cl-assert (ert-test-boundp purported-test))
(ert-get-test purported-test))
(ert-test purported-test)))
operands))
(eql
- (assert (eql (length operands) 1))
+ (cl-assert (eql (length operands) 1))
(ert-select-tests `(member ,@operands) universe))
(and
;; Do these definitions of AND, NOT and OR satisfy de
;; Morgan's laws? Should they?
- (case (length operands)
+ (cl-case (length operands)
(0 (ert-select-tests 't universe))
- (t (ert-select-tests `(and ,@(rest operands))
- (ert-select-tests (first operands)
+ (t (ert-select-tests `(and ,@(cdr operands))
+ (ert-select-tests (car operands)
universe)))))
(not
- (assert (eql (length operands) 1))
+ (cl-assert (eql (length operands) 1))
(let ((all-tests (ert-select-tests 't universe)))
(ert--set-difference all-tests
- (ert-select-tests (first operands)
+ (ert-select-tests (car operands)
all-tests))))
(or
- (case (length operands)
+ (cl-case (length operands)
(0 (ert-select-tests 'nil universe))
- (t (ert--union (ert-select-tests (first operands) universe)
- (ert-select-tests `(or ,@(rest operands))
+ (t (ert--union (ert-select-tests (car operands) universe)
+ (ert-select-tests `(or ,@(cdr operands))
universe)))))
(tag
- (assert (eql (length operands) 1))
- (let ((tag (first operands)))
+ (cl-assert (eql (length operands) 1))
+ (let ((tag (car operands)))
(ert-select-tests `(satisfies
,(lambda (test)
(member tag (ert-test-tags test))))
universe)))
(satisfies
- (assert (eql (length operands) 1))
- (ert--remove-if-not (first operands)
+ (cl-assert (eql (length operands) 1))
+ (ert--remove-if-not (car operands)
(ert-select-tests 't universe))))))))
(defun ert--insert-human-readable-selector (selector)
@@ -1141,26 +1150,27 @@ contained in UNIVERSE."
;; `backtrace' slot of the result objects in the
;; `most-recent-result' slots of test case objects in (eql ...) or
;; (member ...) selectors.
- (labels ((rec (selector)
- ;; This code needs to match the etypecase in `ert-select-tests'.
- (etypecase selector
- ((or (member nil t
- :new :failed :passed
- :expected :unexpected)
- string
- symbol)
- selector)
- (ert-test
- (if (ert-test-name selector)
- (make-symbol (format "<%S>" (ert-test-name selector)))
- (make-symbol "<unnamed test>")))
- (cons
- (destructuring-bind (operator &rest operands) selector
- (ecase operator
- ((member eql and not or)
- `(,operator ,@(mapcar #'rec operands)))
- ((member tag satisfies)
- selector)))))))
+ (cl-labels ((rec (selector)
+ ;; This code needs to match the etypecase in
+ ;; `ert-select-tests'.
+ (cl-etypecase selector
+ ((or (member nil t
+ :new :failed :passed
+ :expected :unexpected)
+ string
+ symbol)
+ selector)
+ (ert-test
+ (if (ert-test-name selector)
+ (make-symbol (format "<%S>" (ert-test-name selector)))
+ (make-symbol "<unnamed test>")))
+ (cons
+ (cl-destructuring-bind (operator &rest operands) selector
+ (cl-ecase operator
+ ((member eql and not or)
+ `(,operator ,@(mapcar #'rec operands)))
+ ((member tag satisfies)
+ selector)))))))
(insert (format "%S" (rec selector)))))
@@ -1177,21 +1187,21 @@ contained in UNIVERSE."
;; that corresponds to this run in order to be able to update the
;; statistics correctly when a test is re-run interactively and has a
;; different result than before.
-(defstruct ert--stats
- (selector (assert nil))
+(cl-defstruct ert--stats
+ (selector (cl-assert nil))
;; The tests, in order.
- (tests (assert nil) :type vector)
+ (tests (cl-assert nil) :type vector)
;; A map of test names (or the test objects themselves for unnamed
;; tests) to indices into the `tests' vector.
- (test-map (assert nil) :type hash-table)
+ (test-map (cl-assert nil) :type hash-table)
;; The results of the tests during this run, in order.
- (test-results (assert nil) :type vector)
+ (test-results (cl-assert nil) :type vector)
;; The start times of the tests, in order, as reported by
;; `current-time'.
- (test-start-times (assert nil) :type vector)
+ (test-start-times (cl-assert nil) :type vector)
;; The end times of the tests, in order, as reported by
;; `current-time'.
- (test-end-times (assert nil) :type vector)
+ (test-end-times (cl-assert nil) :type vector)
(passed-expected 0)
(passed-unexpected 0)
(failed-expected 0)
@@ -1241,21 +1251,25 @@ Also changes the counters in STATS to match."
(results (ert--stats-test-results stats))
(old-test (aref tests pos))
(map (ert--stats-test-map stats)))
- (flet ((update (d)
- (if (ert-test-result-expected-p (aref tests pos)
- (aref results pos))
- (etypecase (aref results pos)
- (ert-test-passed (incf (ert--stats-passed-expected stats) d))
- (ert-test-failed (incf (ert--stats-failed-expected stats) d))
- (null)
- (ert-test-aborted-with-non-local-exit)
- (ert-test-quit))
- (etypecase (aref results pos)
- (ert-test-passed (incf (ert--stats-passed-unexpected stats) d))
- (ert-test-failed (incf (ert--stats-failed-unexpected stats) d))
- (null)
- (ert-test-aborted-with-non-local-exit)
- (ert-test-quit)))))
+ (cl-flet ((update (d)
+ (if (ert-test-result-expected-p (aref tests pos)
+ (aref results pos))
+ (cl-etypecase (aref results pos)
+ (ert-test-passed
+ (cl-incf (ert--stats-passed-expected stats) d))
+ (ert-test-failed
+ (cl-incf (ert--stats-failed-expected stats) d))
+ (null)
+ (ert-test-aborted-with-non-local-exit)
+ (ert-test-quit))
+ (cl-etypecase (aref results pos)
+ (ert-test-passed
+ (cl-incf (ert--stats-passed-unexpected stats) d))
+ (ert-test-failed
+ (cl-incf (ert--stats-failed-unexpected stats) d))
+ (null)
+ (ert-test-aborted-with-non-local-exit)
+ (ert-test-quit)))))
;; Adjust counters to remove the result that is currently in stats.
(update -1)
;; Put new test and result into stats.
@@ -1273,11 +1287,11 @@ Also changes the counters in STATS to match."
SELECTOR is the selector that was used to select TESTS."
(setq tests (ert--coerce-to-vector tests))
(let ((map (make-hash-table :size (length tests))))
- (loop for i from 0
- for test across tests
- for key = (ert--stats-test-key test) do
- (assert (not (gethash key map)))
- (setf (gethash key map) i))
+ (cl-loop for i from 0
+ for test across tests
+ for key = (ert--stats-test-key test) do
+ (cl-assert (not (gethash key map)))
+ (setf (gethash key map) i))
(make-ert--stats :selector selector
:tests tests
:test-map map
@@ -1319,8 +1333,8 @@ SELECTOR is the selector that was used to select TESTS."
(force-mode-line-update)
(unwind-protect
(progn
- (loop for test in tests do
- (ert-run-or-rerun-test stats test listener))
+ (cl-loop for test in tests do
+ (ert-run-or-rerun-test stats test listener))
(setq abortedp nil))
(setf (ert--stats-aborted-p stats) abortedp)
(setf (ert--stats-end-time stats) (current-time))
@@ -1344,7 +1358,7 @@ SELECTOR is the selector that was used to select TESTS."
"Return a character that represents the test result RESULT.
EXPECTEDP specifies whether the result was expected."
- (let ((s (etypecase result
+ (let ((s (cl-etypecase result
(ert-test-passed ".P")
(ert-test-failed "fF")
(null "--")
@@ -1356,7 +1370,7 @@ EXPECTEDP specifies whether the result was expected."
"Return a string that represents the test result RESULT.
EXPECTEDP specifies whether the result was expected."
- (let ((s (etypecase result
+ (let ((s (cl-etypecase result
(ert-test-passed '("passed" "PASSED"))
(ert-test-failed '("failed" "FAILED"))
(null '("unknown" "UNKNOWN"))
@@ -1378,9 +1392,9 @@ Ensures a final newline is inserted."
"Insert `ert-info' infos from RESULT into current buffer.
RESULT must be an `ert-test-result-with-condition'."
- (check-type result ert-test-result-with-condition)
+ (cl-check-type result ert-test-result-with-condition)
(dolist (info (ert-test-result-with-condition-infos result))
- (destructuring-bind (prefix . message) info
+ (cl-destructuring-bind (prefix . message) info
(let ((begin (point))
(indentation (make-string (+ (length prefix) 4) ?\s))
(end nil))
@@ -1416,14 +1430,14 @@ Returns the stats object."
(ert-run-tests
selector
(lambda (event-type &rest event-args)
- (ecase event-type
+ (cl-ecase event-type
(run-started
- (destructuring-bind (stats) event-args
+ (cl-destructuring-bind (stats) event-args
(message "Running %s tests (%s)"
(length (ert--stats-tests stats))
(ert--format-time-iso8601 (ert--stats-start-time stats)))))
(run-ended
- (destructuring-bind (stats abortedp) event-args
+ (cl-destructuring-bind (stats abortedp) event-args
(let ((unexpected (ert-stats-completed-unexpected stats))
(expected-failures (ert--stats-failed-expected stats)))
(message "\n%sRan %s tests, %s results as expected%s (%s)%s\n"
@@ -1441,19 +1455,19 @@ Returns the stats object."
(format "\n%s expected failures" expected-failures)))
(unless (zerop unexpected)
(message "%s unexpected results:" unexpected)
- (loop for test across (ert--stats-tests stats)
- for result = (ert-test-most-recent-result test) do
- (when (not (ert-test-result-expected-p test result))
- (message "%9s %S"
- (ert-string-for-test-result result nil)
- (ert-test-name test))))
+ (cl-loop for test across (ert--stats-tests stats)
+ for result = (ert-test-most-recent-result test) do
+ (when (not (ert-test-result-expected-p test result))
+ (message "%9s %S"
+ (ert-string-for-test-result result nil)
+ (ert-test-name test))))
(message "%s" "")))))
(test-started
)
(test-ended
- (destructuring-bind (stats test result) event-args
+ (cl-destructuring-bind (stats test result) event-args
(unless (ert-test-result-expected-p test result)
- (etypecase result
+ (cl-etypecase result
(ert-test-passed
(message "Test %S passed unexpectedly" (ert-test-name test)))
(ert-test-result-with-condition
@@ -1479,7 +1493,7 @@ Returns the stats object."
(ert--pp-with-indentation-and-newline
(ert-test-result-with-condition-condition result)))
(goto-char (1- (point-max)))
- (assert (looking-at "\n"))
+ (cl-assert (looking-at "\n"))
(delete-char 1)
(message "Test %S condition:" (ert-test-name test))
(message "%s" (buffer-string))))
@@ -1527,7 +1541,7 @@ the tests)."
(1 font-lock-keyword-face nil t)
(2 font-lock-function-name-face nil t)))))
-(defun* ert--remove-from-list (list-var element &key key test)
+(cl-defun ert--remove-from-list (list-var element &key key test)
"Remove ELEMENT from the value of LIST-VAR if present.
This can be used as an inverse of `add-to-list'."
@@ -1552,7 +1566,7 @@ If ADD-DEFAULT-TO-PROMPT is non-nil, PROMPT will be modified to
include the default, if any.
Signals an error if no test name was read."
- (etypecase default
+ (cl-etypecase default
(string (let ((symbol (intern-soft default)))
(unless (and symbol (ert-test-boundp symbol))
(setq default nil))))
@@ -1609,11 +1623,11 @@ Nothing more than an interactive interface to `ert-make-test-unbound'."
;;; Display of test progress and results.
;; An entry in the results buffer ewoc. There is one entry per test.
-(defstruct ert--ewoc-entry
- (test (assert nil))
+(cl-defstruct ert--ewoc-entry
+ (test (cl-assert nil))
;; If the result of this test was expected, its ewoc entry is hidden
;; initially.
- (hidden-p (assert nil))
+ (hidden-p (cl-assert nil))
;; An ewoc entry may be collapsed to hide details such as the error
;; condition.
;;
@@ -1689,7 +1703,7 @@ Also sets `ert--results-progress-bar-button-begin'."
((ert--stats-current-test stats) 'running)
((ert--stats-end-time stats) 'finished)
(t 'preparing))))
- (ecase state
+ (cl-ecase state
(preparing
(insert ""))
(aborted
@@ -1700,12 +1714,12 @@ Also sets `ert--results-progress-bar-button-begin'."
(t
(insert "Aborted."))))
(running
- (assert (ert--stats-current-test stats))
+ (cl-assert (ert--stats-current-test stats))
(insert "Running test: ")
(ert-insert-test-name-button (ert-test-name
(ert--stats-current-test stats))))
(finished
- (assert (not (ert--stats-current-test stats)))
+ (cl-assert (not (ert--stats-current-test stats)))
(insert "Finished.")))
(insert "\n")
(if (ert--stats-end-time stats)
@@ -1808,7 +1822,7 @@ non-nil, returns the face for expected results.."
(defun ert-face-for-stats (stats)
"Return a face that represents STATS."
(cond ((ert--stats-aborted-p stats) 'nil)
- ((plusp (ert-stats-completed-unexpected stats))
+ ((cl-plusp (ert-stats-completed-unexpected stats))
(ert-face-for-test-result nil))
((eql (ert-stats-completed-expected stats) (ert-stats-total stats))
(ert-face-for-test-result t))
@@ -1819,7 +1833,7 @@ non-nil, returns the face for expected results.."
(let* ((test (ert--ewoc-entry-test entry))
(stats ert--results-stats)
(result (let ((pos (ert--stats-test-pos stats test)))
- (assert pos)
+ (cl-assert pos)
(aref (ert--stats-test-results stats) pos)))
(hiddenp (ert--ewoc-entry-hidden-p entry))
(expandedp (ert--ewoc-entry-expanded-p entry))
@@ -1845,7 +1859,7 @@ non-nil, returns the face for expected results.."
(ert--string-first-line (ert-test-documentation test))
'font-lock-face 'font-lock-doc-face)
"\n"))
- (etypecase result
+ (cl-etypecase result
(ert-test-passed
(if (ert-test-result-expected-p test result)
(insert " passed\n")
@@ -1903,9 +1917,10 @@ BUFFER-NAME, if non-nil, is the buffer name to use."
(make-string (ert-stats-total stats)
(ert-char-for-test-result nil t)))
(set (make-local-variable 'ert--results-listener) listener)
- (loop for test across (ert--stats-tests stats) do
- (ewoc-enter-last ewoc
- (make-ert--ewoc-entry :test test :hidden-p t)))
+ (cl-loop for test across (ert--stats-tests stats) do
+ (ewoc-enter-last ewoc
+ (make-ert--ewoc-entry :test test
+ :hidden-p t)))
(ert--results-update-ewoc-hf ert--results-ewoc ert--results-stats)
(goto-char (1- (point-max)))
buffer)))))
@@ -1940,21 +1955,21 @@ and how to display message."
default nil))
nil))
(unless message-fn (setq message-fn 'message))
- (lexical-let ((output-buffer-name output-buffer-name)
- buffer
- listener
- (message-fn message-fn))
+ (let ((output-buffer-name output-buffer-name)
+ buffer
+ listener
+ (message-fn message-fn))
(setq listener
(lambda (event-type &rest event-args)
- (ecase event-type
+ (cl-ecase event-type
(run-started
- (destructuring-bind (stats) event-args
+ (cl-destructuring-bind (stats) event-args
(setq buffer (ert--setup-results-buffer stats
listener
output-buffer-name))
(pop-to-buffer buffer)))
(run-ended
- (destructuring-bind (stats abortedp) event-args
+ (cl-destructuring-bind (stats abortedp) event-args
(funcall message-fn
"%sRan %s tests, %s results were as expected%s"
(if (not abortedp)
@@ -1971,19 +1986,19 @@ and how to display message."
ert--results-ewoc)
stats)))
(test-started
- (destructuring-bind (stats test) event-args
+ (cl-destructuring-bind (stats test) event-args
(with-current-buffer buffer
(let* ((ewoc ert--results-ewoc)
(pos (ert--stats-test-pos stats test))
(node (ewoc-nth ewoc pos)))
- (assert node)
+ (cl-assert node)
(setf (ert--ewoc-entry-test (ewoc-data node)) test)
(aset ert--results-progress-bar-string pos
(ert-char-for-test-result nil t))
(ert--results-update-stats-display-maybe ewoc stats)
(ewoc-invalidate ewoc node)))))
(test-ended
- (destructuring-bind (stats test result) event-args
+ (cl-destructuring-bind (stats test result) event-args
(with-current-buffer buffer
(let* ((ewoc ert--results-ewoc)
(pos (ert--stats-test-pos stats test))
@@ -2015,28 +2030,28 @@ and how to display message."
(define-derived-mode ert-results-mode special-mode "ERT-Results"
"Major mode for viewing results of ERT test runs.")
-(loop for (key binding) in
- '(;; Stuff that's not in the menu.
- ("\t" forward-button)
- ([backtab] backward-button)
- ("j" ert-results-jump-between-summary-and-result)
- ("L" ert-results-toggle-printer-limits-for-test-at-point)
- ("n" ert-results-next-test)
- ("p" ert-results-previous-test)
- ;; Stuff that is in the menu.
- ("R" ert-results-rerun-all-tests)
- ("r" ert-results-rerun-test-at-point)
- ("d" ert-results-rerun-test-at-point-debugging-errors)
- ("." ert-results-find-test-at-point-other-window)
- ("b" ert-results-pop-to-backtrace-for-test-at-point)
- ("m" ert-results-pop-to-messages-for-test-at-point)
- ("l" ert-results-pop-to-should-forms-for-test-at-point)
- ("h" ert-results-describe-test-at-point)
- ("D" ert-delete-test)
- ("T" ert-results-pop-to-timings)
- )
- do
- (define-key ert-results-mode-map key binding))
+(cl-loop for (key binding) in
+ '( ;; Stuff that's not in the menu.
+ ("\t" forward-button)
+ ([backtab] backward-button)
+ ("j" ert-results-jump-between-summary-and-result)
+ ("L" ert-results-toggle-printer-limits-for-test-at-point)
+ ("n" ert-results-next-test)
+ ("p" ert-results-previous-test)
+ ;; Stuff that is in the menu.
+ ("R" ert-results-rerun-all-tests)
+ ("r" ert-results-rerun-test-at-point)
+ ("d" ert-results-rerun-test-at-point-debugging-errors)
+ ("." ert-results-find-test-at-point-other-window)
+ ("b" ert-results-pop-to-backtrace-for-test-at-point)
+ ("m" ert-results-pop-to-messages-for-test-at-point)
+ ("l" ert-results-pop-to-should-forms-for-test-at-point)
+ ("h" ert-results-describe-test-at-point)
+ ("D" ert-delete-test)
+ ("T" ert-results-pop-to-timings)
+ )
+ do
+ (define-key ert-results-mode-map key binding))
(easy-menu-define ert-results-mode-menu ert-results-mode-map
"Menu for `ert-results-mode'."
@@ -2116,15 +2131,15 @@ To be used in the ERT results buffer."
EWOC-FN specifies the direction and should be either `ewoc-prev'
or `ewoc-next'. If there are no more nodes in that direction, an
error is signaled with the message ERROR-MESSAGE."
- (loop
+ (cl-loop
(setq node (funcall ewoc-fn ert--results-ewoc node))
(when (null node)
(error "%s" error-message))
(unless (ert--ewoc-entry-hidden-p (ewoc-data node))
(goto-char (ewoc-location node))
- (return))))
+ (cl-return))))
-(defun ert--results-expand-collapse-button-action (button)
+(defun ert--results-expand-collapse-button-action (_button)
"Expand or collapse the test node BUTTON belongs to."
(let* ((ewoc ert--results-ewoc)
(node (save-excursion
@@ -2153,11 +2168,11 @@ To be used in the ERT results buffer."
(defun ert--ewoc-position (ewoc node)
;; checkdoc-order: nil
"Return the position of NODE in EWOC, or nil if NODE is not in EWOC."
- (loop for i from 0
- for node-here = (ewoc-nth ewoc 0) then (ewoc-next ewoc node-here)
- do (when (eql node node-here)
- (return i))
- finally (return nil)))
+ (cl-loop for i from 0
+ for node-here = (ewoc-nth ewoc 0) then (ewoc-next ewoc node-here)
+ do (when (eql node node-here)
+ (cl-return i))
+ finally (cl-return nil)))
(defun ert-results-jump-between-summary-and-result ()
"Jump back and forth between the test run summary and individual test results.
@@ -2205,7 +2220,7 @@ To be used in the ERT results buffer."
"Return the test at point, or nil.
To be used in the ERT results buffer."
- (assert (eql major-mode 'ert-results-mode))
+ (cl-assert (eql major-mode 'ert-results-mode))
(if (ert--results-test-node-or-null-at-point)
(let* ((node (ert--results-test-node-at-point))
(test (ert--ewoc-entry-test (ewoc-data node))))
@@ -2277,9 +2292,9 @@ definition."
(point))
((eventp last-command-event)
(posn-point (event-start last-command-event)))
- (t (assert nil))))
+ (t (cl-assert nil))))
-(defun ert--results-progress-bar-button-action (button)
+(defun ert--results-progress-bar-button-action (_button)
"Jump to details for the test represented by the character clicked in BUTTON."
(goto-char (ert--button-action-position))
(ert-results-jump-between-summary-and-result))
@@ -2289,7 +2304,7 @@ definition."
To be used in the ERT results buffer."
(interactive)
- (assert (eql major-mode 'ert-results-mode))
+ (cl-assert (eql major-mode 'ert-results-mode))
(let ((selector (ert--stats-selector ert--results-stats)))
(ert-run-tests-interactively selector (buffer-name))))
@@ -2298,13 +2313,13 @@ To be used in the ERT results buffer."
To be used in the ERT results buffer."
(interactive)
- (destructuring-bind (test redefinition-state)
+ (cl-destructuring-bind (test redefinition-state)
(ert--results-test-at-point-allow-redefinition)
(when (null test)
(error "No test at point"))
(let* ((stats ert--results-stats)
(progress-message (format "Running %stest %S"
- (ecase redefinition-state
+ (cl-ecase redefinition-state
((nil) "")
(redefined "new definition of ")
(deleted "deleted "))
@@ -2345,7 +2360,7 @@ To be used in the ERT results buffer."
(stats ert--results-stats)
(pos (ert--stats-test-pos stats test))
(result (aref (ert--stats-test-results stats) pos)))
- (etypecase result
+ (cl-etypecase result
(ert-test-passed (error "Test passed, no backtrace available"))
(ert-test-result-with-condition
(let ((backtrace (ert-test-result-with-condition-backtrace result))
@@ -2403,13 +2418,14 @@ To be used in the ERT results buffer."
(ert-simple-view-mode)
(if (null (ert-test-result-should-forms result))
(insert "\n(No should forms during this test.)\n")
- (loop for form-description in (ert-test-result-should-forms result)
- for i from 1 do
- (insert "\n")
- (insert (format "%s: " i))
- (let ((begin (point)))
- (ert--pp-with-indentation-and-newline form-description)
- (ert--make-xrefs-region begin (point)))))
+ (cl-loop for form-description
+ in (ert-test-result-should-forms result)
+ for i from 1 do
+ (insert "\n")
+ (insert (format "%s: " i))
+ (let ((begin (point)))
+ (ert--pp-with-indentation-and-newline form-description)
+ (ert--make-xrefs-region begin (point)))))
(goto-char (point-min))
(insert "`should' forms executed during test `")
(ert-insert-test-name-button (ert-test-name test))
@@ -2438,17 +2454,16 @@ To be used in the ERT results buffer."
To be used in the ERT results buffer."
(interactive)
(let* ((stats ert--results-stats)
- (start-times (ert--stats-test-start-times stats))
- (end-times (ert--stats-test-end-times stats))
(buffer (get-buffer-create "*ERT timings*"))
- (data (loop for test across (ert--stats-tests stats)
- for start-time across (ert--stats-test-start-times stats)
- for end-time across (ert--stats-test-end-times stats)
- collect (list test
- (float-time (subtract-time end-time
- start-time))))))
+ (data (cl-loop for test across (ert--stats-tests stats)
+ for start-time across (ert--stats-test-start-times
+ stats)
+ for end-time across (ert--stats-test-end-times stats)
+ collect (list test
+ (float-time (subtract-time
+ end-time start-time))))))
(setq data (sort data (lambda (a b)
- (> (second a) (second b)))))
+ (> (cl-second a) (cl-second b)))))
(pop-to-buffer buffer)
(let ((inhibit-read-only t))
(buffer-disable-undo)
@@ -2457,13 +2472,13 @@ To be used in the ERT results buffer."
(if (null data)
(insert "(No data)\n")
(insert (format "%-3s %8s %8s\n" "" "time" "cumul"))
- (loop for (test time) in data
- for cumul-time = time then (+ cumul-time time)
- for i from 1 do
- (let ((begin (point)))
- (insert (format "%3s: %8.3f %8.3f " i time cumul-time))
- (ert-insert-test-name-button (ert-test-name test))
- (insert "\n"))))
+ (cl-loop for (test time) in data
+ for cumul-time = time then (+ cumul-time time)
+ for i from 1 do
+ (progn
+ (insert (format "%3s: %8.3f %8.3f " i time cumul-time))
+ (ert-insert-test-name-button (ert-test-name test))
+ (insert "\n"))))
(goto-char (point-min))
(insert "Tests by run time (seconds):\n\n")
(forward-line 1))))
@@ -2476,7 +2491,7 @@ To be used in the ERT results buffer."
(error "Requires Emacs 24"))
(let (test-name
test-definition)
- (etypecase test-or-test-name
+ (cl-etypecase test-or-test-name
(symbol (setq test-name test-or-test-name
test-definition (ert-get-test test-or-test-name)))
(ert-test (setq test-name (ert-test-name test-or-test-name)
diff --git a/lisp/emacs-lisp/gv.el b/lisp/emacs-lisp/gv.el
index e3e5b321047..cf090e5e758 100644
--- a/lisp/emacs-lisp/gv.el
+++ b/lisp/emacs-lisp/gv.el
@@ -441,6 +441,26 @@ The return value is the last VAL in the list.
`(logior (logand ,v ,mask)
(logand ,getter (lognot ,mask))))))))))
+;;; References
+
+;;;###autoload
+(defmacro gv-ref (place)
+ "Return a reference to PLACE.
+This is like the `&' operator of the C language."
+ (gv-letplace (getter setter) place
+ `(cons (lambda () ,getter)
+ (lambda (gv--val) ,(funcall setter 'gv--val)))))
+
+(defsubst gv-deref (ref)
+ "Dereference REF, returning the referenced value.
+This is like the `*' operator of the C language.
+REF must have been previously obtained with `gv-ref'."
+ (funcall (car ref)))
+;; Don't use `declare' because it seems to introduce circularity problems:
+;; Warning: Eager macro-expansion skipped due to cycle:
+;; … => (load "gv.el") => (macroexpand-all (defsubst gv-deref …)) => (macroexpand (defun …)) => (load "gv.el")
+(gv-define-setter gv-deref (v ref) `(funcall (cdr ,ref) ,v))
+
;;; Vaguely related definitions that should be moved elsewhere.
;; (defun alist-get (key alist)
diff --git a/lisp/emacs-lisp/lisp-mnt.el b/lisp/emacs-lisp/lisp-mnt.el
index 024790d7b4b..f2e691102d4 100644
--- a/lisp/emacs-lisp/lisp-mnt.el
+++ b/lisp/emacs-lisp/lisp-mnt.el
@@ -209,10 +209,10 @@ If the given section does not exist, return nil."
The HEADER is the section string marking the beginning of the
section. If the given section does not exist, return nil.
-The end of the section is defined as the beginning of the next
-section of the same level or lower. The function
-`lisp-outline-level' is used to compute the level of a section.
-If no such section exists, return the end of the buffer."
+The section ends before the first non-comment text or the next
+section of the same level or lower; whatever comes first. The
+function `lisp-outline-level' is used to compute the level of
+a section."
(require 'outline) ;; for outline-regexp.
(let ((start (lm-section-start header)))
(when start
@@ -230,9 +230,15 @@ If no such section exists, return the end of the buffer."
(beginning-of-line)
(lisp-outline-level))
level)))
- (if next-section-found
- (line-beginning-position)
- (point-max)))))))
+ (min (if next-section-found
+ (progn (beginning-of-line 0)
+ (unless (looking-at " ")
+ (beginning-of-line 2))
+ (point))
+ (point-max))
+ (progn (goto-char start)
+ (while (forward-comment 1))
+ (point))))))))
(defsubst lm-code-start ()
"Return the buffer location of the `Code' start marker."
@@ -283,13 +289,8 @@ The returned value is a list of strings, one per line."
(when res
(setq res (list res))
(forward-line 1)
- (while (and (or (looking-at (concat lm-header-prefix "[\t ]+"))
- (and (not (looking-at
- (lm-get-header-re "\\sw\\(\\sw\\|\\s_\\)*")))
- (looking-at lm-header-prefix)))
- (goto-char (match-end 0))
- (looking-at ".+"))
- (setq res (cons (match-string-no-properties 0) res))
+ (while (looking-at "^;+\\(\t\\|[\t\s]\\{2,\\}\\)\\(.+\\)")
+ (push (match-string-no-properties 2) res)
(forward-line 1)))
(nreverse res))))
@@ -307,10 +308,13 @@ If FILE is nil, execute BODY in the current buffer."
(emacs-lisp-mode)
,@body)
(save-excursion
- ;; Switching major modes is too drastic, so just switch
- ;; temporarily to the Emacs Lisp mode syntax table.
- (with-syntax-table emacs-lisp-mode-syntax-table
- ,@body))))))
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ ;; Switching major modes is too drastic, so just switch
+ ;; temporarily to the Emacs Lisp mode syntax table.
+ (with-syntax-table emacs-lisp-mode-syntax-table
+ ,@body)))))))
;; Fixme: Probably this should be amalgamated with copyright.el; also
;; we need a check for ranges in copyright years.
@@ -490,6 +494,14 @@ absent, return nil."
(when start
(buffer-substring-no-properties start (lm-commentary-end))))))
+(defun lm-homepage (&optional file)
+ "Return the homepage in file FILE, or current buffer if FILE is nil."
+ (let ((page (lm-with-file file
+ (lm-header "\\(?:x-\\)?\\(?:homepage\\|url\\)"))))
+ (if (and page (string-match "^<.+>$" page))
+ (substring page 1 -1)
+ page)))
+
;;; Verification and synopses
(defun lm-insert-at-column (col &rest strings)
diff --git a/lisp/emacs-lisp/lisp-mode.el b/lisp/emacs-lisp/lisp-mode.el
index fc1cfe7afd1..b528dd11316 100644
--- a/lisp/emacs-lisp/lisp-mode.el
+++ b/lisp/emacs-lisp/lisp-mode.el
@@ -195,49 +195,38 @@ score-mode.el. KEYWORDS-CASE-INSENSITIVE non-nil means that for
font-lock keywords will not be case sensitive."
(when lisp-syntax
(set-syntax-table lisp-mode-syntax-table))
- (make-local-variable 'paragraph-ignore-fill-prefix)
- (setq paragraph-ignore-fill-prefix t)
- (make-local-variable 'fill-paragraph-function)
- (setq fill-paragraph-function 'lisp-fill-paragraph)
+ (setq-local paragraph-ignore-fill-prefix t)
+ (setq-local fill-paragraph-function 'lisp-fill-paragraph)
;; Adaptive fill mode gets the fill wrong for a one-line paragraph made of
;; a single docstring. Let's fix it here.
- (set (make-local-variable 'adaptive-fill-function)
- (lambda () (if (looking-at "\\s-+\"[^\n\"]+\"\\s-*$") "")))
+ (setq-local adaptive-fill-function
+ (lambda () (if (looking-at "\\s-+\"[^\n\"]+\"\\s-*$") "")))
;; Adaptive fill mode gets in the way of auto-fill,
;; and should make no difference for explicit fill
;; because lisp-fill-paragraph should do the job.
;; I believe that newcomment's auto-fill code properly deals with it -stef
;;(set (make-local-variable 'adaptive-fill-mode) nil)
- (make-local-variable 'indent-line-function)
- (setq indent-line-function 'lisp-indent-line)
- (make-local-variable 'outline-regexp)
- (setq outline-regexp ";;;\\(;* [^ \t\n]\\|###autoload\\)\\|(")
- (make-local-variable 'outline-level)
- (setq outline-level 'lisp-outline-level)
- (make-local-variable 'comment-start)
- (setq comment-start ";")
- (make-local-variable 'comment-start-skip)
+ (setq-local indent-line-function 'lisp-indent-line)
+ (setq-local outline-regexp ";;;\\(;* [^ \t\n]\\|###autoload\\)\\|(")
+ (setq-local outline-level 'lisp-outline-level)
+ (setq-local add-log-current-defun-function #'lisp-current-defun-name)
+ (setq-local comment-start ";")
;; Look within the line for a ; following an even number of backslashes
;; after either a non-backslash or the line beginning.
- (setq comment-start-skip "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\);+ *")
- (make-local-variable 'font-lock-comment-start-skip)
+ (setq-local comment-start-skip "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\);+ *")
;; Font lock mode uses this only when it KNOWS a comment is starting.
- (setq font-lock-comment-start-skip ";+ *")
- (make-local-variable 'comment-add)
- (setq comment-add 1) ;default to `;;' in comment-region
- (make-local-variable 'comment-column)
- (setq comment-column 40)
+ (setq-local font-lock-comment-start-skip ";+ *")
+ (setq-local comment-add 1) ;default to `;;' in comment-region
+ (setq-local comment-column 40)
;; Don't get confused by `;' in doc strings when paragraph-filling.
- (set (make-local-variable 'comment-use-global-state) t)
- (make-local-variable 'imenu-generic-expression)
- (setq imenu-generic-expression lisp-imenu-generic-expression)
- (make-local-variable 'multibyte-syntax-as-symbol)
- (setq multibyte-syntax-as-symbol t)
- (set (make-local-variable 'syntax-begin-function) 'beginning-of-defun)
+ (setq-local comment-use-global-state t)
+ (setq-local imenu-generic-expression lisp-imenu-generic-expression)
+ (setq-local multibyte-syntax-as-symbol t)
+ (setq-local syntax-begin-function 'beginning-of-defun)
(setq font-lock-defaults
`((lisp-font-lock-keywords
lisp-font-lock-keywords-1 lisp-font-lock-keywords-2)
- nil ,keywords-case-insensitive (("+-*/.<>=!?$%_&~^:@" . "w")) nil
+ nil ,keywords-case-insensitive nil nil
(font-lock-mark-block-function . mark-defun)
(font-lock-syntactic-face-function
. lisp-font-lock-syntactic-face-function))))
@@ -249,6 +238,32 @@ font-lock keywords will not be case sensitive."
1000
len)))
+(defun lisp-current-defun-name ()
+ "Return the name of the defun at point, or nil."
+ (save-excursion
+ (let ((location (point)))
+ ;; If we are now precisely at the beginning of a defun, make sure
+ ;; beginning-of-defun finds that one rather than the previous one.
+ (or (eobp) (forward-char 1))
+ (beginning-of-defun)
+ ;; Make sure we are really inside the defun found, not after it.
+ (when (and (looking-at "\\s(")
+ (progn (end-of-defun)
+ (< location (point)))
+ (progn (forward-sexp -1)
+ (>= location (point))))
+ (if (looking-at "\\s(")
+ (forward-char 1))
+ ;; Skip the defining construct name, typically "defun" or
+ ;; "defvar".
+ (forward-sexp 1)
+ ;; The second element is usually a symbol being defined. If it
+ ;; is not, use the first symbol in it.
+ (skip-chars-forward " \t\n'(")
+ (buffer-substring-no-properties (point)
+ (progn (forward-sexp 1)
+ (point)))))))
+
(defvar lisp-mode-shared-map
(let ((map (make-sparse-keymap)))
(define-key map "\e\C-q" 'indent-sexp)
@@ -320,6 +335,22 @@ font-lock keywords will not be case sensitive."
(bindings--define-key prof-map [prof-func]
'(menu-item "Instrument Function..." elp-instrument-function
:help "Instrument a function for profiling"))
+ ;; Maybe this should be in a separate submenu from the ELP stuff?
+ (bindings--define-key prof-map [sep-natprof] menu-bar-separator)
+ (bindings--define-key prof-map [prof-natprof-stop]
+ '(menu-item "Stop Native Profiler" profiler-stop
+ :help "Stop recording profiling information"
+ :enable (and (featurep 'profiler)
+ (profiler-running-p))))
+ (bindings--define-key prof-map [prof-natprof-report]
+ '(menu-item "Show Profiler Report" profiler-report
+ :help "Show the current profiler report"
+ :enable (and (featurep 'profiler)
+ (profiler-running-p))))
+ (bindings--define-key prof-map [prof-natprof-start]
+ '(menu-item "Start Native Profiler..." profiler-start
+ :help "Start recording profiling information"))
+
(bindings--define-key menu-map [lint] (cons "Linting" lint-map))
(bindings--define-key lint-map [lint-di]
'(menu-item "Lint Directory..." elint-directory
@@ -519,10 +550,9 @@ or to switch back to an existing one.
Entry to this mode calls the value of `lisp-mode-hook'
if that value is non-nil."
(lisp-mode-variables nil t)
- (set (make-local-variable 'find-tag-default-function) 'lisp-find-tag-default)
- (make-local-variable 'comment-start-skip)
- (setq comment-start-skip
- "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\)\\(;+\\|#|\\) *")
+ (setq-local find-tag-default-function 'lisp-find-tag-default)
+ (setq-local comment-start-skip
+ "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\)\\(;+\\|#|\\) *")
(setq imenu-case-fold-search t))
(defun lisp-find-tag-default ()
@@ -816,6 +846,7 @@ this command arranges for all errors to enter the debugger."
(defun eval-defun-1 (form)
"Treat some expressions specially.
Reset the `defvar' and `defcustom' variables to the initial value.
+\(For `defcustom', use the :set function if there is one.)
Reinitialize the face according to the `defface' specification."
;; The code in edebug-defun should be consistent with this, but not
;; the same, since this gets a macroexpanded form.
@@ -831,14 +862,19 @@ Reinitialize the face according to the `defface' specification."
;; `custom-declare-variable' with a quoted value arg.
((and (eq (car form) 'custom-declare-variable)
(default-boundp (eval (nth 1 form) lexical-binding)))
- ;; Force variable to be bound.
- (set-default (eval (nth 1 form) lexical-binding)
- ;; The second arg is an expression that evaluates to
- ;; an expression. The second evaluation is the one
- ;; normally performed not be normal execution but by
- ;; custom-initialize-set (for example), which does not
- ;; use lexical-binding.
- (eval (eval (nth 2 form) lexical-binding)))
+ ;; Force variable to be bound, using :set function if specified.
+ (let ((setfunc (memq :set form)))
+ (when setfunc
+ (setq setfunc (car-safe (cdr-safe setfunc)))
+ (or (functionp setfunc) (setq setfunc nil)))
+ (funcall (or setfunc 'set-default)
+ (eval (nth 1 form) lexical-binding)
+ ;; The second arg is an expression that evaluates to
+ ;; an expression. The second evaluation is the one
+ ;; normally performed not by normal execution but by
+ ;; custom-initialize-set (for example), which does not
+ ;; use lexical-binding.
+ (eval (eval (nth 2 form) lexical-binding))))
form)
;; `defface' is macroexpanded to `custom-declare-face'.
((eq (car form) 'custom-declare-face)
@@ -847,21 +883,8 @@ Reinitialize the face according to the `defface' specification."
(setq face-new-frame-defaults
(assq-delete-all face-symbol face-new-frame-defaults))
(put face-symbol 'face-defface-spec nil)
- (put face-symbol 'face-documentation (nth 3 form))
- ;; Setting `customized-face' to the new spec after calling
- ;; the form, but preserving the old saved spec in `saved-face',
- ;; imitates the situation when the new face spec is set
- ;; temporarily for the current session in the customize
- ;; buffer, thus allowing `face-user-default-spec' to use the
- ;; new customized spec instead of the saved spec.
- ;; Resetting `saved-face' temporarily to nil is needed to let
- ;; `defface' change the spec, regardless of a saved spec.
- (prog1 `(prog1 ,form
- (put ,(nth 1 form) 'saved-face
- ',(get face-symbol 'saved-face))
- (put ,(nth 1 form) 'customized-face
- ,(nth 2 form)))
- (put face-symbol 'saved-face nil))))
+ (put face-symbol 'face-override-spec nil))
+ form)
((eq (car form) 'progn)
(cons 'progn (mapcar 'eval-defun-1 (cdr form))))
(t form)))
@@ -914,11 +937,12 @@ Return the result of evaluation."
If the current defun is actually a call to `defvar' or `defcustom',
evaluating it this way resets the variable using its initial value
-expression even if the variable already has some other value.
-\(Normally `defvar' and `defcustom' do not alter the value if there
-already is one.) In an analogous way, evaluating a `defface'
-overrides any customizations of the face, so that it becomes
-defined exactly as the `defface' expression says.
+expression (using the defcustom's :set function if there is one), even
+if the variable already has some other value. \(Normally `defvar' and
+`defcustom' do not alter the value if there already is one.) In an
+analogous way, evaluating a `defface' overrides any customizations of
+the face, so that it becomes defined exactly as the `defface' expression
+says.
If `eval-expression-debug-on-error' is non-nil, which is the default,
this command arranges for all errors to enter the debugger.
@@ -1412,6 +1436,8 @@ Any non-integer value means do not use a different value of
:type '(choice (integer)
(const :tag "Use the current `fill-column'" t))
:group 'lisp)
+(put 'emacs-lisp-docstring-fill-column 'safe-local-variable
+ (lambda (x) (or (eq x t) (integerp x))))
(defun lisp-fill-paragraph (&optional justify)
"Like \\[fill-paragraph], but handle Emacs Lisp comments and docstrings.
diff --git a/lisp/emacs-lisp/lisp.el b/lisp/emacs-lisp/lisp.el
index 22fb6ad1809..f301a1875ed 100644
--- a/lisp/emacs-lisp/lisp.el
+++ b/lisp/emacs-lisp/lisp.el
@@ -46,6 +46,12 @@ This affects `insert-parentheses' and `insert-pair'."
:group 'lisp)
(defvar forward-sexp-function nil
+ ;; FIXME:
+ ;; - for some uses, we may want a "sexp-only" version, which only
+ ;; jumps over a well-formed sexp, rather than some dwimish thing
+ ;; like jumping from an "else" back up to its "if".
+ ;; - for up-list, we could use the "sexp-only" behavior as well
+ ;; to treat the dwimish halfsexp as a form of "up-list" step.
"If non-nil, `forward-sexp' delegates to this function.
Should take the same arguments and behave similarly to `forward-sexp'.")
@@ -618,9 +624,10 @@ character."
;; "Unbalanced parentheses", but those may not be so
;; accurate/helpful, e.g. quotes may actually be
;; mismatched.
- (error "Unmatched bracket or quote"))))
+ (user-error "Unmatched bracket or quote"))))
(defun field-complete (table &optional predicate)
+ (declare (obsolete completion-in-region "24.4"))
(let ((minibuffer-completion-table table)
(minibuffer-completion-predicate predicate)
;; This made sense for lisp-complete-symbol, but for
@@ -645,6 +652,7 @@ considered. If the symbol starts just after an open-parenthesis, only
symbols with function definitions are considered. Otherwise, all
symbols with function definitions, values or properties are
considered."
+ (declare (obsolete completion-at-point "24.4"))
(interactive)
(let* ((data (lisp-completion-at-point predicate))
(plist (nthcdr 3 data)))
@@ -666,25 +674,6 @@ considered."
(skip-syntax-forward "'")
(point))
(scan-error pos)))
- (predicate
- (or predicate
- (save-excursion
- (goto-char beg)
- (if (not (eq (char-before) ?\())
- (lambda (sym) ;why not just nil ? -sm
- (or (boundp sym) (fboundp sym)
- (symbol-plist sym)))
- ;; Looks like a funcall position. Let's double check.
- (if (condition-case nil
- (progn (up-list -2) (forward-char 1)
- (eq (char-after) ?\())
- (error nil))
- ;; If the first element of the parent list is an open
- ;; paren we are probably not in a funcall position.
- ;; Maybe a `let' varlist or something.
- nil
- ;; Else, we assume that a function name is expected.
- 'fboundp)))))
(end
(unless (or (eq beg (point-max))
(member (char-syntax (char-after beg)) '(?\" ?\( ?\))))
@@ -694,12 +683,51 @@ considered."
(forward-sexp 1)
(when (>= (point) pos)
(point)))
- (scan-error pos)))))
+ (scan-error pos))))
+ (funpos (eq (char-before beg) ?\()) ;t if in function position.
+ (table-etc
+ (if (not funpos)
+ ;; FIXME: We could look at the first element of the list and
+ ;; use it to provide a more specific completion table in some
+ ;; cases. E.g. filter out keywords that are not understood by
+ ;; the macro/function being called.
+ (list nil obarray ;Could be anything.
+ :annotation-function
+ (lambda (str) (if (fboundp (intern-soft str)) " <f>")))
+ ;; Looks like a funcall position. Let's double check.
+ (save-excursion
+ (goto-char (1- beg))
+ (let ((parent
+ (condition-case nil
+ (progn (up-list -1) (forward-char 1)
+ (let ((c (char-after)))
+ (if (eq c ?\() ?\(
+ (if (memq (char-syntax c) '(?w ?_))
+ (read (current-buffer))))))
+ (error nil))))
+ (pcase parent
+ ;; FIXME: Rather than hardcode special cases here,
+ ;; we should use something like a symbol-property.
+ (`declare
+ (list t (mapcar (lambda (x) (symbol-name (car x)))
+ (delete-dups
+ (append
+ macro-declarations-alist
+ defun-declarations-alist)))))
+ ((or `condition-case `condition-case-unless-debug)
+ (list t obarray
+ :predicate (lambda (sym) (get sym 'error-conditions))))
+ (_ (list nil obarray #'fboundp))))))))
(when end
- (list beg end obarray
- :predicate predicate
- :annotation-function
- (unless (eq predicate 'fboundp)
- (lambda (str) (if (fboundp (intern-soft str)) " <f>"))))))))
+ (let ((tail (if (null (car table-etc))
+ (cdr table-etc)
+ (cons
+ (if (memq (char-syntax (char-after end))
+ '(?\s ?>))
+ (cadr table-etc)
+ (apply-partially 'completion-table-with-terminator
+ " " (cadr table-etc)))
+ (cddr table-etc)))))
+ `(,beg ,end ,@tail))))))
;;; lisp.el ends here
diff --git a/lisp/emacs-lisp/macroexp.el b/lisp/emacs-lisp/macroexp.el
index 3bf08ee8a97..6bb796434fd 100644
--- a/lisp/emacs-lisp/macroexp.el
+++ b/lisp/emacs-lisp/macroexp.el
@@ -124,7 +124,10 @@ and also to avoid outputting the warning during normal execution."
(macroexp--funcall-if-compiled ',when-compiled)
,form))
(t
- (message "%s" msg)
+ (message "%s%s" (if (stringp load-file-name)
+ (concat (file-relative-name load-file-name) ": ")
+ "")
+ msg)
form))))
(defun macroexp--obsolete-warning (fun obsolescence-data type)
diff --git a/lisp/emacs-lisp/nadvice.el b/lisp/emacs-lisp/nadvice.el
new file mode 100644
index 00000000000..12166553a14
--- /dev/null
+++ b/lisp/emacs-lisp/nadvice.el
@@ -0,0 +1,464 @@
+;;; nadvice.el --- Light-weight advice primitives for Elisp functions -*- lexical-binding: t -*-
+
+;; Copyright (C) 2012-2013 Free Software Foundation, Inc.
+
+;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
+;; Keywords: extensions, lisp, tools
+;; Package: emacs
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package lets you add behavior (which we call "piece of advice") to
+;; existing functions, like the old `advice.el' package, but with much fewer
+;; bells and whistles. It comes in 2 parts:
+;;
+;; - The first part lets you add/remove functions, similarly to
+;; add/remove-hook, from any "place" (i.e. as accepted by `setf') that
+;; holds a function.
+;; This part provides mainly 2 macros: `add-function' and `remove-function'.
+;;
+;; - The second part provides `advice-add' and `advice-remove' which are
+;; refined version of the previous macros specially tailored for the case
+;; where the place that we want to modify is a `symbol-function'.
+
+;;; Code:
+
+;;;; Lightweight advice/hook
+(defvar advice--where-alist
+ '((:around "\300\301\302\003#\207" 5)
+ (:before "\300\301\002\"\210\300\302\002\"\207" 4)
+ (:after "\300\302\002\"\300\301\003\"\210\207" 5)
+ (:override "\300\301\"\207" 4)
+ (:after-until "\300\302\002\"\206\013\000\300\301\002\"\207" 4)
+ (:after-while "\300\302\002\"\205\013\000\300\301\002\"\207" 4)
+ (:before-until "\300\301\002\"\206\013\000\300\302\002\"\207" 4)
+ (:before-while "\300\301\002\"\205\013\000\300\302\002\"\207" 4)
+ (:filter-args "\300\302\301!\"\207" 5)
+ (:filter-return "\301\300\302\"!\207" 5))
+ "List of descriptions of how to add a function.
+Each element has the form (WHERE BYTECODE STACK) where:
+ WHERE is a keyword indicating where the function is added.
+ BYTECODE is the corresponding byte-code that will be used.
+ STACK is the amount of stack space needed by the byte-code.")
+
+(defvar advice--bytecodes (mapcar #'cadr advice--where-alist))
+
+(defun advice--p (object)
+ (and (byte-code-function-p object)
+ (eq 128 (aref object 0))
+ (memq (length object) '(5 6))
+ (memq (aref object 1) advice--bytecodes)
+ (eq #'apply (aref (aref object 2) 0))))
+
+(defsubst advice--car (f) (aref (aref f 2) 1))
+(defsubst advice--cdr (f) (aref (aref f 2) 2))
+(defsubst advice--props (f) (aref (aref f 2) 3))
+
+(defun advice--make-docstring (_string function)
+ "Build the raw doc-string of SYMBOL, presumably advised."
+ (let ((flist (indirect-function function))
+ (docstring nil))
+ (if (eq 'macro (car-safe flist)) (setq flist (cdr flist)))
+ (while (advice--p flist)
+ (let ((bytecode (aref flist 1))
+ (where nil))
+ (dolist (elem advice--where-alist)
+ (if (eq bytecode (cadr elem)) (setq where (car elem))))
+ (setq docstring
+ (concat
+ docstring
+ (propertize (format "%s advice: " where)
+ 'face 'warning)
+ (let ((fun (advice--car flist)))
+ (if (symbolp fun) (format "`%S'" fun)
+ (let* ((name (cdr (assq 'name (advice--props flist))))
+ (doc (documentation fun t))
+ (usage (help-split-fundoc doc function)))
+ (if usage (setq doc (cdr usage)))
+ (if name
+ (if doc
+ (format "%s\n%s" name doc)
+ (format "%s" name))
+ (or doc "No documentation")))))
+ "\n")))
+ (setq flist (advice--cdr flist)))
+ (if docstring (setq docstring (concat docstring "\n")))
+ (let* ((origdoc (unless (eq function flist) ;Avoid inf-loops.
+ (documentation flist t)))
+ (usage (help-split-fundoc origdoc function)))
+ (setq usage (if (null usage)
+ (let ((arglist (help-function-arglist flist)))
+ (format "%S" (help-make-usage function arglist)))
+ (setq origdoc (cdr usage)) (car usage)))
+ (help-add-fundoc-usage (concat docstring origdoc) usage))))
+
+(defvar advice--docstring
+ ;; Can't eval-when-compile nor use defconst because it then gets pure-copied,
+ ;; which drops the text-properties.
+ ;;(eval-when-compile
+ (propertize "Advised function"
+ 'dynamic-docstring-function #'advice--make-docstring)) ;; )
+
+(defun advice-eval-interactive-spec (spec)
+ "Evaluate the interactive spec SPEC."
+ (cond
+ ((stringp spec)
+ ;; There's no direct access to the C code (in call-interactively) that
+ ;; processes those specs, but that shouldn't stop us, should it?
+ ;; FIXME: Despite appearances, this is not faithful: SPEC and
+ ;; (advice-eval-interactive-spec SPEC) will behave subtly differently w.r.t
+ ;; command-history (and maybe a few other details).
+ (call-interactively `(lambda (&rest args) (interactive ,spec) args)))
+ ;; ((functionp spec) (funcall spec))
+ (t (eval spec))))
+
+(defun advice--make-interactive-form (function main)
+ ;; TODO: make it so that interactive spec can be a constant which
+ ;; dynamically checks the advice--car/cdr to do its job.
+ ;; For that, advice-eval-interactive-spec needs to be more faithful.
+ ;; FIXME: The calls to interactive-form below load autoloaded functions
+ ;; too eagerly.
+ (let ((fspec (cadr (interactive-form function))))
+ (when (eq 'function (car-safe fspec)) ;; Macroexpanded lambda?
+ (setq fspec (nth 1 fspec)))
+ (if (functionp fspec)
+ `(funcall ',fspec
+ ',(cadr (interactive-form main)))
+ (cadr (or (interactive-form function)
+ (interactive-form main))))))
+
+(defsubst advice--make-1 (byte-code stack-depth function main props)
+ "Build a function value that adds FUNCTION to MAIN."
+ (let ((adv-sig (gethash main advertised-signature-table))
+ (advice
+ (apply #'make-byte-code 128 byte-code
+ (vector #'apply function main props) stack-depth
+ advice--docstring
+ (when (or (commandp function) (commandp main))
+ (list (advice--make-interactive-form
+ function main))))))
+ (when adv-sig (puthash advice adv-sig advertised-signature-table))
+ advice))
+
+(defun advice--make (where function main props)
+ "Build a function value that adds FUNCTION to MAIN at WHERE.
+WHERE is a symbol to select an entry in `advice--where-alist'."
+ (let ((desc (assq where advice--where-alist)))
+ (unless desc (error "Unknown add-function location `%S'" where))
+ (advice--make-1 (nth 1 desc) (nth 2 desc)
+ function main props)))
+
+(defun advice--member-p (function name definition)
+ (let ((found nil))
+ (while (and (not found) (advice--p definition))
+ (if (or (equal function (advice--car definition))
+ (when name
+ (equal name (cdr (assq 'name (advice--props definition))))))
+ (setq found t)
+ (setq definition (advice--cdr definition))))
+ found))
+
+(defun advice--tweak (flist tweaker)
+ (if (not (advice--p flist))
+ (funcall tweaker nil flist nil)
+ (let ((first (advice--car flist))
+ (rest (advice--cdr flist))
+ (props (advice--props flist)))
+ (let ((val (funcall tweaker first rest props)))
+ (if val (car val)
+ (let ((nrest (advice--tweak rest tweaker)))
+ (if (eq rest nrest) flist
+ (advice--make-1 (aref flist 1) (aref flist 3)
+ first nrest props))))))))
+
+;;;###autoload
+(defun advice--remove-function (flist function)
+ (advice--tweak flist
+ (lambda (first rest props)
+ (cond ((not first) rest)
+ ((or (equal function first)
+ (equal function (cdr (assq 'name props))))
+ (list rest))))))
+
+(defvar advice--buffer-local-function-sample nil)
+
+(defun advice--set-buffer-local (var val)
+ (if (function-equal val advice--buffer-local-function-sample)
+ (kill-local-variable var)
+ (set (make-local-variable var) val)))
+
+;;;###autoload
+(defun advice--buffer-local (var)
+ "Buffer-local value of VAR, presumed to contain a function."
+ (declare (gv-setter advice--set-buffer-local))
+ (if (local-variable-p var) (symbol-value var)
+ (setq advice--buffer-local-function-sample
+ (lambda (&rest args) (apply (default-value var) args)))))
+
+;;;###autoload
+(defmacro add-function (where place function &optional props)
+ ;; TODO:
+ ;; - provide some kind of control over ordering. E.g. debug-on-entry, ELP
+ ;; and tracing want to stay first.
+ ;; - maybe let `where' specify some kind of predicate and use it
+ ;; to implement things like mode-local or eieio-defmethod.
+ ;; Of course, that only makes sense if the predicates of all advices can
+ ;; be combined and made more efficient.
+ ;; :before is like a normal add-hook on a normal hook.
+ ;; :before-while is like add-hook on run-hook-with-args-until-failure.
+ ;; :before-until is like add-hook on run-hook-with-args-until-success.
+ ;; Same with :after-* but for (add-hook ... 'append).
+ "Add a piece of advice on the function stored at PLACE.
+FUNCTION describes the code to add. WHERE describes where to add it.
+WHERE can be explained by showing the resulting new function, as the
+result of combining FUNCTION and the previous value of PLACE, which we
+call OLDFUN here:
+`:before' (lambda (&rest r) (apply FUNCTION r) (apply OLDFUN r))
+`:after' (lambda (&rest r) (prog1 (apply OLDFUN r) (apply FUNCTION r)))
+`:around' (lambda (&rest r) (apply FUNCTION OLDFUN r))
+`:override' (lambda (&rest r) (apply FUNCTION r))
+`:before-while' (lambda (&rest r) (and (apply FUNCTION r) (apply OLDFUN r)))
+`:before-until' (lambda (&rest r) (or (apply FUNCTION r) (apply OLDFUN r)))
+`:after-while' (lambda (&rest r) (and (apply OLDFUN r) (apply FUNCTION r)))
+`:after-until' (lambda (&rest r) (or (apply OLDFUN r) (apply FUNCTION r)))
+`:filter-args' (lambda (&rest r) (apply OLDFUN (funcall FUNCTION r)))
+`:filter-return'(lambda (&rest r) (funcall FUNCTION (apply OLDFUN r)))
+If FUNCTION was already added, do nothing.
+PROPS is an alist of additional properties, among which the following have
+a special meaning:
+- `name': a string or symbol. It can be used to refer to this piece of advice.
+
+If PLACE is a simple variable, only its global value will be affected.
+Use (local 'VAR) if you want to apply FUNCTION to VAR buffer-locally.
+
+If one of FUNCTION or OLDFUN is interactive, then the resulting function
+is also interactive. There are 3 cases:
+- FUNCTION is not interactive: the interactive spec of OLDFUN is used.
+- The interactive spec of FUNCTION is itself a function: it should take one
+ argument (the interactive spec of OLDFUN, which it can pass to
+ `advice-eval-interactive-spec') and return the list of arguments to use.
+- Else, use the interactive spec of FUNCTION and ignore the one of OLDFUN."
+ (declare (debug t)) ;;(indent 2)
+ (cond ((eq 'local (car-safe place))
+ (setq place `(advice--buffer-local ,@(cdr place))))
+ ((symbolp place)
+ (setq place `(default-value ',place))))
+ `(advice--add-function ,where (gv-ref ,place) ,function ,props))
+
+;;;###autoload
+(defun advice--add-function (where ref function props)
+ (unless (advice--member-p function (cdr (assq 'name props))
+ (gv-deref ref))
+ (setf (gv-deref ref)
+ (advice--make where function (gv-deref ref) props))))
+
+;;;###autoload
+(defmacro remove-function (place function)
+ "Remove the FUNCTION piece of advice from PLACE.
+If FUNCTION was not added to PLACE, do nothing.
+Instead of FUNCTION being the actual function, it can also be the `name'
+of the piece of advice."
+ (declare (debug t))
+ (cond ((eq 'local (car-safe place))
+ (setq place `(advice--buffer-local ,@(cdr place))))
+ ((symbolp place)
+ (error "Use (default-value '%S) or (local '%S)" place place)))
+ (gv-letplace (getter setter) place
+ (macroexp-let2 nil new `(advice--remove-function ,getter ,function)
+ `(unless (eq ,new ,getter) ,(funcall setter new)))))
+
+;;;; Specific application of add-function to `symbol-function' for advice.
+
+(defun advice--subst-main (old new)
+ (advice--tweak old
+ (lambda (first _rest _props) (if (not first) new))))
+
+(defun advice--normalize (symbol def)
+ (cond
+ ((special-form-p def)
+ ;; Not worth the trouble trying to handle this, I think.
+ (error "advice-add failure: %S is a special form" symbol))
+ ((and (symbolp def)
+ (eq 'macro (car-safe (ignore-errors (indirect-function def)))))
+ (let ((newval (cons 'macro (cdr (indirect-function def)))))
+ (put symbol 'advice--saved-rewrite (cons def newval))
+ newval))
+ ;; `f' might be a pure (hence read-only) cons!
+ ((and (eq 'macro (car-safe def))
+ (not (ignore-errors (setcdr def (cdr def)) t)))
+ (cons 'macro (cdr def)))
+ (t def)))
+
+(defsubst advice--strip-macro (x)
+ (if (eq 'macro (car-safe x)) (cdr x) x))
+
+(defun advice--defalias-fset (fsetfun symbol newdef)
+ (when (get symbol 'advice--saved-rewrite)
+ (put symbol 'advice--saved-rewrite nil))
+ (setq newdef (advice--normalize symbol newdef))
+ (let* ((olddef (advice--strip-macro
+ (if (fboundp symbol) (symbol-function symbol))))
+ (oldadv
+ (cond
+ ((null (get symbol 'advice--pending))
+ (or olddef
+ (progn
+ (message "Delayed advice activation failed for %s: no data"
+ symbol)
+ nil)))
+ ((or (not olddef) (autoloadp olddef))
+ (prog1 (get symbol 'advice--pending)
+ (put symbol 'advice--pending nil)))
+ (t (message "Dropping left-over advice--pending for %s" symbol)
+ (put symbol 'advice--pending nil)
+ olddef))))
+ (let* ((snewdef (advice--strip-macro newdef))
+ (snewadv (advice--subst-main oldadv snewdef)))
+ (funcall (or fsetfun #'fset) symbol
+ (if (eq snewdef newdef) snewadv (cons 'macro snewadv))))))
+
+
+;;;###autoload
+(defun advice-add (symbol where function &optional props)
+ "Like `add-function' but for the function named SYMBOL.
+Contrary to `add-function', this will properly handle the cases where SYMBOL
+is defined as a macro, alias, command, ..."
+ ;; TODO:
+ ;; - record the advice location, to display in describe-function.
+ ;; - change all defadvice in lisp/**/*.el.
+ ;; - rewrite advice.el on top of this.
+ ;; - obsolete advice.el.
+ (let* ((f (and (fboundp symbol) (symbol-function symbol)))
+ (nf (advice--normalize symbol f)))
+ (unless (eq f nf) ;; Most importantly, if nf == nil!
+ (fset symbol nf))
+ (add-function where (cond
+ ((eq (car-safe nf) 'macro) (cdr nf))
+ ;; Reasons to delay installation of the advice:
+ ;; - If the function is not yet defined, installing
+ ;; the advice would affect `fboundp'ness.
+ ;; - If it's an autoloaded command,
+ ;; advice--make-interactive-form would end up
+ ;; loading the command eagerly.
+ ;; - `autoload' does nothing if the function is
+ ;; not an autoload or undefined.
+ ((or (not nf) (autoloadp nf))
+ (get symbol 'advice--pending))
+ (t (symbol-function symbol)))
+ function props)
+ (add-function :around (get symbol 'defalias-fset-function)
+ #'advice--defalias-fset))
+ nil)
+
+;;;###autoload
+(defun advice-remove (symbol function)
+ "Like `remove-function' but for the function named SYMBOL.
+Contrary to `remove-function', this will work also when SYMBOL is a macro
+and it will not signal an error if SYMBOL is not `fboundp'.
+Instead of the actual function to remove, FUNCTION can also be the `name'
+of the piece of advice."
+ (when (fboundp symbol)
+ (let ((f (symbol-function symbol)))
+ ;; Can't use the `if' place here, because the body is too large,
+ ;; resulting in use of code that only works with lexical-scoping.
+ (remove-function (if (eq (car-safe f) 'macro)
+ (cdr f)
+ (symbol-function symbol))
+ function)
+ (unless (advice--p
+ (if (eq (car-safe f) 'macro) (cdr f) (symbol-function symbol)))
+ ;; Not advised any more.
+ (remove-function (get symbol 'defalias-fset-function)
+ #'advice--defalias-fset)
+ (if (eq (symbol-function symbol)
+ (cdr (get symbol 'advice--saved-rewrite)))
+ (fset symbol (car (get symbol 'advice--saved-rewrite))))))
+ nil))
+
+;; (defun advice-mapc (fun symbol)
+;; "Apply FUN to every function added as advice to SYMBOL.
+;; FUN is called with a two arguments: the function that was added, and the
+;; properties alist that was specified when it was added."
+;; (let ((def (or (get symbol 'advice--pending)
+;; (if (fboundp symbol) (symbol-function symbol)))))
+;; (while (advice--p def)
+;; (funcall fun (advice--car def) (advice--props def))
+;; (setq def (advice--cdr def)))))
+
+;;;###autoload
+(defun advice-member-p (advice function-name)
+ "Return non-nil if ADVICE has been added to FUNCTION-NAME.
+Instead of ADVICE being the actual function, it can also be the `name'
+of the piece of advice."
+ (advice--member-p advice advice
+ (or (get function-name 'advice--pending)
+ (advice--strip-macro
+ (if (fboundp function-name)
+ (symbol-function function-name))))))
+
+;; When code is advised, called-interactively-p needs to be taught to skip
+;; the advising frames.
+;; FIXME: This Major Ugly Hack won't handle calls to called-interactively-p
+;; done from the advised function if the deepest advice is an around advice!
+;; In other cases (calls from an advice or calls from the advised function when
+;; the deepest advice is not an around advice), it should hopefully get
+;; it right.
+(add-hook 'called-interactively-p-functions
+ #'advice--called-interactively-skip)
+(defun advice--called-interactively-skip (origi frame1 frame2)
+ (let* ((i origi)
+ (get-next-frame
+ (lambda ()
+ (setq frame1 frame2)
+ (setq frame2 (internal--called-interactively-p--get-frame i))
+ ;; (message "Advice Frame %d = %S" i frame2)
+ (setq i (1+ i)))))
+ (when (and (eq (nth 1 frame2) 'apply)
+ (progn
+ (funcall get-next-frame)
+ (advice--p (indirect-function (nth 1 frame2)))))
+ (funcall get-next-frame)
+ ;; If we now have the symbol, this was the head advice and
+ ;; we're done.
+ (while (advice--p (nth 1 frame1))
+ ;; This was an inner advice called from some earlier advice.
+ ;; The stack frames look different depending on the particular
+ ;; kind of the earlier advice.
+ (let ((inneradvice (nth 1 frame1)))
+ (if (and (eq (nth 1 frame2) 'apply)
+ (progn
+ (funcall get-next-frame)
+ (advice--p (indirect-function
+ (nth 1 frame2)))))
+ ;; The earlier advice was something like a before/after
+ ;; advice where the "next" code is called directly by the
+ ;; advice--p object.
+ (funcall get-next-frame)
+ ;; It's apparently an around advice, where the "next" is
+ ;; called by the body of the advice in any way it sees fit,
+ ;; so we need to skip the frames of that body.
+ (while
+ (progn
+ (funcall get-next-frame)
+ (not (and (eq (nth 1 frame2) 'apply)
+ (eq (nth 3 frame2) inneradvice)))))
+ (funcall get-next-frame)
+ (funcall get-next-frame))))
+ (- i origi 1))))
+
+
+(provide 'nadvice)
+;;; nadvice.el ends here
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index 6059f03f999..605d1cf375c 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -4,7 +4,7 @@
;; Author: Tom Tromey <tromey@redhat.com>
;; Created: 10 Mar 2007
-;; Version: 1.0
+;; Version: 1.0.1
;; Keywords: tools
;; This file is part of GNU Emacs.
@@ -234,11 +234,28 @@ a package can run arbitrary code."
:group 'package
:version "24.1")
+(defcustom package-pinned-packages nil
+ "An alist of packages that are pinned to a specific archive
+
+Each element has the form (SYM . ID).
+ SYM is a package, as a symbol.
+ ID is an archive name, as a string. This should correspond to an
+ entry in `package-archives'.
+
+If the archive of name ID does not contain the package SYM, no
+other location will be considered, which will make the
+package unavailable."
+ :type '(alist :key-type (symbol :tag "Package")
+ :value-type (string :tag "Archive name"))
+ :risky t
+ :group 'package
+ :version "24.4")
+
(defconst package-archive-version 1
"Version number of the package archive understood by this file.
Lower version numbers than this will probably be understood as well.")
-(defconst package-el-version "1.0"
+(defconst package-el-version "1.0.1"
"Version of package.el.")
;; We don't prime the cache since it tends to get out of date.
@@ -735,6 +752,8 @@ It will move point to somewhere in the headers."
(package--with-work-buffer location file
(package-unpack name version))))
+(defvar package--initialized nil)
+
(defun package-installed-p (package &optional min-version)
"Return true if PACKAGE, of MIN-VERSION or newer, is installed.
MIN-VERSION should be a version list."
@@ -790,9 +809,8 @@ but version %s required"
"Need package `%s-%s', but only %s is available"
(symbol-name next-pkg) (package-version-join next-version)
(package-version-join (package-desc-vers (cdr pkg-desc)))))
- ;; Only add to the transaction if we don't already have it.
- (unless (memq next-pkg package-list)
- (push next-pkg package-list))
+ ;; Move to front, so it gets installed early enough (bug#14082).
+ (setq package-list (cons next-pkg (delq next-pkg package-list)))
(setq package-list
(package-compute-transaction package-list
(package-desc-reqs
@@ -855,8 +873,13 @@ Also, add the originating archive to the end of the package vector."
(version (package-desc-vers (cdr package)))
(entry (cons name
(vconcat (cdr package) (vector archive))))
- (existing-package (assq name package-archive-contents)))
- (cond ((not existing-package)
+ (existing-package (assq name package-archive-contents))
+ (pinned-to-archive (assoc name package-pinned-packages)))
+ (cond ((and pinned-to-archive
+ ;; If pinned to another archive, skip entirely.
+ (not (equal (cdr pinned-to-archive) archive)))
+ nil)
+ ((not existing-package)
(add-to-list 'package-archive-contents entry))
((version-list-< (package-desc-vers (cdr existing-package))
version)
@@ -896,8 +919,6 @@ using `package-compute-transaction'."
package-user-dir)
(package-activate elt (version-to-list v-string)))))
-(defvar package--initialized nil)
-
;;;###autoload
(defun package-install (name)
"Install the package named NAME.
@@ -1182,7 +1203,7 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages."
(require 'lisp-mnt)
(let ((package-name (symbol-name package))
(built-in (assq package package--builtins))
- desc pkg-dir reqs version installable)
+ desc pkg-dir reqs version installable archive)
(prin1 package)
(princ " is ")
(cond
@@ -1196,6 +1217,7 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages."
;; Available packages are in `package-archive-contents'.
((setq desc (cdr (assq package package-archive-contents)))
(setq version (package-version-join (package-desc-vers desc))
+ archive (aref desc (- (length desc) 1))
installable t)
(if built-in
(insert "a built-in package.\n\n")
@@ -1224,8 +1246,10 @@ If optional arg NO-ACTIVATE is non-nil, don't activate packages."
(installable
(if built-in
(insert (propertize "Built-in." 'font-lock-face 'font-lock-builtin-face)
- " Alternate version available -- ")
- (insert "Available -- "))
+ " Alternate version available")
+ (insert "Available"))
+ (insert " from " archive)
+ (insert " -- ")
(let ((button-text (if (display-graphic-p) "Install" "[Install]"))
(button-face (if (display-graphic-p)
'(:box (:line-width 2 :color "dark grey")
@@ -1588,10 +1612,11 @@ call will upgrade the package."
(length upgrades)
(if (= (length upgrades) 1) "" "s")))))
-(defun package-menu-execute ()
+(defun package-menu-execute (&optional noquery)
"Perform marked Package Menu actions.
Packages marked for installation are downloaded and installed;
-packages marked for deletion are removed."
+packages marked for deletion are removed.
+Optional argument NOQUERY non-nil means do not ask the user to confirm."
(interactive)
(unless (derived-mode-p 'package-menu-mode)
(error "The current buffer is not in Package Menu mode"))
@@ -1611,16 +1636,20 @@ packages marked for deletion are removed."
(push (car id) install-list))))
(forward-line)))
(when install-list
- (if (yes-or-no-p
+ (if (or
+ noquery
+ (yes-or-no-p
(if (= (length install-list) 1)
(format "Install package `%s'? " (car install-list))
(format "Install these %d packages (%s)? "
(length install-list)
- (mapconcat 'symbol-name install-list ", "))))
+ (mapconcat 'symbol-name install-list ", ")))))
(mapc 'package-install install-list)))
;; Delete packages, prompting if necessary.
(when delete-list
- (if (yes-or-no-p
+ (if (or
+ noquery
+ (yes-or-no-p
(if (= (length delete-list) 1)
(format "Delete package `%s-%s'? "
(caar delete-list)
@@ -1630,7 +1659,7 @@ packages marked for deletion are removed."
(mapconcat (lambda (elt)
(concat (car elt) "-" (cdr elt)))
delete-list
- ", "))))
+ ", ")))))
(dolist (elt delete-list)
(condition-case-unless-debug err
(package-delete (car elt) (cdr elt))
diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el
index 69834810d11..e000c343721 100644
--- a/lisp/emacs-lisp/pcase.el
+++ b/lisp/emacs-lisp/pcase.el
@@ -431,30 +431,31 @@ MATCH is the pattern that needs to be matched, of the form:
(match ,symd . ,(pcase--upat (cdr qpat))))
:pcase--fail)))
;; A QPattern but not for a cons, can only go to the `else' side.
- ((eq (car-safe pat) '\`) (cons :pcase--fail nil))
+ ((eq (car-safe pat) '\`) '(:pcase--fail . nil))
((and (eq (car-safe pat) 'pred)
(or (member (cons 'consp (cadr pat))
pcase-mutually-exclusive-predicates)
(member (cons (cadr pat) 'consp)
pcase-mutually-exclusive-predicates)))
- (cons :pcase--fail nil))))
+ '(:pcase--fail . nil))))
(defun pcase--split-equal (elem pat)
(cond
;; The same match will give the same result.
((and (eq (car-safe pat) '\`) (equal (cadr pat) elem))
- (cons :pcase--succeed :pcase--fail))
+ '(:pcase--succeed . :pcase--fail))
;; A different match will fail if this one succeeds.
((and (eq (car-safe pat) '\`)
;; (or (integerp (cadr pat)) (symbolp (cadr pat))
;; (consp (cadr pat)))
)
- (cons :pcase--fail nil))
+ '(:pcase--fail . nil))
((and (eq (car-safe pat) 'pred)
(symbolp (cadr pat))
- (get (cadr pat) 'side-effect-free)
- (funcall (cadr pat) elem))
- (cons :pcase--succeed nil))))
+ (get (cadr pat) 'side-effect-free))
+ (if (funcall (cadr pat) elem)
+ '(:pcase--succeed . nil)
+ '(:pcase--fail . nil)))))
(defun pcase--split-member (elems pat)
;; Based on pcase--split-equal.
@@ -462,7 +463,7 @@ MATCH is the pattern that needs to be matched, of the form:
;; The same match (or a match of membership in a superset) will
;; give the same result, but we don't know how to check it.
;; (???
- ;; (cons :pcase--succeed nil))
+ ;; '(:pcase--succeed . nil))
;; A match for one of the elements may succeed or fail.
((and (eq (car-safe pat) '\`) (member (cadr pat) elems))
nil)
@@ -471,7 +472,7 @@ MATCH is the pattern that needs to be matched, of the form:
;; (or (integerp (cadr pat)) (symbolp (cadr pat))
;; (consp (cadr pat)))
)
- (cons :pcase--fail nil))
+ '(:pcase--fail . nil))
((and (eq (car-safe pat) 'pred)
(symbolp (cadr pat))
(get (cadr pat) 'side-effect-free)
@@ -479,21 +480,21 @@ MATCH is the pattern that needs to be matched, of the form:
(dolist (elem elems)
(unless (funcall p elem) (setq all nil)))
all))
- (cons :pcase--succeed nil))))
+ '(:pcase--succeed . nil))))
(defun pcase--split-pred (upat pat)
;; FIXME: For predicates like (pred (> a)), two such predicates may
;; actually refer to different variables `a'.
(let (test)
(cond
- ((equal upat pat) (cons :pcase--succeed :pcase--fail))
+ ((equal upat pat) '(:pcase--succeed . :pcase--fail))
((and (eq 'pred (car upat))
(eq 'pred (car-safe pat))
(or (member (cons (cadr upat) (cadr pat))
pcase-mutually-exclusive-predicates)
(member (cons (cadr pat) (cadr upat))
pcase-mutually-exclusive-predicates)))
- (cons :pcase--fail nil))
+ '(:pcase--fail . nil))
((and (eq 'pred (car upat))
(eq '\` (car-safe pat))
(symbolp (cadr upat))
@@ -502,8 +503,8 @@ MATCH is the pattern that needs to be matched, of the form:
(ignore-errors
(setq test (list (funcall (cadr upat) (cadr pat))))))
(if (car test)
- (cons nil :pcase--fail)
- (cons :pcase--fail nil))))))
+ '(nil . :pcase--fail)
+ '(:pcase--fail . nil))))))
(defun pcase--fgrep (vars sexp)
"Check which of the symbols VARS appear in SEXP."
diff --git a/lisp/emacs-lisp/shadow.el b/lisp/emacs-lisp/shadow.el
index b12fba17027..d0e3c5763b5 100644
--- a/lisp/emacs-lisp/shadow.el
+++ b/lisp/emacs-lisp/shadow.el
@@ -207,101 +207,79 @@ the earlier.
For example, suppose `load-path' is set to
-\(\"/usr/gnu/emacs/site-lisp\" \"/usr/gnu/emacs/share/emacs/19.30/lisp\"\)
+\(\"/usr/share/emacs/site-lisp\" \"/usr/share/emacs/24.3/lisp\")
and that each of these directories contains a file called XXX.el. Then
XXX.el in the site-lisp directory is referred to by all of:
-\(require 'XXX\), \(autoload .... \"XXX\"\), \(load-library \"XXX\"\) etc.
+\(require 'XXX), (autoload .... \"XXX\"), (load-library \"XXX\") etc.
-The first XXX.el file prevents Emacs from seeing the second \(unless
-the second is loaded explicitly via `load-file'\).
+The first XXX.el file prevents Emacs from seeing the second (unless
+the second is loaded explicitly via `load-file').
When not intended, such shadowings can be the source of subtle
problems. For example, the above situation may have arisen because the
XXX package was not distributed with versions of Emacs prior to
-19.30. An Emacs maintainer downloaded XXX from elsewhere and installed
+24.3. A system administrator downloaded XXX from elsewhere and installed
it. Later, XXX was updated and included in the Emacs distribution.
-Unless the Emacs maintainer checks for this, the new version of XXX
-will be hidden behind the old \(which may no longer work with the new
-Emacs version\).
+Unless the system administrator checks for this, the new version of XXX
+will be hidden behind the old (which may no longer work with the new
+Emacs version).
This function performs these checks and flags all possible
shadowings. Because a .el file may exist without a corresponding .elc
-\(or vice-versa\), these suffixes are essentially ignored. A file
-XXX.elc in an early directory \(that does not contain XXX.el\) is
+\(or vice-versa), these suffixes are essentially ignored. A file
+XXX.elc in an early directory (that does not contain XXX.el) is
considered to shadow a later file XXX.el, and vice-versa.
Shadowings are located by calling the (non-interactive) companion
function, `load-path-shadows-find'."
(interactive)
- (let* ((path (copy-sequence load-path))
- (tem path)
- toplevs)
- ;; If we can find simple.el in two places,
- (dolist (tt tem)
- (if (or (file-exists-p (expand-file-name "simple.el" tt))
- (file-exists-p (expand-file-name "simple.el.gz" tt)))
- (setq toplevs (cons tt toplevs))))
- (if (> (length toplevs) 1)
- ;; Cut off our copy of load-path right before
- ;; the last directory which has simple.el in it.
- ;; This avoids loads of duplications between the source dir
- ;; and the dir where these files were copied by installation.
- (let ((break (car toplevs)))
- (setq tem path)
- (while tem
- (if (eq (nth 1 tem) break)
- (progn
- (setcdr tem nil)
- (setq tem nil)))
- (setq tem (cdr tem)))))
-
- (let* ((shadows (load-path-shadows-find path))
- (n (/ (length shadows) 2))
- (msg (format "%s Emacs Lisp load-path shadowing%s found"
- (if (zerop n) "No" (concat "\n" (number-to-string n)))
- (if (= n 1) " was" "s were"))))
- (with-temp-buffer
- (while shadows
- (insert (format "%s hides %s\n" (car shadows)
- (car (cdr shadows))))
- (setq shadows (cdr (cdr shadows))))
- (if stringp
- (buffer-string)
- (if (called-interactively-p 'interactive)
- ;; We are interactive.
- ;; Create the *Shadows* buffer and display shadowings there.
- (let ((string (buffer-string)))
- (with-current-buffer (get-buffer-create "*Shadows*")
- (display-buffer (current-buffer))
- (load-path-shadows-mode) ; run after-change-major-mode-hook
- (let ((inhibit-read-only t))
- (erase-buffer)
- (insert string)
- (insert msg "\n")
- (while (re-search-backward "\\(^.*\\) hides \\(.*$\\)"
- nil t)
- (dotimes (i 2)
- (make-button (match-beginning (1+ i))
- (match-end (1+ i))
- 'type 'load-path-shadows-find-file
- 'shadow-file
- (match-string (1+ i)))))
- (goto-char (point-max)))))
- ;; We are non-interactive, print shadows via message.
- (unless (zerop n)
- (message "This site has duplicate Lisp libraries with the same name.
+ (let* ((shadows (load-path-shadows-find load-path))
+ (n (/ (length shadows) 2))
+ (msg (format "%s Emacs Lisp load-path shadowing%s found"
+ (if (zerop n) "No" (concat "\n" (number-to-string n)))
+ (if (= n 1) " was" "s were"))))
+ (with-temp-buffer
+ (while shadows
+ (insert (format "%s hides %s\n" (car shadows)
+ (car (cdr shadows))))
+ (setq shadows (cdr (cdr shadows))))
+ (if stringp
+ (buffer-string)
+ (if (called-interactively-p 'interactive)
+ ;; We are interactive.
+ ;; Create the *Shadows* buffer and display shadowings there.
+ (let ((string (buffer-string)))
+ (with-current-buffer (get-buffer-create "*Shadows*")
+ (display-buffer (current-buffer))
+ (load-path-shadows-mode) ; run after-change-major-mode-hook
+ (let ((inhibit-read-only t))
+ (erase-buffer)
+ (insert string)
+ (insert msg "\n")
+ (while (re-search-backward "\\(^.*\\) hides \\(.*$\\)"
+ nil t)
+ (dotimes (i 2)
+ (make-button (match-beginning (1+ i))
+ (match-end (1+ i))
+ 'type 'load-path-shadows-find-file
+ 'shadow-file
+ (match-string (1+ i)))))
+ (goto-char (point-max)))))
+ ;; We are non-interactive, print shadows via message.
+ (unless (zerop n)
+ (message "This site has duplicate Lisp libraries with the same name.
If a locally-installed Lisp library overrides a library in the Emacs release,
that can cause trouble, and you should probably remove the locally-installed
version unless you know what you are doing.\n")
- (goto-char (point-min))
- ;; Mimic the previous behavior of using lots of messages.
- ;; I think one single message would look better...
- (while (not (eobp))
- (message "%s" (buffer-substring (line-beginning-position)
- (line-end-position)))
- (forward-line 1))
- (message "%s" msg))))))))
+ (goto-char (point-min))
+ ;; Mimic the previous behavior of using lots of messages.
+ ;; I think one single message would look better...
+ (while (not (eobp))
+ (message "%s" (buffer-substring (line-beginning-position)
+ (line-end-position)))
+ (forward-line 1))
+ (message "%s" msg)))))))
(provide 'shadow)
diff --git a/lisp/emacs-lisp/smie.el b/lisp/emacs-lisp/smie.el
index 18cc0e811ce..c59076974e0 100644
--- a/lisp/emacs-lisp/smie.el
+++ b/lisp/emacs-lisp/smie.el
@@ -1067,9 +1067,10 @@ the beginning of a line."
(save-excursion
(<= (line-end-position)
(progn
- (when (zerop (length (funcall smie-forward-token-function)))
- ;; Could be an open-paren.
- (forward-char 1))
+ (and (zerop (length (funcall smie-forward-token-function)))
+ (not (eobp))
+ ;; Could be an open-paren.
+ (forward-char 1))
(skip-chars-forward " \t")
(or (eolp)
(and (looking-at comment-start-skip)
@@ -1350,8 +1351,11 @@ should not be computed on the basis of the following token."
(if (and (< pos (line-beginning-position))
;; Make sure `token' also *starts* on another line.
(save-excursion
- (smie-indent-backward-token)
- (< pos (line-beginning-position))))
+ (let ((endpos (point)))
+ (goto-char pos)
+ (forward-line 1)
+ (and (equal res (smie-indent-forward-token))
+ (eq (point) endpos)))))
nil
(goto-char pos)
res)))))
@@ -1473,13 +1477,21 @@ should not be computed on the basis of the following token."
(save-excursion
(forward-comment (point-max))
(skip-chars-forward " \t\r\n")
- ;; FIXME: We assume here that smie-indent-calculate will compute the
- ;; indentation of the next token based on text before the comment, but
- ;; this is not guaranteed, so maybe we should let
- ;; smie-indent-calculate return some info about which buffer position
- ;; was used as the "indentation base" and check that this base is
- ;; before `pos'.
- (smie-indent-calculate))))
+ (unless
+ ;; Don't align with a closer, since the comment is "within" the
+ ;; closed element. Don't align with EOB either.
+ (save-excursion
+ (let ((next (funcall smie-forward-token-function)))
+ (or (if (zerop (length next))
+ (or (eobp) (eq (car (syntax-after (point))) 5)))
+ (rassoc next smie-closer-alist))))
+ ;; FIXME: We assume here that smie-indent-calculate will compute the
+ ;; indentation of the next token based on text before the comment,
+ ;; but this is not guaranteed, so maybe we should let
+ ;; smie-indent-calculate return some info about which buffer
+ ;; position was used as the "indentation base" and check that this
+ ;; base is before `pos'.
+ (smie-indent-calculate)))))
(defun smie-indent-comment-continue ()
;; indentation of comment-continue lines.
diff --git a/lisp/emacs-lisp/tabulated-list.el b/lisp/emacs-lisp/tabulated-list.el
index 94b3c1553e5..da487e463e2 100644
--- a/lisp/emacs-lisp/tabulated-list.el
+++ b/lisp/emacs-lisp/tabulated-list.el
@@ -379,7 +379,9 @@ Return the column number after insertion."
(setq width (- width shift))
(setq x (+ x shift))))
(if (stringp col-desc)
- (insert (propertize label 'help-echo help-echo))
+ (insert (if (get-text-property 0 'help-echo label)
+ label
+ (propertize label 'help-echo help-echo)))
(apply 'insert-text-button label (cdr col-desc)))
(let ((next-x (+ x pad-right width)))
;; No need to append any spaces if this is the last column.
diff --git a/lisp/emacs-lisp/timer.el b/lisp/emacs-lisp/timer.el
index 3eaacd24ec8..a1bba2ddb6e 100644
--- a/lisp/emacs-lisp/timer.el
+++ b/lisp/emacs-lisp/timer.el
@@ -27,27 +27,34 @@
;;; Code:
-;; Layout of a timer vector:
-;; [triggered-p high-seconds low-seconds usecs repeat-delay
-;; function args idle-delay psecs]
-;; triggered-p is nil if the timer is active (waiting to be triggered),
-;; t if it is inactive ("already triggered", in theory)
-
(eval-when-compile (require 'cl-lib))
(cl-defstruct (timer
- (:constructor nil)
- (:copier nil)
- (:constructor timer-create ())
- (:type vector)
- (:conc-name timer--))
+ (:constructor nil)
+ (:copier nil)
+ (:constructor timer-create ())
+ (:type vector)
+ (:conc-name timer--))
+ ;; nil if the timer is active (waiting to be triggered),
+ ;; non-nil if it is inactive ("already triggered", in theory).
(triggered t)
- high-seconds low-seconds usecs repeat-delay function args idle-delay psecs)
+ ;; Time of next trigger: for normal timers, absolute time, for idle timers,
+ ;; time relative to idle-start.
+ high-seconds low-seconds usecs
+ ;; For normal timers, time between repetitions, or nil. For idle timers,
+ ;; non-nil iff repeated.
+ repeat-delay
+ function args ;What to do when triggered.
+ idle-delay ;If non-nil, this is an idle-timer.
+ psecs)
(defun timerp (object)
"Return t if OBJECT is a timer."
(and (vectorp object) (= (length object) 9)))
+(defsubst timer--check (timer)
+ (or (timerp timer) (signal 'wrong-type-argument (list #'timerp timer))))
+
;; Pseudo field `time'.
(defun timer--time (timer)
(list (timer--high-seconds timer)
@@ -57,17 +64,17 @@
(gv-define-simple-setter timer--time
(lambda (timer time)
- (or (timerp timer) (error "Invalid timer"))
+ (timer--check timer)
(setf (timer--high-seconds timer) (pop time))
(let ((low time) (usecs 0) (psecs 0))
(if (consp time)
- (progn
- (setq low (pop time))
- (if time
- (progn
- (setq usecs (pop time))
- (if time
- (setq psecs (car time)))))))
+ (progn
+ (setq low (pop time))
+ (if time
+ (progn
+ (setq usecs (pop time))
+ (if time
+ (setq psecs (car time)))))))
(setf (timer--low-seconds timer) low)
(setf (timer--usecs timer) usecs)
(setf (timer--psecs timer) psecs))))
@@ -83,15 +90,13 @@ fire repeatedly that many seconds apart."
timer)
(defun timer-set-idle-time (timer secs &optional repeat)
+ ;; FIXME: Merge with timer-set-time.
"Set the trigger idle time of TIMER to SECS.
SECS may be an integer, floating point number, or the internal
time format returned by, e.g., `current-idle-time'.
If optional third argument REPEAT is non-nil, make the timer
fire each time Emacs is idle for that many seconds."
- (if (consp secs)
- (setf (timer--time timer) secs)
- (setf (timer--time timer) '(0 0 0))
- (timer-inc-time timer secs))
+ (setf (timer--time timer) (if (consp secs) secs (seconds-to-time secs)))
(setf (timer--repeat-delay timer) repeat)
timer)
@@ -156,8 +161,7 @@ fire repeatedly that many seconds apart."
(defun timer-set-function (timer function &optional args)
"Make TIMER call FUNCTION with optional ARGS when triggering."
- (or (timerp timer)
- (error "Invalid timer"))
+ (timer--check timer)
(setf (timer--function timer) function)
(setf (timer--args timer) args)
timer)
@@ -181,9 +185,10 @@ fire repeatedly that many seconds apart."
(setcdr reuse-cell timers))
(setq reuse-cell (cons timer timers)))
;; Insert new timer after last which possibly means in front of queue.
- (cond (last (setcdr last reuse-cell))
- (idle (setq timer-idle-list reuse-cell))
- (t (setq timer-list reuse-cell)))
+ (setf (cond (last (cdr last))
+ (idle timer-idle-list)
+ (t timer-list))
+ reuse-cell)
(setf (timer--triggered timer) triggered-p)
(setf (timer--idle-delay timer) idle)
nil)
@@ -223,8 +228,7 @@ timer will fire right away."
(defun cancel-timer (timer)
"Remove TIMER from the list of active timers."
- (or (timerp timer)
- (error "Invalid timer"))
+ (timer--check timer)
(setq timer-list (delq timer timer-list))
(setq timer-idle-list (delq timer timer-idle-list))
nil)
@@ -283,40 +287,47 @@ This function is called, by name, directly by the C code."
(setq timer-event-last-1 timer-event-last)
(setq timer-event-last timer)
(let ((inhibit-quit t))
- (if (timerp timer)
- (let (retrigger cell)
- ;; Delete from queue. Record the cons cell that was used.
- (setq cell (cancel-timer-internal timer))
- ;; Re-schedule if requested.
- (if (timer--repeat-delay timer)
- (if (timer--idle-delay timer)
- (timer-activate-when-idle timer nil cell)
- (timer-inc-time timer (timer--repeat-delay timer) 0)
- ;; If real time has jumped forward,
- ;; perhaps because Emacs was suspended for a long time,
- ;; limit how many times things get repeated.
- (if (and (numberp timer-max-repeats)
- (< 0 (timer-until timer (current-time))))
- (let ((repeats (/ (timer-until timer (current-time))
- (timer--repeat-delay timer))))
- (if (> repeats timer-max-repeats)
- (timer-inc-time timer (* (timer--repeat-delay timer)
- repeats)))))
- (timer-activate timer t cell)
- (setq retrigger t)))
- ;; Run handler.
- ;; We do this after rescheduling so that the handler function
- ;; can cancel its own timer successfully with cancel-timer.
- (condition-case nil
- ;; Timer functions should not change the current buffer.
- ;; If they do, all kinds of nasty surprises can happen,
- ;; and it can be hellish to track down their source.
- (save-current-buffer
- (apply (timer--function timer) (timer--args timer)))
- (error nil))
- (if retrigger
- (setf (timer--triggered timer) nil)))
- (error "Bogus timer event"))))
+ (timer--check timer)
+ (let ((retrigger nil)
+ (cell
+ ;; Delete from queue. Record the cons cell that was used.
+ (cancel-timer-internal timer)))
+ ;; Re-schedule if requested.
+ (if (timer--repeat-delay timer)
+ (if (timer--idle-delay timer)
+ (timer-activate-when-idle timer nil cell)
+ (timer-inc-time timer (timer--repeat-delay timer) 0)
+ ;; If real time has jumped forward,
+ ;; perhaps because Emacs was suspended for a long time,
+ ;; limit how many times things get repeated.
+ (if (and (numberp timer-max-repeats)
+ (< 0 (timer-until timer (current-time))))
+ (let ((repeats (/ (timer-until timer (current-time))
+ (timer--repeat-delay timer))))
+ (if (> repeats timer-max-repeats)
+ (timer-inc-time timer (* (timer--repeat-delay timer)
+ repeats)))))
+ ;; Place it back on the timer-list before running
+ ;; timer--function, so it can cancel-timer itself.
+ (timer-activate timer t cell)
+ (setq retrigger t)))
+ ;; Run handler.
+ (condition-case-unless-debug err
+ ;; Timer functions should not change the current buffer.
+ ;; If they do, all kinds of nasty surprises can happen,
+ ;; and it can be hellish to track down their source.
+ (save-current-buffer
+ (apply (timer--function timer) (timer--args timer)))
+ (error (message "Error running timer%s: %S"
+ (if (symbolp (timer--function timer))
+ (format " `%s'" (timer--function timer)) "")
+ err)))
+ (when (and retrigger
+ ;; If the timer's been canceled, don't "retrigger" it
+ ;; since it might still be in the copy of timer-list kept
+ ;; by keyboard.c:timer_check (bug#14156).
+ (memq timer timer-list))
+ (setf (timer--triggered timer) nil)))))
;; This function is incompatible with the one in levents.el.
(defun timeout-event-p (event)
@@ -527,6 +538,12 @@ If the user does not answer after SECONDS seconds, return DEFAULT-VALUE."
secs
(if (string-match-p "\\`[0-9.]+\\'" string)
(string-to-number string)))))
+
+(defun internal-timer-start-idle ()
+ "Mark all idle-time timers as once again candidates for running."
+ (dolist (timer timer-idle-list)
+ (if (timerp timer) ;; FIXME: Why test?
+ (setf (timer--triggered timer) nil))))
(provide 'timer)
diff --git a/lisp/emacs-lisp/trace.el b/lisp/emacs-lisp/trace.el
index 3e55b7c88fa..fce8643923f 100644
--- a/lisp/emacs-lisp/trace.el
+++ b/lisp/emacs-lisp/trace.el
@@ -1,4 +1,4 @@
-;;; trace.el --- tracing facility for Emacs Lisp functions
+;;; trace.el --- tracing facility for Emacs Lisp functions -*- lexical-binding: t -*-
;; Copyright (C) 1993, 1998, 2000-2013 Free Software Foundation, Inc.
@@ -38,11 +38,6 @@
;; generation of trace output won't interfere with what you are currently
;; doing.
-;; Requirement:
-;; ============
-;; trace.el needs advice.el version 2.0 or later which you can get from the
-;; same place from where you got trace.el.
-
;; Restrictions:
;; =============
;; - Traced subrs when called interactively will always show nil as the
@@ -55,17 +50,6 @@
;; + Macros that were expanded during compilation
;; - All the restrictions that apply to advice.el
-;; Installation:
-;; =============
-;; Put this file together with advice.el (version 2.0 or later) somewhere
-;; into your Emacs `load-path', byte-compile it/them for efficiency, and
-;; put the following autoload declarations into your .emacs
-;;
-;; (autoload 'trace-function "trace" "Trace a function" t)
-;; (autoload 'trace-function-background "trace" "Trace a function" t)
-;;
-;; or explicitly load it with (require 'trace) or (load "trace").
-
;; Usage:
;; ======
;; - To trace a function say `M-x trace-function' which will ask you for the
@@ -151,18 +135,15 @@
;;; Code:
-(require 'advice)
-
(defgroup trace nil
"Tracing facility for Emacs Lisp functions."
:prefix "trace-"
:group 'lisp)
;;;###autoload
-(defcustom trace-buffer (purecopy "*trace-output*")
+(defcustom trace-buffer "*trace-output*"
"Trace output will by default go to that buffer."
- :type 'string
- :group 'trace)
+ :type 'string)
;; Current level of traced function invocation:
(defvar trace-level 0)
@@ -176,78 +157,122 @@
(defvar inhibit-trace nil
"If non-nil, all tracing is temporarily inhibited.")
-(defun trace-entry-message (function level argument-bindings)
- ;; Generates a string that describes that FUNCTION has been entered at
- ;; trace LEVEL with ARGUMENT-BINDINGS.
- (format "%s%s%d -> %s: %s\n"
- (mapconcat 'char-to-string (make-string (1- level) ?|) " ")
- (if (> level 1) " " "")
- level
- function
- (let ((print-circle t))
- (mapconcat (lambda (binding)
- (concat
- (symbol-name (ad-arg-binding-field binding 'name))
- "="
- ;; do this so we'll see strings:
- (prin1-to-string
- (ad-arg-binding-field binding 'value))))
- argument-bindings
- " "))))
-
-(defun trace-exit-message (function level value)
- ;; Generates a string that describes that FUNCTION has been exited at
- ;; trace LEVEL and that it returned VALUE.
- (format "%s%s%d <- %s: %s\n"
- (mapconcat 'char-to-string (make-string (1- level) ?|) " ")
- (if (> level 1) " " "")
- level
- function
- ;; do this so we'll see strings:
- (let ((print-circle t)) (prin1-to-string value))))
-
-(defun trace-make-advice (function buffer background)
- ;; Builds the piece of advice to be added to FUNCTION's advice info
- ;; so that it will generate the proper trace output in BUFFER
- ;; (quietly if BACKGROUND is t).
- (ad-make-advice
- trace-advice-name nil t
- `(advice
- lambda ()
- (let ((trace-level (1+ trace-level))
- (trace-buffer (get-buffer-create ,buffer)))
- (unless inhibit-trace
- (with-current-buffer trace-buffer
- (set (make-local-variable 'window-point-insertion-type) t)
- ,(unless background '(display-buffer trace-buffer))
- (goto-char (point-max))
- ;; Insert a separator from previous trace output:
- (if (= trace-level 1) (insert trace-separator))
- (insert
- (trace-entry-message
- ',function trace-level ad-arg-bindings))))
- ad-do-it
- (unless inhibit-trace
- (with-current-buffer trace-buffer
- ,(unless background '(display-buffer trace-buffer))
- (goto-char (point-max))
- (insert
- (trace-exit-message
- ',function trace-level ad-return-value))))))))
-
-(defun trace-function-internal (function buffer background)
- ;; Adds trace advice for FUNCTION and activates it.
- (ad-add-advice
- function
- (trace-make-advice function (or buffer trace-buffer) background)
- 'around 'last)
- (ad-activate function nil))
+;;;###autoload
+(defun trace-values (&rest values)
+ "Helper function to get internal values.
+You can call this function to add internal values in the trace buffer."
+ (unless inhibit-trace
+ (with-current-buffer trace-buffer
+ (goto-char (point-max))
+ (insert
+ (trace-entry-message
+ 'trace-values trace-level values "")))))
+
+(defun trace-entry-message (function level args context)
+ "Generate a string that describes that FUNCTION has been entered.
+LEVEL is the trace level, ARGS is the list of arguments passed to FUNCTION,
+and CONTEXT is a string describing the dynamic context (e.g. values of
+some global variables)."
+ (let ((print-circle t))
+ (format "%s%s%d -> %S%s\n"
+ (mapconcat 'char-to-string (make-string (1- level) ?|) " ")
+ (if (> level 1) " " "")
+ level
+ ;; FIXME: Make it so we can click the function name to jump to its
+ ;; definition and/or untrace it.
+ (cons function args)
+ context)))
+
+(defun trace-exit-message (function level value context)
+ "Generate a string that describes that FUNCTION has exited.
+LEVEL is the trace level, VALUE value returned by FUNCTION,
+and CONTEXT is a string describing the dynamic context (e.g. values of
+some global variables)."
+ (let ((print-circle t))
+ (format "%s%s%d <- %s: %S%s\n"
+ (mapconcat 'char-to-string (make-string (1- level) ?|) " ")
+ (if (> level 1) " " "")
+ level
+ function
+ ;; Do this so we'll see strings:
+ value
+ context)))
+
+(defvar trace--timer nil)
+
+(defun trace-make-advice (function buffer background context)
+ "Build the piece of advice to be added to trace FUNCTION.
+FUNCTION is the name of the traced function.
+BUFFER is the buffer where the trace should be printed.
+BACKGROUND if nil means to display BUFFER.
+CONTEXT if non-nil should be a function that returns extra info that should
+be printed along with the arguments in the trace."
+ (lambda (body &rest args)
+ (let ((trace-level (1+ trace-level))
+ (trace-buffer (get-buffer-create buffer))
+ (ctx (funcall context)))
+ (unless inhibit-trace
+ (with-current-buffer trace-buffer
+ (set (make-local-variable 'window-point-insertion-type) t)
+ (unless (or background trace--timer
+ (get-buffer-window trace-buffer 'visible))
+ (setq trace--timer
+ ;; Postpone the display to some later time, in case we
+ ;; can't actually do it now.
+ (run-with-timer 0 nil
+ (lambda ()
+ (setq trace--timer nil)
+ (display-buffer trace-buffer)))))
+ (goto-char (point-max))
+ ;; Insert a separator from previous trace output:
+ (if (= trace-level 1) (insert trace-separator))
+ (insert
+ (trace-entry-message
+ function trace-level args ctx))))
+ (let ((result))
+ (unwind-protect
+ (setq result (list (apply body args)))
+ (unless inhibit-trace
+ (let ((ctx (funcall context)))
+ (with-current-buffer trace-buffer
+ (unless background (display-buffer trace-buffer))
+ (goto-char (point-max))
+ (insert
+ (trace-exit-message
+ function
+ trace-level
+ (if result (car result) '\!non-local\ exit\!)
+ ctx))))))
+ (car result)))))
+
+(defun trace-function-internal (function buffer background context)
+ "Add trace advice for FUNCTION."
+ (advice-add
+ function :around
+ (trace-make-advice function (or buffer trace-buffer) background
+ (or context (lambda () "")))
+ `((name . ,trace-advice-name))))
(defun trace-is-traced (function)
- (ad-find-advice function 'around trace-advice-name))
+ (advice-member-p trace-advice-name function))
+
+(defun trace--read-args (prompt)
+ (cons
+ (intern (completing-read prompt obarray 'fboundp t))
+ (when current-prefix-arg
+ (list
+ (read-buffer "Output to buffer: " trace-buffer)
+ (let ((exp
+ (let ((minibuffer-completing-symbol t))
+ (read-from-minibuffer "Context expression: "
+ nil read-expression-map t
+ 'read-expression-history))))
+ (lambda ()
+ (let ((print-circle t))
+ (concat " [" (prin1-to-string (eval exp t)) "]"))))))))
;;;###autoload
-(defun trace-function (function &optional buffer)
+(defun trace-function-foreground (function &optional buffer context)
"Traces FUNCTION with trace output going to BUFFER.
For every call of FUNCTION Lisp-style trace messages that display argument
and return values will be inserted into BUFFER. This function generates the
@@ -257,31 +282,19 @@ Do not use this to trace functions that switch buffers or do any other
display oriented stuff, use `trace-function-background' instead.
To untrace a function, use `untrace-function' or `untrace-all'."
- (interactive
- (list
- (intern (completing-read "Trace function: " obarray 'fboundp t))
- (read-buffer "Output to buffer: " trace-buffer)))
- (trace-function-internal function buffer nil))
+ (interactive (trace--read-args "Trace function: "))
+ (trace-function-internal function buffer nil context))
;;;###autoload
-(defun trace-function-background (function &optional buffer)
+(defun trace-function-background (function &optional buffer context)
"Traces FUNCTION with trace output going quietly to BUFFER.
-When this tracing is enabled, every call to FUNCTION writes
-a Lisp-style trace message (showing the arguments and return value)
-into BUFFER. This function generates advice to trace FUNCTION
-and activates it together with any other advice there might be.
-The trace output goes to BUFFER quietly, without changing
-the window or buffer configuration.
-
-BUFFER defaults to `trace-buffer'.
+Like `trace-function-foreground' but without popping up the trace BUFFER or
+changing the window configuration."
+ (interactive (trace--read-args "Trace function in background: "))
+ (trace-function-internal function buffer t context))
-To untrace a function, use `untrace-function' or `untrace-all'."
- (interactive
- (list
- (intern
- (completing-read "Trace function in background: " obarray 'fboundp t))
- (read-buffer "Output to buffer: " trace-buffer)))
- (trace-function-internal function buffer t))
+;;;###autoload
+(defalias 'trace-function 'trace-function-foreground)
(defun untrace-function (function)
"Untraces FUNCTION and possibly activates all remaining advice.
@@ -289,16 +302,14 @@ Activation is performed with `ad-update', hence remaining advice will get
activated only if the advice of FUNCTION is currently active. If FUNCTION
was not traced this is a noop."
(interactive
- (list (ad-read-advised-function "Untrace function" 'trace-is-traced)))
- (when (trace-is-traced function)
- (ad-remove-advice function 'around trace-advice-name)
- (ad-update function)))
+ (list (intern (completing-read "Untrace function: "
+ obarray #'trace-is-traced t))))
+ (advice-remove function trace-advice-name))
(defun untrace-all ()
"Untraces all currently traced functions."
(interactive)
- (ad-do-advised-functions (function)
- (untrace-function function)))
+ (mapatoms #'untrace-function))
(provide 'trace)
diff --git a/lisp/emulation/vip.el b/lisp/emulation/vip.el
index 4e6749d9cfb..ce131b854f5 100644
--- a/lisp/emulation/vip.el
+++ b/lisp/emulation/vip.el
@@ -159,7 +159,7 @@ If nil then it is bound to `delete-backward-char'."
(defvar vip-inhibit-startup-message nil)
-(defvar vip-startup-file (convert-standard-filename "~/.vip")
+(defvar vip-startup-file (locate-user-emacs-file "vip" ".vip")
"Filename used as startup file for vip.")
;; key bindings
@@ -183,6 +183,7 @@ If nil then it is bound to `delete-backward-char'."
(define-key map "\C-z" 'vip-change-mode-to-emacs)
(define-key map "\e" 'vip-ESC)
+ (define-key map [?\S-\ ] 'vip-scroll-back)
(define-key map " " 'vip-scroll)
(define-key map "!" 'vip-command-argument)
(define-key map "\"" 'vip-command-argument)
diff --git a/lisp/emulation/viper-cmd.el b/lisp/emulation/viper-cmd.el
index 6945e870604..d0c0a4b4019 100644
--- a/lisp/emulation/viper-cmd.el
+++ b/lisp/emulation/viper-cmd.el
@@ -1009,9 +1009,9 @@ as a Meta key and any number of multiple escapes are allowed."
(inhibit-quit t))
(if (viper-ESC-event-p event)
(progn
- ;; Some versions of Emacs (eg., 22.50.8 have a bug, which makes even
- ;; a single ESC into ;; a fast keyseq. To guard against this, we
- ;; added a check if there are other events as well. Keep the next
+ ;; Some versions of Emacs (eg., 22.50.8 (?)) have a bug, which makes
+ ;; even a single ESC into a fast keyseq. To guard against this, we
+ ;; added a check if there are other events as well. Keep the next
;; line for the next time the bug reappears, so that will remember to
;; report it.
;;(if (and (viper-fast-keysequence-p) unread-command-events)
@@ -5085,12 +5085,12 @@ Mail anyway (y or n)? ")
(require 'reporter)
(set-window-configuration window-config)
- (reporter-submit-bug-report "kifer@cs.stonybrook.edu"
- (viper-version)
- varlist
- nil 'delete-other-windows
- salutation)
- ))
+ (reporter-submit-bug-report
+ "kifer@cs.stonybrook.edu, bug-gnu-emacs@gnu.org"
+ (viper-version)
+ varlist
+ nil 'delete-other-windows
+ salutation)))
diff --git a/lisp/emulation/viper.el b/lisp/emulation/viper.el
index df419420bd4..7f432cdc143 100644
--- a/lisp/emulation/viper.el
+++ b/lisp/emulation/viper.el
@@ -313,7 +313,7 @@
(require 'viper-keym)
;; better be defined before Viper custom group.
-(defvar viper-custom-file-name (convert-standard-filename "~/.viper")
+(defvar viper-custom-file-name (locate-user-emacs-file "viper" ".viper")
"Viper customization file.
If set by the user, this must be done _before_ Viper is loaded in `~/.emacs'.")
diff --git a/lisp/env.el b/lisp/env.el
index 9e3aed95f8a..5618404cb67 100644
--- a/lisp/env.el
+++ b/lisp/env.el
@@ -57,31 +57,28 @@ If it is also not t, RET does not exit if it does non-null completion."
;; History list for VALUE argument to setenv.
(defvar setenv-history nil)
+(defconst env--substitute-vars-regexp
+ "\\$\\(?:\\(?1:[[:alnum:]_]+\\)\\|{\\(?1:[^{}]+\\)}\\|\\$\\)")
-(defun substitute-env-vars (string)
+(defun substitute-env-vars (string &optional only-defined)
"Substitute environment variables referred to in STRING.
`$FOO' where FOO is an environment variable name means to substitute
the value of that variable. The variable name should be terminated
with a character not a letter, digit or underscore; otherwise, enclose
the entire variable name in braces. For instance, in `ab$cd-x',
`$cd' is treated as an environment variable.
+If ONLY-DEFINED is nil, references to undefined environment variables
+are replaced by the empty string; if it is non-nil, they are left unchanged.
Use `$$' to insert a single dollar sign."
(let ((start 0))
- (while (string-match
- (eval-when-compile
- (rx (or (and "$" (submatch (1+ (regexp "[[:alnum:]_]"))))
- (and "${" (submatch (minimal-match (0+ anything))) "}")
- "$$")))
- string start)
+ (while (string-match env--substitute-vars-regexp string start)
(cond ((match-beginning 1)
(let ((value (getenv (match-string 1 string))))
+ (if (and (null value) only-defined)
+ (setq start (match-end 0))
(setq string (replace-match (or value "") t t string)
- start (+ (match-beginning 0) (length value)))))
- ((match-beginning 2)
- (let ((value (getenv (match-string 2 string))))
- (setq string (replace-match (or value "") t t string)
- start (+ (match-beginning 0) (length value)))))
+ start (+ (match-beginning 0) (length value))))))
(t
(setq string (replace-match "$" t t string)
start (+ (match-beginning 0) 1)))))
@@ -185,7 +182,7 @@ VARIABLE should be a string. Value is nil if VARIABLE is undefined in
the environment. Otherwise, value is a string.
If optional parameter FRAME is non-nil, then it should be a
-frame. This function will look up VARIABLE in its 'environment
+frame. This function will look up VARIABLE in its `environment'
parameter.
Otherwise, this function searches `process-environment' for
diff --git a/lisp/epa.el b/lisp/epa.el
index 61a1378aa22..852d10b1cf7 100644
--- a/lisp/epa.el
+++ b/lisp/epa.el
@@ -169,6 +169,7 @@ You should bind this variable with `let', but do not set it globally.")
(define-key keymap "n" 'next-line)
(define-key keymap "p" 'previous-line)
(define-key keymap " " 'scroll-up-command)
+ (define-key keymap [?\S-\ ] 'scroll-down-command)
(define-key keymap [delete] 'scroll-down-command)
(define-key keymap "q" 'epa-exit-buffer)
(define-key keymap [menu-bar epa-key-list-mode] (cons "Keys" menu-map))
diff --git a/lisp/epg.el b/lisp/epg.el
index 340fc76fb8c..c36de7e4624 100644
--- a/lisp/epg.el
+++ b/lisp/epg.el
@@ -37,6 +37,8 @@
(defvar epg-key-id nil)
(defvar epg-context nil)
(defvar epg-debug-buffer nil)
+(defvar epg-agent-file nil)
+(defvar epg-agent-mtime nil)
;; from gnupg/include/cipher.h
(defconst epg-cipher-algorithm-alist
@@ -161,6 +163,7 @@
(defvar epg-prompt-alist nil)
(put 'epg-error 'error-conditions '(epg-error error))
+(put 'epg-error 'error-message "GPG error")
(defun epg-make-data-from-file (file)
"Make a data object from FILE."
@@ -192,7 +195,7 @@
cipher-algorithm digest-algorithm compress-algorithm
(list #'epg-passphrase-callback-function)
nil
- nil nil nil nil nil nil)))
+ nil nil nil nil nil nil nil)))
(defun epg-context-protocol (context)
"Return the protocol used within CONTEXT."
@@ -286,6 +289,12 @@ This function is for internal use only."
(signal 'wrong-type-argument (list 'epg-context-p context)))
(aref (cdr context) 14))
+(defun epg-context-pinentry-mode (context)
+ "Return the mode of pinentry invocation."
+ (unless (eq (car-safe context) 'epg-context)
+ (signal 'wrong-type-argument (list 'epg-context-p context)))
+ (aref (cdr context) 15))
+
(defun epg-context-set-protocol (context protocol)
"Set the protocol used within CONTEXT."
(unless (eq (car-safe context) 'epg-context)
@@ -404,6 +413,14 @@ This function is for internal use only."
(signal 'wrong-type-argument (list 'epg-context-p context)))
(aset (cdr context) 14 operation))
+(defun epg-context-set-pinentry-mode (context mode)
+ "Set the mode of pinentry invocation."
+ (unless (eq (car-safe context) 'epg-context)
+ (signal 'wrong-type-argument (list 'epg-context-p context)))
+ (unless (memq mode '(nil ask cancel error loopback))
+ (signal 'epg-error (list "Unknown pinentry mode" mode)))
+ (aset (cdr context) 15 mode))
+
(defun epg-make-signature (status &optional key-id)
"Return a signature object."
(cons 'epg-signature (vector status key-id nil nil nil nil nil nil nil nil
@@ -970,7 +987,8 @@ This function is for internal use only."
"Convert SIGNATURE to a human readable string."
(let* ((user-id (cdr (assoc (epg-signature-key-id signature)
epg-user-id-alist)))
- (pubkey-algorithm (epg-signature-pubkey-algorithm signature)))
+ (pubkey-algorithm (epg-signature-pubkey-algorithm signature))
+ (key-id (epg-signature-key-id signature)))
(concat
(cond ((eq (epg-signature-status signature) 'good)
"Good signature from ")
@@ -984,7 +1002,7 @@ This function is for internal use only."
"Signature made by revoked key ")
((eq (epg-signature-status signature) 'no-pubkey)
"No public key for "))
- (epg-signature-key-id signature)
+ key-id
(if user-id
(concat " "
(if (stringp user-id)
@@ -1130,12 +1148,12 @@ This function is for internal use only."
(if (eq (epg-context-protocol context) 'CMS)
epg-gpgsm-program
epg-gpg-program)))
- (let* ((args (append (list "--no-tty"
+ (let* ((agent-info (getenv "GPG_AGENT_INFO"))
+ (args (append (list "--no-tty"
"--status-fd" "1"
"--yes")
(if (and (not (eq (epg-context-protocol context) 'CMS))
- (string-match ":" (or (getenv "GPG_AGENT_INFO")
- "")))
+ (string-match ":" (or agent-info "")))
'("--use-agent"))
(if (and (not (eq (epg-context-protocol context) 'CMS))
(epg-context-progress-callback context))
@@ -1148,20 +1166,53 @@ This function is for internal use only."
(if (epg-context-textmode context) '("--textmode"))
(if (epg-context-output-file context)
(list "--output" (epg-context-output-file context)))
+ (if (epg-context-pinentry-mode context)
+ (list "--pinentry-mode"
+ (symbol-name (epg-context-pinentry-mode
+ context))))
args))
(coding-system-for-write 'binary)
(coding-system-for-read 'binary)
process-connection-type
+ (process-environment process-environment)
(orig-mode (default-file-modes))
(buffer (generate-new-buffer " *epg*"))
- process)
+ process
+ terminal-name
+ agent-file
+ (agent-mtime '(0 0 0 0)))
+ ;; Set GPG_TTY and TERM for pinentry-curses. Note that we can't
+ ;; use `terminal-name' here to get the real pty name for the child
+ ;; process, though /dev/fd/0" is not portable.
+ (unless (memq system-type '(ms-dos windows-nt))
+ (with-temp-buffer
+ (condition-case nil
+ (when (= (call-process "tty" "/dev/fd/0" t) 0)
+ (delete-char -1)
+ (setq terminal-name (buffer-string)))
+ (file-error))))
+ (when terminal-name
+ (setq process-environment
+ (cons (concat "GPG_TTY=" terminal-name)
+ (cons "TERM=xterm" process-environment))))
+ ;; Record modified time of gpg-agent socket to restore the Emacs
+ ;; frame on text terminal in `epg-wait-for-completion'.
+ ;; See
+ ;; <http://lists.gnu.org/archive/html/emacs-devel/2007-02/msg00755.html>
+ ;; for more details.
+ (when (and agent-info (string-match "\\(.*\\):[0-9]+:[0-9]+" agent-info))
+ (setq agent-file (match-string 1 agent-info)
+ agent-mtime (or (nth 5 (file-attributes agent-file)) '(0 0 0 0))))
(if epg-debug
(save-excursion
(unless epg-debug-buffer
(setq epg-debug-buffer (generate-new-buffer " *epg-debug*")))
(set-buffer epg-debug-buffer)
(goto-char (point-max))
- (insert (format "%s %s\n"
+ (insert (if agent-info
+ (format "GPG_AGENT_INFO=%s\n" agent-info)
+ "GPG_AGENT_INFO is not set\n")
+ (format "%s %s\n"
(if (eq (epg-context-protocol context) 'CMS)
epg-gpgsm-program
epg-gpg-program)
@@ -1180,7 +1231,11 @@ This function is for internal use only."
(make-local-variable 'epg-key-id)
(setq epg-key-id nil)
(make-local-variable 'epg-context)
- (setq epg-context context))
+ (setq epg-context context)
+ (make-local-variable 'epg-agent-file)
+ (setq epg-agent-file agent-file)
+ (make-local-variable 'epg-agent-mtime)
+ (setq epg-agent-mtime agent-mtime))
(unwind-protect
(progn
(set-default-file-modes 448)
@@ -1257,6 +1312,13 @@ This function is for internal use only."
(accept-process-output (epg-context-process context) 1))
;; This line is needed to run the process-filter right now.
(sleep-for 0.1)
+ ;; Restore Emacs frame on text terminal, when pinentry-curses has terminated.
+ (if (with-current-buffer (process-buffer (epg-context-process context))
+ (and epg-agent-file
+ (> (float-time (or (nth 5 (file-attributes epg-agent-file))
+ '(0 0 0 0)))
+ (float-time epg-agent-mtime))))
+ (redraw-frame (selected-frame)))
(epg-context-set-result-for
context 'error
(nreverse (epg-context-result-for context 'error))))
diff --git a/lisp/erc/ChangeLog b/lisp/erc/ChangeLog
index c12cd68b595..f3d54782897 100644
--- a/lisp/erc/ChangeLog
+++ b/lisp/erc/ChangeLog
@@ -1,8 +1,59 @@
-2013-03-11 Glenn Morris <rgm@gnu.org>
+2013-02-13 Aidan Gauland <aidalgol@no8wireless.co.nz>
- * Version 24.3 released.
+ * erc-match.el (erc-match-message): Fix last commit.
-2012-11-13 Glenn Morris <rgm@gnu.org>
+2013-02-12 Aidan Gauland <aidalgol@no8wireless.co.nz>
+
+ * erc-match.el (erc-match-message):
+ Don't truncate action messages. (Bug#13689)
+
+2013-02-09 Eli Zaretskii <eliz@gnu.org>
+
+ * erc-dcc.el (erc-dcc-get-file): Don't reference buffer-file-type.
+
+2013-01-11 Dmitry Antipov <dmantipov@yandex.ru>
+
+ * erc-dcc.el (erc-dcc-send-file): Use point-min-marker.
+ (erc-dcc-chat-setup): Use point-max-marker.
+
+2013-01-04 Glenn Morris <rgm@gnu.org>
+
+ * erc-backend.el (312): Fix typo. (Bug#13235)
+
+2012-11-30 Glenn Morris <rgm@gnu.org>
+
+ * erc.el (erc-accidental-paste-threshold-seconds): Add :version.
+
+2012-11-30 Eric Hanchrow <eric.hanchrow@gmail.com>
+
+ * erc.el (erc-last-input-time): New variable.
+ (erc-accidental-paste-threshold-seconds): New option to avoid
+ sending accidentally-pasted text to the server (Bug#11592).
+ (erc-send-current-line): Use it.
+
+2012-11-30 Chong Yidong <cyd@gnu.org>
+
+ * erc.el (erc-lurker-cleanup, erc-lurker-p): Use float-time.
+
+2012-11-23 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * erc-backend.el: Fix last change that missed calls to `second'
+ (bug#12970).
+
+2012-11-19 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ Use cl-lib instead of cl, and interactive-p => called-interactively-p.
+ * erc-track.el, erc-networks.el, erc-netsplit.el, erc-dcc.el:
+ * erc-backend.el: Use cl-lib, nth, pcase, and called-interactively-p
+ instead of cl.
+ * erc-speedbar.el, erc-services.el, erc-pcomplete.el, erc-notify.el:
+ * erc-match.el, erc-log.el, erc-join.el, erc-ezbounce.el:
+ * erc-capab.el: Don't require cl since we don't use it.
+ * erc.el: Use cl-lib, nth, pcase, and called-interactively-p i.s.o cl.
+ (erc-lurker-ignore-chars, erc-common-server-suffixes):
+ Move before first use.
+
+2012-11-16 Glenn Morris <rgm@gnu.org>
* erc.el (erc-modules): Add "notifications". Tweak "hecomplete" doc.
diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el
index bdcffc42f55..3d3ac791f08 100644
--- a/lisp/erc/erc-backend.el
+++ b/lisp/erc/erc-backend.el
@@ -98,7 +98,7 @@
;;; Code:
(require 'erc-compat)
-(eval-when-compile (require 'cl))
+(eval-when-compile (require 'cl-lib))
;; There's a fairly strong mutual dependency between erc.el and erc-backend.el.
;; Luckily, erc.el does not need erc-backend.el for macroexpansion whereas the
;; reverse is true:
@@ -109,7 +109,7 @@
(defvar erc-server-responses (make-hash-table :test #'equal)
"Hashtable mapping server responses to their handler hooks.")
-(defstruct (erc-response (:conc-name erc-response.))
+(cl-defstruct (erc-response (:conc-name erc-response.))
(unparsed "" :type string)
(sender "" :type string)
(command "" :type string)
@@ -950,7 +950,7 @@ PROCs `process-buffer' is `current-buffer' when this function is called."
(push str (erc-response.command-args msg))))
(setf (erc-response.contents msg)
- (first (erc-response.command-args msg)))
+ (car (erc-response.command-args msg)))
(setf (erc-response.command-args msg)
(nreverse (erc-response.command-args msg)))
@@ -1045,7 +1045,7 @@ Finds hooks by looking in the `erc-server-responses' hashtable."
(name &rest name)
&optional sexp sexp def-body))
-(defmacro* define-erc-response-handler ((name &rest aliases)
+(cl-defmacro define-erc-response-handler ((name &rest aliases)
&optional extra-fn-doc extra-var-doc
&rest fn-body)
"Define an ERC handler hook/function pair.
@@ -1154,11 +1154,11 @@ add things to `%s' instead."
"")
name hook-name))
(fn-alternates
- (loop for alias in aliases
- collect (intern (format "erc-server-%s" alias))))
+ (cl-loop for alias in aliases
+ collect (intern (format "erc-server-%s" alias))))
(var-alternates
- (loop for alias in aliases
- collect (intern (format "erc-server-%s-functions" alias)))))
+ (cl-loop for alias in aliases
+ collect (intern (format "erc-server-%s-functions" alias)))))
`(prog2
;; Normal hook variable.
(defvar ,hook-name ',fn-name ,(format hook-doc name))
@@ -1172,19 +1172,19 @@ add things to `%s' instead."
(put ',hook-name 'definition-name ',name)
;; Hashtable map of responses to hook variables
- ,@(loop for response in (cons name aliases)
- for var in (cons hook-name var-alternates)
- collect `(puthash ,(format "%s" response) ',var
- erc-server-responses))
+ ,@(cl-loop for response in (cons name aliases)
+ for var in (cons hook-name var-alternates)
+ collect `(puthash ,(format "%s" response) ',var
+ erc-server-responses))
;; Alternates.
;; Functions are defaliased, hook variables are defvared so we
;; can add hooks to one alias, but not another.
- ,@(loop for fn in fn-alternates
- for var in var-alternates
- for a in aliases
- nconc (list `(defalias ',fn ',fn-name)
- `(defvar ,var ',fn-name ,(format hook-doc a))
- `(put ',var 'definition-name ',hook-name))))))
+ ,@(cl-loop for fn in fn-alternates
+ for var in var-alternates
+ for a in aliases
+ nconc (list `(defalias ',fn ',fn-name)
+ `(defvar ,var ',fn-name ,(format hook-doc a))
+ `(put ',var 'definition-name ',hook-name))))))
(define-erc-response-handler (ERROR)
"Handle an ERROR command from the server." nil
@@ -1196,10 +1196,10 @@ add things to `%s' instead."
(define-erc-response-handler (INVITE)
"Handle invitation messages."
nil
- (let ((target (first (erc-response.command-args parsed)))
+ (let ((target (car (erc-response.command-args parsed)))
(chnl (erc-response.contents parsed)))
- (multiple-value-bind (nick login host)
- (values-list (erc-parse-user (erc-response.sender parsed)))
+ (pcase-let ((`(,nick ,login ,host)
+ (erc-parse-user (erc-response.sender parsed))))
(setq erc-invitation chnl)
(when (string= target (erc-current-nick))
(erc-display-message
@@ -1212,8 +1212,8 @@ add things to `%s' instead."
nil
(let ((chnl (erc-response.contents parsed))
(buffer nil))
- (multiple-value-bind (nick login host)
- (values-list (erc-parse-user (erc-response.sender parsed)))
+ (pcase-let ((`(,nick ,login ,host)
+ (erc-parse-user (erc-response.sender parsed))))
;; strip the stupid combined JOIN facility (IRC 2.9)
(if (string-match "^\\(.*\\)?\^g.*$" chnl)
(setq chnl (match-string 1 chnl)))
@@ -1249,12 +1249,12 @@ add things to `%s' instead."
(define-erc-response-handler (KICK)
"Handle kick messages received from the server." nil
- (let* ((ch (first (erc-response.command-args parsed)))
- (tgt (second (erc-response.command-args parsed)))
+ (let* ((ch (nth 0 (erc-response.command-args parsed)))
+ (tgt (nth 1 (erc-response.command-args parsed)))
(reason (erc-trim-string (erc-response.contents parsed)))
(buffer (erc-get-buffer ch proc)))
- (multiple-value-bind (nick login host)
- (values-list (erc-parse-user (erc-response.sender parsed)))
+ (pcase-let ((`(,nick ,login ,host)
+ (erc-parse-user (erc-response.sender parsed))))
(erc-remove-channel-member buffer tgt)
(cond
((string= tgt (erc-current-nick))
@@ -1277,11 +1277,11 @@ add things to `%s' instead."
(define-erc-response-handler (MODE)
"Handle server mode changes." nil
- (let ((tgt (first (erc-response.command-args parsed)))
+ (let ((tgt (car (erc-response.command-args parsed)))
(mode (mapconcat 'identity (cdr (erc-response.command-args parsed))
" ")))
- (multiple-value-bind (nick login host)
- (values-list (erc-parse-user (erc-response.sender parsed)))
+ (pcase-let ((`(,nick ,login ,host)
+ (erc-parse-user (erc-response.sender parsed))))
(erc-log (format "MODE: %s -> %s: %s" nick tgt mode))
;; dirty hack
(let ((buf (cond ((erc-channel-p tgt)
@@ -1305,8 +1305,8 @@ add things to `%s' instead."
"Handle nick change messages." nil
(let ((nn (erc-response.contents parsed))
bufs)
- (multiple-value-bind (nick login host)
- (values-list (erc-parse-user (erc-response.sender parsed)))
+ (pcase-let ((`(,nick ,login ,host)
+ (erc-parse-user (erc-response.sender parsed))))
(setq bufs (erc-buffer-list-with-nick nick proc))
(erc-log (format "NICK: %s -> %s" nick nn))
;; if we had a query with this user, make sure future messages will be
@@ -1340,11 +1340,11 @@ add things to `%s' instead."
(define-erc-response-handler (PART)
"Handle part messages." nil
- (let* ((chnl (first (erc-response.command-args parsed)))
+ (let* ((chnl (car (erc-response.command-args parsed)))
(reason (erc-trim-string (erc-response.contents parsed)))
(buffer (erc-get-buffer chnl proc)))
- (multiple-value-bind (nick login host)
- (values-list (erc-parse-user (erc-response.sender parsed)))
+ (pcase-let ((`(,nick ,login ,host)
+ (erc-parse-user (erc-response.sender parsed))))
(erc-remove-channel-member buffer nick)
(erc-display-message parsed 'notice buffer
'PART ?n nick ?u login
@@ -1361,7 +1361,7 @@ add things to `%s' instead."
(define-erc-response-handler (PING)
"Handle ping messages." nil
- (let ((pinger (first (erc-response.command-args parsed))))
+ (let ((pinger (car (erc-response.command-args parsed))))
(erc-log (format "PING: %s" pinger))
;; ping response to the server MUST be forced, or you can lose big
(erc-server-send (format "PONG :%s" pinger) t)
@@ -1379,7 +1379,7 @@ add things to `%s' instead."
(when erc-verbose-server-ping
(erc-display-message
parsed 'notice proc 'PONG
- ?h (first (erc-response.command-args parsed)) ?i erc-server-lag
+ ?h (car (erc-response.command-args parsed)) ?i erc-server-lag
?s (if (/= erc-server-lag 1) "s" "")))
(erc-update-mode-line))))
@@ -1451,8 +1451,8 @@ add things to `%s' instead."
"Another user has quit IRC." nil
(let ((reason (erc-response.contents parsed))
bufs)
- (multiple-value-bind (nick login host)
- (values-list (erc-parse-user (erc-response.sender parsed)))
+ (pcase-let ((`(,nick ,login ,host)
+ (erc-parse-user (erc-response.sender parsed))))
(setq bufs (erc-buffer-list-with-nick nick proc))
(erc-remove-user nick)
(setq reason (erc-wash-quit-reason reason nick login host))
@@ -1462,12 +1462,12 @@ add things to `%s' instead."
(define-erc-response-handler (TOPIC)
"The channel topic has changed." nil
- (let* ((ch (first (erc-response.command-args parsed)))
+ (let* ((ch (car (erc-response.command-args parsed)))
(topic (erc-trim-string (erc-response.contents parsed)))
(time (format-time-string erc-server-timestamp-format
(current-time))))
- (multiple-value-bind (nick login host)
- (values-list (erc-parse-user (erc-response.sender parsed)))
+ (pcase-let ((`(,nick ,login ,host)
+ (erc-parse-user (erc-response.sender parsed))))
(erc-update-channel-member ch nick nick nil nil nil host login)
(erc-update-channel-topic ch (format "%s\C-o (%s, %s)" topic nick time))
(erc-display-message parsed 'notice (erc-get-buffer ch proc)
@@ -1477,8 +1477,8 @@ add things to `%s' instead."
(define-erc-response-handler (WALLOPS)
"Display a WALLOPS message." nil
(let ((message (erc-response.contents parsed)))
- (multiple-value-bind (nick login host)
- (values-list (erc-parse-user (erc-response.sender parsed)))
+ (pcase-let ((`(,nick ,login ,host)
+ (erc-parse-user (erc-response.sender parsed))))
(erc-display-message
parsed 'notice nil
'WALLOPS ?n nick ?m message))))
@@ -1486,7 +1486,7 @@ add things to `%s' instead."
(define-erc-response-handler (001)
"Set `erc-server-current-nick' to reflect server settings and display the welcome message."
nil
- (erc-set-current-nick (first (erc-response.command-args parsed)))
+ (erc-set-current-nick (car (erc-response.command-args parsed)))
(erc-update-mode-line) ; needed here?
(setq erc-nick-change-attempt-count 0)
(setq erc-default-nicks (if (consp erc-nick) erc-nick (list erc-nick)))
@@ -1507,16 +1507,16 @@ add things to `%s' instead."
(define-erc-response-handler (004)
"Display the server's identification." nil
- (multiple-value-bind (server-name server-version)
- (values-list (cdr (erc-response.command-args parsed)))
+ (pcase-let ((`(,server-name ,server-version)
+ (cdr (erc-response.command-args parsed))))
(setq erc-server-version server-version)
(setq erc-server-announced-name server-name)
(erc-update-mode-line-buffer (process-buffer proc))
(erc-display-message
parsed 'notice proc
's004 ?s server-name ?v server-version
- ?U (fourth (erc-response.command-args parsed))
- ?C (fifth (erc-response.command-args parsed)))))
+ ?U (nth 3 (erc-response.command-args parsed))
+ ?C (nth 4 (erc-response.command-args parsed)))))
(define-erc-response-handler (005)
"Set the variable `erc-server-parameters' and display the received message.
@@ -1547,7 +1547,7 @@ A server may send more than one 005 message."
(define-erc-response-handler (221)
"Display the current user modes." nil
- (let* ((nick (first (erc-response.command-args parsed)))
+ (let* ((nick (car (erc-response.command-args parsed)))
(modes (mapconcat 'identity
(cdr (erc-response.command-args parsed)) " ")))
(erc-set-modes nick modes)
@@ -1556,17 +1556,17 @@ A server may send more than one 005 message."
(define-erc-response-handler (252)
"Display the number of IRC operators online." nil
(erc-display-message parsed 'notice 'active 's252
- ?i (second (erc-response.command-args parsed))))
+ ?i (cadr (erc-response.command-args parsed))))
(define-erc-response-handler (253)
"Display the number of unknown connections." nil
(erc-display-message parsed 'notice 'active 's253
- ?i (second (erc-response.command-args parsed))))
+ ?i (cadr (erc-response.command-args parsed))))
(define-erc-response-handler (254)
"Display the number of channels formed." nil
(erc-display-message parsed 'notice 'active 's254
- ?i (second (erc-response.command-args parsed))))
+ ?i (cadr (erc-response.command-args parsed))))
(define-erc-response-handler (250 251 255 256 257 258 259 265 266 377 378)
"Generic display of server messages as notices.
@@ -1576,8 +1576,8 @@ See `erc-display-server-message'." nil
(define-erc-response-handler (275)
"Display secure connection message." nil
- (multiple-value-bind (nick user message)
- (values-list (cdr (erc-response.command-args parsed)))
+ (pcase-let ((`(,nick ,user ,message)
+ (cdr (erc-response.command-args parsed))))
(erc-display-message
parsed 'notice 'active 's275
?n nick
@@ -1590,13 +1590,13 @@ See `erc-display-server-message'." nil
(define-erc-response-handler (301)
"AWAY notice." nil
(erc-display-message parsed 'notice 'active 's301
- ?n (second (erc-response.command-args parsed))
+ ?n (cadr (erc-response.command-args parsed))
?r (erc-response.contents parsed)))
(define-erc-response-handler (303)
"ISON reply" nil
(erc-display-message parsed 'notice 'active 's303
- ?n (second (erc-response.command-args parsed))))
+ ?n (cadr (erc-response.command-args parsed))))
(define-erc-response-handler (305)
"Return from AWAYness." nil
@@ -1612,8 +1612,8 @@ See `erc-display-server-message'." nil
(define-erc-response-handler (307)
"Display nick-identified message." nil
- (multiple-value-bind (nick user message)
- (values-list (cdr (erc-response.command-args parsed)))
+ (pcase-let ((`(,nick ,user ,message)
+ (cdr (erc-response.command-args parsed))))
(erc-display-message
parsed 'notice 'active 's307
?n nick
@@ -1624,8 +1624,8 @@ See `erc-display-server-message'." nil
"WHOIS/WHOWAS notices." nil
(let ((fname (erc-response.contents parsed))
(catalog-entry (intern (format "s%s" (erc-response.command parsed)))))
- (multiple-value-bind (nick user host)
- (values-list (cdr (erc-response.command-args parsed)))
+ (pcase-let ((`(,nick ,user ,host)
+ (cdr (erc-response.command-args parsed))))
(erc-update-user-nick nick nick host nil fname user)
(erc-display-message
parsed 'notice 'active catalog-entry
@@ -1633,8 +1633,8 @@ See `erc-display-server-message'." nil
(define-erc-response-handler (312)
"Server name response in WHOIS." nil
- (multiple-value-bind (nick server-host)
- (values-list (cdr (erc-response.command-args parsed)))
+ (pcase-let ((`(,nick ,server-host)
+ (cdr (erc-response.command-args parsed))))
(erc-display-message
parsed 'notice 'active 's312
?n nick ?s server-host ?c (erc-response.contents parsed))))
@@ -1643,7 +1643,7 @@ See `erc-display-server-message'." nil
"IRC Operator response in WHOIS." nil
(erc-display-message
parsed 'notice 'active 's313
- ?n (second (erc-response.command-args parsed))))
+ ?n (cadr (erc-response.command-args parsed))))
(define-erc-response-handler (315 318 323 369)
;; 315 - End of WHO
@@ -1655,8 +1655,8 @@ See `erc-display-server-message'." nil
(define-erc-response-handler (317)
"IDLE notice." nil
- (multiple-value-bind (nick seconds-idle on-since time)
- (values-list (cdr (erc-response.command-args parsed)))
+ (pcase-let ((`(,nick ,seconds-idle ,on-since ,time)
+ (cdr (erc-response.command-args parsed))))
(setq time (when on-since
(format-time-string erc-server-timestamp-format
(erc-string-to-emacs-time on-since))))
@@ -1674,14 +1674,14 @@ See `erc-display-server-message'." nil
"Channel names in WHOIS response." nil
(erc-display-message
parsed 'notice 'active 's319
- ?n (second (erc-response.command-args parsed))
+ ?n (cadr (erc-response.command-args parsed))
?c (erc-response.contents parsed)))
(define-erc-response-handler (320)
"Identified user in WHOIS." nil
(erc-display-message
parsed 'notice 'active 's320
- ?n (second (erc-response.command-args parsed))))
+ ?n (cadr (erc-response.command-args parsed))))
(define-erc-response-handler (321)
"LIST header." nil
@@ -1696,16 +1696,16 @@ See `erc-display-server-message'." nil
(define-erc-response-handler (322)
"LIST notice." nil
(let ((topic (erc-response.contents parsed)))
- (multiple-value-bind (channel num-users)
- (values-list (cdr (erc-response.command-args parsed)))
+ (pcase-let ((`(,channel ,num-users)
+ (cdr (erc-response.command-args parsed))))
(add-to-list 'erc-channel-list (list channel))
(erc-update-channel-topic channel topic))))
(defun erc-server-322-message (proc parsed)
"Display a message for the 322 event."
(let ((topic (erc-response.contents parsed)))
- (multiple-value-bind (channel num-users)
- (values-list (cdr (erc-response.command-args parsed)))
+ (pcase-let ((`(,channel ,num-users)
+ (cdr (erc-response.command-args parsed))))
(erc-display-message
parsed 'notice proc 's322
?c channel ?u num-users ?t (or topic "")))))
@@ -1713,7 +1713,7 @@ See `erc-display-server-message'." nil
(define-erc-response-handler (324)
"Channel or nick modes." nil
- (let ((channel (second (erc-response.command-args parsed)))
+ (let ((channel (cadr (erc-response.command-args parsed)))
(modes (mapconcat 'identity (cddr (erc-response.command-args parsed))
" ")))
(erc-set-modes channel modes)
@@ -1723,16 +1723,16 @@ See `erc-display-server-message'." nil
(define-erc-response-handler (328)
"Channel URL (on freenode network)." nil
- (let ((channel (second (erc-response.command-args parsed)))
+ (let ((channel (cadr (erc-response.command-args parsed)))
(url (erc-response.contents parsed)))
(erc-display-message parsed 'notice (erc-get-buffer channel proc)
's328 ?c channel ?u url)))
(define-erc-response-handler (329)
"Channel creation date." nil
- (let ((channel (second (erc-response.command-args parsed)))
+ (let ((channel (cadr (erc-response.command-args parsed)))
(time (erc-string-to-emacs-time
- (third (erc-response.command-args parsed)))))
+ (nth 2 (erc-response.command-args parsed)))))
(erc-display-message
parsed 'notice (erc-get-buffer channel proc)
's329 ?c channel ?t (format-time-string erc-server-timestamp-format
@@ -1748,22 +1748,22 @@ See `erc-display-server-message'." nil
;; authaccount == (aref parsed 4)
;; authmsg == (aref parsed 5)
;; The guesses below are, well, just that. -- Lawrence 2004/05/10
- (let ((nick (second (erc-response.command-args parsed)))
- (authaccount (third (erc-response.command-args parsed)))
+ (let ((nick (cadr (erc-response.command-args parsed)))
+ (authaccount (nth 2 (erc-response.command-args parsed)))
(authmsg (erc-response.contents parsed)))
(erc-display-message parsed 'notice 'active 's330
?n nick ?a authmsg ?i authaccount)))
(define-erc-response-handler (331)
"No topic set for channel." nil
- (let ((channel (second (erc-response.command-args parsed)))
+ (let ((channel (cadr (erc-response.command-args parsed)))
(topic (erc-response.contents parsed)))
(erc-display-message parsed 'notice (erc-get-buffer channel proc)
's331 ?c channel)))
(define-erc-response-handler (332)
"TOPIC notice." nil
- (let ((channel (second (erc-response.command-args parsed)))
+ (let ((channel (cadr (erc-response.command-args parsed)))
(topic (erc-response.contents parsed)))
(erc-update-channel-topic channel topic)
(erc-display-message parsed 'notice (erc-get-buffer channel proc)
@@ -1771,8 +1771,8 @@ See `erc-display-server-message'." nil
(define-erc-response-handler (333)
"Who set the topic, and when." nil
- (multiple-value-bind (channel nick time)
- (values-list (cdr (erc-response.command-args parsed)))
+ (pcase-let ((`(,channel ,nick ,time)
+ (cdr (erc-response.command-args parsed))))
(setq time (format-time-string erc-server-timestamp-format
(erc-string-to-emacs-time time)))
(erc-update-channel-topic channel
@@ -1784,15 +1784,15 @@ See `erc-display-server-message'." nil
(define-erc-response-handler (341)
"Let user know when an INVITE attempt has been sent successfully."
nil
- (multiple-value-bind (nick channel)
- (values-list (cdr (erc-response.command-args parsed)))
+ (pcase-let ((`(,nick ,channel)
+ (cdr (erc-response.command-args parsed))))
(erc-display-message parsed 'notice (erc-get-buffer channel proc)
's341 ?n nick ?c channel)))
(define-erc-response-handler (352)
"WHO notice." nil
- (multiple-value-bind (channel user host server nick away-flag)
- (values-list (cdr (erc-response.command-args parsed)))
+ (pcase-let ((`(,channel ,user ,host ,server ,nick ,away-flag)
+ (cdr (erc-response.command-args parsed))))
(let ((full-name (erc-response.contents parsed))
hopcount)
(when (string-match "\\(^[0-9]+ \\)\\(.*\\)$" full-name)
@@ -1806,7 +1806,7 @@ See `erc-display-server-message'." nil
(define-erc-response-handler (353)
"NAMES notice." nil
- (let ((channel (third (erc-response.command-args parsed)))
+ (let ((channel (nth 2 (erc-response.command-args parsed)))
(users (erc-response.contents parsed)))
(erc-display-message parsed 'notice (or (erc-get-buffer channel proc)
'active)
@@ -1816,13 +1816,13 @@ See `erc-display-server-message'." nil
(define-erc-response-handler (366)
"End of NAMES." nil
- (erc-with-buffer ((second (erc-response.command-args parsed)) proc)
+ (erc-with-buffer ((cadr (erc-response.command-args parsed)) proc)
(erc-channel-end-receiving-names)))
(define-erc-response-handler (367)
"Channel ban list entries." nil
- (multiple-value-bind (channel banmask setter time)
- (values-list (cdr (erc-response.command-args parsed)))
+ (pcase-let ((`(,channel ,banmask ,setter ,time)
+ (cdr (erc-response.command-args parsed))))
;; setter and time are not standard
(if setter
(erc-display-message parsed 'notice 'active 's367-set-by
@@ -1836,7 +1836,7 @@ See `erc-display-server-message'." nil
(define-erc-response-handler (368)
"End of channel ban list." nil
- (let ((channel (second (erc-response.command-args parsed))))
+ (let ((channel (cadr (erc-response.command-args parsed))))
(erc-display-message parsed 'notice 'active 's368
?c channel)))
@@ -1845,8 +1845,8 @@ See `erc-display-server-message'." nil
;; FIXME: Yet more magic numbers in original code, I'm guessing this
;; command takes two arguments, and doesn't have any "contents". --
;; Lawrence 2004/05/10
- (multiple-value-bind (from to)
- (values-list (cdr (erc-response.command-args parsed)))
+ (pcase-let ((`(,from ,to)
+ (cdr (erc-response.command-args parsed))))
(erc-display-message parsed 'notice 'active
's379 ?c from ?f to)))
@@ -1854,12 +1854,12 @@ See `erc-display-server-message'." nil
"Server's time string." nil
(erc-display-message
parsed 'notice 'active
- 's391 ?s (second (erc-response.command-args parsed))
- ?t (third (erc-response.command-args parsed))))
+ 's391 ?s (cadr (erc-response.command-args parsed))
+ ?t (nth 2 (erc-response.command-args parsed))))
(define-erc-response-handler (401)
"No such nick/channel." nil
- (let ((nick/channel (second (erc-response.command-args parsed))))
+ (let ((nick/channel (cadr (erc-response.command-args parsed))))
(when erc-whowas-on-nosuchnick
(erc-log (format "cmd: WHOWAS: %s" nick/channel))
(erc-server-send (format "WHOWAS %s 1" nick/channel)))
@@ -1869,23 +1869,23 @@ See `erc-display-server-message'." nil
(define-erc-response-handler (403)
"No such channel." nil
(erc-display-message parsed '(notice error) 'active
- 's403 ?c (second (erc-response.command-args parsed))))
+ 's403 ?c (cadr (erc-response.command-args parsed))))
(define-erc-response-handler (404)
"Cannot send to channel." nil
(erc-display-message parsed '(notice error) 'active
- 's404 ?c (second (erc-response.command-args parsed))))
+ 's404 ?c (cadr (erc-response.command-args parsed))))
(define-erc-response-handler (405)
"Can't join that many channels." nil
(erc-display-message parsed '(notice error) 'active
- 's405 ?c (second (erc-response.command-args parsed))))
+ 's405 ?c (cadr (erc-response.command-args parsed))))
(define-erc-response-handler (406)
"No such nick." nil
(erc-display-message parsed '(notice error) 'active
- 's406 ?n (second (erc-response.command-args parsed))))
+ 's406 ?n (cadr (erc-response.command-args parsed))))
(define-erc-response-handler (412)
"No text to send." nil
@@ -1894,33 +1894,33 @@ See `erc-display-server-message'." nil
(define-erc-response-handler (421)
"Unknown command." nil
(erc-display-message parsed '(notice error) 'active 's421
- ?c (second (erc-response.command-args parsed))))
+ ?c (cadr (erc-response.command-args parsed))))
(define-erc-response-handler (432)
"Bad nick." nil
(erc-display-message parsed '(notice error) 'active 's432
- ?n (second (erc-response.command-args parsed))))
+ ?n (cadr (erc-response.command-args parsed))))
(define-erc-response-handler (433)
"Login-time \"nick in use\"." nil
- (erc-nickname-in-use (second (erc-response.command-args parsed))
+ (erc-nickname-in-use (cadr (erc-response.command-args parsed))
"already in use"))
(define-erc-response-handler (437)
"Nick temporarily unavailable (on IRCnet)." nil
- (let ((nick/channel (second (erc-response.command-args parsed))))
+ (let ((nick/channel (cadr (erc-response.command-args parsed))))
(unless (erc-channel-p nick/channel)
(erc-nickname-in-use nick/channel "temporarily unavailable"))))
(define-erc-response-handler (442)
"Not on channel." nil
(erc-display-message parsed '(notice error) 'active 's442
- ?c (second (erc-response.command-args parsed))))
+ ?c (cadr (erc-response.command-args parsed))))
(define-erc-response-handler (461)
"Not enough parameters for command." nil
(erc-display-message parsed '(notice error) 'active 's461
- ?c (second (erc-response.command-args parsed))
+ ?c (cadr (erc-response.command-args parsed))
?m (erc-response.contents parsed)))
(define-erc-response-handler (465)
@@ -1936,37 +1936,37 @@ See `erc-display-server-message'." nil
(erc-display-message parsed '(notice error) nil
(intern (format "s%s"
(erc-response.command parsed)))
- ?c (second (erc-response.command-args parsed))))
+ ?c (cadr (erc-response.command-args parsed))))
(define-erc-response-handler (475)
"Channel key needed." nil
(erc-display-message parsed '(notice error) nil 's475
- ?c (second (erc-response.command-args parsed)))
+ ?c (cadr (erc-response.command-args parsed)))
(when erc-prompt-for-channel-key
- (let ((channel (second (erc-response.command-args parsed)))
+ (let ((channel (cadr (erc-response.command-args parsed)))
(key (read-from-minibuffer
(format "Channel %s is mode +k. Enter key (RET to cancel): "
- (second (erc-response.command-args parsed))))))
+ (cadr (erc-response.command-args parsed))))))
(when (and key (> (length key) 0))
(erc-cmd-JOIN channel key)))))
(define-erc-response-handler (477)
"Channel doesn't support modes." nil
- (let ((channel (second (erc-response.command-args parsed)))
+ (let ((channel (cadr (erc-response.command-args parsed)))
(message (erc-response.contents parsed)))
(erc-display-message parsed 'notice (erc-get-buffer channel proc)
(format "%s: %s" channel message))))
(define-erc-response-handler (482)
"You need to be a channel operator to do that." nil
- (let ((channel (second (erc-response.command-args parsed)))
+ (let ((channel (cadr (erc-response.command-args parsed)))
(message (erc-response.contents parsed)))
(erc-display-message parsed '(error notice) 'active 's482
?c channel ?m message)))
(define-erc-response-handler (671)
"Secure connection response in WHOIS." nil
- (let ((nick (second (erc-response.command-args parsed)))
+ (let ((nick (cadr (erc-response.command-args parsed)))
(securemsg (erc-response.contents parsed)))
(erc-display-message parsed 'notice 'active 's671
?n nick ?a securemsg)))
diff --git a/lisp/erc/erc-capab.el b/lisp/erc/erc-capab.el
index c037a086e26..4d22b2c5f50 100644
--- a/lisp/erc/erc-capab.el
+++ b/lisp/erc/erc-capab.el
@@ -68,7 +68,6 @@
;;; Code:
(require 'erc)
-(eval-when-compile (require 'cl))
;;; Customization:
diff --git a/lisp/erc/erc-dcc.el b/lisp/erc/erc-dcc.el
index d5cee08c811..acb8febea80 100644
--- a/lisp/erc/erc-dcc.el
+++ b/lisp/erc/erc-dcc.el
@@ -54,9 +54,7 @@
;;; Code:
(require 'erc)
-(eval-when-compile
- (require 'cl)
- (require 'pcomplete))
+(eval-when-compile (require 'pcomplete))
;;;###autoload (autoload 'erc-dcc-mode "erc-dcc")
(define-erc-module dcc nil
@@ -277,7 +275,7 @@ Argument IP is the address as a string. The result is also a string."
(* (nth 1 ips) 65536.0)
(* (nth 2 ips) 256.0)
(nth 3 ips))))
- (if (interactive-p)
+ (if (called-interactively-p 'interactive)
(message "%s is %.0f" ip res)
(format "%.0f" res)))))
@@ -380,8 +378,8 @@ created subprocess, or nil."
(with-no-warnings ; obsolete since 23.1
(set-process-filter-multibyte process nil)))))
(file-error
- (unless (and (string= "Cannot bind server socket" (cadr err))
- (string= "address already in use" (caddr err)))
+ (unless (and (string= "Cannot bind server socket" (nth 1 err))
+ (string= "address already in use" (nth 2 err)))
(signal (car err) (cdr err)))
(setq port (1+ port))
(unless (< port upper)
@@ -434,38 +432,38 @@ where FOO is one of CLOSE, GET, SEND, LIST, CHAT, etc."
(pcomplete-here (append '("chat" "close" "get" "list")
(when (fboundp 'make-network-process) '("send"))))
(pcomplete-here
- (case (intern (downcase (pcomplete-arg 1)))
- (chat (mapcar (lambda (elt) (plist-get elt :nick))
+ (pcase (intern (downcase (pcomplete-arg 1)))
+ (`chat (mapcar (lambda (elt) (plist-get elt :nick))
+ (erc-remove-if-not
+ #'(lambda (elt)
+ (eq (plist-get elt :type) 'CHAT))
+ erc-dcc-list)))
+ (`close (erc-delete-dups
+ (mapcar (lambda (elt) (symbol-name (plist-get elt :type)))
+ erc-dcc-list)))
+ (`get (mapcar #'erc-dcc-nick
(erc-remove-if-not
#'(lambda (elt)
- (eq (plist-get elt :type) 'CHAT))
+ (eq (plist-get elt :type) 'GET))
erc-dcc-list)))
- (close (erc-delete-dups
- (mapcar (lambda (elt) (symbol-name (plist-get elt :type)))
- erc-dcc-list)))
- (get (mapcar #'erc-dcc-nick
- (erc-remove-if-not
- #'(lambda (elt)
- (eq (plist-get elt :type) 'GET))
- erc-dcc-list)))
- (send (pcomplete-erc-all-nicks))))
+ (`send (pcomplete-erc-all-nicks))))
(pcomplete-here
- (case (intern (downcase (pcomplete-arg 2)))
- (get (mapcar (lambda (elt) (plist-get elt :file))
- (erc-remove-if-not
- #'(lambda (elt)
- (and (eq (plist-get elt :type) 'GET)
- (erc-nick-equal-p (erc-extract-nick
- (plist-get elt :nick))
- (pcomplete-arg 1))))
- erc-dcc-list)))
- (close (mapcar #'erc-dcc-nick
- (erc-remove-if-not
- #'(lambda (elt)
- (eq (plist-get elt :type)
- (intern (upcase (pcomplete-arg 1)))))
- erc-dcc-list)))
- (send (pcomplete-entries)))))
+ (pcase (intern (downcase (pcomplete-arg 2)))
+ (`get (mapcar (lambda (elt) (plist-get elt :file))
+ (erc-remove-if-not
+ #'(lambda (elt)
+ (and (eq (plist-get elt :type) 'GET)
+ (erc-nick-equal-p (erc-extract-nick
+ (plist-get elt :nick))
+ (pcomplete-arg 1))))
+ erc-dcc-list)))
+ (`close (mapcar #'erc-dcc-nick
+ (erc-remove-if-not
+ #'(lambda (elt)
+ (eq (plist-get elt :type)
+ (intern (upcase (pcomplete-arg 1)))))
+ erc-dcc-list)))
+ (`send (pcomplete-entries)))))
(defun erc-dcc-do-CHAT-command (proc &optional nick)
(when nick
@@ -899,7 +897,7 @@ other client."
(let* ((buffer (erc-dcc-find-file file))
(size (buffer-size buffer))
(start (with-current-buffer buffer
- (set-marker (make-marker) (point-min))))
+ (point-min-marker)))
(sproc (erc-dcc-server "dcc-send"
'erc-dcc-send-filter
'erc-dcc-send-sentinel))
@@ -944,7 +942,6 @@ filter and a process sentinel, and making the connection."
(set-buffer-multibyte nil))
(setq mode-line-process '(":%s")
- buffer-file-type t
buffer-read-only t)
(setq erc-dcc-file-name file)
@@ -1168,7 +1165,7 @@ other client."
(setq erc-dcc-from nick)
(setq erc-dcc-entry-data entry)
(setq erc-dcc-unprocessed-output "")
- (setq erc-insert-marker (set-marker (make-marker) (point-max)))
+ (setq erc-insert-marker (point-max-marker))
(setq erc-input-marker (make-marker))
(erc-display-prompt buffer (point-max))
(set-process-buffer proc buffer)
@@ -1248,7 +1245,7 @@ other client."
(defun erc-dcc-no-such-nick (proc parsed)
"Detect and handle no-such-nick replies from the IRC server."
- (let* ((elt (erc-dcc-member :nick (second (erc-response.command-args parsed))
+ (let* ((elt (erc-dcc-member :nick (nth 1 (erc-response.command-args parsed))
:parent proc))
(peer (plist-get elt :peer)))
(when (or (and (processp peer) (not (eq (process-status peer) 'open)))
diff --git a/lisp/erc/erc-ezbounce.el b/lisp/erc/erc-ezbounce.el
index 760a442a198..32a4f39305a 100644
--- a/lisp/erc/erc-ezbounce.el
+++ b/lisp/erc/erc-ezbounce.el
@@ -26,7 +26,6 @@
;;; Code:
(require 'erc)
-(eval-when-compile (require 'cl))
(defgroup erc-ezbounce nil
"Interface to the EZBounce IRC bouncer (a virtual IRC server)"
diff --git a/lisp/erc/erc-join.el b/lisp/erc/erc-join.el
index 391b178cc7b..b6e6dfc5253 100644
--- a/lisp/erc/erc-join.el
+++ b/lisp/erc/erc-join.el
@@ -34,7 +34,6 @@
(require 'erc)
(require 'auth-source)
-(eval-when-compile (require 'cl))
(defgroup erc-autojoin nil
"Enable autojoining."
diff --git a/lisp/erc/erc-log.el b/lisp/erc/erc-log.el
index 9bdb7849fe6..465babc74f7 100644
--- a/lisp/erc/erc-log.el
+++ b/lisp/erc/erc-log.el
@@ -93,9 +93,7 @@
;;; Code:
(require 'erc)
-(eval-when-compile
- (require 'erc-networks)
- (require 'cl))
+(eval-when-compile (require 'erc-networks))
(defgroup erc-log nil
"Logging facilities for ERC."
@@ -429,7 +427,8 @@ You can save every individual message by putting this function on
file t 'nomessage))))
(let ((coding-system-for-write coding-system))
(write-region start end file t 'nomessage))))
- (if (and erc-truncate-buffer-on-save (interactive-p))
+ (if (and erc-truncate-buffer-on-save
+ (called-interactively-p 'interactive))
(progn
(let ((inhibit-read-only t)) (erase-buffer))
(move-marker erc-last-saved-position (point-max))
diff --git a/lisp/erc/erc-match.el b/lisp/erc/erc-match.el
index 0bafb43312c..63683890226 100644
--- a/lisp/erc/erc-match.el
+++ b/lisp/erc/erc-match.el
@@ -35,7 +35,6 @@
;;; Code:
(require 'erc)
-(eval-when-compile (require 'cl))
;; Customization:
@@ -453,11 +452,19 @@ Use this defun with `erc-insert-modify-hook'."
(match-beginning 0)))
(nick-end (when nick-beg
(match-end 0)))
- (message (buffer-substring (if (and nick-end
- (<= (+ 2 nick-end) (point-max)))
- (+ 2 nick-end)
- (point-min))
- (point-max))))
+ (message (buffer-substring
+ (if (and nick-end
+ (<= (+ 2 nick-end) (point-max)))
+ ;; Message starts 2 characters after the nick
+ ;; except for CTCP ACTION messages. Nick
+ ;; surrounded by angle brackets only in normal
+ ;; messages.
+ (+ nick-end
+ (if (eq ?> (char-after nick-end))
+ 2
+ 1))
+ (point-min))
+ (point-max))))
(when (and vector
(not (and erc-match-exclude-server-buffer
(erc-server-buffer-p))))
diff --git a/lisp/erc/erc-netsplit.el b/lisp/erc/erc-netsplit.el
index b630ebed807..7afbcd94273 100644
--- a/lisp/erc/erc-netsplit.el
+++ b/lisp/erc/erc-netsplit.el
@@ -31,7 +31,6 @@
;;; Code:
(require 'erc)
-(eval-when-compile (require 'cl))
(defgroup erc-netsplit nil
"Netsplit detection tries to automatically figure when a
@@ -107,7 +106,7 @@ join from that split has been detected or not.")
(dolist (elt erc-netsplit-list)
(if (member nick (nthcdr 3 elt))
(progn
- (if (not (caddr elt))
+ (if (not (nth 2 elt))
(progn
(erc-display-message
parsed 'notice (process-buffer proc)
@@ -149,7 +148,7 @@ join from that split has been detected or not.")
;; element for this netsplit exists already
(progn
(setcdr (nthcdr 2 ass) (cons nick (nthcdr 3 ass)))
- (when (caddr ass)
+ (when (nth 2 ass)
;; There was already a netjoin for this netsplit, it
;; seems like the old one didn't get finished...
(erc-display-message
@@ -194,7 +193,7 @@ join from that split has been detected or not.")
nil 'notice 'active
'netsplit-wholeft ?s (car elt)
?n (mapconcat 'erc-extract-nick (nthcdr 3 elt) " ")
- ?t (if (caddr elt)
+ ?t (if (nth 2 elt)
"(joining)"
"")))))
t)
diff --git a/lisp/erc/erc-networks.el b/lisp/erc/erc-networks.el
index 885e47fc233..177f3714ae2 100644
--- a/lisp/erc/erc-networks.el
+++ b/lisp/erc/erc-networks.el
@@ -40,7 +40,7 @@
;;; Code:
(require 'erc)
-(eval-when-compile (require 'cl))
+(eval-when-compile (require 'cl-lib))
;; Variables
@@ -729,10 +729,10 @@ search for a match in `erc-networks-alist'."
(or
;; Loop through `erc-networks-alist' looking for a match.
(let ((server (or erc-server-announced-name erc-session-server)))
- (loop for (name matcher) in erc-networks-alist
- when (and matcher
- (string-match (concat matcher "\\'") server))
- do (return name)))
+ (cl-loop for (name matcher) in erc-networks-alist
+ when (and matcher
+ (string-match (concat matcher "\\'") server))
+ do (cl-return name)))
'Unknown)))
(defun erc-network ()
@@ -789,8 +789,8 @@ As an example:
(cond ((numberp p)
(push p result))
((listp p)
- (setq result (nconc (loop for i from (cadr p) downto (car p)
- collect i)
+ (setq result (nconc (cl-loop for i from (cadr p) downto (car p)
+ collect i)
result)))))
(nreverse result)))
diff --git a/lisp/erc/erc-notify.el b/lisp/erc/erc-notify.el
index 65ed34965d8..7061b035e54 100644
--- a/lisp/erc/erc-notify.el
+++ b/lisp/erc/erc-notify.el
@@ -30,9 +30,7 @@
(require 'erc)
(require 'erc-networks)
-(eval-when-compile
- (require 'cl)
- (require 'pcomplete))
+(eval-when-compile (require 'pcomplete))
;;;; Customizable variables
diff --git a/lisp/erc/erc-pcomplete.el b/lisp/erc/erc-pcomplete.el
index 212ad50a639..410a3c6d04c 100644
--- a/lisp/erc/erc-pcomplete.el
+++ b/lisp/erc/erc-pcomplete.el
@@ -43,7 +43,6 @@
(require 'erc)
(require 'erc-compat)
(require 'time-date)
-(eval-when-compile (require 'cl))
(defgroup erc-pcomplete nil
"Programmable completion for ERC"
diff --git a/lisp/erc/erc-services.el b/lisp/erc/erc-services.el
index 10cbc37645b..1e3c3b17a23 100644
--- a/lisp/erc/erc-services.el
+++ b/lisp/erc/erc-services.el
@@ -62,7 +62,7 @@
(require 'erc)
(require 'erc-networks)
-(eval-when-compile (require 'cl))
+(eval-when-compile (require 'cl-lib))
;; Customization:
diff --git a/lisp/erc/erc-speedbar.el b/lisp/erc/erc-speedbar.el
index 5d55cc8d6fc..af043bdb2c1 100644
--- a/lisp/erc/erc-speedbar.el
+++ b/lisp/erc/erc-speedbar.el
@@ -38,7 +38,6 @@
(require 'erc)
(require 'speedbar)
(condition-case nil (require 'dframe) (error nil))
-(eval-when-compile (require 'cl))
;;; Customization:
diff --git a/lisp/erc/erc-track.el b/lisp/erc/erc-track.el
index 182b99bd47a..054c135fa67 100644
--- a/lisp/erc/erc-track.el
+++ b/lisp/erc/erc-track.el
@@ -34,7 +34,7 @@
;; * Add extensibility so that custom functions can track
;; custom modification types.
-(eval-when-compile (require 'cl))
+(eval-when-compile (require 'cl-lib))
(require 'erc)
(require 'erc-compat)
(require 'erc-match)
@@ -484,7 +484,7 @@ START is the minimum length of the name used."
;;; Test:
-(assert
+(cl-assert
(and
;; verify examples from the doc strings
(equal (let ((erc-track-shorten-aggressively nil))
@@ -869,7 +869,7 @@ Use `erc-make-mode-line-buffer-name' to create buttons."
(setq erc-modified-channels-alist
(delete (assq buffer erc-modified-channels-alist)
erc-modified-channels-alist))
- (when (interactive-p)
+ (when (called-interactively-p 'interactive)
(erc-modified-channels-display)))
(defun erc-track-find-face (faces)
@@ -980,7 +980,7 @@ is in `erc-mode'."
(add-to-list 'faces cur)))
faces))
-(assert
+(cl-assert
(let ((str "is bold"))
(put-text-property 3 (length str)
'face '(bold erc-current-nick-face)
@@ -1030,17 +1030,17 @@ relative to `erc-track-switch-direction'"
(let ((dir erc-track-switch-direction)
offset)
(when (< arg 0)
- (setq dir (case dir
- (oldest 'newest)
- (newest 'oldest)
- (mostactive 'leastactive)
- (leastactive 'mostactive)
- (importance 'oldest)))
+ (setq dir (pcase dir
+ (`oldest 'newest)
+ (`newest 'oldest)
+ (`mostactive 'leastactive)
+ (`leastactive 'mostactive)
+ (`importance 'oldest)))
(setq arg (- arg)))
- (setq offset (case dir
- ((oldest leastactive)
+ (setq offset (pcase dir
+ ((or `oldest `leastactive)
(- (length erc-modified-channels-alist) arg))
- (t (1- arg))))
+ (_ (1- arg))))
;; normalize out of range user input
(cond ((>= offset (length erc-modified-channels-alist))
(setq offset (1- (length erc-modified-channels-alist))))
diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index 01991e599df..042ad09decf 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -67,7 +67,7 @@
(defconst erc-version-string "Version 5.3"
"ERC version. This is used by function `erc-version'.")
-(eval-when-compile (require 'cl))
+(eval-when-compile (require 'cl-lib))
(require 'font-lock)
(require 'pp)
(require 'thingatpt)
@@ -369,7 +369,7 @@ If no server buffer exists, return nil."
(with-current-buffer ,buffer
,@body)))))
-(defstruct (erc-server-user (:type vector) :named)
+(cl-defstruct (erc-server-user (:type vector) :named)
;; User data
nickname host login full-name info
;; Buffers
@@ -379,7 +379,7 @@ If no server buffer exists, return nil."
(buffers nil)
)
-(defstruct (erc-channel-user (:type vector) :named)
+(cl-defstruct (erc-channel-user (:type vector) :named)
op voice
;; Last message time (in the form of the return value of
;; (current-time)
@@ -1386,7 +1386,7 @@ If BUFFER is nil, the current buffer is used."
t))
(erc-server-send (format "ISON %s" nick))
(while (eq erc-online-p 'unknown) (accept-process-output))
- (if (interactive-p)
+ (if (called-interactively-p 'interactive)
(message "%s is %sonline"
(or erc-online-p nick)
(if erc-online-p "" "not "))
@@ -2157,11 +2157,11 @@ functions in here get called with the parameters SERVER and NICK."
(list :server server :port port :nick nick :password passwd)))
;;;###autoload
-(defun* erc (&key (server (erc-compute-server))
- (port (erc-compute-port))
- (nick (erc-compute-nick))
- password
- (full-name (erc-compute-full-name)))
+(cl-defun erc (&key (server (erc-compute-server))
+ (port (erc-compute-port))
+ (nick (erc-compute-nick))
+ password
+ (full-name (erc-compute-full-name)))
"ERC is a powerful, modular, and extensible IRC client.
This function is the main entry point for ERC.
@@ -2383,24 +2383,24 @@ If STRING is nil, the function does nothing."
(while list
(setq elt (car list))
(cond ((integerp elt) ; POSITION
- (incf (car list) shift))
+ (cl-incf (car list) shift))
((or (atom elt) ; nil, EXTENT
;; (eq t (car elt)) ; (t . TIME)
(markerp (car elt))) ; (MARKER . DISTANCE)
nil)
((integerp (car elt)) ; (BEGIN . END)
- (incf (car elt) shift)
- (incf (cdr elt) shift))
+ (cl-incf (car elt) shift)
+ (cl-incf (cdr elt) shift))
((stringp (car elt)) ; (TEXT . POSITION)
- (incf (cdr elt) (* (if (natnump (cdr elt)) 1 -1) shift)))
+ (cl-incf (cdr elt) (* (if (natnump (cdr elt)) 1 -1) shift)))
((null (car elt)) ; (nil PROPERTY VALUE BEG . END)
(let ((cons (nthcdr 3 elt)))
- (incf (car cons) shift)
- (incf (cdr cons) shift)))
+ (cl-incf (car cons) shift)
+ (cl-incf (cdr cons) shift)))
((and (featurep 'xemacs)
(extentp (car elt))) ; (EXTENT START END)
- (incf (nth 1 elt) shift)
- (incf (nth 2 elt) shift)))
+ (cl-incf (nth 1 elt) shift)
+ (cl-incf (nth 2 elt) shift)))
(setq list (cdr list))))))
(defvar erc-valid-nick-regexp "[]a-zA-Z^[;\\`_{}|][]^[;\\`_{}|a-zA-Z0-9-]*"
@@ -2477,6 +2477,13 @@ purposes."
:group 'erc-lurker
:type 'boolean)
+(defcustom erc-lurker-ignore-chars "`_"
+ "Characters at the end of a nick to strip for activity tracking purposes.
+
+See also `erc-lurker-trim-nicks'."
+ :group 'erc-lurker
+ :type 'string)
+
(defun erc-lurker-maybe-trim (nick)
"Maybe trim trailing `erc-lurker-ignore-chars' from NICK.
@@ -2491,13 +2498,6 @@ non-nil."
"" nick)
nick))
-(defcustom erc-lurker-ignore-chars "`_"
- "Characters at the end of a nick to strip for activity tracking purposes.
-
-See also `erc-lurker-trim-nicks'."
- :group 'erc-lurker
- :type 'string)
-
(defcustom erc-lurker-hide-list nil
"List of IRC type messages to hide when sent by lurkers.
@@ -2534,9 +2534,9 @@ consumption for long-lived IRC or Emacs sessions."
(maphash
(lambda (nick last-PRIVMSG-time)
(when
- (> (time-to-seconds (time-subtract
- (current-time)
- last-PRIVMSG-time))
+ (> (float-time (time-subtract
+ (current-time)
+ last-PRIVMSG-time))
erc-lurker-threshold-time)
(remhash nick hash)))
hash)
@@ -2580,7 +2580,8 @@ updates of `erc-lurker-state'."
(server
(erc-canonicalize-server-name erc-server-announced-name)))
(when (equal command "PRIVMSG")
- (when (>= (incf erc-lurker-cleanup-count) erc-lurker-cleanup-interval)
+ (when (>= (cl-incf erc-lurker-cleanup-count)
+ erc-lurker-cleanup-interval)
(setq erc-lurker-cleanup-count 0)
(erc-lurker-cleanup))
(unless (gethash server erc-lurker-state)
@@ -2601,10 +2602,21 @@ server within `erc-lurker-threshold-time'. See also
(gethash (erc-lurker-maybe-trim nick)
(gethash server erc-lurker-state (make-hash-table)))))
(or (null last-PRIVMSG-time)
- (> (time-to-seconds
+ (> (float-time
(time-subtract (current-time) last-PRIVMSG-time))
erc-lurker-threshold-time))))
+(defcustom erc-common-server-suffixes
+ '(("openprojects.net$" . "OPN")
+ ("freenode.net$" . "freenode")
+ ("oftc.net$" . "OFTC"))
+ "Alist of common server name suffixes.
+This variable is used in mode-line display to save screen
+real estate. Set it to nil if you want to avoid changing
+displayed hostnames."
+ :group 'erc-mode-line-and-header
+ :type 'alist)
+
(defun erc-canonicalize-server-name (server)
"Returns the canonical network name for SERVER if any,
otherwise `erc-server-announced-name'. SERVER is matched against
@@ -3115,37 +3127,37 @@ If SERVER is non-nil, use that, rather than the current server."
(add-to-list 'symlist
(cons (erc-once-with-server-event
311 `(string= ,nick
- (second
+ (nth 1
(erc-response.command-args parsed))))
'erc-server-311-functions))
(add-to-list 'symlist
(cons (erc-once-with-server-event
312 `(string= ,nick
- (second
+ (nth 1
(erc-response.command-args parsed))))
'erc-server-312-functions))
(add-to-list 'symlist
(cons (erc-once-with-server-event
318 `(string= ,nick
- (second
+ (nth 1
(erc-response.command-args parsed))))
'erc-server-318-functions))
(add-to-list 'symlist
(cons (erc-once-with-server-event
319 `(string= ,nick
- (second
+ (nth 1
(erc-response.command-args parsed))))
'erc-server-319-functions))
(add-to-list 'symlist
(cons (erc-once-with-server-event
320 `(string= ,nick
- (second
+ (nth 1
(erc-response.command-args parsed))))
'erc-server-320-functions))
(add-to-list 'symlist
(cons (erc-once-with-server-event
330 `(string= ,nick
- (second
+ (nth 1
(erc-response.command-args parsed))))
'erc-server-330-functions))
(add-to-list 'symlist
@@ -4328,8 +4340,8 @@ See also: `erc-echo-notice-in-user-buffers',
(defun erc-banlist-store (proc parsed)
"Record ban entries for a channel."
- (multiple-value-bind (channel mask whoset)
- (values-list (cdr (erc-response.command-args parsed)))
+ (pcase-let ((`(,channel ,mask ,whoset)
+ (cdr (erc-response.command-args parsed))))
;; Determine to which buffer the message corresponds
(let ((buffer (erc-get-buffer channel proc)))
(with-current-buffer buffer
@@ -4340,7 +4352,7 @@ See also: `erc-echo-notice-in-user-buffers',
(defun erc-banlist-finished (proc parsed)
"Record that we have received the banlist."
- (let* ((channel (second (erc-response.command-args parsed)))
+ (let* ((channel (nth 1 (erc-response.command-args parsed)))
(buffer (erc-get-buffer channel proc)))
(with-current-buffer buffer
(put 'erc-channel-banlist 'received-from-server t)))
@@ -4349,7 +4361,7 @@ See also: `erc-echo-notice-in-user-buffers',
(defun erc-banlist-update (proc parsed)
"Check MODE commands for bans and update the banlist appropriately."
;; FIXME: Possibly incorrect. -- Lawrence 2004-05-11
- (let* ((tgt (first (erc-response.command-args parsed)))
+ (let* ((tgt (car (erc-response.command-args parsed)))
(mode (erc-response.contents parsed))
(whoset (erc-response.sender parsed))
(buffer (erc-get-buffer tgt proc)))
@@ -5203,42 +5215,66 @@ Specifically, return the position of `erc-insert-marker'."
"Return the value of `point' at the end of the input line."
(point-max))
+(defvar erc-last-input-time 0
+ "Time of last call to `erc-send-current-line'.
+If that function has never been called, the value is 0.")
+
+(defcustom erc-accidental-paste-threshold-seconds nil
+ "Minimum time, in seconds, before sending new lines via IRC.
+If the value is a number, `erc-send-current-line' signals an
+error if its previous invocation was less than this much time
+ago. This is useful so that if you accidentally enter large
+amounts of text into the ERC buffer, that text is not sent to the
+IRC server.
+
+If the value is nil, `erc-send-current-line' always considers any
+submitted line to be intentional."
+ :group 'erc
+ :version "24.4"
+ :type '(choice number (other :tag "disabled" nil)))
+
(defun erc-send-current-line ()
"Parse current line and send it to IRC."
(interactive)
- (save-restriction
- (widen)
- (if (< (point) (erc-beg-of-input-line))
- (erc-error "Point is not in the input area")
- (let ((inhibit-read-only t)
- (str (erc-user-input))
- (old-buf (current-buffer)))
- (if (and (not (erc-server-buffer-live-p))
- (not (erc-command-no-process-p str)))
- (erc-error "ERC: No process running")
- (erc-set-active-buffer (current-buffer))
-
- ;; Kill the input and the prompt
- (delete-region (erc-beg-of-input-line)
- (erc-end-of-input-line))
-
- (unwind-protect
- (erc-send-input str)
- ;; Fix the buffer if the command didn't kill it
- (when (buffer-live-p old-buf)
- (with-current-buffer old-buf
- (save-restriction
- (widen)
- (goto-char (point-max))
- (when (processp erc-server-process)
- (set-marker (process-mark erc-server-process) (point)))
- (set-marker erc-insert-marker (point))
- (let ((buffer-modified (buffer-modified-p)))
- (erc-display-prompt)
- (set-buffer-modified-p buffer-modified))))))
-
- ;; Only when last hook has been run...
- (run-hook-with-args 'erc-send-completed-hook str))))))
+ (let ((now (float-time)))
+ (if (or (not erc-accidental-paste-threshold-seconds)
+ (< erc-accidental-paste-threshold-seconds
+ (- now erc-last-input-time)))
+ (save-restriction
+ (widen)
+ (if (< (point) (erc-beg-of-input-line))
+ (erc-error "Point is not in the input area")
+ (let ((inhibit-read-only t)
+ (str (erc-user-input))
+ (old-buf (current-buffer)))
+ (if (and (not (erc-server-buffer-live-p))
+ (not (erc-command-no-process-p str)))
+ (erc-error "ERC: No process running")
+ (erc-set-active-buffer (current-buffer))
+ ;; Kill the input and the prompt
+ (delete-region (erc-beg-of-input-line)
+ (erc-end-of-input-line))
+ (unwind-protect
+ (erc-send-input str)
+ ;; Fix the buffer if the command didn't kill it
+ (when (buffer-live-p old-buf)
+ (with-current-buffer old-buf
+ (save-restriction
+ (widen)
+ (goto-char (point-max))
+ (when (processp erc-server-process)
+ (set-marker (process-mark erc-server-process) (point)))
+ (set-marker erc-insert-marker (point))
+ (let ((buffer-modified (buffer-modified-p)))
+ (erc-display-prompt)
+ (set-buffer-modified-p buffer-modified))))))
+
+ ;; Only when last hook has been run...
+ (run-hook-with-args 'erc-send-completed-hook str))))
+ (setq erc-last-input-time now))
+ (switch-to-buffer "*ERC Accidental Paste Overflow*")
+ (lwarn 'erc :warning
+ "You seem to have accidentally pasted some text!"))))
(defun erc-user-input ()
"Return the input of the user in the current buffer."
@@ -6000,7 +6036,7 @@ entry of `channel-members'."
(if cuser
(setq op (erc-channel-user-op cuser)
voice (erc-channel-user-voice cuser)))
- (if (interactive-p)
+ (if (called-interactively-p 'interactive)
(message "%s is %s@%s%s%s"
nick login host
(if full-name (format " (%s)" full-name) "")
@@ -6088,17 +6124,6 @@ Otherwise, use the `erc-header-line' face."
:group 'erc-paranoia
:type 'boolean)
-(defcustom erc-common-server-suffixes
- '(("openprojects.net$" . "OPN")
- ("freenode.net$" . "freenode")
- ("oftc.net$" . "OFTC"))
- "Alist of common server name suffixes.
-This variable is used in mode-line display to save screen
-real estate. Set it to nil if you want to avoid changing
-displayed hostnames."
- :group 'erc-mode-line-and-header
- :type 'alist)
-
(defcustom erc-mode-line-away-status-format
"(AWAY since %a %b %d %H:%M) "
"When you're away on a server, this is shown in the mode line.
@@ -6302,7 +6327,7 @@ If optional argument HERE is non-nil, insert version number at point."
(format "ERC %s (GNU Emacs %s)" erc-version-string emacs-version)))
(if here
(insert version-string)
- (if (interactive-p)
+ (if (called-interactively-p 'interactive)
(message "%s" version-string)
version-string))))
@@ -6322,7 +6347,7 @@ If optional argument HERE is non-nil, insert version number at point."
", ")))
(if here
(insert string)
- (if (interactive-p)
+ (if (called-interactively-p 'interactive)
(message "%s" string)
string))))
diff --git a/lisp/eshell/em-cmpl.el b/lisp/eshell/em-cmpl.el
index 8520a9c83d2..91311deffcf 100644
--- a/lisp/eshell/em-cmpl.el
+++ b/lisp/eshell/em-cmpl.el
@@ -63,7 +63,7 @@
;; The list of possible completions can be viewed at any point by
;; pressing <M-?>.
;;
-;; Finally, context-related help can be accessed by pressing <C-c i>.
+;; Finally, context-related help can be accessed by pressing <C-c M-h>.
;; This only works well if the completion function has provided Eshell
;; with sufficient pointers to locate the relevant help text.
diff --git a/lisp/eshell/em-ls.el b/lisp/eshell/em-ls.el
index eec932103ee..73ed617b871 100644
--- a/lisp/eshell/em-ls.el
+++ b/lisp/eshell/em-ls.el
@@ -26,9 +26,8 @@
;;; Code:
-(eval-when-compile
- (require 'cl-lib)
- (require 'eshell))
+(eval-when-compile (require 'eshell))
+(require 'cl-lib)
(require 'esh-util)
(require 'esh-opt)
@@ -328,6 +327,7 @@ instead."
(defvar numeric-uid-gid)
(defvar reverse-list)
(defvar show-all)
+(defvar show-almost-all)
(defvar show-recursive)
(defvar show-size)
(defvar sort-method)
@@ -337,13 +337,15 @@ instead."
(defun eshell-do-ls (&rest args)
"Implementation of \"ls\" in Lisp, passing ARGS."
(funcall flush-func -1)
- ;; process the command arguments, and begin listing files
+ ;; Process the command arguments, and begin listing files.
(eshell-eval-using-options
"ls" (if eshell-ls-initial-args
(list eshell-ls-initial-args args)
args)
`((?a "all" nil show-all
- "show all files in directory")
+ "do not ignore entries starting with .")
+ (?A "almost-all" nil show-almost-all
+ "do not list implied . and ..")
(?c nil by-ctime sort-method
"sort by last status change time")
(?d "directory" nil dir-literal
@@ -558,7 +560,15 @@ relative to that directory."
;; later when we are going to
;; display user and group names.
(if numeric-uid-gid 'integer 'string))))
- (when (and (not show-all) eshell-ls-exclude-regexp)
+ (when (and show-almost-all
+ (not show-all))
+ (setq entries
+ (cl-remove-if
+ (lambda (entry)
+ (member (caar entry) '("." "..")))
+ entries)))
+ (when (and (not show-all)
+ eshell-ls-exclude-regexp)
(while (and entries (string-match eshell-ls-exclude-regexp
(caar entries)))
(setq entries (cdr entries)))
diff --git a/lisp/eshell/em-tramp.el b/lisp/eshell/em-tramp.el
new file mode 100644
index 00000000000..c60d0e6395f
--- /dev/null
+++ b/lisp/eshell/em-tramp.el
@@ -0,0 +1,143 @@
+;;; em-tramp.el --- Eshell features that require TRAMP
+
+;; Copyright (C) 1999-2013 Free Software Foundation, Inc.
+
+;; Author: Aidan Gauland <aidalgol@no8wireless.co.nz>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Eshell features that require TRAMP.
+
+;;; Code:
+
+(eval-when-compile
+ (require 'esh-mode)
+ (require 'eshell)
+ (require 'tramp))
+
+(require 'esh-util)
+
+;;;###autoload
+(progn
+ (defgroup eshell-tramp nil
+ "This module defines commands that use TRAMP in a way that is
+ not transparent to the user. So far, this includes only the
+ built-in su and sudo commands, which are not compatible with
+ the full, external su and sudo commands, and require the user
+ to understand how to use the TRAMP sudo method."
+ :tag "TRAMP Eshell features"
+ :group 'eshell-module))
+
+(defun eshell-tramp-initialize ()
+ "Initialize the TRAMP-using commands code."
+ (when (eshell-using-module 'eshell-cmpl)
+ (add-hook 'pcomplete-try-first-hook
+ 'eshell-complete-host-reference nil t))
+ (make-local-variable 'eshell-complex-commands)
+ (setq eshell-complex-commands
+ (append '("su" "sudo")
+ eshell-complex-commands)))
+
+(defun eshell/su (&rest args)
+ "Alias \"su\" to call TRAMP.
+
+Uses the system su through TRAMP's su method."
+ (setq args (eshell-stringify-list (eshell-flatten-list args)))
+ (let ((orig-args (copy-tree args)))
+ (eshell-eval-using-options
+ "su" args
+ '((?h "help" nil nil "show this usage screen")
+ (?l "login" nil login "provide a login environment")
+ (? nil nil login "provide a login environment")
+ :usage "[- | -l | --login] [USER]
+Become another USER during a login session.")
+ (throw 'eshell-replace-command
+ (let ((user "root")
+ (host (or (file-remote-p default-directory 'host)
+ "localhost"))
+ (dir (or (file-remote-p default-directory 'localname)
+ (expand-file-name default-directory)))
+ (prefix (file-remote-p default-directory)))
+ (dolist (arg args)
+ (if (string-equal arg "-") (setq login t) (setq user arg)))
+ ;; `eshell-eval-using-options' does not handle "-".
+ (if (member "-" orig-args) (setq login t))
+ (if login (setq dir "~/"))
+ (if (and prefix
+ (or
+ (not (string-equal
+ "su" (file-remote-p default-directory 'method)))
+ (not (string-equal
+ user (file-remote-p default-directory 'user)))))
+ (eshell-parse-command
+ "cd" (list (format "%s|su:%s@%s:%s"
+ (substring prefix 0 -1) user host dir)))
+ (eshell-parse-command
+ "cd" (list (format "/su:%s@%s:%s" user host dir)))))))))
+
+(put 'eshell/su 'eshell-no-numeric-conversions t)
+
+(defun eshell/sudo (&rest args)
+ "Alias \"sudo\" to call Tramp.
+
+Uses the system sudo through TRAMP's sudo method."
+ (setq args (eshell-stringify-list (eshell-flatten-list args)))
+ (let ((orig-args (copy-tree args)))
+ (eshell-eval-using-options
+ "sudo" args
+ '((?h "help" nil nil "show this usage screen")
+ (?u "user" t user "execute a command as another USER")
+ :show-usage
+ :usage "[(-u | --user) USER] COMMAND
+Execute a COMMAND as the superuser or another USER.")
+ (throw 'eshell-external
+ (let ((user (or user "root"))
+ (host (or (file-remote-p default-directory 'host)
+ "localhost"))
+ (dir (or (file-remote-p default-directory 'localname)
+ (expand-file-name default-directory)))
+ (prefix (file-remote-p default-directory)))
+ ;; `eshell-eval-using-options' reads options of COMMAND.
+ (while (and (stringp (car orig-args))
+ (member (car orig-args) '("-u" "--user")))
+ (setq orig-args (cddr orig-args)))
+ (let ((default-directory
+ (if (and prefix
+ (or
+ (not
+ (string-equal
+ "sudo"
+ (file-remote-p default-directory 'method)))
+ (not
+ (string-equal
+ user
+ (file-remote-p default-directory 'user)))))
+ (format "%s|sudo:%s@%s:%s"
+ (substring prefix 0 -1) user host dir)
+ (format "/sudo:%s@%s:%s" user host dir))))
+ (eshell-named-command (car orig-args) (cdr orig-args))))))))
+
+(put 'eshell/sudo 'eshell-no-numeric-conversions t)
+
+(provide 'em-tramp)
+
+;; Local Variables:
+;; generated-autoload-file: "esh-groups.el"
+;; End:
+
+;;; em-tramp.el ends here
diff --git a/lisp/eshell/em-unix.el b/lisp/eshell/em-unix.el
index b387a8ba974..60caf38710a 100644
--- a/lisp/eshell/em-unix.el
+++ b/lisp/eshell/em-unix.el
@@ -148,7 +148,7 @@ Otherwise, Emacs will attempt to use rsh to invoke du on the remote machine."
(make-local-variable 'eshell-complex-commands)
(setq eshell-complex-commands
(append '("grep" "egrep" "fgrep" "agrep" "glimpse" "locate"
- "cat" "time" "cp" "mv" "make" "du" "diff" "su" "sudo")
+ "cat" "time" "cp" "mv" "make" "du" "diff")
eshell-complex-commands)))
(defalias 'eshell/date 'current-time-string)
@@ -306,12 +306,13 @@ Remove (unlink) the FILE(s).")
(eshell-eval-using-options
"mkdir" args
'((?h "help" nil nil "show this usage screen")
+ (?p "parents" nil em-parents "make parent directories as needed")
:external "mkdir"
:show-usage
:usage "[OPTION] DIRECTORY...
Create the DIRECTORY(ies), if they do not already exist.")
(while args
- (eshell-funcalln 'make-directory (car args))
+ (eshell-funcalln 'make-directory (car args) em-parents)
(setq args (cdr args)))
nil))
@@ -1037,85 +1038,6 @@ Show wall-clock time elapsed during execution of COMMAND.")
(put 'eshell/occur 'eshell-no-numeric-conversions t)
-(defun eshell/su (&rest args)
- "Alias \"su\" to call Tramp."
- (require 'tramp)
- (setq args (eshell-stringify-list (eshell-flatten-list args)))
- (let ((orig-args (copy-tree args)))
- (eshell-eval-using-options
- "su" args
- '((?h "help" nil nil "show this usage screen")
- (?l "login" nil login "provide a login environment")
- (? nil nil login "provide a login environment")
- :usage "[- | -l | --login] [USER]
-Become another USER during a login session.")
- (throw 'eshell-replace-command
- (let ((user "root")
- (host (or (file-remote-p default-directory 'host)
- "localhost"))
- (dir (or (file-remote-p default-directory 'localname)
- (expand-file-name default-directory)))
- (prefix (file-remote-p default-directory)))
- (dolist (arg args)
- (if (string-equal arg "-") (setq login t) (setq user arg)))
- ;; `eshell-eval-using-options' does not handle "-".
- (if (member "-" orig-args) (setq login t))
- (if login (setq dir "~/"))
- (if (and prefix
- (or
- (not (string-equal
- "su" (file-remote-p default-directory 'method)))
- (not (string-equal
- user (file-remote-p default-directory 'user)))))
- (eshell-parse-command
- "cd" (list (format "%s|su:%s@%s:%s"
- (substring prefix 0 -1) user host dir)))
- (eshell-parse-command
- "cd" (list (format "/su:%s@%s:%s" user host dir)))))))))
-
-(put 'eshell/su 'eshell-no-numeric-conversions t)
-
-(defun eshell/sudo (&rest args)
- "Alias \"sudo\" to call Tramp."
- (require 'tramp)
- (setq args (eshell-stringify-list (eshell-flatten-list args)))
- (let ((orig-args (copy-tree args)))
- (eshell-eval-using-options
- "sudo" args
- '((?h "help" nil nil "show this usage screen")
- (?u "user" t user "execute a command as another USER")
- :show-usage
- :usage "[(-u | --user) USER] COMMAND
-Execute a COMMAND as the superuser or another USER.")
- (throw 'eshell-external
- (let ((user (or user "root"))
- (host (or (file-remote-p default-directory 'host)
- "localhost"))
- (dir (or (file-remote-p default-directory 'localname)
- (expand-file-name default-directory)))
- (prefix (file-remote-p default-directory)))
- ;; `eshell-eval-using-options' reads options of COMMAND.
- (while (and (stringp (car orig-args))
- (member (car orig-args) '("-u" "--user")))
- (setq orig-args (cddr orig-args)))
- (let ((default-directory
- (if (and prefix
- (or
- (not
- (string-equal
- "sudo"
- (file-remote-p default-directory 'method)))
- (not
- (string-equal
- user
- (file-remote-p default-directory 'user)))))
- (format "%s|sudo:%s@%s:%s"
- (substring prefix 0 -1) user host dir)
- (format "/sudo:%s@%s:%s" user host dir))))
- (eshell-named-command (car orig-args) (cdr orig-args))))))))
-
-(put 'eshell/sudo 'eshell-no-numeric-conversions t)
-
(provide 'em-unix)
;; Local Variables:
diff --git a/lisp/eshell/esh-proc.el b/lisp/eshell/esh-proc.el
index 406822367d1..aa630dc87aa 100644
--- a/lisp/eshell/esh-proc.el
+++ b/lisp/eshell/esh-proc.el
@@ -165,43 +165,38 @@ The signals which will cause this to happen are matched by
(list-processes)))
(defun eshell/kill (&rest args)
- "Kill processes, buffers, symbol or files."
- (let ((ptr args)
- (signum 'SIGINT))
- (while ptr
- (if (or (eshell-processp (car ptr))
- (and (stringp (car ptr))
- (string-match "^[A-Za-z/][A-Za-z0-9<>/]+$"
- (car ptr))))
- ;; What about when $lisp-variable is possible here?
- ;; It could very well name a process.
- (setcar ptr (get-process (car ptr))))
- (setq ptr (cdr ptr)))
+ "Kill processes.
+Usage: kill [-<signal>] <pid>|<process> ...
+Accepts PIDs and process objects."
+ ;; If the first argument starts with a dash, treat it as the signal
+ ;; specifier.
+ (let ((signum 'SIGINT))
+ (let ((arg (car args))
+ (case-fold-search nil))
+ (when (stringp arg)
+ (cond
+ ((string-match "\\`-[[:digit:]]+\\'" arg)
+ (setq signum (abs (string-to-number arg))))
+ ((string-match "\\`-\\([[:upper:]]+\\|[[:lower:]]+\\)\\'" arg)
+ (setq signum (abs (string-to-number arg)))))
+ (setq args (cdr args))))
(while args
- (let ((id (if (eshell-processp (car args))
- (process-id (car args))
- (car args))))
- (when id
- (cond
- ((null id)
- (error "kill: bad signal spec"))
- ((and (numberp id) (= id 0))
- (error "kill: bad signal spec `%d'" id))
- ((and (stringp id)
- (string-match "^-?[0-9]+$" id))
- (setq signum (abs (string-to-number id))))
- ((stringp id)
- (let (case-fold-search)
- (if (string-match "^-\\([A-Z]+[12]?\\)$" id)
- (setq signum
- (intern (concat "SIG" (match-string 1 id))))
- (error "kill: bad signal spec `%s'" id))))
- ((< id 0)
- (setq signum (abs id)))
- (t
- (signal-process id signum)))))
- (setq args (cdr args)))
- nil))
+ (let ((arg (if (eshell-processp (car args))
+ (process-id (car args))
+ (car args))))
+ (when arg
+ (cond
+ ((null arg)
+ (error "kill: null pid. Process may actually be a network connection."))
+ ((not (numberp arg))
+ (error "kill: invalid argument type: %s" (type-of arg)))
+ ((and (numberp arg)
+ (<= arg 0))
+ (error "kill: bad pid: %d" arg))
+ (t
+ (signal-process arg signum)))))
+ (setq args (cdr args))))
+ nil)
(defun eshell-read-process-name (prompt)
"Read the name of a process from the minibuffer, using completion.
diff --git a/lisp/eshell/esh-util.el b/lisp/eshell/esh-util.el
index 2f49a21e76c..f9b86219e9b 100644
--- a/lisp/eshell/esh-util.el
+++ b/lisp/eshell/esh-util.el
@@ -229,6 +229,7 @@ If N or M is nil, it means the end of the list."
"Content of $PATH.
It might be different from \(getenv \"PATH\"\), when
`default-directory' points to a remote host.")
+(make-variable-buffer-local 'eshell-path-env)
(defun eshell-parse-colon-path (path-env)
"Split string with `parse-colon-path'.
diff --git a/lisp/face-remap.el b/lisp/face-remap.el
index f1efc3727f5..b620d01d83e 100644
--- a/lisp/face-remap.el
+++ b/lisp/face-remap.el
@@ -378,7 +378,7 @@ one face is listed, that specifies an aggregate face, like in a
This function makes the variable `buffer-face-mode-face' buffer
local, and sets it to FACE."
- (interactive (list (read-face-name "Set buffer face")))
+ (interactive (list (read-face-name "Set buffer face" (face-at-point t))))
(while (and (consp specs) (null (cdr specs)))
(setq specs (car specs)))
(if (null specs)
diff --git a/lisp/facemenu.el b/lisp/facemenu.el
index e86c1c23d66..eb4554585a8 100644
--- a/lisp/facemenu.el
+++ b/lisp/facemenu.el
@@ -329,7 +329,7 @@ This command can also add FACE to the menu of faces,
if `facemenu-listed-faces' says to do that."
(interactive (list (progn
(barf-if-buffer-read-only)
- (read-face-name "Use face"))
+ (read-face-name "Use face" (face-at-point t)))
(if (and mark-active (not current-prefix-arg))
(region-beginning))
(if (and mark-active (not current-prefix-arg))
@@ -513,12 +513,23 @@ filter out the color from the output."
(* (nth 1 c-rgb) 0.7151522)
(* (nth 2 c-rgb) 0.0721750))))))
+(defvar list-colors-callback nil
+ "Value of CALLBACK arg passed to `list-colors-display'; internal use.")
+
+(defun list-colors-redisplay (_ignore-auto _noconfirm)
+ "Redisplay the colors using `list-colors-sort'.
+
+This is installed as a `revert-buffer-function' in the *Colors* buffer."
+ (list-colors-display nil (buffer-name) list-colors-callback))
+
(defun list-colors-display (&optional list buffer-name callback)
"Display names of defined colors, and show what they look like.
If the optional argument LIST is non-nil, it should be a list of
colors to display. Otherwise, this command computes a list of
colors that the current display can handle. Customize
`list-colors-sort' to change the order in which colors are shown.
+Type `g' or \\[revert-buffer] after customizing `list-colors-sort'
+to redisplay colors in the new order.
If the optional argument BUFFER-NAME is nil, it defaults to *Colors*.
@@ -566,7 +577,9 @@ color. The function should accept a single argument, the color name."
(erase-buffer)
(list-colors-print list callback)
(set-buffer-modified-p nil)
- (setq truncate-lines t)))
+ (setq truncate-lines t)
+ (setq-local list-colors-callback callback)
+ (setq revert-buffer-function 'list-colors-redisplay)))
(when callback
(pop-to-buffer buffer-name)
(message "Click on a color to select it.")))
diff --git a/lisp/faces.el b/lisp/faces.el
index 1a86bca7d7b..6179ed7dfa7 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -487,44 +487,44 @@ with the `default' face (which is always completely specified)."
(defalias 'face-background-pixmap 'face-stipple)
-;; FIXME all of these -p functions ignore inheritance (cf face-stipple).
-;; Ie, a face that inherits from an underlined face but does not
-;; specify :underline will return nil.
-;; So these functions don't actually tell you anything about how the
-;; face will _appear_. So not very useful IMO.
-(defun face-underline-p (face &optional frame)
+(defun face-underline-p (face &optional frame inherit)
"Return non-nil if FACE specifies a non-nil underlining.
If the optional argument FRAME is given, report on face FACE in that frame.
If FRAME is t, report on the defaults for face FACE (for new frames).
-If FRAME is omitted or nil, use the selected frame."
- (face-attribute-specified-or (face-attribute face :underline frame) nil))
+If FRAME is omitted or nil, use the selected frame.
+Optional argument INHERIT is passed to `face-attribute'."
+ (face-attribute-specified-or
+ (face-attribute face :underline frame inherit) nil))
-(defun face-inverse-video-p (face &optional frame)
+(defun face-inverse-video-p (face &optional frame inherit)
"Return non-nil if FACE specifies a non-nil inverse-video.
If the optional argument FRAME is given, report on face FACE in that frame.
If FRAME is t, report on the defaults for face FACE (for new frames).
-If FRAME is omitted or nil, use the selected frame."
- (eq (face-attribute face :inverse-video frame) t))
+If FRAME is omitted or nil, use the selected frame.
+Optional argument INHERIT is passed to `face-attribute'."
+ (eq (face-attribute face :inverse-video frame inherit) t))
-(defun face-bold-p (face &optional frame)
+(defun face-bold-p (face &optional frame inherit)
"Return non-nil if the font of FACE is bold on FRAME.
If the optional argument FRAME is given, report on face FACE in that frame.
If FRAME is t, report on the defaults for face FACE (for new frames).
If FRAME is omitted or nil, use the selected frame.
+Optional argument INHERIT is passed to `face-attribute'.
Use `face-attribute' for finer control."
- (let ((bold (face-attribute face :weight frame)))
+ (let ((bold (face-attribute face :weight frame inherit)))
(memq bold '(semi-bold bold extra-bold ultra-bold))))
-(defun face-italic-p (face &optional frame)
+(defun face-italic-p (face &optional frame inherit)
"Return non-nil if the font of FACE is italic on FRAME.
If the optional argument FRAME is given, report on face FACE in that frame.
If FRAME is t, report on the defaults for face FACE (for new frames).
If FRAME is omitted or nil, use the selected frame.
+Optional argument INHERIT is passed to `face-attribute'.
Use `face-attribute' for finer control."
- (let ((italic (face-attribute face :slant frame)))
+ (let ((italic (face-attribute face :slant frame inherit)))
(memq italic '(italic oblique))))
@@ -757,7 +757,8 @@ is specified, `:italic' is ignored."
FRAME nil or not specified means change face on all frames.
Argument NOERROR is ignored and retained for compatibility.
Use `set-face-attribute' for finer control of the font weight."
- (interactive (list (read-face-name "Make which face bold")))
+ (interactive (list (read-face-name "Make which face bold"
+ (face-at-point t))))
(set-face-attribute face frame :weight 'bold))
@@ -765,7 +766,8 @@ Use `set-face-attribute' for finer control of the font weight."
"Make the font of FACE be non-bold, if possible.
FRAME nil or not specified means change face on all frames.
Argument NOERROR is ignored and retained for compatibility."
- (interactive (list (read-face-name "Make which face non-bold")))
+ (interactive (list (read-face-name "Make which face non-bold"
+ (face-at-point t))))
(set-face-attribute face frame :weight 'normal))
@@ -774,7 +776,8 @@ Argument NOERROR is ignored and retained for compatibility."
FRAME nil or not specified means change face on all frames.
Argument NOERROR is ignored and retained for compatibility.
Use `set-face-attribute' for finer control of the font slant."
- (interactive (list (read-face-name "Make which face italic")))
+ (interactive (list (read-face-name "Make which face italic"
+ (face-at-point t))))
(set-face-attribute face frame :slant 'italic))
@@ -782,7 +785,8 @@ Use `set-face-attribute' for finer control of the font slant."
"Make the font of FACE be non-italic, if possible.
FRAME nil or not specified means change face on all frames.
Argument NOERROR is ignored and retained for compatibility."
- (interactive (list (read-face-name "Make which face non-italic")))
+ (interactive (list (read-face-name "Make which face non-italic"
+ (face-at-point t))))
(set-face-attribute face frame :slant 'normal))
@@ -791,7 +795,8 @@ Argument NOERROR is ignored and retained for compatibility."
FRAME nil or not specified means change face on all frames.
Argument NOERROR is ignored and retained for compatibility.
Use `set-face-attribute' for finer control of font weight and slant."
- (interactive (list (read-face-name "Make which face bold-italic")))
+ (interactive (list (read-face-name "Make which face bold-italic"
+ (face-at-point t))))
(set-face-attribute face frame :weight 'bold :slant 'italic))
@@ -862,7 +867,7 @@ Use `set-face-attribute' to ``unspecify'' underlining."
'set-face-underline "24.3")
-(defun set-face-inverse-video-p (face inverse-video-p &optional frame)
+(defun set-face-inverse-video (face inverse-video-p &optional frame)
"Specify whether face FACE is in inverse video.
INVERSE-VIDEO-P non-nil means FACE displays explicitly in inverse video.
INVERSE-VIDEO-P nil means FACE explicitly is not in inverse video.
@@ -870,14 +875,13 @@ FRAME nil or not specified means change face on all frames.
Use `set-face-attribute' to ``unspecify'' the inverse video attribute."
(interactive
(let ((list (read-face-and-attribute :inverse-video)))
- (list (car list) (eq (car (cdr list)) t))))
+ (list (car list) (if (cadr list) t))))
(set-face-attribute face frame :inverse-video inverse-video-p))
+(define-obsolete-function-alias 'set-face-inverse-video-p
+ 'set-face-inverse-video "24.4")
-;; The -p suffix is a hostage to fortune. What if we want to extend
-;; this to allow more than boolean options? Exactly this happened
-;; to set-face-underline-p.
-(defun set-face-bold-p (face bold-p &optional frame)
+(defun set-face-bold (face bold-p &optional frame)
"Specify whether face FACE is bold.
BOLD-P non-nil means FACE should explicitly display bold.
BOLD-P nil means FACE should explicitly display non-bold.
@@ -887,8 +891,10 @@ Use `set-face-attribute' or `modify-face' for finer control."
(make-face-unbold face frame)
(make-face-bold face frame)))
+(define-obsolete-function-alias 'set-face-bold-p 'set-face-bold "24.4")
+
-(defun set-face-italic-p (face italic-p &optional frame)
+(defun set-face-italic (face italic-p &optional frame)
"Specify whether face FACE is italic.
ITALIC-P non-nil means FACE should explicitly display italic.
ITALIC-P nil means FACE should explicitly display non-italic.
@@ -898,6 +904,8 @@ Use `set-face-attribute' or `modify-face' for finer control."
(make-face-unitalic face frame)
(make-face-italic face frame)))
+(define-obsolete-function-alias 'set-face-italic-p 'set-face-italic "24.4")
+
(defalias 'set-face-background-pixmap 'set-face-stipple)
@@ -908,7 +916,7 @@ If FRAME is omitted or nil, it means change face on all frames.
If FACE specifies neither foreground nor background color,
set its foreground and background to the background and foreground
of the default face. Value is FACE."
- (interactive (list (read-face-name "Invert face")))
+ (interactive (list (read-face-name "Invert face" (face-at-point t))))
(let ((fg (face-attribute face :foreground frame))
(bg (face-attribute face :background frame)))
(if (not (and (eq fg 'unspecified) (eq bg 'unspecified)))
@@ -926,86 +934,53 @@ of the default face. Value is FACE."
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun read-face-name (prompt &optional default multiple)
- "Read one or more face names, defaulting to the face(s) at point.
-PROMPT should be a prompt string; it should not end in a space or
-a colon.
-
-The optional argument DEFAULT specifies the default face name(s)
-to return if the user just types RET. If its value is non-nil,
-it should be a list of face names (symbols); in that case, the
-default return value is the `car' of DEFAULT (if the argument
-MULTIPLE is non-nil), or DEFAULT (if MULTIPLE is nil). See below
-for the meaning of MULTIPLE.
-
-If DEFAULT is nil, the list of default face names is taken from
-the `read-face-name' property of the text at point, or, if that
-is nil, from the `face' property of the text at point.
-
-This function uses `completing-read-multiple' with \",\" as the
-separator character. Thus, the user may enter multiple face
-names, separated by commas. The optional argument MULTIPLE
-specifies the form of the return value. If MULTIPLE is non-nil,
-return a list of face names; if the user entered just one face
-name, the return value would be a list of one face name.
-Otherwise, return a single face name; if the user entered more
-than one face name, return only the first one."
- (let ((faceprop (or (get-char-property (point) 'read-face-name)
- (get-char-property (point) 'face)))
- (aliasfaces nil)
- (nonaliasfaces nil)
- faces)
- ;; Try to get a face name from the buffer.
- (if (memq (intern-soft (thing-at-point 'symbol)) (face-list))
- (setq faces (list (intern-soft (thing-at-point 'symbol)))))
- ;; Add the named faces that the `face' property uses.
- (if (and (listp faceprop)
- ;; Don't treat an attribute spec as a list of faces.
- (not (keywordp (car faceprop)))
- (not (memq (car faceprop) '(foreground-color background-color))))
- (dolist (f faceprop)
- (if (symbolp f)
- (push f faces)))
- (if (symbolp faceprop)
- (push faceprop faces)))
- (delete-dups faces)
-
+ "Read one or more face names, prompting with PROMPT.
+PROMPT should not end in a space or a colon.
+
+Return DEFAULT if the user enters the empty string.
+If DEFAULT is non-nil, it should be a list of face names (symbols or strings).
+In that case, return the `car' of DEFAULT (if MULTIPLE is non-nil),
+or DEFAULT (if MULTIPLE is nil). See below for the meaning of MULTIPLE.
+DEFAULT can also be a single face.
+
+This function uses `completing-read-multiple' with \"[ \\t]*,[ \\t]*\"
+as the separator regexp. Thus, the user may enter multiple face names,
+separated by commas.
+
+MULTIPLE specifies the form of the return value. If MULTIPLE is non-nil,
+return a list of face names; if the user entered just one face name,
+return a list of one face name. Otherwise, return a single face name;
+if the user entered more than one face name, return only the first one."
+ (if (and default (not (stringp default)))
+ (setq default
+ (cond ((symbolp default)
+ (symbol-name default))
+ (multiple
+ (mapconcat (lambda (f) (if (symbolp f) (symbol-name f) f))
+ default ", "))
+ ;; If we only want one, and the default is more than one,
+ ;; discard the unwanted ones.
+ (t (symbol-name (car default))))))
+
+ (let (aliasfaces nonaliasfaces faces)
;; Build up the completion tables.
(mapatoms (lambda (s)
- (if (custom-facep s)
+ (if (facep s)
(if (get s 'face-alias)
(push (symbol-name s) aliasfaces)
(push (symbol-name s) nonaliasfaces)))))
-
- ;; If we only want one, and the default is more than one,
- ;; discard the unwanted ones now.
- (unless multiple
- (if faces
- (setq faces (list (car faces)))))
- (require 'crm)
- (let* ((input
- ;; Read the input.
- (completing-read-multiple
- (if (or faces default)
- (format "%s (default `%s'): " prompt
- (if faces (mapconcat 'symbol-name faces ",")
- default))
- (format "%s: " prompt))
- (completion-table-in-turn nonaliasfaces aliasfaces)
- nil t nil 'face-name-history
- (if faces (mapconcat 'symbol-name faces ","))))
- ;; Canonicalize the output.
- (output
- (cond ((or (equal input "") (equal input '("")))
- (or faces (unless (stringp default) default)))
- ((stringp input)
- (mapcar 'intern (split-string input ", *" t)))
- ((listp input)
- (mapcar 'intern input))
- (input))))
- ;; Return either a list of faces or just one face.
- (if multiple
- output
- (car output)))))
+ (dolist (face (completing-read-multiple
+ (if default
+ (format "%s (default `%s'): " prompt default)
+ (format "%s: " prompt))
+ (completion-table-in-turn nonaliasfaces aliasfaces)
+ nil t nil 'face-name-history default))
+ ;; Ignore elements that are not faces
+ ;; (for example, because DEFAULT was "all faces")
+ (if (facep face) (push (intern face) faces)))
+ ;; Return either a list of faces or just one face.
+ (setq faces (nreverse faces))
+ (if multiple faces (car faces))))
;; Not defined without X, but behind window-system test.
(defvar x-bitmap-file-path)
@@ -1233,7 +1208,7 @@ and the face and its settings are obtained by querying the user."
:slant (if italic-p 'italic 'normal)
:underline underline
:inverse-video inverse-p)
- (setq face (read-face-name "Modify face"))
+ (setq face (read-face-name "Modify face" (face-at-point t)))
(apply #'set-face-attribute face frame
(read-all-face-attributes face frame))))
@@ -1245,13 +1220,13 @@ Value is a list (FACE NEW-VALUE) where FACE is the face read
\(a symbol), and NEW-VALUE is value read."
(cond ((eq attribute :font)
(let* ((prompt "Set font-related attributes of face")
- (face (read-face-name prompt))
+ (face (read-face-name prompt (face-at-point t)))
(font (read-face-font face frame)))
(list face font)))
(t
(let* ((attribute-name (face-descriptive-attribute-name attribute))
(prompt (format "Set %s of face" attribute-name))
- (face (read-face-name prompt))
+ (face (read-face-name prompt (face-at-point t)))
(new-value (read-face-attribute face attribute frame)))
(list face new-value)))))
@@ -1360,7 +1335,9 @@ and FRAME defaults to the selected frame.
If the optional argument FRAME is given, report on face FACE in that frame.
If FRAME is t, report on the defaults for face FACE (for new frames).
If FRAME is omitted or nil, use the selected frame."
- (interactive (list (read-face-name "Describe face" 'default t)))
+ (interactive (list (read-face-name "Describe face"
+ (or (face-at-point t) 'default)
+ t)))
(let* ((attrs '((:family . "Family")
(:foundry . "Foundry")
(:width . "Width")
@@ -1586,44 +1563,79 @@ If SPEC is nil, return nil."
(mapcar (lambda (x) (list (car x) 'unspecified))
face-attribute-name-alist)))))
-(defun face-spec-set (face spec &optional for-defface)
- "Set and apply the face spec for FACE.
-If the optional argument FOR-DEFFACE is omitted or nil, set the
-overriding spec to SPEC, recording it in the `face-override-spec'
-property of FACE. See `defface' for the format of SPEC.
-
-If FOR-DEFFACE is non-nil, set the base spec (the one set by
-`defface' and Custom). In this case, SPEC is ignored; the caller
-is responsible for putting the face spec in the `saved-face',
-`customized-face', or `face-defface-spec', as appropriate.
-
-The appearance of FACE is controlled by the base spec, by any
-custom theme specs on top of that, and by the overriding spec on
-top of all the rest."
- (if for-defface
- ;; When we reset the face based on its custom spec, then it is
- ;; unmodified as far as Custom is concerned.
- (put (or (get face 'face-alias) face) 'face-modified nil)
- ;; When we change a face based on a spec from outside custom,
- ;; record it for future frames.
- (put (or (get face 'face-alias) face) 'face-override-spec spec))
- ;; Reset each frame according to the rules implied by all its specs.
- (dolist (frame (frame-list))
- (face-spec-recalc face frame)))
+(defun face-spec-set (face spec &optional spec-type)
+ "Set the face spec SPEC for FACE.
+See `defface' for the format of SPEC.
+
+The appearance of each face is controlled by its spec, and by the
+internal face attributes (which can be frame-specific and can be
+set via `set-face-attribute').
+
+The argument SPEC-TYPE determines which spec to set:
+ nil or `face-override-spec' means the override spec (which is
+ usually what you want if calling this function outside of
+ Custom code);
+ `customized-face' or `saved-face' means the customized spec or
+ the saved custom spec;
+ `face-defface-spec' means the default spec
+ (usually set only via `defface');
+ `reset' means to ignore SPEC, but clear the `customized-face'
+ and `face-override-spec' specs;
+Any other value means not to set any spec, but to run the
+function for its other effects.
+
+In addition to setting the face spec, this function defines FACE
+as a valid face name if it is not already one, and (re)calculates
+the face's attributes on existing frames."
+ (if (get face 'face-alias)
+ (setq face (get face 'face-alias)))
+ ;; Save SPEC to the relevant symbol property.
+ (unless spec-type
+ (setq spec-type 'face-override-spec))
+ (if (memq spec-type '(face-defface-spec face-override-spec
+ customized-face saved-face))
+ (put face spec-type spec))
+ (if (memq spec-type '(reset saved-face))
+ (put face 'customized-face nil))
+ ;; Setting the face spec via Custom empties out any override spec,
+ ;; similar to how setting a variable via Custom changes its values.
+ (if (memq spec-type '(customized-face saved-face reset))
+ (put face 'face-override-spec nil))
+ ;; If we reset the face based on its custom spec, it is unmodified
+ ;; as far as Custom is concerned.
+ (unless (eq face 'face-override-spec)
+ (put face 'face-modified nil))
+ (if (facep face)
+ ;; If the face already exists, recalculate it.
+ (dolist (frame (frame-list))
+ (face-spec-recalc face frame))
+ ;; Otherwise, initialize it on all frames.
+ (make-empty-face face)
+ (let ((value (face-user-default-spec face))
+ (have-window-system (memq initial-window-system '(x w32 ns))))
+ (dolist (frame (frame-list))
+ (face-spec-set-2 face frame value)
+ (when (memq (window-system frame) '(x w32 ns))
+ (setq have-window-system t)))
+ (if have-window-system
+ (make-face-x-resource-internal face)))))
(defun face-spec-recalc (face frame)
"Reset the face attributes of FACE on FRAME according to its specs.
This applies the defface/custom spec first, then the custom theme specs,
then the override spec."
+ (while (get face 'face-alias)
+ (setq face (get face 'face-alias)))
(face-spec-reset-face face frame)
- (let ((face-sym (or (get face 'face-alias) face)))
- (or (get face 'customized-face)
- (get face 'saved-face)
- (face-spec-set-2 face frame (face-default-spec face)))
- (let ((theme-faces (reverse (get face-sym 'theme-face))))
- (dolist (spec theme-faces)
- (face-spec-set-2 face frame (cadr spec))))
- (face-spec-set-2 face frame (get face-sym 'face-override-spec))))
+ ;; If FACE is customized or themed, set the custom spec from
+ ;; `theme-face' records, which completely replace the defface spec
+ ;; rather than inheriting from it.
+ (let ((theme-faces (get face 'theme-face)))
+ (if theme-faces
+ (dolist (spec (reverse theme-faces))
+ (face-spec-set-2 face frame (cadr spec)))
+ (face-spec-set-2 face frame (face-default-spec face))))
+ (face-spec-set-2 face frame (get face 'face-override-spec)))
(defun face-spec-set-2 (face frame spec)
"Set the face attributes of FACE on FRAME according to SPEC."
@@ -1839,23 +1851,33 @@ resulting color name in the echo area."
(when msg (message "Color: `%s'" color))
color))
-
-(defun face-at-point ()
+(defun face-at-point (&optional thing multiple)
"Return the face of the character after point.
If it has more than one face, return the first one.
-Return nil if it has no specified face."
- (let* ((faceprop (or (get-char-property (point) 'read-face-name)
- (get-char-property (point) 'face)
- 'default))
- (face (cond ((symbolp faceprop) faceprop)
- ;; List of faces (don't treat an attribute spec).
- ;; Just use the first face.
- ((and (consp faceprop) (not (keywordp (car faceprop)))
- (not (memq (car faceprop)
- '(foreground-color background-color))))
- (car faceprop))
- (t nil)))) ; Invalid face value.
- (if (facep face) face nil)))
+If THING is non-nil try first to get a face name from the buffer.
+IF MULTIPLE is non-nil, return a list of all faces.
+Return nil if there is no face."
+ (let (faces)
+ (if thing
+ ;; Try to get a face name from the buffer.
+ (let ((face (intern-soft (thing-at-point 'symbol))))
+ (if (facep face)
+ (push face faces))))
+ ;; Add the named faces that the `read-face-name' or `face' property uses.
+ (let ((faceprop (or (get-char-property (point) 'read-face-name)
+ (get-char-property (point) 'face))))
+ (cond ((facep faceprop)
+ (push faceprop faces))
+ ((and (listp faceprop)
+ ;; Don't treat an attribute spec as a list of faces.
+ (not (keywordp (car faceprop)))
+ (not (memq (car faceprop)
+ '(foreground-color background-color))))
+ (dolist (face faceprop)
+ (if (facep face)
+ (push face faces))))))
+ (setq faces (delete-dups (nreverse faces)))
+ (if multiple faces (car faces))))
(defun foreground-color-at-point ()
"Return the foreground color of the character after point."
diff --git a/lisp/ffap.el b/lisp/ffap.el
index 98421936b96..0769469cbf2 100644
--- a/lisp/ffap.el
+++ b/lisp/ffap.el
@@ -106,6 +106,7 @@
;;; Code:
(require 'url-parse)
+(require 'thingatpt)
(define-obsolete-variable-alias 'ffap-version 'emacs-version "23.2")
@@ -178,16 +179,14 @@ Note this name may be omitted if it equals the default
:group 'ffap)
(defvar ffap-url-regexp
- ;; Could just use `url-nonrelative-link' of w3, if loaded.
- ;; This regexp is not exhaustive, it just matches common cases.
(concat
- "\\`\\("
+ "\\("
"news\\(post\\)?:\\|mailto:\\|file:" ; no host ok
"\\|"
"\\(ftp\\|https?\\|telnet\\|gopher\\|www\\|wais\\)://" ; needs host
- "\\)." ; require one more character
- )
- "Regexp matching URLs. Use nil to disable URL features in ffap.")
+ "\\)")
+ "Regexp matching the beginning of a URI, for FFAP.
+If the value is nil, disable URL-matching features in ffap.")
(defcustom ffap-foo-at-bar-prefix "mailto"
"Presumed URL prefix type of strings like \"<foo.9z@bar>\".
@@ -321,7 +320,7 @@ disable FFAP most of the time."
"Last value returned by `ffap-next-guess'.")
(defvar ffap-string-at-point-region '(1 1)
- "List (BEG END), last region returned by `ffap-string-at-point'.")
+ "List (BEG END), last region returned by the function `ffap-string-at-point'.")
(defun ffap-next-guess (&optional back lim)
"Move point to next file or URL, and return it as a string.
@@ -346,7 +345,7 @@ Optional argument BACK says to search backwards.
Optional argument WRAP says to try wrapping around if necessary.
Interactively: use a single prefix to search backwards,
double prefix to wrap forward, triple to wrap backwards.
-Actual search is done by `ffap-next-guess'."
+Actual search is done by the function `ffap-next-guess'."
(interactive
(cdr (assq (prefix-numeric-value current-prefix-arg)
'((1) (4 t) (16 nil t) (64 t t)))))
@@ -571,45 +570,17 @@ Looks at `ffap-ftp-default-user', returns \"\" for \"localhost\"."
(ffap-ftp-regexp (ffap-host-to-filename mach))
))
-(defvar ffap-newsgroup-regexp "^[[:lower:]]+\\.[-+[:lower:]_0-9.]+$"
- "Strings not matching this fail `ffap-newsgroup-p'.")
-(defvar ffap-newsgroup-heads ; entirely inadequate
- '("alt" "comp" "gnu" "misc" "news" "sci" "soc" "talk")
- "Used by `ffap-newsgroup-p' if gnus is not running.")
-
-(defun ffap-newsgroup-p (string)
- "Return STRING if it looks like a newsgroup name, else nil."
- (and
- (string-match ffap-newsgroup-regexp string)
- (let ((htbs '(gnus-active-hashtb gnus-newsrc-hashtb gnus-killed-hashtb))
- (heads ffap-newsgroup-heads)
- htb ret)
- (while htbs
- (setq htb (car htbs) htbs (cdr htbs))
- (condition-case nil
- (progn
- ;; errs: htb symbol may be unbound, or not a hash-table.
- ;; gnus-gethash is just a macro for intern-soft.
- (and (symbol-value htb)
- (intern-soft string (symbol-value htb))
- (setq ret string htbs nil))
- ;; If we made it this far, gnus is running, so ignore "heads":
- (setq heads nil))
- (error nil)))
- (or ret (not heads)
- (let ((head (string-match "\\`\\([[:lower:]]+\\)\\." string)))
- (and head (setq head (substring string 0 (match-end 1)))
- (member head heads)
- (setq ret string))))
- ;; Is there ever a need to modify string as a newsgroup name?
- ret)))
+(defvaralias 'ffap-newsgroup-regexp 'thing-at-point-newsgroup-regexp)
+(defvaralias 'ffap-newsgroup-heads 'thing-at-point-newsgroup-heads)
+(defalias 'ffap-newsgroup-p 'thing-at-point-newsgroup-p)
(defsubst ffap-url-p (string)
"If STRING looks like an URL, return it (maybe improved), else nil."
- (let ((case-fold-search t))
- (and ffap-url-regexp (string-match ffap-url-regexp string)
- ;; I lied, no improvement:
- string)))
+ (when (and (stringp string) ffap-url-regexp)
+ (let* ((case-fold-search t)
+ (match (string-match ffap-url-regexp string)))
+ (cond ((eq match 0) string)
+ (match (substring string match))))))
;; Broke these out of ffap-fixup-url, for use of ffap-url package.
(defun ffap-url-unwrap-local (url)
@@ -1016,7 +987,7 @@ If a given RFC isn't in these then `ffap-rfc-path' is offered."
;; * no commas (good for latex)
(file "--:\\\\$+<>@-Z_[:alpha:]~*?" "<@" "@>;.,!:")
;; An url, or maybe a email/news message-id:
- (url "--:=&?$+@-Z_[:alpha:]~#,%;*" "^[:alnum:]" ":;.,!?")
+ (url "--:=&?$+@-Z_[:alpha:]~#,%;*()!'" "^[0-9a-zA-Z]" ":;.,!?")
;; Find a string that does *not* contain a colon:
(nocolon "--9$+<>@-Z_[:alpha:]~" "<@" "@>;.,!?")
;; A machine:
@@ -1027,14 +998,14 @@ If a given RFC isn't in these then `ffap-rfc-path' is offered."
"Alist of \(MODE CHARS BEG END\), where MODE is a symbol,
possibly a major-mode name, or one of the symbol
`file', `url', `machine', and `nocolon'.
-`ffap-string-at-point' uses the data fields as follows:
+Function `ffap-string-at-point' uses the data fields as follows:
1. find a maximal string of CHARS around point,
2. strip BEG chars before point from the beginning,
-3. Strip END chars after point from the end.")
+3. strip END chars after point from the end.")
(defvar ffap-string-at-point nil
;; Added at suggestion of RHOGEE (for ff-paths), 7/24/95.
- "Last string returned by `ffap-string-at-point'.")
+ "Last string returned by the function `ffap-string-at-point'.")
(defun ffap-string-at-point (&optional mode)
"Return a string of characters from around point.
@@ -1042,32 +1013,34 @@ MODE (defaults to value of `major-mode') is a symbol used to look up string
syntax parameters in `ffap-string-at-point-mode-alist'.
If MODE is not found, we use `file' instead of MODE.
If the region is active, return a string from the region.
-Sets `ffap-string-at-point' and `ffap-string-at-point-region'."
+Sets the variable `ffap-string-at-point' and the variable
+`ffap-string-at-point-region'."
(let* ((args
(cdr
(or (assq (or mode major-mode) ffap-string-at-point-mode-alist)
(assq 'file ffap-string-at-point-mode-alist))))
(pt (point))
- (str
- (if (and transient-mark-mode mark-active)
- (buffer-substring
- (setcar ffap-string-at-point-region (region-beginning))
- (setcar (cdr ffap-string-at-point-region) (region-end)))
- (buffer-substring
- (save-excursion
- (skip-chars-backward (car args))
- (skip-chars-forward (nth 1 args) pt)
- (setcar ffap-string-at-point-region (point)))
- (save-excursion
- (skip-chars-forward (car args))
- (skip-chars-backward (nth 2 args) pt)
- (setcar (cdr ffap-string-at-point-region) (point)))))))
- (set-text-properties 0 (length str) nil str)
- (setq ffap-string-at-point str)))
+ (beg (if (use-region-p)
+ (region-beginning)
+ (save-excursion
+ (skip-chars-backward (car args))
+ (skip-chars-forward (nth 1 args) pt)
+ (point))))
+ (end (if (use-region-p)
+ (region-end)
+ (save-excursion
+ (skip-chars-forward (car args))
+ (skip-chars-backward (nth 2 args) pt)
+ (point)))))
+ (setq ffap-string-at-point
+ (buffer-substring-no-properties
+ (setcar ffap-string-at-point-region beg)
+ (setcar (cdr ffap-string-at-point-region) end)))))
(defun ffap-string-around ()
;; Sometimes useful to decide how to treat a string.
- "Return string of two chars around last `ffap-string-at-point'.
+ "Return string of two chars around last result of function
+`ffap-string-at-point'.
Assumes the buffer has not changed."
(save-excursion
(format "%c%c"
@@ -1081,7 +1054,7 @@ Assumes the buffer has not changed."
(defun ffap-copy-string-as-kill (&optional mode)
;; Requested by MCOOK. Useful?
- "Call `ffap-string-at-point', and copy result to `kill-ring'."
+ "Call function `ffap-string-at-point', and copy result to `kill-ring'."
(interactive)
(let ((str (ffap-string-at-point mode)))
(if (equal "" str)
@@ -1095,37 +1068,15 @@ Assumes the buffer has not changed."
(defun ffap-url-at-point ()
"Return URL from around point if it exists, or nil."
- ;; Could use w3's url-get-url-at-point instead. Both handle "URL:",
- ;; ignore non-relative links, trim punctuation. The other will
- ;; actually look back if point is in whitespace, but I would rather
- ;; ffap be less aggressive in such situations.
(when ffap-url-regexp
(or (and (eq major-mode 'w3-mode) ; In a w3 buffer button?
(w3-view-this-url t))
- ;; Is there a reason not to strip trailing colon?
- (let ((name (ffap-string-at-point 'url)))
- (cond
- ((string-match "^url:" name) (setq name (substring name 4)))
- ((and (string-match "\\`[^:</>@]+@[^:</>@]+[[:alnum:]]\\'" name)
- ;; "foo@bar": could be "mailto" or "news" (a Message-ID).
- ;; Without "<>" it must be "mailto". Otherwise could be
- ;; either, so consult `ffap-foo-at-bar-prefix'.
- (let ((prefix (if (and (equal (ffap-string-around) "<>")
- ;; Expect some odd characters:
- (string-match "[$.0-9].*[$.0-9].*@" name))
- ;; Could be news:
- ffap-foo-at-bar-prefix
- "mailto")))
- (and prefix (setq name (concat prefix ":" name))))))
- ((ffap-newsgroup-p name) (setq name (concat "news:" name)))
- ((and (string-match "\\`[[:alnum:]]+\\'" name) ; <mic> <root> <nobody>
- (equal (ffap-string-around) "<>")
- ;; (ffap-user-p name):
- (not (string-match "~" (expand-file-name (concat "~" name)))))
- (setq name (concat "mailto:" name))))
-
- (if (ffap-url-p name)
- name)))))
+ (let ((thing-at-point-beginning-of-url-regexp ffap-url-regexp)
+ (thing-at-point-default-mail-scheme ffap-foo-at-bar-prefix))
+ (thing-at-point-url-at-point t
+ (if (use-region-p)
+ (cons (region-beginning)
+ (region-end))))))))
(defvar ffap-gopher-regexp
"^.*\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *\\(.*\\) *$"
@@ -1297,13 +1248,11 @@ which may actually result in an URL rather than a filename."
(let (dir)
;; Tricky: guess may have or be a local directory, like "w3/w3.elc"
;; or "w3/" or "../el/ffap.el" or "../../../"
- (or (ffap-url-p guess)
- (progn
- (or (ffap-file-remote-p guess)
- (setq guess
- (abbreviate-file-name (expand-file-name guess))
- ))
- (setq dir (file-name-directory guess))))
+ (unless (ffap-url-p guess)
+ (unless (ffap-file-remote-p guess)
+ (setq guess
+ (abbreviate-file-name (expand-file-name guess))))
+ (setq dir (file-name-directory guess)))
(let ((minibuffer-completing-file-name t)
(completion-ignore-case read-file-name-completion-ignore-case)
(fnh-elem (cons ffap-url-regexp 'url-file-handler)))
@@ -1327,11 +1276,8 @@ which may actually result in an URL rather than a filename."
;; other modifications to be lost (e.g. when Tramp gets loaded
;; during the completing-read call).
(setq file-name-handler-alist (delq fnh-elem file-name-handler-alist))))
- ;; Do file substitution like (interactive "F"), suggested by MCOOK.
- (or (ffap-url-p guess) (setq guess (substitute-in-file-name guess)))
- ;; Should not do it on url's, where $ is a common (VMS?) character.
- ;; Note: upcoming url.el package ought to handle this automatically.
- guess))
+ (or (ffap-url-p guess)
+ (substitute-in-file-name guess))))
(defun ffap-read-url-internal (string pred action)
"Complete URLs from history, treating given string as valid."
@@ -1346,11 +1292,10 @@ which may actually result in an URL rather than a filename."
(t t))))
(defun ffap-read-file-or-url-internal (string pred action)
- (unless string ;Why would this ever happen?
- (setq string default-directory))
- (if (ffap-url-p string)
- (ffap-read-url-internal string pred action)
- (read-file-name-internal string pred action)))
+ (let ((url (ffap-url-p string)))
+ (if url
+ (ffap-read-url-internal url pred action)
+ (read-file-name-internal (or string default-directory) pred action))))
;; The rest of this page is just to work with package complete.el.
;; This code assumes that you load ffap.el after complete.el.
@@ -1371,7 +1316,7 @@ which may actually result in an URL rather than a filename."
:version "22.1")
(defvar ffap-highlight-overlay nil
- "Overlay used by `ffap-highlight'.")
+ "Overlay used by function `ffap-highlight'.")
(defun ffap-highlight (&optional remove)
"If `ffap-highlight' is set, highlight the guess in this buffer.
@@ -1441,30 +1386,31 @@ and the functions `ffap-file-at-point' and `ffap-url-at-point'."
(let (current-prefix-arg) ; we already interpreted it
(call-interactively ffap-file-finder))
(or filename (setq filename (ffap-prompter)))
- (cond
- ((ffap-url-p filename)
- (let (current-prefix-arg) ; w3 2.3.25 bug, reported by KPC
- (funcall ffap-url-fetcher filename)))
- ((and ffap-pass-wildcards-to-dired
- ffap-dired-wildcards
- (string-match ffap-dired-wildcards filename))
- (funcall ffap-directory-finder filename))
- ((and ffap-dired-wildcards
- (string-match ffap-dired-wildcards filename)
- find-file-wildcards
- ;; Check if it's find-file that supports wildcards arg
- (memq ffap-file-finder '(find-file find-alternate-file)))
- (funcall ffap-file-finder (expand-file-name filename) t))
- ((or (not ffap-newfile-prompt)
- (file-exists-p filename)
- (y-or-n-p "File does not exist, create buffer? "))
- (funcall ffap-file-finder
- ;; expand-file-name fixes "~/~/.emacs" bug sent by CHUCKR.
- (expand-file-name filename)))
- ;; User does not want to find a non-existent file:
- ((signal 'file-error (list "Opening file buffer"
- "no such file or directory"
- filename))))))
+ (let ((url (ffap-url-p filename)))
+ (cond
+ (url
+ (let (current-prefix-arg)
+ (funcall ffap-url-fetcher url)))
+ ((and ffap-pass-wildcards-to-dired
+ ffap-dired-wildcards
+ (string-match ffap-dired-wildcards filename))
+ (funcall ffap-directory-finder filename))
+ ((and ffap-dired-wildcards
+ (string-match ffap-dired-wildcards filename)
+ find-file-wildcards
+ ;; Check if it's find-file that supports wildcards arg
+ (memq ffap-file-finder '(find-file find-alternate-file)))
+ (funcall ffap-file-finder (expand-file-name filename) t))
+ ((or (not ffap-newfile-prompt)
+ (file-exists-p filename)
+ (y-or-n-p "File does not exist, create buffer? "))
+ (funcall ffap-file-finder
+ ;; expand-file-name fixes "~/~/.emacs" bug sent by CHUCKR.
+ (expand-file-name filename)))
+ ;; User does not want to find a non-existent file:
+ ((signal 'file-error (list "Opening file buffer"
+ "no such file or directory"
+ filename)))))))
;; Shortcut: allow {M-x ffap} rather than {M-x find-file-at-point}.
;;;###autoload
@@ -1740,7 +1686,7 @@ Only intended for interactive use."
(call-interactively 'ffap)))
(defun ffap-literally ()
- "Like `ffap' and `find-file-literally'.
+ "Like `ffap' and command `find-file-literally'.
Only intended for interactive use."
(interactive)
(let ((ffap-file-finder 'find-file-literally))
@@ -1767,7 +1713,8 @@ Only intended for interactive use."
(defun ffap-gnus-hook ()
"Bind `ffap-gnus-next' and `ffap-gnus-menu' to M-l and M-m, resp."
- (set (make-local-variable 'ffap-foo-at-bar-prefix) "news") ; message-id's
+ ;; message-id's
+ (setq-local thing-at-point-default-mail-uri-scheme "news")
;; Note "l", "L", "m", "M" are taken:
(local-set-key "\M-l" 'ffap-gnus-next)
(local-set-key "\M-m" 'ffap-gnus-menu))
@@ -1820,25 +1767,26 @@ If `dired-at-point-require-prefix' is set, the prefix meaning is reversed."
(let (current-prefix-arg) ; already interpreted
(call-interactively ffap-directory-finder))
(or filename (setq filename (dired-at-point-prompter)))
- (cond
- ((ffap-url-p filename)
- (funcall ffap-url-fetcher filename))
- ((and ffap-dired-wildcards
- (string-match ffap-dired-wildcards filename))
- (funcall ffap-directory-finder filename))
- ((file-exists-p filename)
- (if (file-directory-p filename)
+ (let ((url (ffap-url-p filename)))
+ (cond
+ (url
+ (funcall ffap-url-fetcher url))
+ ((and ffap-dired-wildcards
+ (string-match ffap-dired-wildcards filename))
+ (funcall ffap-directory-finder filename))
+ ((file-exists-p filename)
+ (if (file-directory-p filename)
+ (funcall ffap-directory-finder
+ (expand-file-name filename))
(funcall ffap-directory-finder
- (expand-file-name filename))
- (funcall ffap-directory-finder
- (concat (expand-file-name filename) "*"))))
- ((and (file-writable-p
- (or (file-name-directory (directory-file-name filename))
- filename))
- (y-or-n-p "Directory does not exist, create it? "))
- (make-directory filename)
- (funcall ffap-directory-finder filename))
- ((error "No such file or directory `%s'" filename)))))
+ (concat (expand-file-name filename) "*"))))
+ ((and (file-writable-p
+ (or (file-name-directory (directory-file-name filename))
+ filename))
+ (y-or-n-p "Directory does not exist, create it? "))
+ (make-directory filename)
+ (funcall ffap-directory-finder filename))
+ ((error "No such file or directory `%s'" filename))))))
(defun dired-at-point-prompter (&optional guess)
;; Does guess and prompt step for find-file-at-point.
@@ -1851,23 +1799,23 @@ If `dired-at-point-require-prefix' is set, the prefix meaning is reversed."
(ffap-url-regexp "Dired file or URL: ")
(t "Dired file: "))
(prog1
- (setq guess (or guess
- (let ((guess (ffap-guesser)))
- (if (or (not guess)
- (ffap-url-p guess)
- (ffap-file-remote-p guess))
- guess
- (setq guess (abbreviate-file-name
- (expand-file-name guess)))
- (cond
- ;; Interpret local directory as a directory.
- ((file-directory-p guess)
- (file-name-as-directory guess))
- ;; Get directory component from local files.
- ((file-regular-p guess)
- (file-name-directory guess))
- (guess))))
- ))
+ (setq guess
+ (let ((guess (or guess (ffap-guesser))))
+ (cond
+ ((null guess) nil)
+ ((ffap-url-p guess))
+ ((ffap-file-remote-p guess)
+ guess)
+ ((progn
+ (setq guess (abbreviate-file-name
+ (expand-file-name guess)))
+ ;; Interpret local directory as a directory.
+ (file-directory-p guess))
+ (file-name-as-directory guess))
+ ;; Get directory component from local files.
+ ((file-regular-p guess)
+ (file-name-directory guess))
+ (guess))))
(and guess (ffap-highlight))))
(ffap-highlight t)))
@@ -1916,22 +1864,17 @@ Only intended for interactive use."
(defun ffap-guess-file-name-at-point ()
"Try to get a file name at point.
This hook is intended to be put in `file-name-at-point-functions'."
- (when (fboundp 'ffap-guesser)
- ;; Logic from `ffap-read-file-or-url' and `dired-at-point-prompter'.
- (let ((guess (ffap-guesser)))
- (setq guess
- (if (or (not guess)
- (and (fboundp 'ffap-url-p)
- (ffap-url-p guess))
- (and (fboundp 'ffap-file-remote-p)
- (ffap-file-remote-p guess)))
- guess
- (abbreviate-file-name (expand-file-name guess))))
- (when guess
- (if (file-directory-p guess)
- (file-name-as-directory guess)
- guess)))))
-
+ (let ((guess (ffap-guesser)))
+ (when (stringp guess)
+ (let ((url (ffap-url-p guess)))
+ (or url
+ (progn
+ (unless (ffap-file-remote-p guess)
+ (setq guess
+ (abbreviate-file-name (expand-file-name guess))))
+ (if (file-directory-p guess)
+ (file-name-as-directory guess)
+ guess)))))))
;;; Offer default global bindings (`ffap-bindings'):
diff --git a/lisp/filecache.el b/lisp/filecache.el
index 496cac402b3..ae3cb8d074a 100644
--- a/lisp/filecache.el
+++ b/lisp/filecache.el
@@ -139,9 +139,6 @@
;;; Code:
-(eval-when-compile
- (require 'find-lisp))
-
(defgroup file-cache nil
"Find files using a pre-loaded cache."
:group 'files
@@ -270,44 +267,63 @@ files of names DIRNAME1/FILENAME, DIRNAME2/FILENAME, ...")
;; Functions to add files to the cache
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun file-cache--read-list (file op-prompt)
+ (let* ((fun (if file 'read-file-name 'read-directory-name))
+ (type (if file "file" "directory"))
+ (prompt-1 (concat op-prompt " " type ": "))
+ (prompt-2 (concat op-prompt " another " type "?"))
+ (continue t)
+ result)
+ (while continue
+ (push (funcall fun prompt-1 nil nil t) result)
+ (setq continue (y-or-n-p prompt-2)))
+ (nreverse result)))
+
;;;###autoload
(defun file-cache-add-directory (directory &optional regexp)
- "Add DIRECTORY to the file cache.
-If the optional REGEXP argument is non-nil, only files which match it will
-be added to the cache."
- (interactive "DAdd files from directory: ")
+ "Add all files in DIRECTORY to the file cache.
+If called from Lisp with a non-nil REGEXP argument is non-nil,
+only add files whose names match REGEXP."
+ (interactive (list (read-directory-name "Add files from directory: "
+ nil nil t)
+ nil))
;; Not an error, because otherwise we can't use load-paths that
;; contain non-existent directories.
- (if (not (file-accessible-directory-p directory))
- (message "Directory %s does not exist" directory)
+ (when (file-accessible-directory-p directory)
(let* ((dir (expand-file-name directory))
(dir-files (directory-files dir t regexp)))
;; Filter out files we don't want to see
(dolist (file dir-files)
- (if (file-directory-p file)
- (setq dir-files (delq file dir-files))
- (dolist (regexp file-cache-filter-regexps)
- (if (string-match regexp file)
- (setq dir-files (delq file dir-files))))))
+ (if (file-directory-p file)
+ (setq dir-files (delq file dir-files))
+ (dolist (regexp file-cache-filter-regexps)
+ (if (string-match regexp file)
+ (setq dir-files (delq file dir-files))))))
(file-cache-add-file-list dir-files))))
;;;###autoload
-(defun file-cache-add-directory-list (directory-list &optional regexp)
- "Add DIRECTORY-LIST (a list of directory names) to the file cache.
+(defun file-cache-add-directory-list (directories &optional regexp)
+ "Add DIRECTORIES (a list of directory names) to the file cache.
+If called interactively, read the directory names one by one.
If the optional REGEXP argument is non-nil, only files which match it
will be added to the cache. Note that the REGEXP is applied to the
files in each directory, not to the directory list itself."
- (interactive "XAdd files from directory list: ")
- (mapcar
- (lambda (dir) (file-cache-add-directory dir regexp))
- directory-list))
-
-(defun file-cache-add-file-list (file-list)
- "Add FILE-LIST (a list of file names) to the file cache.
-Interactively, FILE-LIST is read as a Lisp expression, which
-should evaluate to the desired list of file names."
- (interactive "XFile List: ")
- (mapcar 'file-cache-add-file file-list))
+ (interactive (list (file-cache--read-list nil "Add")))
+ (dolist (dir directories)
+ (file-cache-add-directory dir regexp))
+ (let ((n (length directories)))
+ (message "Filecache: cached file names from %d director%s."
+ n (if (= n 1) "y" "ies"))))
+
+(defun file-cache-add-file-list (files)
+ "Add FILES (a list of file names) to the file cache.
+If called interactively, read the file names one by one."
+ (interactive (list (file-cache--read-list t "Add")))
+ (dolist (f files)
+ (file-cache-add-file f))
+ (let ((n (length files)))
+ (message "Filecache: cached %d file name%s."
+ n (if (= n 1) "" "s"))))
;; Workhorse function
@@ -315,23 +331,25 @@ should evaluate to the desired list of file names."
(defun file-cache-add-file (file)
"Add FILE to the file cache."
(interactive "fAdd File: ")
- (if (not (file-exists-p file))
- (message "Filecache: file %s does not exist" file)
- (let* ((file-name (file-name-nondirectory file))
- (dir-name (file-name-directory file))
- (the-entry (assoc-string
- file-name file-cache-alist
- file-cache-ignore-case)))
- ;; Does the entry exist already?
- (if the-entry
- (if (or (and (stringp (cdr the-entry))
- (string= dir-name (cdr the-entry)))
- (and (listp (cdr the-entry))
- (member dir-name (cdr the-entry))))
- nil
- (setcdr the-entry (cons dir-name (cdr the-entry))))
- ;; If not, add it to the cache
- (push (list file-name dir-name) file-cache-alist)))))
+ (setq file (file-truename file))
+ (unless (file-exists-p file)
+ (error "Filecache: file %s does not exist" file))
+ (let* ((file-name (file-name-nondirectory file))
+ (dir-name (file-name-directory file))
+ (the-entry (assoc-string file-name file-cache-alist
+ file-cache-ignore-case)))
+ (cond ((null the-entry)
+ ;; If the entry wasn't in the cache, add it.
+ (push (list file-name dir-name) file-cache-alist)
+ (if (called-interactively-p 'interactive)
+ (message "Filecache: cached file name %s." file)))
+ ((not (member dir-name (cdr the-entry)))
+ (setcdr the-entry (cons dir-name (cdr the-entry)))
+ (if (called-interactively-p 'interactive)
+ (message "Filecache: cached file name %s." file)))
+ (t
+ (if (called-interactively-p 'interactive)
+ (message "Filecache: %s is already cached." file))))))
;;;###autoload
(defun file-cache-add-directory-using-find (directory)
@@ -368,6 +386,8 @@ STRING is passed as an argument to the locate command."
string)
(file-cache-add-from-file-cache-buffer))
+(autoload 'find-lisp-find-files "find-lisp")
+
;;;###autoload
(defun file-cache-add-directory-recursively (dir &optional regexp)
"Adds DIR and any subdirectories to the file-cache.
@@ -376,18 +396,16 @@ If the optional REGEXP argument is non-nil, only files which match it
will be added to the cache. Note that the REGEXP is applied to the
files in each directory, not to the directory list itself."
(interactive "DAdd directory: ")
- (require 'find-lisp)
(mapcar
- (function
- (lambda (file)
- (or (file-directory-p file)
- (let (filtered)
- (dolist (regexp file-cache-filter-regexps)
- (and (string-match regexp file)
- (setq filtered t)))
- filtered)
- (file-cache-add-file file))))
- (find-lisp-find-files dir (if regexp regexp "^"))))
+ (lambda (file)
+ (or (file-directory-p file)
+ (let (filtered)
+ (dolist (regexp file-cache-filter-regexps)
+ (and (string-match regexp file)
+ (setq filtered t)))
+ filtered)
+ (file-cache-add-file file)))
+ (find-lisp-find-files dir (or regexp "^"))))
(defun file-cache-add-from-file-cache-buffer (&optional regexp)
"Add any entries found in the file cache buffer.
@@ -417,17 +435,26 @@ or the optional REGEXP argument."
;; This clears *all* files with the given name
(defun file-cache-delete-file (file)
- "Delete FILE from the file cache."
+ "Delete FILE (a relative file name) from the file cache.
+Return nil if FILE was not in the file cache, non-nil otherwise."
(interactive
(list (completing-read "Delete file from cache: " file-cache-alist)))
- (setq file-cache-alist
- (delq (assoc-string file file-cache-alist file-cache-ignore-case)
- file-cache-alist)))
-
-(defun file-cache-delete-file-list (file-list)
- "Delete FILE-LIST (a list of files) from the file cache."
- (interactive "XFile List: ")
- (mapcar 'file-cache-delete-file file-list))
+ (let ((elt (assoc-string file file-cache-alist file-cache-ignore-case)))
+ (setq file-cache-alist (delq elt file-cache-alist))
+ elt))
+
+(defun file-cache-delete-file-list (files &optional message)
+ "Delete FILES (a list of files) from the file cache.
+If called interactively, read the file names one by one.
+If MESSAGE is non-nil, or if called interactively, print a
+message reporting the number of file names deleted."
+ (interactive (list (file-cache--read-list t "Uncache") t))
+ (let ((n 0))
+ (dolist (f files)
+ (if (file-cache-delete-file f)
+ (setq n (1+ n))))
+ (message "Filecache: uncached %d file name%s."
+ n (if (= n 1) "" "s"))))
(defun file-cache-delete-file-regexp (regexp)
"Delete files matching REGEXP from the file cache."
@@ -436,21 +463,18 @@ or the optional REGEXP argument."
(dolist (elt file-cache-alist)
(and (string-match regexp (car elt))
(push (car elt) delete-list)))
- (file-cache-delete-file-list delete-list)
- (message "Filecache: deleted %d files from file cache"
- (length delete-list))))
+ (file-cache-delete-file-list delete-list)))
(defun file-cache-delete-directory (directory)
"Delete DIRECTORY from the file cache."
(interactive "DDelete directory from file cache: ")
(let ((dir (expand-file-name directory))
- (result 0))
+ (n 0))
(dolist (entry file-cache-alist)
(if (file-cache-do-delete-directory dir entry)
- (setq result (1+ result))))
- (if (zerop result)
- (error "Filecache: no entries containing %s found in cache" directory)
- (message "Filecache: deleted %d entries" result))))
+ (setq n (1+ n))))
+ (message "Filecache: uncached %d file name%s."
+ n (if (= n 1) "" "s"))))
(defun file-cache-do-delete-directory (dir entry)
(let ((directory-list (cdr entry))
@@ -461,10 +485,12 @@ or the optional REGEXP argument."
(delq entry file-cache-alist))
(setcdr entry (delete directory directory-list))))))
-(defun file-cache-delete-directory-list (directory-list)
- "Delete DIRECTORY-LIST (a list of directories) from the file cache."
- (interactive "XDirectory List: ")
- (mapcar 'file-cache-delete-directory directory-list))
+(defun file-cache-delete-directory-list (directories)
+ "Delete DIRECTORIES (a list of directory names) from the file cache.
+If called interactively, read the directory names one by one."
+ (interactive (list (file-cache--read-list nil "Uncache")))
+ (dolist (d directories)
+ (file-cache-delete-directory d)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Utility functions
diff --git a/lisp/files.el b/lisp/files.el
index 4aa913a4268..ae5e5a23161 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -209,7 +209,6 @@ have fast storage with limited space, such as a RAM disk."
(declare-function dired-unmark "dired" (arg))
(declare-function dired-do-flagged-delete "dired" (&optional nomessage))
(declare-function dos-8+3-filename "dos-fns" (filename))
-(declare-function view-mode-disable "view" ())
(declare-function dosified-file-name "dos-fns" (file-name))
(defvar file-name-invalid-regexp
@@ -508,6 +507,11 @@ and ignores this variable."
(other :tag "Query" other))
:group 'find-file)
+(defvar enable-dir-local-variables t
+ "Non-nil means enable use of directory-local variables.
+Some modes may wish to set this to nil to prevent directory-local
+settings being applied, but still respect file-local ones.")
+
;; This is an odd variable IMO.
;; You might wonder why it is needed, when we could just do:
;; (set (make-local-variable 'enable-local-variables) nil)
@@ -733,7 +737,7 @@ The path separator is colon in GNU and GNU-like systems."
;; This is a case where .elc makes a lot of sense.
(interactive (list (let ((completion-ignored-extensions
(remove ".elc" completion-ignored-extensions)))
- (read-file-name "Load file: "))))
+ (read-file-name "Load file: " nil nil 'lambda))))
(load (expand-file-name file) nil nil t))
(defun locate-file (filename path &optional suffixes predicate)
@@ -1512,7 +1516,10 @@ expand wildcards (if any) and replace the file with multiple files."
(defvar kill-buffer-hook nil
"Hook run when a buffer is killed.
The buffer being killed is current while the hook is running.
-See `kill-buffer'.")
+See `kill-buffer'.
+
+Note: Be careful with let-binding this hook considering it is
+frequently used for cleanup.")
(defun find-alternate-file (filename &optional wildcards)
"Find file FILENAME, select its buffer, kill previous buffer.
@@ -1979,13 +1986,10 @@ Do you want to revisit the file normally now? ")
(set-buffer-multibyte nil)
(setq buffer-file-coding-system 'no-conversion)
(set-buffer-major-mode buf)
- (make-local-variable 'find-file-literally)
- (setq find-file-literally t))
+ (setq-local find-file-literally t))
(after-find-file error (not nowarn)))
(current-buffer))))
-(defvar file-name-buffer-file-type-alist) ;From dos-w32.el.
-
(defun insert-file-contents-literally (filename &optional visit beg end replace)
"Like `insert-file-contents', but only reads in the file literally.
A buffer may be modified in several ways after reading into the buffer,
@@ -1997,7 +2001,6 @@ This function ensures that none of these modifications will take place."
(after-insert-file-functions nil)
(coding-system-for-read 'no-conversion)
(coding-system-for-write 'no-conversion)
- (file-name-buffer-file-type-alist '(("" . t)))
(inhibit-file-name-handlers
;; FIXME: Yuck!! We should turn insert-file-contents-literally
;; into a file operation instead!
@@ -2125,7 +2128,7 @@ unless NOMODES is non-nil."
(setq buffer-read-only t))
(unless nomodes
(when (and view-read-only view-mode)
- (view-mode-disable))
+ (view-mode -1))
(normal-mode t)
;; If requested, add a newline at the end of the file.
(and (memq require-final-newline '(visit visit-save))
@@ -2171,7 +2174,7 @@ not set local variables (though we do notice a mode specified with -*-.)
or from Lisp without specifying the optional argument FIND-FILE;
in that case, this function acts as if `enable-local-variables' were t."
(interactive)
- (funcall (or (default-value 'major-mode) 'fundamental-mode))
+ (fundamental-mode)
(let ((enable-local-variables (or (not find-file) enable-local-variables)))
;; FIXME this is less efficient than it could be, since both
;; s-a-m and h-l-v may parse the same regions, looking for "mode:".
@@ -2309,7 +2312,7 @@ since only a single case-insensitive search through the alist is made."
("\\.\\(\
arc\\|zip\\|lzh\\|lha\\|zoo\\|[jew]ar\\|xpi\\|rar\\|7z\\|\
ARC\\|ZIP\\|LZH\\|LHA\\|ZOO\\|[JEW]AR\\|XPI\\|RAR\\|7Z\\)\\'" . archive-mode)
- ("\\.\\(sx[dmicw]\\|od[fgpst]\\|oxt\\)\\'" . archive-mode) ;OpenOffice.org
+ ("\\.oxt\\'" . archive-mode) ;(Open|Libre)Office extensions.
("\\.\\(deb\\|[oi]pk\\)\\'" . archive-mode) ; Debian/Opkg packages.
;; Mailer puts message to be edited in
;; /tmp/Re.... or Message
@@ -2358,7 +2361,7 @@ ARC\\|ZIP\\|LZH\\|LHA\\|ZOO\\|[JEW]AR\\|XPI\\|RAR\\|7Z\\)\\'" . archive-mode)
("\\.\\(diffs?\\|patch\\|rej\\)\\'" . diff-mode)
("\\.\\(dif\\|pat\\)\\'" . diff-mode) ; for MSDOG
("\\.[eE]?[pP][sS]\\'" . ps-mode)
- ("\\.\\(?:PDF\\|DVI\\|OD[FGPST]\\|DOCX?\\|XLSX?\\|PPTX?\\|pdf\\|dvi\\|od[fgpst]\\|docx?\\|xlsx?\\|pptx?\\)\\'" . doc-view-mode-maybe)
+ ("\\.\\(?:PDF\\|DVI\\|OD[FGPST]\\|DOCX?\\|XLSX?\\|PPTX?\\|pdf\\|djvu\\|dvi\\|od[fgpst]\\|docx?\\|xlsx?\\|pptx?\\)\\'" . doc-view-mode-maybe)
("configure\\.\\(ac\\|in\\)\\'" . autoconf-mode)
("\\.s\\(v\\|iv\\|ieve\\)\\'" . sieve-mode)
("BROWSE\\'" . ebrowse-tree-mode)
@@ -2497,6 +2500,7 @@ See also `auto-mode-alist'.")
"\\.zoo\\'" "\\.[jew]ar\\'" "\\.xpi\\'" "\\.rar\\'"
"\\.7z\\'"
"\\.sx[dmicw]\\'" "\\.odt\\'"
+ "\\.diff\\'" "\\.patch\\'"
"\\.tiff?\\'" "\\.gif\\'" "\\.png\\'" "\\.jpe?g\\'"))
"List of regexps matching file names in which to ignore local variables.
This includes `-*-' lines as well as trailing \"Local Variables\" sections.
@@ -2505,25 +2509,31 @@ They may happen to contain sequences that look like local variable
specifications, but are not really, or they may be containers for
member files with their own local variable sections, which are
not appropriate for the containing file.
-See also `inhibit-local-variables-suffixes'.")
+The function `inhibit-local-variables-p' uses this.")
(define-obsolete-variable-alias 'inhibit-first-line-modes-suffixes
'inhibit-local-variables-suffixes "24.1")
(defvar inhibit-local-variables-suffixes nil
"List of regexps matching suffixes to remove from file names.
-When checking `inhibit-local-variables-regexps', we first discard
-from the end of the file name anything that matches one of these regexps.")
+The function `inhibit-local-variables-p' uses this: when checking
+a file name, it first discards from the end of the name anything that
+matches one of these regexps.")
+
+;; Can't think of any situation in which you'd want this to be nil...
+(defvar inhibit-local-variables-ignore-case t
+ "Non-nil means `inhibit-local-variables-p' ignores case.")
-;; TODO explicitly add case-fold-search t?
(defun inhibit-local-variables-p ()
"Return non-nil if file local variables should be ignored.
This checks the file (or buffer) name against `inhibit-local-variables-regexps'
-and `inhibit-local-variables-suffixes'."
+and `inhibit-local-variables-suffixes'. If
+`inhibit-local-variables-ignore-case' is non-nil, this ignores case."
(let ((temp inhibit-local-variables-regexps)
(name (if buffer-file-name
(file-name-sans-versions buffer-file-name)
- (buffer-name))))
+ (buffer-name)))
+ (case-fold-search inhibit-local-variables-ignore-case))
(while (let ((sufs inhibit-local-variables-suffixes))
(while (and sufs (not (string-match (car sufs) name)))
(setq sufs (cdr sufs)))
@@ -2748,7 +2758,9 @@ we don't actually set it to the same mode the buffer already has."
(if (functionp re)
(funcall re)
(looking-at re)))))))
- (set-auto-mode-0 done keep-mode-if-same)))))
+ (set-auto-mode-0 done keep-mode-if-same)))
+ (unless done
+ (set-buffer-major-mode (current-buffer)))))
;; When `keep-mode-if-same' is set, we are working on behalf of
;; set-visited-file-name. In that case, if the major mode specified is the
@@ -3018,6 +3030,9 @@ n -- to ignore the local variables list.")
(prog1 (memq char '(?! ?\s ?y))
(quit-window t)))))))
+(defconst hack-local-variable-regexp
+ "[ \t]*\\([^][;\"'?()\\ \t\n]+\\)[ \t]*:[ \t]*")
+
(defun hack-local-variables-prop-line (&optional mode-only)
"Return local variables specified in the -*- line.
Returns an alist of elements (VAR . VAL), where VAR is a variable
@@ -3044,11 +3059,11 @@ mode, if there is one, otherwise nil."
;; (last ";" is optional).
;; If MODE-ONLY, just check for `mode'.
;; Otherwise, parse the -*- line into the RESULT alist.
- (while (and (or (not mode-only)
- (not result))
- (< (point) end))
- (unless (looking-at "[ \t]*\\([^ \t\n:]+\\)[ \t]*:[ \t]*")
- (message "Malformed mode-line")
+ (while (not (or (and mode-only result)
+ (>= (point) end)))
+ (unless (looking-at hack-local-variable-regexp)
+ (message "Malformed mode-line: %S"
+ (buffer-substring-no-properties (point) end))
(throw 'malformed-line nil))
(goto-char (match-end 0))
;; There used to be a downcase here,
@@ -3200,8 +3215,7 @@ local variables, but directory-local variables may still be applied."
(prefix
(concat "^" (regexp-quote
(buffer-substring (line-beginning-position)
- (match-beginning 0)))))
- beg)
+ (match-beginning 0))))))
(forward-line 1)
(let ((startpos (point))
@@ -3236,18 +3250,16 @@ local variables, but directory-local variables may still be applied."
(forward-line 1))
(goto-char (point-min))
- (while (and (not (eobp))
- (or (not mode-only)
- (not result)))
- ;; Find the variable name; strip whitespace.
- (skip-chars-forward " \t")
- (setq beg (point))
- (skip-chars-forward "^:\n")
- (if (eolp) (error "Missing colon in local variables entry"))
- (skip-chars-backward " \t")
- (let* ((str (buffer-substring beg (point)))
- (var (let ((read-circle nil))
- (read str)))
+ (while (not (or (eobp)
+ (and mode-only result)))
+ ;; Find the variable name;
+ (unless (looking-at hack-local-variable-regexp)
+ (error "Malformed local variable line: %S"
+ (buffer-substring-no-properties
+ (point) (line-end-position))))
+ (goto-char (match-end 1))
+ (let* ((str (match-string 1))
+ (var (intern str))
val val2)
(and (equal (downcase (symbol-name var)) "mode")
(setq var 'mode))
@@ -3390,30 +3402,39 @@ It is dangerous if either of these conditions are met:
(setq ok t)))
ok))))))))
+(defun hack-one-local-variable--obsolete (var)
+ (let ((o (get var 'byte-obsolete-variable)))
+ (when o
+ (let ((instead (nth 0 o))
+ (since (nth 2 o)))
+ (message "%s is obsolete%s; %s"
+ var (if since (format " (since %s)" since))
+ (if (stringp instead) instead
+ (format "use `%s' instead" instead)))))))
+
(defun hack-one-local-variable (var val)
"Set local variable VAR with value VAL.
If VAR is `mode', call `VAL-mode' as a function unless it's
already the major mode."
- (cond ((eq var 'mode)
- (let ((mode (intern (concat (downcase (symbol-name val))
- "-mode"))))
- (unless (eq (indirect-function mode)
- (indirect-function major-mode))
- (if (memq mode minor-mode-list)
- ;; A minor mode must be passed an argument.
- ;; Otherwise, if the user enables the minor mode in a
- ;; major mode hook, this would toggle it off.
- (funcall mode 1)
- (funcall mode)))))
- ((eq var 'eval)
- (save-excursion (eval val)))
- (t
- ;; Make sure the string has no text properties.
- ;; Some text properties can get evaluated in various ways,
- ;; so it is risky to put them on with a local variable list.
- (if (stringp val)
- (set-text-properties 0 (length val) nil val))
- (set (make-local-variable var) val))))
+ (pcase var
+ (`mode
+ (let ((mode (intern (concat (downcase (symbol-name val))
+ "-mode"))))
+ (unless (eq (indirect-function mode)
+ (indirect-function major-mode))
+ (funcall mode))))
+ (`eval
+ (pcase val
+ (`(add-hook ',hook . ,_) (hack-one-local-variable--obsolete hook)))
+ (save-excursion (eval val)))
+ (_
+ (hack-one-local-variable--obsolete var)
+ ;; Make sure the string has no text properties.
+ ;; Some text properties can get evaluated in various ways,
+ ;; so it is risky to put them on with a local variable list.
+ (if (stringp val)
+ (set-text-properties 0 (length val) nil val))
+ (set (make-local-variable var) val))))
;;; Handling directory-local variables, aka project settings.
@@ -3648,8 +3669,12 @@ is found. Returns the new class name."
(defun hack-dir-local-variables ()
"Read per-directory local variables for the current buffer.
Store the directory-local variables in `dir-local-variables-alist'
-and `file-local-variables-alist', without applying them."
+and `file-local-variables-alist', without applying them.
+
+This does nothing if either `enable-local-variables' or
+`enable-dir-local-variables' are nil."
(when (and enable-local-variables
+ enable-dir-local-variables
(or enable-remote-dir-locals
(not (file-remote-p (or (buffer-file-name)
default-directory)))))
@@ -3671,10 +3696,13 @@ and `file-local-variables-alist', without applying them."
(dir-locals-get-class-variables class) dir-name nil)))
(when variables
(dolist (elt variables)
- (unless (memq (car elt) '(eval mode))
- (setq dir-local-variables-alist
- (assq-delete-all (car elt) dir-local-variables-alist)))
- (push elt dir-local-variables-alist))
+ (if (eq (car elt) 'coding)
+ (display-warning :warning
+ "Coding cannot be specified by dir-locals")
+ (unless (memq (car elt) '(eval mode))
+ (setq dir-local-variables-alist
+ (assq-delete-all (car elt) dir-local-variables-alist)))
+ (push elt dir-local-variables-alist)))
(hack-local-variables-filter variables dir-name)))))))
(defun hack-dir-local-variables-non-file-buffer ()
@@ -3864,6 +3892,27 @@ Interactively, confirmation is required unless you supply a prefix argument."
;; the one at the old location.
(vc-find-file-hook))
+(defun file-extended-attributes (filename)
+ "Return an alist of extended attributes of file FILENAME.
+
+Extended attributes are platform-specific metadata about the file,
+such as SELinux context, list of ACL entries, etc."
+ `((acl . ,(file-acl filename))
+ (selinux-context . ,(file-selinux-context filename))))
+
+(defun set-file-extended-attributes (filename attributes)
+ "Set extended attributes of file FILENAME to ATTRIBUTES.
+
+ATTRIBUTES must be an alist of file attributes as returned by
+`file-extended-attributes'."
+ (dolist (elt attributes)
+ (let ((attr (car elt))
+ (val (cdr elt)))
+ (cond ((eq attr 'acl)
+ (set-file-acl filename val))
+ ((eq attr 'selinux-context)
+ (set-file-selinux-context filename val))))))
+
(defun backup-buffer ()
"Make a backup of the disk file visited by the current buffer, if appropriate.
This is normally done before saving the buffer the first time.
@@ -3873,13 +3922,14 @@ variable `make-backup-files'. If it's done by renaming, then the file is
no longer accessible under its old name.
The value is non-nil after a backup was made by renaming.
-It has the form (MODES SELINUXCONTEXT BACKUPNAME).
+It has the form (MODES EXTENDED-ATTRIBUTES BACKUPNAME).
MODES is the result of `file-modes' on the original
file; this means that the caller, after saving the buffer, should change
the modes of the new file to agree with the old modes.
-SELINUXCONTEXT is the result of `file-selinux-context' on the original
-file; this means that the caller, after saving the buffer, should change
-the SELinux context of the new file to agree with the old context.
+EXTENDED-ATTRIBUTES is the result of `file-extended-attributes'
+on the original file; this means that the caller, after saving
+the buffer, should change the extended attributes of the new file
+to agree with the old attributes.
BACKUPNAME is the backup file name, which is the old file renamed."
(if (and make-backup-files (not backup-inhibited)
(not buffer-backed-up)
@@ -3908,7 +3958,8 @@ BACKUPNAME is the backup file name, which is the old file renamed."
(y-or-n-p (format "Delete excess backup versions of %s? "
real-file-name)))))
(modes (file-modes buffer-file-name))
- (context (file-selinux-context buffer-file-name)))
+ (extended-attributes
+ (file-extended-attributes buffer-file-name)))
;; Actually write the back up file.
(condition-case ()
(if (or file-precious-flag
@@ -3926,12 +3977,15 @@ BACKUPNAME is the backup file name, which is the old file renamed."
(and (integerp (nth 2 attr))
(integerp backup-by-copying-when-privileged-mismatch)
(<= (nth 2 attr) backup-by-copying-when-privileged-mismatch)))
- (or (nth 9 attr)
- (not (file-ownership-preserved-p real-file-name)))))))
- (backup-buffer-copy real-file-name backupname modes context)
+ (not (file-ownership-preserved-p
+ real-file-name t))))))
+ (backup-buffer-copy real-file-name
+ backupname modes
+ extended-attributes)
;; rename-file should delete old backup.
(rename-file real-file-name backupname t)
- (setq setmodes (list modes context backupname)))
+ (setq setmodes (list modes extended-attributes
+ backupname)))
(file-error
;; If trouble writing the backup, write it in
;; .emacs.d/%backup%.
@@ -3939,7 +3993,8 @@ BACKUPNAME is the backup file name, which is the old file renamed."
(message "Cannot write backup file; backing up in %s"
backupname)
(sleep-for 1)
- (backup-buffer-copy real-file-name backupname modes context)))
+ (backup-buffer-copy real-file-name backupname
+ modes extended-attributes)))
(setq buffer-backed-up t)
;; Now delete the old versions, if desired.
(if delete-old-versions
@@ -3951,7 +4006,7 @@ BACKUPNAME is the backup file name, which is the old file renamed."
setmodes)
(file-error nil))))))
-(defun backup-buffer-copy (from-name to-name modes context)
+(defun backup-buffer-copy (from-name to-name modes extended-attributes)
(let ((umask (default-file-modes)))
(unwind-protect
(progn
@@ -3977,10 +4032,12 @@ BACKUPNAME is the backup file name, which is the old file renamed."
nil)))
;; Reset the umask.
(set-default-file-modes umask)))
- (and modes
- (set-file-modes to-name (logand modes #o1777)))
- (and context
- (set-file-selinux-context to-name context)))
+ ;; If set-file-extended-attributes fails, fall back on set-file-modes.
+ (unless (and extended-attributes
+ (with-demoted-errors
+ (set-file-extended-attributes to-name extended-attributes)))
+ (and modes
+ (set-file-modes to-name (logand modes #o1777)))))
(defvar file-name-version-regexp
"\\(?:~\\|\\.~[-[:alnum:]:#@^._]+\\(?:~[[:digit:]]+\\)?~\\)"
@@ -4004,22 +4061,44 @@ See also `file-name-version-regexp'."
(string-match (concat file-name-version-regexp "\\'")
name))))))
-(defun file-ownership-preserved-p (file)
- "Return t if deleting FILE and rewriting it would preserve the owner."
+(defun file-ownership-preserved-p (file &optional group)
+ "Return t if deleting FILE and rewriting it would preserve the owner.
+Return nil if FILE does not exist, or if deleting and recreating it
+might not preserve the owner. If GROUP is non-nil, check whether
+the group would be preserved too."
(let ((handler (find-file-name-handler file 'file-ownership-preserved-p)))
(if handler
- (funcall handler 'file-ownership-preserved-p file)
+ (funcall handler 'file-ownership-preserved-p file group)
(let ((attributes (file-attributes file 'integer)))
;; Return t if the file doesn't exist, since it's true that no
;; information would be lost by an (attempted) delete and create.
(or (null attributes)
- (= (nth 2 attributes) (user-uid))
- ;; Files created on Windows by Administrator (RID=500)
- ;; have the Administrators group (RID=544) recorded as
- ;; their owner. Rewriting them will still preserve the
- ;; owner.
- (and (eq system-type 'windows-nt)
- (= (user-uid) 500) (= (nth 2 attributes) 544)))))))
+ (and (or (= (nth 2 attributes) (user-uid))
+ ;; Files created on Windows by Administrator (RID=500)
+ ;; have the Administrators group (RID=544) recorded as
+ ;; their owner. Rewriting them will still preserve the
+ ;; owner.
+ (and (eq system-type 'windows-nt)
+ (= (user-uid) 500) (= (nth 2 attributes) 544)))
+ (or (not group)
+ ;; On BSD-derived systems files always inherit the parent
+ ;; directory's group, so skip the group-gid test.
+ (memq system-type '(berkeley-unix darwin gnu/kfreebsd))
+ (= (nth 3 attributes) (group-gid)))
+ (let* ((parent (or (file-name-directory file) "."))
+ (parent-attributes (file-attributes parent 'integer)))
+ (and parent-attributes
+ ;; On some systems, a file created in a setuid directory
+ ;; inherits that directory's owner.
+ (or
+ (= (nth 2 parent-attributes) (user-uid))
+ (string-match "^...[^sS]" (nth 8 parent-attributes)))
+ ;; On many systems, a file created in a setgid directory
+ ;; inherits that directory's group. On some systems
+ ;; this happens even if the setgid bit is not set.
+ (or (not group)
+ (= (nth 3 parent-attributes)
+ (nth 3 attributes)))))))))))
(defun file-name-sans-extension (filename)
"Return FILENAME sans final \"extension\".
@@ -4102,23 +4181,31 @@ ignored."
"Default `backup-enable-predicate' function.
Checks for files in `temporary-file-directory',
`small-temporary-file-directory', and /tmp."
- (not (or (let ((comp (compare-strings temporary-file-directory 0 nil
- name 0 nil)))
- ;; Directory is under temporary-file-directory.
- (and (not (eq comp t))
- (< comp (- (length temporary-file-directory)))))
- (let ((comp (compare-strings "/tmp" 0 nil
- name 0 nil)))
- ;; Directory is under /tmp.
- (and (not (eq comp t))
- (< comp (- (length "/tmp")))))
- (if small-temporary-file-directory
- (let ((comp (compare-strings small-temporary-file-directory
- 0 nil
- name 0 nil)))
- ;; Directory is under small-temporary-file-directory.
- (and (not (eq comp t))
- (< comp (- (length small-temporary-file-directory)))))))))
+ (let ((temporary-file-directory temporary-file-directory)
+ caseless)
+ ;; On MS-Windows, file-truename will convert short 8+3 aliases to
+ ;; their long file-name equivalents, so compare-strings does TRT.
+ (if (memq system-type '(ms-dos windows-nt))
+ (setq temporary-file-directory (file-truename temporary-file-directory)
+ name (file-truename name)
+ caseless t))
+ (not (or (let ((comp (compare-strings temporary-file-directory 0 nil
+ name 0 nil caseless)))
+ ;; Directory is under temporary-file-directory.
+ (and (not (eq comp t))
+ (< comp (- (length temporary-file-directory)))))
+ (let ((comp (compare-strings "/tmp" 0 nil
+ name 0 nil)))
+ ;; Directory is under /tmp.
+ (and (not (eq comp t))
+ (< comp (- (length "/tmp")))))
+ (if small-temporary-file-directory
+ (let ((comp (compare-strings small-temporary-file-directory
+ 0 nil
+ name 0 nil caseless)))
+ ;; Directory is under small-temporary-file-directory.
+ (and (not (eq comp t))
+ (< comp (- (length small-temporary-file-directory))))))))))
(defun make-backup-file-name (file)
"Create the non-numeric backup file name for FILE.
@@ -4489,28 +4576,21 @@ Before and after saving the buffer, this function runs
(not (file-exists-p buffer-file-name))))
(let ((recent-save (recent-auto-save-p))
setmodes)
- ;; If buffer has no file name, ask user for one.
+ ;; If buffer has no file name, ask user for one.
(or buffer-file-name
- (let ((filename
- (expand-file-name
- (read-file-name "File to save in: "
- nil (expand-file-name (buffer-name))))))
- (if (file-exists-p filename)
- (if (file-directory-p filename)
- ;; Signal an error if the user specified the name of an
- ;; existing directory.
- (error "%s is a directory" filename)
- (unless (y-or-n-p (format "File `%s' exists; overwrite? "
- filename))
- (error "Canceled")))
- ;; Signal an error if the specified name refers to a
- ;; non-existing directory.
- (let ((dir (file-name-directory filename)))
- (unless (file-directory-p dir)
- (if (file-exists-p dir)
- (error "%s is not a directory" dir)
- (error "%s: no such directory" dir)))))
- (set-visited-file-name filename)))
+ (let ((filename
+ (expand-file-name
+ (read-file-name "File to save in: "
+ nil (expand-file-name (buffer-name))))))
+ (if (file-exists-p filename)
+ (if (file-directory-p filename)
+ ;; Signal an error if the user specified the name of an
+ ;; existing directory.
+ (error "%s is a directory" filename)
+ (unless (y-or-n-p (format "File `%s' exists; overwrite? "
+ filename))
+ (error "Canceled"))))
+ (set-visited-file-name filename)))
(or (verify-visited-file-modtime (current-buffer))
(not (file-exists-p buffer-file-name))
(yes-or-no-p
@@ -4543,7 +4623,14 @@ Before and after saving the buffer, this function runs
(run-hook-with-args-until-success 'write-file-functions)
;; If a hook returned t, file is already "written".
;; Otherwise, write it the usual way now.
- (setq setmodes (basic-save-buffer-1)))
+ (let ((dir (file-name-directory
+ (expand-file-name buffer-file-name))))
+ (unless (file-exists-p dir)
+ (if (y-or-n-p
+ (format "Directory `%s' does not exist; create? " dir))
+ (make-directory dir t)
+ (error "Canceled")))
+ (setq setmodes (basic-save-buffer-1))))
;; Now we have saved the current buffer. Let's make sure
;; that buffer-file-coding-system is fixed to what
;; actually used for saving by binding it locally.
@@ -4555,8 +4642,11 @@ Before and after saving the buffer, this function runs
(if setmodes
(condition-case ()
(progn
- (set-file-modes buffer-file-name (car setmodes))
- (set-file-selinux-context buffer-file-name (nth 1 setmodes)))
+ (unless
+ (with-demoted-errors
+ (set-file-modes buffer-file-name (car setmodes)))
+ (set-file-extended-attributes buffer-file-name
+ (nth 1 setmodes))))
(error nil))))
;; If the auto-save file was recent before this command,
;; delete it now.
@@ -4569,7 +4659,8 @@ Before and after saving the buffer, this function runs
;; This does the "real job" of writing a buffer into its visited file
;; and making a backup file. This is what is normally done
;; but inhibited if one of write-file-functions returns non-nil.
-;; It returns a value (MODES SELINUXCONTEXT BACKUPNAME), like backup-buffer.
+;; It returns a value (MODES EXTENDED-ATTRIBUTES BACKUPNAME), like
+;; backup-buffer.
(defun basic-save-buffer-1 ()
(prog1
(if save-buffer-coding-system
@@ -4577,13 +4668,12 @@ Before and after saving the buffer, this function runs
(basic-save-buffer-2))
(basic-save-buffer-2))
(if buffer-file-coding-system-explicit
- (setcar buffer-file-coding-system-explicit last-coding-system-used)
- (setq buffer-file-coding-system-explicit
- (cons last-coding-system-used nil)))))
+ (setcar buffer-file-coding-system-explicit last-coding-system-used))))
-;; This returns a value (MODES SELINUXCONTEXT BACKUPNAME), like backup-buffer.
+;; This returns a value (MODES EXTENDED-ATTRIBUTES BACKUPNAME), like
+;; backup-buffer.
(defun basic-save-buffer-2 ()
- (let (tempsetmodes setmodes)
+ (let (tempsetmodes setmodes writecoding)
(if (not (file-writable-p buffer-file-name))
(let ((dir (file-name-directory buffer-file-name)))
(if (not (file-directory-p dir))
@@ -4599,6 +4689,14 @@ Before and after saving the buffer, this function runs
buffer-file-name)))
(setq tempsetmodes t)
(error "Attempt to save to a file which you aren't allowed to write"))))))
+ ;; This may involve prompting, so do it now before backing up the file.
+ ;; Otherwise there can be a delay while the user answers the
+ ;; prompt during which the original file has been renamed. (Bug#13522)
+ (setq writecoding
+ ;; Args here should match write-region call below around
+ ;; which we use writecoding.
+ (choose-write-coding-system nil nil buffer-file-name nil t
+ buffer-file-truename))
(or buffer-backed-up
(setq setmodes (backup-buffer)))
(let* ((dir (file-name-directory buffer-file-name))
@@ -4656,7 +4754,7 @@ Before and after saving the buffer, this function runs
(setq setmodes (or setmodes
(list (or (file-modes buffer-file-name)
(logand ?\666 umask))
- (file-selinux-context buffer-file-name)
+ (file-extended-attributes buffer-file-name)
buffer-file-name)))
;; We succeeded in writing the temp file,
;; so rename it.
@@ -4668,16 +4766,23 @@ Before and after saving the buffer, this function runs
(cond ((and tempsetmodes (not setmodes))
;; Change the mode back, after writing.
(setq setmodes (list (file-modes buffer-file-name)
- (file-selinux-context buffer-file-name)
+ (file-extended-attributes buffer-file-name)
buffer-file-name))
- (set-file-modes buffer-file-name (logior (car setmodes) 128))
- (set-file-selinux-context buffer-file-name (nth 1 setmodes)))))
+ ;; If set-file-extended-attributes fails, fall back on
+ ;; set-file-modes.
+ (unless
+ (with-demoted-errors
+ (set-file-extended-attributes buffer-file-name
+ (nth 1 setmodes)))
+ (set-file-modes buffer-file-name
+ (logior (car setmodes) 128))))))
(let (success)
(unwind-protect
- (progn
;; Pass in nil&nil rather than point-min&max to indicate
;; we're saving the buffer rather than just a region.
;; write-region-annotate-functions may make us of it.
+ (let ((coding-system-for-write writecoding)
+ (coding-system-require-warning nil))
(write-region nil nil
buffer-file-name nil t buffer-file-truename)
(setq success t))
@@ -5403,18 +5508,20 @@ Then you'll be asked about a number of files to recover."
(let ((ls-lisp-support-shell-wildcards t))
(dired (concat auto-save-list-file-prefix "*")
(concat dired-listing-switches " -t")))
+ (use-local-map (nconc (make-sparse-keymap) (current-local-map)))
+ (define-key (current-local-map) "\C-c\C-c" 'recover-session-finish)
(save-excursion
(goto-char (point-min))
(or (looking-at " Move to the session you want to recover,")
(let ((inhibit-read-only t))
;; Each line starts with a space
;; so that Font Lock mode won't highlight the first character.
- (insert " Move to the session you want to recover,\n"
- " then type C-c C-c to select it.\n\n"
- " You can also delete some of these files;\n"
- " type d on a line to mark that file for deletion.\n\n"))))
- (use-local-map (nconc (make-sparse-keymap) (current-local-map)))
- (define-key (current-local-map) "\C-c\C-c" 'recover-session-finish))
+ (insert " To recover a session, move to it and type C-c C-c.\n"
+ (substitute-command-keys
+ " To delete a session file, type \
+\\[dired-flag-file-deletion] on its line to flag
+ the file for deletion, then \\[dired-do-flagged-delete] to \
+delete flagged files.\n\n"))))))
(defun recover-session-finish ()
"Choose one saved session to recover auto-save files from.
@@ -5648,7 +5755,7 @@ See also `auto-save-file-name-p'."
(defun auto-save-file-name-p (filename)
"Return non-nil if FILENAME can be yielded by `make-auto-save-file-name'.
FILENAME should lack slashes. You can redefine this for customization."
- (string-match "^#.*#$" filename))
+ (string-match "\\`#.*#\\'" filename))
(defun wildcard-to-regexp (wildcard)
"Given a shell file name pattern WILDCARD, return an equivalent regexp.
diff --git a/lisp/filesets.el b/lisp/filesets.el
index 62ab7423f67..978512bd3a4 100644
--- a/lisp/filesets.el
+++ b/lisp/filesets.el
@@ -1,4 +1,4 @@
-;;; filesets.el --- handle group of files
+;;; filesets.el --- handle group of files -*- coding: utf-8 -*-
;; Copyright (C) 2002-2013 Free Software Foundation, Inc.
@@ -805,8 +805,8 @@ In order to view pdf or rtf files in an Emacs buffer, you could use these:
(:match-number 2)
(:get-file-name (lambda (master file)
(filesets-which-file master file load-path))))))
- ("^\\([A-ZÄÖÜ][a-zäöüß]+\\([A-ZÄÖÜ][a-zäöüß]+\\)+\\)$" t
- (((:pattern "\\<\\([A-ZÄÖÜ][a-zäöüß]+\\([A-ZÄÖÜ][a-zäöüß]+\\)+\\)\\>")
+ ("^\\([A-ZÄÖÜ][a-zäöüß]+\\([A-ZÄÖÜ][a-zäöüß]+\\)+\\)$" t
+ (((:pattern "\\<\\([A-ZÄÖÜ][a-zäöüß]+\\([A-ZÄÖÜ][a-zäöüß]+\\)+\\)\\>")
(:scan-depth 5)
(:stubp (lambda (a b) (not (filesets-files-in-same-directory-p a b))))
(:case-sensitive t)
diff --git a/lisp/find-cmd.el b/lisp/find-cmd.el
index a766b9091fe..a41a32762dc 100644
--- a/lisp/find-cmd.el
+++ b/lisp/find-cmd.el
@@ -63,6 +63,7 @@
(cnewer . (1))
(ctime . (1))
(empty . (0))
+ (executable . (0))
(false . (0))
(fstype . (1))
(gid . (1))
@@ -70,37 +71,43 @@
(ilname . (1))
(iname . (1))
(inum . (1))
- (iwholename . (1))
+ (ipath . (1))
(iregex . (1))
+ (iwholename . (1))
(links . (1))
(lname . (1))
(mmin . (1))
(mtime . (1))
(name . (1))
(newer . (1))
- (nouser . (0))
(nogroup . (0))
+ (nouser . (0))
(path . (1))
(perm . (0))
+ (readable . (0))
(regex . (1))
- (wholename . (1))
+ (samefile . (1))
(size . (1))
(true . (0))
(type . (1))
(uid . (1))
(used . (1))
(user . (1))
+ (wholename . (1))
+ (writable . (0))
(xtype . (nil))
;; normal options (always true)
+ (daystart . (0))
(depth . (0))
(maxdepth . (1))
(mindepth . (1))
(mount . (0))
(noleaf . (0))
- (xdev . (0))
(ignore_readdir_race . (0))
(noignore_readdir_race . (0))
+ (regextype . (1))
+ (xdev . (0))
;; actions
(delete . (0))
diff --git a/lisp/find-dired.el b/lisp/find-dired.el
index ae7cc1c8629..f9a0c015bf7 100644
--- a/lisp/find-dired.el
+++ b/lisp/find-dired.el
@@ -210,13 +210,15 @@ use in place of \"-ls\" as the final argument."
(insert " " dir ":\n")
;; Make second line a ``find'' line in analogy to the ``total'' or
;; ``wildcard'' line.
- (insert " " args "\n")
+ (let ((point (point)))
+ (insert " " args "\n")
+ (dired-insert-set-properties point (point)))
(setq buffer-read-only t)
(let ((proc (get-buffer-process (current-buffer))))
(set-process-filter proc (function find-dired-filter))
(set-process-sentinel proc (function find-dired-sentinel))
;; Initialize the process marker; it is used by the filter.
- (move-marker (process-mark proc) 1 (current-buffer)))
+ (move-marker (process-mark proc) (point) (current-buffer)))
(setq mode-line-process '(":%s"))))
(defun kill-find ()
@@ -337,10 +339,11 @@ use in place of \"-ls\" as the final argument."
(let ((buffer-read-only nil))
(save-excursion
(goto-char (point-max))
- (insert "\n find " state)
- (forward-char -1) ;Back up before \n at end of STATE.
- (insert " at " (substring (current-time-string) 0 19))
- (forward-char 1)
+ (let ((point (point)))
+ (insert "\n find " state)
+ (forward-char -1) ;Back up before \n at end of STATE.
+ (insert " at " (substring (current-time-string) 0 19))
+ (dired-insert-set-properties point (point)))
(setq mode-line-process
(concat ":"
(symbol-name (process-status proc))))
diff --git a/lisp/font-lock.el b/lisp/font-lock.el
index 7a2577eabbb..f9b75243494 100644
--- a/lisp/font-lock.el
+++ b/lisp/font-lock.el
@@ -469,7 +469,7 @@ optimized.")
"Alist of additional `font-lock-keywords' elements for major modes.
Each element has the form (MODE KEYWORDS . HOW).
-`font-lock-set-defaults' adds the elements in the list KEYWORDS to
+Function `font-lock-set-defaults' adds the elements in the list KEYWORDS to
`font-lock-keywords' when Font Lock is turned on in major mode MODE.
If HOW is nil, KEYWORDS are added at the beginning of
@@ -484,7 +484,7 @@ This is normally set via `font-lock-add-keywords' and
(defvar font-lock-removed-keywords-alist nil
"Alist of `font-lock-keywords' elements to be removed for major modes.
-Each element has the form (MODE . KEYWORDS). `font-lock-set-defaults'
+Each element has the form (MODE . KEYWORDS). Function `font-lock-set-defaults'
removes the elements in the list KEYWORDS from `font-lock-keywords'
when Font Lock is turned on in major mode MODE.
@@ -2256,13 +2256,13 @@ in which C preprocessor directives are used. e.g. `asm-mode' and
"method-combination\\|setf-expander\\|skeleton\\|widget\\|"
"function\\|\\(compiler\\|modify\\|symbol\\)-macro\\)\\)\\|"
;; Variable declarations.
- "\\(const\\(ant\\)?\\|custom\\|varalias\\|face\\|parameter\\|var\\)\\|"
+ "\\(const\\(ant\\)?\\|custom\\|varalias\\|face\\|parameter\\|var\\(?:-local\\)?\\)\\|"
;; Structure declarations.
"\\(class\\|group\\|theme\\|package\\|struct\\|type\\)"
- "\\)\\)\\>"
+ "\\)\\)\\_>"
;; Any whitespace and defined object.
"[ \t'\(]*"
- "\\(setf[ \t]+\\sw+\\|\\sw+\\)?")
+ "\\(setf[ \t]+\\(?:\\sw\\|\\s_\\)+\\|\\(?:\\sw\\|\\s_\\)+\\)?")
(1 font-lock-keyword-face)
(9 (cond ((match-beginning 3) font-lock-function-name-face)
((match-beginning 6) font-lock-variable-name-face)
@@ -2299,7 +2299,7 @@ in which C preprocessor directives are used. e.g. `asm-mode' and
"with-silent-modifications" "with-syntax-table"
"with-temp-buffer" "with-temp-file" "with-temp-message"
"with-timeout" "with-timeout-handler" "with-wrapper-hook") t)
- "\\>")
+ "\\_>")
. 1)
;; Control structures. Common Lisp forms.
(,(concat
@@ -2320,23 +2320,25 @@ in which C preprocessor directives are used. e.g. `asm-mode' and
"with-open-stream" "with-output-to-string"
"with-package-iterator" "with-simple-restart"
"with-slots" "with-standard-io-syntax") t)
- "\\>")
+ "\\_>")
. 1)
;; Exit/Feature symbols as constants.
- (,(concat "(\\(catch\\|throw\\|featurep\\|provide\\|require\\)\\>"
- "[ \t']*\\(\\sw+\\)?")
+ (,(concat "(\\(catch\\|throw\\|featurep\\|provide\\|require\\)\\_>"
+ "[ \t']*\\(\\(?:\\sw\\|\\s_\\)+\\)?")
(1 font-lock-keyword-face)
(2 font-lock-constant-face nil t))
;; Erroneous structures.
- ("(\\(abort\\|assert\\|warn\\|check-type\\|cerror\\|error\\|signal\\)\\>" 1 font-lock-warning-face)
+ ("(\\(abort\\|assert\\|warn\\|check-type\\|cerror\\|error\\|signal\\)\\_>" 1 font-lock-warning-face)
;; Words inside \\[] tend to be for `substitute-command-keys'.
- ("\\\\\\\\\\[\\(\\sw+\\)\\]" 1 font-lock-constant-face prepend)
+ ("\\\\\\\\\\[\\(\\(?:\\sw\\|\\s_\\)+\\)\\]"
+ (1 font-lock-constant-face prepend))
;; Words inside `' tend to be symbol names.
- ("`\\(\\sw\\sw+\\)'" 1 font-lock-constant-face prepend)
+ ("`\\(\\(?:\\sw\\|\\s_\\)\\(?:\\sw\\|\\s_\\)+\\)'"
+ (1 font-lock-constant-face prepend))
;; Constant values.
- ("\\<:\\sw+\\>" 0 font-lock-builtin-face)
+ ("\\_<:\\(?:\\sw\\|\\s_\\)+\\_>" 0 font-lock-builtin-face)
;; ELisp and CLisp `&' keywords as types.
- ("\\<\\&\\sw+\\>" . font-lock-type-face)
+ ("\\_<\\&\\(?:\\sw\\|\\s_\\)+\\_>" . font-lock-type-face)
;; ELisp regexp grouping constructs
((lambda (bound)
(catch 'found
@@ -2353,11 +2355,11 @@ in which C preprocessor directives are used. e.g. `asm-mode' and
(throw 'found t)))))))
(1 'font-lock-regexp-grouping-backslash prepend)
(3 'font-lock-regexp-grouping-construct prepend))
-;;; This is too general -- rms.
-;;; A user complained that he has functions whose names start with `do'
-;;; and that they get the wrong color.
-;;; ;; CL `with-' and `do-' constructs
-;;; ("(\\(\\(do-\\|with-\\)\\(\\s_\\|\\w\\)*\\)" 1 font-lock-keyword-face)
+ ;; This is too general -- rms.
+ ;; A user complained that he has functions whose names start with `do'
+ ;; and that they get the wrong color.
+ ;; ;; CL `with-' and `do-' constructs
+ ;;("(\\(\\(do-\\|with-\\)\\(\\s_\\|\\w\\)*\\)" 1 font-lock-keyword-face)
)))
"Gaudy level highlighting for Lisp modes.")
diff --git a/lisp/frame.el b/lisp/frame.el
index 6b6b7a28c66..454b229d59e 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -655,9 +655,8 @@ the new frame according to its own rules."
(error "Don't know how to create a frame on window system %s" w))
(unless (get w 'window-system-initialized)
- (unless x-display-name
- (setq x-display-name display))
- (funcall (cdr (assq w window-system-initialization-alist)))
+ (funcall (cdr (assq w window-system-initialization-alist)) display)
+ (setq x-display-name display)
(put w 'window-system-initialized t))
;; Add parameters from `window-system-default-frame-alist'.
@@ -1654,12 +1653,60 @@ terminals, cursor blinking is controlled by the terminal."
'blink-cursor-start))))
+;; Frame maximization/fullscreen
+
+(defun toggle-frame-maximized ()
+ "Toggle maximization state of the selected frame.
+Maximize the selected frame or un-maximize if it is already maximized.
+Respect window manager screen decorations.
+If the frame is in fullscreen mode, don't change its mode,
+just toggle the temporary frame parameter `maximized',
+so the frame will go to the right maximization state
+after disabling fullscreen mode.
+See also `toggle-frame-fullscreen'."
+ (interactive)
+ (if (memq (frame-parameter nil 'fullscreen) '(fullscreen fullboth))
+ (modify-frame-parameters
+ nil
+ `((maximized
+ . ,(unless (eq (frame-parameter nil 'maximized) 'maximized)
+ 'maximized))))
+ (modify-frame-parameters
+ nil
+ `((fullscreen
+ . ,(unless (eq (frame-parameter nil 'fullscreen) 'maximized)
+ 'maximized))))))
+
+(defun toggle-frame-fullscreen ()
+ "Toggle fullscreen mode of the selected frame.
+Enable fullscreen mode of the selected frame or disable if it is
+already fullscreen. Ignore window manager screen decorations.
+When turning on fullscreen mode, remember the previous value of the
+maximization state in the temporary frame parameter `maximized'.
+Restore the maximization state when turning off fullscreen mode.
+See also `toggle-frame-maximized'."
+ (interactive)
+ (modify-frame-parameters
+ nil
+ `((maximized
+ . ,(unless (memq (frame-parameter nil 'fullscreen) '(fullscreen fullboth))
+ (frame-parameter nil 'fullscreen)))
+ (fullscreen
+ . ,(if (memq (frame-parameter nil 'fullscreen) '(fullscreen fullboth))
+ (if (eq (frame-parameter nil 'maximized) 'maximized)
+ 'maximized)
+ 'fullscreen)))))
+
+
;;;; Key bindings
(define-key ctl-x-5-map "2" 'make-frame-command)
(define-key ctl-x-5-map "1" 'delete-other-frames)
(define-key ctl-x-5-map "0" 'delete-frame)
(define-key ctl-x-5-map "o" 'other-frame)
+(define-key global-map [f11] 'toggle-frame-fullscreen)
+(define-key global-map [(meta f10)] 'toggle-frame-maximized)
+(define-key esc-map [f10] 'toggle-frame-maximized)
;; Misc.
diff --git a/lisp/generic-x.el b/lisp/generic-x.el
index e77cbe1eb14..d0250cb5210 100644
--- a/lisp/generic-x.el
+++ b/lisp/generic-x.el
@@ -549,6 +549,9 @@ like an INI file. You can add this hook to `find-file-hook'."
(concat (w32-shell-name) " -c " (buffer-file-name)))))
(eval-when-compile (require 'comint))
+(declare-function comint-mode "comint" ())
+(declare-function comint-exec "comint" (buffer name command startfile switches))
+
(defun bat-generic-mode-run-as-comint ()
"Run the current BAT file in a comint buffer."
(interactive)
diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog
index 59a935ee829..251e5b1f381 100644
--- a/lisp/gnus/ChangeLog
+++ b/lisp/gnus/ChangeLog
@@ -1,6 +1,167 @@
-2013-03-11 Glenn Morris <rgm@gnu.org>
+2013-04-25 Andrew Cohen <cohen@bu.edu>
- * Version 24.3 released.
+ * gnus-msg.el (gnus-inews-insert-gcc): Re-order conditional to work for
+ string values of 'gcc-self. Thanks to Saroj Thirumalai.
+
+2013-04-24 Andrew Cohen <cohen@bu.edu>
+
+ * nnir.el (nnir-close-group): Make sure we are in the right group.
+
+ * gnus-sum.el (gnus-summary-insert-articles): Force updates to the
+ dependency table from all newly retrieved headers.
+
+2013-04-16 David Edmondson <dme@dme.org>
+
+ Support <img src="data:...">.
+
+ * shr.el (shr-image-from-data): New function.
+ (shr-tag-img): Use it.
+
+2013-04-14 Andrew Cohen <cohen@bu.edu>
+
+ * nnir.el (nnir-request-set-mark): Make sure we are in the right
+ group.
+
+2013-04-12 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-msg.el (gnus-msg-mail): Make it avoid using posting styles
+ corresponding to any existing group (Bug#14166).
+
+2013-04-10 Andrew Cohen <cohen@bu.edu>
+
+ * nnir.el (number-sequence): No longer used.
+ (nnir-request-set-mark): New function.
+ (nnir-request-update-info): Improve marks updating.
+ (nnir-request-scan): Don't duplicate marks updating.
+ (gnus-group-make-nnir-group, nnir-run-imap, nnir-request-create-group):
+ Use 'assq rather than 'assoc. Quote anonymous function.
+ (nnir-request-group, nnir-close-group, gnus-summary-create-nnir-group):
+ Use 'gnus-group-prefixed-p.
+ (gnus-summary-create-nnir-group): Make sure server for method is open.
+
+2013-04-04 Andrew Cohen <cohen@bu.edu>
+
+ * nnir.el (gnus-nnir-group-p): New function.
+ (nnir-possibly-change-group): Use it.
+
+ * gnus-msg.el (gnus-setup-message): Use it.
+
+2013-04-04 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mml.el (mml-minibuffer-read-description): Use `default' insted of
+ `initial-input' for the argument name.
+ Suggested by Stefan Monnier <monnier@iro.umontreal.ca>.
+
+2013-04-03 Kevin Layer <layer@known.net> (tiny change)
+
+ * mml.el (mml-minibuffer-read-description): Allow passing in a prefix
+ (used by MH-E).
+
+2013-04-01 Andrew Cohen <cohen@bu.edu>
+
+ * nnir.el (nnir-request-update-mark): Improve mark updating in original
+ group.
+
+ * gnus-msg.el (nnir-article-number, nnir-article-group): Autoload to
+ fix compilation.
+
+2013-03-31 Andrew Cohen <cohen@bu.edu>
+
+ * nnir.el (nnir-method-default-engines): And another typo.
+
+2013-03-30 Andrew Cohen <cohen@bu.edu>
+
+ * nnir.el (nnir-method-default-engines): Fix typo.
+
+2013-03-29 Andrew Cohen <cohen@bu.edu>
+
+ * nnir.el: Define 'number-sequence for xemacs.
+ (gnus-summary-create-nnir-group): New function to create an nnir group
+ from an nnir summary buffer based on the current query.
+ (nnir-request-create-group): Update to allow nnir group creation based
+ on the current query.
+
+2013-03-28 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * nndraft.el (nndraft-request-expire-articles):
+ Make expiry target always `delete'.
+
+2013-03-27 Andrew Cohen <cohen@bu.edu>
+
+ * gnus-msg.el (gnus-setup-message): When replying from an nnir summary
+ buffer use the posting-style and gcc of the original article group.
+ (gnus-inews-insert-gcc): Don't set gcc-self for virtual groups.
+
+ * nnir.el: Fix byte-compile warning. nnoo-define-skeleton should come
+ after other deffoos.
+
+2013-03-26 Andrew Cohen <cohen@bu.edu>
+
+ * nnir.el: Major rewrite. Cleaner separation between searches and group
+ management. Marks are now shown in nnir summary buffers. Rudimentary
+ support for real (i.e. not ephemeral) nnir groups.
+ (gnus-summary-make-nnir-group): New function for initiating searches
+ from a summary buffer.
+
+2013-03-18 Sam Steingold <sds@gnu.org>
+
+ * message.el (message-bury): Minor cleanup.
+
+2013-03-06 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * nndir.el (nndir-request-list): Remove 2nd argument passed to
+ nnml-request-list. (Bug#13873)
+ (nndir-request-newsgroups): Remove, unused.
+
+ * nndraft.el (nndraft-request-newsgroups): Remove, unused.
+
+2013-03-03 Ted Phelps <phelps@gnusto.com>
+
+ * shr.el: Make all the overlays set the `evaporate' property so that
+ they're removed properly.
+
+2013-02-25 Adam Sjøgren <asjo@koldfront.dk>
+
+ * mml2015-el (mml2015-epg-key-image): Wrap epg-gpg-program in
+ shell-quote-argument.
+
+2013-02-22 David Engster <deng@randomsample.de>
+
+ * gnus-registry.el (gnus-registry-save): Provide class name when
+ calling `eieio-persistent-read' to avoid "unsafe call" warning. Use
+ `condition-case' to stay compatible with older EIEIO versions which
+ only accept one argument.
+
+2013-02-17 Daiki Ueno <ueno@gnu.org>
+
+ * mml2015.el (epg-key-user-id-list, epg-user-id-string)
+ (epg-user-id-validity): Autoload.
+ (mml2015-epg-check-user-id): New function.
+ (mml2015-epg-check-sub-key): New function split from
+ mml2015-epg-find-usable-key.
+ (mml2015-epg-find-usable-key): Accept context, name, usage, and
+ optional name-is-key-id, to handle the case when user-id is unusable.
+ Reported by Åukasz Stelmach <stlman@poczta.fm>.
+
+2013-02-17 Glenn Morris <rgm@gnu.org>
+
+ * shr.el (shr-put-image): Use image-multi-frame-p if available.
+
+2013-02-16 Glenn Morris <rgm@gnu.org>
+
+ * shr.el (shr-put-image): Only animate images that specify a delay.
+ This is consistent with the old image-animated-p behavior.
+
+2013-02-14 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-util.el (gnus-define-keys): Convert [?\S-\ ] to [(shift space)]
+ for XEmacs.
+
+2013-02-13 Juri Linkov <juri@jurta.org>
+
+ * gnus-art.el (gnus-article-mode-map):
+ * gnus-sum.el (gnus-summary-mode-map, gnus-summary-article-map):
+ Make S-SPC scroll in the opposite sense to SPC. (Bug#2145)
2013-02-10 Katsumi Yamaoka <yamaoka@jpl.org>
@@ -12,6 +173,111 @@
* auth-source.el (auth-source-format-prompt): Don't get confused by
any "\" in replacement text. (Bug#13637)
+2013-01-30 Christopher Schmidt <christopher@ch.ristopher.com>
+
+ * gnus-int.el (gnus-backend-trace-elapsed): New variable.
+ (gnus-backend-trace): Honor gnus-backend-trace.
+
+ * mml.el (mml-insert-part): Insert closing tag.
+
+ * mm-decode.el (mm-save-part): Handle invalid read-file-name results.
+
+2013-01-21 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-summary-read-group-1): Protect against not being
+ able to find the article, which can happen in debbugs groups,
+ apparently.
+
+2013-01-16 Glenn Morris <rgm@gnu.org>
+
+ * smiley.el (smiley-style): Make the file loadable in batch mode.
+
+2013-01-15 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * nnimap.el (nnimap-keepalive): Don't throw an error if there's no more
+ imap process running.
+
+2013-01-14 Julien Danjou <julien@danjou.info>
+
+ * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups):
+ Compare addresses against addresses, not against the full From field.
+
+2013-01-13 Richard Stallman <rms@gnu.org>
+
+ * message.el (message-forward-make-body-mime): New args BEG, END
+ specify what part of FORWARD-BUFFER to use. Do the work directly
+ instead of calling `mml-insert-buffer'.
+
+2013-01-11 Aaron S. Hawley <Aaron.Hawley@vtinfo.com>
+
+ * gnus-start.el (gnus-check-new-newsgroups): Fix ambiguous doc string
+ cross-reference(s).
+
+ * gnus-sum.el (gnus-summary-newsgroup-prefix): Fix ambiguous doc string
+ cross-reference(s).
+
+2013-01-11 Dmitry Antipov <dmantipov@yandex.ru>
+
+ * gnus-art.el (gnus-mime-display-security): Use point-min-marker
+ and point-max-marker.
+ * gnus-async.el (gnus-async-article-callback): Use point-max-marker.
+
+2013-01-10 Uwe Brauer <oub@mat.ucm.es> (tiny change)
+
+ * mml-smime.el (mml-smime-encrypt-to-self): New user option analogous
+ to mml2015-encrypt-to-self.
+ (mml-smime-epg-encrypt): Respect mml-smime-encrypt-to-self.
+
+2013-01-09 Daiki Ueno <ueno@gnu.org>
+
+ * mml-smime.el (epg-sub-key-fingerprint): Autoload for
+ mml-smime-epg-find-usable-secret-key.
+
+2013-01-08 Glenn Morris <rgm@gnu.org>
+
+ * mml-smime.el (mml-smime-sign-with-sender): Add :version.
+
+2013-01-07 Daiki Ueno <ueno@gnu.org>
+
+ * mml-smime.el: Support signing by sender.
+ Requested by Uwe Brauer.
+ (mml-smime-sign-with-sender): New user option analogous
+ to mml2015-sign-with-sender.
+ (mml-smime-epg-sign): Respect mml-smime-sign-with-sender.
+ (mml-smime-epg-find-usable-secret-key): New helper function copied from
+ mml2015.el.
+
+2012-12-31 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-msg.el (gnus-inews-insert-gcc): Don't insert Gcc headers if Gnus
+ isn't running, because Gnus will probably not know how to handle the
+ Gcc header (bug#11941).
+
+ * nnimap.el (nnimap-update-info): Treat \Deleted articles as \Read
+ articles.
+
+2012-12-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * nnfolder.el (nnfolder-recursive-directory-files): New function.
+ (nnfolder-generate-active-file): Make this function work with recursive
+ folder names.
+
+2012-12-27 Lars Ingebrigtsen <larsi@gnus.org>
+
+ * nntp.el (nntp-open-connection): Use HELP as the capability command
+ instead of CAPABILITY because Typhoon v2.2.2.503 chokes completely on
+ unknown commands. And CAPABILITY is an unknown command (bug#12763).
+
+2012-12-27 Wolfgang Jenkner <wjenkner@inode.at>
+
+ * gnus-spec.el (gnus-face-face-function): Don't use nil as no-op face
+ place holder since this gives `Invalid face reference: nil' messages.
+ Use the `default' face instead. It has the same effect here, even
+ though it is not no-op.
+
+ * gnus-util.el
+ (gnus-put-text-property-excluding-characters-with-faces): Similarly.
+
2012-12-27 Lars Ingebrigtsen <larsi@gnus.org>
* gnus-msg.el (gnus-summary-resend-message): Don't bug out on
@@ -20,18 +286,243 @@
2012-12-27 Glenn Morris <rgm@gnu.org>
* plstore.el (plstore-passphrase-callback-function):
- Fix file/buffer typo. (Bug#13264)
+ Use plstore-get-file.
+
+2012-12-27 Andreas Schwab <schwab@linux-m68k.org>
-2012-12-24 Andreas Schwab <schwab@linux-m68k.org>
+ * mml2015.el (mml2015-epg-key-image): Separate attribute stream from
+ stderr.
* nnimap.el (nnimap-find-article-by-message-id): Don't error out if
group is nil.
-2012-12-23 Andreas Schwab <schwab@linux-m68k.org>
-
* shr.el (shr-tag-em): Render as italic, not bold.
-2012-12-02 Andreas Schwab <schwab@linux-m68k.org>
+2012-12-26 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * mml2015.el (mml2015-epg-key-image): Use mm-set-buffer-multibyte.
+
+2012-12-25 Adam Sjøgren <asjo@koldfront.dk>
+
+ * mml2015.el (mml2015-epg-key-image): use --attribute-fd rather than
+ temporary file to get PGP key image. Pass no-show-photos when extracting
+ image to avoid having it pop up twice.
+
+2012-12-26 Lars Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-article-treat-types): Include text/html as parts
+ eligible for treatment.
+
+ * gnus-util.el (gnus-goto-colon): Move to the beginning of the visual
+ lines. This makes summary commands with hidden threads work more
+ reliably.
+
+ * gnus-cite.el (gnus-article-hide-citation-maybe): Leave an expansion
+ button to mark the hidden citations (bug#9395).
+
+2012-12-26 Daiki Ueno <ueno@gnu.org>
+
+ * mml2015.el (mml2015-epg-signature-to-string): New function.
+ (mml2015-epg-verify-result-to-string): New function.
+ (mml2015-epg-decrypt, mml2015-epg-clear-decrypt, mml2015-epg-verify)
+ (mml2015-epg-clear-verify): Use mml2015-epg-verify-result-to-string
+ instead of epg-verify-result-to-string.
+ (epg-signature-key-id, epg-signature-to-string): Autoload.
+ (epg-verify-result-to-string): Remove autoload.
+
+2012-12-25 Adam Sjøgren <asjo@koldfront.dk>
+
+ * mml2015.el (mml2015-epg-key-image): New function, to retrieve photo
+ ID image from GPG public key.
+ (mml2015-epg-key-image-to-string): New function.
+
+2012-12-25 Leo Liu <sdl.web@gmail.com>
+
+ * plstore.el (plstore-passphrase-callback-function): Fix error when
+ error when plstore-cache-passphrase-for-symmetric-encryption is set
+ (bug#13264).
+
+2012-12-25 Lars Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-set-global-variables): Don't copy over the summary
+ buffer to the article buffer here, because that clobbers multiple
+ article buffers.
+
+ * gnus-art.el (gnus-article-setup-buffer): Make sure that the article
+ buffer always points to the right summary buffer.
+
+2012-12-25 John Wiegley <jwiegley@gmail.com>
+
+ * auth-source.el (auth-source-netrc-parse): Allow using "password" as
+ the password (bug#12097).
+
+2012-12-25 Lars Ingebrigtsen <larsi@gnus.org>
+
+ * shr.el (shr-tag-a): Don't tagify <A> elements that don't have HREFs
+ (bug#13263).
+
+ * gnus-salt.el (gnus-highlight-selected-tree): Check whether the Tree
+ buffer exists before using it (bug#12475).
+
+ * gnus-agent.el (gnus-agent-fetch-articles): Don't fetch articles from
+ offline groups (bug#11937).
+
+ * message.el (message-yank-original): When using customize to set the
+ value of `message-cite-style', the variable it set to a symbol that's
+ the name of the variable, which must then be dereferenced (bug#12616).
+
+2012-12-25 Wolfgang Jenkner <wjenkner@inode.at>
+
+ * lisp/gnus-spec.el (gnus-face-face-function): Initialize the value of
+ the `face' property with a list whose car is the face specified in the
+ format string and whose cdr is (nil).
+ * lisp/gnus-util.el
+ (gnus-put-text-property-excluding-characters-with-faces):
+ Change accordingly.
+ (gnus-get-text-property-excluding-characters-with-faces): New function.
+ * lisp/gnus-sum.el (gnus-summary-highlight-line):
+ * lisp/gnus-salt.el (gnus-tree-highlight-node):
+ * lisp/gnus-group.el (gnus-group-highlight-line): Use it.
+
+2012-12-25 Lars Ingebrigtsen <larsi@gnus.org>
+
+ * nnimap.el (nnimap-authenticator): Expand to allow specifying the
+ login methods.
+ (nnimap-login): Respect the `nnimap-authenticator' variable.
+
+ * gnus-sum.el (gnus-summary-push-marks-to-backend): Push the complete
+ mark state when moving articles. Otherwise unticked articles will get
+ their ticks back after moving.
+
+2012-12-24 Lars Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-srvr.el (gnus-browse-delete-group): Fix syntax error.
+
+ * message.el (message-ignored-news-headers): Always remove
+ X-Message-SMTP-Method to avoid information leakage if the user
+ mistakenly inserts the header into news messages.
+
+ * gnus-srvr.el (gnus-browse-delete-group): New command and keystroke.
+
+ * gnus-sum.el (gnus-summary-hide-thread): If point were further to the
+ right than four characters, this command would move point to
+ `point-max'. Don't do that.
+
+ * gnus-group.el (gnus-group-read-ephemeral-group): Set the active data
+ to nil to allow re-selecting groups that gain articles.
+ (gnus-bug-group-download-format-alist): Update the URL.
+
+2012-12-23 Andreas Schwab <schwab@suse.de>
+
+ * shr.el (shr-tag-em): Render em as italic, not bold.
+
+2012-12-23 Lars Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-int.el (gnus-backend-trace): Factor out into its own function
+ for reuse.
+ (gnus-open-server): Use it to add more tracing.
+ (gnus-finish-retrieve-group-infos): Add backend tracing.
+ (gnus-backend-trace): Also note the elapsed seconds.
+
+2012-12-22 Philipp Haselwarter <philipp@haselwarter.org>
+
+ * gnus-sync.el (gnus-sync-file-encrypt-to, gnus-sync-save):
+ Set epa-file-encrypt-to from variable to avoid querying.
+
+2012-12-14 Akinori MUSHA <knu@iDaemons.org> (tiny change)
+
+ * sieve-mode.el (sieve-font-lock-keywords):
+ Keywords should be word delimited. (Bug#13173)
+
+2012-12-12 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (gnus-article-browse-html-parts): Use <div align="left">
+ instead of <pre> to align message header.
+
+2012-12-12 Sam Steingold <sds@gnu.org>
+
+ * gnus.el (gnus-other-frame-resume-function): Add user option.
+ (gnus-other-frame): Call `gnus-other-frame-resume-function' on resume.
+
+2012-12-06 Sam Steingold <sds@gnu.org>
+
+ * gnus-start.el (gnus-before-resume-hook): Add.
+ (gnus-1): Run it when Gnus is alive.
+
+2012-12-06 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gmm-utils.el (gmm-called-interactively-p): Restore as a macro.
+ * gnus-art.el (article-unsplit-urls)
+ * gnus-bookmark.el (gnus-bookmark-bmenu-list)
+ * gnus-registry.el (gnus-registry-get-article-marks)
+ * message.el (message-goto-body): Use it.
+ (message-called-interactively-p): Remove.
+
+ * spam-stat.el (spam-stat-called-interactively-p): New macro.
+ (spam-stat-score-buffer): Use it.
+
+ * spam.el: Silence the warnings against BBDB functions when compiling.
+
+ * gnus-score.el (gnus-score-decode-text-parts):
+ Use append+mapcar instead of the cl function mapcan.
+
+ * gmm-utils.el (gmm-flet): Remove.
+
+ * gnus-sync.el (gnus-sync-lesync-call):
+ Avoid overriding json-alist-p.
+
+ * message.el (message-read-from-minibuffer):
+ Avoid overriding mail-abbrev-in-expansion-header-p.
+
+2012-12-05 Sam Steingold <sds@gnu.org>
+
+ * gnus.el (gnus-delete-gnus-frame): Extract from `gnus-other-frame'.
+ (gnus-other-frame): Add `gnus-delete-gnus-frame' to
+ `gnus-suspend-gnus-hook' in addition to `gnus-exit-gnus-hook'.
+
+2012-12-05 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gmm-utils.el (gmm-called-interactively-p): Revert.
+ This seems to cause Emacs to get stuck!
+ * gnus-art.el (article-unsplit-urls)
+ * gnus-bookmark.el (gnus-bookmark-bmenu-list)
+ * gnus-registry.el (gnus-registry-get-article-marks)
+ * message.el (message-goto-body)
+ (message-called-interactively-p): Revert.
+
+ * gmm-utils.el (gmm-called-interactively-p): New function.
+ * gnus-art.el (article-unsplit-urls)
+ * gnus-bookmark.el (gnus-bookmark-bmenu-list)
+ * gnus-registry.el (gnus-registry-get-article-marks)
+ * message.el (message-goto-body): Use it.
+ (message-called-interactively-p): Remove.
+
+ * gmm-utils.el (gmm-flet): Restore it using cl-letf.
+ * gnus-sync.el (gnus-sync-lesync-call)
+ * message.el (message-read-from-minibuffer): Use it.
+
+2012-12-05 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gmm-utils.el (gmm-flet): Remove.
+ * gnus-sync.el (gnus-sync-lesync-call)
+ * message.el (message-read-from-minibuffer): Don't use it.
+
+2012-12-04 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gmm-utils.el (gmm-labels): Use cl-labels if available.
+
+2012-12-04 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gmm-utils.el (gmm-flet, gmm-labels): New macros.
+
+ * gnus-sync.el (gnus-sync-lesync-call)
+ * message.el (message-read-from-minibuffer): Use gmm-flet.
+
+ * gnus-score.el (gnus-score-decode-text-parts): Use gmm-labels.
+
+ * gnus-util.el (gnus-macroexpand-all): Remove.
+
+2012-12-03 Andreas Schwab <schwab@linux-m68k.org>
* gnus-sum.el (gnus-summary-mode-map): Bind gnus-summary-widget-forward
to TAB, not [tab].
@@ -40,13 +531,18 @@
* gnus-sync.el (gnus-sync-newsrc-offsets): Restore definition.
(gnus-sync-save): Use correct format for gnus-sync-newsrc-loader.
+2012-11-19 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * message.el (message-get-reply-headers):
+ Make sure the reply goes to the author if it is a wide reply.
+
2012-11-16 Jan Tatarik <jan.tatarik@gmail.com>
* gnus-score.el (gnus-score-body):
* gnus-logic.el (gnus-advanced-body): Don't score by headers when
scoring by body.
-2012-11-13 Glenn Morris <rgm@gnu.org>
+2012-11-16 Glenn Morris <rgm@gnu.org>
* gnus-diary.el (nndiary-request-create-group-functions)
(nndiary-request-update-info-functions)
@@ -54,6 +550,36 @@
(nndiary-request-accept-article-functions):
Use new names for hooks rather than obsolete aliases.
+2012-11-08 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * gnus-art.el (gnus-article-browse-html-parts): Always replace charset
+ in meta tag with the one the part specifies in its header.
+
+2012-11-02 Stephen Eglen <S.J.Eglen@damtp.cam.ac.uk>
+
+ * gnus-dired.el (gnus-dired-attach): Attach to last used message buffer
+ by default.
+
+2012-11-02 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ New UIDL implementation.
+
+ * mail-source.el (mail-sources, mail-source-keyword-map):
+ Add :leave as a pop3 keyword.
+ (mail-source-fetch-pop): Bind pop3-leave-mail-on-server.
+
+ * pop3.el (pop3-leave-mail-on-server): Allow number.
+ (pop3-uidl-file, pop3-uidl-file-backup): New user options.
+ (pop3-movemail): Add UIDL support.
+ (pop3-send-streaming-command): Take a list of mail numbers instead of
+ the number of mails.
+ (pop3-write-to-file): Add X-UIDL header.
+ (pop3-uidl-stat, pop3-uidl-dele, pop3-uidl-load, pop3-uidl-save)
+ (pop3-uidl-add-xheader): New functions.
+
+ * message.el (message-ignored-resent-headers):
+ Add X-Content-Length and X-UIDL headers.
+
2012-10-23 Stefan Monnier <monnier@iro.umontreal.ca>
* nndiary.el (nndiary-request-create-group-functions)
diff --git a/lisp/gnus/ChangeLog.1 b/lisp/gnus/ChangeLog.1
index 34533f31bff..9043a23361e 100644
--- a/lisp/gnus/ChangeLog.1
+++ b/lisp/gnus/ChangeLog.1
@@ -452,7 +452,7 @@
* gnus-sum.el (gnus-remove-thread): Didn't work with sparse
threads.
-1998-08-14 François Pinard <pinard@iro.umontreal.ca>
+1998-08-14 François Pinard <pinard@iro.umontreal.ca>
* nndoc.el (nndoc-generate-mime-parts-head): Use original Subject,
Message-ID, and References in fully blown articles.
@@ -619,7 +619,7 @@
* gnus.el: Gnus v5.6.31 is released.
-1998-08-09 François Pinard <pinard@iro.umontreal.ca>
+1998-08-09 François Pinard <pinard@iro.umontreal.ca>
* nndoc.el: Split MIME multipart messages, maybe recursively.
(nndoc-mime-parts-type-p, nndoc-transform-mime-parts,
@@ -760,7 +760,7 @@
* gnus-group.el (gnus-group-read-ephemeral-group): Make the server
unique.
-1998-07-28 François Pinard <pinard@iro.umontreal.ca>
+1998-07-28 François Pinard <pinard@iro.umontreal.ca>
* gnus-uu.el (gnus-uu-reginize-string): Consider the number of
parts as part of the fixed subject, instead of a wild quantity.
@@ -943,7 +943,7 @@
* nntp.el (nntp-server-opened-hook): Doc change.
-1998-07-10 François Pinard <pinard@iro.umontreal.ca>
+1998-07-10 François Pinard <pinard@iro.umontreal.ca>
* gnus-sum.el (gnus-summary-respool-trace): New command and
keystroke.
@@ -1003,7 +1003,7 @@
* nntp.el (nntp-record-command): Give more precise time info.
(nntp-next-result-arrived-p): Look for the end of error lines.
-1998-07-01 François Pinard <pinard@iro.umontreal.ca>
+1998-07-01 François Pinard <pinard@iro.umontreal.ca>
* gnus-util.el (gnus-delete-if): Would do the opposite.
@@ -2016,7 +2016,7 @@
* gnus-picon.el (gnus-picons-display-x-face): `buf' -- unbound
var.
-1998-02-28 François Pinard <pinard@iro.umontreal.ca>
+1998-02-28 François Pinard <pinard@iro.umontreal.ca>
* gnus: configure'd.
@@ -2370,7 +2370,7 @@
* gnus-sum.el (gnus-summary-exit): Call purging function.
-1998-02-13 François Pinard <pinard@iro.umontreal.ca>
+1998-02-13 François Pinard <pinard@iro.umontreal.ca>
* nnmail.el (nnmail-get-new-mail): Don't clear split-history.
(nnmail-purge-split-history): New function.
@@ -3724,3 +3724,7 @@
You should have received a copy of the GNU General Public License
along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
+
+;; Local Variables:
+;; coding: utf-8
+;; End:
diff --git a/lisp/gnus/ChangeLog.2 b/lisp/gnus/ChangeLog.2
index ab590a68654..4ddd622ce9a 100644
--- a/lisp/gnus/ChangeLog.2
+++ b/lisp/gnus/ChangeLog.2
@@ -72,7 +72,7 @@
* gnus-dired.el (gnus-dired-mode-map): Change keymaps.
-2004-01-02 Arne J,Ax(Brgensen <arne@arnested.dk>
+2004-01-02 Arne Jørgensen <arne@arnested.dk>
* smime.el (smime-crl-check): Doc fix.
@@ -143,7 +143,7 @@
(gnus-summary-goto-article): Allow `%40'.
(gnus-summary-refer-article): Convert `%40' to `@'.
-2003-12-30 Arne J,Ax(Brgensen <arne@arnested.dk>
+2003-12-30 Arne Jørgensen <arne@arnested.dk>
* smime.el (smime-crl-check): New.
(smime-verify-region): Use it.
@@ -152,7 +152,7 @@
(gnus-score-find-trace): Use gnus-score-edit-file-at-point. Added
`f' and `t' commands, added quick help. With some suggestions
- from Karl Pfl,Ad(Bsterer <sigurd@12move.de>.
+ from Karl Pflästerer <sigurd@12move.de>.
* gnus-util.el (gnus-emacs-version): Added doc-string.
@@ -160,7 +160,7 @@
(mml-attach-file): Use it.
(mml-preview): Added MIME preview to gnus-buffers.
-2003-12-30 Karl Pfl,Ad(Bsterer <sigurd@12move.de>
+2003-12-30 Karl Pflästerer <sigurd@12move.de>
* gnus-score.el (gnus-score-edit-file-at-point): Consider the
whole match element.
@@ -243,7 +243,7 @@
* gnus-score.el (gnus-summary-lower-score)
(gnus-summary-increase-score): Mention symbolic prefix in the
- doc-string. Suggested by Karl Pfl,Ad(Bsterer <sigurd@12move.de>.
+ doc-string. Suggested by Karl Pflästerer <sigurd@12move.de>.
2003-12-21 Jesper Harder <harder@ifa.au.dk>
@@ -383,7 +383,7 @@
* message.el (message-get-reply-headers): Narrow to headers.
-2003-12-10 L,Bu(Brentey K,Ba(Broly <lorentey@elte.hu>
+2003-12-10 Lőrentey Károly <lorentey@elte.hu>
* spam.el (spam-disable-spam-split-during-ham-respool): New
variable.
@@ -406,7 +406,7 @@
input.
(pgg-decode-armor-region): Don't parse packet if decoding fail.
-2003-12-09 L,Bu(Brentey K,Ba(Broly <lorentey@elte.hu>
+2003-12-09 Lőrentey Károly <lorentey@elte.hu>
* spam.el (spam-check-bogofilter): Run in the correct buffer.
@@ -444,7 +444,7 @@
2003-12-08 Simon Josefsson <jas@extundo.com>
* mml-smime.el (mml-smime-sign): Replace CRLF with LF in OpenSSL
- output. Reported by Arne J,Ax(Brgensen <arne@arnested.dk>.
+ output. Reported by Arne Jørgensen <arne@arnested.dk>.
2003-12-07 Lloyd Zusman <ljz@asfast.com> (tiny change)
@@ -1018,7 +1018,7 @@
(gnus-header-button-alist): Likewise.
(gnus-url-mailto): Handle ?to parameters. Replace \r\n with \n.
Reverse parameter list to use same order as in the URL. Reported
- by f95-msv@f.kth.se (M,Ae(Brten Svantesson).
+ by f95-msv@f.kth.se (MÃ¥rten Svantesson).
2003-10-25 Teodor Zlatanov <tzz@lifelogs.com>
@@ -1215,7 +1215,7 @@
(gnus-article-prepare): Don't set to t.
(gnus-narrow-to-page): Set to t if we break.
-2003-06-11 Daniel N,Ai(Bri <dne@mayonnaise.net>
+2003-06-11 Daniel Néri <dne@mayonnaise.net>
* message.el (message-resend): Generate Resent-Message-ID header.
@@ -1558,7 +1558,7 @@
2003-08-29 Simon Josefsson <jas@extundo.com>
* gnus-group.el (gnus-group-delete-group): Doc fix. Suggested by
- Jochen K,A|(Bpper <jochen@jochen-kuepper.de>.
+ Jochen Küpper <jochen@jochen-kuepper.de>.
2003-08-29 Katsumi Yamaoka <yamaoka@jpl.org>
@@ -1588,7 +1588,7 @@
* gnus-art.el (gnus-treat-display-face): Fix typo.
(gnus-treat-display-xface): Rename to gnus-treat-display-x-face
- (reported by Jochen K,A|(Bpper <jochen@jochen-kuepper.de>)
+ (reported by Jochen Küpper <jochen@jochen-kuepper.de>)
2003-08-24 Jesper Harder <harder@ifa.au.dk>
@@ -1804,7 +1804,7 @@
* mml-sec.el (mml-signencrypt-style-alist): Use "combined" by
default. Improve docstring.
-2003-07-10 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net>
+2003-07-10 Kai Großjohann <kai.grossjohann@gmx.net>
* imap.el (imap-arrival-filter): Fix test for missing process
buffer.
@@ -2097,10 +2097,10 @@
* gnus-sum.el (gnus-summary-make-menu-bar): Removed ["Add buttons"
gnus-summary-display-buttonized t].
-2003-06-07 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net>
+2003-06-07 Kai Großjohann <kai.grossjohann@gmx.net>
* nnmail.el (nnmail-split-fancy-match-partial-words): Doc string
- fix. Reported by Johan Bockg,Ae(Brd <bojohan+news@dd.chalmers.se>.
+ fix. Reported by Johan Bockgård <bojohan+news@dd.chalmers.se>.
2003-06-07 Jesper Harder <harder@ifa.au.dk>
@@ -2157,7 +2157,7 @@
compiling.
(gnus-find-method-for-group, nnvirtual-find-group-art): Autoload.
-2003-06-03 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net>
+2003-06-03 Kai Großjohann <kai.grossjohann@gmx.net>
* nnmail.el (nnmail-split-fancy-match-partial-words): New user
option.
@@ -2364,7 +2364,7 @@
(rfc2047-syntax-table): Fix building table to work in Emacs 22.
(rfc2047-unfold-region): Delete unused var `leading'.
-2003-05-12 Ville Skytt,Ad(B <scop@xemacs.org> (tiny change)
+2003-05-12 Ville Skyttä <scop@xemacs.org> (tiny change)
* pgg.el (pgg-temp-buffer-show-function): Reuse existing visible
output window if one is available.
@@ -2459,7 +2459,7 @@
* spam.el (spam-use-regex-headers): Docstring fix.
-2003-05-08 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net>
+2003-05-08 Kai Großjohann <kai.grossjohann@gmx.net>
* gnus-sum.el (gnus-summary-next-page): Mention
`gnus-article-skip-boring' in docstring.
@@ -2749,7 +2749,7 @@
* gnus-int.el (gnus-open-server): Revert changes.
-2003-04-30 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net>
+2003-04-30 Kai Großjohann <kai.grossjohann@gmx.net>
* gnus-int.el (gnus-open-server): Try to open unagentized servers
even when unplugged.
@@ -2788,7 +2788,7 @@
(gnus-register-action): Optimized logical flow.
(gnus-summary-prepare-hook): Added gnus-registry-register-message-ids.
-2003-04-30 Kai Gro,A_(Bjohann <kai.grossjohann@gmx.net>
+2003-04-30 Kai Großjohann <kai.grossjohann@gmx.net>
* gnus-delay.el (gnus-delay-article): Call
`gnus-agent-queue-setup' to create the delay group.
@@ -2837,7 +2837,7 @@
* spam-report.el (spam-report-gmane): gnus-summary-article-number
is not necessary, just use the function parameter.
-2003-04-29 Karl Pfl,Ad(Bsterer <sigurd@12move.de>
+2003-04-29 Karl Pflästerer <sigurd@12move.de>
* spam-stat.el (spam-stat-save): No longer font-locks the file
when saving.
@@ -4142,7 +4142,7 @@
(gnus-agent-article-alist, gnus-agent-article-alist)
(gnus-agent-cat-defaccessor): Doc fixes.
-2003-03-04 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2003-03-04 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-agent.el (gnus-function-implies-unread-1): Grok
byte-compiled functions.
@@ -4552,7 +4552,7 @@
(gnus-agent-regenerate-group): Now clears the message buffer when
finished.
-2003-02-23 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2003-02-23 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus.el (gnus-agent-target-move-group-header): New variable.
* gnus-draft.el (gnus-draft-send): If special header
@@ -4578,7 +4578,7 @@
* gnus-util.el (gnus-fetch-original-field): New function.
-2003-02-23 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2003-02-23 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* message.el (message-mode): \\(...\\) around additional
paragraph-separate alternative.
@@ -4629,12 +4629,12 @@
* message.el (message-mode): MML tags separate paragraphs.
-2003-02-22 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2003-02-22 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-agent.el (gnus-agent-get-undownloaded-list): Sort
`gnus-newsgroup-headers'.
-2003-02-22 Karl Pfl,Ad(Bsterer <sigurd@12move.de>
+2003-02-22 Karl Pflästerer <sigurd@12move.de>
* gnus-art.el (gnus-article-refer-article): Grok more message id
formats.
@@ -4714,7 +4714,7 @@
illegible and invisible text.
* gnus-util.el (gnus-multiple-choice): Separate choices with
- ",,A (B". Suggested by Dan Jacobson <jidanni@dman.ddts.net>.
+ ", ". Suggested by Dan Jacobson <jidanni@dman.ddts.net>.
2003-02-18 Jesper Harder <harder@ifa.au.dk>
@@ -4727,7 +4727,7 @@
gnus-summary-kill-process-mark and gnus-summary-yank-process-mark
around process-mark manipulation on the group.
-2003-02-17 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2003-02-17 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-sum.el (gnus-summary-make-menu-bar): Add MIME/Multipart
submenu.
@@ -4764,7 +4764,7 @@
* gnus-art.el (gnus-article-prepare): Don't set agent mark if
online.
-2003-02-14 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2003-02-14 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-agent.el (gnus-agent-group-make-menu-bar): Include all
commands.
@@ -5051,7 +5051,7 @@
* gnus.el (spam group parameters): Change 'other to 'const in
the group parameter definitions to soothe XEmacs.
-2003-02-04 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2003-02-04 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-delay.el (gnus-delay-article): Really create
nndraft:delayed group if it doesn't exist.
@@ -5222,7 +5222,7 @@
* nnheader.el (nnheader-directory-separator-character): New
variable.
-2003-01-24 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2003-01-24 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-agent.el (gnus-agent-max-fetch-size)
(gnus-agent-article-alist, gnus-agent-get-undownloaded-list)
@@ -5400,7 +5400,7 @@
calculation of net characters added for use in the gnus-data
structure.
-2003-01-18 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2003-01-18 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* nnmail.el (nnmail-process-unix-mail-format): Improve error
message. Suggested by Jari Aalto.
@@ -5652,7 +5652,7 @@
* gnus-msg.el (gnus-inews-add-send-actions): Get the right
articles to be marked when not yanking.
-2003-01-12 Fran,Ag(Bois-David Collin <Francois-David.Collin@curie.fr>
+2003-01-12 François-David Collin <Francois-David.Collin@curie.fr>
* mm-decode.el (mm-get-part): Use mm-with-unibyte-current-buffer.
@@ -5666,10 +5666,10 @@
2003-01-12 Simon Josefsson <jas@extundo.com>
* sieve.el (sieve-upload-and-bury): New. Suggested by
- kai.grossjohann@uni-duisburg.de (Kai Gro,A_(Bjohann).
+ kai.grossjohann@uni-duisburg.de (Kai Großjohann).
* sieve-mode.el (sieve-mode-map): Bind s-u-a-b to C-c C-c.
- Suggested by kai.grossjohann@uni-duisburg.de (Kai Gro,A_(Bjohann).
+ Suggested by kai.grossjohann@uni-duisburg.de (Kai Großjohann).
2003-01-12 Lars Magne Ingebrigtsen <larsi@gnus.org>
@@ -5701,7 +5701,7 @@
* gnus-sum.el (gnus-summary-exit): Reverse change to make group
exit work with two frames.
-2003-01-11 Fran,Ag(Bois-David Collin <Francois-David.Collin@wanadoo.fr>
+2003-01-11 François-David Collin <Francois-David.Collin@wanadoo.fr>
* message.el (message-forward-make-body): Use mule4.
@@ -6303,7 +6303,7 @@
* dig.el (query-dig): Doc fix.
-2003-01-02 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2003-01-02 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-agent.el (gnus-agent-fetch-selected-article): Update whole
summary buffer line, not just the download mark.
@@ -6694,7 +6694,7 @@
* gnus-agent.el (gnus-close-agent): Don't blank out the list of
covered methods.
-2002-12-12 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-12-12 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* nntp.el (nntp-with-open-group-first-pass): Do not wrap in
eval-when-compile. Suggested by Kevin Greiner.
@@ -6825,12 +6825,12 @@
Because of an unknown bug, the group buffer is saved in .overview
file.
-2002-12-09 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-12-09 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* nntp.el (nntp-send-command): Braino in last commit. Replace
`and' with `or'.
-2002-12-08 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-12-08 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* nntp.el (nntp-send-command): Assume that echo does not happen
when nntp-open-connection-function is nntp-open-network-stream.
@@ -6854,12 +6854,12 @@
* rfc2047.el (rfc2047-decode-region): Remove newlines between
decoded words.
-2002-12-03 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-12-03 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus.el (fboundp): After loading mm-util, make sure it was the
right one.
-2002-11-29 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-11-29 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-art.el (gnus-inhibit-mime-unbuttonizing): Moved here from
gnus-sum. Made into a user option.
@@ -6916,7 +6916,7 @@
* binhex.el (binhex-decode-region): Don't hardcode point-min == 1.
-2002-11-29 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-11-29 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-sum.el (gnus-simplify-ignored-prefixes)
(gnus-summary-mark-article-as-unread)
@@ -6949,7 +6949,7 @@
* nnrss.el (nnrss-group-alist): Update the link of Jabber.
-2002-11-26 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-11-26 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-sum.el (gnus-summary-insert-old-articles): Remove
superfluous function call.
@@ -6961,13 +6961,13 @@
* gnus-agent.el: Autoload number-at-point instead.
(gnus-agent-check-overview-buffer): No warning for deactivate-mark.
-2002-11-26 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-11-26 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-agent.el (gnus-agent-check-overview-buffer): Explicitly
require thingatpt (for number-at-point) and protect against
deactivate-mark being unbound (on XEmacs).
-2002-11-25 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-11-25 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-agent.el (gnus-agent-check-overview-buffer): Make debugger
print message on entry.
@@ -6977,7 +6977,7 @@
* gnus-range.el (gnus-range-difference): New function.
* gnus-sum.el (gnus-summary-insert-old-articles): Use it.
-2002-11-24 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-11-24 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-sum.el (gnus-summary-insert-old-articles): Use
gnus-remove-from-range instead of gnus-range-difference which
@@ -7063,7 +7063,7 @@
of article numbers. The range is not expanded into a list
until the optional ALL parameter has been applied.
-2002-11-18 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-11-18 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-agent.el (gnus-category-mode): Typo in doc string.
@@ -7124,7 +7124,7 @@
* mml.el (mml-preview): Bind message-this-is-mail if it is mail.
-2002-11-13 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-11-13 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus.el (gnus-summary-line-format): Document %C.
@@ -7198,12 +7198,12 @@
(spam-stat-reduce-size): No longer remove words
with values close to 0.5, because the default value is 0.2.
-2002-10-31 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-10-31 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-util.el (gnus-user-date-format-alist): Clarify and correct
documentation.
-2002-10-28 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-10-28 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-agent.el (gnus-agent-fetched-headers)
(gnus-agent-load-fetched-headers)
@@ -7260,12 +7260,12 @@
type values ("url" size) regardless of the values of
mm-url-use-external.
-2002-10-26 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-10-26 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* nnimap.el (nnimap-request-article-part): Try harder to show
group name in debugging message.
-2002-10-25 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-10-25 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-agent.el (gnus-agent-save-fetched-headers): Create
directory if it doesn't exist.
@@ -7283,7 +7283,7 @@
* gnus-agent.el (gnus-agent-load-alist): Fix parenthesis.
-2002-10-24 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-10-24 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-agent.el (gnus-agent-save-alist, gnus-agent-load-alist):
Remove unused optional arg DIR and corresponding code.
@@ -7295,7 +7295,7 @@
* gnus-agent.el (gnus-agent-fetch-headers): Add some comments.
-2002-10-23 Kai Gro,A_(Bjohann <kai.grossjohann@uni-duisburg.de>
+2002-10-23 Kai Großjohann <kai.grossjohann@uni-duisburg.de>
* gnus-agent.el (gnus-agent-fetched-headers): New variable,
contains range of headers that have been fetched by the agent
@@ -7338,7 +7338,7 @@
* nnslashdot.el: Removed some test lines.
More test.
-2002-10-21 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-10-21 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-agent.el (gnus-agent-fetch-headers): Remove articles that
are known to be downloaded already.
@@ -7364,7 +7364,7 @@
* gnus-srvr.el (gnus-server-prepare): Removed superfluous cdr.
-2002-10-20 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-10-20 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-agent.el (gnus-agent-fetch-group-1): After fetching
headers from the group, update variable `articles' to contain
@@ -7392,7 +7392,7 @@
* nnimap.el (nnimap-open-server): Check imap-state in IMAP server
buffer.
-2002-10-18 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-10-18 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-spec.el (gnus-make-format-preserve-properties)
(gnus-xmas-format, gnus-parse-simple-format): Preserve text
@@ -7475,9 +7475,9 @@
* spam-stat.el: Check for the existence of hash functions instead
of the Emacs version to decide whether to load cl. Suggested by
- Kai Gro,A_(Bjohann.
+ Kai Großjohann.
-2002-10-15 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-10-15 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-agent.el (gnus-agent-fetch-selected-article): Open history
if it isn't open yet.
@@ -7603,7 +7603,7 @@
* pgg.el (pgg-insert-url-with-w3): Ignore errors.
(pgg-fetch-key-function): Nil if w3 is not installed.
-2002-10-08 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-10-08 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-agent.el (gnus-agent-fetch-selected-article): Bind
gnus-agent-current-history.
@@ -7612,7 +7612,7 @@
* imap.el (imap-parse-status): Don't use read to read token.
-2002-10-05 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-10-05 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-agent.el (gnus-agent-fetch-selected-article): Do nothing
for methods not covered by the agent, and when unplugged.
@@ -7724,7 +7724,7 @@
* nnmaildir.el (nnmaildir--group-maxnum-art): Fix maximum article
number when there are no articles.
-2002-10-03 Kai Gro,A_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-10-03 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-agent.el (gnus-agent-summary-fetch-group): Optional prefix
arg ALL means to fetch all articles, not only downloadable ones.
@@ -7738,7 +7738,7 @@
2002-09-30 Teodor Zlatanov <tzz@lifelogs.com>
- * spam.el: Merged changes from pinard@iro.umontreal.ca (Fran,Ag(Bois
+ * spam.el: Merged changes from pinard@iro.umontreal.ca (François
Pinard).
Major revamp of the code, documentation is in comments in the file
for now.
@@ -7849,7 +7849,7 @@
* message.el (message-forward-make-body): Revert an early change
because 8-bit utf-8 emails.
-2002-09-25 Bj,Av(Brn Torkelsson <torkel@acc.umu.se>
+2002-09-25 Björn Torkelsson <torkel@acc.umu.se>
* gnus-agent.el (gnus-category-line-format): Doc fixes (mostly added
links to Info).
@@ -7990,7 +7990,7 @@
given.
2002-09-23 Simon Josefsson <jas@extundo.com>
- Trivial fix from beaker@iavmb.pl (Krzysztof J,Bj(Bdruczyk).
+ Trivial fix from beaker@iavmb.pl (Krzysztof Jędruczyk).
* smime.el (smime-sign-buffer): Get key and extra certs.
(smime-get-key-with-certs-by-email): Utility function.
@@ -8151,7 +8151,7 @@
* gnus-art.el (gnus-article-treat-body-boundary): Don't quote a
value for gnus-decoration property.
-2002-09-06 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-09-06 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* nnmail.el (nnmail-cache-fetch-group): Don't return "" (empty
string) as group name in case we have a CRLF in the file.
@@ -8270,7 +8270,7 @@
* gnus-util.el (gnus-select-frame-set-input-focus): New function.
-2002-08-20 $B>.4X(B $B5HB'(B (KOSEKI Yoshinori) <kose@meadowy.org>
+2002-08-20 å°é–¢ å‰å‰‡ (KOSEKI Yoshinori) <kose@meadowy.org>
* message.el (message-set-auto-save-file-name): Add support for
the Cygwin Emacs; the system-type is `cygwin'.
@@ -8292,11 +8292,11 @@
* message.el (message-ignored-supersedes-headers): Add X-Hashcash.
(message-ignored-resent-headers): Add envelope From.
-2002-08-18 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-08-18 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus.el (gnus-summary-line-format): Document %k specifier.
-2002-08-17 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-08-17 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-sum.el (gnus-summary-line-message-size): New function.
(gnus-summary-line-format-alist): Use it.
@@ -8306,7 +8306,7 @@
* gnus-art.el (article-make-date-line): Refer to the value for
`gnus-article-time-format' in the summary buffer.
- * message.el (message-cite-prefix-regexp): Exclude ":" and ",A;(B".
+ * message.el (message-cite-prefix-regexp): Exclude ":" and "»".
2002-08-14 Simon Josefsson <jas@extundo.com>
@@ -8521,7 +8521,7 @@
* gnus-art.el (article-unsplit-urls): Keep URL buttonized after
unsplitting.
-2002-07-01 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-07-01 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-msg.el (gnus-summary-resend-default-address): New user option.
(gnus-summary-resend-message): Use it.
@@ -8546,17 +8546,17 @@
* nntp.el (nntp-open-via-rlogin-and-telnet): Hide commandline args.
-2002-06-26 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-06-26 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* message.el (message-font-lock-keywords): Revert 2002-06-22
change.
-2002-06-24 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-06-24 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* message.el (message-font-lock-keywords): Put colon in header
name match.
-2002-06-22 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-06-22 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* message.el (message-font-lock-keywords): Don't use header faces
in the body. Thanks to Stefan Monnier for the hint on the
@@ -8578,7 +8578,7 @@
* nnmail.el (nnmail-cache-ignore-groups): New.
* nnmail.el (nnmail-cache-insert): Obey nnmail-cache-ignore-groups.
-2002-06-18 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-06-18 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-delay.el (gnus-delay-send-queue): Delete the delay header
before sending. Suggested by Jan Rychter.
@@ -8589,7 +8589,7 @@
sure to write byte-compiled versions of gnus-*-format-alist to
.newsrc.eld.
-2002-06-16 Bj,Ax(Brn Mork <bmork@dod.no>
+2002-06-16 Bjørn Mork <bmork@dod.no>
* gnus-agent.el (gnus-agent-read-servers)
(gnus-agent-write-servers): Put server name (string like
@@ -8657,12 +8657,12 @@
* message.el (message-send-mail-with-sendmail): Improve error message.
-2002-06-06 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-06-06 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* message.el (message-interactive): Change default from nil to t.
Better to be safe than to be fast.
-2002-06-05 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-06-05 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* message.el (message-send-mail-with-sendmail): Check return value
from call-process-region.
@@ -8833,7 +8833,7 @@
frobbing the alist directly.
* mml.el (mml-generate-mime-1): Use accessor function.
-2002-05-08 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-05-08 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-art.el (gnus-article-mode-syntax-table): Specify matching
parenthesis for "<" and ">". Suggested by Andreas Schwab
@@ -8961,7 +8961,7 @@
2002-04-27 ShengHuo ZHU <zsh@cs.rochester.edu>
* gnus-msg.el (gnus-article-mail): Use gnus-msg-mail instead.
- Trivial change from Karl Pfl,Ad(Bsterer <sigurd@12move.de>.
+ Trivial change from Karl Pflästerer <sigurd@12move.de>.
2002-04-27 Katsumi Yamaoka <yamaoka@jpl.org>
@@ -9027,7 +9027,7 @@
* gnus-msg.el (gnus-summary-resend-message-edit): Remove
message-ignored-resent-headers, too.
-2002-04-22 Bj,Av(Brn Torkelsson <torkel@acc.umu.se>
+2002-04-22 Björn Torkelsson <torkel@acc.umu.se>
* gnus-srvr.el (gnus-server-browse-in-group-buffer): It is a
boolean not a string
@@ -9128,7 +9128,7 @@
<Nicolas.Kowalski@imag.fr>.
* smime.el (smime-CA-directory): Fix doc. Thanks to Arne
- J,Ax(Brgensen <arne+usenet@daimi.au.dk>.
+ Jørgensen <arne+usenet@daimi.au.dk>.
(smime-sign-buffer): Work in XEmacs. Thanks to Nicolas Kowalski
<Nicolas.Kowalski@imag.fr>.
(smime-decrypt-buffer): Ditto.
@@ -9224,9 +9224,9 @@
* gnus-sum.el (gnus-summary-dummy-line-format):
* gnus.el (gnus-summary-line-format): Fixing links to Info.
- Trivial change from Bj,Av(Brn Torkelsson <torkel@pdc.kth.se>.
+ Trivial change from Björn Torkelsson <torkel@pdc.kth.se>.
-2002-03-29 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-03-29 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-sum.el (gnus-summary-move-article)
(gnus-summary-copy-article): Mention `gnus-move-split-methods' in
@@ -9260,7 +9260,7 @@
(nnmaildir--edit-prep): New function.
(Local Variables): Use it.
-2002-03-26 Pavel Jan,Am(Bk <Pavel@Janik.cz>
+2002-03-26 Pavel Janík <Pavel@Janik.cz>
* gnus-sum.el (gnus-summary-make-menu-bar): Fix typo.
@@ -9307,7 +9307,7 @@
* message.el (message-font-lock-keywords): Support multi-line MML
tags.
-2002-03-21 L,Bu(Brentey K,Ba(Broly <lorentey@elte.hu>
+2002-03-21 Lőrentey Károly <lorentey@elte.hu>
* gnus-sum.el (gnus-print-buffer): Remove gnus-decoration.
@@ -9325,7 +9325,7 @@
* gnus-group.el (gnus-group-process-prefix): Make sure there is a mark.
-2002-03-19 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2002-03-19 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-sum.el (gnus-sum-thread-tree-root)
(gnus-sum-thread-tree-single-indent)
@@ -9338,7 +9338,7 @@
* gnus-util.el (gnus-extract-address-components): Don't break on
names such as James "Kibo" Parry.
-2002-03-13 Pavel Jan,Am(Bk <Pavel@Janik.cz>
+2002-03-13 Pavel Janík <Pavel@Janik.cz>
* pop3.el (pop3-open-server): Revert multibyte change.
@@ -9915,7 +9915,7 @@
* nnagent.el (nnagent-request-expire-articles): Don't delete
files.
-2002-02-06 Stefan Reich,Av(Br <xsteve@riic.at>
+2002-02-06 Stefan Reichör <xsteve@riic.at>
* gnus-agent.el (gnus-agent-summary-make-menu-bar): Fix typo.
@@ -9958,7 +9958,7 @@
(gnus-article-reply-with-original): Ditto.
* binhex.el (binhex-decoder-switches): Fix doc. From
- Pavel@Janik.cz (Pavel Jan,Am(Bk).
+ Pavel@Janik.cz (Pavel Janík).
2002-02-04 ShengHuo ZHU <zsh@cs.rochester.edu>
@@ -10806,7 +10806,7 @@
* flow-fill.el (fill-flowed-display-column)
(fill-flowed-encode-columnq): New variables. Suggested by
- Kai.Grossjohann@CS.Uni-Dortmund.DE (Kai Gro,b_(Bjohann).
+ Kai.Grossjohann@CS.Uni-Dortmund.DE (Kai Großjohann).
(fill-flowed-encode, fill-flowed): Use them.
* message.el (message-send-news, message-send-mail): Use
@@ -10976,7 +10976,7 @@
* gnus-group.el (gnus-group-read-ephemeral-group): Restore the old
behavior of quit-config.
-2002-01-08 Bj,Ax(Brn Mork <bmork@dod.no> (tiny change)
+2002-01-08 Bjørn Mork <bmork@dod.no> (tiny change)
* message.el (message-make-from): Don't quote fullname.
@@ -11373,7 +11373,7 @@
(gnus-picon-transform-address): Insert spec backward, due to the
incompatibility of gnus-xmas-put-image.
-2002-01-02 Pavel Jan,Am(Bk <Pavel@Janik.cz>
+2002-01-02 Pavel Janík <Pavel@Janik.cz>
* gnus-fun.el (gnus-convert-pbm-to-x-face-command): Doc fix.
@@ -11802,7 +11802,7 @@
* gnus-win.el (gnus-configure-windows-hook): New hook.
-2001-12-29 Sascha L,A|(Bdecke <sascha@meta-x.de>
+2001-12-29 Sascha Lüdecke <sascha@meta-x.de>
* gnus-win.el (gnus-configure-windows): Minimize tree buffer.
@@ -11901,7 +11901,7 @@
(nnmaildir-version): Indicate that nnmaildir is now a standard
part of Gnus, not separately released.
-2001-12-21 08:00:00 Pavel Jan,Am(Bk <Pavel@Janik.cz>
+2001-12-21 08:00:00 Pavel Janík <Pavel@Janik.cz>
* gnus-art.el, gnus-picon.el, gnus-sieve.el, gnus-sum.el:
* gnus-xmas.el, imap.el, mailcap.el, mm-util.el, nnfolder.el:
@@ -12008,7 +12008,7 @@
* mm-url.el (executable-find): Autoload.
-2001-12-12 Pavel Jan,Am(Bk <Pavel@Janik.cz>
+2001-12-12 Pavel Janík <Pavel@Janik.cz>
* gnus-mlspl.el (gnus-group-split-fancy): Doc fix (add reference
to variable, follow doc-string conventions).
@@ -12210,7 +12210,7 @@
* message.el (message-tab-body-function): Set to nil.
(message-tab): Use text-mode-map or global-map.
- Suggested by Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>.
+ Suggested by Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>.
2001-11-30 Simon Josefsson <jas@extundo.com>
@@ -12224,7 +12224,7 @@
* gnus-agent.el (gnus-agent-write-active): Make sure sym is a cons
of integers.
-2001-11-29 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-11-29 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* message.el (message-newgroups-header-regexp)
(message-completion-alist, message-tab-body-function): Use
@@ -12307,7 +12307,7 @@
(gnus-summary-limit-to-extra): Ditto.
(gnus-summary-find-matching): Support not-matching argument.
-2001-11-25 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-11-25 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* message.el (message-wash-subject): Use `insert' rather than
`insert-string', which is deprecated.
@@ -12367,7 +12367,7 @@
* nnfolder.el (nnfolder-read-folder): Use group instead of
nnfolder-current-group.
- Suggested by K,Ba(Broly L,Bu(Brentey <lorentey@elte.hu>.
+ Suggested by Károly Lőrentey <lorentey@elte.hu>.
2001-11-17 Simon Josefsson <jas@extundo.com>
@@ -12461,7 +12461,7 @@
* mml2015.el: Mention RFC 3156.
-2001-11-12 Sascha L,A|(Bdecke <sascha@meta-x.de>
+2001-11-12 Sascha Lüdecke <sascha@meta-x.de>
* mml1991.el: New file.
@@ -12480,11 +12480,11 @@
canlock, no need to require two different hash algs). Suggested
by Ferenc Wagner <wferi@bolyai1.elte.hu>.
-2001-11-09 Pavel Jan,Am(Bk <Pavel@Janik.cz>
+2001-11-09 Pavel Janík <Pavel@Janik.cz>
* gnus.el (gnus-local-domain): Fix doc.
-2001-11-09 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-11-09 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* message.el (message-point-in-header-p): New function.
(message-do-auto-fill): Use it.
@@ -12823,7 +12823,7 @@
(nnweb-type-definition): Add google as alias of dejanews.
(nnweb-google-parse-1): Forward 1 line.
-2001-10-26 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-10-26 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-msg.el (gnus-summary-mail-forward): Doc fix: add pointer to
variable `message-forward-ignored-headers'.
@@ -12859,7 +12859,7 @@
* gnus-msg.el (gnus-extended-version): Include
system-configuration.
- Suggested by Kai.Grossjohann@CS.Uni-Dortmund.DE (Kai Gro,b_(Bjohann).
+ Suggested by Kai.Grossjohann@CS.Uni-Dortmund.DE (Kai Großjohann).
2001-10-22 Per Abrahamsen <abraham@dina.kvl.dk>
@@ -12879,7 +12879,7 @@
(nnimap-split-inbox, nnimap-expunge-search-string)
(nnimap-importantize-dormant): Remove "*" from doc.
-2001-10-20 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-10-20 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-sum.el (gnus-summary-limit-to-score): Prompt for score if
not supplied via prefix arg. From Lisp, make arg mandatory.
@@ -12993,7 +12993,7 @@
(mml2015-gpg-decrypt-1): Decanonicalize decrypted MIME
body. (Mailcrypt seem to do this, but gpg.el doesn't.)
-2001-10-16 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-10-16 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
Patch by Oliver Scholz <oscholz@my.gnus.org>.
* gnus-draft.el (gnus-draft-edit-message): Add text property
@@ -13048,7 +13048,7 @@
* message.el (message-do-auto-fill): Use gnus-point-at-bol.
(autoload): Add some autoloads.
-2001-10-12 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-10-12 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
Suggested by Oliver Scholz <epameinondas@gmx.de>.
* message.el (message-do-auto-fill): New function. Like
@@ -13183,7 +13183,7 @@
* gnus-sum.el (gnus-summary-extract-address-component): New function.
(gnus-summary-from-or-to-or-newsgroups): Optimize.
-2001-09-29 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-09-29 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* message.el (message-mode-map): Keybinding for `gnus-delay-article'.
(message-mode-menu): Menu item for same.
@@ -13226,7 +13226,7 @@
(gnus-topic-catchup-articles): New function. Suggested by Robin
S. Socha <robin-dated-1001857693.185e29@socha.net>.
-2001-09-27 11:00:00 Gerd M,Av(Bllmann <gerd@gnu.org>
+2001-09-27 11:00:00 Gerd Möllmann <gerd@gnu.org>
* gnus-ems.el (gnus-article-display-xface): Insert xface after
previous ones.
@@ -13287,7 +13287,7 @@
* gnus-group.el (gnus-group-catchup): Update expire marks in
backend. Also, if ALL also set expire marks on tick/dormant.
-2001-09-20 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-09-20 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* message.el (message-tab-body-function): New variable.
* message.el (message-tab): Use it.
@@ -13318,7 +13318,7 @@
* gnus-srvr.el (gnus-server-insert-server-line): Don't let an
error querying a backend abort the whole process.
-2001-09-17 08:00:00 Gerd M,Av(Bllmann <gerd@gnu.org>
+2001-09-17 08:00:00 Gerd Möllmann <gerd@gnu.org>
* gnus-srvr.el (gnus-server-mode): Fix bogus fontification.
@@ -13359,7 +13359,7 @@
* gnus-draft.el (gnus-draft-setup): Don't set mark when there
isn't an article to set it on (e.g. when you `a' in a group).
-2001-09-12 Pavel Jan,Am(Bk <Pavel@Janik.cz>
+2001-09-12 Pavel Janík <Pavel@Janik.cz>
* mm-util.el (mm-charset-synonym-alist): Add windows-1250 so we
can read e-mails from Microsoft Outlook users not using ISO
@@ -13478,7 +13478,7 @@
* gnus-sum.el (gnus-summary-insert-line): Fix.
-2001-09-06 Bj,Av(Brn Torkelsson <torkel@acc.umu.se>
+2001-09-06 Björn Torkelsson <torkel@acc.umu.se>
* gnus-sum.el: Bind g-s-t-s to "W g".
* gnus-sum.el (gnus-summary-make-menu-bar): Add g-s-t-s.
@@ -13494,7 +13494,7 @@
* gnus-sum.el (gnus-summary-insert-line): Insert forwarded, recent
and unseen marks.
-2001-09-05 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-09-05 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* nnmail.el (nnmail-split-fancy): Document `junk'.
@@ -13772,7 +13772,7 @@
* gnus-spec.el (gnus-correct-substring): Stopped one character
before we wanted.
-2001-08-19 Pavel Jan,Am(Bk <Pavel@Janik.cz>
+2001-08-19 Pavel Janík <Pavel@Janik.cz>
* earcon.el (earcon-auto-play): Remove unused option.
@@ -13930,7 +13930,7 @@
* mml.el (mml-menu): Collapse Attach, Insert and Security submenu.
-2001-08-17 Bj,Av(Brn Torkelsson <torkel@acc.kth.se>
+2001-08-17 Björn Torkelsson <torkel@acc.kth.se>
* message.el: Rename "Abort Message" to "Postpone Message".
Remove "Attach file as MIME" from Message menu, it's already in
@@ -13984,17 +13984,17 @@
* gnus-srvr.el (gnus-server-browse-in-group-buffer): Default to
nil.
-2001-08-15 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-08-15 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-delay.el (gnus-delay-article): Allow "01:23" time spec,
which specifies a time today or tomorrow.
-2001-08-15 Pavel Jan,Am(Bk <Pavel@Janik.cz>
+2001-08-15 Pavel Janík <Pavel@Janik.cz>
* gnus-agent.el (gnus-agent-make-mode-line-string)
(gnus-agent-toggle-plugged): Use new API.
-2001-08-14 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-08-14 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-delay.el (gnus-delay-send-drafts): Fix check whether
deadline has expired.
@@ -14054,7 +14054,7 @@
(nndoc-oe-dbx-dissection): New function.
(nndoc-oe-dbx-generate-article): New function.
-2001-08-11 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-08-11 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-delay.el (gnus-delay-send-drafts): Cleaner way to check
whether deadline has been reached. Patch from Dan Nicolaescu
@@ -14123,7 +14123,7 @@
* gnus-sum.el (gnus-summary-edit-article-done): Ditto.
* gnus-sum.el (gnus-summary-reparent-thread): Ditto.
-2001-08-07 16:00:00 Gerd M,Av(Bllmann <gerd@gnu.org>
+2001-08-07 16:00:00 Gerd Möllmann <gerd@gnu.org>
* mm-uu.el (mm-uu-dissect): Autoload.
@@ -14195,7 +14195,7 @@
before remove.
(gnus-mime-security-show-details): Ditto.
-2001-08-04 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-08-04 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* nnmail.el (nnmail-split-fancy-with-parent): Correct `mapconcat'
syntax. Protect string-match against nil string and regexp.
@@ -14280,7 +14280,7 @@
* gnus-msg.el (gnus-post-method): Refer to `gnus-parameters'.
2001-07-31 17:00:00 ShengHuo ZHU <zsh@cs.rochester.edu>
- Originally from Pavel Jan,Am(Bk <Pavel@Janik.cz>
+ Originally from Pavel Janík <Pavel@Janik.cz>
* gnus-agent.el (gnus-agent-make-mode-line-string): New function.
(gnus-agent-toggle-plugged): Use it.
@@ -14292,7 +14292,7 @@
(gnus-read-newsrc-el-file, gnus-save-newsrc-file)
(gnus-slave-save-newsrc): Use it.
-2001-07-31 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-07-31 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-delay.el (gnus-delay-initialize): Use standard define-key
syntax.
@@ -14386,7 +14386,7 @@
calls widen. Thanks to Christoph Conrad
<christoph.conrad@gmx.de>.
-2001-07-29 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-07-29 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus.el (gnus-summary-line-format): Mention `gnus-sum-thread-*'
for %B spec.
@@ -14477,7 +14477,7 @@
* nnheader.el (nnheader-translate-file-chars): cygwin32 is running
in M$Windows too.
-2001-07-26 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-07-26 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-delay.el (gnus-delay-send-drafts): Don't `error'.
@@ -14555,7 +14555,7 @@
* mm-decode.el (mm-remove-part): Don't murder the current window (nil).
(mm-display-external): Use display-term configure.
-2001-07-24 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-07-24 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-delay.el (gnus-delay-default-hour): New variable.
(gnus-delay-article): Allow specific date in YYYY-MM-DD format.
@@ -14589,7 +14589,7 @@
`gnus-check-bogus-newsgroups' just after the native server is
opened.
-2001-07-23 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-07-23 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* nnmail.el (nnmail-do-request-post): Util function to be used by
`nnchoke-request-post' for all nnmail-derived backends.
@@ -14607,7 +14607,7 @@
* gnus-msg.el (gnus-setup-message): make-local-hook.
-2001-07-22 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-07-22 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-delay.el (gnus-delay-article): Fix `read-string' for
XEmacs. Allow more units. Submitted by Karl Kleinpaste
@@ -14617,7 +14617,7 @@
whether the groups exist, check the right server based on
`gnus-post-method'.
-2001-07-21 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-07-21 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-delay.el: New file.
@@ -14632,7 +14632,7 @@
(article-de-base64-unreadable, article-wash-html):
(gnus-mime-inline-part, gnus-mime-view-part-as-charset): Ditto.
-2001-07-21 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-07-21 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* nnml.el (nnml-request-post): New function. Can be used for
annotations in nnml groups.
@@ -14694,12 +14694,12 @@
* gnus-art.el (gnus-article-edit-mode): Use define-derived-mode.
-2001-07-16 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-07-16 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* message.el (message-citation-line-function): Refer to
gnus-cite-attribution-suffix.
-2001-07-15 Pavel Jan,Am(Bk <Pavel@Janik.cz>
+2001-07-15 Pavel Janík <Pavel@Janik.cz>
* gnus-art.el, ...: Error convention changes.
@@ -14712,7 +14712,7 @@
* nnrss.el (nnrss-read-group-data): Nuke emacs-lisp-mode-hook.
(nnrss-read-server-data): Ditto.
-2001-07-13 12:00:00 Pavel Jan,Am(Bk <Pavel@Janik.cz>
+2001-07-13 12:00:00 Pavel Janík <Pavel@Janik.cz>
* gnus-setup.el (gnus-use-installed-gnus): Typo.
* Cleanup files.
@@ -14757,7 +14757,7 @@
(mm-display-external): Use it. Use term to display when no
window-system.
-2001-07-12 Bj,Av(Brn Torkelsson <torkel@hpc2n.umu.se>
+2001-07-12 Björn Torkelsson <torkel@hpc2n.umu.se>
* gnus-srvr.el (gnus-browse-make-menu-bar): Changed one of the
Browse->Next entries to Browse->Prev.
@@ -14783,7 +14783,7 @@
* gnus-draft.el (gnus-draft-edit-message): Remove Date here.
(gnus-draft-setup): Remove backlog.
-2001-07-10 Pavel Jan,Am(Bk <Pavel@Janik.cz>
+2001-07-10 Pavel Janík <Pavel@Janik.cz>
* gnus-logic.el, gnus-srvr.el, gnus-vm.el, nnheaderxm.el, nnoo.el:
Cleanup.
@@ -15194,7 +15194,7 @@
* gnus-sum.el (gnus-summary-catchup): New argument.
(gnus-summary-catchup-from-here): New function.
-2001-05-30 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-05-30 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* mm-view.el (mm-inline-image-xemacs): Insert newline, then move
back, then insert glyph. (Before, the glyph was inserted first,
@@ -15398,7 +15398,7 @@
matching subjects.
(gnus-offer-save-summaries): Clean up.
-2001-04-13 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-04-13 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* nnmail.el (nnmail-split-fancy-with-parent): Add docstring.
@@ -15606,7 +15606,7 @@
* mml2015.el (mml2015-gpg-extract-from): No error.
-2001-03-18 23:00:00 Bj,Ax(Brn Mork <bmork@dod.no>
+2001-03-18 23:00:00 Bjørn Mork <bmork@dod.no>
* mml2015.el (mml2015-gpg-extract-from): New function.
(mml2015-gpg-verify): Use it.
@@ -15634,7 +15634,7 @@
`nnimap-use-nov-p' (it really tested the negative).
(nnimap-retrieve-headers): Use it.
-2001-03-11 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-03-11 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* message.el (message-generate-headers-first): Update doc.
@@ -15852,7 +15852,7 @@
* gnus-draft.el (gnus-draft-reminder): "Confirm to exit?"
-2001-02-19 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-02-19 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-sum.el (gnus-thread-sort-functions): Doc fix. Refer to
gnus-article-sort-functions.
@@ -15969,7 +15969,7 @@
(gnus-subscribe-hierarchically): Return gnus-subscribe-newsgroup's
return .
-2001-02-12 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-02-12 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-cus.el (gnus-score-customize): Doc fix.
@@ -16042,7 +16042,7 @@
* gnus-uu.el (gnus-uu-grab-articles): Shoot down original article
buffer.
-2001-02-07 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2001-02-07 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* message.el (message-generate-headers-first): Doc fix.
@@ -16557,7 +16557,7 @@
* nnfolder.el (nnfolder-existing-articles): Reversed, i.e. sorted.
(nnfolder-request-expire-articles): Use gnus-sorted-intersection.
(nnfolder-retrieve-headers): Use intersection. Suggested by Jonas
- Kvarnstr,Av(Bm <jonkv@ida.liu.se>.
+ Kvarnström <jonkv@ida.liu.se>.
2000-12-30 00:17:38 Lars Magne Ingebrigtsen <larsi@gnus.org>
@@ -16759,7 +16759,7 @@
* message.el (message-forward): Save-restriction.
-2000-12-21 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2000-12-21 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-art.el (article-treat-dumbquotes): More doc, provided by
Paul Stevenson <p.stevenson@surrey.ac.uk>
@@ -17849,10 +17849,10 @@
* message.el (message-font-lock-keywords): Use
message-cite-prefix-regexp.
-2000-11-15 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2000-11-15 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-group.el (gnus-group-jump-to-group-prompt): New variable by
- Stein Arild Str,Ax(Bmme.
+ Stein Arild Strømme.
(gnus-group-jump-to-group): Use it.
(gnus-group-jump-to-group-prompt): Customize.
@@ -17984,7 +17984,7 @@
* gnus-art.el (gnus-mime-display-alternative): Show button if no
preferred part.
-2000-11-07 Kai Gro,b_(Bjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+2000-11-07 Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* gnus-sum.el (gnus-move-split-methods): Say that
`gnus-split-methods' uses file names, whereas this uses group
@@ -18571,5 +18571,5 @@ See ChangeLog.1 for earlier changes.
along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;; Local Variables:
-;; coding: iso-2022-7bit
+;; coding: utf-8
;; End:
diff --git a/lisp/gnus/auth-source.el b/lisp/gnus/auth-source.el
index ffc6a4b78af..e94904bf175 100644
--- a/lisp/gnus/auth-source.el
+++ b/lisp/gnus/auth-source.el
@@ -1008,7 +1008,7 @@ Note that the MAX parameter is used so we can exit the parse early."
(while (and (zerop (forward-line 1))
(looking-at "$")))
(narrow-to-region (point) (point)))
- ((member elem tokens)
+ ((and (member elem tokens) (null pair))
;; Tokens that don't have a following value are ignored,
;; except "default".
(when (and pair (or (cdr pair)
diff --git a/lisp/gnus/deuglify.el b/lisp/gnus/deuglify.el
index 8ef89a9e56d..36e91980ba2 100644
--- a/lisp/gnus/deuglify.el
+++ b/lisp/gnus/deuglify.el
@@ -270,7 +270,7 @@
:group 'gnus-outlook-deuglify)
(defcustom gnus-outlook-deuglify-attrib-verb-regexp
- "wrote\\|writes\\|says\\|schrieb\\|schreibt\\|meinte\\|skrev\\|a écrit\\|schreef\\|escribió"
+ "wrote\\|writes\\|says\\|schrieb\\|schreibt\\|meinte\\|skrev\\|a écrit\\|schreef\\|escribió"
"Regular expression matching the verb used in an attribution line."
:version "22.1"
:type 'string
@@ -472,7 +472,7 @@ NODISPLAY is non-nil, don't redisplay the article buffer."
(provide 'deuglify)
;; Local Variables:
-;; coding: iso-8859-1
+;; coding: utf-8
;; End:
;;; deuglify.el ends here
diff --git a/lisp/gnus/gmm-utils.el b/lisp/gnus/gmm-utils.el
index c009ac762c5..8bafb7d0f6b 100644
--- a/lisp/gnus/gmm-utils.el
+++ b/lisp/gnus/gmm-utils.el
@@ -417,6 +417,31 @@ coding-system."
(write-region start end filename append visit lockname))
(write-region start end filename append visit lockname mustbenew)))
+;; `interactive-p' is obsolete since Emacs 23.2.
+(defmacro gmm-called-interactively-p (kind)
+ (condition-case nil
+ (progn
+ (eval '(called-interactively-p 'any))
+ ;; Emacs >=23.2
+ `(called-interactively-p ,kind))
+ ;; Emacs <23.2
+ (wrong-number-of-arguments '(called-interactively-p))
+ ;; XEmacs
+ (void-function '(interactive-p))))
+
+;; `labels' is obsolete since Emacs 24.3.
+(defmacro gmm-labels (bindings &rest body)
+ "Make temporary function bindings.
+The bindings can be recursive and the scoping is lexical, but capturing
+them in closures will only work if `lexical-binding' is in use. But in
+Emacs 24.2 and older, the lexical scoping is handled via `lexical-let'
+rather than relying on `lexical-binding'.
+
+\(fn ((FUNC ARGLIST BODY...) ...) FORM...)"
+ `(,(progn (require 'cl) (if (fboundp 'cl-labels) 'cl-labels 'labels))
+ ,bindings ,@body))
+(put 'gmm-labels 'lisp-indent-function 1)
+
(provide 'gmm-utils)
;;; gmm-utils.el ends here
diff --git a/lisp/gnus/gnus-agent.el b/lisp/gnus/gnus-agent.el
index 681ae6c0a09..1d0f346e10f 100644
--- a/lisp/gnus/gnus-agent.el
+++ b/lisp/gnus/gnus-agent.el
@@ -1489,7 +1489,8 @@ downloaded into the agent."
(defun gnus-agent-fetch-articles (group articles)
"Fetch ARTICLES from GROUP and put them into the Agent."
- (when articles
+ (when (and articles
+ (gnus-online (gnus-group-method group)))
(gnus-agent-load-alist group)
(let* ((alist gnus-agent-article-alist)
(headers (if (< (length articles) 2) nil gnus-newsgroup-headers))
diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el
index 74733356283..13d9b4e5c28 100644
--- a/lisp/gnus/gnus-art.el
+++ b/lisp/gnus/gnus-art.el
@@ -1121,8 +1121,8 @@ parts. When nil, redisplay article."
(const :tag "Header" head)))
(defvar gnus-article-treat-types '("text/plain" "text/x-verbatim"
- "text/x-patch")
- "Parts to treat.")
+ "text/x-patch" "text/html")
+ "Part types eligible for treatment.")
(defvar gnus-inhibit-treatment nil
"Whether to inhibit treatment.")
@@ -2718,7 +2718,7 @@ If READ-CHARSET, ask for a coding system."
(while (re-search-forward
"\\(\\(https?\\|ftp\\)://\\S-+\\) *\n\\(\\S-+\\)" nil t)
(replace-match "\\1\\3" t)))
- (when (interactive-p)
+ (when (gmm-called-interactively-p 'any)
(gnus-treat-article nil))))
(defun article-wash-html ()
@@ -2877,21 +2877,23 @@ message header will be added to the bodies of the \"text/html\" parts."
;; Add a meta html tag to specify charset and a header.
(cond
(header
- (let (title eheader body hcharset coding force-charset)
+ (let (title eheader body hcharset coding)
(with-temp-buffer
(mm-enable-multibyte)
(setq case-fold-search t)
(insert header "\n")
(setq title (message-fetch-field "subject"))
(goto-char (point-min))
- (while (re-search-forward "\\(<\\)\\|\\(>\\)\\|&" nil t)
+ (while (re-search-forward "\\(<\\)\\|\\(>\\)\\|\\(&\\)\\|\n"
+ nil t)
(replace-match (cond ((match-beginning 1) "&lt;")
((match-beginning 2) "&gt;")
- (t "&amp;"))))
+ ((match-beginning 3) "&amp;")
+ (t "<br>\n"))))
(goto-char (point-min))
- (insert "<pre>\n")
+ (insert "<div align=\"left\">\n")
(goto-char (point-max))
- (insert "</pre>\n<hr>\n")
+ (insert "</div>\n<hr>\n")
;; We have to examine charset one by one since
;; charset specified in parts might be different.
(if (eq charset 'gnus-decoded)
@@ -2900,8 +2902,7 @@ message header will be added to the bodies of the \"text/html\" parts."
charset)
title (when title
(mm-encode-coding-string title charset))
- body (mm-encode-coding-string content charset)
- force-charset t)
+ body (mm-encode-coding-string content charset))
(setq hcharset (mm-find-mime-charset-region (point-min)
(point-max)))
(cond ((= (length hcharset) 1)
@@ -2932,8 +2933,7 @@ message header will be added to the bodies of the \"text/html\" parts."
body (mm-encode-coding-string
(mm-decode-coding-string
content body)
- charset)
- force-charset t)))
+ charset))))
(setq charset hcharset
eheader (mm-encode-coding-string
(buffer-string) coding)
@@ -2947,7 +2947,7 @@ message header will be added to the bodies of the \"text/html\" parts."
(mm-disable-multibyte)
(insert body)
(when charset
- (mm-add-meta-html-tag handle charset force-charset))
+ (mm-add-meta-html-tag handle charset t))
(when title
(goto-char (point-min))
(unless (search-forward "<title>" nil t)
@@ -4361,6 +4361,7 @@ If variable `gnus-use-long-file-name' is non-nil, it is
(gnus-define-keys gnus-article-mode-map
" " gnus-article-goto-next-page
+ [?\S-\ ] gnus-article-goto-prev-page
"\177" gnus-article-goto-prev-page
[delete] gnus-article-goto-prev-page
[backspace] gnus-article-goto-prev-page
@@ -4539,18 +4540,17 @@ commands:
(gnus-article-mode))
(setq truncate-lines gnus-article-truncate-lines)
(current-buffer))
- (with-current-buffer (gnus-get-buffer-create name)
- (gnus-article-mode)
- (setq truncate-lines gnus-article-truncate-lines)
- (make-local-variable 'gnus-summary-buffer)
- (setq gnus-summary-buffer
- (gnus-summary-buffer-name gnus-newsgroup-name))
- (gnus-summary-set-local-parameters gnus-newsgroup-name)
- (when article-lapsed-timer
- (gnus-stop-date-timer))
- (when gnus-article-update-date-headers
- (gnus-start-date-timer gnus-article-update-date-headers))
- (current-buffer)))))
+ (let ((summary gnus-summary-buffer))
+ (with-current-buffer (gnus-get-buffer-create name)
+ (gnus-article-mode)
+ (setq truncate-lines gnus-article-truncate-lines)
+ (set (make-local-variable 'gnus-summary-buffer) summary)
+ (gnus-summary-set-local-parameters gnus-newsgroup-name)
+ (when article-lapsed-timer
+ (gnus-stop-date-timer))
+ (when gnus-article-update-date-headers
+ (gnus-start-date-timer gnus-article-update-date-headers))
+ (current-buffer))))))
(defun gnus-article-stop-animations ()
(dolist (timer (and (boundp 'timer-list)
@@ -8689,9 +8689,7 @@ For example:
gnus-mime-security-button-end-line-format))
(gnus-insert-mime-security-button handle)))
(mm-set-handle-multipart-parameter
- handle 'gnus-region
- (cons (set-marker (make-marker) (point-min))
- (set-marker (make-marker) (point-max))))
+ handle 'gnus-region (cons (point-min-marker) (point-max-marker)))
(goto-char (point-max))))
(defun gnus-mime-security-run-function (function)
diff --git a/lisp/gnus/gnus-async.el b/lisp/gnus/gnus-async.el
index 41b0cc25006..c5d64332547 100644
--- a/lisp/gnus/gnus-async.el
+++ b/lisp/gnus/gnus-async.el
@@ -254,7 +254,7 @@ that was fetched."
gnus-async-article-alist
(cons (list (intern (format "%s-%d" group article)
gnus-async-hashtb)
- mark (set-marker (make-marker) (point-max))
+ mark (point-max-marker)
group article)
gnus-async-article-alist))))
(if (not (gnus-buffer-live-p summary))
diff --git a/lisp/gnus/gnus-bookmark.el b/lisp/gnus/gnus-bookmark.el
index 5afdb064fa9..7a3d273622a 100644
--- a/lisp/gnus/gnus-bookmark.el
+++ b/lisp/gnus/gnus-bookmark.el
@@ -367,7 +367,7 @@ The leftmost column displays a D if the bookmark is flagged for
deletion, or > if it is flagged for displaying."
(interactive)
(gnus-bookmark-maybe-load-default-file)
- (if (interactive-p)
+ (if (gmm-called-interactively-p 'any)
(switch-to-buffer (get-buffer-create "*Gnus Bookmark List*"))
(set-buffer (get-buffer-create "*Gnus Bookmark List*")))
(let ((inhibit-read-only t)
diff --git a/lisp/gnus/gnus-cite.el b/lisp/gnus/gnus-cite.el
index 708b60442da..22e97cd8f4f 100644
--- a/lisp/gnus/gnus-cite.el
+++ b/lisp/gnus/gnus-cite.el
@@ -745,28 +745,14 @@ See also the documentation for `gnus-article-highlight-citation'."
(gnus-article-search-signature)
(setq total (count-lines start (point)))
(while atts
- (setq hidden (+ hidden (length (cdr (assoc (cdar atts)
- gnus-cite-prefix-alist))))
+ (setq hidden (+ hidden (length
+ (cdr (assoc (cdar atts)
+ gnus-cite-prefix-alist))))
atts (cdr atts)))
(when (or force
(and (> (* 100 hidden) (* gnus-cite-hide-percentage total))
(> hidden gnus-cite-hide-absolute)))
- (gnus-add-wash-type 'cite)
- (setq atts gnus-cite-attribution-alist)
- (while atts
- (setq total (cdr (assoc (cdar atts) gnus-cite-prefix-alist))
- atts (cdr atts))
- (while total
- (setq hidden (car total)
- total (cdr total))
- (goto-char (point-min))
- (forward-line (1- hidden))
- (unless (assq hidden gnus-cite-attribution-alist)
- (gnus-add-text-properties
- (point) (progn (forward-line 1) (point))
- (nconc (list 'article-type 'cite)
- gnus-hidden-properties)))))))))
- (gnus-set-mode-line 'article)))
+ (gnus-article-hide-citation)))))))
(defun gnus-article-hide-citation-in-followups ()
"Hide cited text in non-root articles."
@@ -1264,7 +1250,7 @@ When enabled, it automatically turns on `font-lock-mode'."
(provide 'gnus-cite)
;; Local Variables:
-;; coding: iso-8859-1
+;; coding: utf-8
;; End:
;;; gnus-cite.el ends here
diff --git a/lisp/gnus/gnus-delay.el b/lisp/gnus/gnus-delay.el
index 5c14ffcfbdf..921d24109c2 100644
--- a/lisp/gnus/gnus-delay.el
+++ b/lisp/gnus/gnus-delay.el
@@ -2,7 +2,7 @@
;; Copyright (C) 2001-2013 Free Software Foundation, Inc.
-;; Author: Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
+;; Author: Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
;; Keywords: mail, news, extensions
;; This file is part of GNU Emacs.
@@ -186,7 +186,7 @@ Checking delayed messages is skipped if optional arg NO-CHECK is non-nil."
(provide 'gnus-delay)
;; Local Variables:
-;; coding: iso-8859-1
+;; coding: utf-8
;; End:
;;; gnus-delay.el ends here
diff --git a/lisp/gnus/gnus-dired.el b/lisp/gnus/gnus-dired.el
index e5ebb39f6d2..1592d73684c 100644
--- a/lisp/gnus/gnus-dired.el
+++ b/lisp/gnus/gnus-dired.el
@@ -155,8 +155,8 @@ filenames."
(setq destination
(if (= (length bufs) 1)
(get-buffer (car bufs))
- (gnus-completing-read "Attach to which mail composition buffer"
- bufs t)))
+ (gnus-completing-read "Attach to buffer"
+ bufs t nil nil (car bufs))))
;; setup a new mail composition buffer
(let ((mail-user-agent gnus-dired-mail-mode)
;; A workaround to prevent Gnus from displaying the Gnus
diff --git a/lisp/gnus/gnus-group.el b/lisp/gnus/gnus-group.el
index 76977b7690a..2c45d3c24a1 100644
--- a/lisp/gnus/gnus-group.el
+++ b/lisp/gnus/gnus-group.el
@@ -1667,7 +1667,7 @@ and ends at END."
(let ((face (cdar (gnus-group-update-eval-form
group
gnus-group-highlight))))
- (unless (eq face (get-text-property beg 'face))
+ (unless (eq face (gnus-get-text-property-excluding-characters-with-faces beg 'face))
(let ((inhibit-read-only t))
(gnus-put-text-property-excluding-characters-with-faces
beg end 'face
@@ -2310,6 +2310,7 @@ Return the name of the group if selection was successful."
(let ((group (if (gnus-group-foreign-p group) group
(gnus-group-prefixed-name (gnus-group-real-name group)
method))))
+ (gnus-set-active group nil)
(gnus-sethash
group
`(-1 nil (,group
@@ -2441,7 +2442,7 @@ Valid input formats include:
(gnus-read-ephemeral-gmane-group group start range)))
(defcustom gnus-bug-group-download-format-alist
- '((emacs . "http://debbugs.gnu.org/%s;mboxmaint=yes;mboxstat=yes")
+ '((emacs . "http://debbugs.gnu.org/cgi/bugreport.cgi?bug=%s;mboxmaint=yes;mboxstat=yes")
(debian
. "http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=%s&mbox=yes;mboxmaint=yes"))
"Alist of symbols for bug trackers and the corresponding URL format string.
diff --git a/lisp/gnus/gnus-int.el b/lisp/gnus/gnus-int.el
index 0a02138ee58..2378b598eeb 100644
--- a/lisp/gnus/gnus-int.el
+++ b/lisp/gnus/gnus-int.el
@@ -248,17 +248,26 @@ If it is down, start it up (again)."
'denied))
(defvar gnus-backend-trace nil)
+(defvar gnus-backend-trace-elapsed nil)
-(defun gnus-open-server (gnus-command-method)
- "Open a connection to GNUS-COMMAND-METHOD."
- (when (stringp gnus-command-method)
- (setq gnus-command-method (gnus-server-to-method gnus-command-method)))
+(defun gnus-backend-trace (type form)
(when gnus-backend-trace
(with-current-buffer (get-buffer-create "*gnus trace*")
(buffer-disable-undo)
(goto-char (point-max))
(insert (format-time-string "%H:%M:%S")
- (format " %S\n" gnus-command-method))))
+ (format " %.2fs %s %S\n"
+ (if (numberp gnus-backend-trace-elapsed)
+ (- (float-time) gnus-backend-trace-elapsed)
+ 0)
+ type form))
+ (setq gnus-backend-trace-elapsed (float-time)))))
+
+(defun gnus-open-server (gnus-command-method)
+ "Open a connection to GNUS-COMMAND-METHOD."
+ (when (stringp gnus-command-method)
+ (setq gnus-command-method (gnus-server-to-method gnus-command-method)))
+ (gnus-backend-trace :opening gnus-command-method)
(let ((elem (assoc gnus-command-method gnus-opened-servers))
(server (gnus-method-to-server-name gnus-command-method)))
;; If this method was previously denied, we just return nil.
@@ -333,6 +342,7 @@ If it is down, start it up (again)."
(save-excursion
(gnus-agent-possibly-synchronize-flags-server
gnus-command-method)))
+ (gnus-backend-trace :opened gnus-command-method)
result)))))
(defun gnus-close-server (gnus-command-method)
@@ -353,9 +363,13 @@ If it is down, start it up (again)."
"Read and update infos from GNUS-COMMAND-METHOD."
(when (stringp gnus-command-method)
(setq gnus-command-method (gnus-server-to-method gnus-command-method)))
- (funcall (gnus-get-function gnus-command-method 'finish-retrieve-group-infos)
- (nth 1 gnus-command-method)
- infos data))
+ (gnus-backend-trace :finishing gnus-command-method)
+ (prog1
+ (funcall (gnus-get-function gnus-command-method
+ 'finish-retrieve-group-infos)
+ (nth 1 gnus-command-method)
+ infos data)
+ (gnus-backend-trace :finished gnus-command-method)))
(defun gnus-retrieve-group-data-early (gnus-command-method infos)
"Start early async retrieval of data from GNUS-COMMAND-METHOD."
diff --git a/lisp/gnus/gnus-msg.el b/lisp/gnus/gnus-msg.el
index c7509e858f7..fce9a3633c2 100644
--- a/lisp/gnus/gnus-msg.el
+++ b/lisp/gnus/gnus-msg.el
@@ -415,6 +415,11 @@ Thank you for your help in stamping out bugs.
(gnus-inews-make-draft-meta-information
,(gnus-group-decoded-name gnus-newsgroup-name) ',articles)))
+(autoload 'nnir-article-number "nnir" nil nil 'macro)
+(autoload 'nnir-article-group "nnir" nil nil 'macro)
+(autoload 'gnus-nnir-group-p "nnir")
+
+
(defvar gnus-article-reply nil)
(defmacro gnus-setup-message (config &rest forms)
(let ((winconf (make-symbol "gnus-setup-message-winconf"))
@@ -426,15 +431,22 @@ Thank you for your help in stamping out bugs.
`(let ((,winconf (current-window-configuration))
(,winconf-name gnus-current-window-configuration)
(,buffer (buffer-name (current-buffer)))
- (,article gnus-article-reply)
+ (,article (if (and (gnus-nnir-group-p gnus-newsgroup-name)
+ gnus-article-reply)
+ (nnir-article-number gnus-article-reply)
+ gnus-article-reply))
(,yanked gnus-article-yanked-articles)
- (,group gnus-newsgroup-name)
+ (,group (if (and (gnus-nnir-group-p gnus-newsgroup-name)
+ gnus-article-reply)
+ (nnir-article-group gnus-article-reply)
+ gnus-newsgroup-name))
(message-header-setup-hook
(copy-sequence message-header-setup-hook))
(mbl mml-buffer-list)
(message-mode-hook (copy-sequence message-mode-hook)))
(setq mml-buffer-list nil)
- (add-hook 'message-header-setup-hook 'gnus-inews-insert-gcc)
+ (add-hook 'message-header-setup-hook (lambda ()
+ (gnus-inews-insert-gcc ,group)))
;; message-newsreader and message-mailer were formerly set in
;; gnus-inews-add-send-actions, but this is too late when
;; message-generate-headers-first is used. --ansel
@@ -526,7 +538,8 @@ instead."
(message-mail to subject other-headers continue
nil yank-action send-actions return-action))
(let ((buf (current-buffer))
- (gnus-newsgroup-name (or gnus-newsgroup-name ""))
+ ;; Don't use posting styles corresponding to any existing group.
+ (gnus-newsgroup-name "")
mail-buf)
(gnus-setup-message 'message
(message-mail to subject other-headers continue
@@ -1706,7 +1719,8 @@ this is a reply."
(group (when group (gnus-group-decoded-name group)))
(var (or gnus-outgoing-message-group gnus-message-archive-group))
(gcc-self-val
- (and group (gnus-group-find-parameter group 'gcc-self)))
+ (and group (not (gnus-virtual-group-p group))
+ (gnus-group-find-parameter group 'gcc-self)))
result
(groups
(cond
@@ -1745,7 +1759,8 @@ this is a reply."
(setq var (cdr var)))
result)))
name)
- (when (or groups gcc-self-val)
+ (when (and (or groups gcc-self-val)
+ (gnus-alive-p))
(when (stringp groups)
(setq groups (list groups)))
(save-excursion
diff --git a/lisp/gnus/gnus-registry.el b/lisp/gnus/gnus-registry.el
index a0013c0ee2c..5a7dfd82d28 100644
--- a/lisp/gnus/gnus-registry.el
+++ b/lisp/gnus/gnus-registry.el
@@ -87,6 +87,12 @@
(require 'easymenu)
(require 'registry)
+;; Silence XEmacs byte compiler, which will otherwise complain about
+;; call to `eieio-persistent-read'.
+(when (featurep 'xemacs)
+ (byte-compiler-options
+ (warnings (- callargs))))
+
(defvar gnus-adaptive-word-syntax-table)
(defvar gnus-registry-dirty t
@@ -296,8 +302,14 @@ This is not required after changing `gnus-registry-cache-file'."
(condition-case nil
(progn
(gnus-message 5 "Reading Gnus registry from %s..." file)
- (setq gnus-registry-db (gnus-registry-fixup-registry
- (eieio-persistent-read file)))
+ (setq gnus-registry-db
+ (gnus-registry-fixup-registry
+ (condition-case nil
+ (with-no-warnings
+ (eieio-persistent-read file 'registry-db))
+ ;; Older EIEIO versions do not check the class name.
+ ('wrong-number-of-arguments
+ (eieio-persistent-read file)))))
(gnus-message 5 "Reading Gnus registry from %s...done" file))
(error
(gnus-message
@@ -982,7 +994,7 @@ only the last one's marks are returned."
(let* ((article (last articles))
(id (gnus-registry-fetch-message-id-fast article))
(marks (when id (gnus-registry-get-id-key id 'mark))))
- (when (interactive-p)
+ (when (gmm-called-interactively-p 'any)
(gnus-message 1 "Marks are %S" marks))
marks))
diff --git a/lisp/gnus/gnus-salt.el b/lisp/gnus/gnus-salt.el
index 2126d56bb00..48b51d2c95d 100644
--- a/lisp/gnus/gnus-salt.el
+++ b/lisp/gnus/gnus-salt.el
@@ -659,7 +659,7 @@ Two predefined functions are available:
(while (and list
(not (eval (caar list))))
(setq list (cdr list)))))
- (unless (eq (setq face (cdar list)) (get-text-property beg 'face))
+ (unless (eq (setq face (cdar list)) (gnus-get-text-property-excluding-characters-with-faces beg 'face))
(gnus-put-text-property-excluding-characters-with-faces
beg end 'face
(if (boundp face) (symbol-value face) face)))))
@@ -828,31 +828,33 @@ Two predefined functions are available:
(defun gnus-highlight-selected-tree (article)
"Highlight the selected article in the tree."
- (let ((buf (current-buffer))
- region)
- (set-buffer gnus-tree-buffer)
- (when (setq region (gnus-tree-article-region article))
- (when (or (not gnus-selected-tree-overlay)
- (gnus-extent-detached-p gnus-selected-tree-overlay))
- ;; Create a new overlay.
- (gnus-overlay-put
- (setq gnus-selected-tree-overlay
- (gnus-make-overlay (point-min) (1+ (point-min))))
- 'face gnus-selected-tree-face))
- ;; Move the overlay to the article.
- (gnus-move-overlay
- gnus-selected-tree-overlay (goto-char (car region)) (cdr region))
- (gnus-tree-minimize)
- (gnus-tree-recenter)
- (let ((selected (selected-window)))
- (when (gnus-get-buffer-window (set-buffer gnus-tree-buffer) t)
- (select-window (gnus-get-buffer-window (set-buffer gnus-tree-buffer) t))
- (gnus-horizontal-recenter)
- (select-window selected))))
-;; If we remove this save-excursion, it updates the wrong mode lines?!?
- (with-current-buffer gnus-tree-buffer
- (gnus-set-mode-line 'tree))
- (set-buffer buf)))
+ (when (buffer-live-p gnus-tree-buffer)
+ (let ((buf (current-buffer))
+ region)
+ (set-buffer gnus-tree-buffer)
+ (when (setq region (gnus-tree-article-region article))
+ (when (or (not gnus-selected-tree-overlay)
+ (gnus-extent-detached-p gnus-selected-tree-overlay))
+ ;; Create a new overlay.
+ (gnus-overlay-put
+ (setq gnus-selected-tree-overlay
+ (gnus-make-overlay (point-min) (1+ (point-min))))
+ 'face gnus-selected-tree-face))
+ ;; Move the overlay to the article.
+ (gnus-move-overlay
+ gnus-selected-tree-overlay (goto-char (car region)) (cdr region))
+ (gnus-tree-minimize)
+ (gnus-tree-recenter)
+ (let ((selected (selected-window)))
+ (when (gnus-get-buffer-window (set-buffer gnus-tree-buffer) t)
+ (select-window
+ (gnus-get-buffer-window (set-buffer gnus-tree-buffer) t))
+ (gnus-horizontal-recenter)
+ (select-window selected))))
+ ;; If we remove this save-excursion, it updates the wrong mode lines?!?
+ (with-current-buffer gnus-tree-buffer
+ (gnus-set-mode-line 'tree))
+ (set-buffer buf))))
(defun gnus-tree-highlight-article (article face)
(with-current-buffer (gnus-get-tree-buffer)
diff --git a/lisp/gnus/gnus-score.el b/lisp/gnus/gnus-score.el
index 625f2c989b2..da5c31325bd 100644
--- a/lisp/gnus/gnus-score.el
+++ b/lisp/gnus/gnus-score.el
@@ -33,6 +33,7 @@
(require 'gnus-win)
(require 'message)
(require 'score-mode)
+(require 'gmm-utils)
(defcustom gnus-global-score-files nil
"List of global score files and directories.
@@ -1718,33 +1719,37 @@ score in `gnus-newsgroup-scored' by SCORE."
nil)
(defun gnus-score-decode-text-parts ()
- (labels ((mm-text-parts (handle)
- (cond ((stringp (car handle))
- (let ((parts (mapcan #'mm-text-parts (cdr handle))))
- (if (equal "multipart/alternative" (car handle))
- ;; pick the first supported alternative
- (list (car parts))
- parts)))
-
- ((bufferp (car handle))
- (when (string-match "^text/" (mm-handle-media-type handle))
- (list handle)))
-
- (t (mapcan #'mm-text-parts handle))))
- (my-mm-display-part (handle)
- (when handle
- (save-restriction
- (narrow-to-region (point) (point))
- (mm-display-inline handle)
- (goto-char (point-max))))))
+ (gmm-labels
+ ((mm-text-parts
+ (handle)
+ (cond ((stringp (car handle))
+ (let ((parts (apply #'append
+ (mapcar #'mm-text-parts (cdr handle)))))
+ (if (equal "multipart/alternative" (car handle))
+ ;; pick the first supported alternative
+ (list (car parts))
+ parts)))
+
+ ((bufferp (car handle))
+ (when (string-match "^text/" (mm-handle-media-type handle))
+ (list handle)))
+
+ (t (apply #'append (mapcar #'mm-text-parts handle)))))
+ (my-mm-display-part
+ (handle)
+ (when handle
+ (save-restriction
+ (narrow-to-region (point) (point))
+ (mm-display-inline handle)
+ (goto-char (point-max))))))
(let (;(mm-text-html-renderer 'w3m-standalone)
- (handles (mm-dissect-buffer t)))
+ (handles (mm-dissect-buffer t)))
(save-excursion
- (article-goto-body)
- (delete-region (point) (point-max))
- (mapc #'my-mm-display-part (mm-text-parts handles))
- handles))))
+ (article-goto-body)
+ (delete-region (point) (point-max))
+ (mapc #'my-mm-display-part (mm-text-parts handles))
+ handles))))
(defun gnus-score-body (scores header now expire &optional trace)
(if gnus-agent-fetching
diff --git a/lisp/gnus/gnus-spec.el b/lisp/gnus/gnus-spec.el
index c355b9a551f..2606b8860af 100644
--- a/lisp/gnus/gnus-spec.el
+++ b/lisp/gnus/gnus-spec.el
@@ -265,7 +265,14 @@ Return a list of updated types."
(defun gnus-face-face-function (form type)
`(gnus-add-text-properties
(point) (progn ,@form (point))
- '(gnus-face t face ,(symbol-value (intern (format "gnus-face-%d" type))))))
+ (cons 'face
+ (cons
+ ;; Delay consing the value of the `face' property until
+ ;; `gnus-add-text-properties' runs, since it will be modified
+ ;; by `gnus-put-text-property-excluding-characters-with-faces'.
+ (list ',(symbol-value (intern (format "gnus-face-%d" type))) 'default)
+ ;; Redundant now, but still convenient.
+ '(gnus-face t)))))
(defun gnus-balloon-face-function (form type)
`(gnus-put-text-property
@@ -411,7 +418,7 @@ characters when given a pad value."
;; them will have the balloon-help text property.
(let ((case-fold-search nil))
(if (string-match
- "\\`\\(.*\\)%[0-9]?[{(«]\\(.*\\)%[0-9]?[»})]\\(.*\n?\\)\\'\\|%[-0-9]*=\\|%[-0-9]*\\*"
+ "\\`\\(.*\\)%[0-9]?[{(«]\\(.*\\)%[0-9]?[»})]\\(.*\n?\\)\\'\\|%[-0-9]*=\\|%[-0-9]*\\*"
format)
(gnus-parse-complex-format format spec-alist)
;; This is a simple format.
@@ -428,13 +435,13 @@ characters when given a pad value."
(goto-char (point-min))
(insert "(\"")
;; Convert all font specs into font spec lists.
- (while (re-search-forward "%\\([0-9]+\\)?\\([«»{}()]\\)" nil t)
+ (while (re-search-forward "%\\([0-9]+\\)?\\([«»{}()]\\)" nil t)
(let ((number (if (match-beginning 1)
(match-string 1) "0"))
(delim (aref (match-string 2) 0)))
(if (or (= delim ?\()
(= delim ?\{)
- (= delim ?\«))
+ (= delim ?\«))
(replace-match (concat "\"("
(cond ((= delim ?\() "mouse")
((= delim ?\{) "face")
@@ -726,7 +733,7 @@ If PROPS, insert the result."
(provide 'gnus-spec)
;; Local Variables:
-;; coding: iso-8859-1
+;; coding: utf-8
;; End:
;;; gnus-spec.el ends here
diff --git a/lisp/gnus/gnus-srvr.el b/lisp/gnus/gnus-srvr.el
index 8493c8871a9..69774587d80 100644
--- a/lisp/gnus/gnus-srvr.el
+++ b/lisp/gnus/gnus-srvr.el
@@ -713,6 +713,7 @@ claim them."
"q" gnus-browse-exit
"Q" gnus-browse-exit
"d" gnus-browse-describe-group
+ [delete] gnus-browse-delete-group
"\C-c\C-c" gnus-browse-exit
"?" gnus-browse-describe-briefly
@@ -964,6 +965,16 @@ how new groups will be entered into the group buffer."
(interactive (list (gnus-browse-group-name)))
(gnus-group-describe-group nil group))
+(defun gnus-browse-delete-group (group force)
+ "Delete the current group. Only meaningful with editable groups.
+If FORCE (the prefix) is non-nil, all the articles in the group will
+be deleted. This is \"deleted\" as in \"removed forever from the face
+of the Earth\". There is no undo. The user will be prompted before
+doing the deletion."
+ (interactive (list (gnus-browse-group-name)
+ current-prefix-arg))
+ (gnus-group-delete-group group force))
+
(defun gnus-browse-unsubscribe-group ()
"Toggle subscription of the current group in the browse buffer."
(let ((sub nil)
diff --git a/lisp/gnus/gnus-start.el b/lisp/gnus/gnus-start.el
index c9896bf2754..48bb99bfbce 100644
--- a/lisp/gnus/gnus-start.el
+++ b/lisp/gnus/gnus-start.el
@@ -110,7 +110,7 @@ ask the servers (primary, secondary, and archive servers) to list new
groups since the last time it checked:
1. This variable is `ask-server'.
2. This variable is a list of select methods (see below).
- 3. `gnus-read-active-file' is nil or `some'.
+ 3. Option `gnus-read-active-file' is nil or `some'.
4. A prefix argument is given to `gnus-find-new-newsgroups' interactively.
Thus, if this variable is `ask-server' or a list of select methods or
@@ -395,7 +395,16 @@ This hook is called after Gnus is connected to the NNTP server."
(defcustom gnus-before-startup-hook nil
"A hook called before startup.
-This hook is called as the first thing when Gnus is started."
+This hook is called as the first thing when Gnus is started.
+See also `gnus-before-resume-hook'."
+ :group 'gnus-start
+ :type 'hook)
+
+(defcustom gnus-before-resume-hook nil
+ "A hook called before resuming Gnus after suspend.
+This hook is called as the first thing when Gnus is resumed after a suspend.
+See also `gnus-before-startup-hook'."
+ :version "24.4"
:group 'gnus-start
:type 'hook)
@@ -749,6 +758,7 @@ prompt the user for the name of an NNTP server to use."
(if (gnus-alive-p)
(progn
+ (gnus-run-hooks 'gnus-before-resume-hook)
(switch-to-buffer gnus-group-buffer)
(gnus-group-get-new-news
(and (numberp arg)
diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index 32ef7029456..e6366e775df 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -451,7 +451,7 @@ current article is unread."
:group 'gnus-summary-maneuvering
:type 'boolean)
-(defcustom gnus-auto-center-summary
+(defcustom gnus-auto-center-summary
(max (or (bound-and-true-p scroll-margin) 0) 2)
"*If non-nil, always center the current summary buffer.
In particular, if `vertical' do only vertical recentering. If non-nil
@@ -1167,7 +1167,7 @@ using `gnus-ignored-from-addresses'."
(defcustom gnus-summary-newsgroup-prefix "=> "
"*String prefixed to the Newsgroup field in the summary
-line when using `gnus-ignored-from-addresses'."
+line when using the option `gnus-ignored-from-addresses'."
:version "22.1"
:group 'gnus-summary
:type 'string)
@@ -1819,6 +1819,7 @@ increase the score of each group you read."
(gnus-define-keys gnus-summary-mode-map
" " gnus-summary-next-page
+ [?\S-\ ] gnus-summary-prev-page
"\177" gnus-summary-prev-page
[delete] gnus-summary-prev-page
[backspace] gnus-summary-prev-page
@@ -2058,6 +2059,7 @@ increase the score of each group you read."
(gnus-define-keys (gnus-summary-article-map "A" gnus-summary-mode-map)
" " gnus-summary-next-page
"n" gnus-summary-next-page
+ [?\S-\ ] gnus-summary-prev-page
"\177" gnus-summary-prev-page
[delete] gnus-summary-prev-page
"p" gnus-summary-prev-page
@@ -3493,8 +3495,8 @@ If the setup was successful, non-nil is returned."
(set-buffer buffer)
(setq gnus-summary-buffer (current-buffer))
(not gnus-newsgroup-prepared))
- ;; Fix by Sudish Joseph <joseph@cis.ohio-state.edu>
- (setq gnus-summary-buffer (set-buffer (gnus-get-buffer-create buffer)))
+ (set-buffer (gnus-get-buffer-create buffer))
+ (setq gnus-summary-buffer (current-buffer))
(gnus-summary-mode group)
(when (gnus-group-quit-config group)
(set (make-local-variable 'gnus-single-article-buffer) nil))
@@ -3552,11 +3554,7 @@ buffer that was in action when the last article was fetched."
(if (consp (car locals))
(set (caar locals) (pop vlist))
(set (car locals) (pop vlist)))
- (setq locals (cdr locals))))
- ;; The article buffer also has local variables.
- (when (gnus-buffer-live-p gnus-article-buffer)
- (set-buffer gnus-article-buffer)
- (setq gnus-summary-buffer summary))))))
+ (setq locals (cdr locals))))))))
(defun gnus-summary-article-unread-p (article)
"Say whether ARTICLE is unread or not."
@@ -3655,17 +3653,18 @@ buffer that was in action when the last article was fetched."
(or (car (funcall gnus-extract-address-components from))
from))
-(defun gnus-summary-from-or-to-or-newsgroups (header gnus-tmp-from)
+(defun gnus-summary-from-or-to-or-newsgroups (header from)
(let ((mail-parse-charset gnus-newsgroup-charset)
- (ignored-from-addresses (gnus-ignored-from-addresses))
- ; Is it really necessary to do this next part for each summary line?
- ; Luckily, doesn't seem to slow things down much.
- (mail-parse-ignored-charsets
- (with-current-buffer gnus-summary-buffer
- gnus-newsgroup-ignored-charsets)))
+ (ignored-from-addresses (gnus-ignored-from-addresses))
+ ;; Is it really necessary to do this next part for each summary line?
+ ;; Luckily, doesn't seem to slow things down much.
+ (mail-parse-ignored-charsets
+ (with-current-buffer gnus-summary-buffer
+ gnus-newsgroup-ignored-charsets))
+ (address (cadr (gnus-extract-address-components from))))
(or
(and ignored-from-addresses
- (string-match ignored-from-addresses gnus-tmp-from)
+ (string-match ignored-from-addresses address)
(let ((extra-headers (mail-header-extra header))
to
newsgroups)
@@ -3684,9 +3683,7 @@ buffer that was in action when the last article was fetched."
gnus-newsgroup-name)) 'nntp)
(gnus-group-real-name gnus-newsgroup-name))))
(concat gnus-summary-newsgroup-prefix newsgroups)))))
- (gnus-string-mark-left-to-right
- (inline
- (gnus-summary-extract-address-component gnus-tmp-from))))))
+ (gnus-string-mark-left-to-right (gnus-summary-extract-address-component from)))))
(defun gnus-summary-insert-line (gnus-tmp-header
gnus-tmp-level gnus-tmp-current
@@ -4063,9 +4060,10 @@ If SELECT-ARTICLES, only select those articles from GROUP."
gnus-auto-select-first)
(progn
(let ((art (gnus-summary-article-number)))
- (unless (and (not gnus-plugged)
- (or (memq art gnus-newsgroup-undownloaded)
- (memq art gnus-newsgroup-downloadable)))
+ (when (and art
+ gnus-plugged
+ (not (memq art gnus-newsgroup-undownloaded))
+ (not (memq art gnus-newsgroup-downloadable)))
(gnus-summary-goto-article art))))
;; Don't select any articles.
(gnus-summary-position-point)
@@ -7874,7 +7872,6 @@ If STOP is non-nil, just stop when reaching the end of the message.
Also see the variable `gnus-article-skip-boring'."
(interactive "P")
- (setq gnus-summary-buffer (current-buffer))
(gnus-set-global-variables)
(let ((article (gnus-summary-article-number))
(article-window (get-buffer-window gnus-article-buffer t))
@@ -9791,7 +9788,7 @@ installed for this command to work."
(when (message-goto-body)
(gnus-narrow-to-body))
(goto-char (point-min))
- (while (search-forward "·" (point-max) t)
+ (while (search-forward "·" (point-max) t)
(replace-match "."))
(unmorse-region (point-min) (point-max))
(widen)
@@ -10127,17 +10124,20 @@ ACTION can be either `move' (the default), `crosspost' or `copy'."
(defun gnus-summary-push-marks-to-backend (article)
(let ((set nil)
+ (del nil)
(marks gnus-article-mark-lists))
(unless (memq article gnus-newsgroup-unreads)
(push 'read set))
(while marks
- (when (and (eq (gnus-article-mark-to-type (cdar marks)) 'list)
- (memq article (symbol-value
- (intern (format "gnus-newsgroup-%s"
- (caar marks))))))
- (push (cdar marks) set))
+ (if (and (eq (gnus-article-mark-to-type (cdar marks)) 'list)
+ (memq article (symbol-value
+ (intern (format "gnus-newsgroup-%s"
+ (caar marks))))))
+ (push (cdar marks) set)
+ (push (cdar marks) del))
(pop marks))
- (gnus-request-set-mark gnus-newsgroup-name `(((,article) set ,set)))))
+ (gnus-request-set-mark gnus-newsgroup-name `(((,article) set ,set)
+ ((,article) del ,del)))))
(defun gnus-summary-copy-article (&optional n to-newsgroup select-method)
"Copy the current article to some other group.
@@ -11647,10 +11647,10 @@ If PREDICATE is supplied, threads that satisfy this predicate
will not be hidden.
Returns nil if no threads were there to be hidden."
(interactive)
+ (beginning-of-line)
(let ((start (point))
(starteol (line-end-position))
(article (gnus-summary-article-number)))
- (goto-char start)
;; Go forward until either the buffer ends or the subthread ends.
(when (and (not (eobp))
(or (zerop (gnus-summary-next-thread 1 t))
@@ -12521,7 +12521,7 @@ If REVERSE, save parts that do not match TYPE."
(memq article gnus-newsgroup-undownloaded)
(not (memq article gnus-newsgroup-cached)))))
(let ((face (funcall (gnus-summary-highlight-line-0))))
- (unless (eq face (get-text-property beg 'face))
+ (unless (eq face (gnus-get-text-property-excluding-characters-with-faces beg 'face))
(gnus-put-text-property-excluding-characters-with-faces
beg (point-at-eol) 'face
(setq face (if (boundp face) (symbol-value face) face)))
@@ -12775,7 +12775,7 @@ returned."
(setq gnus-newsgroup-headers
(gnus-merge 'list
gnus-newsgroup-headers
- (gnus-fetch-headers articles)
+ (gnus-fetch-headers articles nil t)
'gnus-article-sort-by-number))
(setq gnus-newsgroup-articles
(gnus-sorted-nunion gnus-newsgroup-articles articles))
@@ -12978,7 +12978,7 @@ BOOKMARK is a bookmark name or a bookmark record."
(run-hooks 'gnus-sum-load-hook)
;; Local Variables:
-;; coding: iso-8859-1
+;; coding: utf-8
;; End:
;;; gnus-sum.el ends here
diff --git a/lisp/gnus/gnus-sync.el b/lisp/gnus/gnus-sync.el
index 3d20c238a5e..8cf92df5b91 100644
--- a/lisp/gnus/gnus-sync.el
+++ b/lisp/gnus/gnus-sync.el
@@ -112,8 +112,9 @@ this setting is harmless until the user chooses a sync backend."
(defcustom gnus-sync-newsrc-offsets '(2 3)
"List of per-group data to be synchronized."
:group 'gnus-sync
+ :version "24.4"
:type '(set (const :tag "Read ranges" 2)
- (const :tag "Marks" 3)))
+ (const :tag "Marks" 3)))
(defcustom gnus-sync-global-vars nil
"List of global variables to be synchronized.
@@ -137,6 +138,11 @@ and `gnus-topic-alist'. Also see `gnus-variable-list'."
(defvar gnus-sync-newsrc-loader nil
"Carrier for newsrc data")
+(defcustom gnus-sync-file-encrypt-to nil
+ "If non-nil, `epa-file-encrypt-to' is set from this for encrypting the Sync
+ file."
+ :group 'gnus-sync)
+
(defcustom gnus-sync-lesync-name (system-name)
"The LeSync name for this machine."
:group 'gnus-sync
@@ -175,16 +181,15 @@ and `gnus-topic-alist'. Also see `gnus-variable-list'."
(defun gnus-sync-lesync-call (url method headers &optional kvdata)
"Make an access request to URL using KVDATA and METHOD.
KVDATA must be an alist."
- (flet ((json-alist-p (list) (gnus-sync-json-alist-p list))) ; temp patch
- (let ((url-request-method method)
- (url-request-extra-headers headers)
- (url-request-data (if kvdata (json-encode kvdata) nil)))
- (with-current-buffer (url-retrieve-synchronously url)
- (let ((data (gnus-sync-lesync-parse)))
- (gnus-message 12 "gnus-sync-lesync-call: %s URL %s sent %S got %S"
- method url `((headers . ,headers) (data ,kvdata)) data)
- (kill-buffer (current-buffer))
- data)))))
+ (let ((url-request-method method)
+ (url-request-extra-headers headers)
+ (url-request-data (if kvdata (json-encode kvdata) nil)))
+ (with-current-buffer (url-retrieve-synchronously url)
+ (let ((data (gnus-sync-lesync-parse)))
+ (gnus-message 12 "gnus-sync-lesync-call: %s URL %s sent %S got %S"
+ method url `((headers . ,headers) (data ,kvdata)) data)
+ (kill-buffer (current-buffer))
+ data))))
(defun gnus-sync-lesync-PUT (url headers &optional data)
(gnus-sync-lesync-call url "PUT" headers data))
@@ -762,6 +767,9 @@ With a prefix, FORCE is set and all groups will be saved."
(progn
(let ((coding-system-for-write gnus-ding-file-coding-system)
(standard-output (current-buffer)))
+ (when gnus-sync-file-encrypt-to
+ (set (make-local-variable 'epa-file-encrypt-to)
+ gnus-sync-file-encrypt-to))
(princ (format ";; -*- mode:emacs-lisp; coding: %s; -*-\n"
gnus-ding-file-coding-system))
(princ ";; Gnus sync data v. 0.0.1\n")
diff --git a/lisp/gnus/gnus-util.el b/lisp/gnus/gnus-util.el
index 6f00eec786d..331f9556710 100644
--- a/lisp/gnus/gnus-util.el
+++ b/lisp/gnus/gnus-util.el
@@ -225,7 +225,7 @@ is slower."
(defun gnus-goto-colon ()
- (beginning-of-line)
+ (move-beginning-of-line 1)
(let ((eol (point-at-eol)))
(goto-char (or (text-property-any (point) eol 'gnus-position t)
(search-forward ":" eol t)
@@ -333,6 +333,13 @@ TIME defaults to the current time."
(defmacro gnus-define-keys (keymap &rest plist)
"Define all keys in PLIST in KEYMAP."
+ ;; Convert the key [?\S-\ ] to [(shift space)] for XEmacs.
+ (when (featurep 'xemacs)
+ (let ((bindings plist))
+ (while bindings
+ (when (equal (car bindings) [?\S-\ ])
+ (setcar bindings [(shift space)]))
+ (setq bindings (cddr bindings)))))
`(gnus-define-keys-1 (quote ,keymap) (quote ,plist)))
(defmacro gnus-define-keys-safe (keymap &rest plist)
@@ -866,18 +873,29 @@ If there's no subdirectory, delete DIRECTORY as well."
(setq beg (point)))
(gnus-overlay-put (gnus-make-overlay beg (point)) prop val)))))
-(defun gnus-put-text-property-excluding-characters-with-faces (beg end
- prop val)
- "The same as `put-text-property', but don't put props on characters with the `gnus-face' property."
- (let ((b beg))
- (while (/= b end)
- (when (get-text-property b 'gnus-face)
- (setq b (next-single-property-change b 'gnus-face nil end)))
- (when (/= b end)
+(defun gnus-put-text-property-excluding-characters-with-faces (beg end prop val)
+ "The same as `put-text-property', except where `gnus-face' is set.
+If so, and PROP is `face', set the second element of its value to VAL.
+Otherwise, do nothing."
+ (while (< beg end)
+ ;; Property values are compared with `eq'.
+ (let ((stop (next-single-property-change beg 'face nil end)))
+ (if (get-text-property beg 'gnus-face)
+ (when (eq prop 'face)
+ (setcar (cdr (get-text-property beg 'face)) (or val 'default)))
(inline
- (gnus-put-text-property
- b (setq b (next-single-property-change b 'gnus-face nil end))
- prop val))))))
+ (gnus-put-text-property beg stop prop val)))
+ (setq beg stop))))
+
+(defun gnus-get-text-property-excluding-characters-with-faces (pos prop)
+ "The same as `get-text-property', except where `gnus-face' is set.
+If so, and PROP is `face', return the second element of its value.
+Otherwise, return the value."
+ (let ((val (get-text-property pos prop)))
+ (if (and (get-text-property pos 'gnus-face)
+ (eq prop 'face))
+ (cadr val)
+ (get-text-property pos prop))))
(defmacro gnus-faces-at (position)
"Return a list of faces at POSITION."
@@ -1938,27 +1956,6 @@ to case differences."
(string-equal (downcase str1) (downcase prefix))
(string-equal str1 prefix))))))
-(eval-and-compile
- (if (fboundp 'macroexpand-all)
- (defalias 'gnus-macroexpand-all 'macroexpand-all)
- (defun gnus-macroexpand-all (form &optional environment)
- "Return result of expanding macros at all levels in FORM.
-If no macros are expanded, FORM is returned unchanged.
-The second optional arg ENVIRONMENT specifies an environment of macro
-definitions to shadow the loaded ones for use in file byte-compilation."
- (if (consp form)
- (let ((idx 1)
- (len (length (setq form (copy-sequence form))))
- expanded)
- (while (< idx len)
- (setcar (nthcdr idx form) (gnus-macroexpand-all (nth idx form)
- environment))
- (setq idx (1+ idx)))
- (if (eq (setq expanded (macroexpand form environment)) form)
- form
- (gnus-macroexpand-all expanded environment)))
- form))))
-
;; Simple check: can be a macro but this way, although slow, it's really clear.
;; We don't use `bound-and-true-p' because it's not in XEmacs.
(defun gnus-bound-and-true-p (sym)
diff --git a/lisp/gnus/gnus.el b/lisp/gnus/gnus.el
index d0e8d805206..ffb4694f4a8 100644
--- a/lisp/gnus/gnus.el
+++ b/lisp/gnus/gnus.el
@@ -2495,7 +2495,16 @@ Disabling the agent may result in noticeable loss of performance."
:type 'boolean)
(defcustom gnus-other-frame-function 'gnus
- "Function called by the command `gnus-other-frame'."
+ "Function called by the command `gnus-other-frame' when starting Gnus."
+ :group 'gnus-start
+ :type '(choice (function-item gnus)
+ (function-item gnus-no-server)
+ (function-item gnus-slave)
+ (function-item gnus-slave-no-server)))
+
+(defcustom gnus-other-frame-resume-function 'gnus-group-get-new-news
+ "Function called by the command `gnus-other-frame' when resuming Gnus."
+ :version "24.4"
:group 'gnus-start
:type '(choice (function-item gnus)
(function-item gnus-no-server)
@@ -4348,13 +4357,22 @@ server."
(interactive "P")
(gnus arg nil 'slave))
+(defun gnus-delete-gnus-frame ()
+ "Delete gnus frame unless it is the only one.
+Used for `gnus-exit-gnus-hook' in `gnus-other-frame'."
+ (when (and (frame-live-p gnus-other-frame-object)
+ (cdr (frame-list)))
+ (delete-frame gnus-other-frame-object))
+ (setq gnus-other-frame-object nil))
+
;;;###autoload
(defun gnus-other-frame (&optional arg display)
"Pop up a frame to read news.
This will call one of the Gnus commands which is specified by the user
option `gnus-other-frame-function' (default `gnus') with the argument
-ARG if Gnus is not running, otherwise just pop up a Gnus frame. The
-optional second argument DISPLAY should be a standard display string
+ARG if Gnus is not running, otherwise pop up a Gnus frame and run the
+command specified by `gnus-other-frame-resume-function'.
+The optional second argument DISPLAY should be a standard display string
such as \"unix:0\" to specify where to pop up a frame. If DISPLAY is
omitted or the function `make-frame-on-display' is not available, the
current display is used."
@@ -4386,14 +4404,16 @@ current display is used."
(make-frame-on-display display gnus-other-frame-parameters)
(make-frame gnus-other-frame-parameters))))
(if alive
- (switch-to-buffer gnus-group-buffer)
+ (progn (switch-to-buffer gnus-group-buffer)
+ (funcall gnus-other-frame-resume-function arg))
(funcall gnus-other-frame-function arg)
- (add-hook 'gnus-exit-gnus-hook
- (lambda nil
- (when (and (frame-live-p gnus-other-frame-object)
- (cdr (frame-list)))
- (delete-frame gnus-other-frame-object))
- (setq gnus-other-frame-object nil)))))))
+ (add-hook 'gnus-exit-gnus-hook 'gnus-delete-gnus-frame)
+ ;; One might argue that `gnus-delete-gnus-frame' should not be called
+ ;; from `gnus-suspend-gnus-hook', but, on the other hand, one might
+ ;; argue that it should. No matter what you think, for the sake of
+ ;; those who want it to be called from it, please keep (defun
+ ;; gnus-delete-gnus-frame) even if you remove the next `add-hook'.
+ (add-hook 'gnus-suspend-gnus-hook 'gnus-delete-gnus-frame)))))
;;;###autoload
(defun gnus (&optional arg dont-connect slave)
diff --git a/lisp/gnus/html2text.el b/lisp/gnus/html2text.el
index 4e05f1abb40..68e75196c87 100644
--- a/lisp/gnus/html2text.el
+++ b/lisp/gnus/html2text.el
@@ -1,4 +1,4 @@
-;;; html2text.el --- a simple html to plain text converter
+;;; html2text.el --- a simple html to plain text converter -*- coding: utf-8 -*-
;; Copyright (C) 2002-2013 Free Software Foundation, Inc.
@@ -65,14 +65,14 @@
("&ndash;" . "-")
("&permil;" . "%%")
("&plusmn;" . "+-")
- ("&pound;" . "£")
+ ("&pound;" . "£")
("&quot;" . "\"")
("&raquo;" . ">>")
("&rdquo" . "\"")
("&reg;" . "(R)")
("&rsaquo;" . ")")
("&rsquo;" . "'")
- ("&sect;" . "§")
+ ("&sect;" . "§")
("&sup1;" . "^1")
("&sup2;" . "^2")
("&sup3;" . "^3")
diff --git a/lisp/gnus/mail-source.el b/lisp/gnus/mail-source.el
index c53968db352..9cc2e6ac09c 100644
--- a/lisp/gnus/mail-source.el
+++ b/lisp/gnus/mail-source.el
@@ -63,7 +63,7 @@
This variable is a list of mail source specifiers.
See Info node `(gnus)Mail Source Specifiers'."
:group 'mail-source
- :version "23.1" ;; No Gnus
+ :version "24.4"
:link '(custom-manual "(gnus)Mail Source Specifiers")
:type `(choice
(const :tag "None" nil)
@@ -159,7 +159,18 @@ See Info node `(gnus)Mail Source Specifiers'."
:value nil
(const :tag "Clear" nil)
(const starttls)
- (const :tag "SSL/TLS" ssl)))))
+ (const :tag "SSL/TLS" ssl)))
+ (group :inline t
+ (const :format "" :value :leave)
+ (choice :format "\
+%{Leave mail on server%}:\n\t\t%[Value Menu%] %v"
+ :value nil
+ (const :tag "\
+Don't leave mails" nil)
+ (const :tag "\
+Leave all mails" t)
+ (number :tag "\
+Leave mails for this many days" :value 14)))))
(cons :tag "Maildir (qmail, postfix...)"
(const :format "" maildir)
(checklist :tag "Options" :greedy t
@@ -340,7 +351,8 @@ Common keywords should be listed here.")
(:function)
(:password)
(:authentication password)
- (:stream nil))
+ (:stream nil)
+ (:leave))
(maildir
(:path (or (getenv "MAILDIR") "~/Maildir/"))
(:subdirs ("cur" "new"))
@@ -825,7 +837,8 @@ Deleting old (> %s day(s)) incoming mail file `%s'." diff bfile)
(pop3-port port)
(pop3-authentication-scheme
(if (eq authentication 'apop) 'apop 'pass))
- (pop3-stream-type stream))
+ (pop3-stream-type stream)
+ (pop3-leave-mail-on-server leave))
(if (or debug-on-quit debug-on-error)
(save-excursion (pop3-movemail mail-source-crash-box))
(condition-case err
diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el
index 4e40b1afaa6..2b2a0a94413 100644
--- a/lisp/gnus/message.el
+++ b/lisp/gnus/message.el
@@ -264,7 +264,7 @@ This is a list of regexps and regexp matches."
:type 'sexp)
(defcustom message-ignored-news-headers
- "^NNTP-Posting-Host:\\|^Xref:\\|^[BGF]cc:\\|^Resent-Fcc:\\|^X-Draft-From:\\|^X-Gnus-Agent-Meta-Information:"
+ "^NNTP-Posting-Host:\\|^Xref:\\|^[BGF]cc:\\|^Resent-Fcc:\\|^X-Draft-From:\\|^X-Gnus-Agent-Meta-Information:\\|^X-Message-SMTP-Method:"
"*Regexp of headers to be removed unconditionally before posting."
:group 'message-news
:group 'message-headers
@@ -592,8 +592,10 @@ Done before generating the new subject of a forward."
;; comes back to you (e.g. a mailing-list to which you subscribe, in which
;; case you may be removed from the list on the grounds that mail to you
;; bounced with a "mailing loop" error).
- "^Return-receipt\\|^X-Gnus\\|^Gnus-Warning:\\|^>?From \\|^Delivered-To:"
+ "^Return-receipt\\|^X-Gnus\\|^Gnus-Warning:\\|^>?From \\|^Delivered-To:\
+\\|^X-Content-Length:\\|^X-UIDL:"
"*All headers that match this regexp will be deleted when resending a message."
+ :version "24.4"
:group 'message-interface
:link '(custom-manual "(message)Resending")
:type '(repeat :value-to-internal (lambda (widget value)
@@ -1741,7 +1743,7 @@ no, only reply back to the author."
(file-error))
(mm-coding-system-p 'utf-8)
(executable-find idna-program)
- (string= (idna-to-ascii "räksmörgås")
+ (string= (idna-to-ascii "räksmörgås")
"xn--rksmrgs-5wao1o")
t)
"Whether to encode non-ASCII in domain names into ASCII according to IDNA.
@@ -3135,22 +3137,10 @@ M-RET `message-newline-and-reformat' (break the line and reformat)."
(push-mark)
(message-position-on-field "Summary" "Subject"))
-(eval-when-compile
- (defmacro message-called-interactively-p (kind)
- (condition-case nil
- (progn
- (eval '(called-interactively-p 'any))
- ;; Emacs >=23.2
- `(called-interactively-p ,kind))
- ;; Emacs <23.2
- (wrong-number-of-arguments '(called-interactively-p))
- ;; XEmacs
- (void-function '(interactive-p)))))
-
(defun message-goto-body ()
"Move point to the beginning of the message body."
(interactive)
- (when (and (message-called-interactively-p 'any)
+ (when (and (gmm-called-interactively-p 'any)
(looking-at "[ \t]*\n"))
(expand-abbrev))
(push-mark)
@@ -3824,7 +3814,9 @@ prefix, and don't delete any headers."
(interactive "P")
;; eval the let forms contained in message-cite-style
(eval
- `(let ,message-cite-style
+ `(let ,(if (symbolp message-cite-style)
+ (symbol-value message-cite-style)
+ message-cite-style)
(message--yank-original-internal ',arg))))
(defun message-yank-buffer (buffer)
@@ -4105,11 +4097,9 @@ Instead, just auto-save the buffer and then bury it."
(defun message-bury (buffer)
"Bury this mail BUFFER."
- (if message-return-action
- (progn
- (bury-buffer buffer)
- (apply (car message-return-action) (cdr message-return-action)))
- (with-current-buffer buffer (bury-buffer))))
+ (bury-buffer buffer)
+ (when message-return-action
+ (apply (car message-return-action) (cdr message-return-action))))
(defun message-send (&optional arg)
"Send the message in the current buffer.
@@ -6728,11 +6718,16 @@ The function is called with one parameter, a cons cell ..."
", "))
mct (message-fetch-field "mail-copies-to")
author (or (message-fetch-field "mail-reply-to")
- (message-fetch-field "reply-to")
- (message-fetch-field "from")
- "")
+ (message-fetch-field "reply-to"))
mft (and message-use-mail-followup-to
- (message-fetch-field "mail-followup-to"))))
+ (message-fetch-field "mail-followup-to")))
+ ;; Make sure this message goes to the author if this is a wide
+ ;; reply, since Reply-To address may be a list address a mailing
+ ;; list server added.
+ (when (and wide author)
+ (setq cc (concat author ", " cc)))
+ (when (or wide (not author))
+ (setq author (or (message-fetch-field "from") ""))))
;; Handle special values of Mail-Copies-To.
(when mct
@@ -7379,12 +7374,13 @@ Optional DIGEST will use digest to forward."
(dolist (elem ignored)
(message-remove-header elem t))))))
-(defun message-forward-make-body-mime (forward-buffer)
+(defun message-forward-make-body-mime (forward-buffer &optional beg end)
(let ((b (point)))
(insert "\n\n<#part type=message/rfc822 disposition=inline raw=t>\n")
(save-restriction
(narrow-to-region (point) (point))
- (mml-insert-buffer forward-buffer)
+ (insert-buffer-substring forward-buffer beg end)
+ (mml-quote-region (point-min) (point-max))
(goto-char (point-min))
(when (looking-at "From ")
(replace-match "X-From-Line: "))
@@ -8134,8 +8130,7 @@ regexp VARSTR."
(if (fboundp 'mail-abbrevs-setup)
(let ((minibuffer-setup-hook 'mail-abbrevs-setup)
(minibuffer-local-map message-minibuffer-local-map))
- (flet ((mail-abbrev-in-expansion-header-p nil t))
- (read-from-minibuffer prompt initial-contents)))
+ (read-from-minibuffer prompt initial-contents))
(let ((minibuffer-setup-hook 'mail-abbrev-minibuffer-setup-hook)
(minibuffer-local-map message-minibuffer-local-map))
(read-string prompt initial-contents))))
@@ -8424,7 +8419,7 @@ Used in `message-simplify-recipients'."
(run-hooks 'message-load-hook)
;; Local Variables:
-;; coding: iso-8859-1
+;; coding: utf-8
;; End:
;;; message.el ends here
diff --git a/lisp/gnus/mm-decode.el b/lisp/gnus/mm-decode.el
index b5e4d3e38e8..04f325633ba 100644
--- a/lisp/gnus/mm-decode.el
+++ b/lisp/gnus/mm-decode.el
@@ -1298,14 +1298,26 @@ PROMPT overrides the default one used to ask user for a file name."
(when filename
(setq filename (gnus-map-function mm-file-name-rewrite-functions
(file-name-nondirectory filename))))
- (setq file
- (read-file-name
- (or prompt
- (format "Save MIME part to (default %s): "
- (or filename "")))
- (or mm-default-directory default-directory)
- (expand-file-name (or filename "")
- (or mm-default-directory default-directory))))
+ (while
+ (progn
+ (setq file
+ (read-file-name
+ (or prompt
+ (format "Save MIME part to (default %s): "
+ (or filename "")))
+ (or mm-default-directory default-directory)
+ (expand-file-name (or filename "")
+ (or mm-default-directory default-directory))))
+ (cond ((or (not file) (equal file ""))
+ (message "Please enter a file name")
+ t)
+ ((and (file-directory-p file)
+ (not filename))
+ (message "Please enter a non-directory file name")
+ t)
+ (t nil)))
+ (sit-for 2)
+ (discard-input))
(if (file-directory-p file)
(setq file (expand-file-name filename file))
(setq file (expand-file-name
@@ -1791,7 +1803,7 @@ If RECURSIVE, search recursively."
(replace-match (char-to-string char))))
;; Remove "soft hyphens".
(goto-char (point-min))
- (while (search-forward "­" nil t)
+ (while (search-forward "­" nil t)
(replace-match "" t t))
(libxml-parse-html-region (point-min) (point-max))))
(unless (bobp)
@@ -1813,7 +1825,7 @@ If RECURSIVE, search recursively."
(provide 'mm-decode)
;; Local Variables:
-;; coding: iso-8859-1
+;; coding: utf-8
;; End:
;;; mm-decode.el ends here
diff --git a/lisp/gnus/mml-smime.el b/lisp/gnus/mml-smime.el
index 3e769d396b0..6ea55377e02 100644
--- a/lisp/gnus/mml-smime.el
+++ b/lisp/gnus/mml-smime.el
@@ -74,6 +74,18 @@ Whether the passphrase is cached at all is controlled by
:group 'mime-security
:type '(repeat (string :tag "Key ID")))
+(defcustom mml-smime-sign-with-sender nil
+ "If t, use message sender so find a key to sign with."
+ :group 'mime-security
+ :version "24.4"
+ :type 'boolean)
+
+(defcustom mml-smime-encrypt-to-self nil
+ "If t, add your own key ID to recipient list when encryption."
+ :group 'mime-security
+ :version "24.4"
+ :type 'boolean)
+
(defun mml-smime-sign (cont)
(let ((func (nth 1 (assq mml-smime-use mml-smime-function-alist))))
(if func
@@ -323,6 +335,7 @@ Whether the passphrase is cached at all is controlled by
(autoload 'epg-encrypt-string "epg")
(autoload 'epg-passphrase-callback-function "epg")
(autoload 'epg-context-set-passphrase-callback "epg")
+ (autoload 'epg-sub-key-fingerprint "epg")
(autoload 'epg-configuration "epg-config")
(autoload 'epg-expand-group "epg-config")
(autoload 'epa-select-keys "epa"))
@@ -366,6 +379,24 @@ Whether the passphrase is cached at all is controlled by
(setq pointer (cdr pointer))))
(setq keys (cdr keys)))))
+;; XXX: since gpg --list-secret-keys does not return validity of each
+;; key, `mml-smime-epg-find-usable-key' defined above is not enough for
+;; secret keys. The function `mml-smime-epg-find-usable-secret-key'
+;; below looks at appropriate public keys to check usability.
+(defun mml-smime-epg-find-usable-secret-key (context name usage)
+ (let ((secret-keys (epg-list-keys context name t))
+ secret-key)
+ (while (and (not secret-key) secret-keys)
+ (if (mml-smime-epg-find-usable-key
+ (epg-list-keys context (epg-sub-key-fingerprint
+ (car (epg-key-sub-key-list
+ (car secret-keys)))))
+ usage)
+ (setq secret-key (car secret-keys)
+ secret-keys nil)
+ (setq secret-keys (cdr secret-keys))))
+ secret-key))
+
(autoload 'mml-compute-boundary "mml")
;; We require mm-decode, which requires mm-bodies, which autoloads
@@ -376,29 +407,36 @@ Whether the passphrase is cached at all is controlled by
(let* ((inhibit-redisplay t)
(context (epg-make-context 'CMS))
(boundary (mml-compute-boundary cont))
+ (sender (message-options-get 'message-sender))
+ (signer-names (or mml-smime-signers
+ (if (and mml-smime-sign-with-sender sender)
+ (list (concat "<" sender ">")))))
signer-key
(signers
(or (message-options-get 'mml-smime-epg-signers)
(message-options-set
- 'mml-smime-epg-signers
- (if (eq mm-sign-option 'guided)
- (epa-select-keys context "\
+ 'mml-smime-epg-signers
+ (if (eq mm-sign-option 'guided)
+ (epa-select-keys context "\
Select keys for signing.
If no one is selected, default secret key is used. "
- mml-smime-signers t)
- (if mml-smime-signers
- (mapcar
- (lambda (signer)
- (setq signer-key (mml-smime-epg-find-usable-key
- (epg-list-keys context signer t)
- 'sign))
- (unless (or signer-key
- (y-or-n-p
- (format "No secret key for %s; skip it? "
+ signer-names
+ t)
+ (if (or sender mml-smime-signers)
+ (delq nil
+ (mapcar
+ (lambda (signer)
+ (setq signer-key
+ (mml-smime-epg-find-usable-secret-key
+ context signer 'sign))
+ (unless (or signer-key
+ (y-or-n-p
+ (format
+ "No secret key for %s; skip it? "
signer)))
- (error "No secret key for %s" signer))
- signer-key)
- mml-smime-signers))))))
+ (error "No secret key for %s" signer))
+ signer-key)
+ signer-names)))))))
signature micalg)
(epg-context-set-signers context signers)
(if mml-smime-cache-passphrase
@@ -443,13 +481,17 @@ Content-Disposition: attachment; filename=smime.p7s
(goto-char (point-max))))
(defun mml-smime-epg-encrypt (cont)
- (let ((inhibit-redisplay t)
- (context (epg-make-context 'CMS))
- (config (epg-configuration))
- (recipients (message-options-get 'mml-smime-epg-recipients))
- cipher signers
- (boundary (mml-compute-boundary cont))
- recipient-key)
+ (let* ((inhibit-redisplay t)
+ (context (epg-make-context 'CMS))
+ (config (epg-configuration))
+ (recipients (message-options-get 'mml-smime-epg-recipients))
+ cipher signers
+ (sender (message-options-get 'message-sender))
+ (signer-names (or mml-smime-signers
+ (if (and mml-smime-sign-with-sender sender)
+ (list (concat "<" sender ">")))))
+ (boundary (mml-compute-boundary cont))
+ recipient-key)
(unless recipients
(setq recipients
(apply #'nconc
@@ -462,6 +504,10 @@ Content-Disposition: attachment; filename=smime.p7s
(message-options-set 'message-recipients
(read-string "Recipients: ")))
"[ \f\t\n\r\v,]+"))))
+ (when mml-smime-encrypt-to-self
+ (unless signer-names
+ (error "Neither message sender nor mml-smime-signers are set"))
+ (setq recipients (nconc recipients signer-names)))
(if (eq mm-encrypt-option 'guided)
(setq recipients
(epa-select-keys context "\
diff --git a/lisp/gnus/mml.el b/lisp/gnus/mml.el
index 453086f4c20..91f0e325182 100644
--- a/lisp/gnus/mml.el
+++ b/lisp/gnus/mml.el
@@ -1212,8 +1212,8 @@ If not set, `default-directory' will be used."
string
default)))
-(defun mml-minibuffer-read-description ()
- (let ((description (read-string "One line description: ")))
+(defun mml-minibuffer-read-description (&optional default)
+ (let ((description (read-string "One line description: " default)))
(when (string-match "\\`[ \t]*\\'" description)
(setq description nil))
description))
@@ -1440,7 +1440,9 @@ TYPE is the MIME type to use."
;; when you send the message.
(or (eq mail-user-agent 'message-user-agent)
(setq mail-encode-mml t))
- (mml-insert-tag 'part 'type type 'disposition "inline"))
+ (mml-insert-tag 'part 'type type 'disposition "inline")
+ (save-excursion
+ (mml-insert-tag '/part)))
(declare-function message-subscribed-p "message" ())
(declare-function message-make-mail-followup-to "message"
diff --git a/lisp/gnus/mml1991.el b/lisp/gnus/mml1991.el
index 88dee4ad883..5af7639019a 100644
--- a/lisp/gnus/mml1991.el
+++ b/lisp/gnus/mml1991.el
@@ -2,7 +2,7 @@
;; Copyright (C) 1998-2013 Free Software Foundation, Inc.
-;; Author: Sascha Lüdecke <sascha@meta-x.de>,
+;; Author: Sascha Lüdecke <sascha@meta-x.de>,
;; Simon Josefsson <simon@josefsson.org> (Mailcrypt interface, Gnus glue)
;; Keywords: PGP
@@ -480,7 +480,7 @@ If no one is selected, default secret key is used. "
(provide 'mml1991)
;; Local Variables:
-;; coding: iso-8859-1
+;; coding: utf-8
;; End:
;;; mml1991.el ends here
diff --git a/lisp/gnus/mml2015.el b/lisp/gnus/mml2015.el
index af65872b0cf..39bce23e76c 100644
--- a/lisp/gnus/mml2015.el
+++ b/lisp/gnus/mml2015.el
@@ -735,6 +735,7 @@ If set, it overrides the setting of `mml2015-sign-with-sender'."
(defvar epg-user-id-alist)
(defvar epg-digest-algorithm-alist)
+(defvar epg-gpg-program)
(defvar inhibit-redisplay)
(autoload 'epg-make-context "epg")
@@ -743,7 +744,6 @@ If set, it overrides the setting of `mml2015-sign-with-sender'."
(autoload 'epg-context-set-signers "epg")
(autoload 'epg-context-result-for "epg")
(autoload 'epg-new-signature-digest-algorithm "epg")
-(autoload 'epg-verify-result-to-string "epg")
(autoload 'epg-list-keys "epg")
(autoload 'epg-decrypt-string "epg")
(autoload 'epg-verify-string "epg")
@@ -755,6 +755,11 @@ If set, it overrides the setting of `mml2015-sign-with-sender'."
(autoload 'epg-sub-key-capability "epg")
(autoload 'epg-sub-key-validity "epg")
(autoload 'epg-sub-key-fingerprint "epg")
+(autoload 'epg-signature-key-id "epg")
+(autoload 'epg-signature-to-string "epg")
+(autoload 'epg-key-user-id-list "epg")
+(autoload 'epg-user-id-string "epg")
+(autoload 'epg-user-id-validity "epg")
(autoload 'epg-configuration "epg-config")
(autoload 'epg-expand-group "epg-config")
(autoload 'epa-select-keys "epa")
@@ -784,21 +789,53 @@ If set, it overrides the setting of `mml2015-sign-with-sender'."
(cons password-cache-key-id mml2015-epg-secret-key-id-list))
(copy-sequence passphrase)))))
-(defun mml2015-epg-find-usable-key (keys usage)
- (catch 'found
+(defun mml2015-epg-check-user-id (key recipient)
+ (let ((pointer (epg-key-user-id-list key))
+ result)
+ (while pointer
+ (if (and (equal (car (mail-header-parse-address
+ (epg-user-id-string (car pointer))))
+ (car (mail-header-parse-address
+ recipient)))
+ (not (memq (epg-user-id-validity (car pointer))
+ '(revoked expired))))
+ (setq result t
+ pointer nil)
+ (setq pointer (cdr pointer))))
+ result))
+
+(defun mml2015-epg-check-sub-key (key usage)
+ (let ((pointer (epg-key-sub-key-list key))
+ result)
+ ;; The primary key will be marked as disabled, when the entire
+ ;; key is disabled (see 12 Field, Format of colon listings, in
+ ;; gnupg/doc/DETAILS)
+ (unless (memq 'disabled (epg-sub-key-capability (car pointer)))
+ (while pointer
+ (if (and (memq usage (epg-sub-key-capability (car pointer)))
+ (not (memq (epg-sub-key-validity (car pointer))
+ '(revoked expired))))
+ (setq result t
+ pointer nil)
+ (setq pointer (cdr pointer)))))
+ result))
+
+(defun mml2015-epg-find-usable-key (context name usage
+ &optional name-is-key-id)
+ (let ((keys (epg-list-keys context name))
+ key)
(while keys
- (let ((pointer (epg-key-sub-key-list (car keys))))
- ;; The primary key will be marked as disabled, when the entire
- ;; key is disabled (see 12 Field, Format of colon listings, in
- ;; gnupg/doc/DETAILS)
- (unless (memq 'disabled (epg-sub-key-capability (car pointer)))
- (while pointer
- (if (and (memq usage (epg-sub-key-capability (car pointer)))
- (not (memq (epg-sub-key-validity (car pointer))
- '(revoked expired))))
- (throw 'found (car keys)))
- (setq pointer (cdr pointer)))))
- (setq keys (cdr keys)))))
+ (if (and (or name-is-key-id
+ ;; Non email user-id can be supplied through
+ ;; mml2015-signers if mml2015-encrypt-to-self is set.
+ ;; Treat it as valid, as it is user's intention.
+ (not (string-match "\\`<" name))
+ (mml2015-epg-check-user-id (car keys) name))
+ (mml2015-epg-check-sub-key (car keys) usage))
+ (setq key (car keys)
+ keys nil)
+ (setq keys (cdr keys))))
+ key))
;; XXX: since gpg --list-secret-keys does not return validity of each
;; key, `mml2015-epg-find-usable-key' defined above is not enough for
@@ -809,15 +846,46 @@ If set, it overrides the setting of `mml2015-sign-with-sender'."
secret-key)
(while (and (not secret-key) secret-keys)
(if (mml2015-epg-find-usable-key
- (epg-list-keys context (epg-sub-key-fingerprint
- (car (epg-key-sub-key-list
- (car secret-keys)))))
- usage)
+ context
+ (epg-sub-key-fingerprint
+ (car (epg-key-sub-key-list
+ (car secret-keys))))
+ usage
+ t)
(setq secret-key (car secret-keys)
secret-keys nil)
(setq secret-keys (cdr secret-keys))))
secret-key))
+(defun mml2015-epg-key-image (key-id)
+ "Return the image of a key, if any"
+ (with-temp-buffer
+ (mm-set-buffer-multibyte nil)
+ (let* ((coding-system-for-write 'binary)
+ (coding-system-for-read 'binary)
+ (data (shell-command-to-string
+ (format "%s --list-options no-show-photos --attribute-fd 3 --list-keys %s 3>&1 >/dev/null 2>&1"
+ (shell-quote-argument epg-gpg-program) key-id))))
+ (when (> (length data) 0)
+ (insert (substring data 16))
+ (create-image (buffer-string) nil t)))))
+
+(defun mml2015-epg-key-image-to-string (key-id)
+ "Return a string with the image of a key, if any"
+ (let* ((result "")
+ (key-image (mml2015-epg-key-image key-id)))
+ (when key-image
+ (setq result " ")
+ (put-text-property 1 2 'display key-image result))
+ result))
+
+(defun mml2015-epg-signature-to-string (signature)
+ (concat (epg-signature-to-string signature)
+ (mml2015-epg-key-image-to-string (epg-signature-key-id signature))))
+
+(defun mml2015-epg-verify-result-to-string (verify-result)
+ (mapconcat #'mml2015-epg-signature-to-string verify-result "\n"))
+
(defun mml2015-epg-decrypt (handle ctl)
(catch 'error
(let ((inhibit-redisplay t)
@@ -860,7 +928,7 @@ If set, it overrides the setting of `mml2015-sign-with-sender'."
(mm-set-handle-multipart-parameter
mm-security-handle 'gnus-info
(concat "OK\n"
- (epg-verify-result-to-string
+ (mml2015-epg-verify-result-to-string
(epg-context-result-for context 'verify))))
(mm-set-handle-multipart-parameter
mm-security-handle 'gnus-info "OK"))
@@ -908,7 +976,7 @@ If set, it overrides the setting of `mml2015-sign-with-sender'."
(if (epg-context-result-for context 'verify)
(mm-set-handle-multipart-parameter
mm-security-handle 'gnus-details
- (epg-verify-result-to-string
+ (mml2015-epg-verify-result-to-string
(epg-context-result-for context 'verify)))))))
(defun mml2015-epg-verify (handle ctl)
@@ -942,7 +1010,8 @@ If set, it overrides the setting of `mml2015-sign-with-sender'."
(throw 'error handle)))
(mm-set-handle-multipart-parameter
mm-security-handle 'gnus-info
- (epg-verify-result-to-string (epg-context-result-for context 'verify)))
+ (mml2015-epg-verify-result-to-string
+ (epg-context-result-for context 'verify)))
handle)))
(defun mml2015-epg-clear-verify ()
@@ -965,7 +1034,7 @@ If set, it overrides the setting of `mml2015-sign-with-sender'."
(progn
(mm-set-handle-multipart-parameter
mm-security-handle 'gnus-info
- (epg-verify-result-to-string
+ (mml2015-epg-verify-result-to-string
(epg-context-result-for context 'verify)))
(delete-region (point-min) (point-max))
(insert (mm-decode-coding-string plain coding-system-for-read)))
@@ -1083,8 +1152,7 @@ If no one is selected, symmetric encryption will be performed. "
(mapcar
(lambda (recipient)
(setq recipient-key (mml2015-epg-find-usable-key
- (epg-list-keys context recipient)
- 'encrypt))
+ context recipient 'encrypt))
(unless (or recipient-key
(y-or-n-p
(format "No public key for %s; skip it? "
diff --git a/lisp/gnus/nndir.el b/lisp/gnus/nndir.el
index b99a0c37d2e..5e68779e977 100644
--- a/lisp/gnus/nndir.el
+++ b/lisp/gnus/nndir.el
@@ -90,8 +90,7 @@
(nnml-request-article 0 nndir-current-group 0 0)
(nnmh-request-group nndir-current-group 0 0)
(nnml-close-group nndir-current-group 0)
- (nnml-request-list (nnoo-current-server 'nndir) nndir-directory)
- (nnml-request-newsgroups (nnoo-current-server 'nndir) nndir-directory))
+ (nnml-request-list (nnoo-current-server 'nndir)))
(provide 'nndir)
diff --git a/lisp/gnus/nndraft.el b/lisp/gnus/nndraft.el
index ad8a8b164de..c9625f4c447 100644
--- a/lisp/gnus/nndraft.el
+++ b/lisp/gnus/nndraft.el
@@ -255,11 +255,16 @@ are generated if and only if they are also in `message-draft-headers'.")
(deffoo nndraft-request-expire-articles (articles group &optional server force)
(nndraft-possibly-change-group group)
(let* ((nnmh-allow-delete-final t)
- (nnmail-expiry-target
- (or (gnus-group-find-parameter
- (gnus-group-prefixed-name group (list 'nndraft server))
- 'expiry-target t)
- nnmail-expiry-target))
+ (nnmail-expiry-target 'delete)
+ ;; FIXME: If we want to move a draft message to an expiry group,
+ ;; there are things to have to improve:
+ ;; - Remove a header separator.
+ ;; - Encode it, including attachments, into a MIME message.
+ ;;(nnmail-expiry-target
+ ;; (or (gnus-group-find-parameter
+ ;; (gnus-group-prefixed-name group (list 'nndraft server))
+ ;; 'expiry-target t)
+ ;; nnmail-expiry-target))
(res (nnoo-parent-function 'nndraft
'nnmh-request-expire-articles
(list articles group server force)))
@@ -346,8 +351,7 @@ are generated if and only if they are also in `message-draft-headers'.")
nnmh-retrieve-headers
nnmh-request-group
nnmh-close-group
- nnmh-request-list
- nnmh-request-newsgroups))
+ nnmh-request-list))
(provide 'nndraft)
diff --git a/lisp/gnus/nnfolder.el b/lisp/gnus/nnfolder.el
index 7dfdb9ebcfd..e189ab531f0 100644
--- a/lisp/gnus/nnfolder.el
+++ b/lisp/gnus/nnfolder.el
@@ -1004,6 +1004,28 @@ deleted. Point is left where the deleted region was."
(nnfolder-save-nov))
(current-buffer))))))
+(defun nnfolder-recursive-directory-files (dir prefix)
+ (let ((files nil))
+ (dolist (file (directory-files dir))
+ (cond
+ ((or (file-symlink-p (expand-file-name file dir))
+ (member file '("." "..")))
+ ;; Ignore
+ )
+ ((file-directory-p (expand-file-name file dir))
+ (setq files (nconc (nnfolder-recursive-directory-files
+ (expand-file-name file dir)
+ (if prefix
+ (concat prefix "." (directory-file-name file))
+ (file-name-nondirectory file)))
+ files)))
+ ((file-regular-p (expand-file-name file dir))
+ (push (if prefix
+ (concat prefix "." file)
+ file)
+ files))))
+ files))
+
;;;###autoload
(defun nnfolder-generate-active-file ()
"Look for mbox folders in the nnfolder directory and make them into groups.
@@ -1020,10 +1042,13 @@ This command does not work if you use short group names."
(when (not (message-mail-file-mbox-p file))
(ignore-errors
(delete-file file)))))
- (dolist (file (directory-files nnfolder-directory))
+ (dolist (file (if nnmail-use-long-file-names
+ (directory-files nnfolder-directory)
+ (nnfolder-recursive-directory-files
+ nnfolder-directory nil)))
(when (and (not (backup-file-name-p file))
(message-mail-file-mbox-p
- (nnheader-concat nnfolder-directory file)))
+ (nnfolder-group-pathname file)))
(let ((oldgroup (assoc file nnfolder-group-alist)))
(if oldgroup
(nnheader-message 5 "Refreshing group %s..." file)
diff --git a/lisp/gnus/nnimap.el b/lisp/gnus/nnimap.el
index 307d8247912..9c18bc2cff0 100644
--- a/lisp/gnus/nnimap.el
+++ b/lisp/gnus/nnimap.el
@@ -99,7 +99,8 @@ Uses the same syntax as `nnmail-split-methods'.")
(defvoo nnimap-authenticator nil
"How nnimap authenticate itself to the server.
-Possible choices are nil (use default methods) or `anonymous'.")
+Possible choices are nil (use default methods), `anonymous',
+`login', `plain' and `cram-md5'.")
(defvoo nnimap-expunge t
"If non-nil, expunge articles after deleting them.
@@ -338,7 +339,8 @@ textual parts.")
(nnimap-last-command-time nnimap-object)))
;; More than five minutes since the last command.
(* 5 60)))
- (nnimap-send-command "NOOP")))))))
+ (ignore-errors ;E.g. "buffer foo has no process".
+ (nnimap-send-command "NOOP"))))))))
(defun nnimap-open-connection (buffer)
;; Be backwards-compatible -- the earlier value of nnimap-stream was
@@ -366,7 +368,7 @@ textual parts.")
(defun nnimap-open-connection-1 (buffer)
(unless nnimap-keepalive-timer
(setq nnimap-keepalive-timer (run-at-time (* 60 15) (* 60 15)
- 'nnimap-keepalive)))
+ #'nnimap-keepalive)))
(with-current-buffer (nnimap-make-process-buffer buffer)
(let* ((coding-system-for-read 'binary)
(coding-system-for-write 'binary)
@@ -487,9 +489,13 @@ textual parts.")
;; round trips than CRAM-MD5, and it's less likely to be buggy),
;; and we're using an encrypted connection.
((and (not (nnimap-capability "LOGINDISABLED"))
- (eq (nnimap-stream-type nnimap-object) 'tls))
+ (eq (nnimap-stream-type nnimap-object) 'tls)
+ (or (null nnimap-authenticator)
+ (eq nnimap-authenticator 'login)))
(nnimap-command "LOGIN %S %S" user password))
- ((nnimap-capability "AUTH=CRAM-MD5")
+ ((and (nnimap-capability "AUTH=CRAM-MD5")
+ (or (null nnimap-authenticator)
+ (eq nnimap-authenticator 'cram-md5)))
(erase-buffer)
(let ((sequence (nnimap-send-command "AUTHENTICATE CRAM-MD5"))
(challenge (nnimap-wait-for-line "^\\+\\(.*\\)\n")))
@@ -502,9 +508,13 @@ textual parts.")
(base64-decode-string challenge))))
"\r\n"))
(nnimap-wait-for-response sequence)))
- ((not (nnimap-capability "LOGINDISABLED"))
+ ((and (not (nnimap-capability "LOGINDISABLED"))
+ (or (null nnimap-authenticator)
+ (eq nnimap-authenticator 'login)))
(nnimap-command "LOGIN %S %S" user password))
- ((nnimap-capability "AUTH=PLAIN")
+ ((and (nnimap-capability "AUTH=PLAIN")
+ (or (null nnimap-authenticator)
+ (eq nnimap-authenticator 'plain)))
(nnimap-command
"AUTHENTICATE PLAIN %s"
(base64-encode-string
@@ -1411,7 +1421,9 @@ textual parts.")
(gnus-set-difference
(gnus-set-difference
existing
- (cdr (assoc '%Seen flags)))
+ (gnus-sorted-union
+ (cdr (assoc '%Seen flags))
+ (cdr (assoc '%Deleted flags))))
(cdr (assoc '%Flagged flags)))))
(read (gnus-range-difference
(cons start-article high) unread)))
diff --git a/lisp/gnus/nnir.el b/lisp/gnus/nnir.el
index 0e2e76f25be..21f81dc664c 100644
--- a/lisp/gnus/nnir.el
+++ b/lisp/gnus/nnir.el
@@ -1,8 +1,8 @@
-;;; nnir.el --- search mail with various search engines -*- coding: iso-8859-1 -*-
+;;; nnir.el --- search mail with various search engines -*- coding: utf-8 -*-
;; Copyright (C) 1998-2013 Free Software Foundation, Inc.
-;; Author: Kai Großjohann <grossjohann@ls6.cs.uni-dortmund.de>
+;; Author: Kai Großjohann <grossjohann@ls6.cs.uni-dortmund.de>
;; Swish-e and Swish++ backends by:
;; Christoph Conrad <christoph.conrad@gmx.de>.
;; IMAP backend by: Simon Josefsson <jas@pdc.kth.se>.
@@ -29,10 +29,6 @@
;;; Commentary:
-;; TODO: Documentation in the Gnus manual
-
-;; Where in the existing gnus manual would this fit best?
-
;; What does it do? Well, it allows you to search your mail using
;; some search engine (imap, namazu, swish-e, gmane and others -- see
;; later) by typing `G G' in the Group buffer. You will then get a
@@ -136,17 +132,26 @@
;; other backend.
;; The interface between the two layers consists of the single
-;; function `nnir-run-query', which just selects the appropriate
-;; function for the search engine one is using. The input to
-;; `nnir-run-query' is a string, representing the query as input by
-;; the user. The output of `nnir-run-query' is supposed to be a
-;; vector, each element of which should in turn be a three-element
-;; vector. The first element should be full group name of the article,
-;; the second element should be the article number, and the third
-;; element should be the Retrieval Status Value (RSV) as returned from
-;; the search engine. An RSV is the score assigned to the document by
-;; the search engine. For Boolean search engines, the
-;; RSV is always 1000 (or 1 or 100, or whatever you like).
+;; function `nnir-run-query', which dispatches the search to the
+;; proper search function. The argument of `nnir-run-query' is an
+;; alist with two keys: 'nnir-query-spec and 'nnir-group-spec. The
+;; value for 'nnir-query-spec is an alist. The only required key/value
+;; pair is (query . "query") specifying the search string to pass to
+;; the query engine. Individual engines may have other elements. The
+;; value of 'nnir-group-spec is a list with the specification of the
+;; groups/servers to search. The format of the 'nnir-group-spec is
+;; (("server1" ("group11" "group12")) ("server2" ("group21"
+;; "group22"))). If any of the group lists is absent then all groups
+;; on that server are searched.
+
+;; The output of `nnir-run-query' is supposed to be a vector, each
+;; element of which should in turn be a three-element vector. The
+;; first element should be full group name of the article, the second
+;; element should be the article number, and the third element should
+;; be the Retrieval Status Value (RSV) as returned from the search
+;; engine. An RSV is the score assigned to the document by the search
+;; engine. For Boolean search engines, the RSV is always 1000 (or 1
+;; or 100, or whatever you like).
;; The sorting order of the articles in the summary buffer created by
;; nnir is based on the order of the articles in the above mentioned
@@ -179,26 +184,21 @@
;;; Internal Variables:
-(defvar nnir-current-query nil
- "Internal: stores current query (= group name).")
-
-(defvar nnir-current-server nil
- "Internal: stores current server (does it ever change?).")
+(defvar nnir-memo-query nil
+ "Internal: stores current query.")
-(defvar nnir-current-group-marked nil
- "Internal: stores current list of process-marked groups.")
+(defvar nnir-memo-server nil
+ "Internal: stores current server.")
(defvar nnir-artlist nil
"Internal: stores search result.")
-(defvar nnir-tmp-buffer " *nnir*"
- "Internal: temporary buffer.")
-
(defvar nnir-search-history ()
"Internal: the history for querying search options in nnir")
-(defvar nnir-extra-parms nil
- "Internal: stores request for extra search parms")
+(defconst nnir-tmp-buffer " *nnir*"
+ "Internal: temporary buffer.")
+
;; Imap variables
@@ -290,14 +290,14 @@ is `(valuefunc member)'."
(autoload 'nnimap-command "nnimap")
(autoload 'nnimap-possibly-change-group "nnimap")
(autoload 'nnimap-make-thread-query "nnimap")
- (autoload 'gnus-registry-action "gnus-registry"))
+ (autoload 'gnus-registry-action "gnus-registry")
+ (autoload 'gnus-registry-get-id-key "gnus-registry")
+ (autoload 'gnus-group-topic-name "gnus-topic"))
+
(nnoo-declare nnir)
(nnoo-define-basics nnir)
-(defvoo nnir-address nil
- "The address of the nnir server.")
-
(gnus-declare-backend "nnir" 'mail 'virtual)
@@ -344,7 +344,7 @@ result, `gnus-retrieve-headers' will be called instead."
(defcustom nnir-imap-default-search-key "whole message"
"*The default IMAP search key for an nnir search. Must be one of
the keys in `nnir-imap-search-arguments'. To use raw imap queries
- by default set this to \"Imap\"."
+ by default set this to \"imap\"."
:version "24.1"
:type `(choice ,@(mapcar (lambda (elem) (list 'const (car elem)))
nnir-imap-search-arguments))
@@ -546,17 +546,17 @@ that it is for notmuch, not Namazu."
,nnir-imap-default-search-key ; default
)))
(gmane nnir-run-gmane
- ((author . "Gmane Author: ")))
+ ((gmane-author . "Gmane Author: ")))
(swish++ nnir-run-swish++
- ((group . "Swish++ Group spec: ")))
+ ((swish++-group . "Swish++ Group spec: ")))
(swish-e nnir-run-swish-e
- ((group . "Swish-e Group spec: ")))
+ ((swish-e-group . "Swish-e Group spec: ")))
(namazu nnir-run-namazu
())
(notmuch nnir-run-notmuch
())
(hyrex nnir-run-hyrex
- ((group . "Hyrex Group spec: ")))
+ ((hyrex-group . "Hyrex Group spec: ")))
(find-grep nnir-run-find-grep
((grep-options . "Grep options: "))))
"Alist of supported search engines.
@@ -576,69 +576,111 @@ needs the variables `nnir-namazu-program',
Add an entry here when adding a new search engine.")
-(defcustom nnir-method-default-engines
- '((nnimap . imap)
- (nntp . gmane))
+(defcustom nnir-method-default-engines '((nnimap . imap) (nntp . gmane))
"*Alist of default search engines keyed by server method."
:version "24.1"
- :type `(repeat (cons (choice (const nnimap) (const nttp) (const nnspool)
+ :group 'nnir
+ :type `(repeat (cons (choice (const nnimap) (const nntp) (const nnspool)
(const nneething) (const nndir) (const nnmbox)
(const nnml) (const nnmh) (const nndraft)
(const nnfolder) (const nnmaildir))
(choice
,@(mapcar (lambda (elem) (list 'const (car elem)))
- nnir-engines))))
- :group 'nnir)
+ nnir-engines)))))
;; Gnus glue.
-(defun gnus-group-make-nnir-group (nnir-extra-parms &optional parms)
- "Create an nnir group. Asks for query."
+(defun gnus-group-make-nnir-group (nnir-extra-parms &optional specs)
+ "Create an nnir group. Prompt for a search query and determine
+the groups to search as follows: if called from the *Server*
+buffer search all groups belonging to the server on the current
+line; if called from the *Group* buffer search any marked groups,
+or the group on the current line, or all the groups under the
+current topic. Calling with a prefix-arg prompts for additional
+search-engine specific constraints. A non-nil `specs' arg must be
+an alist with `nnir-query-spec' and `nnir-group-spec' keys, and
+skips all prompting."
(interactive "P")
- (setq nnir-current-query nil
- nnir-current-server nil
- nnir-current-group-marked nil
- nnir-artlist nil)
- (let* ((query (unless parms (read-string "Query: " nil 'nnir-search-history)))
- (parms (or parms (list (cons 'query query))))
- (srv (or (cdr (assq 'server parms)) (gnus-server-server-name) "nnir")))
- (add-to-list 'parms (cons 'unique-id (message-unique-id)) t)
+ (let* ((group-spec
+ (or (cdr (assq 'nnir-group-spec specs))
+ (if (gnus-server-server-name)
+ (list (list (gnus-server-server-name)))
+ (nnir-categorize
+ (or gnus-group-marked
+ (if (gnus-group-group-name)
+ (list (gnus-group-group-name))
+ (cdr (assoc (gnus-group-topic-name) gnus-topic-alist))))
+ gnus-group-server))))
+ (query-spec
+ (or (cdr (assq 'nnir-query-spec specs))
+ (apply
+ 'append
+ (list (cons 'query
+ (read-string "Query: " nil 'nnir-search-history)))
+ (when nnir-extra-parms
+ (mapcar
+ (lambda (x)
+ (nnir-read-parms (nnir-server-to-search-engine (car x))))
+ group-spec))))))
(gnus-group-read-ephemeral-group
- (concat "nnir:" (prin1-to-string parms)) (list 'nnir srv) t
- (cons (current-buffer) gnus-current-window-configuration)
- nil)))
+ (concat "nnir-" (message-unique-id))
+ (list 'nnir "nnir")
+ nil
+; (cons (current-buffer) gnus-current-window-configuration)
+ nil
+ nil nil
+ (list
+ (cons 'nnir-specs (list (cons 'nnir-query-spec query-spec)
+ (cons 'nnir-group-spec group-spec)))
+ (cons 'nnir-artlist nil)))))
+
+(defun gnus-summary-make-nnir-group (nnir-extra-parms)
+ "Search a group from the summary buffer."
+ (interactive "P")
+ (gnus-warp-to-article)
+ (let ((spec
+ (list
+ (cons 'nnir-group-spec
+ (list (list
+ (gnus-group-server gnus-newsgroup-name)
+ (list gnus-newsgroup-name)))))))
+ (gnus-group-make-nnir-group nnir-extra-parms spec)))
;; Gnus backend interface functions.
(deffoo nnir-open-server (server &optional definitions)
;; Just set the server variables appropriately.
- (add-hook 'gnus-summary-mode-hook 'nnir-mode)
- (nnoo-change-server 'nnir server definitions))
-
-(deffoo nnir-request-group (group &optional server fast info)
- "GROUP is the query string."
- (nnir-possibly-change-server server)
- ;; Check for cache and return that if appropriate.
- (if (and (equal group nnir-current-query)
- (equal gnus-group-marked nnir-current-group-marked)
- (or (null server)
- (equal server nnir-current-server)))
- nnir-artlist
- ;; Cache miss.
- (setq nnir-artlist (nnir-run-query group)))
- (with-current-buffer nntp-server-buffer
- (setq nnir-current-query group)
- (when server (setq nnir-current-server server))
- (setq nnir-current-group-marked gnus-group-marked)
- (if (zerop (length nnir-artlist))
- (nnheader-report 'nnir "Search produced empty results.")
- ;; Remember data for cache.
- (nnheader-insert "211 %d %d %d %s\n"
- (nnir-artlist-length nnir-artlist) ; total #
- 1 ; first #
- (nnir-artlist-length nnir-artlist) ; last #
- group)))) ; group name
+ (let ((backend (car (gnus-server-to-method server))))
+ (if backend
+ (nnoo-change-server backend server definitions)
+ (add-hook 'gnus-summary-mode-hook 'nnir-mode)
+ (nnoo-change-server 'nnir server definitions))))
+
+(deffoo nnir-request-group (group &optional server dont-check info)
+ (nnir-possibly-change-group group server)
+ (let ((pgroup (gnus-group-guess-full-name-from-command-method group))
+ length)
+ ;; Check for cached search result or run the query and cache the
+ ;; result.
+ (unless (and nnir-artlist dont-check)
+ (gnus-group-set-parameter
+ pgroup 'nnir-artlist
+ (setq nnir-artlist
+ (nnir-run-query
+ (gnus-group-get-parameter pgroup 'nnir-specs t))))
+ (nnir-request-update-info pgroup (gnus-get-info pgroup)))
+ (with-current-buffer nntp-server-buffer
+ (if (zerop (setq length (nnir-artlist-length nnir-artlist)))
+ (progn
+ (nnir-close-group group)
+ (nnheader-report 'nnir "Search produced empty results."))
+ (nnheader-insert "211 %d %d %d %s\n"
+ length ; total #
+ 1 ; first #
+ length ; last #
+ group)))) ; group name
+ nnir-artlist)
(deffoo nnir-retrieve-headers (articles &optional group server fetch-old)
(with-current-buffer nntp-server-buffer
@@ -654,13 +696,7 @@ Add an entry here when adding a new search engine.")
(server (gnus-group-server artgroup))
(gnus-override-method (gnus-server-to-method server))
parsefunc)
- ;; (or (numberp art)
- ;; (nnheader-report
- ;; 'nnir
- ;; "nnir-retrieve-headers doesn't grok message ids: %s"
- ;; art))
- (nnir-possibly-change-server server)
- ;; is this needed?
+ ;; (nnir-possibly-change-group nil server)
(erase-buffer)
(case (setq gnus-headers-retrieved-by
(or
@@ -694,6 +730,7 @@ Add an entry here when adding a new search engine.")
'nov)))
(deffoo nnir-request-article (article &optional group server to-buffer)
+ (nnir-possibly-change-group group server)
(if (and (stringp article)
(not (eq 'nnimap (car (gnus-server-to-method server)))))
(nnheader-report
@@ -702,35 +739,35 @@ Add an entry here when adding a new search engine.")
server)
(save-excursion
(let ((article article)
- query)
- (when (stringp article)
- (setq gnus-override-method (gnus-server-to-method server))
- (setq query
- (list
- (cons 'query (format "HEADER Message-ID %s" article))
- (cons 'unique-id article)
- (cons 'criteria "")
- (cons 'shortcut t)))
- (unless (and (equal query nnir-current-query)
- (equal server nnir-current-server))
- (setq nnir-artlist (nnir-run-imap query server))
- (setq nnir-current-query query)
- (setq nnir-current-server server))
- (setq article 1))
- (unless (zerop (length nnir-artlist))
- (let ((artfullgroup (nnir-article-group article))
- (artno (nnir-article-number article)))
- (message "Requesting article %d from group %s"
- artno artfullgroup)
- (if to-buffer
- (with-current-buffer to-buffer
- (let ((gnus-article-decode-hook nil))
- (gnus-request-article-this-buffer artno artfullgroup)))
- (gnus-request-article artno artfullgroup))
- (cons artfullgroup artno)))))))
+ query)
+ (when (stringp article)
+ (setq gnus-override-method (gnus-server-to-method server))
+ (setq query
+ (list
+ (cons 'query (format "HEADER Message-ID %s" article))
+ (cons 'criteria "")
+ (cons 'shortcut t)))
+ (unless (and nnir-artlist (equal query nnir-memo-query)
+ (equal server nnir-memo-server))
+ (setq nnir-artlist (nnir-run-imap query server)
+ nnir-memo-query query
+ nnir-memo-server server))
+ (setq article 1))
+ (unless (zerop (nnir-artlist-length nnir-artlist))
+ (let ((artfullgroup (nnir-article-group article))
+ (artno (nnir-article-number article)))
+ (message "Requesting article %d from group %s"
+ artno artfullgroup)
+ (if to-buffer
+ (with-current-buffer to-buffer
+ (let ((gnus-article-decode-hook nil))
+ (gnus-request-article-this-buffer artno artfullgroup)))
+ (gnus-request-article artno artfullgroup))
+ (cons artfullgroup artno)))))))
(deffoo nnir-request-move-article (article group server accept-form
&optional last internal-move-group)
+ (nnir-possibly-change-group group server)
(let* ((artfullgroup (nnir-article-group article))
(artno (nnir-article-number article))
(to-newsgroup (nth 1 accept-form))
@@ -751,6 +788,7 @@ Add an entry here when adding a new search engine.")
(gnus-group-real-name to-newsgroup)))))
(deffoo nnir-request-expire-articles (articles group &optional server force)
+ (nnir-possibly-change-group group server)
(if force
(let ((articles-by-group (nnir-categorize
articles nnir-article-group nnir-article-ids))
@@ -772,22 +810,103 @@ Add an entry here when adding a new search engine.")
articles))
(deffoo nnir-warp-to-article ()
+ (nnir-possibly-change-group gnus-newsgroup-name)
(let* ((cur (if (> (gnus-summary-article-number) 0)
(gnus-summary-article-number)
- (error "This is not a real article")))
+ (error "Can't warp to a pseudo-article")))
(backend-article-group (nnir-article-group cur))
(backend-article-number (nnir-article-number cur))
(quit-config (gnus-ephemeral-group-p gnus-newsgroup-name)))
- ;; first exit from the nnir summary buffer.
- (gnus-summary-exit)
+
+ ;; what should we do here? we could leave all the buffers around
+ ;; and assume that we have to exit from them one by one. or we can
+ ;; try to clean up directly
+
+ ;;first exit from the nnir summary buffer.
+; (gnus-summary-exit)
;; and if the nnir summary buffer in turn came from another
;; summary buffer we have to clean that summary up too.
- (when (eq (cdr quit-config) 'summary)
- (gnus-summary-exit))
+ ; (when (not (eq (cdr quit-config) 'group))
+; (gnus-summary-exit))
(gnus-summary-read-group-1 backend-article-group t t nil
- nil (list backend-article-number))))
+ nil (list backend-article-number))))
+
+(deffoo nnir-request-update-mark (group article mark)
+ (let ((artgroup (nnir-article-group article))
+ (artnumber (nnir-article-number article)))
+ (gnus-request-update-mark artgroup artnumber mark)))
+
+(deffoo nnir-request-set-mark (group actions &optional server)
+ (nnir-possibly-change-group group server)
+ (let (mlist)
+ (dolist (action actions)
+ (destructuring-bind (range action marks) action
+ (let ((articles-by-group (nnir-categorize
+ (gnus-uncompress-range range)
+ nnir-article-group nnir-article-number)))
+ (dolist (artgroup articles-by-group)
+ (push (list
+ (car artgroup)
+ (list (gnus-compress-sequence
+ (sort (cadr artgroup) '<)) action marks)) mlist)))))
+ (dolist (request (nnir-categorize mlist car cadr))
+ (gnus-request-set-mark (car request) (cadr request)))))
+
+
+(deffoo nnir-request-update-info (group info &optional server)
+ (nnir-possibly-change-group group server)
+ ;; clear out all existing marks.
+ (gnus-info-set-marks info nil)
+ (gnus-info-set-read info nil)
+ (let ((group (gnus-group-guess-full-name-from-command-method group))
+ (articles-by-group
+ (nnir-categorize
+ (gnus-uncompress-range (cons 1 (nnir-artlist-length nnir-artlist)))
+ nnir-article-group nnir-article-ids)))
+ (gnus-set-active group
+ (cons 1 (nnir-artlist-length nnir-artlist)))
+ (while (not (null articles-by-group))
+ (let* ((group-articles (pop articles-by-group))
+ (articleids (reverse (cadr group-articles)))
+ (group-info (gnus-get-info (car group-articles)))
+ (marks (gnus-info-marks group-info))
+ (read (gnus-info-read group-info)))
+ (gnus-info-set-read
+ info
+ (gnus-add-to-range
+ (gnus-info-read info)
+ (delq nil
+ (mapcar
+ #'(lambda (art)
+ (when (gnus-member-of-range (cdr art) read) (car art)))
+ articleids))))
+ (dolist (mark marks)
+ (destructuring-bind (type . range) mark
+ (gnus-add-marked-articles
+ group type
+ (delq nil
+ (mapcar
+ #'(lambda (art)
+ (when (gnus-member-of-range (cdr art) range) (car art)))
+ articleids)))))))))
+
+
+(deffoo nnir-close-group (group &optional server)
+ (nnir-possibly-change-group group server)
+ (let ((pgroup (gnus-group-guess-full-name-from-command-method group)))
+ (when (and nnir-artlist (not (gnus-ephemeral-group-p pgroup)))
+ (gnus-group-set-parameter pgroup 'nnir-artlist nnir-artlist))
+ (setq nnir-artlist nil)
+ (when (gnus-ephemeral-group-p pgroup)
+ (gnus-kill-ephemeral-group pgroup)
+ (setq gnus-ephemeral-servers
+ (delq (assq 'nnir gnus-ephemeral-servers)
+ gnus-ephemeral-servers)))))
+;; (gnus-opened-servers-remove
+;; (car (assoc '(nnir "nnir-ephemeral" (nnir-address "nnir"))
+;; gnus-opened-servers))))
+
-(nnoo-define-skeleton nnir)
(defmacro nnir-add-result (dirnam artno score prefix server artlist)
@@ -813,7 +932,7 @@ ready to be added to the list of search results."
;; remove trailing slash and, for nnmaildir, cur/new/tmp
(setq dirnam
(substring dirnam 0
- (if (string-match "^nnmaildir:" (gnus-group-server server))
+ (if (string-match "\\`nnmaildir:" (gnus-group-server server))
-5 -1)))
;; Set group to dirnam without any leading dots or slashes,
@@ -823,7 +942,7 @@ ready to be added to the list of search results."
"[/\\]" "." t)))
(vector (gnus-group-full-name group server)
- (if (string-match "^nnmaildir:" (gnus-group-server server))
+ (if (string-match "\\`nnmaildir:" (gnus-group-server server))
(nnmaildir-base-name-to-article-number
(substring article 0 (string-match ":" article))
group nil)
@@ -850,35 +969,36 @@ details on the language and supported extensions."
(apply
'vconcat
(catch 'found
- (mapcar
- (lambda (group)
- (let (artlist)
- (condition-case ()
- (when (nnimap-possibly-change-group
- (gnus-group-short-name group) server)
- (with-current-buffer (nnimap-buffer)
- (message "Searching %s..." group)
- (let ((arts 0)
- (result (nnimap-command "UID SEARCH %s"
- (if (string= criteria "")
- qstring
- (nnir-imap-make-query
- criteria qstring)))))
- (mapc
- (lambda (artnum)
- (let ((artn (string-to-number artnum)))
- (when (> artn 0)
- (push (vector group artn 100)
- artlist)
- (when (assq 'shortcut query)
- (throw 'found (list artlist)))
- (setq arts (1+ arts)))))
- (and (car result) (cdr (assoc "SEARCH" (cdr result)))))
- (message "Searching %s... %d matches" group arts)))
- (message "Searching %s...done" group))
- (quit nil))
- (nreverse artlist)))
- groups))))))
+ (mapcar
+ #'(lambda (group)
+ (let (artlist)
+ (condition-case ()
+ (when (nnimap-possibly-change-group
+ (gnus-group-short-name group) server)
+ (with-current-buffer (nnimap-buffer)
+ (message "Searching %s..." group)
+ (let ((arts 0)
+ (result (nnimap-command "UID SEARCH %s"
+ (if (string= criteria "")
+ qstring
+ (nnir-imap-make-query
+ criteria qstring)))))
+ (mapc
+ (lambda (artnum)
+ (let ((artn (string-to-number artnum)))
+ (when (> artn 0)
+ (push (vector group artn 100)
+ artlist)
+ (when (assq 'shortcut query)
+ (throw 'found (list artlist)))
+ (setq arts (1+ arts)))))
+ (and (car result)
+ (cdr (assoc "SEARCH" (cdr result)))))
+ (message "Searching %s... %d matches" group arts)))
+ (message "Searching %s...done" group))
+ (quit nil))
+ (nreverse artlist)))
+ groups))))))
(defun nnir-imap-make-query (criteria qstring)
"Parse the query string and criteria into an appropriate IMAP search
@@ -1073,14 +1193,14 @@ Windows NT 4.0."
(save-excursion
(let ( (qstring (cdr (assq 'query query)))
- (groupspec (cdr (assq 'group query)))
+ (groupspec (cdr (assq 'swish++-group query)))
(prefix (nnir-read-server-parm 'nnir-swish++-remove-prefix server))
artlist
;; nnml-use-compressed-files might be any string, but probably this
;; is sufficient. Note that we can't only use the value of
;; nnml-use-compressed-files because old articles might have been
;; saved with a different value.
- (article-pattern (if (string-match "^nnmaildir:"
+ (article-pattern (if (string-match "\\`nnmaildir:"
(gnus-group-server server))
":[0-9]+"
"^[0-9]+\\(\\.[a-z0-9]+\\)?$"))
@@ -1247,7 +1367,7 @@ Tested with swish-e-2.0.1 on Windows NT 4.0."
(defun nnir-run-hyrex (query server &optional group)
(save-excursion
(let ((artlist nil)
- (groupspec (cdr (assq 'group query)))
+ (groupspec (cdr (assq 'hyrex-group query)))
(qstring (cdr (assq 'query query)))
(prefix (nnir-read-server-parm 'nnir-hyrex-remove-prefix server))
score artno dirnam)
@@ -1323,7 +1443,7 @@ Tested with Namazu 2.0.6 on a GNU/Linux system."
;; (when group
;; (error "The Namazu backend cannot search specific groups"))
(save-excursion
- (let ((article-pattern (if (string-match "^nnmaildir:"
+ (let ((article-pattern (if (string-match "\\`nnmaildir:"
(gnus-group-server server))
":[0-9]+"
"^[0-9]+$"))
@@ -1394,10 +1514,10 @@ actually)."
(save-excursion
(let ( (qstring (cdr (assq 'query query)))
- (groupspec (cdr (assq 'group query)))
+ (groupspec (cdr (assq 'notmuch-group query)))
(prefix (nnir-read-server-parm 'nnir-notmuch-remove-prefix server))
artlist
- (article-pattern (if (string-match "^nnmaildir:"
+ (article-pattern (if (string-match "\\`nnmaildir:"
(gnus-group-server server))
":[0-9]+"
"^[0-9]+$"))
@@ -1467,24 +1587,23 @@ actually)."
(directory (cadr (assoc sym (cddr method))))
(regexp (cdr (assoc 'query query)))
(grep-options (cdr (assoc 'grep-options query)))
- (grouplist (or grouplist (nnir-get-active server)))
- artlist)
+ (grouplist (or grouplist (nnir-get-active server))))
(unless directory
(error "No directory found in method specification of server %s"
server))
(apply
'vconcat
(mapcar (lambda (x)
- (let ((group x))
+ (let ((group x)
+ artlist)
(message "Searching %s using find-grep..."
(or group server))
(save-window-excursion
(set-buffer (get-buffer-create nnir-tmp-buffer))
- (erase-buffer)
(if (> gnus-verbose 6)
(pop-to-buffer (current-buffer)))
(cd directory) ; Using relative paths simplifies
- ; postprocessing.
+ ; postprocessing.
(let ((group
(if (not group)
"."
@@ -1507,7 +1626,8 @@ actually)."
(save-excursion
(apply
'call-process "find" nil t
- "find" group "-type" "f" "-name" "[0-9]*" "-exec"
+ "find" group "-maxdepth" "1" "-type" "f"
+ "-name" "[0-9]*" "-exec"
"grep"
`("-l" ,@(and grep-options
(split-string grep-options "\\s-" t))
@@ -1557,8 +1677,8 @@ actually)."
(error "Can't search non-gmane groups: %s" x)))
groups " "))
(authorspec
- (if (assq 'author query)
- (format "author:%s" (cdr (assq 'author query))) ""))
+ (if (assq 'gmane-author query)
+ (format "author:%s" (cdr (assq 'gmane-author query))) ""))
(search (format "%s %s %s"
qstring groupspec authorspec))
(gnus-inhibit-demon t)
@@ -1594,11 +1714,16 @@ actually)."
;;; Util Code:
-(defun nnir-read-parms (query nnir-search-engine)
+(defun gnus-nnir-group-p (group)
+ "Say whether GROUP is nnir or not."
+ (if (gnus-group-prefixed-p group)
+ (eq 'nnir (car (gnus-find-method-for-group group)))
+ (and group (string-match "^nnir" group))))
+
+(defun nnir-read-parms (nnir-search-engine)
"Reads additional search parameters according to `nnir-engines'."
(let ((parmspec (caddr (assoc nnir-search-engine nnir-engines))))
- (append query
- (mapcar 'nnir-read-parm parmspec))))
+ (mapcar 'nnir-read-parm parmspec)))
(defun nnir-read-parm (parmspec)
"Reads a single search parameter.
@@ -1612,46 +1737,23 @@ actually)."
(cons sym (format (cdr mapping) result)))
(cons sym (read-string prompt)))))
-(autoload 'gnus-group-topic-name "gnus-topic")
-
-(defun nnir-run-query (query)
- "Invoke appropriate search engine function (see `nnir-engines').
- If some groups were process-marked, run the query for each of the groups
- and concat the results."
- (let ((q (car (read-from-string query)))
- (groups (if (not (string= "nnir" nnir-address))
- (list (list nnir-address))
- (nnir-categorize
- (or gnus-group-marked
- (if (gnus-group-group-name)
- (list (gnus-group-group-name))
- (cdr (assoc (gnus-group-topic-name)
- gnus-topic-alist))))
- gnus-group-server))))
- (apply 'vconcat
- (mapcar
- (lambda (x)
- (let* ((server (car x))
- (nnir-search-engine
- (or (nnir-read-server-parm 'nnir-search-engine
- server t)
- (cdr (assoc (car
- (gnus-server-to-method server))
- nnir-method-default-engines))))
- search-func)
- (setq search-func (cadr (assoc nnir-search-engine
- nnir-engines)))
- (if search-func
- (funcall
- search-func
- (if nnir-extra-parms
- (or (and (eq nnir-search-engine 'imap)
- (assq 'criteria q) q)
- (setq q (nnir-read-parms q nnir-search-engine)))
- q)
- server (cadr x))
- nil)))
- groups))))
+(defun nnir-run-query (specs)
+ "Invoke appropriate search engine function (see `nnir-engines')."
+ (apply 'vconcat
+ (mapcar
+ (lambda (x)
+ (let* ((server (car x))
+ (search-engine (nnir-server-to-search-engine server))
+ (search-func (cadr (assoc search-engine nnir-engines))))
+ (and search-func
+ (funcall search-func (cdr (assq 'nnir-query-spec specs))
+ server (cadr x)))))
+ (cdr (assq 'nnir-group-spec specs)))))
+
+(defun nnir-server-to-search-engine (server)
+ (or (nnir-read-server-parm 'nnir-search-engine server t)
+ (cdr (assoc (car (gnus-server-to-method server))
+ nnir-method-default-engines))))
(defun nnir-read-server-parm (key server &optional not-global)
"Returns the parameter value corresponding to `key' for
@@ -1663,36 +1765,43 @@ environment unless `not-global' is non-nil."
((and (not not-global) (boundp key)) (symbol-value key))
(t nil))))
+(defun nnir-possibly-change-group (group &optional server)
+ (or (not server) (nnir-server-opened server) (nnir-open-server server))
+ (when (gnus-nnir-group-p group)
+ (setq nnir-artlist (gnus-group-get-parameter
+ (gnus-group-prefixed-name
+ (gnus-group-short-name group) '(nnir "nnir"))
+ 'nnir-artlist t))))
-(defun nnir-possibly-change-server (server)
- (unless (and server (nnir-server-opened server))
- (nnir-open-server server)))
-
+(defun nnir-server-opened (&optional server)
+ (let ((backend (car (gnus-server-to-method server))))
+ (nnoo-current-server-p (or backend 'nnir) server)))
(defun nnir-search-thread (header)
- "Make an nnir group based on the thread containing the article header"
- (let ((parm (list
- (cons 'query
- (nnimap-make-thread-query header))
- (cons 'criteria "")
- (cons 'server (gnus-method-to-server
- (gnus-find-method-for-group
- gnus-newsgroup-name))))))
- (gnus-group-make-nnir-group nil parm)
+ "Make an nnir group based on the thread containing the article
+header. The current server will be searched. If the registry is
+installed, the server that the registry reports the current
+article came from is also searched."
+ (let* ((query
+ (list (cons 'query (nnimap-make-thread-query header))
+ (cons 'criteria "")))
+ (server
+ (list (list (gnus-method-to-server
+ (gnus-find-method-for-group gnus-newsgroup-name)))))
+ (registry-group (and
+ (gnus-bound-and-true-p 'gnus-registry-enabled)
+ (car (gnus-registry-get-id-key
+ (mail-header-id header) 'group))))
+ (registry-server
+ (and registry-group
+ (gnus-method-to-server
+ (gnus-find-method-for-group registry-group)))))
+ (when registry-server (add-to-list 'server (list registry-server)))
+ (gnus-group-make-nnir-group nil (list
+ (cons 'nnir-query-spec query)
+ (cons 'nnir-group-spec server)))
(gnus-summary-goto-subject (gnus-id-to-article (mail-header-id header)))))
-;; unused?
-(defun nnir-artlist-groups (artlist)
- "Returns a list of all groups in the given ARTLIST."
- (let ((res nil)
- (with-dups nil))
- ;; from each artitem, extract group component
- (setq with-dups (mapcar 'nnir-artitem-group artlist))
- ;; remove duplicates from above
- (mapc (function (lambda (x) (add-to-list 'res x)))
- with-dups)
- res))
-
(defun nnir-get-active (srv)
(let ((method (gnus-server-to-method srv))
groups)
@@ -1757,6 +1866,53 @@ environment unless `not-global' is non-nil."
(add-hook 'gnus-summary-article-expire-hook 'nnir-registry-action t t))))
+(defun gnus-summary-create-nnir-group ()
+ (interactive)
+ (or (nnir-server-opened "") (nnir-open-server "nnir"))
+ (let ((name (gnus-read-group "Group name: "))
+ (method '(nnir ""))
+ (pgroup
+ (gnus-group-guess-full-name-from-command-method gnus-newsgroup-name)))
+ (with-current-buffer gnus-group-buffer
+ (gnus-group-make-group
+ name method nil
+ (gnus-group-find-parameter pgroup)))))
+
+
+(deffoo nnir-request-create-group (group &optional server args)
+ (message "Creating nnir group %s" group)
+ (let* ((group (gnus-group-prefixed-name group '(nnir "nnir")))
+ (specs (assq 'nnir-specs args))
+ (query-spec
+ (or (cdr (assq 'nnir-query-spec specs))
+ (list (cons 'query
+ (read-string "Query: " nil 'nnir-search-history)))))
+ (group-spec
+ (or (cdr (assq 'nnir-group-spec specs))
+ (list (list (read-string "Server: " nil nil)))))
+ (nnir-specs (list (cons 'nnir-query-spec query-spec)
+ (cons 'nnir-group-spec group-spec))))
+ (gnus-group-set-parameter group 'nnir-specs nnir-specs)
+ (gnus-group-set-parameter
+ group 'nnir-artlist
+ (or (cdr (assq 'nnir-artlist args))
+ (nnir-run-query nnir-specs)))
+ (nnir-request-update-info group (gnus-get-info group)))
+ t)
+
+(deffoo nnir-request-delete-group (group &optional force server)
+ t)
+
+(deffoo nnir-request-list (&optional server)
+ t)
+
+(deffoo nnir-request-scan (group method)
+ t)
+
+(deffoo nnir-request-close ()
+ t)
+
+(nnoo-define-skeleton nnir)
;; The end.
(provide 'nnir)
diff --git a/lisp/gnus/nntp.el b/lisp/gnus/nntp.el
index a21fc85752c..58135a1e598 100644
--- a/lisp/gnus/nntp.el
+++ b/lisp/gnus/nntp.el
@@ -1282,7 +1282,7 @@ If SEND-IF-FORCE, only send authinfo to the server if the
"nntpd" pbuffer nntp-address nntp-port-number
:type (cadr (assoc nntp-open-connection-function map))
:end-of-command "^\\([2345]\\|[.]\\).*\n"
- :capability-command "CAPABILITIES\r\n"
+ :capability-command "HELP\r\n"
:success "^3"
:starttls-function
(lambda (capabilities)
diff --git a/lisp/gnus/pop3.el b/lisp/gnus/pop3.el
index 719dff471ad..5ccbd197ff0 100644
--- a/lisp/gnus/pop3.el
+++ b/lisp/gnus/pop3.el
@@ -98,20 +98,53 @@ set this to 1."
:group 'pop3)
(defcustom pop3-leave-mail-on-server nil
- "*Non-nil if the mail is to be left on the POP server after fetching.
-
-If `pop3-leave-mail-on-server' is non-nil the mail is to be left
-on the POP server after fetching. Note that POP servers maintain
-no state information between sessions, so what the client
-believes is there and what is actually there may not match up.
-If they do not, then you may get duplicate mails or the whole
-thing can fall apart and leave you with a corrupt mailbox."
- ;; We can't use the UILD support from XEmacs mail-lib or cvs.m17n.org:
- ;; http://thread.gmane.org/v9lld8fml4.fsf@marauder.physik.uni-ulm.de
- ;; http://thread.gmane.org/b9yy8hzy9ej.fsf@jpl.org
- ;; Any volunteer to re-implement this?
- :version "22.1" ;; Oort Gnus
- :type 'boolean
+ "Non-nil if the mail is to be left on the POP server after fetching.
+Mails once fetched will never be fetched again by the UIDL control.
+
+If this is neither nil nor a number, all mails will be left on the
+server. If this is a number, leave mails on the server for this many
+days since you first checked new mails. If this is nil, mails will be
+deleted on the server right after fetching.
+
+Gnus users should use the `:leave' keyword in a mail source to direct
+the behaviour per server, rather than directly modifying this value.
+
+Note that POP servers maintain no state information between sessions,
+so what the client believes is there and what is actually there may
+not match up. If they do not, then you may get duplicate mails or
+the whole thing can fall apart and leave you with a corrupt mailbox."
+ :version "24.4"
+ :type '(choice (const :tag "Don't leave mails" nil)
+ (const :tag "Leave all mails" t)
+ (number :tag "Leave mails for this many days" :value 14))
+ :group 'pop3)
+
+(defcustom pop3-uidl-file "~/.pop3-uidl"
+ "File used to save UIDL."
+ :version "24.4"
+ :type 'file
+ :group 'pop3)
+
+(defcustom pop3-uidl-file-backup '(0 9)
+ "How to backup the UIDL file `pop3-uidl-file' when updating.
+If it is a list of numbers, the first one binds `kept-old-versions' and
+the other binds `kept-new-versions' to keep number of oldest and newest
+versions. Otherwise, the value binds `version-control' (which see).
+
+Note: Backup will take place whenever you check new mails on a server.
+So, you may lose the backup files having been saved before a trouble
+if you set it so as to make too few backups whereas you have access to
+many servers."
+ :version "24.4"
+ :type '(choice (group :tag "Keep versions" :format "\n%v" :indent 3
+ (number :tag "oldest")
+ (number :tag "newest"))
+ (sexp :format "%v"
+ :match (lambda (widget value)
+ (condition-case nil
+ (not (and (numberp (car value))
+ (numberp (car (cdr value)))))
+ (error t)))))
:group 'pop3)
(defvar pop3-timestamp nil
@@ -144,34 +177,66 @@ Shorter values mean quicker response, but are more CPU intensive.")
(truncate pop3-read-timeout))
1000))))))
+(defvar pop3-uidl)
+;; List of UIDLs of existing messages at present in the server:
+;; ("UIDL1" "UIDL2" "UIDL3"...)
+
+(defvar pop3-uidl-saved)
+;; Locally saved UIDL data; an alist of the server, the user, and the UIDL
+;; and timestamp pairs:
+;; (("SERVER_A" ("USER_A1" "UIDL1" TIMESTAMP1 "UIDL2" TIMESTAMP2...)
+;; ("USER_A2" "UIDL1" TIMESTAMP1 "UIDL2" TIMESTAMP2...)
+;; ...)
+;; ("SERVER_B" ("USER_B1" "UIDL1" TIMESTAMP1 "UIDL2" TIMESTAMP2...)
+;; ("USER_B2" "UIDL1" TIMESTAMP1 "UIDL2" TIMESTAMP2...)
+;; ...))
+;; Where TIMESTAMP is the most significant two digits of an Emacs time,
+;; i.e. the return value of `current-time'.
+
;;;###autoload
(defun pop3-movemail (file)
"Transfer contents of a maildrop to the specified FILE.
Use streaming commands."
- (let* ((process (pop3-open-server pop3-mailhost pop3-port))
- message-count message-total-size)
+ (let ((process (pop3-open-server pop3-mailhost pop3-port))
+ messages total-size
+ pop3-uidl
+ pop3-uidl-saved)
(pop3-logon process)
- (with-current-buffer (process-buffer process)
+ (if pop3-leave-mail-on-server
+ (setq messages (pop3-uidl-stat process)
+ total-size (cadr messages)
+ messages (car messages))
(let ((size (pop3-stat process)))
- (setq message-count (car size)
- message-total-size (cadr size)))
- (when (> message-count 0)
- (pop3-send-streaming-command
- process "RETR" message-count message-total-size)
- (pop3-write-to-file file)
+ (dotimes (i (car size)) (push (1+ i) messages))
+ (setq messages (nreverse messages)
+ total-size (cadr size))))
+ (when messages
+ (with-current-buffer (process-buffer process)
+ (pop3-send-streaming-command process "RETR" messages total-size)
+ (pop3-write-to-file file messages)
(unless pop3-leave-mail-on-server
- (pop3-send-streaming-command
- process "DELE" message-count nil))))
- (pop3-quit process)
+ (pop3-send-streaming-command process "DELE" messages nil))))
+ (if pop3-leave-mail-on-server
+ (when (prog1 (pop3-uidl-dele process) (pop3-quit process))
+ (pop3-uidl-save))
+ (pop3-quit process)
+ ;; Remove UIDL data for the account that got not to leave mails.
+ (setq pop3-uidl-saved (pop3-uidl-load))
+ (let ((elt (assoc pop3-maildrop
+ (cdr (assoc pop3-mailhost pop3-uidl-saved)))))
+ (when elt
+ (setcdr elt nil)
+ (pop3-uidl-save))))
t))
-(defun pop3-send-streaming-command (process command count total-size)
+(defun pop3-send-streaming-command (process command messages total-size)
(erase-buffer)
- (let ((i 1)
+ (let ((count (length messages))
+ (i 1)
(start-point (point-min))
(waited-for 0))
- (while (>= count i)
- (process-send-string process (format "%s %d\r\n" command i))
+ (while messages
+ (process-send-string process (format "%s %d\r\n" command (pop messages)))
;; Only do 100 messages at a time to avoid pipe stalls.
(when (zerop (% i pop3-stream-length))
(setq start-point
@@ -207,7 +272,7 @@ Use streaming commands."
(pop3-accept-process-output process))
start-point)
-(defun pop3-write-to-file (file)
+(defun pop3-write-to-file (file messages)
(let ((pop-buffer (current-buffer))
(start (point-min))
beg end
@@ -230,6 +295,8 @@ Use streaming commands."
(pop3-clean-region hstart (point))
(goto-char (point-max))
(pop3-munge-message-separator hstart (point))
+ (when pop3-leave-mail-on-server
+ (pop3-uidl-add-xheader hstart (pop messages)))
(goto-char (point-max))))))
(let ((coding-system-for-write 'binary))
(goto-char (point-min))
@@ -275,6 +342,184 @@ Use streaming commands."
(pop3-quit process)
message-count))
+(defun pop3-uidl-stat (process)
+ "Return a list of unread message numbers and total size."
+ (pop3-send-command process "UIDL")
+ (let (err messages size)
+ (if (condition-case code
+ (progn
+ (pop3-read-response process)
+ t)
+ (error (setq err (error-message-string code))
+ nil))
+ (let ((start pop3-read-point)
+ saved list)
+ (with-current-buffer (process-buffer process)
+ (while (not (re-search-forward "^\\.\r\n" nil t))
+ (unless (memq (process-status process) '(open run))
+ (error "pop3 server closed the connection"))
+ (pop3-accept-process-output process)
+ (goto-char start))
+ (setq pop3-read-point (point-marker)
+ pop3-uidl nil)
+ (while (progn (forward-line -1) (>= (point) start))
+ (when (looking-at "[0-9]+ \\([^\n\r ]+\\)")
+ (push (match-string 1) pop3-uidl)))
+ (when pop3-uidl
+ (setq pop3-uidl-saved (pop3-uidl-load)
+ saved (cdr (assoc pop3-maildrop
+ (cdr (assoc pop3-mailhost
+ pop3-uidl-saved)))))
+ (let ((i (length pop3-uidl)))
+ (while (> i 0)
+ (unless (member (nth (1- i) pop3-uidl) saved)
+ (push i messages))
+ (decf i)))
+ (when messages
+ (setq list (pop3-list process)
+ size 0)
+ (dolist (msg messages)
+ (setq size (+ size (cdr (assq msg list)))))
+ (list messages size)))))
+ (message "%s doesn't support UIDL (%s), so we try a regressive way..."
+ pop3-mailhost err)
+ (sit-for 1)
+ (setq size (pop3-stat process))
+ (dotimes (i (car size)) (push (1+ i) messages))
+ (setcar size (nreverse messages))
+ size)))
+
+(defun pop3-uidl-dele (process)
+ "Delete messages according to `pop3-leave-mail-on-server'.
+Return non-nil if it is necessary to update the local UIDL file."
+ (let* ((ctime (current-time))
+ (srvr (assoc pop3-mailhost pop3-uidl-saved))
+ (saved (assoc pop3-maildrop (cdr srvr)))
+ i uidl mod new tstamp dele)
+ (setcdr (cdr ctime) nil)
+ ;; Add new messages to the data to be saved.
+ (cond ((and pop3-uidl saved)
+ (setq i (1- (length pop3-uidl)))
+ (while (>= i 0)
+ (unless (member (setq uidl (nth i pop3-uidl)) (cdr saved))
+ (push ctime new)
+ (push uidl new))
+ (decf i)))
+ (pop3-uidl
+ (setq new (apply 'nconc (mapcar (lambda (elt) (list elt ctime))
+ pop3-uidl)))))
+ (when new (setq mod t))
+ ;; List expirable messages and delete them from the data to be saved.
+ (setq ctime (when (numberp pop3-leave-mail-on-server)
+ (/ (+ (* (car ctime) 65536.0) (cadr ctime)) 86400))
+ i (1- (length saved)))
+ (while (> i 0)
+ (if (member (setq uidl (nth (1- i) saved)) pop3-uidl)
+ (progn
+ (setq tstamp (nth i saved))
+ (if (and ctime
+ (> (- ctime (/ (+ (* (car tstamp) 65536.0) (cadr tstamp))
+ 86400))
+ pop3-leave-mail-on-server))
+ ;; Mails to delete.
+ (progn
+ (setq mod t)
+ (push uidl dele))
+ ;; Mails to keep.
+ (push tstamp new)
+ (push uidl new)))
+ ;; Mails having been deleted in the server.
+ (setq mod t))
+ (decf i 2))
+ (cond (saved
+ (setcdr saved new))
+ (srvr
+ (setcdr (last srvr) (list (cons pop3-maildrop new))))
+ (t
+ (add-to-list 'pop3-uidl-saved
+ (list pop3-mailhost (cons pop3-maildrop new))
+ t)))
+ ;; Actually delete the messages in the server.
+ (when dele
+ (setq uidl nil
+ i (length pop3-uidl))
+ (while (> i 0)
+ (when (member (nth (1- i) pop3-uidl) dele)
+ (push i uidl))
+ (decf i))
+ (when uidl
+ (pop3-send-streaming-command process "DELE" uidl nil)))
+ mod))
+
+(defun pop3-uidl-load ()
+ "Load saved UIDL."
+ (when (file-exists-p pop3-uidl-file)
+ (with-temp-buffer
+ (condition-case code
+ (progn
+ (insert-file-contents pop3-uidl-file)
+ (goto-char (point-min))
+ (read (current-buffer)))
+ (error
+ (message "Error while loading %s (%s)"
+ pop3-uidl-file (error-message-string code))
+ (sit-for 1)
+ nil)))))
+
+(defun pop3-uidl-save ()
+ "Save UIDL."
+ (with-temp-buffer
+ (if pop3-uidl-saved
+ (progn
+ (insert "(")
+ (dolist (srvr pop3-uidl-saved)
+ (when (cdr srvr)
+ (insert "(\"" (pop srvr) "\"\n ")
+ (dolist (elt srvr)
+ (when (cdr elt)
+ (insert "(\"" (pop elt) "\"\n ")
+ (while elt
+ (insert (format "\"%s\" %s\n " (pop elt) (pop elt))))
+ (delete-char -4)
+ (insert ")\n ")))
+ (delete-char -3)
+ (if (eq (char-before) ?\))
+ (insert ")\n ")
+ (goto-char (1+ (point-at-bol)))
+ (delete-region (point) (point-max)))))
+ (when (eq (char-before) ? )
+ (delete-char -2))
+ (insert ")\n"))
+ (insert "()\n"))
+ (let ((buffer-file-name pop3-uidl-file)
+ (delete-old-versions t)
+ (kept-new-versions kept-new-versions)
+ (kept-old-versions kept-old-versions)
+ (version-control version-control))
+ (if (consp pop3-uidl-file-backup)
+ (setq kept-new-versions (cadr pop3-uidl-file-backup)
+ kept-old-versions (car pop3-uidl-file-backup)
+ version-control t)
+ (setq version-control pop3-uidl-file-backup))
+ (save-buffer))))
+
+(defun pop3-uidl-add-xheader (start msgno)
+ "Add X-UIDL header."
+ (let ((case-fold-search t))
+ (save-restriction
+ (narrow-to-region start (progn
+ (goto-char start)
+ (search-forward "\n\n" nil 'move)
+ (1- (point))))
+ (goto-char start)
+ (while (re-search-forward "^x-uidl:" nil t)
+ (while (progn
+ (forward-line 1)
+ (memq (char-after) '(?\t ? ))))
+ (delete-region (match-beginning 0) (point)))
+ (goto-char (point-max))
+ (insert "X-UIDL: " (nth (1- msgno) pop3-uidl) "\n"))))
+
(defcustom pop3-stream-type nil
"*Transport security type for POP3 connections.
This may be either nil (plain connection), `ssl' (use an
@@ -663,6 +908,13 @@ and close the connection."
;; Possible responses:
;; +OK [all delete marks removed]
+;; UIDL [msg]
+;; Arguments: a message-id (optional)
+;; Restrictions: transaction state; msg must not be deleted
+;; Possible responses:
+;; +OK [uidl listing follows]
+;; -ERR [no such message]
+
;;; UPDATE STATE
;; QUIT
diff --git a/lisp/gnus/shr.el b/lisp/gnus/shr.el
index ae3108a0a67..293ba2445e9 100644
--- a/lisp/gnus/shr.el
+++ b/lisp/gnus/shr.el
@@ -347,11 +347,11 @@ size, and full-buffer size."
((eq shr-folding-mode 'none)
(insert text))
(t
- (when (and (string-match "\\`[ \t\n ]" text)
+ (when (and (string-match "\\`[ \t\n ]" text)
(not (bolp))
(not (eq (char-after (1- (point))) ? )))
(insert " "))
- (dolist (elem (split-string text "[ \f\t\n\r\v ]+" t))
+ (dolist (elem (split-string text "[ \f\t\n\r\v ]+" t))
(when (and (bolp)
(> shr-indentation 0))
(shr-indent))
@@ -391,7 +391,7 @@ size, and full-buffer size."
(shr-indent))
(end-of-line))
(insert " ")))
- (unless (string-match "[ \t\r\n ]\\'" text)
+ (unless (string-match "[ \t\r\n ]\\'" text)
(delete-char -1)))))
(defun shr-find-fill-point ()
@@ -520,6 +520,11 @@ size, and full-buffer size."
(dolist (type types)
(shr-add-font (or shr-start (point)) (point) type))))
+(defun shr-make-overlay (beg end &optional buffer front-advance rear-advance)
+ (let ((overlay (make-overlay beg end buffer front-advance rear-advance)))
+ (overlay-put overlay 'evaporate t)
+ overlay))
+
;; Add an overlay in the region, but avoid putting the font properties
;; on blank text at the start of the line, and the newline at the end,
;; to avoid ugliness.
@@ -529,7 +534,7 @@ size, and full-buffer size."
(while (< (point) end)
(when (bolp)
(skip-chars-forward " "))
- (let ((overlay (make-overlay (point) (min (line-end-position) end))))
+ (let ((overlay (shr-make-overlay (point) (min (line-end-position) end))))
(overlay-put overlay 'face type))
(if (< (line-end-position) end)
(forward-line 1)
@@ -588,6 +593,17 @@ size, and full-buffer size."
(put-text-property start (point) type value))))))))))
(kill-buffer image-buffer)))
+(defun shr-image-from-data (data)
+ "Return an image from the data: URI content DATA."
+ (when (string-match
+ "\\(\\([^/;,]+\\(/[^;,]+\\)?\\)\\(;[^;,]+\\)*\\)?,\\(.*\\)"
+ data)
+ (let ((param (match-string 4 data))
+ (payload (url-unhex-string (match-string 5 data))))
+ (when (string-match "^.*\\(;[ \t]*base64\\)$" param)
+ (setq payload (base64-decode-string payload)))
+ payload)))
+
(defun shr-put-image (data alt &optional flags)
"Put image DATA with a string ALT. Return image."
(if (display-graphic-p)
@@ -615,7 +631,12 @@ size, and full-buffer size."
(overlay-put overlay 'face 'default)))
(insert-image image (or alt "*")))
(put-text-property start (point) 'image-size size)
- (when (image-animated-p image)
+ (when (if (fboundp 'image-multi-frame-p)
+ ;; Only animate multi-frame things that specify a
+ ;; delay; eg animated gifs as opposed to
+ ;; multi-page tiffs. FIXME?
+ (cdr (image-multi-frame-p image))
+ (image-animated-p image))
(image-animate image nil 60)))
image)
(insert alt)))
@@ -785,7 +806,7 @@ ones, in case fg and bg are nil."
(when (and (< (setq column (current-column)) width)
(< (setq column (shr-previous-newline-padding-width column))
width))
- (let ((overlay (make-overlay (point) (1+ (point)))))
+ (let ((overlay (shr-make-overlay (point) (1+ (point)))))
(overlay-put overlay 'before-string
(concat
(mapconcat
@@ -931,7 +952,8 @@ ones, in case fg and bg are nil."
(start (point))
shr-start)
(shr-generic cont)
- (shr-urlify (or shr-start start) (shr-expand-url url) title)))
+ (when url
+ (shr-urlify (or shr-start start) (shr-expand-url url) title))))
(defun shr-tag-object (cont)
(let ((start (point))
@@ -972,6 +994,12 @@ ones, in case fg and bg are nil."
;; Ignore zero-sized or single-pixel images.
)
((and (not shr-inhibit-images)
+ (string-match "\\`data:" url))
+ (let ((image (shr-image-from-data (substring url (match-end 0)))))
+ (if image
+ (funcall shr-put-image-function image alt)
+ (insert alt))))
+ ((and (not shr-inhibit-images)
(string-match "\\`cid:" url))
(let ((url (substring url (match-end 0)))
image)
@@ -1232,8 +1260,8 @@ ones, in case fg and bg are nil."
(end-of-line)
(insert line shr-table-vertical-line)
(dolist (overlay overlay-line)
- (let ((o (make-overlay (- (point) (nth 0 overlay) 1)
- (- (point) (nth 1 overlay) 1)))
+ (let ((o (shr-make-overlay (- (point) (nth 0 overlay) 1)
+ (- (point) (nth 1 overlay) 1)))
(properties (nth 2 overlay)))
(while properties
(overlay-put o (pop properties) (pop properties)))))
@@ -1334,8 +1362,8 @@ ones, in case fg and bg are nil."
(let ((end (length (car cache))))
(dolist (overlay (cadr cache))
(let ((new-overlay
- (make-overlay (1+ (- end (nth 0 overlay)))
- (1+ (- end (nth 1 overlay)))))
+ (shr-make-overlay (1+ (- end (nth 0 overlay)))
+ (1+ (- end (nth 1 overlay)))))
(properties (nth 2 overlay)))
(while properties
(overlay-put new-overlay
@@ -1465,7 +1493,7 @@ ones, in case fg and bg are nil."
(provide 'shr)
;; Local Variables:
-;; coding: iso-8859-1
+;; coding: utf-8
;; End:
;;; shr.el ends here
diff --git a/lisp/gnus/sieve-mode.el b/lisp/gnus/sieve-mode.el
index 712ba34fb68..64768370488 100644
--- a/lisp/gnus/sieve-mode.el
+++ b/lisp/gnus/sieve-mode.el
@@ -131,14 +131,17 @@
(eval-when-compile
(list
;; control commands
- (cons (regexp-opt '("require" "if" "else" "elsif" "stop"))
+ (cons (regexp-opt '("require" "if" "else" "elsif" "stop")
+ 'words)
'sieve-control-commands-face)
;; action commands
- (cons (regexp-opt '("fileinto" "redirect" "reject" "keep" "discard"))
+ (cons (regexp-opt '("fileinto" "redirect" "reject" "keep" "discard")
+ 'words)
'sieve-action-commands-face)
;; test commands
(cons (regexp-opt '("address" "allof" "anyof" "exists" "false"
- "true" "header" "not" "size" "envelope"))
+ "true" "header" "not" "size" "envelope")
+ 'words)
'sieve-test-commands-face)
(cons "\\Sw+:\\sw+"
'sieve-tagged-arguments-face))))
diff --git a/lisp/gnus/smiley.el b/lisp/gnus/smiley.el
index 6381f5bf9d9..eb71134457c 100644
--- a/lisp/gnus/smiley.el
+++ b/lisp/gnus/smiley.el
@@ -59,7 +59,10 @@
(defcustom smiley-style
(if (or (and (fboundp 'face-attribute)
- (>= (face-attribute 'default :height) 160))
+ ;; In batch mode, attributes can be unspecified.
+ (condition-case nil
+ (>= (face-attribute 'default :height) 160)
+ (error nil)))
(and (fboundp 'face-height)
(>= (face-height 'default) 14)))
'medium
diff --git a/lisp/gnus/spam-stat.el b/lisp/gnus/spam-stat.el
index 1ef645d2003..d75e8198842 100644
--- a/lisp/gnus/spam-stat.el
+++ b/lisp/gnus/spam-stat.el
@@ -494,6 +494,18 @@ where DIFF is the difference between SCORE and 0.5."
(setcdr (nthcdr 14 result) nil)
result))
+(eval-when-compile
+ (defmacro spam-stat-called-interactively-p (kind)
+ (condition-case nil
+ (progn
+ (eval '(called-interactively-p 'any))
+ ;; Emacs >=23.2
+ `(called-interactively-p ,kind))
+ ;; Emacs <23.2
+ (wrong-number-of-arguments '(called-interactively-p))
+ ;; XEmacs
+ (void-function '(interactive-p)))))
+
(defun spam-stat-score-buffer ()
"Return a score describing the spam-probability for this buffer.
Add user supplied modifications if supplied."
@@ -511,7 +523,7 @@ Add user supplied modifications if supplied."
(error nil)))
(ans
(if score1s (+ score0 score1s) score0)))
- (when (interactive-p)
+ (when (spam-stat-called-interactively-p 'any)
(message "%S" ans))
ans))
diff --git a/lisp/gnus/spam.el b/lisp/gnus/spam.el
index d84518b68b5..063ba28d6eb 100644
--- a/lisp/gnus/spam.el
+++ b/lisp/gnus/spam.el
@@ -2092,22 +2092,24 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details."
(declare-function gnus-extract-address-components "gnus-util" (from))
(eval-and-compile
- (when (condition-case nil
- (progn
- (require 'bbdb)
- (require 'bbdb-com))
- (file-error
- ;; `bbdb-records' should not be bound as an autoload function
- ;; before loading bbdb because of `bbdb-hashtable-size'.
- (defalias 'bbdb-buffer 'ignore)
- (defalias 'bbdb-create-internal 'ignore)
- (defalias 'bbdb-records 'ignore)
- (defalias 'spam-BBDB-register-routine 'ignore)
- (defalias 'spam-enter-ham-BBDB 'ignore)
- (defalias 'spam-exists-in-BBDB-p 'ignore)
- (defalias 'bbdb-gethash 'ignore)
- nil))
+ (condition-case nil
+ (progn
+ (require 'bbdb)
+ (require 'bbdb-com))
+ (file-error
+ ;; `bbdb-records' should not be bound as an autoload function
+ ;; before loading bbdb because of `bbdb-hashtable-size'.
+ (defalias 'bbdb-buffer 'ignore)
+ (defalias 'bbdb-create-internal 'ignore)
+ (defalias 'bbdb-records 'ignore)
+ (defalias 'spam-BBDB-register-routine 'ignore)
+ (defalias 'spam-enter-ham-BBDB 'ignore)
+ (defalias 'spam-exists-in-BBDB-p 'ignore)
+ (defalias 'bbdb-gethash 'ignore)
+ nil)))
+(eval-and-compile
+ (when (featurep 'bbdb-com)
;; when the BBDB changes, we want to clear out our cache
(defun spam-clear-cache-BBDB (&rest immaterial)
(spam-clear-cache 'spam-use-BBDB))
diff --git a/lisp/gnus/utf7.el b/lisp/gnus/utf7.el
index 69b189b6b53..b55b77a383b 100644
--- a/lisp/gnus/utf7.el
+++ b/lisp/gnus/utf7.el
@@ -1,4 +1,4 @@
-;;; utf7.el --- UTF-7 encoding/decoding for Emacs -*-coding: iso-8859-1;-*-
+;;; utf7.el --- UTF-7 encoding/decoding for Emacs -*-coding: utf-8;-*-
;; Copyright (C) 1999-2013 Free Software Foundation, Inc.
@@ -52,10 +52,10 @@
;; necessary coding system. The code below doesn't seem to DTRT
;; generally. E.g.:
;;
-;; (utf7-encode "a+£")
+;; (utf7-encode "a+£")
;; => "a+ACsAow-"
;;
-;; $ echo "a+£"|iconv -f iso-8859-1 -t utf-7
+;; $ echo "a+£"|iconv -f utf-8 -t utf-7
;; a+-+AKM
;;
;; -- fx
diff --git a/lisp/help-fns.el b/lisp/help-fns.el
index d38501509bb..bdf86016844 100644
--- a/lisp/help-fns.el
+++ b/lisp/help-fns.el
@@ -76,7 +76,7 @@ DEF is the function whose usage we're looking for in DOCSTRING."
(when (and docstring (string-match "\n\n(fn\\(\\( .*\\)?)\\)\\'" docstring))
(cons (format "(%s%s"
;; Replace `fn' with the actual function name.
- (if (consp def) "anonymous" def)
+ (if (symbolp def) def "anonymous")
(match-string 1 docstring))
(unless (zerop (match-beginning 0))
(substring docstring 0 (match-beginning 0))))))
@@ -336,11 +336,15 @@ suitable file is found, return nil."
;; If we don't have a file-name string by now, we lost.
nil)
;; Now, `file-name' should have become an absolute file name.
- ;; For files loaded from ~/.emacs.elc, try ~/.emacs.
+ ;; For files loaded from ~/.foo.elc, try ~/.foo.
+ ;; This applies to config files like ~/.emacs,
+ ;; which people sometimes compile.
((let (fn)
- (and (string-equal file-name
- (expand-file-name ".emacs.elc" "~"))
- (file-readable-p (setq fn (expand-file-name ".emacs" "~")))
+ (and (string-match "\\`\\..*\\.elc\\'"
+ (file-name-nondirectory file-name))
+ (string-equal (file-name-directory file-name)
+ (file-name-as-directory (expand-file-name "~")))
+ (file-readable-p (setq fn (file-name-sans-extension file-name)))
fn)))
;; When the Elisp source file can be found in the install
;; directory, return the name of that file.
@@ -789,7 +793,7 @@ it is displayed along with the global value."
(cond
((bufferp locus)
(princ (format "Local in buffer %s; "
- (buffer-name))))
+ (buffer-name buffer))))
((framep locus)
(princ (format "It is a frame-local variable; ")))
((terminal-live-p locus)
diff --git a/lisp/help-macro.el b/lisp/help-macro.el
index 7e81fc2d702..566f1597596 100644
--- a/lisp/help-macro.el
+++ b/lisp/help-macro.el
@@ -134,7 +134,7 @@ and then returns."
(when (or (eq char ??) (eq char help-char)
(memq char help-event-list))
(setq config (current-window-configuration))
- (switch-to-buffer-other-window "*Help*")
+ (pop-to-buffer " *Metahelp*" nil t)
(and (fboundp 'make-frame)
(not (eq (window-frame (selected-window))
prev-frame))
diff --git a/lisp/help-mode.el b/lisp/help-mode.el
index 33c3ab3b717..b5aca1a4445 100644
--- a/lisp/help-mode.el
+++ b/lisp/help-mode.el
@@ -322,7 +322,7 @@ Commands:
(defconst help-xref-symbol-regexp
(purecopy (concat "\\(\\<\\(\\(variable\\|option\\)\\|" ; Link to var
- "\\(function\\|command\\)\\|" ; Link to function
+ "\\(function\\|command\\|call\\)\\|" ; Link to function
"\\(face\\)\\|" ; Link to face
"\\(symbol\\|program\\|property\\)\\|" ; Don't link
"\\(source \\(?:code \\)?\\(?:of\\|for\\)\\)\\)"
@@ -677,7 +677,8 @@ help buffer."
" is also a " "face." "\n\n" facedoc))
;; Don't record the `describe-function' item in the stack.
(setq help-xref-stack-item nil)
- (help-setup-xref (list #'help-xref-interned symbol) nil)))))))
+ (help-setup-xref (list #'help-xref-interned symbol) nil))))
+ (goto-char (point-min)))))
;; Navigation/hyperlinking with xrefs
diff --git a/lisp/help.el b/lisp/help.el
index 4219dd86986..25bc9c4b7c6 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -412,7 +412,9 @@ With argument, display info only for the selected version."
The number of messages retained in that buffer
is specified by the variable `message-log-max'."
(interactive)
- (switch-to-buffer (get-buffer-create "*Messages*")))
+ (with-current-buffer (get-buffer-create "*Messages*")
+ (goto-char (point-max))
+ (display-buffer (current-buffer))))
(defun view-order-manuals ()
"Display the Emacs ORDERS file."
diff --git a/lisp/hi-lock.el b/lisp/hi-lock.el
index 476399225f4..e2dc4eac67b 100644
--- a/lisp/hi-lock.el
+++ b/lisp/hi-lock.el
@@ -1,4 +1,4 @@
-;;; hi-lock.el --- minor mode for interactive automatic highlighting
+;;; hi-lock.el --- minor mode for interactive automatic highlighting -*- lexical-binding: t -*-
;; Copyright (C) 2000-2013 Free Software Foundation, Inc.
@@ -135,6 +135,13 @@ patterns."
;; It can have a function value.
(put 'hi-lock-file-patterns-policy 'risky-local-variable t)
+(defcustom hi-lock-auto-select-face nil
+ "Non-nil if highlighting commands should not prompt for face names.
+When non-nil, each hi-lock command will cycle through faces in
+`hi-lock-face-defaults' without prompting."
+ :type 'boolean
+ :version "24.4")
+
(defgroup hi-lock-faces nil
"Faces for hi-lock."
:group 'hi-lock
@@ -198,11 +205,13 @@ patterns."
"Face for hi-lock mode."
:group 'hi-lock-faces)
-(defvar hi-lock-file-patterns nil
+(defvar-local hi-lock-file-patterns nil
"Patterns found in file for hi-lock. Should not be changed.")
+(put 'hi-lock-file-patterns 'permanent-local t)
-(defvar hi-lock-interactive-patterns nil
+(defvar-local hi-lock-interactive-patterns nil
"Patterns provided to hi-lock by user. Should not be changed.")
+(put 'hi-lock-interactive-patterns 'permanent-local t)
(define-obsolete-variable-alias 'hi-lock-face-history
'hi-lock-face-defaults "23.1")
@@ -211,9 +220,6 @@ patterns."
"hi-blue-b" "hi-red-b" "hi-green-b" "hi-black-hb")
"Default faces for hi-lock interactive functions.")
-;;(dolist (f hi-lock-face-defaults)
-;; (unless (facep f) (error "%s not a face" f)))
-
(define-obsolete-variable-alias 'hi-lock-regexp-history
'regexp-history
"23.1")
@@ -232,11 +238,6 @@ that older functionality. This variable avoids multiple reminders.")
Assumption is made if `hi-lock-mode' used in the *scratch* buffer while
a library is being loaded.")
-(make-variable-buffer-local 'hi-lock-interactive-patterns)
-(put 'hi-lock-interactive-patterns 'permanent-local t)
-(make-variable-buffer-local 'hi-lock-file-patterns)
-(put 'hi-lock-file-patterns 'permanent-local t)
-
(defvar hi-lock-menu
(let ((map (make-sparse-keymap "Hi Lock")))
(define-key-after map [highlight-regexp]
@@ -278,6 +279,26 @@ a library is being loaded.")
map)
"Key map for hi-lock.")
+(defvar hi-lock-read-regexp-defaults-function
+ 'hi-lock-read-regexp-defaults
+ "Function that provides default regexp(s) for highlighting commands.
+This function should take no arguments and return one of nil, a
+regexp or a list of regexps for use with highlighting commands -
+`hi-lock-face-phrase-buffer', `hi-lock-line-face-buffer' and
+`hi-lock-face-buffer'. The return value of this function is used
+as DEFAULTS param of `read-regexp' while executing the
+highlighting command. This function is called only during
+interactive use.
+
+For example, to highlight at symbol at point use
+
+ \(setq hi-lock-read-regexp-defaults-function
+ 'find-tag-default-as-regexp\)
+
+If you need different defaults for different highlighting
+operations, use `this-command' to identify the command under
+execution.")
+
;; Visible Functions
;;;###autoload
@@ -368,7 +389,9 @@ versions before 22 use the following in your init file:
(define-key-after menu-bar-edit-menu [hi-lock]
(cons "Regexp Highlighting" hi-lock-menu))
(hi-lock-find-patterns)
- (add-hook 'font-lock-mode-hook 'hi-lock-font-lock-hook nil t))
+ (add-hook 'font-lock-mode-hook 'hi-lock-font-lock-hook nil t)
+ ;; Remove regexps from font-lock-keywords (bug#13891).
+ (add-hook 'change-major-mode-hook (lambda () (hi-lock-mode -1)) nil t))
;; Turned off.
(when (or hi-lock-interactive-patterns
hi-lock-file-patterns)
@@ -398,17 +421,18 @@ versions before 22 use the following in your init file:
;;;###autoload
(defun hi-lock-line-face-buffer (regexp &optional face)
"Set face of all lines containing a match of REGEXP to FACE.
-Interactively, prompt for REGEXP then FACE, using a buffer-local
-history list for REGEXP and a global history list for FACE.
+Interactively, prompt for REGEXP then FACE. Use
+`hi-lock-read-regexp-defaults-function' to retrieve default
+value(s) of REGEXP. Use the global history list for FACE.
-If Font Lock mode is enabled in the buffer, it is used to
-highlight REGEXP. If Font Lock mode is disabled, overlays are
-used for highlighting; in this case, the highlighting will not be
-updated as you type."
+Use Font lock mode, if enabled, to highlight REGEXP. Otherwise,
+use overlays for highlighting. If overlays are used, the
+highlighting will not update as you type."
(interactive
(list
(hi-lock-regexp-okay
- (read-regexp "Regexp to highlight line" (car regexp-history)))
+ (read-regexp "Regexp to highlight line"
+ (funcall hi-lock-read-regexp-defaults-function)))
(hi-lock-read-face-name)))
(or (facep face) (setq face 'hi-yellow))
(unless hi-lock-mode (hi-lock-mode 1))
@@ -423,17 +447,18 @@ updated as you type."
;;;###autoload
(defun hi-lock-face-buffer (regexp &optional face)
"Set face of each match of REGEXP to FACE.
-Interactively, prompt for REGEXP then FACE, using a buffer-local
-history list for REGEXP and a global history list for FACE.
+Interactively, prompt for REGEXP then FACE. Use
+`hi-lock-read-regexp-defaults-function' to retrieve default
+value(s) REGEXP. Use the global history list for FACE.
-If Font Lock mode is enabled in the buffer, it is used to
-highlight REGEXP. If Font Lock mode is disabled, overlays are
-used for highlighting; in this case, the highlighting will not be
-updated as you type."
+Use Font lock mode, if enabled, to highlight REGEXP. Otherwise,
+use overlays for highlighting. If overlays are used, the
+highlighting will not update as you type."
(interactive
(list
(hi-lock-regexp-okay
- (read-regexp "Regexp to highlight" (car regexp-history)))
+ (read-regexp "Regexp to highlight"
+ (funcall hi-lock-read-regexp-defaults-function)))
(hi-lock-read-face-name)))
(or (facep face) (setq face 'hi-yellow))
(unless hi-lock-mode (hi-lock-mode 1))
@@ -444,75 +469,134 @@ updated as you type."
;;;###autoload
(defun hi-lock-face-phrase-buffer (regexp &optional face)
"Set face of each match of phrase REGEXP to FACE.
-If called interactively, replaces whitespace in REGEXP with
-arbitrary whitespace and makes initial lower-case letters case-insensitive.
-
-If Font Lock mode is enabled in the buffer, it is used to
-highlight REGEXP. If Font Lock mode is disabled, overlays are
-used for highlighting; in this case, the highlighting will not be
-updated as you type."
+Interactively, prompt for REGEXP then FACE. Use
+`hi-lock-read-regexp-defaults-function' to retrieve default
+value(s) of REGEXP. Use the global history list for FACE. When
+called interactively, replace whitespace in user provided regexp
+with arbitrary whitespace and make initial lower-case letters
+case-insensitive before highlighting with `hi-lock-set-pattern'.
+
+Use Font lock mode, if enabled, to highlight REGEXP. Otherwise,
+use overlays for highlighting. If overlays are used, the
+highlighting will not update as you type."
(interactive
(list
(hi-lock-regexp-okay
(hi-lock-process-phrase
- (read-regexp "Phrase to highlight" (car regexp-history))))
+ (read-regexp "Phrase to highlight"
+ (funcall hi-lock-read-regexp-defaults-function))))
(hi-lock-read-face-name)))
(or (facep face) (setq face 'hi-yellow))
(unless hi-lock-mode (hi-lock-mode 1))
(hi-lock-set-pattern regexp face))
+(defun hi-lock-keyword->face (keyword)
+ (cadr (cadr (cadr keyword)))) ; Keyword looks like (REGEXP (0 'FACE) ...).
+
(declare-function x-popup-menu "menu.c" (position menu))
+(defun hi-lock--regexps-at-point ()
+ (let ((regexps '()))
+ ;; When using overlays, there is no ambiguity on the best
+ ;; choice of regexp.
+ (let ((regexp (get-char-property (point) 'hi-lock-overlay-regexp)))
+ (when regexp (push regexp regexps)))
+ ;; With font-locking on, check if the cursor is on a highlighted text.
+ (let ((face-after (get-text-property (point) 'face))
+ (face-before
+ (unless (bobp) (get-text-property (1- (point)) 'face)))
+ (faces (mapcar #'hi-lock-keyword->face
+ hi-lock-interactive-patterns)))
+ (unless (memq face-before faces) (setq face-before nil))
+ (unless (memq face-after faces) (setq face-after nil))
+ (when (and face-before face-after (not (eq face-before face-after)))
+ (setq face-before nil))
+ (when (or face-after face-before)
+ (let* ((hi-text
+ (buffer-substring-no-properties
+ (if face-before
+ (or (previous-single-property-change (point) 'face)
+ (point-min))
+ (point))
+ (if face-after
+ (or (next-single-property-change (point) 'face)
+ (point-max))
+ (point)))))
+ ;; Compute hi-lock patterns that match the
+ ;; highlighted text at point. Use this later in
+ ;; during completing-read.
+ (dolist (hi-lock-pattern hi-lock-interactive-patterns)
+ (let ((regexp (car hi-lock-pattern)))
+ (if (string-match regexp hi-text)
+ (push regexp regexps)))))))
+ regexps))
+
+(defvar-local hi-lock--unused-faces nil
+ "List of faces that is not used and is available for highlighting new text.
+Face names from this list come from `hi-lock-face-defaults'.")
+
;;;###autoload
(defalias 'unhighlight-regexp 'hi-lock-unface-buffer)
;;;###autoload
(defun hi-lock-unface-buffer (regexp)
"Remove highlighting of each match to REGEXP set by hi-lock.
Interactively, prompt for REGEXP, accepting only regexps
-previously inserted by hi-lock interactive functions."
+previously inserted by hi-lock interactive functions.
+If REGEXP is t (or if \\[universal-argument] was specified interactively),
+then remove all hi-lock highlighting."
(interactive
- (if (and (display-popup-menus-p)
- (listp last-nonmenu-event)
- use-dialog-box)
- (catch 'snafu
- (or
- (x-popup-menu
- t
- (cons
- `keymap
- (cons "Select Pattern to Unhighlight"
- (mapcar (lambda (pattern)
- (list (car pattern)
- (format
- "%s (%s)" (car pattern)
- (symbol-name
- (car
- (cdr (car (cdr (car (cdr pattern))))))))
- (cons nil nil)
- (car pattern)))
- hi-lock-interactive-patterns))))
- ;; If the user clicks outside the menu, meaning that they
- ;; change their mind, x-popup-menu returns nil, and
- ;; interactive signals a wrong number of arguments error.
- ;; To prevent that, we return an empty string, which will
- ;; effectively disable the rest of the function.
- (throw 'snafu '(""))))
- (let ((history-list (mapcar (lambda (p) (car p))
- hi-lock-interactive-patterns)))
- (unless hi-lock-interactive-patterns
- (error "No highlighting to remove"))
+ (cond
+ (current-prefix-arg (list t))
+ ((and (display-popup-menus-p)
+ (listp last-nonmenu-event)
+ use-dialog-box)
+ (catch 'snafu
+ (or
+ (x-popup-menu
+ t
+ (cons
+ `keymap
+ (cons "Select Pattern to Unhighlight"
+ (mapcar (lambda (pattern)
+ (list (car pattern)
+ (format
+ "%s (%s)" (car pattern)
+ (hi-lock-keyword->face pattern))
+ (cons nil nil)
+ (car pattern)))
+ hi-lock-interactive-patterns))))
+ ;; If the user clicks outside the menu, meaning that they
+ ;; change their mind, x-popup-menu returns nil, and
+ ;; interactive signals a wrong number of arguments error.
+ ;; To prevent that, we return an empty string, which will
+ ;; effectively disable the rest of the function.
+ (throw 'snafu '("")))))
+ (t
+ ;; Un-highlighting triggered via keyboard action.
+ (unless hi-lock-interactive-patterns
+ (error "No highlighting to remove"))
+ ;; Infer the regexp to un-highlight based on cursor position.
+ (let* ((defaults (or (hi-lock--regexps-at-point)
+ (mapcar #'car hi-lock-interactive-patterns))))
(list
- (completing-read "Regexp to unhighlight: "
- hi-lock-interactive-patterns nil t
- (car (car hi-lock-interactive-patterns))
- (cons 'history-list 1))))))
- (let ((keyword (assoc regexp hi-lock-interactive-patterns)))
+ (completing-read (if (null defaults)
+ "Regexp to unhighlight: "
+ (format "Regexp to unhighlight (default %s): "
+ (car defaults)))
+ hi-lock-interactive-patterns
+ nil t nil nil defaults))))))
+ (dolist (keyword (if (eq regexp t) hi-lock-interactive-patterns
+ (list (assoc regexp hi-lock-interactive-patterns))))
(when keyword
+ (let ((face (hi-lock-keyword->face keyword)))
+ ;; Make `face' the next one to use by default.
+ (when (symbolp face) ;Don't add it if it's a list (bug#13297).
+ (add-to-list 'hi-lock--unused-faces (face-name face))))
(font-lock-remove-keywords nil (list keyword))
(setq hi-lock-interactive-patterns
(delq keyword hi-lock-interactive-patterns))
(remove-overlays
- nil nil 'hi-lock-overlay-regexp (hi-lock-string-serialize regexp))
+ nil nil 'hi-lock-overlay-regexp (hi-lock--hashcons (car keyword)))
(when font-lock-fontified (font-lock-fontify-buffer)))))
;;;###autoload
@@ -566,33 +650,50 @@ not suitable."
(error "Regexp cannot match an empty string")
regexp))
+(defun hi-lock-read-regexp-defaults ()
+ "Return the latest regexp from `regexp-history'.
+See `hi-lock-read-regexp-defaults-function' for details."
+ (car regexp-history))
+
(defun hi-lock-read-face-name ()
- "Read face name from minibuffer with completion and history."
- (intern (completing-read
- "Highlight using face: "
- obarray 'facep t
- (cons (car hi-lock-face-defaults)
- (let ((prefix
- (try-completion
- (substring (car hi-lock-face-defaults) 0 1)
- hi-lock-face-defaults)))
- (if (and (stringp prefix)
- (not (equal prefix (car hi-lock-face-defaults))))
- (length prefix) 0)))
- 'face-name-history
- (cdr hi-lock-face-defaults))))
+ "Return face for interactive highlighting.
+When `hi-lock-auto-select-face' is non-nil, just return the next face.
+Otherwise, read face name from minibuffer with completion and history."
+ (unless hi-lock-interactive-patterns
+ (setq hi-lock--unused-faces hi-lock-face-defaults))
+ (let* ((last-used-face
+ (when hi-lock-interactive-patterns
+ (face-name (hi-lock-keyword->face
+ (car hi-lock-interactive-patterns)))))
+ (defaults (append hi-lock--unused-faces
+ (cdr (member last-used-face hi-lock-face-defaults))
+ hi-lock-face-defaults))
+ face)
+ (if (and hi-lock-auto-select-face (not current-prefix-arg))
+ (setq face (or (pop hi-lock--unused-faces) (car defaults)))
+ (setq face (completing-read
+ (format "Highlight using face (default %s): "
+ (car defaults))
+ obarray 'facep t nil 'face-name-history defaults))
+ ;; Update list of un-used faces.
+ (setq hi-lock--unused-faces (remove face hi-lock--unused-faces))
+ ;; Grow the list of defaults.
+ (add-to-list 'hi-lock-face-defaults face t))
+ (intern face)))
(defun hi-lock-set-pattern (regexp face)
"Highlight REGEXP with face FACE."
+ ;; Hashcons the regexp, so it can be passed to remove-overlays later.
+ (setq regexp (hi-lock--hashcons regexp))
(let ((pattern (list regexp (list 0 (list 'quote face) t))))
- (unless (member pattern hi-lock-interactive-patterns)
+ ;; Refuse to highlight a text that is already highlighted.
+ (unless (assoc regexp hi-lock-interactive-patterns)
(push pattern hi-lock-interactive-patterns)
(if font-lock-mode
(progn
(font-lock-add-keywords nil (list pattern) t)
(font-lock-fontify-buffer))
- (let* ((serial (hi-lock-string-serialize regexp))
- (range-min (- (point) (/ hi-lock-highlight-range 2)))
+ (let* ((range-min (- (point) (/ hi-lock-highlight-range 2)))
(range-max (+ (point) (/ hi-lock-highlight-range 2)))
(search-start
(max (point-min)
@@ -605,7 +706,7 @@ not suitable."
(while (re-search-forward regexp search-end t)
(let ((overlay (make-overlay (match-beginning 0) (match-end 0))))
(overlay-put overlay 'hi-lock-overlay t)
- (overlay-put overlay 'hi-lock-overlay-regexp serial)
+ (overlay-put overlay 'hi-lock-overlay-regexp regexp)
(overlay-put overlay 'face face))
(goto-char (match-end 0)))))))))
@@ -655,25 +756,14 @@ not suitable."
(font-lock-add-keywords nil hi-lock-file-patterns t)
(font-lock-add-keywords nil hi-lock-interactive-patterns t)))
-(defvar hi-lock-string-serialize-hash
- (make-hash-table :test 'equal)
- "Hash table used to assign unique numbers to strings.")
+(defvar hi-lock--hashcons-hash
+ (make-hash-table :test 'equal :weakness t)
+ "Hash table used to hash cons regexps.")
-(defvar hi-lock-string-serialize-serial 1
- "Number assigned to last new string in call to `hi-lock-string-serialize'.
-A string is considered new if it had not previously been used in a call to
-`hi-lock-string-serialize'.")
-
-(defun hi-lock-string-serialize (string)
- "Return unique serial number for STRING."
- (interactive)
- (let ((val (gethash string hi-lock-string-serialize-hash)))
- (if val val
- (puthash string
- (setq hi-lock-string-serialize-serial
- (1+ hi-lock-string-serialize-serial))
- hi-lock-string-serialize-hash)
- hi-lock-string-serialize-serial)))
+(defun hi-lock--hashcons (string)
+ "Return unique object equal to STRING."
+ (or (gethash string hi-lock--hashcons-hash)
+ (puthash string string hi-lock--hashcons-hash)))
(defun hi-lock-unload-function ()
"Unload the Hi-Lock library."
diff --git a/lisp/hilit-chg.el b/lisp/hilit-chg.el
index 66440ef1cf2..17b91245d60 100644
--- a/lisp/hilit-chg.el
+++ b/lisp/hilit-chg.el
@@ -523,28 +523,12 @@ the text properties of type `hilit-chg'."
(remove-overlays beg end 'hilit-chg t)
(hilit-chg-display-changes beg end))
-;; Inspired by font-lock. Something like this should be moved to subr.el.
-(defmacro highlight-save-buffer-state (&rest body)
- "Bind variables according to VARLIST and eval BODY restoring buffer state."
- (declare (indent 0) (debug t))
- (let ((modified (make-symbol "modified")))
- `(let* ((,modified (buffer-modified-p))
- (inhibit-modification-hooks t)
- deactivate-mark
- ;; So we don't check the file's mtime.
- buffer-file-name
- buffer-file-truename)
- (progn
- ,@body)
- (unless ,modified
- (restore-buffer-modified-p nil)))))
-
;;;###autoload
(defun highlight-changes-remove-highlight (beg end)
"Remove the change face from the region between BEG and END.
This allows you to manually remove highlighting from uninteresting changes."
(interactive "r")
- (highlight-save-buffer-state
+ (with-silent-modifications
(remove-text-properties beg end '(hilit-chg nil))
(hilit-chg-fixup beg end)))
@@ -568,40 +552,40 @@ This allows you to manually remove highlighting from uninteresting changes."
(if (and highlight-changes-mode
highlight-changes-visible-mode)
(hilit-chg-fixup beg end))
- (highlight-save-buffer-state
- (if (and (= beg end) (> leng-before 0))
- ;; deletion
- (progn
- ;; The eolp and bolp tests are a kludge! But they prevent
- ;; rather nasty looking displays when deleting text at the end
- ;; of line, such as normal corrections as one is typing and
- ;; immediately makes a correction, and when deleting first
- ;; character of a line.
- ;; (if (= leng-before 1)
- ;; (if (eolp)
- ;; (setq beg-decr 0 end-incr 0)
- ;; (if (bolp)
- ;; (setq beg-decr 0))))
- ;; (setq beg (max (- beg beg-decr) (point-min)))
- (setq end (min (+ end end-incr) (point-max)))
- (setq type 'hilit-chg-delete))
- ;; Not a deletion.
- ;; Most of the time the following is not necessary, but
- ;; if the current text was marked as a deletion then
- ;; the old overlay is still in effect. So if the user adds some
- ;; text where she earlier deleted text, we have to remove the
- ;; deletion marking, and replace it explicitly with a `changed'
- ;; marking, otherwise its highlighting would disappear.
- (if (eq (get-text-property end 'hilit-chg) 'hilit-chg-delete)
- (save-restriction
- (widen)
- (put-text-property end (+ end 1) 'hilit-chg 'hilit-chg)
- (if highlight-changes-visible-mode
- (hilit-chg-fixup beg (+ end 1))))))
- (unless no-property-change
- (put-text-property beg end 'hilit-chg type))
- (if (or highlight-changes-visible-mode no-property-change)
- (hilit-chg-make-ov type beg end)))))))
+ (with-silent-modifications
+ (if (and (= beg end) (> leng-before 0))
+ ;; deletion
+ (progn
+ ;; The eolp and bolp tests are a kludge! But they prevent
+ ;; rather nasty looking displays when deleting text at the end
+ ;; of line, such as normal corrections as one is typing and
+ ;; immediately makes a correction, and when deleting first
+ ;; character of a line.
+ ;; (if (= leng-before 1)
+ ;; (if (eolp)
+ ;; (setq beg-decr 0 end-incr 0)
+ ;; (if (bolp)
+ ;; (setq beg-decr 0))))
+ ;; (setq beg (max (- beg beg-decr) (point-min)))
+ (setq end (min (+ end end-incr) (point-max)))
+ (setq type 'hilit-chg-delete))
+ ;; Not a deletion.
+ ;; Most of the time the following is not necessary, but
+ ;; if the current text was marked as a deletion then
+ ;; the old overlay is still in effect. So if the user adds some
+ ;; text where she earlier deleted text, we have to remove the
+ ;; deletion marking, and replace it explicitly with a `changed'
+ ;; marking, otherwise its highlighting would disappear.
+ (if (eq (get-text-property end 'hilit-chg) 'hilit-chg-delete)
+ (save-restriction
+ (widen)
+ (put-text-property end (+ end 1) 'hilit-chg 'hilit-chg)
+ (if highlight-changes-visible-mode
+ (hilit-chg-fixup end (+ end 1))))))
+ (unless no-property-change
+ (put-text-property beg end 'hilit-chg type))
+ (if (or highlight-changes-visible-mode no-property-change)
+ (hilit-chg-make-ov type beg end)))))))
(defun hilit-chg-update ()
"Update a buffer's highlight changes when visibility changed."
@@ -635,7 +619,7 @@ This removes all saved change information."
(message "Cannot remove highlighting from read-only mode buffer %s"
(buffer-name))
(remove-hook 'after-change-functions 'hilit-chg-set-face-on-change t)
- (highlight-save-buffer-state
+ (with-silent-modifications
(hilit-chg-hide-changes)
(hilit-chg-map-changes
(lambda (_prop start stop)
diff --git a/lisp/htmlfontify.el b/lisp/htmlfontify.el
index df8ef86a3cd..768dda993e2 100644
--- a/lisp/htmlfontify.el
+++ b/lisp/htmlfontify.el
@@ -717,7 +717,7 @@ STYLE is the inline CSS stylesheet (or tag referring to an external sheet)."
--> </script>
</head>
<body onload=\"stripe('index'); return true;\">\n"
- file style))
+ (mapconcat 'hfy-html-quote (mapcar 'char-to-string file) "") style))
(defun hfy-default-footer (_file)
"Default value for `hfy-page-footer'.
diff --git a/lisp/ibuffer.el b/lisp/ibuffer.el
index 231e7bddbc0..586c8306a36 100644
--- a/lisp/ibuffer.el
+++ b/lisp/ibuffer.el
@@ -1362,24 +1362,27 @@ group."
(defun ibuffer-mark-forward (arg)
"Mark the buffer on this line, and move forward ARG lines.
If point is on a group name, this function operates on that group."
- (interactive "P")
- (ibuffer-mark-interactive arg ibuffer-marked-char 1))
+ (interactive "p")
+ (ibuffer-mark-interactive arg ibuffer-marked-char))
(defun ibuffer-unmark-forward (arg)
"Unmark the buffer on this line, and move forward ARG lines.
If point is on a group name, this function operates on that group."
- (interactive "P")
- (ibuffer-mark-interactive arg ?\s 1))
+ (interactive "p")
+ (ibuffer-mark-interactive arg ?\s))
(defun ibuffer-unmark-backward (arg)
"Unmark the buffer on this line, and move backward ARG lines.
If point is on a group name, this function operates on that group."
- (interactive "P")
- (ibuffer-mark-interactive arg ?\s -1))
+ (interactive "p")
+ (ibuffer-unmark-forward (- arg)))
-(defun ibuffer-mark-interactive (arg mark movement)
+(defun ibuffer-mark-interactive (arg mark &optional movement)
(ibuffer-assert-ibuffer-mode)
(or arg (setq arg 1))
+ ;; deprecated movement argument
+ (when (and movement (< movement 0))
+ (setq arg (- arg)))
(ibuffer-forward-line 0)
(ibuffer-aif (get-text-property (point) 'ibuffer-filter-group-name)
(progn
@@ -1389,8 +1392,12 @@ If point is on a group name, this function operates on that group."
(let ((inhibit-read-only t))
(while (> arg 0)
(ibuffer-set-mark mark)
- (ibuffer-forward-line movement t)
- (setq arg (1- arg))))))
+ (ibuffer-forward-line 1 t)
+ (setq arg (1- arg)))
+ (while (< arg 0)
+ (ibuffer-forward-line -1 t)
+ (ibuffer-set-mark mark)
+ (setq arg (1+ arg))))))
(defun ibuffer-set-mark (mark)
(ibuffer-assert-ibuffer-mode)
@@ -3023,7 +3030,7 @@ defaults to one.
(run-hooks 'ibuffer-load-hook)
;; Local Variables:
-;; coding: iso-8859-1
+;; coding: utf-8
;; End:
;;; ibuffer.el ends here
diff --git a/lisp/icomplete.el b/lisp/icomplete.el
index e1eda278da2..73049df097d 100644
--- a/lisp/icomplete.el
+++ b/lisp/icomplete.el
@@ -71,6 +71,23 @@
(make-obsolete-variable
'icomplete-prospects-length 'icomplete-prospects-height "23.1")
+(defcustom icomplete-separator " | "
+ "String used by icomplete to separate alternatives in the minibuffer."
+ :type 'string
+ :version "24.4")
+
+(defcustom icomplete-hide-common-prefix t
+ "When non-nil, hide common prefix from completion candidates.
+When nil, show candidates in full."
+ :type 'boolean
+ :version "24.4"
+ :group 'icomplete)
+
+(defface icomplete-first-match '((t :weight bold))
+ "Face used by icomplete for highlighting first match."
+ :version "24.4"
+ :group 'icomplete)
+
;;;_* User Customization variables
(defcustom icomplete-prospects-height
;; 20 is an estimated common size for the prompt + minibuffer content, to
@@ -97,11 +114,6 @@ See `icomplete-delay-completions-threshold'."
:type 'integer
:group 'icomplete)
-(defcustom icomplete-show-key-bindings t
- "If non-nil, show key bindings as well as completion for sole matches."
- :type 'boolean
- :group 'icomplete)
-
(defcustom icomplete-minibuffer-setup-hook nil
"Icomplete-specific customization of minibuffer setup.
@@ -145,23 +157,6 @@ Use `icomplete-mode' function to set it up properly for incremental
minibuffer completion.")
(add-hook 'icomplete-post-command-hook 'icomplete-exhibit)
-(defun icomplete-get-keys (func-name)
- "Return strings naming keys bound to FUNC-NAME, or nil if none.
-Examines the prior, not current, buffer, presuming that current buffer
-is minibuffer."
- (when (commandp func-name)
- (save-excursion
- (let* ((sym (intern func-name))
- (buf (other-buffer nil t))
- (keys (with-current-buffer buf (where-is-internal sym))))
- (when keys
- (concat "<"
- (mapconcat 'key-description
- (sort keys
- #'(lambda (x y)
- (< (length x) (length y))))
- ", ")
- ">"))))))
;;;_ = icomplete-with-completion-tables
(defvar icomplete-with-completion-tables '(internal-complete-buffer)
"Specialized completion tables with which icomplete should operate.
@@ -169,6 +164,38 @@ is minibuffer."
Icomplete does not operate with any specialized completion tables
except those on this list.")
+(defvar icomplete-minibuffer-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map [?\M-\t] 'minibuffer-force-complete)
+ (define-key map [?\C-j] 'minibuffer-force-complete-and-exit)
+ (define-key map [?\C-.] 'icomplete-forward-completions)
+ (define-key map [?\C-,] 'icomplete-backward-completions)
+ map))
+
+(defun icomplete-forward-completions ()
+ "Step forward completions by one entry.
+Second entry becomes the first and can be selected with
+`minibuffer-force-complete-and-exit'."
+ (interactive)
+ (let* ((comps (completion-all-sorted-completions))
+ (last (last comps)))
+ (when comps
+ (setcdr last (cons (car comps) (cdr last)))
+ (completion--cache-all-sorted-completions (cdr comps)))))
+
+(defun icomplete-backward-completions ()
+ "Step backward completions by one entry.
+Last entry becomes the first and can be selected with
+`minibuffer-force-complete-and-exit'."
+ (interactive)
+ (let* ((comps (completion-all-sorted-completions))
+ (last-but-one (last comps 2))
+ (last (cdr last-but-one)))
+ (when (consp last) ; At least two elements in comps
+ (setcdr last-but-one (cdr last))
+ (push (car last) comps)
+ (completion--cache-all-sorted-completions comps))))
+
;;;_ > icomplete-mode (&optional prefix)
;;;###autoload
(define-minor-mode icomplete-mode
@@ -208,6 +235,8 @@ Conditions are:
Usually run by inclusion in `minibuffer-setup-hook'."
(when (and icomplete-mode (icomplete-simple-completing-p))
(set (make-local-variable 'completion-show-inline-help) nil)
+ (use-local-map (make-composed-keymap icomplete-minibuffer-map
+ (current-local-map)))
(add-hook 'pre-command-hook
(lambda () (let ((non-essential t))
(run-hooks 'icomplete-pre-command-hook)))
@@ -239,27 +268,29 @@ and `minibuffer-setup-hook'."
(goto-char (point-max))
; Insert the match-status information:
(if (and (> (point-max) (minibuffer-prompt-end))
- buffer-undo-list ; Wait for some user input.
- (or
- ;; Don't bother with delay after certain number of chars:
- (> (- (point) (field-beginning)) icomplete-max-delay-chars)
- ;; Don't delay if alternatives number is small enough:
- (and (sequencep minibuffer-completion-table)
- (< (length minibuffer-completion-table)
- icomplete-delay-completions-threshold))
- ;; Delay - give some grace time for next keystroke, before
+ buffer-undo-list ; Wait for some user input.
+ (or
+ ;; Don't bother with delay after certain number of chars:
+ (> (- (point) (field-beginning)) icomplete-max-delay-chars)
+ ;; Don't delay if the completions are known.
+ completion-all-sorted-completions
+ ;; Don't delay if alternatives number is small enough:
+ (and (sequencep minibuffer-completion-table)
+ (< (length minibuffer-completion-table)
+ icomplete-delay-completions-threshold))
+ ;; Delay - give some grace time for next keystroke, before
;; embarking on computing completions:
(sit-for icomplete-compute-delay)))
(let ((text (while-no-input
- (icomplete-completions
- (field-string)
- minibuffer-completion-table
- minibuffer-completion-predicate
+ (icomplete-completions
+ (field-string)
+ minibuffer-completion-table
+ minibuffer-completion-predicate
(not minibuffer-completion-confirm))))
(buffer-undo-list t)
deactivate-mark)
;; Do nothing if while-no-input was aborted.
- (when (stringp text)
+ (when (stringp text)
(move-overlay icomplete-overlay (point) (point) (current-buffer))
;; The current C cursor code doesn't know to use the overlay's
;; marker's stickiness to figure out whether to place the cursor
@@ -319,12 +350,17 @@ are exhibited within the square braces.)"
((= compare (length name))
;; Typical case: name is a prefix.
(substring most compare))
- ((< compare 5) most)
- (t (concat "..." (substring most compare))))
+ ;; Don't bother truncating if it doesn't gain
+ ;; us at least 2 columns.
+ ((< compare 3) most)
+ (t (concat "…" (substring most compare))))
close-bracket)))
;;"-prospects" - more than one candidate
- (prospects-len (+ (length determ) 6 ;; take {,...} into account
- (string-width (buffer-string))))
+ (prospects-len (+ (string-width
+ (or determ (concat open-bracket close-bracket)))
+ (string-width icomplete-separator)
+ 3 ;; take {…} into account
+ (string-width (buffer-string))))
(prospects-max
;; Max total length to use, including the minibuffer content.
(* (+ icomplete-prospects-height
@@ -332,6 +368,8 @@ are exhibited within the square braces.)"
;; one line, increase the allowable space accordingly.
(/ prospects-len (window-width)))
(window-width)))
+ (prefix (when icomplete-hide-common-prefix
+ (try-completion "" comps)))
(prefix-len
;; Find the common prefix among `comps'.
;; We can't use the optimization below because its assumptions
@@ -341,41 +379,58 @@ are exhibited within the square braces.)"
;; ;; Common case.
;; (length most)
;; Else, use try-completion.
- (let ((comps-prefix (try-completion "" comps)))
- (and (stringp comps-prefix)
- (length comps-prefix)))) ;;)
-
- prospects most-is-exact comp limit)
+ (and (stringp prefix) (length prefix))) ;;)
+ prospects comp limit)
(if (eq most-try t) ;; (or (null (cdr comps))
(setq prospects nil)
+ (when (member name comps)
+ ;; NAME is complete but not unique. This scenario poses
+ ;; following UI issues:
+ ;;
+ ;; - When `icomplete-hide-common-prefix' is non-nil, NAME
+ ;; is stripped empty. This would make the entry
+ ;; inconspicuous.
+ ;;
+ ;; - Due to sorting of completions, NAME may not be the
+ ;; first of the prospects and could be hidden deep in
+ ;; the displayed string.
+ ;;
+ ;; - Because of `icomplete-prospects-height' , NAME may
+ ;; not even be displayed to the user.
+ ;;
+ ;; To circumvent all the above problems, provide a visual
+ ;; cue to the user via an "empty string" in the try
+ ;; completion field.
+ (setq determ (concat open-bracket "" close-bracket)))
+ ;; Compute prospects for display.
(while (and comps (not limit))
(setq comp
(if prefix-len (substring (car comps) prefix-len) (car comps))
comps (cdr comps))
- (cond ((string-equal comp "") (setq most-is-exact t))
- ((member comp prospects))
- (t (setq prospects-len
- (+ (string-width comp) 1 prospects-len))
+ (setq prospects-len
+ (+ (string-width comp)
+ (string-width icomplete-separator)
+ prospects-len))
(if (< prospects-len prospects-max)
(push comp prospects)
- (setq limit t))))))
+ (setq limit t))))
+ (setq prospects (nreverse prospects))
+ ;; Decorate first of the prospects.
+ (when prospects
+ (let ((first (copy-sequence (pop prospects))))
+ (put-text-property 0 (length first)
+ 'face 'icomplete-first-match first)
+ (push first prospects)))
;; Restore the base-size info, since completion-all-sorted-completions
;; is cached.
(if last (setcdr last base-size))
(if prospects
(concat determ
"{"
- (and most-is-exact ",")
- (mapconcat 'identity (nreverse prospects) ",")
- (and limit ",...")
+ (mapconcat 'identity prospects icomplete-separator)
+ (and limit (concat icomplete-separator "…"))
"}")
- (concat determ
- " [Matched"
- (let ((keys (and icomplete-show-key-bindings
- (commandp (intern-soft most))
- (icomplete-get-keys most))))
- (if keys (concat "; " keys) ""))
- "]"))))))
+ (concat determ " [Matched]"))))))
;;_* Local emacs vars.
;;Local variables:
diff --git a/lisp/ido.el b/lisp/ido.el
index cda40211763..bedf00e638d 100644
--- a/lisp/ido.el
+++ b/lisp/ido.el
@@ -765,7 +765,7 @@ Obsolete. Set 3rd element of `ido-decorations' instead."
(defcustom ido-decorations '( "{" "}" " | " " | ..." "[" "]" " [No match]" " [Matched]" " [Not readable]" " [Too big]" " [Confirm]")
"List of strings used by ido to display the alternatives in the minibuffer.
-There are 11 elements in this list:
+There are between 11 and 13 elements in this list:
1st and 2nd elements are used as brackets around the prospect list,
3rd element is the separator between prospects (ignored if `ido-separator' is set),
4th element is the string inserted at the end of a truncated list of prospects,
@@ -775,7 +775,9 @@ can be completed using TAB,
8th element is displayed if there is a single match (and faces are not used),
9th element is displayed when the current directory is non-readable,
10th element is displayed when directory exceeds `ido-max-directory-size',
-11th element is displayed to confirm creating new file or buffer."
+11th element is displayed to confirm creating new file or buffer.
+12th and 13th elements (if present) are used as brackets around the sole
+remaining completion. If absent, elements 5 and 6 are used instead."
:type '(repeat string)
:group 'ido)
@@ -927,7 +929,8 @@ ido is running. Copied from `icomplete-minibuffer-setup-hook'."
:type 'hook
:group 'ido)
-(defcustom ido-save-directory-list-file (convert-standard-filename "~/.ido.last")
+(defcustom ido-save-directory-list-file
+ (locate-user-emacs-file "ido.last" ".ido.last")
"File in which the ido state is saved between invocations.
Variables stored are: `ido-last-directory-list', `ido-work-directory-list',
`ido-work-file-list', and `ido-dir-file-cache'.
@@ -1585,6 +1588,8 @@ This function also adds a hook to the minibuffer."
(define-key map "\C-p" 'ido-toggle-prefix)
(define-key map "\C-r" 'ido-prev-match)
(define-key map "\C-s" 'ido-next-match)
+ (define-key map [?\C-.] 'ido-next-match)
+ (define-key map [?\C-,] 'ido-prev-match)
(define-key map "\C-t" 'ido-toggle-regexp)
(define-key map "\C-z" 'ido-undo-merge-work-directory)
(define-key map [(control ?\s)] 'ido-restrict-to-matches)
@@ -2389,7 +2394,10 @@ If cursor is not at the end of the user input, move to end of input."
(ido-buffer-internal 'insert 'insert-buffer "Insert buffer: " nil ido-text 'ido-enter-insert-file))
((eq ido-exit 'dired)
- (dired (concat ido-current-directory (or ido-text ""))))
+ (funcall (cond ((eq method 'other-window) 'dired-other-window)
+ ((eq method 'other-frame) 'dired-other-frame)
+ (t 'dired))
+ (concat ido-current-directory (or ido-text ""))))
((eq ido-exit 'ffap)
(find-file-at-point))
@@ -3144,13 +3152,15 @@ for first matching file."
(exit-minibuffer)))
(defun ido-chop (items elem)
- "Remove all elements before ELEM and put them at the end of ITEMS."
+ "Remove all elements before ELEM and put them at the end of ITEMS.
+Use `eq' for comparison."
(let ((ret nil)
(next nil)
(sofar nil))
(while (not ret)
(setq next (car items))
- (if (equal next elem)
+ ;; Use `eq' to avoid bug http://debbugs.gnu.org/10994
+ (if (eq next elem)
(setq ret (append items (nreverse sofar)))
;; else
(progn
@@ -3764,7 +3774,11 @@ This is to make them appear as if they were \"virtual buffers\"."
ido-enable-flex-matching
(> (length ido-text) 1)
(not ido-enable-regexp))
- (setq re (mapconcat #'regexp-quote (split-string ido-text "" t) ".*"))
+ (setq re (concat (regexp-quote (string (aref ido-text 0)))
+ (mapconcat (lambda (c)
+ (concat "[^" (string c) "]*"
+ (regexp-quote (string c))))
+ (substring ido-text 1) "")))
(if ido-enable-prefix
(setq re (concat "\\`" re)))
(mapc
@@ -4569,10 +4583,12 @@ For details of keybindings, see `ido-find-file'."
(string-equal (match-string 0 (ido-name (car comps)))
(ido-name (car comps))))
""
- ;; when there is one match, show the matching file name in full
- (concat (nth 4 ido-decorations) ;; [ ... ]
- (ido-name (car comps))
- (nth 5 ido-decorations)))
+ ;; When there is only one match, show the matching file
+ ;; name in full, wrapped in [ ... ].
+ (concat
+ (or (nth 11 ido-decorations) (nth 4 ido-decorations))
+ (ido-name (car comps))
+ (or (nth 12 ido-decorations) (nth 5 ido-decorations))))
(if (not ido-use-faces) (nth 7 ido-decorations)))) ;; [Matched]
(t ;multiple matches
(let* ((items (if (> ido-max-prospects 0) (1+ ido-max-prospects) 999))
diff --git a/lisp/image-dired.el b/lisp/image-dired.el
index f0483e6217a..bbb41d49a1d 100644
--- a/lisp/image-dired.el
+++ b/lisp/image-dired.el
@@ -883,7 +883,7 @@ displayed."
(defalias 'image-dired 'image-dired-show-all-from-dir)
;;;###autoload
-(defalias 'tumme 'image-dired-show-all-from-dir)
+(define-obsolete-function-alias 'tumme 'image-dired "24.4")
(defun image-dired-sane-db-file ()
"Check if `image-dired-db-file' exists.
@@ -2454,6 +2454,8 @@ when using per-directory thumbnail file storage"))
(defvar image-dired-widget-list nil
"List to keep track of meta data in edit buffer.")
+(declare-function widget-forward "wid-edit" (arg))
+
;;;###autoload
(defun image-dired-dired-edit-comment-and-tags ()
"Edit comment and tags of current or marked image files.
diff --git a/lisp/image-mode.el b/lisp/image-mode.el
index a95dde1d999..ac090f020b3 100644
--- a/lisp/image-mode.el
+++ b/lisp/image-mode.el
@@ -278,28 +278,50 @@ stopping if the top or bottom edge of the image is reached."
;; Adjust frame and image size.
-(defun image-mode-fit-frame ()
- "Toggle whether to fit the frame to the current image.
-This function assumes the current frame has only one window."
- ;; FIXME: This does not take into account decorations like mode-line,
- ;; minibuffer, header-line, ...
- (interactive)
- (let* ((saved (frame-parameter nil 'image-mode-saved-size))
+(defun image-mode-fit-frame (&optional frame toggle)
+ "Fit FRAME to the current image.
+If FRAME is omitted or nil, it defaults to the selected frame.
+All other windows on the frame are deleted.
+
+If called interactively, or if TOGGLE is non-nil, toggle between
+fitting FRAME to the current image and restoring the size and
+window configuration prior to the last `image-mode-fit-frame'
+call."
+ (interactive (list nil t))
+ (let* ((buffer (current-buffer))
(display (image-get-display-property))
- (size (image-display-size display)))
- (if (and saved
- (eq (caar saved) (frame-width))
- (eq (cdar saved) (frame-height)))
- (progn ;; Toggle back to previous non-fitted size.
- (set-frame-parameter nil 'image-mode-saved-size nil)
- (setq size (cdr saved)))
- ;; Round up size, and save current size so we can toggle back to it.
- (setcar size (ceiling (car size)))
- (setcdr size (ceiling (cdr size)))
- (set-frame-parameter nil 'image-mode-saved-size
- (cons size (cons (frame-width) (frame-height)))))
- (set-frame-width (selected-frame) (car size))
- (set-frame-height (selected-frame) (cdr size))))
+ (size (image-display-size display))
+ (saved (frame-parameter frame 'image-mode-saved-params))
+ (window-configuration (current-window-configuration frame))
+ (width (frame-width frame))
+ (height (frame-height frame)))
+ (with-selected-frame (or frame (selected-frame))
+ (if (and toggle saved
+ (= (caar saved) width)
+ (= (cdar saved) height))
+ (progn
+ (set-frame-width frame (car (nth 1 saved)))
+ (set-frame-height frame (cdr (nth 1 saved)))
+ (set-window-configuration (nth 2 saved))
+ (set-frame-parameter frame 'image-mode-saved-params nil))
+ (delete-other-windows)
+ (switch-to-buffer buffer t t)
+ (let* ((edges (window-inside-edges))
+ (inner-width (- (nth 2 edges) (nth 0 edges)))
+ (inner-height (- (nth 3 edges) (nth 1 edges))))
+ (set-frame-width frame (+ (ceiling (car size))
+ width (- inner-width)))
+ (set-frame-height frame (+ (ceiling (cdr size))
+ height (- inner-height)))
+ ;; The frame size after the above `set-frame-*' calls may
+ ;; differ from what we specified, due to window manager
+ ;; interference. We have to call `frame-width' and
+ ;; `frame-height' to get the actual results.
+ (set-frame-parameter frame 'image-mode-saved-params
+ (list (cons (frame-width)
+ (frame-height))
+ (cons width height)
+ window-configuration)))))))
;;; Image Mode setup
@@ -307,6 +329,9 @@ This function assumes the current frame has only one window."
"The image type for the current Image mode buffer.")
(make-variable-buffer-local 'image-type)
+(defvar-local image-multi-frame nil
+ "Non-nil if image for the current Image mode buffer has multiple frames.")
+
(defvar image-mode-previous-major-mode nil
"Internal variable to keep the previous non-image major mode.")
@@ -315,8 +340,14 @@ This function assumes the current frame has only one window."
(set-keymap-parent map special-mode-map)
(define-key map "\C-c\C-c" 'image-toggle-display)
(define-key map (kbd "SPC") 'image-scroll-up)
+ (define-key map (kbd "S-SPC") 'image-scroll-down)
(define-key map (kbd "DEL") 'image-scroll-down)
(define-key map (kbd "RET") 'image-toggle-animation)
+ (define-key map "F" 'image-goto-frame)
+ (define-key map "f" 'image-next-frame)
+ (define-key map "b" 'image-previous-frame)
+ (define-key map "n" 'image-next-file)
+ (define-key map "p" 'image-previous-file)
(define-key map [remap forward-char] 'image-forward-hscroll)
(define-key map [remap backward-char] 'image-backward-hscroll)
(define-key map [remap right-char] 'image-forward-hscroll)
@@ -331,6 +362,59 @@ This function assumes the current frame has only one window."
(define-key map [remap move-end-of-line] 'image-eol)
(define-key map [remap beginning-of-buffer] 'image-bob)
(define-key map [remap end-of-buffer] 'image-eob)
+ (easy-menu-define image-mode-menu map "Menu for Image mode."
+ '("Image"
+ ["Show as Text" image-toggle-display :active t
+ :help "Show image as text"]
+ "--"
+ ["Fit Frame to Image" image-mode-fit-frame :active t
+ :help "Resize frame to match image"]
+ ["Fit to Window Height" image-transform-fit-to-height
+ :visible (eq image-type 'imagemagick)
+ :help "Resize image to match the window height"]
+ ["Fit to Window Width" image-transform-fit-to-width
+ :visible (eq image-type 'imagemagick)
+ :help "Resize image to match the window width"]
+ ["Rotate Image..." image-transform-set-rotation
+ :visible (eq image-type 'imagemagick)
+ :help "Rotate the image"]
+ "--"
+ ["Show Thumbnails"
+ (lambda ()
+ (interactive)
+ (image-dired default-directory))
+ :active default-directory
+ :help "Show thumbnails for all images in this directory"]
+ ["Next Image" image-next-file :active buffer-file-name
+ :help "Move to next image in this directory"]
+ ["Previous Image" image-previous-file :active buffer-file-name
+ :help "Move to previous image in this directory"]
+ "--"
+ ["Animate Image" image-toggle-animation :style toggle
+ :selected (let ((image (image-get-display-property)))
+ (and image (image-animate-timer image)))
+ :active image-multi-frame
+ :help "Toggle image animation"]
+ ["Loop Animation"
+ (lambda () (interactive)
+;;; (make-variable-buffer-local 'image-animate-loop)
+ (setq image-animate-loop (not image-animate-loop))
+ ;; FIXME this is a hacky way to make it affect a currently
+ ;; animating image.
+ (when (let ((image (image-get-display-property)))
+ (and image (image-animate-timer image)))
+ (image-toggle-animation)
+ (image-toggle-animation)))
+ :style toggle :selected image-animate-loop
+ :active image-multi-frame
+ :help "Animate images once, or forever?"]
+ ["Next Frame" image-next-frame :active image-multi-frame
+ :help "Show the next frame of this image"]
+ ["Previous Frame" image-previous-frame :active image-multi-frame
+ :help "Show the previous frame of this image"]
+ ["Goto Frame..." image-goto-frame :active image-multi-frame
+ :help "Show a specific frame of this image"]
+ ))
map)
"Mode keymap for `image-mode'.")
@@ -384,15 +468,34 @@ to toggle between display as an image and display as text."
(run-mode-hooks 'image-mode-hook)
(let ((image (image-get-display-property))
(msg1 (substitute-command-keys
- "Type \\[image-toggle-display] to view the image as ")))
+ "Type \\[image-toggle-display] to view the image as "))
+ animated)
(cond
((null image)
(message "%s" (concat msg1 "an image.")))
- ((image-animated-p image)
+ ((setq animated (image-multi-frame-p image))
+ (setq image-multi-frame t
+ mode-line-process
+ `(:eval
+ (concat " "
+ (propertize
+ (format "[%s/%s]"
+ (1+ (image-current-frame ',image))
+ ,(car animated))
+ 'help-echo "Frames
+mouse-1: Next frame
+mouse-3: Previous frame"
+ 'mouse-face 'mode-line-highlight
+ 'local-map
+ '(keymap
+ (mode-line
+ keymap
+ (down-mouse-1 . image-next-frame)
+ (down-mouse-3 . image-previous-frame)))))))
(message "%s"
- (concat msg1 "text, or "
- (substitute-command-keys
- "\\[image-toggle-animation] to animate."))))
+ (concat msg1 "text. This image has multiple frames.")))
+;;; (substitute-command-keys
+;;; "\\[image-toggle-animation] to animate."))))
(t
(message "%s" (concat msg1 "text."))))))
@@ -581,7 +684,7 @@ Otherwise it plays once, then stops."
(cond
((null image)
(error "No image is present"))
- ((null (setq animation (image-animated-p image)))
+ ((null (setq animation (image-multi-frame-p image)))
(message "No image animation."))
(t
(let ((timer (image-animate-timer image)))
@@ -595,6 +698,85 @@ Otherwise it plays once, then stops."
(image-animate image index
(if image-animate-loop t)))))))))
+(defun image-goto-frame (n &optional relative)
+ "Show frame N of a multi-frame image.
+Optional argument OFFSET non-nil means interpret N as relative to the
+current frame. Frames are indexed from 1."
+ (interactive
+ (list (or current-prefix-arg
+ (read-number "Show frame number: "))))
+ (let ((image (image-get-display-property)))
+ (cond
+ ((null image)
+ (error "No image is present"))
+ ((null image-multi-frame)
+ (message "No image animation."))
+ (t
+ (image-show-frame image
+ (if relative
+ (+ n (image-current-frame image))
+ (1- n)))))))
+
+(defun image-next-frame (&optional n)
+ "Switch to the next frame of a multi-frame image.
+With optional argument N, switch to the Nth frame after the current one.
+If N is negative, switch to the Nth frame before the current one."
+ (interactive "p")
+ (image-goto-frame n t))
+
+(defun image-previous-frame (&optional n)
+ "Switch to the previous frame of a multi-frame image.
+With optional argument N, switch to the Nth frame before the current one.
+If N is negative, switch to the Nth frame after the current one."
+ (interactive "p")
+ (image-next-frame (- n)))
+
+
+;;; Switching to the next/previous image
+
+(defun image-next-file (&optional n)
+ "Visit the next image in the same directory as the current image file.
+With optional argument N, visit the Nth image file after the
+current one, in cyclic alphabetical order.
+
+This command visits the specified file via `find-alternate-file',
+replacing the current Image mode buffer."
+ (interactive "p")
+ (unless (derived-mode-p 'image-mode)
+ (error "The buffer is not in Image mode"))
+ (unless buffer-file-name
+ (error "The current image is not associated with a file"))
+ (let* ((file (file-name-nondirectory buffer-file-name))
+ (images (image-mode--images-in-directory file))
+ (idx 0))
+ (catch 'image-visit-next-file
+ (dolist (f images)
+ (if (string= f file)
+ (throw 'image-visit-next-file (1+ idx)))
+ (setq idx (1+ idx))))
+ (setq idx (mod (+ idx (or n 1)) (length images)))
+ (find-alternate-file (nth idx images))))
+
+(defun image-previous-file (&optional n)
+ "Visit the preceding image in the same directory as the current file.
+With optional argument N, visit the Nth image file preceding the
+current one, in cyclic alphabetical order.
+
+This command visits the specified file via `find-alternate-file',
+replacing the current Image mode buffer."
+ (interactive "p")
+ (image-next-file (- n)))
+
+(defun image-mode--images-in-directory (file)
+ (let* ((dir (file-name-directory buffer-file-name))
+ (files (directory-files dir nil
+ (image-file-name-regexp) t)))
+ ;; Add the current file to the list of images if necessary, in
+ ;; case it does not match `image-file-name-regexp'.
+ (unless (member file files)
+ (push file files))
+ (sort files 'string-lessp)))
+
;;; Support for bookmark.el
(declare-function bookmark-make-record-default
diff --git a/lisp/image.el b/lisp/image.el
index 9be1d6a1639..ec7b41bf126 100644
--- a/lisp/image.el
+++ b/lisp/image.el
@@ -309,16 +309,13 @@ be determined."
Value is a symbol specifying the image type, or nil if type cannot
be determined."
(let (type first)
- (or
- (catch 'found
- (dolist (elem image-type-file-name-regexps)
- (when (string-match-p (car elem) file)
- (setq type (cdr elem))
- (or first (setq first type))
- (if (image-type-available-p type)
- (throw 'found type)))))
- ;; If nothing seems to be supported, return the first type that matched.
- first)))
+ (catch 'found
+ (dolist (elem image-type-file-name-regexps first)
+ (when (string-match-p (car elem) file)
+ (if (image-type-available-p (setq type (cdr elem)))
+ (throw 'found type)
+ ;; If nothing seems to be supported, return first type that matched.
+ (or first (setq first type))))))))
;;;###autoload
(defun image-type (source &optional type data-p)
@@ -609,25 +606,25 @@ Example:
;;; Animated image API
-(defconst image-animated-types '(gif)
- "List of supported animated image types.")
-
-(defun image-animated-p (image)
- "Return non-nil if IMAGE can be animated.
-To be capable of being animated, an image must be of a type
-listed in `image-animated-types', and contain more than one
-sub-image, with a specified animation delay. The actual return
-value is a cons (NIMAGES . DELAY), where NIMAGES is the number
-of sub-images in the animated image and DELAY is the delay in
-seconds until the next sub-image should be displayed."
- (cond
- ((memq (plist-get (cdr image) :type) image-animated-types)
- (let* ((metadata (image-metadata image))
- (images (plist-get metadata 'count))
- (delay (plist-get metadata 'delay)))
- (when (and images (> images 1) (numberp delay))
- (if (< delay 0) (setq delay 0.1))
- (cons images delay))))))
+(defvar image-default-frame-delay 0.1
+ "Default interval in seconds between frames of a multi-frame image.
+Only used if the image does not specify a value.")
+
+(defun image-multi-frame-p (image)
+ "Return non-nil if IMAGE contains more than one frame.
+The actual return value is a cons (NIMAGES . DELAY), where NIMAGES is
+the number of frames (or sub-images) in the image and DELAY is the delay
+in seconds that the image specifies between each frame. DELAY may be nil,
+in which case you might want to use `image-default-frame-delay'."
+ (let* ((metadata (image-metadata image))
+ (images (plist-get metadata 'count))
+ (delay (plist-get metadata 'delay)))
+ (when (and images (> images 1))
+ (if (or (not (numberp delay)) (< delay 0))
+ (setq delay image-default-frame-delay))
+ (cons images delay))))
+
+(define-obsolete-function-alias 'image-animated-p 'image-multi-frame-p "24.4")
;; "Destructively"?
(defun image-animate (image &optional index limit)
@@ -638,7 +635,7 @@ With optional INDEX, begin animating from that animation frame.
LIMIT specifies how long to animate the image. If omitted or
nil, play the animation until the end. If t, loop forever. If a
number, play until that number of seconds has elapsed."
- (let ((animation (image-animated-p image))
+ (let ((animation (image-multi-frame-p image))
timer)
(when animation
(if (setq timer (image-animate-timer image))
@@ -660,8 +657,25 @@ number, play until that number of seconds has elapsed."
(setq timer nil)))
timer))
+(defconst image-minimum-frame-delay 0.01
+ "Minimum interval in seconds between frames of an animated image.")
+
+(defun image-current-frame (image)
+ "The current frame number of IMAGE, indexed from 0."
+ (or (plist-get (cdr image) :index) 0))
+
+(defun image-show-frame (image n &optional nocheck)
+ "Show frame N of IMAGE.
+Frames are indexed from 0. Optional argument NOCHECK non-nil means
+do not check N is within the range of frames present in the image."
+ (unless nocheck
+ (if (< n 0) (setq n 0)
+ (setq n (min n (1- (car (image-multi-frame-p image)))))))
+ (plist-put (cdr image) :index n)
+ (force-window-update))
+
;; FIXME? The delay may not be the same for different sub-images,
-;; hence we need to call image-animated-p to return it.
+;; hence we need to call image-multi-frame-p to return it.
;; But it also returns count, so why do we bother passing that as an
;; argument?
(defun image-animate-timeout (image n count time-elapsed limit)
@@ -673,16 +687,16 @@ TIME-ELAPSED is the total time that has elapsed since
LIMIT determines when to stop. If t, loop forever. If nil, stop
after displaying the last animation frame. Otherwise, stop
after LIMIT seconds have elapsed.
-The minimum delay between successive frames is 0.01s."
- (plist-put (cdr image) :index n)
- (force-window-update)
+The minimum delay between successive frames is `image-minimum-frame-delay'."
+ (image-show-frame image n t)
(setq n (1+ n))
(let* ((time (float-time))
- (animation (image-animated-p image))
+ (animation (image-multi-frame-p image))
;; Subtract off the time we took to load the image from the
;; stated delay time.
- (delay (max (+ (cdr animation) time (- (float-time)))
- 0.01))
+ (delay (max (+ (or (cdr animation) image-default-frame-delay)
+ time (- (float-time)))
+ image-minimum-frame-delay))
done)
(if (>= n count)
(if limit
diff --git a/lisp/imenu.el b/lisp/imenu.el
index 0b5d69d6233..d79b0abeebc 100644
--- a/lisp/imenu.el
+++ b/lisp/imenu.el
@@ -405,11 +405,11 @@ Don't move point."
;; Regular expression to find C functions
(defvar imenu-example--function-name-regexp-c
(concat
- "^[a-zA-Z0-9]+[ \t]?" ; type specs; there can be no
+ "^[a-zA-Z0-9]+[ \t]?" ; Type specs; there can be no
"\\([a-zA-Z0-9_*]+[ \t]+\\)?" ; more than 3 tokens, right?
"\\([a-zA-Z0-9_*]+[ \t]+\\)?"
- "\\([*&]+[ \t]*\\)?" ; pointer
- "\\([a-zA-Z0-9_*]+\\)[ \t]*(" ; name
+ "\\([*&]+[ \t]*\\)?" ; Pointer.
+ "\\([a-zA-Z0-9_*]+\\)[ \t]*(" ; Name.
))
(defun imenu-example--create-c-index (&optional regexp)
@@ -447,6 +447,8 @@ Don't move point."
Simple elements in the alist look like (INDEX-NAME . POSITION).
POSITION is the buffer position of the item; to go to the item
is simply to move point to that position.
+POSITION is passed to `imenu-default-goto-function', so it can be a non-number
+if that variable has been changed (e.g. Semantic uses overlays for POSITIONs).
Special elements look like (INDEX-NAME POSITION FUNCTION ARGUMENTS...).
To \"go to\" a special element means applying FUNCTION
@@ -546,25 +548,21 @@ The returned alist DOES NOT share structure with MENULIST."
Return a split and sorted copy of ALIST. The returned alist DOES
NOT share structure with ALIST."
(mapcar (lambda (elt)
- (if (and (consp elt)
- (stringp (car elt))
- (listp (cdr elt)))
+ (if (imenu--subalist-p elt)
(imenu--split-menu (cdr elt) (car elt))
elt))
alist))
(defun imenu--truncate-items (menulist)
"Truncate all strings in MENULIST to `imenu-max-item-length'."
- (mapcar (lambda (item)
- (cond
- ((consp (cdr item))
- (imenu--truncate-items (cdr item)))
- ;; truncate if necessary
- ((and (numberp imenu-max-item-length)
- (> (length (car item)) imenu-max-item-length))
- (setcar item (substring (car item) 0 imenu-max-item-length)))))
- menulist))
-
+ (mapc (lambda (item)
+ ;; Truncate if necessary.
+ (when (and (numberp imenu-max-item-length)
+ (> (length (car item)) imenu-max-item-length))
+ (setcar item (substring (car item) 0 imenu-max-item-length)))
+ (when (imenu--subalist-p item)
+ (imenu--truncate-items (cdr item))))
+ menulist))
(defun imenu--make-index-alist (&optional noerror)
"Create an index alist for the definitions in the current buffer.
@@ -577,7 +575,7 @@ See `imenu--index-alist' for the format of the index alist."
(or (not imenu-auto-rescan)
(and imenu-auto-rescan
(> (buffer-size) imenu-auto-rescan-maxout))))
- ;; Get the index; truncate if necessary
+ ;; Get the index; truncate if necessary.
(progn
(setq imenu--index-alist
(save-excursion
@@ -678,19 +676,20 @@ The alternate method, which is the one most often used, is to call
;; in these major modes. But save that change for later.
(cond ((and imenu-prev-index-position-function
imenu-extract-index-name-function)
- (let ((index-alist '()) (pos -1)
+ (let ((index-alist '()) (pos (point-max))
name)
- (goto-char (point-max))
+ (goto-char pos)
;; Search for the function
(while (funcall imenu-prev-index-position-function)
- (when (= pos (point))
+ (unless (< (point) pos)
(error "Infinite loop at %s:%d: imenu-prev-index-position-function does not move point" (buffer-name) pos))
(setq pos (point))
(save-excursion
(setq name (funcall imenu-extract-index-name-function)))
(and (stringp name)
- ;; [ydi] updated for imenu-use-markers
- (push (cons name (if imenu-use-markers (point-marker) (point)))
+ ;; [ydi] Updated for imenu-use-markers.
+ (push (cons name
+ (if imenu-use-markers (point-marker) (point)))
index-alist)))
index-alist))
;; Use generic expression if possible.
@@ -743,12 +742,12 @@ depending on PATTERNS."
(modify-syntax-entry c (cdr syn) table))
(car syn))))
(goto-char (point-max))
- (unwind-protect ; for syntax table
+ (unwind-protect ; For syntax table.
(save-match-data
(set-syntax-table table)
- ;; map over the elements of imenu-generic-expression
- ;; (typically functions, variables ...)
+ ;; Map over the elements of imenu-generic-expression
+ ;; (typically functions, variables ...).
(dolist (pat patterns)
(let ((menu-title (car pat))
(regexp (nth 1 pat))
@@ -1004,7 +1003,7 @@ The ignored args just make this function have the same interface as a
function placed in a special index-item."
(if (or (< position (point-min))
(> position (point-max)))
- ;; widen if outside narrowing
+ ;; Widen if outside narrowing.
(widen))
(goto-char position))
diff --git a/lisp/info-look.el b/lisp/info-look.el
index f13900112fa..e43cd731547 100644
--- a/lisp/info-look.el
+++ b/lisp/info-look.el
@@ -306,6 +306,21 @@ If optional argument QUERY is non-nil, query for the help mode."
(when (string-match (caar file-name-alist) file-name)
(setq info-lookup-mode (cdar file-name-alist)))
(setq file-name-alist (cdr file-name-alist)))))
+
+ ;; If major-mode has no setups in info-lookup-alist, under any topic, then
+ ;; search up through derived-mode-parent to find a parent mode which does
+ ;; have some setups. This means that a `define-derived-mode' with no
+ ;; setups of its own will select its parent mode for lookups, if one of
+ ;; its parents has some setups. Good for example on `makefile-gmake-mode'
+ ;; and similar derivatives of `makefile-mode'.
+ ;;
+ (let ((mode major-mode)) ;; Look for `mode' with some setups.
+ (while (and mode (not info-lookup-mode))
+ (dolist (topic-cell info-lookup-alist) ;; Usually only two topics here.
+ (if (info-lookup->mode-value (car topic-cell) mode)
+ (setq info-lookup-mode mode)))
+ (setq mode (get mode 'derived-mode-parent))))
+
(or info-lookup-mode (setq info-lookup-mode major-mode)))
(defun info-lookup-change-mode (topic)
@@ -866,8 +881,11 @@ Return nil if there is nothing appropriate in the buffer near point."
(info-lookup-maybe-add-help
:mode 'latex-mode
:regexp "\\\\\\([a-zA-Z]+\\|[^a-zA-Z]\\)"
- :doc-spec '(("(latex)Command Index" nil
- "`" "\\({[^}]*}\\)?'")))
+ :doc-spec `((,(if (Info-find-file "latex2e" t)
+ ;; From http://home.gna.org/latexrefman
+ "(latex2e)Command Index"
+ "(latex)Command Index")
+ nil "`" "\\({[^}]*}\\)?'")))
(info-lookup-maybe-add-help
:mode 'emacs-lisp-mode
diff --git a/lisp/info.el b/lisp/info.el
index 96c22e15110..58ebf0b17da 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -59,15 +59,6 @@ to the user."
:group 'info
:version "24.1")
-(defcustom Info-enable-edit nil
- "Non-nil means the \\<Info-mode-map>\\[Info-edit] command in Info can edit the current node.
-This is convenient if you want to write Info files by hand.
-However, we recommend that you not do this.
-It is better to write a Texinfo file and generate the Info file from that,
-because that gives you a printed manual as well."
- :type 'boolean
- :group 'info)
-
(defvar Info-enable-active-nodes nil
"Non-nil allows Info to execute Lisp code associated with nodes.
The Lisp code is executed when the node is selected.")
@@ -167,6 +158,12 @@ A header-line does not scroll with the rest of the buffer."
"Face for Info nodes in a node header."
:group 'info)
+(defface info-index-match
+ '((t :inherit match))
+ "Face used to highlight matches in an index entry."
+ :group 'info
+ :version "24.4")
+
;; This is a defcustom largely so that we can get the benefit
;; of custom-initialize-delay. Perhaps it would work to make it a
;; defvar and explicitly give it a standard-value property, and
@@ -375,6 +372,9 @@ with wrapping around the current Info node."
(defvar Info-edit-mode-hook nil
"Hooks run when `Info-edit-mode' is called.")
+(make-obsolete-variable 'Info-edit-mode-hook
+ "editing Info nodes by hand is not recommended." "24.4")
+
(defvar Info-current-file nil
"Info file that Info is now looking at, or nil.
This is the name that was specified in Info, not the actual file name.
@@ -397,6 +397,10 @@ Marker points nowhere if file has no tag table.")
(defvar Info-current-file-completions nil
"Cached completion list for current Info file.")
+(defvar Info-file-completions nil
+ "Cached completion alist of visited Info files.
+Each element of the alist is (FILE . COMPLETIONS)")
+
(defvar Info-file-supports-index-cookies nil
"Non-nil if current Info file supports index cookies.")
@@ -742,11 +746,15 @@ in `Info-file-supports-index-cookies-list'."
(push dir Info-directory-list)))))))
;;;###autoload
-(defun info-other-window (&optional file-or-node)
+(defun info-other-window (&optional file-or-node buffer)
"Like `info' but show the Info buffer in another window."
- (interactive (if current-prefix-arg
- (list (read-file-name "Info file name: " nil nil t))))
- (info-setup file-or-node (switch-to-buffer-other-window "*info*")))
+ (interactive (list
+ (if (and current-prefix-arg (not (numberp current-prefix-arg)))
+ (read-file-name "Info file name: " nil nil t))
+ (if (numberp current-prefix-arg)
+ (format "*info*<%s>" current-prefix-arg))))
+ (info-setup file-or-node
+ (switch-to-buffer-other-window (or buffer "*info*"))))
;;;###autoload (put 'info 'info-file (purecopy "emacs"))
;;;###autoload
@@ -763,8 +771,9 @@ with the top-level Info directory.
In interactive use, a non-numeric prefix argument directs
this command to read a file name from the minibuffer.
-A numeric prefix argument selects an Info buffer with the prefix number
-appended to the Info buffer name.
+
+A numeric prefix argument N selects an Info buffer named
+\"*info*<%s>\".
The search path for Info files is in the variable `Info-directory-list'.
The top-level Info directory is made by combining all the files named `dir'
@@ -1668,7 +1677,9 @@ escaped (\\\",\\\\)."
" ("
(if (stringp Info-current-file)
(replace-regexp-in-string
- "%" "%%" (file-name-nondirectory Info-current-file))
+ "%" "%%"
+ (file-name-sans-extension
+ (file-name-nondirectory Info-current-file)))
(format "*%S*" Info-current-file))
") "
(if Info-current-node
@@ -1692,7 +1703,9 @@ escaped (\\\",\\\\)."
If NODENAME is of the form (FILENAME)NODENAME, the node is in the Info file
FILENAME; otherwise, NODENAME should be in the current Info file (or one of
its sub-files).
-Completion is available, but only for node names in the current Info file.
+Completion is available for node names in the current Info file as well as
+in the Info file FILENAME after the closing parenthesis in (FILENAME).
+Empty NODENAME in (FILENAME) defaults to the Top node.
If FORK is non-nil (interactively with a prefix arg), show the node in
a new Info buffer.
If FORK is a string, it is the name to use for the new buffer."
@@ -1729,6 +1742,7 @@ list of valid filename suffixes for Info files. See
(when (file-name-absolute-p string)
(setq dirs (list (file-name-directory string))))
(let ((names nil)
+ (names-sans-suffix nil)
(suffix (concat (regexp-opt suffixes t) "\\'"))
(string-dir (file-name-directory string)))
(dolist (dir dirs)
@@ -1751,7 +1765,14 @@ list of valid filename suffixes for Info files. See
;; add the unsuffixed name as a completion option.
(when (string-match suffix file)
(setq file (substring file 0 (match-beginning 0)))
- (push (if string-dir (concat string-dir file) file) names)))))
+ (push (if string-dir (concat string-dir file) file)
+ names-sans-suffix)))))
+ ;; If there is just one file, don't duplicate it with suffixes,
+ ;; so `Info-read-node-name-1' will be able to complete a single
+ ;; candidate and to add the terminating ")".
+ (if (and (= (length names) 1) (= (length names-sans-suffix) 1))
+ (setq names names-sans-suffix)
+ (setq names (append names-sans-suffix names)))
(complete-with-action action names string pred)))
(defun Info-read-node-name-1 (string predicate code)
@@ -1769,12 +1790,23 @@ See `completing-read' for a description of arguments and usage."
(substring string 1)
predicate
code))
- ;; If a file name was given, then any node is fair game.
- ((string-match "\\`(" string)
- (cond
- ((eq code nil) string)
- ((eq code t) nil)
- (t t)))
+ ;; If a file name was given, complete nodes in the file.
+ ((string-match "\\`(\\([^)]+\\))" string)
+ (let ((file0 (match-string 0 string))
+ (file1 (match-string 1 string))
+ (nodename (substring string (match-end 0))))
+ (if (and (equal nodename "") (eq code 'lambda))
+ ;; Empty node name is permitted that means "Top".
+ t
+ (completion-table-with-context
+ file0
+ (apply-partially
+ (lambda (string pred action)
+ (complete-with-action
+ action
+ (Info-build-node-completions (Info-find-file file1))
+ string pred)))
+ nodename predicate code))))
;; Otherwise use Info-read-node-completion-table.
(t (complete-with-action
code Info-read-node-completion-table string predicate))))
@@ -1783,7 +1815,9 @@ See `completing-read' for a description of arguments and usage."
(defun Info-read-node-name (prompt)
"Read an Info node name with completion, prompting with PROMPT.
A node name can have the form \"NODENAME\", referring to a node
-in the current Info file, or \"(FILENAME)NODENAME\"."
+in the current Info file, or \"(FILENAME)NODENAME\", referring to
+a node in FILENAME. \"(FILENAME)\" is a short format to go to
+the Top node in FILENAME."
(let* ((completion-ignore-case t)
(Info-read-node-completion-table (Info-build-node-completions))
(nodename (completing-read prompt 'Info-read-node-name-1 nil t)))
@@ -1791,41 +1825,54 @@ in the current Info file, or \"(FILENAME)NODENAME\"."
(Info-read-node-name prompt)
nodename)))
-(defun Info-build-node-completions ()
- (or Info-current-file-completions
- (let ((compl nil)
- ;; Bind this in case the user sets it to nil.
- (case-fold-search t)
- (node-regexp "Node: *\\([^,\n]*\\) *[,\n\t]"))
- (save-excursion
- (save-restriction
- (or Info-tag-table-marker
- (error "No Info tags found"))
- (if (marker-buffer Info-tag-table-marker)
- (let ((marker Info-tag-table-marker))
- (set-buffer (marker-buffer marker))
- (widen)
- (goto-char marker)
- (while (re-search-forward "\n\\(Node\\|Ref\\): \\(.*\\)\177" nil t)
- (setq compl
- (cons (list (match-string-no-properties 2))
- compl))))
+(defun Info-build-node-completions (&optional filename)
+ (if filename
+ (or (cdr (assoc filename Info-file-completions))
+ (with-temp-buffer
+ (Info-mode)
+ (Info-goto-node (format "(%s)Top" filename))
+ (Info-build-node-completions-1)
+ (push (cons filename Info-current-file-completions) Info-file-completions)
+ Info-current-file-completions))
+ (or Info-current-file-completions
+ (Info-build-node-completions-1))))
+
+(defun Info-build-node-completions-1 ()
+ (let ((compl nil)
+ ;; Bind this in case the user sets it to nil.
+ (case-fold-search t)
+ (node-regexp "Node: *\\([^,\n]*\\) *[,\n\t]"))
+ (save-excursion
+ (save-restriction
+ (or Info-tag-table-marker
+ (error "No Info tags found"))
+ (if (marker-buffer Info-tag-table-marker)
+ (let ((marker Info-tag-table-marker))
+ (set-buffer (marker-buffer marker))
(widen)
- (goto-char (point-min))
- ;; If the buffer begins with a node header, process that first.
- (if (Info-node-at-bob-matching node-regexp)
- (setq compl (list (match-string-no-properties 1))))
- ;; Now for the rest of the nodes.
- (while (search-forward "\n\^_" nil t)
- (forward-line 1)
- (let ((beg (point)))
- (forward-line 1)
- (if (re-search-backward node-regexp beg t)
- (setq compl
- (cons (list (match-string-no-properties 1))
- compl))))))))
- (setq compl (cons '("*") compl))
- (set (make-local-variable 'Info-current-file-completions) compl))))
+ (goto-char marker)
+ (while (re-search-forward "\n\\(Node\\|Ref\\): \\(.*\\)\177" nil t)
+ (setq compl
+ (cons (list (match-string-no-properties 2))
+ compl))))
+ (widen)
+ (goto-char (point-min))
+ ;; If the buffer begins with a node header, process that first.
+ (if (Info-node-at-bob-matching node-regexp)
+ (setq compl (list (match-string-no-properties 1))))
+ ;; Now for the rest of the nodes.
+ (while (search-forward "\n\^_" nil t)
+ (forward-line 1)
+ (let ((beg (point)))
+ (forward-line 1)
+ (if (re-search-backward node-regexp beg t)
+ (setq compl
+ (cons (list (match-string-no-properties 1))
+ compl))))))))
+ (setq compl (cons '("*") (nreverse compl)))
+ (set (make-local-variable 'Info-current-file-completions) compl)
+ compl))
+
(defun Info-restore-point (hl)
"If this node has been visited, restore the point value when we left."
@@ -2104,7 +2151,7 @@ and is not in the header line or a tag table."
(let ((backward (< found beg-found)))
(not
(or
- (and (not (eq search-invisible t))
+ (and (not search-invisible)
(if backward
(or (text-property-not-all found beg-found 'invisible nil)
(text-property-not-all found beg-found 'display nil))
@@ -3016,48 +3063,92 @@ See `Info-scroll-down'."
(select-window (posn-window (event-start e))))
(Info-scroll-down)))
-(defun Info-next-reference (&optional recur)
- "Move cursor to the next cross-reference or menu item in the node."
- (interactive)
- (let ((pat "\\*note[ \n\t]+\\([^:]+\\):\\|^\\* .*:\\|[hf]t?tps?://")
- (old-pt (point))
- (case-fold-search t))
- (or (eobp) (forward-char 1))
- (or (re-search-forward pat nil t)
- (progn
- (goto-char (point-min))
- (or (re-search-forward pat nil t)
- (progn
- (goto-char old-pt)
- (user-error "No cross references in this node")))))
- (goto-char (or (match-beginning 1) (match-beginning 0)))
- (if (looking-at "\\* Menu:")
- (if recur
- (user-error "No cross references in this node")
- (Info-next-reference t))
- (if (looking-at "^\\* ")
- (forward-char 2)))))
-
-(defun Info-prev-reference (&optional recur)
- "Move cursor to the previous cross-reference or menu item in the node."
- (interactive)
- (let ((pat "\\*note[ \n\t]+\\([^:]+\\):\\|^\\* .*:\\|[hf]t?tps?://")
- (old-pt (point))
- (case-fold-search t))
- (or (re-search-backward pat nil t)
- (progn
- (goto-char (point-max))
- (or (re-search-backward pat nil t)
- (progn
- (goto-char old-pt)
- (user-error "No cross references in this node")))))
- (goto-char (or (match-beginning 1) (match-beginning 0)))
- (if (looking-at "\\* Menu:")
- (if recur
- (user-error "No cross references in this node")
- (Info-prev-reference t))
- (if (looking-at "^\\* ")
- (forward-char 2)))))
+(defun Info-next-reference-or-link (pat prop)
+ "Move point to the next pattern-based cross-reference or property-based link.
+The next cross-reference is searched using the regexp PAT, and the next link
+is searched using the text property PROP. Move point to the closest found position
+of either a cross-reference found by `re-search-forward' or a link found by
+`next-single-char-property-change'. Return the new position of point, or nil."
+ (let ((pxref (save-excursion (re-search-forward pat nil t)))
+ (plink (next-single-char-property-change (point) prop)))
+ (when (and (< plink (point-max)) (not (get-char-property plink prop)))
+ (setq plink (next-single-char-property-change plink prop)))
+ (if (< plink (point-max))
+ (if (and pxref (<= pxref plink))
+ (goto-char (or (match-beginning 1) (match-beginning 0)))
+ (goto-char plink))
+ (if pxref (goto-char (or (match-beginning 1) (match-beginning 0)))))))
+
+(defun Info-prev-reference-or-link (pat prop)
+ "Move point to the previous pattern-based cross-reference or property-based link.
+The previous cross-reference is searched using the regexp PAT, and the previous link
+is searched using the text property PROP. Move point to the closest found position
+of either a cross-reference found by `re-search-backward' or a link found by
+`previous-single-char-property-change'. Return the new position of point, or nil."
+ (let ((pxref (save-excursion (re-search-backward pat nil t)))
+ (plink (previous-single-char-property-change (point) prop)))
+ (when (and (> plink (point-min)) (not (get-char-property plink prop)))
+ (setq plink (previous-single-char-property-change plink prop)))
+ (if (> plink (point-min))
+ (if (and pxref (>= pxref plink))
+ (goto-char (or (match-beginning 1) (match-beginning 0)))
+ (goto-char plink))
+ (if pxref (goto-char (or (match-beginning 1) (match-beginning 0)))))))
+
+(defun Info-next-reference (&optional recur count)
+ "Move cursor to the next cross-reference or menu item in the node.
+If COUNT is non-nil (interactively with a prefix arg), jump over
+COUNT cross-references."
+ (interactive "i\np")
+ (unless count
+ (setq count 1))
+ (if (< count 0)
+ (Info-prev-reference recur (- count))
+ (while (unless (zerop count) (setq count (1- count)))
+ (let ((pat "\\*note[ \n\t]+\\([^:]+\\):\\|^\\* .*:\\|[hf]t?tps?://")
+ (old-pt (point))
+ (case-fold-search t))
+ (or (eobp) (forward-char 1))
+ (or (Info-next-reference-or-link pat 'link)
+ (progn
+ (goto-char (point-min))
+ (or (Info-next-reference-or-link pat 'link)
+ (progn
+ (goto-char old-pt)
+ (user-error "No cross references in this node")))))
+ (if (looking-at "\\* Menu:")
+ (if recur
+ (user-error "No cross references in this node")
+ (Info-next-reference t))
+ (if (looking-at "^\\* ")
+ (forward-char 2)))))))
+
+(defun Info-prev-reference (&optional recur count)
+ "Move cursor to the previous cross-reference or menu item in the node.
+If COUNT is non-nil (interactively with a prefix arg), jump over
+COUNT cross-references."
+ (interactive "i\np")
+ (unless count
+ (setq count 1))
+ (if (< count 0)
+ (Info-next-reference recur (- count))
+ (while (unless (zerop count) (setq count (1- count)))
+ (let ((pat "\\*note[ \n\t]+\\([^:]+\\):\\|^\\* .*:\\|[hf]t?tps?://")
+ (old-pt (point))
+ (case-fold-search t))
+ (or (Info-prev-reference-or-link pat 'link)
+ (progn
+ (goto-char (point-max))
+ (or (Info-prev-reference-or-link pat 'link)
+ (progn
+ (goto-char old-pt)
+ (user-error "No cross references in this node")))))
+ (if (looking-at "\\* Menu:")
+ (if recur
+ (user-error "No cross references in this node")
+ (Info-prev-reference t))
+ (if (looking-at "^\\* ")
+ (forward-char 2)))))))
(defun Info-index-nodes (&optional file)
"Return a list of names of all index nodes in Info FILE.
@@ -3191,7 +3282,7 @@ Give an empty topic name to go to the Index node itself."
(= (aref topic 0) ?:))
(setq topic (substring topic 1)))
(let ((orignode Info-current-node)
- (pattern (format "\n\\* +\\([^\n]*%s[^\n]*\\):[ \t]+\\([^\n]*\\)\\.\\(?:[ \t\n]*(line +\\([0-9]+\\))\\)?"
+ (pattern (format "\n\\* +\\([^\n]*\\(%s\\)[^\n]*\\):[ \t]+\\([^\n]*\\)\\.\\(?:[ \t\n]*(line +\\([0-9]+\\))\\)?"
(regexp-quote topic)))
node (nodes (Info-index-nodes))
(ohist-list Info-history-list)
@@ -3210,12 +3301,14 @@ Give an empty topic name to go to the Index node itself."
(progn
(goto-char (point-min))
(while (re-search-forward pattern nil t)
- (push (list (match-string-no-properties 1)
- (match-string-no-properties 2)
- Info-current-node
- (string-to-number (concat "0"
- (match-string 3))))
- matches))
+ (let ((entry (match-string-no-properties 1))
+ (nodename (match-string-no-properties 3))
+ (line (string-to-number (concat "0" (match-string 4)))))
+ (add-text-properties
+ (- (match-beginning 2) (match-beginning 1))
+ (- (match-end 2) (match-beginning 1))
+ '(face info-index-match) entry)
+ (push (list entry nodename Info-current-node line) matches)))
(setq nodes (cdr nodes) node (car nodes)))
(Info-goto-node node))
(or matches
@@ -3441,7 +3534,7 @@ MATCHES is a list of index matches found by `Info-apropos-matches'.")
Return a list of matches where each element is in the format
\((FILENAME INDEXTEXT NODENAME LINENUMBER))."
(unless (string= string "")
- (let ((pattern (format "\n\\* +\\([^\n]*%s[^\n]*\\):[ \t]+\\([^\n]+\\)\\.\\(?:[ \t\n]*(line +\\([0-9]+\\))\\)?"
+ (let ((pattern (format "\n\\* +\\([^\n]*\\(%s\\)[^\n]*\\):[ \t]+\\([^\n]+\\)\\.\\(?:[ \t\n]*(line +\\([0-9]+\\))\\)?"
(regexp-quote string)))
(ohist Info-history)
(ohist-list Info-history-list)
@@ -3474,12 +3567,15 @@ Return a list of matches where each element is in the format
(progn
(goto-char (point-min))
(while (re-search-forward pattern nil t)
- (setq matches
- (cons (list manual
- (match-string-no-properties 1)
- (match-string-no-properties 2)
- (match-string-no-properties 3))
- matches)))
+ (let ((entry (match-string-no-properties 1))
+ (nodename (match-string-no-properties 3))
+ (line (match-string-no-properties 4)))
+ (add-text-properties
+ (- (match-beginning 2) (match-beginning 1))
+ (- (match-end 2) (match-beginning 1))
+ '(face info-index-match) entry)
+ (setq matches (cons (list manual entry nodename line)
+ matches))))
(setq nodes (cdr nodes) node (car nodes)))
(Info-goto-node node))))
(error
@@ -3785,7 +3881,25 @@ If FORK is non-nil, it is passed to `Info-goto-node'."
((setq node (Info-get-token (point) "File: " "File: \\([^,\n\t]*\\)"))
(Info-goto-node "Top" fork))
((setq node (Info-get-token (point) "Prev: " "Prev: \\([^,\n\t]*\\)"))
- (Info-goto-node node fork)))
+ (Info-goto-node node fork))
+ ;; footnote
+ ((setq node (Info-get-token (point) "(" "\\(([0-9]+)\\)"))
+ (let ((old-point (point)) new-point)
+ (save-excursion
+ (goto-char (point-min))
+ (when (re-search-forward "^[ \t]*-+ Footnotes -+$" nil t)
+ (setq new-point (if (< old-point (point))
+ ;; Go to footnote reference
+ (and (search-forward node nil t)
+ ;; Put point at beginning of link
+ (match-beginning 0))
+ ;; Go to footnote definition
+ (search-backward node nil t)))))
+ (if new-point
+ (progn
+ (goto-char new-point)
+ (setq node t))
+ (setq node nil)))))
node))
(defun Info-mouse-follow-link (click)
@@ -3813,6 +3927,7 @@ If FORK is non-nil, it is passed to `Info-goto-node'."
(suppress-keymap map)
(define-key map "." 'beginning-of-buffer)
(define-key map " " 'Info-scroll-up)
+ (define-key map [?\S-\ ] 'Info-scroll-down)
(define-key map "\C-m" 'Info-follow-nearest-node)
(define-key map "\t" 'Info-next-reference)
(define-key map "\e\t" 'Info-prev-reference)
@@ -4032,7 +4147,9 @@ With a zero prefix arg, put the name inside a function call to `info'."
(unless Info-current-node
(user-error "No current Info node"))
(let ((node (if (stringp Info-current-file)
- (concat "(" (file-name-nondirectory Info-current-file) ") "
+ (concat "(" (file-name-sans-extension
+ (file-name-nondirectory Info-current-file))
+ ") "
Info-current-node))))
(if (zerop (prefix-numeric-value arg))
(setq node (concat "(info \"" node "\")")))
@@ -4189,6 +4306,10 @@ Advanced commands:
map)
"Local keymap used within `e' command of Info.")
+(make-obsolete-variable 'Info-edit-map
+ "editing Info nodes by hand is not recommended."
+ "24.4")
+
;; Info-edit mode is suitable only for specially formatted data.
(put 'Info-edit-mode 'mode-class 'special)
@@ -4206,16 +4327,22 @@ which returns to Info mode for browsing.
(buffer-enable-undo (current-buffer))
(run-mode-hooks 'Info-edit-mode-hook))
+(make-obsolete 'Info-edit-mode
+ "editing Info nodes by hand is not recommended." "24.4")
+
(defun Info-edit ()
- "Edit the contents of this Info node.
-Allowed only if variable `Info-enable-edit' is non-nil."
+ "Edit the contents of this Info node."
(interactive)
- (or Info-enable-edit
- (error "Editing Info nodes is not enabled"))
(Info-edit-mode)
(message "%s" (substitute-command-keys
"Editing: Type \\<Info-edit-map>\\[Info-cease-edit] to return to info")))
+(put 'Info-edit 'disabled "Editing Info nodes by hand is not recommended.
+This feature will be removed in future.")
+
+(make-obsolete 'Info-edit
+ "editing Info nodes by hand is not recommended." "24.4")
+
(defun Info-cease-edit ()
"Finish editing Info node; switch back to Info proper."
(interactive)
@@ -4232,6 +4359,9 @@ Allowed only if variable `Info-enable-edit' is non-nil."
(and (marker-position Info-tag-table-marker)
(buffer-modified-p)
(message "Tags may have changed. Use Info-tagify if necessary")))
+
+(make-obsolete 'Info-cease-edit
+ "editing Info nodes by hand is not recommended." "24.4")
(defvar Info-file-list-for-emacs
'("ediff" "eudc" "forms" "gnus" "info" ("Info" . "info") ("mh" . "mh-e")
@@ -4253,7 +4383,8 @@ Allowed only if variable `Info-enable-edit' is non-nil."
("ietf-drums" . "emacs-mime") ("quoted-printable" . "emacs-mime")
("binhex" . "emacs-mime") ("uudecode" . "emacs-mime")
("mailcap" . "emacs-mime") ("mm" . "emacs-mime")
- ("mml" . "emacs-mime"))
+ ("mml" . "emacs-mime")
+ "tramp" "dbus")
"List of Info files that describe Emacs commands.
An element can be a file name, or a list of the form (PREFIX . FILE)
where PREFIX is a name prefix and FILE is the file to look in.
@@ -4264,7 +4395,7 @@ If the element is just a file name, the file name also serves as the prefix.")
The `info-file' property of COMMAND says which Info manual to search.
If COMMAND has no property, the variable `Info-file-list-for-emacs'
defines heuristics for which Info manual to try.
-The locations are of the format used in `Info-history', i.e.
+The locations are of the format used in the variable `Info-history', i.e.
\(FILENAME NODENAME BUFFERPOS), where BUFFERPOS is the line number
in the first element of the returned list (which is treated specially in
`Info-goto-emacs-command-node'), and 0 for the rest elements of a list."
@@ -4419,7 +4550,8 @@ first line or header line, and for breadcrumb links.")
(if (not (equal node "Top")) node
(format "(%s)Top"
(if (stringp Info-current-file)
- (file-name-nondirectory Info-current-file)
+ (file-name-sans-extension
+ (file-name-nondirectory Info-current-file))
;; Some legacy code can still use a symbol.
Info-current-file)))))
(setq line (concat
@@ -4531,7 +4663,8 @@ first line or header line, and for breadcrumb links.")
(if (re-search-forward
(format "File: %s\\([^,\n\t]+\\),"
(if (stringp Info-current-file)
- (file-name-nondirectory Info-current-file)
+ (file-name-sans-extension
+ (file-name-nondirectory Info-current-file))
Info-current-file))
header-end t)
(put-text-property (match-beginning 1) (match-end 1)
@@ -4823,6 +4956,21 @@ first line or header line, and for breadcrumb links.")
mouse-face highlight
help-echo "mouse-2: go to this URL"))))
+ ;; Fontify footnotes
+ (goto-char (point-min))
+ (when (and not-fontified-p (re-search-forward "^[ \t]*-+ Footnotes -+$" nil t))
+ (let ((limit (point)))
+ (goto-char (point-min))
+ (while (re-search-forward "\\(([0-9]+)\\)" nil t)
+ (add-text-properties (match-beginning 0) (match-end 0)
+ `(font-lock-face info-xref
+ link t
+ mouse-face highlight
+ help-echo
+ ,(if (< (point) limit)
+ "mouse-2: go to footnote definition"
+ "mouse-2: go to footnote reference"))))))
+
;; Hide empty lines at the end of the node.
(goto-char (point-max))
(skip-chars-backward "\n")
@@ -4836,6 +4984,17 @@ first line or header line, and for breadcrumb links.")
;; current Info node.
(eval-when-compile (require 'speedbar))
+(declare-function speedbar-add-expansion-list "speedbar" (new-list))
+(declare-function speedbar-center-buffer-smartly "speedbar" ())
+(declare-function speedbar-change-expand-button-char "speedbar" (char))
+(declare-function speedbar-change-initial-expansion-list "speedbar" (new-default))
+(declare-function speedbar-delete-subblock "speedbar" (indent))
+(declare-function speedbar-make-specialized-keymap "speedbar" ())
+(declare-function speedbar-make-tag-line "speedbar"
+ (exp-button-type exp-button-char exp-button-function
+ exp-button-data tag-button tag-button-function
+ tag-button-data tag-button-face depth))
+
(defvar Info-speedbar-key-map nil
"Keymap used when in the Info display mode.")
@@ -5058,7 +5217,8 @@ BUFFER is the buffer speedbar is requesting buttons for."
"This implements the `bookmark-make-record-function' type (which see)
for Info nodes."
(let* ((file (and (stringp Info-current-file)
- (file-name-nondirectory Info-current-file)))
+ (file-name-sans-extension
+ (file-name-nondirectory Info-current-file))))
(bookmark-name (if file
(concat "(" file ") " Info-current-node)
Info-current-node))
@@ -5086,8 +5246,16 @@ type returned by `Info-bookmark-make-record', which see."
;;;###autoload
(defun info-display-manual (manual)
- "Go to Info buffer that displays MANUAL, creating it if none already exists."
- (interactive "sManual name: ")
+ "Display an Info buffer displaying MANUAL.
+If there is an existing Info buffer for MANUAL, display it.
+Otherwise, visit the manual in a new Info buffer."
+ (interactive
+ (list
+ (progn
+ (info-initialize)
+ (completing-read "Manual name: "
+ (info--manual-names)
+ nil t))))
(let ((blist (buffer-list))
(manual-re (concat "\\(/\\|\\`\\)" manual "\\(\\.\\|\\'\\)"))
(case-fold-search t)
@@ -5102,7 +5270,25 @@ type returned by `Info-bookmark-make-record', which see."
(if found
(switch-to-buffer found)
(info-initialize)
- (info (Info-find-file manual)))))
+ (info (Info-find-file manual)
+ (generate-new-buffer-name "*info*")))))
+
+(defun info--manual-names ()
+ (let (names)
+ (dolist (buffer (buffer-list))
+ (with-current-buffer buffer
+ (and (eq major-mode 'Info-mode)
+ (stringp Info-current-file)
+ (not (string= (substring (buffer-name) 0 1) " "))
+ (push (file-name-sans-extension
+ (file-name-nondirectory Info-current-file))
+ names))))
+ (delete-dups (append (nreverse names)
+ (all-completions
+ ""
+ (apply-partially 'Info-read-node-name-2
+ Info-directory-list
+ (mapcar 'car Info-suffix-list)))))))
(provide 'info)
diff --git a/lisp/informat.el b/lisp/informat.el
index d4412b8a86a..53b043fbbad 100644
--- a/lisp/informat.el
+++ b/lisp/informat.el
@@ -43,14 +43,17 @@
;; save-restrictions would not work
;; because it records the old max relative to the end.
;; We record it relative to the beginning.
- (if input-buffer-name
- (message "Tagifying region in %s ..." input-buffer-name)
- (message
- "Tagifying %s ..." (file-name-nondirectory (buffer-file-name))))
(let ((omin (point-min))
(omax (point-max))
(nomax (= (point-max) (1+ (buffer-size))))
- (opoint (point)))
+ (opoint (point))
+ (msg (format "Tagifying %s..."
+ (cond (input-buffer-name
+ (format "region in %s" input-buffer-name))
+ (buffer-file-name
+ (file-name-nondirectory (buffer-file-name)))
+ (t "buffer")))))
+ (message "%s" msg)
(unwind-protect
(progn
(widen)
@@ -148,11 +151,8 @@
(insert "\^_\nEnd tag table\n")))))
(goto-char opoint)
(narrow-to-region omin (if nomax (1+ (buffer-size))
- (min omax (point-max))))))
- (if input-buffer-name
- (message "Tagifying region in %s done" input-buffer-name)
- (message
- "Tagifying %s done" (file-name-nondirectory (buffer-file-name)))))
+ (min omax (point-max)))))
+ (message "%sdone" msg)))
;;;###autoload
diff --git a/lisp/international/characters.el b/lisp/international/characters.el
index ad0353f93f2..d973ccf2d7e 100644
--- a/lisp/international/characters.el
+++ b/lisp/international/characters.el
@@ -1410,16 +1410,16 @@ This function updates the char-table `glyphless-char-display'."
(or (memq method '(zero-width thin-space empty-box acronym hex-code))
(error "Invalid glyphless character display method: %s" method))
(cond ((eq target 'c0-control)
- (set-char-table-range glyphless-char-display '(#x00 . #x1F)
- method)
+ (glyphless-set-char-table-range glyphless-char-display
+ #x00 #x1F method)
;; Users will not expect their newlines and TABs be
;; displayed as anything but themselves, so exempt those
;; two characters from c0-control.
(set-char-table-range glyphless-char-display #x9 nil)
(set-char-table-range glyphless-char-display #xa nil))
((eq target 'c1-control)
- (set-char-table-range glyphless-char-display '(#x80 . #x9F)
- method))
+ (glyphless-set-char-table-range glyphless-char-display
+ #x80 #x9F method))
((eq target 'format-control)
(map-char-table
#'(lambda (char category)
@@ -1443,6 +1443,14 @@ This function updates the char-table `glyphless-char-display'."
(t
(error "Invalid glyphless character group: %s" target))))))
+(defun glyphless-set-char-table-range (chartable from to method)
+ (if (eq method 'acronym)
+ (let ((i from))
+ (while (<= i to)
+ (set-char-table-range chartable i (aref char-acronym-table i))
+ (setq i (1+ i))))
+ (set-char-table-range chartable (cons from to) method)))
+
;;; Control of displaying glyphless characters.
(defcustom glyphless-char-display-control
'((format-control . thin-space)
diff --git a/lisp/international/iso-cvt.el b/lisp/international/iso-cvt.el
index 34488db5f17..407ff3ae7a4 100644
--- a/lisp/international/iso-cvt.el
+++ b/lisp/international/iso-cvt.el
@@ -1,4 +1,4 @@
-;;; iso-cvt.el --- translate ISO 8859-1 from/to various encodings -*- coding: iso-latin-1 -*-
+;;; iso-cvt.el --- translate ISO 8859-1 from/to various encodings -*- coding: utf-8 -*-
;; This file was formerly called gm-lingo.el.
;; Copyright (C) 1993-1998, 2000-2013 Free Software Foundation, Inc.
@@ -45,19 +45,19 @@
(defvar iso-spanish-trans-tab
'(
- ("~n" "ñ")
- ("\([a-zA-Z]\)#" "\\1ñ")
- ("~N" "Ñ")
- ("\\([-a-zA-Z\"`]\\)\"u" "\\1ü")
- ("\\([-a-zA-Z\"`]\\)\"U" "\\1Ü")
- ("\\([-a-zA-Z]\\)'o" "\\1ó")
- ("\\([-a-zA-Z]\\)'O" "\\Ó")
- ("\\([-a-zA-Z]\\)'e" "\\1é")
- ("\\([-a-zA-Z]\\)'E" "\\1É")
- ("\\([-a-zA-Z]\\)'a" "\\1á")
+ ("~n" "ñ")
+ ("\([a-zA-Z]\)#" "\\1ñ")
+ ("~N" "Ñ")
+ ("\\([-a-zA-Z\"`]\\)\"u" "\\1ü")
+ ("\\([-a-zA-Z\"`]\\)\"U" "\\1Ü")
+ ("\\([-a-zA-Z]\\)'o" "\\1ó")
+ ("\\([-a-zA-Z]\\)'O" "\\Ó")
+ ("\\([-a-zA-Z]\\)'e" "\\1é")
+ ("\\([-a-zA-Z]\\)'E" "\\1É")
+ ("\\([-a-zA-Z]\\)'a" "\\1á")
("\\([-a-zA-Z]\\)'A" "\\1A")
- ("\\([-a-zA-Z]\\)'i" "\\1í")
- ("\\([-a-zA-Z]\\)'I" "\\1Í")
+ ("\\([-a-zA-Z]\\)'i" "\\1í")
+ ("\\([-a-zA-Z]\\)'I" "\\1Ã")
)
"Spanish translation table.")
@@ -89,14 +89,14 @@ Optional arg BUFFER is ignored (for use in `format-alist')."
(defvar iso-aggressive-german-trans-tab
'(
- ("\"a" "ä")
- ("\"A" "Ä")
- ("\"o" "ö")
- ("\"O" "Ö")
- ("\"u" "ü")
- ("\"U" "Ü")
- ("\"s" "ß")
- ("\\\\3" "ß")
+ ("\"a" "ä")
+ ("\"A" "Ä")
+ ("\"o" "ö")
+ ("\"O" "Ö")
+ ("\"u" "ü")
+ ("\"U" "Ü")
+ ("\"s" "ß")
+ ("\\\\3" "ß")
)
"German translation table.
This table uses an aggressive translation approach
@@ -104,14 +104,14 @@ and may erroneously translate too much.")
(defvar iso-conservative-german-trans-tab
'(
- ("\\([-a-zA-Z\"`]\\)\"a" "\\1ä")
- ("\\([-a-zA-Z\"`]\\)\"A" "\\1Ä")
- ("\\([-a-zA-Z\"`]\\)\"o" "\\1ö")
- ("\\([-a-zA-Z\"`]\\)\"O" "\\1Ö")
- ("\\([-a-zA-Z\"`]\\)\"u" "\\1ü")
- ("\\([-a-zA-Z\"`]\\)\"U" "\\1Ü")
- ("\\([-a-zA-Z\"`]\\)\"s" "\\1ß")
- ("\\([-a-zA-Z\"`]\\)\\\\3" "\\1ß")
+ ("\\([-a-zA-Z\"`]\\)\"a" "\\1ä")
+ ("\\([-a-zA-Z\"`]\\)\"A" "\\1Ä")
+ ("\\([-a-zA-Z\"`]\\)\"o" "\\1ö")
+ ("\\([-a-zA-Z\"`]\\)\"O" "\\1Ö")
+ ("\\([-a-zA-Z\"`]\\)\"u" "\\1ü")
+ ("\\([-a-zA-Z\"`]\\)\"U" "\\1Ü")
+ ("\\([-a-zA-Z\"`]\\)\"s" "\\1ß")
+ ("\\([-a-zA-Z\"`]\\)\\\\3" "\\1ß")
)
"German translation table.
This table uses a conservative translation approach
@@ -131,65 +131,65 @@ Optional arg BUFFER is ignored (for use in `format-alist')."
(defvar iso-iso2tex-trans-tab
'(
- ("ä" "{\\\\\"a}")
- ("à" "{\\\\`a}")
- ("á" "{\\\\'a}")
- ("ã" "{\\\\~a}")
- ("â" "{\\\\^a}")
- ("ë" "{\\\\\"e}")
- ("è" "{\\\\`e}")
- ("é" "{\\\\'e}")
- ("ê" "{\\\\^e}")
- ("ï" "{\\\\\"\\\\i}")
- ("ì" "{\\\\`\\\\i}")
- ("í" "{\\\\'\\\\i}")
- ("î" "{\\\\^\\\\i}")
- ("ö" "{\\\\\"o}")
- ("ò" "{\\\\`o}")
- ("ó" "{\\\\'o}")
- ("õ" "{\\\\~o}")
- ("ô" "{\\\\^o}")
- ("ü" "{\\\\\"u}")
- ("ù" "{\\\\`u}")
- ("ú" "{\\\\'u}")
- ("û" "{\\\\^u}")
- ("Ä" "{\\\\\"A}")
- ("À" "{\\\\`A}")
- ("Á" "{\\\\'A}")
- ("Ã" "{\\\\~A}")
- ("Â" "{\\\\^A}")
- ("Ë" "{\\\\\"E}")
- ("È" "{\\\\`E}")
- ("É" "{\\\\'E}")
- ("Ê" "{\\\\^E}")
- ("Ï" "{\\\\\"I}")
- ("Ì" "{\\\\`I}")
- ("Í" "{\\\\'I}")
- ("Î" "{\\\\^I}")
- ("Ö" "{\\\\\"O}")
- ("Ò" "{\\\\`O}")
- ("Ó" "{\\\\'O}")
- ("Õ" "{\\\\~O}")
- ("Ô" "{\\\\^O}")
- ("Ü" "{\\\\\"U}")
- ("Ù" "{\\\\`U}")
- ("Ú" "{\\\\'U}")
- ("Û" "{\\\\^U}")
- ("ñ" "{\\\\~n}")
- ("Ñ" "{\\\\~N}")
- ("ç" "{\\\\c c}")
- ("Ç" "{\\\\c C}")
- ("ß" "{\\\\ss}")
+ ("ä" "{\\\\\"a}")
+ ("à" "{\\\\`a}")
+ ("á" "{\\\\'a}")
+ ("ã" "{\\\\~a}")
+ ("â" "{\\\\^a}")
+ ("ë" "{\\\\\"e}")
+ ("è" "{\\\\`e}")
+ ("é" "{\\\\'e}")
+ ("ê" "{\\\\^e}")
+ ("ï" "{\\\\\"\\\\i}")
+ ("ì" "{\\\\`\\\\i}")
+ ("í" "{\\\\'\\\\i}")
+ ("î" "{\\\\^\\\\i}")
+ ("ö" "{\\\\\"o}")
+ ("ò" "{\\\\`o}")
+ ("ó" "{\\\\'o}")
+ ("õ" "{\\\\~o}")
+ ("ô" "{\\\\^o}")
+ ("ü" "{\\\\\"u}")
+ ("ù" "{\\\\`u}")
+ ("ú" "{\\\\'u}")
+ ("û" "{\\\\^u}")
+ ("Ä" "{\\\\\"A}")
+ ("À" "{\\\\`A}")
+ ("Ã" "{\\\\'A}")
+ ("Ã" "{\\\\~A}")
+ ("Â" "{\\\\^A}")
+ ("Ë" "{\\\\\"E}")
+ ("È" "{\\\\`E}")
+ ("É" "{\\\\'E}")
+ ("Ê" "{\\\\^E}")
+ ("Ã" "{\\\\\"I}")
+ ("Ì" "{\\\\`I}")
+ ("Ã" "{\\\\'I}")
+ ("ÃŽ" "{\\\\^I}")
+ ("Ö" "{\\\\\"O}")
+ ("Ã’" "{\\\\`O}")
+ ("Ó" "{\\\\'O}")
+ ("Õ" "{\\\\~O}")
+ ("Ô" "{\\\\^O}")
+ ("Ü" "{\\\\\"U}")
+ ("Ù" "{\\\\`U}")
+ ("Ú" "{\\\\'U}")
+ ("Û" "{\\\\^U}")
+ ("ñ" "{\\\\~n}")
+ ("Ñ" "{\\\\~N}")
+ ("ç" "{\\\\c c}")
+ ("Ç" "{\\\\c C}")
+ ("ß" "{\\\\ss}")
("\306" "{\\\\AE}")
("\346" "{\\\\ae}")
("\305" "{\\\\AA}")
("\345" "{\\\\aa}")
("\251" "{\\\\copyright}")
- ("£" "{\\\\pounds}")
- ("¶" "{\\\\P}")
- ("§" "{\\\\S}")
- ("¿" "{?`}")
- ("¡" "{!`}")
+ ("£" "{\\\\pounds}")
+ ("¶" "{\\\\P}")
+ ("§" "{\\\\S}")
+ ("¿" "{?`}")
+ ("¡" "{!`}")
)
"Translation table for translating ISO 8859-1 characters to TeX sequences.")
@@ -204,183 +204,183 @@ Optional arg BUFFER is ignored (for use in `format-alist')."
(defvar iso-tex2iso-trans-tab
'(
- ("{\\\\\"a}" "ä")
- ("{\\\\`a}" "à")
- ("{\\\\'a}" "á")
- ("{\\\\~a}" "ã")
- ("{\\\\^a}" "â")
- ("{\\\\\"e}" "ë")
- ("{\\\\`e}" "è")
- ("{\\\\'e}" "é")
- ("{\\\\^e}" "ê")
- ("{\\\\\"\\\\i}" "ï")
- ("{\\\\`\\\\i}" "ì")
- ("{\\\\'\\\\i}" "í")
- ("{\\\\^\\\\i}" "î")
- ("{\\\\\"i}" "ï")
- ("{\\\\`i}" "ì")
- ("{\\\\'i}" "í")
- ("{\\\\^i}" "î")
- ("{\\\\\"o}" "ö")
- ("{\\\\`o}" "ò")
- ("{\\\\'o}" "ó")
- ("{\\\\~o}" "õ")
- ("{\\\\^o}" "ô")
- ("{\\\\\"u}" "ü")
- ("{\\\\`u}" "ù")
- ("{\\\\'u}" "ú")
- ("{\\\\^u}" "û")
- ("{\\\\\"A}" "Ä")
- ("{\\\\`A}" "À")
- ("{\\\\'A}" "Á")
- ("{\\\\~A}" "Ã")
- ("{\\\\^A}" "Â")
- ("{\\\\\"E}" "Ë")
- ("{\\\\`E}" "È")
- ("{\\\\'E}" "É")
- ("{\\\\^E}" "Ê")
- ("{\\\\\"I}" "Ï")
- ("{\\\\`I}" "Ì")
- ("{\\\\'I}" "Í")
- ("{\\\\^I}" "Î")
- ("{\\\\\"O}" "Ö")
- ("{\\\\`O}" "Ò")
- ("{\\\\'O}" "Ó")
- ("{\\\\~O}" "Õ")
- ("{\\\\^O}" "Ô")
- ("{\\\\\"U}" "Ü")
- ("{\\\\`U}" "Ù")
- ("{\\\\'U}" "Ú")
- ("{\\\\^U}" "Û")
- ("{\\\\~n}" "ñ")
- ("{\\\\~N}" "Ñ")
- ("{\\\\c c}" "ç")
- ("{\\\\c C}" "Ç")
- ("\\\\\"a" "ä")
- ("\\\\`a" "à")
- ("\\\\'a" "á")
- ("\\\\~a" "ã")
- ("\\\\^a" "â")
- ("\\\\\"e" "ë")
- ("\\\\`e" "è")
- ("\\\\'e" "é")
- ("\\\\^e" "ê")
+ ("{\\\\\"a}" "ä")
+ ("{\\\\`a}" "à")
+ ("{\\\\'a}" "á")
+ ("{\\\\~a}" "ã")
+ ("{\\\\^a}" "â")
+ ("{\\\\\"e}" "ë")
+ ("{\\\\`e}" "è")
+ ("{\\\\'e}" "é")
+ ("{\\\\^e}" "ê")
+ ("{\\\\\"\\\\i}" "ï")
+ ("{\\\\`\\\\i}" "ì")
+ ("{\\\\'\\\\i}" "í")
+ ("{\\\\^\\\\i}" "î")
+ ("{\\\\\"i}" "ï")
+ ("{\\\\`i}" "ì")
+ ("{\\\\'i}" "í")
+ ("{\\\\^i}" "î")
+ ("{\\\\\"o}" "ö")
+ ("{\\\\`o}" "ò")
+ ("{\\\\'o}" "ó")
+ ("{\\\\~o}" "õ")
+ ("{\\\\^o}" "ô")
+ ("{\\\\\"u}" "ü")
+ ("{\\\\`u}" "ù")
+ ("{\\\\'u}" "ú")
+ ("{\\\\^u}" "û")
+ ("{\\\\\"A}" "Ä")
+ ("{\\\\`A}" "À")
+ ("{\\\\'A}" "Ã")
+ ("{\\\\~A}" "Ã")
+ ("{\\\\^A}" "Â")
+ ("{\\\\\"E}" "Ë")
+ ("{\\\\`E}" "È")
+ ("{\\\\'E}" "É")
+ ("{\\\\^E}" "Ê")
+ ("{\\\\\"I}" "Ã")
+ ("{\\\\`I}" "Ì")
+ ("{\\\\'I}" "Ã")
+ ("{\\\\^I}" "ÃŽ")
+ ("{\\\\\"O}" "Ö")
+ ("{\\\\`O}" "Ã’")
+ ("{\\\\'O}" "Ó")
+ ("{\\\\~O}" "Õ")
+ ("{\\\\^O}" "Ô")
+ ("{\\\\\"U}" "Ü")
+ ("{\\\\`U}" "Ù")
+ ("{\\\\'U}" "Ú")
+ ("{\\\\^U}" "Û")
+ ("{\\\\~n}" "ñ")
+ ("{\\\\~N}" "Ñ")
+ ("{\\\\c c}" "ç")
+ ("{\\\\c C}" "Ç")
+ ("\\\\\"a" "ä")
+ ("\\\\`a" "à")
+ ("\\\\'a" "á")
+ ("\\\\~a" "ã")
+ ("\\\\^a" "â")
+ ("\\\\\"e" "ë")
+ ("\\\\`e" "è")
+ ("\\\\'e" "é")
+ ("\\\\^e" "ê")
;; Discard spaces and/or one EOF after macro \i.
;; Converting it back will use braces.
- ("\\\\\"\\\\i *\n\n" "ï\n\n")
- ("\\\\\"\\\\i *\n?" "ï")
- ("\\\\`\\\\i *\n\n" "ì\n\n")
- ("\\\\`\\\\i *\n?" "ì")
- ("\\\\'\\\\i *\n\n" "í\n\n")
- ("\\\\'\\\\i *\n?" "í")
- ("\\\\^\\\\i *\n\n" "î\n\n")
- ("\\\\^\\\\i *\n?" "î")
- ("\\\\\"i" "ï")
- ("\\\\`i" "ì")
- ("\\\\'i" "í")
- ("\\\\^i" "î")
- ("\\\\\"o" "ö")
- ("\\\\`o" "ò")
- ("\\\\'o" "ó")
- ("\\\\~o" "õ")
- ("\\\\^o" "ô")
- ("\\\\\"u" "ü")
- ("\\\\`u" "ù")
- ("\\\\'u" "ú")
- ("\\\\^u" "û")
- ("\\\\\"A" "Ä")
- ("\\\\`A" "À")
- ("\\\\'A" "Á")
- ("\\\\~A" "Ã")
- ("\\\\^A" "Â")
- ("\\\\\"E" "Ë")
- ("\\\\`E" "È")
- ("\\\\'E" "É")
- ("\\\\^E" "Ê")
- ("\\\\\"I" "Ï")
- ("\\\\`I" "Ì")
- ("\\\\'I" "Í")
- ("\\\\^I" "Î")
- ("\\\\\"O" "Ö")
- ("\\\\`O" "Ò")
- ("\\\\'O" "Ó")
- ("\\\\~O" "Õ")
- ("\\\\^O" "Ô")
- ("\\\\\"U" "Ü")
- ("\\\\`U" "Ù")
- ("\\\\'U" "Ú")
- ("\\\\^U" "Û")
- ("\\\\~n" "ñ")
- ("\\\\~N" "Ñ")
- ("\\\\\"{a}" "ä")
- ("\\\\`{a}" "à")
- ("\\\\'{a}" "á")
- ("\\\\~{a}" "ã")
- ("\\\\^{a}" "â")
- ("\\\\\"{e}" "ë")
- ("\\\\`{e}" "è")
- ("\\\\'{e}" "é")
- ("\\\\^{e}" "ê")
- ("\\\\\"{\\\\i}" "ï")
- ("\\\\`{\\\\i}" "ì")
- ("\\\\'{\\\\i}" "í")
- ("\\\\^{\\\\i}" "î")
- ("\\\\\"{i}" "ï")
- ("\\\\`{i}" "ì")
- ("\\\\'{i}" "í")
- ("\\\\^{i}" "î")
- ("\\\\\"{o}" "ö")
- ("\\\\`{o}" "ò")
- ("\\\\'{o}" "ó")
- ("\\\\~{o}" "õ")
- ("\\\\^{o}" "ô")
- ("\\\\\"{u}" "ü")
- ("\\\\`{u}" "ù")
- ("\\\\'{u}" "ú")
- ("\\\\^{u}" "û")
- ("\\\\\"{A}" "Ä")
- ("\\\\`{A}" "À")
- ("\\\\'{A}" "Á")
- ("\\\\~{A}" "Ã")
- ("\\\\^{A}" "Â")
- ("\\\\\"{E}" "Ë")
- ("\\\\`{E}" "È")
- ("\\\\'{E}" "É")
- ("\\\\^{E}" "Ê")
- ("\\\\\"{I}" "Ï")
- ("\\\\`{I}" "Ì")
- ("\\\\'{I}" "Í")
- ("\\\\^{I}" "Î")
- ("\\\\\"{O}" "Ö")
- ("\\\\`{O}" "Ò")
- ("\\\\'{O}" "Ó")
- ("\\\\~{O}" "Õ")
- ("\\\\^{O}" "Ô")
- ("\\\\\"{U}" "Ü")
- ("\\\\`{U}" "Ù")
- ("\\\\'{U}" "Ú")
- ("\\\\^{U}" "Û")
- ("\\\\~{n}" "ñ")
- ("\\\\~{N}" "Ñ")
- ("\\\\c{c}" "ç")
- ("\\\\c{C}" "Ç")
- ("{\\\\ss}" "ß")
+ ("\\\\\"\\\\i *\n\n" "ï\n\n")
+ ("\\\\\"\\\\i *\n?" "ï")
+ ("\\\\`\\\\i *\n\n" "ì\n\n")
+ ("\\\\`\\\\i *\n?" "ì")
+ ("\\\\'\\\\i *\n\n" "í\n\n")
+ ("\\\\'\\\\i *\n?" "í")
+ ("\\\\^\\\\i *\n\n" "î\n\n")
+ ("\\\\^\\\\i *\n?" "î")
+ ("\\\\\"i" "ï")
+ ("\\\\`i" "ì")
+ ("\\\\'i" "í")
+ ("\\\\^i" "î")
+ ("\\\\\"o" "ö")
+ ("\\\\`o" "ò")
+ ("\\\\'o" "ó")
+ ("\\\\~o" "õ")
+ ("\\\\^o" "ô")
+ ("\\\\\"u" "ü")
+ ("\\\\`u" "ù")
+ ("\\\\'u" "ú")
+ ("\\\\^u" "û")
+ ("\\\\\"A" "Ä")
+ ("\\\\`A" "À")
+ ("\\\\'A" "Ã")
+ ("\\\\~A" "Ã")
+ ("\\\\^A" "Â")
+ ("\\\\\"E" "Ë")
+ ("\\\\`E" "È")
+ ("\\\\'E" "É")
+ ("\\\\^E" "Ê")
+ ("\\\\\"I" "Ã")
+ ("\\\\`I" "Ì")
+ ("\\\\'I" "Ã")
+ ("\\\\^I" "ÃŽ")
+ ("\\\\\"O" "Ö")
+ ("\\\\`O" "Ã’")
+ ("\\\\'O" "Ó")
+ ("\\\\~O" "Õ")
+ ("\\\\^O" "Ô")
+ ("\\\\\"U" "Ü")
+ ("\\\\`U" "Ù")
+ ("\\\\'U" "Ú")
+ ("\\\\^U" "Û")
+ ("\\\\~n" "ñ")
+ ("\\\\~N" "Ñ")
+ ("\\\\\"{a}" "ä")
+ ("\\\\`{a}" "à")
+ ("\\\\'{a}" "á")
+ ("\\\\~{a}" "ã")
+ ("\\\\^{a}" "â")
+ ("\\\\\"{e}" "ë")
+ ("\\\\`{e}" "è")
+ ("\\\\'{e}" "é")
+ ("\\\\^{e}" "ê")
+ ("\\\\\"{\\\\i}" "ï")
+ ("\\\\`{\\\\i}" "ì")
+ ("\\\\'{\\\\i}" "í")
+ ("\\\\^{\\\\i}" "î")
+ ("\\\\\"{i}" "ï")
+ ("\\\\`{i}" "ì")
+ ("\\\\'{i}" "í")
+ ("\\\\^{i}" "î")
+ ("\\\\\"{o}" "ö")
+ ("\\\\`{o}" "ò")
+ ("\\\\'{o}" "ó")
+ ("\\\\~{o}" "õ")
+ ("\\\\^{o}" "ô")
+ ("\\\\\"{u}" "ü")
+ ("\\\\`{u}" "ù")
+ ("\\\\'{u}" "ú")
+ ("\\\\^{u}" "û")
+ ("\\\\\"{A}" "Ä")
+ ("\\\\`{A}" "À")
+ ("\\\\'{A}" "Ã")
+ ("\\\\~{A}" "Ã")
+ ("\\\\^{A}" "Â")
+ ("\\\\\"{E}" "Ë")
+ ("\\\\`{E}" "È")
+ ("\\\\'{E}" "É")
+ ("\\\\^{E}" "Ê")
+ ("\\\\\"{I}" "Ã")
+ ("\\\\`{I}" "Ì")
+ ("\\\\'{I}" "Ã")
+ ("\\\\^{I}" "ÃŽ")
+ ("\\\\\"{O}" "Ö")
+ ("\\\\`{O}" "Ã’")
+ ("\\\\'{O}" "Ó")
+ ("\\\\~{O}" "Õ")
+ ("\\\\^{O}" "Ô")
+ ("\\\\\"{U}" "Ü")
+ ("\\\\`{U}" "Ù")
+ ("\\\\'{U}" "Ú")
+ ("\\\\^{U}" "Û")
+ ("\\\\~{n}" "ñ")
+ ("\\\\~{N}" "Ñ")
+ ("\\\\c{c}" "ç")
+ ("\\\\c{C}" "Ç")
+ ("{\\\\ss}" "ß")
("{\\\\AE}" "\306")
("{\\\\ae}" "\346")
("{\\\\AA}" "\305")
("{\\\\aa}" "\345")
("{\\\\copyright}" "\251")
("\\\\copyright{}" "\251")
- ("{\\\\pounds}" "£" )
- ("{\\\\P}" "¶" )
- ("{\\\\S}" "§" )
- ("\\\\pounds{}" "£" )
- ("\\\\P{}" "¶" )
- ("\\\\S{}" "§" )
- ("{\\?`}" "¿")
- ("{!`}" "¡")
- ("\\?`" "¿")
- ("!`" "¡")
+ ("{\\\\pounds}" "£" )
+ ("{\\\\P}" "¶" )
+ ("{\\\\S}" "§" )
+ ("\\\\pounds{}" "£" )
+ ("\\\\P{}" "¶" )
+ ("\\\\S{}" "§" )
+ ("{\\?`}" "¿")
+ ("{!`}" "¡")
+ ("\\?`" "¿")
+ ("!`" "¡")
)
"Translation table for translating TeX sequences to ISO 8859-1 characters.
This table is not exhaustive (and due to TeX's power can never be).
@@ -397,185 +397,185 @@ Optional arg BUFFER is ignored (for use in `format-alist')."
(defvar iso-gtex2iso-trans-tab
'(
- ("{\\\\\"a}" "ä")
- ("{\\\\`a}" "à")
- ("{\\\\'a}" "á")
- ("{\\\\~a}" "ã")
- ("{\\\\^a}" "â")
- ("{\\\\\"e}" "ë")
- ("{\\\\`e}" "è")
- ("{\\\\'e}" "é")
- ("{\\\\^e}" "ê")
- ("{\\\\\"\\\\i}" "ï")
- ("{\\\\`\\\\i}" "ì")
- ("{\\\\'\\\\i}" "í")
- ("{\\\\^\\\\i}" "î")
- ("{\\\\\"i}" "ï")
- ("{\\\\`i}" "ì")
- ("{\\\\'i}" "í")
- ("{\\\\^i}" "î")
- ("{\\\\\"o}" "ö")
- ("{\\\\`o}" "ò")
- ("{\\\\'o}" "ó")
- ("{\\\\~o}" "õ")
- ("{\\\\^o}" "ô")
- ("{\\\\\"u}" "ü")
- ("{\\\\`u}" "ù")
- ("{\\\\'u}" "ú")
- ("{\\\\^u}" "û")
- ("{\\\\\"A}" "Ä")
- ("{\\\\`A}" "À")
- ("{\\\\'A}" "Á")
- ("{\\\\~A}" "Ã")
- ("{\\\\^A}" "Â")
- ("{\\\\\"E}" "Ë")
- ("{\\\\`E}" "È")
- ("{\\\\'E}" "É")
- ("{\\\\^E}" "Ê")
- ("{\\\\\"I}" "Ï")
- ("{\\\\`I}" "Ì")
- ("{\\\\'I}" "Í")
- ("{\\\\^I}" "Î")
- ("{\\\\\"O}" "Ö")
- ("{\\\\`O}" "Ò")
- ("{\\\\'O}" "Ó")
- ("{\\\\~O}" "Õ")
- ("{\\\\^O}" "Ô")
- ("{\\\\\"U}" "Ü")
- ("{\\\\`U}" "Ù")
- ("{\\\\'U}" "Ú")
- ("{\\\\^U}" "Û")
- ("{\\\\~n}" "ñ")
- ("{\\\\~N}" "Ñ")
- ("{\\\\c c}" "ç")
- ("{\\\\c C}" "Ç")
- ("\\\\\"a" "ä")
- ("\\\\`a" "à")
- ("\\\\'a" "á")
- ("\\\\~a" "ã")
- ("\\\\^a" "â")
- ("\\\\\"e" "ë")
- ("\\\\`e" "è")
- ("\\\\'e" "é")
- ("\\\\^e" "ê")
- ("\\\\\"\\\\i" "ï")
- ("\\\\`\\\\i" "ì")
- ("\\\\'\\\\i" "í")
- ("\\\\^\\\\i" "î")
- ("\\\\\"i" "ï")
- ("\\\\`i" "ì")
- ("\\\\'i" "í")
- ("\\\\^i" "î")
- ("\\\\\"o" "ö")
- ("\\\\`o" "ò")
- ("\\\\'o" "ó")
- ("\\\\~o" "õ")
- ("\\\\^o" "ô")
- ("\\\\\"u" "ü")
- ("\\\\`u" "ù")
- ("\\\\'u" "ú")
- ("\\\\^u" "û")
- ("\\\\\"A" "Ä")
- ("\\\\`A" "À")
- ("\\\\'A" "Á")
- ("\\\\~A" "Ã")
- ("\\\\^A" "Â")
- ("\\\\\"E" "Ë")
- ("\\\\`E" "È")
- ("\\\\'E" "É")
- ("\\\\^E" "Ê")
- ("\\\\\"I" "Ï")
- ("\\\\`I" "Ì")
- ("\\\\'I" "Í")
- ("\\\\^I" "Î")
- ("\\\\\"O" "Ö")
- ("\\\\`O" "Ò")
- ("\\\\'O" "Ó")
- ("\\\\~O" "Õ")
- ("\\\\^O" "Ô")
- ("\\\\\"U" "Ü")
- ("\\\\`U" "Ù")
- ("\\\\'U" "Ú")
- ("\\\\^U" "Û")
- ("\\\\~n" "ñ")
- ("\\\\~N" "Ñ")
- ("\\\\\"{a}" "ä")
- ("\\\\`{a}" "à")
- ("\\\\'{a}" "á")
- ("\\\\~{a}" "ã")
- ("\\\\^{a}" "â")
- ("\\\\\"{e}" "ë")
- ("\\\\`{e}" "è")
- ("\\\\'{e}" "é")
- ("\\\\^{e}" "ê")
- ("\\\\\"{\\\\i}" "ï")
- ("\\\\`{\\\\i}" "ì")
- ("\\\\'{\\\\i}" "í")
- ("\\\\^{\\\\i}" "î")
- ("\\\\\"{i}" "ï")
- ("\\\\`{i}" "ì")
- ("\\\\'{i}" "í")
- ("\\\\^{i}" "î")
- ("\\\\\"{o}" "ö")
- ("\\\\`{o}" "ò")
- ("\\\\'{o}" "ó")
- ("\\\\~{o}" "õ")
- ("\\\\^{o}" "ô")
- ("\\\\\"{u}" "ü")
- ("\\\\`{u}" "ù")
- ("\\\\'{u}" "ú")
- ("\\\\^{u}" "û")
- ("\\\\\"{A}" "Ä")
- ("\\\\`{A}" "À")
- ("\\\\'{A}" "Á")
- ("\\\\~{A}" "Ã")
- ("\\\\^{A}" "Â")
- ("\\\\\"{E}" "Ë")
- ("\\\\`{E}" "È")
- ("\\\\'{E}" "É")
- ("\\\\^{E}" "Ê")
- ("\\\\\"{I}" "Ï")
- ("\\\\`{I}" "Ì")
- ("\\\\'{I}" "Í")
- ("\\\\^{I}" "Î")
- ("\\\\\"{O}" "Ö")
- ("\\\\`{O}" "Ò")
- ("\\\\'{O}" "Ó")
- ("\\\\~{O}" "Õ")
- ("\\\\^{O}" "Ô")
- ("\\\\\"{U}" "Ü")
- ("\\\\`{U}" "Ù")
- ("\\\\'{U}" "Ú")
- ("\\\\^{U}" "Û")
- ("\\\\~{n}" "ñ")
- ("\\\\~{N}" "Ñ")
- ("\\\\c{c}" "ç")
- ("\\\\c{C}" "Ç")
- ("{\\\\ss}" "ß")
+ ("{\\\\\"a}" "ä")
+ ("{\\\\`a}" "à")
+ ("{\\\\'a}" "á")
+ ("{\\\\~a}" "ã")
+ ("{\\\\^a}" "â")
+ ("{\\\\\"e}" "ë")
+ ("{\\\\`e}" "è")
+ ("{\\\\'e}" "é")
+ ("{\\\\^e}" "ê")
+ ("{\\\\\"\\\\i}" "ï")
+ ("{\\\\`\\\\i}" "ì")
+ ("{\\\\'\\\\i}" "í")
+ ("{\\\\^\\\\i}" "î")
+ ("{\\\\\"i}" "ï")
+ ("{\\\\`i}" "ì")
+ ("{\\\\'i}" "í")
+ ("{\\\\^i}" "î")
+ ("{\\\\\"o}" "ö")
+ ("{\\\\`o}" "ò")
+ ("{\\\\'o}" "ó")
+ ("{\\\\~o}" "õ")
+ ("{\\\\^o}" "ô")
+ ("{\\\\\"u}" "ü")
+ ("{\\\\`u}" "ù")
+ ("{\\\\'u}" "ú")
+ ("{\\\\^u}" "û")
+ ("{\\\\\"A}" "Ä")
+ ("{\\\\`A}" "À")
+ ("{\\\\'A}" "Ã")
+ ("{\\\\~A}" "Ã")
+ ("{\\\\^A}" "Â")
+ ("{\\\\\"E}" "Ë")
+ ("{\\\\`E}" "È")
+ ("{\\\\'E}" "É")
+ ("{\\\\^E}" "Ê")
+ ("{\\\\\"I}" "Ã")
+ ("{\\\\`I}" "Ì")
+ ("{\\\\'I}" "Ã")
+ ("{\\\\^I}" "ÃŽ")
+ ("{\\\\\"O}" "Ö")
+ ("{\\\\`O}" "Ã’")
+ ("{\\\\'O}" "Ó")
+ ("{\\\\~O}" "Õ")
+ ("{\\\\^O}" "Ô")
+ ("{\\\\\"U}" "Ü")
+ ("{\\\\`U}" "Ù")
+ ("{\\\\'U}" "Ú")
+ ("{\\\\^U}" "Û")
+ ("{\\\\~n}" "ñ")
+ ("{\\\\~N}" "Ñ")
+ ("{\\\\c c}" "ç")
+ ("{\\\\c C}" "Ç")
+ ("\\\\\"a" "ä")
+ ("\\\\`a" "à")
+ ("\\\\'a" "á")
+ ("\\\\~a" "ã")
+ ("\\\\^a" "â")
+ ("\\\\\"e" "ë")
+ ("\\\\`e" "è")
+ ("\\\\'e" "é")
+ ("\\\\^e" "ê")
+ ("\\\\\"\\\\i" "ï")
+ ("\\\\`\\\\i" "ì")
+ ("\\\\'\\\\i" "í")
+ ("\\\\^\\\\i" "î")
+ ("\\\\\"i" "ï")
+ ("\\\\`i" "ì")
+ ("\\\\'i" "í")
+ ("\\\\^i" "î")
+ ("\\\\\"o" "ö")
+ ("\\\\`o" "ò")
+ ("\\\\'o" "ó")
+ ("\\\\~o" "õ")
+ ("\\\\^o" "ô")
+ ("\\\\\"u" "ü")
+ ("\\\\`u" "ù")
+ ("\\\\'u" "ú")
+ ("\\\\^u" "û")
+ ("\\\\\"A" "Ä")
+ ("\\\\`A" "À")
+ ("\\\\'A" "Ã")
+ ("\\\\~A" "Ã")
+ ("\\\\^A" "Â")
+ ("\\\\\"E" "Ë")
+ ("\\\\`E" "È")
+ ("\\\\'E" "É")
+ ("\\\\^E" "Ê")
+ ("\\\\\"I" "Ã")
+ ("\\\\`I" "Ì")
+ ("\\\\'I" "Ã")
+ ("\\\\^I" "ÃŽ")
+ ("\\\\\"O" "Ö")
+ ("\\\\`O" "Ã’")
+ ("\\\\'O" "Ó")
+ ("\\\\~O" "Õ")
+ ("\\\\^O" "Ô")
+ ("\\\\\"U" "Ü")
+ ("\\\\`U" "Ù")
+ ("\\\\'U" "Ú")
+ ("\\\\^U" "Û")
+ ("\\\\~n" "ñ")
+ ("\\\\~N" "Ñ")
+ ("\\\\\"{a}" "ä")
+ ("\\\\`{a}" "à")
+ ("\\\\'{a}" "á")
+ ("\\\\~{a}" "ã")
+ ("\\\\^{a}" "â")
+ ("\\\\\"{e}" "ë")
+ ("\\\\`{e}" "è")
+ ("\\\\'{e}" "é")
+ ("\\\\^{e}" "ê")
+ ("\\\\\"{\\\\i}" "ï")
+ ("\\\\`{\\\\i}" "ì")
+ ("\\\\'{\\\\i}" "í")
+ ("\\\\^{\\\\i}" "î")
+ ("\\\\\"{i}" "ï")
+ ("\\\\`{i}" "ì")
+ ("\\\\'{i}" "í")
+ ("\\\\^{i}" "î")
+ ("\\\\\"{o}" "ö")
+ ("\\\\`{o}" "ò")
+ ("\\\\'{o}" "ó")
+ ("\\\\~{o}" "õ")
+ ("\\\\^{o}" "ô")
+ ("\\\\\"{u}" "ü")
+ ("\\\\`{u}" "ù")
+ ("\\\\'{u}" "ú")
+ ("\\\\^{u}" "û")
+ ("\\\\\"{A}" "Ä")
+ ("\\\\`{A}" "À")
+ ("\\\\'{A}" "Ã")
+ ("\\\\~{A}" "Ã")
+ ("\\\\^{A}" "Â")
+ ("\\\\\"{E}" "Ë")
+ ("\\\\`{E}" "È")
+ ("\\\\'{E}" "É")
+ ("\\\\^{E}" "Ê")
+ ("\\\\\"{I}" "Ã")
+ ("\\\\`{I}" "Ì")
+ ("\\\\'{I}" "Ã")
+ ("\\\\^{I}" "ÃŽ")
+ ("\\\\\"{O}" "Ö")
+ ("\\\\`{O}" "Ã’")
+ ("\\\\'{O}" "Ó")
+ ("\\\\~{O}" "Õ")
+ ("\\\\^{O}" "Ô")
+ ("\\\\\"{U}" "Ü")
+ ("\\\\`{U}" "Ù")
+ ("\\\\'{U}" "Ú")
+ ("\\\\^{U}" "Û")
+ ("\\\\~{n}" "ñ")
+ ("\\\\~{N}" "Ñ")
+ ("\\\\c{c}" "ç")
+ ("\\\\c{C}" "Ç")
+ ("{\\\\ss}" "ß")
("{\\\\AE}" "\306")
("{\\\\ae}" "\346")
("{\\\\AA}" "\305")
("{\\\\aa}" "\345")
("{\\\\copyright}" "\251")
("\\\\copyright{}" "\251")
- ("{\\\\pounds}" "£" )
- ("{\\\\P}" "¶" )
- ("{\\\\S}" "§" )
- ("\\\\pounds{}" "£" )
- ("\\\\P{}" "¶" )
- ("\\\\S{}" "§" )
- ("?`" "¿")
- ("!`" "¡")
- ("{?`}" "¿")
- ("{!`}" "¡")
- ("\"a" "ä")
- ("\"A" "Ä")
- ("\"o" "ö")
- ("\"O" "Ö")
- ("\"u" "ü")
- ("\"U" "Ü")
- ("\"s" "ß")
- ("\\\\3" "ß")
+ ("{\\\\pounds}" "£" )
+ ("{\\\\P}" "¶" )
+ ("{\\\\S}" "§" )
+ ("\\\\pounds{}" "£" )
+ ("\\\\P{}" "¶" )
+ ("\\\\S{}" "§" )
+ ("?`" "¿")
+ ("!`" "¡")
+ ("{?`}" "¿")
+ ("{!`}" "¡")
+ ("\"a" "ä")
+ ("\"A" "Ä")
+ ("\"o" "ö")
+ ("\"O" "Ö")
+ ("\"u" "ü")
+ ("\"U" "Ü")
+ ("\"s" "ß")
+ ("\\\\3" "ß")
)
"Translation table for translating German TeX sequences to ISO 8859-1.
This table is not exhaustive (and due to TeX's power can never be).
@@ -583,65 +583,65 @@ It only contains commonly used sequences.")
(defvar iso-iso2gtex-trans-tab
'(
- ("ä" "\"a")
- ("à" "{\\\\`a}")
- ("á" "{\\\\'a}")
- ("ã" "{\\\\~a}")
- ("â" "{\\\\^a}")
- ("ë" "{\\\\\"e}")
- ("è" "{\\\\`e}")
- ("é" "{\\\\'e}")
- ("ê" "{\\\\^e}")
- ("ï" "{\\\\\"\\\\i}")
- ("ì" "{\\\\`\\\\i}")
- ("í" "{\\\\'\\\\i}")
- ("î" "{\\\\^\\\\i}")
- ("ö" "\"o")
- ("ò" "{\\\\`o}")
- ("ó" "{\\\\'o}")
- ("õ" "{\\\\~o}")
- ("ô" "{\\\\^o}")
- ("ü" "\"u")
- ("ù" "{\\\\`u}")
- ("ú" "{\\\\'u}")
- ("û" "{\\\\^u}")
- ("Ä" "\"A")
- ("À" "{\\\\`A}")
- ("Á" "{\\\\'A}")
- ("Ã" "{\\\\~A}")
- ("Â" "{\\\\^A}")
- ("Ë" "{\\\\\"E}")
- ("È" "{\\\\`E}")
- ("É" "{\\\\'E}")
- ("Ê" "{\\\\^E}")
- ("Ï" "{\\\\\"I}")
- ("Ì" "{\\\\`I}")
- ("Í" "{\\\\'I}")
- ("Î" "{\\\\^I}")
- ("Ö" "\"O")
- ("Ò" "{\\\\`O}")
- ("Ó" "{\\\\'O}")
- ("Õ" "{\\\\~O}")
- ("Ô" "{\\\\^O}")
- ("Ü" "\"U")
- ("Ù" "{\\\\`U}")
- ("Ú" "{\\\\'U}")
- ("Û" "{\\\\^U}")
- ("ñ" "{\\\\~n}")
- ("Ñ" "{\\\\~N}")
- ("ç" "{\\\\c c}")
- ("Ç" "{\\\\c C}")
- ("ß" "\"s")
+ ("ä" "\"a")
+ ("à" "{\\\\`a}")
+ ("á" "{\\\\'a}")
+ ("ã" "{\\\\~a}")
+ ("â" "{\\\\^a}")
+ ("ë" "{\\\\\"e}")
+ ("è" "{\\\\`e}")
+ ("é" "{\\\\'e}")
+ ("ê" "{\\\\^e}")
+ ("ï" "{\\\\\"\\\\i}")
+ ("ì" "{\\\\`\\\\i}")
+ ("í" "{\\\\'\\\\i}")
+ ("î" "{\\\\^\\\\i}")
+ ("ö" "\"o")
+ ("ò" "{\\\\`o}")
+ ("ó" "{\\\\'o}")
+ ("õ" "{\\\\~o}")
+ ("ô" "{\\\\^o}")
+ ("ü" "\"u")
+ ("ù" "{\\\\`u}")
+ ("ú" "{\\\\'u}")
+ ("û" "{\\\\^u}")
+ ("Ä" "\"A")
+ ("À" "{\\\\`A}")
+ ("Ã" "{\\\\'A}")
+ ("Ã" "{\\\\~A}")
+ ("Â" "{\\\\^A}")
+ ("Ë" "{\\\\\"E}")
+ ("È" "{\\\\`E}")
+ ("É" "{\\\\'E}")
+ ("Ê" "{\\\\^E}")
+ ("Ã" "{\\\\\"I}")
+ ("Ì" "{\\\\`I}")
+ ("Ã" "{\\\\'I}")
+ ("ÃŽ" "{\\\\^I}")
+ ("Ö" "\"O")
+ ("Ã’" "{\\\\`O}")
+ ("Ó" "{\\\\'O}")
+ ("Õ" "{\\\\~O}")
+ ("Ô" "{\\\\^O}")
+ ("Ü" "\"U")
+ ("Ù" "{\\\\`U}")
+ ("Ú" "{\\\\'U}")
+ ("Û" "{\\\\^U}")
+ ("ñ" "{\\\\~n}")
+ ("Ñ" "{\\\\~N}")
+ ("ç" "{\\\\c c}")
+ ("Ç" "{\\\\c C}")
+ ("ß" "\"s")
("\306" "{\\\\AE}")
("\346" "{\\\\ae}")
("\305" "{\\\\AA}")
("\345" "{\\\\aa}")
("\251" "{\\\\copyright}")
- ("£" "{\\\\pounds}")
- ("¶" "{\\\\P}")
- ("§" "{\\\\S}")
- ("¿" "{?`}")
- ("¡" "{!`}")
+ ("£" "{\\\\pounds}")
+ ("¶" "{\\\\P}")
+ ("§" "{\\\\S}")
+ ("¿" "{?`}")
+ ("¡" "{!`}")
)
"Translation table for translating ISO 8859-1 characters to German TeX.")
@@ -664,13 +664,13 @@ Optional arg BUFFER is ignored (for use in `format-alist')."
(iso-translate-conventions from to iso-iso2gtex-trans-tab))
(defvar iso-iso2duden-trans-tab
- '(("ä" "ae")
- ("Ä" "Ae")
- ("ö" "oe")
- ("Ö" "Oe")
- ("ü" "ue")
- ("Ü" "Ue")
- ("ß" "ss"))
+ '(("ä" "ae")
+ ("Ä" "Ae")
+ ("ö" "oe")
+ ("Ö" "Oe")
+ ("ü" "ue")
+ ("Ü" "Ue")
+ ("ß" "ss"))
"Translation table for translating ISO 8859-1 characters to Duden sequences.")
;;;###autoload
@@ -683,133 +683,133 @@ Optional arg BUFFER is ignored (for use in `format-alist')."
(iso-translate-conventions from to iso-iso2duden-trans-tab))
(defvar iso-iso2sgml-trans-tab
- '(("À" "&Agrave;")
- ("Á" "&Aacute;")
- ("Â" "&Acirc;")
- ("Ã" "&Atilde;")
- ("Ä" "&Auml;")
- ("Å" "&Aring;")
- ("Æ" "&AElig;")
- ("Ç" "&Ccedil;")
- ("È" "&Egrave;")
- ("É" "&Eacute;")
- ("Ê" "&Ecirc;")
- ("Ë" "&Euml;")
- ("Ì" "&Igrave;")
- ("Í" "&Iacute;")
- ("Î" "&Icirc;")
- ("Ï" "&Iuml;")
- ("Ð" "&ETH;")
- ("Ñ" "&Ntilde;")
- ("Ò" "&Ograve;")
- ("Ó" "&Oacute;")
- ("Ô" "&Ocirc;")
- ("Õ" "&Otilde;")
- ("Ö" "&Ouml;")
- ("Ø" "&Oslash;")
- ("Ù" "&Ugrave;")
- ("Ú" "&Uacute;")
- ("Û" "&Ucirc;")
- ("Ü" "&Uuml;")
- ("Ý" "&Yacute;")
- ("Þ" "&THORN;")
- ("ß" "&szlig;")
- ("à" "&agrave;")
- ("á" "&aacute;")
- ("â" "&acirc;")
- ("ã" "&atilde;")
- ("ä" "&auml;")
- ("å" "&aring;")
- ("æ" "&aelig;")
- ("ç" "&ccedil;")
- ("è" "&egrave;")
- ("é" "&eacute;")
- ("ê" "&ecirc;")
- ("ë" "&euml;")
- ("ì" "&igrave;")
- ("í" "&iacute;")
- ("î" "&icirc;")
- ("ï" "&iuml;")
- ("ð" "&eth;")
- ("ñ" "&ntilde;")
- ("ò" "&ograve;")
- ("ó" "&oacute;")
- ("ô" "&ocirc;")
- ("õ" "&otilde;")
- ("ö" "&ouml;")
- ("ø" "&oslash;")
- ("ù" "&ugrave;")
- ("ú" "&uacute;")
- ("û" "&ucirc;")
- ("ü" "&uuml;")
- ("ý" "&yacute;")
- ("þ" "&thorn;")
- ("ÿ" "&yuml;")))
+ '(("À" "&Agrave;")
+ ("Ã" "&Aacute;")
+ ("Â" "&Acirc;")
+ ("Ã" "&Atilde;")
+ ("Ä" "&Auml;")
+ ("Ã…" "&Aring;")
+ ("Æ" "&AElig;")
+ ("Ç" "&Ccedil;")
+ ("È" "&Egrave;")
+ ("É" "&Eacute;")
+ ("Ê" "&Ecirc;")
+ ("Ë" "&Euml;")
+ ("Ì" "&Igrave;")
+ ("Ã" "&Iacute;")
+ ("ÃŽ" "&Icirc;")
+ ("Ã" "&Iuml;")
+ ("Ã" "&ETH;")
+ ("Ñ" "&Ntilde;")
+ ("Ã’" "&Ograve;")
+ ("Ó" "&Oacute;")
+ ("Ô" "&Ocirc;")
+ ("Õ" "&Otilde;")
+ ("Ö" "&Ouml;")
+ ("Ø" "&Oslash;")
+ ("Ù" "&Ugrave;")
+ ("Ú" "&Uacute;")
+ ("Û" "&Ucirc;")
+ ("Ü" "&Uuml;")
+ ("Ã" "&Yacute;")
+ ("Þ" "&THORN;")
+ ("ß" "&szlig;")
+ ("à" "&agrave;")
+ ("á" "&aacute;")
+ ("â" "&acirc;")
+ ("ã" "&atilde;")
+ ("ä" "&auml;")
+ ("Ã¥" "&aring;")
+ ("æ" "&aelig;")
+ ("ç" "&ccedil;")
+ ("è" "&egrave;")
+ ("é" "&eacute;")
+ ("ê" "&ecirc;")
+ ("ë" "&euml;")
+ ("ì" "&igrave;")
+ ("í" "&iacute;")
+ ("î" "&icirc;")
+ ("ï" "&iuml;")
+ ("ð" "&eth;")
+ ("ñ" "&ntilde;")
+ ("ò" "&ograve;")
+ ("ó" "&oacute;")
+ ("ô" "&ocirc;")
+ ("õ" "&otilde;")
+ ("ö" "&ouml;")
+ ("ø" "&oslash;")
+ ("ù" "&ugrave;")
+ ("ú" "&uacute;")
+ ("û" "&ucirc;")
+ ("ü" "&uuml;")
+ ("ý" "&yacute;")
+ ("þ" "&thorn;")
+ ("ÿ" "&yuml;")))
(defvar iso-sgml2iso-trans-tab
- '(("&Agrave;" "À")
- ("&Aacute;" "Á")
- ("&Acirc;" "Â")
- ("&Atilde;" "Ã")
- ("&Auml;" "Ä")
- ("&Aring;" "Å")
- ("&AElig;" "Æ")
- ("&Ccedil;" "Ç")
- ("&Egrave;" "È")
- ("&Eacute;" "É")
- ("&Ecirc;" "Ê")
- ("&Euml;" "Ë")
- ("&Igrave;" "Ì")
- ("&Iacute;" "Í")
- ("&Icirc;" "Î")
- ("&Iuml;" "Ï")
- ("&ETH;" "Ð")
- ("&Ntilde;" "Ñ")
- ("&Ograve;" "Ò")
- ("&Oacute;" "Ó")
- ("&Ocirc;" "Ô")
- ("&Otilde;" "Õ")
- ("&Ouml;" "Ö")
- ("&Oslash;" "Ø")
- ("&Ugrave;" "Ù")
- ("&Uacute;" "Ú")
- ("&Ucirc;" "Û")
- ("&Uuml;" "Ü")
- ("&Yacute;" "Ý")
- ("&THORN;" "Þ")
- ("&szlig;" "ß")
- ("&agrave;" "à")
- ("&aacute;" "á")
- ("&acirc;" "â")
- ("&atilde;" "ã")
- ("&auml;" "ä")
- ("&aring;" "å")
- ("&aelig;" "æ")
- ("&ccedil;" "ç")
- ("&egrave;" "è")
- ("&eacute;" "é")
- ("&ecirc;" "ê")
- ("&euml;" "ë")
- ("&igrave;" "ì")
- ("&iacute;" "í")
- ("&icirc;" "î")
- ("&iuml;" "ï")
- ("&eth;" "ð")
- ("&ntilde;" "ñ")
- ("&nbsp;" " ")
- ("&ograve;" "ò")
- ("&oacute;" "ó")
- ("&ocirc;" "ô")
- ("&otilde;" "õ")
- ("&ouml;" "ö")
- ("&oslash;" "ø")
- ("&ugrave;" "ù")
- ("&uacute;" "ú")
- ("&ucirc;" "û")
- ("&uuml;" "ü")
- ("&yacute;" "ý")
- ("&thorn;" "þ")
- ("&yuml;" "ÿ")))
+ '(("&Agrave;" "À")
+ ("&Aacute;" "Ã")
+ ("&Acirc;" "Â")
+ ("&Atilde;" "Ã")
+ ("&Auml;" "Ä")
+ ("&Aring;" "Ã…")
+ ("&AElig;" "Æ")
+ ("&Ccedil;" "Ç")
+ ("&Egrave;" "È")
+ ("&Eacute;" "É")
+ ("&Ecirc;" "Ê")
+ ("&Euml;" "Ë")
+ ("&Igrave;" "Ì")
+ ("&Iacute;" "Ã")
+ ("&Icirc;" "ÃŽ")
+ ("&Iuml;" "Ã")
+ ("&ETH;" "Ã")
+ ("&Ntilde;" "Ñ")
+ ("&Ograve;" "Ã’")
+ ("&Oacute;" "Ó")
+ ("&Ocirc;" "Ô")
+ ("&Otilde;" "Õ")
+ ("&Ouml;" "Ö")
+ ("&Oslash;" "Ø")
+ ("&Ugrave;" "Ù")
+ ("&Uacute;" "Ú")
+ ("&Ucirc;" "Û")
+ ("&Uuml;" "Ü")
+ ("&Yacute;" "Ã")
+ ("&THORN;" "Þ")
+ ("&szlig;" "ß")
+ ("&agrave;" "à")
+ ("&aacute;" "á")
+ ("&acirc;" "â")
+ ("&atilde;" "ã")
+ ("&auml;" "ä")
+ ("&aring;" "Ã¥")
+ ("&aelig;" "æ")
+ ("&ccedil;" "ç")
+ ("&egrave;" "è")
+ ("&eacute;" "é")
+ ("&ecirc;" "ê")
+ ("&euml;" "ë")
+ ("&igrave;" "ì")
+ ("&iacute;" "í")
+ ("&icirc;" "î")
+ ("&iuml;" "ï")
+ ("&eth;" "ð")
+ ("&ntilde;" "ñ")
+ ("&nbsp;" " ")
+ ("&ograve;" "ò")
+ ("&oacute;" "ó")
+ ("&ocirc;" "ô")
+ ("&otilde;" "õ")
+ ("&ouml;" "ö")
+ ("&oslash;" "ø")
+ ("&ugrave;" "ù")
+ ("&uacute;" "ú")
+ ("&ucirc;" "û")
+ ("&uuml;" "ü")
+ ("&yacute;" "ý")
+ ("&thorn;" "þ")
+ ("&yuml;" "ÿ")))
;;;###autoload
(defun iso-iso2sgml (from to &optional buffer)
diff --git a/lisp/international/iso-transl.el b/lisp/international/iso-transl.el
index 4bc0400ef23..4bbb89c7087 100644
--- a/lisp/international/iso-transl.el
+++ b/lisp/international/iso-transl.el
@@ -1,4 +1,4 @@
-;;; iso-transl.el --- keyboard input definitions for ISO 8859-1 -*- coding: iso-8859-1 -*-
+;;; iso-transl.el --- keyboard input definitions for ISO 8859-1 -*- coding: utf-8 -*-
;; Copyright (C) 1987, 1993-1999, 2001-2013 Free Software Foundation,
;; Inc.
@@ -73,125 +73,125 @@
;; language-specific table might override the short form for its own use.
(defvar iso-transl-char-map
- '(("* " . [? ])
- (" " . [? ])
- ("*!" . [?¡])
- ("!" . [?¡])
- ("\"\"" . [?¨])
- ("\"A" . [?Ä])
- ("\"E" . [?Ë])
- ("\"I" . [?Ï])
- ("\"O" . [?Ö])
- ("\"U" . [?Ü])
- ("\"a" . [?ä])
- ("\"e" . [?ë])
- ("\"i" . [?ï])
- ("\"o" . [?ö])
- ("\"s" . [?ß])
- ("\"u" . [?ü])
- ("\"y" . [?ÿ])
- ("''" . [?´])
- ("'A" . [?Á])
- ("'E" . [?É])
- ("'I" . [?Í])
- ("'O" . [?Ó])
- ("'U" . [?Ú])
- ("'Y" . [?Ý])
- ("'a" . [?á])
- ("'e" . [?é])
- ("'i" . [?í])
- ("'o" . [?ó])
- ("'u" . [?ú])
- ("'y" . [?ý])
- ("*$" . [?¤])
- ("$" . [?¤])
- ("*+" . [?±])
- ("+" . [?±])
- (",," . [?¸])
- (",C" . [?Ç])
- (",c" . [?ç])
- ("*-" . [?­])
- ("-" . [?­])
- ("*." . [?·])
- ("." . [?·])
- ("//" . [?÷])
- ("/A" . [?Å])
- ("/E" . [?Æ])
- ("/O" . [?Ø])
- ("/a" . [?å])
- ("/e" . [?æ])
- ("/o" . [?ø])
- ("1/2" . [?½])
- ("1/4" . [?¼])
- ("3/4" . [?¾])
- ("*<" . [?«])
- ("<" . [?«])
- ("*=" . [?¯])
- ("=" . [?¯])
- ("*>" . [?»])
- (">" . [?»])
- ("*?" . [?¿])
- ("?" . [?¿])
- ("*C" . [?©])
- ("C" . [?©])
- ("*L" . [?£])
- ("L" . [?£])
- ("*P" . [?¶])
- ("P" . [?¶])
- ("*R" . [?®])
- ("R" . [?®])
- ("*S" . [?§])
- ("S" . [?§])
- ("*Y" . [?¥])
- ("Y" . [?¥])
- ("^1" . [?¹])
- ("^2" . [?²])
- ("^3" . [?³])
- ("^A" . [?Â])
- ("^E" . [?Ê])
- ("^I" . [?Î])
- ("^O" . [?Ô])
- ("^U" . [?Û])
- ("^a" . [?â])
- ("^e" . [?ê])
- ("^i" . [?î])
- ("^o" . [?ô])
- ("^u" . [?û])
- ("_a" . [?ª])
- ("_o" . [?º])
- ("`A" . [?À])
- ("`E" . [?È])
- ("`I" . [?Ì])
- ("`O" . [?Ò])
- ("`U" . [?Ù])
- ("`a" . [?à])
- ("`e" . [?è])
- ("`i" . [?ì])
- ("`o" . [?ò])
- ("`u" . [?ù])
- ("*c" . [?¢])
- ("c" . [?¢])
- ("*o" . [?°])
- ("o" . [?°])
- ("*u" . [?µ])
- ("u" . [?µ])
- ("*m" . [?µ])
- ("m" . [?µ])
- ("*x" . [?×])
- ("x" . [?×])
- ("*|" . [?¦])
- ("|" . [?¦])
- ("~A" . [?Ã])
- ("~D" . [?Ð])
- ("~N" . [?Ñ])
- ("~O" . [?Õ])
- ("~T" . [?Þ])
- ("~a" . [?ã])
- ("~d" . [?ð])
- ("~n" . [?ñ])
- ("~o" . [?õ])
- ("~t" . [?þ])
- ("~~" . [?¬])
+ '(("* " . [? ])
+ (" " . [? ])
+ ("*!" . [?¡])
+ ("!" . [?¡])
+ ("\"\"" . [?¨])
+ ("\"A" . [?Ä])
+ ("\"E" . [?Ë])
+ ("\"I" . [?Ã])
+ ("\"O" . [?Ö])
+ ("\"U" . [?Ü])
+ ("\"a" . [?ä])
+ ("\"e" . [?ë])
+ ("\"i" . [?ï])
+ ("\"o" . [?ö])
+ ("\"s" . [?ß])
+ ("\"u" . [?ü])
+ ("\"y" . [?ÿ])
+ ("''" . [?´])
+ ("'A" . [?Ã])
+ ("'E" . [?É])
+ ("'I" . [?Ã])
+ ("'O" . [?Ó])
+ ("'U" . [?Ú])
+ ("'Y" . [?Ã])
+ ("'a" . [?á])
+ ("'e" . [?é])
+ ("'i" . [?í])
+ ("'o" . [?ó])
+ ("'u" . [?ú])
+ ("'y" . [?ý])
+ ("*$" . [?¤])
+ ("$" . [?¤])
+ ("*+" . [?±])
+ ("+" . [?±])
+ (",," . [?¸])
+ (",C" . [?Ç])
+ (",c" . [?ç])
+ ("*-" . [?­])
+ ("-" . [?­])
+ ("*." . [?·])
+ ("." . [?·])
+ ("//" . [?÷])
+ ("/A" . [?Ã…])
+ ("/E" . [?Æ])
+ ("/O" . [?Ø])
+ ("/a" . [?Ã¥])
+ ("/e" . [?æ])
+ ("/o" . [?ø])
+ ("1/2" . [?½])
+ ("1/4" . [?¼])
+ ("3/4" . [?¾])
+ ("*<" . [?«])
+ ("<" . [?«])
+ ("*=" . [?¯])
+ ("=" . [?¯])
+ ("*>" . [?»])
+ (">" . [?»])
+ ("*?" . [?¿])
+ ("?" . [?¿])
+ ("*C" . [?©])
+ ("C" . [?©])
+ ("*L" . [?£])
+ ("L" . [?£])
+ ("*P" . [?¶])
+ ("P" . [?¶])
+ ("*R" . [?®])
+ ("R" . [?®])
+ ("*S" . [?§])
+ ("S" . [?§])
+ ("*Y" . [?Â¥])
+ ("Y" . [?Â¥])
+ ("^1" . [?¹])
+ ("^2" . [?²])
+ ("^3" . [?³])
+ ("^A" . [?Â])
+ ("^E" . [?Ê])
+ ("^I" . [?ÃŽ])
+ ("^O" . [?Ô])
+ ("^U" . [?Û])
+ ("^a" . [?â])
+ ("^e" . [?ê])
+ ("^i" . [?î])
+ ("^o" . [?ô])
+ ("^u" . [?û])
+ ("_a" . [?ª])
+ ("_o" . [?º])
+ ("`A" . [?À])
+ ("`E" . [?È])
+ ("`I" . [?Ì])
+ ("`O" . [?Ã’])
+ ("`U" . [?Ù])
+ ("`a" . [?à])
+ ("`e" . [?è])
+ ("`i" . [?ì])
+ ("`o" . [?ò])
+ ("`u" . [?ù])
+ ("*c" . [?¢])
+ ("c" . [?¢])
+ ("*o" . [?°])
+ ("o" . [?°])
+ ("*u" . [?µ])
+ ("u" . [?µ])
+ ("*m" . [?µ])
+ ("m" . [?µ])
+ ("*x" . [?×])
+ ("x" . [?×])
+ ("*|" . [?¦])
+ ("|" . [?¦])
+ ("~A" . [?Ã])
+ ("~D" . [?Ã])
+ ("~N" . [?Ñ])
+ ("~O" . [?Õ])
+ ("~T" . [?Þ])
+ ("~a" . [?ã])
+ ("~d" . [?ð])
+ ("~n" . [?ñ])
+ ("~o" . [?õ])
+ ("~t" . [?þ])
+ ("~~" . [?¬])
("' " . "'")
("` " . "`")
("\" " . "\"")
@@ -205,37 +205,37 @@ sequence VECTOR. (VECTOR is normally one character long.)")
;; Language-specific translation lists.
(defvar iso-transl-language-alist
'(("Esperanto"
- ("C" . [?Æ])
- ("G" . [?Ø])
- ("H" . [?¦])
- ("J" . [?¬])
- ("S" . [?Þ])
- ("U" . [?Ý])
- ("c" . [?æ])
- ("g" . [?ø])
- ("h" . [?¶])
- ("j" . [?¼])
- ("s" . [?þ])
- ("u" . [?ý]))
+ ("C" . [?Æ])
+ ("G" . [?Ø])
+ ("H" . [?¦])
+ ("J" . [?¬])
+ ("S" . [?Þ])
+ ("U" . [?Ã])
+ ("c" . [?æ])
+ ("g" . [?ø])
+ ("h" . [?¶])
+ ("j" . [?¼])
+ ("s" . [?þ])
+ ("u" . [?ý]))
("French"
- ("C" . [?Ç])
- ("c" . [?ç]))
+ ("C" . [?Ç])
+ ("c" . [?ç]))
("German"
- ("A" . [?Ä])
- ("O" . [?Ö])
- ("U" . [?Ü])
- ("a" . [?ä])
- ("o" . [?ö])
- ("s" . [?ß])
- ("u" . [?ü]))
+ ("A" . [?Ä])
+ ("O" . [?Ö])
+ ("U" . [?Ü])
+ ("a" . [?ä])
+ ("o" . [?ö])
+ ("s" . [?ß])
+ ("u" . [?ü]))
("Portuguese"
- ("C" . [?Ç])
- ("c" . [?ç]))
+ ("C" . [?Ç])
+ ("c" . [?ç]))
("Spanish"
- ("!" . [?¡])
- ("?" . [?¿])
- ("N" . [?Ñ])
- ("n" . [?ñ]))))
+ ("!" . [?¡])
+ ("?" . [?¿])
+ ("N" . [?Ñ])
+ ("n" . [?ñ]))))
(defvar iso-transl-ctl-x-8-map nil
"Keymap for C-x 8 prefix.")
diff --git a/lisp/international/ja-dic-cnv.el b/lisp/international/ja-dic-cnv.el
index c0fcf19d841..41a31004194 100644
--- a/lisp/international/ja-dic-cnv.el
+++ b/lisp/international/ja-dic-cnv.el
@@ -279,9 +279,9 @@
skkdic-okuri-nasi-entries-count
(1+ skkdic-okuri-nasi-entries-count))
(setq ratio (floor (/ (* (point) 100.0) (point-max))))
- (if (/= ratio prev-ratio)
+ (if (/= (/ prev-ratio 10) (/ ratio 10))
(progn
- (message "collected %2d%% %s ..." ratio kana)
+ (message "collected %2d%% ..." ratio)
(setq prev-ratio ratio)))
(while candidates
(let ((entry (lookup-nested-alist (car candidates)
@@ -304,12 +304,12 @@
(while l
(let ((kana (car (car l)))
(candidates (cdr (car l))))
- (setq ratio (/ (* count 1000) skkdic-okuri-nasi-entries-count)
+ (setq ratio (/ (* count 100) skkdic-okuri-nasi-entries-count)
count (1+ count))
- (if (/= prev-ratio (/ ratio 10))
+ (if (/= (/ prev-ratio 10) (/ ratio 10))
(progn
- (message "processed %2d%% %s ..." (/ ratio 10) kana)
- (setq prev-ratio (/ ratio 10))))
+ (message "processed %2d%% ..." ratio)
+ (setq prev-ratio ratio)))
(if (setq candidates
(skkdic-reduced-candidates skkbuf kana candidates))
(progn
@@ -330,16 +330,21 @@ The name of generated file is specified by the variable `ja-dic-filename'."
(interactive "FSKK dictionary file: ")
(message "Reading file \"%s\" ..." filename)
(let* ((coding-system-for-read 'euc-japan)
- (skkbuf(find-file-noselect (expand-file-name filename)))
+ (skkbuf (get-buffer-create " *skkdic-unannotated*"))
(buf (get-buffer-create "*skkdic-work*")))
+ ;; Set skkbuf to an unannotated copy of the dictionary.
+ (with-current-buffer skkbuf
+ (insert-file-contents (expand-file-name filename))
+ (re-search-forward "^[^;]")
+ (while (re-search-forward ";[^\n/]*/" nil t)
+ (replace-match "/")))
;; Setup and generate the header part of working buffer.
(with-current-buffer buf
(erase-buffer)
(buffer-disable-undo)
(insert ";;; ja-dic.el --- dictionary for Japanese input method"
- " -*-coding: euc-japan; -*-\n"
+ " -*-coding: utf-8; -*-\n"
";;\tGenerated by the command `skkdic-convert'\n"
- ";;\tDate: " (current-time-string) "\n"
";;\tOriginal SKK dictionary file: "
(file-relative-name (expand-file-name filename) dirname)
"\n\n"
@@ -348,7 +353,6 @@ The name of generated file is specified by the variable `ja-dic-filename'."
";; Do byte-compile this file again after any modification.\n\n"
";;; Start of the header of the original SKK dictionary.\n\n")
(set-buffer skkbuf)
- (widen)
(goto-char 1)
(let (pos)
(search-forward ";; okuri-ari")
@@ -399,7 +403,7 @@ The name of generated file is specified by the variable `ja-dic-filename'."
;; Save the working buffer.
(set-buffer buf)
(set-visited-file-name (expand-file-name ja-dic-filename dirname) t)
- (set-buffer-file-coding-system 'euc-japan)
+ (set-buffer-file-coding-system 'utf-8)
(save-buffer 0))
(kill-buffer skkbuf)
(switch-to-buffer buf)))
@@ -429,12 +433,7 @@ To get complete usage, invoke:
(setq targetdir (expand-file-name (car command-line-args-left)))
(setq command-line-args-left (cdr command-line-args-left))))
(setq filename (expand-file-name (car command-line-args-left)))
- (message "Converting %s to %s ..." filename ja-dic-filename)
- (message "It takes around 10 minutes even on Sun SS20.")
- (skkdic-convert filename targetdir)
- (message "Do byte-compile the created file by:")
- (message " %% emacs -batch -f batch-byte-compile %s" ja-dic-filename)
- ))
+ (skkdic-convert filename targetdir)))
(kill-emacs 0))
diff --git a/lisp/international/kkc.el b/lisp/international/kkc.el
index 03576442ed8..a7d3ac5d017 100644
--- a/lisp/international/kkc.el
+++ b/lisp/international/kkc.el
@@ -40,7 +40,7 @@
"String denoting KKC input method.
This string is shown at mode line when users are in KKC mode.")
-(defvar kkc-init-file-name (convert-standard-filename "~/.kkcrc")
+(defvar kkc-init-file-name (locate-user-emacs-file "kkcrc" ".kkcrc")
"Name of a file which contains user's initial setup code for KKC.")
;; A flag to control a file specified by `kkc-init-file-name'.
diff --git a/lisp/international/latexenc.el b/lisp/international/latexenc.el
index 8d0ce529bcf..8ab0c93e37c 100644
--- a/lisp/international/latexenc.el
+++ b/lisp/international/latexenc.el
@@ -1,8 +1,8 @@
-;;; latexenc.el --- guess correct coding system in LaTeX files -*-coding: iso-2022-7bit -*-
+;;; latexenc.el --- guess correct coding system in LaTeX files -*-coding: utf-8 -*-
;; Copyright (C) 2005-2013 Free Software Foundation, Inc.
-;; Author: Arne J,Ax(Brgensen <arne@arnested.dk>
+;; Author: Arne Jørgensen <arne@arnested.dk>
;; Keywords: mule, coding system, latex
;; This file is part of GNU Emacs.
diff --git a/lisp/international/latin1-disp.el b/lisp/international/latin1-disp.el
index 2099da00404..2eadd8f8eb5 100644
--- a/lisp/international/latin1-disp.el
+++ b/lisp/international/latin1-disp.el
@@ -1,4 +1,4 @@
-;;; latin1-disp.el --- display tables for other ISO 8859 on Latin-1 terminals -*-coding: iso-2022-7bit;-*-
+;;; latin1-disp.el --- display tables for other ISO 8859 on Latin-1 terminals -*-coding: utf-8;-*-
;; Copyright (C) 2000-2013 Free Software Foundation, Inc.
@@ -107,18 +107,18 @@ display for all of `latin1-display-sets'. See also
(mapc
(lambda (l)
(apply 'latin1-display-char l))
- '((?\$,1rz(B ",") ;; SINGLE LOW-9 QUOTATION MARK
- (?\$,1r~(B ",,") ;; DOUBLE LOW-9 QUOTATION MARK
- (?\$,1s&(B "...") ;; HORIZONTAL ELLIPSIS
- (?\$,1s0(B "o/oo") ;; PER MILLE SIGN
- (?\$,1s9(B "<") ;; SINGLE LEFT-POINTING ANGLE QUOTATION MARK
- (?\$,1r|(B "``") ;; LEFT DOUBLE QUOTATION MARK
- (?\$,1r}(B "''") ;; RIGHT DOUBLE QUOTATION MARK
- (?\$,1rs(B "-") ;; EN DASH
- (?\$,1rt(B "--") ;; EM DASH
- (?\$,1ub(B "TM") ;; TRADE MARK SIGN
- (?\$,1s:(B ">") ;; SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
- (?$,1s"(B ",A7(B")
+ '((?\‚ ",") ;; SINGLE LOW-9 QUOTATION MARK
+ (?\„ ",,") ;; DOUBLE LOW-9 QUOTATION MARK
+ (?\… "...") ;; HORIZONTAL ELLIPSIS
+ (?\‰ "o/oo") ;; PER MILLE SIGN
+ (?\‹ "<") ;; SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ (?\“ "``") ;; LEFT DOUBLE QUOTATION MARK
+ (?\†"''") ;; RIGHT DOUBLE QUOTATION MARK
+ (?\– "-") ;; EN DASH
+ (?\— "--") ;; EM DASH
+ (?\â„¢ "TM") ;; TRADE MARK SIGN
+ (?\› ">") ;; SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ (?• "·")
)))
(setq latin1-display t))
(mapc #'latin1-display-reset latin1-display-sets)
@@ -217,66 +217,66 @@ is. If FORCE is non-nil, set up the display regardless."
(lambda (l)
(or (char-displayable-p (car l))
(apply 'latin1-display-char l)))
- '((?,BF(B "'C" "C'")
- (?,BP(B "'D" "/D")
- (?,B&(B "'S" "S'")
- (?,Bf(B "'c" "c'")
- (?,Bp(B "'d" "/d")
- (?,BE(B "'L" "L'")
- (?,Bq(B "'n" "n'")
- (?,BQ(B "'N" "N'")
- (?,B`(B "'r" "r'")
- (?,B@(B "'R" "R'")
- (?,B6(B "'s" "s'")
- (?,B<(B "'z" "z'")
- (?,B,(B "'Z" "Z'")
- (?,B!(B "`A" "A;")
- (?,BJ(B "`E" "E;")
- (?,B#(B "`L" "/L")
- (?,B*(B "`S" ",S")
- (?,B^(B "`T" ",T")
- (?,B/(B "`Z" "Z^.")
- (?,B1(B "`a" "a;")
- (?,B3(B "`l" "/l")
- (?,Bj(B "`e" "e;")
- (?,B:(B "`s" ",s")
- (?,B~(B "`t" ",t")
- (?,B?(B "`z" "z^.")
- (?,B(B "`." "'.")
- (?,BC(B "~A" "A(")
- (?,BH(B "~C" "C<")
- (?,BO(B "~D" "D<")
- (?,BL(B "~E" "E<")
- (?,Bl(B "~e" "e<")
- (?,B%(B "~L" "L<")
- (?,BR(B "~N" "N<")
- (?,BU(B "~O" "O''")
- (?,BX(B "~R" "R<")
- (?,B)(B "~S" "S<")
- (?,B+(B "~T" "T<")
- (?,B[(B "~U" "U''")
- (?,B.(B "~Z" "Z<")
- (?,Bc(B "~a" "a(}")
- (?,Bh(B "~c" "c<")
- (?,Bo(B "~d" "d<")
- (?,B5(B "~l" "l<")
- (?,Br(B "~n" "n<")
- (?,Bu(B "~o" "o''")
- (?,Bx(B "~r" "r<")
- (?,B9(B "~s" "s<")
- (?,B;(B "~t" "t<")
- (?,B{(B "~u" "u''")
- (?,B>(B "~z" "z<")
- (?,B7(B "~v" "'<") ; ?,B"(B in latin-pre
- (?,B"(B "~~" "'(")
- (?,By(B "uu" "u^0")
- (?,BY(B "UU" "U^0")
- (?,BD(B "\"A")
- (?,Bd(B "\"a")
- (?,BK(B "\"E" "E:")
- (?,Bk(B "\"e")
- (?,B=(B "''" "'")
- (?,B7(B "'<") ; Lynx's rendering of caron
+ '((?Ć "'C" "C'")
+ (?Ä "'D" "/D")
+ (?Åš "'S" "S'")
+ (?ć "'c" "c'")
+ (?Ä‘ "'d" "/d")
+ (?Ĺ "'L" "L'")
+ (?Å„ "'n" "n'")
+ (?Ń "'N" "N'")
+ (?Å• "'r" "r'")
+ (?Å” "'R" "R'")
+ (?Å› "'s" "s'")
+ (?ź "'z" "z'")
+ (?Ź "'Z" "Z'")
+ (?Ä„ "`A" "A;")
+ (?Ę "`E" "E;")
+ (?Å "`L" "/L")
+ (?Åž "`S" ",S")
+ (?Å¢ "`T" ",T")
+ (?Å» "`Z" "Z^.")
+ (?Ä… "`a" "a;")
+ (?Å‚ "`l" "/l")
+ (?Ä™ "`e" "e;")
+ (?ÅŸ "`s" ",s")
+ (?Å£ "`t" ",t")
+ (?ż "`z" "z^.")
+ (?Ë™ "`." "'.")
+ (?Ä‚ "~A" "A(")
+ (?Č "~C" "C<")
+ (?ÄŽ "~D" "D<")
+ (?Äš "~E" "E<")
+ (?Ä› "~e" "e<")
+ (?Ľ "~L" "L<")
+ (?Ň "~N" "N<")
+ (?Å "~O" "O''")
+ (?Ř "~R" "R<")
+ (?Å  "~S" "S<")
+ (?Ť "~T" "T<")
+ (?Ű "~U" "U''")
+ (?Ž "~Z" "Z<")
+ (?ă "~a" "a(}")
+ (?Ä "~c" "c<")
+ (?Ä "~d" "d<")
+ (?ľ "~l" "l<")
+ (?ň "~n" "n<")
+ (?Å‘ "~o" "o''")
+ (?Å™ "~r" "r<")
+ (?Å¡ "~s" "s<")
+ (?Å¥ "~t" "t<")
+ (?ű "~u" "u''")
+ (?ž "~z" "z<")
+ (?ˇ "~v" "'<") ; ?˘ in latin-pre
+ (?˘ "~~" "'(")
+ (?ů "uu" "u^0")
+ (?Å® "UU" "U^0")
+ (?Ä "\"A")
+ (?ä "\"a")
+ (?Ë "\"E" "E:")
+ (?ë "\"e")
+ (?Ë "''" "'")
+ (?ˇ "'<") ; Lynx's rendering of caron
)))
((eq set 'latin-3)
@@ -285,34 +285,34 @@ is. If FORCE is non-nil, set up the display regardless."
(lambda (l)
(or (char-displayable-p (car l))
(apply 'latin1-display-char l)))
- '((?,C!(B "/H")
- (?,C"(B "~`" "'(")
- (?,C&(B "^H" "H^")
- (?,C6(B "^h" "h^")
- (?,C)(B ".I" "I^.")
- (?,C*(B ",S")
- (?,C+(B "~G" "G(")
- (?,C,(B "^J" "J^")
- (?,C/(B ".Z" "Z^.")
- (?,C1(B "/h")
- (?,C9(B ".i" "i^.")
- (?,C:(B ",s")
- (?,C;(B "~g" "g(")
- (?,C<(B "^j" "j^")
- (?,C?(B ".Z" "z^.")
- (?,CE(B ".c" "C^.")
- (?,CF(B "^C" "C^")
- (?,CU(B ".G" "G^.")
- (?,CX(B "^G" "G^")
- (?,C](B "~U" "U(")
- (?,C^(B "^S" "S^")
- (?,Ce(B ".C" "c^.")
- (?,Cf(B "^c" "c^")
- (?,Cu(B ".g" "g^.")
- (?,Cx(B "^g" "g^")
- (?,C}(B "~u" "u(")
- (?,C~(B "^s" "s^")
- (?,C(B "/." "^."))))
+ '((?Ħ "/H")
+ (?˘ "~`" "'(")
+ (?Ĥ "^H" "H^")
+ (?Ä¥ "^h" "h^")
+ (?İ ".I" "I^.")
+ (?Åž ",S")
+ (?Äž "~G" "G(")
+ (?Ä´ "^J" "J^")
+ (?Å» ".Z" "Z^.")
+ (?ħ "/h")
+ (?ı ".i" "i^.")
+ (?ÅŸ ",s")
+ (?ÄŸ "~g" "g(")
+ (?ĵ "^j" "j^")
+ (?ż ".Z" "z^.")
+ (?ÄŠ ".c" "C^.")
+ (?Ĉ "^C" "C^")
+ (?Ä  ".G" "G^.")
+ (?Ĝ "^G" "G^")
+ (?Ŭ "~U" "U(")
+ (?Ŝ "^S" "S^")
+ (?Ä‹ ".C" "c^.")
+ (?ĉ "^c" "c^")
+ (?Ä¡ ".g" "g^.")
+ (?Ä "^g" "g^")
+ (?Å­ "~u" "u(")
+ (?Å "^s" "s^")
+ (?Ë™ "/." "^."))))
((eq set 'latin-4)
(latin1-display-identities set)
@@ -320,55 +320,55 @@ is. If FORCE is non-nil, set up the display regardless."
(lambda (l)
(or (char-displayable-p (car l))
(apply 'latin1-display-char l)))
- '((?,D!(B "A," "A;")
- (?,D"(B "k/" "kk")
- (?,D#(B "R," ",R")
- (?,D%(B "I~" "?I")
- (?,D&(B "L," ",L")
- (?,D)(B "S~" "S<")
- (?,D*(B "E-")
- (?,D+(B "G," ",G")
- (?,D,(B "T/" "/T")
- (?,D.(B "Z~" "Z<")
- (?,D1(B "a," "a;")
- (?,D2(B "';")
- (?,D3(B "r," ",r")
- (?,D5(B "i~" "~i")
- (?,D6(B "l," ",l")
- (?,D7(B "'<")
- (?,D9(B "s~" "s<")
- (?,D:(B "e-")
- (?,D;(B "g," ",g")
- (?,D<(B "t/" "/t")
- (?,D=(B "N/" "NG")
- (?,D>(B "z~" "z<")
- (?,D?(B "n/" "ng")
- (?,D@(B "A-")
- (?,DG(B "I," "I;")
- (?,DH(B "C~" "C<")
- (?,DJ(B "E," "E;")
- (?,DL(B "E." "E^.")
- (?,DO(B "I-")
- (?,DQ(B "N," ",N")
- (?,DR(B "O-")
- (?,DS(B "K," ",K")
- (?,DY(B "U," "U;")
- (?,D](B "U~" "~U")
- (?,D^(B "U-")
- (?,D`(B "a-")
- (?,Dg(B "i," "i;")
- (?,Dh(B "c~" "c<")
- (?,Dj(B "e," "e;")
- (?,Dl(B "e." "e^.")
- (?,Do(B "i-")
- (?,Dp(B "d/" "/d")
- (?,Dq(B "n," ",n")
- (?,Dr(B "o-")
- (?,Ds(B "k," ",k")
- (?,Dy(B "u," "u;")
- (?,D}(B "u~" "~u")
- (?,D~(B "u-")
- (?,D(B "^."))))
+ '((?Ä„ "A," "A;")
+ (?ĸ "k/" "kk")
+ (?Å– "R," ",R")
+ (?Ĩ "I~" "?I")
+ (?Ä» "L," ",L")
+ (?Å  "S~" "S<")
+ (?Ä’ "E-")
+ (?Ä¢ "G," ",G")
+ (?Ŧ "T/" "/T")
+ (?Ž "Z~" "Z<")
+ (?Ä… "a," "a;")
+ (?Ë› "';")
+ (?Å— "r," ",r")
+ (?Ä© "i~" "~i")
+ (?ļ "l," ",l")
+ (?ˇ "'<")
+ (?Å¡ "s~" "s<")
+ (?Ä“ "e-")
+ (?Ä£ "g," ",g")
+ (?ŧ "t/" "/t")
+ (?ÅŠ "N/" "NG")
+ (?ž "z~" "z<")
+ (?Å‹ "n/" "ng")
+ (?Ä€ "A-")
+ (?Ä® "I," "I;")
+ (?Č "C~" "C<")
+ (?Ę "E," "E;")
+ (?Ä– "E." "E^.")
+ (?Ī "I-")
+ (?Å… "N," ",N")
+ (?Ō "O-")
+ (?Ķ "K," ",K")
+ (?Ų "U," "U;")
+ (?Ũ "U~" "~U")
+ (?Ū "U-")
+ (?Ä "a-")
+ (?į "i," "i;")
+ (?Ä "c~" "c<")
+ (?Ä™ "e," "e;")
+ (?Ä— "e." "e^.")
+ (?Ä« "i-")
+ (?Ä‘ "d/" "/d")
+ (?ņ "n," ",n")
+ (?Å "o-")
+ (?Ä· "k," ",k")
+ (?ų "u," "u;")
+ (?Å© "u~" "~u")
+ (?Å« "u-")
+ (?Ë™ "^."))))
((eq set 'latin-5)
(latin1-display-identities set)
@@ -376,15 +376,15 @@ is. If FORCE is non-nil, set up the display regardless."
(lambda (l)
(or (char-displayable-p (car l))
(apply 'latin1-display-char l)))
- '((?,Mp(B "~g" "g(")
- (?,MP(B "~G" "G(")
- (?,M](B ".I" "I^.")
- (?,M~(B ",s")
- (?,M^(B ",S")
- (?,Mj(B "^e" "e<") ; from latin-post
- (?,Ml(B ".e" "e^.")
- (?,Mo(B "\"i" "i-") ; from latin-post
- (?,M}(B ".i" "i."))))
+ '((?ÄŸ "~g" "g(")
+ (?Äž "~G" "G(")
+ (?İ ".I" "I^.")
+ (?ÅŸ ",s")
+ (?Åž ",S")
+ (?ê "^e" "e<") ; from latin-post
+ (?ì ".e" "e^.")
+ (?ï "\"i" "i-") ; from latin-post
+ (?ı ".i" "i."))))
((eq set 'latin-8)
(latin1-display-identities set)
@@ -392,37 +392,37 @@ is. If FORCE is non-nil, set up the display regardless."
(lambda (l)
(or (char-displayable-p (car l))
(apply 'latin1-display-char l)))
- '((?,_!(B ".B" "B`")
- (?,_"(B ".b" "b`")
- (?,_%(B ".c" "c`")
- (?,_$(B ".C" "C`")
- (?,_&(B ".D" "D`")
- (?,_+(B ".d" "d`")
- (?,_8(B "`w")
- (?,_((B "`W")
- (?,_:(B "'w" "w'")
- (?,_*(B "'W" "W'")
- (?,_<(B "`y")
- (?,_,(B "`Y")
- (?,_1(B ".f" "f`")
- (?,_0(B ".F" "F`")
- (?,_3(B ".g" "g`")
- (?,_2(B ".G" "G`")
- (?,_5(B ".m" "m`")
- (?,_4(B ".M" "M`")
- (?,_9(B ".p" "p`")
- (?,_7(B ".P" "P`")
- (?,_?(B ".s" "s`")
- (?,_;(B ".S" "S`")
- (?,_>(B "\"w")
- (?,_=(B "\"W")
- (?,_p(B "^w" "w^")
- (?,_P(B "^W" "W^")
- (?,_w(B ".t" "t`")
- (?,_W(B ".T" "T`")
- (?,_~(B "^y" "y^")
- (?,_^(B "^Y" "Y^")
- (?,_/(B "\"Y"))))
+ '((?Ḃ ".B" "B`")
+ (?ḃ ".b" "b`")
+ (?Ä‹ ".c" "c`")
+ (?ÄŠ ".C" "C`")
+ (?Ḋ ".D" "D`")
+ (?ḋ ".d" "d`")
+ (?Ạ"`w")
+ (?Ẁ "`W")
+ (?ẃ "'w" "w'")
+ (?Ẃ "'W" "W'")
+ (?ỳ "`y")
+ (?Ỳ "`Y")
+ (?ḟ ".f" "f`")
+ (?Ḟ ".F" "F`")
+ (?Ä¡ ".g" "g`")
+ (?Ä  ".G" "G`")
+ (?á¹ ".m" "m`")
+ (?á¹€ ".M" "M`")
+ (?á¹— ".p" "p`")
+ (?á¹– ".P" "P`")
+ (?ṡ ".s" "s`")
+ (?á¹  ".S" "S`")
+ (?ẅ "\"w")
+ (?Ẅ "\"W")
+ (?ŵ "^w" "w^")
+ (?Å´ "^W" "W^")
+ (?ṫ ".t" "t`")
+ (?Ṫ ".T" "T`")
+ (?Å· "^y" "y^")
+ (?Ŷ "^Y" "Y^")
+ (?Ÿ "\"Y"))))
((eq set 'latin-9)
(latin1-display-identities set)
@@ -430,97 +430,97 @@ is. If FORCE is non-nil, set up the display regardless."
(lambda (l)
(or (char-displayable-p (car l))
(apply 'latin1-display-char l)))
- '((?,b((B "~s" "s<")
- (?,b&(B "~S" "S<")
- (?,b$(B "Euro" "E=")
- (?,b8(B "~z" "z<")
- (?,b4(B "~Z" "Z<")
- (?,b>(B "\"Y")
- (?,b=(B "oe")
- (?,b<(B "OE"))))
+ '((?Å¡ "~s" "s<")
+ (?Å  "~S" "S<")
+ (?€ "Euro" "E=")
+ (?ž "~z" "z<")
+ (?Ž "~Z" "Z<")
+ (?Ÿ "\"Y")
+ (?Å“ "oe")
+ (?Å’ "OE"))))
((eq set 'greek)
(mapc
(lambda (l)
(or (char-displayable-p (car l))
(apply 'latin1-display-char l)))
- '((?,F!(B "9'")
- (?,F"(B "'9")
- (?,F/(B "-M")
- (?,F5(B "'%")
- (?,F6(B "'A")
- (?,F8(B "'E")
- (?,F9(B "'H")
- (?,F:(B "'I")
- (?,F<(B "'O")
- (?,F>(B "'Y")
- (?,F?(B "W%")
- (?,F@(B "i3")
- (?,FC(B "G*")
- (?,FD(B "D*")
- (?,FH(B "TH")
- (?,FK(B "L*")
- (?,FN(B "C*")
- (?,FP(B "P*")
- (?,FS(B "S*")
- (?,FV(B "F*")
- (?,FX(B "Q*")
- (?,FY(B "W*")
- (?,FZ(B "\"I")
- (?,F[(B "\"Y")
- (?,F\(B "a%")
- (?,F](B "e%")
- (?,F^(B "y%")
- (?,F_(B "i%")
- (?,F`(B "u3")
- (?,Fa(B "a*")
- (?,Fb(B "b*")
- (?,Fc(B "g*")
- (?,Fd(B "d*")
- (?,Fe(B "e*")
- (?,Ff(B "z*")
- (?,Fg(B "y*")
- (?,Fh(B "h*")
- (?,Fi(B "i*")
- (?,Fj(B "k")
- (?,Fk(B "l*")
- (?,Fl(B "m*")
- (?,Fm(B "n*")
- (?,Fn(B "c*")
- (?,Fp(B "p*")
- (?,Fq(B "r*")
- (?,Fr(B "*s")
- (?,Fs(B "s*")
- (?,Ft(B "t*")
- (?,Fu(B "u")
- (?,Fv(B "f*")
- (?,Fw(B "x*")
- (?,Fx(B "q*")
- (?,Fy(B "w*")
- (?,Fz(B "\"i")
- (?,F{(B "\"u")
- (?,F|(B "'o")
- (?,F}(B "'u")
- (?,F~(B "'w")))
+ '((?‘ "9'")
+ (?’ "'9")
+ (?― "-M")
+ (?Î… "'%")
+ (?Ά "'A")
+ (?Έ "'E")
+ (?Ή "'H")
+ (?Ί "'I")
+ (?Ό "'O")
+ (?ÎŽ "'Y")
+ (?Î "W%")
+ (?Î "i3")
+ (?Γ "G*")
+ (?Δ "D*")
+ (?Θ "TH")
+ (?Λ "L*")
+ (?Ξ "C*")
+ (?Π "P*")
+ (?Σ "S*")
+ (?Φ "F*")
+ (?Ψ "Q*")
+ (?Ω "W*")
+ (?Ϊ "\"I")
+ (?Ϋ "\"Y")
+ (?ά "a%")
+ (?έ "e%")
+ (?ή "y%")
+ (?ί "i%")
+ (?ΰ "u3")
+ (?α "a*")
+ (?β "b*")
+ (?γ "g*")
+ (?δ "d*")
+ (?ε "e*")
+ (?ζ "z*")
+ (?η "y*")
+ (?θ "h*")
+ (?ι "i*")
+ (?κ "k")
+ (?λ "l*")
+ (?μ "m*")
+ (?ν "n*")
+ (?ξ "c*")
+ (?Ï€ "p*")
+ (?Ï "r*")
+ (?Ï‚ "*s")
+ (?σ "s*")
+ (?Ï„ "t*")
+ (?Ï… "u")
+ (?φ "f*")
+ (?χ "x*")
+ (?ψ "q*")
+ (?ω "w*")
+ (?ÏŠ "\"i")
+ (?Ï‹ "\"u")
+ (?ό "'o")
+ (?Ï "'u")
+ (?ÏŽ "'w")))
(mapc
(lambda (l)
(or (char-displayable-p (car l))
(aset standard-display-table (car l) (string-to-vector (cadr l)))))
- '((?,FA(B "A")
- (?,FB(B "B")
- (?,FE(B "E")
- (?,FF(B "Z")
- (?,FG(B "H")
- (?,FI(B "I")
- (?,FJ(B "J")
- (?,FL(B "M")
- (?,FM(B "N")
- (?,FO(B "O")
- (?,FQ(B "P")
- (?,FT(B "T")
- (?,FU(B "Y")
- (?,FW(B "X")
- (?,Fo(B "o"))))
+ '((?Α "A")
+ (?Î’ "B")
+ (?Ε "E")
+ (?Ζ "Z")
+ (?Η "H")
+ (?Ι "I")
+ (?Κ "J")
+ (?Μ "M")
+ (?Î "N")
+ (?Ο "O")
+ (?Ρ "P")
+ (?Τ "T")
+ (?Î¥ "Y")
+ (?Χ "X")
+ (?ο "o"))))
((eq set 'hebrew)
;; Don't start with identities, since we don't have definitions
@@ -537,96 +537,96 @@ is. If FORCE is non-nil, set up the display regardless."
(lambda (l)
(or (char-displayable-p (car l))
(aset standard-display-table (car l) (string-to-vector (cadr l)))))
- '((?,H_(B "=2")
- (?,H`(B "A+")
- (?,Ha(B "B+")
- (?,Hb(B "G+")
- (?,Hc(B "D+")
- (?,Hd(B "H+")
- (?,He(B "W+")
- (?,Hf(B "Z+")
- (?,Hg(B "X+")
- (?,Hh(B "Tj")
- (?,Hi(B "J+")
- (?,Hj(B "K%")
- (?,Hk(B "K+")
- (?,Hl(B "L+")
- (?,Hm(B "M%")
- (?,Hn(B "M+")
- (?,Ho(B "N%")
- (?,Hp(B "N+")
- (?,Hq(B "S+")
- (?,Hr(B "E+")
- (?,Hs(B "P%")
- (?,Ht(B "P+")
- (?,Hu(B "Zj")
- (?,Hv(B "ZJ")
- (?,Hw(B "Q+")
- (?,Hx(B "R+")
- (?,Hy(B "Sh")
- (?,Hz(B "T+"))))
+ '((?‗ "=2")
+ (?× "A+")
+ (?ב "B+")
+ (?×’ "G+")
+ (?ד "D+")
+ (?×” "H+")
+ (?ו "W+")
+ (?×– "Z+")
+ (?×— "X+")
+ (?ט "Tj")
+ (?×™ "J+")
+ (?ך "K%")
+ (?×› "K+")
+ (?ל "L+")
+ (?× "M%")
+ (?מ "M+")
+ (?ן "N%")
+ (?×  "N+")
+ (?ס "S+")
+ (?×¢ "E+")
+ (?×£ "P%")
+ (?פ "P+")
+ (?×¥ "Zj")
+ (?צ "ZJ")
+ (?×§ "Q+")
+ (?ר "R+")
+ (?ש "Sh")
+ (?ת "T+"))))
;; Arabic probably isn't so useful in the absence of Arabic
;; language support...
((eq set 'arabic)
(setq set 'arabic)
- (or (char-displayable-p ?,G (B)
- (aset standard-display-table ?,G (B ",A (B"))
- (or (char-displayable-p ?,G$(B)
- (aset standard-display-table ?,G$(B ",A$(B"))
- (or (char-displayable-p ?,G-(B)
- (aset standard-display-table ?,G-(B ",A-(B"))
+ (or (char-displayable-p ? )
+ (aset standard-display-table ?  " "))
+ (or (char-displayable-p ?¤)
+ (aset standard-display-table ?¤ "¤"))
+ (or (char-displayable-p ?­)
+ (aset standard-display-table ?­ "­"))
(mapc (lambda (l)
(or (char-displayable-p (car l))
(apply 'latin1-display-char l)))
- '((?,G,(B ",+")
- (?,G;(B ";+")
- (?,G?(B "?+")
- (?,GA(B "H'")
- (?,GB(B "aM")
- (?,GC(B "aH")
- (?,GD(B "wH")
- (?,GE(B "ah")
- (?,GF(B "yH")
- (?,GG(B "a+")
- (?,GH(B "b+")
- (?,GI(B "tm")
- (?,GJ(B "t+")
- (?,GK(B "tk")
- (?,GL(B "g+")
- (?,GM(B "hk")
- (?,GN(B "x+")
- (?,GO(B "d+")
- (?,GP(B "dk")
- (?,GQ(B "r+")
- (?,GR(B "z+")
- (?,GS(B "s+")
- (?,GT(B "sn")
- (?,GU(B "c+")
- (?,GV(B "dd")
- (?,GW(B "tj")
- (?,GX(B "zH")
- (?,GY(B "e+")
- (?,GZ(B "i+")
- (?,G`(B "++")
- (?,Ga(B "f+")
- (?,Gb(B "q+")
- (?,Gc(B "k+")
- (?,Gd(B "l+")
- (?,Ge(B "m+")
- (?,Gf(B "n+")
- (?,Gg(B "h+")
- (?,Gh(B "w+")
- (?,Gi(B "j+")
- (?,Gj(B "y+")
- (?,Gk(B ":+")
- (?,Gl(B "\"+")
- (?,Gm(B "=+")
- (?,Gn(B "/+")
- (?,Go(B "'+")
- (?,Gp(B "1+")
- (?,Gq(B "3+")
- (?,Gr(B "0+"))))
+ '((?، ",+")
+ (?Ø› ";+")
+ (?ØŸ "?+")
+ (?Ø¡ "H'")
+ (?Ø¢ "aM")
+ (?Ø£ "aH")
+ (?ؤ "wH")
+ (?Ø¥ "ah")
+ (?ئ "yH")
+ (?ا "a+")
+ (?ب "b+")
+ (?Ø© "tm")
+ (?ت "t+")
+ (?Ø« "tk")
+ (?ج "g+")
+ (?Ø­ "hk")
+ (?Ø® "x+")
+ (?د "d+")
+ (?ذ "dk")
+ (?ر "r+")
+ (?ز "z+")
+ (?س "s+")
+ (?Ø´ "sn")
+ (?ص "c+")
+ (?ض "dd")
+ (?Ø· "tj")
+ (?ظ "zH")
+ (?ع "e+")
+ (?غ "i+")
+ (?Ù€ "++")
+ (?Ù "f+")
+ (?Ù‚ "q+")
+ (?Ùƒ "k+")
+ (?Ù„ "l+")
+ (?Ù… "m+")
+ (?Ù† "n+")
+ (?Ù‡ "h+")
+ (?Ùˆ "w+")
+ (?Ù‰ "j+")
+ (?ÙŠ "y+")
+ (?Ù‹ ":+")
+ (?ٌ "\"+")
+ (?Ù "=+")
+ (?ÙŽ "/+")
+ (?Ù "'+")
+ (?Ù "1+")
+ (?Ù‘ "3+")
+ (?Ù’ "0+"))))
((eq set 'cyrillic)
(setq set 'cyrillic-iso)
@@ -634,105 +634,105 @@ is. If FORCE is non-nil, set up the display regardless."
(lambda (l)
(or (char-displayable-p (car l))
(apply 'latin1-display-char l)))
- '((?,L"(B "Dj")
- (?,L#(B "Gj")
- (?,L$(B "IE")
- (?,L)(B "Lj")
- (?,L*(B "Nj")
- (?,L+(B "Ts")
- (?,L,(B "Kj")
- (?,L.(B "V%")
- (?,L/(B "Dzh")
- (?,L1(B "B=")
- (?,L3(B ",Ab(B")
- (?,L4(B "D")
- (?,L6(B "Z%")
- (?,L7(B "3")
- (?,L8(B "U")
- (?,L9(B "J=")
- (?,L;(B "L=")
- (?,L?(B "P=")
- (?,LC(B "Y")
- (?,LD(B ",Ah(B")
- (?,LF(B "C=")
- (?,LG(B "C%")
- (?,LH(B "S%")
- (?,LI(B "Sc")
- (?,LJ(B "=\"")
- (?,LK(B "Y=")
- (?,LL(B "%\"")
- (?,LM(B "Ee")
- (?,LN(B "Yu")
- (?,LO(B "Ya")
- (?,LQ(B "b")
- (?,LR(B "v=")
- (?,LS(B "g=")
- (?,LT(B "g")
- (?,LV(B "z%")
- (?,LW(B "z=")
- (?,LX(B "u")
- (?,LY(B "j=")
- (?,LZ(B "k")
- (?,L[(B "l=")
- (?,L\(B "m=")
- (?,L](B "n=")
- (?,L_(B "n")
- (?,L`(B "p")
- (?,Lb(B "t=")
- (?,Ld(B "f=")
- (?,Lf(B "c=")
- (?,Lg(B "c%")
- (?,Lh(B "s%")
- (?,Li(B "sc")
- (?,Lj(B "='")
- (?,Lk(B "y=")
- (?,Ll(B "%'")
- (?,Lm(B "ee")
- (?,Ln(B "yu")
- (?,Lo(B "ya")
- (?,Lp(B "N0")
- (?,Lr(B "dj")
- (?,Ls(B "gj")
- (?,Lt(B "ie")
- (?,Ly(B "lj")
- (?,Lz(B "nj")
- (?,L{(B "ts")
- (?,L|(B "kj")
- (?,L~(B "v%")
- (?,L(B "dzh")))
+ '((?Ђ "Dj")
+ (?Ѓ "Gj")
+ (?Є "IE")
+ (?Љ "Lj")
+ (?Њ "Nj")
+ (?Ћ "Ts")
+ (?Ќ "Kj")
+ (?ÐŽ "V%")
+ (?Ð "Dzh")
+ (?Б "B=")
+ (?Г "â")
+ (?Д "D")
+ (?Ж "Z%")
+ (?З "3")
+ (?И "U")
+ (?Й "J=")
+ (?Л "L=")
+ (?П "P=")
+ (?У "Y")
+ (?Ф "è")
+ (?Ц "C=")
+ (?Ч "C%")
+ (?Ш "S%")
+ (?Щ "Sc")
+ (?Ъ "=\"")
+ (?Ы "Y=")
+ (?Ь "%\"")
+ (?Э "Ee")
+ (?Ю "Yu")
+ (?Я "Ya")
+ (?б "b")
+ (?в "v=")
+ (?г "g=")
+ (?д "g")
+ (?ж "z%")
+ (?з "z=")
+ (?и "u")
+ (?й "j=")
+ (?к "k")
+ (?л "l=")
+ (?м "m=")
+ (?н "n=")
+ (?п "n")
+ (?Ñ€ "p")
+ (?Ñ‚ "t=")
+ (?Ñ„ "f=")
+ (?ц "c=")
+ (?ч "c%")
+ (?ш "s%")
+ (?щ "sc")
+ (?ÑŠ "='")
+ (?Ñ‹ "y=")
+ (?ь "%'")
+ (?Ñ "ee")
+ (?ÑŽ "yu")
+ (?Ñ "ya")
+ (?â„– "N0")
+ (?Ñ’ "dj")
+ (?Ñ“ "gj")
+ (?Ñ” "ie")
+ (?Ñ™ "lj")
+ (?Ñš "nj")
+ (?Ñ› "ts")
+ (?ќ "kj")
+ (?Ñž "v%")
+ (?ÑŸ "dzh")))
(mapc
(lambda (l)
(or (char-displayable-p (car l))
(aset standard-display-table (car l) (string-to-vector (cadr l)))))
- '((?,L!(B ",AK(B")
- (?,L%(B "S")
- (?,L&(B "I")
- (?,L'(B ",AO(B")
- (?,L((B "J")
- (?,Lq(B ",Ak(B")
- (?,L}(B ",A'(B")
- (?,L-(B "-")
- (?,L0(B "A")
- (?,L2(B "B")
- (?,L5(B "E")
- (?,L:(B "K")
- (?,L<(B "M")
- (?,L=(B "H")
- (?,L>(B "O")
- (?,L@(B "P")
- (?,LA(B "C")
- (?,LB(B "T")
- (?,LE(B "X")
- (?,LP(B "a")
- (?,LU(B "e")
- (?,L^(B "o")
- (?,La(B "c")
- (?,Lc(B "y")
- (?,Le(B "x")
- (?,Lu(B "s")
- (?,Lv(B "i")
- (?,Lw(B ",Ao(B")
- (?,Lx(B "j"))))
+ '((?Р"Ë")
+ (?Ð… "S")
+ (?І "I")
+ (?Ї "Ã")
+ (?Ј "J")
+ (?ё "ë")
+ (?§ "§")
+ (?­ "-")
+ (?Ð "A")
+ (?Ð’ "B")
+ (?Е "E")
+ (?К "K")
+ (?М "M")
+ (?Ð "H")
+ (?О "O")
+ (?Р "P")
+ (?С "C")
+ (?Т "T")
+ (?Ð¥ "X")
+ (?а "a")
+ (?е "e")
+ (?о "o")
+ (?Ñ "c")
+ (?у "y")
+ (?Ñ… "x")
+ (?Ñ• "s")
+ (?Ñ– "i")
+ (?ї "ï")
+ (?ј "j"))))
(t (error "Unsupported character set: %S" set)))
@@ -773,2417 +773,2417 @@ isn't changed if the display can render Unicode characters."
;; Table derived by running Lynx on a suitable list of
;; characters in a utf-8 file, except for some added by
;; hand at the end.
- '((?\$,1 (B "A")
- (?\$,1 !(B "a")
- (?\$,1 "(B "A")
- (?\$,1 #(B "a")
- (?\$,1 $(B "A")
- (?\$,1 %(B "a")
- (?\$,1 &(B "C")
- (?\$,1 '(B "c")
- (?\$,1 ((B "C")
- (?\$,1 )(B "c")
- (?\$,1 *(B "C")
- (?\$,1 +(B "c")
- (?\$,1 ,(B "C")
- (?\$,1 -(B "c")
- (?\$,1 .(B "D")
- (?\$,1 /(B "d")
- (?\$,1 0(B ",AP(B")
- (?\$,1 1(B "d/")
- (?\$,1 2(B "E")
- (?\$,1 3(B "e")
- (?\$,1 4(B "E")
- (?\$,1 5(B "e")
- (?\$,1 6(B "E")
- (?\$,1 7(B "e")
- (?\$,1 8(B "E")
- (?\$,1 9(B "e")
- (?\$,1 :(B "E")
- (?\$,1 ;(B "e")
- (?\$,1 <(B "G")
- (?\$,1 =(B "g")
- (?\$,1 >(B "G")
- (?\$,1 ?(B "g")
- (?\$,1 @(B "G")
- (?\$,1 A(B "g")
- (?\$,1 B(B "G")
- (?\$,1 C(B "g")
- (?\$,1 D(B "H")
- (?\$,1 E(B "h")
- (?\$,1 F(B "H/")
- (?\$,1 G(B "H")
- (?\$,1 H(B "I")
- (?\$,1 I(B "i")
- (?\$,1 J(B "I")
- (?\$,1 K(B "i")
- (?\$,1 L(B "I")
- (?\$,1 M(B "i")
- (?\$,1 N(B "I")
- (?\$,1 O(B "i")
- (?\$,1 P(B "I")
- (?\$,1 Q(B "i")
- (?\$,1 R(B "IJ")
- (?\$,1 S(B "ij")
- (?\$,1 T(B "J")
- (?\$,1 U(B "j")
- (?\$,1 V(B "K")
- (?\$,1 W(B "k")
- (?\$,1 X(B "kk")
- (?\$,1 Y(B "L")
- (?\$,1 Z(B "l")
- (?\$,1 [(B "L")
- (?\$,1 \(B "l")
- (?\$,1 ](B "L")
- (?\$,1 ^(B "l")
- (?\$,1 _(B "L.")
- (?\$,1 `(B "l.")
- (?\$,1 a(B "L/")
- (?\$,1 b(B "l/")
- (?\$,1 c(B "N")
- (?\$,1 d(B "n")
- (?\$,1 e(B "N")
- (?\$,1 f(B "n")
- (?\$,1 g(B "N")
- (?\$,1 h(B "n")
- (?\$,1 i(B "'n")
- (?\$,1 j(B "NG")
- (?\$,1 k(B "N")
- (?\$,1 l(B "O")
- (?\$,1 m(B "o")
- (?\$,1 n(B "O")
- (?\$,1 o(B "o")
- (?\$,1 p(B "O\"")
- (?\$,1 q(B "o\"")
- (?\$,1 r(B "OE")
- (?\$,1 s(B "oe")
- (?\$,1 t(B "R")
- (?\$,1 u(B "r")
- (?\$,1 v(B "R")
- (?\$,1 w(B "r")
- (?\$,1 x(B "R")
- (?\$,1 y(B "r")
- (?\$,1 z(B "S")
- (?\$,1 {(B "s")
- (?\$,1 |(B "S")
- (?\$,1 }(B "s")
- (?\$,1 ~(B "S")
- (?\$,1 (B "s")
- (?\$,1! (B "S")
- (?\$,1!!(B "s")
- (?\$,1!"(B "T")
- (?\$,1!#(B "t")
- (?\$,1!$(B "T")
- (?\$,1!%(B "t")
- (?\$,1!&(B "T/")
- (?\$,1!'(B "t/")
- (?\$,1!((B "U")
- (?\$,1!)(B "u")
- (?\$,1!*(B "U")
- (?\$,1!+(B "u")
- (?\$,1!,(B "U")
- (?\$,1!-(B "u")
- (?\$,1!.(B "U")
- (?\$,1!/(B "u")
- (?\$,1!0(B "U\"")
- (?\$,1!1(B "u\"")
- (?\$,1!2(B "U")
- (?\$,1!3(B "u")
- (?\$,1!4(B "W")
- (?\$,1!5(B "w")
- (?\$,1!6(B "Y")
- (?\$,1!7(B "y")
- (?\$,1!8(B "Y")
- (?\$,1!9(B "Z")
- (?\$,1!:(B "z")
- (?\$,1!;(B "Z")
- (?\$,1!<(B "z")
- (?\$,1!=(B "Z")
- (?\$,1!>(B "z")
- (?\$,1!?(B "s1")
- (?\$,1!G(B "C2")
- (?\$,1!H(B "c2")
- (?\$,1!Q(B "F2")
- (?\$,1!R(B " f")
- (?\$,1!X(B "K2")
- (?\$,1!Y(B "k2")
- (?\$,1!`(B "O9")
- (?\$,1!a(B "o9")
- (?\$,1!b(B "OI")
- (?\$,1!c(B "oi")
- (?\$,1!f(B "yr")
- (?\$,1!o(B "U9")
- (?\$,1!p(B "u9")
- (?\$,1!u(B "Z/")
- (?\$,1!v(B "z/")
- (?\$,1!w(B "ED")
- (?\$,1"-(B "A")
- (?\$,1".(B "a")
- (?\$,1"/(B "I")
- (?\$,1"0(B "i")
- (?\$,1"1(B "O")
- (?\$,1"2(B "o")
- (?\$,1"3(B "U")
- (?\$,1"4(B "u")
- (?\$,1"5(B "U:-")
- (?\$,1"6(B "u:-")
- (?\$,1"7(B "U:'")
- (?\$,1"8(B "u:'")
- (?\$,1"9(B "U:<")
- (?\$,1":(B "u:<")
- (?\$,1";(B "U:!")
- (?\$,1"<(B "u:!")
- (?\$,1">(B "A1")
- (?\$,1"?(B "a1")
- (?\$,1"@(B "A7")
- (?\$,1"A(B "a7")
- (?\$,1"B(B "A3")
- (?\$,1"C(B "a3")
- (?\$,1"D(B "G/")
- (?\$,1"E(B "g/")
- (?\$,1"F(B "G")
- (?\$,1"G(B "g")
- (?\$,1"H(B "K")
- (?\$,1"I(B "k")
- (?\$,1"J(B "O")
- (?\$,1"K(B "o")
- (?\$,1"L(B "O1")
- (?\$,1"M(B "o1")
- (?\$,1"N(B "EZ")
- (?\$,1"O(B "ez")
- (?\$,1"P(B "j")
- (?\$,1"T(B "G")
- (?\$,1"U(B "g")
- (?\$,1"Z(B "AA'")
- (?\$,1"[(B "aa'")
- (?\$,1"\(B "AE'")
- (?\$,1"](B "ae'")
- (?\$,1"^(B "O/'")
- (?\$,1"_(B "o/'")
- (?\$,1"`(B "A!!")
- (?\$,1"a(B "a!!")
- (?\$,1"b(B "A)")
- (?\$,1"c(B "a)")
- (?\$,1"d(B "E!!")
- (?\$,1"e(B "e!!")
- (?\$,1"f(B "E)")
- (?\$,1"g(B "e)")
- (?\$,1"h(B "I!!")
- (?\$,1"i(B "i!!")
- (?\$,1"j(B "I)")
- (?\$,1"k(B "i)")
- (?\$,1"l(B "O!!")
- (?\$,1"m(B "o!!")
- (?\$,1"n(B "O)")
- (?\$,1"o(B "o)")
- (?\$,1"p(B "R!!")
- (?\$,1"q(B "r!!")
- (?\$,1"r(B "R)")
- (?\$,1"s(B "r)")
- (?\$,1"t(B "U!!")
- (?\$,1"u(B "u!!")
- (?\$,1"v(B "U)")
- (?\$,1"w(B "u)")
- (?\$,1"}(B "Z")
- (?\$,1#Q(B "A")
- (?\$,1#R(B "A.")
- (?\$,1#S(B "b`")
- (?\$,1#T(B "O")
- (?\$,1#V(B "d.")
- (?\$,1#W(B "d`")
- (?\$,1#X(B "@<umd>")
- (?\$,1#Y(B "@")
- (?\$,1#Z(B "R")
- (?\$,1#[(B "E")
- (?\$,1#\(B "V\"")
- (?\$,1#](B "R<umd>")
- (?\$,1#^(B "O\"")
- (?\$,1#_(B "J")
- (?\$,1#`(B "g`")
- (?\$,1#a(B "g")
- (?\$,1#b(B "G")
- (?\$,1#c(B "Q")
- (?\$,1#d(B "o-")
- (?\$,1#e(B "j<rnd>")
- (?\$,1#f(B "h<?>")
- (?\$,1#h(B "i\"")
- (?\$,1#i(B "I")
- (?\$,1#j(B "I")
- (?\$,1#k(B "L")
- (?\$,1#l(B "L")
- (?\$,1#m(B "l.")
- (?\$,1#n(B "z<lat>")
- (?\$,1#o(B "u-")
- (?\$,1#p(B "j<vel>")
- (?\$,1#q(B "M")
- (?\$,1#s(B "n.")
- (?\$,1#t(B "n\"")
- (?\$,1#u(B "@.")
- (?\$,1#v(B "&.")
- (?\$,1#w(B "U")
- (?\$,1#y(B "r")
- (?\$,1#z(B "*<lat>")
- (?\$,1#{(B "r.")
- (?\$,1#}(B "*.")
- (?\$,1#~(B "*")
- (?\$,1$ (B "R")
- (?\$,1$!(B "g\"")
- (?\$,1$"(B "s.")
- (?\$,1$#(B "S")
- (?\$,1$$(B "J`")
- (?\$,1$'(B "t!")
- (?\$,1$((B "t.")
- (?\$,1$)(B "u\"")
- (?\$,1$*(B "U")
- (?\$,1$+(B "r<lbd>")
- (?\$,1$,(B "V")
- (?\$,1$-(B "w<vls>")
- (?\$,1$.(B "l^")
- (?\$,1$/(B "I.")
- (?\$,1$0(B "z.")
- (?\$,1$2(B "Z")
- (?\$,1$4(B "?")
- (?\$,1$5(B "H<vcd>")
- (?\$,1$6(B "l!")
- (?\$,1$7(B "c!")
- (?\$,1$8(B "p!")
- (?\$,1$9(B "b<trl>")
- (?\$,1$;(B "G`")
- (?\$,1$=(B "j")
- (?\$,1$>(B "k!")
- (?\$,1$?(B "L")
- (?\$,1$@(B "q`")
- (?\$,1$D(B "d3")
- (?\$,1$F(B "ts")
- (?\$,1$G(B "tS")
- (?\$,1$P(B "<h>")
- (?\$,1$Q(B "<?>")
- (?\$,1$R(B ";")
- (?\$,1$S(B "<r>")
- (?\$,1$W(B "<w>")
- (?\$,1$[(B ";S")
- (?\$,1$\(B "`")
- (?\$,1$f(B "^")
- (?\$,1$g(B "'<")
- (?\$,1$h(B "|")
- (?\$,1$i(B "1-")
- (?\$,1$k(B "1!")
- (?\$,1$p(B ":")
- (?\$,1$q(B ":\\")
- (?\$,1$v(B "+")
- (?\$,1$w(B "-")
- (?\$,1$x(B "'(")
- (?\$,1$y(B "'.")
- (?\$,1$z(B "'0")
- (?\$,1${(B "';")
- (?\$,1$|(B "~")
- (?\$,1$}(B "'\"")
- (?\$,1%%(B "_T")
- (?\$,1%&(B "_H")
- (?\$,1%'(B "_M")
- (?\$,1%((B "_L")
- (?\$,1%)(B "_B")
- (?\$,1%,(B "_v")
- (?\$,1%.(B "''")
- (?\$,1%@(B "`")
- (?\$,1%A(B "'")
- (?\$,1%B(B "^")
- (?\$,1%C(B "~")
- (?\$,1%D(B ",A/(B")
- (?\$,1%G(B ",A7(B")
- (?\$,1%H(B ",A((B")
- (?\$,1%J(B ",A0(B")
- (?\$,1%K(B "''")
- (?\$,1%M(B "|")
- (?\$,1%N(B "||")
- (?\$,1%O(B "``")
- (?\$,1%a(B ";")
- (?\$,1%b(B ".")
- (?\$,1%c(B ".")
- (?\$,1%d(B "<?>")
- (?\$,1%e(B "<o>")
- (?\$,1%f(B ",")
- (?\$,1%g(B ",A8(B")
- (?\$,1%i(B "-")
- (?\$,1%j(B "[")
- (?\$,1%k(B "<w>")
- (?\$,1%t(B "~")
- (?\$,1%w(B "/")
- (?\$,1%x(B "/")
- (?\$,1& (B "`")
- (?\$,1&!(B "'")
- (?\$,1&"(B "~")
- (?\$,1&$(B "'%")
- (?\$,1&%(B "j3")
- (?\$,1&'(B "=")
- (?\$,1&@(B "~~")
- (?\$,1&T(B "'")
- (?\$,1&U(B ",")
- (?\$,1&Z(B "j3")
- (?\$,1&^(B "?%")
- (?\$,1&d(B "'*")
- (?\$,1&e(B "'%")
- (?\$,1&f(B "A'")
- (?\$,1&g(B ",A7(B")
- (?\$,1&h(B "E'")
- (?\$,1&i(B "Y%")
- (?\$,1&j(B "I'")
- (?\$,1&l(B "O'")
- (?\$,1&n(B "U%")
- (?\$,1&o(B "W%")
- (?\$,1&p(B "i3")
- (?\$,1&q(B "A")
- (?\$,1&r(B "B")
- (?\$,1&s(B "G")
- (?\$,1&t(B "D")
- (?\$,1&u(B "E")
- (?\$,1&v(B "Z")
- (?\$,1&w(B "Y")
- (?\$,1&x(B "TH")
- (?\$,1&y(B "I")
- (?\$,1&z(B "K")
- (?\$,1&{(B "L")
- (?\$,1&|(B "M")
- (?\$,1&}(B "N")
- (?\$,1&~(B "C")
- (?\$,1&(B "O")
- (?\$,1' (B "P")
- (?\$,1'!(B "R")
- (?\$,1'#(B "S")
- (?\$,1'$(B "T")
- (?\$,1'%(B "U")
- (?\$,1'&(B "F")
- (?\$,1''(B "X")
- (?\$,1'((B "Q")
- (?\$,1')(B "W*")
- (?\$,1'*(B "J")
- (?\$,1'+(B "V*")
- (?\$,1',(B "a'")
- (?\$,1'-(B "e'")
- (?\$,1'.(B "y%")
- (?\$,1'/(B "i'")
- (?\$,1'0(B "u3")
- (?\$,1'1(B "a")
- (?\$,1'2(B "b")
- (?\$,1'3(B "g")
- (?\$,1'4(B "d")
- (?\$,1'5(B "e")
- (?\$,1'6(B "z")
- (?\$,1'7(B "y")
- (?\$,1'8(B "th")
- (?\$,1'9(B "i")
- (?\$,1':(B "k")
- (?\$,1';(B "l")
- (?\$,1'<(B ",A5(B")
- (?\$,1'=(B "n")
- (?\$,1'>(B "c")
- (?\$,1'?(B "o")
- (?\$,1'@(B "p")
- (?\$,1'A(B "r")
- (?\$,1'B(B "*s")
- (?\$,1'C(B "s")
- (?\$,1'D(B "t")
- (?\$,1'E(B "u")
- (?\$,1'F(B "f")
- (?\$,1'G(B "x")
- (?\$,1'H(B "q")
- (?\$,1'I(B "w")
- (?\$,1'J(B "j")
- (?\$,1'K(B "v*")
- (?\$,1'L(B "o'")
- (?\$,1'M(B "u%")
- (?\$,1'N(B "w%")
- (?\$,1'P(B "beta ")
- (?\$,1'Q(B "theta ")
- (?\$,1'R(B "upsi ")
- (?\$,1'U(B "phi ")
- (?\$,1'V(B "pi ")
- (?\$,1'W(B "k.")
- (?\$,1'Z(B "T3")
- (?\$,1'[(B "t3")
- (?\$,1'\(B "M3")
- (?\$,1'](B "m3")
- (?\$,1'^(B "K3")
- (?\$,1'_(B "k3")
- (?\$,1'`(B "P3")
- (?\$,1'a(B "p3")
- (?\$,1'p(B "kappa ")
- (?\$,1'q(B "rho ")
- (?\$,1's(B "J")
- (?\$,1't(B "'%")
- (?\$,1'u(B "j3")
- (?\$,1(!(B "IO")
- (?\$,1("(B "D%")
- (?\$,1(#(B "G%")
- (?\$,1($(B "IE")
- (?\$,1(%(B "DS")
- (?\$,1(&(B "II")
- (?\$,1('(B "YI")
- (?\$,1(((B "J%")
- (?\$,1()(B "LJ")
- (?\$,1(*(B "NJ")
- (?\$,1(+(B "Ts")
- (?\$,1(,(B "KJ")
- (?\$,1(.(B "V%")
- (?\$,1(/(B "DZ")
- (?\$,1(0(B "A")
- (?\$,1(1(B "B")
- (?\$,1(2(B "V")
- (?\$,1(3(B "G")
- (?\$,1(4(B "D")
- (?\$,1(5(B "E")
- (?\$,1(6(B "ZH")
- (?\$,1(7(B "Z")
- (?\$,1(8(B "I")
- (?\$,1(9(B "J")
- (?\$,1(:(B "K")
- (?\$,1(;(B "L")
- (?\$,1(<(B "M")
- (?\$,1(=(B "N")
- (?\$,1(>(B "O")
- (?\$,1(?(B "P")
- (?\$,1(@(B "R")
- (?\$,1(A(B "S")
- (?\$,1(B(B "T")
- (?\$,1(C(B "U")
- (?\$,1(D(B "F")
- (?\$,1(E(B "H")
- (?\$,1(F(B "C")
- (?\$,1(G(B "CH")
- (?\$,1(H(B "SH")
- (?\$,1(I(B "SCH")
- (?\$,1(J(B "\"")
- (?\$,1(K(B "Y")
- (?\$,1(L(B "'")
- (?\$,1(M(B "`E")
- (?\$,1(N(B "YU")
- (?\$,1(O(B "YA")
- (?\$,1(P(B "a")
- (?\$,1(Q(B "b")
- (?\$,1(R(B "v")
- (?\$,1(S(B "g")
- (?\$,1(T(B "d")
- (?\$,1(U(B "e")
- (?\$,1(V(B "zh")
- (?\$,1(W(B "z")
- (?\$,1(X(B "i")
- (?\$,1(Y(B "j")
- (?\$,1(Z(B "k")
- (?\$,1([(B "l")
- (?\$,1(\(B "m")
- (?\$,1(](B "n")
- (?\$,1(^(B "o")
- (?\$,1(_(B "p")
- (?\$,1(`(B "r")
- (?\$,1(a(B "s")
- (?\$,1(b(B "t")
- (?\$,1(c(B "u")
- (?\$,1(d(B "f")
- (?\$,1(e(B "h")
- (?\$,1(f(B "c")
- (?\$,1(g(B "ch")
- (?\$,1(h(B "sh")
- (?\$,1(i(B "sch")
- (?\$,1(j(B "\"")
- (?\$,1(k(B "y")
- (?\$,1(l(B "'")
- (?\$,1(m(B "`e")
- (?\$,1(n(B "yu")
- (?\$,1(o(B "ya")
- (?\$,1(q(B "io")
- (?\$,1(r(B "d%")
- (?\$,1(s(B "g%")
- (?\$,1(t(B "ie")
- (?\$,1(u(B "ds")
- (?\$,1(v(B "ii")
- (?\$,1(w(B "yi")
- (?\$,1(x(B "j%")
- (?\$,1(y(B "lj")
- (?\$,1(z(B "nj")
- (?\$,1({(B "ts")
- (?\$,1(|(B "kj")
- (?\$,1(~(B "v%")
- (?\$,1((B "dz")
- (?\$,1)"(B "Y3")
- (?\$,1)#(B "y3")
- (?\$,1)*(B "O3")
- (?\$,1)+(B "o3")
- (?\$,1)2(B "F3")
- (?\$,1)3(B "f3")
- (?\$,1)4(B "V3")
- (?\$,1)5(B "v3")
- (?\$,1)@(B "C3")
- (?\$,1)A(B "c3")
- (?\$,1)P(B "G3")
- (?\$,1)Q(B "g3")
- (?\$,1*4(B "AE")
- (?\$,1*5(B "ae")
- (?\$,1,T(B "i")
- (?\$,1,W(B "a")
- (?\$,1,X(B "o")
- (?\$,1,\(B "u")
- (?\$,1,_(B "h")
- (?\$,1,b(B ":")
- (?\$,1,p(B "#")
- (?\$,1,q(B "B+")
- (?\$,1,r(B "G+")
- (?\$,1,s(B "D+")
- (?\$,1,t(B "H+")
- (?\$,1,u(B "W+")
- (?\$,1,v(B "Z+")
- (?\$,1,w(B "X+")
- (?\$,1,x(B "Tj")
- (?\$,1,y(B "J+")
- (?\$,1,z(B "K%")
- (?\$,1,{(B "K+")
- (?\$,1,|(B "L+")
- (?\$,1,}(B "M%")
- (?\$,1,~(B "M+")
- (?\$,1,(B "N%")
- (?\$,1- (B "N+")
- (?\$,1-!(B "S+")
- (?\$,1-"(B "E+")
- (?\$,1-#(B "P%")
- (?\$,1-$(B "P+")
- (?\$,1-%(B "Zj")
- (?\$,1-&(B "ZJ")
- (?\$,1-'(B "Q+")
- (?\$,1-((B "R+")
- (?\$,1-)(B "Sh")
- (?\$,1-*(B "T+")
- (?\$,1-0(B "v")
- (?\$,1-1(B "oy")
- (?\$,1-2(B "ey")
- (?\$,1-L(B ",+")
- (?\$,1-[(B ";+")
- (?\$,1-_(B "?+")
- (?\$,1-a(B "H'")
- (?\$,1-b(B "aM")
- (?\$,1-c(B "aH")
- (?\$,1-d(B "wH")
- (?\$,1-e(B "ah")
- (?\$,1-f(B "yH")
- (?\$,1-g(B "a+")
- (?\$,1-h(B "b+")
- (?\$,1-i(B "tm")
- (?\$,1-j(B "t+")
- (?\$,1-k(B "tk")
- (?\$,1-l(B "g+")
- (?\$,1-m(B "hk")
- (?\$,1-n(B "x+")
- (?\$,1-o(B "d+")
- (?\$,1-p(B "dk")
- (?\$,1-q(B "r+")
- (?\$,1-r(B "z+")
- (?\$,1-s(B "s+")
- (?\$,1-t(B "sn")
- (?\$,1-u(B "c+")
- (?\$,1-v(B "dd")
- (?\$,1-w(B "tj")
- (?\$,1-x(B "zH")
- (?\$,1-y(B "e+")
- (?\$,1-z(B "i+")
- (?\$,1. (B "++")
- (?\$,1.!(B "f+")
- (?\$,1."(B "q+")
- (?\$,1.#(B "k+")
- (?\$,1.$(B "l+")
- (?\$,1.%(B "m+")
- (?\$,1.&(B "n+")
- (?\$,1.'(B "h+")
- (?\$,1.((B "w+")
- (?\$,1.)(B "j+")
- (?\$,1.*(B "y+")
- (?\$,1.+(B ":+")
- (?\$,1.,(B "\"+")
- (?\$,1.-(B "=+")
- (?\$,1..(B "/+")
- (?\$,1./(B "'+")
- (?\$,1.0(B "1+")
- (?\$,1.1(B "3+")
- (?\$,1.2(B "0+")
- (?\$,1.@(B "0a")
- (?\$,1.A(B "1a")
- (?\$,1.B(B "2a")
- (?\$,1.C(B "3a")
- (?\$,1.D(B "4a")
- (?\$,1.E(B "5a")
- (?\$,1.F(B "6a")
- (?\$,1.G(B "7a")
- (?\$,1.H(B "8a")
- (?\$,1.I(B "9a")
- (?\$,1.P(B "aS")
- (?\$,1.^(B "p+")
- (?\$,1.a(B "hH")
- (?\$,1.f(B "tc")
- (?\$,1.x(B "zj")
- (?\$,1/$(B "v+")
- (?\$,1//(B "gf")
- (?\$,1/p(B "0a")
- (?\$,1/q(B "1a")
- (?\$,1/r(B "2a")
- (?\$,1/s(B "3a")
- (?\$,1/t(B "4a")
- (?\$,1/u(B "5a")
- (?\$,1/v(B "6a")
- (?\$,1/w(B "7a")
- (?\$,1/x(B "8a")
- (?\$,1/y(B "9a")
- (?\$,1M@(B "he")
- (?\$,1MA(B "hu")
- (?\$,1MB(B "hi")
- (?\$,1MC(B "ha")
- (?\$,1MD(B "hE")
- (?\$,1ME(B "h")
- (?\$,1MF(B "ho")
- (?\$,1MH(B "le")
- (?\$,1MI(B "lu")
- (?\$,1MJ(B "li")
- (?\$,1MK(B "la")
- (?\$,1ML(B "lE")
- (?\$,1MM(B "l")
- (?\$,1MN(B "lo")
- (?\$,1MO(B "lWa")
- (?\$,1MP(B "He")
- (?\$,1MQ(B "Hu")
- (?\$,1MR(B "Hi")
- (?\$,1MS(B "Ha")
- (?\$,1MT(B "HE")
- (?\$,1MU(B "H")
- (?\$,1MV(B "Ho")
- (?\$,1MW(B "HWa")
- (?\$,1MX(B "me")
- (?\$,1MY(B "mu")
- (?\$,1MZ(B "mi")
- (?\$,1M[(B "ma")
- (?\$,1M\(B "mE")
- (?\$,1M](B "m")
- (?\$,1M^(B "mo")
- (?\$,1M_(B "mWa")
- (?\$,1M`(B "`se")
- (?\$,1Ma(B "`su")
- (?\$,1Mb(B "`si")
- (?\$,1Mc(B "`sa")
- (?\$,1Md(B "`sE")
- (?\$,1Me(B "`s")
- (?\$,1Mf(B "`so")
- (?\$,1Mg(B "`sWa")
- (?\$,1Mh(B "re")
- (?\$,1Mi(B "ru")
- (?\$,1Mj(B "ri")
- (?\$,1Mk(B "ra")
- (?\$,1Ml(B "rE")
- (?\$,1Mm(B "r")
- (?\$,1Mn(B "ro")
- (?\$,1Mo(B "rWa")
- (?\$,1Mp(B "se")
- (?\$,1Mq(B "su")
- (?\$,1Mr(B "si")
- (?\$,1Ms(B "sa")
- (?\$,1Mt(B "sE")
- (?\$,1Mu(B "s")
- (?\$,1Mv(B "so")
- (?\$,1Mw(B "sWa")
- (?\$,1Mx(B "xe")
- (?\$,1My(B "xu")
- (?\$,1Mz(B "xi")
- (?\$,1M{(B "xa")
- (?\$,1M|(B "xE")
- (?\$,1M}(B "xa")
- (?\$,1M~(B "xo")
- (?\$,1M(B "xWa")
- (?\$,1N (B "qe")
- (?\$,1N!(B "qu")
- (?\$,1N"(B "qi")
- (?\$,1N#(B "qa")
- (?\$,1N$(B "qE")
- (?\$,1N%(B "q")
- (?\$,1N&(B "qo")
- (?\$,1N((B "qWe")
- (?\$,1N*(B "qWi")
- (?\$,1N+(B "qWa")
- (?\$,1N,(B "qWE")
- (?\$,1N-(B "qW")
- (?\$,1N0(B "Qe")
- (?\$,1N1(B "Qu")
- (?\$,1N2(B "Qi")
- (?\$,1N3(B "Qa")
- (?\$,1N4(B "QE")
- (?\$,1N5(B "Q")
- (?\$,1N6(B "Qo")
- (?\$,1N8(B "QWe")
- (?\$,1N:(B "QWi")
- (?\$,1N;(B "QWa")
- (?\$,1N<(B "QWE")
- (?\$,1N=(B "QW")
- (?\$,1N@(B "be")
- (?\$,1NA(B "bu")
- (?\$,1NB(B "bi")
- (?\$,1NC(B "ba")
- (?\$,1ND(B "bE")
- (?\$,1NE(B "b")
- (?\$,1NF(B "bo")
- (?\$,1NG(B "bWa")
- (?\$,1NH(B "ve")
- (?\$,1NI(B "vu")
- (?\$,1NJ(B "vi")
- (?\$,1NK(B "va")
- (?\$,1NL(B "vE")
- (?\$,1NM(B "v")
- (?\$,1NN(B "vo")
- (?\$,1NO(B "vWa")
- (?\$,1NP(B "te")
- (?\$,1NQ(B "tu")
- (?\$,1NR(B "ti")
- (?\$,1NS(B "ta")
- (?\$,1NT(B "tE")
- (?\$,1NU(B "t")
- (?\$,1NV(B "to")
- (?\$,1NW(B "tWa")
- (?\$,1NX(B "ce")
- (?\$,1NY(B "cu")
- (?\$,1NZ(B "ci")
- (?\$,1N[(B "ca")
- (?\$,1N\(B "cE")
- (?\$,1N](B "c")
- (?\$,1N^(B "co")
- (?\$,1N_(B "cWa")
- (?\$,1N`(B "`he")
- (?\$,1Na(B "`hu")
- (?\$,1Nb(B "`hi")
- (?\$,1Nc(B "`ha")
- (?\$,1Nd(B "`hE")
- (?\$,1Ne(B "`h")
- (?\$,1Nf(B "`ho")
- (?\$,1Nh(B "hWe")
- (?\$,1Nj(B "hWi")
- (?\$,1Nk(B "hWa")
- (?\$,1Nl(B "hWE")
- (?\$,1Nm(B "hW")
- (?\$,1Np(B "na")
- (?\$,1Nq(B "nu")
- (?\$,1Nr(B "ni")
- (?\$,1Ns(B "na")
- (?\$,1Nt(B "nE")
- (?\$,1Nu(B "n")
- (?\$,1Nv(B "no")
- (?\$,1Nw(B "nWa")
- (?\$,1Nx(B "Ne")
- (?\$,1Ny(B "Nu")
- (?\$,1Nz(B "Ni")
- (?\$,1N{(B "Na")
- (?\$,1N|(B "NE")
- (?\$,1N}(B "N")
- (?\$,1N~(B "No")
- (?\$,1N(B "NWa")
- (?\$,1O (B "e")
- (?\$,1O!(B "u")
- (?\$,1O"(B "i")
- (?\$,1O#(B "a")
- (?\$,1O$(B "E")
- (?\$,1O%(B "I")
- (?\$,1O&(B "o")
- (?\$,1O'(B "e3")
- (?\$,1O((B "ke")
- (?\$,1O)(B "ku")
- (?\$,1O*(B "ki")
- (?\$,1O+(B "ka")
- (?\$,1O,(B "kE")
- (?\$,1O-(B "k")
- (?\$,1O.(B "ko")
- (?\$,1O0(B "kWe")
- (?\$,1O2(B "kWi")
- (?\$,1O3(B "kWa")
- (?\$,1O4(B "kWE")
- (?\$,1O5(B "kW")
- (?\$,1O8(B "Ke")
- (?\$,1O9(B "Ku")
- (?\$,1O:(B "Ki")
- (?\$,1O;(B "Ka")
- (?\$,1O<(B "KE")
- (?\$,1O=(B "K")
- (?\$,1O>(B "Ko")
- (?\$,1O@(B "KWe")
- (?\$,1OB(B "KWi")
- (?\$,1OC(B "KWa")
- (?\$,1OD(B "KWE")
- (?\$,1OE(B "KW")
- (?\$,1OH(B "we")
- (?\$,1OI(B "wu")
- (?\$,1OJ(B "wi")
- (?\$,1OK(B "wa")
- (?\$,1OL(B "wE")
- (?\$,1OM(B "w")
- (?\$,1ON(B "wo")
- (?\$,1OP(B "`e")
- (?\$,1OQ(B "`u")
- (?\$,1OR(B "`i")
- (?\$,1OS(B "`a")
- (?\$,1OT(B "`E")
- (?\$,1OU(B "`I")
- (?\$,1OV(B "`o")
- (?\$,1OX(B "ze")
- (?\$,1OY(B "zu")
- (?\$,1OZ(B "zi")
- (?\$,1O[(B "za")
- (?\$,1O\(B "zE")
- (?\$,1O](B "z")
- (?\$,1O^(B "zo")
- (?\$,1O_(B "zWa")
- (?\$,1O`(B "Ze")
- (?\$,1Oa(B "Zu")
- (?\$,1Ob(B "Zi")
- (?\$,1Oc(B "Za")
- (?\$,1Od(B "ZE")
- (?\$,1Oe(B "Z")
- (?\$,1Of(B "Zo")
- (?\$,1Og(B "ZWa")
- (?\$,1Oh(B "ye")
- (?\$,1Oi(B "yu")
- (?\$,1Oj(B "yi")
- (?\$,1Ok(B "ya")
- (?\$,1Ol(B "yE")
- (?\$,1Om(B "y")
- (?\$,1On(B "yo")
- (?\$,1Oo(B "yWa")
- (?\$,1Op(B "de")
- (?\$,1Oq(B "du")
- (?\$,1Or(B "di")
- (?\$,1Os(B "da")
- (?\$,1Ot(B "dE")
- (?\$,1Ou(B "d")
- (?\$,1Ov(B "do")
- (?\$,1Ow(B "dWa")
- (?\$,1Ox(B "De")
- (?\$,1Oy(B "Du")
- (?\$,1Oz(B "Di")
- (?\$,1O{(B "Da")
- (?\$,1O|(B "DE")
- (?\$,1O}(B "D")
- (?\$,1O~(B "Do")
- (?\$,1O(B "DWa")
- (?\$,1P (B "je")
- (?\$,1P!(B "ju")
- (?\$,1P"(B "ji")
- (?\$,1P#(B "ja")
- (?\$,1P$(B "jE")
- (?\$,1P%(B "j")
- (?\$,1P&(B "jo")
- (?\$,1P'(B "jWa")
- (?\$,1P((B "ga")
- (?\$,1P)(B "gu")
- (?\$,1P*(B "gi")
- (?\$,1P+(B "ga")
- (?\$,1P,(B "gE")
- (?\$,1P-(B "g")
- (?\$,1P.(B "go")
- (?\$,1P0(B "gWu")
- (?\$,1P2(B "gWi")
- (?\$,1P3(B "gWa")
- (?\$,1P4(B "gWE")
- (?\$,1P5(B "gW")
- (?\$,1P8(B "Ge")
- (?\$,1P9(B "Gu")
- (?\$,1P:(B "Gi")
- (?\$,1P;(B "Ga")
- (?\$,1P<(B "GE")
- (?\$,1P=(B "G")
- (?\$,1P>(B "Go")
- (?\$,1P?(B "GWa")
- (?\$,1P@(B "Te")
- (?\$,1PA(B "Tu")
- (?\$,1PB(B "Ti")
- (?\$,1PC(B "Ta")
- (?\$,1PD(B "TE")
- (?\$,1PE(B "T")
- (?\$,1PF(B "To")
- (?\$,1PG(B "TWa")
- (?\$,1PH(B "Ce")
- (?\$,1PI(B "Ca")
- (?\$,1PJ(B "Cu")
- (?\$,1PK(B "Ca")
- (?\$,1PL(B "CE")
- (?\$,1PM(B "C")
- (?\$,1PN(B "Co")
- (?\$,1PO(B "CWa")
- (?\$,1PP(B "Pe")
- (?\$,1PQ(B "Pu")
- (?\$,1PR(B "Pi")
- (?\$,1PS(B "Pa")
- (?\$,1PT(B "PE")
- (?\$,1PU(B "P")
- (?\$,1PV(B "Po")
- (?\$,1PW(B "PWa")
- (?\$,1PX(B "SWe")
- (?\$,1PY(B "SWu")
- (?\$,1PZ(B "SWi")
- (?\$,1P[(B "SWa")
- (?\$,1P\(B "SWE")
- (?\$,1P](B "SW")
- (?\$,1P^(B "SWo")
- (?\$,1P_(B "SWa")
- (?\$,1P`(B "`Sa")
- (?\$,1Pa(B "`Su")
- (?\$,1Pb(B "`Si")
- (?\$,1Pc(B "`Sa")
- (?\$,1Pd(B "`SE")
- (?\$,1Pe(B "`S")
- (?\$,1Pf(B "`So")
- (?\$,1Ph(B "fa")
- (?\$,1Pi(B "fu")
- (?\$,1Pj(B "fi")
- (?\$,1Pk(B "fa")
- (?\$,1Pl(B "fE")
- (?\$,1Pm(B "o")
- (?\$,1Pn(B "fo")
- (?\$,1Po(B "fWa")
- (?\$,1Pp(B "pe")
- (?\$,1Pq(B "pu")
- (?\$,1Pr(B "pi")
- (?\$,1Ps(B "pa")
- (?\$,1Pt(B "pE")
- (?\$,1Pu(B "p")
- (?\$,1Pv(B "po")
- (?\$,1Pw(B "pWa")
- (?\$,1Px(B "mYa")
- (?\$,1Py(B "rYa")
- (?\$,1Pz(B "fYa")
- (?\$,1Q (B " ")
- (?\$,1Q!(B ":")
- (?\$,1Q"(B "::")
- (?\$,1Q#(B ",")
- (?\$,1Q$(B ";")
- (?\$,1Q%(B "-:")
- (?\$,1Q&(B ":-")
- (?\$,1Q'(B "`?")
- (?\$,1Q((B ":|:")
- (?\$,1Q)(B "`1")
- (?\$,1Q*(B "`2")
- (?\$,1Q+(B "`3")
- (?\$,1Q,(B "`4")
- (?\$,1Q-(B "`5")
- (?\$,1Q.(B "`6")
- (?\$,1Q/(B "`7")
- (?\$,1Q0(B "`8")
- (?\$,1Q1(B "`9")
- (?\$,1Q2(B "`10")
- (?\$,1Q3(B "`20")
- (?\$,1Q4(B "`30")
- (?\$,1Q5(B "`40")
- (?\$,1Q6(B "`50")
- (?\$,1Q7(B "`60")
- (?\$,1Q8(B "`70")
- (?\$,1Q9(B "`80")
- (?\$,1Q:(B "`90")
- (?\$,1Q;(B "`100")
- (?\$,1Q<(B "`10000")
- (?\$,1m@(B "A-0")
- (?\$,1mA(B "a-0")
- (?\$,1mB(B "B.")
- (?\$,1mC(B "b.")
- (?\$,1mD(B "B-.")
- (?\$,1mE(B "b-.")
- (?\$,1mF(B "B_")
- (?\$,1mG(B "b_")
- (?\$,1mH(B "C,'")
- (?\$,1mI(B "c,'")
- (?\$,1mJ(B "D.")
- (?\$,1mK(B "d.")
- (?\$,1mL(B "D-.")
- (?\$,1mM(B "d-.")
- (?\$,1mN(B "D_")
- (?\$,1mO(B "d_")
- (?\$,1mP(B "D,")
- (?\$,1mQ(B "d,")
- (?\$,1mR(B "D->")
- (?\$,1mS(B "d->")
- (?\$,1mT(B "E-!")
- (?\$,1mU(B "e-!")
- (?\$,1mV(B "E-'")
- (?\$,1mW(B "e-'")
- (?\$,1mX(B "E->")
- (?\$,1mY(B "e->")
- (?\$,1mZ(B "E-?")
- (?\$,1m[(B "e-?")
- (?\$,1m\(B "E,(")
- (?\$,1m](B "e,(")
- (?\$,1m^(B "F.")
- (?\$,1m_(B "f.")
- (?\$,1m`(B "G-")
- (?\$,1ma(B "g-")
- (?\$,1mb(B "H.")
- (?\$,1mc(B "h.")
- (?\$,1md(B "H-.")
- (?\$,1me(B "h-.")
- (?\$,1mf(B "H:")
- (?\$,1mg(B "h:")
- (?\$,1mh(B "H,")
- (?\$,1mi(B "h,")
- (?\$,1mj(B "H-(")
- (?\$,1mk(B "h-(")
- (?\$,1ml(B "I-?")
- (?\$,1mm(B "i-?")
- (?\$,1mn(B "I:'")
- (?\$,1mo(B "i:'")
- (?\$,1mp(B "K'")
- (?\$,1mq(B "k'")
- (?\$,1mr(B "K-.")
- (?\$,1ms(B "k-.")
- (?\$,1mt(B "K_")
- (?\$,1mu(B "k_")
- (?\$,1mv(B "L-.")
- (?\$,1mw(B "l-.")
- (?\$,1mx(B "L--.")
- (?\$,1my(B "l--.")
- (?\$,1mz(B "L_")
- (?\$,1m{(B "l_")
- (?\$,1m|(B "L->")
- (?\$,1m}(B "l->")
- (?\$,1m~(B "M'")
- (?\$,1m(B "m'")
- (?\$,1n (B "M.")
- (?\$,1n!(B "m.")
- (?\$,1n"(B "M-.")
- (?\$,1n#(B "m-.")
- (?\$,1n$(B "N.")
- (?\$,1n%(B "n.")
- (?\$,1n&(B "N-.")
- (?\$,1n'(B "n-.")
- (?\$,1n((B "N_")
- (?\$,1n)(B "n_")
- (?\$,1n*(B "N->")
- (?\$,1n+(B "n->")
- (?\$,1n,(B "O?'")
- (?\$,1n-(B "o?'")
- (?\$,1n.(B "O?:")
- (?\$,1n/(B "o?:")
- (?\$,1n0(B "O-!")
- (?\$,1n1(B "o-!")
- (?\$,1n2(B "O-'")
- (?\$,1n3(B "o-'")
- (?\$,1n4(B "P'")
- (?\$,1n5(B "p'")
- (?\$,1n6(B "P.")
- (?\$,1n7(B "p.")
- (?\$,1n8(B "R.")
- (?\$,1n9(B "r.")
- (?\$,1n:(B "R-.")
- (?\$,1n;(B "r-.")
- (?\$,1n<(B "R--.")
- (?\$,1n=(B "r--.")
- (?\$,1n>(B "R_")
- (?\$,1n?(B "r_")
- (?\$,1n@(B "S.")
- (?\$,1nA(B "s.")
- (?\$,1nB(B "S-.")
- (?\$,1nC(B "s-.")
- (?\$,1nD(B "S'.")
- (?\$,1nE(B "s'.")
- (?\$,1nF(B "S<.")
- (?\$,1nG(B "s<.")
- (?\$,1nH(B "S.-.")
- (?\$,1nI(B "s.-.")
- (?\$,1nJ(B "T.")
- (?\$,1nK(B "t.")
- (?\$,1nL(B "T-.")
- (?\$,1nM(B "t-.")
- (?\$,1nN(B "T_")
- (?\$,1nO(B "t_")
- (?\$,1nP(B "T->")
- (?\$,1nQ(B "t->")
- (?\$,1nR(B "U--:")
- (?\$,1nS(B "u--:")
- (?\$,1nT(B "U-?")
- (?\$,1nU(B "u-?")
- (?\$,1nV(B "U->")
- (?\$,1nW(B "u->")
- (?\$,1nX(B "U?'")
- (?\$,1nY(B "u?'")
- (?\$,1nZ(B "U-:")
- (?\$,1n[(B "u-:")
- (?\$,1n\(B "V?")
- (?\$,1n](B "v?")
- (?\$,1n^(B "V-.")
- (?\$,1n_(B "v-.")
- (?\$,1n`(B "W!")
- (?\$,1na(B "w!")
- (?\$,1nb(B "W'")
- (?\$,1nc(B "w'")
- (?\$,1nd(B "W:")
- (?\$,1ne(B "w:")
- (?\$,1nf(B "W.")
- (?\$,1ng(B "w.")
- (?\$,1nh(B "W-.")
- (?\$,1ni(B "w-.")
- (?\$,1nj(B "X.")
- (?\$,1nk(B "x.")
- (?\$,1nl(B "X:")
- (?\$,1nm(B "x:")
- (?\$,1nn(B "Y.")
- (?\$,1no(B "y.")
- (?\$,1np(B "Z>")
- (?\$,1nq(B "z>")
- (?\$,1nr(B "Z-.")
- (?\$,1ns(B "z-.")
- (?\$,1nt(B "Z_")
- (?\$,1nu(B "z_")
- (?\$,1nv(B "h_")
- (?\$,1nw(B "t:")
- (?\$,1nx(B "w0")
- (?\$,1ny(B "y0")
- (?\$,1o (B "A-.")
- (?\$,1o!(B "a-.")
- (?\$,1o"(B "A2")
- (?\$,1o#(B "a2")
- (?\$,1o$(B "A>'")
- (?\$,1o%(B "a>'")
- (?\$,1o&(B "A>!")
- (?\$,1o'(B "a>!")
- (?\$,1o((B "A>2")
- (?\$,1o)(B "a>2")
- (?\$,1o*(B "A>?")
- (?\$,1o+(B "a>?")
- (?\$,1o,(B "A>-.")
- (?\$,1o-(B "a>-.")
- (?\$,1o.(B "A('")
- (?\$,1o/(B "a('")
- (?\$,1o0(B "A(!")
- (?\$,1o1(B "a(!")
- (?\$,1o2(B "A(2")
- (?\$,1o3(B "a(2")
- (?\$,1o4(B "A(?")
- (?\$,1o5(B "a(?")
- (?\$,1o6(B "A(-.")
- (?\$,1o7(B "a(-.")
- (?\$,1o8(B "E-.")
- (?\$,1o9(B "e-.")
- (?\$,1o:(B "E2")
- (?\$,1o;(B "e2")
- (?\$,1o<(B "E?")
- (?\$,1o=(B "e?")
- (?\$,1o>(B "E>'")
- (?\$,1o?(B "e>'")
- (?\$,1o@(B "E>!")
- (?\$,1oA(B "e>!")
- (?\$,1oB(B "E>2")
- (?\$,1oC(B "e>2")
- (?\$,1oD(B "E>?")
- (?\$,1oE(B "e>?")
- (?\$,1oF(B "E>-.")
- (?\$,1oG(B "e>-.")
- (?\$,1oH(B "I2")
- (?\$,1oI(B "i2")
- (?\$,1oJ(B "I-.")
- (?\$,1oK(B "i-.")
- (?\$,1oL(B "O-.")
- (?\$,1oM(B "o-.")
- (?\$,1oN(B "O2")
- (?\$,1oO(B "o2")
- (?\$,1oP(B "O>'")
- (?\$,1oQ(B "o>'")
- (?\$,1oR(B "O>!")
- (?\$,1oS(B "o>!")
- (?\$,1oT(B "O>2")
- (?\$,1oU(B "o>2")
- (?\$,1oV(B "O>?")
- (?\$,1oW(B "o>?")
- (?\$,1oX(B "O>-.")
- (?\$,1oY(B "o>-.")
- (?\$,1oZ(B "O9'")
- (?\$,1o[(B "o9'")
- (?\$,1o\(B "O9!")
- (?\$,1o](B "o9!")
- (?\$,1o^(B "O92")
- (?\$,1o_(B "o92")
- (?\$,1o`(B "O9?")
- (?\$,1oa(B "o9?")
- (?\$,1ob(B "O9-.")
- (?\$,1oc(B "o9-.")
- (?\$,1od(B "U-.")
- (?\$,1oe(B "u-.")
- (?\$,1of(B "U2")
- (?\$,1og(B "u2")
- (?\$,1oh(B "U9'")
- (?\$,1oi(B "u9'")
- (?\$,1oj(B "U9!")
- (?\$,1ok(B "u9!")
- (?\$,1ol(B "U92")
- (?\$,1om(B "u92")
- (?\$,1on(B "U9?")
- (?\$,1oo(B "u9?")
- (?\$,1op(B "U9-.")
- (?\$,1oq(B "u9-.")
- (?\$,1or(B "Y!")
- (?\$,1os(B "y!")
- (?\$,1ot(B "Y-.")
- (?\$,1ou(B "y-.")
- (?\$,1ov(B "Y2")
- (?\$,1ow(B "y2")
- (?\$,1ox(B "Y?")
- (?\$,1oy(B "y?")
- (?\$,1p (B "a")
- (?\$,1p!(B "ha")
- (?\$,1p"(B "`a")
- (?\$,1p#(B "h`a")
- (?\$,1p$(B "a'")
- (?\$,1p%(B "ha'")
- (?\$,1p&(B "a~")
- (?\$,1p'(B "ha~")
- (?\$,1p((B "A")
- (?\$,1p)(B "hA")
- (?\$,1p*(B "`A")
- (?\$,1p+(B "h`A")
- (?\$,1p,(B "A'")
- (?\$,1p-(B "hA'")
- (?\$,1p.(B "A~")
- (?\$,1p/(B "hA~")
- (?\$,1p1(B "he")
- (?\$,1p9(B "hE")
- (?\$,1pQ(B "hi")
- (?\$,1pY(B "hI")
- (?\$,1pa(B "ho")
- (?\$,1pi(B "hO")
- (?\$,1pq(B "hu")
- (?\$,1py(B "hU")
- (?\$,1q(B ",,")
- (?\$,1r (B "?*")
- (?\$,1r!(B "?:")
- (?\$,1r-(B ",!")
- (?\$,1r.(B ",'")
- (?\$,1r/(B "?,")
- (?\$,1r=(B ";!")
- (?\$,1r>(B ";'")
- (?\$,1r?(B "?;")
- (?\$,1rE(B "rh")
- (?\$,1rL(B "Rh")
- (?\$,1rM(B "!:")
- (?\$,1rO(B "!*")
- (?\$,1r^(B ";;")
- (?\$,1r`(B " ")
- (?\$,1ra(B " ")
- (?\$,1rb(B " ")
- (?\$,1rc(B " ")
- (?\$,1rd(B " ")
- (?\$,1re(B " ")
- (?\$,1rf(B " ")
- (?\$,1rg(B ",A (B")
- (?\$,1rh(B " ")
- (?\$,1ri(B " ")
- (?\$,1rp(B "-")
- (?\$,1rq(B "-")
- (?\$,1rs(B "-")
- (?\$,1rt(B "--")
- (?\$,1ru(B "-")
- (?\$,1rv(B "||")
- (?\$,1rw(B "=2")
- (?\$,1rx(B "`")
- (?\$,1ry(B "'")
- (?\$,1rz(B "'")
- (?\$,1r{(B "'")
- (?\$,1r|(B "\"")
- (?\$,1r}(B "\"")
- (?\$,1r~(B "\"")
- (?\$,1r(B "\"")
- (?\$,1s (B "/-")
- (?\$,1s!(B "/=")
- (?\$,1s"(B " o ")
- (?\$,1s$(B ".")
- (?\$,1s%(B "..")
- (?\$,1s&(B "...")
- (?\$,1s'(B ",A7(B")
- (?\$,1s0(B " 0/00")
- (?\$,1s2(B "'")
- (?\$,1s3(B "''")
- (?\$,1s4(B "'''")
- (?\$,1s5(B "`")
- (?\$,1s6(B "``")
- (?\$,1s7(B "```")
- (?\$,1s8(B "Ca")
- (?\$,1s9(B "<")
- (?\$,1s:(B ">")
- (?\$,1s;(B ":X")
- (?\$,1s<(B "!!")
- (?\$,1s>(B "'-")
- (?\$,1sC(B "-")
- (?\$,1sD(B "/")
- (?\$,1sH(B "?!")
- (?\$,1sI(B "!?")
- (?\$,1sp(B "^0")
- (?\$,1st(B "^4")
- (?\$,1su(B "^5")
- (?\$,1sv(B "^6")
- (?\$,1sw(B "^7")
- (?\$,1sx(B "^8")
- (?\$,1sy(B "^9")
- (?\$,1sz(B "^+")
- (?\$,1s{(B "^-")
- (?\$,1s|(B "^=")
- (?\$,1s}(B "^(")
- (?\$,1s~(B "^)")
- (?\$,1s(B "^n")
- (?\$,1t (B "_0")
- (?\$,1t!(B "_1")
- (?\$,1t"(B "_2")
- (?\$,1t#(B "_3")
- (?\$,1t$(B "_4")
- (?\$,1t%(B "_5")
- (?\$,1t&(B "_6")
- (?\$,1t'(B "_7")
- (?\$,1t((B "_8")
- (?\$,1t)(B "_9")
- (?\$,1t*(B "_+")
- (?\$,1t+(B "_-")
- (?\$,1t,(B "_=")
- (?\$,1t-(B "(")
- (?\$,1t.(B ")")
- (?\$,1tC(B "Ff")
- (?\$,1tD(B "Li")
- (?\$,1tG(B "Pt")
- (?\$,1tI(B "W=")
- (?\$,1tL(B "EUR")
- (?\$,1u@(B "a/c")
- (?\$,1uA(B "a/s")
- (?\$,1uC(B "oC")
- (?\$,1uE(B "c/o")
- (?\$,1uF(B "c/u")
- (?\$,1uI(B "oF")
- (?\$,1uJ(B "g")
- (?\$,1uN(B "h")
- (?\$,1uO(B "\\hbar")
- (?\$,1uQ(B "Im")
- (?\$,1uS(B "l")
- (?\$,1uV(B "No.")
- (?\$,1uW(B "PO")
- (?\$,1uX(B "P")
- (?\$,1u\(B "Re")
- (?\$,1u^(B "Rx")
- (?\$,1u`(B "(SM)")
- (?\$,1ua(B "TEL")
- (?\$,1ub(B "(TM)")
- (?\$,1uf(B "Ohm")
- (?\$,1uj(B "K")
- (?\$,1uk(B "Ang.")
- (?\$,1un(B "est.")
- (?\$,1ut(B "o")
- (?\$,1uu(B "Aleph ")
- (?\$,1uv(B "Bet ")
- (?\$,1uw(B "Gimel ")
- (?\$,1ux(B "Dalet ")
- (?\$,1v3(B " 1/3")
- (?\$,1v4(B " 2/3")
- (?\$,1v5(B " 1/5")
- (?\$,1v6(B " 2/5")
- (?\$,1v7(B " 3/5")
- (?\$,1v8(B " 4/5")
- (?\$,1v9(B " 1/6")
- (?\$,1v:(B " 5/6")
- (?\$,1v;(B " 1/8")
- (?\$,1v<(B " 3/8")
- (?\$,1v=(B " 5/8")
- (?\$,1v>(B " 7/8")
- (?\$,1v?(B " 1/")
- (?\$,1v@(B "I")
- (?\$,1vA(B "II")
- (?\$,1vB(B "III")
- (?\$,1vC(B "IV")
- (?\$,1vD(B "V")
- (?\$,1vE(B "VI")
- (?\$,1vF(B "VII")
- (?\$,1vG(B "VIII")
- (?\$,1vH(B "IX")
- (?\$,1vI(B "X")
- (?\$,1vJ(B "XI")
- (?\$,1vK(B "XII")
- (?\$,1vL(B "L")
- (?\$,1vM(B "C")
- (?\$,1vN(B "D")
- (?\$,1vO(B "M")
- (?\$,1vP(B "i")
- (?\$,1vQ(B "ii")
- (?\$,1vR(B "iii")
- (?\$,1vS(B "iv")
- (?\$,1vT(B "v")
- (?\$,1vU(B "vi")
- (?\$,1vV(B "vii")
- (?\$,1vW(B "viii")
- (?\$,1vX(B "ix")
- (?\$,1vY(B "x")
- (?\$,1vZ(B "xi")
- (?\$,1v[(B "xii")
- (?\$,1v\(B "l")
- (?\$,1v](B "c")
- (?\$,1v^(B "d")
- (?\$,1v_(B "m")
- (?\$,1v`(B "1000RCD")
- (?\$,1va(B "5000R")
- (?\$,1vb(B "10000R")
- (?\$,1vp(B "<-")
- (?\$,1vq(B "-^")
- (?\$,1vr(B "->")
- (?\$,1vs(B "-v")
- (?\$,1vt(B "<->")
- (?\$,1vu(B "UD")
- (?\$,1vv(B "<!!")
- (?\$,1vw(B "//>")
- (?\$,1vx(B "!!>")
- (?\$,1vy(B "<//")
- (?\$,1w((B "UD-")
- (?\$,1w5(B "RET")
- (?\$,1w@(B ">V")
- (?\$,1wP(B "<=")
- (?\$,1wQ(B "^^")
- (?\$,1wR(B "=>")
- (?\$,1wS(B "vv")
- (?\$,1wT(B "<=>")
- (?\$,1x (B "FA")
- (?\$,1x"(B "\\partial")
- (?\$,1x#(B "TE")
- (?\$,1x%(B "{}")
- (?\$,1x&(B "Delta")
- (?\$,1x'(B "Nabla")
- (?\$,1x((B "(-")
- (?\$,1x)(B "!(-")
- (?\$,1x*(B "(-")
- (?\$,1x+(B "-)")
- (?\$,1x,(B "!-)")
- (?\$,1x-(B "-)")
- (?\$,1x.(B " qed")
- (?\$,1x/(B "\\prod")
- (?\$,1x1(B "\\sum")
- (?\$,1x2(B " -")
- (?\$,1x3(B "-/+")
- (?\$,1x4(B ".+")
- (?\$,1x5(B "/")
- (?\$,1x6(B " - ")
- (?\$,1x7(B "*")
- (?\$,1x8(B " ,A0(B ")
- (?\$,1x9(B "sb")
- (?\$,1x:(B " SQRT ")
- (?\$,1x;(B " ROOT,A3(B ")
- (?\$,1x<(B " ROOT4 ")
- (?\$,1x=(B "0(")
- (?\$,1x>(B "infty")
- (?\$,1x?(B "-L")
- (?\$,1x@(B "-V")
- (?\$,1xE(B "PP")
- (?\$,1xF(B " !PP ")
- (?\$,1xG(B "AND")
- (?\$,1xH(B "OR")
- (?\$,1xI(B "(U")
- (?\$,1xJ(B ")U")
- (?\$,1xK(B "\int ")
- (?\$,1xL(B "DI")
- (?\$,1xN(B "Io")
- (?\$,1xT(B ".:")
- (?\$,1xU(B ":.")
- (?\$,1xV(B ":R")
- (?\$,1xW(B "::")
- (?\$,1x\(B "?1")
- (?\$,1x^(B "CG")
- (?\$,1xc(B "?-")
- (?\$,1xe(B "?=")
- (?\$,1xh(B "~=")
- (?\$,1xi(B " !~= ")
- (?\$,1xl(B "=?")
- (?\$,1xs(B "HI")
- (?\$,1xt(B ":=")
- (?\$,1xu(B "=:")
- (?\$,1y (B "!=")
- (?\$,1y!(B "=3")
- (?\$,1y"(B " !=3 ")
- (?\$,1y$(B "=<")
- (?\$,1y%(B ">=")
- (?\$,1y&(B ".LE.")
- (?\$,1y'(B ".GE.")
- (?\$,1y((B ".LT.NOT.EQ.")
- (?\$,1y)(B ".GT.NOT.EQ.")
- (?\$,1y*(B "<<")
- (?\$,1y+(B ">>")
- (?\$,1y.(B "!<")
- (?\$,1y/(B "!>")
- (?\$,1y6(B " <> ")
- (?\$,1y7(B " >< ")
- (?\$,1yB(B "(C")
- (?\$,1yC(B ")C")
- (?\$,1yD(B " !(C ")
- (?\$,1yE(B " !)C ")
- (?\$,1yF(B "(_")
- (?\$,1yG(B ")_")
- (?\$,1yU(B "(+)")
- (?\$,1yV(B "(-)")
- (?\$,1yW(B "(,AW(B)")
- (?\$,1yX(B "(/)")
- (?\$,1yY(B "(,A7(B)")
- (?\$,1yZ(B "(,A0(B)")
- (?\$,1y[(B "(*)")
- (?\$,1y\(B "(=)")
- (?\$,1y](B "(-)")
- (?\$,1y^(B "[+]")
- (?\$,1y_(B "[-]")
- (?\$,1y`(B "[,AW(B]")
- (?\$,1ya(B "[,A7(B]")
- (?\$,1ye(B "-T")
- (?\$,1yg(B " MODELS ")
- (?\$,1yh(B " TRUE ")
- (?\$,1yi(B " FORCES ")
- (?\$,1yl(B " !PROVES ")
- (?\$,1ym(B " NOT TRUE ")
- (?\$,1yn(B " !FORCES ")
- (?\$,1yr(B " NORMAL SUBGROUP OF ")
- (?\$,1ys(B " CONTAINS AS NORMAL SUBGROUP ")
- (?\$,1yt(B " NORMAL SUBGROUP OF OR EQUAL TO ")
- (?\$,1yu(B " CONTAINS AS NORMAL SUBGROUP OR EQUAL TO ")
- (?\$,1yx(B " MULTIMAP ")
- (?\$,1yz(B " INTERCALATE ")
- (?\$,1y{(B " XOR ")
- (?\$,1y|(B " NAND ")
- (?\$,1z%(B " ,A7(B ")
- (?\$,1z6(B "<.")
- (?\$,1z7(B ">.")
- (?\$,1z8(B "<<<")
- (?\$,1z9(B ">>>")
- (?\$,1zN(B ":3")
- (?\$,1zO(B ".3")
- (?\$,1zb(B "Eh")
- (?\$,1zg(B "~~")
- (?\$,1zh(B "<7")
- (?\$,1zi(B ">7")
- (?\$,1zj(B "7<")
- (?\$,1zk(B "7>")
- (?\$,1zp(B "NI")
- (?\$,1zr(B "(A")
- (?\$,1zu(B "TR")
- (?\$,1zx(B "88")
- (?\$,1{ (B "Iu")
- (?\$,1{!(B "Il")
- (?\$,1{"(B ":(")
- (?\$,1{#(B ":)")
- (?\$,1{$(B "|^|")
- (?\$,1{'(B "[X]")
- (?\$,1{)(B "</")
- (?\$,1{*(B "/>")
- (?\$,1}c(B "Vs")
- (?\$,1~ (B "1h")
- (?\$,1~!(B "3h")
- (?\$,1~"(B "2h")
- (?\$,1~#(B "4h")
- (?\$,1~&(B "1j")
- (?\$,1~'(B "2j")
- (?\$,1~((B "3j")
- (?\$,1~)(B "4j")
- (?\$,1~@(B "1-o")
- (?\$,1~A(B "2-o")
- (?\$,1~B(B "3-o")
- (?\$,1~C(B "4-o")
- (?\$,1~D(B "5-o")
- (?\$,1~E(B "6-o")
- (?\$,1~F(B "7-o")
- (?\$,1~G(B "8-o")
- (?\$,1~H(B "9-o")
- (?\$,1~I(B "10-o")
- (?\$,1~J(B "11-o")
- (?\$,1~K(B "12-o")
- (?\$,1~L(B "13-o")
- (?\$,1~M(B "14-o")
- (?\$,1~N(B "15-o")
- (?\$,1~O(B "16-o")
- (?\$,1~P(B "17-o")
- (?\$,1~Q(B "18-o")
- (?\$,1~R(B "19-o")
- (?\$,1~S(B "20-o")
- (?\$,1~T(B "(1)")
- (?\$,1~U(B "(2)")
- (?\$,1~V(B "(3)")
- (?\$,1~W(B "(4)")
- (?\$,1~X(B "(5)")
- (?\$,1~Y(B "(6)")
- (?\$,1~Z(B "(7)")
- (?\$,1~[(B "(8)")
- (?\$,1~\(B "(9)")
- (?\$,1~](B "(10)")
- (?\$,1~^(B "(11)")
- (?\$,1~_(B "(12)")
- (?\$,1~`(B "(13)")
- (?\$,1~a(B "(14)")
- (?\$,1~b(B "(15)")
- (?\$,1~c(B "(16)")
- (?\$,1~d(B "(17)")
- (?\$,1~e(B "(18)")
- (?\$,1~f(B "(19)")
- (?\$,1~g(B "(20)")
- (?\$,1~h(B "1.")
- (?\$,1~i(B "2.")
- (?\$,1~j(B "3.")
- (?\$,1~k(B "4.")
- (?\$,1~l(B "5.")
- (?\$,1~m(B "6.")
- (?\$,1~n(B "7.")
- (?\$,1~o(B "8.")
- (?\$,1~p(B "9.")
- (?\$,1~q(B "10.")
- (?\$,1~r(B "11.")
- (?\$,1~s(B "12.")
- (?\$,1~t(B "13.")
- (?\$,1~u(B "14.")
- (?\$,1~v(B "15.")
- (?\$,1~w(B "16.")
- (?\$,1~x(B "17.")
- (?\$,1~y(B "18.")
- (?\$,1~z(B "19.")
- (?\$,1~{(B "20.")
- (?\$,1~|(B "(a)")
- (?\$,1~}(B "(b)")
- (?\$,1~~(B "(c)")
- (?\$,1~(B "(d)")
- (?\$,1 (B "(e)")
- (?\$,1!(B "(f)")
- (?\$,1"(B "(g)")
- (?\$,1#(B "(h)")
- (?\$,1$(B "(i)")
- (?\$,1%(B "(j)")
- (?\$,1&(B "(k)")
- (?\$,1'(B "(l)")
- (?\$,1((B "(m)")
- (?\$,1)(B "(n)")
- (?\$,1*(B "(o)")
- (?\$,1+(B "(p)")
- (?\$,1,(B "(q)")
- (?\$,1-(B "(r)")
- (?\$,1.(B "(s)")
- (?\$,1/(B "(t)")
- (?\$,10(B "(u)")
- (?\$,11(B "(v)")
- (?\$,12(B "(w)")
- (?\$,13(B "(x)")
- (?\$,14(B "(y)")
- (?\$,15(B "(z)")
- (?\$,16(B "A-o")
- (?\$,17(B "B-o")
- (?\$,18(B "C-o")
- (?\$,19(B "D-o")
- (?\$,1:(B "E-o")
- (?\$,1;(B "F-o")
- (?\$,1<(B "G-o")
- (?\$,1=(B "H-o")
- (?\$,1>(B "I-o")
- (?\$,1?(B "J-o")
- (?\$,1@(B "K-o")
- (?\$,1A(B "L-o")
- (?\$,1B(B "M-o")
- (?\$,1C(B "N-o")
- (?\$,1D(B "O-o")
- (?\$,1E(B "P-o")
- (?\$,1F(B "Q-o")
- (?\$,1G(B "R-o")
- (?\$,1H(B "S-o")
- (?\$,1I(B "T-o")
- (?\$,1J(B "U-o")
- (?\$,1K(B "V-o")
- (?\$,1L(B "W-o")
- (?\$,1M(B "X-o")
- (?\$,1N(B "Y-o")
- (?\$,1O(B "Z-o")
- (?\$,1P(B "a-o")
- (?\$,1Q(B "b-o")
- (?\$,1R(B "c-o")
- (?\$,1S(B "d-o")
- (?\$,1T(B "e-o")
- (?\$,1U(B "f-o")
- (?\$,1V(B "g-o")
- (?\$,1W(B "h-o")
- (?\$,1X(B "i-o")
- (?\$,1Y(B "j-o")
- (?\$,1Z(B "k-o")
- (?\$,1[(B "l-o")
- (?\$,1\(B "m-o")
- (?\$,1](B "n-o")
- (?\$,1^(B "o-o")
- (?\$,1_(B "p-o")
- (?\$,1`(B "q-o")
- (?\$,1a(B "r-o")
- (?\$,1b(B "s-o")
- (?\$,1c(B "t-o")
- (?\$,1d(B "u-o")
- (?\$,1e(B "v-o")
- (?\$,1f(B "w-o")
- (?\$,1g(B "x-o")
- (?\$,1h(B "y-o")
- (?\$,1i(B "z-o")
- (?\$,1j(B "0-o")
- (?\$,2 (B "-")
- (?\$,2 !(B "=")
- (?\$,2 "(B "|")
- (?\$,2 #(B "|")
- (?\$,2 $(B "-")
- (?\$,2 %(B "=")
- (?\$,2 &(B "|")
- (?\$,2 '(B "|")
- (?\$,2 ((B "-")
- (?\$,2 )(B "=")
- (?\$,2 *(B "|")
- (?\$,2 +(B "|")
- (?\$,2 ,(B "+")
- (?\$,2 -(B "+")
- (?\$,2 .(B "+")
- (?\$,2 /(B "+")
- (?\$,2 0(B "+")
- (?\$,2 1(B "+")
- (?\$,2 2(B "+")
- (?\$,2 3(B "+")
- (?\$,2 4(B "+")
- (?\$,2 5(B "+")
- (?\$,2 6(B "+")
- (?\$,2 7(B "+")
- (?\$,2 8(B "+")
- (?\$,2 9(B "+")
- (?\$,2 :(B "+")
- (?\$,2 ;(B "+")
- (?\$,2 <(B "+")
- (?\$,2 =(B "+")
- (?\$,2 >(B "+")
- (?\$,2 ?(B "+")
- (?\$,2 @(B "+")
- (?\$,2 A(B "+")
- (?\$,2 B(B "+")
- (?\$,2 C(B "+")
- (?\$,2 D(B "+")
- (?\$,2 E(B "+")
- (?\$,2 F(B "+")
- (?\$,2 G(B "+")
- (?\$,2 H(B "+")
- (?\$,2 I(B "+")
- (?\$,2 J(B "+")
- (?\$,2 K(B "+")
- (?\$,2 L(B "+")
- (?\$,2 M(B "+")
- (?\$,2 N(B "+")
- (?\$,2 O(B "+")
- (?\$,2 P(B "+")
- (?\$,2 Q(B "+")
- (?\$,2 R(B "+")
- (?\$,2 S(B "+")
- (?\$,2 T(B "+")
- (?\$,2 U(B "+")
- (?\$,2 V(B "+")
- (?\$,2 W(B "+")
- (?\$,2 X(B "+")
- (?\$,2 Y(B "+")
- (?\$,2 Z(B "+")
- (?\$,2 [(B "+")
- (?\$,2 \(B "+")
- (?\$,2 ](B "+")
- (?\$,2 ^(B "+")
- (?\$,2 _(B "+")
- (?\$,2 `(B "+")
- (?\$,2 a(B "+")
- (?\$,2 b(B "+")
- (?\$,2 c(B "+")
- (?\$,2 d(B "+")
- (?\$,2 e(B "+")
- (?\$,2 f(B "+")
- (?\$,2 g(B "+")
- (?\$,2 h(B "+")
- (?\$,2 i(B "+")
- (?\$,2 j(B "+")
- (?\$,2 k(B "+")
- (?\$,2 l(B "+")
- (?\$,2 m(B "+")
- (?\$,2 n(B "+")
- (?\$,2 o(B "+")
- (?\$,2 p(B "+")
- (?\$,2 q(B "+")
- (?\$,2 r(B "+")
- (?\$,2 s(B "+")
- (?\$,2 t(B "+")
- (?\$,2 u(B "+")
- (?\$,2 v(B "+")
- (?\$,2 w(B "+")
- (?\$,2 x(B "+")
- (?\$,2 y(B "+")
- (?\$,2 z(B "+")
- (?\$,2 {(B "+")
- (?\$,2 |(B "+")
- (?\$,2 }(B "+")
- (?\$,2 ~(B "+")
- (?\$,2 (B "+")
- (?\$,2! (B "+")
- (?\$,2!!(B "+")
- (?\$,2!"(B "+")
- (?\$,2!#(B "+")
- (?\$,2!$(B "+")
- (?\$,2!%(B "+")
- (?\$,2!&(B "+")
- (?\$,2!'(B "+")
- (?\$,2!((B "+")
- (?\$,2!)(B "+")
- (?\$,2!*(B "+")
- (?\$,2!+(B "+")
- (?\$,2!,(B "+")
- (?\$,2!1(B "/")
- (?\$,2!2(B "\\")
- (?\$,2!@(B "TB")
- (?\$,2!D(B "LB")
- (?\$,2!H(B "FB")
- (?\$,2!L(B "lB")
- (?\$,2!P(B "RB")
- (?\$,2!Q(B ".S")
- (?\$,2!R(B ":S")
- (?\$,2!S(B "?S")
- (?\$,2!`(B "fS")
- (?\$,2!a(B "OS")
- (?\$,2!b(B "RO")
- (?\$,2!c(B "Rr")
- (?\$,2!d(B "RF")
- (?\$,2!e(B "RY")
- (?\$,2!f(B "RH")
- (?\$,2!g(B "RZ")
- (?\$,2!h(B "RK")
- (?\$,2!i(B "RX")
- (?\$,2!j(B "sB")
- (?\$,2!l(B "SR")
- (?\$,2!m(B "Or")
- (?\$,2!r(B "^")
- (?\$,2!s(B "uT")
- (?\$,2!v(B "|>")
- (?\$,2!w(B "Tr")
- (?\$,2!z(B "|>")
- (?\$,2!|(B "v")
- (?\$,2!}(B "dT")
- (?\$,2" (B "<|")
- (?\$,2"!(B "Tl")
- (?\$,2"$(B "<|")
- (?\$,2"&(B "Db")
- (?\$,2"'(B "Dw")
- (?\$,2"*(B "LZ")
- (?\$,2"+(B "0m")
- (?\$,2".(B "0o")
- (?\$,2"/(B "0M")
- (?\$,2"0(B "0L")
- (?\$,2"1(B "0R")
- (?\$,2"8(B "Sn")
- (?\$,2"9(B "Ic")
- (?\$,2"B(B "Fd")
- (?\$,2"C(B "Bd")
- (?\$,2"O(B "Ci")
- (?\$,2"e(B "*2")
- (?\$,2"f(B "*1")
- (?\$,2"n(B "TEL")
- (?\$,2"o(B "tel")
- (?\$,2"|(B "<--")
- (?\$,2"~(B "-->")
- (?\$,2#!(B "CAUTION ")
- (?\$,2#'(B "XP")
- (?\$,2#9(B ":-(")
- (?\$,2#:(B ":-)")
- (?\$,2#;(B "(-:")
- (?\$,2#<(B "SU")
- (?\$,2#@(B "f.")
- (?\$,2#B(B "m.")
- (?\$,2#`(B "cS")
- (?\$,2#a(B "cH")
- (?\$,2#b(B "cD")
- (?\$,2#c(B "cC")
- (?\$,2#d(B "cS-")
- (?\$,2#e(B "cH-")
- (?\$,2#f(B "cD-")
- (?\$,2#g(B "cC-")
- (?\$,2#i(B "Md")
- (?\$,2#j(B "M8")
- (?\$,2#k(B "M2")
- (?\$,2#l(B "M16")
- (?\$,2#m(B "b")
- (?\$,2#n(B "Mx")
- (?\$,2#o(B "#")
- (?\$,2%S(B "X")
- (?\$,2%W(B "X")
- (?\$,2%`(B "-X")
- (?\$,2=@(B " ")
- (?\$,2=A(B ",_")
- (?\$,2=B(B "._")
- (?\$,2=C(B "+\"")
- (?\$,2=D(B "JIS")
- (?\$,2=E(B "*_")
- (?\$,2=F(B ";_")
- (?\$,2=G(B "0_")
- (?\$,2=J(B "<+")
- (?\$,2=K(B ">+")
- (?\$,2=L(B "<'")
- (?\$,2=M(B ">'")
- (?\$,2=N(B "<\"")
- (?\$,2=O(B ">\"")
- (?\$,2=P(B "(\"")
- (?\$,2=Q(B ")\"")
- (?\$,2=R(B "=T")
- (?\$,2=S(B "=_")
- (?\$,2=T(B "('")
- (?\$,2=U(B ")'")
- (?\$,2=V(B "(I")
- (?\$,2=W(B ")I")
- (?\$,2=Z(B "[[")
- (?\$,2=[(B "]]")
- (?\$,2=\(B "-?")
- (?\$,2=`(B "=T:)")
- (?\$,2=(B " ")
- (?\$,2>!(B "A5")
- (?\$,2>"(B "a5")
- (?\$,2>#(B "I5")
- (?\$,2>$(B "i5")
- (?\$,2>%(B "U5")
- (?\$,2>&(B "u5")
- (?\$,2>'(B "E5")
- (?\$,2>((B "e5")
- (?\$,2>)(B "O5")
- (?\$,2>*(B "o5")
- (?\$,2>+(B "ka")
- (?\$,2>,(B "ga")
- (?\$,2>-(B "ki")
- (?\$,2>.(B "gi")
- (?\$,2>/(B "ku")
- (?\$,2>0(B "gu")
- (?\$,2>1(B "ke")
- (?\$,2>2(B "ge")
- (?\$,2>3(B "ko")
- (?\$,2>4(B "go")
- (?\$,2>5(B "sa")
- (?\$,2>6(B "za")
- (?\$,2>7(B "si")
- (?\$,2>8(B "zi")
- (?\$,2>9(B "su")
- (?\$,2>:(B "zu")
- (?\$,2>;(B "se")
- (?\$,2><(B "ze")
- (?\$,2>=(B "so")
- (?\$,2>>(B "zo")
- (?\$,2>?(B "ta")
- (?\$,2>@(B "da")
- (?\$,2>A(B "ti")
- (?\$,2>B(B "di")
- (?\$,2>C(B "tU")
- (?\$,2>D(B "tu")
- (?\$,2>E(B "du")
- (?\$,2>F(B "te")
- (?\$,2>G(B "de")
- (?\$,2>H(B "to")
- (?\$,2>I(B "do")
- (?\$,2>J(B "na")
- (?\$,2>K(B "ni")
- (?\$,2>L(B "nu")
- (?\$,2>M(B "ne")
- (?\$,2>N(B "no")
- (?\$,2>O(B "ha")
- (?\$,2>P(B "ba")
- (?\$,2>Q(B "pa")
- (?\$,2>R(B "hi")
- (?\$,2>S(B "bi")
- (?\$,2>T(B "pi")
- (?\$,2>U(B "hu")
- (?\$,2>V(B "bu")
- (?\$,2>W(B "pu")
- (?\$,2>X(B "he")
- (?\$,2>Y(B "be")
- (?\$,2>Z(B "pe")
- (?\$,2>[(B "ho")
- (?\$,2>\(B "bo")
- (?\$,2>](B "po")
- (?\$,2>^(B "ma")
- (?\$,2>_(B "mi")
- (?\$,2>`(B "mu")
- (?\$,2>a(B "me")
- (?\$,2>b(B "mo")
- (?\$,2>c(B "yA")
- (?\$,2>d(B "ya")
- (?\$,2>e(B "yU")
- (?\$,2>f(B "yu")
- (?\$,2>g(B "yO")
- (?\$,2>h(B "yo")
- (?\$,2>i(B "ra")
- (?\$,2>j(B "ri")
- (?\$,2>k(B "ru")
- (?\$,2>l(B "re")
- (?\$,2>m(B "ro")
- (?\$,2>n(B "wA")
- (?\$,2>o(B "wa")
- (?\$,2>p(B "wi")
- (?\$,2>q(B "we")
- (?\$,2>r(B "wo")
- (?\$,2>s(B "n5")
- (?\$,2>t(B "vu")
- (?\$,2>{(B "\"5")
- (?\$,2>|(B "05")
- (?\$,2>}(B "*5")
- (?\$,2>~(B "+5")
- (?\$,2?!(B "a6")
- (?\$,2?"(B "A6")
- (?\$,2?#(B "i6")
- (?\$,2?$(B "I6")
- (?\$,2?%(B "u6")
- (?\$,2?&(B "U6")
- (?\$,2?'(B "e6")
- (?\$,2?((B "E6")
- (?\$,2?)(B "o6")
- (?\$,2?*(B "O6")
- (?\$,2?+(B "Ka")
- (?\$,2?,(B "Ga")
- (?\$,2?-(B "Ki")
- (?\$,2?.(B "Gi")
- (?\$,2?/(B "Ku")
- (?\$,2?0(B "Gu")
- (?\$,2?1(B "Ke")
- (?\$,2?2(B "Ge")
- (?\$,2?3(B "Ko")
- (?\$,2?4(B "Go")
- (?\$,2?5(B "Sa")
- (?\$,2?6(B "Za")
- (?\$,2?7(B "Si")
- (?\$,2?8(B "Zi")
- (?\$,2?9(B "Su")
- (?\$,2?:(B "Zu")
- (?\$,2?;(B "Se")
- (?\$,2?<(B "Ze")
- (?\$,2?=(B "So")
- (?\$,2?>(B "Zo")
- (?\$,2??(B "Ta")
- (?\$,2?@(B "Da")
- (?\$,2?A(B "Ti")
- (?\$,2?B(B "Di")
- (?\$,2?C(B "TU")
- (?\$,2?D(B "Tu")
- (?\$,2?E(B "Du")
- (?\$,2?F(B "Te")
- (?\$,2?G(B "De")
- (?\$,2?H(B "To")
- (?\$,2?I(B "Do")
- (?\$,2?J(B "Na")
- (?\$,2?K(B "Ni")
- (?\$,2?L(B "Nu")
- (?\$,2?M(B "Ne")
- (?\$,2?N(B "No")
- (?\$,2?O(B "Ha")
- (?\$,2?P(B "Ba")
- (?\$,2?Q(B "Pa")
- (?\$,2?R(B "Hi")
- (?\$,2?S(B "Bi")
- (?\$,2?T(B "Pi")
- (?\$,2?U(B "Hu")
- (?\$,2?V(B "Bu")
- (?\$,2?W(B "Pu")
- (?\$,2?X(B "He")
- (?\$,2?Y(B "Be")
- (?\$,2?Z(B "Pe")
- (?\$,2?[(B "Ho")
- (?\$,2?\(B "Bo")
- (?\$,2?](B "Po")
- (?\$,2?^(B "Ma")
- (?\$,2?_(B "Mi")
- (?\$,2?`(B "Mu")
- (?\$,2?a(B "Me")
- (?\$,2?b(B "Mo")
- (?\$,2?c(B "YA")
- (?\$,2?d(B "Ya")
- (?\$,2?e(B "YU")
- (?\$,2?f(B "Yu")
- (?\$,2?g(B "YO")
- (?\$,2?h(B "Yo")
- (?\$,2?i(B "Ra")
- (?\$,2?j(B "Ri")
- (?\$,2?k(B "Ru")
- (?\$,2?l(B "Re")
- (?\$,2?m(B "Ro")
- (?\$,2?n(B "WA")
- (?\$,2?o(B "Wa")
- (?\$,2?p(B "Wi")
- (?\$,2?q(B "We")
- (?\$,2?r(B "Wo")
- (?\$,2?s(B "N6")
- (?\$,2?t(B "Vu")
- (?\$,2?u(B "KA")
- (?\$,2?v(B "KE")
- (?\$,2?w(B "Va")
- (?\$,2?x(B "Vi")
- (?\$,2?y(B "Ve")
- (?\$,2?z(B "Vo")
- (?\$,2?{(B ".6")
- (?\$,2?|(B "-6")
- (?\$,2?}(B "*6")
- (?\$,2?~(B "+6")
- (?\$,2@%(B "b4")
- (?\$,2@&(B "p4")
- (?\$,2@'(B "m4")
- (?\$,2@((B "f4")
- (?\$,2@)(B "d4")
- (?\$,2@*(B "t4")
- (?\$,2@+(B "n4")
- (?\$,2@,(B "l4")
- (?\$,2@-(B "g4")
- (?\$,2@.(B "k4")
- (?\$,2@/(B "h4")
- (?\$,2@0(B "j4")
- (?\$,2@1(B "q4")
- (?\$,2@2(B "x4")
- (?\$,2@3(B "zh")
- (?\$,2@4(B "ch")
- (?\$,2@5(B "sh")
- (?\$,2@6(B "r4")
- (?\$,2@7(B "z4")
- (?\$,2@8(B "c4")
- (?\$,2@9(B "s4")
- (?\$,2@:(B "a4")
- (?\$,2@;(B "o4")
- (?\$,2@<(B "e4")
- (?\$,2@=(B "eh4")
- (?\$,2@>(B "ai")
- (?\$,2@?(B "ei")
- (?\$,2@@(B "au")
- (?\$,2@A(B "ou")
- (?\$,2@B(B "an")
- (?\$,2@C(B "en")
- (?\$,2@D(B "aN")
- (?\$,2@E(B "eN")
- (?\$,2@F(B "er")
- (?\$,2@G(B "i4")
- (?\$,2@H(B "u4")
- (?\$,2@I(B "iu")
- (?\$,2@J(B "v4")
- (?\$,2@K(B "nG")
- (?\$,2@L(B "gn")
- (?\$,2B|(B "(JU)")
- (?\$,2C (B "1c")
- (?\$,2C!(B "2c")
- (?\$,2C"(B "3c")
- (?\$,2C#(B "4c")
- (?\$,2C$(B "5c")
- (?\$,2C%(B "6c")
- (?\$,2C&(B "7c")
- (?\$,2C'(B "8c")
- (?\$,2C((B "9c")
- (?\$,2C)(B "10c")
- (?\$,2C(B "KSC")
- (?\$,2GB(B "am")
- (?\$,2GX(B "pm")
- (?\$,3h (B "ff")
- (?\$,3h!(B "fi")
- (?\$,3h"(B "fl")
- (?\$,3h#(B "ffi")
- (?\$,3h$(B "ffl")
- (?\$,3h%(B "St")
- (?\$,3h&(B "st")
- (?\$,3q=(B "3+;")
- (?\$,3qB(B "aM.")
- (?\$,3qD(B "aH.")
- (?\$,3qH(B "ah.")
- (?\$,3qM(B "a+-")
- (?\$,3qN(B "a+.")
- (?\$,3qO(B "b+-")
- (?\$,3qP(B "b+.")
- (?\$,3qQ(B "b+,")
- (?\$,3qR(B "b+;")
- (?\$,3qS(B "tm-")
- (?\$,3qT(B "tm.")
- (?\$,3qU(B "t+-")
- (?\$,3qV(B "t+.")
- (?\$,3qW(B "t+,")
- (?\$,3qX(B "t+;")
- (?\$,3qY(B "tk-")
- (?\$,3qZ(B "tk.")
- (?\$,3q[(B "tk,")
- (?\$,3q\(B "tk;")
- (?\$,3q](B "g+-")
- (?\$,3q^(B "g+.")
- (?\$,3q_(B "g+,")
- (?\$,3q`(B "g+;")
- (?\$,3qa(B "hk-")
- (?\$,3qb(B "hk.")
- (?\$,3qc(B "hk,")
- (?\$,3qd(B "hk;")
- (?\$,3qe(B "x+-")
- (?\$,3qf(B "x+.")
- (?\$,3qg(B "x+,")
- (?\$,3qh(B "x+;")
- (?\$,3qi(B "d+-")
- (?\$,3qj(B "d+.")
- (?\$,3qk(B "dk-")
- (?\$,3ql(B "dk.")
- (?\$,3qm(B "r+-")
- (?\$,3qn(B "r+.")
- (?\$,3qo(B "z+-")
- (?\$,3qp(B "z+.")
- (?\$,3qq(B "s+-")
- (?\$,3qr(B "s+.")
- (?\$,3qs(B "s+,")
- (?\$,3qt(B "s+;")
- (?\$,3qu(B "sn-")
- (?\$,3qv(B "sn.")
- (?\$,3qw(B "sn,")
- (?\$,3qx(B "sn;")
- (?\$,3qy(B "c+-")
- (?\$,3qz(B "c+.")
- (?\$,3q{(B "c+,")
- (?\$,3q|(B "c+;")
- (?\$,3q}(B "dd-")
- (?\$,3q~(B "dd.")
- (?\$,3q(B "dd,")
- (?\$,3r (B "dd;")
- (?\$,3r!(B "tj-")
- (?\$,3r"(B "tj.")
- (?\$,3r#(B "tj,")
- (?\$,3r$(B "tj;")
- (?\$,3r%(B "zH-")
- (?\$,3r&(B "zH.")
- (?\$,3r'(B "zH,")
- (?\$,3r((B "zH;")
- (?\$,3r)(B "e+-")
- (?\$,3r*(B "e+.")
- (?\$,3r+(B "e+,")
- (?\$,3r,(B "e+;")
- (?\$,3r-(B "i+-")
- (?\$,3r.(B "i+.")
- (?\$,3r/(B "i+,")
- (?\$,3r0(B "i+;")
- (?\$,3r1(B "f+-")
- (?\$,3r2(B "f+.")
- (?\$,3r3(B "f+,")
- (?\$,3r4(B "f+;")
- (?\$,3r5(B "q+-")
- (?\$,3r6(B "q+.")
- (?\$,3r7(B "q+,")
- (?\$,3r8(B "q+;")
- (?\$,3r9(B "k+-")
- (?\$,3r:(B "k+.")
- (?\$,3r;(B "k+,")
- (?\$,3r<(B "k+;")
- (?\$,3r=(B "l+-")
- (?\$,3r>(B "l+.")
- (?\$,3r?(B "l+,")
- (?\$,3r@(B "l+;")
- (?\$,3rA(B "m+-")
- (?\$,3rB(B "m+.")
- (?\$,3rC(B "m+,")
- (?\$,3rD(B "m+;")
- (?\$,3rE(B "n+-")
- (?\$,3rF(B "n+.")
- (?\$,3rG(B "n+,")
- (?\$,3rH(B "n+;")
- (?\$,3rI(B "h+-")
- (?\$,3rJ(B "h+.")
- (?\$,3rK(B "h+,")
- (?\$,3rL(B "h+;")
- (?\$,3rM(B "w+-")
- (?\$,3rN(B "w+.")
- (?\$,3rO(B "j+-")
- (?\$,3rP(B "j+.")
- (?\$,3rQ(B "y+-")
- (?\$,3rR(B "y+.")
- (?\$,3rS(B "y+,")
- (?\$,3rT(B "y+;")
- (?\$,3rU(B "lM-")
- (?\$,3rV(B "lM.")
- (?\$,3rW(B "lH-")
- (?\$,3rX(B "lH.")
- (?\$,3rY(B "lh-")
- (?\$,3rZ(B "lh.")
- (?\$,3r[(B "la-")
- (?\$,3r\(B "la.")
- (?\$,3ra(B "!")
- (?\$,3rb(B "\"")
- (?\$,3rc(B "#")
- (?\$,3rd(B "$")
- (?\$,3re(B "%")
- (?\$,3rf(B "&")
- (?\$,3rg(B "'")
- (?\$,3rh(B "(")
- (?\$,3ri(B ")")
- (?\$,3rj(B "*")
- (?\$,3rk(B "+")
- (?\$,3rl(B ",")
- (?\$,3rm(B "-")
- (?\$,3rn(B ".")
- (?\$,3ro(B "/")
- (?\$,3rp(B "0")
- (?\$,3rq(B "1")
- (?\$,3rr(B "2")
- (?\$,3rs(B "3")
- (?\$,3rt(B "4")
- (?\$,3ru(B "5")
- (?\$,3rv(B "6")
- (?\$,3rw(B "7")
- (?\$,3rx(B "8")
- (?\$,3ry(B "9")
- (?\$,3rz(B ":")
- (?\$,3r{(B ";")
- (?\$,3r|(B "<")
- (?\$,3r}(B "=")
- (?\$,3r~(B ">")
- (?\$,3r(B "?")
- (?\$,3s (B "@")
- (?\$,3s!(B "A")
- (?\$,3s"(B "B")
- (?\$,3s#(B "C")
- (?\$,3s$(B "D")
- (?\$,3s%(B "E")
- (?\$,3s&(B "F")
- (?\$,3s'(B "G")
- (?\$,3s((B "H")
- (?\$,3s)(B "I")
- (?\$,3s*(B "J")
- (?\$,3s+(B "K")
- (?\$,3s,(B "L")
- (?\$,3s-(B "M")
- (?\$,3s.(B "N")
- (?\$,3s/(B "O")
- (?\$,3s0(B "P")
- (?\$,3s1(B "Q")
- (?\$,3s2(B "R")
- (?\$,3s3(B "S")
- (?\$,3s4(B "T")
- (?\$,3s5(B "U")
- (?\$,3s6(B "V")
- (?\$,3s7(B "W")
- (?\$,3s8(B "X")
- (?\$,3s9(B "Y")
- (?\$,3s:(B "Z")
- (?\$,3s;(B "[")
- (?\$,3s<(B "\\")
- (?\$,3s=(B "]")
- (?\$,3s>(B "^")
- (?\$,3s?(B "_")
- (?\$,3s@(B "`")
- (?\$,3sA(B "a")
- (?\$,3sB(B "b")
- (?\$,3sC(B "c")
- (?\$,3sD(B "d")
- (?\$,3sE(B "e")
- (?\$,3sF(B "f")
- (?\$,3sG(B "g")
- (?\$,3sH(B "h")
- (?\$,3sI(B "i")
- (?\$,3sJ(B "j")
- (?\$,3sK(B "k")
- (?\$,3sL(B "l")
- (?\$,3sM(B "m")
- (?\$,3sN(B "n")
- (?\$,3sO(B "o")
- (?\$,3sP(B "p")
- (?\$,3sQ(B "q")
- (?\$,3sR(B "r")
- (?\$,3sS(B "s")
- (?\$,3sT(B "t")
- (?\$,3sU(B "u")
- (?\$,3sV(B "v")
- (?\$,3sW(B "w")
- (?\$,3sX(B "x")
- (?\$,3sY(B "y")
- (?\$,3sZ(B "z")
- (?\$,3s[(B "{")
- (?\$,3s\(B "|")
- (?\$,3s](B "}")
- (?\$,3s^(B "~")
- (?\$,3sa(B ".")
- (?\$,3sb(B "\"")
- (?\$,3sc(B "\"")
- (?\$,3sd(B ",")
+ '((?\Ä€ "A")
+ (?\Ä "a")
+ (?\Ä‚ "A")
+ (?\ă "a")
+ (?\Ä„ "A")
+ (?\Ä… "a")
+ (?\Ć "C")
+ (?\ć "c")
+ (?\Ĉ "C")
+ (?\ĉ "c")
+ (?\ÄŠ "C")
+ (?\Ä‹ "c")
+ (?\Č "C")
+ (?\Ä "c")
+ (?\ÄŽ "D")
+ (?\Ä "d")
+ (?\Ä "Ã")
+ (?\Ä‘ "d/")
+ (?\Ä’ "E")
+ (?\Ä“ "e")
+ (?\Ä” "E")
+ (?\Ä• "e")
+ (?\Ä– "E")
+ (?\Ä— "e")
+ (?\Ę "E")
+ (?\Ä™ "e")
+ (?\Äš "E")
+ (?\Ä› "e")
+ (?\Ĝ "G")
+ (?\Ä "g")
+ (?\Äž "G")
+ (?\ÄŸ "g")
+ (?\Ä  "G")
+ (?\Ä¡ "g")
+ (?\Ä¢ "G")
+ (?\Ä£ "g")
+ (?\Ĥ "H")
+ (?\Ä¥ "h")
+ (?\Ħ "H/")
+ (?\ħ "H")
+ (?\Ĩ "I")
+ (?\Ä© "i")
+ (?\Ī "I")
+ (?\Ä« "i")
+ (?\Ĭ "I")
+ (?\Ä­ "i")
+ (?\Ä® "I")
+ (?\į "i")
+ (?\İ "I")
+ (?\ı "i")
+ (?\IJ "IJ")
+ (?\ij "ij")
+ (?\Ä´ "J")
+ (?\ĵ "j")
+ (?\Ķ "K")
+ (?\Ä· "k")
+ (?\ĸ "kk")
+ (?\Ĺ "L")
+ (?\ĺ "l")
+ (?\Ä» "L")
+ (?\ļ "l")
+ (?\Ľ "L")
+ (?\ľ "l")
+ (?\Ä¿ "L.")
+ (?\Å€ "l.")
+ (?\Å "L/")
+ (?\Å‚ "l/")
+ (?\Ń "N")
+ (?\Å„ "n")
+ (?\Å… "N")
+ (?\ņ "n")
+ (?\Ň "N")
+ (?\ň "n")
+ (?\ʼn "'n")
+ (?\ÅŠ "NG")
+ (?\Å‹ "N")
+ (?\Ō "O")
+ (?\Å "o")
+ (?\ÅŽ "O")
+ (?\Å "o")
+ (?\Å "O\"")
+ (?\Å‘ "o\"")
+ (?\Å’ "OE")
+ (?\Å“ "oe")
+ (?\Å” "R")
+ (?\Å• "r")
+ (?\Å– "R")
+ (?\Å— "r")
+ (?\Ř "R")
+ (?\Å™ "r")
+ (?\Åš "S")
+ (?\Å› "s")
+ (?\Ŝ "S")
+ (?\Å "s")
+ (?\Åž "S")
+ (?\ÅŸ "s")
+ (?\Å  "S")
+ (?\Å¡ "s")
+ (?\Å¢ "T")
+ (?\Å£ "t")
+ (?\Ť "T")
+ (?\Å¥ "t")
+ (?\Ŧ "T/")
+ (?\ŧ "t/")
+ (?\Ũ "U")
+ (?\Å© "u")
+ (?\Ū "U")
+ (?\Å« "u")
+ (?\Ŭ "U")
+ (?\Å­ "u")
+ (?\Å® "U")
+ (?\ů "u")
+ (?\Ű "U\"")
+ (?\ű "u\"")
+ (?\Ų "U")
+ (?\ų "u")
+ (?\Å´ "W")
+ (?\ŵ "w")
+ (?\Ŷ "Y")
+ (?\Å· "y")
+ (?\Ÿ "Y")
+ (?\Ź "Z")
+ (?\ź "z")
+ (?\Å» "Z")
+ (?\ż "z")
+ (?\Ž "Z")
+ (?\ž "z")
+ (?\Å¿ "s1")
+ (?\Ƈ "C2")
+ (?\ƈ "c2")
+ (?\Æ‘ "F2")
+ (?\Æ’ " f")
+ (?\Ƙ "K2")
+ (?\Æ™ "k2")
+ (?\Æ  "O9")
+ (?\Æ¡ "o9")
+ (?\Æ¢ "OI")
+ (?\Æ£ "oi")
+ (?\Ʀ "yr")
+ (?\Ư "U9")
+ (?\ư "u9")
+ (?\Ƶ "Z/")
+ (?\ƶ "z/")
+ (?\Æ· "ED")
+ (?\Ç "A")
+ (?\ÇŽ "a")
+ (?\Ç "I")
+ (?\Ç "i")
+ (?\Ç‘ "O")
+ (?\Ç’ "o")
+ (?\Ç“ "U")
+ (?\Ç” "u")
+ (?\Ç• "U:-")
+ (?\Ç– "u:-")
+ (?\Ç— "U:'")
+ (?\ǘ "u:'")
+ (?\Ç™ "U:<")
+ (?\Çš "u:<")
+ (?\Ç› "U:!")
+ (?\ǜ "u:!")
+ (?\Çž "A1")
+ (?\ÇŸ "a1")
+ (?\Ç  "A7")
+ (?\Ç¡ "a7")
+ (?\Ç¢ "A3")
+ (?\Ç£ "a3")
+ (?\Ǥ "G/")
+ (?\Ç¥ "g/")
+ (?\Ǧ "G")
+ (?\ǧ "g")
+ (?\Ǩ "K")
+ (?\Ç© "k")
+ (?\Ǫ "O")
+ (?\Ç« "o")
+ (?\Ǭ "O1")
+ (?\Ç­ "o1")
+ (?\Ç® "EZ")
+ (?\ǯ "ez")
+ (?\ǰ "j")
+ (?\Ç´ "G")
+ (?\ǵ "g")
+ (?\Ǻ "AA'")
+ (?\Ç» "aa'")
+ (?\Ǽ "AE'")
+ (?\ǽ "ae'")
+ (?\Ǿ "O/'")
+ (?\Ç¿ "o/'")
+ (?\È€ "A!!")
+ (?\È "a!!")
+ (?\È‚ "A)")
+ (?\ȃ "a)")
+ (?\È„ "E!!")
+ (?\È… "e!!")
+ (?\Ȇ "E)")
+ (?\ȇ "e)")
+ (?\Ȉ "I!!")
+ (?\ȉ "i!!")
+ (?\ÈŠ "I)")
+ (?\È‹ "i)")
+ (?\Ȍ "O!!")
+ (?\È "o!!")
+ (?\ÈŽ "O)")
+ (?\È "o)")
+ (?\È "R!!")
+ (?\È‘ "r!!")
+ (?\È’ "R)")
+ (?\È“ "r)")
+ (?\È” "U!!")
+ (?\È• "u!!")
+ (?\È– "U)")
+ (?\È— "u)")
+ (?\È "Z")
+ (?\É‘ "A")
+ (?\É’ "A.")
+ (?\É“ "b`")
+ (?\É” "O")
+ (?\É– "d.")
+ (?\É— "d`")
+ (?\ɘ "@<umd>")
+ (?\É™ "@")
+ (?\Éš "R")
+ (?\É› "E")
+ (?\ɜ "V\"")
+ (?\É "R<umd>")
+ (?\Éž "O\"")
+ (?\ÉŸ "J")
+ (?\É  "g`")
+ (?\É¡ "g")
+ (?\É¢ "G")
+ (?\É£ "Q")
+ (?\ɤ "o-")
+ (?\É¥ "j<rnd>")
+ (?\ɦ "h<?>")
+ (?\ɨ "i\"")
+ (?\É© "I")
+ (?\ɪ "I")
+ (?\É« "L")
+ (?\ɬ "L")
+ (?\É­ "l.")
+ (?\É® "z<lat>")
+ (?\ɯ "u-")
+ (?\ɰ "j<vel>")
+ (?\ɱ "M")
+ (?\ɳ "n.")
+ (?\É´ "n\"")
+ (?\ɵ "@.")
+ (?\ɶ "&.")
+ (?\É· "U")
+ (?\ɹ "r")
+ (?\ɺ "*<lat>")
+ (?\É» "r.")
+ (?\ɽ "*.")
+ (?\ɾ "*")
+ (?\Ê€ "R")
+ (?\Ê "g\"")
+ (?\Ê‚ "s.")
+ (?\ʃ "S")
+ (?\Ê„ "J`")
+ (?\ʇ "t!")
+ (?\ʈ "t.")
+ (?\ʉ "u\"")
+ (?\ÊŠ "U")
+ (?\Ê‹ "r<lbd>")
+ (?\ʌ "V")
+ (?\Ê "w<vls>")
+ (?\ÊŽ "l^")
+ (?\Ê "I.")
+ (?\Ê "z.")
+ (?\Ê’ "Z")
+ (?\Ê” "?")
+ (?\Ê• "H<vcd>")
+ (?\Ê– "l!")
+ (?\Ê— "c!")
+ (?\ʘ "p!")
+ (?\Ê™ "b<trl>")
+ (?\Ê› "G`")
+ (?\Ê "j")
+ (?\Êž "k!")
+ (?\ÊŸ "L")
+ (?\Ê  "q`")
+ (?\ʤ "d3")
+ (?\ʦ "ts")
+ (?\ʧ "tS")
+ (?\ʰ "<h>")
+ (?\ʱ "<?>")
+ (?\ʲ ";")
+ (?\ʳ "<r>")
+ (?\Ê· "<w>")
+ (?\Ê» ";S")
+ (?\ʼ "`")
+ (?\ˆ "^")
+ (?\ˇ "'<")
+ (?\ˈ "|")
+ (?\ˉ "1-")
+ (?\Ë‹ "1!")
+ (?\Ë ":")
+ (?\Ë‘ ":\\")
+ (?\Ë– "+")
+ (?\Ë— "-")
+ (?\˘ "'(")
+ (?\Ë™ "'.")
+ (?\Ëš "'0")
+ (?\Ë› "';")
+ (?\˜ "~")
+ (?\Ë "'\"")
+ (?\Ë¥ "_T")
+ (?\˦ "_H")
+ (?\˧ "_M")
+ (?\˨ "_L")
+ (?\Ë© "_B")
+ (?\ˬ "_v")
+ (?\Ë® "''")
+ (?\Ì€ "`")
+ (?\Ì "'")
+ (?\Ì‚ "^")
+ (?\̃ "~")
+ (?\̄ "¯")
+ (?\̇ "·")
+ (?\̈ "¨")
+ (?\̊ "°")
+ (?\Ì‹ "''")
+ (?\Ì "|")
+ (?\ÌŽ "||")
+ (?\Ì "``")
+ (?\Ì¡ ";")
+ (?\Ì¢ ".")
+ (?\Ì£ ".")
+ (?\̤ "<?>")
+ (?\Ì¥ "<o>")
+ (?\̦ ",")
+ (?\̧ "¸")
+ (?\Ì© "-")
+ (?\̪ "[")
+ (?\Ì« "<w>")
+ (?\Ì´ "~")
+ (?\Ì· "/")
+ (?\̸ "/")
+ (?\Í€ "`")
+ (?\Í "'")
+ (?\Í‚ "~")
+ (?\Í„ "'%")
+ (?\Í… "j3")
+ (?\͇ "=")
+ (?\Í  "~~")
+ (?\Í´ "'")
+ (?\͵ ",")
+ (?\ͺ "j3")
+ (?\; "?%")
+ (?\΄ "'*")
+ (?\Î… "'%")
+ (?\Ά "A'")
+ (?\· "·")
+ (?\Έ "E'")
+ (?\Ή "Y%")
+ (?\Ί "I'")
+ (?\Ό "O'")
+ (?\ÎŽ "U%")
+ (?\Î "W%")
+ (?\Î "i3")
+ (?\Α "A")
+ (?\Î’ "B")
+ (?\Γ "G")
+ (?\Δ "D")
+ (?\Ε "E")
+ (?\Ζ "Z")
+ (?\Η "Y")
+ (?\Θ "TH")
+ (?\Ι "I")
+ (?\Κ "K")
+ (?\Λ "L")
+ (?\Μ "M")
+ (?\Î "N")
+ (?\Ξ "C")
+ (?\Ο "O")
+ (?\Π "P")
+ (?\Ρ "R")
+ (?\Σ "S")
+ (?\Τ "T")
+ (?\Î¥ "U")
+ (?\Φ "F")
+ (?\Χ "X")
+ (?\Ψ "Q")
+ (?\Ω "W*")
+ (?\Ϊ "J")
+ (?\Ϋ "V*")
+ (?\ά "a'")
+ (?\έ "e'")
+ (?\ή "y%")
+ (?\ί "i'")
+ (?\ΰ "u3")
+ (?\α "a")
+ (?\β "b")
+ (?\γ "g")
+ (?\δ "d")
+ (?\ε "e")
+ (?\ζ "z")
+ (?\η "y")
+ (?\θ "th")
+ (?\ι "i")
+ (?\κ "k")
+ (?\λ "l")
+ (?\μ "µ")
+ (?\ν "n")
+ (?\ξ "c")
+ (?\ο "o")
+ (?\Ï€ "p")
+ (?\Ï "r")
+ (?\Ï‚ "*s")
+ (?\σ "s")
+ (?\Ï„ "t")
+ (?\Ï… "u")
+ (?\φ "f")
+ (?\χ "x")
+ (?\ψ "q")
+ (?\ω "w")
+ (?\ÏŠ "j")
+ (?\Ï‹ "v*")
+ (?\ό "o'")
+ (?\Ï "u%")
+ (?\ÏŽ "w%")
+ (?\Ï "beta ")
+ (?\Ï‘ "theta ")
+ (?\Ï’ "upsi ")
+ (?\Ï• "phi ")
+ (?\Ï– "pi ")
+ (?\Ï— "k.")
+ (?\Ïš "T3")
+ (?\Ï› "t3")
+ (?\Ϝ "M3")
+ (?\Ï "m3")
+ (?\Ïž "K3")
+ (?\ÏŸ "k3")
+ (?\Ï  "P3")
+ (?\Ï¡ "p3")
+ (?\ϰ "kappa ")
+ (?\ϱ "rho ")
+ (?\ϳ "J")
+ (?\Ï´ "'%")
+ (?\ϵ "j3")
+ (?\Ð "IO")
+ (?\Ђ "D%")
+ (?\Ѓ "G%")
+ (?\Є "IE")
+ (?\Ð… "DS")
+ (?\І "II")
+ (?\Ї "YI")
+ (?\Ј "J%")
+ (?\Љ "LJ")
+ (?\Њ "NJ")
+ (?\Ћ "Ts")
+ (?\Ќ "KJ")
+ (?\ÐŽ "V%")
+ (?\Ð "DZ")
+ (?\Ð "A")
+ (?\Б "B")
+ (?\Ð’ "V")
+ (?\Г "G")
+ (?\Д "D")
+ (?\Е "E")
+ (?\Ж "ZH")
+ (?\З "Z")
+ (?\И "I")
+ (?\Й "J")
+ (?\К "K")
+ (?\Л "L")
+ (?\М "M")
+ (?\Ð "N")
+ (?\О "O")
+ (?\П "P")
+ (?\Р "R")
+ (?\С "S")
+ (?\Т "T")
+ (?\У "U")
+ (?\Ф "F")
+ (?\Ð¥ "H")
+ (?\Ц "C")
+ (?\Ч "CH")
+ (?\Ш "SH")
+ (?\Щ "SCH")
+ (?\Ъ "\"")
+ (?\Ы "Y")
+ (?\Ь "'")
+ (?\Э "`E")
+ (?\Ю "YU")
+ (?\Я "YA")
+ (?\а "a")
+ (?\б "b")
+ (?\в "v")
+ (?\г "g")
+ (?\д "d")
+ (?\е "e")
+ (?\ж "zh")
+ (?\з "z")
+ (?\и "i")
+ (?\й "j")
+ (?\к "k")
+ (?\л "l")
+ (?\м "m")
+ (?\н "n")
+ (?\о "o")
+ (?\п "p")
+ (?\Ñ€ "r")
+ (?\Ñ "s")
+ (?\Ñ‚ "t")
+ (?\у "u")
+ (?\Ñ„ "f")
+ (?\Ñ… "h")
+ (?\ц "c")
+ (?\ч "ch")
+ (?\ш "sh")
+ (?\щ "sch")
+ (?\ÑŠ "\"")
+ (?\Ñ‹ "y")
+ (?\ь "'")
+ (?\Ñ "`e")
+ (?\ÑŽ "yu")
+ (?\Ñ "ya")
+ (?\Ñ‘ "io")
+ (?\Ñ’ "d%")
+ (?\Ñ“ "g%")
+ (?\Ñ” "ie")
+ (?\Ñ• "ds")
+ (?\Ñ– "ii")
+ (?\Ñ— "yi")
+ (?\ј "j%")
+ (?\Ñ™ "lj")
+ (?\Ñš "nj")
+ (?\Ñ› "ts")
+ (?\ќ "kj")
+ (?\Ñž "v%")
+ (?\ÑŸ "dz")
+ (?\Ñ¢ "Y3")
+ (?\Ñ£ "y3")
+ (?\Ѫ "O3")
+ (?\Ñ« "o3")
+ (?\Ѳ "F3")
+ (?\ѳ "f3")
+ (?\Ñ´ "V3")
+ (?\ѵ "v3")
+ (?\Ò€ "C3")
+ (?\Ò "c3")
+ (?\Ò "G3")
+ (?\Ò‘ "g3")
+ (?\Ó” "AE")
+ (?\Ó• "ae")
+ (?\Ö´ "i")
+ (?\Ö· "a")
+ (?\Ö¸ "o")
+ (?\Ö¼ "u")
+ (?\Ö¿ "h")
+ (?\ׂ ":")
+ (?\× "#")
+ (?\ב "B+")
+ (?\×’ "G+")
+ (?\ד "D+")
+ (?\×” "H+")
+ (?\ו "W+")
+ (?\×– "Z+")
+ (?\×— "X+")
+ (?\ט "Tj")
+ (?\×™ "J+")
+ (?\ך "K%")
+ (?\×› "K+")
+ (?\ל "L+")
+ (?\× "M%")
+ (?\מ "M+")
+ (?\ן "N%")
+ (?\×  "N+")
+ (?\ס "S+")
+ (?\×¢ "E+")
+ (?\×£ "P%")
+ (?\פ "P+")
+ (?\×¥ "Zj")
+ (?\צ "ZJ")
+ (?\×§ "Q+")
+ (?\ר "R+")
+ (?\ש "Sh")
+ (?\ת "T+")
+ (?\×° "v")
+ (?\×± "oy")
+ (?\ײ "ey")
+ (?\، ",+")
+ (?\Ø› ";+")
+ (?\ØŸ "?+")
+ (?\Ø¡ "H'")
+ (?\Ø¢ "aM")
+ (?\Ø£ "aH")
+ (?\ؤ "wH")
+ (?\Ø¥ "ah")
+ (?\ئ "yH")
+ (?\ا "a+")
+ (?\ب "b+")
+ (?\Ø© "tm")
+ (?\ت "t+")
+ (?\Ø« "tk")
+ (?\ج "g+")
+ (?\Ø­ "hk")
+ (?\Ø® "x+")
+ (?\د "d+")
+ (?\ذ "dk")
+ (?\ر "r+")
+ (?\ز "z+")
+ (?\س "s+")
+ (?\Ø´ "sn")
+ (?\ص "c+")
+ (?\ض "dd")
+ (?\Ø· "tj")
+ (?\ظ "zH")
+ (?\ع "e+")
+ (?\غ "i+")
+ (?\Ù€ "++")
+ (?\Ù "f+")
+ (?\Ù‚ "q+")
+ (?\Ùƒ "k+")
+ (?\Ù„ "l+")
+ (?\Ù… "m+")
+ (?\Ù† "n+")
+ (?\Ù‡ "h+")
+ (?\Ùˆ "w+")
+ (?\Ù‰ "j+")
+ (?\ÙŠ "y+")
+ (?\Ù‹ ":+")
+ (?\ٌ "\"+")
+ (?\Ù "=+")
+ (?\ÙŽ "/+")
+ (?\Ù "'+")
+ (?\Ù "1+")
+ (?\Ù‘ "3+")
+ (?\Ù’ "0+")
+ (?\Ù  "0a")
+ (?\Ù¡ "1a")
+ (?\Ù¢ "2a")
+ (?\Ù£ "3a")
+ (?\Ù¤ "4a")
+ (?\Ù¥ "5a")
+ (?\Ù¦ "6a")
+ (?\Ù§ "7a")
+ (?\Ù¨ "8a")
+ (?\Ù© "9a")
+ (?\Ù° "aS")
+ (?\Ù¾ "p+")
+ (?\Ú "hH")
+ (?\Ú† "tc")
+ (?\Ú˜ "zj")
+ (?\Ú¤ "v+")
+ (?\Ú¯ "gf")
+ (?\Û° "0a")
+ (?\Û± "1a")
+ (?\Û² "2a")
+ (?\Û³ "3a")
+ (?\Û´ "4a")
+ (?\Ûµ "5a")
+ (?\Û¶ "6a")
+ (?\Û· "7a")
+ (?\Û¸ "8a")
+ (?\Û¹ "9a")
+ (?\ሀ "he")
+ (?\ሠ"hu")
+ (?\ሂ "hi")
+ (?\ሃ "ha")
+ (?\ሄ "hE")
+ (?\ህ "h")
+ (?\ሆ "ho")
+ (?\ለ "le")
+ (?\ሉ "lu")
+ (?\ሊ "li")
+ (?\ላ "la")
+ (?\ሌ "lE")
+ (?\ሠ"l")
+ (?\ሎ "lo")
+ (?\ሠ"lWa")
+ (?\ሠ"He")
+ (?\ሑ "Hu")
+ (?\ሒ "Hi")
+ (?\ሓ "Ha")
+ (?\ሔ "HE")
+ (?\ሕ "H")
+ (?\ሖ "Ho")
+ (?\ሗ "HWa")
+ (?\መ "me")
+ (?\ሙ "mu")
+ (?\ሚ "mi")
+ (?\ማ "ma")
+ (?\ሜ "mE")
+ (?\ሠ"m")
+ (?\ሞ "mo")
+ (?\ሟ "mWa")
+ (?\ሠ "`se")
+ (?\ሡ "`su")
+ (?\ሢ "`si")
+ (?\ሣ "`sa")
+ (?\ሤ "`sE")
+ (?\ሥ "`s")
+ (?\ሦ "`so")
+ (?\ሧ "`sWa")
+ (?\ረ "re")
+ (?\ሩ "ru")
+ (?\ሪ "ri")
+ (?\ራ "ra")
+ (?\ሬ "rE")
+ (?\ር "r")
+ (?\ሮ "ro")
+ (?\ሯ "rWa")
+ (?\ሰ "se")
+ (?\ሱ "su")
+ (?\ሲ "si")
+ (?\ሳ "sa")
+ (?\ሴ "sE")
+ (?\ስ "s")
+ (?\ሶ "so")
+ (?\ሷ "sWa")
+ (?\ሸ "xe")
+ (?\ሹ "xu")
+ (?\ሺ "xi")
+ (?\ሻ "xa")
+ (?\ሼ "xE")
+ (?\ሽ "xa")
+ (?\ሾ "xo")
+ (?\ሿ "xWa")
+ (?\ቀ "qe")
+ (?\በ"qu")
+ (?\ቂ "qi")
+ (?\ቃ "qa")
+ (?\ቄ "qE")
+ (?\ቅ "q")
+ (?\ቆ "qo")
+ (?\ቈ "qWe")
+ (?\ቊ "qWi")
+ (?\ቋ "qWa")
+ (?\ቌ "qWE")
+ (?\በ"qW")
+ (?\በ"Qe")
+ (?\ቑ "Qu")
+ (?\ቒ "Qi")
+ (?\ቓ "Qa")
+ (?\ቔ "QE")
+ (?\ቕ "Q")
+ (?\ቖ "Qo")
+ (?\ቘ "QWe")
+ (?\ቚ "QWi")
+ (?\ቛ "QWa")
+ (?\ቜ "QWE")
+ (?\በ"QW")
+ (?\በ "be")
+ (?\ቡ "bu")
+ (?\ቢ "bi")
+ (?\ባ "ba")
+ (?\ቤ "bE")
+ (?\ብ "b")
+ (?\ቦ "bo")
+ (?\ቧ "bWa")
+ (?\ቨ "ve")
+ (?\ቩ "vu")
+ (?\ቪ "vi")
+ (?\ቫ "va")
+ (?\ቬ "vE")
+ (?\ቭ "v")
+ (?\ቮ "vo")
+ (?\ቯ "vWa")
+ (?\ተ "te")
+ (?\ቱ "tu")
+ (?\ቲ "ti")
+ (?\ታ "ta")
+ (?\ቴ "tE")
+ (?\ት "t")
+ (?\ቶ "to")
+ (?\ቷ "tWa")
+ (?\ቸ "ce")
+ (?\ቹ "cu")
+ (?\ቺ "ci")
+ (?\ቻ "ca")
+ (?\ቼ "cE")
+ (?\ች "c")
+ (?\ቾ "co")
+ (?\ቿ "cWa")
+ (?\ኀ "`he")
+ (?\አ"`hu")
+ (?\ኂ "`hi")
+ (?\ኃ "`ha")
+ (?\ኄ "`hE")
+ (?\ኅ "`h")
+ (?\ኆ "`ho")
+ (?\ኈ "hWe")
+ (?\ኊ "hWi")
+ (?\ኋ "hWa")
+ (?\ኌ "hWE")
+ (?\አ"hW")
+ (?\አ"na")
+ (?\ኑ "nu")
+ (?\ኒ "ni")
+ (?\ና "na")
+ (?\ኔ "nE")
+ (?\ን "n")
+ (?\ኖ "no")
+ (?\ኗ "nWa")
+ (?\ኘ "Ne")
+ (?\ኙ "Nu")
+ (?\ኚ "Ni")
+ (?\ኛ "Na")
+ (?\ኜ "NE")
+ (?\አ"N")
+ (?\ኞ "No")
+ (?\ኟ "NWa")
+ (?\አ "e")
+ (?\ኡ "u")
+ (?\ኢ "i")
+ (?\ኣ "a")
+ (?\ኤ "E")
+ (?\እ "I")
+ (?\ኦ "o")
+ (?\ኧ "e3")
+ (?\ከ "ke")
+ (?\ኩ "ku")
+ (?\ኪ "ki")
+ (?\ካ "ka")
+ (?\ኬ "kE")
+ (?\ክ "k")
+ (?\ኮ "ko")
+ (?\ኰ "kWe")
+ (?\ኲ "kWi")
+ (?\ኳ "kWa")
+ (?\ኴ "kWE")
+ (?\ኵ "kW")
+ (?\ኸ "Ke")
+ (?\ኹ "Ku")
+ (?\ኺ "Ki")
+ (?\ኻ "Ka")
+ (?\ኼ "KE")
+ (?\ኽ "K")
+ (?\ኾ "Ko")
+ (?\á‹€ "KWe")
+ (?\á‹‚ "KWi")
+ (?\ዃ "KWa")
+ (?\á‹„ "KWE")
+ (?\á‹… "KW")
+ (?\ወ "we")
+ (?\ዉ "wu")
+ (?\ዊ "wi")
+ (?\á‹‹ "wa")
+ (?\ዌ "wE")
+ (?\á‹ "w")
+ (?\ዎ "wo")
+ (?\á‹ "`e")
+ (?\á‹‘ "`u")
+ (?\á‹’ "`i")
+ (?\á‹“ "`a")
+ (?\á‹” "`E")
+ (?\á‹• "`I")
+ (?\á‹– "`o")
+ (?\ዘ "ze")
+ (?\á‹™ "zu")
+ (?\ዚ "zi")
+ (?\á‹› "za")
+ (?\ዜ "zE")
+ (?\á‹ "z")
+ (?\ዞ "zo")
+ (?\ዟ "zWa")
+ (?\á‹  "Ze")
+ (?\á‹¡ "Zu")
+ (?\á‹¢ "Zi")
+ (?\á‹£ "Za")
+ (?\ዤ "ZE")
+ (?\á‹¥ "Z")
+ (?\ዦ "Zo")
+ (?\á‹§ "ZWa")
+ (?\የ "ye")
+ (?\á‹© "yu")
+ (?\ዪ "yi")
+ (?\á‹« "ya")
+ (?\ዬ "yE")
+ (?\á‹­ "y")
+ (?\á‹® "yo")
+ (?\ዯ "yWa")
+ (?\á‹° "de")
+ (?\ዱ "du")
+ (?\ዲ "di")
+ (?\ዳ "da")
+ (?\á‹´ "dE")
+ (?\ድ "d")
+ (?\á‹¶ "do")
+ (?\á‹· "dWa")
+ (?\ዸ "De")
+ (?\ዹ "Du")
+ (?\ዺ "Di")
+ (?\á‹» "Da")
+ (?\ዼ "DE")
+ (?\ዽ "D")
+ (?\ዾ "Do")
+ (?\á‹¿ "DWa")
+ (?\ጀ "je")
+ (?\ጠ"ju")
+ (?\ጂ "ji")
+ (?\ጃ "ja")
+ (?\ጄ "jE")
+ (?\ጅ "j")
+ (?\ጆ "jo")
+ (?\ጇ "jWa")
+ (?\ገ "ga")
+ (?\ጉ "gu")
+ (?\ጊ "gi")
+ (?\ጋ "ga")
+ (?\ጌ "gE")
+ (?\ጠ"g")
+ (?\ጎ "go")
+ (?\ጠ"gWu")
+ (?\ጒ "gWi")
+ (?\ጓ "gWa")
+ (?\ጔ "gWE")
+ (?\ጕ "gW")
+ (?\ጘ "Ge")
+ (?\ጙ "Gu")
+ (?\ጚ "Gi")
+ (?\ጛ "Ga")
+ (?\ጜ "GE")
+ (?\ጠ"G")
+ (?\ጞ "Go")
+ (?\ጟ "GWa")
+ (?\ጠ "Te")
+ (?\ጡ "Tu")
+ (?\ጢ "Ti")
+ (?\ጣ "Ta")
+ (?\ጤ "TE")
+ (?\ጥ "T")
+ (?\ጦ "To")
+ (?\ጧ "TWa")
+ (?\ጨ "Ce")
+ (?\ጩ "Ca")
+ (?\ጪ "Cu")
+ (?\ጫ "Ca")
+ (?\ጬ "CE")
+ (?\ጭ "C")
+ (?\ጮ "Co")
+ (?\ጯ "CWa")
+ (?\ጰ "Pe")
+ (?\ጱ "Pu")
+ (?\ጲ "Pi")
+ (?\ጳ "Pa")
+ (?\ጴ "PE")
+ (?\ጵ "P")
+ (?\ጶ "Po")
+ (?\ጷ "PWa")
+ (?\ጸ "SWe")
+ (?\ጹ "SWu")
+ (?\ጺ "SWi")
+ (?\ጻ "SWa")
+ (?\ጼ "SWE")
+ (?\ጽ "SW")
+ (?\ጾ "SWo")
+ (?\ጿ "SWa")
+ (?\ဠ"`Sa")
+ (?\á "`Su")
+ (?\á‚ "`Si")
+ (?\რ"`Sa")
+ (?\á„ "`SE")
+ (?\á… "`S")
+ (?\ᆠ"`So")
+ (?\ሠ"fa")
+ (?\በ"fu")
+ (?\አ"fi")
+ (?\á‹ "fa")
+ (?\ጠ"fE")
+ (?\á "o")
+ (?\Ꭰ"fo")
+ (?\á "fWa")
+ (?\á "pe")
+ (?\á‘ "pu")
+ (?\á’ "pi")
+ (?\á“ "pa")
+ (?\á” "pE")
+ (?\á• "p")
+ (?\á– "po")
+ (?\á— "pWa")
+ (?\ᘠ"mYa")
+ (?\á™ "rYa")
+ (?\áš "fYa")
+ (?\á  " ")
+ (?\á¡ ":")
+ (?\ᢠ"::")
+ (?\ᣠ",")
+ (?\ᤠ";")
+ (?\ᥠ"-:")
+ (?\ᦠ":-")
+ (?\á§ "`?")
+ (?\ᨠ":|:")
+ (?\á© "`1")
+ (?\᪠"`2")
+ (?\á« "`3")
+ (?\ᬠ"`4")
+ (?\á­ "`5")
+ (?\á® "`6")
+ (?\ᯠ"`7")
+ (?\á° "`8")
+ (?\á± "`9")
+ (?\á² "`10")
+ (?\á³ "`20")
+ (?\á´ "`30")
+ (?\áµ "`40")
+ (?\á¶ "`50")
+ (?\á· "`60")
+ (?\Ḡ"`70")
+ (?\á¹ "`80")
+ (?\Ạ"`90")
+ (?\á» "`100")
+ (?\á¼ "`10000")
+ (?\Ḁ "A-0")
+ (?\Ḡ"a-0")
+ (?\Ḃ "B.")
+ (?\ḃ "b.")
+ (?\Ḅ "B-.")
+ (?\ḅ "b-.")
+ (?\Ḇ "B_")
+ (?\ḇ "b_")
+ (?\Ḉ "C,'")
+ (?\ḉ "c,'")
+ (?\Ḋ "D.")
+ (?\ḋ "d.")
+ (?\Ḍ "D-.")
+ (?\Ḡ"d-.")
+ (?\Ḏ "D_")
+ (?\Ḡ"d_")
+ (?\Ḡ"D,")
+ (?\ḑ "d,")
+ (?\Ḓ "D->")
+ (?\ḓ "d->")
+ (?\Ḕ "E-!")
+ (?\ḕ "e-!")
+ (?\Ḗ "E-'")
+ (?\ḗ "e-'")
+ (?\Ḙ "E->")
+ (?\ḙ "e->")
+ (?\Ḛ "E-?")
+ (?\ḛ "e-?")
+ (?\Ḝ "E,(")
+ (?\Ḡ"e,(")
+ (?\Ḟ "F.")
+ (?\ḟ "f.")
+ (?\Ḡ "G-")
+ (?\ḡ "g-")
+ (?\Ḣ "H.")
+ (?\ḣ "h.")
+ (?\Ḥ "H-.")
+ (?\ḥ "h-.")
+ (?\Ḧ "H:")
+ (?\ḧ "h:")
+ (?\Ḩ "H,")
+ (?\ḩ "h,")
+ (?\Ḫ "H-(")
+ (?\ḫ "h-(")
+ (?\Ḭ "I-?")
+ (?\ḭ "i-?")
+ (?\Ḯ "I:'")
+ (?\ḯ "i:'")
+ (?\Ḱ "K'")
+ (?\ḱ "k'")
+ (?\Ḳ "K-.")
+ (?\ḳ "k-.")
+ (?\Ḵ "K_")
+ (?\ḵ "k_")
+ (?\Ḷ "L-.")
+ (?\ḷ "l-.")
+ (?\Ḹ "L--.")
+ (?\ḹ "l--.")
+ (?\Ḻ "L_")
+ (?\ḻ "l_")
+ (?\Ḽ "L->")
+ (?\ḽ "l->")
+ (?\Ḿ "M'")
+ (?\ḿ "m'")
+ (?\á¹€ "M.")
+ (?\á¹ "m.")
+ (?\Ṃ "M-.")
+ (?\ṃ "m-.")
+ (?\Ṅ "N.")
+ (?\á¹… "n.")
+ (?\Ṇ "N-.")
+ (?\ṇ "n-.")
+ (?\Ṉ "N_")
+ (?\ṉ "n_")
+ (?\Ṋ "N->")
+ (?\ṋ "n->")
+ (?\Ṍ "O?'")
+ (?\á¹ "o?'")
+ (?\Ṏ "O?:")
+ (?\á¹ "o?:")
+ (?\á¹ "O-!")
+ (?\ṑ "o-!")
+ (?\á¹’ "O-'")
+ (?\ṓ "o-'")
+ (?\á¹” "P'")
+ (?\ṕ "p'")
+ (?\á¹– "P.")
+ (?\á¹— "p.")
+ (?\Ṙ "R.")
+ (?\á¹™ "r.")
+ (?\Ṛ "R-.")
+ (?\á¹› "r-.")
+ (?\Ṝ "R--.")
+ (?\á¹ "r--.")
+ (?\Ṟ "R_")
+ (?\ṟ "r_")
+ (?\á¹  "S.")
+ (?\ṡ "s.")
+ (?\á¹¢ "S-.")
+ (?\á¹£ "s-.")
+ (?\Ṥ "S'.")
+ (?\á¹¥ "s'.")
+ (?\Ṧ "S<.")
+ (?\á¹§ "s<.")
+ (?\Ṩ "S.-.")
+ (?\ṩ "s.-.")
+ (?\Ṫ "T.")
+ (?\ṫ "t.")
+ (?\Ṭ "T-.")
+ (?\á¹­ "t-.")
+ (?\á¹® "T_")
+ (?\ṯ "t_")
+ (?\á¹° "T->")
+ (?\á¹± "t->")
+ (?\á¹² "U--:")
+ (?\á¹³ "u--:")
+ (?\á¹´ "U-?")
+ (?\á¹µ "u-?")
+ (?\á¹¶ "U->")
+ (?\á¹· "u->")
+ (?\Ṹ "U?'")
+ (?\á¹¹ "u?'")
+ (?\Ṻ "U-:")
+ (?\á¹» "u-:")
+ (?\á¹¼ "V?")
+ (?\á¹½ "v?")
+ (?\á¹¾ "V-.")
+ (?\ṿ "v-.")
+ (?\Ẁ "W!")
+ (?\Ạ"w!")
+ (?\Ẃ "W'")
+ (?\ẃ "w'")
+ (?\Ẅ "W:")
+ (?\ẅ "w:")
+ (?\Ẇ "W.")
+ (?\ẇ "w.")
+ (?\Ẉ "W-.")
+ (?\ẉ "w-.")
+ (?\Ẋ "X.")
+ (?\ẋ "x.")
+ (?\Ẍ "X:")
+ (?\Ạ"x:")
+ (?\Ẏ "Y.")
+ (?\Ạ"y.")
+ (?\Ạ"Z>")
+ (?\ẑ "z>")
+ (?\Ẓ "Z-.")
+ (?\ẓ "z-.")
+ (?\Ẕ "Z_")
+ (?\ẕ "z_")
+ (?\ẖ "h_")
+ (?\ẗ "t:")
+ (?\ẘ "w0")
+ (?\ẙ "y0")
+ (?\Ạ "A-.")
+ (?\ạ "a-.")
+ (?\Ả "A2")
+ (?\ả "a2")
+ (?\Ấ "A>'")
+ (?\ấ "a>'")
+ (?\Ầ "A>!")
+ (?\ầ "a>!")
+ (?\Ẩ "A>2")
+ (?\ẩ "a>2")
+ (?\Ẫ "A>?")
+ (?\ẫ "a>?")
+ (?\Ậ "A>-.")
+ (?\ậ "a>-.")
+ (?\Ắ "A('")
+ (?\ắ "a('")
+ (?\Ằ "A(!")
+ (?\ằ "a(!")
+ (?\Ẳ "A(2")
+ (?\ẳ "a(2")
+ (?\Ẵ "A(?")
+ (?\ẵ "a(?")
+ (?\Ặ "A(-.")
+ (?\ặ "a(-.")
+ (?\Ẹ "E-.")
+ (?\ẹ "e-.")
+ (?\Ẻ "E2")
+ (?\ẻ "e2")
+ (?\Ẽ "E?")
+ (?\ẽ "e?")
+ (?\Ế "E>'")
+ (?\ế "e>'")
+ (?\Ề "E>!")
+ (?\á» "e>!")
+ (?\Ể "E>2")
+ (?\ể "e>2")
+ (?\Ễ "E>?")
+ (?\á»… "e>?")
+ (?\Ệ "E>-.")
+ (?\ệ "e>-.")
+ (?\Ỉ "I2")
+ (?\ỉ "i2")
+ (?\Ị "I-.")
+ (?\ị "i-.")
+ (?\Ọ "O-.")
+ (?\á» "o-.")
+ (?\Ỏ "O2")
+ (?\á» "o2")
+ (?\á» "O>'")
+ (?\ố "o>'")
+ (?\á»’ "O>!")
+ (?\ồ "o>!")
+ (?\á»” "O>2")
+ (?\ổ "o>2")
+ (?\á»– "O>?")
+ (?\á»— "o>?")
+ (?\Ộ "O>-.")
+ (?\á»™ "o>-.")
+ (?\Ớ "O9'")
+ (?\á»› "o9'")
+ (?\Ờ "O9!")
+ (?\á» "o9!")
+ (?\Ở "O92")
+ (?\ở "o92")
+ (?\á»  "O9?")
+ (?\ỡ "o9?")
+ (?\Ợ "O9-.")
+ (?\ợ "o9-.")
+ (?\Ụ "U-.")
+ (?\ụ "u-.")
+ (?\Ủ "U2")
+ (?\á»§ "u2")
+ (?\Ứ "U9'")
+ (?\ứ "u9'")
+ (?\Ừ "U9!")
+ (?\ừ "u9!")
+ (?\Ử "U92")
+ (?\á»­ "u92")
+ (?\á»® "U9?")
+ (?\ữ "u9?")
+ (?\á»° "U9-.")
+ (?\á»± "u9-.")
+ (?\Ỳ "Y!")
+ (?\ỳ "y!")
+ (?\á»´ "Y-.")
+ (?\ỵ "y-.")
+ (?\á»¶ "Y2")
+ (?\á»· "y2")
+ (?\Ỹ "Y?")
+ (?\ỹ "y?")
+ (?\á¼€ "a")
+ (?\á¼ "ha")
+ (?\ἂ "`a")
+ (?\ἃ "h`a")
+ (?\ἄ "a'")
+ (?\á¼… "ha'")
+ (?\ἆ "a~")
+ (?\ἇ "ha~")
+ (?\Ἀ "A")
+ (?\Ἁ "hA")
+ (?\Ἂ "`A")
+ (?\Ἃ "h`A")
+ (?\Ἄ "A'")
+ (?\á¼ "hA'")
+ (?\Ἆ "A~")
+ (?\á¼ "hA~")
+ (?\ἑ "he")
+ (?\á¼™ "hE")
+ (?\á¼± "hi")
+ (?\á¼¹ "hI")
+ (?\á½ "ho")
+ (?\Ὁ "hO")
+ (?\ὑ "hu")
+ (?\á½™ "hU")
+ (?\᾿ ",,")
+ (?\á¿€ "?*")
+ (?\á¿ "?:")
+ (?\á¿ ",!")
+ (?\῎ ",'")
+ (?\á¿ "?,")
+ (?\á¿ ";!")
+ (?\῞ ";'")
+ (?\῟ "?;")
+ (?\á¿¥ "rh")
+ (?\Ῥ "Rh")
+ (?\á¿­ "!:")
+ (?\` "!*")
+ (?\῾ ";;")
+ (?\  " ")
+ (?\†" ")
+ (?\  " ")
+ (?\  " ")
+ (?\  " ")
+ (?\  " ")
+ (?\  " ")
+ (?\  " ")
+ (?\  " ")
+ (?\  " ")
+ (?\†"-")
+ (?\‑ "-")
+ (?\– "-")
+ (?\— "--")
+ (?\― "-")
+ (?\‖ "||")
+ (?\‗ "=2")
+ (?\‘ "`")
+ (?\’ "'")
+ (?\‚ "'")
+ (?\‛ "'")
+ (?\“ "\"")
+ (?\†"\"")
+ (?\„ "\"")
+ (?\‟ "\"")
+ (?\† "/-")
+ (?\‡ "/=")
+ (?\• " o ")
+ (?\․ ".")
+ (?\‥ "..")
+ (?\… "...")
+ (?\‧ "·")
+ (?\‰ " 0/00")
+ (?\′ "'")
+ (?\″ "''")
+ (?\‴ "'''")
+ (?\‵ "`")
+ (?\‶ "``")
+ (?\‷ "```")
+ (?\‸ "Ca")
+ (?\‹ "<")
+ (?\› ">")
+ (?\※ ":X")
+ (?\‼ "!!")
+ (?\‾ "'-")
+ (?\⃠"-")
+ (?\â„ "/")
+ (?\∠"?!")
+ (?\≠"!?")
+ (?\â° "^0")
+ (?\â´ "^4")
+ (?\âµ "^5")
+ (?\â¶ "^6")
+ (?\â· "^7")
+ (?\⸠"^8")
+ (?\â¹ "^9")
+ (?\⺠"^+")
+ (?\â» "^-")
+ (?\â¼ "^=")
+ (?\â½ "^(")
+ (?\â¾ "^)")
+ (?\â¿ "^n")
+ (?\â‚€ "_0")
+ (?\â‚ "_1")
+ (?\â‚‚ "_2")
+ (?\₃ "_3")
+ (?\â‚„ "_4")
+ (?\â‚… "_5")
+ (?\₆ "_6")
+ (?\₇ "_7")
+ (?\₈ "_8")
+ (?\₉ "_9")
+ (?\₊ "_+")
+ (?\â‚‹ "_-")
+ (?\₌ "_=")
+ (?\â‚ "(")
+ (?\₎ ")")
+ (?\â‚£ "Ff")
+ (?\₤ "Li")
+ (?\â‚§ "Pt")
+ (?\â‚© "W=")
+ (?\€ "EUR")
+ (?\â„€ "a/c")
+ (?\â„ "a/s")
+ (?\℃ "oC")
+ (?\â„… "c/o")
+ (?\℆ "c/u")
+ (?\℉ "oF")
+ (?\ℊ "g")
+ (?\ℎ "h")
+ (?\â„ "\\hbar")
+ (?\â„‘ "Im")
+ (?\â„“ "l")
+ (?\â„– "No.")
+ (?\â„— "PO")
+ (?\℘ "P")
+ (?\ℜ "Re")
+ (?\℞ "Rx")
+ (?\â„  "(SM)")
+ (?\â„¡ "TEL")
+ (?\â„¢ "(TM)")
+ (?\Ω "Ohm")
+ (?\K "K")
+ (?\â„« "Ang.")
+ (?\â„® "est.")
+ (?\â„´ "o")
+ (?\ℵ "Aleph ")
+ (?\â„¶ "Bet ")
+ (?\â„· "Gimel ")
+ (?\ℸ "Dalet ")
+ (?\â…“ " 1/3")
+ (?\â…” " 2/3")
+ (?\â…• " 1/5")
+ (?\â…– " 2/5")
+ (?\â…— " 3/5")
+ (?\â…˜ " 4/5")
+ (?\â…™ " 1/6")
+ (?\â…š " 5/6")
+ (?\â…› " 1/8")
+ (?\⅜ " 3/8")
+ (?\â… " 5/8")
+ (?\â…ž " 7/8")
+ (?\â…Ÿ " 1/")
+ (?\â…  "I")
+ (?\â…¡ "II")
+ (?\â…¢ "III")
+ (?\â…£ "IV")
+ (?\â…¤ "V")
+ (?\â…¥ "VI")
+ (?\â…¦ "VII")
+ (?\â…§ "VIII")
+ (?\â…¨ "IX")
+ (?\â…© "X")
+ (?\â…ª "XI")
+ (?\â…« "XII")
+ (?\â…¬ "L")
+ (?\â…­ "C")
+ (?\â…® "D")
+ (?\â…¯ "M")
+ (?\â…° "i")
+ (?\â…± "ii")
+ (?\â…² "iii")
+ (?\â…³ "iv")
+ (?\â…´ "v")
+ (?\â…µ "vi")
+ (?\â…¶ "vii")
+ (?\â…· "viii")
+ (?\â…¸ "ix")
+ (?\â…¹ "x")
+ (?\â…º "xi")
+ (?\â…» "xii")
+ (?\â…¼ "l")
+ (?\â…½ "c")
+ (?\â…¾ "d")
+ (?\â…¿ "m")
+ (?\ↀ "1000RCD")
+ (?\↠"5000R")
+ (?\ↂ "10000R")
+ (?\↠"<-")
+ (?\↑ "-^")
+ (?\→ "->")
+ (?\↓ "-v")
+ (?\↔ "<->")
+ (?\↕ "UD")
+ (?\↖ "<!!")
+ (?\↗ "//>")
+ (?\↘ "!!>")
+ (?\↙ "<//")
+ (?\↨ "UD-")
+ (?\↵ "RET")
+ (?\⇀ ">V")
+ (?\⇠"<=")
+ (?\⇑ "^^")
+ (?\⇒ "=>")
+ (?\⇓ "vv")
+ (?\⇔ "<=>")
+ (?\∀ "FA")
+ (?\∂ "\\partial")
+ (?\∃ "TE")
+ (?\∅ "{}")
+ (?\∆ "Delta")
+ (?\∇ "Nabla")
+ (?\∈ "(-")
+ (?\∉ "!(-")
+ (?\∊ "(-")
+ (?\∋ "-)")
+ (?\∌ "!-)")
+ (?\∠"-)")
+ (?\∎ " qed")
+ (?\∠"\\prod")
+ (?\∑ "\\sum")
+ (?\− " -")
+ (?\∓ "-/+")
+ (?\∔ ".+")
+ (?\∕ "/")
+ (?\∖ " - ")
+ (?\∗ "*")
+ (?\∘ " ° ")
+ (?\∙ "sb")
+ (?\√ " SQRT ")
+ (?\∛ " ROOT³ ")
+ (?\∜ " ROOT4 ")
+ (?\∠"0(")
+ (?\∞ "infty")
+ (?\∟ "-L")
+ (?\∠ "-V")
+ (?\∥ "PP")
+ (?\∦ " !PP ")
+ (?\∧ "AND")
+ (?\∨ "OR")
+ (?\∩ "(U")
+ (?\∪ ")U")
+ (?\∫ "\int ")
+ (?\∬ "DI")
+ (?\∮ "Io")
+ (?\∴ ".:")
+ (?\∵ ":.")
+ (?\∶ ":R")
+ (?\∷ "::")
+ (?\∼ "?1")
+ (?\∾ "CG")
+ (?\≃ "?-")
+ (?\≅ "?=")
+ (?\≈ "~=")
+ (?\≉ " !~= ")
+ (?\≌ "=?")
+ (?\≓ "HI")
+ (?\≔ ":=")
+ (?\≕ "=:")
+ (?\≠ "!=")
+ (?\≡ "=3")
+ (?\≢ " !=3 ")
+ (?\≤ "=<")
+ (?\≥ ">=")
+ (?\≦ ".LE.")
+ (?\≧ ".GE.")
+ (?\≨ ".LT.NOT.EQ.")
+ (?\≩ ".GT.NOT.EQ.")
+ (?\≪ "<<")
+ (?\≫ ">>")
+ (?\≮ "!<")
+ (?\≯ "!>")
+ (?\≶ " <> ")
+ (?\≷ " >< ")
+ (?\⊂ "(C")
+ (?\⊃ ")C")
+ (?\⊄ " !(C ")
+ (?\⊅ " !)C ")
+ (?\⊆ "(_")
+ (?\⊇ ")_")
+ (?\⊕ "(+)")
+ (?\⊖ "(-)")
+ (?\⊗ "(×)")
+ (?\⊘ "(/)")
+ (?\⊙ "(·)")
+ (?\⊚ "(°)")
+ (?\⊛ "(*)")
+ (?\⊜ "(=)")
+ (?\⊠"(-)")
+ (?\⊞ "[+]")
+ (?\⊟ "[-]")
+ (?\⊠ "[×]")
+ (?\⊡ "[·]")
+ (?\⊥ "-T")
+ (?\⊧ " MODELS ")
+ (?\⊨ " TRUE ")
+ (?\⊩ " FORCES ")
+ (?\⊬ " !PROVES ")
+ (?\⊭ " NOT TRUE ")
+ (?\⊮ " !FORCES ")
+ (?\⊲ " NORMAL SUBGROUP OF ")
+ (?\⊳ " CONTAINS AS NORMAL SUBGROUP ")
+ (?\⊴ " NORMAL SUBGROUP OF OR EQUAL TO ")
+ (?\⊵ " CONTAINS AS NORMAL SUBGROUP OR EQUAL TO ")
+ (?\⊸ " MULTIMAP ")
+ (?\⊺ " INTERCALATE ")
+ (?\⊻ " XOR ")
+ (?\⊼ " NAND ")
+ (?\⋅ " · ")
+ (?\â‹– "<.")
+ (?\â‹— ">.")
+ (?\⋘ "<<<")
+ (?\â‹™ ">>>")
+ (?\â‹® ":3")
+ (?\⋯ ".3")
+ (?\⌂ "Eh")
+ (?\⌇ "~~")
+ (?\⌈ "<7")
+ (?\⌉ ">7")
+ (?\⌊ "7<")
+ (?\⌋ "7>")
+ (?\⌠"NI")
+ (?\⌒ "(A")
+ (?\⌕ "TR")
+ (?\⌘ "88")
+ (?\⌠ "Iu")
+ (?\⌡ "Il")
+ (?\⌢ ":(")
+ (?\⌣ ":)")
+ (?\⌤ "|^|")
+ (?\⌧ "[X]")
+ (?\〈 "</")
+ (?\〉 "/>")
+ (?\⣠"Vs")
+ (?\â‘€ "1h")
+ (?\â‘ "3h")
+ (?\â‘‚ "2h")
+ (?\⑃ "4h")
+ (?\⑆ "1j")
+ (?\⑇ "2j")
+ (?\⑈ "3j")
+ (?\⑉ "4j")
+ (?\â‘  "1-o")
+ (?\â‘¡ "2-o")
+ (?\â‘¢ "3-o")
+ (?\â‘£ "4-o")
+ (?\⑤ "5-o")
+ (?\â‘¥ "6-o")
+ (?\⑦ "7-o")
+ (?\â‘§ "8-o")
+ (?\⑨ "9-o")
+ (?\â‘© "10-o")
+ (?\⑪ "11-o")
+ (?\â‘« "12-o")
+ (?\⑬ "13-o")
+ (?\â‘­ "14-o")
+ (?\â‘® "15-o")
+ (?\⑯ "16-o")
+ (?\â‘° "17-o")
+ (?\⑱ "18-o")
+ (?\⑲ "19-o")
+ (?\⑳ "20-o")
+ (?\â‘´ "(1)")
+ (?\⑵ "(2)")
+ (?\â‘¶ "(3)")
+ (?\â‘· "(4)")
+ (?\⑸ "(5)")
+ (?\⑹ "(6)")
+ (?\⑺ "(7)")
+ (?\â‘» "(8)")
+ (?\⑼ "(9)")
+ (?\⑽ "(10)")
+ (?\⑾ "(11)")
+ (?\â‘¿ "(12)")
+ (?\â’€ "(13)")
+ (?\â’ "(14)")
+ (?\â’‚ "(15)")
+ (?\â’ƒ "(16)")
+ (?\â’„ "(17)")
+ (?\â’… "(18)")
+ (?\â’† "(19)")
+ (?\â’‡ "(20)")
+ (?\â’ˆ "1.")
+ (?\â’‰ "2.")
+ (?\â’Š "3.")
+ (?\â’‹ "4.")
+ (?\⒌ "5.")
+ (?\â’ "6.")
+ (?\â’Ž "7.")
+ (?\â’ "8.")
+ (?\â’ "9.")
+ (?\â’‘ "10.")
+ (?\â’’ "11.")
+ (?\â’“ "12.")
+ (?\â’” "13.")
+ (?\â’• "14.")
+ (?\â’– "15.")
+ (?\â’— "16.")
+ (?\â’˜ "17.")
+ (?\â’™ "18.")
+ (?\â’š "19.")
+ (?\â’› "20.")
+ (?\⒜ "(a)")
+ (?\â’ "(b)")
+ (?\â’ž "(c)")
+ (?\â’Ÿ "(d)")
+ (?\â’  "(e)")
+ (?\â’¡ "(f)")
+ (?\â’¢ "(g)")
+ (?\â’£ "(h)")
+ (?\â’¤ "(i)")
+ (?\â’¥ "(j)")
+ (?\â’¦ "(k)")
+ (?\â’§ "(l)")
+ (?\â’¨ "(m)")
+ (?\â’© "(n)")
+ (?\â’ª "(o)")
+ (?\â’« "(p)")
+ (?\â’¬ "(q)")
+ (?\â’­ "(r)")
+ (?\â’® "(s)")
+ (?\â’¯ "(t)")
+ (?\â’° "(u)")
+ (?\â’± "(v)")
+ (?\â’² "(w)")
+ (?\â’³ "(x)")
+ (?\â’´ "(y)")
+ (?\â’µ "(z)")
+ (?\â’¶ "A-o")
+ (?\â’· "B-o")
+ (?\â’¸ "C-o")
+ (?\â’¹ "D-o")
+ (?\â’º "E-o")
+ (?\â’» "F-o")
+ (?\â’¼ "G-o")
+ (?\â’½ "H-o")
+ (?\â’¾ "I-o")
+ (?\â’¿ "J-o")
+ (?\â“€ "K-o")
+ (?\â“ "L-o")
+ (?\â“‚ "M-o")
+ (?\Ⓝ "N-o")
+ (?\â“„ "O-o")
+ (?\â“… "P-o")
+ (?\Ⓠ "Q-o")
+ (?\Ⓡ "R-o")
+ (?\Ⓢ "S-o")
+ (?\Ⓣ "T-o")
+ (?\Ⓤ "U-o")
+ (?\â“‹ "V-o")
+ (?\Ⓦ "W-o")
+ (?\â“ "X-o")
+ (?\Ⓨ "Y-o")
+ (?\â“ "Z-o")
+ (?\â“ "a-o")
+ (?\â“‘ "b-o")
+ (?\â“’ "c-o")
+ (?\â““ "d-o")
+ (?\â“” "e-o")
+ (?\â“• "f-o")
+ (?\â“– "g-o")
+ (?\â“— "h-o")
+ (?\ⓘ "i-o")
+ (?\â“™ "j-o")
+ (?\ⓚ "k-o")
+ (?\â“› "l-o")
+ (?\ⓜ "m-o")
+ (?\â“ "n-o")
+ (?\ⓞ "o-o")
+ (?\ⓟ "p-o")
+ (?\â“  "q-o")
+ (?\â“¡ "r-o")
+ (?\â“¢ "s-o")
+ (?\â“£ "t-o")
+ (?\ⓤ "u-o")
+ (?\â“¥ "v-o")
+ (?\ⓦ "w-o")
+ (?\â“§ "x-o")
+ (?\ⓨ "y-o")
+ (?\â“© "z-o")
+ (?\⓪ "0-o")
+ (?\─ "-")
+ (?\â” "=")
+ (?\│ "|")
+ (?\┃ "|")
+ (?\┄ "-")
+ (?\â”… "=")
+ (?\┆ "|")
+ (?\┇ "|")
+ (?\┈ "-")
+ (?\┉ "=")
+ (?\┊ "|")
+ (?\┋ "|")
+ (?\┌ "+")
+ (?\â” "+")
+ (?\┎ "+")
+ (?\â” "+")
+ (?\â” "+")
+ (?\┑ "+")
+ (?\â”’ "+")
+ (?\┓ "+")
+ (?\â”” "+")
+ (?\┕ "+")
+ (?\â”– "+")
+ (?\â”— "+")
+ (?\┘ "+")
+ (?\â”™ "+")
+ (?\┚ "+")
+ (?\â”› "+")
+ (?\├ "+")
+ (?\â” "+")
+ (?\┞ "+")
+ (?\┟ "+")
+ (?\â”  "+")
+ (?\┡ "+")
+ (?\┢ "+")
+ (?\┣ "+")
+ (?\┤ "+")
+ (?\┥ "+")
+ (?\┦ "+")
+ (?\â”§ "+")
+ (?\┨ "+")
+ (?\┩ "+")
+ (?\┪ "+")
+ (?\┫ "+")
+ (?\┬ "+")
+ (?\â”­ "+")
+ (?\â”® "+")
+ (?\┯ "+")
+ (?\â”° "+")
+ (?\â”± "+")
+ (?\┲ "+")
+ (?\┳ "+")
+ (?\â”´ "+")
+ (?\┵ "+")
+ (?\â”¶ "+")
+ (?\â”· "+")
+ (?\┸ "+")
+ (?\┹ "+")
+ (?\┺ "+")
+ (?\â”» "+")
+ (?\┼ "+")
+ (?\┽ "+")
+ (?\┾ "+")
+ (?\┿ "+")
+ (?\â•€ "+")
+ (?\â• "+")
+ (?\â•‚ "+")
+ (?\╃ "+")
+ (?\â•„ "+")
+ (?\â•… "+")
+ (?\╆ "+")
+ (?\╇ "+")
+ (?\╈ "+")
+ (?\╉ "+")
+ (?\╊ "+")
+ (?\â•‹ "+")
+ (?\╌ "+")
+ (?\â• "+")
+ (?\╎ "+")
+ (?\â• "+")
+ (?\â• "+")
+ (?\â•‘ "+")
+ (?\â•’ "+")
+ (?\â•“ "+")
+ (?\â•” "+")
+ (?\â•• "+")
+ (?\â•– "+")
+ (?\â•— "+")
+ (?\╘ "+")
+ (?\â•™ "+")
+ (?\╚ "+")
+ (?\â•› "+")
+ (?\╜ "+")
+ (?\â• "+")
+ (?\╞ "+")
+ (?\╟ "+")
+ (?\â•  "+")
+ (?\â•¡ "+")
+ (?\â•¢ "+")
+ (?\â•£ "+")
+ (?\╤ "+")
+ (?\â•¥ "+")
+ (?\╦ "+")
+ (?\â•§ "+")
+ (?\╨ "+")
+ (?\â•© "+")
+ (?\╪ "+")
+ (?\â•« "+")
+ (?\╬ "+")
+ (?\╱ "/")
+ (?\╲ "\\")
+ (?\â–€ "TB")
+ (?\â–„ "LB")
+ (?\â–ˆ "FB")
+ (?\▌ "lB")
+ (?\â– "RB")
+ (?\â–‘ ".S")
+ (?\â–’ ":S")
+ (?\â–“ "?S")
+ (?\â–  "fS")
+ (?\â–¡ "OS")
+ (?\â–¢ "RO")
+ (?\â–£ "Rr")
+ (?\â–¤ "RF")
+ (?\â–¥ "RY")
+ (?\â–¦ "RH")
+ (?\â–§ "RZ")
+ (?\â–¨ "RK")
+ (?\â–© "RX")
+ (?\â–ª "sB")
+ (?\â–¬ "SR")
+ (?\â–­ "Or")
+ (?\â–² "^")
+ (?\â–³ "uT")
+ (?\â–¶ "|>")
+ (?\â–· "Tr")
+ (?\â–º "|>")
+ (?\â–¼ "v")
+ (?\â–½ "dT")
+ (?\â—€ "<|")
+ (?\â— "Tl")
+ (?\â—„ "<|")
+ (?\â—† "Db")
+ (?\â—‡ "Dw")
+ (?\â—Š "LZ")
+ (?\â—‹ "0m")
+ (?\â—Ž "0o")
+ (?\â— "0M")
+ (?\â— "0L")
+ (?\â—‘ "0R")
+ (?\â—˜ "Sn")
+ (?\â—™ "Ic")
+ (?\â—¢ "Fd")
+ (?\â—£ "Bd")
+ (?\â—¯ "Ci")
+ (?\★ "*2")
+ (?\☆ "*1")
+ (?\☎ "TEL")
+ (?\☠"tel")
+ (?\☜ "<--")
+ (?\☞ "-->")
+ (?\☡ "CAUTION ")
+ (?\☧ "XP")
+ (?\☹ ":-(")
+ (?\☺ ":-)")
+ (?\☻ "(-:")
+ (?\☼ "SU")
+ (?\♀ "f.")
+ (?\♂ "m.")
+ (?\â™  "cS")
+ (?\♡ "cH")
+ (?\♢ "cD")
+ (?\♣ "cC")
+ (?\♤ "cS-")
+ (?\♥ "cH-")
+ (?\♦ "cD-")
+ (?\â™§ "cC-")
+ (?\♩ "Md")
+ (?\♪ "M8")
+ (?\♫ "M2")
+ (?\♬ "M16")
+ (?\â™­ "b")
+ (?\â™® "Mx")
+ (?\♯ "#")
+ (?\✓ "X")
+ (?\✗ "X")
+ (?\✠ "-X")
+ (?\  " ")
+ (?\〠",_")
+ (?\。 "._")
+ (?\〃 "+\"")
+ (?\〄 "JIS")
+ (?\々 "*_")
+ (?\〆 ";_")
+ (?\〇 "0_")
+ (?\《 "<+")
+ (?\》 ">+")
+ (?\「 "<'")
+ (?\〠">'")
+ (?\『 "<\"")
+ (?\〠">\"")
+ (?\〠"(\"")
+ (?\】 ")\"")
+ (?\〒 "=T")
+ (?\〓 "=_")
+ (?\〔 "('")
+ (?\〕 ")'")
+ (?\〖 "(I")
+ (?\〗 ")I")
+ (?\〚 "[[")
+ (?\〛 "]]")
+ (?\〜 "-?")
+ (?\〠 "=T:)")
+ (?\〿 " ")
+ (?\ã "A5")
+ (?\ã‚ "a5")
+ (?\ム"I5")
+ (?\ã„ "i5")
+ (?\ã… "U5")
+ (?\ㆠ"u5")
+ (?\㇠"E5")
+ (?\㈠"e5")
+ (?\㉠"O5")
+ (?\㊠"o5")
+ (?\ã‹ "ka")
+ (?\㌠"ga")
+ (?\ã "ki")
+ (?\㎠"gi")
+ (?\ã "ku")
+ (?\ã "gu")
+ (?\ã‘ "ke")
+ (?\ã’ "ge")
+ (?\ã“ "ko")
+ (?\ã” "go")
+ (?\ã• "sa")
+ (?\ã– "za")
+ (?\ã— "si")
+ (?\㘠"zi")
+ (?\ã™ "su")
+ (?\ãš "zu")
+ (?\ã› "se")
+ (?\㜠"ze")
+ (?\ã "so")
+ (?\ãž "zo")
+ (?\㟠"ta")
+ (?\ã  "da")
+ (?\ã¡ "ti")
+ (?\㢠"di")
+ (?\㣠"tU")
+ (?\㤠"tu")
+ (?\㥠"du")
+ (?\㦠"te")
+ (?\ã§ "de")
+ (?\㨠"to")
+ (?\ã© "do")
+ (?\㪠"na")
+ (?\ã« "ni")
+ (?\㬠"nu")
+ (?\ã­ "ne")
+ (?\ã® "no")
+ (?\㯠"ha")
+ (?\ã° "ba")
+ (?\ã± "pa")
+ (?\ã² "hi")
+ (?\ã³ "bi")
+ (?\ã´ "pi")
+ (?\ãµ "hu")
+ (?\ã¶ "bu")
+ (?\ã· "pu")
+ (?\㸠"he")
+ (?\ã¹ "be")
+ (?\㺠"pe")
+ (?\ã» "ho")
+ (?\ã¼ "bo")
+ (?\ã½ "po")
+ (?\ã¾ "ma")
+ (?\ã¿ "mi")
+ (?\ã‚€ "mu")
+ (?\ã‚ "me")
+ (?\ã‚‚ "mo")
+ (?\ゃ "yA")
+ (?\ã‚„ "ya")
+ (?\ã‚… "yU")
+ (?\ゆ "yu")
+ (?\ょ "yO")
+ (?\よ "yo")
+ (?\ら "ra")
+ (?\り "ri")
+ (?\ã‚‹ "ru")
+ (?\れ "re")
+ (?\ã‚ "ro")
+ (?\ゎ "wA")
+ (?\ã‚ "wa")
+ (?\ã‚ "wi")
+ (?\ã‚‘ "we")
+ (?\ã‚’ "wo")
+ (?\ã‚“ "n5")
+ (?\ã‚” "vu")
+ (?\ã‚› "\"5")
+ (?\゜ "05")
+ (?\ã‚ "*5")
+ (?\ゞ "+5")
+ (?\ã‚¡ "a6")
+ (?\ã‚¢ "A6")
+ (?\ã‚£ "i6")
+ (?\イ "I6")
+ (?\ã‚¥ "u6")
+ (?\ウ "U6")
+ (?\ã‚§ "e6")
+ (?\エ "E6")
+ (?\ã‚© "o6")
+ (?\オ "O6")
+ (?\ã‚« "Ka")
+ (?\ガ "Ga")
+ (?\ã‚­ "Ki")
+ (?\ã‚® "Gi")
+ (?\ク "Ku")
+ (?\ã‚° "Gu")
+ (?\ケ "Ke")
+ (?\ゲ "Ge")
+ (?\コ "Ko")
+ (?\ã‚´ "Go")
+ (?\サ "Sa")
+ (?\ã‚¶ "Za")
+ (?\ã‚· "Si")
+ (?\ジ "Zi")
+ (?\ス "Su")
+ (?\ズ "Zu")
+ (?\ã‚» "Se")
+ (?\ゼ "Ze")
+ (?\ソ "So")
+ (?\ゾ "Zo")
+ (?\ã‚¿ "Ta")
+ (?\ダ "Da")
+ (?\ム"Ti")
+ (?\ヂ "Di")
+ (?\ッ "TU")
+ (?\ツ "Tu")
+ (?\ヅ "Du")
+ (?\テ "Te")
+ (?\デ "De")
+ (?\ト "To")
+ (?\ド "Do")
+ (?\ナ "Na")
+ (?\ニ "Ni")
+ (?\ヌ "Nu")
+ (?\ム"Ne")
+ (?\ノ "No")
+ (?\ム"Ha")
+ (?\ム"Ba")
+ (?\パ "Pa")
+ (?\ヒ "Hi")
+ (?\ビ "Bi")
+ (?\ピ "Pi")
+ (?\フ "Hu")
+ (?\ブ "Bu")
+ (?\プ "Pu")
+ (?\ヘ "He")
+ (?\ベ "Be")
+ (?\ペ "Pe")
+ (?\ホ "Ho")
+ (?\ボ "Bo")
+ (?\ム"Po")
+ (?\マ "Ma")
+ (?\ミ "Mi")
+ (?\ム "Mu")
+ (?\メ "Me")
+ (?\モ "Mo")
+ (?\ャ "YA")
+ (?\ヤ "Ya")
+ (?\ュ "YU")
+ (?\ユ "Yu")
+ (?\ョ "YO")
+ (?\ヨ "Yo")
+ (?\ラ "Ra")
+ (?\リ "Ri")
+ (?\ル "Ru")
+ (?\レ "Re")
+ (?\ロ "Ro")
+ (?\ヮ "WA")
+ (?\ワ "Wa")
+ (?\ヰ "Wi")
+ (?\ヱ "We")
+ (?\ヲ "Wo")
+ (?\ン "N6")
+ (?\ヴ "Vu")
+ (?\ヵ "KA")
+ (?\ヶ "KE")
+ (?\ヷ "Va")
+ (?\ヸ "Vi")
+ (?\ヹ "Ve")
+ (?\ヺ "Vo")
+ (?\・ ".6")
+ (?\ー "-6")
+ (?\ヽ "*6")
+ (?\ヾ "+6")
+ (?\ã„… "b4")
+ (?\ㄆ "p4")
+ (?\ㄇ "m4")
+ (?\ㄈ "f4")
+ (?\ㄉ "d4")
+ (?\ㄊ "t4")
+ (?\ã„‹ "n4")
+ (?\ㄌ "l4")
+ (?\ã„ "g4")
+ (?\ㄎ "k4")
+ (?\ã„ "h4")
+ (?\ã„ "j4")
+ (?\ã„‘ "q4")
+ (?\ã„’ "x4")
+ (?\ã„“ "zh")
+ (?\ã„” "ch")
+ (?\ã„• "sh")
+ (?\ã„– "r4")
+ (?\ã„— "z4")
+ (?\ㄘ "c4")
+ (?\ã„™ "s4")
+ (?\ㄚ "a4")
+ (?\ã„› "o4")
+ (?\ㄜ "e4")
+ (?\ã„ "eh4")
+ (?\ㄞ "ai")
+ (?\ㄟ "ei")
+ (?\ã„  "au")
+ (?\ã„¡ "ou")
+ (?\ã„¢ "an")
+ (?\ã„£ "en")
+ (?\ㄤ "aN")
+ (?\ã„¥ "eN")
+ (?\ㄦ "er")
+ (?\ã„§ "i4")
+ (?\ㄨ "u4")
+ (?\ã„© "iu")
+ (?\ㄪ "v4")
+ (?\ã„« "nG")
+ (?\ㄬ "gn")
+ (?\㈜ "(JU)")
+ (?\㈠ "1c")
+ (?\㈡ "2c")
+ (?\㈢ "3c")
+ (?\㈣ "4c")
+ (?\㈤ "5c")
+ (?\㈥ "6c")
+ (?\㈦ "7c")
+ (?\㈧ "8c")
+ (?\㈨ "9c")
+ (?\㈩ "10c")
+ (?\㉿ "KSC")
+ (?\ã‚ "am")
+ (?\㘠"pm")
+ (?\ff "ff")
+ (?\ï¬ "fi")
+ (?\fl "fl")
+ (?\ffi "ffi")
+ (?\ffl "ffl")
+ (?\ſt "St")
+ (?\st "st")
+ (?\ï¹½ "3+;")
+ (?\ﺂ "aM.")
+ (?\ﺄ "aH.")
+ (?\ﺈ "ah.")
+ (?\ïº "a+-")
+ (?\ﺎ "a+.")
+ (?\ïº "b+-")
+ (?\ïº "b+.")
+ (?\ﺑ "b+,")
+ (?\ﺒ "b+;")
+ (?\ﺓ "tm-")
+ (?\ﺔ "tm.")
+ (?\ﺕ "t+-")
+ (?\ﺖ "t+.")
+ (?\ﺗ "t+,")
+ (?\ﺘ "t+;")
+ (?\ﺙ "tk-")
+ (?\ﺚ "tk.")
+ (?\ﺛ "tk,")
+ (?\ﺜ "tk;")
+ (?\ïº "g+-")
+ (?\ﺞ "g+.")
+ (?\ﺟ "g+,")
+ (?\ﺠ "g+;")
+ (?\ﺡ "hk-")
+ (?\ﺢ "hk.")
+ (?\ﺣ "hk,")
+ (?\ﺤ "hk;")
+ (?\ﺥ "x+-")
+ (?\ﺦ "x+.")
+ (?\ﺧ "x+,")
+ (?\ﺨ "x+;")
+ (?\ﺩ "d+-")
+ (?\ﺪ "d+.")
+ (?\ﺫ "dk-")
+ (?\ﺬ "dk.")
+ (?\ﺭ "r+-")
+ (?\ﺮ "r+.")
+ (?\ﺯ "z+-")
+ (?\ﺰ "z+.")
+ (?\ﺱ "s+-")
+ (?\ﺲ "s+.")
+ (?\ﺳ "s+,")
+ (?\ﺴ "s+;")
+ (?\ﺵ "sn-")
+ (?\ﺶ "sn.")
+ (?\ﺷ "sn,")
+ (?\ﺸ "sn;")
+ (?\ﺹ "c+-")
+ (?\ﺺ "c+.")
+ (?\ﺻ "c+,")
+ (?\ﺼ "c+;")
+ (?\ﺽ "dd-")
+ (?\ﺾ "dd.")
+ (?\ﺿ "dd,")
+ (?\ﻀ "dd;")
+ (?\ï» "tj-")
+ (?\ﻂ "tj.")
+ (?\ﻃ "tj,")
+ (?\ﻄ "tj;")
+ (?\ï»… "zH-")
+ (?\ﻆ "zH.")
+ (?\ﻇ "zH,")
+ (?\ﻈ "zH;")
+ (?\ﻉ "e+-")
+ (?\ﻊ "e+.")
+ (?\ﻋ "e+,")
+ (?\ﻌ "e+;")
+ (?\ï» "i+-")
+ (?\ﻎ "i+.")
+ (?\ï» "i+,")
+ (?\ï» "i+;")
+ (?\ﻑ "f+-")
+ (?\ï»’ "f+.")
+ (?\ﻓ "f+,")
+ (?\ï»” "f+;")
+ (?\ﻕ "q+-")
+ (?\ï»– "q+.")
+ (?\ï»— "q+,")
+ (?\ﻘ "q+;")
+ (?\ï»™ "k+-")
+ (?\ﻚ "k+.")
+ (?\ï»› "k+,")
+ (?\ﻜ "k+;")
+ (?\ï» "l+-")
+ (?\ﻞ "l+.")
+ (?\ﻟ "l+,")
+ (?\ï»  "l+;")
+ (?\ﻡ "m+-")
+ (?\ﻢ "m+.")
+ (?\ﻣ "m+,")
+ (?\ﻤ "m+;")
+ (?\ﻥ "n+-")
+ (?\ﻦ "n+.")
+ (?\ï»§ "n+,")
+ (?\ﻨ "n+;")
+ (?\ﻩ "h+-")
+ (?\ﻪ "h+.")
+ (?\ﻫ "h+,")
+ (?\ﻬ "h+;")
+ (?\ï»­ "w+-")
+ (?\ï»® "w+.")
+ (?\ﻯ "j+-")
+ (?\ï»° "j+.")
+ (?\ï»± "y+-")
+ (?\ﻲ "y+.")
+ (?\ﻳ "y+,")
+ (?\ï»´ "y+;")
+ (?\ﻵ "lM-")
+ (?\ï»¶ "lM.")
+ (?\ï»· "lH-")
+ (?\ﻸ "lH.")
+ (?\ﻹ "lh-")
+ (?\ﻺ "lh.")
+ (?\ï»» "la-")
+ (?\ﻼ "la.")
+ (?\ï¼ "!")
+ (?\" "\"")
+ (?\# "#")
+ (?\$ "$")
+ (?\ï¼… "%")
+ (?\& "&")
+ (?\' "'")
+ (?\( "(")
+ (?\) ")")
+ (?\* "*")
+ (?\+ "+")
+ (?\, ",")
+ (?\ï¼ "-")
+ (?\. ".")
+ (?\ï¼ "/")
+ (?\ï¼ "0")
+ (?\1 "1")
+ (?\ï¼’ "2")
+ (?\3 "3")
+ (?\ï¼” "4")
+ (?\5 "5")
+ (?\ï¼– "6")
+ (?\ï¼— "7")
+ (?\8 "8")
+ (?\ï¼™ "9")
+ (?\: ":")
+ (?\ï¼› ";")
+ (?\< "<")
+ (?\ï¼ "=")
+ (?\> ">")
+ (?\? "?")
+ (?\ï¼  "@")
+ (?\A "A")
+ (?\ï¼¢ "B")
+ (?\ï¼£ "C")
+ (?\D "D")
+ (?\ï¼¥ "E")
+ (?\F "F")
+ (?\ï¼§ "G")
+ (?\H "H")
+ (?\I "I")
+ (?\J "J")
+ (?\K "K")
+ (?\L "L")
+ (?\ï¼­ "M")
+ (?\ï¼® "N")
+ (?\O "O")
+ (?\ï¼° "P")
+ (?\ï¼± "Q")
+ (?\ï¼² "R")
+ (?\ï¼³ "S")
+ (?\ï¼´ "T")
+ (?\ï¼µ "U")
+ (?\ï¼¶ "V")
+ (?\ï¼· "W")
+ (?\X "X")
+ (?\ï¼¹ "Y")
+ (?\Z "Z")
+ (?\ï¼» "[")
+ (?\ï¼¼ "\\")
+ (?\ï¼½ "]")
+ (?\ï¼¾ "^")
+ (?\_ "_")
+ (?\ï½€ "`")
+ (?\ï½ "a")
+ (?\b "b")
+ (?\c "c")
+ (?\d "d")
+ (?\ï½… "e")
+ (?\f "f")
+ (?\g "g")
+ (?\h "h")
+ (?\i "i")
+ (?\j "j")
+ (?\k "k")
+ (?\l "l")
+ (?\ï½ "m")
+ (?\n "n")
+ (?\ï½ "o")
+ (?\ï½ "p")
+ (?\q "q")
+ (?\ï½’ "r")
+ (?\s "s")
+ (?\ï½” "t")
+ (?\u "u")
+ (?\ï½– "v")
+ (?\ï½— "w")
+ (?\x "x")
+ (?\ï½™ "y")
+ (?\z "z")
+ (?\ï½› "{")
+ (?\| "|")
+ (?\ï½ "}")
+ (?\~ "~")
+ (?\。 ".")
+ (?\ï½¢ "\"")
+ (?\ï½£ "\"")
+ (?\、 ",")
;; Not from Lynx
- (?$,3r_(B "")
- (?$,3u=(B "?")))))
+ (? "")
+ (?� "?")))))
(aset standard-display-table
(make-char 'mule-unicode-0100-24ff) nil)
(aset standard-display-table
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index f51daa0eac0..0806006a6c3 100644
--- a/lisp/international/mule-cmds.el
+++ b/lisp/international/mule-cmds.el
@@ -1,4 +1,4 @@
-;;; mule-cmds.el --- commands for multilingual environment -*-coding: iso-2022-7bit -*-
+;;; mule-cmds.el --- commands for multilingual environment -*-coding: utf-8 -*-
;; Copyright (C) 1997-2013 Free Software Foundation, Inc.
;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
@@ -2945,20 +2945,26 @@ at the beginning of the name.
This function also accepts a hexadecimal number of Unicode code
point or a number in hash notation, e.g. #o21430 for octal,
#x2318 for hex, or #10r8984 for decimal."
- (let* ((completion-ignore-case t)
- (input (completing-read
- prompt
- (lambda (string pred action)
- (if (eq action 'metadata)
- '(metadata (category . unicode-name))
- (complete-with-action action (ucs-names) string pred))))))
- (cond
- ((string-match-p "\\`[0-9a-fA-F]+\\'" input)
- (string-to-number input 16))
- ((string-match-p "\\`#" input)
- (read input))
- (t
- (cdr (assoc-string input (ucs-names) t))))))
+ (let* ((enable-recursive-minibuffers t)
+ (completion-ignore-case t)
+ (input
+ (completing-read
+ prompt
+ (lambda (string pred action)
+ (if (eq action 'metadata)
+ '(metadata (category . unicode-name))
+ (complete-with-action action (ucs-names) string pred)))))
+ (char
+ (cond
+ ((string-match-p "\\`[0-9a-fA-F]+\\'" input)
+ (string-to-number input 16))
+ ((string-match-p "\\`#" input)
+ (read input))
+ (t
+ (cdr (assoc-string input (ucs-names) t))))))
+ (unless (characterp char)
+ (error "Invalid character"))
+ char))
(define-obsolete-function-alias 'ucs-insert 'insert-char "24.3")
(define-key ctl-x-map "8\r" 'insert-char)
diff --git a/lisp/international/mule-util.el b/lisp/international/mule-util.el
index 5cfc4be4316..15a7dc10f65 100644
--- a/lisp/international/mule-util.el
+++ b/lisp/international/mule-util.el
@@ -132,38 +132,38 @@ defaults to \"...\"."
;; (("xy" 2 1) . "y")
;; (("xy" 0) . "")
;; (("xy" 3) . "xy")
-;; (("$AVP(B" 0) . "")
-;; (("$AVP(B" 1) . "")
-;; (("$AVP(B" 2) . "$AVP(B")
-;; (("$AVP(B" 1 nil ? ) . " ")
-;; (("$AVPND(B" 3 1 ? ) . " ")
-;; (("x$AVP(Bx" 2) . "x")
-;; (("x$AVP(Bx" 3) . "x$AVP(B")
-;; (("x$AVP(Bx" 3) . "x$AVP(B")
-;; (("x$AVP(Bx" 4 1) . "$AVP(Bx")
-;; (("kor$(CGQ(Be$(C1[(Ban" 8 1 ? ) . "or$(CGQ(Be$(C1[(B")
-;; (("kor$(CGQ(Be$(C1[(Ban" 7 2 ? ) . "r$(CGQ(Be ")
+;; (("中" 0) . "")
+;; (("中" 1) . "")
+;; (("中" 2) . "中")
+;; (("中" 1 nil ? ) . " ")
+;; (("中文" 3 1 ? ) . " ")
+;; (("x中x" 2) . "x")
+;; (("x中x" 3) . "x中")
+;; (("x中x" 3) . "x中")
+;; (("x中x" 4 1) . "中x")
+;; (("kor한e글an" 8 1 ? ) . "or한e글")
+;; (("kor한e글an" 7 2 ? ) . "r한e ")
;; (("" 0 nil nil "...") . "")
;; (("x" 3 nil nil "...") . "x")
-;; (("$AVP(B" 3 nil nil "...") . "$AVP(B")
+;; (("中" 3 nil nil "...") . "中")
;; (("foo" 3 nil nil "...") . "foo")
;; (("foo" 2 nil nil "...") . "fo") ;; XEmacs failure?
;; (("foobar" 6 0 nil "...") . "foobar")
;; (("foobarbaz" 6 nil nil "...") . "foo...")
;; (("foobarbaz" 7 2 nil "...") . "ob...")
;; (("foobarbaz" 9 3 nil "...") . "barbaz")
-;; (("$A$3(Bh$A$s(Be$A$K(Bl$A$A(Bl$A$O(Bo" 15 1 ? t) . " h$A$s(Be$A$K(Bl$A$A(Bl$A$O(Bo")
-;; (("$A$3(Bh$A$s(Be$A$K(Bl$A$A(Bl$A$O(Bo" 14 1 ? t) . " h$A$s(Be$A$K(Bl$A$A(B...")
-;; (("x" 3 nil nil "$(Gemk#(B") . "x")
-;; (("$AVP(B" 2 nil nil "$(Gemk#(B") . "$AVP(B")
-;; (("$AVP(B" 1 nil ?x "$(Gemk#(B") . "x") ;; XEmacs error
-;; (("$AVPND(B" 3 nil ? "$(Gemk#(B") . "$AVP(B ") ;; XEmacs error
-;; (("foobarbaz" 4 nil nil "$(Gemk#(B") . "$(Gemk#(B")
-;; (("foobarbaz" 5 nil nil "$(Gemk#(B") . "f$(Gemk#(B")
-;; (("foobarbaz" 6 nil nil "$(Gemk#(B") . "fo$(Gemk#(B")
-;; (("foobarbaz" 8 3 nil "$(Gemk#(B") . "b$(Gemk#(B")
-;; (("$A$3(Bh$A$s(Be$A$K(Bl$A$A(Bl$A$O(Bo" 14 4 ?x "$AHU1>$(Gk#(B") . "xe$A$KHU1>$(Gk#(B")
-;; (("$A$3(Bh$A$s(Be$A$K(Bl$A$A(Bl$A$O(Bo" 13 4 ?x "$AHU1>$(Gk#(B") . "xex$AHU1>$(Gk#(B")
+;; (("ã“hã‚“eã«lã¡lã¯o" 15 1 ? t) . " hã‚“eã«lã¡lã¯o")
+;; (("ã“hã‚“eã«lã¡lã¯o" 14 1 ? t) . " hã‚“eã«lã¡...")
+;; (("x" 3 nil nil "粵語") . "x")
+;; (("中" 2 nil nil "粵語") . "中")
+;; (("中" 1 nil ?x "粵語") . "x") ;; XEmacs error
+;; (("中文" 3 nil ? "粵語") . "中 ") ;; XEmacs error
+;; (("foobarbaz" 4 nil nil "粵語") . "粵語")
+;; (("foobarbaz" 5 nil nil "粵語") . "f粵語")
+;; (("foobarbaz" 6 nil nil "粵語") . "fo粵語")
+;; (("foobarbaz" 8 3 nil "粵語") . "b粵語")
+;; (("ã“hã‚“eã«lã¡lã¯o" 14 4 ?x "日本語") . "xeã«æ—¥æœ¬èªž")
+;; (("ã“hã‚“eã«lã¡lã¯o" 13 4 ?x "日本語") . "xex日本語")
;; ))
;; (let (ret)
;; (condition-case e
@@ -367,7 +367,7 @@ per-character basis, this may not be accurate."
(provide 'mule-util)
;; Local Variables:
-;; coding: iso-2022-7bit
+;; coding: utf-8
;; End:
;;; mule-util.el ends here
diff --git a/lisp/international/mule.el b/lisp/international/mule.el
index 6fa589a9622..dd0f3821728 100644
--- a/lisp/international/mule.el
+++ b/lisp/international/mule.el
@@ -891,7 +891,7 @@ or one is an alias of the other."
(and (vectorp eol-type-1) (vectorp eol-type-2)))))))
(defun add-to-coding-system-list (coding-system)
- "Add CODING-SYSTEM to `coding-system-list' while keeping it sorted."
+ "Add CODING-SYSTEM to variable `coding-system-list' while keeping it sorted."
(if (or (null coding-system-list)
(coding-system-lessp coding-system (car coding-system-list)))
(setq coding-system-list (cons coding-system coding-system-list))
@@ -1132,17 +1132,20 @@ FORM is a form to evaluate to define the coding-system."
(put (intern name) 'coding-system-define-form form)
(setq coding-system-alist (cons (list name) coding-system-alist)))))
-;; This variable is set in these three cases:
+;; This variable is set in these two cases:
;; (1) A file is read by a coding system specified explicitly.
-;; after-insert-file-set-coding sets the car of this value to
-;; coding-system-for-read, and sets the cdr to nil.
-;; (2) A buffer is saved.
-;; After writing, basic-save-buffer-1 sets the car of this value
-;; to last-coding-system-used.
-;; (3) set-buffer-file-coding-system is called.
+;; `after-insert-file-set-coding' sets the car of this value to
+;; `coding-system-for-read', and sets the cdr to nil.
+;; (2) `set-buffer-file-coding-system' is called.
;; The cdr of this value is set to the specified coding system.
-;; This variable is used for decoding in revert-buffer and encoding in
-;; select-safe-coding-system.
+;; This variable is used for decoding in `revert-buffer' and encoding
+;; in `select-safe-coding-system'.
+;;
+;; When saving a buffer, if `buffer-file-coding-system-explicit' is
+;; already non-nil, `basic-save-buffer-1' sets its CAR to the value of
+;; `last-coding-system-used'. (It used to set it unconditionally, but
+;; that seems unnecessary; see Bug#4533.)
+
(defvar buffer-file-coding-system-explicit nil
"The file coding system explicitly specified for the current buffer.
The value is a cons of coding systems for reading (decoding) and
@@ -1841,8 +1844,11 @@ If nothing is specified, the return value is nil."
(re-search-forward
"\\(.*;\\)?[ \t]*unibyte:[ \t]*\\([^ ;]+\\)"
head-end t))
- (display-warning 'mule "`unibyte: t' is obsolete; \
-use \"coding: 'raw-text\" instead." :warning)
+ (display-warning 'mule
+ (format "\"unibyte: t\" (in %s) is obsolete; \
+use \"coding: 'raw-text\" instead."
+ (file-relative-name filename))
+ :warning)
(setq coding-system 'raw-text))
(when (and (not coding-system)
(re-search-forward
diff --git a/lisp/isearch.el b/lisp/isearch.el
index ad5331f5bf2..b36b250738a 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -176,7 +176,7 @@ is non-nil if the user quits the search.")
(defvar isearch-message-function nil
"Function to call to display the search prompt.
-If nil, use `isearch-message'.")
+If nil, use function `isearch-message'.")
(defvar isearch-wrap-function nil
"Function to call to wrap the search when search is failed.
@@ -374,10 +374,12 @@ but outside of this help window when you type them in Isearch mode,
they exit Isearch mode before displaying global help."
isearch-help-map)
+(defvar isearch--display-help-action '(nil (inhibit-same-window . t)))
+
(defun isearch-help-for-help ()
"Display Isearch help menu."
(interactive)
- (let (same-window-buffer-names same-window-regexps)
+ (let ((display-buffer-overriding-action isearch--display-help-action))
(isearch-help-for-help-internal))
(isearch-update))
@@ -385,7 +387,7 @@ they exit Isearch mode before displaying global help."
"Show a list of all keys defined in Isearch mode, and their definitions.
This is like `describe-bindings', but displays only Isearch keys."
(interactive)
- (let (same-window-buffer-names same-window-regexps)
+ (let ((display-buffer-overriding-action isearch--display-help-action))
(with-help-window "*Help*"
(with-current-buffer standard-output
(princ "Isearch Mode Bindings:\n")
@@ -394,14 +396,14 @@ This is like `describe-bindings', but displays only Isearch keys."
(defun isearch-describe-key ()
"Display documentation of the function invoked by isearch key."
(interactive)
- (let (same-window-buffer-names same-window-regexps)
+ (let ((display-buffer-overriding-action isearch--display-help-action))
(call-interactively 'describe-key))
(isearch-update))
(defun isearch-describe-mode ()
"Display documentation of Isearch mode."
(interactive)
- (let (same-window-buffer-names same-window-regexps)
+ (let ((display-buffer-overriding-action isearch--display-help-action))
(describe-function 'isearch-forward))
(isearch-update))
@@ -518,7 +520,7 @@ This is like `describe-bindings', but displays only Isearch keys."
(define-key map "\C-x" nil)
(define-key map [?\C-x t] 'isearch-other-control-char)
(define-key map "\C-x8" nil)
- (define-key map "\C-x8\r" 'isearch-other-control-char)
+ (define-key map "\C-x8\r" 'isearch-insert-char-by-name)
map)
"Keymap for `isearch-mode'.")
@@ -1099,7 +1101,7 @@ nonincremental search instead via `isearch-edit-string'."
(defun isearch-fail-pos (&optional msg)
"Return position of first mismatch in search string, or nil if none.
-If MSG is non-nil, use `isearch-message', otherwise `isearch-string'."
+If MSG is non-nil, use variable `isearch-message', otherwise `isearch-string'."
(let ((cmds isearch-cmds)
(curr-msg (if msg isearch-message isearch-string))
succ-msg)
@@ -1116,23 +1118,17 @@ If MSG is non-nil, use `isearch-message', otherwise `isearch-string'."
(length succ-msg)
0))))
-(defun isearch-edit-string ()
- "Edit the search string in the minibuffer.
-The following additional command keys are active while editing.
-\\<minibuffer-local-isearch-map>
-\\[exit-minibuffer] to resume incremental searching with the edited string.
-\\[isearch-nonincremental-exit-minibuffer] to do one nonincremental search.
-\\[isearch-forward-exit-minibuffer] to resume isearching forward.
-\\[isearch-reverse-exit-minibuffer] to resume isearching backward.
-\\[isearch-complete-edit] to complete the search string using the search ring."
-
+(defmacro with-isearch-suspended (&rest body)
+ "Exit Isearch mode, run BODY, and reinvoke the pending search.
+You can update the global isearch variables by setting new values to
+`isearch-new-string', `isearch-new-message', `isearch-new-forward',
+`isearch-new-word', `isearch-new-case-fold'."
;; This code is very hairy for several reasons, explained in the code.
;; Mainly, isearch-mode must be terminated while editing and then restarted.
;; If there were a way to catch any change of buffer from the minibuffer,
;; this could be simplified greatly.
;; Editing doesn't back up the search point. Should it?
- (interactive)
- (condition-case nil
+ `(condition-case nil
(progn
(let ((isearch-nonincremental isearch-nonincremental)
@@ -1195,29 +1191,7 @@ The following additional command keys are active while editing.
(setq old-point (point) old-other-end isearch-other-end)
(unwind-protect
- (let* ((message-log-max nil)
- ;; Don't add a new search string to the search ring here
- ;; in `read-from-minibuffer'. It should be added only
- ;; by `isearch-update-ring' called from `isearch-done'.
- (history-add-new-input nil)
- ;; Binding minibuffer-history-symbol to nil is a work-around
- ;; for some incompatibility with gmhist.
- (minibuffer-history-symbol))
- (setq isearch-new-string
- (read-from-minibuffer
- (isearch-message-prefix nil isearch-nonincremental)
- (cons isearch-string (1+ (or (isearch-fail-pos)
- (length isearch-string))))
- minibuffer-local-isearch-map nil
- (if isearch-regexp
- (cons 'regexp-search-ring
- (1+ (or regexp-search-ring-yank-pointer -1)))
- (cons 'search-ring
- (1+ (or search-ring-yank-pointer -1))))
- nil t)
- isearch-new-message
- (mapconcat 'isearch-text-char-description
- isearch-new-string "")))
+ (progn ,@body)
;; Set point at the start (end) of old match if forward (backward),
;; so after exiting minibuffer isearch resumes at the start (end)
@@ -1276,6 +1250,41 @@ The following additional command keys are active while editing.
(isearch-abort) ;; outside of let to restore outside global values
)))
+(defun isearch-edit-string ()
+ "Edit the search string in the minibuffer.
+The following additional command keys are active while editing.
+\\<minibuffer-local-isearch-map>
+\\[exit-minibuffer] to resume incremental searching with the edited string.
+\\[isearch-nonincremental-exit-minibuffer] to do one nonincremental search.
+\\[isearch-forward-exit-minibuffer] to resume isearching forward.
+\\[isearch-reverse-exit-minibuffer] to resume isearching backward.
+\\[isearch-complete-edit] to complete the search string using the search ring."
+ (interactive)
+ (with-isearch-suspended
+ (let* ((message-log-max nil)
+ ;; Don't add a new search string to the search ring here
+ ;; in `read-from-minibuffer'. It should be added only
+ ;; by `isearch-update-ring' called from `isearch-done'.
+ (history-add-new-input nil)
+ ;; Binding minibuffer-history-symbol to nil is a work-around
+ ;; for some incompatibility with gmhist.
+ (minibuffer-history-symbol))
+ (setq isearch-new-string
+ (read-from-minibuffer
+ (isearch-message-prefix nil isearch-nonincremental)
+ (cons isearch-string (1+ (or (isearch-fail-pos)
+ (length isearch-string))))
+ minibuffer-local-isearch-map nil
+ (if isearch-regexp
+ (cons 'regexp-search-ring
+ (1+ (or regexp-search-ring-yank-pointer -1)))
+ (cons 'search-ring
+ (1+ (or search-ring-yank-pointer -1))))
+ nil t)
+ isearch-new-message
+ (mapconcat 'isearch-text-char-description
+ isearch-new-string "")))))
+
(defun isearch-nonincremental-exit-minibuffer ()
(interactive)
(setq isearch-nonincremental t)
@@ -1705,6 +1714,9 @@ and reads its face argument using `hi-lock-read-face-name'."
(defun isearch-delete-char ()
"Discard last input item and move point back.
+Last input means the last character or the last isearch command
+that added or deleted characters from the search string,
+moved point, toggled regexp mode or case-sensitivity, etc.
If no previous match was done, just beep."
(interactive)
(if (null (cdr isearch-cmds))
@@ -1714,6 +1726,8 @@ If no previous match was done, just beep."
(defun isearch-del-char (&optional arg)
"Delete character from end of search string and search again.
+Unlike `isearch-delete-char', it only deletes the last character,
+but doesn't cancel the effect of other isearch command.
If search string is empty, just beep."
(interactive "p")
(if (= 0 (length isearch-string))
@@ -1834,6 +1848,17 @@ Subword is used when `subword-mode' is activated. "
(lambda () (let ((inhibit-field-text-motion t))
(line-end-position (if (eolp) 2 1))))))
+(defun isearch-insert-char-by-name ()
+ "Read a character by its Unicode name and insert it into search string."
+ (interactive)
+ (with-isearch-suspended
+ (let ((char (read-char-by-name "Insert character (Unicode name or hex): ")))
+ (when char
+ (setq isearch-new-string (concat isearch-string (string char))
+ isearch-new-message (concat isearch-message
+ (mapconcat 'isearch-text-char-description
+ (string char) "")))))))
+
(defun isearch-search-and-update ()
;; Do the search and update the display.
(when (or isearch-success
diff --git a/lisp/iswitchb.el b/lisp/iswitchb.el
index e141a771c52..07873db38e1 100644
--- a/lisp/iswitchb.el
+++ b/lisp/iswitchb.el
@@ -471,6 +471,8 @@ interfere with other minibuffer usage.")
(define-key map "?" 'iswitchb-completion-help)
(define-key map "\C-s" 'iswitchb-next-match)
(define-key map "\C-r" 'iswitchb-prev-match)
+ (define-key map [?\C-.] 'iswitchb-next-match)
+ (define-key map [?\C-,] 'iswitchb-prev-match)
(define-key map "\t" 'iswitchb-complete)
(define-key map "\C-j" 'iswitchb-select-buffer-text)
(define-key map "\C-t" 'iswitchb-toggle-regexp)
diff --git a/lisp/jit-lock.el b/lisp/jit-lock.el
index 7be5df72c84..9359a65a1b8 100644
--- a/lisp/jit-lock.el
+++ b/lisp/jit-lock.el
@@ -1,4 +1,4 @@
-;;; jit-lock.el --- just-in-time fontification
+;;; jit-lock.el --- just-in-time fontification -*- lexical-binding: t -*-
;; Copyright (C) 1998, 2000-2013 Free Software Foundation, Inc.
@@ -132,20 +132,16 @@ If nil, fontification is not deferred."
;;; Variables that are not customizable.
-(defvar jit-lock-mode nil
+(defvar-local jit-lock-mode nil
"Non-nil means Just-in-time Lock mode is active.")
-(make-variable-buffer-local 'jit-lock-mode)
-(defvar jit-lock-functions nil
+(defvar-local jit-lock-functions nil
"Functions to do the actual fontification.
They are called with two arguments: the START and END of the region to fontify.")
-(make-variable-buffer-local 'jit-lock-functions)
-(defvar jit-lock-context-unfontify-pos nil
+(defvar-local jit-lock-context-unfontify-pos nil
"Consider text after this position as contextually unfontified.
If nil, contextual fontification is disabled.")
-(make-variable-buffer-local 'jit-lock-context-unfontify-pos)
-
(defvar jit-lock-stealth-timer nil
"Timer for stealth fontification in Just-in-time Lock mode.")
@@ -257,6 +253,47 @@ the variable `jit-lock-stealth-nice'."
(remove-hook 'after-change-functions 'jit-lock-after-change t)
(remove-hook 'fontification-functions 'jit-lock-function))))
+(define-minor-mode jit-lock-debug-mode
+ "Minor mode to help debug code run from jit-lock.
+When this minor mode is enabled, jit-lock runs as little code as possible
+during redisplay and moves the rest to a timer, where things
+like `debug-on-error' and Edebug can be used."
+ :global t
+ (when jit-lock-defer-timer
+ (cancel-timer jit-lock-defer-timer)
+ (setq jit-lock-defer-timer nil))
+ (when jit-lock-debug-mode
+ (setq jit-lock-defer-timer
+ (run-with-idle-timer 0 t #'jit-lock--debug-fontify))))
+
+(defvar jit-lock--debug-fontifying nil)
+
+(defun jit-lock--debug-fontify ()
+ "Fontify what was deferred for debugging."
+ (when (and (not jit-lock--debug-fontifying)
+ jit-lock-defer-buffers (not memory-full))
+ (let ((jit-lock--debug-fontifying t)
+ (inhibit-debugger nil)) ;FIXME: Not sufficient!
+ ;; Mark the deferred regions back to `fontified = nil'
+ (dolist (buffer jit-lock-defer-buffers)
+ (when (buffer-live-p buffer)
+ (with-current-buffer buffer
+ ;; (message "Jit-Debug %s" (buffer-name))
+ (with-buffer-prepared-for-jit-lock
+ (let ((pos (point-min)))
+ (while
+ (progn
+ (when (eq (get-text-property pos 'fontified) 'defer)
+ (let ((beg pos)
+ (end (setq pos (next-single-property-change
+ pos 'fontified
+ nil (point-max)))))
+ (put-text-property beg end 'fontified nil)
+ (jit-lock-fontify-now beg end)))
+ (setq pos (next-single-property-change
+ pos 'fontified)))))))))
+ (setq jit-lock-defer-buffers nil))))
+
(defun jit-lock-register (fun &optional contextual)
"Register FUN as a fontification function to be called in this buffer.
FUN will be called with two arguments START and END indicating the region
@@ -264,7 +301,7 @@ that needs to be (re)fontified.
If non-nil, CONTEXTUAL means that a contextual fontification would be useful."
(add-hook 'jit-lock-functions fun nil t)
(when (and contextual jit-lock-contextually)
- (set (make-local-variable 'jit-lock-contextually) t))
+ (setq-local jit-lock-contextually t))
(jit-lock-mode t))
(defun jit-lock-unregister (fun)
@@ -375,21 +412,24 @@ Defaults to the whole buffer. END can be out of bounds."
;; eagerly extend the refontified region with
;; jit-lock-after-change-extend-region-functions.
(when (< start orig-start)
- (run-with-timer 0 nil 'jit-lock-force-redisplay
- (current-buffer) start orig-start))
+ (run-with-timer 0 nil #'jit-lock-force-redisplay
+ (copy-marker start) (copy-marker orig-start)))
;; Find the start of the next chunk, if any.
(setq start (text-property-any next end 'fontified nil))))))))
-(defun jit-lock-force-redisplay (buf start end)
+(defun jit-lock-force-redisplay (start end)
"Force the display engine to re-render buffer BUF from START to END."
- (with-current-buffer buf
- (with-buffer-prepared-for-jit-lock
- ;; Don't cause refontification (it's already been done), but just do
- ;; some random buffer change, so as to force redisplay.
- (put-text-property start end 'fontified t))))
-
-
+ (when (marker-buffer start)
+ (with-current-buffer (marker-buffer start)
+ (with-buffer-prepared-for-jit-lock
+ (when (> end (point-max))
+ (setq end (point-max) start (min start end)))
+ (when (< start (point-min))
+ (setq start (point-min) end (max start end)))
+ ;; Don't cause refontification (it's already been done), but just do
+ ;; some random buffer change, so as to force redisplay.
+ (put-text-property start end 'fontified t)))))
;;; Stealth fontification.
@@ -398,41 +438,39 @@ Defaults to the whole buffer. END can be out of bounds."
Value is nil if there is nothing more to fontify."
(if (zerop (buffer-size))
nil
- (save-restriction
- (widen)
- (let* ((next (text-property-not-all around (point-max) 'fontified t))
- (prev (previous-single-property-change around 'fontified))
- (prop (get-text-property (max (point-min) (1- around))
- 'fontified))
- (start (cond
- ((null prev)
- ;; There is no property change between AROUND
- ;; and the start of the buffer. If PROP is
- ;; non-nil, everything in front of AROUND is
- ;; fontified, otherwise nothing is fontified.
- (if (eq prop t)
- nil
- (max (point-min)
- (- around (/ jit-lock-chunk-size 2)))))
- ((eq prop t)
- ;; PREV is the start of a region of fontified
- ;; text containing AROUND. Start fontifying a
- ;; chunk size before the end of the unfontified
- ;; region in front of that.
- (max (or (previous-single-property-change prev 'fontified)
- (point-min))
- (- prev jit-lock-chunk-size)))
- (t
- ;; PREV is the start of a region of unfontified
- ;; text containing AROUND. Start at PREV or
- ;; chunk size in front of AROUND, whichever is
- ;; nearer.
- (max prev (- around jit-lock-chunk-size)))))
- (result (cond ((null start) next)
- ((null next) start)
- ((< (- around start) (- next around)) start)
- (t next))))
- result))))
+ (let* ((next (text-property-not-all around (point-max) 'fontified t))
+ (prev (previous-single-property-change around 'fontified))
+ (prop (get-text-property (max (point-min) (1- around))
+ 'fontified))
+ (start (cond
+ ((null prev)
+ ;; There is no property change between AROUND
+ ;; and the start of the buffer. If PROP is
+ ;; non-nil, everything in front of AROUND is
+ ;; fontified, otherwise nothing is fontified.
+ (if (eq prop t)
+ nil
+ (max (point-min)
+ (- around (/ jit-lock-chunk-size 2)))))
+ ((eq prop t)
+ ;; PREV is the start of a region of fontified
+ ;; text containing AROUND. Start fontifying a
+ ;; chunk size before the end of the unfontified
+ ;; region in front of that.
+ (max (or (previous-single-property-change prev 'fontified)
+ (point-min))
+ (- prev jit-lock-chunk-size)))
+ (t
+ ;; PREV is the start of a region of unfontified
+ ;; text containing AROUND. Start at PREV or
+ ;; chunk size in front of AROUND, whichever is
+ ;; nearer.
+ (max prev (- around jit-lock-chunk-size)))))
+ (result (cond ((null start) next)
+ ((null next) start)
+ ((< (- around start) (- next around)) start)
+ (t next))))
+ result)))
(defun jit-lock-stealth-fontify (&optional repeat)
"Fontify buffers stealthily.
@@ -504,7 +542,8 @@ non-nil in a repeated invocation of this function."
pos (setq pos (next-single-property-change
pos 'fontified nil (point-max)))
'fontified nil))
- (setq pos (next-single-property-change pos 'fontified)))))))))
+ (setq pos (next-single-property-change
+ pos 'fontified)))))))))
(setq jit-lock-defer-buffers nil)
;; Force fontification of the visible parts.
(let ((jit-lock-defer-timer nil))
@@ -522,7 +561,9 @@ non-nil in a repeated invocation of this function."
(when jit-lock-context-unfontify-pos
;; (message "Jit-Context %s" (buffer-name))
(save-restriction
- (widen)
+ ;; Don't be blindsided by narrowing that starts in the middle
+ ;; of a jit-lock-defer-multiline.
+ (widen)
(when (and (>= jit-lock-context-unfontify-pos (point-min))
(< jit-lock-context-unfontify-pos (point-max)))
;; If we're in text that matches a complex multi-line
diff --git a/lisp/jka-cmpr-hook.el b/lisp/jka-cmpr-hook.el
index 7b36f7c1214..851bceccf30 100644
--- a/lisp/jka-cmpr-hook.el
+++ b/lisp/jka-cmpr-hook.el
@@ -234,6 +234,10 @@ options through Custom does this automatically."
"XZ compressing" "xz" ("-c" "-q")
"XZ uncompressing" "xz" ("-c" "-q" "-d")
t t "\3757zXZ\0"]
+ ["\\.txz\\'"
+ "XZ compressing" "xz" ("-c" "-q")
+ "XZ uncompressing" "xz" ("-c" "-q" "-d")
+ t nil "\3757zXZ\0"]
;; dzip is gzip with random access. Its compression program can't
;; read/write stdin/out, so .dz files can only be viewed without
;; saving, having their contents decompressed with gzip.
@@ -302,7 +306,9 @@ variables. Setting this through Custom does that automatically."
:group 'jka-compr)
(defcustom jka-compr-mode-alist-additions
- (list (cons (purecopy "\\.tgz\\'") 'tar-mode) (cons (purecopy "\\.tbz2?\\'") 'tar-mode))
+ (purecopy '(("\\.tgz\\'" . tar-mode)
+ ("\\.tbz2?\\'" . tar-mode)
+ ("\\.txz\\'" . 'tar-mode)))
"List of pairs added to `auto-mode-alist' when installing jka-compr.
Uninstalling jka-compr removes all pairs from `auto-mode-alist' that
installing added.
@@ -315,7 +321,7 @@ variables. Setting this through Custom does that automatically."
:set 'jka-compr-set
:group 'jka-compr)
-(defcustom jka-compr-load-suffixes (list (purecopy ".gz"))
+(defcustom jka-compr-load-suffixes (purecopy '(".gz"))
"List of compression related suffixes to try when loading files.
Enabling Auto Compression mode appends this list to `load-file-rep-suffixes',
which see. Disabling Auto Compression mode removes all suffixes
diff --git a/lisp/jka-compr.el b/lisp/jka-compr.el
index ac81cf0d52d..5664a890cb1 100644
--- a/lisp/jka-compr.el
+++ b/lisp/jka-compr.el
@@ -332,8 +332,6 @@ There should be no more than seven characters after the final `/'."
(with-current-buffer temp-buffer
(let ((coding-system-for-write 'no-conversion))
- (if (memq system-type '(ms-dos windows-nt))
- (setq buffer-file-type t) )
(jka-compr-run-real-handler 'write-region
(list (point-min) (point-max)
filename
diff --git a/lisp/json.el b/lisp/json.el
index a0cd116279a..29beaedebe9 100644
--- a/lisp/json.el
+++ b/lisp/json.el
@@ -3,7 +3,7 @@
;; Copyright (C) 2006-2013 Free Software Foundation, Inc.
;; Author: Edward O'Connor <ted@oconnor.cx>
-;; Version: 1.3
+;; Version: 1.4
;; Keywords: convenience
;; This file is part of GNU Emacs.
@@ -48,10 +48,10 @@
;; 2006-12-29 - XEmacs support, from Aidan Kehoe <kehoea@parhasard.net>.
;; 2008-02-21 - Installed in GNU Emacs.
;; 2011-10-17 - Patch `json-alist-p' and `json-plist-p' to avoid recursion -tzz
+;; 2012-10-25 - Added pretty-printed reformatting -Ryan Crum (ryan@ryancrum.org)
;;; Code:
-(eval-when-compile (require 'cl))
;; Compatibility code
@@ -99,6 +99,24 @@ If this has the same value as `json-false', you might not be able to
tell the difference between `false' and `null'. Consider let-binding
this around your call to `json-read' instead of `setq'ing it.")
+(defvar json-encoding-separator ","
+ "Value to use as an element separator when encoding.")
+
+(defvar json-encoding-default-indentation " "
+ "The default indentation level for encoding.
+Used only when `json-encoding-pretty-print' is non-nil.")
+
+(defvar json--encoding-current-indentation "\n"
+ "Internally used to keep track of the current indentation level of encoding.
+Used only when `json-encoding-pretty-print' is non-nil.")
+
+(defvar json-encoding-pretty-print nil
+ "If non-nil, then the output of `json-encode' will be pretty-printed.")
+
+(defvar json-encoding-lisp-style-closings nil
+ "If non-nil, ] and } closings will be formatted lisp-style,
+without indentation.")
+
;;; Utilities
@@ -124,6 +142,14 @@ this around your call to `json-read' instead of `setq'ing it.")
'not-plist)))
(null list))
+(defmacro json--with-indentation (body)
+ `(let ((json--encoding-current-indentation
+ (if json-encoding-pretty-print
+ (concat json--encoding-current-indentation
+ json-encoding-default-indentation)
+ "")))
+ ,body))
+
;; Reader utilities
(defsubst json-advance (&optional n)
@@ -402,41 +428,70 @@ Please see the documentation of `json-object-type' and `json-key-type'."
(defun json-encode-hash-table (hash-table)
"Return a JSON representation of HASH-TABLE."
- (format "{%s}"
+ (format "{%s%s}"
(json-join
(let (r)
- (maphash
- (lambda (k v)
- (push (format "%s:%s"
- (json-encode-key k)
- (json-encode v))
- r))
- hash-table)
+ (json--with-indentation
+ (maphash
+ (lambda (k v)
+ (push (format
+ (if json-encoding-pretty-print
+ "%s%s: %s"
+ "%s%s:%s")
+ json--encoding-current-indentation
+ (json-encode-key k)
+ (json-encode v))
+ r))
+ hash-table))
r)
- ", ")))
+ json-encoding-separator)
+ (if (or (not json-encoding-pretty-print)
+ json-encoding-lisp-style-closings)
+ ""
+ json--encoding-current-indentation)))
;; List encoding (including alists and plists)
(defun json-encode-alist (alist)
"Return a JSON representation of ALIST."
- (format "{%s}"
- (json-join (mapcar (lambda (cons)
- (format "%s:%s"
- (json-encode-key (car cons))
- (json-encode (cdr cons))))
- alist)
- ", ")))
+ (format "{%s%s}"
+ (json-join
+ (json--with-indentation
+ (mapcar (lambda (cons)
+ (format (if json-encoding-pretty-print
+ "%s%s: %s"
+ "%s%s:%s")
+ json--encoding-current-indentation
+ (json-encode-key (car cons))
+ (json-encode (cdr cons))))
+ alist))
+ json-encoding-separator)
+ (if (or (not json-encoding-pretty-print)
+ json-encoding-lisp-style-closings)
+ ""
+ json--encoding-current-indentation)))
(defun json-encode-plist (plist)
"Return a JSON representation of PLIST."
(let (result)
- (while plist
- (push (concat (json-encode-key (car plist))
- ":"
- (json-encode (cadr plist)))
- result)
- (setq plist (cddr plist)))
- (concat "{" (json-join (nreverse result) ", ") "}")))
+ (json--with-indentation
+ (while plist
+ (push (concat
+ json--encoding-current-indentation
+ (json-encode-key (car plist))
+ (if json-encoding-pretty-print
+ ": "
+ ":")
+ (json-encode (cadr plist)))
+ result)
+ (setq plist (cddr plist))))
+ (concat "{"
+ (json-join (nreverse result) json-encoding-separator)
+ (if (and json-encoding-pretty-print
+ (not json-encoding-lisp-style-closings))
+ json--encoding-current-indentation
+ "")
+ "}")))
(defun json-encode-list (list)
"Return a JSON representation of LIST.
@@ -475,7 +530,22 @@ become JSON objects."
(defun json-encode-array (array)
"Return a JSON representation of ARRAY."
- (concat "[" (mapconcat 'json-encode array ", ") "]"))
+ (if (and json-encoding-pretty-print
+ (> (length array) 0))
+ (concat
+ (json--with-indentation
+ (concat (format "[%s" json--encoding-current-indentation)
+ (json-join (mapcar 'json-encode array)
+ (format "%s%s"
+ json-encoding-separator
+ json--encoding-current-indentation))))
+ (format "%s]"
+ (if json-encoding-lisp-style-closings
+ ""
+ json--encoding-current-indentation)))
+ (concat "["
+ (mapconcat 'json-encode array json-encoding-separator)
+ "]")))
@@ -542,6 +612,21 @@ Advances point just past JSON object."
((listp object) (json-encode-list object))
(t (signal 'json-error (list object)))))
+;; Pretty printing
+
+(defun json-pretty-print-buffer ()
+ "Pretty-print current buffer."
+ (interactive)
+ (json-pretty-print (point-min) (point-max)))
+
+(defun json-pretty-print (begin end)
+ "Pretty-print selected region."
+ (interactive "r")
+ (atomic-change-group
+ (let ((json-encoding-pretty-print t)
+ (txt (delete-and-extract-region begin end)))
+ (insert (json-encode (json-read-from-string txt))))))
+
(provide 'json)
;;; json.el ends here
diff --git a/lisp/kmacro.el b/lisp/kmacro.el
index d573bd02397..d6de2feb3fc 100644
--- a/lisp/kmacro.el
+++ b/lisp/kmacro.el
@@ -202,6 +202,7 @@ macro to be executed before appending to it."
;; naming and binding
(define-key map "b" 'kmacro-bind-to-key)
(define-key map "n" 'kmacro-name-last-macro)
+ (define-key map "x" 'kmacro-to-register)
map)
"Keymap for keyboard macro commands.")
(defalias 'kmacro-keymap kmacro-keymap)
@@ -613,9 +614,10 @@ An argument of zero means repeat until error."
;;;###autoload
-(defun kmacro-call-macro (arg &optional no-repeat end-macro)
- "Call the last keyboard macro that you defined with \\[kmacro-start-macro].
+(defun kmacro-call-macro (arg &optional no-repeat end-macro macro)
+ "Call the keyboard MACRO that you defined with \\[kmacro-start-macro].
A prefix argument serves as a repeat count. Zero means repeat until error.
+MACRO defaults to `last-kbd-macro'.
When you call the macro, you can call the macro again by repeating
just the last key in the key sequence that you used to call this
@@ -631,8 +633,9 @@ others, use \\[kmacro-name-last-macro]."
(eq no-repeat 'repeating))
last-input-event)))
(if end-macro
- (kmacro-end-macro arg)
- (call-last-kbd-macro arg #'kmacro-loop-setup-function))
+ (kmacro-end-macro arg) ; modifies last-kbd-macro
+ (let ((last-kbd-macro (or macro last-kbd-macro)))
+ (call-last-kbd-macro arg #'kmacro-loop-setup-function)))
(when (consp arg)
(setq arg (car arg)))
(when (and (or (null arg) (> arg 0))
@@ -655,7 +658,9 @@ others, use \\[kmacro-name-last-macro]."
(define-key map (vector repeat-key)
`(lambda () (interactive)
(kmacro-call-macro ,(and kmacro-call-repeat-with-arg arg)
- 'repeating)))
+ 'repeating nil ,(if end-macro
+ last-kbd-macro
+ (or macro last-kbd-macro)))))
map)))))
@@ -836,6 +841,25 @@ Such a \"function\" cannot be called from Lisp, but it is a valid editor command
(put symbol 'kmacro t))
+(defun kmacro-execute-from-register (k)
+ (kmacro-call-macro current-prefix-arg nil nil k))
+
+(defun kmacro-to-register (r)
+ "Store the last keyboard macro in register R."
+ (interactive
+ (progn
+ (or last-kbd-macro (error "No keyboard macro defined"))
+ (list (read-char "Save to register: "))))
+ (set-register r (registerv-make
+ last-kbd-macro
+ :jump-func 'kmacro-execute-from-register
+ :print-func (lambda (k)
+ (princ (format "a keyboard macro:\n %s"
+ (format-kbd-macro k))))
+ :insert-func (lambda (k)
+ (insert (format-kbd-macro k))))))
+
+
(defun kmacro-view-macro (&optional _arg)
"Display the last keyboard macro.
If repeated, it shows previous elements in the macro ring."
diff --git a/lisp/language/china-util.el b/lisp/language/china-util.el
index 5f19e78e896..7ef842ce66c 100644
--- a/lisp/language/china-util.el
+++ b/lisp/language/china-util.el
@@ -1,4 +1,4 @@
-;;; china-util.el --- utilities for Chinese -*- coding: iso-2022-7bit -*-
+;;; china-util.el --- utilities for Chinese -*- coding: utf-8 -*-
;; Copyright (C) 1995, 2001-2013 Free Software Foundation, Inc.
;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
diff --git a/lisp/language/chinese.el b/lisp/language/chinese.el
index 1dc7e3f343e..5be4e344b50 100644
--- a/lisp/language/chinese.el
+++ b/lisp/language/chinese.el
@@ -1,4 +1,4 @@
-;;; chinese.el --- support for Chinese -*- coding: iso-2022-7bit; -*-
+;;; chinese.el --- support for Chinese -*- coding: utf-8; -*-
;; Copyright (C) 2001-2013 Free Software Foundation, Inc.
;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
@@ -114,7 +114,7 @@
iso-2022-cn)
(input-method . "chinese-py-punct")
(features china-util)
- (sample-text . "Chinese ($AVPND(B,$AFUM(;0(B,$A::So(B) $ADc:C(B")
+ (sample-text . "Chinese (中文,普通è¯,汉语) 你好")
(documentation . "Support for Chinese GB2312 character set.")
(tutorial . "TUTORIAL.cn"))
'("Chinese"))
@@ -146,7 +146,7 @@
(input-method . "chinese-py-punct-b5")
(ctext-non-standard-encodings "big5-0")
(features china-util)
- (sample-text . "Cantonese ($(0GnM$(B,$(0N]0*Hd(B) $(0*/=((B, $(0+$)p(B")
+ (sample-text . "Cantonese (粵語,廣æ±è©±) 早晨, 你好")
(documentation . "Support for Chinese Big5 character set.")
(tutorial . "TUTORIAL.zh"))
'("Chinese"))
@@ -251,7 +251,7 @@ converted to CNS)."))
chinese-iso-8bit) ; fixme?
(ctext-non-standard-encodings "gbk-0")
(input-method . "chinese-py-punct") ; fixme?
- (sample-text . "Chinese ($BCfJ8(B,$BIaDL$A;0(B,$A::So(B) $(D95$B9%(B")
+ (sample-text . "Chinese (中文,普通è¯,汉语) 妳好")
(features china-util)
(documentation . "Support for Chinese GBK character set.")
(tutorial . "TUTORIAL.cn"))
@@ -277,7 +277,7 @@ converted to CNS)."))
(coding-priority gb18030 gbk iso-2022-cn chinese-big5
chinese-iso-8bit) ; fixme?
(input-method . "chinese-py-punct") ; fixme?
- (sample-text . "Chinese ($BCfJ8(B,$BIaDL$A;0(B,$A::So(B) $(D0_$B9%(B")
+ (sample-text . "Chinese (中文,普通è¯,汉语) 你好")
(features china-util)
(documentation
. "Support for Chinese GB18030 character set.")
diff --git a/lisp/language/cyril-util.el b/lisp/language/cyril-util.el
index 441519d5426..7af8b993288 100644
--- a/lisp/language/cyril-util.el
+++ b/lisp/language/cyril-util.el
@@ -71,124 +71,124 @@ If the argument is nil, we return the display table to its standard state."
(if (null cyrillic-language)
(setq standard-display-table (make-display-table))
- (aset standard-display-table ?,LP(B [?a])
- (aset standard-display-table ?,LQ(B [?b])
- (aset standard-display-table ?,LR(B [?v])
- (aset standard-display-table ?,LS(B [?g])
- (aset standard-display-table ?,LT(B [?d])
- (aset standard-display-table ?,LU(B [?e])
- (aset standard-display-table ?,Lq(B [?y ?o])
- (aset standard-display-table ?,LV(B [?z ?h])
- (aset standard-display-table ?,LW(B [?z])
- (aset standard-display-table ?,LX(B [?i])
- (aset standard-display-table ?,LY(B [?j])
- (aset standard-display-table ?,LZ(B [?k])
- (aset standard-display-table ?,L[(B [?l])
- (aset standard-display-table ?,L\(B [?m])
- (aset standard-display-table ?,L](B [?n])
- (aset standard-display-table ?,L^(B [?o])
- (aset standard-display-table ?,L_(B [?p])
- (aset standard-display-table ?,L`(B [?r])
- (aset standard-display-table ?,La(B [?s])
- (aset standard-display-table ?,Lb(B [?t])
- (aset standard-display-table ?,Lc(B [?u])
- (aset standard-display-table ?,Ld(B [?f])
- (aset standard-display-table ?,Le(B [?k ?h])
- (aset standard-display-table ?,Lf(B [?t ?s])
- (aset standard-display-table ?,Lg(B [?c ?h])
- (aset standard-display-table ?,Lh(B [?s ?h])
- (aset standard-display-table ?,Li(B [?s ?c ?h])
- (aset standard-display-table ?,Lj(B [?~])
- (aset standard-display-table ?,Lk(B [?y])
- (aset standard-display-table ?,Ll(B [?'])
- (aset standard-display-table ?,Lm(B [?e ?'])
- (aset standard-display-table ?,Ln(B [?y ?u])
- (aset standard-display-table ?,Lo(B [?y ?a])
-
- (aset standard-display-table ?,L0(B [?A])
- (aset standard-display-table ?,L1(B [?B])
- (aset standard-display-table ?,L2(B [?V])
- (aset standard-display-table ?,L3(B [?G])
- (aset standard-display-table ?,L4(B [?D])
- (aset standard-display-table ?,L5(B [?E])
- (aset standard-display-table ?,L!(B [?Y ?o])
- (aset standard-display-table ?,L6(B [?Z ?h])
- (aset standard-display-table ?,L7(B [?Z])
- (aset standard-display-table ?,L8(B [?I])
- (aset standard-display-table ?,L9(B [?J])
- (aset standard-display-table ?,L:(B [?K])
- (aset standard-display-table ?,L;(B [?L])
- (aset standard-display-table ?,L<(B [?M])
- (aset standard-display-table ?,L=(B [?N])
- (aset standard-display-table ?,L>(B [?O])
- (aset standard-display-table ?,L?(B [?P])
- (aset standard-display-table ?,L@(B [?R])
- (aset standard-display-table ?,LA(B [?S])
- (aset standard-display-table ?,LB(B [?T])
- (aset standard-display-table ?,LC(B [?U])
- (aset standard-display-table ?,LD(B [?F])
- (aset standard-display-table ?,LE(B [?K ?h])
- (aset standard-display-table ?,LF(B [?T ?s])
- (aset standard-display-table ?,LG(B [?C ?h])
- (aset standard-display-table ?,LH(B [?S ?h])
- (aset standard-display-table ?,LI(B [?S ?c ?h])
- (aset standard-display-table ?,LJ(B [?~])
- (aset standard-display-table ?,LK(B [?Y])
- (aset standard-display-table ?,LL(B [?'])
- (aset standard-display-table ?,LM(B [?E ?'])
- (aset standard-display-table ?,LN(B [?Y ?u])
- (aset standard-display-table ?,LO(B [?Y ?a])
-
- (aset standard-display-table ?,Lt(B [?i ?e])
- (aset standard-display-table ?,Lw(B [?i])
- (aset standard-display-table ?,L~(B [?u])
- (aset standard-display-table ?,Lr(B [?d ?j])
- (aset standard-display-table ?,L{(B [?c ?h ?j])
- (aset standard-display-table ?,Ls(B [?g ?j])
- (aset standard-display-table ?,Lu(B [?s])
- (aset standard-display-table ?,L|(B [?k])
- (aset standard-display-table ?,Lv(B [?i])
- (aset standard-display-table ?,Lx(B [?j])
- (aset standard-display-table ?,Ly(B [?l ?j])
- (aset standard-display-table ?,Lz(B [?n ?j])
- (aset standard-display-table ?,L(B [?d ?z])
-
- (aset standard-display-table ?,L$(B [?Y ?e])
- (aset standard-display-table ?,L'(B [?Y ?i])
- (aset standard-display-table ?,L.(B [?U])
- (aset standard-display-table ?,L"(B [?D ?j])
- (aset standard-display-table ?,L+(B [?C ?h ?j])
- (aset standard-display-table ?,L#(B [?G ?j])
- (aset standard-display-table ?,L%(B [?S])
- (aset standard-display-table ?,L,(B [?K])
- (aset standard-display-table ?,L&(B [?I])
- (aset standard-display-table ?,L((B [?J])
- (aset standard-display-table ?,L)(B [?L ?j])
- (aset standard-display-table ?,L*(B [?N ?j])
- (aset standard-display-table ?,L/(B [?D ?j])
+ (aset standard-display-table ?а [?a])
+ (aset standard-display-table ?б [?b])
+ (aset standard-display-table ?в [?v])
+ (aset standard-display-table ?г [?g])
+ (aset standard-display-table ?д [?d])
+ (aset standard-display-table ?е [?e])
+ (aset standard-display-table ?Ñ‘ [?y ?o])
+ (aset standard-display-table ?ж [?z ?h])
+ (aset standard-display-table ?з [?z])
+ (aset standard-display-table ?и [?i])
+ (aset standard-display-table ?й [?j])
+ (aset standard-display-table ?к [?k])
+ (aset standard-display-table ?л [?l])
+ (aset standard-display-table ?м [?m])
+ (aset standard-display-table ?н [?n])
+ (aset standard-display-table ?о [?o])
+ (aset standard-display-table ?п [?p])
+ (aset standard-display-table ?Ñ€ [?r])
+ (aset standard-display-table ?Ñ [?s])
+ (aset standard-display-table ?Ñ‚ [?t])
+ (aset standard-display-table ?у [?u])
+ (aset standard-display-table ?Ñ„ [?f])
+ (aset standard-display-table ?Ñ… [?k ?h])
+ (aset standard-display-table ?ц [?t ?s])
+ (aset standard-display-table ?ч [?c ?h])
+ (aset standard-display-table ?ш [?s ?h])
+ (aset standard-display-table ?щ [?s ?c ?h])
+ (aset standard-display-table ?ÑŠ [?~])
+ (aset standard-display-table ?Ñ‹ [?y])
+ (aset standard-display-table ?ь [?'])
+ (aset standard-display-table ?Ñ [?e ?'])
+ (aset standard-display-table ?ÑŽ [?y ?u])
+ (aset standard-display-table ?Ñ [?y ?a])
+
+ (aset standard-display-table ?Ð [?A])
+ (aset standard-display-table ?Б [?B])
+ (aset standard-display-table ?Ð’ [?V])
+ (aset standard-display-table ?Г [?G])
+ (aset standard-display-table ?Д [?D])
+ (aset standard-display-table ?Е [?E])
+ (aset standard-display-table ?Ð [?Y ?o])
+ (aset standard-display-table ?Ж [?Z ?h])
+ (aset standard-display-table ?З [?Z])
+ (aset standard-display-table ?И [?I])
+ (aset standard-display-table ?Й [?J])
+ (aset standard-display-table ?К [?K])
+ (aset standard-display-table ?Л [?L])
+ (aset standard-display-table ?М [?M])
+ (aset standard-display-table ?Ð [?N])
+ (aset standard-display-table ?О [?O])
+ (aset standard-display-table ?П [?P])
+ (aset standard-display-table ?Р [?R])
+ (aset standard-display-table ?С [?S])
+ (aset standard-display-table ?Т [?T])
+ (aset standard-display-table ?У [?U])
+ (aset standard-display-table ?Ф [?F])
+ (aset standard-display-table ?Ð¥ [?K ?h])
+ (aset standard-display-table ?Ц [?T ?s])
+ (aset standard-display-table ?Ч [?C ?h])
+ (aset standard-display-table ?Ш [?S ?h])
+ (aset standard-display-table ?Щ [?S ?c ?h])
+ (aset standard-display-table ?Ъ [?~])
+ (aset standard-display-table ?Ы [?Y])
+ (aset standard-display-table ?Ь [?'])
+ (aset standard-display-table ?Э [?E ?'])
+ (aset standard-display-table ?Ю [?Y ?u])
+ (aset standard-display-table ?Я [?Y ?a])
+
+ (aset standard-display-table ?Ñ” [?i ?e])
+ (aset standard-display-table ?Ñ— [?i])
+ (aset standard-display-table ?Ñž [?u])
+ (aset standard-display-table ?Ñ’ [?d ?j])
+ (aset standard-display-table ?Ñ› [?c ?h ?j])
+ (aset standard-display-table ?Ñ“ [?g ?j])
+ (aset standard-display-table ?Ñ• [?s])
+ (aset standard-display-table ?ќ [?k])
+ (aset standard-display-table ?Ñ– [?i])
+ (aset standard-display-table ?ј [?j])
+ (aset standard-display-table ?Ñ™ [?l ?j])
+ (aset standard-display-table ?Ñš [?n ?j])
+ (aset standard-display-table ?ÑŸ [?d ?z])
+
+ (aset standard-display-table ?Є [?Y ?e])
+ (aset standard-display-table ?Ї [?Y ?i])
+ (aset standard-display-table ?ÐŽ [?U])
+ (aset standard-display-table ?Ђ [?D ?j])
+ (aset standard-display-table ?Ћ [?C ?h ?j])
+ (aset standard-display-table ?Ѓ [?G ?j])
+ (aset standard-display-table ?Ð… [?S])
+ (aset standard-display-table ?Ќ [?K])
+ (aset standard-display-table ?І [?I])
+ (aset standard-display-table ?Ј [?J])
+ (aset standard-display-table ?Љ [?L ?j])
+ (aset standard-display-table ?Њ [?N ?j])
+ (aset standard-display-table ?Ð [?D ?j])
(when (equal cyrillic-language "Bulgarian")
- (aset standard-display-table ?,Li(B [?s ?h ?t])
- (aset standard-display-table ?,LI(B [?S ?h ?t])
- (aset standard-display-table ?,Ln(B [?i ?u])
- (aset standard-display-table ?,LN(B [?I ?u])
- (aset standard-display-table ?,Lo(B [?i ?a])
- (aset standard-display-table ?,LO(B [?I ?a]))
+ (aset standard-display-table ?щ [?s ?h ?t])
+ (aset standard-display-table ?Щ [?S ?h ?t])
+ (aset standard-display-table ?ÑŽ [?i ?u])
+ (aset standard-display-table ?Ю [?I ?u])
+ (aset standard-display-table ?Ñ [?i ?a])
+ (aset standard-display-table ?Я [?I ?a]))
(when (equal cyrillic-language "Ukrainian") ; based on the official
; transliteration table
- (aset standard-display-table ?,LX(B [?y])
- (aset standard-display-table ?,L8(B [?Y])
- (aset standard-display-table ?,LY(B [?i])
- (aset standard-display-table ?,L9(B [?Y])
- (aset standard-display-table ?,Ln(B [?i ?u])
- (aset standard-display-table ?,Lo(B [?i ?a]))))
+ (aset standard-display-table ?и [?y])
+ (aset standard-display-table ?И [?Y])
+ (aset standard-display-table ?й [?i])
+ (aset standard-display-table ?Й [?Y])
+ (aset standard-display-table ?ÑŽ [?i ?u])
+ (aset standard-display-table ?Ñ [?i ?a]))))
;;
(provide 'cyril-util)
;; Local Variables:
-;; coding: iso-2022-7bit
+;; coding: utf-8
;; End:
;;; cyril-util.el ends here
diff --git a/lisp/language/cyrillic.el b/lisp/language/cyrillic.el
index 6bf0f567ffe..302c6ea9db2 100644
--- a/lisp/language/cyrillic.el
+++ b/lisp/language/cyrillic.el
@@ -1,4 +1,4 @@
-;;; cyrillic.el --- support for Cyrillic -*- coding: iso-2022-7bit; -*-
+;;; cyrillic.el --- support for Cyrillic -*- coding: utf-8; -*-
;; Copyright (C) 1997-1998, 2001-2013 Free Software Foundation, Inc.
;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
@@ -74,7 +74,7 @@
(nonascii-translation . iso-8859-5)
(unibyte-display . cyrillic-iso-8bit)
(features cyril-util)
- (sample-text . "Russian (,L@caaZXY(B) ,L7T`PRabRcYbU(B!")
+ (sample-text . "Russian (РуÑÑкий) ЗдравÑтвуйте!")
(documentation . "Support for Cyrillic ISO-8859-5."))
'("Cyrillic"))
@@ -103,7 +103,7 @@
(input-method . "russian-typewriter")
(features cyril-util)
(unibyte-display . cyrillic-koi8)
- (sample-text . "Russian (,L@caaZXY(B) ,L7T`PRabRcYbU(B!")
+ (sample-text . "Russian (РуÑÑкий) ЗдравÑтвуйте!")
(documentation . "Support for Cyrillic KOI8-R."))
'("Cyrillic"))
@@ -117,7 +117,7 @@
(input-method . "russian-computer")
(features cyril-util)
(unibyte-display . cyrillic-koi8)
- (sample-text . "Russian (,L@caaZXY(B) ,L7T`PRabRcYbU(B!")
+ (sample-text . "Russian (РуÑÑкий) ЗдравÑтвуйте!")
(documentation . "\
Support for Russian using koi8-r and the russian-computer input method.")
(tutorial . "TUTORIAL.ru"))
@@ -158,7 +158,7 @@ Support for Russian using koi8-r and the russian-computer input method.")
(input-method . "russian-typewriter")
(features cyril-util)
(unibyte-display . cyrillic-alternativnyj)
- (sample-text . "Russian (,L@caaZXY(B) ,L7T`PRabRcYbU(B!")
+ (sample-text . "Russian (РуÑÑкий) ЗдравÑтвуйте!")
(documentation . "Support for Cyrillic ALTERNATIVNYJ."))
'("Cyrillic"))
diff --git a/lisp/language/czech.el b/lisp/language/czech.el
index 7152b75e4b4..bbc7c19d4e5 100644
--- a/lisp/language/czech.el
+++ b/lisp/language/czech.el
@@ -1,9 +1,9 @@
-;;; czech.el --- support for Czech -*- coding: iso-2022-7bit -*-
+;;; czech.el --- support for Czech -*- coding: utf-8 -*-
;; Copyright (C) 1998, 2001-2013 Free Software Foundation, Inc.
;; Author: Milan Zamazal <pdm@zamazal.org>
-;; Maintainer: Pavel Jan,Am(Bk <Pavel@Janik.cz>
+;; Maintainer: Pavel Janík <Pavel@Janik.cz>
;; Keywords: multilingual, Czech
;; This file is part of GNU Emacs.
@@ -35,7 +35,7 @@
(nonascii-translation . iso-8859-2)
(unibyte-display . iso-8859-2)
(tutorial . "TUTORIAL.cs")
- (sample-text . "P,Bx(Bejeme v,Ba(Bm hezk,B}(B den!")
+ (sample-text . "Přejeme vám hezký den!")
(documentation . "\
This language environment is almost the same as Latin-2,
but sets the default input method to \"czech\",
diff --git a/lisp/language/european.el b/lisp/language/european.el
index e3156fa855e..efcdf9db2c8 100644
--- a/lisp/language/european.el
+++ b/lisp/language/european.el
@@ -1,4 +1,4 @@
-;;; european.el --- support for European languages -*- coding: iso-2022-7bit; -*-
+;;; european.el --- support for European languages -*- coding: utf-8; -*-
;; Copyright (C) 1997-1998, 2000-2013 Free Software Foundation, Inc.
;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
@@ -43,7 +43,7 @@
(unibyte-display . iso-latin-1)
(input-method . "latin-1-prefix")
(sample-text
- . "Hello, Hej, Tere, Hei, Bonjour, Gr$(D+d)N(B Gott, Ciao, $(D"B(BHola!")
+ . "Hello, Hej, Tere, Hei, Bonjour, Grüß Gott, Ciao, ¡Hola!")
(documentation . "\
This language environment is a generic one for the Latin-1 (ISO-8859-1)
character set which supports the following European languages:
@@ -241,7 +241,7 @@ See also the Turkish environment."))
(unibyte-display . iso-latin-8)
(input-method . "latin-8-prefix")
;; Fixme: Welsh/Ga{e}lic greetings
- (sample-text . ",_"(B $(D+q(B $(D*t(B")
+ (sample-text . "ḃ ŵ Ŷ")
(documentation . "\
This language environment is a generic one for the Latin-8 (ISO-8859-14)
character set which supports the Celtic languages, including those not
@@ -271,7 +271,7 @@ covered by other ISO-8859 character sets:
(unibyte-display . iso-latin-9)
(input-method . "latin-9-prefix")
(sample-text
- . "AVE. $(D*^+^*v+v)-)M*s(B $(Q)!(B")
+ . "AVE. ŠšŽžŒœŸ €")
(documentation . "\
This language environment is a generic one for the Latin-9 (ISO-8859-15)
character set which supports the same languages as Latin-1 with the
@@ -427,7 +427,7 @@ but it selects the Dutch tutorial and input method."))
(unibyte-display . iso-latin-1)
(sample-text . "\
German (Deutsch Nord) Guten Tag
-German (Deutsch S$(D+d(Bd) Gr$(D+d)N(B Gott")
+German (Deutsch Süd) Grüß Gott")
(documentation . "\
This language environment is almost the same as Latin-1,
but sets the default input method to \"german-postfix\".
@@ -442,7 +442,7 @@ Additionally, it selects the German tutorial."))
(nonascii-translation . iso-8859-1)
(unibyte-display . iso-latin-1)
(input-method . "latin-1-prefix")
- (sample-text . "French (Fran$(D+.(Bais) Bonjour, Salut")
+ (sample-text . "French (Français) Bonjour, Salut")
(documentation . "\
This language environment is almost the same as Latin-1,
but it selects the French tutorial and input method."))
@@ -471,7 +471,7 @@ Additionally, it selects the Italian tutorial."))
(input-method . "slovenian")
(unibyte-display . iso-8859-2)
(tutorial . "TUTORIAL.sl")
- (sample-text . "$(D*v(Belimo vam uspe$(D+^(Ben dan!")
+ (sample-text . "Želimo vam uspešen dan!")
(documentation . "\
This language environment is almost the same as Latin-2,
but it selects the Slovenian tutorial and input method."))
@@ -485,7 +485,7 @@ but it selects the Slovenian tutorial and input method."))
(input-method . "spanish-postfix")
(nonascii-translation . iso-8859-1)
(unibyte-display . iso-latin-1)
- (sample-text . "Spanish (Espa$(D+P(Bol) $(D"B(BHola!")
+ (sample-text . "Spanish (Español) ¡Hola!")
(documentation . "\
This language environment is almost the same as Latin-1,
but it sets the default input method to \"spanish-postfix\",
@@ -504,25 +504,25 @@ and it selects the Spanish tutorial."))
(nonascii-translation . iso-8859-9)
(unibyte-display . iso-latin-5)
(input-method . "turkish-postfix")
- (sample-text . "Turkish (T$(D+d(Brk$(D+.(Be) Merhaba")
+ (sample-text . "Turkish (Türkçe) Merhaba")
(setup-function . turkish-case-conversion-enable)
(setup-function . turkish-case-conversion-disable)
(documentation . "Support for Turkish.
Differs from the Latin-5 environment in using the `turkish-postfix' input
-method and applying Turkish case rules for the characters i, I, $(D)E(B, $(D*D(B.")))
+method and applying Turkish case rules for the characters i, I, ı, İ.")))
(defun turkish-case-conversion-enable ()
- "Set up Turkish case conversion of `i' and `I' into `$(D*D(B' and `$(D)E(B'."
+ "Set up Turkish case conversion of `i' and `I' into `İ' and `ı'."
(let ((table (standard-case-table)))
- (set-case-syntax-pair ?$(D*D(B ?i table)
- (set-case-syntax-pair ?I ?$(D)E(B table)))
+ (set-case-syntax-pair ?İ ?i table)
+ (set-case-syntax-pair ?I ?ı table)))
(defun turkish-case-conversion-disable ()
"Set up normal (non-Turkish) case conversion of `i' into `I'."
(let ((table (standard-case-table)))
(set-case-syntax-pair ?I ?i table)
- (set-case-syntax ?$(D*D(B "w" table)
- (set-case-syntax ?$(D)E(B "w" table)))
+ (set-case-syntax ?İ "w" table)
+ (set-case-syntax ?ı "w" table)))
;; Polish ISO 8859-2 environment.
;; Maintainer: Wlodek Bzyl <matwb@univ.gda.pl>
@@ -536,7 +536,7 @@ method and applying Turkish case rules for the characters i, I, $(D)E(B, $(D*
(nonascii-translation . iso-8859-2)
(unibyte-display . iso-8859-2)
(tutorial . "TUTORIAL.pl")
- (sample-text . "P$(D+Q(Bjd$(D+u(B, ki$(D+M(B-$(D+w(Be t$(D+8(B chmurno$(D+\++(B w g$(D)H+((Bb flaszy")
+ (sample-text . "Pójdź, kiń-że tę chmurność w głąb flaszy")
(documentation . t))
'("European"))
diff --git a/lisp/language/ind-util.el b/lisp/language/ind-util.el
index 8964da1ea13..c8df282e6e9 100644
--- a/lisp/language/ind-util.el
+++ b/lisp/language/ind-util.el
@@ -1,4 +1,4 @@
-;;; ind-util.el --- Transliteration and Misc. Tools for Indian Languages -*- coding: iso-2022-7bit; -*-
+;;; ind-util.el --- Transliteration and Misc. Tools for Indian Languages -*- coding: utf-8-emacs; -*-
;; Copyright (C) 2001-2013 Free Software Foundation, Inc.
@@ -47,233 +47,233 @@
(defvar indian-dev-base-table
'(
(;; VOWELS (18)
- (?$,15E(B nil) (?$,15F(B ?$,15~(B) (?$,15G(B ?$,15(B) (?$,15H(B ?$,16 (B) (?$,15I(B ?$,16!(B) (?$,15J(B ?$,16"(B)
- (?$,15K(B ?$,16#(B) (?$,15L(B ?$,16B(B) (?$,15M(B ?$,16%(B) (?$,15N(B ?$,16&(B) (?$,15O(B ?$,16'(B) (?$,15P(B ?$,16((B)
- (?$,15Q(B ?$,16)(B) (?$,15R(B ?$,16*(B) (?$,15S(B ?$,16+(B) (?$,15T(B ?$,16,(B) (?$,16@(B ?$,16$(B) (?$,16A(B ?$,16C(B))
+ (?अ nil) (?आ ?ा) (?इ ?ि) (?ई ?ी) (?उ ?à¥) (?ऊ ?ू)
+ (?ऋ ?ृ) (?ऌ ?ॢ) (?ठ?ॅ) (?ऎ ?ॆ) (?ठ?े) (?ठ?ै)
+ (?ऑ ?ॉ) (?ऒ ?ॊ) (?ओ ?ो) (?औ ?ौ) (?ॠ ?ॄ) (?ॡ ?ॣ))
(;; CONSONANTS (currently 42, including special cases)
- ?$,15U(B ?$,15V(B ?$,15W(B ?$,15X(B ?$,15Y(B ;; GUTTRULS
- ?$,15Z(B ?$,15[(B ?$,15\(B ?$,15](B ?$,15^(B ;; PALATALS
- ?$,15_(B ?$,15`(B ?$,15a(B ?$,15b(B ?$,15c(B ;; CEREBRALS
- ?$,15d(B ?$,15e(B ?$,15f(B ?$,15g(B ?$,15h(B ?$,15i(B ;; DENTALS
- ?$,15j(B ?$,15k(B ?$,15l(B ?$,15m(B ?$,15n(B ;; LABIALS
- ?$,15o(B ?$,15p(B ?$,15q(B ?$,15r(B ?$,15s(B ?$,15t(B ?$,15u(B ;; SEMIVOWELS
- ?$,15v(B ?$,15w(B ?$,15x(B ?$,15y(B ;; SIBILANTS
- ?$,168(B ?$,169(B ?$,16:(B ?$,16;(B ?$,16<(B ?$,16=(B ?$,16>(B ?$,16?(B ;; NUKTAS
- "$,15\6-5^(B" "$,15U6-5w(B")
+ ?क ?ख ?ग ?घ ?ङ ;; GUTTRULS
+ ?च ?छ ?ज ?ठ?ञ ;; PALATALS
+ ?ट ?ठ ?ड ?ढ ?ण ;; CEREBRALS
+ ?त ?थ ?द ?ध ?न ?ऩ ;; DENTALS
+ ?प ?फ ?ब ?भ ?म ;; LABIALS
+ ?य ?र ?ऱ ?ल ?ळ ?ऴ ?व ;; SEMIVOWELS
+ ?श ?ष ?स ?ह ;; SIBILANTS
+ ?क़ ?ख़ ?ग़ ?ज़ ?ड़ ?ॠ?फ़ ?य़ ;; NUKTAS
+ "जà¥à¤ž" "कà¥à¤·")
(;; Misc Symbols (7)
- ?$,15A(B ?$,15B(B ?$,15C(B ?$,15}(B ?$,16-(B ?$,160(B ?$,16D(B)
+ ?ठ?ं ?ः ?ऽ ?ॠ?ॠ?।)
(;; Digits (10)
- ?$,16F(B ?$,16G(B ?$,16H(B ?$,16I(B ?$,16J(B ?$,16K(B ?$,16L(B ?$,16M(B ?$,16N(B ?$,16O(B)
+ ?० ?१ ?२ ?३ ?४ ?५ ?६ ?७ ?८ ?९)
(;; Inscript-extra (4) (#, $, ^, *, ])
- "$,16-5p(B" "$,15p6-(B" "$,15d6-5p(B" "$,15v6-5p(B" "$,15|(B")))
+ "à¥à¤°" "रà¥" "तà¥à¤°" "शà¥à¤°" "़")))
;; Punjabi is also known as Gurmukhi.
(defvar indian-pnj-base-table
'(
(;; VOWELS
- (?$,18%(B nil) (?$,18&(B ?$,18^(B) (?$,18'(B ?$,18_(B) (?$,18((B ?$,18`(B) (?$,18)(B ?$,18a(B) (?$,18*(B ?$,18b(B)
- nil nil nil nil (?$,18/(B ?$,18g(B) (?$,180(B ?$,18h(B)
- nil nil (?$,183(B ?$,18k(B) (?$,184(B ?$,18l(B) nil nil)
+ (?ਅ nil) (?ਆ ?ਾ) (?ਇ ?ਿ) (?ਈ ?à©€) (?ਉ ?à©) (?ਊ ?à©‚)
+ nil nil nil nil (?ਠ?ੇ) (?ਠ?ੈ)
+ nil nil (?ਓ ?ੋ) (?ਔ ?ੌ) nil nil)
(;; CONSONANTS
- ?$,185(B ?$,186(B ?$,187(B ?$,188(B ?$,189(B ;; GUTTRULS
- ?$,18:(B ?$,18;(B ?$,18<(B ?$,18=(B ?$,18>(B ;; PALATALS
- ?$,18?(B ?$,18@(B ?$,18A(B ?$,18B(B ?$,18C(B ;; CEREBRALS
- ?$,18D(B ?$,18E(B ?$,18F(B ?$,18G(B ?$,18H(B nil ;; DENTALS
- ?$,18J(B ?$,18K(B ?$,18L(B ?$,18M(B ?$,18N(B ;; LABIALS
- ?$,18O(B ?$,18P(B nil ?$,18R(B ?$,18S(B nil ?$,18U(B ;; SEMIVOWELS
- ?$,18V(B nil ?$,18X(B ?$,18Y(B ;; SIBILANTS
- nil ?$,18y(B ?$,18z(B ?$,18{(B ?$,18|(B nil ?$,18~(B nil ;; NUKTAS
- "$,18<8m8>(B" nil)
+ ?ਕ ?ਖ ?ਗ ?ਘ ?ਙ ;; GUTTRULS
+ ?ਚ ?ਛ ?ਜ ?ਠ?ਞ ;; PALATALS
+ ?ਟ ?ਠ ?ਡ ?ਢ ?ਣ ;; CEREBRALS
+ ?ਤ ?ਥ ?ਦ ?ਧ ?ਨ nil ;; DENTALS
+ ?ਪ ?ਫ ?ਬ ?ਭ ?ਮ ;; LABIALS
+ ?ਯ ?ਰ nil ?ਲ ?ਲ਼ nil ?ਵ ;; SEMIVOWELS
+ ?ਸ਼ nil ?ਸ ?ਹ ;; SIBILANTS
+ nil ?ਖ਼ ?ਗ਼ ?ਜ਼ ?ੜ nil ?ਫ਼ nil ;; NUKTAS
+ "ਜà©à¨ž" nil)
(;; Misc Symbols (7)
- nil ?$,18"(B nil nil ?$,18m(B nil nil) ;; ek onkar, etc.
+ nil ?ਂ nil nil ?੠nil nil) ;; ek onkar, etc.
(;; Digits
- ?$,19&(B ?$,19'(B ?$,19((B ?$,19)(B ?$,19*(B ?$,19+(B ?$,19,(B ?$,19-(B ?$,19.(B ?$,19/(B)
+ ?੦ ?੧ ?੨ ?੩ ?੪ ?੫ ?੬ ?੭ ?੮ ?੯)
(;; Inscript-extra (4) (#, $, ^, *, ])
- "$,18m8P(B" "$,18P8m(B" "$,18D8m8P(B" "$,18V8m8P(B" "$,18\(B")))
+ "à©à¨°" "ਰà©" "ਤà©à¨°" "ਸ਼à©à¨°" "਼")))
(defvar indian-gjr-base-table
'(
(;; VOWELS
- (?$,19E(B nil) (?$,19F(B ?$,19~(B) (?$,19G(B ?$,19(B) (?$,19H(B ?$,1: (B) (?$,19I(B ?$,1:!(B) (?$,19J(B ?$,1:"(B)
- (?$,19K(B ?$,1:#(B) nil (?$,19M(B ?$,1:%(B) nil (?$,19O(B ?$,1:'(B) (?$,19P(B ?$,1:((B)
- (?$,19Q(B ?$,1:)(B) nil (?$,19S(B ?$,1:+(B) (?$,19T(B ?$,1:,(B) (?$,1:@(B ?$,1:$(B) nil)
+ (?અ nil) (?આ ?ા) (?ઇ ?િ) (?ઈ ?à«€) (?ઉ ?à«) (?ઊ ?à«‚)
+ (?ઋ ?ૃ) nil (?ઠ?ૅ) nil (?ઠ?ે) (?ઠ?ૈ)
+ (?ઑ ?ૉ) nil (?ઓ ?ો) (?ઔ ?ૌ) (?ૠ ?ૄ) nil)
(;; CONSONANTS
- ?$,19U(B ?$,19V(B ?$,19W(B ?$,19X(B ?$,19Y(B ;; GUTTRULS
- ?$,19Z(B ?$,19[(B ?$,19\(B ?$,19](B ?$,19^(B ;; PALATALS
- ?$,19_(B ?$,19`(B ?$,19a(B ?$,19b(B ?$,19c(B ;; CEREBRALS
- ?$,19d(B ?$,19e(B ?$,19f(B ?$,19g(B ?$,19h(B nil ;; DENTALS
- ?$,19j(B ?$,19k(B ?$,19l(B ?$,19m(B ?$,19n(B ;; LABIALS
- ?$,19o(B ?$,19p(B nil ?$,19r(B ?$,19s(B nil ?$,19u(B ;; SEMIVOWELS
- ?$,19v(B ?$,19w(B ?$,19x(B ?$,19y(B ;; SIBILANTS
+ ?ક ?ખ ?ગ ?ઘ ?ઙ ;; GUTTRULS
+ ?ચ ?છ ?જ ?ઠ?ઞ ;; PALATALS
+ ?ટ ?ઠ ?ડ ?ઢ ?ણ ;; CEREBRALS
+ ?ત ?થ ?દ ?ધ ?ન nil ;; DENTALS
+ ?પ ?ફ ?બ ?ભ ?મ ;; LABIALS
+ ?ય ?ર nil ?લ ?ળ nil ?વ ;; SEMIVOWELS
+ ?શ ?ષ ?સ ?હ ;; SIBILANTS
nil nil nil nil nil nil nil nil ;; NUKTAS
- "$,19\:-9^(B" "$,19U:-9w(B")
+ "જà«àªž" "કà«àª·")
(;; Misc Symbols (7)
- ?$,19A(B ?$,19B(B ?$,19C(B ?$,19}(B ?$,1:-(B ?$,1:0(B nil)
+ ?ઠ?ં ?ઃ ?ઽ ?ૠ?ૠnil)
(;; Digits
- ?$,1:F(B ?$,1:G(B ?$,1:H(B ?$,1:I(B ?$,1:J(B ?$,1:K(B ?$,1:L(B ?$,1:M(B ?$,1:N(B ?$,1:O(B)
+ ?૦ ?૧ ?૨ ?૩ ?૪ ?૫ ?૬ ?૭ ?૮ ?૯)
(;; Inscript-extra (4) (#, $, ^, *, ])
- "$,1:-9p(B" "$,19p:-(B" "$,19d:-9p(B" "$,19v:-9p(B" "$,19|(B")))
+ "à«àª°" "રà«" "તà«àª°" "શà«àª°" "઼")))
(defvar indian-ori-base-table
'(
(;; VOWELS
- (?$,1:e(B nil) (?$,1:f(B ?$,1;>(B) (?$,1:g(B ?$,1;?(B) (?$,1:h(B ?$,1;@(B) (?$,1:i(B ?$,1;A(B) (?$,1:j(B ?$,1;B(B)
- (?$,1:k(B ?$,1;C(B) (?$,1:l(B nil) nil nil (?$,1:o(B ?$,1;G(B) (?$,1:p(B ?$,1;H(B)
- nil nil (?$,1:s(B ?$,1;K(B) (?$,1:t(B ?$,1;L(B) (?$,1;`(B nil) (?$,1;a(B nil))
+ (?ଅ nil) (?ଆ ?ା) (?ଇ ?ି) (?ଈ ?à­€) (?ଉ ?à­) (?ଊ ?à­‚)
+ (?ଋ ?ୃ) (?ଌ nil) nil nil (?ଠ?େ) (?ଠ?ୈ)
+ nil nil (?ଓ ?ୋ) (?ଔ ?ୌ) (?ୠ nil) (?ୡ nil))
(;; CONSONANTS
- ?$,1:u(B ?$,1:v(B ?$,1:w(B ?$,1:x(B ?$,1:y(B ;; GUTTRULS
- ?$,1:z(B ?$,1:{(B ?$,1:|(B ?$,1:}(B ?$,1:~(B ;; PALATALS
- ?$,1:(B ?$,1; (B ?$,1;!(B ?$,1;"(B ?$,1;#(B ;; CEREBRALS
- ?$,1;$(B ?$,1;%(B ?$,1;&(B ?$,1;'(B ?$,1;((B nil ;; DENTALS
- ?$,1;*(B ?$,1;+(B ?$,1;,(B ?$,1;-(B ?$,1;.(B ;; LABIALS
- ?$,1;/(B ?$,1;0(B nil ?$,1;2(B ?$,1;3(B nil nil ;; SEMIVOWELS
- ?$,1;6(B ?$,1;7(B ?$,1;8(B ?$,1;9(B ;; SIBILANTS
- nil nil nil nil ?$,1;\(B ?$,1;](B nil ?$,1;_(B ;; NUKTAS
- "$,1:|;M:~(B" "$,1:u;M;7(B")
+ ?କ ?ଖ ?ଗ ?ଘ ?ଙ ;; GUTTRULS
+ ?ଚ ?ଛ ?ଜ ?ଠ?ଞ ;; PALATALS
+ ?ଟ ?ଠ ?ଡ ?ଢ ?ଣ ;; CEREBRALS
+ ?ତ ?ଥ ?ଦ ?ଧ ?ନ nil ;; DENTALS
+ ?ପ ?ଫ ?ବ ?ଭ ?ମ ;; LABIALS
+ ?ଯ ?ର nil ?ଲ ?ଳ nil nil ;; SEMIVOWELS
+ ?ଶ ?ଷ ?ସ ?ହ ;; SIBILANTS
+ nil nil nil nil ?ଡ଼ ?ୠnil ?ୟ ;; NUKTAS
+ "ଜà­à¬ž" "କà­à¬·")
(;; Misc Symbols
- ?$,1:a(B ?$,1:b(B ?$,1:c(B ?$,1;=(B ?$,1;M(B nil nil)
+ ?ଠ?ଂ ?ଃ ?ଽ ?ୠnil nil)
(;; Digits
- ?$,1;f(B ?$,1;g(B ?$,1;h(B ?$,1;i(B ?$,1;j(B ?$,1;k(B ?$,1;l(B ?$,1;m(B ?$,1;n(B ?$,1;o(B)
+ ?à­¦ ?à­§ ?à­¨ ?à­© ?à­ª ?à­« ?à­¬ ?à­­ ?à­® ?à­¯)
(;; Inscript-extra (4) (#, $, ^, *, ])
- "$,1;M;0(B" "$,1;0;M(B" "$,1;$;M;0(B" "$,1;6;M;0(B" "$,1;<(B")))
+ "à­à¬°" "ରà­" "ତà­à¬°" "ଶà­à¬°" "଼")))
(defvar indian-bng-base-table
'(
(;; VOWELS
- (?$,16e(B nil) (?$,16f(B ?$,17>(B) (?$,16g(B ?$,17?(B) (?$,16h(B ?$,17@(B) (?$,16i(B ?$,17A(B) (?$,16j(B ?$,17B(B)
- (?$,16k(B ?$,17C(B) (?$,16l(B ?$,17b(B) nil nil (?$,16o(B ?$,17G(B) (?$,16p(B ?$,17H(B)
- nil nil (?$,16s(B ?$,17K(B) (?$,16t(B ?$,17L(B) (?$,17`(B ?$,17D(B) (?$,17a(B ?$,17c(B))
+ (?অ nil) (?আ ?া) (?ই ?ি) (?ঈ ?à§€) (?উ ?à§) (?ঊ ?à§‚)
+ (?ঋ ?ৃ) (?ঌ ?ৢ) nil nil (?ঠ?ে) (?ঠ?ৈ)
+ nil nil (?ও ?ো) (?ঔ ?ৌ) (?ৠ ?ৄ) (?ৡ ?ৣ))
(;; CONSONANTS
- ?$,16u(B ?$,16v(B ?$,16w(B ?$,16x(B ?$,16y(B ;; GUTTRULS
- ?$,16z(B ?$,16{(B ?$,16|(B ?$,16}(B ?$,16~(B ;; PALATALS
- ?$,16(B ?$,17 (B ?$,17!(B ?$,17"(B ?$,17#(B ;; CEREBRALS
- ?$,17$(B ?$,17%(B ?$,17&(B ?$,17'(B ?$,17((B nil ;; DENTALS
- ?$,17*(B ?$,17+(B ?$,17,(B ?$,17-(B ?$,17.(B ;; LABIALS
- ?$,17/(B ?$,170(B nil ?$,172(B nil nil nil ;; SEMIVOWELS
- ?$,176(B ?$,177(B ?$,178(B ?$,179(B ;; SIBILANTS
- nil nil nil nil ?$,17\(B ?$,17](B nil ?$,17_(B ;; NUKTAS
- "$,16|7M6~(B" "$,16u7M77(B")
+ ?ক ?খ ?গ ?ঘ ?ঙ ;; GUTTRULS
+ ?চ ?ছ ?জ ?ঠ?ঞ ;; PALATALS
+ ?ট ?ঠ ?ড ?ঢ ?ণ ;; CEREBRALS
+ ?ত ?থ ?দ ?ধ ?ন nil ;; DENTALS
+ ?প ?ফ ?ব ?ভ ?ম ;; LABIALS
+ ?য ?র nil ?ল nil nil nil ;; SEMIVOWELS
+ ?শ ?ষ ?স ?হ ;; SIBILANTS
+ nil nil nil nil ?ড় ?ৠnil ?য় ;; NUKTAS
+ "জà§à¦ž" "কà§à¦·")
(;; Misc Symbols
- ?$,16a(B ?$,16b(B ?$,16c(B nil ?$,17M(B nil nil)
+ ?ঠ?ং ?ঃ nil ?ৠnil nil)
(;; Digits
- ?$,17f(B ?$,17g(B ?$,17h(B ?$,17i(B ?$,17j(B ?$,17k(B ?$,17l(B ?$,17m(B ?$,17n(B ?$,17o(B)
+ ?০ ?১ ?২ ?৩ ?৪ ?৫ ?৬ ?৭ ?৮ ?৯)
(;; Inscript-extra (4) (#, $, ^, *, ])
- "$,17M70(B" "$,1707M(B" "$,17$7M70(B" "$,1767M70(B" "$,17<(B")))
+ "à§à¦°" "রà§" "তà§à¦°" "শà§à¦°" "়")))
(defvar indian-asm-base-table
'(
(;; VOWELS
- (?$,16e(B nil) (?$,16f(B ?$,17>(B) (?$,16g(B ?$,17?(B) (?$,16h(B ?$,17@(B) (?$,16i(B ?$,17A(B) (?$,16j(B ?$,17B(B)
- (?$,16k(B ?$,17C(B) (?$,16l(B ?$,17b(B) nil nil (?$,16o(B ?$,17G(B) (?$,16p(B ?$,17H(B)
- nil nil (?$,16s(B ?$,17K(B) (?$,16t(B ?$,17L(B) (?$,17`(B ?$,17D(B) (?$,17a(B ?$,17c(B))
+ (?অ nil) (?আ ?া) (?ই ?ি) (?ঈ ?à§€) (?উ ?à§) (?ঊ ?à§‚)
+ (?ঋ ?ৃ) (?ঌ ?ৢ) nil nil (?ঠ?ে) (?ঠ?ৈ)
+ nil nil (?ও ?ো) (?ঔ ?ৌ) (?ৠ ?ৄ) (?ৡ ?ৣ))
(;; CONSONANTS
- ?$,16u(B ?$,16v(B ?$,16w(B ?$,16x(B ?$,16y(B ;; GUTTRULS
- ?$,16z(B ?$,16{(B ?$,16|(B ?$,16}(B ?$,16~(B ;; PALATALS
- ?$,16(B ?$,17 (B ?$,17!(B ?$,17"(B ?$,17#(B ;; CEREBRALS
- ?$,17$(B ?$,17%(B ?$,17&(B ?$,17'(B ?$,17((B nil ;; DENTALS
- ?$,17*(B ?$,17+(B ?$,17,(B ?$,17-(B ?$,17.(B ;; LABIALS
- ?$,17/(B ?$,17p(B nil ?$,172(B nil nil ?$,17q(B ;; SEMIVOWELS
- ?$,176(B ?$,177(B ?$,178(B ?$,179(B ;; SIBILANTS
- nil nil nil nil ?$,17\(B ?$,17](B nil ?$,17_(B ;; NUKTAS
- "$,16|7M6~(B" "$,16u7M77(B")
+ ?ক ?খ ?গ ?ঘ ?ঙ ;; GUTTRULS
+ ?চ ?ছ ?জ ?ঠ?ঞ ;; PALATALS
+ ?ট ?ঠ ?ড ?ঢ ?ণ ;; CEREBRALS
+ ?ত ?থ ?দ ?ধ ?ন nil ;; DENTALS
+ ?প ?ফ ?ব ?ভ ?ম ;; LABIALS
+ ?য ?ৰ nil ?ল nil nil ?ৱ ;; SEMIVOWELS
+ ?শ ?ষ ?স ?হ ;; SIBILANTS
+ nil nil nil nil ?ড় ?ৠnil ?য় ;; NUKTAS
+ "জà§à¦ž" "কà§à¦·")
(;; Misc Symbols
- ?$,16a(B ?$,16b(B ?$,16c(B nil ?$,17M(B nil nil)
+ ?ঠ?ং ?ঃ nil ?ৠnil nil)
(;; Digits
- ?$,17f(B ?$,17g(B ?$,17h(B ?$,17i(B ?$,17j(B ?$,17k(B ?$,17l(B ?$,17m(B ?$,17n(B ?$,17o(B)
+ ?০ ?১ ?২ ?৩ ?৪ ?৫ ?৬ ?৭ ?৮ ?৯)
(;; Inscript-extra (4) (#, $, ^, *, ])
- "$,17M7p(B" "$,17p7M(B" "$,17$7M7p(B" "$,1767M7p(B" "$,17<(B")))
+ "à§à§°" "à§°à§" "তà§à§°" "শà§à§°" "়")))
(defvar indian-tlg-base-table
'(
(;; VOWELS
- (?$,1=E(B nil) (?$,1=F(B ?$,1=~(B) (?$,1=G(B ?$,1=(B) (?$,1=H(B ?$,1> (B) (?$,1=I(B ?$,1>!(B) (?$,1=J(B ?$,1>"(B)
- (?$,1=K(B ?$,1>#(B) (?$,1=L(B nil) nil (?$,1=O(B ?$,1>'(B) (?$,1=N(B ?$,1>&(B) (?$,1=P(B ?$,1>((B)
- nil (?$,1=S(B ?$,1>+(B) (?$,1=R(B ?$,1>*(B) (?$,1=T(B ?$,1>,(B) (?$,1>@(B ?$,1>$(B) (?$,1>A(B nil))
+ (?à°… nil) (?à°† ?à°¾) (?à°‡ ?à°¿) (?à°ˆ ?à±€) (?à°‰ ?à±) (?à°Š ?ూ)
+ (?ఋ ?ృ) (?ఌ nil) nil (?ఠ?ే) (?ఎ ?ె) (?ఠ?ై)
+ nil (?ఓ ?ో) (?ఒ ?ొ) (?ఔ ?ౌ) (?ౠ ?ౄ) (?ౡ nil))
(;; CONSONANTS
- ?$,1=U(B ?$,1=V(B ?$,1=W(B ?$,1=X(B ?$,1=Y(B ;; GUTTRULS
- ?$,1=Z(B ?$,1=[(B ?$,1=\(B ?$,1=](B ?$,1=^(B ;; PALATALS
- ?$,1=_(B ?$,1=`(B ?$,1=a(B ?$,1=b(B ?$,1=c(B ;; CEREBRALS
- ?$,1=d(B ?$,1=e(B ?$,1=f(B ?$,1=g(B ?$,1=h(B nil ;; DENTALS
- ?$,1=j(B ?$,1=k(B ?$,1=l(B ?$,1=m(B ?$,1=n(B ;; LABIALS
- ?$,1=o(B ?$,1=p(B ?$,1=q(B ?$,1=r(B ?$,1=s(B nil ?$,1=u(B ;; SEMIVOWELS
- ?$,1=v(B ?$,1=w(B ?$,1=x(B ?$,1=y(B ;; SIBILANTS
+ ?à°• ?à°– ?à°— ?à°˜ ?à°™ ;; GUTTRULS
+ ?చ ?ఛ ?జ ?ఠ?ఞ ;; PALATALS
+ ?à°Ÿ ?à°  ?à°¡ ?à°¢ ?à°£ ;; CEREBRALS
+ ?à°¤ ?à°¥ ?à°¦ ?à°§ ?à°¨ nil ;; DENTALS
+ ?à°ª ?à°« ?à°¬ ?à°­ ?à°® ;; LABIALS
+ ?à°¯ ?à°° ?à°± ?à°² ?à°³ nil ?à°µ ;; SEMIVOWELS
+ ?à°¶ ?à°· ?à°¸ ?à°¹ ;; SIBILANTS
nil nil nil nil nil nil nil nil ;; NUKTAS
- "$,1=\>-=^(B" "$,1=U>-=w(B")
+ "à°œà±à°ž" "à°•à±à°·")
(;; Misc Symbols
- ?$,1=A(B ?$,1=B(B ?$,1=C(B nil ?$,1>-(B nil nil)
+ ?à° ?à°‚ ?à°ƒ nil ?à± nil nil)
(;; Digits
- ?$,1>F(B ?$,1>G(B ?$,1>H(B ?$,1>I(B ?$,1>J(B ?$,1>K(B ?$,1>L(B ?$,1>M(B ?$,1>N(B ?$,1>O(B)
+ ?౦ ?౧ ?౨ ?౩ ?౪ ?౫ ?౬ ?౭ ?౮ ?౯)
(;; Inscript-extra (4) (#, $, ^, *, ])
- "$,1>-=p(B" "$,1=p>-(B" "$,1=d>-=p(B" "$,1=v>-=p(B" nil)))
+ "à±à°°" "à°°à±" "à°¤à±à°°" "à°¶à±à°°" nil)))
(defvar indian-knd-base-table
'(
(;; VOWELS
- (?$,1>e(B nil) (?$,1>f(B ?$,1?>(B) (?$,1>g(B ?$,1??(B) (?$,1>h(B ?$,1?@(B) (?$,1>i(B ?$,1?A(B) (?$,1>j(B ?$,1?B(B)
- (?$,1>k(B ?$,1?C(B) (?$,1>l(B nil) nil (?$,1>o(B ?$,1?G(B) (?$,1>n(B ?$,1?F(B) (?$,1>p(B ?$,1?H(B)
- nil (?$,1>s(B ?$,1?K(B) (?$,1>r(B ?$,1?J(B) (?$,1>t(B ?$,1?L(B) (?$,1?`(B ?$,1?D(B) (?$,1?a(B nil))
+ (?ಅ nil) (?ಆ ?ಾ) (?ಇ ?ಿ) (?ಈ ?à³€) (?ಉ ?à³) (?ಊ ?ೂ)
+ (?ಋ ?ೃ) (?ಌ nil) nil (?ಠ?ೇ) (?ಎ ?ೆ) (?ಠ?ೈ)
+ nil (?ಓ ?ೋ) (?ಒ ?ೊ) (?ಔ ?ೌ) (?ೠ ?ೄ) (?ೡ nil))
(;; CONSONANTS
- ?$,1>u(B ?$,1>v(B ?$,1>w(B ?$,1>x(B ?$,1>y(B ;; GUTTRULS
- ?$,1>z(B ?$,1>{(B ?$,1>|(B ?$,1>}(B ?$,1>~(B ;; PALATALS
- ?$,1>(B ?$,1? (B ?$,1?!(B ?$,1?"(B ?$,1?#(B ;; CEREBRALS
- ?$,1?$(B ?$,1?%(B ?$,1?&(B ?$,1?'(B ?$,1?((B nil ;; DENTALS
- ?$,1?*(B ?$,1?+(B ?$,1?,(B ?$,1?-(B ?$,1?.(B ;; LABIALS
- ?$,1?/(B ?$,1?0(B ?$,1?1(B ?$,1?2(B ?$,1?3(B nil ?$,1?5(B ;; SEMIVOWELS
- ?$,1?6(B ?$,1?7(B ?$,1?8(B ?$,1?9(B ;; SIBILANTS
- nil nil nil nil nil nil ?$,1?^(B nil ;; NUKTAS
- "$,1>|?M>~(B" "$,1>u?M?7(B")
+ ?ಕ ?ಖ ?ಗ ?ಘ ?ಙ ;; GUTTRULS
+ ?ಚ ?ಛ ?ಜ ?ಠ?ಞ ;; PALATALS
+ ?ಟ ?ಠ ?ಡ ?ಢ ?ಣ ;; CEREBRALS
+ ?ತ ?ಥ ?ದ ?ಧ ?ನ nil ;; DENTALS
+ ?ಪ ?ಫ ?ಬ ?ಭ ?ಮ ;; LABIALS
+ ?ಯ ?ರ ?ಱ ?ಲ ?ಳ nil ?ವ ;; SEMIVOWELS
+ ?ಶ ?ಷ ?ಸ ?ಹ ;; SIBILANTS
+ nil nil nil nil nil nil ?ೞ nil ;; NUKTAS
+ "ಜà³à²ž" "ಕà³à²·")
(;; Misc Symbols
- nil ?$,1>b(B ?$,1>c(B nil ?$,1?M(B nil nil)
+ nil ?ಂ ?ಃ nil ?ೠnil nil)
(;; Digits
- ?$,1?f(B ?$,1?g(B ?$,1?h(B ?$,1?i(B ?$,1?j(B ?$,1?k(B ?$,1?l(B ?$,1?m(B ?$,1?n(B ?$,1?o(B)
+ ?೦ ?೧ ?೨ ?೩ ?೪ ?೫ ?೬ ?೭ ?೮ ?೯)
(;; Inscript-extra (4) (#, $, ^, *, ])
- "$,1?M?0(B" "$,1?0?M(B" "$,1?$?M?0(B" "$,1?6?M?0(B" nil)))
+ "à³à²°" "ರà³" "ತà³à²°" "ಶà³à²°" nil)))
(defvar indian-mlm-base-table
'(
(;; VOWELS
- (?$,1@%(B nil) (?$,1@&(B ?$,1@^(B) (?$,1@'(B ?$,1@_(B) (?$,1@((B ?$,1@`(B) (?$,1@)(B ?$,1@a(B) (?$,1@*(B ?$,1@b(B)
- (?$,1@+(B ?$,1@c(B) (?$,1@,(B nil) nil (?$,1@/(B ?$,1@g(B) (?$,1@.(B ?$,1@f(B) (?$,1@0(B ?$,1@h(B)
- nil (?$,1@3(B ?$,1@k(B) (?$,1@2(B ?$,1@j(B) (?$,1@4(B ?$,1@l(B) nil nil)
+ (?à´… nil) (?à´† ?à´¾) (?à´‡ ?à´¿) (?à´ˆ ?ീ) (?à´‰ ?àµ) (?à´Š ?ൂ)
+ (?ഋ ?ൃ) (?ഌ nil) nil (?ഠ?േ) (?എ ?െ) (?ഠ?ൈ)
+ nil (?ഓ ?ോ) (?ഒ ?ൊ) (?ഔ ?ൌ) nil nil)
(;; CONSONANTS
- ?$,1@5(B ?$,1@6(B ?$,1@7(B ?$,1@8(B ?$,1@9(B ;; GUTTRULS
- ?$,1@:(B ?$,1@;(B ?$,1@<(B ?$,1@=(B ?$,1@>(B ;; PALATALS
- ?$,1@?(B ?$,1@@(B ?$,1@A(B ?$,1@B(B ?$,1@C(B ;; CEREBRALS
- ?$,1@D(B ?$,1@E(B ?$,1@F(B ?$,1@G(B ?$,1@H(B nil ;; DENTALS
- ?$,1@J(B ?$,1@K(B ?$,1@L(B ?$,1@M(B ?$,1@N(B ;; LABIALS
- ?$,1@O(B ?$,1@P(B ?$,1@Q(B ?$,1@R(B ?$,1@S(B ?$,1@T(B ?$,1@U(B ;; SEMIVOWELS
- ?$,1@V(B ?$,1@W(B ?$,1@X(B ?$,1@Y(B ;; SIBILANTS
+ ?à´• ?à´– ?à´— ?à´˜ ?à´™ ;; GUTTRULS
+ ?ച ?ഛ ?ജ ?ഠ?ഞ ;; PALATALS
+ ?à´Ÿ ?à´  ?à´¡ ?à´¢ ?à´£ ;; CEREBRALS
+ ?à´¤ ?à´¥ ?à´¦ ?à´§ ?à´¨ nil ;; DENTALS
+ ?à´ª ?à´« ?à´¬ ?à´­ ?à´® ;; LABIALS
+ ?à´¯ ?à´° ?à´± ?à´² ?à´³ ?à´´ ?à´µ ;; SEMIVOWELS
+ ?à´¶ ?à´· ?à´¸ ?à´¹ ;; SIBILANTS
nil nil nil nil nil nil nil nil ;; NUKTAS
- "$,1@<@m@>(B" "$,1@5@m@W(B")
+ "à´œàµà´ž" "à´•àµà´·")
(;; Misc Symbols
- nil ?$,1@"(B ?$,1@#(B nil ?$,1@m(B nil nil)
+ nil ?ം ?ഃ nil ?ൠnil nil)
(;; Digits
- ?$,1A&(B ?$,1A'(B ?$,1A((B ?$,1A)(B ?$,1A*(B ?$,1A+(B ?$,1A,(B ?$,1A-(B ?$,1A.(B ?$,1A/(B)
+ ?൦ ?൧ ?൨ ?൩ ?൪ ?൫ ?൬ ?൭ ?൮ ?൯)
(;; Inscript-extra (4) (#, $, ^, *, ])
- "$,1@m@P(B" "$,1@P@m(B" "$,1@D@m@P(B" "$,1@V@m@P(B" nil)))
+ "àµà´°" "à´°àµ" "à´¤àµà´°" "à´¶àµà´°" nil)))
(defvar indian-tml-base-table
'(
(;; VOWELS
- (?$,1<%(B nil) (?$,1<&(B ?$,1<^(B) (?$,1<'(B ?$,1<_(B) (?$,1<((B ?$,1<`(B) (?$,1<)(B ?$,1<a(B) (?$,1<*(B ?$,1<b(B)
- nil nil nil (?$,1</(B ?$,1<g(B) (?$,1<.(B ?$,1<f(B) (?$,1<0(B ?$,1<h(B)
- nil (?$,1<3(B ?$,1<k(B) (?$,1<2(B ?$,1<j(B) (?$,1<4(B ?$,1<l(B) nil nil)
+ (?à®… nil) (?ஆ ?ா) (?இ ?ி) (?ஈ ?ீ) (?உ ?à¯) (?ஊ ?ூ)
+ nil nil nil (?஠?ே) (?எ ?ெ) (?஠?ை)
+ nil (?ஓ ?ோ) (?ஒ ?ொ) (?ஔ ?ௌ) nil nil)
(;; CONSONANTS
- ?$,1<5(B nil nil nil ?$,1<9(B ;; GUTTRULS
- ?$,1<:(B nil ?$,1<<(B nil ?$,1<>(B ;; PALATALS
- ?$,1<?(B nil nil nil ?$,1<C(B ;; CEREBRALS
- ?$,1<D(B nil nil nil ?$,1<H(B ?$,1<I(B ;; DENTALS
- ?$,1<J(B nil nil nil ?$,1<N(B ;; LABIALS
- ?$,1<O(B ?$,1<P(B ?$,1<Q(B ?$,1<R(B ?$,1<S(B ?$,1<T(B ?$,1<U(B ;; SEMIVOWELS
- nil ?$,1<W(B ?$,1<X(B ?$,1<Y(B ;; SIBILANTS
+ ?க nil nil nil ?ங ;; GUTTRULS
+ ?ச nil ?ஜ nil ?ஞ ;; PALATALS
+ ?ட nil nil nil ?ண ;; CEREBRALS
+ ?த nil nil nil ?ந ?ன ;; DENTALS
+ ?ப nil nil nil ?ம ;; LABIALS
+ ?ய ?ர ?ற ?ல ?ள ?ழ ?வ ;; SEMIVOWELS
+ nil ?ஷ ?ஸ ?ஹ ;; SIBILANTS
nil nil nil nil nil nil nil nil ;; NUKTAS
- "$,1<<<m<>(B" "$,1<5<m<W(B")
+ "ஜà¯à®ž" "கà¯à®·")
(;; Misc Symbols
- nil ?$,1<"(B ?$,1<#(B nil ?$,1<m(B nil nil)
+ nil ?ஂ ?ஃ nil ?௠nil nil)
(;; Digits
- ?$,1=&(B ?$,1='(B ?$,1=((B ?$,1=)(B ?$,1=*(B ?$,1=+(B ?$,1=,(B ?$,1=-(B ?$,1=.(B ?$,1=/(B)
+ ?௦ ?௧ ?௨ ?௩ ?௪ ?௫ ?௬ ?௭ ?௮ ?௯)
(;; Inscript-extra (4) (#, $, ^, *, ])
- "$,1<m<P(B" "$,1<P<m(B" "$,1<D<m<P(B" nil nil)))
+ "à¯à®°" "à®°à¯" "தà¯à®°" nil nil)))
(defvar indian-base-table-to-language-alist
'((indian-dev-base-table . "Devanagari")
@@ -588,117 +588,117 @@
;;Unicode vs IS13194 ;; only Devanagari is supported now.
((ucs-devanagari-to-is13194-alist
'((?\x0900 . "[U+0900]")
- (?\x0901 . "(5!(B")
- (?\x0902 . "(5"(B")
- (?\x0903 . "(5#(B")
+ (?\x0901 . "ö€€€")
+ (?\x0902 . "ö€€")
+ (?\x0903 . "ö€€‚")
(?\x0904 . "[U+0904]")
- (?\x0905 . "(5$(B")
- (?\x0906 . "(5%(B")
- (?\x0907 . "(5&(B")
- (?\x0908 . "(5'(B")
- (?\x0909 . "(5((B")
- (?\x090a . "(5)(B")
- (?\x090b . "(5*(B")
- (?\x090c . "(5&i(B")
- (?\x090d . "(5.(B")
- (?\x090e . "(5+(B")
- (?\x090f . "(5,(B")
- (?\x0910 . "(5-(B")
- (?\x0911 . "(52(B")
- (?\x0912 . "(5/(B")
- (?\x0913 . "(50(B")
- (?\x0914 . "(51(B")
- (?\x0915 . "(53(B")
- (?\x0916 . "(54(B")
- (?\x0917 . "(55(B")
- (?\x0918 . "(56(B")
- (?\x0919 . "(57(B")
- (?\x091a . "(58(B")
- (?\x091b . "(59(B")
- (?\x091c . "(5:(B")
- (?\x091d . "(5;(B")
- (?\x091e . "(5<(B")
- (?\x091f . "(5=(B")
- (?\x0920 . "(5>(B")
- (?\x0921 . "(5?(B")
- (?\x0922 . "(5@(B")
- (?\x0923 . "(5A(B")
- (?\x0924 . "(5B(B")
- (?\x0925 . "(5C(B")
- (?\x0926 . "(5D(B")
- (?\x0927 . "(5E(B")
- (?\x0928 . "(5F(B")
- (?\x0929 . "(5G(B")
- (?\x092a . "(5H(B")
- (?\x092b . "(5I(B")
- (?\x092c . "(5J(B")
- (?\x092d . "(5K(B")
- (?\x092e . "(5L(B")
- (?\x092f . "(5M(B")
- (?\x0930 . "(5O(B")
- (?\x0931 . "(5P(B")
- (?\x0932 . "(5Q(B")
- (?\x0933 . "(5R(B")
- (?\x0934 . "(5S(B")
- (?\x0935 . "(5T(B")
- (?\x0936 . "(5U(B")
- (?\x0937 . "(5V(B")
- (?\x0938 . "(5W(B")
- (?\x0939 . "(5X(B")
+ (?\x0905 . "ö€€ƒ")
+ (?\x0906 . "ö€€„")
+ (?\x0907 . "ö€€…")
+ (?\x0908 . "ö€€†")
+ (?\x0909 . "ö€€‡")
+ (?\x090a . "ö€€ˆ")
+ (?\x090b . "ö€€‰")
+ (?\x090c . "ö€€…ö€ˆ")
+ (?\x090d . "ö€€")
+ (?\x090e . "ö€€Š")
+ (?\x090f . "ö€€‹")
+ (?\x0910 . "ö€€Œ")
+ (?\x0911 . "ö€€‘")
+ (?\x0912 . "ö€€Ž")
+ (?\x0913 . "ö€€")
+ (?\x0914 . "ö€€")
+ (?\x0915 . "ö€€’")
+ (?\x0916 . "ö€€“")
+ (?\x0917 . "ö€€”")
+ (?\x0918 . "ö€€•")
+ (?\x0919 . "ö€€–")
+ (?\x091a . "ö€€—")
+ (?\x091b . "ö€€˜")
+ (?\x091c . "ö€€™")
+ (?\x091d . "ö€€š")
+ (?\x091e . "ö€€›")
+ (?\x091f . "ö€€œ")
+ (?\x0920 . "ö€€")
+ (?\x0921 . "ö€€ž")
+ (?\x0922 . "ö€€Ÿ")
+ (?\x0923 . "ö€€ ")
+ (?\x0924 . "ö€€¡")
+ (?\x0925 . "ö€€¢")
+ (?\x0926 . "ö€€£")
+ (?\x0927 . "ö€€¤")
+ (?\x0928 . "ö€€¥")
+ (?\x0929 . "ö€€¦")
+ (?\x092a . "ö€€§")
+ (?\x092b . "ö€€¨")
+ (?\x092c . "ö€€©")
+ (?\x092d . "ö€€ª")
+ (?\x092e . "ö€€«")
+ (?\x092f . "ö€€¬")
+ (?\x0930 . "ö€€®")
+ (?\x0931 . "ö€€¯")
+ (?\x0932 . "ö€€°")
+ (?\x0933 . "ö€€±")
+ (?\x0934 . "ö€€²")
+ (?\x0935 . "ö€€³")
+ (?\x0936 . "ö€€´")
+ (?\x0937 . "ö€€µ")
+ (?\x0938 . "ö€€¶")
+ (?\x0939 . "ö€€·")
(?\x093a . "[U+093a]")
(?\x093b . "[U+093b]")
- (?\x093c . "(5i(B")
- (?\x093d . "(5ji(B")
- (?\x093e . "(5Z(B")
- (?\x093f . "(5[(B")
- (?\x0940 . "(5\(B")
- (?\x0941 . "(5](B")
- (?\x0942 . "(5^(B")
- (?\x0943 . "(5_(B")
- (?\x0944 . "(5_i(B")
- (?\x0945 . "(5c(B")
- (?\x0946 . "(5`(B")
- (?\x0947 . "(5a(B")
- (?\x0948 . "(5b(B")
- (?\x0949 . "(5g(B")
- (?\x094a . "(5d(B")
- (?\x094b . "(5e(B")
- (?\x094c . "(5f(B")
- (?\x094d . "(5h(B")
+ (?\x093c . "ö€ˆ")
+ (?\x093d . "ö€‰ö€ˆ")
+ (?\x093e . "ö€€¹")
+ (?\x093f . "ö€€º")
+ (?\x0940 . "ö€€»")
+ (?\x0941 . "ö€€¼")
+ (?\x0942 . "ö€€½")
+ (?\x0943 . "ö€€¾")
+ (?\x0944 . "ö€€¾ö€ˆ")
+ (?\x0945 . "ö€‚")
+ (?\x0946 . "ö€€¿")
+ (?\x0947 . "ö€€")
+ (?\x0948 . "ö€")
+ (?\x0949 . "ö€†")
+ (?\x094a . "ö€ƒ")
+ (?\x094b . "ö€„")
+ (?\x094c . "ö€…")
+ (?\x094d . "ö€‡")
(?\x094e . "[U+094e]")
(?\x094f . "[U+094f]")
- (?\x0950 . "(5!i(B")
- (?\x0951 . "(5p5(B")
- (?\x0952 . "(5p8(B")
+ (?\x0950 . "ö€€€ö€ˆ")
+ (?\x0951 . "ö€ö€€”")
+ (?\x0952 . "ö€ö€€—")
(?\x0953 . "[DEVANAGARI GRAVE ACCENT]")
(?\x0954 . "[DEVANAGARI ACUTE ACCENT]")
(?\x0955 . "[U+0955]")
(?\x0956 . "[U+0956]")
(?\x0957 . "[U+0957]")
- (?\x0958 . "(53i(B")
- (?\x0959 . "(54i(B")
- (?\x095a . "(55i(B")
- (?\x095b . "(5:i(B")
- (?\x095c . "(5?i(B")
- (?\x095d . "(5@i(B")
- (?\x095e . "(5Ii(B")
- (?\x095f . "(5N(B")
- (?\x0960 . "(5*i(B")
- (?\x0961 . "(5'i(B")
- (?\x0962 . "(5[i(B")
- (?\x0963 . "(5ei(B")
- (?\x0964 . "(5j(B")
- (?\x0965 . "(5jj(B")
- (?\x0966 . "(5q(B")
- (?\x0967 . "(5r(B")
- (?\x0968 . "(5s(B")
- (?\x0969 . "(5t(B")
- (?\x096a . "(5u(B")
- (?\x096b . "(5v(B")
- (?\x096c . "(5w(B")
- (?\x096d . "(5x(B")
- (?\x096e . "(5y(B")
- (?\x096f . "(5z(B")
+ (?\x0958 . "ö€€’ö€ˆ")
+ (?\x0959 . "ö€€“ö€ˆ")
+ (?\x095a . "ö€€”ö€ˆ")
+ (?\x095b . "ö€€™ö€ˆ")
+ (?\x095c . "ö€€žö€ˆ")
+ (?\x095d . "ö€€Ÿö€ˆ")
+ (?\x095e . "ö€€¨ö€ˆ")
+ (?\x095f . "ö€€­")
+ (?\x0960 . "ö€€‰ö€ˆ")
+ (?\x0961 . "ö€€†ö€ˆ")
+ (?\x0962 . "ö€€ºö€ˆ")
+ (?\x0963 . "ö€„ö€ˆ")
+ (?\x0964 . "ö€‰")
+ (?\x0965 . "ö€‰ö€‰")
+ (?\x0966 . "ö€")
+ (?\x0967 . "ö€‘")
+ (?\x0968 . "ö€’")
+ (?\x0969 . "ö€“")
+ (?\x096a . "ö€”")
+ (?\x096b . "ö€•")
+ (?\x096c . "ö€–")
+ (?\x096d . "ö€—")
+ (?\x096e . "ö€˜")
+ (?\x096f . "ö€™")
(?\x0970 . "[U+0970]")
(?\x0971 . "[U+0971]")
(?\x0972 . "[U+0972]")
@@ -870,332 +870,332 @@ Returns new end position."
(defconst indian-2-colum-to-ucs
'(
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2120 $(6!!!"!#!$!%!&!'!(!)!*!+!,!-!.!/(B
- ("$(6!!(B" . "$,15A(B")
- ("$(6!"(B" . "$,15B(B")
- ("$(6!#(B" . "$,15C(B")
- ("$(6!$(B" . "$,15E(B")
- ("$(6!%(B" . "$,15F(B")
- ("$(6!&(B" . "$,15G(B")
- ("$(6!'(B" . "$,15H(B")
- ("$(6!((B" . "$,15I(B")
- ("$(6!)(B" . "$,15J(B")
- ("$(6!*(B" . "$,15K(B")
- ("$(6!*"p(B" . "$,15p6#(B")
- ("$(6!+(B" . "$,15N(B")
- ("$(6!,(B" . "$,15O(B")
- ("$(6!-(B" . "$,15P(B")
- ("$(6!.(B" . "$,15M(B")
- ("$(6!/(B" . "$,15R(B")
+ ;;2120 ö„€€ö„€ö„€‚ö„€ƒö„€„ö„€…ö„€†ö„€‡ö„€ˆö„€‰ö„€Šö„€‹ö„€Œö„€ö„€Ž
+ ("ö„€€" . "à¤")
+ ("ö„€" . "ं")
+ ("ö„€‚" . "ः")
+ ("ö„€ƒ" . "अ")
+ ("ö„€„" . "आ")
+ ("ö„€…" . "इ")
+ ("ö„€†" . "ई")
+ ("ö„€‡" . "उ")
+ ("ö„€ˆ" . "ऊ")
+ ("ö„€‰" . "ऋ")
+ ("ö„€‰ö„‚­" . "रृ")
+ ("ö„€Š" . "ऎ")
+ ("ö„€‹" . "à¤")
+ ("ö„€Œ" . "à¤")
+ ("ö„€" . "à¤")
+ ("ö„€Ž" . "ऒ")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2130 $(6!0!1!2!3!4!5!6!7!8!9!:!;!<!=!>!?(B
- ("$(6!0(B" . "$,15S(B")
- ("$(6!1(B" . "$,15T(B")
- ("$(6!2(B" . "$,15Q(B")
- ("$(6!3(B" . "$,15U(B")
- ("$(6!4(B" . "$,15V(B")
- ("$(6!5(B" . "$,15W(B")
- ("$(6!6(B" . "$,15X(B")
- ("$(6!7(B" . "$,15Y(B")
- ("$(6!8(B" . "$,15Z(B")
- ("$(6!9(B" . "$,15[(B")
- ("$(6!:(B" . "$,15\(B")
- ("$(6!;(B" . "$,15](B")
- ("$(6!<(B" . "$,15^(B")
- ("$(6!=(B" . "$,15_(B")
- ("$(6!>(B" . "$,15`(B")
- ("$(6!?(B" . "$,15a(B")
+ ;;2130 ö„€ö„€ö„€‘ö„€’ö„€“ö„€”ö„€•ö„€–ö„€—ö„€˜ö„€™ö„€šö„€›ö„€œö„€ö„€ž
+ ("ö„€" . "ओ")
+ ("ö„€" . "औ")
+ ("ö„€‘" . "ऑ")
+ ("ö„€’" . "क")
+ ("ö„€“" . "ख")
+ ("ö„€”" . "ग")
+ ("ö„€•" . "घ")
+ ("ö„€–" . "ङ")
+ ("ö„€—" . "च")
+ ("ö„€˜" . "छ")
+ ("ö„€™" . "ज")
+ ("ö„€š" . "à¤")
+ ("ö„€›" . "ञ")
+ ("ö„€œ" . "ट")
+ ("ö„€" . "ठ")
+ ("ö„€ž" . "ड")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2140 $(6!@!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O(B
- ("$(6!@(B" . "$,15b(B")
- ("$(6!A(B" . "$,15c(B")
- ("$(6!B(B" . "$,15d(B")
- ("$(6!C(B" . "$,15e(B")
- ("$(6!D(B" . "$,15f(B")
- ("$(6!E(B" . "$,15g(B")
- ("$(6!F(B" . "$,15h(B")
- ("$(6!G(B" . "$,15i(B")
- ("$(6!H(B" . "$,15j(B")
- ("$(6!I(B" . "$,15k(B")
- ("$(6!J(B" . "$,15l(B")
- ("$(6!K(B" . "$,15m(B")
- ("$(6!L(B" . "$,15n(B")
- ("$(6!M(B" . "$,15o(B")
- ("$(6!N(B" . "$,16?(B")
- ("$(6!O(B" . "$,15p(B")
+ ;;2140 ö„€Ÿö„€ ö„€¡ö„€¢ö„€£ö„€¤ö„€¥ö„€¦ö„€§ö„€¨ö„€©ö„€ªö„€«ö„€¬ö„€­ö„€®
+ ("ö„€Ÿ" . "ढ")
+ ("ö„€ " . "ण")
+ ("ö„€¡" . "त")
+ ("ö„€¢" . "थ")
+ ("ö„€£" . "द")
+ ("ö„€¤" . "ध")
+ ("ö„€¥" . "न")
+ ("ö„€¦" . "ऩ")
+ ("ö„€§" . "प")
+ ("ö„€¨" . "फ")
+ ("ö„€©" . "ब")
+ ("ö„€ª" . "भ")
+ ("ö„€«" . "म")
+ ("ö„€¬" . "य")
+ ("ö„€­" . "य़")
+ ("ö„€®" . "र")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2150 $(6!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_(B
- ("$(6!P(B" . "$,15q(B")
- ("$(6!Q(B" . "$,15r(B")
- ("$(6!R(B" . "$,15s(B")
- ("$(6!S(B" . "$,15t(B")
- ("$(6!T(B" . "$,15u(B")
- ("$(6!U(B" . "$,15v(B")
- ("$(6!V(B" . "$,15w(B")
- ("$(6!W(B" . "$,15x(B")
- ("$(6!X(B" . "$,15y(B")
- ("$(6!Z(B" . "$,15~(B")
- ("$(6![(B" . "$,15(B")
- ("$(6!\(B" . "$,16 (B")
- ("$(6!](B" . "$,16!(B")
- ("$(6!^(B" . "$,16"(B")
- ("$(6!_(B" . "$,16#(B")
+ ;;2150 ö„€¯ö„€°ö„€±ö„€²ö„€³ö„€´ö„€µö„€¶ö„€·ö„€¸ö„€¹ö„€ºö„€»ö„€¼ö„€½ö„€¾
+ ("ö„€¯" . "ऱ")
+ ("ö„€°" . "ल")
+ ("ö„€±" . "ळ")
+ ("ö„€²" . "ऴ")
+ ("ö„€³" . "व")
+ ("ö„€´" . "श")
+ ("ö„€µ" . "ष")
+ ("ö„€¶" . "स")
+ ("ö„€·" . "ह")
+ ("ö„€¹" . "ा")
+ ("ö„€º" . "ि")
+ ("ö„€»" . "ी")
+ ("ö„€¼" . "à¥")
+ ("ö„€½" . "ू")
+ ("ö„€¾" . "ृ")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2160 $(6!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o(B
- ("$(6!`(B" . "$,16&(B")
- ("$(6!a(B" . "$,16'(B")
- ("$(6!b(B" . "$,16((B")
- ("$(6!c(B" . "$,16%(B")
- ("$(6!d(B" . "$,16*(B")
- ("$(6!e(B" . "$,16+(B")
- ("$(6!f(B" . "$,16,(B")
- ("$(6!g(B" . "$,16)(B")
- ("$(6!h(B" . "$,16-(B")
- ("$(6!i(B" . "$,15|(B")
- ("$(6!j(B" . "$,16D(B")
- ("$(6!j!j(B" . "$,16E(B")
+ ;;2160 ö„€¿ö„€ö„ö„‚ö„ƒö„„ö„…ö„†ö„‡ö„ˆö„‰ö„Šö„‹ö„Œö„ö„Ž
+ ("ö„€¿" . "ॆ")
+ ("ö„€" . "े")
+ ("ö„" . "ै")
+ ("ö„‚" . "ॅ")
+ ("ö„ƒ" . "ॊ")
+ ("ö„„" . "ो")
+ ("ö„…" . "ौ")
+ ("ö„†" . "ॉ")
+ ("ö„‡" . "à¥")
+ ("ö„ˆ" . "़")
+ ("ö„‰" . "।")
+ ("ö„‰ö„‰" . "॥")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2170 $(6!p!q!r!s!t!u!v!w!x!y!z!{!|!}!~(B
- ("$(6!q(B" . "$,16F(B")
- ("$(6!r(B" . "$,16G(B")
- ("$(6!s(B" . "$,16H(B")
- ("$(6!t(B" . "$,16I(B")
- ("$(6!u(B" . "$,16J(B")
- ("$(6!v(B" . "$,16K(B")
- ("$(6!w(B" . "$,16L(B")
- ("$(6!x(B" . "$,16M(B")
- ("$(6!y(B" . "$,16N(B")
- ("$(6!z(B" . "$,16O(B")
+ ;;2170 ö„ö„ö„‘ö„’ö„“ö„”ö„•ö„–ö„—ö„˜ö„™ö„šö„›ö„œö„
+ ("ö„" . "०")
+ ("ö„‘" . "१")
+ ("ö„’" . "२")
+ ("ö„“" . "३")
+ ("ö„”" . "४")
+ ("ö„•" . "५")
+ ("ö„–" . "६")
+ ("ö„—" . "७")
+ ("ö„˜" . "८")
+ ("ö„™" . "९")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2220 $(6"!"""#"$"%"&"'"(")"*"+","-"."/(B
- ("$(6"!(B" . "$,16;6-5p(B")
- ("$(6""(B" . "$,16>6-5p(B")
- ("$(6"#(B" . "$,15U6-5p(B")
- ("$(6"$(B" . "$,15W6-5p(B")
- ("$(6"%(B" . "$,15d6-5p(B")
- ("$(6"&(B" . "$,15j6-5p(B")
- ("$(6"'(B" . "$,15k6-5p(B")
- ("$(6")(B" . "$,15v6-5p(B")
- ("$(6",(B" . "$,15p6!(B")
- ("$(6"-(B" . "$,15p6"(B")
- ("$(6".(B" . "$,15q6!(B")
- ("$(6"/(B" . "$,15q6"(B")
+ ;;2220 ö„žö„Ÿö„ ö„¡ö„¢ö„£ö„¤ö„¥ö„¦ö„§ö„¨ö„©ö„ªö„«ö„¬
+ ("ö„ž" . "ज़à¥à¤°")
+ ("ö„Ÿ" . "फ़à¥à¤°")
+ ("ö„ " . "कà¥à¤°")
+ ("ö„¡" . "गà¥à¤°")
+ ("ö„¢" . "तà¥à¤°")
+ ("ö„£" . "पà¥à¤°")
+ ("ö„¤" . "फà¥à¤°")
+ ("ö„¦" . "शà¥à¤°")
+ ("ö„©" . "रà¥")
+ ("ö„ª" . "रू")
+ ("ö„«" . "ऱà¥")
+ ("ö„¬" . "ऱू")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2230 $(6"0"1"2"3"4"5"6"7"8"9":";"<"=">"?(B
- ("$(6"3(B" . "$,15U6-(B")
- ("$(6"4(B" . "$,15V6-(B")
- ("$(6"5(B" . "$,15W6-(B")
- ("$(6"6(B" . "$,15X6-(B")
- ("$(6"8(B" . "$,15Z6-(B")
- ("$(6"8"q(B" . "$,15Z6-5p6-(B")
- ("$(6":(B" . "$,15\6-(B")
- ("$(6";(B" . "$,15]6-(B")
- ("$(6"<(B" . "$,15^6-(B")
- ("$(6"<(B" . "$,15^6-(B")
+ ;;2230 ö„­ö„®ö„¯ö„°ö„±ö„²ö„³ö„´ö„µö„¶ö„·ö„¸ö„¹ö„ºö„»ö„¼
+ ("ö„°" . "कà¥")
+ ("ö„±" . "खà¥")
+ ("ö„²" . "गà¥")
+ ("ö„³" . "घà¥")
+ ("ö„µ" . "चà¥")
+ ("ö„µö„‚®" . "चà¥à¤°à¥")
+ ("ö„·" . "जà¥")
+ ("ö„¸" . "à¤à¥")
+ ("ö„¹" . "ञà¥")
+ ("ö„¹" . "ञà¥")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2240 $(6"@"A"B"C"D"E"F"G"H"I"J"K"L"M"N"O(B
- ("$(6"A(B" . "$,15c6-(B")
- ("$(6"B(B" . "$,15d6-(B")
- ("$(6"C(B" . "$,15e6-(B")
- ("$(6"E(B" . "$,15g6-(B")
- ("$(6"F(B" . "$,15h6-(B")
- ("$(6"G(B" . "$,15i6-(B")
- ("$(6"H(B" . "$,15j6-(B")
- ("$(6"I(B" . "$,15k6-(B")
- ("$(6"J(B" . "$,15l6-(B")
- ("$(6"J(B" . "$,15l6-(B")
- ("$(6"K(B" . "$,15m6-(B")
- ("$(6"L(B" . "$,15n6-(B")
- ("$(6"M(B" . "$,15o6-(B")
- ("$(6"N(B" . "$,16?6-(B")
+ ;;2240 ö„½ö„¾ö„¿ö„‚€ö„‚ö„‚‚ö„‚ƒö„‚„ö„‚…ö„‚†ö„‚‡ö„‚ˆö„‚‰ö„‚Šö„‚‹ö„‚Œ
+ ("ö„¾" . "णà¥")
+ ("ö„¿" . "तà¥")
+ ("ö„‚€" . "थà¥")
+ ("ö„‚‚" . "धà¥")
+ ("ö„‚ƒ" . "नà¥")
+ ("ö„‚„" . "ऩà¥")
+ ("ö„‚…" . "पà¥")
+ ("ö„‚†" . "फà¥")
+ ("ö„‚‡" . "बà¥")
+ ("ö„‚‡" . "बà¥")
+ ("ö„‚ˆ" . "भà¥")
+ ("ö„‚‰" . "मà¥")
+ ("ö„‚Š" . "यà¥")
+ ("ö„‚‹" . "य़à¥")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2250 $(6"P"Q"R"S"T"U"V"W"X"Y"Z"["\"]"^"_(B
- ("$(6"Q(B" . "$,15r6-(B")
- ("$(6"R(B" . "$,15s6-(B")
- ("$(6"S(B" . "$,15t6-(B")
- ("$(6"T(B" . "$,15u6-(B")
- ("$(6"U(B" . "$,15v6-(B")
- ("$(6"V(B" . "$,15w6-(B")
- ("$(6"W(B" . "$,15x6-(B")
- ("$(6"](B" . "$,16-5o(B")
+ ;;2250 ö„‚ö„‚Žö„‚ö„‚ö„‚‘ö„‚’ö„‚“ö„‚”ö„‚•ö„‚–ö„‚—ö„‚˜ö„‚™ö„‚šö„‚›ö„‚œ
+ ("ö„‚Ž" . "लà¥")
+ ("ö„‚" . "ळà¥")
+ ("ö„‚" . "ऴà¥")
+ ("ö„‚‘" . "वà¥")
+ ("ö„‚’" . "शà¥")
+ ("ö„‚“" . "षà¥")
+ ("ö„‚”" . "सà¥")
+ ("ö„‚š" . "à¥à¤¯")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2260 $(6"`"a"b"c"d"e"f"g"h"i"j"k"l"m"n"o(B
- ("$(6"`(B" . "$,15W6-5p6-(B")
- ("$(6"a(B" . "$,15X6-5h6-(B")
- ("$(6"c(B" . "$,15d6-5d6-(B")
- ("$(6"d(B" . "$,15d6-5p6-(B")
- ("$(6"e(B" . "$,15g6-5h6-(B")
- ("$(6"f(B" . "$,15g6-5p6-(B")
- ("$(6"g(B" . "$,15j6-5d6-(B")
- ("$(6"h(B" . "$,15v6-5Z6-(B")
- ("$(6"i(B" . "$,15v6-5p6-(B")
- ("$(6"j(B" . "$,15v6-5u6-(B")
- ("$(6"k(B" . "$,15h6-5h6-(B")
- ("$(6"l(B" . "$,15U6-5w6-(B")
- ("$(6"m(B" . "$,15\6-5^6-(B")
+ ;;2260 ö„‚ö„‚žö„‚Ÿö„‚ ö„‚¡ö„‚¢ö„‚£ö„‚¤ö„‚¥ö„‚¦ö„‚§ö„‚¨ö„‚©ö„‚ªö„‚«ö„‚¬
+ ("ö„‚" . "गà¥à¤°à¥")
+ ("ö„‚ž" . "घà¥à¤¨à¥")
+ ("ö„‚ " . "तà¥à¤¤à¥")
+ ("ö„‚¡" . "तà¥à¤°à¥")
+ ("ö„‚¢" . "धà¥à¤¨à¥")
+ ("ö„‚£" . "धà¥à¤°à¥")
+ ("ö„‚¤" . "पà¥à¤¤à¥")
+ ("ö„‚¥" . "शà¥à¤šà¥")
+ ("ö„‚¦" . "शà¥à¤°à¥")
+ ("ö„‚§" . "शà¥à¤µà¥")
+ ("ö„‚¨" . "नà¥à¤¨à¥")
+ ("ö„‚©" . "कà¥à¤·à¥")
+ ("ö„‚ª" . "जà¥à¤žà¥")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2270 $(6"p"q"r"s"t"u"v"w"x"y"z"{"|"}"~(B
- ("$(6"p(B" . "$,15p6-(B")
- ("$(6"q(B" . "$,16-5p(B")
- ("$(6"r(B" . "$,16-5p(B")
- ("$(6"s(B" . "$,1686-(B")
- ("$(6"t(B" . "$,1696-(B")
- ("$(6"u(B" . "$,16:6-(B")
- ("$(6"y(B" . "$,16>6-(B")
- ("$(6"z(B" . "$,16;6-(B")
+ ;;2270 ö„‚­ö„‚®ö„‚¯ö„‚°ö„‚±ö„‚²ö„‚³ö„‚´ö„‚µö„‚¶ö„‚·ö„‚¸ö„‚¹ö„‚ºö„‚»
+ ("ö„‚­" . "रà¥")
+ ("ö„‚®" . "à¥à¤°")
+ ("ö„‚¯" . "à¥à¤°")
+ ("ö„‚°" . "क़à¥")
+ ("ö„‚±" . "ख़à¥")
+ ("ö„‚²" . "ग़à¥")
+ ("ö„‚¶" . "फ़à¥")
+ ("ö„‚·" . "ज़à¥")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2320 $(6#!#"###$#%#&#'#(#)#*#+#,#-#.#/(B
- ("$(6#!(B" . "$,160(B")
- ("$(6#&(B" . "$,15L(B")
- ("$(6#&"p(B" . "$,15p6$(B")
- ("$(6#'(B" . "$,16A(B")
- ("$(6#'"p(B" . "$,15p6C(B")
- ("$(6#*(B" . "$,16@(B")
- ("$(6#*"p(B" . "$,15p6B(B")
+ ;;2320 ö„‚¼ö„‚½ö„‚¾ö„‚¿ö„ƒ€ö„ƒö„ƒ‚ö„ƒƒö„ƒ„ö„ƒ…ö„ƒ†ö„ƒ‡ö„ƒˆö„ƒ‰ö„ƒŠ
+ ("ö„‚¼" . "à¥")
+ ("ö„ƒ" . "ऌ")
+ ("ö„ƒö„‚­" . "रॄ")
+ ("ö„ƒ‚" . "ॡ")
+ ("ö„ƒ‚ö„‚­" . "रॣ")
+ ("ö„ƒ…" . "ॠ")
+ ("ö„ƒ…ö„‚­" . "रॢ")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2330 $(6#0#1#2#3#4#5#6#7#8#9#:#;#<#=#>#?(B
- ("$(6#3(B" . "$,168(B")
- ("$(6#4(B" . "$,169(B")
- ("$(6#5(B" . "$,16:(B")
- ("$(6#:(B" . "$,16;(B")
- ("$(6#?(B" . "$,16<(B")
+ ;;2330 ö„ƒ‹ö„ƒŒö„ƒö„ƒŽö„ƒö„ƒö„ƒ‘ö„ƒ’ö„ƒ“ö„ƒ”ö„ƒ•ö„ƒ–ö„ƒ—ö„ƒ˜ö„ƒ™ö„ƒš
+ ("ö„ƒŽ" . "क़")
+ ("ö„ƒ" . "ख़")
+ ("ö„ƒ" . "ग़")
+ ("ö„ƒ•" . "ज़")
+ ("ö„ƒš" . "ड़")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2340 $(6#@#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O(B
- ("$(6#@(B" . "$,16=(B")
- ("$(6#I(B" . "$,16>(B")
- ("$(6#J(B" . "$,15}(B")
- ("$(6#K(B" . "$,16$(B")
- ("$(6#L(B" . "$,16B(B")
- ("$(6#M(B" . "$,16C(B")
+ ;;2340 ö„ƒ›ö„ƒœö„ƒö„ƒžö„ƒŸö„ƒ ö„ƒ¡ö„ƒ¢ö„ƒ£ö„ƒ¤ö„ƒ¥ö„ƒ¦ö„ƒ§ö„ƒ¨ö„ƒ©ö„ƒª
+ ("ö„ƒ›" . "à¥")
+ ("ö„ƒ¤" . "फ़")
+ ("ö„ƒ¥" . "ऽ")
+ ("ö„ƒ¦" . "ॄ")
+ ("ö„ƒ§" . "ॢ")
+ ("ö„ƒ¨" . "ॣ")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2350 $(6#P#Q#R#S#T#U#V#W#X#Y#Z#[#\#]#^#_(B
- ("$(6#P(B" . "$,15n6-5h(B")
- ("$(6#Q(B" . "$,15n6-5r(B")
- ("$(6#R(B" . "$,15y6#(B")
+ ;;2350 ö„ƒ«ö„ƒ¬ö„ƒ­ö„ƒ®ö„ƒ¯ö„ƒ°ö„ƒ±ö„ƒ²ö„ƒ³ö„ƒ´ö„ƒµö„ƒ¶ö„ƒ·ö„ƒ¸ö„ƒ¹ö„ƒº
+ ("ö„ƒ«" . "मà¥à¤¨")
+ ("ö„ƒ¬" . "मà¥à¤²")
+ ("ö„ƒ­" . "हृ")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2360 $(6#`#a#b#c#d#e#f#g#h#i#j#k#l#m#n#o(B
- ("$(6#`(B" . "$,15r6-5r(B")
- ("$(6#a(B" . "$,15u6-5h(B")
- ("$(6#b(B" . "$,15u6-5u(B")
- ("$(6#c(B" . "$,15v6-5Z(B")
- ("$(6#d(B" . "$,15v6-5h(B")
- ("$(6#e(B" . "$,15v6-5l(B")
- ("$(6#f(B" . "$,15v6-5r(B")
- ("$(6#g(B" . "$,15v6-5u(B")
- ("$(6#h(B" . "$,15w6-5_6-5p6-5o(B")
- ("$(6#i(B" . "$,15w6-5_6-5o(B")
- ("$(6#j(B" . "$,15w6-5_6-5u(B")
- ("$(6#k(B" . "$,15w6-5_(B")
- ("$(6#l(B" . "$,15w6-5`(B")
- ("$(6#m(B" . "$,15x6-5h(B")
- ("$(6#n(B" . "$,15x6-5p(B")
+ ;;2360 ö„ƒ»ö„ƒ¼ö„ƒ½ö„ƒ¾ö„ƒ¿ö„„€ö„„ö„„‚ö„„ƒö„„„ö„„…ö„„†ö„„‡ö„„ˆö„„‰ö„„Š
+ ("ö„ƒ»" . "लà¥à¤²")
+ ("ö„ƒ¼" . "वà¥à¤¨")
+ ("ö„ƒ½" . "वà¥à¤µ")
+ ("ö„ƒ¾" . "शà¥à¤š")
+ ("ö„ƒ¿" . "शà¥à¤¨")
+ ("ö„„€" . "शà¥à¤¬")
+ ("ö„„" . "शà¥à¤²")
+ ("ö„„‚" . "शà¥à¤µ")
+ ("ö„„ƒ" . "षà¥à¤Ÿà¥à¤°à¥à¤¯")
+ ("ö„„„" . "षà¥à¤Ÿà¥à¤¯")
+ ("ö„„…" . "षà¥à¤Ÿà¥à¤µ")
+ ("ö„„†" . "षà¥à¤Ÿ")
+ ("ö„„‡" . "षà¥à¤ ")
+ ("ö„„ˆ" . "सà¥à¤¨")
+ ("ö„„‰" . "सà¥à¤°")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2370 $(6#p#q#r#s#t#u#v#w#x#y#z#{#|#}#~(B
- ("$(6#p(B" . "$,15y6-5c(B")
- ("$(6#q(B" . "$,15y6-5h(B")
- ("$(6#r(B" . "$,15y6-5n(B")
- ("$(6#s(B" . "$,15y6-5o(B")
- ("$(6#t(B" . "$,15y6-5p(B")
- ("$(6#u(B" . "$,15y6-5r(B")
- ("$(6#v(B" . "$,15y6-5u(B")
+ ;;2370 ö„„‹ö„„Œö„„ö„„Žö„„ö„„ö„„‘ö„„’ö„„“ö„„”ö„„•ö„„–ö„„—ö„„˜ö„„™
+ ("ö„„‹" . "हà¥à¤£")
+ ("ö„„Œ" . "हà¥à¤¨")
+ ("ö„„" . "हà¥à¤®")
+ ("ö„„Ž" . "हà¥à¤¯")
+ ("ö„„" . "हà¥à¤°")
+ ("ö„„" . "हà¥à¤²")
+ ("ö„„‘" . "हà¥à¤µ")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2420 $(6$!$"$#$$$%$&$'$($)$*$+$,$-$.$/(B
- ("$(6$!(B" . "$,15U6-5d6-5p6-5o(B")
- ("$(6$"(B" . "$,15U6-5d6-5u(B")
- ("$(6$#(B" . "$,15U6-5d6-5o(B")
- ("$(6$$(B" . "$,15U6-5h6-5o(B")
- ("$(6$%(B" . "$,15U6-5p6-5o(B")
- ("$(6$&(B" . "$,15U6-5u6-5o(B")
- ("$(6$'(B" . "$,15U6-5U(B")
- ("$(6$((B" . "$,15U6-5d(B")
- ("$(6$)(B" . "$,15U6-5h(B")
- ("$(6$*(B" . "$,15U6-5n(B")
- ("$(6$+(B" . "$,15U6-5o(B")
- ("$(6$,(B" . "$,15U6-5r(B")
- ("$(6$-(B" . "$,15U6-5u(B")
- ("$(6$.(B" . "$,15U6-5w(B")
- ("$(6$/(B" . "$,15X6-5h(B")
+ ;;2420 ö„„šö„„›ö„„œö„„ö„„žö„„Ÿö„„ ö„„¡ö„„¢ö„„£ö„„¤ö„„¥ö„„¦ö„„§ö„„¨
+ ("ö„„š" . "कà¥à¤¤à¥à¤°à¥à¤¯")
+ ("ö„„›" . "कà¥à¤¤à¥à¤µ")
+ ("ö„„œ" . "कà¥à¤¤à¥à¤¯")
+ ("ö„„" . "कà¥à¤¨à¥à¤¯")
+ ("ö„„ž" . "कà¥à¤°à¥à¤¯")
+ ("ö„„Ÿ" . "कà¥à¤µà¥à¤¯")
+ ("ö„„ " . "कà¥à¤•")
+ ("ö„„¡" . "कà¥à¤¤")
+ ("ö„„¢" . "कà¥à¤¨")
+ ("ö„„£" . "कà¥à¤®")
+ ("ö„„¤" . "कà¥à¤¯")
+ ("ö„„¥" . "कà¥à¤²")
+ ("ö„„¦" . "कà¥à¤µ")
+ ("ö„„§" . "कà¥à¤·")
+ ("ö„„¨" . "घà¥à¤¨")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2430 $(6$0$1$2$3$4$5$6$7$8$9$:$;$<$=$>$?(B
- ("$(6$0(B" . "$,15Y6-5U6-5d6-5o(B")
- ("$(6$1(B" . "$,15Y6-5U6-5w6-5u(B")
- ("$(6$2(B" . "$,15Y6-5U6-5d(B")
- ("$(6$3(B" . "$,15Y6-5U6-5w(B")
- ("$(6$4(B" . "$,15Y6-5X6-5p(B")
- ("$(6$5(B" . "$,15Y6-5U6-5o(B")
- ("$(6$6(B" . "$,15Y6-5V6-5o(B")
- ("$(6$7(B" . "$,15Y6-5W6-5o(B")
- ("$(6$8(B" . "$,15Y6-5X6-5o(B")
- ("$(6$9(B" . "$,15Y6-5U(B")
- ("$(6$:(B" . "$,15Y6-5V(B")
- ("$(6$;(B" . "$,15Y6-5W(B")
- ("$(6$<(B" . "$,15Y6-5X(B")
- ("$(6$=(B" . "$,15Y6-5Y(B")
- ("$(6$>(B" . "$,15Y6-5h(B")
- ("$(6$?(B" . "$,15Y6-5n(B")
+ ;;2430 ö„„©ö„„ªö„„«ö„„¬ö„„­ö„„®ö„„¯ö„„°ö„„±ö„„²ö„„³ö„„´ö„„µö„„¶ö„„·ö„„¸
+ ("ö„„©" . "ङà¥à¤•à¥à¤¤à¥à¤¯")
+ ("ö„„ª" . "ङà¥à¤•à¥à¤·à¥à¤µ")
+ ("ö„„«" . "ङà¥à¤•à¥à¤¤")
+ ("ö„„¬" . "ङà¥à¤•à¥à¤·")
+ ("ö„„­" . "ङà¥à¤˜à¥à¤°")
+ ("ö„„®" . "ङà¥à¤•à¥à¤¯")
+ ("ö„„¯" . "ङà¥à¤–à¥à¤¯")
+ ("ö„„°" . "ङà¥à¤—à¥à¤¯")
+ ("ö„„±" . "ङà¥à¤˜à¥à¤¯")
+ ("ö„„²" . "ङà¥à¤•")
+ ("ö„„³" . "ङà¥à¤–")
+ ("ö„„´" . "ङà¥à¤—")
+ ("ö„„µ" . "ङà¥à¤˜")
+ ("ö„„¶" . "ङà¥à¤™")
+ ("ö„„·" . "ङà¥à¤¨")
+ ("ö„„¸" . "ङà¥à¤®")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2440 $(6$@$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O(B
- ("$(6$@(B" . "$,15Y6-5o(B")
- ("$(6$A(B" . "$,15Z6-5Z(B")
- ("$(6$B(B" . "$,15Z6-5^(B")
- ("$(6$C(B" . "$,15[6-5o(B")
- ("$(6$D(B" . "$,15\6-5p(B")
- ("$(6$E(B" . "$,15\6-5^(B")
- ("$(6$F(B" . "$,15^6-5Z(B")
- ("$(6$G(B" . "$,15^6-5\(B")
- ("$(6$H(B" . "$,15_6-5U(B")
- ("$(6$I(B" . "$,15_6-5_(B")
- ("$(6$J(B" . "$,15_6-5`(B")
- ("$(6$K(B" . "$,15_6-5o(B")
- ("$(6$L(B" . "$,15`6-5o(B")
- ("$(6$M(B" . "$,15a6-5W6-5o(B")
- ("$(6$N(B" . "$,15a6-5X6-5p(B")
- ("$(6$O(B" . "$,15a6-5p6-5o(B")
+ ;;2440 ö„„¹ö„„ºö„„»ö„„¼ö„„½ö„„¾ö„„¿ö„…€ö„…ö„…‚ö„…ƒö„…„ö„……ö„…†ö„…‡ö„…ˆ
+ ("ö„„¹" . "ङà¥à¤¯")
+ ("ö„„º" . "चà¥à¤š")
+ ("ö„„»" . "चà¥à¤ž")
+ ("ö„„¼" . "छà¥à¤¯")
+ ("ö„„½" . "जà¥à¤°")
+ ("ö„„¾" . "जà¥à¤ž")
+ ("ö„„¿" . "ञà¥à¤š")
+ ("ö„…€" . "ञà¥à¤œ")
+ ("ö„…" . "टà¥à¤•")
+ ("ö„…‚" . "टà¥à¤Ÿ")
+ ("ö„…ƒ" . "टà¥à¤ ")
+ ("ö„…„" . "टà¥à¤¯")
+ ("ö„……" . "ठà¥à¤¯")
+ ("ö„…†" . "डà¥à¤—à¥à¤¯")
+ ("ö„…‡" . "डà¥à¤˜à¥à¤°")
+ ("ö„…ˆ" . "डà¥à¤°à¥à¤¯")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2450 $(6$P$Q$R$S$T$U$V$W$X$Y$Z$[$\$]$^$_(B
- ("$(6$P(B" . "$,15a6-5W(B")
- ("$(6$Q(B" . "$,15a6-5X(B")
- ("$(6$R(B" . "$,15a6-5a(B")
- ("$(6$S(B" . "$,15a6-5n(B")
- ("$(6$T(B" . "$,15a6-5o(B")
+ ;;2450 ö„…‰ö„…Šö„…‹ö„…Œö„…ö„…Žö„…ö„…ö„…‘ö„…’ö„…“ö„…”ö„…•ö„…–ö„…—ö„…˜
+ ("ö„…‰" . "डà¥à¤—")
+ ("ö„…Š" . "डà¥à¤˜")
+ ("ö„…‹" . "डà¥à¤¡")
+ ("ö„…Œ" . "डà¥à¤®")
+ ("ö„…" . "डà¥à¤¯")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2460 $(6$`$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o(B
- ("$(6$`(B" . "$,15b6-5o(B")
- ("$(6$a(B" . "$,15d6-5d(B")
- ("$(6$b(B" . "$,15d6-5h(B")
- ("$(6$c(B" . "$,15f6-5f6-5o(B")
- ("$(6$d(B" . "$,15f6-5g6-5o(B")
- ("$(6$e(B" . "$,15f6-5m6-5o(B")
- ("$(6$f(B" . "$,15f6-5p6-5o(B")
- ("$(6$g(B" . "$,15f6-5u6-5o(B")
- ("$(6$h(B" . "$,15f6-5W6-5p(B")
- ("$(6$i(B" . "$,15f6-5X6-5p(B")
- ("$(6$j(B" . "$,15f6-5f6-5u(B")
- ("$(6$k(B" . "$,15f6-5g6-5u(B")
- ("$(6$l(B" . "$,15f6-5W(B")
- ("$(6$m(B" . "$,15f6-5X(B")
- ("$(6$n(B" . "$,15f6-5f(B")
- ("$(6$o(B" . "$,15f6-5g(B")
+ ;;2460 ö„…™ö„…šö„…›ö„…œö„…ö„…žö„…Ÿö„… ö„…¡ö„…¢ö„…£ö„…¤ö„…¥ö„…¦ö„…§ö„…¨
+ ("ö„…™" . "ढà¥à¤¯")
+ ("ö„…š" . "तà¥à¤¤")
+ ("ö„…›" . "तà¥à¤¨")
+ ("ö„…œ" . "दà¥à¤¦à¥à¤¯")
+ ("ö„…" . "दà¥à¤§à¥à¤¯")
+ ("ö„…ž" . "दà¥à¤­à¥à¤¯")
+ ("ö„…Ÿ" . "दà¥à¤°à¥à¤¯")
+ ("ö„… " . "दà¥à¤µà¥à¤¯")
+ ("ö„…¡" . "दà¥à¤—à¥à¤°")
+ ("ö„…¢" . "दà¥à¤˜à¥à¤°")
+ ("ö„…£" . "दà¥à¤¦à¥à¤µ")
+ ("ö„…¤" . "दà¥à¤§à¥à¤µ")
+ ("ö„…¥" . "दà¥à¤—")
+ ("ö„…¦" . "दà¥à¤˜")
+ ("ö„…§" . "दà¥à¤¦")
+ ("ö„…¨" . "दà¥à¤§")
;; 0 1 2 3 4 5 6 7 8 9 a b c d e f
- ;;2470 $(6$p$q$r$s$t$u$v$w$x$y$z${$|$}$~(B
- ("$(6$p(B" . "$,15f6-5h(B")
- ("$(6$q(B" . "$,15f6-5l(B")
- ("$(6$r(B" . "$,15f6-5m(B")
- ("$(6$s(B" . "$,15f6-5n(B")
- ("$(6$t(B" . "$,15f6-5o(B")
- ("$(6$u(B" . "$,15f6-5u(B")
- ("$(6$v(B" . "$,15g6-5h(B")
- ("$(6$w(B" . "$,15h6-5h(B")
- ("$(6$x(B" . "$,15j6-5d(B")
- ("$(6$y(B" . "$,15j6-5h(B")
- ("$(6$z(B" . "$,15j6-5r(B")
- ("$(6${(B" . "$,15l6-5h(B")
- ("$(6$|(B" . "$,15l6-5l(B")
- ("$(6$}(B" . "$,15l6-5u(B")
- ("$(6$~(B" . "$,15m6-5h(B")))
+ ;;2470 ö„…©ö„…ªö„…«ö„…¬ö„…­ö„…®ö„…¯ö„…°ö„…±ö„…²ö„…³ö„…´ö„…µö„…¶ö„…·
+ ("ö„…©" . "दà¥à¤¨")
+ ("ö„…ª" . "दà¥à¤¬")
+ ("ö„…«" . "दà¥à¤­")
+ ("ö„…¬" . "दà¥à¤®")
+ ("ö„…­" . "दà¥à¤¯")
+ ("ö„…®" . "दà¥à¤µ")
+ ("ö„…¯" . "धà¥à¤¨")
+ ("ö„…°" . "नà¥à¤¨")
+ ("ö„…±" . "पà¥à¤¤")
+ ("ö„…²" . "पà¥à¤¨")
+ ("ö„…³" . "पà¥à¤²")
+ ("ö„…´" . "बà¥à¤¨")
+ ("ö„…µ" . "बà¥à¤¬")
+ ("ö„…¶" . "बà¥à¤µ")
+ ("ö„…·" . "भà¥à¤¨")))
(defconst indian-2-column-to-ucs-regexp
- "$(6!j!j(B\\|$(6"8"q(B\\|[$(6#&#'!*#*(B]$(6"p(B\\|[$(6!!(B-$(6$~(B]")
+ "ö„‰ö„‰\\|ö„µö„‚®\\|[ö„ƒö„ƒ‚ö„€‰ö„ƒ…]ö„‚­\\|[ö„€€-ö„…·]")
(put 'indian-2-column-to-ucs-chartable 'char-table-extra-slots 1)
(defconst indian-2-column-to-ucs-chartable
diff --git a/lisp/language/korean.el b/lisp/language/korean.el
index 6130d0ebc01..ff5a3cbc21e 100644
--- a/lisp/language/korean.el
+++ b/lisp/language/korean.el
@@ -1,4 +1,4 @@
-;;; korean.el --- support for Korean -*- coding: iso-2022-7bit -*-
+;;; korean.el --- support for Korean -*- coding: utf-8 -*-
;; Copyright (C) 1998, 2001-2013 Free Software Foundation, Inc.
;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
@@ -74,7 +74,7 @@
(input-method . "korean-hangul")
(features korea-util)
(coding-priority korean-iso-8bit korean-cp949 iso-2022-kr)
- (sample-text . "Hangul ($(CGQ1[(B) $(C>H3gGO<<?d(B, $(C>H3gGO=J4O1n(B")
+ (sample-text . "Hangul (한글) 안녕하세요, 안녕하십니까")
(documentation . "\
The following key bindings are available for controlling Korean input methods:
Shift-SPC, Hangul: toggle-korean-input-method
diff --git a/lisp/language/lao-util.el b/lisp/language/lao-util.el
index d1bee8aec01..8a30ff49264 100644
--- a/lisp/language/lao-util.el
+++ b/lisp/language/lao-util.el
@@ -1,4 +1,4 @@
-;;; lao-util.el --- utilities for Lao -*- coding: iso-2022-7bit; -*-
+;;; lao-util.el --- utilities for Lao -*- coding: utf-8; -*-
;; Copyright (C) 2001-2013 Free Software Foundation, Inc.
;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
@@ -38,100 +38,100 @@
(define-category ?v "Lao upper/lower vowel" lao-category-table)
(define-category ?t "Lao tone" lao-category-table)
-(let ((l '((?(1!(B consonant "LETTER KOR KAI'" "CHICKEN")
- (?(1"(B consonant "LETTER KHOR KHAI'" "EGG")
- (?(1#(B invalid nil)
- (?(1$(B consonant "LETTER QHOR QHWARGN" "BUFFALO")
- (?(1%(B invalid nil)
+(let ((l '((?ຠconsonant "LETTER KOR KAI'" "CHICKEN")
+ (?ຂ consonant "LETTER KHOR KHAI'" "EGG")
+ (?຃ invalid nil)
+ (?ຄ consonant "LETTER QHOR QHWARGN" "BUFFALO")
+ (?຅ invalid nil)
(? invalid nil)
- (?(1'(B consonant "LETTER NGOR NGUU" "SNAKE")
- (?(1((B consonant "LETTER JOR JUA" "BUDDHIST NOVICE")
- (?(1)(B invalid nil)
- (?(1*(B consonant "LETTER XOR X\"ARNG" "ELEPHANT")
- (?(1+(B invalid nil)
- (?(1,(B invalid nil)
- (?(1-(B consonant "LETTER YOR YUNG" "MOSQUITO")
- (?(1.(B invalid nil)
- (?(1.(B invalid nil)
- (?(1.(B invalid nil)
- (?(1.(B invalid nil)
- (?(1.(B invalid nil)
- (?(1.(B invalid nil)
- (?(14(B consonant "LETTER DOR DANG" "NOSE")
- (?(15(B consonant "LETTER TOR TAR" "EYE")
- (?(16(B consonant "LETTER THOR THUNG" "TO ASK,QUESTION")
- (?(17(B consonant "LETTER DHOR DHARM" "FLAG")
- (?(18(B invalid nil)
- (?(19(B consonant "LETTER NOR NOK" "BIRD")
- (?(1:(B consonant "LETTER BOR BED" "FISHHOOK")
- (?(1;(B consonant "LETTER POR PAR" "FISH")
- (?(1<(B consonant "LETTER HPOR HPER\"" "BEE")
- (?(1=(B consonant "LETTER FHOR FHAR" "WALL")
- (?(1>(B consonant "LETTER PHOR PHUU" "MOUNTAIN")
- (?(1?(B consonant "LETTER FOR FAI" "FIRE")
- (?(1@(B invalid nil)
- (?(1A(B consonant "LETTER MOR MAR\"" "HORSE")
- (?(1B(B consonant "LETTER GNOR GNAR" "MEDICINE")
- (?(1C(B consonant "LETTER ROR ROD" "CAR")
- (?(1D(B invalid nil)
- (?(1E(B consonant "LETTER LOR LIING" "MONKEY")
- (?(1F(B invalid nil)
- (?(1G(B consonant "LETTER WOR WII" "HAND FAN")
- (?(1H(B invalid nil)
- (?(1I(B invalid nil)
- (?(1J(B consonant "LETTER SOR SEA" "TIGER")
- (?(1K(B consonant "LETTER HHOR HHAI" "JAR")
- (?(1L(B invalid nil)
- (?(1M(B consonant "LETTER OR OOW" "TAKE")
- (?(1N(B consonant "LETTER HOR HEA" "BOAT")
- (?(1O(B special "ELLIPSIS")
- (?(1P(B vowel-base "VOWEL SIGN SARA A")
- (?(1Q(B vowel-upper "VOWEL SIGN MAI KAN")
- (?(1R(B vowel-base "VOWEL SIGN SARA AR")
- (?(1S(B vowel-base "VOWEL SIGN SARA AM")
- (?(1T(B vowel-upper "VOWEL SIGN SARA I")
- (?(1U(B vowel-upper "VOWEL SIGN SARA II")
- (?(1V(B vowel-upper "VOWEL SIGN SARA EU")
- (?(1W(B vowel-upper "VOWEL SIGN SARA UR")
- (?(1X(B vowel-lower "VOWEL SIGN SARA U")
- (?(1Y(B vowel-lower "VOWEL SIGN SARA UU")
- (?(1Z(B invalid nil)
- (?(1[(B vowel-upper "VOWEL SIGN MAI KONG")
- (?(1\(B semivowel-lower "SEMIVOWEL SIGN LO")
- (?(1](B vowel-base "SEMIVOWEL SIGN SARA IA")
- (?(1^(B invalid nil)
- (?(1_(B invalid nil)
- (?(1`(B vowel-base "VOWEL SIGN SARA EE")
- (?(1a(B vowel-base "VOWEL SIGN SARA AA")
- (?(1b(B vowel-base "VOWEL SIGN SARA OO")
- (?(1c(B vowel-base "VOWEL SIGN SARA EI MAI MUAN\"")
- (?(1d(B vowel-base "VOWEL SIGN SARA AI MAI MAY")
- (?(1e(B invalid nil)
- (?(1f(B special "KO LA (REPETITION)")
- (?(1g(B invalid nil)
- (?(1h(B tone "TONE MAI EK")
- (?(1i(B tone "TONE MAI THO")
- (?(1j(B tone "TONE MAI TI")
- (?(1k(B tone "TONE MAI JADTAWAR")
- (?(1l(B tone "CANCELLATION MARK")
- (?(1m(B vowel-upper "VOWEL SIGN SARA OR")
- (?(1n(B invalid nil)
- (?(1o(B invalid nil)
- (?(1p(B special "DIGIT ZERO")
- (?(1q(B special "DIGIT ONE")
- (?(1r(B special "DIGIT TWO")
- (?(1s(B special "DIGIT THREE")
- (?(1t(B special "DIGIT FOUR")
- (?(1u(B special "DIGIT FIVE")
- (?(1v(B special "DIGIT SIX")
- (?(1w(B special "DIGIT SEVEN")
- (?(1x(B special "DIGIT EIGHT")
- (?(1y(B special "DIGIT NINE")
- (?(1z(B invalid nil)
- (?(1{(B invalid nil)
- (?(1|(B consonant "LETTER NHOR NHUU" "MOUSE")
- (?(1}(B consonant "LETTER MHOR MHAR" "DOG")
- (?(1~(B invalid nil)))
+ (?ງ consonant "LETTER NGOR NGUU" "SNAKE")
+ (?ຈ consonant "LETTER JOR JUA" "BUDDHIST NOVICE")
+ (?ຉ invalid nil)
+ (?ຊ consonant "LETTER XOR X\"ARNG" "ELEPHANT")
+ (?຋ invalid nil)
+ (?ຌ invalid nil)
+ (?ຠconsonant "LETTER YOR YUNG" "MOSQUITO")
+ (?ຎ invalid nil)
+ (?ຎ invalid nil)
+ (?ຎ invalid nil)
+ (?ຎ invalid nil)
+ (?ຎ invalid nil)
+ (?ຎ invalid nil)
+ (?ດ consonant "LETTER DOR DANG" "NOSE")
+ (?ຕ consonant "LETTER TOR TAR" "EYE")
+ (?ຖ consonant "LETTER THOR THUNG" "TO ASK,QUESTION")
+ (?ທ consonant "LETTER DHOR DHARM" "FLAG")
+ (?ຘ invalid nil)
+ (?ນ consonant "LETTER NOR NOK" "BIRD")
+ (?ບ consonant "LETTER BOR BED" "FISHHOOK")
+ (?ປ consonant "LETTER POR PAR" "FISH")
+ (?ຜ consonant "LETTER HPOR HPER\"" "BEE")
+ (?ຠconsonant "LETTER FHOR FHAR" "WALL")
+ (?ພ consonant "LETTER PHOR PHUU" "MOUNTAIN")
+ (?ຟ consonant "LETTER FOR FAI" "FIRE")
+ (?ຠ invalid nil)
+ (?ມ consonant "LETTER MOR MAR\"" "HORSE")
+ (?ຢ consonant "LETTER GNOR GNAR" "MEDICINE")
+ (?ຣ consonant "LETTER ROR ROD" "CAR")
+ (?຤ invalid nil)
+ (?ລ consonant "LETTER LOR LIING" "MONKEY")
+ (?຦ invalid nil)
+ (?ວ consonant "LETTER WOR WII" "HAND FAN")
+ (?ຨ invalid nil)
+ (?ຩ invalid nil)
+ (?ສ consonant "LETTER SOR SEA" "TIGER")
+ (?ຫ consonant "LETTER HHOR HHAI" "JAR")
+ (?ຬ invalid nil)
+ (?ອ consonant "LETTER OR OOW" "TAKE")
+ (?ຮ consonant "LETTER HOR HEA" "BOAT")
+ (?ຯ special "ELLIPSIS")
+ (?ະ vowel-base "VOWEL SIGN SARA A")
+ (?ັ vowel-upper "VOWEL SIGN MAI KAN")
+ (?າ vowel-base "VOWEL SIGN SARA AR")
+ (?ຳ vowel-base "VOWEL SIGN SARA AM")
+ (?ິ vowel-upper "VOWEL SIGN SARA I")
+ (?ີ vowel-upper "VOWEL SIGN SARA II")
+ (?ຶ vowel-upper "VOWEL SIGN SARA EU")
+ (?ື vowel-upper "VOWEL SIGN SARA UR")
+ (?ຸ vowel-lower "VOWEL SIGN SARA U")
+ (?ູ vowel-lower "VOWEL SIGN SARA UU")
+ (?຺ invalid nil)
+ (?ົ vowel-upper "VOWEL SIGN MAI KONG")
+ (?ຼ semivowel-lower "SEMIVOWEL SIGN LO")
+ (?ຽ vowel-base "SEMIVOWEL SIGN SARA IA")
+ (?຾ invalid nil)
+ (?຿ invalid nil)
+ (?ເ vowel-base "VOWEL SIGN SARA EE")
+ (?à» vowel-base "VOWEL SIGN SARA AA")
+ (?ໂ vowel-base "VOWEL SIGN SARA OO")
+ (?ໃ vowel-base "VOWEL SIGN SARA EI MAI MUAN\"")
+ (?ໄ vowel-base "VOWEL SIGN SARA AI MAI MAY")
+ (?à»… invalid nil)
+ (?ໆ special "KO LA (REPETITION)")
+ (?໇ invalid nil)
+ (?່ tone "TONE MAI EK")
+ (?້ tone "TONE MAI THO")
+ (?໊ tone "TONE MAI TI")
+ (?໋ tone "TONE MAI JADTAWAR")
+ (?໌ tone "CANCELLATION MARK")
+ (?à» vowel-upper "VOWEL SIGN SARA OR")
+ (?໎ invalid nil)
+ (?à» invalid nil)
+ (?à» special "DIGIT ZERO")
+ (?໑ special "DIGIT ONE")
+ (?à»’ special "DIGIT TWO")
+ (?໓ special "DIGIT THREE")
+ (?à»” special "DIGIT FOUR")
+ (?໕ special "DIGIT FIVE")
+ (?à»– special "DIGIT SIX")
+ (?à»— special "DIGIT SEVEN")
+ (?໘ special "DIGIT EIGHT")
+ (?à»™ special "DIGIT NINE")
+ (?໚ invalid nil)
+ (?à»› invalid nil)
+ (?ໜ consonant "LETTER NHOR NHUU" "MOUSE")
+ (?à» consonant "LETTER MHOR MHAR" "DOG")
+ (?ໞ invalid nil)))
elm)
(while l
(setq elm (car l) l (cdr l))
@@ -185,115 +185,115 @@
(defconst lao-transcription-consonant-alist
(sort '(;; single consonants
- ("k" . "(1!(B")
- ("kh" . "(1"(B")
- ("qh" . "(1$(B")
- ("ng" . "(1'(B")
- ("j" . "(1((B")
- ("s" . "(1J(B")
- ("x" . "(1*(B")
- ("y" . "(1-(B")
- ("d" . "(14(B")
- ("t" . "(15(B")
- ("th" . "(16(B")
- ("dh" . "(17(B")
- ("n" . "(19(B")
- ("b" . "(1:(B")
- ("p" . "(1;(B")
- ("hp" . "(1<(B")
- ("fh" . "(1=(B")
- ("ph" . "(1>(B")
- ("f" . "(1?(B")
- ("m" . "(1A(B")
- ("gn" . "(1B(B")
- ("l" . "(1E(B")
- ("r" . "(1C(B")
- ("v" . "(1G(B")
- ("w" . "(1G(B")
- ("hh" . "(1K(B")
- ("O" . "(1M(B")
- ("h" . "(1N(B")
- ("nh" . "(1|(B")
- ("mh" . "(1}(B")
- ("lh" . ["(1K\(B"])
+ ("k" . "àº")
+ ("kh" . "ຂ")
+ ("qh" . "ຄ")
+ ("ng" . "ງ")
+ ("j" . "ຈ")
+ ("s" . "ສ")
+ ("x" . "ຊ")
+ ("y" . "àº")
+ ("d" . "ດ")
+ ("t" . "ຕ")
+ ("th" . "ຖ")
+ ("dh" . "ທ")
+ ("n" . "ນ")
+ ("b" . "ບ")
+ ("p" . "ປ")
+ ("hp" . "ຜ")
+ ("fh" . "àº")
+ ("ph" . "ພ")
+ ("f" . "ຟ")
+ ("m" . "ມ")
+ ("gn" . "ຢ")
+ ("l" . "ລ")
+ ("r" . "ຣ")
+ ("v" . "ວ")
+ ("w" . "ວ")
+ ("hh" . "ຫ")
+ ("O" . "ອ")
+ ("h" . "ຮ")
+ ("nh" . "ໜ")
+ ("mh" . "à»")
+ ("lh" . ["ຫຼ"])
;; double consonants
- ("ngh" . ["(1K'(B"])
- ("yh" . ["(1K](B"])
- ("wh" . ["(1KG(B"])
- ("hl" . ["(1KE(B"])
- ("hy" . ["(1K-(B"])
- ("hn" . ["(1K9(B"])
- ("hm" . ["(1KA(B"])
+ ("ngh" . ["ຫງ"])
+ ("yh" . ["ຫຽ"])
+ ("wh" . ["ຫວ"])
+ ("hl" . ["ຫລ"])
+ ("hy" . ["ຫàº"])
+ ("hn" . ["ຫນ"])
+ ("hm" . ["ຫມ"])
)
(function (lambda (x y) (> (length (car x)) (length (car y)))))))
(defconst lao-transcription-semi-vowel-alist
- '(("r" . "(1\(B")))
+ '(("r" . "ຼ")))
(defconst lao-transcription-vowel-alist
- (sort '(("a" . "(1P(B")
- ("ar" . "(1R(B")
- ("i" . "(1T(B")
- ("ii" . "(1U(B")
- ("eu" . "(1V(B")
- ("ur" . "(1W(B")
- ("u" . "(1X(B")
- ("uu" . "(1Y(B")
- ("e" . ["(1`P(B"])
- ("ee" . "(1`(B")
- ("ae" . ["(1aP(B"])
- ("aa" . "(1a(B")
- ("o" . ["(1bP(B"])
- ("oo" . "(1b(B")
- ("oe" . ["(1`RP(B"])
- ("or" . "(1m(B")
- ("er" . ["(1`T(B"])
- ("ir" . ["(1`U(B"])
- ("ua" . ["(1[GP(B"])
- ("uaa" . ["(1[G(B"])
- ("ie" . ["(1`Q]P(B"])
- ("ia" . ["(1`Q](B"])
- ("ea" . ["(1`VM(B"])
- ("eaa" . ["(1`WM(B"])
- ("ai" . "(1d(B")
- ("ei" . "(1c(B")
- ("ao" . ["(1`[R(B"])
- ("aM" . "(1S(B"))
+ (sort '(("a" . "ະ")
+ ("ar" . "າ")
+ ("i" . "ິ")
+ ("ii" . "ີ")
+ ("eu" . "ຶ")
+ ("ur" . "ື")
+ ("u" . "ຸ")
+ ("uu" . "ູ")
+ ("e" . ["ເະ"])
+ ("ee" . "ເ")
+ ("ae" . ["à»àº°"])
+ ("aa" . "à»")
+ ("o" . ["ໂະ"])
+ ("oo" . "ໂ")
+ ("oe" . ["ເາະ"])
+ ("or" . "à»")
+ ("er" . ["ເິ"])
+ ("ir" . ["ເີ"])
+ ("ua" . ["ົວະ"])
+ ("uaa" . ["ົວ"])
+ ("ie" . ["ເັຽະ"])
+ ("ia" . ["ເັຽ"])
+ ("ea" . ["ເຶອ"])
+ ("eaa" . ["ເືອ"])
+ ("ai" . "ໄ")
+ ("ei" . "ໃ")
+ ("ao" . ["ເົາ"])
+ ("aM" . "ຳ"))
(function (lambda (x y) (> (length (car x)) (length (car y)))))))
;; Maa-sakod is put at the tail.
(defconst lao-transcription-maa-sakod-alist
- '(("k" . "(1!(B")
- ("g" . "(1'(B")
- ("y" . "(1-(B")
- ("d" . "(14(B")
- ("n" . "(19(B")
- ("b" . "(1:(B")
- ("m" . "(1A(B")
- ("v" . "(1G(B")
- ("w" . "(1G(B")
+ '(("k" . "àº")
+ ("g" . "ງ")
+ ("y" . "àº")
+ ("d" . "ດ")
+ ("n" . "ນ")
+ ("b" . "ບ")
+ ("m" . "ມ")
+ ("v" . "ວ")
+ ("w" . "ວ")
))
(defconst lao-transcription-tone-alist
- '(("'" . "(1h(B")
- ("\"" . "(1i(B")
- ("^" . "(1j(B")
- ("+" . "(1k(B")
- ("~" . "(1l(B")))
+ '(("'" . "່")
+ ("\"" . "້")
+ ("^" . "໊")
+ ("+" . "໋")
+ ("~" . "໌")))
(defconst lao-transcription-punctuation-alist
- '(("\\0" . "(1p(B")
- ("\\1" . "(1q(B")
- ("\\2" . "(1r(B")
- ("\\3" . "(1s(B")
- ("\\4" . "(1t(B")
- ("\\5" . "(1u(B")
- ("\\6" . "(1v(B")
- ("\\7" . "(1w(B")
- ("\\8" . "(1x(B")
- ("\\9" . "(1y(B")
- ("\\\\" . "(1f(B")
- ("\\$" . "(1O(B")))
+ '(("\\0" . "à»")
+ ("\\1" . "໑")
+ ("\\2" . "à»’")
+ ("\\3" . "໓")
+ ("\\4" . "à»”")
+ ("\\5" . "໕")
+ ("\\6" . "à»–")
+ ("\\7" . "à»—")
+ ("\\8" . "໘")
+ ("\\9" . "à»™")
+ ("\\\\" . "ໆ")
+ ("\\$" . "ຯ")))
(defconst lao-transcription-pattern
(concat
@@ -332,39 +332,39 @@
"Regexp of Roman transcription pattern for one Lao syllable.")
(defconst lao-vowel-reordering-rule
- '(("(1P(B" (0 ?(1P(B) (0 ?(1Q(B))
- ("(1R(B" (0 ?(1R(B))
- ("(1T(B" (0 ?(1U(B))
- ("(1U(B" (0 ?(1U(B))
- ("(1V(B" (0 ?(1V(B))
- ("(1W(B" (0 ?(1W(B))
- ("(1X(B" (0 ?(1X(B))
- ("(1Y(B" (0 ?(1Y(B))
- ("(1`P(B" (?(1`(B 0 ?(1P(B) (?(1`(B 0 ?(1Q(B))
- ("(1`(B" (?(1`(B 0))
- ("(1aP(B" (?(1a(B 0 ?(1P(B) (?(1a(B 0 ?(1Q(B))
- ("(1a(B" (?(1a(B 0))
- ("(1bP(B" (?(1b(B 0 ?(1P(B) (0 ?(1[(B) (?(1-(B ?(1b(B 0 ?(1Q(B) (?(1G(B ?(1b(B 0 ?(1Q(B))
- ("(1b(B" (?(1b(B 0))
- ("(1`RP(B" (?(1`(B 0 ?(1R(B ?(1P(B) (0 ?(1Q(B ?(1M(B))
- ("(1m(B" (0 ?(1m(B) (0 ?(1M(B))
- ("(1`T(B" (?(1`(B 0 ?(1T(B))
- ("(1`U(B" (?(1`(B 0 ?(1U(B))
- ("(1[GP(B" (0 ?(1[(B ?(1G(B ?(1P(B) (0 ?(1Q(B ?(1G(B))
- ("(1[G(B" (0 ?(1[(B ?(1G(B) (0 ?(1G(B))
- ("(1`Q]P(B" (?(1`(B 0 ?(1Q(B ?(1](B ?(1P(B) (0 ?(1Q(B ?(1](B))
- ("(1`Q](B" (?(1`(B 0 ?(1Q(B ?(1](B) (0 ?(1](B))
- ("(1`VM(B" (?(1`(B 0 ?(1V(B ?(1M(B))
- ("(1`WM(B" (?(1`(B 0 ?(1W(B ?(1M(B))
- ("(1d(B" (?(1d(B 0))
- ("(1c(B" (?(1c(B 0))
- ("(1`[R(B" (?(1`(B 0 ?(1[(B ?(1R(B))
- ("(1S(B" (0 ?(1S(B)))
+ '(("ະ" (0 ?ະ) (0 ?ັ))
+ ("າ" (0 ?າ))
+ ("ິ" (0 ?ີ))
+ ("ີ" (0 ?ີ))
+ ("ຶ" (0 ?ຶ))
+ ("ື" (0 ?ື))
+ ("ຸ" (0 ?ຸ))
+ ("ູ" (0 ?ູ))
+ ("ເະ" (?ເ 0 ?ະ) (?ເ 0 ?ັ))
+ ("ເ" (?ເ 0))
+ ("à»àº°" (?à» 0 ?ະ) (?à» 0 ?ັ))
+ ("à»" (?à» 0))
+ ("ໂະ" (?ໂ 0 ?ະ) (0 ?ົ) (?ຠ?ໂ 0 ?ັ) (?ວ ?ໂ 0 ?ັ))
+ ("ໂ" (?ໂ 0))
+ ("ເາະ" (?ເ 0 ?າ ?ະ) (0 ?ັ ?ອ))
+ ("à»" (0 ?à») (0 ?ອ))
+ ("ເິ" (?ເ 0 ?ິ))
+ ("ເີ" (?ເ 0 ?ີ))
+ ("ົວະ" (0 ?ົ ?ວ ?ະ) (0 ?ັ ?ວ))
+ ("ົວ" (0 ?ົ ?ວ) (0 ?ວ))
+ ("ເັຽະ" (?ເ 0 ?ັ ?ຽ ?ະ) (0 ?ັ ?ຽ))
+ ("ເັຽ" (?ເ 0 ?ັ ?ຽ) (0 ?ຽ))
+ ("ເຶອ" (?ເ 0 ?ຶ ?ອ))
+ ("ເືອ" (?ເ 0 ?ື ?ອ))
+ ("ໄ" (?ໄ 0))
+ ("ໃ" (?ໃ 0))
+ ("ເົາ" (?ເ 0 ?ົ ?າ))
+ ("ຳ" (0 ?ຳ)))
"Alist of Lao vowel string vs the corresponding re-ordering rule.
Each element has this form:
(VOWEL NO-MAA-SAKOD-RULE WITH-MAA-SAKOD-RULE (MAA-SAKOD-0 RULE-0) ...)
-VOWEL is a vowel string (e.g. \"(1`Q]P(B\").
+VOWEL is a vowel string (e.g. \"ເັຽະ\").
NO-MAA-SAKOD-RULE is a rule to re-order and modify VOWEL following a
consonant. It is a list vowel characters or 0. The element 0
@@ -375,8 +375,8 @@ following a consonant and preceding a maa-sakod character. If it is
nil, NO-MAA-SAKOD-RULE is used. The maa-sakod character is always
appended at the tail.
-For instance, rule `(\"(1`WM(B\" (?(1`(B t ?(1W(B ?(1M(B))' tells that this vowel
-string following a consonant `(1!(B' should be re-ordered as \"(1`!WM(B\".
+For instance, rule `(\"ເືອ\" (?ເ t ?ື ?ອ))' tells that this vowel
+string following a consonant `àº' should be re-ordered as \"ເàºàº·àº­\".
Optional (MAA-SAKOD-n RULE-n) are rules specially applied to maa-sakod
character MAA-SAKOD-n.")
diff --git a/lisp/language/romanian.el b/lisp/language/romanian.el
index 98eff2a7db7..608ff811923 100644
--- a/lisp/language/romanian.el
+++ b/lisp/language/romanian.el
@@ -1,4 +1,4 @@
-;;; romanian.el --- support for Romanian -*- coding: iso-latin-2 -*-
+;;; romanian.el --- support for Romanian -*- coding: utf-8 -*-
;; Copyright (C) 1998, 2001-2013 Free Software Foundation, Inc.
@@ -34,7 +34,7 @@
(input-method . "latin-2-postfix")
(unibyte-display . iso-8859-2)
(tutorial . "TUTORIAL.ro")
- (sample-text . "Bunã ziua, bine aþi venit!")
+ (sample-text . "Bună ziua, bine aţi venit!")
(documentation . "Romanian environment using Latin-2 encoding.
An environment for generic Latin-10 encoding is also available."))
'("European"))
diff --git a/lisp/language/slovak.el b/lisp/language/slovak.el
index 236024321d8..a3203067fc8 100644
--- a/lisp/language/slovak.el
+++ b/lisp/language/slovak.el
@@ -1,10 +1,10 @@
-;;; slovak.el --- support for Slovak -*- coding: iso-2022-7bit -*-
+;;; slovak.el --- support for Slovak -*- coding: utf-8 -*-
;; Copyright (C) 1998, 2001-2013 Free Software Foundation, Inc.
-;; Authors: Tibor ,B)(Bimko <tibor.simko@fmph.uniba.sk>,
+;; Authors: Tibor Å imko <tibor.simko@fmph.uniba.sk>,
;; Milan Zamazal <pdm@zamazal.org>
-;; Maintainer: Pavel Jan,Am(Bk <Pavel@Janik.cz>
+;; Maintainer: Pavel Janík <Pavel@Janik.cz>
;; Keywords: multilingual, Slovak
;; This file is part of GNU Emacs.
@@ -36,7 +36,7 @@
(input-method . "slovak")
(unibyte-display . iso-8859-2)
(tutorial . "TUTORIAL.sk")
- (sample-text . "Prajeme V,Ba(Bm pr,Bm(Bjemn,B}(B de,Br(B!")
+ (sample-text . "Prajeme Vám príjemný deň!")
(documentation . "\
This language environment is almost the same as Latin-2,
but sets the default input method to \"slovak\",
diff --git a/lisp/language/thai-word.el b/lisp/language/thai-word.el
index 5cb13e08fd6..d3c00f9ac36 100644
--- a/lisp/language/thai-word.el
+++ b/lisp/language/thai-word.el
@@ -80,10663 +80,10663 @@
(let ((table (list 'thai-words)))
(dolist (elt
;;; The following is indented as this to minimize this file size.
- '("¡¡"
- "¡¡Å"
- "¡¡Ø¸Àѳ±ì"
- "¡§"
- "¡§¡ÒÃ"
- "¡§ÊØÅ"
- "¡§àµê¡"
- "¡®"
- "¡®ËÁÒÂ"
- "¡°Ô¹"
- "¡´"
- "¡µÑ­ªÅÕ"
- "¡µÑ­­ØµÒ"
- "¡µÑ­­Ù"
- "¡µÒ¸Ô¡ÒÃ"
- "¡µÒÀÔ¹ÔËÒÃ"
- "¡µÔ¡Ò"
- "¡µàÇ·ÔµÒ"
- "¡µàÇ·Õ"
- "¡¶Ò"
- "¡·Á"
- "¡·ÅÕ"
- "¡¹"
- "¡¹¡"
- "¡¹ÔɰÒ"
- "¡º"
- "¡º¯"
- "¡º´Ò¹"
- "¡º·Ù"
- "¡ºÒÅ"
- "¡ºÔ¹·Ãì"
- "¡ºÔÅ"
- "¡ºÕè"
- "¡ÁÅ"
- "¡Ã"
- "¡Ã¡®"
- "¡Ã¡®Ò¤Á"
- "¡Ã¡¯"
- "¡Ã§"
- "¡Ã³±ì"
- "¡Ã³Õ"
- "¡Ã³Õ¡Ԩ"
- "¡Ã³ÕÂì"
- "¡Ã´"
- "¡Ã¹"
- "¡Ãº"
- "¡ÃºÙÃ"
- "¡ÃÁ"
- "¡ÃÁ·èÒ"
- "¡ÃÁ¸ÃÃÁì"
- "¡ÃÃ"
- "¡Ãêԧ"
- "¡Ãó"
- "¡ÃóԡÒÃì"
- "¡ÃþØÁ"
- "¡ÃÃÁ"
- "¡ÃÃÁ¡Ã"
- "¡ÃÃÁ¡ÒÃ"
- "¡ÃÃÁªÇÒµ"
- "¡ÃÃÁÒª¹"
- "¡ÃÃÁÒªÕ¾"
- "¡ÃÃÁÒ¸Ô¡ÒÃ"
- "¡ÃÃà¨Õ¡"
- "¡ÃÃàªÕ§"
- "¡ÃÃá·Ã¡"
- "¡ÃÃ⪡"
- "¡ÃÃä¡Ã"
- "¡ÃÇ´"
- "¡ÃǺ"
- "¡ÃÇÂ"
- "¡ÃÍ"
- "¡ÃÍ¡"
- "¡ÃÍ¡á¡Ã¡"
- "¡Ãͧ"
- "¡Ãͧ¡ÃÍÂ"
- "¡ÃÍ´"
- "¡Ãͺ"
- "¡ÃÍÁ"
- "¡ÃÐ"
- "¡ÃЧ¡¡ÃÐà§Ôè¹"
- "¡ÃЧèͧ¡ÃÐá§è§"
- "¡ÃЧè͹¡ÃÐá§è¹"
- "¡ÃШ¡"
- "¡ÃШ͡"
- "¡ÃШͧÍá§"
- "¡ÃШѧ"
- "¡ÃШѺ"
- "¡ÃШҴ"
- "¡ÃШҺ"
- "¡ÃШÒÂ"
- "¡ÃШԴ"
- "¡ÃШԺ"
- "¡ÃШÔÃÔ´"
- "¡ÃШء"
- "¡ÃШغ¡ÃШԺ"
- "¡ÃШØÂ"
- "¡ÃШØë§¡ÃШÔë§"
- "¡ÃШØëÁ¡ÃШÔëÁ"
- "¡ÃШÙë¡ÃШÕë"
- "¡ÃШèÒ§"
- "¡ÃШé͹"
- "¡ÃЩ͡"
- "¡ÃЩѺ¡ÃÐà©§"
- "¡ÃЩٴ"
- "¡ÃЩè͹"
- "¡ÃЪ͹"
- "¡ÃЪѺ"
- "¡ÃЪÑé¹"
- "¡ÃЪҡ"
- "¡ÃЪØ"
- "¡ÃЫԡ"
- "¡ÃЫԺ"
- "¡ÃЮØÁ¾Õ"
- "¡Ãд¡"
- "¡Ãдͧ"
- "¡Ãд͹"
- "¡Ãдѧ§Ò"
- "¡Ãдҡ"
- "¡ÃдҧÅÒ§"
- "¡Ãдҹ"
- "¡ÃдÒÉ"
- "¡Ãдԡ"
- "¡ÃдÔè§"
- "¡ÃдÕè"
- "¡Ãд׺"
- "¡ÃдØÁ"
- "¡Ãд١"
- "¡Ãдé§"
- "¡ÃдéÒ§"
- "¡Ãеԡ"
- "¡ÃеԺ"
- "¡ÃеÔê´"
- "¡Ãе×ÍÃ×ÍÃé¹"
- "¡Ãеء"
- "¡ÃеØé§¡ÃеÔé§"
- "¡ÃеØé¹"
- "¡Ãеèͧ¡ÃÐáµè§"
- "¡ÃеèÒÂ"
- "¡ÃеéÇÁ¡ÃÐàµÕéÂÁ"
- "¡Ãеêͺ"
- "¡ÃжԹ"
- "¡Ãз§"
- "¡Ãзº"
- "¡ÃзÃǧ"
- "¡ÃзÐ"
- "¡ÃзÑè§"
- "¡Ãзԧ"
- "¡Ãз׺"
- "¡Ãзا"
- "¡ÃзÙé"
- "¡ÃзèÍÁ"
- "¡Ãзé͹"
- "¡ÃзéÍÁ¡ÃÐá·éÁ"
- "¡ÃйÑé¹"
- "¡Ãкǹ"
- "¡ÃкÇÂ"
- "¡Ãк͡"
- "¡Ãкͧ"
- "¡ÃкÐ"
- "¡ÃкÔ"
- "¡ÃкÕè"
- "¡Ãк×Í"
- "¡Ãкا"
- "¡ÃлÃÕé¡ÃÐà»ÃèÒ"
- "¡ÃлÑéÇ¡ÃÐà»ÕéÂ"
- "¡ÃлèÓ"
- "¡ÃлéÍ¡ÃÐá»é"
- "¡Ãлëͧ"
- "¡ÃмÅÕ¡ÃмÅÒÁ"
- "¡Ãмա"
- "¡ÃоÕé"
- "¡Ãо×Í"
- "¡ÃоØé§"
- "¡ÃпѴ¡ÃÐà¿Õ´"
- "¡ÃпÙÁ¡ÃпÒÂ"
- "¡ÃÐÁÍÁ¡ÃÐáÁÁ"
- "¡ÃÐÁѧ"
- "¡ÃÐÂÒ˧ѹ"
- "¡ÃÐÂÖ¡¡ÃÐÂ×Í"
- "¡ÃÐÂè͹"
- "¡ÃÐÃÍ¡"
- "¡ÃÐÅÍÁ"
- "¡ÃÐÅÑÁ¾Ã"
- "¡ÃÐÇÔ¹"
- "¡ÃÐÇÕ¡ÃÐÇÒ´"
- "¡ÃÐÉÑÂ"
- "¡ÃÐÉÒ»³ì"
- "¡ÃÐÊͺ"
- "¡ÃÐÊѧ"
- "¡ÃÐÊѹ"
- "¡ÃÐÊÒ"
- "¡ÃÐÊ×Í"
- "¡ÃÐÊØ§¡ÃÐÊÔ§"
- "¡ÃÐÊØ¹"
- "¡ÃÐ˹¡"
- "¡ÃÐ˹Һ"
- "¡ÃÐ˹èÓ"
- "¡ÃÐËÁÔº"
- "¡ÃÐËÁèÍÁ"
- "¡ÃÐËÂÔèÁ"
- "¡ÃÐËÒÂ"
- "¡ÃÐËÖÁ"
- "¡ÃÐËÖèÁ"
- "¡ÃÐÍͺ"
- "¡ÃÐÍÑ¡"
- "¡ÃÐÍÑ¡¡ÃÐÍèǹ"
- "¡ÃÐà§éÒ¡ÃЧʹ"
- "¡ÃÐà¨Ò"
- "¡ÃÐà¨Ô§"
- "¡ÃÐà¨Ô´¡ÃÐà¨Ô§"
- "¡ÃÐà¨Õêº"
- "¡ÃÐàªéÒ"
- "¡ÃÐà«Í"
- "¡ÃÐà«Ô§"
- "¡ÃÐà«ç¹"
- "¡ÃÐà«éÒ"
- "¡ÃÐà´Ô´"
- "¡ÃÐà´Õ´"
- "¡ÃÐà´×Í¡"
- "¡ÃÐà´×èͧ"
- "¡ÃÐà´ç¹"
- "¡ÃÐà´éÒ"
- "¡ÃÐ൧"
- "¡ÃÐàµÒÐ"
- "¡ÃÐàµ×éͧ"
- "¡ÃÐàµç¹"
- "¡ÃÐà¶Ôº"
- "¡ÃÐà·ÕÂÁ"
- "¡ÃÐà·×͹"
- "¡ÃÐູ"
- "¡ÃÐàºÕ´"
- "¡ÃÐàº×éͧ"
- "¡ÃÐà»ÒÐ"
- "¡ÃÐà»ëÒ"
- "¡ÃÐà¾ÒÐ"
- "¡ÃÐà¾×èÍÁ"
- "¡ÃÐàÂéÍ¡ÃÐáËÂè§"
- "¡ÃÐàÃÕ¹"
- "¡ÃÐàÊÕ¹"
- "¡ÃÐàÊÕÂÃ"
- "¡ÃÐàÊ繡ÃÐÊÒÂ"
- "¡ÃÐàÊèÒ"
- "¡ÃÐàËÁç´¡ÃÐáËÁè"
- "¡ÃÐá¨Ð"
- "¡ÃÐá«Ð"
- "¡ÃÐá´Ð"
- "¡ÃÐá´èÇ"
- "¡ÃÐáµ"
- "¡ÃÐá·¡"
- "¡ÃÐáÊ"
- "¡ÃÐáÍÁ"
- "¡ÃÐ⨹"
- "¡ÃÐâ¨Á"
- "¡ÃÐâ©¡¡ÃÐà©¡"
- "¡ÃÐâ´¡"
- "¡ÃÐâ´¡¡ÃÐà´¡"
- "¡ÃÐâ´§"
- "¡ÃÐâ´´"
- "¡ÃÐâ¶¹"
- "¡ÃÐâºÁ"
- "¡ÃÐâ»Ã§"
- "¡ÃÐâËé"
- "¡ÃÑ¡"
- "¡Ãѧ"
- "¡Ãѹ"
- "¡ÃѺ"
- "¡ÃÑÁ"
- "¡ÃÒ¡"
- "¡ÃÒ§"
- "¡ÃÒ´"
- "¡ÃÒ¹"
- "¡ÃÒº"
- "¡ÃÒ¿"
- "¡ÃÒ¿¿Ô¡"
- "¡ÃÒ¿Ô¡"
- "¡ÃÒÁ"
- "¡ÃÒÂ"
- "¡ÃÒÇ"
- "¡ÃÓ"
- "¡ÃÔ¡"
- "¡ÃÔ§¡ÃÔÇ"
- "¡ÃÔª"
- "¡ÃÔº"
- "¡ÃÔÁ"
- "¡ÃÔÂÒ"
- "¡ÃÔÇ"
- "¡ÃÔè§"
- "¡ÃÔèÁ"
- "¡ÃÔéÇ"
- "¡ÃÔê¡"
- "¡ÃÔê§"
- "¡ÃÕ"
- "¡ÃÕ¡"
- "¡ÃÕ±Ò"
- "¡ÃÕ´"
- "¡ÃÕ¸Ò"
- "¡ÃÕê´"
- "¡ÃØ"
- "¡ÃØ¡"
- "¡Ãا"
- "¡Ãا෾"
- "¡ÃسÒ"
- "¡ÃسҸԤس"
- "¡Ãع"
- "¡Ãغ"
- "¡ÃØÂ"
- "¡ÃØè¹"
- "¡ÃØèÁ"
- "¡ÃØéÁ¡ÃÔèÁ"
- "¡ÃØê»"
- "¡ÃÙ"
- "¡ÃÙ´"
- "¡ÃçÍ¡¡ÃëÍÂ"
- "¡Ãè͹"
- "¡ÃèÍÂ"
- "¡ÃèÒ§"
- "¡ÃèÒÂ"
- "¡ÃèÓ"
- "¡ÃéÇÁ"
- "¡ÃéÍ"
- "¡ÃéÒ¹"
- "¡ÃéÒÇ"
- "¡ÄɮաÒ"
- "¡ÄɳÒ"
- "¡Å"
- "¡Å´"
- "¡Åº"
- "¡ÅÁ"
- "¡ÅÂØ·¸ì"
- "¡Åǧ"
- "¡ÅÍ¡"
- "¡Åͧ"
- "¡Å͹"
- "¡ÅÍÂ"
- "¡ÅÑ¡"
- "¡ÅÑ´"
- "¡ÅѺ"
- "¡ÅÑÇ"
- "¡ÅÑè¹"
- "¡ÅÑé¹"
- "¡ÅÑéÇ"
- "¡ÅÒ¡"
- "¡ÅÒ§"
- "¡ÅÒ´"
- "¡ÅÒÂ"
- "¡ÅÒâËÁ"
- "¡ÅÔè§"
- "¡ÅÔè¹"
- "¡ÅÔé§"
- "¡ÅÔéÁ"
- "¡ÅÕ"
- "¡ÅÕº"
- "¡ÅÕè"
- "¡ÅÖ§"
- "¡Å×¹"
- "¡ÅØèÁ"
- "¡ÅØéÁ"
- "¡ÅÙâ¤Ê"
- "¡ÅàÁç´"
- "¡Åè¹"
- "¡Åèͧ"
- "¡Åè͹"
- "¡ÅèÍÁ"
- "¡ÅèÒÇ"
- "¡ÅèÓ"
- "¡ÅéÇÂ"
- "¡ÅéÇÂäÁé"
- "¡ÅéÍ"
- "¡Åéͧ"
- "¡Åé͹"
- "¡ÅéÍÁá¡ÅéÁ"
- "¡ÅéÒ"
- "¡ÅéÒÁ"
- "¡ÅéÓ"
- "¡Ç´"
- "¡Ç¹"
- "¡ÇÁ"
- "¡ÇÂ"
- "¡Ç¨Ñêº"
- "¡Ç¨Õê"
- "¡ÇÑ¡"
- "¡ÇÑ´"
- "¡ÇÒ§"
- "¡ÇÒ§µØé§"
- "¡ÇÒ´"
- "¡ÇÒÇà¤Ã×Í"
- "¡ÇÕ"
- "¡ÇèÒ"
- "¡ÇéÒ§"
- "¡ÇéÒ¹"
- "¡ÇêÒ¹"
- "¡ÉѵÃÔÂì"
- "¡ÉÑÂ"
- "¡ÉÒ»³ì"
- "¡ÊÔ"
- "¡ÊÔ¡Ã"
- "¡ÊÔ¡ÃÃÁ"
- "¡ÊÔ³"
- "¡Í"
- "¡Í¡"
- "¡Í§"
- "¡Í«"
- "¡Í´"
- "¡Íº"
- "¡Í»Ã"
- "¡ÍÂ"
- "¡ÍÃÔÅÅÒ"
- "¡ÍÅì¿"
- "¡ÍàÍÕêÂÐ"
- "¡Ð"
- "¡ÐªÖ衡ЪÑè¡"
- "¡Ð«Ç¡"
- "¡Ð´Õè"
- "¡ÐµéÓ"
- "¡ÐµêÒ¡"
- "¡Ð·¡Ã¡"
- "¡Ð·Ñ´ÃÑ´"
- "¡Ð·Ñ¹Ëѹ"
- "¡Ð·Ô"
- "¡Ð·×Í"
- "¡ÐºÑ§ÅÁ"
- "¡ÐºÔé§"
- "¡Ð»ÃÔ´¡Ð»ÃÍÂ"
- "¡Ð»Ç¡¡Ðà»Õ¡"
- "¡Ð»Ð"
- "¡Ð»Ô"
- "¡Ð¾§"
- "¡Ð¾ÃÔº"
- "¡Ð¾Åèͧ¡Ðá¾Åè§"
- "¡Ð¾éÍ"
- "¡ÐÃѵ"
- "¡ÐÃØè§¡ÐÃÔè§"
- "¡ÐÅÇÂ"
- "¡ÐÅÍ"
- "¡ÐÅлѧËÒ"
- "¡ÐÅÐÁѧ"
- "¡ÐÅÐáÁ"
- "¡ÐÅÒ"
- "¡ÐÅÒÊÕ"
- "¡ÐÅÔéÁ¡ÐàËÅÕèÂ"
- "¡ÐÅè͹"
- "¡ÐÅèÍÁ¡ÐáÅèÁ"
- "¡ÐÅèÍ¡ÐËÅÔº"
- "¡ÐÊéÒËÍÂ"
- "¡Ð˹ا¡Ð˹ԧ"
- "¡Ð˹çͧ¡Ðá˹ç§"
- "¡ÐËÃÍ´"
- "¡ÐËÃÕè"
- "¡ÐËÃçÍÁ¡ÐáËÃçÁ"
- "¡ÐËÃèͧ"
- "¡ÐËÅÕè"
- "¡ÐËÅØ¡¡ÐËÅÔ¡"
- "¡ÐËÅèÓ"
- "¡Ðà´¡"
- "¡Ð൧"
- "¡Ðà·Â"
- "¡Ðà·ÒÐ"
- "¡Ðà»Ô꺡лêÒº"
- "¡Ðà¼Å¡"
- "¡ÐàÃÕè¡ÐÃÒ´"
- "¡ÐàÅÔ´"
- "¡ÐàÅèÍ¡ÐÅèÒ"
- "¡ÐàËÃÕè§"
- "¡ÐàËÅÒÐà»ÒÐ"
- "¡Ðáªè"
- "¡Ðâµ§¡Ð൧"
- "¡Ðâµé§âËè§"
- "¡Ðâµê¡"
- "¡Ðâ»Ã§"
- "¡Ðâ»âÅ"
- "¡Ðâ¼Å¡¡Ðà¼Å¡"
- "¡ÐâËÅ¡"
- "¡Ñ¡"
- "¡Ñ¡¢ÌÐ"
- "¡Ñ§"
- "¡Ñ§¡éÒ"
- "¡Ñ§¢Ò"
- "¡Ñ§©Ô¹"
- "¡Ñ§¿Ù"
- "¡Ñ§ÇÅ"
- "¡Ñ§ÇÒ¹"
- "¡Ñ§Ê´ÒÅ"
- "¡Ñ§Ëѹ"
- "¡Ñ§äÊ"
- "¡Ñ­ªÒ"
- "¡Ñ­­Ò"
- "¡Ñ³±ì"
- "¡Ñ´"
- "¡Ñ¹"
- "¡Ñ¹´ÒÃ"
- "¡Ñ¹µì"
- "¡Ñ¹ÂÒ¹"
- "¡Ñ¹Âì"
- "¡Ñº"
- "¡Ñ»"
- "¡Ñ»µÑ¹"
- "¡ÑÁ»¹Ò·"
- "¡ÑÁ»ÃÐâ´"
- "¡ÑÁ¾ÙªÒ"
- "¡ÑÁÁѹµÀÒ¾ÃѧÊÕ"
- "¡ÑÁÁѹµÃѧÊÕ"
- "¡Ñź¡"
- "¡ÑÅ»¾Ä¡Éì"
- "¡ÑŻѧËÒ"
- "¡ÑÅ»ÒÇÊÒ¹"
- "¡ÑÅ»ì"
- "¡ÑÅÂÒ"
- "¡ÑÅÂÒ³"
- "¡ÑÅÂÒ³ÁÔµÃ"
- "¡ÑÅÂÒ³Õ"
- "¡ÑÅâª"
- "¡Ñè¹"
- "¡Ñé§"
- "¡Ñé¹"
- "¡Ñé¹ËÂÑè¹"
- "¡Ñê¡"
- "¡Ò"
- "¡Ò¡"
- "¡Ò¡Õ"
- "¡Ò§"
- "¡Ò§à¡§"
- "¡Ò§à¢¹"
- "¡Ò«ÐÅͧ"
- "¡Ò­¨¹ºØÃÕ"
- "¡Ò­¨¹Ò"
- "¡Ò´"
- "¡Ò¹"
- "¡Ò¹´Ò"
- "¡Ò¹¾ÅÙ"
- "¡Òº"
- "¡Ò½Ò¡"
- "¡Ò¾Âì"
- "¡ÒÁ"
- "¡ÒÁÒÃÁ³ì"
- "¡ÒÂ"
- "¡Ò¡ÃÃÁ"
- "¡ÒÂÀÒ¾"
- "¡ÒÂÇÔÀÒ¤"
- "¡ÒÂÊÔ·¸Ôì"
- "¡ÒÂҾ¾"
- "¡ÒÃ"
- "¡Òóì"
- "¡ÒúÙÃ"
- "¡ÒÃÐà¡´"
- "¡ÒÃѳÂì"
- "¡ÒÃѹµì"
- "¡ÒÃØ­"
- "¡ÒÃØ³Âì"
- "¡ÒÃàÇ¡"
- "¡ÒÃì"
- "¡ÒÃì´"
- "¡ÒÃìµÙ¹"
- "¡ÒÅ"
- "¡ÒšԳÕ"
- "¡ÒÅÕ"
- "¡ÒÅà·ÈÐ"
- "¡ÒÇ"
- "¡ÒÈ"
- "¡ÒÊ"
- "¡ÒÊÃ"
- "¡ÒÊÔâ¹"
- "¡ÒËŧ"
- "¡ÒÌ"
- "¡ÒàËÇèÒ"
- "¡Òá¿"
- "¡ÒáÅç¡«Õ"
- "¡Ó"
- "¡Ó¡ÇÁ"
- "¡Ó¡Ñ´"
- "¡Ó¡Ñº"
- "¡Ó¨Ã"
- "¡Ó¨Ñ´"
- "¡Ó¨ÒÂ"
- "¡ÓªÑº"
- "¡Ó«Òº"
- "¡Ó´Ñ´"
- "¡Ó¸Ã"
- "¡Ó¹Ñ¹"
- "¡Ó¹ÑÅ"
- "¡ÓºÑ§"
- "¡Ó»Ñè¹"
- "¡Ó¾ÃéÒ"
- "¡Ó¾×´"
- "¡ÓÁжѹ"
- "¡ÓÁÐÅÍ"
- "¡ÓÁÐËÂÕè"
- "¡ÓÂÒ¹"
- "¡ÓÂÓ"
- "¡ÓÃÒº"
- "¡ÓÅѧ"
- "¡ÓÊÃÇÅ"
- "¡Ó˹´"
- "¡Ó˹Ѵ"
- "¡Óà´Ò"
- "¡Óà¹Ô´"
- "¡ÓàÃÔº"
- "¡Óà˹ç¨"
- "¡Óá¾§"
- "¡Óá˧"
- "¡ÓäÃ"
- "¡ÓäÅ"
- "¡Ô¡"
- "¡Ô¡Ð"
- "¡Ô¨"
- "¡Ô¨¡ÃÃÁ"
- "¡Ô¨¡ÒÃ"
- "¡Ô¨¨ÐÅѡɳÐ"
- "¡Ô¨¨Ò"
- "¡ÔµµÔ"
- "¡ÔµµÔ¤Ø³"
- "¡ÔµµÔÁÈÑ¡´Ôì"
- "¡ÔµµÔÈѾ·ì"
- "¡Ô¹"
- "¡Ô¹¹Ã"
- "¡Ô¹ÃÕ"
- "¡ÔÃÔ³Õ"
- "¡ÔÃÔÂÒ"
- "¡ÔàŹ"
- "¡ÔàÅÊ"
- "¡ÔâÁâ¹"
- "¡Ôâµչ"
- "¡ÔâÅ"
- "¡ÔâÅ¡ÃÑÁ"
- "¡ÔâÅÅÔµÃ"
- "¡ÔâÅàÁµÃ"
- "¡ÔâÅàÎÔõ«ì"
- "¡Ôè§"
- "¡ÔèÇ"
- "¡Ôé§¡×Í"
- "¡Ôé§¡èÒ"
- "¡Ôê¡"
- "¡Ôêº"
- "¡ÔëÇ"
- "¡Õ¯ÇÔ·ÂÒ"
- "¡Õ´"
- "¡ÕµÒÃì"
- "¡Õº"
- "¡ÕÌÒ"
- "¡Õè"
- "¡Õé"
- "¡Õë"
- "¡Ö¡"
- "¡Ö¡¡éͧ"
- "¡Öè§"
- "¡Öë¹"
- "¡Ø"
- "¡Ø¡"
- "¡Ø¡¡Ñ¡"
- "¡Ø­ªÃ"
- "¡Ø­á¨"
- "¡Ø®ØÁ¾Õ"
- "¡Ø¯°Ñ§"
- "¡Ø¯Ô"
- "¡Ø³±Å"
- "¡Ø´"
- "¡Ø´Ñ§"
- "¡Ø´Ñè¹"
- "¡Ø¹"
- "¡Ø¹«×Í"
- "¡Ø¹àªÕ§"
- "¡Øº"
- "¡ØÁ"
- "¡ØÁÀÒ"
- "¡ØÁÀì"
- "¡ØÁÒÃ"
- "¡ØÁÒÃÒ"
- "¡ØÁÒÃÕ"
- "¡ØÂ"
- "¡ØÂªèÒÂ"
- "¡ØÂàΧ"
- "¡ØÅ"
- "¡ØÅ¸Ô´Ò"
- "¡ØÅºØµÃ"
- "¡ØÅʵÃÕ"
- "¡ØÅÒ"
- "¡ØÅÕ"
- "¡ØÅաبÍ"
- "¡ØÈÅ"
- "¡ØÈâźÒÂ"
- "¡ØËÅÒº"
- "¡ØèÁ"
- "¡Øé§"
- "¡Øê¡"
- "¡Øê¹"
- "¡ØêÂ"
- "¡ØëÂ"
- "¡Ù"
- "¡Ù³±ì"
- "¡Ù´"
- "¡Ùº"
- "¡Ùè"
- "¡Ùé"
- "¡àÌÇÃÒ¡"
- "¡ç"
- "¡è§"
- "¡è¹"
- "¡èÍ"
- "¡èͧ"
- "¡è͹"
- "¡èÒÂ"
- "¡èÓ"
- "¡é§â¤é§"
- "¡é¹"
- "¡éÁ"
- "¡éÍ"
- "¡éͧ"
- "¡é͹"
- "¡éÍÁ"
- "¡éÍÂ"
- "¡éÍÃèÍ¡é͵ԡ"
- "¡éÒ§"
- "¡éÒ¹"
- "¡éÒÁ"
- "¡éÒÇ"
- "¡éÓ"
- "¡éÓ¡Öè§"
- "¡éÓà¡Ô¹"
- "¡ê¡"
- "¡ê§"
- "¡êÍ¡"
- "¡êͺ»Õé"
- "¡êÍ»»Õé"
- "¡êÒ«"
- "¡êÒ´"
- "¡ë§"
- "¡ëÇÂàµÕëÂÇ"
- "¡ëÍÂ"
- "¡ëÒ"
- "¢§¨×êÍ"
- "¢¨Ã"
- "¢¨Ñ´"
- "¢¨ÒÂ"
- "¢¨Õ"
- "¢¨ØÂ"
- "¢³Ð"
- "¢´"
- "¢¹"
- "¢¹§"
- "¢¹´"
- "¢¹¹"
- "¢¹º"
- "¢¹Á"
- "¢¹Áͺ"
- "¢¹Ñ´"
- "¢¹Ñ¹"
- "¢¹Ò¡"
- "¢¹Ò§"
- "¢¹Ò´"
- "¢¹Ò¹"
- "¢¹Òº"
- "¢¹ÒÂ"
- "¢¹ÔɰÒ"
- "¢¹Ø¹"
- "¢º"
- "¢º¶"
- "¢ºÇ¹"
- "¢Á"
- "¢ÁÇ´"
- "¢Áͧ"
- "¢ÁÍÂ"
- "¢Áѧ"
- "¢ÁѺ"
- "¢ÁÒ"
- "¢ÁÔº"
- "¢ÁÔé¹"
- "¢ÁÕ¢Áѹ"
- "¢ÁÖ§"
- "¢ÁØ¡¢ÁÍÁ"
- "¢ÁØ¡¢ÁÑÇ"
- "¢Áغ"
- "¢Áغ¢ÁÔº"
- "¢ÁèÍÁ"
- "¢ÁéÓ"
- "¢ÂÍ¡"
- "¢Âͧ"
- "¢ÂÐ"
- "¢ÂÑ¡"
- "¢Âѹ"
- "¢ÂѺ"
- "¢ÂÑé¹"
- "¢ÂÒ´"
- "¢ÂÒº"
- "¢ÂÒÂ"
- "¢ÂÓ"
- "¢ÂÔ¡"
- "¢ÂÔº"
- "¢ÂÔèÁ"
- "¢ÂÕé"
- "¢ÂØ¡¢ÂÔ¡"
- "¢ÂØ¡¢ÂØÂ"
- "¢Âغ"
- "¢Âغ¢ÂÔº"
- "¢ÂØÁ"
- "¢ÂØÂ"
- "¢ÂØéÁ"
- "¢ÂèÁ"
- "¢Âè͹"
- "¢Âé͹"
- "¢ÂéÓ"
- "¢ÃÁ"
- "¢Ãäì"
- "¢ÃÑÇ"
- "¢ÃÔº"
- "¢ÃÖÁ"
- "¢ÃØ¢ÃÐ"
- "¢Åѧ"
- "¢ÅѺ"
- "¢ÅÒ"
- "¢ÅÒ´"
- "¢ÅÔº"
- "¢ÅØ¡"
- "¢ÅØ¡¢ÅÑ¡"
- "¢ÅØ¡¢ÅÔ¡"
- "¢Åغ"
- "¢ÅØÁ"
- "¢ÅØèÂ"
- "¢Ç§"
- "¢Ç´"
- "¢Ç¹¢ÇÒÂ"
- "¢Çº"
- "¢ÇÂ"
- "¢ÇÑ¡ä¢Çè"
- "¢ÇÑ­"
- "¢ÇÑ´"
- "¢ÇѺ"
- "¢ÇѺà¢ÇÕÂÇ"
- "¢ÇÑé¹"
- "¢ÇÒ"
- "¢ÇÒ¡"
- "¢ÇÒ§"
- "¢ÇÒ´"
- "¢ÇÒ¹"
- "¢ÇÒ¢ǹ"
- "¢ÇÔ´"
- "¢ÇéÒ§"
- "¢Í"
- "¢Í¡"
- "¢Í§"
- "¢Í´"
- "¢Í¹"
- "¢Íº"
- "¢Íº¤Ø³"
- "¢Íºã¨"
- "¢ÍÁ"
- "¢ÐÁÍÁ¢ÐáÁÁ"
- "¢ÐÁÑ¡à¢Áé¹"
- "¢ÐÁØ¡¢ÐÁÍÁ"
- "¢ÐÂÔ¡"
- "¢ÐÂØ¡"
- "¢ÐàÂéÍá¢Âè§"
- "¢ÐáÂÐ"
- "¢Ñ§"
- "¢Ñ³±Ê¡Ã"
- "¢Ñ³±ÊÕÁÒ"
- "¢Ñ´"
- "¢ÑµµÔÂÁÒ¹Ð"
- "¢Ñ¹"
- "¢Ñ¹ªÐà¹ÒÐ"
- "¢Ñ¹µÔ"
- "¢Ñ¹·Õ"
- "¢Ñ¹¸ì"
- "¢Ñ¹ËÁÒ¡"
- "¢Ñ¹âµ¡"
- "¢Ñº"
- "¢ÑÂ"
- "¢Ñé¹"
- "¢ÑéÇ"
- "¢Ò"
- "¢Ò¡"
- "¢Ò¡êÇÂ"
- "¢Ò§"
- "¢Ò´"
- "¢Ò¹"
- "¢Òº"
- "¢ÒÁ"
- "¢ÒÂ"
- "¢ÒÅ"
- "¢ÒÇ"
- "¢Ó"
- "¢Ô¡"
- "¢Ô§"
- "¢ÔÁ"
- "¢Ôè§"
- "¢Õ´"
- "¢Õ»¹ÒÇØ¸"
- "¢Õè"
- "¢Õé"
- "¢ÕéàËÃè"
- "¢Ö§"
- "¢Öé§"
- "¢Öé¹"
- "¢Ö鹩èÒÂ"
- "¢×¹"
- "¢×è¹"
- "¢×èÍ"
- "¢Ø¡"
- "¢Ø´"
- "¢Ø¹"
- "¢Ø¹·Í§"
- "¢Ø¹á¼¹"
- "¢ØÁ"
- "¢ØÂ"
- "¢Øè¹"
- "¢Ù´"
- "¢Ùè"
- "¢âÁÂ"
- "¢èÁ"
- "¢èǹ"
- "¢èÍ"
- "¢è͹"
- "¢èÍÂ"
- "¢èÒ"
- "¢èÒ§"
- "¢èÒÂ"
- "¢èÒÇ"
- "¢èÒÇÊÒÃ"
- "¢é¹"
- "¢éÍ"
- "¢éͧ"
- "¢é͹"
- "¢éÍÁÙÅ"
- "¢éÍÂ"
- "¢éÒ"
- "¢éÒ§"
- "¢éÒ¾à¨éÒ"
- "¢éÒÁ"
- "¢éÒÇ"
- "¢éÒÇÊÒÃ"
- "¢éÒÇàÁèÒ"
- "¢éÒÇâ¾´"
- "¢éÒÈÖ¡"
- "¢éÒËÅǧ"
- "¤¤¹ÑÁ¾Ã"
- "¤¤¹Ò§¤ì"
- "¤¤¹Ò¹µì"
- "¤§"
- "¤§¤Ò"
- "¤ªÃÒª"
- "¤ªÊÒÃ"
- "¤ªÒªÒµÔ"
- "¤ªÒªÕ¾"
- "¤ªÒ¸ÒÃ"
- "¤ªÒÀóì"
- "¤³¹Ò"
- "¤³º´Õ"
- "¤³Ð"
- "¤³Ò¨ÒÃÂì"
- "¤³Ò¸Ô¡ÒÃ"
- "¤³Ò¸Ô»äµÂ"
- "¤³Ò¹Ñº"
- "¤³Ô¡Ò"
- "¤³Ôµ"
- "¤³ÔµÈÒʵÃì"
- "¤´"
- "¤´Õ"
- "¤µÔ"
- "¤µÔ¸ÃÃÁ"
- "¤µÔ¾¨¹ì"
- "¤·Ò"
- "¤¹"
- "¤¹¸Ãþì"
- "¤¹â·"
- "¤º"
- "¤Á"
- "¤Á¹Ò¡ÒÃ"
- "¤Á¹Ò¤Á"
- "¤Ã¡"
- "¤Ãº"
- "¤ÃêԵ"
- "¤ÃÃÀ"
- "¤ÃÃÀì"
- "¤ÃÃÅͧ"
- "¤ÃÃâŧ"
- "¤ÃÃäÅ"
- "¤ÃÇ­"
- "¤ÃÇÑ¡"
- "¤ÃÇÕ"
- "¤ÃËÒ"
- "¤ÃÍ¡"
- "¤Ãͧ"
- "¤Ãͧá¤Ã§"
- "¤Ãͺ"
- "¤Ãͺ¤ÃÑÇ"
- "¤ÃÐ"
- "¤ÃÑ´à¤Ãè§"
- "¤Ãѹ"
- "¤ÃѺ"
- "¤ÃÑÇ"
- "¤ÃÑè§"
- "¤ÃÑè¹"
- "¤ÃÑé§"
- "¤ÃÑé¹"
- "¤ÃÒ"
- "¤ÃÒ¡"
- "¤ÃÒ§"
- "¤ÃÒ­"
- "¤ÃÒ´"
- "¤ÃÒº"
- "¤ÃÒÁ"
- "¤ÃÒÇ"
- "¤ÃÒÊ"
- "¤ÃÓ"
- "¤ÃÔʵ¡ÒÅ"
- "¤ÃÔʵѧ"
- "¤ÃÔʵì"
- "¤ÃÔʵìÁÒÊ"
- "¤ÃÔÊàµÕ¹"
- "¤ÃÕº"
- "¤ÃÕÁ"
- "¤ÃÖ"
- "¤ÃÖ¡¤Ã×é¹"
- "¤ÃÖ¡â¤ÃÁ"
- "¤ÃÖ¹"
- "¤ÃÖÁ"
- "¤ÃÖè§"
- "¤ÃÖéÁ"
- "¤Ã×´"
- "¤Ã×¹"
- "¤Ã×Í"
- "¤Ã×é¹"
- "¤Ã×鹤ÃÖ¡"
- "¤ÃØ"
- "¤Ãر"
- "¤ÃØÁà¤Ã×Í"
- "¤ÃØÂ"
- "¤ÃØè¹"
- "¤ÃÙ"
- "¤ÃÙ´"
- "¤ÃÙè"
- "¤Ãè§"
- "¤ÃèÍÁ"
- "¤ÃèÒ"
- "¤ÃèÒÇ"
- "¤ÃèÓ"
- "¤ÃéÒ¹"
- "¤ÃéÒÁ"
- "¤ÄË"
- "¤ÄËÑʶì"
- "¤ÄËÒʹì"
- "¤ÅÍ"
- "¤ÅÍ¡"
- "¤Åͧ"
- "¤ÅÍ´"
- "¤Å͹"
- "¤ÅÍÃÕ¹"
- "¤ÅÍâÿÍÃìÁ"
- "¤ÅÍâÿÕÅÅì"
- "¤ÅÐ"
- "¤ÅÑ¡"
- "¤Åѧ"
- "¤Åѵªì"
- "¤ÅѺ"
- "¤ÅÑè¡"
- "¤ÅÑè§"
- "¤ÅÒ"
- "¤ÅÒ§á¤Å§"
- "¤ÅÒ´"
- "¤ÅÒ¹"
- "¤ÅÒÂ"
- "¤ÅÒÊ"
- "¤ÅÒÊÊÔ¤"
- "¤ÅÓ"
- "¤ÅÔ¹Ô¡"
- "¤ÅÔé¡"
- "¤ÅÕ"
- "¤ÅÕ¹Ô¤"
- "¤ÅÕè"
- "¤ÅÖ§"
- "¤Å×è¹"
- "¤Å×è¹àËÕ¹"
- "¤Å×è¹äÊé"
- "¤ÅØ¡"
- "¤ÅØÁ"
- "¤ÅØèÁ"
- "¤ÅØé§"
- "¤ÅØéÁ"
- "¤Åèͧ"
- "¤Åèͧá¤ÅèÇ"
- "¤ÅèÓ"
- "¤Åéͧ"
- "¤ÅéÍÂ"
- "¤ÅéÒÂ"
- "¤ÅéÓ"
- "¤Ç§"
- "¤Çº"
- "¤ÇÃ"
- "¤ÇÑ¡"
- "¤Çѹ"
- "¤ÇÑè¹"
- "¤ÇÒ¡"
- "¤ÇÒ­"
- "¤ÇÒ¹"
- "¤ÇÒÁ"
- "¤ÇÒÂ"
- "¤ÇÔ¹Ô¹"
- "¤ÇÕ¹"
- "¤ÇèÓ"
- "¤ÇéÒ"
- "¤ÇéÒ§"
- "¤ÇéÒ¹"
- "¤Ë¡ÃÃÁ"
- "¤Ë¡ÃÃÁÈÒʵÃì"
- "¤Ëº´Õ"
- "¤Ë»µÒ¹Õ"
- "¤Í"
- "¤Í¡"
- "¤Í´"
- "¤Í¹"
- "¤Í¹¡ÃÕµ"
- "¤Í¹¿Ô¡"
- "¤Í¹à´¹à«ÍÃì"
- "¤Í¹àÊÔÃìµ"
- "¤Í¹àÊÔÃì·"
- "¤Í¹áǹµì"
- "¤ÍÁ"
- "¤ÍÁ¾ÔÇàµÍÃì"
- "¤ÍÁÁÒ¹â´"
- "¤ÍÁÁÔǹÔʵì"
- "¤ÍÁᾤ"
- "¤ÍÁâ¾à¹¹·ì"
- "¤ÍÂ"
- "¤ÍÂÅì"
- "¤ÍÃÑ»ªÑè¹"
- "¤ÍÃì«Ô¡Ò"
- "¤ÍÃì´"
- "¤ÍÃì»ÍàêÑè¹"
- "¤ÍÅÑÁ¹ì"
- "¤ÍʵÒÃÔ¡Ò"
- "¤ÍफÍ´ì"
- "¤ÍàÅÊàµÍÃÍÅ"
- "¤Ð"
- "¤Ð¹Í§"
- "¤Ð¹Ö§"
- "¤Ð¹éÒ"
- "¤ÐÁÓ"
- "¤ÐÂÑ鹤ÐÂÍ"
- "¤Ðà¹"
- "¤ÐàÂÍ"
- "¤Ðá¹¹"
- "¤Ñ¡"
- "¤Ñ¤¹ÑÁ¾Ã"
- "¤Ñ¤¹Ò§¤ì"
- "¤Ñ¤¹Ò¹µì"
- "¤Ñ³±ÊÙµÃ"
- "¤Ñ´"
- "¤Ñ·ÅÕÂÒ"
- "¤Ñ¹"
- "¤Ñ¹©ÒÂ"
- "¤Ñ¹·Ã§"
- "¤Ñº"
- "¤ÑÁÀÕÃÀÒ¾"
- "¤ÑÁÀÕÃì"
- "¤Ñè¡"
- "¤Ñè§"
- "¤Ñè¹"
- "¤ÑèÇ"
- "¤Ñé¹"
- "¤Ò"
- "¤Ò§"
- "¤Ò§¤¡"
- "¤Ò´"
- "¤Ò¶Ò"
- "¤Ò·ÍÅÔ¡"
- "¤Ò¹"
- "¤Òº"
- "¤ÒÁ"
- "¤ÒÁÇÒÊÕ"
- "¤ÒÂ"
- "¤ÒÃÁ"
- "¤ÒÃÇÐ"
- "¤ÒÃÒÇÒ¹"
- "¤ÒÃÒàµé"
- "¤ÒÃÒâÍà¡Ð"
- "¤ÒÃì"
- "¤ÒÃìºÍ¹"
- "¤ÒÃìºÍ¹Á͹͡䫴ì"
- "¤ÒÃìºÍ¹ä´Í͡䫴ì"
- "¤ÒÃìºÍÅÔ¡"
- "¤ÒÃìºÍ๵"
- "¤ÒÃìºÙàÃàµÍÃì"
- "¤ÒÃìÅ"
- "¤ÒÃìâºäÎà´Ãµ"
- "¤ÒÇ"
- "¤ÒÇÕ"
- "¤Òà¸Âì"
- "¤Òà¿è"
- "¤Ó"
- "¤Ó¹Ç³"
- "¤Ó¹Ñº"
- "¤Ó¹Ö§"
- "¤Óù"
- "¤Óú"
- "¤ÓÃÒÁ"
- "¤Óá˧"
- "¤Óãµé"
- "¤Ô¡"
- "¤Ô§"
- "¤Ô´"
- "¤ÔÁËѹµì"
- "¤ÔÇ"
- "¤ÔéÇ"
- "¤Õµ"
- "¤Õ¹ÂÒ"
- "¤Õº"
- "¤ÕÁ"
- "¤ÕÂì"
- "¤ÕÂìºÍÃì´"
- "¤ÕÃÕ"
- "¤Õè"
- "¤Ö¡"
- "¤Ö¡¤Ñ¡"
- "¤Öè¡"
- "¤×¹"
- "¤×º"
- "¤×Í"
- "¤Ø"
- "¤Ø¡"
- "¤Ø¡¡Õé"
- "¤Ø³"
- "¤Ø³¸ÃÃÁ"
- "¤Ø³ÀÒ¾"
- "¤Ø³ÇزÔ"
- "¤Ø³ÈѾ·ì"
- "¤Ø³ÊÁºÑµÔ"
- "¤Ø³Ò¡Ã"
- "¤Ø³Ù»¡ÒÃ"
- "¤Ø´"
- "¤Ø´·ÐÃÒ´"
- "¤ØÁ"
- "¤ØÂ"
- "¤ØÃØ"
- "¤Øâ³»¡ÒÃ"
- "¤ØèÁ"
- "¤Øé§"
- "¤Øé¹"
- "¤ØéÁ"
- "¤ØéÂ"
- "¤Ù"
- "¤Ù³"
- "¤Ù¹"
- "¤Ù»Í§"
- "¤ÙËÒ"
- "¤Ùè"
- "¤Ùé"
- "¤à¹¨Ã"
- "¤çÍ¡à·Å"
- "¤è͹"
- "¤èÍÁ"
- "¤èÍÂ"
- "¤èÐ"
- "¤èÒ"
- "¤èÒ§"
- "¤èÒÂ"
- "¤èÓ"
- "¤é¹"
- "¤é͹"
- "¤éÍÁ"
- "¤éÒ"
- "¤éÒ§"
- "¤éÒ§¤ÒÇ"
- "¤éÒ§àµÔè§"
- "¤éÒ¹"
- "¤éÓ"
- "¦ÃÒÇÒÊ"
- "¦Òµ"
- "¦Òµ¡Ã"
- "¦Òµ¡ÃÃÁ"
- "¦èÒ"
- "¦éͧ"
- "§¡"
- "§§"
- "§§§ÇÂ"
- "§´"
- "§º"
- "§Á"
- "§Ç§"
- "§Ç´"
- "§Ç§§"
- "§Í"
- "§Í¡"
- "§Í¡á§¡"
- "§Í´"
- "§Í´á§´"
- "§Í¹"
- "§Í¹Ë§èÍ"
- "§Íº"
- "§ÍÁ"
- "§ÍÂ"
- "§Íá§"
- "§Ð"
- "§Ñ¡"
- "§Ñ´"
- "§Ñ¹"
- "§Ñº"
- "§ÑÇ"
- "§ÑÇà§ÕÂ"
- "§Ñè¡"
- "§Ñè§"
- "§ÑèÇ"
- "§Ò"
- "§Ò¹"
- "§Òº"
- "§ÒÁ"
- "§ÒÂ"
- "§Ó"
- "§ÔéÇ"
- "§Õº"
- "§Ö¡"
- "§ÖÁ"
- "§ÖÁ§Ó"
- "§Ø´"
- "§Ø¹§§"
- "§Øº"
- "§Øº§Ôº"
- "§ØÂ"
- "§Øè¹§èÒ¹"
- "§ØèÁ§èÒÁ"
- "§ØéÁ"
- "§Ù"
- "§ÙÊÇÑ´"
- "§èǧ"
- "§èǹ"
- "§èͧ"
- "§è͹"
- "§èÍÂ"
- "§èÒ"
- "§èÒ¹"
- "§èÒÁ"
- "§èÒÂ"
- "§èÓ"
- "§éǹ"
- "§éÍ"
- "§éÍÁ"
- "§éÒ§"
- "§éÒÇ"
- "§éÓ"
- "¨¡"
- "¨§"
- "¨§¡Å¹Õ"
- "¨§ÍÒ§"
- "¨´"
- "¨µØ"
- "¨µØÃ§¤ì"
- "¨µØÃ¾Ô¸"
- "¨µØÊ´ÁÀì"
- "¨¹"
- "¨º"
- "¨Á"
- "¨ÁÙ¡"
- "¨Ã"
- "¨Ã¨Ñ´"
- "¨Ã´"
- "¨ÃÃÂÒ"
- "¨ÃÃâŧ"
- "¨ÃÅÕ"
- "¨ÃÇ´"
- "¨ÃÐà¢é"
- "¨ÃÑÅ"
- "¨ÃÑÊ"
- "¨ÃÒ¨Ã"
- "¨ÃÔ§"
- "¨ÃÔµ"
- "¨ÃÔ¸ÃÃÁ"
- "¨ÃÔÂÈÒʵÃì"
- "¨ÃÔÂÈÖ¡ÉÒ"
- "¨ÃÔÂÒ"
- "¨Ãا"
- "¨ÃÙ­"
- "¨Å"
- "¨Å¹¾ÅÈÒʵÃì"
- "¨Å¹ÈÒʵÃì"
- "¨ÅÒ¨Å"
- "¨Ç¡"
- "¨Ç§"
- "¨Ç¹"
- "¨Çº"
- "¨ÇÑ¡"
- "¨Í"
- "¨Í¡"
- "¨Í§"
- "¨Í§Ëͧ"
- "¨Í´"
- "¨Í¹"
- "¨Íº"
- "¨ÍÁ"
- "¨ÍÃìá´¹"
- "¨Íá¨"
- "¨Ð"
- "¨Ð¡ÅÐ"
- "¨Ð¡ÅÒÁ"
- "¨ÐÅÐËÇÑè¹"
- "¨ÐÅÐàÁç´"
- "¨Ðà¢é"
- "¨Ñ¡"
- "¨Ñ¡¢Ø"
- "¨Ñ¡¨Ñè¹"
- "¨Ñ¡Ã"
- "¨Ñ¡Ã¾ÃôÔ"
- "¨Ñ¡ÃÀ¾"
- "¨Ñ¡ÃÂÒ¹"
- "¨Ñ¡ÃÇÃôÔ"
- "¨Ñ¡ÃÇÒÅ"
- "¨Ñ¡ÃÕ"
- "¨Ñ¡ÉØ"
- "¨Ñ¡áËÅè¹"
- "¨Ñ§"
- "¨Ñ§¡Íº"
- "¨Ñ§¡éÒ"
- "¨Ñ§§Ñ§"
- "¨Ñ§ËÇÐ"
- "¨Ñ§ËÇÑ´"
- "¨Ñ§Ëѹ"
- "¨Ñ§äÃ"
- "¨Ñ­äÃ"
- "¨Ñ³±ÒÅ"
- "¨Ñ³±ì"
- "¨Ñ´"
- "¨Ñ´¡ÒÃ"
- "¨ÑµÇÒ"
- "¨ÑµØÃÑÊ"
- "¨Ñ¹"
- "¨Ñ¹·¹ì"
- "¨Ñ¹·ºØÃÕ"
- "¨Ñ¹·Ã"
- "¨Ñ¹·Ã¤µÔ"
- "¨Ñ¹·Ã¤ÃÒÊ"
- "¨Ñ¹·ÃØ»ÃÒ¤Ò"
- "¨Ñ¹·Ãì"
- "¨Ñº"
- "¨Ñº¡Ñ§"
- "¨Ñº©èÒÂ"
- "¨Ñè¹"
- "¨ÑèÇ"
- "¨Ñé¡"
- "¨ÑꡨÕé"
- "¨Ñê¡à´ÕÂÁ"
- "¨ÑêÇÐ"
- "¨Ò¡"
- "¨Ò§"
- "¨Ò´"
- "¨ÒµØÃ§¤Êѹ¹ÔºÒµ"
- "¨Ò¹"
- "¨Òº"
- "¨ÒºÑÅ"
- "¨ÒºÑÅÂì"
- "¨ÒÁ"
- "¨ÒÁ¨ØÃÕ"
- "¨ÒÁÃ"
- "¨ÒÁÃÕ"
- "¨ÒÃ"
- "¨ÒÃкÕ"
- "¨ÒÃÐä¹"
- "¨ÒÃÔ¡"
- "¨ÒÃÕ"
- "¨ÒÃÕµ"
- "¨ÒÃÖ¡"
- "¨ÒÇ"
- "¨ÒÇÒ"
- "¨ÒàÁ¡Ò"
- "¨Ó"
- "¨Ó¡Ñ´"
- "¨Ó¹§"
- "¨Ó¹¹"
- "¨Ó¹ÃèÒ"
- "¨Ó¹Ãèì"
- "¨Ó¹Ç¹"
- "¨Ó¹Í§"
- "¨Ó¹Ó"
- "¨Ó»Ò"
- "¨Ó»Õ"
- "¨Ó¾Ç¡"
- "¨ÓÃÑÊ"
- "¨ÓÃÙ­"
- "¨ÓÅͧ"
- "¨Ó˹èÒÂ"
- "¨ÓÍÇ´"
- "¨Óà¾ÒÐ"
- "¨ÓàÃÔ­"
- "¨ÓàÃÕ§"
- "¨ÓàÅÂ"
- "¨Óṡ"
- "¨Ô¡"
- "¨Ô§â¨é"
- "¨Ôµ"
- "¨ÔµÃ"
- "¨ÔµÃ¡Ã"
- "¨ÔµÃ¡ÃÃÁ"
- "¨ÔµÃÅ´Ò"
- "¨ÔµÇÔ·ÂÒ"
- "¨ÔµàǪ"
- "¨Ôµá¾·Âì"
- "¨Ô¹´Ò"
- "¨Ô¹µ¡ÇÕ"
- "¨Ô¹µ¹Ò"
- "¨Ô¹µ¹Ò¡ÒÃ"
- "¨Ô¹µÀÒ¾"
- "¨Ôº"
- "¨Ô»Ò¶Ð"
- "¨ÔèÁ"
- "¨Ô駨¡"
- "¨Ô駨͡"
- "¨Ôé§ËÃÕ´"
- "¨Ôé§àËŹ"
- "¨ÔéÁ"
- "¨ÔëÇ"
- "¨Õ¹"
- "¨Õ¹áÊ"
- "¨Õº"
- "¨ÕÇÃ"
- "¨Õè"
- "¨Õé"
- "¨Õê"
- "¨Õê´"
- "¨Õë"
- "¨Ö§"
- "¨Öè§"
- "¨Öé§"
- "¨×´"
- "¨Ø"
- "¨Ø¡"
- "¨Ø´"
- "¨ØµÔ"
- "¨Ø¹"
- "¨Øº"
- "¨Øº¨Ôº"
- "¨ØÁ¾¯"
- "¨ØÁ¾Ôµ"
- "¨ØÅ¨ÍÁ"
- "¨ØÅªÕ¾"
- "¨ØÅªÕÇѹ"
- "¨ØÅªÕÇÔ¹"
- "¨ØÅ·ÃÃȹì"
- "¨ØÅÀÒ¤"
- "¨ØÅÇÃä"
- "¨ØÅÈÑ¡ÃÒª"
- "¨ØÅÊÒÃ"
- "¨ØÅÔ¹·ÃÕÂì"
- "¨ØÌÒ"
- "¨ØÌÒŧ¡Ã³ì"
- "¨Øè§"
- "¨Øè¹"
- "¨ØèÁ"
- "¨Øé¹"
- "¨Øé¹¨Ùê"
- "¨ØéÁ"
- "¨ØéÂ"
- "¨Øê¡¡ÃÙê"
- "¨Øêº"
- "¨Øêºá¨§"
- "¨Øë§¨Ôë§"
- "¨ØëÁ¨ÔëÁ"
- "¨Ù"
- "¨Ù§"
- "¨Ùº"
- "¨Ùè"
- "¨Ùé"
- "¨Ùê´"
- "¨Ùë"
- "¨àÃ"
- "¨èÍ"
- "¨èÍÁ"
- "¨èÒ"
- "¨èÒ§"
- "¨èÒÂ"
- "¨é¹"
- "¨éǧ"
- "¨éÍ"
- "¨éÍ¡"
- "¨éÍ¡á¨é¡"
- "¨éͧ"
- "¨é͹"
- "¨éÍÂ"
- "¨éÐ"
- "¨éÒ"
- "¨éÒ§"
- "¨éÒ¹"
- "¨éÒÅÐËÇÑè¹"
- "¨éÒÇ"
- "¨éÓ"
- "¨éÓ¨Õé"
- "¨éÓÁèÓ"
- "¨êÍ¡"
- "¨êÐ"
- "¨ëÍ"
- "¨ëͧ"
- "¨ëÍÂ"
- "¨ëÐ"
- "¨ëÒ"
- "©¡"
- "©¡Ãèì"
- "©¡ÉѵÃÔÂì"
- "©¡Ò¨"
- "©¡ÒÁÒ¾¨Ã"
- "©§¹"
- "©§ÒÂ"
- "©¹Ç¹"
- "©¹Ñ§"
- "©¹Ò¡"
- "©¹Ó"
- "©ºÑ§"
- "©ºÑº"
- "©Á"
- "©ÁÇ¡"
- "©Áѧ"
- "©ÁÒ"
- "©ÁÓ"
- "©Å"
- "©ÅÇÂ"
- "©Åͧ"
- "©ÅÍÁ"
- "©ÅÑ¡"
- "©ÅÒ¡"
- "©ÅÒ´"
- "©ÅÒÁ"
- "©ÅÒÂ"
- "©ÅÔÇ"
- "©ÅØ"
- "©ÅØ¡©ÅÇÂ"
- "©ÅÙ"
- "©ÇÂ"
- "©ÇÑ´à©ÇÕ¹"
- "©ÇÒ§"
- "©ÇÕ"
- "©È¡"
- "©Í¡"
- "©Í´"
- "©ÍàÅÒÐ"
- "©Ð"
- "©Ð©Ò¹"
- "©Ð¹Ñé¹"
- "©Ð¹Õé"
- "©ÐÍé͹"
- "©ÑµÃ"
- "©Ñ¹"
- "©Ñ¹·Åѡɳì"
- "©Ñ¹·Ð"
- "©Ñ¹·Ò"
- "©Ñ¹·Ò¹ØÁѵÔ"
- "©Ñ¹·ì"
- "©Ñº"
- "©Ò¡"
- "©Ò§"
- "©Ò´"
- "©Ò¹"
- "©Òº"
- "©ÒÂ"
- "©ÒÂÒ"
- "©ÒÇ"
- "©Ó©Ò"
- "©Ô¹"
- "©Ôº"
- "©ÔÁ¾ÅÕ"
- "©ÔÇ"
- "©Ôè§"
- "©Õ¡"
- "©Õ´"
- "©Õè"
- "©Ø"
- "©Ø¡"
- "©Ø¡à©Ô¹"
- "©Ø´"
- "©Ø¹"
- "©ØÂ"
- "©Ù´"
- "©Ùè"
- "©èͧ"
- "©èÍÂ"
- "©èÒ"
- "©èÒ§"
- "©èÓ"
- "©éÍ"
- "ª¡"
- "ª§"
- "ª§â¤"
- "ª®Ò"
- "ª´"
- "ª¹"
- "ª¹¡"
- "ª¹¹Õ"
- "ª¹Á¾ÃÃÉÒ"
- "ª¹Áì"
- "ª¹Ç¹"
- "ª¹Ð"
- "ª¹Ñ¡"
- "ª¹Ô´"
- "ªºÒ"
- "ªÁ"
- "ªÁ´ªÁéÍÂ"
- "ªÁ¾Ù"
- "ªÁ¾Ù¹·"
- "ªÁ¾Ù¹Ø·"
- "ªÁ¾Ùè"
- "ªÁÃÁ"
- "ªÁÒ"
- "ªÁéÍÂ"
- "ªÁéÒÂ"
- "ªÂ"
- "ªÃ"
- "ªÃÐ"
- "ªÃÑÇ"
- "ªÃÒ"
- "ªÅ"
- "ªÅ¸ÒÃ"
- "ªÅ¸Õ"
- "ªÅ¹Ò"
- "ªÅ»Ãзҹ"
- "ªÅÒÅÑÂ"
- "ªÅÒÈÑÂ"
- "ªÇ"
- "ªÇ´"
- "ªÇ¹"
- "ªÇÃ"
- "ªÇÅÔµ"
- "ªÇÒ"
- "ªÇÒÅ"
- "ªÍ¡"
- "ªÍ¡ªéÓ"
- "ªÍ§"
- "ªÍ¹"
- "ªÍº"
- "ªÍ»»Ôé§"
- "ªÍÁ"
- "ªÍÅì¡"
- "ªÍ×éÍ"
- "ªÍØèÁ"
- "ªÍèÓ"
- "ªÐ"
- "ªÐ§Ñ¡"
- "ªÐ§Ñ´"
- "ªÐ§ØéÁ"
- "ªÐ§è͹"
- "ªÐ§éÓ"
- "ªÐµÒ"
- "ªÐ¹Õ"
- "ªÐÁ´"
- "ªÐÁÑ´"
- "ªÐÃÍÂ"
- "ªÐÅÍ"
- "ªÐÅÍÁ"
- "ªÐÅÙ´"
- "ªÐÅèÒ"
- "ªÐà§éÍ"
- "ªÐà¹ÒÐ"
- "ªÐá§é"
- "ªÐáŧ"
- "ªÐâ§¡"
- "ªÐâ´"
- "ªÑ¡"
- "ªÑ§"
- "ªÑªÇÒÅ"
- "ªÑ¯"
- "ªÑ´"
- "ªÑ¹"
- "ªÑ¹¹ÐµØ"
- "ªÑ¹ÉÒ"
- "ªÑ¹ÊÙµÃ"
- "ªÑÂ"
- "ªÑ¾ġÉì"
- "ªÑÂÀÙÁÔ"
- "ªÑè§"
- "ªÑèÇ"
- "ªÑèÇâÁ§"
- "ªÑé¹"
- "ªÑéÇ"
- "ªÒ"
- "ªÒ­"
- "ªÒ´"
- "ªÒ´¡"
- "ªÒµÃÕ"
- "ªÒµÐ"
- "ªÒµÔ"
- "ªÒ¹"
- "ªÒ¹Ø"
- "ªÒÁ"
- "ªÒÂ"
- "ªÒÂÒ"
- "ªÒÅÒ"
- "ªÒÇ"
- "ªÒÇàÅ"
- "ªÓ"
- "ªÓ¹Ñ­"
- "ªÓ¹Ò­"
- "ªÓ¹Ô"
- "ªÓÃÐ"
- "ªÓÃØ´"
- "ªÓÃèÇÂ"
- "ªÓà¹Õ¹"
- "ªÓà¹ÕÂÃ"
- "ªÓàÃÒ"
- "ªÓàÅ×ͧ"
- "ªÓáËÅÐ"
- "ªÔ"
- "ªÔ¤Òâ¡"
- "ªÔ§"
- "ªÔ§ªéÒ"
- "ªÔ´"
- "ªÔ¹"
- "ªÔ»"
- "ªÔ¾"
- "ªÔÁ"
- "ªÔÁỹ«Õ"
- "ªÔÇËÒ"
- "ªÔè§"
- "ªÔé¹"
- "ªÕ"
- "ªÕ»Ð¢ÒÇ"
- "ªÕ¾"
- "ªÕ¾ÔµÑ¡ÉÑÂ"
- "ªÕÇ»ÃÐÇѵÔ"
- "ªÕÇÇÔ·ÂÒ"
- "ªÕÇÒµÁì"
- "ªÕÇÒÅÑÂ"
- "ªÕÇÔµ"
- "ªÕÇԵѡÉÑÂ"
- "ªÕÇÔ¹"
- "ªÕÇÕ"
- "ªÕÇà¤ÁÕ"
- "ªÕé"
- "ª×´"
- "ª×è¹"
- "ª×è¹Á×è¹"
- "ª×èÍ"
- "ª×é¹"
- "ª×éÍ"
- "ªØ¡"
- "ªØ´"
- "ªØ¹"
- "ªØº"
- "ªØÁ"
- "ªØÁ¹ØÁ"
- "ªØÁ¾Ã"
- "ªØÅÁع"
- "ªØÅÕ"
- "ªØèÁ"
- "ªØèÂ"
- "ªØé§"
- "ªÙ"
- "ªÙé"
- "ªâÂ"
- "ªâÅ·Ã"
- "ªâÅÁ"
- "ªäÁ"
- "ªçÍ¡â¡àŵ"
- "ªçÍ¡â¡áŵ"
- "ªèǧ"
- "ªèÇÂ"
- "ªèÍ"
- "ªèͧ"
- "ªè͹"
- "ªèÒ§"
- "ªèÓ"
- "ªèӪͧ"
- "ªéͧ"
- "ªé͹"
- "ªéÍÂ"
- "ªéÒ"
- "ªéÒ§"
- "ªéÓ"
- "«¡"
- "«´"
- "«¹"
- "Ǽ"
- "«Á"
- "«Ç´à«"
- "«Ç¹"
- "«ÇÂ"
- "«Í"
- "«Í¡"
- "«Í§"
- "«Í¹"
- "«Í¿µìáÇÃì"
- "«Í¿·ì"
- "«Í¿·ìáÇÃì"
- "«ÍÁ«èÍ"
- "«ÍÂ"
- "«ÍÊ"
- "«Ñ¡"
- "«Ñ§"
- "«Ñ´"
- "«Ñ¹"
- "«Ñ¹µÒ¤ÅÍÊ"
- "«Ñº"
- "«Ñ¾¾ÍÃìµ"
- "«ÑÅ¿Ò"
- "«Ò"
- "«Ò¡"
- "«Ò¡ØÃÐ"
- "«Ò§"
- "«Ò¹"
- "«Òº«Öé§"
- "«Òº«èÒ¹"
- "«ÒÁÙäÃ"
- "«ÒÅÒà»Ò"
- "«ÒÇ"
- "«ÒÇ´ì"
- "«Ô"
- "«Ô¡"
- "«Ô¡ÒÃì"
- "«Ô¡á«ç¡"
- "«Ô¹áÊ"
- "«Ôº"
- "«Ô»"
- "«Ô¿ÔÅÔÊ"
- "«ÔÅԤ͹"
- "«ÔÇ"
- "«Ôè¹"
- "«Õ"
- "«Õ¡"
- "«Õ´"
- "«Õ´Õ"
- "«Õ¹Í¹"
- "«ÕÃÍ¡«ì"
- "«Õà¡ÁÊì"
- "«ÕàÁ¹µì"
- "«ÕàÃÕÂ"
- "«Õè"
- "«Õé"
- "«Ö§"
- "«ÖÁ"
- "«Öè§"
- "«Öé§"
- "«×èÍ"
- "«×éÍ"
- "«Ø¡"
- "«Ø§"
- "«Ø¹"
- "«Øº"
- "«Ø»"
- "«ØÂ"
- "«ØèÁ"
- "«ØèÁ«èÒÁ"
- "«ØéÁ"
- "«ÙªÔ"
- "«Ù´«Ò´"
- "«Ù´Ò¹"
- "«Ùº"
- "«Ùà»ÍÃìÁÒà¡çµ"
- "«Ùâ¤ÃÊ"
- "«Ùè"
- "«è¡"
- "«èͧ"
- "«è͹"
- "«èÍÁ"
- "«èÒ"
- "«èÒ¹"
- "«èÒËÃÔèÁ"
- "«é¹"
- "«éͧ"
- "«é͹"
- "«éÍÁ"
- "«éÒÂ"
- "«éÓ"
- "¬Ò¹"
- "¬Ò»¹¡Ô¨"
- "¬Ò»¹Ê¶Ò¹"
- "­Ç¹"
- "­ÑµµÔ"
- "­Ò³"
- "­ÒµÔ"
- "­Õè»Øè¹"
- "°Ò¹"
- "°Ò¹Ð"
- "°Ò¹Ñ¹´Ã"
- "°Ò»¹Ò"
- "´¡"
- "´§"
- "´¹µÃÕ"
- "´¹â´è"
- "´Á"
- "´Ãê¹Õ"
- "´ÃÒ¿µì"
- "´Ãس"
- "´ÃسÕ"
- "´Å"
- "´Ç§"
- "´Ç´"
- "´ÇÅ"
- "´Í¡"
- "´Í¡àºÕéÂ"
- "´Í¡äÁé"
- "´Í§"
- "´Í´"
- "´Í¹"
- "´ÍÁ"
- "´ÍÂ"
- "´ÍÅÅÒÃì"
- "´ÍÊ"
- "´Ð"
- "´Ñ¡"
- "´Ñ¡´Ò¹"
- "´Ñ¡á´é"
- "´Ñ§"
- "´Ñª¹Õ"
- "´Ñ´"
- "´Ñµ«ì"
- "´Ñ¹"
- "´Ñº"
- "´ÑºàºÔéÅ"
- "´ÑÁ¾ì"
- "´ÑÊ¡Ã"
- "´Ñè§"
- "´Ñé§"
- "´Ñé¹"
- "´Ò"
- "´Ò¡"
- "´Ò´"
- "´ÒµéÒ"
- "´Ò¹"
- "´Òº"
- "´ÒºÊ"
- "´ÒÁ"
- "´ÒÁ¾ì"
- "´ÒÂ"
- "´ÒóÕ"
- "´ÒôÒÉ"
- "´ÒÃÒ"
- "´ÒÃì"
- "´ÒÅ"
- "´ÒÅÑ´"
- "´ÒÇ"
- "´ÒÇ´Ö§Êì"
- "´ÒǹìâËÅ´"
- "´ÒÇ⨹Êì"
- "´ÒÉ"
- "´ÒÉ´Ò"
- "´Ó"
- "´Óç"
- "´ÓÃÑÊ"
- "´ÓÃÔ"
- "´ÓÄɳÒ"
- "´Óà¡Ô§"
- "´Óà¹Ô¹"
- "´Óᤧ"
- "´Ô"
- "´Ô¡"
- "´Ô¨ÔµÍÅ"
- "´Ô©Ñ¹"
- "´Ô¶Õ"
- "´Ô¹"
- "´Ôº"
- "´ÔÃѨ©Ò¹"
- "´ÔÅ¡"
- "´ÔÇÔªÑè¹"
- "´ÔʹÕÂì"
- "´ÔÊࡵ"
- "´Ôè§"
- "´ÔèÇ"
- "´Ôé¹"
- "´ÔéÇ"
- "´Õ"
- "´Õ¡ÃÕ"
- "´Õ´"
- "´Õ´Õ·Õ"
- "´ÕºØ¡"
- "´ÕÇÕ´Õ"
- "´Õà«Å"
- "´Õà»ÃʪÑè¹"
- "´Õ䫹ì"
- "´Õä«à¹ÍÃì"
- "´Ö¡"
- "´Ö¡´ÓºÃþì"
- "´Ö§"
- "´Ö§ÊÐ"
- "´Öè§"
- "´ÖèÁ"
- "´×Í"
- "´×è¹"
- "´×èÁ"
- "´×éÍ"
- "´Ø"
- "´Ø¡"
- "´Ø¨"
- "´Ø´"
- "´Ø¹"
- "´Øº"
- "´ØÁ"
- "´ØÃ§¤ì"
- "´ØÃÔÂÒ§¤ÈÒʵÃì"
- "´ØÃÔÂÒ§¤ÈÔÅ»ì"
- "´ØÃÔÂÒ§¤ì"
- "´ØÅ"
- "´ØÅ¾Ô¹Ô¨"
- "´ØÅÀÒ¤"
- "´ØÅ¾ԹԨ"
- "´ØÅÂÀÒ¾"
- "´ØÉ®Õ"
- "´ØÉ³Õ"
- "´ØÉÔµ"
- "´ØÊÔµ"
- "´ØàËÇèÒ"
- "´ØèÁ"
- "´ØèÂ"
- "´Øé§"
- "´Øé§´Ôé§"
- "´Øé¹"
- "´Ù"
- "´Ù¡Ã"
- "´Ù´"
- "´ÙÃÒ"
- "´èǹ"
- "´è͹"
- "´èÍÁ"
- "´èÒ"
- "´èÒ§"
- "´èÒ¹"
- "´èÒÇ"
- "´èÓ"
- "´é§"
- "´é¹"
- "´éǧ"
- "´éǹ"
- "´éÇÂ"
- "´éÍÁ"
- "´éÍÂ"
- "´éÒ¹"
- "´éÒÁ"
- "´éÒÂ"
- "´éÒÇ"
- "´éÓ"
- "µ¡"
- "µ¡Å§"
- "µ§"
- "µ§©Ô¹"
- "µ§Ô´"
- "µ´"
- "µ¶Ò¤µ"
- "µ¹"
- "µº"
- "µºÐ"
- "µÁ"
- "µÃ§"
- "µÃÁ"
- "µÃÁµÃÍÁ"
- "µÃáÇÔ·ÂÒ"
- "µÃáÈÒʵÃì"
- "µÃáÐ"
- "µÃǨ"
- "µÃǹ"
- "µÃÍ¡"
- "µÃͧ"
- "µÃÍÁµÃÁ"
- "µÃÍÁã¨"
- "µÃÐ"
- "µÃСÙÅ"
- "µÃÐ˧èÒ¹"
- "µÃÐ˹¡"
- "µÃÐ˹ѡ"
- "µÃÐ˹Õè"
- "µÃÐàǹ"
- "µÃѧ"
- "µÃѺ"
- "µÃÑÂ"
- "µÃÑÊ"
- "µÃÒ"
- "µÃÒ¡µÃÓ"
- "µÃÒº"
- "µÃÒÊѧ"
- "µÃÓ"
- "µÃÔ"
- "µÃÕ"
- "µÃÕÂÑÁ»ÇÒÂ"
- "µÃÕ⡳"
- "µÃÖ¡"
- "µÃÖ§"
- "µÃØ"
- "µÃØÉ"
- "µÃÙ"
- "µÃÙè"
- "µÄ³"
- "揭"
- "揧"
- "µÅÍ´"
- "µÅѺ"
- "µÅÒ´"
- "µÅÔè§"
- "µÇ§"
- "µÇÑ´"
- "µÇÒ´"
- "µÍ"
- "µÍ¡"
- "µÍ§"
- "µÍ´"
- "µÍ¹"
- "µÍº"
- "µÍÁ"
- "µÍÃì"
- "µÍÃì»Ôâ´"
- "µÍáÂ"
- "µÍáËÅ"
- "µÐ"
- "µÐ¡Ãѹ"
- "µÐ¡ÃØ´"
- "µÐ¡ÃØÁ"
- "µÐ¡ÃéÍ"
- "µÐ¡ÃéÒ"
- "µÐ¡ÅÐ"
- "µÐ¡ÅÒÁ"
- "µÐ¡Í¹"
- "µÐ¡Ñ§"
- "µÐ¡ÑèÇ"
- "µÐ¡Ø¡µÐ¡Ñ¡"
- "µÐ¢Í"
- "µÐ¢Òº"
- "µÐ¢Ô´µÐ¢Ç§"
- "µÐ¤ÃÔÇ"
- "µÐ¤Ãغ"
- "µÐ¤Í¡"
- "µÐ¹ÍÂ"
- "µÐºÍ§"
- "µÐºÍÂ"
- "µÐºÑ¹"
- "µÐ»ØèÁµÐ»èÓ"
- "µÐ¾Òº"
- "µÐ¾Ö´"
- "µÐ¾Ö´µÐ¾×Í"
- "µÐ¾Øè¹"
- "µÐÅÕµÐÅÒ¹"
- "µÐÅÖ§"
- "µÐÅØ§"
- "µÐÅØÁºÍ¹"
- "µÐÅØÁ¾Ø¡"
- "µÐÅèÍÁ"
- "µÐÇѹ"
- "µÐËÅÔÇ"
- "µÐà¡Õ¡µÐ¡ÒÂ"
- "µÐà¡Õ§"
- "µÐà¡Õº"
- "µÐà¢çº"
- "µÐà¤Õ¹"
- "µÐà¦è"
- "µÐàºç§"
- "µÐà¾Ô´"
- "µÐà¾Ôè¹"
- "µÐà¾Õ¹"
- "µÐàÀÒ"
- "µÐàŧ"
- "µÐá¡Ã§"
- "µÐᤧ"
- "µÐầ"
- "µÐâ¡"
- "µÐâ¡¡"
- "µÐ⡹"
- "µÐâ¡é"
- "µÐ⢧"
- "µÐâºÁ"
- "µÐ⾡"
- "µÐâ˧¡"
- "µÐä¡Ã"
- "µÐä¤Ãè"
- "µÐä¤Ãé"
- "µÐäº"
- "µÐäÅ"
- "業"
- "µÑ¡ÉÑÂ"
- "µÑ§"
- "µÑ§©èÒÂ"
- "µÑ§à¡"
- "µÑ§àÁ"
- "µÑ§âÍë"
- "µÑ³ËÒ"
- "µÑ´"
- "µÑ´ÊÔ¹"
- "µÑ¹"
- "µÑ¹Ë§"
- "楧"
- "楀"
- "µÑè§"
- "µÑé§"
- "µÑé§áµè"
- "µÑéÇâ¼"
- "µÑê¡áµ¹"
- "µÑëÇ"
- "µÒ"
- "µÒ¡"
- "µÒ´"
- "µÒ¹"
- "µÒ¹Õ"
- "µÒº"
- "µÒÁ"
- "µÒÂ"
- "µÒÅ"
- "µÒŻѵÃ"
- "µÓ"
- "µÓ¹Ò¹"
- "µÓºÅ"
- "µÓÃǨ"
- "µÓÃѺ"
- "µÓÃÒ"
- "µÓÅÖ§"
- "µÓ˹ѡ"
- "µÓ˹Ô"
- "µÓáÂ"
- "µÓá˹è§"
- "µÔ"
- "µÔ¡ÒËÃѧ"
- "µÔ§"
- "µÔ³"
- "µÔ´"
- "µÔÃѨ©Ò¹"
- "µÔÅ¡"
- "µÔè§"
- "µÔéÇ"
- "µÔê¡"
- "µÔë§"
- "µÕ"
- "µÕ¹"
- "µÕº"
- "µÕè"
- "µÕë"
- "µÖ"
- "µÖ¡"
- "µÖ§"
- "µÖ´µ×ëÍ"
- "µÖé¡"
- "µÖ页Ñé¡"
- "µÖê´µ×ëÍ"
- "µ×´"
- "µ×ÍÎǹ"
- "µ×è¹"
- "µ×é¹"
- "µ×éÍ"
- "µ×êÍ"
- "µ×ëÍ"
- "µØ"
- "µØ¡µÔ¡"
- "µØ§"
- "µØ¹"
- "µØ¹Ò˧ѹ"
- "µØº"
- "µØÃ¡Õ"
- "µØÅÒ"
- "µØÅÒ¡ÒÃ"
- "µØÅÒ¤Á"
- "µØËÃÑ´µØàËÃè"
- "µØè¹"
- "µØèÁ"
- "µØèÂ"
- "µØé§¡èÒ"
- "µØé§µÔé§"
- "µØéº"
- "µØéÁ"
- "µØéÂ"
- "µØê"
- "µØê¡"
- "µØê¡µÒ"
- "µØê¡á¡"
- "µØê´"
- "µØêµêÐ"
- "µØêº»èͧ"
- "µØêÂ"
- "µØë¹"
- "µØëÁ"
- "µØëµØèÂ"
- "µÙ"
- "µÙ¡"
- "µÙ´"
- "µÙº"
- "µÙÁ"
- "µÙè"
- "µÙé"
- "µèǹ"
- "µèÍ"
- "µèͧáµè§"
- "µèÍÁ"
- "µèÍÂ"
- "µèÒ§"
- "µèÓ"
- "µé¹"
- "µéÁ"
- "µéÇÁàµÕéÂÁ"
- "µéÍ"
- "µéͧ"
- "µéͧàµ"
- "µé͹"
- "µéÍÂ"
- "µé͵Ôè§"
- "µé͵ÕÇÔ´"
- "µéÒ¹"
- "µêÍ¡"
- "µêÍ¡µëÍÂ"
- "µë§"
- "µëÍÁ"
- "¶¡"
- "¶´"
- "¶¹¹"
- "¶¹ÍÁ"
- "¶¹Ñ´"
- "¶¹Ñ´¶¹Õè"
- "¶¹ÔÁ"
- "¶Á"
- "¶ÁÖ§·Ö§"
- "¶Å¡"
- "¶Å¹"
- "¶ÅÍ¡"
- "¶Åѹ"
- "¶ÅÒ"
- "¶ÅÒ¡"
- "¶ÅÓ"
- "¶ÅÕ¶ÅÓ"
- "¶ÅÖ§µÒ"
- "¶Åا"
- "¶Åع"
- "¶ÅèÁ"
- "¶ÇÑÅÂì"
- "¶ÇÒÂ"
- "¶ÇÔÅ"
- "¶Í¡"
- "¶Í§"
- "¶Í´"
- "¶Í¹"
- "¶ÍÂ"
- "¶Ð"
- "¶Ñ¡"
- "¶Ñ§"
- "¶Ñ´"
- "¶Ñ¹"
- "¶ÑÇ"
- "¶ÑèÇ"
- "¶Ò"
- "¶Ò¡"
- "¶Ò§"
- "¶Ò´"
- "¶Ò¹"
- "¶ÒÁ"
- "¶ÒÇÃ"
- "¶Ôè¹"
- "¶Õº"
- "¶Õè"
- "¶Ö¡"
- "¶Ö§"
- "¶×Í"
- "¶Ø§"
- "¶Ø¹"
- "¶ØÂ"
- "¶Ù"
- "¶Ù¡"
- "¶èÁ"
- "¶èǧ"
- "¶èÍ"
- "¶èͧ"
- "¶èÍÁ"
- "¶èÍÂ"
- "¶èÒ§"
- "¶èÒ¹"
- "¶èÒÂ"
- "¶éǹ"
- "¶éÇÂ"
- "¶éÍÂ"
- "¶éÒ"
- "¶éÓ"
- "·¡"
- "·¡ÅéÒ"
- "·´"
- "·¹"
- "·¹µì"
- "·¹ÒÂ"
- "·¹â·è"
- "·º"
- "·º·Ç¹"
- "·ºÇ§"
- "·ÁÔÌ"
- "·ÂÍÂ"
- "·Ã¡ÃÃÁ"
- "·Ã§"
- "·Ãª¹"
- "·ÃªÒµÔ"
- "·Ã¾ÔÉ"
- "·Ã¾Õ"
- "·ÃÁÒ¹"
- "·ÃÂÈ"
- "·ÃÂØ¤"
- "·Ãû"
- "·ÃÃȹÐ"
- "·ÃÃÒª"
- "·ÃÅѡɳì"
- "·Ãǧ"
- "·ÃÇ´·Ã§"
- "·ÃË´"
- "·ÃѾÂÒ¡Ã"
- "·ÃѾÂì"
- "·ÃѾÂìÊÔ¹"
- "·ÃÑÁà»çµ"
- "·ÃÒ¹«ÔÊàµÍÃì"
- "·ÃÒº"
- "·ÃÒÁ"
- "·ÃÒÂ"
- "·ÃØ´"
- "·ÄÉ®Õ"
- "·ÅÒÂ"
- "Ⴄ"
- "·Ç´"
- "·Ç¹"
- "·ÇÂ"
- "·ÇÒ·È"
- "·ÇÒÂ"
- "·ÇÒÃ"
- "·ÇÔ"
- "·ÇÕ"
- "·ÇÕ¸ÒÀÔàÉ¡"
- "·ÇÕ»"
- "·ÇèÒ"
- "·È"
- "·È¹ÔÂÁ"
- "·ËÒÃ"
- "·Í"
- "·Í¡"
- "·Í§"
- "·Í§¡ÇÒÇ"
- "·Í§ËÅÒ§"
- "·Í´"
- "·Í¹"
- "·Í¹«ÔÅ"
- "·Í¿¿Õè"
- "·ÍÂ"
- "·ÍÅì¤"
- "·Ð¹§"
- "·Ð¹Ò¹"
- "·Ð¹Ø"
- "·ÐÁÑ´·ÐáÁ§"
- "·ÐÁÖ¹"
- "·ÐÁ×è¹"
- "·ÐÂÒ¹"
- "·ÐÅǧ"
- "·ÐÅÑ¡"
- "·ÐÅÒÂ"
- "·ÐÅÖè§"
- "·ÐÅØ"
- "·ÐÇÒÂ"
- "·ÐàºÕ¹"
- "·ÐàÂÍ·ÐÂÒ¹"
- "·ÐàÅ"
- "·ÐàÅÒÐ"
- "·ÐàÅèÍ·ÐÅèÒ"
- "·ÐàÅé¹"
- "·ÐáÁè§"
- "·Ñ¡"
- "·Ñ¡¢Ô­"
- "·Ñ¡¢Ô³Ò"
- "·Ñ¡¢Ô³ÒÇѯ"
- "·Ñ¡¢ì"
- "·Ñ¡ÉÐ"
- "·Ñ¡ÉÔ³"
- "·Ñ¡ÉÔ³Ò"
- "·Ñ¡ÉÔ³ÒÇÃõ"
- "·Ñ¡ÉÔâ³·¡"
- "·Ñ§Ê൹"
- "·Ñ³±¡ÃÃÁ"
- "·Ñ³±¦Òµ"
- "·Ñ³±Ê¶Ò¹"
- "·Ñ³±ì"
- "·Ñ´"
- "·Ñ¹"
- "·Ñ¹µá¾·Âì"
- "·Ñ¹µì"
- "·Ñ¹·Õ"
- "ᄼ"
- "·ÑºÊÁÔ§¤ÅÒ"
- "·Ñ¾"
- "·Ñ¾¾Õ"
- "·Ñȹ¤µÔ"
- "·ÑȹÇÔÊÑÂ"
- "·ÑȹÈÖ¡ÉÒ"
- "·ÑȹÐ"
- "·ÑȹÒ"
- "·ÑȹҨÃ"
- "·ÑȹÕÂÀÒ¾"
- "·ÑȹÕÂì"
- "·Ñȹٻ¡Ã³ì"
- "·Ñȹì"
- "·ÑÈä¹Â"
- "·Ñè§"
- "·ÑèÇ"
- "·Ñé§"
- "·Ò"
- "·Ò¡"
- "·Ò§"
- "·Ò¹"
- "·Òº"
- "·ÒÁ"
- "·ÒÂ"
- "·ÒÂÒ´"
- "·ÒÂÒ·"
- "·Òá"
- "·ÒÃÔ¡Ò"
- "·ÒÃØ³"
- "·ÒÃì«Ò¹"
- "·ÒÊ"
- "·Ó"
- "·Ó¹º"
- "·Ó¹Í§"
- "·Ó¹ÒÂ"
- "·Ó¹Ø"
- "·ÓÅÒÂ"
- "·Óà¹Ò"
- "·Óà¹Õº"
- "·ÓàÅ"
- "·ÓäÁ"
- "·Ô¤ÑÁ¾Ã"
- "·Ô¦ÑÁ¾Ã"
- "·Ô§à¨ÍÃì"
- "·Ô°Ô"
- "·Ô´"
- "·Ô¾Â¨Ñ¡ÉØ"
- "·Ô¾Â­Ò³"
- "·Ô¾ÂÃÊ"
- "·Ô¾Â๵Ã"
- "·Ô¾Âì"
- "·Ô¾Ò¡Ã"
- "·ÔÁ"
- "·ÔÇ"
- "·Ôǧ¤µ"
- "·ÔÇ·Ñȹì"
- "·ÔÇÒ"
- "·ÔÈ"
- "·ÔÈÒ"
- "·ÔÈҹطÔÈ"
- "·Ôີ"
- "·ÔèÁ"
- "·Ôé§"
- "·Õ"
- "·Õ¦ªÒµÔ"
- "·ÕÁ"
- "·Õà͹·Õ"
- "·Õè"
- "·Õè´Ô¹"
- "·Ö¡"
- "·Ö¹·Ö¡"
- "·Öº"
- "·ÖÁ"
- "·Öè§"
- "·ÖèÁ"
- "·Öé§"
- "·×èÍ"
- "·Ø"
- "·Ø¡"
- "·Ø¡¢ÅÒÀ"
- "·Ø¡¢ÒÃÁ³ì"
- "·Ø¡¢àÇ·¹Ò"
- "·Ø¡¢ì"
- "·Ø¡Ã¡ÔÃÔÂÒ"
- "·Ø¤µÔ"
- "·Ø¨ÃÔµ"
- "·Ø´"
- "·Ø¹"
- "᯼"
- "·Ø¾¾Å"
- "·Ø¾ÀÔ¡¢ÀÑÂ"
- "·ØÂ"
- "·ØÃ¡Ñ¹´ÒÃ"
- "·ØÃª¹"
- "·ØÃªÒµÔ"
- "·ØÃ¹·ØÃÒÂ"
- "·ØÃ¾Å"
- "·ØÅÑ¡·ØàÅ"
- "·ØÈÕÅ"
- "·ØàÃÈ"
- "·ØàÃÕ¹"
- "·ØàÅÒ"
- "·Øè§"
- "·Øè¹"
- "·ØèÁ"
- "·Øé§"
- "·ØéÁ"
- "·ØéÂ"
- "·Ù"
- "·Ùµ"
- "·ÙµÒ¹Ø·Ùµ"
- "·Ù¹"
- "·Ùº"
- "·ÙÁ"
- "·ÙÅ"
- "·Ùè"
- "·Ùé"
- "·á¡ÅéÇ"
- "·á§"
- "·âÁ¹"
- "·èǧ·Ó¹Í§"
- "·èǧ·Õ"
- "·èǧ·èÒ"
- "·èÇÁ"
- "·èÍ"
- "·èͧ"
- "·è͹"
- "·èÍÁ"
- "·èÒ"
- "·èÒ¹"
- "·èÒÁ¡ÅÒ§"
- "·é¹"
- "·éǧ"
- "·éǹ"
- "·éÇÁ"
- "·éÍ"
- "·éͧ"
- "·éÒ"
- "·éÒÂ"
- "·éÒÇ"
- "¸§"
- "¸¹"
- "¸¹ºÑµÃ"
- "¸¹ºØÃÕ"
- "¸¹ÊÁºÑµÔ"
- "¸¹ÊÒÃ"
- "¸¹Ò¤ÒÃ"
- "¸¹Ò³ÑµÔ"
- "¸¹ÒÃÑ¡Éì"
- "¸¹Ù"
- "¸Á"
- "¸Ã"
- "¸Ã³Õ"
- "¸ÃÃÁ"
- "¸ÃÃÁ¡ÒÂ"
- "¸ÃÃÁªÒµÔ"
- "¸ÃÃÁ´Ò"
- "¸ÃÃÁÈÒʵÃì"
- "¸ÃÃÁÐ"
- "¸ÃÃÁиÑÁâÁ"
- "¸ÃÃÁÒ·ÔµÂì"
- "¸ÃÃÁÒ¸ÃÃÁ"
- "¸ÃÃÁÒ¸Ô»äµÂ"
- "¸ÃÃÁÒ¸Ôɰҹ"
- "¸ÃÃÁÒ¹ØÊÒ¹"
- "¸ÃÃÁÒÀÔÁØ¢"
- "¸ÃÃÁÒÀÔÊÁÑÂ"
- "¸ÃÃÁÒµ¹Ð"
- "¸ÃÃÁÒÃÁ³ì"
- "¸ÃÃÁÒʹì"
- "¸ÃÃÁÔ¡"
- "¸ÃÒ¸Ã"
- "¸ÃÒ¸ÒÃ"
- "¸ÃÒ¸Ôº´Õ"
- "¸ÃÒ¸Ô»"
- "¸Ñ­"
- "¸Ñ­­ÒËÒÃ"
- "¸Ñ­¾×ª"
- "¸Ñ¹ÇÒ¤Á"
- "¸ÑÁÁÐ"
- "¸ÒµØ"
- "¸Ò¹Õ"
- "¸ÒÃ"
- "¸ÒÃÒ"
- "¸ÓÁç¤ì"
- "¸Óç"
- "¸Ô´Ò"
- "¸Ôີ"
- "¸Ø´§¤ì"
- "¸ØÃ¡ÃÃÁ"
- "¸ØÃ¡ÒÃ"
- "¸ØÃ¡Ô¨"
- "¸ØÃÐ"
- "¸ØÅÕ"
- "¸ØÇ´ÒÃÒ"
- "¸ØÇÀÒ¤"
- "¸ØÇÁ³±Å"
- "¸Ù»"
- "¹¡"
- "¹¤Ã"
- "¹¤ÃÃÒªÊÕÁÒ"
- "¹¤ÃÔ¹·Ãì"
- "¹¤àÃÈ"
- "¹§¤ÃÒ­"
- "¹§¹Øª"
- "¹§¾Ð§Ò"
- "¹§¾ÒÅ"
- "¹§ÃÒÁ"
- "¹§Åѡɳì"
- "¹§àÂÒÇì"
- "¹·Õ"
- "¹¹·ºØÃÕ"
- "¹¹·ÃÕ"
- "¹¹·ÅÕ"
- "¹º"
- "¹¾"
- "¹¾»®Å"
- "¹¾È¡"
- "¹¾ÈÙÅ"
- "¹ÀÒ"
- "¹ÀÒÅÑÂ"
- "¹Á"
- "¹ÁÑÊ¡ÒÃ"
- "¹Ã¡"
- "¹ÃÊÔ§Ëì"
- "¹ÃÕàǪ"
- "¹ÃÕá¾·Âì"
- "¹Ä¤ËÔµ"
- "¹Ä¹Ò·"
- "¹ÄÁÅ"
- "¹ÄÁÔµ"
- "¹ÅÒ¯"
- "¹ÅÔ¹Õ"
- "¹Ç´"
- "¹Ç¹ÔÂÒÂ"
- "¹ÇÁ"
- "¹ÇÂ"
- "¹ÇÅ"
- "¹ÇÅÅÍÍ"
- "¹ÇÅÅÐÍͧ"
- "¹Í"
- "¹Í¡"
- "¹Í§"
- "¹Íµ"
- "¹Í¹"
- "¹Íº"
- "¹ÍÂ"
- "¹ÍÃìàÇÂì"
- "¹Ð"
- "¹Ñ¡"
- "¹Ñ¡¢Ñµ"
- "¹Ñ¡ÈÖ¡ÉÒ"
- "¹Ñ¡ÉѵÃ"
- "¹Ñ¡àÃÕ¹"
- "¹Ñ§¤ÑÅ"
- "¹Ñ´"
- "¹Ñ´´Ò"
- "¹Ñµ¶Øì"
- "¹Ñ¹·¹Ò¡ÒÃ"
- "¹Ñº"
- "¹ÑÂ"
- "¹Ñ¹ì"
- "¹ÑÇ"
- "¹Ñè§"
- "¹Ñè¹"
- "¹Ñé¹"
- "¹Ò"
- "¹Ò¡"
- "¹Ò¤"
- "¹Ò¤Ã"
- "¹Ò¤ÃÒª"
- "¹Ò¤Õ"
- "¹Ò§"
- "¹Ò§ÊÒÇ"
- "¹Ò§áÍè¹"
- "¹Ò«Ò"
- "¹Ò¯"
- "¹Ò´"
- "¹Ò¶"
- "¹Ò·"
- "¹Ò·Õ"
- "¹Ò¹"
- "¹Ò¹Ñ»¡ÒÃ"
- "¹Ò¹Ò"
- "¹Òº"
- "¹ÒÀÕ"
- "¹ÒÁ"
- "¹ÒÁ¡Ã"
- "¹ÒÁÊ¡ØÅ"
- "¹ÒÁҹءÃÁ"
- "¹ÒÁÒÀÔä¸Â"
- "¹ÒÂ"
- "¹Ò¡"
- "¹ÒÃÒ³ì"
- "¹ÒÃÕ"
- "¹ÒÇÒ"
- "¹ÒÇÔ¡"
- "¹ÒÇÔ¹"
- "¹ÒÇÕ"
- "¹ÒÊÔ¡"
- "¹ÒÌÔ¡Ò"
- "¹ÒÌÔà¡"
- "¹Òâ¹"
- "¹Ó"
- "¹Ô"
- "¹Ô¡Ã"
- "¹Ô¡ÃÍ´ì"
- "¹Ô¡ÒÂ"
- "¹Ô¡à¡ÔÅ"
- "¹Ô¤Á"
- "¹Ô¤Ã¹¶ì"
- "¹Ô¤ËÔµ"
- "¹Ô¨"
- "¹Ô´"
- "¹ÔµÂÊÒÃ"
- "¹ÔµÂì"
- "¹ÔµÔ"
- "¹Ô·ÃÃÈ"
- "¹Ô·ÃÒ"
- "¹Ô·Ñȹì"
- "¹Ô·Ò¹"
- "¹Ô¹·Ò"
- "¹ÔºÒµ"
- "¹Ô¾¹¸ì"
- "¹Ô¾¾Ò¹"
- "¹ÔÁ¹µì"
- "¹ÔÁÁÒ¹"
- "¹ÔÁÁҹôÕ"
- "¹ÔÁÔµ"
- "¹ÔÂÁ"
- "¹ÔÂÒÁ"
- "¹ÔÂÒÂ"
- "¹Ô÷ء¢ì"
- "¹ÔùÒÁ"
- "¹ÔÃÀÑÂ"
- "¹ÔÃÁÅ"
- "¹ÔÃÁÔµ"
- "¹ÔÃѹ´Ã"
- "¹ÔÃÒÈ"
- "¹ÔÃâ·É"
- "¹ÔÅ"
- "¹ÔÅØºÅ"
- "¹ÔǡԹÕ"
- "¹ÔǤÅÔÍÔ¡"
- "¹ÔÇ«ÕᏴì"
- "¹ÔǵÃ͹"
- "¹ÔÇÂÍÃì¤"
- "¹ÔÇóì"
- "¹ÔÇѵ"
- "¹ÔÇѵ¹ì"
- "¹ÔÇÒµ"
- "¹ÔÇÒÊ"
- "¹ÔÇà¤ÅÕÂÃì"
- "¹ÔÇà¤ÅÕÂÊ"
- "¹ÔÊÑÂ"
- "¹ÔÊÔµ"
- "¹Ôà·È"
- "¹ÔàÇÈ"
- "¹ÔàÇȹì"
- "¹Ô⤵Թ"
- "¹Ôâø"
- "¹ÔâźÅ"
- "¹Ôè§"
- "¹ÔèÁ"
- "¹ÔèÇ"
- "¹ÔéÇ"
- "¹Õ"
- "¹ÕÍ͹"
- "¹ÕâÍ´ÔàÁÕÂÁ"
- "¹Õè"
- "¹Õé"
- "¹Ö¡"
- "¹Öè§"
- "¹Ø§"
- "¹Øª"
- "¹Øè§"
- "¹Øè¹"
- "¹ØèÁ"
- "¹ØéÂ"
- "¹Ù¹"
- "¹Ùè¹"
- "¹Ùé¹"
- "¹àÃÈÇÃ"
- "¹âºÒÂ"
- "¹âôÁ"
- "¹èÇÁ"
- "¹èͧ"
- "¹èÒ"
- "¹èÒ¹"
- "¹éͧ"
- "¹éÍÁ"
- "¹éÍÂ"
- "¹éÍÂ˹èÒ"
- "¹éÍÂâ˹è§"
- "¹éÒ"
- "¹éÒÇ"
- "¹éÓ"
- "¹éÓÁѹ"
- "¹éÓà§Ô¹"
- "º¡"
- "º¡¾Ãèͧ"
- "º§"
- "º§¡ª"
- "º´"
- "º´Ô¹·Ãà´ªÒ"
- "º´Ô¹·Ãì"
- "º´Õ"
- "º·"
- "º¹"
- "º¾ÔµÃ"
- "º¾Ô¸"
- "ºÃÁ"
- "ºÃÁѵ¶ì"
- "ºÃÃ"
- "ºÃè§"
- "ºÃè¶Ã³ì"
- "ºÃèº"
- "ºÃèǺ"
- "ºÃèØ"
- "ºÃó"
- "ºÃóҡÒÃ"
- "ºÃóҤÁ"
- "ºÃóҸԡÒÃ"
- "ºÃóҹءÃÁ"
- "ºÃóÒÃÑ¡ÉÈÒʵÃì"
- "ºÃóÒÃÑ¡Éì"
- "ºÃôÒ"
- "ºÃ÷Á"
- "ºÃ÷Ѵ"
- "ºÃ÷ء"
- "ºÃþ"
- "ºÃþªÒ"
- "ºÃþªÔµ"
- "ºÃþµ"
- "ºÃþºØÃØÉ"
- "ºÃç"
- "ºÃç¡ì"
- "ºÃÃÂÒ¡ÒÈ"
- "ºÃÃÂÒÂ"
- "ºÃÃÅÑÂ"
- "ºÃÃÅØ"
- "ºÃÃÉÑ·"
- "ºÃÃËÒÃ"
- "ºÃÃà¨Ô´"
- "ºÃÃà·Ò"
- "ºÃÃàŧ"
- "ºÃÃâÅÁ"
- "ºÃÑè¹´Õ"
- "ºÃÒÇà«ÍÃì"
- "ºÃÔ"
- "ºÃÔ¡ÃÃÁ"
- "ºÃÔ¡ÒÃ"
- "ºÃÔ¢ÒÃ"
- "ºÃÔ¤³Ëì"
- "ºÃÔ¨Ò¤"
- "ºÃÔ¨Òá"
- "ºÃÔ¨ÒÃÔ¡Ò"
- "ºÃÔºÒÅ"
- "ºÃÔºÙóì"
- "ºÃԾѵÃ"
- "ºÃÔ¾ÒÃ"
- "ºÃÔÀѳ±ì"
- "ºÃÔÀÒÉ"
- "ºÃÔÃÑ¡Éì"
- "ºÃÔÃÒª"
- "ºÃÔÇÒÃ"
- "ºÃÔÉÑ·"
- "ºÃÔÊØ·¸Ôì"
- "ºÃÔËÒÃ"
- "ºÃÔà©·"
- "ºÃÔ൹"
- "ºÃÔàdz"
- "ºÃÔâÀ¤"
- "ºÅçÍ¡"
- "ºÇ¡"
- "ºÇ§"
- "ºÇª"
- "ºÇ¹"
- "ºÇº"
- "ºÇÁ"
- "ºÇÃ"
- "ºÍ"
- "ºÍ¡"
- "ºÍ´"
- "ºÍ´Õé"
- "ºÍ¹"
- "ºÍº"
- "ºÍÃì¡"
- "ºÍÃì´"
- "ºÍÃìà¹ÕÂÇ"
- "ºÍÅ"
- "ºÍÅÅÙ¹"
- "ºÐËÁÕè"
- "ºÑ¡"
- "ºÑ¤àµÃÕ"
- "ºÑ§"
- "ºÑ§¡ÐâÅ"
- "ºÑ§¤Á"
- "ºÑ§¤Å"
- "ºÑ§¤Ñº"
- "ºÑ§ÊØ¡ØÅ"
- "ºÑ§ÍÃ"
- "ºÑ§ÍÒ¨"
- "ºÑ§à¡Ô´"
- "ºÑ§àËÕ¹"
- "ºÑ§àÍÔ­"
- "ºÑ­ªÃ"
- "ºÑ­ªÒ"
- "ºÑ­ªÕ"
- "ºÑ­­ÑµÔ"
- "ºÑ³±Ôµ"
- "ºÑ³±ÔµÂì"
- "ºÑ³±Ø"
- "ºÑ³±ÙÃ"
- "ºÑ³³ÒÊ"
- "ºÑ³ÃÊ"
- "ºÑ³ÃÊÕ"
- "ºÑ³à±ÒСì"
- "ºÑ³à±ÒÐÇì"
- "ºÑ´"
- "ºÑ´¡ÃÕ"
- "ºÑ´«º"
- "ºÑ´ÊÕ"
- "ºÑµÃ"
- "ºÑ¹"
- "ºÑ¹´ÒÅ"
- "ºÑ¹·Ö¡"
- "ºÑ¹ÂкѹÂѧ"
- "ºÑ¹Å×Í"
- "ºÑ¹à·Ô§"
- "ºÑ¹ä´"
- "ºÑ»¼ÒÊÐ"
- "ºÑ¾"
- "ºÑÅ¡ÒàÃÕÂ"
- "ºÑÅÅѧ¡ì"
- "ºÑÅÅÙ¹"
- "ºÑÇ"
- "ºÑÊ"
- "ºÑè¹"
- "ºÑé§"
- "ºÑé¹"
- "ºÑê¡"
- "ºÒ"
- "ºÒ¡"
- "ºÒ§"
- "ºÒ´"
- "ºÒ´·ÐÂÑ¡"
- "ºÒ´ÒÅ"
- "ºÒµ"
- "ºÒµÃ"
- "ºÒ·"
- "ºÒ·º§ÊØì"
- "ºÒ·ËÅǧ"
- "ºÒ·Ò¸Ö¡"
- "ºÒ·Ø¡Ò"
- "ºÒ¹"
- "ºÒ¹ª×è¹"
- "ºÒ¹ºØÃÕ"
- "ºÒ¹ÕÂÐ"
- "ºÒ¹àªéÒ"
- "ºÒ¹àÂç¹"
- "ºÒ»"
- "ºÒÂ"
- "ºÒÃÁÕ"
- "ºÒÃÍÁÔàµÍÃì"
- "ºÒÃì"
- "ºÒÃìàÃÅ"
- "ºÒÅ"
- "ºÒÅÕ"
- "ºÒÈ"
- "ºÒÈ¡ì"
- "ºÒÊࡵºÍÅ"
- "ºÒËÅÕ"
- "ºÓ¹Ò­"
- "ºÓºÑ´"
- "ºÓÃÒº"
- "ºÓÃÒÈ"
- "ºÓÃØ§"
- "ºÓÃÙ"
- "ºÓà¾ç­"
- "ºÓàÃÍ"
- "ºÓà˹ç¨"
- "ºÔ"
- "ºÔ°"
- "ºÔ³±ºÒµ"
- "ºÔ´"
- "ºÔ´¾ÅÔéÇ"
- "ºÔ´Ã"
- "ºÔ´Ò"
- "ºÔµ"
- "ºÔ¹"
- "ºÔÅ"
- "ºÔÅàÅÕ´"
- "ºÔè¹"
- "ºÕ±Ò"
- "ºÕ¹"
- "ºÕº"
- "ºÕé"
- "ºÖ¡"
- "ºÖ¡ºÖ¹"
- "ºÖ§"
- "ºÖè§"
- "ºÖé§"
- "ºØ"
- "ºØ¡"
- "ºØ¡ÃØ¡"
- "ºØ¡É¡"
- "ºØ¤¤Å"
- "ºØ¤ÅÒ¡Ã"
- "ºØ¤ÅÒ¸Ôɰҹ"
- "ºØ¤ÅÔ¡"
- "ºØ¤ÅÔ¡ÀÒ¾"
- "ºØ­"
- "ºØ­­Ò¹ØÀÒ¾"
- "ºØ­­ÒÀÔ¹ÔËÒÃ"
- "ºØ³±ÃÔ¡"
- "ºØ³Âì"
- "ºØµÃ"
- "ºØµÃÒ"
- "ºØµÃÕ"
- "ºØº"
- "ºØ»¼ªÒµÔ"
- "ºØ¾¡ÃÃÁ"
- "ºØ¾¡ÒÃÕ"
- "ºØ¾¡Ô¨"
- "ºØ¾ªÒµÔ"
- "ºØ¾·Ñ¡ÉÔ³"
- "ºØ¾¹ÔÁÔµ"
- "ºØ¾º·"
- "ºØ¾¾Ò¨ÒÃÂì"
- "ºØ¾à¾Êѹ¹ÔÇÒÊ"
- "ºØ¿à¿èµì"
- "ºØÃ¾·ÔÈ"
- "ºØÃ¾º·"
- "ºØÃ¾Ò¨ÒÃÂì"
- "ºØÃÒ³"
- "ºØÃÔÁ·ÔÈ"
- "ºØÃÔÁ¾ÃÃÉÒ"
- "ºØÃÔÁÊÔ·¸Ô"
- "ºØÃÕ"
- "ºØÃØÉ"
- "ºØÉ¡Ã"
- "ºØÉº§"
- "ºØÉºÒ"
- "ºØÉÂÁÒÊ"
- "ºØÉÃÒ¤ÑÁ"
- "ºØË§Ñ¹"
- "ºØË§Ò"
- "ºØËç"
- "ºØËÃÕè"
- "ºØËÅѹ"
- "ºØâ÷Ñè§"
- "ºØèÁºèÒÁ"
- "ºØé§"
- "ºØéÂ"
- "ºØëÁ"
- "ºÙªÒ"
- "ºÙªÒÂÑ­"
- "ºÙ´"
- "ºÙµ"
- "ºÙóÀÒ¾"
- "ºÙóÐ"
- "ºÙþÒ"
- "ºÙþҨÒÃÂì"
- "ºÙé"
- "ºÙê"
- "ºè"
- "ºè§"
- "ºè¹"
- "ºèÁ"
- "ºèǧ"
- "ºèÍ"
- "ºèͧ"
- "ºè͹"
- "ºèÍÂ"
- "ºèÒ"
- "ºèÒ§"
- "ºèÒÂ"
- "ºèÒÇ"
- "ºéǹ"
- "ºéͧ"
- "ºéͧáºêÇ"
- "ºéÍÁ"
- "ºéÒ"
- "ºéÒ§"
- "ºéÒ¹"
- "ºéÒÃÐËèÓ"
- "ºê§àºê§"
- "ºêÇÂ"
- "ºêͧ"
- "ºêÐ"
- "ºëÍÁ"
- "ºëÍÂ"
- "ºëÓ"
- "»¡"
- "»¡¤Ãͧ"
- "»¡µÔ"
- "»¡Ã³ì"
- "»¡ÒÃ"
- "»¡Ô³¡Ð"
- "»¯Ñ¡"
- "»¯Ô¡Ã³ì"
- "»¯Ô¡ÃÃÁ"
- "»¯Ô¡ÔÃÔÂÒ"
- "»¯Ô¡ÙÅ"
- "»¯Ô¤Á"
- "»¯ÔªÕǹÐ"
- "»¯Ô­­Ò"
- "»¯Ô­Ò³"
- "»¯Ô·Ô¹"
- "»¯Ôº¶"
- "»¯ÔºÑµÔ"
- "»¯Ô»·Ò"
- "»¯Ô»Ñ¡Éì"
- "»¯Ô¾Ñ·¸ì"
- "»¯Ô¾Ò¡Âì"
- "»¯ÔÀÒ¤"
- "»¯ÔÀÒ³"
- "»¯ÔÁÒ"
- "»¯ÔÁÒ¡Ã"
- "»¯ÔÂØ·¸ì"
- "»¯ÔÃÙ»"
- "»¯ÔÇѵÔ"
- "»¯ÔÇÒµ"
- "»¯ÔÇÒ·"
- "»¯Ôʹ¸Ô"
- "»¯ÔÊѧ¢Ã³ì"
- "»¯ÔÊѹ¶ÒÃ"
- "»¯ÔÊÑÁ¾Ñ¹¸ì"
- "»¯ÔàǸ"
- "»¯Ôàʸ"
- "»¯ÔâÅÁ"
- "»°¾Õ"
- "»°Á"
- "»°Á·Ñȹì"
- "»°Á¹Ôà·È"
- "»°Á¾ÂÒºÒÅ"
- "»°ÁÄ¡Éì"
- "»°ÁÇÑÂ"
- "»°Áà·È¹Ò"
- "»³µ"
- "»³Ô¸Ò¹"
- "»´"
- "»¶¾Õ"
- "»·Ò¹Ø¡ÃÁ"
- "»·ØÁ"
- "»·ØÁ¸Ò¹Õ"
- "»¹"
- "»¹Ñ´´Ò"
- "»¹à»"
- "ȼ"
- "»Á"
- "»Ã¡"
- "»Ã¡µÔ"
- "»Ã§"
- "»Ã¹"
- "»Ã¹¹ÔºÑµÔ"
- "»Ã¹ÑÂ"
- "»Ãº"
- "»Ã»Ñ¡Éì"
- "»ÃÁѵ¶ì"
- "»ÃÁÒ¨ÒÃÂì"
- "»ÃÁÒ³Ù"
- "»ÃÁÒÀÔàÉ¡"
- "»ÃÁÒÀÔä¸Â"
- "»ÃÇ´"
- "»Ãǹá»Ã"
- "»ÃÇÒ·Õ"
- "»ÃÊÔµ"
- "»Ãͧ´Í§"
- "»ÃÍ´"
- "»ÃÍ·"
- "»ÃÍÂ"
- "»ÃÐ"
- "»ÃСº"
- "»ÃСǴ"
- "»ÃСͺ"
- "»ÃСѹ"
- "»ÃСѺ"
- "»ÃСÒÂ"
- "»ÃСÒÃ"
- "»ÃСÒÈ"
- "»ÃСÒȹÕºѵÃ"
- "»ÃСÒÈÔµ"
- "»ÃСԴ"
- "»ÃФº"
- "»ÃФº»ÃÐ˧Á"
- "»ÃФͧ"
- "»ÃФÓ"
- "»ÃШº"
- "»ÃШǺ"
- "»ÃШѡÉì"
- "»ÃШѭ"
- "»ÃШѹ"
- "»ÃШҤ"
- "»ÃШҹ"
- "»ÃШÓ"
- "»ÃШÔÁ"
- "»ÃШØ"
- "»ÃШëÍ»ÃÐá¨ë"
- "»ÃЪ´"
- "»ÃЪÇÃ"
- "»ÃЪѹ"
- "»ÃЪÒ"
- "»ÃЪҪ¹"
- "»ÃЪҸԻѵÂì"
- "»ÃЪҸԻäµÂ"
- "»ÃЪÒÀÔºÒÅ"
- "»ÃЪԴ"
- "»ÃЪØÁ"
- "»Ãгµ"
- "»ÃгÁ"
- "»ÃгÒÁ"
- "»ÃгԸҹ"
- "»ÃгԸÔ"
- "»Ãгյ"
- "»Ãд¹"
- "»Ãдǹ"
- "»Ãд͹"
- "»Ãдѡ»ÃÐà´Ô´"
- "»Ãдѧ"
- "»ÃдѺ"
- "»ÃдÒ"
- "»Ãдһ"
- "»ÃдÒÉ"
- "»ÃдԴ»ÃдÍÂ"
- "»ÃдԷԹ"
- "»ÃдÔɰҹ"
- "»ÃдÔɰì"
- "»Ãдا"
- "»Ãдب"
- "»ÃдÙè"
- "»ÃеÙ"
- "»ÃжÁ"
- "»Ãзǹ"
- "»ÃзѡÉì"
- "»Ãзѧ"
- "»ÃзѴ"
- "»ÃзѺ"
- "»Ãзҹ"
- "»ÃзԹ"
- "»ÃзÔè¹"
- "»Ãзջ"
- "»Ãзع"
- "»ÃзØÉ"
- "»ÃзØÉÃéÒÂ"
- "»Ãзéǧ"
- "»Ãиҹ"
- "»ÃиҹҸԺ´Õ"
- "»ÃйÁ"
- "»ÃйÍÁ"
- "»ÃйջÃйÍÁ"
- "»ÃлÃÒÂ"
- "»ÃлÒ"
- "»ÃоĵÔ"
- "»ÃоĸÔì"
- "»Ãоѷ¸ì"
- "»Ãоѹ¸ì"
- "»Ãоҵ"
- "»ÃоÒÊ"
- "»ÃоÒÌ"
- "»ÃоԳ"
- "»Ãоط¸ì"
- "»ÃÐÀÑÊÊÃ"
- "»ÃÐÀÒ"
- "»ÃÐÀÒ¤ÒÃ"
- "»ÃÐÀÒ¾"
- "»ÃÐÀÒÊ"
- "»ÃÐÁ§"
- "»ÃÐÁÇ­"
- "»ÃÐÁÇÅ"
- "»ÃÐÁÒ³"
- "»ÃÐÁÒ·"
- "»ÃÐÁØ¢"
- "»ÃÐÁØ·"
- "»ÃÐÁÙÅ"
- "»ÃÐÂØ¡µì"
- "»ÃÐÂØ·¸ì"
- "»ÃÐÂÙÃ"
- "»ÃÐÅÁ¾ì"
- "»ÃÐÅͧ"
- "»ÃÐÅÑÂ"
- "»ÃÐÅÒµ"
- "»ÃÐÇÃõ"
- "»ÃÐÇÃõ¹ì"
- "»ÃÐÇѵÔ"
- "»ÃÐÇѵԡÒóì"
- "»ÃÐÇѵÔÈÒʵÃì"
- "»ÃÐÇÒµ"
- "»ÃÐÇÒÅ"
- "»ÃÐÇÒÊ"
- "»ÃÐÇÔ§"
- "»ÃÐÇÔª"
- "»ÃÐÇÔµÃ"
- "»ÃÐÇÕ³"
- "»ÃÐÈÁ"
- "»ÃÐÈÒʹì"
- "»ÃÐÊ¡"
- "»ÃÐʧ¤ì"
- "»ÃÐʺ"
- "»ÃÐʺ¡Òóì"
- "»ÃÐʾ"
- "»ÃÐÊÒ"
- "»ÃÐÊÒ·"
- "»ÃÐÊÒ¹"
- "»ÃÐÊÔ·¸Ô¼Å"
- "»ÃÐÊÔ·¸ÔÀÒ¾"
- "»ÃÐÊÔ·¸Ôì"
- "»ÃÐÊÙµÔ"
- "»ÃÐËÁèÒ"
- "»ÃÐËÂÑ´"
- "»ÃÐËÅÒ´"
- "»ÃÐËÅèÓ"
- "»ÃÐËÒÃ"
- "»ÃÐÎÒÁ"
- "»ÃÐह"
- "»ÃÐਡ"
- "»ÃÐà¨Ô´»ÃÐà¨éÍ"
- "»ÃÐà¨Õ´"
- "»ÃÐà´"
- "»ÃÐà´ÔÁ"
- "»ÃÐà´Õ§"
- "»ÃÐà´ÕëÂÇ"
- "»ÃÐà´ÕëÂÇ»ÃдëÒÇ"
- "»ÃÐà´ç¹"
- "»ÃÐà·È"
- "»ÃÐà·ÈÃÒª"
- "»ÃÐà·Èä·Â"
- "»ÃÐà·×ͧ"
- "»ÃÐླÕ"
- "»ÃÐàÀ·"
- "»ÃÐàÁÔ¹"
- "»ÃÐàdzÕ"
- "»ÃÐàÇÈ"
- "»ÃÐàÇȹì"
- "»ÃÐàÊÃÔ°"
- "»ÃÐá¡¡"
- "»ÃÐá¨"
- "»ÃÐâ¤Á"
- "»ÃÐâ¤"
- "»ÃÐ⪹ì"
- "»ÃÐâÅÁ"
- "»ÃÑ¡"
- "»Ãѧ"
- "»ÃѪ­Ò"
- "»ÃÑµÂØµºÑ¹"
- "»ÃÑµÂØºÑ¹"
- "»Ãѹ"
- "»ÃѺ"
- "»ÃÑÁ»ÃÒ"
- "»ÃÑȹÕ"
- "»ÃÑÈÇì"
- "»ÃÒ¡¯"
- "»ÃÒ¡ÃÁ"
- "»ÃÒ¡ÒÃ"
- "»ÃÒ¤ÀÒÃ"
- "»ÃÒ§"
- "»ÃÒ§¤ì"
- "»ÃÒ¨Õ¹"
- "»ÃÒª­Ò"
- "»ÃÒª­ì"
- "»ÃÒªÑÂ"
- "»ÃÒªÔµ"
- "»ÃÒ³"
- "»ÃÒ³Õ"
- "»ÃÒ´"
- "»ÃÒ¹Õ"
- "»ÃÒº"
- "»ÃÒº´ÒÀÔàÉ¡"
- "»ÃÒ»µì"
- "»ÃÒÀ¾"
- "»ÃÒÁ"
- "»ÃÒÁÒÊ"
- "»ÃÒÂ"
- "»ÃÒö¹Ò"
- "»ÃÒÃÀ"
- "»ÃÒÃÁÀì"
- "»ÃÒÈ"
- "»ÃÒÈÃÑÂ"
- "»ÃÒÈÒÃ"
- "»ÃÒɳÕ"
- "»ÃÒÉÒ³"
- "»ÃÒÊÒ·"
- "»ÃÒâÁª"
- "»ÃÒâÁ·Âì"
- "»ÃÓ"
- "»ÃÔ"
- "»ÃÔ¡"
- "»ÃÔ¤³Ëì"
- "»ÃÔ¨Ò¤"
- "»ÃÔ¨ÒÃÔ¡Ò"
- "»ÃÔ«ÖÁ"
- "»ÃÔ­­Ò"
- "»ÃÔ³ÒÁ"
- "»ÃÔ³Ò¡"
- "»ÃÔµ"
- "»ÃÔµµÐ"
- "»ÃÔµÃ"
- "»ÃÔ·ÃÃȹì"
- "»ÃÔ·Ñȹì"
- "»ÃÔ¹"
- "»ÃÔ¹Êì"
- "»ÃÔ¹Ô¾¾Ò¹"
- "»ÃÔº"
- "»ÃÔÁ³±Å"
- "»ÃÔÁÑ·"
- "»ÃÔÁÒ³"
- "»ÃÔÁÒµÃ"
- "»ÃÔÂѵÔ"
- "»ÃÔÂÒÂ"
- "»ÃÔÇÃõ"
- "»ÃÔÇÒÊ"
- "»ÃÔȹÒ"
- "»ÃÔà©·"
- "»ÃÔèÁ"
- "»ÃÕªÒ"
- "»ÃÕ´Ò"
- "»ÃÕ´Ôì"
- "»ÃÕÂÒ"
- "»ÃÕè"
- "»ÃÕê´"
- "»ÃÖ¡ÉÒ"
- "»Ã×Í"
- "»Ã×ëÍ"
- "»ÃØ"
- "»Ãا"
- "»ÃÙ´"
- "»ÃÙê´»ÃêÒ´"
- "»ÃÙê¿"
- "»ÃàÁ¹·Ãì"
- "»ÃâÅ¡"
- "»ÃèÒ"
- "»ÃëÍ"
- "»Ä¨©Ò"
- "»Äɮҧ¤ì"
- "»Å¡"
- "»Å§"
- "»Å´"
- "»ÅÇ¡"
- "»ÅÍ¡"
- "»ÅÍ´"
- "»ÅÍ´ÀÑÂ"
- "»Åͺ"
- "»ÅÍÁ"
- "»ÅÐ"
- "»ÅÑ¡"
- "»ÅÑ´"
- "»ÅÑè§"
- "»ÅÑê¡"
- "»ÅÑê¡ÍÔ¹"
- "»ÅÒ"
- "»ÅÒµ"
- "»ÅÒº"
- "»ÅÒÂ"
- "»ÅÒÇÒÌ"
- "»ÅÒʹҡÒÃ"
- "»ÅÒÊàµÍÃì"
- "»ÅÔ§"
- "»ÅÔ´"
- "»ÅÔÇ"
- "»ÅÔ⾸"
- "»ÅÔèÁ"
- "»ÅÔé¹"
- "»ÅÕ"
- "»ÅÕ¡"
- "»Å×éÁ"
- "»ÅØ¡"
- "»ÅÙ¡"
- "»Åè§"
- "»Åèͧ"
- "»ÅèÍÂ"
- "»Åé¹"
- "»Åéͧ"
- "»Åé͹"
- "»ÅéÓ"
- "»Ç¡à»Õ¡"
- "»Ç§"
- "»Ç´"
- "»ÇÒóÒ"
- "»ÈØ"
- "»Í"
- "»Í¡"
- "»Í§"
- "»Í´"
- "»Í¹"
- "»Í¹´ì"
- "»Íº"
- "»ÍÂ"
- "»ÍÃì"
- "»ÍÃìµØà¡Ê"
- "»Ð"
- "»Ð¡¹"
- "»Ð¡ÒÃѧ"
- "»Ð¢ÒÇ"
- "»Ð·Ð"
- "»Ð·Ø"
- "»Ð˧Ѻ"
- "»ÐàËÅÒÐ"
- "»ÐáÅèÁ"
- "»Ðâŧ"
- "»Ñ¡"
- "»Ñ¡¡Ôè§"
- "»Ñ¡ÉÒ"
- "»Ñ¡ÉÒÇÊÒ¹"
- "»Ñ¡ÉÔ³"
- "»Ñ¡ÉÔ¹"
- "»Ñ¡ÉÕ"
- "»Ñ¡Éì"
- "»Ñ¡à»éÒ"
- "»Ñ§"
- "»Ñ§ÊØ¡ØÅ"
- "»Ñ¨¨Ñ¹µ¤ÒÁ"
- "»Ñ¨¨Ñ¹µª¹º·"
- "»Ñ¨¨Ñ¹µ»ÃÐà·È"
- "»Ñ¨¨Ñ¹µì"
- "»Ñ¨¨ÑÂ"
- "»Ñ¨¨ÒÁÔµÃ"
- "»Ñ¨¨ØºÑ¹"
- "»Ñ¨¨ØÊÁÑÂ"
- "»Ñ¨©Ò"
- "»Ñ¨©ÔÁ"
- "»Ñ¨à¨¡"
- "»Ñ­¨ÇѤ¤ÕÂì"
- "»Ñ­­Ò"
- "»Ñ­ËÒ"
- "»Ñ´"
- "»ÑµµÒ¹Õ"
- "»ÑµµÒàÇÕÂ"
- "»Ñ·Áì"
- "»Ñ¹"
- "»Ñº"
- "»Ñ»¼ÒÊÐ"
- "»ÑÊÊÒÇÐ"
- "»ÑÊÊÒÊÐ"
- "»Ñè¹"
- "»Ñé¹"
- "»Ñêº"
- "»ÑêÁ"
- "»Ñë§"
- "»Ò"
- "»Ò¡"
- "»Ò¡¡Ò"
- "»Ò¡Õʶҹ"
- "»Ò§"
- "»Ò¯ÔËÒÃÔÂì"
- "»Ò°¡"
- "»Ò°¡¶Ò"
- "»Ò³ÒµÔºÒµ"
- "»Ò´"
- "»ÒµÔâÁ¡¢ì"
- "»Ò·Ñ§¡Ò"
- "»Ò·èͧâ¡ë"
- "»Ò¹"
- "»Ò»ÑÇ"
- "»ÒÁ"
- "»ÒÂÒÊ"
- "»ÒÃÒªÔ¡"
- "»ÒÃԩѵÃ"
- "»ÒÃÔªÒµ"
- "»ÒÃÕÊ"
- "»ÒÃìࡵì"
- "»ÒÅÕ"
- "»ÒÅìÁ"
- "»ÒÇ"
- "»Ò˹ѹ"
- "»ÒËÕè"
- "»ÒâÁ¡¢ì"
- "»Ó"
- "»Ô¡¹Ô¡"
- "»Ô§»Í§"
- "»Ô®¡"
- "»Ô´"
- "»ÔµÒ"
- "»ÔµÔ"
- "»ÔµØ"
- "»ÔµØ¦Òµ"
- "»ÔµØÀÙÁÔ"
- "»ÔµØÅÒ"
- "»ÔÂÁÔµÃ"
- "»ÔÂÐ"
- "»ÔÈÒ¨"
- "»ÔâµÃàÅÕÂÁ"
- "»ÔâÂÃÊ"
- "»Ôè¹"
- "»Ôè¹âµ"
- "»ÔèÁ"
- "»Ôé§"
- "»ÔéÁ"
- "»ÔëÇ"
- "»Õ"
- "»Õ¡"
- "»Õ¹"
- "»Õº"
- "»ÕÁÐâÇé"
- "»ÕÈÒ¨"
- "»Õè"
- "»Õé"
- "»Õê´"
- "»Õêº"
- "»Õë"
- "»Ö¡"
- "»Ö§"
- "»Öè§"
- "»Öé´"
- "»Öë§"
- "»×¹"
- "»×é¹"
- "»×ëÍ"
- "ȯ"
- "»Ø¡"
- "»Ø¨©Ò"
- "»Ø´"
- "»Ø¶Øª¹"
- "»Øº"
- "»ØÂ"
- "»ØâÃËÔµ"
- "»ØèÁ"
- "»Øé§¡Õë"
- "»ØéÁ"
- "»Øê"
- "»Øêº"
- "»ØëÁ"
- "»ØëÂ"
- "»Ù"
- "»Ùª¹Õºؤ¤Å"
- "»Ùª¹ÕÂÇѵ¶Ø"
- "»Ù´"
- "»Ù¹"
- "»ÙÁ"
- "»Ùè"
- "»ÙéÂÕé»ÙéÂÓ"
- "»àdzÕ"
- "»è¹"
- "»èǧ"
- "»èǹ"
- "»èÇÂ"
- "»èͧ"
- "»èÒ"
- "»èÒ¹"
- "»èÒÂ"
- "»èÒÇ"
- "»éǹ"
- "»éǹà»Õé¹"
- "»éÍ"
- "»éͧ"
- "»éͧ¡Ñ¹"
- "»é͹"
- "»éÍÁ"
- "»éÍÂ"
- "»éÍá»é"
- "»éÒ"
- "»éÒ§"
- "»éÒ¹"
- "»éÒº"
- "»éÒÂ"
- "»éÓ"
- "»êÍ¡¡Õé"
- "»êÒº"
- "»ëÍ"
- "»ëÍÁ"
- "»ëÒ"
- "¼¡"
- "¼¡Ò"
- "¼¡ÒÂ"
- "¼§"
- "¼§¡"
- "¼§Ð"
- "¼§Ò´"
- "¼¨§"
- "¼¨­"
- "¼´"
- "¼´Ø§"
- "¼¹Ç¡"
- "¼¹Çª"
- "¼¹Ñ§"
- "¼¹Ö¡"
- "¼Á"
- "¼Áºêͺ"
- "¼Âͧ"
- "¼ÃØÊÇÒ·"
- "¼Å"
- "¼ÅÐ"
- "¼ÅÑ¡"
- "¼ÅÑ´"
- "¼ÅÑÇÐ"
- "¼ÅÒ­"
- "¼ÅÒ¹ÔʧÊì"
- "¼ÅÒ¼Å"
- "¼ÅÒËÒÃ"
- "¼ÅÔ"
- "¼ÅÔµ"
- "¼ÅÔµÀѳ±ì"
- "¼ÅÕ¼ÅÒÁ"
- "¼ÅÖ¡"
- "¼ÅÖè§"
- "¼ÅØ"
- "¼Åا"
- "¼ÅØ´"
- "¼Åع"
- "¼Åغ"
- "¼ÅØÂ"
- "¼ÅÙ"
- "¼ÅçÍÂ"
- "¼Ç¹"
- "¼ÇÂ"
- "¼ÇÒ"
- "¼ÊÁ"
- "¼ÊÒ¹"
- "¼ÊÒÂ"
- "¼Í¡"
- "¼Í§"
- "¼Í´"
- "¼Íº"
- "¼ÍÁ"
- "¼ÍÇ´"
- "¼ÍÙ¹"
- "¼Ð"
- "¼Ñ¡"
- "¼Ñ§"
- "¼Ñ´"
- "¼Ñ¹"
- "¼Ñ¹¼Ç¹"
- "¼Ñº"
- "¼ÑÇ"
- "¼ÑÇÐ"
- "¼Ò"
- "¼Ò¡"
- "¼Ò§"
- "¼Ò³Ôµ"
- "¼Ò´"
- "¼ÒÂ"
- "¼Ô"
- "¼Ô§"
- "¼Ô´"
- "¼Ô¹"
- "¼ÔÇ"
- "¼Õ"
- "¼Ö§"
- "¼Öè§"
- "¼Öé§"
- "¼×¹"
- "¼×è¹"
- "¼Ø"
- "¼Ø´"
- "¼ØÂ¼§"
- "¼Ù¡"
- "¼Ùé"
- "¼çÍÂ"
- "¼èͧ"
- "¼è͹"
- "¼èÍÂ"
- "¼èÒ"
- "¼èÒ¹"
- "¼èÒ¼ÍÁ"
- "¼èÒÇ"
- "¼éÒ"
- "½¹"
- "½ÃÑè§"
- "½ÃÑè§àÈÊ"
- "½ÍÂ"
- "½Ñ¡"
- "½Ñ§"
- "½Ñ´"
- "½Ñ¹"
- "½Ñè§"
- "½Ò"
- "½Ò¡"
- "½Ò§"
- "½Ò´"
- "½Ò¹"
- "½ÒÂ"
- "½Ôè¹"
- "½Õ"
- "½Ö¡"
- "½×´"
- "½×¹"
- "½Øè¹"
- "½Ù§"
- "½èÍ"
- "½èÒ"
- "½èÒÂ"
- "½éÒ"
- "½éÒÂ"
- "¾¡"
- "¾§"
- "¾§ÈÒÇ´ÒÃ"
- "¾§Èì"
- "¾¨¹Ò"
- "¾¨¹Ò¹Ø¡ÃÁ"
- "¾¨¹Òö"
- "¾¨¹ÕÂì"
- "¾¨¹ì"
- "¾¨ÁÒ¹"
- "¾¨Õ"
- "¾­Ò"
- "¾­ÒÅÍ"
- "¾³Ôª"
- "¾³ÔªÂì"
- "¾´"
- "¾¸Ù"
- "¾¹Á"
- "¾¹Ñ¡"
- "¾¹Ñ¡§Ò¹"
- "¾¹Ñ§"
- "¾¹Ñ¹"
- "¾¹ÑÊ"
- "¾¹Ò"
- "¾¹Ò´Ã"
- "¾¹ÒÃÒÁ"
- "¾¹ÒÅÑÂ"
- "¾¹Ô´Ò"
- "¾º"
- "¾ÁèÒ"
- "¾Â¹µì"
- "¾ÂÈ"
- "¾ÂÑ¡"
- "¾ÂÑ¡¾àÂÔ´"
- "¾ÂѤ¦Ò"
- "¾ÂѤ¦Ô¹"
- "¾ÂѤ¦Õ"
- "¾ÂѤ¦ì"
- "¾ÂÑ­ª¹Ð"
- "¾Âѵ"
- "¾ÂѺ"
- "¾Âҡóì"
- "¾ÂÒ§¤ì"
- "¾ÂÒ¸Ô"
- "¾ÂÒ¹"
- "¾ÂÒºÒ·"
- "¾ÂÒºÒÅ"
- "¾ÂÒÂÒÁ"
- "¾ÂØ"
- "¾Âا"
- "¾ÂØËÂÒµÃÒ"
- "¾ÂØËÐ"
- "¾ÂØËàʹÒ"
- "¾Ã"
- "¾Ãµ"
- "¾ÃÁ"
- "¾ÃÃ"
- "¾Ãä"
- "¾Ãäì"
- "¾Ãó"
- "¾Ãó¹Ò"
- "¾ÃÃÉ"
- "¾ÃÃÉÒ"
- "¾ÃÇ´"
- "¾Ãǹ"
- "¾ÃËÁ"
- "¾ÃËÁ¨ÃÃÂì"
- "¾ÃËÁ¨ÒÃÔ³Õ"
- "¾ÃËÁ¨ÒÃÕ"
- "¾ÃÍ´"
- "¾ÃÐ"
- "¾ÃÐÃÒªÇѧ"
- "¾ÃÐͧ¤ì"
- "¾ÃÐà¨éÒÍÂÙèËÑÇ"
- "¾ÃÑ¡¾ÃéÍÁ"
- "¾ÃÑ´"
- "¾ÃÑè§"
- "¾ÃÑè¹"
- "¾ÃÒ¡"
- "¾ÃÒ§"
- "¾ÃÒ´"
- "¾ÃÒ¹"
- "¾ÃÒÂ"
- "¾ÃÒÇ"
- "¾ÃÒËÁ³ì"
- "¾ÃÓ"
- "¾ÃÔ¡"
- "¾ÃÔ¹àµÍÃì"
- "¾ÃÔº"
- "¾ÃÔé§"
- "¾ÃÔéÁ"
- "¾ÃÕàÁÕÂÁ"
- "¾ÃÕàÁÕÂÃì"
- "¾ÃÖ§"
- "¾ÃÖ¹"
- "¾ÃÖº"
- "¾Ã×´"
- "¾ÃØ"
- "¾ÃØ¡"
- "¾Ãع"
- "¾ÃØè§"
- "¾ÃÙ"
- "¾ÃÙ´"
- "¾Ãèͧ"
- "¾ÃèÍÁ¾ÃéÍ"
- "¾ÃèÍÂ"
- "¾ÃèÒ"
- "¾ÃèÒ§"
- "¾ÃèÓ"
- "¾Ãéͧ"
- "¾ÃéÍÁ"
- "¾ÃéÍÁ¾ÃÑ¡"
- "¾ÃéÍÂ"
- "¾ÃéÒ"
- "¾ÃéÓ"
- "¾Ä¡ÉªÒµÔ"
- "¾Ä¡É·Å"
- "¾Ä¡ÉÃÒª"
- "¾Ä¡ÉÈÒʵÃì"
- "¾Ä¡ÉÒ"
- "¾Ä¡Éà·Ç´Ò"
- "¾Ä¡Éì"
- "¾Ä²"
- "¾Ä²Ò"
- "¾Ä²Ò¨ÒÃÂì"
- "¾Ä²Ô"
- "¾Äµ"
- "¾ÄµÔ"
- "¾ÄµÔ¡ÃÃÁ"
- "¾ÄµÔ¡Òóì"
- "¾ÄµÔ¹ÑÂ"
- "¾Ä·¸Ôì"
- "¾Ä·¸ì"
- "¾Ä¹µì"
- "¾Ä¹·ì"
- "¾ÄȨÔ"
- "¾ÄȨԡÒ¹"
- "¾ÄÉÀ"
- "¾ÄÉÀÒ¤Á"
- "¾ÄËÑÊ"
- "¾ÄËÑʺ´Õ"
- "¾Å"
- "¾Å¡ÒÃ"
- "¾Å¤ÇÒÁ"
- "¾Åº"
- "¾Åǧ"
- "¾ÅÇѵ"
- "¾ÅÈÖ¡ÉÒ"
- "¾Åͧ"
- "¾ÅÍ´"
- "¾ÅÍÁá¾ÅÁ"
- "¾ÅÍÂ"
- "¾ÅÐ"
- "¾Åѧ"
- "¾Åѧ§Ò¹"
- "¾ÅÑ´"
- "¾Åѹ"
- "¾ÅѺ"
- "¾ÅѺ¾ÅÒ"
- "¾ÅѺ¾ÅÖ§"
- "¾ÅÑè¡"
- "¾ÅÑè§"
- "¾ÅÑèÇ"
- "¾ÅÑé§"
- "¾ÅÒ¡Ã"
- "¾ÅÒ§"
- "¾ÅÒ´"
- "¾ÅÒ¸Ô¡ÒÃ"
- "¾ÅÒ¹ÒÁÑÂ"
- "¾ÅÒÁ"
- "¾ÅÒÂ"
- "¾ÅÒʵԡ"
- "¾ÅÒÊÁÒ"
- "¾ÅÒË¡"
- "¾ÅÔ¡"
- "¾ÅÔéÇ"
- "¾ÅÕ"
- "¾ÅØ"
- "¾ÅØ¡"
- "¾ÅØè¡"
- "¾ÅØè§"
- "¾ÅØéÂ"
- "¾ÅÙ"
- "¾ÅàÁ×ͧ"
- "¾ÅàÃ×͹"
- "¾ÅâÅ¡"
- "¾ÅèÍÂ"
- "¾ÅèÒ"
- "¾ÅèÒ¹"
- "¾ÅèÒÁ"
- "¾ÅéÓ"
- "¾Ç¡"
- "¾Ç§"
- "¾Ç¹"
- "¾ÇÂ"
- "¾Ê¡"
- "¾ÊظÒ"
- "¾ËÅ"
- "¾ËÅâ¸Թ"
- "¾ËØ"
- "¾ËÙ"
- "¾ËÙ¾¨¹ì"
- "¾ËÙÊÙµ"
- "¾Í"
- "¾Í¡"
- "¾Í§"
- "¾Í·ÑÅ"
- "¾ÍÃìµ"
- "¾Ð"
- "¾Ð¾Ô§"
- "¾ÐÂÙ¹"
- "¾ÐÃØ§¾ÐÃѧ"
- "¾Ðǧ"
- "¾ÐÇÑ¡¾Ðǹ"
- "¾ÐÇéÒ¾ÐÇѧ"
- "¾Ðͧ"
- "¾ÐÍ×´¾ÐÍÁ"
- "¾Ðà¹Õ§"
- "¾Ðà¹éҾйÍ"
- "¾ÐàÂÔº"
- "¾ÐàÂÔº¾ÐÂÒº"
- "¾Ðá¹§"
- "¾ÐâÅé"
- "¾Ñ¡"
- "¾Ñ¡µÃì"
- "¾Ñ§"
- "¾Ñ§§Ò"
- "¾Ñ§¼×´"
- "¾Ñ§¾ÇÂ"
- "¾Ñ§¾Í¹"
- "¾Ñ§¾Òº"
- "¾Ñ§à¾Â"
- "¾ÑªÃ"
- "¾Ñ²¹Ð"
- "¾Ñ²¹Ò"
- "¾Ñ´"
- "¾ÑµÃ"
- "¾Ñ·¸ÊÕÁÒ"
- "¾Ñ·ÂÒ"
- "¾Ñ·Åا"
- "¾Ñ¹"
- "¾Ñ¹·Ò§"
- "¾Ñ¹¸¡Ã³Õ"
- "¾Ñ¹¸·Ô¾Âì"
- "¾Ñ¹¸¹Ò¡ÒÃ"
- "¾Ñ¹¸ºÑµÃ"
- "¾Ñ¹¸ÁÔµÃ"
- "¾Ñ¹¸Ð"
- "¾Ñ¹¸Ø"
- "¾Ñ¹¸Øì"
- "¾Ñ¹¸ì"
- "¾Ñº"
- "¾ÑÅÅÀ"
- "¾ÑÅÇѹ"
- "¾ÑÇ"
- "¾ÑÇÐ"
- "¾ÑÈ´Õ"
- "¾ÑÊ´Ø"
- "¾ÑʵÃì"
- "¾Ñʶҹ"
- "¾Ò"
- "¾Ò¡"
- "¾Ò¡Âì"
- "¾Ò§"
- "¾Ò³"
- "¾Ò³Ôª"
- "¾Ò³ÔªÂì"
- "¾Ò³Õ"
- "¾Ò³Õ¹Õ"
- "¾Ò´"
- "¾Òµ"
- "¾Ò·"
- "¾Ò·Âì"
- "¾Ò¸"
- "¾Ò¸Ò"
- "¾Ò¹"
- "¾Ò¹Ã"
- "¾ÒÁ"
- "¾ÒÂ"
- "¾ÒÂѾ"
- "¾ÒÂØ"
- "¾Òó"
- "¾ÒÃÒ"
- "¾ÒÃÒ¿Ô¹"
- "¾ÒÃì"
- "¾ÒÅ"
- "¾ÒÅÕ"
- "¾ÒÊ"
- "¾ÒʹÒ"
- "¾Òʹì"
- "¾ÒÊØ¡ÃÕ"
- "¾ÒÊàÇÔÃì´"
- "¾Ò˹Ð"
- "¾ÒËÐ"
- "¾ÒËÒ"
- "¾ÒËØ"
- "¾ÒËØÃÑ´"
- "¾ÒÌËÐ"
- "¾Òà¹Å"
- "¾ÒàËô"
- "¾ÒàËÕÂÃ"
- "¾ÒâÅ"
- "¾Ó"
- "¾Ó¹Ñ¡"
- "¾Ô¡Å"
- "¾Ô¡Ñ´"
- "¾Ô¡ÑµÔ"
- "¾Ô¡ÒÃ"
- "¾Ô¡ØÅ"
- "¾Ô¦Òµ"
- "¾Ô¦à¹È"
- "¾Ô§"
- "¾Ô¨ÒóÒ"
- "¾Ô¨Òóì"
- "¾Ô¨ÔµÃ"
- "¾ÔªÑÂ"
- "¾ÔªÒ¹"
- "¾ÔªÔµ"
- "¾Ô««èÒ"
- "¾Ô³"
- "¾Ô¶Õ¾Ô¶Ñ¹"
- "¾Ô·ÂÒ"
- "¾Ô·Ñ¡Éì"
- "¾Ô¸Ò¹"
- "¾Ô¸Õ"
- "¾Ô¹·Ø"
- "¾Ô¹Íº¾Ôà·Ò"
- "¾Ô¹ÑÂ"
- "¾Ô¹ÒÈ"
- "¾Ô¹Ô¨"
- "¾Ô¹Ôµ"
- "¾Ô¹ÔÈ"
- "¾ÔºÑµÔ"
- "¾ÔºÙÅ"
- "¾Ô¾Áì"
- "¾Ô¾Ñ¡¾Ô¾èǹ"
- "¾Ô¾Ñ²¹ì"
- "¾Ô¾Ò¡ÉÒ"
- "¾Ô¾Ò¡Éì"
- "¾Ô¾Ò·"
- "¾Ô¾Ô¸"
- "¾Ô¾Ô¸Àѳ±Ê¶Ò¹"
- "¾Ô¾Ô¸Àѳ±ì"
- "¾ÔÀ¾"
- "¾ÔÁ¾ì"
- "¾ÔÁÅ"
- "¾ÔÁÒ¹"
- "¾ÔÁØ¢"
- "¾ÔÁàʹ"
- "¾ÔÃÍ´"
- "¾ÔÃÒº"
- "¾ÔÃÒÅÑÂ"
- "¾ÔÃÕé¾ÔäÃ"
- "¾ÔÃØ³"
- "¾ÔÃØ¸"
- "¾ÔÅÒ»"
- "¾ÔÅÒÊ"
- "¾ÔÅÖ¡"
- "¾ÔÅÖ¡¡Ö¡¡×Í"
- "¾ÔÅÖ¡¾ÔÅÑè¹"
- "¾ÔÈ"
- "¾ÔÈǧ"
- "¾ÔÈÇÒÊ"
- "¾ÔÈÒÅ"
- "¾ÔÈØ·¸Ôì"
- "¾ÔÈØ·¸ì"
- "¾ÔÉ"
- "¾ÔɳØâÅ¡"
- "¾ÔÉʧ"
- "¾ÔÊ´ÒÃ"
- "¾ÔÊÁÑÂ"
- "¾ÔÊÑÂ"
- "¾ÔÊÔ°"
- "¾ÔÊØ·¸Ôì"
- "¾ÔÊÙ¨¹ì"
- "¾ÔËÒÃ"
- "¾ÔÌÒÃ"
- "¾Ôà¤ÃÒÐËì"
- "¾ÔàÈÉ"
- "¾Ô⡾Ôࡹ"
- "¾Ôâ¤"
- "¾Ôâø"
- "¾ÔäÃ"
- "¾ÔäÅ"
- "¾Õ"
- "¾Õª¤³Ôµ"
- "¾Õ«Õ"
- "¾ÕÃÐÁÔ´"
- "¾Õè"
- "¾Õé"
- "¾Ö§"
- "¾ÖÁ"
- "¾ÖÁ¾Ó"
- "¾Öè§"
- "¾Öèº"
- "¾×ª"
- "¾×´"
- "¾×é¹"
- "¾×é¹·Õè"
- "¾Ø"
- "¾Ø¡"
- "¾Ø§"
- "¾Ø²"
- "¾Ø²Ô"
- "¾Ø´"
- "¾Ø·¸"
- "¾Ø·¸Ð"
- "¾Ø·¸ÒÇÒÊ"
- "¾Ø·¸Ô"
- "¾Ø·ÃÒ"
- "¾Ø·â¸è"
- "¾Ø¸"
- "¾Øè§"
- "¾ØèÁ"
- "¾ØéÂ"
- "¾Ù"
- "¾Ù´"
- "¾Ù¹"
- "¾Ùè"
- "¾Ùé¹"
- "¾à¹¨Ã"
- "¾è¹"
- "¾èǧ"
- "¾èÍ"
- "¾èÒ§"
- "¾èÒ¹"
- "¾èÒÂ"
- "¾èÒËì"
- "¾é¹"
- "¾éÍ"
- "¾éͧ"
- "¾éÍÁ"
- "¿¡"
- "¿ÃÍ´ì"
- "¿ÃÕ"
- "¿ÅÍàù«ì"
- "¿ÅÙÍÍÃÕ¹"
- "¿Í¡"
- "¿Í§"
- "¿Í´"
- "¿Í¹"
- "¿Í¹µì"
- "¿ÍÃìÁ"
- "¿ÍÃìÁÒÅ´Õäδì"
- "¿ÍÃìÁÒÅÔ¹"
- "¿ÍÃìáÁµ"
- "¿ÍÊ«ÔÅ"
- "¿ÍÊ¿ÍÃÑÊ"
- "¿ÍÊ࿵"
- "¿Ñ¡"
- "¿Ñ§"
- "¿Ñ§¡ìªÑ¹"
- "¿Ñ§¡ìªÑè¹"
- "¿Ñ´"
- "¿Ñ¹"
- "¿Ñè¹"
- "¿Ñé¹"
- "¿Ò¡"
- "¿Ò§"
- "¿Ò´"
- "¿Ò·ÍÁ"
- "¿Ò¹"
- "¿ÒÂ"
- "¿ÒÃìÁ"
- "¿ÒÊ«Ôʵì"
- "¿Ô¡"
- "¿Ô´"
- "¿Ô¹áŹ´ì"
- "¿Ôº"
- "¿ÔÅ´ì"
- "¿ÔÅÔ»»Ô¹Êì"
- "¿ÔÅìÁ"
- "¿ÔÇÊì"
- "¿ÔÊÔ¡Êì"
- "¿Õ¿èÒ"
- "¿Õè"
- "¿Õé"
- "¿×¹"
- "¿×Á"
- "¿×é¹"
- "¿Ø"
- "¿Øµ"
- "¿ØµºÍÅ"
- "¿Ø¹"
- "¿Øº"
- "¿Ø¿Ð"
- "¿ØÅÊá¡ê»"
- "¿Øèº"
- "¿ØèÁà¿×ÍÂ"
- "¿Øé§"
- "¿Ù"
- "¿Ù¡"
- "¿Ù¨Ô"
- "¿Ù´"
- "¿ÙÁ"
- "¿ÙÁ¿ÒÂ"
- "¿Ùè"
- "¿èÍ"
- "¿èͧ"
- "¿è͹"
- "¿èÒ§"
- "¿èÒÁ"
- "¿éÍ"
- "¿éͧ"
- "¿é͹"
- "¿éÒ"
- "À¤¹Õ"
- "À¾"
- "ÀÁÃ"
- "ÀÂѹµÃÒÂ"
- "Àõ"
- "ÀÃÃ"
- "ÀÃÃÂÒ"
- "ÀÃÒ´Ã"
- "ÀÃÔÂÒ"
- "ÀǵѳËÒ"
- "ÀÇѧ¤ì"
- "ÀÑ¡´Õ"
- "ÀÑ¡ÉÒ"
- "ÀÑ¡ÉÒËÒÃ"
- "Àѳ±ì"
- "ÀѵµÒ¤ÒÃ"
- "ÀѵµÒËÒÃ"
- "ÀÑ·Ã"
- "ÀѾ"
- "ÀÑÂ"
- "ÀÑÊ´Ò"
- "ÀÑʵÃÒ"
- "ÀÒ¤"
- "ÀÒ¤Õ"
- "ÀÒª¹Ð"
- "ÀÒ³Ø"
- "ÀÒ¾"
- "ÀҾ¹µÃì"
- "ÀÒÂ"
- "ÀÒÃ"
- "ÀÒáԨ"
- "ÀÒôÕ"
- "ÀÒõ"
- "ÀÒÃÐ"
- "ÀÒÃÒ"
- "ÀÒÃâç"
- "ÀÒǹÒ"
- "ÀÒÇÐ"
- "ÀÒÉ"
- "ÀÒÉ¡"
- "ÀÒɳì"
- "ÀÒÉÒ"
- "ÀÒÉÔµ"
- "ÀÒÉÕ"
- "ÀÒÊ¡Ã"
- "ÀÒʹì"
- "ÀÒÊÇÃ"
- "ÀÔ¡¢Ò"
- "ÀÔ¡¢Ò¨ÒÃ"
- "ÀÔ¡¢Ø"
- "ÀÔ¡¢Ø¹Õ"
- "ÀÔ¡ÉÒ"
- "ÀÔ¡ÉØ"
- "ÀÔ¡ÉØ³Õ"
- "ÀÔ§¤ÒÃ"
- "ÀÔ­â­"
- "ÀÔ¹·¹Ò¡ÒÃ"
- "ÀÔ¹·ì"
- "ÀÔÃÁÂì"
- "Àت"
- "Àت§¤ì"
- "ÀØÁÃÒ"
- "ÀØÁÃÔ¹"
- "ÀØÁÃÕ"
- "ÀÙ"
- "ÀÙµ"
- "ÀÙµÔ"
- "ÀÙÁÔ"
- "ÀÙÁÔ»ÃÐà·È"
- "ÀÙÁÔÀÒ¤"
- "ÀÙÁÔÅÓà¹Ò"
- "ÀÙÁÔÈÒʵÃì"
- "ÀÙÁÕ"
- "ÀÙÃÔ"
- "ÀÙÃÕ"
- "ÀÙÇ´Å"
- "ÀÙǹҶ"
- "ÀÙÇ๵Ã"
- "ÀÙÇä¹Â"
- "ÀÙÉÒ"
- "ÀÙÉÔµ"
- "ÀÙà¡çµ"
- "ÀÙè"
- "Á¡"
- "Á¡Ã"
- "Á¡ÃÒ¤Á"
- "Á¡Ø®"
- "Á¡ØÅ"
- "Á§¡Ø®"
- "Á§¤Å"
- "Á³±¡"
- "Á³±»"
- "Á³±Å"
- "Á³Õ"
- "Á³à±ÕÂÃ"
- "Á´"
- "ÁµÔ"
- "Á¸Ø"
- "Á¹"
- "Á¹µÃÕ"
- "Á¹µÃì"
- "Á¹µì"
- "Á¹ÊÔ¡ÒÃ"
- "Á¹ÑÊ"
- "Á¹ÑÊÇÕ"
- "Á¹ÔÅÒ"
- "Á¹ØÉªҵÔ"
- "Á¹ØÉ¸ÃÃÁ"
- "Á¹ØÉÂÈÒʵÃì"
- "Á¹ØÉÂÊÑÁ¾Ñ¹¸ì"
- "Á¹ØÉÂà·¾"
- "Á¹ØÉÂâÅ¡"
- "Á¹ØÉÂì"
- "Á¹à·ÕÂÃ"
- "ÁÂØÃÒ"
- "ÁÂØÃÕ"
- "ÁÂØàÃÈ"
- "ÁÂÙÃ"
- "ÁÃ"
- "Ááµ"
- "ÁóÐ"
- "Áóì"
- "Áô¡"
- "ÁÃä"
- "ÁÃä¹Ò¡"
- "ÁÃäÒ"
- "ÁÃÃÂÒ"
- "ÁÃÃÂÒ·"
- "ÁÃÊØÁ"
- "ÁĤ"
- "ÁĵÂÙ"
- "ÁÅ"
- "ÁÅ·Ô¹"
- "ÁÅÒÂ"
- "ÁÅÒÂÙ"
- "ÁÅéÒ§"
- "Áǹ"
- "ÁÇÂ"
- "ÁÇÅ"
- "ÁË¡ÃÃÁ"
- "ÁËó¾"
- "ÁËÃó¾"
- "ÁËÃʾ"
- "ÁËѹµâ·É"
- "ÁËѹµì"
- "ÁËÑȨÃÃÂì"
- "ÁËÒ"
- "ÁËÒª¹"
- "ÁËÒ´àÅç¡"
- "ÁËÒ´ä·Â"
- "ÁËÒµÁÐ"
- "ÁËÒÂÒ¹"
- "ÁËÒÃÒª"
- "ÁËÒÇÔ·ÂÒÅÑÂ"
- "ÁËÒÈÒÅ"
- "ÁËÒÊÁØ·Ã"
- "ÁËÒËÔ§¤Øì"
- "ÁËÔ§Êì"
- "ÁËÔ´Å"
- "ÁËÔÁÒ"
- "ÁËÖÁÒ"
- "ÁÍ"
- "Áͧ"
- "Áͧâ¡ÅÍ´ì"
- "ÁÍ­"
- "ÁÍ´"
- "Á͹ÔàµÍÃì"
- "Áͺ"
- "ÁÍÁ"
- "ÁÍÁáÁÁ"
- "ÁÍÃͤâ¤"
- "ÁÍÃì¿Õ¹"
- "ÁÍÅâ·Ê"
- "ÁÍÊâ¤Çì"
- "ÁÍàµÍÃì"
- "ÁÐ"
- "ÁСÃÙ´"
- "ÁС͡"
- "ÁСÐâùÕ"
- "ÁТÇÔ´"
- "ÁТÒÁ"
- "ÁТèǧ"
- "ÁФèÒ"
- "ÁЧÑèÇ"
- "ÁЧØÁÁЧÒËÃÒ"
- "ÁЫҧ"
- "Áдѹ"
- "ÁекÐ"
- "ÁеÖè§"
- "ÁеÙÁ"
- "Áеéͧ"
- "ÁйÒÇ"
- "ÁлÃÒ§"
- "ÁоÃéÒÇ"
- "ÁоÅѺ"
- "Áоٴ"
- "ÁÐÁèǧ"
- "ÁÐÂÁ"
- "ÁÐÃÐ"
- "ÁÐÃ×¹"
- "ÁÐÅСÍ"
- "ÁÐÅÔ"
- "ÁÐËÐËÁÑ´"
- "ÁÐÎÍ¡¡Ò¹Õ"
- "ÁÐà¡Å×Í"
- "ÁÐà¢×Í"
- "ÁÐà´×èÍ"
- "ÁÐà¿×ͧ"
- "ÁÐàÃç§"
- "ÁÐàÊç§"
- "ÁÐáÁ"
- "ÁÐâç"
- "ÁÐä¿"
- "ÁÑ¡"
- "ÁÑ¡¡ÐÊѹ"
- "ÁѤ¤Øà·È¡ì"
- "ÁѤ¹Ò¡"
- "ÁѦÇÒ¹"
- "Áѧ¡Ã"
- "Áѧ¤Ø´"
- "Áѧ¤èÒ"
- "ÁѨ¨Ø"
- "ÁѨ©Ò"
- "ÁѪ¬ÔÁÂÒÁ"
- "ÁѪ¬ÔÁÇÑÂ"
- "ÁѪ¬ÔÁÒ"
- "Áѳ±¹ÈÔÅ»ì"
- "Áѳ±¹Ò"
- "ÁÑ´"
- "ÁѵÊÂÒ"
- "ÁÑ·¹Ð"
- "ÁÑ·¹ÕÂÐ"
- "ÁÑ·ÂÐ"
- "ÁѸ°ҹ"
- "ÁѸÂÁ"
- "ÁѸÂÑʶì"
- "Áѹ"
- "焼"
- "ÁÑÁÁÕè"
- "ÁÑÂ"
- "ÁÑŵÔ"
- "ÁÑÅÅÔ¡Ò"
- "ÁÑÇ"
- "ÁÑÈÂÒ"
- "ÁÑʵÒÃì´"
- "ÁÑÊÁÑè¹"
- "ÁÑÊÂÔ´"
- "ÁÑÊÅÔ¹"
- "ÁÑè§"
- "ÁÑè¹"
- "ÁÑèÇ"
- "ÁÒ"
- "ÁÒ¡"
- "ÁÒ¡¡ÇèÒ"
- "ÁÒ¦ºÙªÒ"
- "ÁÒ¦Ð"
- "ÁÒ³¾"
- "ÁÒ³ÇÔ¡Ò"
- "ÁÒ´"
- "ÁÒµÃ"
- "ÁҵáÒÃ"
- "Áҵðҹ"
- "ÁÒµÃÒ"
- "ÁÒµØ"
- "ÁÒµØÅÒ"
- "ÁÒ¹"
- "ÁÒ¹¾"
- "ÁÒ¹Ð"
- "ÁÒ¹Ôµ"
- "ÁÒ¹Õ"
- "ÁÒ¹ØÉ"
- "ÁÒ¹ØÉÂÇÔ·ÂÒ"
- "ÁÒºµÒ¾Ø´"
- "ÁÒÂ"
- "ÁÒÂÒ"
- "ÁÒÂÒÇÕ"
- "ÁÒÃ"
- "ÁÒä"
- "ÁÒôÃ"
- "ÁÒôÒ"
- "ÁÒÃÂÒ"
- "ÁÒÃÂÒ·"
- "ÁÒÃÈÃÕ"
- "ÁÒÃØµ"
- "ÁÒÅÑÂ"
- "ÁÒÅÒàÃÕÂ"
- "ÁÒÅÕ"
- "ÁÒÈ"
- "ÁÒÊ"
- "ÁÒÊàµÍÃì"
- "ÁÒàÅà«ÕÂ"
- "ÁÒâ¤Ã"
- "ÁÒ⹪­ì"
- "ÁÓàÅ×ͧ"
- "ÁÔ"
- "ÁÔ¤ÊÑ­­Õ"
- "ÁÔ¨©Ò"
- "ÁÔ´"
- "ÁÔµÃ"
- "ÁÔµÔ"
- "ÁԶعÒ¹"
- "ÁÔÂѹÁèÒ"
- "ÁÔÅÅÔ¡ÃÑÁ"
- "ÁÔÅÅÔºÒÃì"
- "ÁÔÅÅÔÅÔµÃ"
- "ÁÔÅÅÔàÁµÃ"
- "ÁÔÅÒµ"
- "ÁÔÇÊÔ¤"
- "ÁÔÊ"
- "ÁÔÊ«Ò"
- "ÁÔÊàµÍÃì"
- "ÁÔàµÍÃì"
- "ÁÔè§"
- "ÁÔéÁ"
- "ÁÕ"
- "ÁÕ´"
- "ÁÕ¹"
- "ÁÕ¹Ò¤Á"
- "ÁÕà·¹"
- "ÁÕè"
- "ÁÕèÊÑéÇ"
- "ÁÖ§"
- "ÁÖ¹"
- "Á×´"
- "Á×¹"
- "Á×Í"
- "Á×è¹"
- "Á×éÍ"
- "ÁØ"
- "ÁØ¡"
- "ÁØ¡´Ò"
- "ÁØ¡´ÒËÒÃ"
- "ÁØ¢"
- "篤"
- "ÁبÅÔ¹·ì"
- "ÁØ´"
- "Áص¡Ô´"
- "ÁØ·ÔµÒ"
- "ÁØ·Ø"
- "ÁعԹ·Ãì"
- "ÁعÕ"
- "篼"
- "ÁغÁÔº"
- "ÁØÁ"
- "ÁØÊÅÔÁ"
- "ÁØÊÒ"
- "ÁØè§"
- "ÁØè¹"
- "ÁØèÂ"
- "ÁØé§"
- "ÁÙ¡"
- "ÁÙµÃ"
- "ÁÙ¹"
- "ÁÙÁÁÒÁ"
- "ÁÙÅ"
- "ÁÙŤèÒ"
- "ÁÙŰҹ"
- "ÁÙŹԸÔ"
- "ÁÙà«Í"
- "ÁÙè·Ùè"
- "ÁÙèÅÕè"
- "ÁàËÈÇÃ"
- "ÁàËÊÕ"
- "ÁàËÒÌÒÃ"
- "Áâ¹"
- "Áâ¹ÃÒËì"
- "Áâ¹ÊÒàÃè"
- "ÁâËÃʾ"
- "ÁâËÃз֡"
- "ÁâËÃÕ"
- "ÁâËÌÒÃ"
- "Áèǧ"
- "Áèǹ"
- "Áè͵éÍ"
- "ÁèÍÂ"
- "ÁèÍÎèÍÁ"
- "ÁèÒ¹"
- "ÁèÒÂ"
- "Áéǹ"
- "ÁéÇÂ"
- "ÁéÒ"
- "ÁéÒ¹"
- "ÁéÒÁ"
- "¡"
- "¡Âèͧ"
- "§"
- "§âÂè"
- "µÔ"
- "¶ҡÃÃÁ"
- "¹µÃì"
- "¹µì"
- "ÂÁ"
- "ÂÁ¡"
- "ÂÃç"
- "ÂÅ"
- "傤"
- "ÂÇ´"
- "Âǹ"
- "傼"
- "ÂÈ"
- "ÂÍ"
- "ÂÍ¡"
- "Âͧ"
- "ÂÍ´"
- "Â͹"
- "Âͺ"
- "ÂÍÁ"
- "ÂÐ"
- "ÂÑ¡"
- "ÂÑ¡¢Ô¹Õ"
- "ÂÑ¡¢ì"
- "ÂÑ¡ÂÍ¡"
- "ÂÑ¡ÉÔ³Õ"
- "ÂÑ¡ÉÕ"
- "ÂÑ¡Éì"
- "儤"
- "ÂÑ´"
- "ÂÑ´àÂÕ´"
- "Âѹ"
- "ÂѹµÃ¡ÃÃÁ"
- "ÂѹµÃì"
- "Âѹµì"
- "儼"
- "ÂÑè§Â×¹"
- "ÂÑè¹"
- "ÂÑèÇ"
- "ÂÑé§"
- "ÂÑéÇ"
- "ÂÑéÇàÂÕéÂ"
- "ÂÒ"
- "ÂÒ¡"
- "ÂÒ§"
- "ÂÒ¨¡"
- "ÂÒ´"
- "ÂÒ´Ò"
- "ÂÒµÃ"
- "ÂÒµÃÒ"
- "ÂÒ¹"
- "ÂÒ¹Õ"
- "ÂÒº"
- "ÂÒºéÒ"
- "ÂÒÁ"
- "ÂÒÂ"
- "ÂÒÇ"
- "ÂÓ"
- "ÂÔ¡"
- "ÂÔ§"
- "ÂÔ¹"
- "ÂÔº"
- "ÂÔ»«ÑÁ"
- "ÂÔ»«Õ"
- "ÂÔÁ¹Òʵԡ"
- "ÂÔÇ"
- "ÂÔËÇÒ"
- "ÂÔè§"
- "ÂÔéÁ"
- "ÂÕ"
- "ÂÕ¹"
- "ÂÕÃÒ¿"
- "ÂÕè"
- "ÂÕèÊ¡"
- "ÂÕèʧ"
- "ÂÕèÊØè¹"
- "ÂÕèÊèÒ¹"
- "ÂÕèËÃÐ"
- "ÂÕèËÃèÒ"
- "ÂÕèËéÍ"
- "ÂÖ¡Â×Í"
- "ÂÖ´"
- "Â×´"
- "Â×¹"
- "Â×Á"
- "Â×è¹"
- "Â×éÍ"
- "ÂØ"
- "ÂØ¡µì"
- "ÂØ¤"
- "ÂØ¤Å"
- "寤"
- "ÂØ´"
- "ÂØµÔ"
- "ÂØµÔ¸ÃÃÁ"
- "ÂØ·¸"
- "ÂØ·¸¡ÒÃ"
- "ÂØ·¸¹Ò"
- "ÂØ·¸ì"
- "ÂØ·â¸»¡Ã³ì"
- "导"
- "ÂØ¾´Õ"
- "ÂØ¾Â§"
- "ÂØ¾ÃÒª"
- "ÂØ¾àÂÒÇì"
- "ÂØ¾àÃÈ"
- "ÂØÃÂÒµÃ"
- "ÂØÇª¹"
- "ÂØâû"
- "ÂØè§"
- "ÂØèÁÂèÒÁ"
- "ÂØèÂ"
- "ÂØé§"
- "ÂØéÂ"
- "ÂÙ§"
- "ÂÙ¹Ô¡«ì"
- "ÂÙÃÂÒµÃ"
- "ÂÙÃÔ¡"
- "ÂÙÊà«ÍÃì"
- "ÂÙàùÑÊ"
- "ÂÙàÃà¹ÕÂÁ"
- "ÂÙâ¡ÊÅÒàÇÕÂ"
- "ÂÙâ´"
- "ÂÙâÃ"
- "ÂÙè"
- "ÂâÊ"
- "Âè¹"
- "ÂèÍ"
- "Âèͧ"
- "ÂèÍÁ"
- "ÂèÍÂ"
- "ÂèÐ"
- "ÂèÒ"
- "ÂèÒ§"
- "ÂèÒ¹"
- "ÂèÒÁ"
- "ÂèÓ"
- "ÂéÇÂ"
- "Âé͹"
- "ÂéÍÁ"
- "ÂéÍÂ"
- "ÂéÒÂ"
- "ÂéÓ"
- "á"
- "ç"
- "ç¤Çѵ¶Ø"
- "ç¤ì"
- "è¹Ò"
- "èԵ"
- "èàè"
- "èàÅ¢"
- "ó"
- "óѰ"
- "ô"
- "ôÕ"
- "õÐ"
- "õÔ"
- "ö"
- "öàÁÅì"
- "ù"
- "ú"
- "þ"
- "þÕ"
- "ÃÁ"
- "ÃÁ³Õ"
- "ÃÁ³ÕÂì"
- "ÃÁÂì"
- "ÃÂÒ§¤ì"
- "ÃÇ¡"
- "Ãǧ"
- "ÃÇ´"
- "Ãǹ"
- "ÃǹàÃ"
- "ÃǺ"
- "ÃÇÁ"
- "ÃÇÂ"
- "ÃÇÔ"
- "ÃÇÕ"
- "ÃȹÒ"
- "ÃÊ"
- "ÃʹÒ"
- "ÃÊÒ¹àÇ·"
- "ÃÊÔ¡"
- "ÃËÑÊ"
- "ÃËÔµ"
- "ÃÍ"
- "ÃÍ¡"
- "Ãͧ"
- "Ãͧà§ç§"
- "ÃÍ´"
- "Ã͹"
- "Ãͺ"
- "Ãͺ¤Íº"
- "ÃÍÁ"
- "ÃÍÂ"
- "ÃÐ"
- "ÃСÓ"
- "ÃФ¹"
- "ÃФÒÂ"
- "ÃЦѧ"
- "ÃЧÁ"
- "ÃЧѺ"
- "ÃдÁ"
- "ÃдѺ"
- "ÃдÙ"
- "Ãз´"
- "ÃзÁ"
- "ÃзÇÂ"
- "Ãз֡"
- "ÃйҴ"
- "ÃйҺ"
- "ÃйÒÇ"
- "Ãкº"
- "ÃкÁ"
- "Ãкͺ"
- "ÃкѺ"
- "Ãкҭ"
- "ÃкҴ"
- "ÃкÒÂ"
- "ÃкÓ"
- "ÃкÔÅ"
- "Ãк×Í"
- "ÃкØ"
- "ÃÐÂÐ"
- "ÃÐÂѺ"
- "ÃÐÂÓ"
- "ÃÐÂÔº"
- "ÃÐÂéÒ"
- "ÃÐÃÔ¡"
- "ÃÐÅÍ¡"
- "ÃÐÅÖ¡"
- "ÃÐÇѧ"
- "ÃÐÇÒ§"
- "ÃÐËÇèÒ§"
- "ÃÐËØÂ"
- "ÃÐÍÒ"
- "ÃÐÍØ"
- "ÃÐ๹"
- "ÃÐà¹ÃйҴ"
- "ÃÐà¹Õ´"
- "ÃÐàºÔ´"
- "ÃÐàºÕ§"
- "ÃÐàºÕ¹"
- "ÃÐàºÕº"
- "ÃÐàºç§"
- "ÃÐàÁÕÂÃ"
- "ÃÐàËÂ"
- "ÃÐàËÔ´"
- "ÃÐàËç¨"
- "ÃÐá¤Ð"
- "ÃÐá§é"
- "ÃÐá¹§"
- "ÃÐáǧ"
- "ÃÑ¡"
- "ÃÑ¡¢ì"
- "ÃÑ¡ºÕé"
- "ÃÑ¡ÉÒ"
- "ÃÑ¡Éì"
- "ÃÑ¡áÃé"
- "Ãѧ"
- "ÃѧÊÔµ"
- "ÃѧÊÕ"
- "Ãѧá¡"
- "Ãѧá¤"
- "ÃѨ©Ò"
- "ÃѪ"
- "ÃѪ®ÒÀÔàÉ¡"
- "ÃѪ´ÒÀÔàÉ¡"
- "ÃѪ¹Õ"
- "ÃÑ­¨Ç¹"
- "ÃѰ"
- "ÃѰºÒÅ"
- "ÃѰºØÃØÉ"
- "ÃѰ»ÃÐÈÒʹÈÒʵÃì"
- "ÃѰ»ÃÐËÒÃ"
- "ÃѰÁ¹µÃÕ"
- "ÃѰÇÔÊÒˡԨ"
- "ÃѰÈÒʵÃì"
- "ÃѰÊÀÒ"
- "ÃÑ´"
- "Ãѵ"
- "ÃѵµÔ"
- "Ãѵ¹"
- "Ãѵ¹µÃÑÂ"
- "Ãѵ¹ºÑÅÅѧ¡ì"
- "Ãѵ¹Ð"
- "Ãѵ¹Ò"
- "Ãѵ¹â¡ÊÔ¹·Ãì"
- "Ãѵ¹ì"
- "ÃѶÂÒ"
- "Ãѹ"
- "Ãѹ·´"
- "ÃѺ"
- "ÃѺÃͧ"
- "ÃÑÁÀÒ"
- "ÃÑÁÁÕè"
- "ÃÑÇ"
- "ÃÑÈÁÔÁѵ"
- "ÃÑÈÁÔÁÒ¹"
- "ÃÑÈÁÕ"
- "ÃÑɮҡÃ"
- "ÃÑÊà«ÕÂ"
- "ÃÑèÇ"
- "ÃÑé§"
- "ÃÑé¹"
- "ÃÑéÇ"
- "ÃÒ"
- "ÃÒ¡"
- "ÃÒ¡ÉÊ"
- "ÃÒ¤Ð"
- "ÃÒ¤Ò"
- "ÃÒ¤Ô¹"
- "ÃÒ¤Õ"
- "ÃÒ§"
- "ÃÒ§ªÒ§"
- "ÃÒ§ÇÑÅ"
- "ÃÒª"
- "ÃÒª¡ÒÃ"
- "ÃÒª¹Ô¡ØÅ"
- "ÃÒªºÑ³±ÔµÂʶҹ"
- "ÃÒªÂì"
- "ÃҪǧÈì"
- "ÃÒªÇâç¡ÒÃ"
- "ÃÒªÊÕÁÒ"
- "ÃÒªÊÕËì"
- "ÃҪѹÂì"
- "ÃÒªÒ"
- "ÃÒªÒ¸ÔÃÒª"
- "ÃÒªÒÀÔàÉ¡"
- "ÃÒªÒÇ´Õ"
- "ÃÒªÔ¹Ô¡ØÅ"
- "ÃÒªÔ¹Õ"
- "ÃÒªÔ¹Ù»¶ÑÁÀì"
- "ÃÒªÙ»¶ÑÁÀì"
- "ÃÒªÙ»âÀ¤"
- "ÃÒ­"
- "ÃÒ´"
- "ÃÒµ"
- "ÃÒµÃ"
- "ÃÒµÃÕ"
- "ÃÒ¹"
- "ÃÒº"
- "ÃÒ¾³ÒÊÙÃ"
- "ÃÒÁ"
- "ÃÒÁ¤Óá˧"
- "ÃÒÁÊÙÃ"
- "ÃÒÁÑ­"
- "ÃÒÁÒ"
- "ÃÒÁÒ¸Ôº´Õ"
- "ÃÒÁà¡ÕÂõÔì"
- "ÃÒÂ"
- "ÃÒ¡ÒÃ"
- "ÃÒ§ҹ"
- "ÃÒÇ"
- "ÃÒÇÕ"
- "ÃÒÈÕ"
- "ÃÒÉ®Ã"
- "ÃÒÉ®Ãì"
- "ÃÒËÙ"
- "ÃÒહ·Ãì"
- "ÃÒ⪺ÒÂ"
- "ÃÒâªÇÒ·"
- "ÃÓ"
- "ÃÓ¤Ò­"
- "ÃӨǹ"
- "ÃӾѹ"
- "ÃÓ¾Ö§"
- "ÃÓÁйÒ"
- "ÃÓÅÖ¡"
- "ÃÓà¾Â"
- "ÃÔ"
- "ÃÔ¡"
- "ÃÔ´Êմǧ"
- "ÃÔ¹"
- "ÃÔº"
- "ÃÔººÔé¹"
- "ÃÔÁ"
- "ÃÔÉÂÒ"
- "ÃÔé¹"
- "ÃÔéÇ"
- "ÃÕ"
- "ÃÕ¨ÔÊ·ÃÕ"
- "ÃÕ´"
- "ÃÕµ"
- "ÃÕº"
- "ÃÕÁ"
- "ÃÕÇÔÇ"
- "ÃÕàÊÔÃìª"
- "ÃÕàÊÔÃì«"
- "ÃÕâÁµ"
- "ÃÕè"
- "ÃÕé"
- "ÃÖ§"
- "ÃÖé§"
- "Ã×è¹"
- "Ã×éÍ"
- "ÃØ"
- "ÃØ¡"
- "ÃØ¡¢¡Ð"
- "ÃØ¡¢ªÒµÔ"
- "ÃØ¡¢ÁÙÅ"
- "ÃØ¡¢à·Ç´Ò"
- "ÃØ¡¢ì"
- "ÃØ§Ãѧ"
- "ÃØ¨Ô"
- "ÃØ¨Õ"
- "ÃØ´"
- "ÃØµ"
- "ÃØ·¸ì"
- "ÃØ·Ã"
- "ÃØ¹"
- "ÃØ¹áç"
- "ÃØºÃÙè"
- "ÃØÁ"
- "ÃØÉ¯ì"
- "ÃØÊâ«"
- "ÃØè§"
- "ÃØè¹"
- "ÃØèÁ"
- "ÃØèÁÃèÒÁ"
- "ÃØèÂ"
- "ÃØé§"
- "ÃÙ"
- "ÃÙ´"
- "ÃÙ»"
- "ÃÙÁÒà¹ÕÂ"
- "ÃÙÊà«ÕÂ"
- "ÃÙàÁà¹ÕÂ"
- "ÃÙàÅçµµì"
- "ÃÙè"
- "ÃÙé"
- "ÃÙé¨Ñ¡"
- "ÃâË"
- "Ãè¹"
- "ÃèÁ"
- "Ãèǧ"
- "Ãèǹ"
- "ÃèÇÁ"
- "ÃèÍ"
- "Ãèͧ"
- "Ãè͹"
- "ÃèÍÂ"
- "ÃèÒ"
- "ÃèÒ§"
- "ÃèÒ¹"
- "ÃèÒÂ"
- "ÃèÓ"
- "ÃèÓÃÇÂ"
- "Ãé¹"
- "Ãéͧ"
- "Ãé͹"
- "ÃéÍÂ"
- "ÃéÒ"
- "ÃéÒ§"
- "ÃéÒ¹"
- "ÃéÒÂ"
- "ÃéÒÇ"
- "Ä¡Éì"
- "ĪÒ"
- "ĪØ"
- "ij"
- "Ä´Õ"
- "Ä´Ù"
- "ĵ"
- "Ä·¸Ò"
- "Ä·¸Ôì"
- "Ä·ÑÂ"
- "ÄÉÀ"
- "ÄÉÕ"
- "Äå"
- "ŧ"
- "Å´"
- "Å´Ò"
- "Å´ÒÇÑÅÂì"
- "Ź"
- "ź"
- "žºØÃÕ"
- "ÅÁ"
- "ÅŹÒ"
- "ÅÅÒ¯"
- "ÅÅÔµ"
- "ÅÇ¡"
- "Åǧ"
- "ÅÇ´"
- "ÅǹÅÒÁ"
- "ÅǹÐ"
- "ÅÇÐ"
- "ÅËØ"
- "ÅÍ¡"
- "ÅÍ¡ÒÃÔ·ÖÁ"
- "Åͧ"
- "Åͧ¡Í§"
- "Åͧ¨Ô¨Ù´"
- "ÅÍ´"
- "Å͵àµÍÃÕè"
- "Å͹"
- "Å͹´Í¹"
- "Åͺ"
- "ÅÍÁ"
- "ÅÍÂ"
- "ÅÍÍ"
- "ÅÐ"
- "ÅФÃ"
- "ÅеԨٴ"
- "ÅеԹ"
- "ÅкѴ"
- "ÅÐÁÑè§"
- "ÅÐÁع"
- "ÅÐÁèÍÁ"
- "ÅÐÁéÒÂ"
- "ÅÐÅÇÂ"
- "ÅÐËÁÒ´"
- "ÅÐËÒ¹"
- "ÅÐËØè§"
- "ÅÐÍͧ"
- "ÅÐÍÒÂ"
- "ÅÐàÁÍ"
- "ÅÐàÁÒÐ"
- "ÅÐàÁÔ´"
- "ÅÐàÁÕ´"
- "ÅÐàŧ"
- "ÅÐàÅÔ§"
- "ÅÐàÅÕ´"
- "ÅÐàǧ"
- "ÅÐàËÕèÂ"
- "ÅÐàÍÕ´"
- "ÅÐáÇ¡"
- "ÅÐâÁº"
- "ÅÐâÇé"
- "ÅÐäÁ"
- "ÅÑ¡"
- "ÅÑ¡¢³Ð"
- "ÅѡɳÐ"
- "ÅÑ¡ÉÁÕ"
- "ÅѤ¤Ð"
- "ÅѤ¹Ò"
- "ÅѤ¹ì"
- "Åѧ"
- "ÅѧàÅ"
- "ÅѪªÒ"
- "ÅѪªÕ"
- "ÅÑ­¨¡Ã"
- "ÅÑ­¨¹ì"
- "ÅÑ­©"
- "ÅÑ­©¡Ã"
- "ÅÑ­©¹ì"
- "ÅÑ´"
- "ÅÑ´Ò"
- "ÅÑ·¸Ô"
- "ÅÑ·¸ì"
- "Åѹ"
- "ÅѺ"
- "ÅѾ¸ì"
- "ÅÑÂ"
- "ÅÑè¹"
- "ÅÑè¹·Á"
- "ÅÒ"
- "ÅÒ¡"
- "ÅÒ§"
- "ÅÒ­"
- "ÅÒ´"
- "ÅÒ¹"
- "ÅÒº"
- "ÅÒ»"
- "ÅÒÀ"
- "ÅÒÁ"
- "ÅÒÁ¡"
- "ÅÒÂ"
- "ÅÒÂÊ×Í"
- "ÅÒŹÐ"
- "ÅÒÅÊ"
- "ÅÒÇ"
- "ÅÒÇ¡"
- "ÅÒÇѳÂì"
- "ÅÒÇÒ"
- "ÅÒʹÐ"
- "ÅÓ"
- "ÅӴǹ"
- "ÅӴѺ"
- "ÅÓºÒ¡"
- "ÅӾǹ"
- "ÅӾͧ"
- "ÅӾѧ"
- "ÅÓÀآѹ"
- "ÅÓÂͧ"
- "ÅÓà¤ç­"
- "ÅÓà¨Õ¡"
- "ÅÓà¹Ò"
- "ÅÓà¾Ò"
- "ÅÓàÅÔ¡"
- "ÅÓàÅÕ§"
- "ÅÓâ¾§"
- "ÅÓäÂ"
- "ÅÔ"
- "ÅÔ¡ä¹µì"
- "ÅÔ¢ÊÔ·¸Ôì"
- "ÅÔ¢Ôµ"
- "ÅÔ§"
- "ÅÔ§¡ì"
- "ÅÔ§¤ì"
- "ÅÔ´"
- "ÅÔµ"
- "ÅÔµÁÑÊ"
- "ÅÔµÃ"
- "ÅÔ¹Ô¹"
- "ÅÔº"
- "ÅÔ»´Ò"
- "ÅÔ»µì"
- "ÅԻʵԡ"
- "ÅÔ»Ô"
- "ÅÔ¿µì"
- "ÅÔÅÔµ"
- "ÅÔÇ"
- "ÅÔʧ"
- "ÅÔà¡"
- "ÅÔàºÕÂ"
- "ÅÔàÇÍÃì¾ÙÅ"
- "ÅÔèÁ"
- "ÅÔèÇ"
- "ÅÔé¹"
- "ÅÔ鹨Õè"
- "ÅÔéÁ"
- "ÅÕ"
- "ÅÕ¡"
- "Åչء«ì"
- "ÅÕº"
- "ÅÕÅÒ"
- "ÅÕÅÒÈ"
- "ÅÕè"
- "ÅÕé"
- "ÅÖ¡"
- "ÅÖ§¤ì"
- "Å×´"
- "Å׺"
- "Å×Á"
- "Å×Í"
- "Å×è¹"
- "Å×èÍ"
- "Å×é¹"
- "Å×éÍ"
- "ÅØ"
- "ÅØ¡"
- "ÅØ§"
- "ÅØÂ"
- "ÅØè¹"
- "ÅØèÁ"
- "ÅØèÂ"
- "ÅØé§"
- "ÅØéÂ"
- "ÅÙ¡"
- "ÅÙ¡¤éÒ"
- "ÅÙ¡ºÒÈ¡ì"
- "ÅÙº"
- "ÅÙè"
- "Åç͡ࡵ"
- "Åè¹"
- "ÅèÁ"
- "Åèǧ"
- "ÅèÇÁ"
- "ÅèÍ"
- "Åèͧ"
- "Åè͹"
- "ÅèÍÂ"
- "ÅèÍáÅè"
- "ÅèÐ"
- "ÅèÒ"
- "ÅèÒ§"
- "ÅèÒ¹"
- "ÅèÒÁ"
- "ÅèÓ"
- "Åé§àÅé§"
- "Åé¹"
- "ÅéÁ"
- "Åéǧ"
- "Åéǹ"
- "ÅéÍ"
- "ÅéÍÁ"
- "ÅéÒ"
- "ÅéÒ§"
- "ÅéÒµéÒ"
- "ÅéÒ¹"
- "ÅéÓ"
- "Ç¡"
- "Ç¡Ð"
- "ǧ"
- "ǧ¡µ"
- "ǧ¡ì"
- "ǧ¨Ã"
- "ǧȡÃ"
- "ǧÈÒ"
- "ǧÈì"
- "Ǩ¹Ð"
- "ǨÐ"
- "ǨÕ"
- "ǪÐ"
- "ǪÔÃÐ"
- "ǪÔÃÒÇØ¸"
- "dzºÑµÃ"
- "dz¾Ñ¹¸¹ì"
- "dzÐ"
- "dzԪ"
- "dzԪªÒ"
- "dzԪÂÒ"
- "dzԪÂì"
- "dzԾ¡"
- "Ç´Õ"
- "ǵÐ"
- "Ç·Ð"
- "Ç·Ñ­­ØµÒ"
- "ǸءÒ"
- "ǸÙ"
- "ǹ"
- "ǹÑÊ"
- "ǹÒ"
- "ǹҹµì"
- "ǹԴÒ"
- "ǹԾ¡"
- "ÇÂÑÊÂì"
- "Çç¤ì"
- "ÇóÐ"
- "ÇÃÁËÒÇÔËÒÃ"
- "ÇÃä"
- "ÇÃäÂì"
- "ÇÃê"
- "ÇÃêÂì"
- "ÇÃó¡ÃÃÁ"
- "ÇÃó¤´Õ"
- "ÇÃó¹Ò"
- "ÇÃó¾ÄµÔ"
- "ÇÃÃ³ÂØ¡µì"
- "ÇÃÃ³ÂØµ"
- "ÇÃóÈÔÅ»ì"
- "ÇÃóÐ"
- "ÇÃó֡"
- "ÇÃø¡"
- "ÇÃø¹Ð"
- "ÇÃÃÉ"
- "ÇÃÃÉÒ"
- "ÇÃÇÔËÒÃ"
- "ÇÃÑ­­Ù"
- "ÇÃÒ§¤¹Ò"
- "ÇÃÒËÐ"
- "ÇÃÒËì"
- "ÇÃØ³"
- "ÇÅÑ­ª¹ì"
- "ÇÅÑÂ"
- "ÇÅÒË¡"
- "ÇÅÕ"
- "ÇÈÐ"
- "ÇÊÊÐ"
- "ÇÊÊÕ"
- "ÇÊÐ"
- "ÇÊѹµ´ÔÅ¡"
- "ÇÊѹµì"
- "ÇÊÒ"
- "ÇÊÕ"
- "ÇÊØ"
- "ÇÊØ¸Ò"
- "ÇÊØ¹¸ÃÒ"
- "ÇÊØÁ´Õ"
- "ÇËÐ"
- "ÇËÒ"
- "ÇÍ"
- "ÇÍ¡"
- "ÇÍ¡áÇ¡"
- "ÇÍ´"
- "Ç͹"
- "ÇÍÃìáù·ì"
- "ÇÍÅÅìʵÃÕ·"
- "ÇÍÅàÅÂì"
- "ÇÍÅàÅÂìºÍÅ"
- "ÇÍáÇ"
- "ÇÐ"
- "ÇÑ¡"
- "ÇÑ¡¡Ð"
- "ÇѤ"
- "ÇѤ¤ÕÂì"
- "ÇѤ¤Ø"
- "ÇѤ«Õ¹"
- "Çѧ"
- "Çѧ¡ì"
- "Çѧàǧ"
- "ÇѨ¹Ð"
- "ÇѪ"
- "ÇѪ¬ì"
- "ÇѪÃÐ"
- "ÇѪÃÔ¹·Ãì"
- "ÇѪÃÕ"
- "Çѯ¨Ñ¡Ã"
- "Çѯ¯Ô"
- "ÇѯʧÊÒÃ"
- "ÇѲ¡Ð"
- "ÇѲ¡Õ"
- "ÇѲ¹¸ÃÃÁ"
- "ÇѲ¹Ð"
- "ÇѲ¹Ò"
- "Çѳ"
- "Çѳ¯ì"
- "Çѳ¹Ò"
- "ÇÑ´"
- "Çѵ"
- "ÇѵµÒ"
- "Çѵµì"
- "Çѵ¶Ø"
- "Çѵ¶ì"
- "Çѵ¹Ð"
- "ÇѵÃ"
- "ÇѵÔ"
- "Çѹ"
- "Çѹ·¹Ò"
- "Çѹ·¹ÕÂì"
- "Çѹ·ÂËѵ¶ì"
- "Çѹ·ÂÒÇØ¸"
- "Çѹ·Ò"
- "ÇѺ"
- "ÇÑ»»Ð"
- "ÇÑÁÁÔ¡"
- "ÇÑÂ"
- "ÇÑÅÂì"
- "ÇÑÅÅÀ"
- "ÇÑÅÅÕ"
- "ÇÑÇ"
- "ÇÑÊ´Ø"
- "ÇÑÊÊÐ"
- "ÇÑÊÊÒ¹Ð"
- "ÇÑÊâÊ·¡"
- "ÇÒ"
- "ÇÒ¡"
- "ÇÒ¡ÂÊÑÁ¾Ñ¹¸ì"
- "ÇÒ¡ÂÐ"
- "ÇÒ§"
- "ÇÒ¨¡"
- "ÇÒ¨Ò"
- "ÇÒ³Ôª"
- "ÇÒ³ÔªÂì"
- "ÇÒ³Õ"
- "ÇÒ´"
- "ÇÒµÀÑÂ"
- "ÇÒµÐ"
- "ÇÒ·"
- "ÇÒ·¡"
- "Çҷ¡Ã"
- "ÇÒ·Âì"
- "ÇÒ·Ôµ"
- "ÇÒ·Ô¹"
- "ÇÒ·Õ"
- "ÇÒ¹"
- "ÇÒ¹Ã"
- "ÇÒ¹ÃÔ¹·Ãì"
- "ÇÒº"
- "ÇÒ»Ð"
- "ÇÒ»ÔµÐ"
- "ÇÒ»Õ"
- "ÇÒÁ"
- "ÇÒÁÐ"
- "ÇÒÂ"
- "ÇÒ·Ùà¤"
- "ÇÒÂÊÐ"
- "ÇÒÃ"
- "ÇÒÃÊÒÃ"
- "ÇÒÃÔ"
- "ÇÒÃÕ"
- "ÇÒÃØ³"
- "ÇÒÃØ³Õ"
- "ÇÒÅ"
- "ÇÒÅìÇ"
- "ÇÒÇ"
- "ÇÒʹÐ"
- "ÇÒʹÒ"
- "ÇÒʾ"
- "ÇÒËÐ"
- "ÇÒËÔ¹Õ"
- "ÇÒÌ"
- "ÇÔ¡ÃÁ"
- "Çԡĵ"
- "Çԡĵ¡Òóì"
- "ÇԡĵÔ"
- "ÇÔ¡Å"
- "ÇÔ¡ÊÔµ"
- "ÇÔ¡Ñ»"
- "ÇÔ¡ÒÅ"
- "ÇÔ¤ËÐ"
- "ÇÔ§"
- "ÇÔ§Ç͹"
- "ÇÔ¨ÂØµ"
- "ÇԨóÐ"
- "ÇÔ¨Å"
- "ÇԨѡ¢³ì"
- "ÇԨѡɳì"
- "ÇÔ¨ÑÂ"
- "ÇÔ¨ÒÃ"
- "ÇÔ¨Òó­Ò³"
- "ÇÔ¨Òóì"
- "ÇÔ¨Ô"
- "ÇÔ¨Ô¡Ô¨©Ò"
- "ÇÔ¨Ôµ"
- "ÇÔ¨ÔµÃ"
- "ÇÔ¨Ô¹"
- "ÇԨس"
- "ÇÔ¨ØÃ³"
- "ÇÔªªÒ"
- "ÇÔªªØ"
- "ÇÔªªØÅ´Ò"
- "ÇÔª­Ð"
- "ÇÔª¹Õ"
- "ÇÔªÒ"
- "ÇÔªÒ¹¹Ð"
- "ÇÔªÔµ"
- "ÇÔ­­ÑµÔ"
- "ÇÔ­­Ò³"
- "ÇÔ­­Ù"
- "ÇÔ±ÙÃÂì"
- "ÇÔ´"
- "ÇÔ´ÕâÍ"
- "ÇÔµ¡"
- "ÇÔµ¶ÒÃ"
- "ÇÔµÒÁÔ¹"
- "ÇÔ¶Õ"
- "ÇԷ°ҹÐ"
- "ÇÔ·ÂÒ"
- "ÇÔ·ÂÒÅÑÂ"
- "ÇÔ·ÂØ"
- "ÇÔ·ÂØµ"
- "ÇÔ·ÇÑÊ"
- "ÇÔ·Òóì"
- "ÇÔ·ÒŹì"
- "ÇÔ·Ôµ"
- "ÇÔ·Ù"
- "ÇÔ·ÙÃ"
- "ÇÔ¸"
- "ÇÔ¸ÇÒ"
- "ÇÔ¸Ò"
- "ÇÔ¸Ò¹"
- "ÇÔ¸Õ"
- "ÇÔ¸Ù»¹Ð"
- "ÇԹѹµÙ"
- "ÇÔ¹ÑÂ"
- "ÇÔ¹Ò·Õ"
- "ÇÔ¹ÒÈ"
- "ÇÔ¹Ô¨"
- "ÇÔ¹Ô¨©ÑÂ"
- "ÇÔ¹Ôµ"
- "ÇÔ¹ÔºÒµ"
- "ÇÔ¹Ô»ÒµÔ¡"
- "ÇÔ¹â´ÇÊì"
- "ÇÔ¹â´Çì"
- "ÇԺѵÔ"
- "ÇÔºÒ¡"
- "ÇÔºØÅ"
- "ÇÔºØÅÂì"
- "ÇÔºÙÅ"
- "ÇÔºÙÅÂì"
- "ÇÔ»¡ÒÃ"
- "ÇÔ»¯ÔÊÒÃ"
- "ÇÔ»ÃСÒÃ"
- "ÇÔ»ÃеÔÊÒÃ"
- "ÇÔ»ÃÐÅÒ»"
- "ÇÔ»ÃÐÇÒÊ"
- "ÇÔ»ÃÔµ"
- "ÇÔ»ÅÒ»"
- "ÇÔ»ÅÒÊ"
- "ÇÔ»ÇÒÊ"
- "ÇԻѡÉì"
- "ÇÔ»ÑÊÊ¡"
- "ÇÔ»ÑÊʹÒ"
- "ÇÔ»â¤"
- "ÇÔ¾Ò¡Éì"
- "ÇÔ¾Ô¸·ÑȹÒ"
- "ÇÔÀǵѳËÒ"
- "ÇÔÀѧ¤ì"
- "ÇÔÀѪ"
- "ÇÔÀѵµÔ"
- "ÇÔÀÒ"
- "ÇÔÀÒÇ´Õ"
- "ÇÔÁѵÔ"
- "ÇÔÁص"
- "ÇÔÁصµÔ"
- "ÇÔõÐ"
- "ÇÔÃÁ³Ð"
- "ÇÔÃÃø¹ì"
- "ÇÔÃÇÐ"
- "ÇÔÃѪ"
- "ÇÔÃѵ"
- "ÇÔÃѵÔ"
- "ÇÔÃÔÂÀÒ¾"
- "ÇÔÃÔÂÐ"
- "ÇÔÃØ¸"
- "ÇÔÃØÌË¡"
- "ÇÔÃØÌËì"
- "ÇÔÅѹ´Ò"
- "ÇÔÅÒ´"
- "ÇÔÅÒ»"
- "ÇÔÅÒÇѳÂì"
- "ÇÔÅÒÈ"
- "ÇÔÅÒÊ"
- "ÇÔÅÒÊÔ¹Õ"
- "ÇÔÇ"
- "ÇÔÇóì"
- "ÇÔÇÃÐ"
- "ÇÔÇѯ"
- "ÇÔÇѲ¹Ò¡ÒÃ"
- "ÇÔÇѲ¹ì"
- "ÇÔÇÒ·"
- "ÇÔÇÒËÁ§¤Å"
- "ÇÔÇÒËÐ"
- "ÇÔÇÒËì"
- "ÇÔÇÔ¨"
- "ÇÔÇÔµ"
- "ÇÔÇÔ¸"
- "ÇÔÈÃØµ"
- "ÇÔÈÇ¡Ã"
- "ÇÔÈÇ¡ÃÃÁ"
- "ÇÔÈÑÅÂì"
- "ÇÔÈÒ¢Ð"
- "ÇÔÈÒ¢Ò"
- "ÇÔÈÒ§¤ì"
- "ÇÔÈÒÅ"
- "ÇÔÈÔɰì"
- "ÇÔÈØ·¸Ôì"
- "ÇÔÈØ·¸ì"
- "ÇÔɳØ"
- "ÇÔɸÃ"
- "ÇÔÉÑ¡µì"
- "ÇÔÉÑÂ"
- "ÇÔÉÒ³"
- "ÇÔÉØÇѵ"
- "ÇÔÊ¡Õé"
- "ÇÔÊÃê¹ÕÂì"
- "ÇÔÊĵ"
- "ÇÔÊÊØ¡ÃÃÁ"
- "ÇÔÊѪ¹Ò"
- "ÇÔÊÑ­­Õ"
- "ÇÔÊÑÂ"
- "ÇÔÊÒ¢ºÙªÒ"
- "ÇÔÊÒ¢Ð"
- "ÇÔÊÒÁÑ­"
- "ÇÔÊÒÊÐ"
- "ÇÔÊÒˡԨ"
- "ÇÔÊÔ°"
- "ÇÔÊØ§¤ÒÁÊÕÁÒ"
- "ÇÔÊØ·¸Ôì"
- "ÇÔÊØ·¸ì"
- "ÇÔÊÙµÃ"
- "ÇÔˤ"
- "ÇÔ˧¤ì"
- "ÇÔËÅÑè¹"
- "ÇÔËÒÂÊÐ"
- "ÇÔËÒÃ"
- "ÇÔËÔ§ÊÐ"
- "ÇÔËÔ§ÊÒ"
- "ÇÔÌѧ¤ì"
- "ÇÔÌÒÃ"
- "ÇÔÌÒÃì"
- "ÇÔà¤ÃÒÐËì"
- "ÇÔàªÕÂÃ"
- "ÇÔà·ÇÉ"
- "ÇÔà·È"
- "ÇÔà·âȺÒÂ"
- "ÇÔ๵"
- "ÇÔà¹"
- "ÇÔàù·Ãì"
- "ÇÔàÅ»"
- "ÇÔàÇ¡"
- "ÇÔàÈÉ"
- "ÇÔàÈɳì"
- "ÇÔàÊ·"
- "ÇÔàËÊÒ"
- "ÇÔâ¹·¡"
- "ÇÔâÁ¡¢ì"
- "ÇÔâ¤"
- "ÇÔâè"
- "ÇÔâè¹ì"
- "ÇÔâò"
- "ÇÔâø"
- "ÇÔâø¹ì"
- "ÇÔâŨ¹Ð"
- "ÇÔäÅ"
- "ÇÔè§"
- "ÇÔè§à»ÕéÂÇ"
- "ÇÔè¹"
- "ÇÕ"
- "ÇÕ¨Ô"
- "ÇÕª¹Õ"
- "ÇÕ«èÒ"
- "ÇÕ³Ò"
- "ÇÕáÃÃÁ"
- "ÇÕê¹"
- "ÇÕúØÃØÉ"
- "ÇÕÃʵÃÕ"
- "ÇÕèÇѹ"
- "ÇÕèáÇÇ"
- "ÇÕé´"
- "ÇØ°Ô"
- "ÇØ²"
- "ÇØ²Ô"
- "ÇØ´"
- "ÇØº"
- "ÇØè¹"
- "ÇØé§"
- "ÇØé¹"
- "ÇØéÂ"
- "ÇÙ´ÇÒ´"
- "ÇÙ¸Ù"
- "ÇÙº"
- "ÇÙèÇÒÁ"
- "ÇÙé"
- "Ç๨Ã"
- "Çâ¹·ÂÒ¹"
- "ÇâÃ"
- "ÇâáÒÊ"
- "ÇâôÁ"
- "Çèͧ"
- "Çè͹"
- "ÇèÒ"
- "ÇèÒ§"
- "ÇèÒ¹"
- "ÇèÒÂ"
- "ÇèÒÇ"
- "ÇéÒ"
- "ÇéÒ§"
- "ÇéÒÂ"
- "È¡"
- "ȵ"
- "ȵÇÃÃÉ"
- "Ⱦ"
- "ÈÃ"
- "ÈÃÑ·¸Ò"
- "ÈÃÑÂ"
- "ÈÃÕ"
- "ÈÃÕÇÔäÅÄ·¸Ôì"
- "ÈÃÕÉÐà¡É"
- "Èħ¤ÒÃ"
- "ÈÈÔ"
- "ÈÍ"
- "ÈÍ¡"
- "ÈÑ¡´Ò"
- "ÈÑ¡´Ô¹Ò"
- "ÈÑ¡´Ôì"
- "ÈÑ¡ÂÀÒ¾"
- "ÈÑ¡ÂÐ"
- "ÈÑ¡Âì"
- "ÈÑ¡ÃÒª"
- "ÈѵÃÙ"
- "ÈѾ·ì"
- "ÈÑÅ¡ÃÃÁ"
- "ÈÑÅÂÈÒʵÃì"
- "ÈÑÅÂá¾·Âì"
- "ÈÑÅÂì"
- "Èҡ¾ط¸"
- "ÈÒ¡ÂÁعÕ"
- "ÈÒ¡ÂÐ"
- "ÈÒµÃÒ¨ÒÃÂì"
- "ÈÒ¹µÔ"
- "ÈÒ¹µì"
- "ÈÒ÷"
- "ÈÒ÷ÙÅ"
- "ÈÒÅ"
- "ÈÒÅÒ"
- "ÈÒÊ¡"
- "ÈÒÊ´Ò"
- "ÈÒʵÃÒ"
- "ÈÒʵÃÒ¨ÒÃÂì"
- "ÈÒʵÃì"
- "ÈÒʹ¨Ñ¡Ã"
- "ÈÒʹÒ"
- "ÈÒʹٻ¶ÑÁÀ¡"
- "ÈÒʹì"
- "ÈÔ¢ÃÔ¹"
- "ÈÔÃÔÃÒª"
- "ÈÔÅ»¡Ã"
- "ÈÔÅ»¡ÃÃÁ"
- "ÈÔÅ»¡ÒÃ"
- "ÈÔÅ»¡Ô¨"
- "ÈÔÅ»ÇÔ·ÂÒ"
- "ÈÔÅ»ÈÒʵÃì"
- "ÈÔÅ»Ð"
- "ÈÔŻҡÃ"
- "ÈÔŻԹ"
- "ÈÔÅ»Õ"
- "ÈÔÅ»ì"
- "ÈÔÅÒ"
- "ÈÔÇÅÖ§¤ì"
- "ÈÔÇÐ"
- "ÈÔÇàÇ·"
- "ÈÔÇâÁ¡¢ì"
- "ÈÔÉÂì"
- "ÈÔâÃÃÒº"
- "ÈÕÃÉÐ"
- "ÈÕÅ"
- "ÈÖ¡"
- "ÈÖ¡ÉÒ"
- "ÈÖ¡ÉÒ¸Ô¡ÒÃ"
- "ÈÖ¡ÉÒ¹Ôà·È¡ì"
- "ÈØ¡Ãì"
- "ÈØÀ¡Ã"
- "ÈØÀ¹ÔÁÔµ"
- "ÈØÀÁÑÊ´Ø"
- "ÈØÀÁÒµÃÒ"
- "ÈØÀÁÒÊ"
- "ÈØÀÍÑ¡ÉÃ"
- "ÈØÀÒ§¤ì"
- "ÈØÀà¤ÃÒÐËì"
- "ÈØÅ¡Ò¡Ã"
- "ÈØÅ¡ÒÃÑ¡Éì"
- "ÈØÅÕ"
- "ÈÙ·Ã"
- "ÈÙ¹Âì"
- "Ê¡"
- "Ê¡¹¸ì"
- "Ê¡»Ã¡"
- "Ê¡Å"
- "Ê¡ÇÒ·Õ"
- "ʡ͵Ᏼì"
- "ʡѴ"
- "Ê¡Ò"
- "Ê¡ÒÇ"
- "Ê¡Õ"
- "ʡس"
- "ʡسÒ"
- "ʡسÕ"
- "ʡعµì"
- "Ê¡ØÅ"
- "Ê¡ç͵Ᏼì"
- "ʧ"
- "ʧ¡ÃÒ¹µì"
- "ʧ¡Ò"
- "ʧ¢ÅÒ"
- "ʧ¤ÃÒÁ"
- "ʧ¦ì"
- "椼"
- "ʧǹ"
- "ʧÊÑÂ"
- "ʧÊÒÃ"
- "ʧÊÒÃÇѯ"
- "ʧѴ"
- "ʧà¤ÃÒÐËì"
- "ʧèÒ"
- "ʳ±ì"
- "Ê´"
- "Ê´ÁÀì"
- "ʴѺ"
- "Ê´Ø´Õ"
- "ʵÃÕ"
- "ʵ͡"
- "ʵѿ¿ì"
- "ʵҧ¤ì"
- "ʵÒÃì·"
- "ʵÔ"
- "ʵÔê¡à¡ÍÃì"
- "ʵÙ"
- "ʵêÍ¡"
- "榁"
- "ʶҹ"
- "ʶҹ¡Òóì"
- "ʶҹÐ"
- "ʶҹÕ"
- "ʶҺѹ"
- "ʶһ¹Ò"
- "ʶһ¹Ô¡"
- "ʶһѵ¡ÃÃÁ"
- "ʶҾÃ"
- "ʶÒÇÃ"
- "ʶԵ"
- "ʶԵÂ"
- "ʶԵÂÈÒʵÃì"
- "ʶԵÂì"
- "ʶԵÔ"
- "ʶØÅ"
- "ʶٻ"
- "ʷ;"
- "ʹ"
- "ʹ·¹Ò"
- "ʹ¸ÂÒ"
- "ʹ¸Ô"
- "ʹ¹ÃÒ¤Ò"
- "ʹÁ"
- "ʹͧ"
- "ʹѺ"
- "ʹѺʹع"
- "ʹÑè¹"
- "ʹҹ"
- "ʹÒÁ"
- "ʹԷ"
- "ʹÔÁ"
- "ʹء"
- "ʹØè¹"
- "ʹà·È"
- "ʹà·èËì"
- "ʹã¨"
- "ʺ"
- "漤"
- "漦"
- "ʺÒÂ"
- "ʺÙè"
- "Ê»ÃÔ§"
- "Ê»ÒÂ"
- "Ê»ÒࡵµÕ"
- "Ê»ÔÃÔµ"
- "ÊÀÒ"
- "ÊÀÒ¾"
- "ÊÀҾѲ¹ì"
- "ÊÀÒÇÐ"
- "ÊÁ"
- "ÊÁ¡ÒÃ"
- "ÊÁ¤ÇÃ"
- "ÊÁ­Ò"
- "ÊÁ³ÈÑ¡´Ôì"
- "ÊÁ³Ð"
- "ÊÁ´ØÅ"
- "ÊÁ¶Ð"
- "ÊÁ¹Ò¤Ø³"
- "ÊÁºÑµÔ"
- "ÊÁºÙóҭÒÊÔ·¸ÔÃÒªÂì"
- "ÊÁºÙóì"
- "ÊÁ»ÃдÕ"
- "ÊÁ»Ä´Õ"
- "ÊÁÀ¾"
- "ÊÁÀÒÃ"
- "ÊÁÁµ"
- "ÊÁÁµÔ"
- "ÊÁÁÒµÃ"
- "ÊÁÁصÔ"
- "ÊÁÃ"
- "ÊÁÃö"
- "ÊÁÃö¹Ð"
- "ÊÁÃÊ"
- "ÊÁÍ"
- "ÊÁͧ"
- "ÊÁѤÃ"
- "ÊÁѪªÒ"
- "ÊÁѹ"
- "ÊÁÑÂ"
- "ÊÁÒ"
- "ÊÁÒ¤Á"
- "ÊÁÒ¨ÒÃ"
- "ÊÁÒªÔ¡"
- "ÊÁÒ¸Ô"
- "ÊÁÒ¹"
- "ÊÁҺѵÔ"
- "ÊÁÒÊ"
- "ÊÁÔ§"
- "ÊÁÔµ"
- "ÊÁÕ"
- "ÊÁد°Ò¹"
- "ÊÁØ´"
- "ÊÁØ·Ã"
- "ÊÁØ·ÑÂ"
- "ÊÁع"
- "ÊÁعä¾Ã"
- "ÊÁØËì"
- "ÊÁà´ç¨"
- "ÊÁྪ"
- "ÊÁàÊÃç¨"
- "ÊÁ⾸Ô"
- "ÊÁâÀ¤"
- "ÊÁâÀª"
- "ÊÁèÓàÊÁÍ"
- "Ê´"
- "ʺ"
- "ÊÂÁÀÙ"
- "ÊÂͧ"
- "ÊÂÒÁ"
- "ÊÂÒÂ"
- "ÊÂÔÇ"
- "ÊÂØÁ¾Ã"
- "ÊÂØÁÀÙ"
- "Êç"
- "ÊóÐ"
- "ÊóҤÁ¹ì"
- "ÊõÐ"
- "ÊÃÃ"
- "ÊÃäì"
- "ÊÃþ"
- "ÊÃþҡÃ"
- "ÊÃþҧ¤ì"
- "ÊÃÃྪ­"
- "ÊÃÃàÊÃÔ­"
- "ÊÃǧ"
- "ÊÃÇÁ"
- "ÊÃÇÅ"
- "ÊÃÐ"
- "ÊÃÒ­"
- "ÊÃÕáԨ"
- "ÊÃÕøҵØ"
- "ÊÃÕÃÇÔ·ÂÒ"
- "ÊÃÕÃÈÒʵÃì"
- "ÊÃÕÃÐ"
- "ÊÃØ»"
- "ÊÃè§"
- "ÊÃèÒ§"
- "ÊÃéÍÂ"
- "ÊÃéÒ§"
- "ÊÃéÒÇàÊÕÂÇ"
- "怵"
- "ÊÄɯì"
- "ÊÅ"
- "ÊÅ´"
- "恼"
- "ÊÅǹ"
- "ÊÅÇÂ"
- "ÊÅÍ´"
- "ÊÅ͹"
- "ÊÅÍÂ"
- "ÊÅÐ"
- "ÊÅÑ¡"
- "ÊÅÑ¡àµé"
- "ÊÅÑ´"
- "ÊÅÑ´ä´"
- "ÊÅѺ"
- "ÊÅÑÁ"
- "ÊÅÑÇ"
- "ÊÅÒ"
- "ÊÅÒ¡"
- "ÊÅÒ´"
- "ÊÅҵѹ"
- "ÊÅÒº"
- "ÊÅÒÂ"
- "ÊÅÔ´"
- "ÊÅÔÅ"
- "ÊÅÖ¡"
- "ÊÅÖ§"
- "ÊÅØµ"
- "ÊÅØº"
- "ÊÅØÁ¾Ã"
- "ÊÅç͵"
- "ÊÅéÒ§"
- "ÊÇ¡"
- "ÊÇ´"
- "Êǹ"
- "ÊǹÐ"
- "ÊǹҡÒÃ"
- "悼"
- "ÊÇÁ"
- "ÊÇÂ"
- "ÊÇÃ"
- "ÊÇÃäµ"
- "ÊÇÃäÒÅÑÂ"
- "ÊÇÃäì"
- "ÊÇÃÃÂÒ"
- "ÊÇÍ»"
- "ÊÇÐ"
- "ÊÇÑÊ´Ô¡ÒÃ"
- "ÊÇÑÊ´ÔÀÒ¾"
- "ÊÇÑÊ´Ôì"
- "ÊÇÑÊ´Õ"
- "ÊÇÑʵԡÐ"
- "ÊÇÒ"
- "ÊÇÒ§"
- "ÊÇÒ´"
- "ÊÇÒ·"
- "ÊÇÒÁÔ"
- "ÊÇÒÁÕ"
- "ÊÇÒÂ"
- "ÊÇÒÊ´Ôì"
- "ÊÇÒËÐ"
- "ÊÇÔ§"
- "ÊÇÔµªì"
- "ÊÇÔµ«ì"
- "ÊÇÔÊà«ÍÃìᏴì"
- "ÊÇÕà´¹"
- "ÊÇèÒ§"
- "ÊÇèÒ¹"
- "ÊÇéÒ¹"
- "ÊÊÒÃ"
- "Êˡóì"
- "ÊË¡ÒÃ"
- "Ê˨Ã"
- "Ê˪ҵÔ"
- "ÊË»ÃЪҪҵÔ"
- "Ê˾ѹ¸ÃѰ"
- "Ê˾ѹ¸ì"
- "ÊËÀÒ¾"
- "ÊËÃѰ"
- "ÊËÇÔÃÔÂÒ"
- "ÊËÈÖ¡ÉÒ"
- "ÊËѪ"
- "ÊËÑÁº´Õ"
- "ÊËÑʹѹì"
- "ÊËÑÊÇÃÃÉ"
- "ÊËÑÊÊÐ"
- "ÊËÑÊÊÒ"
- "ÊËÒÂ"
- "ÊÍ"
- "Êͧ"
- "ÊÍ´"
- "Ê͹"
- "Êͺ"
- "Ê;ÅÍ"
- "ÊÍÂ"
- "ÊÐ"
- "ÊС´"
- "ÊСԴ"
- "ÊФÃÒ­"
- "ÊдÁ"
- "Êдǡ"
- "ÊдÔé§"
- "Êд֧"
- "Êд×Í"
- "Êдش"
- "ÊдØé§"
- "ÊеÍ"
- "ÊеÖ"
- "Êе×Í"
- "Êзé͹"
- "ÊзéÒ¹"
- "Êкѡ"
- "ÊкѴ"
- "ÊкѴÊкÔé§"
- "ÊкÑé¹"
- "ÊкéÒ"
- "ÊоÃÑ¡"
- "ÊоÃÑè§"
- "ÊоѴ"
- "ÊоÑé¹"
- "Êоҹ"
- "ÊоÒÂ"
- "ÊÐÃеÐ"
- "ÊÐÃÐá˹è"
- "ÊÐÅÖÁÊÐÅ×Í"
- "ÊÐÇÕé´ÊÐÇéÒ´"
- "ÊÐÊÁ"
- "ÊÐÊÒ§"
- "ÊÐÍÒ§"
- "ÊÐÍÒ´"
- "ÊÐÍÔ´ÊÐàÍÕ¹"
- "ÊÐÍÔé§"
- "ÊÐÍÖ¡"
- "ÊÐÍ×é¹"
- "ÊÐÍéÒ¹"
- "ÊÐà¡ç´"
- "ÊÐà´ç´"
- "ÊÐà·Ôé¹"
- "ÊÐà·×͹"
- "ÊÐà·×é͹"
- "ÊÐà¾ÃèÒ"
- "ÊÐàÍÍÐ"
- "ÊÐ⾡"
- "ÊÐâÍ´ÊÐͧ"
- "ÊÐãÀé"
- "ÊÑ¡"
- "ÊÑ¡¢Õ"
- "ÊÑ¡ÇÒ"
- "ÊÑ¡ËÅÒ´"
- "ÊÑ¢ÂÐ"
- "Êѧ¡Á·ÃѾÂì"
- "Êѧ¡Ã"
- "Êѧ¡Ã³Õ"
- "Êѧ¡ÐµÑ§"
- "Êѧ¡ÐÊÕ"
- "Êѧ¡Ñ´"
- "Êѧ¡Ñ»»Ð"
- "Êѧ¡Ò"
- "Êѧ¡ÒÈ"
- "Êѧ¢ÂÒ"
- "Êѧ¢ÒÃ"
- "Êѧ¢ì"
- "Êѧ¤­ÒµÔ"
- "Êѧ¤Á"
- "Êѧ¤Ñ§"
- "Êѧ¤Ò¹Ò"
- "Êѧ¤Ò¹ÒÂ"
- "Êѧ¤Õµ"
- "Êѧ¤ì"
- "Êѧ¦¡ÃÃÁ"
- "Êѧ¦¹Ò¡"
- "Êѧ¦Á³±Å"
- "Êѧ¦Á¹µÃÕ"
- "Êѧ¦ÃÒª"
- "Êѧ¦ÊÀÒ"
- "Êѧ¦Ò¯Ô"
- "Êѧ¦ÒÇÒÊ"
- "ÊѧÇÃ"
- "ÊѧÇѸÂÒÂ"
- "ÊѧÇÒÅ"
- "ÊѧÇÒÊ"
- "ÊѧʴÁÀì"
- "ÊѧÊÃäì"
- "ÊѧÊÒÃÇѯ"
- "ÊѧËÃ"
- "ÊѧËóì"
- "ÊѧËÒÃ"
- "ÊѧËÒÃÔÁ·ÃѾÂì"
- "ÊѧËÔµ"
- "Êѧࡵ"
- "Êѧࢻ"
- "Êѧà¤ÃÒÐËì"
- "ÊѧàǤÐ"
- "ÊѧàǪ"
- "ÊѧàÇÂ"
- "ÊѧàÇÕ¹"
- "Êѧâ¤"
- "Êѧ⪹ì"
- "愬"
- "ÊѨ¡ÔÃÔÂÒ"
- "ÊѨ¨Ð"
- "ÊѨ­Ò³"
- "ÊѨ¹ÔÂÁ"
- "ÊѨ¾¨¹ì"
- "愻¯"
- "ÊÑ­¨Ã"
- "ÊÑ­¨ÒÃ"
- "ÊÑ­ªÒµ­Ò³"
- "ÊÑ­ªÒµÔ"
- "ÊÑ­¬Ò"
- "ÊÑ­­Ò"
- "ÊÑ­­Ò³"
- "ÊÑ­­Õ"
- "ÊÑ­»ÃСÒÈ"
- "ÊÑ­Åѡɳì"
- "Êѭਵ¹Ò"
- "Êѳ°Ò¹"
- "Êѳ±ì"
- "ÊѳËì"
- "ÊÑ´"
- "愵"
- "ÊѵµÐ"
- "ÊѵºÃó"
- "ÊѵÂҺѹ"
- "ÊѵÂì"
- "ÊѵǺÒÅ"
- "ÊѵÇÇÔ·ÂÒ"
- "ÊѵÇÒ"
- "ÊѵÇÒÃ"
- "ÊѵÇá¾·Âì"
- "ÊѵÇâÅ¡"
- "ÊѵÇì"
- "ÊÑ·¸ÃÃÁ"
- "ÊÑ·¸Ò"
- "ÊÑ·ÈÒʵÃì"
- "Êѹ"
- "Êѹ´Ò¹"
- "Êѹ´Ò»"
- "ÊѹµÐ»Ò»Ò"
- "ÊѹµÔ"
- "Êѹµì"
- "Êѹ¶ÇäÁµÃÕ"
- "Êѹ¶Ñµ"
- "Êѹ¶ÒÃ"
- "Êѹ·¹Ð"
- "Êѹ·¹Ò¡ÒÃ"
- "Êѹ·Ð"
- "Êѹ·Ñ´"
- "Êѹ¸Ò¹"
- "Êѹ¹ÔºÒµ"
- "Êѹ¹ÔÇÒÊ"
- "Êѹ¹Ôɰҹ"
- "Êѹ¹ÔàÇÊ"
- "Êѹʡĵ"
- "Êѹâ´É"
- "愼"
- "ÊѺ»ÅѺ"
- "ÊѺ»Ðô"
- "ÊÑ»¤Ñº"
- "ÊÑ»´¹"
- "ÊÑ»´ÒËì"
- "ÊÑ»·¹"
- "ÊÑ»ÃÐÂØ·¸ì"
- "Êѻ˧¡"
- "ÊÑ»àËÃèÍ"
- "ÊѾ"
- "ÊѾ¾Ð"
- "ÊѾ¾Ñ­­Ù"
- "ÊѾÂÍ¡"
- "ÊѾà¾àËÃÐ"
- "ÊÑÁºÙóì"
- "ÊÑÁ»ªÑ­­Ð"
- "ÊÑÁ»·Ò"
- "ÊÑÁ»·Ò¹"
- "ÊÑÁ»Âص"
- "ÊÑÁ»ÃÐÊÔ·¸Ôì"
- "ÊÑÁ»ÃÐËÒÃ"
- "ÊÑÁ»ÃÒÂÀ¾"
- "ÊÑÁ»ÃÒÂÔ¡À¾"
- "ÊÑÁ»â¤"
- "ÊÑÁ¼ÑÊ"
- "ÊÑÁ¾Ñ·¸ì"
- "ÊÑÁ¾Ñ¹¸¹ì"
- "ÊÑÁ¾Ñ¹¸ÀÒ¾"
- "ÊÑÁ¾Ñ¹¸ÁÔµÃ"
- "ÊÑÁ¾Ñ¹¸äÁµÃÕ"
- "ÊÑÁ¾Ñ¹¸ì"
- "ÊÑÁ¾Ò¸Ð"
- "ÊÑÁ¾Ø·¸Ð"
- "ÊÑÁÀÒÃÐ"
- "ÊÑÁÀÒɳì"
- "ÊÑÁÁ¹Ò"
- "ÊÑÁÁÒ"
- "ÊÑÁÁÒªÕ¾"
- "ÊÑÁÄ·¸Ôì"
- "ÊÑÁ⾸Ô"
- "ÊÑÁâÁ·¹Õ¡¶Ò"
- "ÊÑÊ´Õ"
- "ÊÑÊÊÐ"
- "ÊÑè§"
- "ÊÑè¹"
- "ÊÑé¹"
- "ÊÒ"
- "ÊÒ¡"
- "ÊÒ¡Ãèì"
- "ÊÒ¡Å"
- "ÊÒ¢Ò"
- "ÊÒ¤Ã"
- "ÊÒ¤Ù"
- "ÊÒ¤àÃÊ"
- "ÊÒ§"
- "ÊÒ´"
- "ÊÒ·Ã"
- "ÊÒ·ÔÊ"
- "ÊÒ¸¡"
- "ÊÒ¸ÂÒÂ"
- "ÊÒ¸ÒóÀÑÂ"
- "ÊÒ¸ÒóÃѰ"
- "ÊÒ¸ÒÃ³ÊØ¢"
- "ÊÒ¸ÒóÐ"
- "ÊÒ¸Òóٻ¡ÒÃ"
- "ÊÒ¸ÒóٻâÀ¤"
- "ÊÒ¸Ôµ"
- "ÊÒ¸Ø"
- "ÊÒ¹"
- "ÊÒ¹ØÈÔÉÂì"
- "ÊÒº"
- "ÊÒºÊÙ­"
- "ÊÒºÒ¹"
- "ÊÒ»"
- "ÊÒÁ"
- "ÊÒÁѤ¤Õ"
- "ÊÒÁÑ­"
- "ÊÒÁÒ¹Âì"
- "ÊÒÁÒö"
- "ÊÒÁÔµ"
- "ÊÒÁÔÀÑ¡´Ôì"
- "ÊÒÁÕ"
- "ÊÒÁà³Ã"
- "ÊÒÂ"
- "ÊÒªÙ"
- "ÊÒÂÂÙ"
- "ÊÒÂѳËì"
- "ÊÒÃ"
- "ÊÒä´Õ"
- "ÊÒöÕ"
- "ÊÒ÷"
- "ÊÒùÔà·È"
- "ÊÒúº"
- "ÊÒúÃó"
- "ÊÒúѭ"
- "ÊÒúѺ"
- "ÊÒúҭ"
- "ÊÒþѴ"
- "ÊÒþѹ"
- "ÊÒþҧ¤ì"
- "ÊÒÃÀÒ¾"
- "ÊÒÃÀÕ"
- "ÊÒÃÇѵÃ"
- "ÊÒÃÐ"
- "ÊÒÃÐá¹"
- "ÊÒÃÑ·¸ì"
- "ÊÒÃÑÁÀì"
- "ÊÒÃÒ³Õ¡Ã"
- "ÊÒÃҹءÃÁ"
- "ÊÒÃÕÃÔ¡¸ÒµØ"
- "ÊÒÅÐǹ"
- "ÊÒÅÔ¡Ò"
- "ÊÒÅÔ¹Õ"
- "ÊÒÅÕ"
- "ÊÒÅÕè"
- "ÊÒÇ"
- "ÊÒÇ¡"
- "ÊÒÇÔ¡Ò"
- "ÊÒÇÔµÃ"
- "ÊÒÇÔµÃÕ"
- "ÊÒʹì"
- "ÊÒÊì¹"
- "ÊÒËÃèÒÂ"
- "ÊÒËÑÊ"
- "ÊÒà¡"
- "ÊÒà˵Ø"
- "ÊÒáËá"
- "ÊÒâ·"
- "ÊÒâê"
- "ÊÒä¶Â"
- "ÊÓ"
- "ÊӤѭ"
- "ÊӷѺ"
- "Êӹǹ"
- "Êӹѡ"
- "ÊÓ¹Ö¡"
- "ÊӺѴÊӹǹ"
- "ÊÓ»ÐËÅѧ"
- "ÊÓ»Ñé¹"
- "ÊÓÁÐËÒ"
- "ÊÓÁÐàÅà·àÁÒ"
- "ÊÓÁÐ⹤ÃÑÇ"
- "ÊÓÃǨ"
- "ÊÓÃÇÁ"
- "ÊÓÃÇÂ"
- "ÊÓÃÇÅ"
- "ÊÓÃÍ¡"
- "ÊÓÃͧ"
- "ÊÓÃѺ"
- "ÊÓÃÒ¡"
- "ÊÓÃÒ­"
- "ÊÓÃÔ´"
- "ÊÓÅÑ¡"
- "ÊÓÅÒ¹"
- "ÊÓÅÕ"
- "ÊÓÊè͹"
- "ÊÓËÃѺ"
- "ÊÓËÒ"
- "ÊÓÍÍÂ"
- "ÊÓÍÒ§"
- "ÊÓà¹Ò"
- "ÊÓà¹Õ§"
- "ÊÓàÀÒ"
- "ÊÓàÃÔ§"
- "ÊÓàÃç¨"
- "ÊÓà˹Õ¡"
- "ÊÓàËÃè"
- "ÊÓá´§"
- "ÊÓáŧ"
- "ÊÓâç"
- "ÊÔ"
- "ÊÔ¡¢Ò"
- "ÊÔ¢Ã"
- "ÊÔ¤ÒÅ"
- "ÊÔ§"
- "ÊÔ§¢Ã"
- "ÊÔ§¤ÒÃ"
- "ÊÔ§¤ÒÅ"
- "ÊÔ§¤â»Ãì"
- "ÊÔ§¤ì"
- "ÊÔ§ÊÒÃÒÊѵÇì"
- "Êԧ˹ҷ"
- "Êԧ˺ѭªÃ"
- "ÊÔ§ËÃÒª"
- "ÊÔ§ËÅ"
- "ÊÔ§ËÒ¤Á"
- "ÊÔ§ËÒʹì"
- "ÊÔ§Ëì"
- "ÊÔ§âµ"
- "ÊÔ­¨¹ì"
- "ÊÔµ"
- "ÊÔ¶ÔÅ"
- "ÊÔ·¸"
- "ÊÔ·¸Ò"
- "ÊÔ·¸Òö"
- "ÊÔ·¸Ô"
- "ÊÔ·¸Ôì"
- "ÊÔ¹"
- "ÊÔ¹¤éÒ"
- "ÊÔ¹¸Ø"
- "ÊÔ¹Õ"
- "ÊÔ¹à¸ÒÇì"
- "ÊÔº"
- "ÊÔÁ¾ÅÕ"
- "ÊÔÃÔ"
- "ÊÔÃÔ¡ÔµÔì"
- "ÊÔÅÒ"
- "ÊÔÇ"
- "ÊÔà¹Ë¡"
- "ÊÔà¹ËÒ"
- "ÊÔà¹èËÒ"
- "ÊÔè§"
- "ÊÔèÇ"
- "ÊÔé¹"
- "ÊÕ"
- "ÊÕ¡Ò"
- "ÊÕ´Í"
- "ÊÕè"
- "ÊÖ¡"
- "Ê׺"
- "Ê×èÍ"
- "ÊØ"
- "ÊØ¡"
- "ÊØ¡¢ì"
- "ÊØ¡Ã"
- "ÊØ¡ÕéÂÒ¡Õé"
- "ÊØ¢"
- "ÊØ¢Ð"
- "ÊØ¢Ò"
- "ÊØ¢ÒÀÔºÒÅ"
- "ÊØ¢ÒÃÁ³ì"
- "ÊØ¢ÒÇ´Õ"
- "ÊØ¢Õ"
- "ÊØ¢ØÁ"
- "ÊØ¢ØÁÒÅ"
- "ÊØ¤µ"
- "ÊØ¤µÔ"
- "ÊØ¤¹¸ÃÊ"
- "ÊØ¤¹¸ì"
- "ÊØ¤Ñ¹¸ì"
- "ÊØ§¡Ò¡Ã"
- "ÊØ§ÊÔ§"
- "ÊØ¨ÃÔµ"
- "ÊØ¨Ë¹Õè"
- "ÊØ¨Ô"
- "ÊØª¹"
- "ÊØªÒ´Ò"
- "ÊØ­"
- "ÊØ­­Ò¡ÒÈ"
- "ÊØ³"
- "ÊØ³ÔÊÒ"
- "ÊØ´"
- "ÊØ´Ò"
- "毵"
- "ÊØµµÐ"
- "ÊØµÔ"
- "ÊØ·¸ÒÇÒÊ"
- "ÊØ·¸Ô"
- "ÊØ·¸ì"
- "ÊØ·Ñȹì"
- "ÊØ¸Ò"
- "ÊØ¸Õ"
- "ÊØ¹·Ã"
- "ÊØ¹·ÃÕ"
- "ÊØ¹·ÃÕÂÀÒ¾"
- "ÊØ¹·ÃÕÂÈÒʵÃì"
- "ÊØ¹Ñ¢"
- "ÊØ¹Ñ¹·ì"
- "毼̗"
- "ÊØºÔ¹"
- "ÊØ¾Ãó"
- "ÊØÀѤ"
- "ÊØÀÒ¾"
- "ÊØÀÒÉÔµ"
- "ÊØÁ"
- "ÊØÁ·ØÁ"
- "ÊØÁ¹"
- "ÊØÁ¹Ò"
- "ÊØÁÒÅÕ"
- "ÊØÃÊÕ˹ҷ"
- "ÊØÃѵÔ"
- "ÊØÃÑÊÇ´Õ"
- "ÊØÃÒ"
- "ÊØÃÒ§¤¹Ò"
- "ÊØÃÒ§¤¹Ò§¤ì"
- "ÊØÃÒÃÑ¡Éì"
- "ÊØÃÒÅÑÂ"
- "ÊØÃÒÉ®Ãì"
- "ÊØÃÔ¹·Ãì"
- "ÊØÃÔ¡ÒÃ"
- "ÊØÃÔ¡ÒÅ"
- "ÊØÃÔ¤µÔ"
- "ÊØÃÔ¤ÃÒÊ"
- "ÊØÃÔ§"
- "ÊØÃÔ¹"
- "ÊØÃÔÂÁ³±Å"
- "ÊØÃÔÂÐ"
- "ÊØÃÔÂѹ"
- "ÊØÃÔÂÒ"
- "ÊØÃÔÂØ»ÃÒ¤Ò"
- "ÊØÃÔÂà¤ÃÒÐËì"
- "ÊØÃÔ๷Ãì"
- "ÊØÃÔàÂÈ"
- "ÊØÃÔâÂ"
- "ÊØÃÕÂì"
- "ÊØÃØèÂÊØÃèÒÂ"
- "ÊØÃàÊÕ§"
- "ÊØÅµèÒ¹"
- "ÊØÇÀÒ¾"
- "ÊØÇÃó"
- "ÊØÇÒ¹"
- "ÊØÇÔ·Âì"
- "ÊØÇÔ¹ÑÂ"
- "ÊØÇÔÁÅ"
- "ÊØÊÒ¹"
- "ÊØË¹Ñµ"
- "ÊØËÃèÒÂ"
- "ÊØàÁ¸"
- "ÊØàÁÃØ"
- "ÊØàËÃèÒ"
- "ÊØàÍ«"
- "ÊØèÁ"
- "ÊØéÁ"
- "ÊÙ"
- "ÊÙ§"
- "ÊÙ¨Ô"
- "ÊÙ­"
- "ÊÙ´"
- "ÊÙµ"
- "ÊÙµÃ"
- "ÊÙµÔ"
- "ÊÙµÔ¡ÃÃÁ"
- "ÊٵԺѵÃ"
- "ÊÙµÔÈÒʵÃì"
- "ÊÙµÔá¾·Âì"
- "ÊÙ·"
- "ÊÙº"
- "ÊÙÊÕ"
- "ÊÙè"
- "ÊÙé"
- "Êࡵ"
- "ÊàµÍÃÔâÍ"
- "Êàµç¡"
- "Êà¹èËì"
- "Ê໡"
- "Ê໡µÃÑÁ"
- "Ê໹"
- "Êà»Ã´ªÕµ"
- "Ê᡹"
- "Êáŧ"
- "ÊâÁÊÃ"
- "Êâê"
- "ÊäµÅì"
- "押"
- "ÊäÅ´ì"
- "Êè§"
- "Êèǹ"
- "ÊèÇÂ"
- "ÊèÍ"
- "Êèͧ"
- "Êè͹"
- "ÊèÒ"
- "ÊèÒ¹"
- "ÊèÒÂ"
- "ÊèÒËÃÕè"
- "ÊèÒàËÅéÒ"
- "ÊèÓ"
- "Êé¹"
- "ÊéÁ"
- "ÊéÁ»èÍÂ"
- "Êéǧ"
- "ÊéÇÁ"
- "ÊéÇÂ"
- "Êéͧ"
- "ÊéÍÁ"
- "Ë¡"
- "˧"
- "˧Êì"
- "˧Í"
- "˧͡"
- "˧ʹ"
- "˧͹"
- "˧ÍÂ"
- "˧ѡ"
- "˧Ѻ"
- "˧ÒÂ"
- "˧Ó"
- "˧ԡ"
- "˧ԧ"
- "˧ÔÁ"
- "˧֡"
- "˧ا˧ԧ"
- "˧ش˧Դ"
- "˧غ"
- "˧ØèÂ"
- "˧èÍÁ"
- "˧èÒ§"
- "˧èÒÇ"
- "Ë­Ô§"
- "Ë­Ôº"
- "Ë­éÒ"
- "Ë´"
- "Ë·ÑÂ"
- "˹"
- "˹ǡ"
- "˹Ǵ"
- "˹Í"
- "˹͡"
- "˹ͧ"
- "˹͹"
- "˹ѡ"
- "˹ѧ"
- "˹ѧÊ×Í"
- "˹Ѻ"
- "˹Ñè¹"
- "˹Ò"
- "˹Ҵ"
- "˹ҹ"
- "˹ÒÁ"
- "˹ÒÇ"
- "˹Ó"
- "˹ÓàÅÕéº"
- "˹Õ"
- "˹պ"
- "˹Õé"
- "˹ֺ"
- "˹Öè§"
- "˹״"
- "˹Ø"
- "˹ع"
- "˹غ"
- "˹ØèÁ"
- "˹ØèÂ"
- "˹Ù"
- "˹çÍÂá¹è"
- "˹èǧ"
- "˹èÇÂ"
- "˹èÇ¡Ե"
- "˹èÍ"
- "˹èÍÂ"
- "˹èÒ"
- "˹èÒ§"
- "˹èÒÂ"
- "˹éÒ"
- "˹éÒ·Õè"
- "ËÁ¡"
- "ËÁ´"
- "ËÁÇ¡"
- "ËÁÇ´"
- "ËÁÍ"
- "ËÁÍ¡"
- "ËÁͧ"
- "ËÁ͹"
- "ËÁͺ"
- "ËÁÍÂ"
- "ËÁÑ¡"
- "ËÁÑ´"
- "ËÁѹ"
- "ËÁѺ"
- "ËÁÑè¹"
- "ËÁÑé¹"
- "ËÁÒ"
- "ËÁÒ¡"
- "ËÁÒ¡ÎÍÊ"
- "ËÁÒ§"
- "ËÁÒ´"
- "ËÁÒÂ"
- "ËÁÔè¹"
- "ËÁÕ"
- "ËÁÕè"
- "ËÁÖ¡"
- "ËÁ×è¹"
- "ËÁØ´"
- "ËÁع"
- "ËÁغ"
- "ËÁغËÁÔº"
- "ËÁØèÂ"
- "ËÁÙ"
- "ËÁÙè"
- "ËÁè¹"
- "ËÁèͧ"
- "ËÁè͹"
- "ËÁèÍÁ"
- "ËÁèÒ"
- "ËÁèÓ"
- "ËÁéÍ"
- "ËÁéÒÂ"
- "Ë¡"
- "Ë´"
- "ËÂÇ¡"
- "ËÂǺ"
- "ËÂÍ¡"
- "ËÂÍ¡àÍÔ¹"
- "ËÂͧ"
- "ËÂÍ´"
- "ËÂÍÁáËÂÁ"
- "ËÂÍÂ"
- "ËÂÑ¡"
- "ËÂѧ"
- "ËÂÑ´"
- "ËÂѹ"
- "ËÂѺ"
- "ËÂÑè§"
- "ËÂÒ¡äÂè"
- "ËÂÒ´"
- "ËÂÒº"
- "ËÂÒÁ"
- "ËÂÒÇ"
- "ËÂÓà»"
- "ËÂÔ¡"
- "ËÂÔº"
- "ËÂÔÁ"
- "ËÂÔè§"
- "ËÂÕ"
- "ËÂØ¡ËÂÔ¡"
- "ËÂØ´"
- "ËÂØº"
- "ËÂØÁËÂÔÁ"
- "ËÂØè¹"
- "ËÂÙ¡ÂÒ"
- "ËÂçͧáËÂç§"
- "ËÂè§"
- "ËÂèͧ"
- "ËÂè͹"
- "ËÂèÍÁ"
- "ËÂèÍÂ"
- "ËÂèÒ"
- "ËôÕ"
- "ËÃÃÉÒ"
- "ËÃÍ"
- "ËÃÍ¡"
- "ËÃÍÂ"
- "ËÃÒ"
- "ËÃÔ"
- "ËÃÔè§"
- "ËÃÕ´"
- "ËÃÕè"
- "ËÃ×Í"
- "ËÃØº"
- "ËÃØºÃÙè"
- "ËÃØºËÃÙè"
- "ËÃØèÁ"
- "ËÃÙ"
- "ËÃçÍÁáËÃçÁ"
- "ËÄ·ÑÂ"
- "ËÄËÃÃÉì"
- "ËÄâË´"
- "ËÅ"
- "聤"
- "ËÅ´"
- "ËŹ"
- "聼"
- "ËÅǧ"
- "ËÅÇÁ"
- "ËÅÍ"
- "ËÅÍ¡"
- "ËÅÍ´"
- "ËÅ͹"
- "ËÅÍÁ"
- "ËÅÐ"
- "ËÅÑ¡"
- "ËÅѧ"
- "ËÅÑ´"
- "ËÅѺ"
- "ËÅÑÇ"
- "ËÅÑè§"
- "ËÅÑè¹"
- "ËÅÒ"
- "ËÅÒ¡"
- "ËÅÒ¹"
- "ËÅÒº"
- "ËÅÒÁ"
- "ËÅÒÂ"
- "ËÅÒÇ"
- "ËÅÔ¡"
- "ËÅÔÁ"
- "ËÅÔÇ"
- "ËÅÔèÇ"
- "ËÅÕ"
- "ËÅÕ¡"
- "ËÅÕÎ×éÍ"
- "ËÅ׺"
- "ËÅØ¡ËÅÔ¡"
- "ËÅØ´"
- "ËÅØ¹"
- "ËÅØº"
- "ËÅØÁ"
- "ËÅÙè"
- "ËÅè¹"
- "ËÅèÁ"
- "ËÅèÍ"
- "ËÅè͹"
- "ËÅèÐ"
- "ËÅéÒ"
- "肤"
- "ËÇ´"
- "Ëǹ"
- "ËÇÂ"
- "ËÇÍ"
- "ËÇÍ´"
- "ËÇÐ"
- "ËÇѧ"
- "ËÇÑ´"
- "ËÇÑÇ"
- "ËÇÑÇÃèÍ"
- "ËÇÑè¹"
- "ËÇÒ"
- "ËÇÒ´"
- "ËÇÒ¹"
- "ËÇÒÁ"
- "ËÇÒÂ"
- "ËÇÓ"
- "ËÇÔ´"
- "ËÇÔÇ"
- "ËÇÕ"
- "ËÇÕ´"
- "ËÇÕè"
- "ËÇ×Í"
- "ËÇØ´ËÇÔ´"
- "ËÇØÁ"
- "ËÇÙ´"
- "ËÇçÍÂ"
- "ËÇèÒ"
- "ËÇèÒ§"
- "ËÇèÒ¹"
- "ËÇéÒ"
- "ËÍ"
- "ËÍ¡"
- "Ëͧ"
- "Ë͹"
- "Ëͺ"
- "ËÍÁ"
- "ËÍÂ"
- "ËÐáá"
- "ËÑ¡"
- "ËÑ´"
- "Ëѵ¶¡ÃÃÁ"
- "Ëѵ¶¡ÒÃ"
- "Ëѵ¶¡Ô¨"
- "Ëѵ¶ºÒÊ"
- "Ëѵ¶ÈÔÅ»ì"
- "Ëѵ¶ÈÖ¡ÉÒ"
- "Ëѵ¶Õ"
- "Ëѵ¶ì"
- "Ëѹ"
- "脼"
- "ËÑÇ"
- "ËÑǺء"
- "ËÑÇ˹éÒ"
- "ËÑÇàÃÒÐ"
- "ËÑÊ"
- "ËÑè¹"
- "ËÑé¹"
- "ËÒ"
- "ËÒ¡"
- "ËÒ§"
- "ËÒ­"
- "ËÒ´"
- "ËÒ¹"
- "ËÒº"
- "ËÒÁ"
- "ËÒÂ"
- "ËÒ¹Ð"
- "ËÒÃ"
- "ËÒÃ×Í"
- "ËÒÇ"
- "ËÓ"
- "ËÔ§ÊÒ"
- "ËÔ§ËéÍÂ"
- "ËÔ´"
- "ËÔ¹"
- "ËÔÁÐ"
- "ËÔÁÒÅÑÂ"
- "ËÔÃÑ­"
- "ËÔÃÔ"
- "ËÔÇ"
- "ËÔè§ËéÍÂ"
- "ËÔé§"
- "ËÔéÇ"
- "ËÕ¹ÂÒ¹"
- "ËÕº"
- "ËÖ"
- "ËÖ§"
- "ËÖè§"
- "Ë×´"
- "Ë×¹"
- "Ë×Í"
- "Ë×è¹"
- "Ë×éÍ"
- "诤"
- "ËØ¹"
- "诼"
- "ËØÂÎÒ"
- "ËØè¹"
- "ËØé¹"
- "ËØéÁ"
- "ËÙ"
- "ËÙ¡"
- "ËÙ´"
- "ËÙè"
- "Ëâ´Á"
- "ËèÁ"
- "Ëèǧ"
- "ËèÇÂ"
- "ËèÍ"
- "Ëè͹"
- "ËèÒ"
- "ËèÒ§"
- "ËèÒ¹"
- "ËèÒÁ"
- "Ëéǧ"
- "Ëéǹ"
- "ËéÇÂ"
- "ËéÍ"
- "Ëéͧ"
- "ËéÍÁ"
- "ËéÍÂ"
- "ËéÒ"
- "ËéÒ§"
- "ËéÒÁ"
- "ËéÒÇ"
- "ËéÓ"
- "Í¡"
- "Í¡µÑ­­ØµÒ"
- "Í¡µÑ­­Ù"
- "Í¡¹Ôɰì"
- "͡óÕÂì"
- "Í¡ÃÃÁ¡ÃÔÂÒ"
- "Í¡ØÈÅ"
- "ͤµÔ"
- "ͤҸ"
- "ͧ¡ì"
- "ͧ¤ªÒµÔ"
- "ͧ¤Á¹µÃÕ"
- "ͧ¤ÁÃÃÉ"
- "ͧ¤ÃÑ¡Éì"
- "ͧ¤ÇÔ·ÂÒ"
- "ͧ¤Ò¾Â¾"
- "ͧ¤ØÅ"
- "ͧ¤ØÅÕ"
- "ͧ¤ì"
- "ͧ¤ì¡Ã"
- "ͧ¤ì¡ÒÃ"
- "ͧÈÒ"
- "ͧÍÒ¨"
- "ͧØè¹"
- "ͨÅÒ"
- "ͨԵµÔ"
- "ͨԹµÒ"
- "ͨԹäµÂ"
- "ͨÔÃÐ"
- "ͪ"
- "ͪÒ"
- "ͪԹ"
- "ͪԹÕ"
- "ͪÔÃ"
- "ͯÇÕ"
- "ͳÔ"
- "ͳØ"
- "ͳÙ"
- "Í´"
- "Í´Ô¶Õ"
- "Í´ÔÈÃ"
- "Í´ÔÈÇÃ"
- "Í´ÔÈÑÂ"
- "Í´Ôà·¾"
- "Í´Ôàá"
- "Í´Õµ"
- "Í´ØÅ"
- "Í´ØÅÂ"
- "Í´ØÅÂì"
- "͵Ԫҵ"
- "͵ÔÁÒ¹Ð"
- "͵ÔÃÒª"
- "͵ÔÊÒÃ"
- "͵Ôàá"
- "Í·Ô¹¹Ò·Ò¹"
- "͸ÃÃÁ"
- "͸ԡÁÒÊ"
- "͸ԡóì"
- "͸ԡÇÒÃ"
- "Í¸Ô¡ÊØÃ·Ô¹"
- "͸ԡÒÃ"
- "͸ԤÁ"
- "͸ԯ°Ò¹"
- "͸Ժ´Õ"
- "͸ԺÒÂ"
- "͸Ի"
- "͸ԻäµÂ"
- "͸ÔÃÒª"
- "͸Ôɰҹ"
- "͸֡"
- "͹§¤³Ð"
- "͹§¤àÅ¢Ò"
- "͹§¤ì"
- "͹§àÅ¢"
- "͹¸¡ÒÃ"
- "͹ѵµÒ"
- "͹ѹµì"
- "͹Ҥµ"
- "͹ҤÒÁÕ"
- "͹ҨÒÃ"
- "͹Ҷ"
- "͹ҶÒ"
- "͹ҷÃ"
- "͹ҸԻäµÂ"
- "͹ÒÁÑÂ"
- "͹Òê¹"
- "͹ÒøÃÃÁ"
- "͹ÒÃÂÐ"
- "͹ÒÅÑÂ"
- "͹Ԩ"
- "͹Ԩ¨Ñ§"
- "͹Ԩ¨Ò"
- "͹ԯ°ÒÃÁÂì"
- "͹ÔÂÁ"
- "͹Öè§"
- "͹Ø"
- "͹ءÃ"
- "͹ءÃÁ"
- "͹ءÃÃÁ¡ÒÃ"
- "͹ءҪҴ"
- "͹ءÒÃ"
- "͹ءÙÅ"
- "͹بÃ"
- "͹ت¹"
- "͹تÒ"
- "͹تҵ"
- "͹تԵ"
- "͹حҵ"
- "͹حÒâµµØÅÒ¡ÒÃ"
- "͹طԹ"
- "͹غ·"
- "͹غÒÅ"
- "͹ػÃÔ­­Ò"
- "͹ؾ§Èì"
- "͹ؾѹ¸ì"
- "͹ØÀÃÃÂÒ"
- "͹ØÀÃÔÂÒ"
- "͹ØÀÒ¤"
- "͹ØÁѵÔ"
- "͹ØÁÒµÃÒ"
- "͹ØÁÒ¹"
- "͹ØÁÙÅ"
- "͹ØÃѡɹÔÂÁ"
- "͹ØÃÑ¡Éì"
- "͹ØÃÒª"
- "͹ØÃÙ»"
- "͹ØÇ§Èì"
- "͹ØÇѵ"
- "͹ØÈÒÊ¡"
- "͹ØÈÒʵÃÒ¨ÒÃÂì"
- "͹ØÈÒʹì"
- "͹ØÈÔɯì"
- "͹ØÊµÔ"
- "͹ØÊ¹¸Ô"
- "͹ØÊÃ"
- "͹ØÊóì"
- "͹ØÊÑ­­Ò"
- "͹ØÊÑÂ"
- "͹ØÊÒÇÃÕÂì"
- "͹ØÊÒʹÕ"
- "͹Øà¤ÃÒÐËì"
- "͹Øà¶ÃÐ"
- "͹ØâÁ·¹Ò"
- "͹Øâ¤"
- "͹ØâÅÁ"
- "ͺ"
- "ͺÒÂ"
- "ͺÒÂÀÙÁÔ"
- "ͺÒÂÁØ¢"
- "Í»Á§¤Å"
- ";¾"
- ";ÒÃìµàÁ¹µì"
- "ÍÀÑÂ"
- "ÍÀÔª¹"
- "ÍÀÔªÒµ"
- "ÍÀÔ­­Ò"
- "ÍÀÔ¸ÃÃÁ"
- "ÍÀÔ¸Ò¹"
- "ÍÀԹѹ·ì"
- "ÍÀÔ¹ÑÂ"
- "ÍÀÔ¹ÔËÒÃ"
- "ÍÀÔºÒÅ"
- "ÍÀÔ»ÃѪ­Ò"
- "ÍÀÔ»ÃÒÂ"
- "ÍÀÔÁËÒÍÓ¹Ò¨"
- "ÍÀÔÁÒ¹Ð"
- "ÍÀÔÁØ¢"
- "ÍÀÔôÕ"
- "ÍÀÔÃÁÂì"
- "ÍÀÔÃÑ¡Éì"
- "ÍÀÔÅÑ¡¢ÔµÊÁÑÂ"
- "ÍÀÔÇѹ·ì"
- "ÍÀÔÇÒ·¹ì"
- "ÍÀÔÊÁÑÂ"
- "ÍÀÔÊÁÒ¨ÒÃ"
- "ÍÀÔÊÁ⾸Ô"
- "ÍÀÔÊÑÁ⾸Ô"
- "ÍÀÔÊÔ·¸Ôì"
- "ÍÀÔàÅ»¹ì"
- "ÍÀÔàÉ¡"
- "ÍÀÔä¸Â"
- "ÍÁ"
- "ÍÁµÐ"
- "ÍÁ¹ØÉÂì"
- "ÍÁÃ"
- "ÍÁÃÒ"
- "ÍÁÃÒÇ´Õ"
- "ÍÁÃÔ¹·Ãì"
- "ÍÁĵ"
- "ÍÁĵÂÙ"
- "ÍÁÔµÃ"
- "ÍÁàÃÈ"
- "ÍÂÒ¡"
- "ÍÂØ¸ÂÒ"
- "ÍÂÙè"
- "ÍÂèÒ"
- "ÍÂèÒ§"
- "ÍÃ"
- "ÍêÃ"
- "ÍÃó¾"
- "ÍÃö"
- "ÍÃöҸԺÒÂ"
- "ÍÃËÐ"
- "ÍÃËѧ"
- "ÍÃËѹµì"
- "ÍÃÑ­"
- "ÍÃÔ"
- "ÍÃÔºؤ¤Å"
- "ÍÃÔÂÐ"
- "ÍÃÔÊâµàµÔÅ"
- "ÍÃØ³"
- "ÍÃØâ³·ÑÂ"
- "ÍÃä·"
- "ÍÃèÍÂ"
- "ÍÃèÒÁ"
- "Íŧ¡µ"
- "Íŧ¡Ã³ì"
- "Íŧ¡ÒÃ"
- "ÍÅǹ"
- "ÍÅËÁèÒ¹"
- "ÍÅѧ¡ÒÃ"
- "ÍÅѪªÕ"
- "ÍÅÖè§©Öè§"
- "ÍÅàǧ"
- "ÍÅèͧ©èͧ"
- "ÍÅèÒ§©èÒ§"
- "ÍÇ¡ÒÈ"
- "ÍÇ´"
- "ÍǵÒÃ"
- "Íǹ"
- "ꂼ"
- "ÍÇÁ§¤Å"
- "ÍÇÂ"
- "ÍÇÅ"
- "ÍÇÊÒ¹"
- "ÍÇËÒÃ"
- "ÍÇÑÂÇÐ"
- "ÍÇÔªªÒ"
- "Íʧä¢Â"
- "Íʹպҵ"
- "ÍÊÁ¡ÒÃ"
- "ÍÊÁÁÒµÃ"
- "ÍÊþÔÉ"
- "ÍÊѧËÒÃÔÁ·ÃѾÂì"
- "ÍÊÑ­­Õ"
- "ÍÊÑ­á´ËÇÒ"
- "ÍÊѵÂì"
- "ÍÊÕµÔ"
- "ÍÊØ¨Ô"
- "ÍÊØ¹ÕºÒµ"
- "ÍÊØÃ¡ÒÂ"
- "ÍÊØÃÕ"
- "ÍÊÙÃ"
- "ÍËѧ¡ÒÃ"
- "ÍËÔ§ÊÒ"
- "ÍËÔÇÒµ¡âä"
- "ÍÍ"
- "ÍÍ¡"
- "ÍÍ¡«Ôਹ"
- "ÍÍ¡«Ôപѹ"
- "ÍÍ¡­Ò"
- "Í͡䫴ì"
- "ÍÍ´"
- "ÍÍ´ÔâÍ"
- "Í͹ªÍÃì"
- "Í͹«Í¹"
- "Í͹«ì"
- "Í͹äŹì"
- "ÍÍ»ªÑ¹"
- "ÍÍ»à¨ç¡µì"
- "ÍÍ¿"
- "ÍÍ¿ªÍÃì"
- "ÍÍ¿¿ÔÈ"
- "ÍÍÁ"
- "ÍÍÃÒà¤ÔÅ"
- "ÍÍÃì᡹"
- "ÍÍÊ"
- "ÍÍÊàµÃàÅÕÂ"
- "ÍФÃéÒÇ"
- "ÍдÃÕ¹ÒÅÔ¹"
- "ÍеÍÁ"
- "ÍÐÃéÒÍÃèÒÁ"
- "ÍÐÅØèÁÍÅèÇÂ"
- "ÍÐÅØéÁÍÅèÇÂ"
- "ÍÐÅÙÁÔà¹ÕÂÁ"
- "ÍÐà¤×éÍ"
- "ÍÐà«·ÔÅÕ¹"
- "ÍÐäÃ"
- "ÍÐäËÅè"
- "ÍÑ¡"
- "ÍÑ¡¢"
- "ÍÑ¡¢ÃÇÔ¸Õ"
- "ÍÑ¡¢ÃÇԺѵÔ"
- "ÍÑ¡¢ÃÊÁÑÂ"
- "ÍÑ¡¢ÃÐ"
- "ÍÑ¡ÉÃ"
- "ÍÑ¡ÉÐ"
- "ÍÑ¡àʺ"
- "ÍÑ¡â¢"
- "ÍѤ¤Ð"
- "ÍѤ¤Õ"
- "ÍѤ¹Õ"
- "ÍѤêÒÂÒ"
- "ÍѤÃÁàËÊÕ"
- "ÍѤÃÃÒª·Ùµ"
- "ꄤ"
- "Íѧ¡ÄÉ"
- "Íѧ¡ÐÅØ§"
- "Íѧ¤³Ò"
- "Íѧ¤ÒÃ"
- "Íѧ¤ÒÊ"
- "ÍѧʵÃÍÁ"
- "ÍѧʹÒ"
- "ÍѨ¡ÅѺ"
- "ÍѨ¨Ñ¹µì"
- "ÍѨ¨ÑÂ"
- "ÍѨ¨Ô"
- "ÍѨ©ÃÒ"
- "ÍѨ©ÃÔºؤ¤Å"
- "ÍѨ©ÃÔÂÐ"
- "ÍѨ¹Ò"
- "ÍѪ¬Ò"
- "ÍѪ¬ÒÊÑÂ"
- "ÍÑ­ª¹Ð"
- "ÍÑ­ªÅÕ"
- "ÍÑ­ªÑ¹"
- "ÍÑ­»ÃСÒÈ"
- "ÍÑ­Á³Õ"
- "ÍÑ­ÁÑ­­Ð"
- "ÍÑ­ÃÙ»"
- "ÍÑ­àªÔ­"
- "Íѯ"
- "Íѯ°Ð"
- "ꄡ"
- "ÍѰÌÊ"
- "ÍѰÔ"
- "ÍѲ¨Ñ¹·Ãì"
- "ÍѲÀÒ¤"
- "ÍѲÁ³±Å"
- "ÍѲÁÒÊ"
- "ÍѲÃѵµÔ"
- "Íѳ±ªÐ"
- "Íѳ±Ð"
- "Íѳ±Ò¡ÒÃ"
- "ÍÑ´"
- "Íѵ¤Ñ´"
- "ÍѵªÕÇ»ÃÐÇѵÔ"
- "ÍѵµÐ"
- "ÍѵµÒ"
- "ÍѵµÒ¸Ô»äµÂ"
- "Íѵ¹ÑÂ"
- "ÍѵÀÒ¾"
- "ÍѵÃÒ"
- "ÍѵÇÔ¹ÔºÒµ¡ÃÃÁ"
- "Íѵâ¹ÁѵÔ"
- "ÍѸÂÒÈÑÂ"
- "Íѹ"
- "Íѹ´Ñº"
- "ÍѹµÃ¸Ò¹"
- "ÍѹµÃÒÂ"
- "Íѹ¸¡ÒÃ"
- "Íѹ¸¾ÒÅ"
- "Íѹà´ÍÃì"
- "ꄼ"
- "ÍÑ»ÀÒ¤Âì"
- "ÍÑ»Á§¤Å"
- "ÍÑ»ÂÈ"
- "ÍÑ»ÃÐÁÒ³"
- "ÍÑ»ÃÒªÑÂ"
- "ÍÑ»ÃÕÂì"
- "ÍÑ»Åѡɳì"
- "ÍÑ»ÊÃ"
- "ÍÑ»à»ËÔ"
- "ÍѾà¡Ã´"
- "ÍѾവ"
- "ÍѾഷ"
- "ÍÑ¿"
- "ÍÑÁ¾Ã"
- "ÍÑÁ¾Ä¡Éì"
- "ÍÑÁ¾Ò"
- "ÍÑÁ¾Òµ"
- "ÍÑÁ¾Øª"
- "ÍÑÁÊàµÍÃì´ÑÁ"
- "ÍÑ¡Ò"
- "ÍÑ¡ÒÃ"
- "ÍÑÂÂÔ¡Ò"
- "ÍÑŨÕàÃÕÂ"
- "ÍÑźÑéÁ"
- "ÍÑźÒà¹ÕÂ"
- "ÍÑÅàºà¹ÕÂ"
- "ÍÑȨÃÃÂì"
- "ÍÑÈÇÔ¹"
- "ÍÑÈÇÔ¹Õ"
- "ÍÑÈà¨ÃÕÂì"
- "ÍÑÉ®ÒÂØ·"
- "ÍÑÉ®ÒÇØ¸"
- "ÍÑÊ´§"
- "ÍÑÊ´§¤µ"
- "ÍÑÊ´Ã"
- "ÍÑʹÕ"
- "ÍÑÊÊÐ"
- "ÍÑÊÊÒÊÐ"
- "ÍÑÊÊØ"
- "ÍÑé¡"
- "ÍÑé§ÂÕè"
- "ÍÑé§âÅè"
- "ÍÑé¹"
- "ÍÑê¡"
- "ÍÑë¹"
- "ÍÒ"
- "ÍÒ¡Ã"
- "ÍÒ¡Ñ»¡ÔÃÔÂÒ"
- "ÍÒ¡ÒÃ"
- "ÍÒ¡ÒÈ"
- "ÍÒ¡ÙÅ"
- "ÍÒ¡éÒ"
- "ÍÒ¢ÂÒ¹"
- "ÍÒ¤Á"
- "ÍҤѹµØ¡Ð"
- "ÍÒ¤ÒÃ"
- "ÍÒ¤à¹Âì"
- "ÍÒ¦Òµ"
- "ÍÒ§¢¹Ò§"
- "ÍÒ¨"
- "ÍÒ¨Á"
- "ÍÒ¨ÃÔÂÇѵÃ"
- "ÍÒ¨Ò´"
- "ÍÒ¨ÒÃÂì"
- "ÍÒ¨Ô³"
- "ÍÒª­Ò"
- "ÍÒªÒ"
- "ÍÒªÒä¹Â"
- "ÍÒªÕ¾"
- "ÍÒªÕÇÈÖ¡ÉÒ"
- "ÍÒªÕÇÐ"
- "ÍÒ­Ò"
- "ÍҳѵÔ"
- "ÍÒ³Ò"
- "ÍÒ´"
- "ÍÒ´ÙÃ"
- "ÍÒµÁÀÒ¾"
- "ÍÒµÁÒ"
- "ÍÒ¶Ãþ³ì"
- "ÍÒ¶Ãþì"
- "ÍÒ·Ã"
- "ÍÒ·Ô"
- "ÍÒ·ÔµÂì"
- "ÍÒ¹"
- "ÍÒ¹ÔʧÊì"
- "ÍÒ¹ØÀÒ¾"
- "ÍÒº"
- "ÍҺѵÔ"
- "ÍÒ¾Ò¸"
- "ÍÒ¿¡Ò¹Ôʶҹ"
- "ÍÒ¿ÃÔ¡Ò"
- "ÍÒÀóì"
- "ÍÒÀѾ"
- "ÍÒÀÒ"
- "ÍÒÁÔÊ"
- "ÍÒÂ"
- "ÍÒµ¹Ð"
- "ÍÒÂÑ´"
- "ÍÒÂØ"
- "ÍÒÂØÃÈÒʵÃì"
- "ÍÒÂØÃàǪ"
- "ÍÒÂØÃá¾·Âì"
- "ÍÒúԤ"
- "ÍÒÃÁ³ì"
- "ÍÒê¹"
- "ÍÒêҵÔ"
- "ÍÒøÃÃÁ"
- "ÍÒûÃÐà·È"
- "ÍÒÃÂÐ"
- "ÍÒÃÂѹ"
- "ÍÒÃÑ¡¢Ò"
- "ÍÒÃÑ¡Éì"
- "ÍÒÃÑÁÀ¡¶Ò"
- "ÍÒÃÑÁÀº·"
- "ÍÒÃÒ¸¹Ò"
- "ÍÒÃÒÁ"
- "ÍÒÃÒÁÔ¡"
- "ÍÒÃÒàºÕÂ"
- "ÍÒÃÕ"
- "ÍÒÃ줵ԡ"
- "ÍÒÃìૹÍÅ"
- "ÍÒÅ»¹Ð"
- "ÍÒÅÐÇÒ´"
- "ÍÒÅѡɳì"
- "ÍÒÅÑÂ"
- "ÍÒÅÑÇ"
- "ÍÒÇ"
- "ÍÒÇóì"
- "ÍÒÇÒÊ"
- "ÍÒÇÒËÐ"
- "ÍÒÇØ¸"
- "ÍÒÇØâÊ"
- "ÍÒÇì"
- "ÍÒÈÃÁ"
- "ÍÒÈÑÂ"
- "ÍÒÈÔÃÇÒ·"
- "ÍÒʹÐ"
- "ÍÒʹì"
- "ÍÒÊÑ­"
- "ÍÒÊÒ"
- "ÍÒÊÒÌ˺٪Ò"
- "ÍÒÊÙÃ"
- "ÍÒËÃѺ"
- "ÍÒËÒÃ"
- "ÍÒà¨Õ¹"
- "ÍÒà«ÕÂ"
- "ÍÒàÃàºÕÂ"
- "ÍÒàǤ"
- "ÍÒàÇÈ"
- "ÍÒàÈÕÂÃÇÒ·"
- "ÍÓ"
- "ÍÓ¹ÇÂ"
- "ÍÓ¹Ò¨"
- "ÍӾйÓ"
- "ÍӾѹ"
- "ÍÓÁĵ"
- "ÍÓÁËÔµ"
- "ÍÓÁÒµÂì"
- "ÍÓÅÒ"
- "ÍÓàÀÍ"
- "ÍÓä¾"
- "ÍÔ§"
- "ÍÔ§¤ì"
- "ÍÔ§¤ìà¨çµ"
- "ÍÔ¨©Ò"
- "Íԩѹ"
- "ÍÔ¯°ÒÃÁ³ì"
- "ÍÔ°"
- "ÍÔ´"
- "ÍÔµ¶Õ"
- "ÍÔµÒÅÕ"
- "ÍÔµÒàÅÕ¹"
- "ÍÔ·¸Ô"
- "ÍÔ¹"
- "ÍÔ¹«ÙÅÔ¹"
- "ÍÔ¹·¹ÔÅ"
- "ÍÔ¹·¼ÅÑÁ"
- "ÍÔ¹·Ã¸¹Ù"
- "ÍÔ¹·ÃǧÈì"
- "ÍÔ¹·ÃÇÔàªÕÂÃ"
- "ÍÔ¹·ÃÒ"
- "ÍÔ¹·ÃÒà¹çµ"
- "ÍÔ¹·ÃÕ"
- "ÍÔ¹·ÃÕÂÊѧÇÃ"
- "ÍÔ¹·ÃÕÂì"
- "ÍÔ¹·Ãì"
- "ÍÔ¹¾Øµ"
- "ÍÔ¹¿ÃÒàô"
- "ÍÔ¹¿ÍÃìÁÔ¡"
- "ÍԹѧ"
- "ÍÔ¹à´ÕÂ"
- "ÍÔ¹à´Õ¹ᴧ"
- "ÍÔ¹àµÍÃì"
- "ÍÔ¹àµÍÃìà¹çµ"
- "ÍÔ¹àµÍÃìà¿«"
- "ÍÔ¹à·Å"
- "ÍÔ¹à·ÍÃì๵"
- "ÍÔ¹à·ÍÃìà¹çµ"
- "ÍÔ¹à·ÍÃìà¿«"
- "ÍԹⴹÔà«ÕÂ"
- "ÍԹⴹÕà«ÕÂ"
- "ÍÔ¹â´à«ÕÂ"
- "ÍÔÁ¾ÍÃìµ"
- "ÍÔÁàÁ¨"
- "ÍÔÂÔ»µì"
- "ÍÔÃÔÂÒº¶"
- "ÍÔÈÇÃ"
- "ÍÔɯÕ"
- "ÍÔɯì"
- "ÍÔÊ"
- "ÍÔʵÃÕ"
- "ÍÔÊÃÀÒ¾"
- "ÍÔÊÃÐ"
- "ÍÔÊÃÒàÍÅ"
- "ÍÔÊÃÔÂÂÈ"
- "ÍÔÊÃÔÂÐ"
- "ÍÔÊÃÔÂÒÀóì"
- "ÍÔÊÊÒ"
- "ÍÔÊÔ"
- "ÍÔÊÕ"
- "ÍÔËÁèÒÁ"
- "ÍÔËÃèÒ¹"
- "ÍÔËÅÑ¡ÍÔàËÅ×èÍ"
- "ÍÔàÅ硵Ã͹"
- "ÍÔàÅç¡·Ã͹ԡÊì"
- "ÍÔàÅç¡â·¹"
- "ÍÔèÁ"
- "ÍÕ"
- "ÍÕ¡"
- "ÍÕ¡Ò"
- "ÍÕ¡éÍ"
- "ÍÕ¤ÍÁàÁÔÃì«"
- "ÍչاµØ§¹Ñ§"
- "ÍÕÁÙ"
- "ÍÕÂÔ»µì"
- "ÍÕÅØè©ØÂá©¡"
- "ÍÕÅØéÁ"
- "ÍÕÊÒ¹"
- "ÍÕÊØ¡ÍÕãÊ"
- "ÍÕËÃͺ"
- "ÍÕËÅÑ¡ÍÔàËÅ×èÍ"
- "ÍÕËÅÕ"
- "ÍÕàµéÍ"
- "ÍÕà·ÍÃì"
- "ÍÕàÁÅì"
- "ÍÕàËÅÐà¢Ð¢Ð"
- "ÍÕâËÅ¡â¢Å¡à¢Å¡"
- "ÍÕê´"
- "ÍÕë"
- "ÍÖ"
- "ÍÖ¡"
- "ÍÖ¡·Ö¡"
- "ÍÖ¡ÍÑ¡"
- "ÍÖ§"
- "ÍÖ§ÁÕè"
- "ÍÖ§ÍÅ"
- "ÍÖ´"
- "ÍÖè§"
- "ÍÖé§"
- "ÍÖé´·Öè´"
- "ÍÖê¡"
- "Í×´"
- "Í×Í"
- "Í×è¹"
- "Í×é¹"
- "Í×éÍ"
- "ÍØ"
- "ÍØ¡"
- "ÍØ¡¡ÒºÒµ"
- "ÍØ¡Äɯì"
- "ÍØ¨¨ÒÃÐ"
- "ÍØ¨Ò´"
- "ÍØ¨ÒÃÁÃä"
- "ÍØ¨à©·"
- "ÍØªØ"
- "ÍØ¯°Ò¡ÒÃ"
- "ÍØ³ËÀÙÁÔ"
- "ÍØ³ËÐ"
- "ÍØ³ËÒ¡ÒÃ"
- "ÍØ³ËÔÊ"
- "ÍØ³Ò"
- "ÍØ´"
- "ÍØ´Á"
- "ÍØ´Ã"
- "ÍØ´Ë¹Ø¹"
- "ÍØµ¾Ô´"
- "ÍØµÃ´Ôµ¶ì"
- "ÍØµÃÔ"
- "ÍØµÅØ´"
- "ÍØµÊÒË¡ÃÃÁ"
- "ÍØµÊÒËÐ"
- "ÍØµÊèÒËì"
- "ÍØµØ"
- "ÍØ·¡"
- "ÍØ·¸Ã³ì"
- "ÍØ·¸Ñ¨"
- "ÍØ·ÂÒ¹"
- "ÍØ·Ã"
- "ÍØ·ÅØÁ"
- "ÍØ·Ñª"
- "ÍØ·ÑÂ"
- "ÍØ·Ò¹"
- "ÍØ·ÒÃ"
- "ÍØ·ÒËóì"
- "ÍØ·ÔÈ"
- "ÍØ·ØÁ¾Ã"
- "ÍØ¸Ñ¨"
- "꯼"
- "ÍØºÅ"
- "ÍØºÍÔº"
- "ÍØºÐ"
- "ÍØºÑµÔ"
- "ÍØºÒ·"
- "ÍØºÒ·Çì"
- "ÍØºÒÂ"
- "ÍØºÒÊ¡"
- "ÍØºÒÊÔ¡Ò"
- "ÍØºêÐ"
- "ÍØ»"
- "ÍØ»¡Ã³ì"
- "ÍØ»¡ÃÁ"
- "ÍØ»¡ÒÃÐ"
- "ÍØ»¡ÒÃÕ"
- "ÍØ»¶ÑÁÀ¡"
- "ÍØ»¶ÑÁÀì"
- "ÍØ»·Ò¹"
- "ÍØ»·Ùµ"
- "ÍØ»¹ÑÂ"
- "ÍØ»¹Ò¡"
- "ÍØ»¹ÔÊÑÂ"
- "ÍØ»ÁÒ"
- "ÍØ»ÁÒ¹"
- "ÍØ»ÃÒª"
- "ÍØ»Ê§¤ì"
- "ÍØ»ÊÁº·"
- "ÍØ»ÊÃä"
- "ÍØ»ÊÑÁ»·Ò"
- "ÍØ»Ñª¬ÒÂÐ"
- "ÍØ»Ñª¬ÒÂì"
- "ÍØ»Ñ¯°Ò¡"
- "ÍØ»Ñ¯°Ò¹Ð"
- "ÍØ»Ñ·ÇѹµÃÒÂ"
- "ÍØ»Ñ·Çà˵Ø"
- "ÍØ»Ò·Ò¹"
- "ÍØ»âÀ¤"
- "ÍØ»â¤"
- "ÍØ»âÅ¡¹ì"
- "ÍØ»äÁÂ"
- "ÍØÂ"
- "ÍØÃÐ"
- "ÍØÃÑ§ÍØµÑ§"
- "ÍØÃÒ"
- "ÍØÃØ"
- "ÍØÃØ§Íصѧ"
- "ÍØÉ³ÕÂì"
- "ÍØÉÒ"
- "ÍØÊÒ"
- "ÍØÊØ"
- "ÍØàº¡¢Ò"
- "ÍØàËÁè"
- "ÍØáÇé"
- "ÍØâ¦É"
- "ÍØâºÊ¶"
- "ÍØâÁ§¤ì"
- "ÍØäÃ"
- "ÍØè¹"
- "ÍØèÂ"
- "ÍØé§"
- "ÍØéÁ"
- "ÍØéÂ"
- "ÍØêÂ"
- "ÍÙ"
- "ÍÙ°"
- "ÍÙ´"
- "ÍÙÁ"
- "ÍÙÃØ"
- "ÍÙè"
- "ÍÙé"
- "ÍÙéÍÕé"
- "ÍÙëÍÕë"
- "Íà¨Å¡"
- "Íà¨ÅÐ"
- "Í๡"
- "Í๡¤Ø³"
- "Í๨͹Ҷ"
- "Íà»ËÔ"
- "ÍàÁ"
- "ÍàÁÃԡѹ"
- "ÍàÁÃÔ¡Ò"
- "ÍàǨÕ"
- "Íá´»àµÍÃì"
- "Íâ¦ÉÐ"
- "Íâ³·ÑÂ"
- "Í⹪Ò"
- "Íâ¹´Òµ"
- "ÍâÅËÐ"
- "ÍâÈ¡"
- "ÍâËÊÔ"
- "Íèͧ"
- "Íè͹"
- "ÍèÍÂ"
- "ÍèÒ"
- "ÍèÒ§"
- "ÍèÒ¹"
- "ÍèÒÇ"
- "ÍèÓ"
- "Íé¹"
- "ÍéÇ¡"
- "Íéǹ"
- "ÍéÍ"
- "Íé͹"
- "Íé͹áÍé¹"
- "ÍéÍÁ"
- "ÍéÍÂ"
- "ÍéÍÂÊéÍÂ"
- "ÍéÍÂÍÔè§"
- "ÍéÒ"
- "ÍéÒ§"
- "ÍéÒÂ"
- "ÍéÒÇ"
- "ÍéÓÍÖé§"
- "ÍêÍ´"
- "ÍêÐ"
- "ÍëÍ"
- "Íëͧ"
- "ÍëÍÂ"
- "Ρà¡Õé¹"
- "Îǧ«ØéÂ"
- "Îǹ"
- "낼"
- "ÎÍ¡¡Õé"
- "ÎÍ´"
- "Î͹â¹ÅÙÅÙ"
- "ÎÍÃìâÁ¹"
- "ÎÍÅѹ´Ò"
- "ÎÍÅᏴì"
- "ÎÐ"
- "ÎÑ¡"
- "Îѧ¡ÒÃÕ"
- "ÎÑè¹"
- "ÎÑéÇ"
- "ÎÒ"
- "ÎÒÁ"
- "ÎÒÃì´´Ôʤì"
- "ÎÒÃì´áÇÃì"
- "ÎÒàÃçÁ"
- "ÎÒâÅÇÕ¹"
- "ÎÔµ"
- "ÎÔ¹´Ù"
- "ÎÔ»â»â»àµÁÑÊ"
- "ÎÔÊ·ÕàÃÕÂ"
- "ÎÕàÅÕÂÁ"
- "ÎÕâÃè"
- "ÎÖ"
- "ÎÖ¡"
- "ÎÖ´"
- "ÎÖ´ÎÑ´"
- "ÎÖÁ"
- "ÎÖÂ"
- "ÎÖèÁ"
- "Î×´ÎÒ´"
- "Î×Í"
- "Î×èÍ"
- "Î×éÍ"
- "민"
- "ÎØÂàÅÎØÂ"
- "ÎÙ¡"
- "ÎÙÁ"
- "ÎÙé"
- "ÎèÍ"
- "Îèͧ¡§"
- "Îèͧàµé"
- "ÎéÍ"
- "ÎéÒ"
- "à¡"
- "à¡¡ÁÐàËá"
- "ࡨÔÍÒ¨ÒÃÂì"
- "ࡳ±ì"
- "à¡´"
- "ࡵØ"
- "ࡹ"
- "à¡Á"
- "à¡ÁÊì"
- "à¡Â"
- "à¡Ã§"
- "à¡Ã´"
- "à¡ÃÍÐ"
- "à¡ÃÒÐ"
- "à¡ÃÔ¡"
- "à¡ÃÔè¹"
- "à¡ÃÕ¡"
- "à¡ÃÕ§"
- "à¡ÃÕ¹"
- "à¡ÃÕº"
- "à¡ÃÕÂÁ"
- "à¡ÃÕÂÇ"
- "à¡ÃÕéÂÇ"
- "à¡Ãç§"
- "à¡Ãç´"
- "à¡ÃèÍ"
- "à¡Å"
- "à¡ÅÍ"
- "à¡ÅÒ"
- "à¡ÅÕ§"
- "à¡ÅÕ´"
- "à¡ÅÕÂÇ"
- "à¡ÅÕèÂ"
- "à¡ÅÕéÂ"
- "à¡ÅÕé§"
- "à¡Å×Í"
- "à¡Å×Í¡"
- "à¡Å×è͹"
- "à¡Å×éÍ"
- "à¡Å×é͹"
- "à¡Åç´"
- "à¡ÅéÒ"
- "à¡ÇÕ¹"
- "à¡È"
- "à¡ÈÒ"
- "à¡ÈÔ¹Õ"
- "à¡ÉµÃ"
- "à¡ÉµÃ¡Ã"
- "à¡ÉµÃ¡ÃÃÁ"
- "à¡ÉÁ"
- "à¡ÉÕ³"
- "à¡ÉÕ¹"
- "à¡ÊÃ"
- "à¡Í"
- "à¡ÍÃì"
- "à¡ÍÔªÒ"
- "à¡Ð"
- "à¡Ð¡Ð"
- "à¡Ò"
- "à¡Òµì"
- "à¡Ò·Ñ³±ì"
- "à¡ÒÅÑ´"
- "à¡ÒËÅÕ"
- "à¡ÒÐ"
- "à¡ÒàËÅÒ"
- "à¡Ô§"
- "à¡Ô´"
- "à¡Ô¹"
- "à¡ÕÂ"
- "à¡Õ§"
- "à¡Õ¨"
- "à¡Õ´"
- "à¡Õ¹"
- "à¡ÕÂõÔ"
- "à¡ÕÂõԤس"
- "à¡ÕÂõԹÔÂÁ"
- "à¡ÕÂõԻÃÐÇѵÔ"
- "à¡ÕÂõÔÀÙÁÔ"
- "à¡ÕÂõÔÂÈ"
- "à¡ÕÂõÔÈÑ¡´Ôì"
- "à¡ÕÂõÔì"
- "à¡ÕÂÃì"
- "à¡ÕèÂ"
- "à¡Õè§"
- "à¡ÕèÂÇ"
- "à¡ÕéÂÁÍÕë"
- "à¡ÕéÂÁä©è"
- "à¡ÕéÂÇ"
- "à¡ÕêÂÇ"
- "à¡ÕêÂÐ"
- "à¡×Í¡"
- "à¡×ͺ"
- "à¡×éÍ"
- "à¡àÃ"
- "à¡ç§"
- "à¡ç¨"
- "à¡çº"
- "à¡è§"
- "à¡è§¡Ò¨"
- "à¡è¹"
- "à¡èÒ"
- "à¡é"
- "à¡é§"
- "à¡é§¡éÒ§"
- "à¡éÍ"
- "à¡éÒ"
- "à¡éÒÍÕé"
- "à¡ê"
- "à¡ê¡"
- "à¡ê¡ÎÇÂ"
- "à¡ë"
- "à¡ë§"
- "à¡ëÒ"
- "à¢"
- "ࢡ"
- "ࢵ"
- "ࢹ"
- "ࢹ§"
- "ࢹÂ"
- "ࢹç´"
- "ࢺ稢ºÇ¹"
- "ࢺçµ"
- "à¢ÁÃ"
- "à¢ÁÒ"
- "à¢Á×ͺ"
- "à¢Áç§"
- "à¢Áç´á¢Áè"
- "à¢Áè¹"
- "à¢ÁèÒ"
- "à¢Áé¹"
- "à¢Â"
- "à¢Â¡"
- "à¢ÂÔº"
- "à¢Â×é͹"
- "à¢Âè§"
- "à¢ÂèÒ"
- "à¢ÂéÍá¢Âè§"
- "à¢ÃÍÐ"
- "à¢Å§"
- "à¢ÅÍÐ"
- "à¢ÅÐ"
- "à¢ÅÒ"
- "à¢ÅÒÐ"
- "à¢Ç"
- "à¢ÉÁ"
- "à¢ÌÐ"
- "à¢Ð¢Ð"
- "à¢Ò"
- "à¢Ô¹"
- "à¢Õ§"
- "à¢Õ´"
- "à¢Õ¹"
- "à¢ÕÂÁ"
- "à¢ÕÂÇ"
- "à¢ÕèÂ"
- "à¢ÕéÂÇ"
- "à¢×Í"
- "à¢×èͧ"
- "à¢×è͹"
- "à¢ç­"
- "à¢ç´"
- "à¢ç¹"
- "à¢çÁ"
- "à¢è§"
- "à¢è¹"
- "à¢èÒ"
- "à¢éÁ"
- "à¢éÒ"
- "हÂÒ"
- "à¤ÁÕ"
- "à¤Â"
- "à¤Ã§"
- "à¤Ã´Ôµ"
- "à¤ÃÒ"
- "à¤ÃÒÐËì"
- "à¤ÃÕ´"
- "à¤Ã×Í"
- "à¤Ã×èͧ"
- "à¤Ã×èͧ¾ÔÁ¾ì"
- "à¤Ãè§"
- "à¤Ã觤ÃÑ´"
- "à¤ÅÔºà¤ÅÔéÁ"
- "à¤ÅÔéÁ"
- "à¤ÅÕÂ"
- "à¤Å×ͺ"
- "à¤Å×è͹"
- "à¤Åç´"
- "à¤Åé¹"
- "à¤ÅéÒ"
- "à¤Çé§"
- "à¤Ë"
- "à¤ËÐ"
- "à¤ËÒ"
- "à¤ÍÃìà¹Å"
- "à¤ÍÐ"
- "à¤Ò¹ìàµÍÃì"
- "à¤Òþ"
- "à¤ÒÐ"
- "à¤Õ§"
- "à¤Õ´"
- "à¤Õ¹"
- "à¤ÕÂÇ"
- "à¤ÕèÂÁ"
- "à¤ÕèÂÇ"
- "à¤ÕéÂÇ"
- "à¤×ͧ"
- "à¤àºÔÅ"
- "à¤çÁ"
- "à¤é¡"
- "à¤é¹"
- "à¤éÒ"
- "à¤éà¡é"
- "à¦Õè¹"
- "à§¡"
- "à§Â"
- "à§ÍÐ"
- "à§ÍЧÐ"
- "à§Ò"
- "à§ÒÐ"
- "à§Ô¹"
- "à§Õº"
- "à§Õè§"
- "à§Õè¹"
- "à§ÕèÂËÙ"
- "à§ÕéÂÇ"
- "à§×Í¡"
- "à§×Í´"
- "à§×ͺ"
- "à§×èͧ"
- "à§×è͹"
- "à§×è͹ä¢"
- "à§×éÍ"
- "à§×éÍÁ"
- "à§èÒ"
- "à§éÒ"
- "à¨"
- "਴ÕÂʶҹ"
- "਴ÕÂì"
- "ਵ"
- "ਵ¤µÔ"
- "ਵ¨Ó¹§"
- "ਵ¹Ò"
- "ਵ¹ÒÃÁ³ì"
- "ਵÀÙµ"
- "ਵÊÔ¡"
- "ਹ"
- "à¨ÁÊì"
- "à¨Ã¨Ò"
- "à¨ÃÔ­"
- "à¨ÃÔ´"
- "à¨Çç´"
- "à¨É®Ò"
- "à¨Í"
- "à¨ÍÃì"
- "à¨ÍÐ"
- "à¨ÒÐ"
- "à¨Ô´"
- "à¨ÔÁ"
- "à¨Ôè§"
- "à¨Ôè¹"
- "à¨Õ´"
- "à¨Õ¹"
- "à¨ÕÂÁ"
- "à¨ÕÂÃÐä¹"
- "à¨ÕÂÇ"
- "à¨Õêº"
- "à¨ÕêÂÇ"
- "à¨ÕêÂǨêÒÇ"
- "à¨Õë¹"
- "à¨ÕëÂÁà¨ÕéÂÁ"
- "à¨×Í"
- "à¨×è͹"
- "à¨×éÍÂ"
- "à¨ç´"
- "à¨çº"
- "à¨èÍ"
- "à¨èÒ"
- "à¨éÒ"
- "à¨éÒªÙé"
- "à¨ê"
- "à¨ê¡"
- "à¨ê§"
- "à¨êµ"
- "à¨êÒ"
- "à¨ëÍ"
- "à©"
- "à©¡"
- "à©´"
- "੾ÒÐ"
- "à©Â"
- "à©ÂàÁÂ"
- "à©ÅÂ"
- "à©ÅÒ"
- "à©ÅÔÁ"
- "à©ÅÕ§"
- "à©ÅÕÂÇ"
- "à©ÅÕèÂ"
- "à©ÇÕ§"
- "à©ÇÕ¹"
- "à©ÍÐá©Ð"
- "à©Ò"
- "à©Ò¡êÇÂ"
- "à©ÒÐ"
- "à©Ô´"
- "à©Ôº"
- "à©Õ§"
- "à©Õ´"
- "à©Õº"
- "à©ÕÂÇ"
- "à©ÕèÂÇ"
- "à©×͹"
- "à©×èÍÂ"
- "à©â¡"
- "à©è§"
- "હ"
- "àªÂ"
- "àªÅ"
- "àªÅÂ"
- "àªÉ°Ò"
- "àªÍ"
- "àªÍÃì"
- "àªÒǹì"
- "àªÒÇì"
- "àªÔ§"
- "àªÔ­"
- "àªÔ´"
- "àªÔéµ"
- "àªÕ§"
- "àªÕ§ãËÁè"
- "àªÕº"
- "àªÕÂÃì"
- "àªÕÂÇ"
- "àªÕè¹"
- "àªÕèÂÇ"
- "àª×Í¡"
- "àª×Í´"
- "àª×͹"
- "àª×èÍ"
- "àª×èͧ"
- "àª×èÍÁ"
- "àª×éÍ"
- "àªç¤"
- "àªç´"
- "àªè¹"
- "àªèÒ"
- "àªé§"
- "àªéÒ"
- "à«"
- "૵"
- "ૹ"
- "ૹµÔ¡ÃÑÁ"
- "ૹµÔÅÔµÃ"
- "ૹµÔà¡Ã´"
- "ૹµÔàÁµÃ"
- "ૹµì"
- "ૻѡµÃСÃéÍ"
- "à«¿"
- "à«ÃØèÁ"
- "à«ÅÅÙÅÍ´ì"
- "à«ÅÅÙâÅÊ"
- "à«ÅÅì"
- "à«ÅÊì"
- "à«Åà«ÕÂÊ"
- "à«Í"
- "à«ÍÃì"
- "à«ÍÃìÇÔÊ"
- "à«ÍÐ"
- "à«Ò"
- "à«ÒÐ"
- "à«Ô§"
- "à«ÔÃì¿àÇÍÃì"
- "à«Ôé§"
- "à«Õ¹"
- "à«ÕÂÁ«Õ"
- "à«ÕÂÇ"
- "à«Õè§äÎé"
- "à«×èͧ"
- "à«ç¡àÁ¹µì"
- "à«ç§"
- "à«ç¹"
- "à«ç¹àµÍÃì"
- "à«è§"
- "à«è¹"
- "à«èÍ"
- "à«é§"
- "à«éÒ«Õé"
- "à¬Í"
- "à¬ÍàÍÁ"
- "à²èÒ"
- "à³Ã"
- "à´¡«ìâ·ÃÊ"
- "à´¤Ò¡ÃÑÁ"
- "à´¤ÒÅÔµÃ"
- "à´¤ÒàÁµÃ"
- "à´ª"
- "à´ªÐ"
- "à´«Ô¡ÃÑÁ"
- "à´«ÔÅÔµÃ"
- "à´«ÔàÁµÃ"
- "à´¹"
- "à´¹ÁÒÃì¡"
- "à´¹ÁÒÃì¤"
- "à´ºÔµ"
- "à´ÃѨ©Ò¹"
- "à´ÅÅì"
- "à´ÇÔ´"
- "à´Ê¡ì·Í»"
- "à´ÍÐ"
- "à´Ò"
- "à´ÒÐ"
- "à´Ô¹"
- "à´ÔÁ"
- "à´ÕÂ"
- "à´Õ§"
- "à´Õ´"
- "à´ÕÂÃ"
- "à´ÕÂôÒÉ"
- "à´ÕÂöÕÂì"
- "à´ÕÂÃѨ©Ò¹"
- "à´ÕÂÇ"
- "à´ÕÂÐ"
- "à´ÕèÂÇ"
- "à´ÕéÂ"
- "à´ÕëÂÇ"
- "à´×Í´"
- "à´×͹"
- "à´×ÍÂ"
- "à´âª"
- "à´ç¡"
- "à´ç¨"
- "à´ç´"
- "à´è"
- "à´è¹"
- "à´èÒ"
- "à´é§"
- "à´éÒ"
- "à´ëÍ"
- "à´ëÍ´ëÒ"
- "àµÂ"
- "àµÃÕÂ"
- "àµÃÕ´"
- "àµÃÕÂÁ"
- "àµÃç´"
- "àµÃè"
- "àµÅÔ´"
- "àµÇç´"
- "àµÍÃì"
- "àµÍÃì¡Õ"
- "àµÍÐ"
- "àµÐ"
- "àµÒ"
- "àµÒÐáµÐ"
- "àµÔº"
- "àµÔÁ"
- "àµÔè§"
- "àµÕ§"
- "àµÕ¹"
- "àµÕº"
- "àµÕèÂ"
- "àµÕèÂÇ"
- "àµÕéÂ"
- "àµÕëÂÁ"
- "àµ×͹"
- "àµ×éÍ"
- "àµç§"
- "àµç¹·ì"
- "àµçÁ"
- "àµè§"
- "àµèÍ"
- "àµèÒ"
- "àµé¹"
- "àµéÒ"
- "àµéÒ·Ö§"
- "àµéÒÊèǹ"
- "àµéÒËÙé"
- "àµéÒÎÇÂ"
- "àµéÒà¨ÕéÂÇ"
- "àµéÒàÊÕº"
- "àµê¡"
- "àµêÐ"
- "àµëÒ"
- "à¶¡Ô§"
- "à¶¹"
- "à¶Ã"
- "à¶ÃÐ"
- "à¶ÃÒ¹Øà¶ÃÐ"
- "à¶ÅÔ§"
- "à¶Å×Í¡¶Å¹"
- "à¶Åä¶Å"
- "à¶ÍÐ"
- "à¶Ò"
- "à¶ÒÇÑÅÂì"
- "à¶ÒÐ"
- "à¶Ô¡"
- "à¶Ô´"
- "à¶Ô´à·Ô§"
- "à¶Ô¹"
- "à¶Õ§"
- "à¶×Í"
- "à¶×Í¡"
- "à¶×è͹"
- "à¶èÍ"
- "à¶éÒ"
- "à·"
- "à·¤¹Ô¤"
- "à·¤â¹âÅÂÕ"
- "à·¹¹ÔÊ"
- "à·»"
- "à·¾"
- "à·¾´Ò"
- "à·¾¸Ô´Ò"
- "à·¾¹Á"
- "෾´Ò"
- "à·¾Âà¨éÒ"
- "à·¾ÒÃÑ¡Éì"
- "à·¾Õ"
- "à·¾à¨éÒ"
- "à·Á»ØÃÐ"
- "à·Ã´à´ÍÃì"
- "à·Ã¹à¹ÍÃì"
- "à·Ç´Ò"
- "à·Ç·Ñ³±ì"
- "à·Ç·Ùµ"
- "à·Ç¸ÃÃÁ"
- "à·Ç¸Ô´Ò"
- "à·Ç¹ÔÂÁ"
- "à·ÇÃÙ»"
- "à·ÇÉ"
- "à·Çʶҹ"
- "à·ÇÑ­"
- "à·Çѹ"
- "à·ÇÒÅÑÂ"
- "à·ÇÕ"
- "à·ÇâÅ¡"
- "à·È"
- "à·È¡ÒÅ"
- "à·È¹Ò"
- "à·È¹ì"
- "à·ÈºÒÅ"
- "à·ÈÁ¹µÃÕ"
- "à·ÈÒÀÔºÒÅ"
- "à·Êµì"
- "à·ËÇѵ¶Ø"
- "à·Ëì"
- "à·Í­"
- "à·ÍÁ"
- "à·ÍÃìâÁÁÔàµÍÃì"
- "à·ÍзÐ"
- "à·Ò"
- "à·Ô´"
- "à·Ô¹"
- "à·Ôº"
- "à·Ôè§"
- "à·ÔéÁ"
- "à·Õ¹"
- "à·Õº"
- "à·ÕÂÁ"
- "à·ÕÂÇ"
- "à·Õè§"
- "à·ÕèÂÇ"
- "à·×Í¡"
- "à·àºÔÅ"
- "à·àŤÍÁ"
- "à·àÇÈÃì"
- "à·àÇÈÇÃì"
- "à·â¾"
- "à·ç¨"
- "à·è"
- "à·èÍ"
- "à·èÒ"
- "à·é§àµé§"
- "à·éÍ"
- "à·éÒ"
- "ู"
- "ูÊì"
- "à¸Í"
- "๤ä·"
- "๵"
- "๵Ã"
- "๵Êऻ"
- "๵Ô"
- "๺ÔÇÅÒ"
- "๻¨Ù¹"
- "๻ÒÅ"
- "à¹Â"
- "à¹Ã¤Ø³"
- "à¹ÃÁÔµ"
- "à¹Ãà·È"
- "à¹Ò"
- "à¹Ô¹"
- "à¹Ôº"
- "à¹Ôè¹"
- "à¹ÕÂ"
- "à¹Õ¹"
- "à¹ÕÂÁ"
- "à¹×ͧ"
- "à¹×ÍÂ"
- "à¹×èͧ"
- "à¹×éÍ"
- "à¹çµ"
- "à¹çµàÇÔÃì¡"
- "à¹çµàÇÔÃì¤"
- "à¹èÒ"
- "à¹é¹"
- "à¹éÍ"
- "àº"
- "຤͹"
- "ວ¡ÍÅ"
- "ອ¨"
- "ອ¨¡"
- "ອ¨¡ÑÅÂÒ³Õ"
- "ອ¨¡ÒÁ¤Ø³"
- "ອ¨¸ÃÃÁ"
- "ອ¨ºÃþµ"
- "ອ¨ÁÒÈ"
- "ອ¨Ã§¤ì"
- "ອ¨Ò"
- "ອ¨Ò§¤»ÃдÔɰì"
- "ອ¨Ò§¤ì"
- "ອ¨à¾Ê"
- "ີéÒ"
- "ູ"
- "ູ«Ô¹"
- "ູ«ì"
- "àºÃ¡"
- "àºÃì¡"
- "àºÅàÂÕèÂÁ"
- "àºÈ"
- "àºÊ"
- "àºÊºÍÅ"
- "àºÍÃì"
- "àºÍÃìÅÔ¹"
- "àºÍÐ"
- "àºÍкÐ"
- "àºÐ"
- "àºÒ"
- "àºÒÐ"
- "àºÒÐáÊ"
- "àºÔ¡"
- "àºÔÃì¡"
- "àºÔè§"
- "àºÕ´"
- "àºÕ¹"
- "àºÕÂÃì"
- "àºÕè§"
- "àºÕéÂ"
- "àºÕéÂÇ"
- "àº×Í"
- "àº×͹"
- "àº×èÍ"
- "àº×éÍ"
- "àº×éͧ"
- "àºç´"
- "àºç´àµÅç´"
- "àºç´àÊÃç¨"
- "àºè§"
- "àºé"
- "àºéÍ"
- "àºéÍàÃÔèÁ"
- "àºéÍàÃèÍ"
- "àºéÒ"
- "໡"
- "à»Ãµ"
- "à»ÃÁ"
- "à»ÃÂ"
- "à»ÃÍ"
- "à»ÃÍÐ"
- "à»ÃÒÐ"
- "à»ÃÕ§"
- "à»ÃÕ­"
- "à»ÃÕº"
- "à»ÃÕÂÇ"
- "à»ÃÕÂÐ"
- "à»ÃÕé§"
- "à»ÃÕéÂÇ"
- "à»ÃÕêÂÐ"
- "à»Ã×èͧ"
- "à»Ã×éÍÂ"
- "à»Å"
- "à»ÅÇ"
- "à»ÅÒÐ"
- "à»ÅÕè¹"
- "à»ÅÕèÂÇ"
- "à»ÅÕéÂ"
- "à»Å×Í¡"
- "à»Å×ͧ"
- "à»Å×ÍÂ"
- "à»Å×éͧ"
- "à»Åè§"
- "à»ÅèÒ"
- "à»Í"
- "à»ÍÃì"
- "à»ÍÃìà«ç¹µì"
- "à»Ð"
- "à»Ò"
- "à»ÒÐ"
- "à»Òà»Ò"
- "à»Ô¡"
- "à»Ô§"
- "à»Ô´"
- "à»Ôº"
- "à»Ôè¹"
- "à»Ôêº"
- "à»ÕÂ"
- "à»Õ¡"
- "à»ÕèÂÁ"
- "à»ÕéÂÇ"
- "à»Õê¡"
- "à»ÕêÂÐ"
- "à»×Í¡"
- "à»×èÍÂ"
- "à»×é͹"
- "à»ç´"
- "à»ç¹"
- "à»ç¹µé¹"
- "à»è§"
- "à»èÒ"
- "à»é"
- "à»é§"
- "à»éÒ"
- "à»ê¡"
- "à»ë"
- "à»ë§"
- "à»ëÍ"
- "à»ëÍàËÅÍ"
- "à»ëÒ"
- "à»ëÒÎ×éÍ"
- "à¼"
- "༧"
- "༪ԭ"
- "༴ÔÁ"
- "༴Õ§"
- "༴ç¨"
- "à¼Â"
- "à¼ÂÍ"
- "à¼ÅÍ"
- "à¼ÅÍä¼Å"
- "à¼ÅÐ"
- "à¼ÅÒÐ"
- "à¼Åè"
- "à¼ÍÔ­"
- "à¼ÍàÃÍ"
- "à¼Ð"
- "à¼Ò"
- "à¼ÒÐ"
- "à¼Ô¹"
- "à¼×Í¡"
- "à¼×Í´"
- "à¼×èÍ"
- "à¼ç´"
- "à¼è¹"
- "à¼èÒ"
- "à¼éÒ"
- "à½×Í"
- "à½×Í¡"
- "à½×è͹"
- "à½éÒ"
- "à¾"
- "ྨ"
- "ྪ¬¦Òµ"
- "ྪÃ"
- "ྪÃÒÂØ¸"
- "ྴҹ"
- "ྷ¹Ò"
- "ྷÒÂ"
- "ྷغÒÂ"
- "ྐྵ¡ÇÔ¹"
- "ྐྵÕ´"
- "ྐྵà·ÕÂÁ"
- "à¾Ã§"
- "à¾ÃÒ"
- "à¾ÃÒÐ"
- "à¾ÃÔ´"
- "à¾ÃÔÈ"
- "à¾ÃÕ¡"
- "à¾ÃÕ§"
- "à¾ÃÕº"
- "à¾ÃÕÂÇ"
- "à¾Ã×èÍ"
- "à¾Å"
- "à¾Å§"
- "à¾ÅÒ"
- "à¾ÅÒÐ"
- "à¾ÅÔ§"
- "à¾ÅÔ´à¾ÅÔ¹"
- "à¾ÅÔ¹"
- "à¾ÅÕÂ"
- "à¾ÅÕè§"
- "à¾ÅÕéÂ"
- "à¾È"
- "à¾ÒÐ"
- "à¾Ô¡"
- "à¾Ô§"
- "à¾Ôè§"
- "à¾ÔèÁ"
- "à¾Õ§"
- "à¾Õº"
- "à¾ÕÂÃ"
- "à¾ÕéÂ"
- "à¾Õé§"
- "à¾Õé¹"
- "à¾×èÍ"
- "à¾×è͹"
- "à¾ç§"
- "à¾ç¨"
- "à¾ç­"
- "à¾ç´·ÙÅ"
- "à¾è§"
- "à¾è¹¾èÒ¹"
- "à¾èÍ"
- "à¾éÍ"
- "à¿´"
- "à¿Í"
- "à¿ÍÃì"
- "à¿ÍÃì¹Ôà¨ÍÃì"
- "à¿ÍÃìàÁÕÂÁ"
- "à¿ÍÐ"
- "à¿Ð"
- "à¿Ô¹"
- "à¿ÕéÂÁ"
- "à¿ÕéÂÇ"
- "à¿×Í"
- "à¿×ͧ"
- "à¿×͹"
- "à¿×ÍÂ"
- "à¿×èͧ"
- "à¿×éÍ"
- "à¿×éͧ"
- "à¿×éÍÂ"
- "à¿ç´"
- "à¿é¹"
- "à¿éÍ"
- "àÀµÃÒ"
- "àÀ·"
- "àÀ·ØºÒÂ"
- "àÀÃÕ"
- "àÀÊѪ"
- "àÁ"
- "àÁ¡Ð"
- "àÁ¡ÐàÎÔõ«ì"
- "àÁ¢ÅÒ"
- "àÁ¦"
- "àÁ¦Ò"
- "àÁ¦Ô¹·Ãì"
- "àÁ¦Õ"
- "àÁµµÒ"
- "àÁµÃ"
- "àÁµÃÔ¡"
- "àÁ¶Ø¹"
- "àÁ·¹Õ"
- "àÁ·Ô¹Õ"
- "àÁ¸Ò"
- "àÁ¸Õ"
- "àÁ¹·ÍÅ"
- "àÁ¹ºÍÃì´"
- "àÁ¹Ù"
- "àÁÁâÁÃÕ"
- "àÁÃÑÂ"
- "àÁÃØ"
- "àÁÅ×ͧ"
- "àÁÅ×èÍÂ"
- "àÁÅ×éÍÂ"
- "àÁÅç´"
- "àÁÅì"
- "àÁÉ"
- "àÁÉÒ¹"
- "àÁÐ"
- "àÁÒ"
- "àÁÒÅÕ"
- "àÁÒÊì"
- "àÁÒÌÕ"
- "àÁÒÐ"
- "àÁÔ¹"
- "àÁÕÂ"
- "àÁÕ§"
- "àÁÕè§"
- "àÁÕé¹"
- "àÁ×Í¡"
- "àÁ×ͧ"
- "àÁ×èÍ"
- "àÁ×èÍÂ"
- "àÁâÁÃÕ"
- "àÁç¡«Ôâ¡"
- "àÁç´"
- "àÁè¹"
- "àÁèÒ"
- "àÁéÁ"
- "àÁéÒÊì"
- "àÂ"
- "à§"
- "à«Ù"
- "à¹"
- "àÂÍ"
- "àÂÍÃÁѹ"
- "àÂÍÃÁѹ¹Õ"
- "àÂÍÃÁѹÕ"
- "àÂÍÐ"
- "àÂÒ"
- "àÂÒǪ¹"
- "àÂÒǾÒ"
- "àÂÒǾҹ"
- "àÂÒÇÁÒÅÂì"
- "àÂÒÇÂÍ´"
- "àÂÒÇÃÒª"
- "àÂÒÇÅѡɳì"
- "àÂÒÇàÃÈ"
- "àÂÒÇì"
- "àÂÒÐ"
- "àÂÔ¹"
- "àÂÔº"
- "àÂÔè¹"
- "àÂÔè¹àÂéÍ"
- "àÂÔéÁ"
- "àÂÕÂ"
- "àÂÕ¹"
- "àÂÕº"
- "àÂÕÂÇ"
- "àÂÕè§"
- "àÂÕèÂÁ"
- "àÂÕèÂÇ"
- "àÂ×Í¡"
- "àÂ×͹"
- "àÂ×èÍ"
- "àÂ×éÍ"
- "àÂ×éͧ"
- "àÂ×é͹"
- "àÂç¹"
- "àÂçº"
- "àÂè¹"
- "àÂèÍ"
- "àÂé"
- "àÂéÂ"
- "àÂéÒ"
- "àâ"
- "àâÒ"
- "àâҤ³Ôµ"
- "àóÙ"
- "àô͹"
- "àôÒÃì"
- "àÃÃǹ"
- "àÃÇ´Õ"
- "àÃÍ"
- "àÃÒ"
- "àÃÒÐ"
- "àÃÔ§"
- "àÃÔ´"
- "àÃÔÁ"
- "àÃÔèÁ"
- "àÃÔéÁ"
- "àÃÕ¡"
- "àÃÕ§"
- "àÃÕ´"
- "àÃÕ¹"
- "àÃÕº"
- "àÃÕÂÁ"
- "àÃÕÂÇ"
- "àÃÕèÂ"
- "àÃÕèÂÁ"
- "àÃÕèÂÇ"
- "àÃÕéÂÇá"
- "àÃ×Í"
- "àÃ×Í¡"
- "àÃ×ͧ"
- "àÃ×Í´"
- "àÃ×͹"
- "àÃ×èÍ"
- "àÃ×èͧ"
- "àÃ×èÍÂ"
- "àÃ×éÍ"
- "àÃ×é͹"
- "àÃäÃ"
- "àÃçÇ"
- "àÃè"
- "àÃè§"
- "àÃèÍ"
- "àÃèÒ"
- "àÃé¹"
- "àÃéÒ"
- "àÅ¢"
- "àÅ¢Ò"
- "àÅ¢Ò¸Ô¡ÒÃ"
- "àŢҹءÒÃ"
- "àÅ´Õé"
- "àŵ"
- "àŹ"
- "àŹÊì"
- "àźҹ͹"
- "àÅÂ"
- "àÅÇ"
- "àÅÈ"
- "àÅËÅѧ"
- "àÅÍ"
- "àÅÍÐ"
- "àÅÍÐà·ÍÐ"
- "àÅÐ"
- "àÅÐà·Ð"
- "àÅÒ"
- "àÅÒÐ"
- "àÅÔ¡"
- "àÅÔ¡ÅÑè¡"
- "àÅÔ¹àÅèÍ"
- "àÅÔÈ"
- "àÅÔé§"
- "àÅÕÂ"
- "àÅÕ§"
- "àÅÕ¹"
- "àÅÕº"
- "àÅÕÂÁ"
- "àÅÕÂÇ"
- "àÅÕè§"
- "àÅÕè¹"
- "àÅÕèÂÁ"
- "àÅÕé§"
- "àÅÕéÂÇ"
- "àÅ×Í¡"
- "àÅ×Í´"
- "àÅ×͹"
- "àÅ×èͧ"
- "àÅ×è͹"
- "àÅ×èÍÁ"
- "àÅ×èÍÁãÊ"
- "àÅ×èÍÂ"
- "àÅ×éÍÂ"
- "àÅà«ÍÃì"
- "àÅà¾"
- "àÅç¡"
- "àÅç§"
- "àÅç´"
- "àÅç¹"
- "àÅçº"
- "àÅçÁ"
- "àÅè¹"
- "àÅèÁ"
- "àÅèËì"
- "àÅèÍ"
- "àÅèÒ"
- "àÅé§"
- "àÅéÒ"
- "àǤ"
- "àǤԹ"
- "àǤÕ"
- "àǨ"
- "àǪ"
- "àǪ¡ÃÃÁ"
- "àǰ¹ì"
- "àdzÐ"
- "àdzÔ"
- "àdzԡ"
- "àdzØ"
- "àǵ¹ì"
- "àǵÃ"
- "àǵÒÅ"
- "àÇ·"
- "àÇ·¹Ò"
- "àÇ·Âì"
- "àÇ·Ò§¤ÈÒʵÃì"
- "àÇ·Ò§¤ì"
- "àÇ·Ò¹µÐ"
- "àÇ·Ò¹µì"
- "àÇ·Ô"
- "àÇ·Õ"
- "àǸÐ"
- "àǹ"
- "àǹÔÊ"
- "àǹäµÂ"
- "àǺ䫵ì"
- "àÇÁºÅÕÂì"
- "àÇÁÐ"
- "àÇÁѵ"
- "àÇÁÒµÔ¡"
- "àÇÃ"
- "àÇÃÁ³Õ"
- "àÇÃѳ"
- "àÇÃѳ³ÔÂÐ"
- "àÇÃÕ"
- "àÇÅÊì"
- "àÇÅÒ"
- "àÇÈÁì"
- "àÇÈÂÒ"
- "àÇÈÂì"
- "àÇʵì"
- "àÇʹì"
- "àÇÊÀÙ"
- "àÇÊÁÐ"
- "àÇÊÁì"
- "àÇÊÇѳ"
- "àÇÊÊÐ"
- "àÇÊÊѹ´Ã"
- "àÇÊÊØ¡ÃÃÁ"
- "àÇÊÊØÇѳ"
- "àÇÊÒÃѪ"
- "àÇÊÔ"
- "àÇÊÔÂÒ"
- "àÇ˹"
- "àÇËÐ"
- "àÇËѧ¤ì"
- "àÇËÑ»µÔ"
- "àÇËÒ"
- "àÇËÒÂÊ"
- "àÇËÒÊ"
- "àÇÌØ"
- "àÇÍ"
- "àÇÍÃì"
- "àÇÍÃìªÑ¹"
- "àÇÔ¡"
- "àÇÔÃì¡Ê൪ѹ"
- "àÇÔÃì´"
- "àÇÔé§"
- "àÇÕ§"
- "àÇÕ´¹ÒÁ"
- "àÇÕ¹"
- "àÇâè¹ì"
- "àÇä¹Â"
- "àÇçº"
- "àÇç»"
- "àÇèÍ"
- "àÇé"
- "àÇé¹"
- "àÇéÂ"
- "àÇéÒ"
- "àÈÃɰ¡Ô¨"
- "àÈÃɰÈÒʵÃì"
- "àÈÃɰҹÐ"
- "àÈÃɰÕ"
- "àÈÃɰì"
- "àÈÃéÒ"
- "àÈǵ"
- "àÈÉ"
- "àÈÕÂÃ"
- "àÊ"
- "àÊ¡"
- "àʧÕèÂÁ"
- "àʩǹ"
- "àÊ´"
- "àÊ´ç¨"
- "àʶÕÂÃ"
- "àʶÕÂÃÀÒ¾"
- "àʹ"
- "àʹ§"
- "àʹËÒ"
- "àʹÍ"
- "àʹÐ"
- "àʹÒ"
- "àʹҸԡÒÃ"
- "àʹҺ´Õ"
- "àʹÒʹÐ"
- "àʹÒÐ"
- "àʹÕ´"
- "àʹÕÂì"
- "àʹè§"
- "àʹèËÒ"
- "àʹèËì"
- "àʹèÒ"
- "àʺÂ"
- "àʺÕ§"
- "àʾ"
- "àʾÂì"
- "àÊÀÒ"
- "àÊÁËÐ"
- "àÊÁÍ"
- "àÊÁÒ"
- "àÊÁÕ¹"
- "àÊÁ×͹"
- "àÊÁç´"
- "àÊÂ"
- "àÊÃÔ´"
- "àÊÃÔ¿"
- "àÊÃÔÁ"
- "àÊÃÕ"
- "àÊÃç¨"
- "àÊÅ´"
- "àÊÅÒ"
- "àÊÅÕè§"
- "àÊÅ×Í¡ÊŹ"
- "àÊÇ¡"
- "àÊÇ¡ÒÁÒµÂì"
- "àÊǹÐ"
- "àÊǹÒ"
- "àÊÇÂ"
- "àÊÇÕ¹"
- "àÊÒ"
- "àÊÒÃÀÂì"
- "àÊÒÃì"
- "àÊÒǤ¹¸ì"
- "àÊÒdzԵ"
- "àÊÒǹÒ"
- "àÊÒǹÕÂì"
- "àÊÒÇÀÒ"
- "àÊÒÇÀÒ¤Âì"
- "àÊÒÇÀÒ¾"
- "àÊÒÇÃÊ"
- "àÊÒÇÅѡɳì"
- "àÊÒÐ"
- "àÊÔÃì¿"
- "àÊÕÂ"
- "àÊÕ§"
- "àÊÕ´"
- "àÊÕº"
- "àÊÕÂÁ"
- "àÊÕÂÇ"
- "àÊÕèÂ"
- "àÊÕè§"
- "àÊÕèÂÇ"
- "àÊÕé¹"
- "àÊÕéÂÁ"
- "àÊÕéÂÇ"
- "àÊ×Í"
- "àÊ×Í¡"
- "àÊ×èÍ"
- "àÊ×èÍÁ"
- "àÊ×éÍ"
- "àÊà¾Å"
- "àÊâ·"
- "àÊâÅ"
- "àÊç§à¤Ãç§"
- "àÊé§"
- "àÊé¹"
- "àÊéÒ"
- "àË"
- "à˧"
- "à˧Ò"
- "à˧×Í¡"
- "à˧×èÍ"
- "à˧è§"
- "à˵Ø"
- "à˵ءÒóì"
- "à˹ÍÐ"
- "à˹ÍÐ˹Ð"
- "à˹ÒÐ"
- "à˹Õ§"
- "à˹ÕÂÁ"
- "à˹ÕÂÇ"
- "à˹ÕèÂÇ"
- "à˹×Í"
- "à˹×èÍÂ"
- "à˹ç´"
- "à˹çº"
- "à˹è§"
- "à˹èÍ"
- "à˹éÒ"
- "àËÁ"
- "àËÁÇ´Õ"
- "àËÁѹµì"
- "àËÁÒ"
- "àËÁÒÐ"
- "àËÁÕÂÇ"
- "àËÁÕèÂÇ"
- "àËÁ×ͧ"
- "àËÁ×Í´"
- "àËÁ×͹"
- "àËÁç¹"
- "àËÁè"
- "àËÁè§"
- "àËÁèÍ"
- "àËÂ"
- "à˧"
- "àËÂÒÐ"
- "àËÂÔ§"
- "àËÂÕ´"
- "àËÂÕº"
- "àËÂÕèÂÇ"
- "àËÂ×Í¡"
- "àËÂ×èÍ"
- "àËÂéÒ"
- "àËÃÑ­­Ô¡"
- "àËÃÒ"
- "àËÃÕ­"
- "àËŹ"
- "àËÅÇ"
- "àËÅÍ"
- "àËÅÒ"
- "àËÅÒÐáËÅÐ"
- "àËÅÔ§"
- "àËÅÕ¹"
- "àËÅÕÂÇ"
- "àËÅÕèÂÁ"
- "àËÅ×Í"
- "àËÅ×Í¡"
- "àËÅ×ͧ"
- "àËÅ×ͺ"
- "àËÅ×èÍÁ"
- "àËÅç¡"
- "àËÅè"
- "àËÅèÒ"
- "àËÅéÒ"
- "àËÇ"
- "àËǧ"
- "àËÇÂ"
- "àËÇÍÐ"
- "àËÇÍÐËÇÐ"
- "àËÇÕè§"
- "àËÇè"
- "àËÍÐ"
- "àËÒ"
- "àËÒÐ"
- "àËÔ¹"
- "àËÔÁ"
- "àËÕ¹"
- "àËÕèÂÇ"
- "àËÕéÂ"
- "àËÕé¹"
- "àËÕéÂÁ"
- "àË×Í´"
- "àË×èÍ"
- "àËç¨"
- "àËç´"
- "àËç¹"
- "àËçº"
- "àËè"
- "àËèÍ"
- "àËèÒ"
- "àÍ"
- "àÍ¡"
- "àÍ¡©Ñ¹·ì"
- "àÍ¡ª¹"
- "àÍ¡«àÃÂì"
- "àÍ¡«â»"
- "àÍ¡À¾"
- "àÍ¡ÀÒ¾"
- "àÍ¡ÁÑÂ"
- "àÍ¡Ãö»ÃÐâ¤"
- "àÍ¡ÃÒª"
- "àÍ¡Åѡɳì"
- "àÍ¡ÊÒÃ"
- "à͡ѤµÒ"
- "à͡ҸԻäµÂ"
- "à͡ࢹ¡"
- "àÍ¡à·È"
- "àͧ"
- "àͪ¾Õ"
- "àÍ´Êì"
- "àÍ´ÔàµÍÃì"
- "à͵·Ñ¤¤Ð"
- "àÍ·ÕàÍçÁ"
- "à͹"
- "à͹·ÃÒ¹«ì"
- "à͹ä«Áì"
- "àÍ»Êѹ"
- "àÍÁ"
- "àÍÂ"
- "àÍÃÒÇѳ"
- "àÍÃç´ÍÃèÍÂ"
- "àÍÇ"
- "àÍÇѧ"
- "àÍÊ"
- "àÍÌ¡"
- "àÍÌÒ"
- "àÍÍ"
- "àÍÐÍÐ"
- "àÍÐã¨"
- "àÍÒ"
- "àÍÒ·ì¾Øµ"
- "àÍÒÌÒÃ"
- "àÍÔ¡"
- "àÍÔº"
- "àÍÔé¹"
- "àÍÕ§"
- "àÍÕ´"
- "àÍÕ¹"
- "àÍÕè¹"
- "àÍÕèÂÁ"
- "àÍÕèÂÇ"
- "àÍÕé§"
- "àÍÕéÂÁà¿ÕéÂÁ"
- "àÍÕéÂÇ"
- "àÍÕê´"
- "àÍÕêÂÁ"
- "àÍÕêÂÁ¨Øê¹"
- "àÍ×͹"
- "àÍ×ÍÁ"
- "àÍ×èÍÂ"
- "àÍ×éÍ"
- "àÍ×éͧ"
- "àÍ×é͹"
- "àÍ×éÍÁ"
- "àÍ×éÍÂ"
- "àÍà¤ÍÃì"
- "àÍàªÕÂ"
- "àÍàªÕè¹à¡ÁÊì"
- "àÍà«ÕÂ"
- "àÍàÂè¹µì"
- "àÍẤ"
- "àÍç¡«ì"
- "àÍç¡«ì¾ÅÍàÃÍÃì"
- "àÍç¡«ìà¾ÃÊ"
- "àÍç§"
- "àÍç´"
- "àÍç´µÐâÃ"
- "àÍç´ÍÖ§"
- "àÍç¹"
- "àÍç¹´Ù"
- "àÍç¹àµÍÃìà·¹"
- "àÍèÂ"
- "àÍèÍ"
- "àÍé"
- "àÍé¡Ò"
- "àÍéÍÃÐàËÂ"
- "àÍéÍàÎÍ"
- "àÍê¡"
- "àÍêÂ"
- "àÍêÐ"
- "àÍë"
- "àÍë§"
- "àÍëÂ"
- "àÎ"
- "àΧ"
- "àÎÂ"
- "àÎÅԤͻàµÍÃì"
- "àÎÔõ«ì"
- "àÎÕÂ"
- "àÎÕé¹"
- "àÎÕéº"
- "àÎÕéÂÇ"
- "àÎ×Í¡"
- "àÎ×͹"
- "àÎâÃÍÕ¹"
- "àÎâÅ"
- "àÎéÂ"
- "àÎéÇ"
- "àÎéÍ"
- "á¡"
- "á¡§"
- "᡹"
- "á¡Á"
- "á¡ÁÁÒ"
- "á¡Ã¡"
- "á¡Ã¹Ôµ"
- "á¡ÃÐ"
- "á¡Ã俵ì"
- "á¡Ãç¹"
- "á¡Ãè§"
- "á¡ÃèÇ"
- "á¡Å"
- "á¡Åº"
- "á¡ÅÅ͹"
- "á¡ÅÐ"
- "á¡ÅàÅÕÂÁ"
- "á¡Åé§"
- "á¡ÅéÁ"
- "á¡ÅéÇ"
- "á¡Ç"
- "á¡Çè§"
- "á¡Çè¹"
- "á¡Ð"
- "á¡â´ÅÔà¹ÕÂÁ"
- "á¡è"
- "á¡è§"
- "á¡è§áÂè§"
- "á¡è¹"
- "á¡é"
- "á¡é§"
- "á¡éÁ"
- "á¡éÇ"
- "á¡ê§"
- "á¡ê»"
- "á¡êÊ"
- "á¢"
- "ᢡ"
- "ᢹ"
- "ᢹ§"
- "á¢Á"
- "á¢Áçº"
- "á¢ÁèÇ"
- "á¢Â§"
- "á¢Âç¡"
- "á¢Âè§"
- "á¢Ç¡"
- "á¢Ç§"
- "á¢Ç¹"
- "á¢ÇÐ"
- "á¢ç§"
- "á¢è§"
- "á¢è§¢Ñ¹"
- "á¢é§"
- "á¢é¹"
- "á¤"
- "ᤪàªÕÂÃì"
- "ᤪàÁÕÂÃì"
- "ᤵµÒÅͤ"
- "᤹"
- "᤺"
- "᤻«ÙÅ"
- "á¤Á"
- "á¤Ã§"
- "á¤ÃÐ"
- "á¤Ãè"
- "á¤Ãì"
- "á¤Å¤ÙÅÑÊ"
- "á¤Å§"
- "á¤Å¹"
- "á¤ÅÍÃÕ"
- "á¤ÅÔ¿ÍÃìà¹ÕÂ"
- "á¤Åà«ÕÂÁ"
- "á¤ÅèǤÅèͧ"
- "á¤ÅéÇ"
- "á¤Ç"
- "á¤Ç¡"
- "á¤Çé¹"
- "á¤Ð"
- "á¤è"
- "á¤è¹"
- "á¤é¹"
- "á§"
- "á§Ð"
- "á§è"
- "á§è§"
- "á§è¹"
- "á§éÁ"
- "á¨"
- "ᨡ"
- "ᨧ"
- "á¨Ç"
- "á¨Ð"
- "á¨èÁ"
- "á¨èÇ"
- "á¨é"
- "á¨é§"
- "á¨é¹"
- "á¨éÇ"
- "á¨ê´"
- "á¨ë"
- "á¨ëÇ"
- "á¨ëÇáËÇÇ"
- "á©"
- "á©¡"
- "á©§"
- "á©Åº"
- "á©ÅÐ"
- "á©ÅéÁ"
- "á©Ð"
- "á©è"
- "á©è§"
- "áª"
- "áªÁ»ì"
- "áªÁà»­"
- "áªÃì"
- "áªÅèÁ"
- "áªè"
- "áªè§"
- "áªèÁ"
- "á«§"
- "á«´"
- "᫹´ìÇÔª"
- "᫺"
- "á«Á"
- "á«ÂÔ´"
- "á«Ç"
- "á«Ð"
- "á«è"
- "á«èÇ"
- "á´"
- "á´¡"
- "á´§"
- "á´´"
- "á´¹"
- "á´Ð"
- "á´ç¡"
- "á´è"
- "á´è¹"
- "á´èÇ"
- "ᵡ"
- "áµ§"
- "áµ§¡ÇÒ"
- "áµ§àÁ"
- "áµ§âÁ"
- "áµ´"
- "áµ¹"
- "áµÃ"
- "áµÐ"
- "áµè"
- "áµè§"
- "áµé"
- "áµé¨ÔëÇ"
- "áµéÁ"
- "áµê´áµë"
- "á¶"
- "á¶¡"
- "ᶺ"
- "á¶Á"
- "á¶Å§"
- "á¶Ç"
- "á·§"
- "á·¹"
- "á·¹·ÒÅÑÁ"
- "á·º"
- "á·Ã¡"
- "á·Ã¡àµÍÃì"
- "á·Ð"
- "á·ç¡«Õè"
- "á·ç§¡ì¹éÓ"
- "á·è§"
- "á·è¹"
- "á·é"
- "á·é§"
- "Ṻ"
- "á¹Á"
- "á¹Ç"
- "á¹Ð"
- "á¹è"
- "á¹è§"
- "á¹è¹"
- "á¹èÇ"
- "á¹èÐ"
- "áº"
- "ạ"
- "Ấ·ÕàÃÕÂ"
- "ầ¡ì"
- "ầ¤ì"
- "ẴÁÔ¹µÑ¹"
- "ẵàµÍÃÕè"
- "ẹ"
- "ẹâ¨"
- "Ẻ"
- "áºÐ"
- "áºàÃÕÂÁ"
- "áºçº"
- "áºè§"
- "á»"
- "ừԿԤ"
- "á»´"
- "Ỻ"
- "á»Ã"
- "á»Ã¡"
- "á»Ã§"
- "á»Ã»Ãǹ"
- "á»ÃÐ"
- "á»Ãè§"
- "á»Ãé¹"
- "á»Ãê´"
- "á»Ãë"
- "á»Å"
- "á»Å¡"
- "á»Å§"
- "á»Å¹"
- "á»Åº"
- "á»Åé"
- "á»Ð"
- "á»é§"
- "á»é¹"
- "á»éÇ"
- "á»ê´"
- "á»êº"
- "á»êÐ"
- "á»êЫÐ"
- "á»ë§"
- "á»ëÇ"
- "ἡ"
- "á¼§"
- "á¼´"
- "á¼¹"
- "á¼¹¡"
- "á¼Å"
- "á¼Å§"
- "á¼ÅÐ"
- "á¼Åçº"
- "á¼ÅçÇ"
- "á¼è"
- "á¼è¹"
- "á¼èÇ"
- "á¼éÇ"
- "ὡ"
- "á½§"
- "á½´"
- "á¾"
- "á¾§"
- "á¾§¾ÇÂ"
- "á¾·ÂÈÒʵÃì"
- "á¾·ÂÊÀÒ"
- "á¾·ÂÒ"
- "á¾·Âì"
- "á¾¹"
- "á¾¹¡"
- "á¾¹§àªÔ­"
- "á¾Ã"
- "á¾Ã¡"
- "á¾ÃÇ"
- "á¾Ãè"
- "á¾Ãè§"
- "á¾ÃéÇ"
- "á¾Å§"
- "á¾Åµ¿ÍÃìÁ"
- "á¾Å·Ô¹ÑÁ"
- "á¾ÅÁ"
- "á¾ÈÂÒ"
- "á¾ÈÂì"
- "á¾Ð"
- "á¾ç¡"
- "á¾ç¤à¡¨"
- "á¾è§"
- "á¾è¹"
- "á¾é"
- "á¾éÇ"
- "á¿¡«ì"
- "á¿§"
- "ῪÑè¹"
- "Ό"
- "Ό«Õ"
- "Ὼ"
- "á¿Ãì"
- "á¿Å¡«ì"
- "á¿Åµ"
- "á¿Ð"
- "á¿éÁ"
- "áÁ¡"
- "áÁ¡¹Õà«ÕÂÁ"
- "áÁ¤â¤Ã"
- "áÁ§"
- "áÁ§¡Ò¹ÕÊ"
- "áÁ¹"
- "áÁ¹¨ÙàÃÕÂ"
- "áÁŧ"
- "áÁÇ"
- "áÁÐ"
- "áÁè"
- "áÁè¹"
- "áÁèÎèͧÊ͹"
- "áÁé"
- "áÁé¹"
- "áÁéÇ"
- "á¡"
- "á§"
- "áº"
- "áÂÁ"
- "áÂÐ"
- "áÂáÊ"
- "áÂçº"
- "áÂè"
- "áÂè§"
- "áÂé"
- "áÂé§"
- "áÂéÁ"
- "áÃ"
- "áá"
- "áç"
- "áô"
- "áÃÁ"
- "áÃÐ"
- "áÃç¡à¡µ"
- "áÃè"
- "áÃè§"
- "áÃé§"
- "áÃé¹á¤é¹"
- "áÃéÇ"
- "áÅ"
- "áÅ¡"
- "áŧ"
- "áŹ"
- "Ᏼ"
- "Ᏼì"
- "áź"
- "áÅÐ"
- "áÅç¡â·Ê"
- "áÅè"
- "áÅè§"
- "áÅè¹"
- "áÅé"
- "áÅé§"
- "áÅéÇ"
- "áǧ"
- "áÇ´"
- "áǺ"
- "áÇÁ"
- "áÇÇ"
- "áÇÐ"
- "áÇè¹"
- "áÇèÇ"
- "áÇé"
- "áÇé§"
- "áÊ"
- "áÊ¡"
- "áʧ"
- "áÊ´"
- "áÊ´§"
- "áʵÁ»ì"
- "áʹ"
- "áʹÂÒ¡Ã"
- "áʹÂÒ¹ØÀÒ¾"
- "áʺ"
- "áÊÁ"
- "áÊ¡"
- "áʧ"
- "áÊÂÐ"
- "áÊÃé§"
- "áÊŧ"
- "áÊǧ"
- "áÊÐ"
- "áÊè"
- "áÊé"
- "áÊéÁéÒ"
- "áË"
- "áË¡"
- "á˧"
- "á˧¹"
- "á˧á¡ë"
- "á˧è"
- "á˧è§"
- "á˹"
- "á˹§"
- "á˹º"
- "á˹Á"
- "á˺"
- "áËÁ"
- "áËÁÐ"
- "áËÁè"
- "áËÁèÁ"
- "áËÂ"
- "á˧"
- "áËÂÁ"
- "áËÂÐ"
- "áËÂè"
- "áËÂè§"
- "áËÅ"
- "áËÅ¡"
- "áËŹ"
- "áËÅÁ"
- "áËÅÐ"
- "áËÅè"
- "áËÅè§"
- "áËÇ"
- "áËÇ¡"
- "áËǹ"
- "áËÇÐ"
- "áËÇè§"
- "áËÐ"
- "áËè"
- "áËè§"
- "áËé"
- "áËé§"
- "áËéÇ"
- "áÍ"
- "áÍ¡"
- "áÍ´"
- "áÍ´ÇÒ¹«ì"
- "áÍ´à´ÃÊ"
- "á͹"
- "á͹´ì"
- "á͹µÒÃ졵ԡ"
- "á͹µÔºÍ´Õ"
- "á͹µÔਹ"
- "á͹µÕé"
- "áͺ"
- "á;¾ÅÔपѹ"
- "á;à¾Åçµ"
- "áÍ¿ÃÔ¡Ò"
- "áÍÁÁÔàµÍÃì"
- "áÍÁá»Ãì"
- "áÍÁâÁà¹ÕÂ"
- "áÍÃèÁ"
- "áÍÃì"
- "áÍÅ"
- "áÍÅ¡ÍÎÍÅì"
- "áÍÅ¿Ò"
- "áÍÊ¿Ñŵì"
- "áÍÊä¾ÃÔ¹"
- "áÍÍÑ´"
- "áÍâ¹´"
- "áÍè§"
- "áÍè¹"
- "áÍèÇ"
- "áÍé"
- "áÍé§áÁé§"
- "áÍé´"
- "áÍéÁ"
- "áÍꤪÑè¹"
- "áÍê´"
- "áÍë"
- "áÎ"
- "áι´ìºÍÅ"
- "áÎÁ"
- "áÎÁàºÍÃìà¡ÍÃì"
- "áÎÐ"
- "áÎè"
- "áÎè¡Öê¹"
- "â¡"
- "â¡¡"
- "â¡§"
- "â¡§¡Ò§"
- "⡯Ô"
- "⡴ѧ"
- "⡹"
- "â¡ÁÅ"
- "â¡ÁØ·"
- "â¡Â"
- "â¡Ã¡"
- "â¡Ã§"
- "â¡Ã¸"
- "â¡Ã¸Ò"
- "â¡Ãè§"
- "â¡Ãë¹"
- "â¡Å´ì"
- "â¡Å¹"
- "â¡ÅÒËÅ"
- "â¡ÈÅ"
- "â¡Ê¹"
- "â¡ÊÔ¹·Ãì"
- "â¡ÊÕÂì"
- "â¡ÊØÁ"
- "â¡Ë¡"
- "â¡àÁ¹"
- "â¡â¡é"
- "â¡âÃâ¡âÊ"
- "â¡äÊÂ"
- "â¡è§"
- "â¡é"
- "â¡é§â¤é§"
- "â¡ë"
- "â¡ë¹"
- "â¢"
- "⢡"
- "⢧"
- "⢴"
- "⢹"
- "⢹§"
- "â¢Á"
- "â¢Á§"
- "â¢Á´"
- "â¢Â¡"
- "â¢Â§"
- "â¢Âè§"
- "â¢Å¡"
- "â¢Å§"
- "â¢è§"
- "â¤"
- "⤡"
- "⤨Ã"
- "⤵Ã"
- "⤹"
- "⤹Á"
- "⤺Íŵì"
- "â¤Á"
- "â¤ÁèÒ"
- "â¤Ã¡"
- "â¤Ã§"
- "â¤Ã§¡ÒÃ"
- "â¤ÃÁ"
- "â¤ÃÒª"
- "â¤ÃàÁÕÂÁ"
- "â¤ÃâÁâ«Á"
- "â¤Ãè§"
- "â¤Å"
- "â¤Å§"
- "â¤Å§à¤Å§"
- "â¤Å¹"
- "â¤Å¹¹Ôè§"
- "â¤ÅÍÁàºÕÂ"
- "â¤ÇµÒ"
- "â¤à¤¹"
- "â¤è§"
- "â¤è¹"
- "â¤é§"
- "â¤éª"
- "â¤é´"
- "â¦É¡"
- "â¦É³Ò"
- "â¦ÉÐ"
- "â¦ÉÔµ"
- "â§"
- "â§¡"
- "â§§"
- "â§§à§§"
- "â§¹"
- "â§à§"
- "â§è"
- "â§è§"
- "â§è§à§è§"
- "â§é§"
- "â¨"
- "⨡"
- "⨧"
- "⨧â¤Ãè§"
- "⨷"
- "⨷¡ì"
- "⨷Âì"
- "⨹"
- "â¨Á"
- "â¨Ã"
- "â¨Ã¡ÃÃÁ"
- "â¨É"
- "â¨É¨Ñ¹"
- "â¨è§¤ÃÖèÁ"
- "â¨è§á¨é§"
- "â¨ê¡"
- "â¨ë§¤ÃÖèÁ"
- "â©"
- "â©§à©§"
- "â©´"
- "⩹´"
- "⩺"
- "â©Á"
- "â©Å¡"
- "â©è"
- "â©è§©èÒ§"
- "⪡"
- "⪡ع"
- "⪤"
- "⪴¡"
- "⪴֡"
- "⪵Ô"
- "⪹"
- "âªÂ"
- "âªÇì"
- "â«"
- "â«¡"
- "â«´Ò"
- "â«Á"
- "â«ÃÁ"
- "â«ÅÒ"
- "â«ÅÙªÑè¹"
- "â«à´ÕÂÁ"
- "â«àÇÕµ"
- "â«è"
- "â´"
- "â´¡à´¡"
- "â´´"
- "â´¹"
- "ⴹѷ"
- "â´Á"
- "â´ÁÔâ¹"
- "â´Â"
- "â´è"
- "â´è§"
- "â´ê»"
- "âµ"
- "ⵡ"
- "ⵧ൧"
- "âµ¹"
- "âµ¹´"
- "âµÁÃ"
- "âµÃ¡"
- "âµà¡ÕÂÇ"
- "âµè§"
- "âµé"
- "âµé§"
- "âµéâ¼"
- "âµê´"
- "âµêÐ"
- "âµêÐÍÔËÁèÒÁ"
- "â¶"
- "â¶§"
- "ⶺ"
- "â¶Á"
- "â·"
- "â·¡à·¡"
- "â·§"
- "â·§à·§"
- "â·¹"
- "â·Á¹ÑÊ"
- "â·Ã"
- "â·Ã¤Á¹Ò¤Á"
- "â·Ã·ÃÃȹì"
- "â·Ã·Ñȹì"
- "â·Ã¾ÔÁ¾ì"
- "â·ÃÀÒ¾"
- "â·ÃÁ"
- "â·ÃÈѾ·ì"
- "â·ÃàÅ¢"
- "â·É"
- "â·É·Ñ³±ì"
- "â·ÉÒ¹Øâ·É"
- "â·ÉÒÃÁ³ì"
- "â·ÊÐ"
- "â·ÊÒ¤µÔ"
- "â·âÊ"
- "â·è"
- "â¸è"
- "â¹"
- "â¹¹"
- "â¹ÃÒ"
- "â¹ÃÕ"
- "â¹è¹"
- "â¹éµ"
- "â¹éµºØê¡"
- "â¹éµÊì"
- "â¹é¹"
- "â¹éÁ"
- "âº"
- "⺡"
- "⺡¢Ã³Õ"
- "⺡Õé"
- "⺵"
- "⺵Ñë¹"
- "⺹ÑÊ"
- "âºÂ"
- "âºÃÁÕ¹"
- "âºÃ͹"
- "âºÃÒ³"
- "âºÅÔàÇÕÂ"
- "âºÇìÅÔè§"
- "âºÊ¶ì"
- "âºêàºê"
- "âºë"
- "â»"
- "⻡"
- "â»§"
- "â»§ÅÒ§"
- "⻹"
- "â»Ã"
- "â»Ã§"
- "â»Ã´"
- "â»ÃµÍ¹"
- "â»ÃµÕ¹"
- "â»ÃµØà¡Ê"
- "â»ÃÂ"
- "â»Ãà«Êà«ÍÃì"
- "â»ÃàµÊáµ¹µì"
- "â»Ãá¡ÃÁ"
- "â»Ãá¡ÃÁàÁÍÃì"
- "â»ÃâÁªÑ¹"
- "â»ÃâÁµ"
- "â»Ãè§"
- "â»Ãì"
- "â»ÅÔâÍ"
- "â»Åè§"
- "â»Ê¡ÒÃì´"
- "â»ÊàµÍÃì"
- "â»Ð"
- "â»áŹ´ì"
- "â»âÅ"
- "â»è§"
- "â»è§¢èÒÁ"
- "â»é"
- "â»é§"
- "â»ê"
- "â»ê¡"
- "â»ê¡à¡ÍÃì"
- "â»êÂà«Õ¹"
- "â»êÐ"
- "â¼"
- "â¼§"
- "â¼¹"
- "â¼Â"
- "â¼Å¡à¼Å¡"
- "â¼Å¹"
- "â¼ÅÐ"
- "â¼Åè"
- "â¼Ð"
- "â¾"
- "⾡"
- "â¾§"
- "â¾§¾Ò§"
- "⾫ԵÃ͹"
- "⾸ԭҳ"
- "⾸ԺÑÅÅѧ¡ì"
- "⾸ÔÊÁÀÒÃ"
- "⾸ÔÊѵÇì"
- "⾸Ôì"
- "â¾¹"
- "â¾¹·Ð¹Ò"
- "â¾Â"
- "â¾Â¡êǹ"
- "â¾ÂÁ"
- "â¾Ã¡"
- "â¾Ã§"
- "â¾Ãд¡"
- "â¾ÃⵤÍÅ"
- "â¾Å§"
- "â¾Å¹"
- "â¾ÅÐ"
- "â¾Åè§"
- "â¾Åé§"
- "â¾Åéà¾Åé"
- "â¾Ê¾"
- "â¾á·Êà«ÕÂÁ"
- "â¾é¹"
- "â¿¡ÑÊ"
- "⿹"
- "â¿Åìà´ÍÃì"
- "âÀ¤"
- "âÀ¤Ô¹"
- "âÀ¤Õ"
- "âÀª¹Ð"
- "âÀª¹Ò"
- "âÀª¹Ò¡Ã"
- "âÀª¹Ò¡ÒÃ"
- "âÀª¹ÒËÒÃ"
- "âÀª¹ì"
- "âÁ"
- "âÁ¡"
- "âÁ¡¢ì"
- "âÁ¦¡ÃÃÁ"
- "âÁ¦ÊÑ­­Ò"
- "âÁ¦Ð"
- "âÁ¦Õ¡ÃÃÁ"
- "âÁ¦ÕÂÐ"
- "âÁ§"
- "âÁ§¤ÃØèÁ"
- "âÁ´ÙÅ"
- "âÁ·¹Ò"
- "âÁÅÔº´Õ¹ÑÁ"
- "âÁÅÕ"
- "âÁËÐ"
- "âÁËѹ¸ì"
- "âÁËÒ¤µÔ"
- "âÁà´Å"
- "âÁà´çÁ"
- "âÁàÁ"
- "âÁàÁ¹µì"
- "âÁàÅ¡ØÅ"
- "âÁàÊ¡"
- "âÁàÊÊ"
- "âÁâ¹"
- "âÁâË"
- "âÁä¹Â"
- "âÁè"
- "âÁè§"
- "âÁé"
- "âÂ"
- "â¡"
- "⡵Ãì"
- "â¤Ð"
- "â¤Õ"
- "â§"
- "⪹ì"
- "â¸Ò"
- "â¸Թ"
- "â¹"
- "â¹Õ"
- "âÂÁ"
- "âÂàÂ"
- "âÂâÊ"
- "âÂè§"
- "âÂè§âÂè"
- "âÂé"
- "âÃ"
- "âä"
- "âä¨ÔµàÀ·"
- "âäÒ"
- "âäҾҸ"
- "âç"
- "âç¤ÑÅ"
- "âçàÃÕ¹"
- "âçáÃÁ"
- "âè"
- "âè¹ì"
- "âõÕ"
- "âø"
- "âøÃ"
- "âÃÁ"
- "âÃÁѹ"
- "âÃÁÒà¹ÕÂ"
- "âÃÂ"
- "âÃÉ"
- "âÃËÔµ"
- "âÃà¹ÕÂÇ"
- "âÃè"
- "âÅ¡"
- "âÅ¡ÇÔ·Ù"
- "âšѹµÃì"
- "âÅ¡Ò"
- "âšҸԺ´Õ"
- "âšҸÔäµÂ"
- "âÅ¡ÒÁÔÊ"
- "âÅ¡ÒÇÔ¹ÒÈ"
- "âÅ¡ÔÂÐ"
- "âÅ¡ÕÂÇѵÃ"
- "âÅ¡ÕÂì"
- "âšصøÃÃÁ"
- "âšصÃÐ"
- "âŧ"
- "âŨ¹Ð"
- "âųÐ"
- "âÅ´"
- "âŵÑÊ"
- "âŹ"
- "âÅÀ"
- "âÅÁ"
- "âÅÁÒ"
- "âÅËÐ"
- "âÅËѪ"
- "âÅËÔµ"
- "âÅÐ"
- "âÅàÅ"
- "âÅè"
- "âÅè§"
- "âÅé"
- "âÅé¹"
- "âÇ"
- "âÇÂ"
- "âÇÂÇÒÂ"
- "âÇËÒÃ"
- "âÇè"
- "âÇè§"
- "âÇéÂ"
- "âÇéàÇé"
- "âÈ¡"
- "âÈ¡Ò"
- "âȡҴÙÃ"
- "âÈ¡ÒÅÑÂ"
- "âÈ¡Õ"
- "âÊ"
- "âʡѹµì"
- "âʳ"
- "âʳ±ì"
- "âÊ´"
- "âÊ´Ò"
- "âʴҺѹ"
- "âʵ"
- "âÊ·¡"
- "âÊ·Ã"
- "âʸ¡"
- "âʸ¹Ð"
- "âʹ"
- "âÊÀ³"
- "âÊÀÒ"
- "âÊÀÔ³Õ"
- "âÊÀÕ"
- "âÊÁ"
- "âÊÁ¹ÑÊ"
- "âÊÁÁ"
- "âÊÁÂì"
- "âÊè"
- "âÊÃè§"
- "âÊÇÃó"
- "âÊËØéÂ"
- "âÊÌÊ"
- "âÊàÀ³Õ"
- "âÊâ¤Ã¡"
- "â˧"
- "âË´"
- "â˹"
- "â˹¡"
- "â˹è§"
- "âËÁ"
- "âËÁ´"
- "âËÁè§"
- "âËÂ"
- "âË¡àË¡"
- "â˧"
- "âËÂè§"
- "âËÃ"
- "âËçàËç"
- "âËÃоÒ"
- "âËÃÒ"
- "âËÃÒ¨ÒÃÂì"
- "âËÃÒÈÒʵÃì"
- "âËÅ"
- "âËŧâ¨é§"
- "âËŹ"
- "âËÅè"
- "âËÇ"
- "âËÇ¡àËÇ¡"
- "âËǧ"
- "âËÇ´"
- "âËǵ"
- "âËÇè"
- "âËè"
- "âÍ"
- "âÍ¡"
- "âÍ¡ÒÊ"
- "â͡ԹÒÇÒ"
- "âͧ¡ÒÃ"
- "âͧ⢴§"
- "âͪÐ"
- "âͪÒ"
- "âÍ´"
- "â͵µÑ»»Ð"
- "â͹"
- "âͺ"
- "âÍÀÒ"
- "âÍÀÒÊ"
- "âÍÁ"
- "âÍÂ"
- "âÍÃÊ"
- "âÍÅоèÍ"
- "âÍÅÔÁ»Ô¡"
- "âÍÇÒ·"
- "âÍɰÀÑÂ"
- "âÍɰì"
- "âÍʶ"
- "âÍËѧ"
- "âÍËìÁ"
- "âÍÌÒÃ"
- "âÍÌÒÃÔ¡"
- "âÍÌÒÃÖ¡"
- "âÍ໡"
- "âÍàÅÕé§"
- "âÍàÇÍÃì"
- "âÍàÍ«ÔÊ"
- "âÍàÍÊ"
- "âÍ⫹"
- "âÍè"
- "âÍè§"
- "âÍèÍèÒ"
- "âÍé"
- "âÍé¡"
- "âÍéàÍé"
- "âÍéâÅÁ"
- "âÍéâÎ"
- "âÍê¡"
- "âÍêÂ"
- "âÍë"
- "âÎ"
- "âΡ"
- "âÎÁ"
- "âÎÅìÁ"
- "âÎʵì"
- "âÎÊàµÊ"
- "âÎàµçÅ"
- "ã¡Åé"
- "ã¤Ã"
- "ã¤Ãè"
- "ã¨"
- "ãªè"
- "ãªé"
- "ã´"
- "ãµé"
- "ã¹"
- "ã¹ËÅǧ"
- "ãº"
- "ãºé"
- "ã½è"
- "ãÂ"
- "ãÊ"
- "ãÊè"
- "ãË­è"
- "ãËÁè"
- "ãËé"
- "ä¡"
- "ä¡Ã"
- "ä¡ÃÅÒÊ"
- "ä¡ÃÈÃ"
- "ä¡ÃÊÃ"
- "ä¡Å"
- "ä¡Åè"
- "ä¡Ç"
- "ä¡è"
- "ä¡ê´ì"
- "ä¡ë"
- "ä¢"
- "ä¢Çè"
- "ä¢Çé"
- "ä¢Ê×Í"
- "ä¢è"
- "ä¢è´Ñ¹"
- "ä¢èÁØ¡"
- "ä¢é"
- "ä¤"
- "ä¤Ãé"
- "ä¤Å"
- "ä¤ÅàÍç¹µì"
- "ä¤Åá͹µì"
- "ä¤Åé"
- "ä¤é"
- "ä§"
- "ä¨"
- "䩹"
- "ä©äÅ"
- "äª"
- "äªÂ"
- "äªâÂ"
- "ä«"
- "䫵ì"
- "䫹ì"
- "䫺ÕàÃÕÂ"
- "ä«»ÃÑÊ"
- "ä«ÂÒä¹´ì"
- "ä«Ãé"
- "ä«à¡ÔÅ"
- "ä«àºÍÃì"
- "ä«àù"
- "ä«â¤Å¹"
- "ä«âÅ"
- "ä«é"
- "ä´"
- "ä´¹ÒâÁ"
- "ä´¹ÒäÁµì"
- "ä´ÃàÇÍÃì"
- "ä´Ãì¿"
- "ä´ÍÐÅçÍ¡"
- "ä´ÍÐÅçÍ¡ºçÍ¡«ì"
- "ä´ÍÒÃÕè"
- "ä´àá·ÍÃÕ"
- "ä´â¹àÊÒÃì"
- "ä´é"
- "äµ"
- "äµÃ"
- "äµÃÁÒÊ"
- "äµÃèµÃͧ"
- "äµè"
- "äµé"
- "äµé¡ë§"
- "äµé½Øè¹"
- "äµéËÇѹ"
- "äµë"
- "ä¶"
- "ä¶Å"
- "ä¶è"
- "ä¶é"
- "ä·"
- "ä·¡Í"
- "ä·¿Í´ì"
- "ä·Â"
- "ä·ÂÃѰ"
- "ä·Ã"
- "ä·ÃÍ´ì"
- "ä·à·à¹ÕÂÁ"
- "ä·é"
- "ä¹"
- "ä¹µì¤ÅѺ"
- "ä¹Å͹"
- "ä¹Åì"
- "ä¹âµÃਹ"
- "亵ì"
- "äºÍÍÊ"
- "äºàºÔÅ"
- "ä»"
- "ä»ÂÒÅ"
- "ä»ÃɳÕºÃó"
- "ä»ÃɳÕºѵÃ"
- "ä»ÃɳÕÂÀѳ±ì"
- "ä»ÃɳÕÂÇѵ¶Ø"
- "ä»ÃɳÕÂÒ¡Ã"
- "ä»ÃɳÕÂì"
- "ä»Åè"
- "ä»è"
- "ä»ë"
- "ä¼"
- "ä¼·"
- "ä¼è"
- "ä½"
- "ä¾"
- "侨ԵÃ"
- "ä¾±ÙÃÂì"
- "侺ÙÅÂì"
- "ä¾Ã"
- "ä¾Ã¨ÔµÃ"
- "ä¾Ã±ÙÃÂì"
- "ä¾ÃѪ"
- "ä¾ÃÔ¹"
- "ä¾ÃÕ"
- "ä¾Ãè"
- "ä¾ÅÔ¹"
- "ä¾Åè"
- "ä¾ÈÒÅ"
- "ä¾àÃÒÐ"
- "ä¾âè¹ì"
- "ä¾è"
- "ä¾è»êÍ¡"
- "ä¿"
- "ä¿Åì"
- "ä¿á¹¹«ì"
- "äÁ¤Ã͹"
- "äÁµÃÕ"
- "äÁÂÃÒº"
- "äÁÅì"
- "äÁâ¤Ã"
- "äÁâ¤Ã«Í¿·ì"
- "äÁâ¤ÃàÇ¿"
- "äÁâ¤Ã⿹"
- "äÁè"
- "äÁé"
- "äÂ"
- "äÂè"
- "äÃ"
- "äÃè"
- "äÃé"
- "äÅÂ"
- "äÅૹÊì"
- "äÅè"
- "äÅèàÅÕèÂ"
- "äÅé"
- "äÇ"
- "äǡٳ°ì"
- "äDZÙÃÂì"
- "äÇ·Âì"
- "äǹì"
- "äǾ¨¹ì"
- "äÇÂҡóì"
- "äÇÂÒÇѨ¡Ã"
- "äÇÂÒÇѨÁÑÂ"
- "äÇÃÑÊ"
- "äÇâÍÅÔ¹"
- "äÇé"
- "äÈÅ"
- "äÊ"
- "äÊÂ"
- "äÊÂÒ"
- "äÊÃé"
- "äÊÇ"
- "äÊé"
- "äË"
- "ä˹"
- "äËÁ"
- "äËÁé"
- "äËÃè"
- "äËÅ"
- "äËÅè"
- "äËÇ"
- "äËÇé"
- "äËËÅÓ"
- "äËè"
- "äËé"
- "äÍ"
- "äͤ͹"
- "äÍ·Õ"
- "äͺÕàÍçÁ"
- "äÍÂÃÒ"
- "äÍÂàÃÈ"
- "äÍÃÒÇѳ"
- "äÍÃìᏴì"
- "äÍÈ¡ÃÕÁ"
- "äÍÈÇÃÃÂì"
- "äÍÈÙÃÂì"
- "äÍÍ͹"
- "äÍâ«â·»"
- "äÍâÍ´Õ¹"
- "äÍé"
- "äδÃÒ"
- "äÎâ¡ÃÁÔàµÍÃì"
- "äÎâ´Ã¤ÒÃìºÍ¹"
- "äÎâÅ"
+ '("à¸à¸"
+ "à¸à¸à¸¥"
+ "à¸à¸à¸¸à¸˜à¸ à¸±à¸“ฑ์"
+ "à¸à¸‡"
+ "à¸à¸‡à¸à¸²à¸£"
+ "à¸à¸‡à¸ªà¸¸à¸¥"
+ "à¸à¸‡à¹€à¸•๊à¸"
+ "à¸à¸Ž"
+ "à¸à¸Žà¸«à¸¡à¸²à¸¢"
+ "à¸à¸à¸´à¸™"
+ "à¸à¸”"
+ "à¸à¸•ัà¸à¸Šà¸¥à¸µ"
+ "à¸à¸•ัà¸à¸à¸¸à¸•า"
+ "à¸à¸•ัà¸à¸à¸¹"
+ "à¸à¸•าธิà¸à¸²à¸£"
+ "à¸à¸•าภินิหาร"
+ "à¸à¸•ิà¸à¸²"
+ "à¸à¸•เวทิตา"
+ "à¸à¸•เวที"
+ "à¸à¸–า"
+ "à¸à¸—ม"
+ "à¸à¸—ลี"
+ "à¸à¸™"
+ "à¸à¸™à¸"
+ "à¸à¸™à¸´à¸©à¸à¸²"
+ "à¸à¸š"
+ "à¸à¸šà¸"
+ "à¸à¸šà¸”าน"
+ "à¸à¸šà¸—ู"
+ "à¸à¸šà¸²à¸¥"
+ "à¸à¸šà¸´à¸™à¸—ร์"
+ "à¸à¸šà¸´à¸¥"
+ "à¸à¸šà¸µà¹ˆ"
+ "à¸à¸¡à¸¥"
+ "à¸à¸£"
+ "à¸à¸£à¸à¸Ž"
+ "à¸à¸£à¸à¸Žà¸²à¸„ม"
+ "à¸à¸£à¸à¸"
+ "à¸à¸£à¸‡"
+ "à¸à¸£à¸“ฑ์"
+ "à¸à¸£à¸“ี"
+ "à¸à¸£à¸“ียà¸à¸´à¸ˆ"
+ "à¸à¸£à¸“ีย์"
+ "à¸à¸£à¸”"
+ "à¸à¸£à¸™"
+ "à¸à¸£à¸š"
+ "à¸à¸£à¸šà¸¹à¸£"
+ "à¸à¸£à¸¡"
+ "à¸à¸£à¸¡à¸—่า"
+ "à¸à¸£à¸¡à¸˜à¸£à¸£à¸¡à¹Œ"
+ "à¸à¸£à¸£"
+ "à¸à¸£à¸£à¸Šà¸´à¸‡"
+ "à¸à¸£à¸£à¸“"
+ "à¸à¸£à¸£à¸“ิà¸à¸²à¸£à¹Œ"
+ "à¸à¸£à¸£à¸žà¸¸à¸¡"
+ "à¸à¸£à¸£à¸¡"
+ "à¸à¸£à¸£à¸¡à¸à¸£"
+ "à¸à¸£à¸£à¸¡à¸à¸²à¸£"
+ "à¸à¸£à¸£à¸¡à¸Šà¸§à¸²à¸•"
+ "à¸à¸£à¸£à¸¡à¸²à¸Šà¸™"
+ "à¸à¸£à¸£à¸¡à¸²à¸Šà¸µà¸ž"
+ "à¸à¸£à¸£à¸¡à¸²à¸˜à¸´à¸à¸²à¸£"
+ "à¸à¸£à¸£à¹€à¸ˆà¸µà¸¢à¸"
+ "à¸à¸£à¸£à¹€à¸Šà¸µà¸¢à¸‡"
+ "à¸à¸£à¸£à¹à¸—รà¸"
+ "à¸à¸£à¸£à¹‚ชà¸"
+ "à¸à¸£à¸£à¹„à¸à¸£"
+ "à¸à¸£à¸§à¸”"
+ "à¸à¸£à¸§à¸š"
+ "à¸à¸£à¸§à¸¢"
+ "à¸à¸£à¸­"
+ "à¸à¸£à¸­à¸"
+ "à¸à¸£à¸­à¸à¹à¸à¸£à¸"
+ "à¸à¸£à¸­à¸‡"
+ "à¸à¸£à¸­à¸‡à¸à¸£à¸­à¸¢"
+ "à¸à¸£à¸­à¸”"
+ "à¸à¸£à¸­à¸š"
+ "à¸à¸£à¸­à¸¡"
+ "à¸à¸£à¸°"
+ "à¸à¸£à¸°à¸‡à¸à¸à¸£à¸°à¹€à¸‡à¸´à¹ˆà¸™"
+ "à¸à¸£à¸°à¸‡à¹ˆà¸­à¸‡à¸à¸£à¸°à¹à¸‡à¹ˆà¸‡"
+ "à¸à¸£à¸°à¸‡à¹ˆà¸­à¸™à¸à¸£à¸°à¹à¸‡à¹ˆà¸™"
+ "à¸à¸£à¸°à¸ˆà¸"
+ "à¸à¸£à¸°à¸ˆà¸­à¸"
+ "à¸à¸£à¸°à¸ˆà¸­à¸‡à¸­à¹à¸‡"
+ "à¸à¸£à¸°à¸ˆà¸±à¸‡"
+ "à¸à¸£à¸°à¸ˆà¸±à¸š"
+ "à¸à¸£à¸°à¸ˆà¸²à¸”"
+ "à¸à¸£à¸°à¸ˆà¸²à¸š"
+ "à¸à¸£à¸°à¸ˆà¸²à¸¢"
+ "à¸à¸£à¸°à¸ˆà¸´à¸”"
+ "à¸à¸£à¸°à¸ˆà¸´à¸š"
+ "à¸à¸£à¸°à¸ˆà¸´à¸£à¸´à¸”"
+ "à¸à¸£à¸°à¸ˆà¸¸à¸"
+ "à¸à¸£à¸°à¸ˆà¸¸à¸šà¸à¸£à¸°à¸ˆà¸´à¸š"
+ "à¸à¸£à¸°à¸ˆà¸¸à¸¢"
+ "à¸à¸£à¸°à¸ˆà¸¸à¹‹à¸‡à¸à¸£à¸°à¸ˆà¸´à¹‹à¸‡"
+ "à¸à¸£à¸°à¸ˆà¸¸à¹‹à¸¡à¸à¸£à¸°à¸ˆà¸´à¹‹à¸¡"
+ "à¸à¸£à¸°à¸ˆà¸¹à¹‹à¸à¸£à¸°à¸ˆà¸µà¹‹"
+ "à¸à¸£à¸°à¸ˆà¹ˆà¸²à¸‡"
+ "à¸à¸£à¸°à¸ˆà¹‰à¸­à¸™"
+ "à¸à¸£à¸°à¸‰à¸­à¸"
+ "à¸à¸£à¸°à¸‰à¸±à¸šà¸à¸£à¸°à¹€à¸‰à¸‡"
+ "à¸à¸£à¸°à¸‰à¸¹à¸”"
+ "à¸à¸£à¸°à¸‰à¹ˆà¸­à¸™"
+ "à¸à¸£à¸°à¸Šà¸­à¸™"
+ "à¸à¸£à¸°à¸Šà¸±à¸š"
+ "à¸à¸£à¸°à¸Šà¸±à¹‰à¸™"
+ "à¸à¸£à¸°à¸Šà¸²à¸"
+ "à¸à¸£à¸°à¸Šà¸¸"
+ "à¸à¸£à¸°à¸‹à¸´à¸"
+ "à¸à¸£à¸°à¸‹à¸´à¸š"
+ "à¸à¸£à¸°à¸Žà¸¸à¸¡à¸žà¸µ"
+ "à¸à¸£à¸°à¸”à¸"
+ "à¸à¸£à¸°à¸”อง"
+ "à¸à¸£à¸°à¸”อน"
+ "à¸à¸£à¸°à¸”ังงา"
+ "à¸à¸£à¸°à¸”าà¸"
+ "à¸à¸£à¸°à¸”างลาง"
+ "à¸à¸£à¸°à¸”าน"
+ "à¸à¸£à¸°à¸”าษ"
+ "à¸à¸£à¸°à¸”ิà¸"
+ "à¸à¸£à¸°à¸”ิ่ง"
+ "à¸à¸£à¸°à¸”ี่"
+ "à¸à¸£à¸°à¸”ืบ"
+ "à¸à¸£à¸°à¸”ุม"
+ "à¸à¸£à¸°à¸”ูà¸"
+ "à¸à¸£à¸°à¸”้ง"
+ "à¸à¸£à¸°à¸”้าง"
+ "à¸à¸£à¸°à¸•ิà¸"
+ "à¸à¸£à¸°à¸•ิบ"
+ "à¸à¸£à¸°à¸•ิ๊ด"
+ "à¸à¸£à¸°à¸•ือรือร้น"
+ "à¸à¸£à¸°à¸•ุà¸"
+ "à¸à¸£à¸°à¸•ุ้งà¸à¸£à¸°à¸•ิ้ง"
+ "à¸à¸£à¸°à¸•ุ้น"
+ "à¸à¸£à¸°à¸•่องà¸à¸£à¸°à¹à¸•่ง"
+ "à¸à¸£à¸°à¸•่าย"
+ "à¸à¸£à¸°à¸•้วมà¸à¸£à¸°à¹€à¸•ี้ยม"
+ "à¸à¸£à¸°à¸•๊อบ"
+ "à¸à¸£à¸°à¸–ิน"
+ "à¸à¸£à¸°à¸—ง"
+ "à¸à¸£à¸°à¸—บ"
+ "à¸à¸£à¸°à¸—รวง"
+ "à¸à¸£à¸°à¸—ะ"
+ "à¸à¸£à¸°à¸—ั่ง"
+ "à¸à¸£à¸°à¸—ิง"
+ "à¸à¸£à¸°à¸—ืบ"
+ "à¸à¸£à¸°à¸—ุง"
+ "à¸à¸£à¸°à¸—ู้"
+ "à¸à¸£à¸°à¸—่อม"
+ "à¸à¸£à¸°à¸—้อน"
+ "à¸à¸£à¸°à¸—้อมà¸à¸£à¸°à¹à¸—้ม"
+ "à¸à¸£à¸°à¸™à¸±à¹‰à¸™"
+ "à¸à¸£à¸°à¸šà¸§à¸™"
+ "à¸à¸£à¸°à¸šà¸§à¸¢"
+ "à¸à¸£à¸°à¸šà¸­à¸"
+ "à¸à¸£à¸°à¸šà¸­à¸‡"
+ "à¸à¸£à¸°à¸šà¸°"
+ "à¸à¸£à¸°à¸šà¸´"
+ "à¸à¸£à¸°à¸šà¸µà¹ˆ"
+ "à¸à¸£à¸°à¸šà¸·à¸­"
+ "à¸à¸£à¸°à¸šà¸¸à¸‡"
+ "à¸à¸£à¸°à¸›à¸£à¸µà¹‰à¸à¸£à¸°à¹€à¸›à¸£à¹ˆà¸²"
+ "à¸à¸£à¸°à¸›à¸±à¹‰à¸§à¸à¸£à¸°à¹€à¸›à¸µà¹‰à¸¢"
+ "à¸à¸£à¸°à¸›à¹ˆà¸³"
+ "à¸à¸£à¸°à¸›à¹‰à¸­à¸à¸£à¸°à¹à¸›à¹‰"
+ "à¸à¸£à¸°à¸›à¹‹à¸­à¸‡"
+ "à¸à¸£à¸°à¸œà¸¥à¸µà¸à¸£à¸°à¸œà¸¥à¸²à¸¡"
+ "à¸à¸£à¸°à¸œà¸µà¸"
+ "à¸à¸£à¸°à¸žà¸µà¹‰"
+ "à¸à¸£à¸°à¸žà¸·à¸­"
+ "à¸à¸£à¸°à¸žà¸¸à¹‰à¸‡"
+ "à¸à¸£à¸°à¸Ÿà¸±à¸”à¸à¸£à¸°à¹€à¸Ÿà¸µà¸¢à¸”"
+ "à¸à¸£à¸°à¸Ÿà¸¹à¸¡à¸à¸£à¸°à¸Ÿà¸²à¸¢"
+ "à¸à¸£à¸°à¸¡à¸­à¸¡à¸à¸£à¸°à¹à¸¡à¸¡"
+ "à¸à¸£à¸°à¸¡à¸±à¸‡"
+ "à¸à¸£à¸°à¸¢à¸²à¸«à¸‡à¸±à¸™"
+ "à¸à¸£à¸°à¸¢à¸¶à¸à¸à¸£à¸°à¸¢à¸·à¸­"
+ "à¸à¸£à¸°à¸¢à¹ˆà¸­à¸™"
+ "à¸à¸£à¸°à¸£à¸­à¸"
+ "à¸à¸£à¸°à¸¥à¸­à¸¡"
+ "à¸à¸£à¸°à¸¥à¸±à¸¡à¸žà¸£"
+ "à¸à¸£à¸°à¸§à¸´à¸™"
+ "à¸à¸£à¸°à¸§à¸µà¸à¸£à¸°à¸§à¸²à¸”"
+ "à¸à¸£à¸°à¸©à¸±à¸¢"
+ "à¸à¸£à¸°à¸©à¸²à¸›à¸“์"
+ "à¸à¸£à¸°à¸ªà¸­à¸š"
+ "à¸à¸£à¸°à¸ªà¸±à¸‡"
+ "à¸à¸£à¸°à¸ªà¸±à¸™"
+ "à¸à¸£à¸°à¸ªà¸²"
+ "à¸à¸£à¸°à¸ªà¸·à¸­"
+ "à¸à¸£à¸°à¸ªà¸¸à¸‡à¸à¸£à¸°à¸ªà¸´à¸‡"
+ "à¸à¸£à¸°à¸ªà¸¸à¸™"
+ "à¸à¸£à¸°à¸«à¸™à¸"
+ "à¸à¸£à¸°à¸«à¸™à¸²à¸š"
+ "à¸à¸£à¸°à¸«à¸™à¹ˆà¸³"
+ "à¸à¸£à¸°à¸«à¸¡à¸´à¸š"
+ "à¸à¸£à¸°à¸«à¸¡à¹ˆà¸­à¸¡"
+ "à¸à¸£à¸°à¸«à¸¢à¸´à¹ˆà¸¡"
+ "à¸à¸£à¸°à¸«à¸²à¸¢"
+ "à¸à¸£à¸°à¸«à¸¶à¸¡"
+ "à¸à¸£à¸°à¸«à¸¶à¹ˆà¸¡"
+ "à¸à¸£à¸°à¸­à¸­à¸š"
+ "à¸à¸£à¸°à¸­à¸±à¸"
+ "à¸à¸£à¸°à¸­à¸±à¸à¸à¸£à¸°à¸­à¹ˆà¸§à¸™"
+ "à¸à¸£à¸°à¹€à¸‡à¹‰à¸²à¸à¸£à¸°à¸‡à¸­à¸”"
+ "à¸à¸£à¸°à¹€à¸ˆà¸²"
+ "à¸à¸£à¸°à¹€à¸ˆà¸´à¸‡"
+ "à¸à¸£à¸°à¹€à¸ˆà¸´à¸”à¸à¸£à¸°à¹€à¸ˆà¸´à¸‡"
+ "à¸à¸£à¸°à¹€à¸ˆà¸µà¹Šà¸¢à¸š"
+ "à¸à¸£à¸°à¹€à¸Šà¹‰à¸²"
+ "à¸à¸£à¸°à¹€à¸‹à¸­"
+ "à¸à¸£à¸°à¹€à¸‹à¸´à¸‡"
+ "à¸à¸£à¸°à¹€à¸‹à¹‡à¸™"
+ "à¸à¸£à¸°à¹€à¸‹à¹‰à¸²"
+ "à¸à¸£à¸°à¹€à¸”ิด"
+ "à¸à¸£à¸°à¹€à¸”ียด"
+ "à¸à¸£à¸°à¹€à¸”ือà¸"
+ "à¸à¸£à¸°à¹€à¸”ื่อง"
+ "à¸à¸£à¸°à¹€à¸”็น"
+ "à¸à¸£à¸°à¹€à¸”้า"
+ "à¸à¸£à¸°à¹€à¸•ง"
+ "à¸à¸£à¸°à¹€à¸•าะ"
+ "à¸à¸£à¸°à¹€à¸•ื้อง"
+ "à¸à¸£à¸°à¹€à¸•็น"
+ "à¸à¸£à¸°à¹€à¸–ิบ"
+ "à¸à¸£à¸°à¹€à¸—ียม"
+ "à¸à¸£à¸°à¹€à¸—ือน"
+ "à¸à¸£à¸°à¹€à¸šà¸™"
+ "à¸à¸£à¸°à¹€à¸šà¸µà¸¢à¸”"
+ "à¸à¸£à¸°à¹€à¸šà¸·à¹‰à¸­à¸‡"
+ "à¸à¸£à¸°à¹€à¸›à¸²à¸°"
+ "à¸à¸£à¸°à¹€à¸›à¹‹à¸²"
+ "à¸à¸£à¸°à¹€à¸žà¸²à¸°"
+ "à¸à¸£à¸°à¹€à¸žà¸·à¹ˆà¸­à¸¡"
+ "à¸à¸£à¸°à¹€à¸¢à¹‰à¸­à¸à¸£à¸°à¹à¸«à¸¢à¹ˆà¸‡"
+ "à¸à¸£à¸°à¹€à¸£à¸µà¸¢à¸™"
+ "à¸à¸£à¸°à¹€à¸ªà¸µà¸¢à¸™"
+ "à¸à¸£à¸°à¹€à¸ªà¸µà¸¢à¸£"
+ "à¸à¸£à¸°à¹€à¸ªà¹‡à¸™à¸à¸£à¸°à¸ªà¸²à¸¢"
+ "à¸à¸£à¸°à¹€à¸ªà¹ˆà¸²"
+ "à¸à¸£à¸°à¹€à¸«à¸¡à¹‡à¸”à¸à¸£à¸°à¹à¸«à¸¡à¹ˆ"
+ "à¸à¸£à¸°à¹à¸ˆà¸°"
+ "à¸à¸£à¸°à¹à¸‹à¸°"
+ "à¸à¸£à¸°à¹à¸”ะ"
+ "à¸à¸£à¸°à¹à¸”่ว"
+ "à¸à¸£à¸°à¹à¸•"
+ "à¸à¸£à¸°à¹à¸—à¸"
+ "à¸à¸£à¸°à¹à¸ª"
+ "à¸à¸£à¸°à¹à¸­à¸¡"
+ "à¸à¸£à¸°à¹‚จน"
+ "à¸à¸£à¸°à¹‚จม"
+ "à¸à¸£à¸°à¹‚ฉà¸à¸à¸£à¸°à¹€à¸‰à¸"
+ "à¸à¸£à¸°à¹‚ดà¸"
+ "à¸à¸£à¸°à¹‚ดà¸à¸à¸£à¸°à¹€à¸”à¸"
+ "à¸à¸£à¸°à¹‚ดง"
+ "à¸à¸£à¸°à¹‚ดด"
+ "à¸à¸£à¸°à¹‚ถน"
+ "à¸à¸£à¸°à¹‚บม"
+ "à¸à¸£à¸°à¹‚ปรง"
+ "à¸à¸£à¸°à¹‚ห้"
+ "à¸à¸£à¸±à¸"
+ "à¸à¸£à¸±à¸‡"
+ "à¸à¸£à¸±à¸™"
+ "à¸à¸£à¸±à¸š"
+ "à¸à¸£à¸±à¸¡"
+ "à¸à¸£à¸²à¸"
+ "à¸à¸£à¸²à¸‡"
+ "à¸à¸£à¸²à¸”"
+ "à¸à¸£à¸²à¸™"
+ "à¸à¸£à¸²à¸š"
+ "à¸à¸£à¸²à¸Ÿ"
+ "à¸à¸£à¸²à¸Ÿà¸Ÿà¸´à¸"
+ "à¸à¸£à¸²à¸Ÿà¸´à¸"
+ "à¸à¸£à¸²à¸¡"
+ "à¸à¸£à¸²à¸¢"
+ "à¸à¸£à¸²à¸§"
+ "à¸à¸£à¸³"
+ "à¸à¸£à¸´à¸"
+ "à¸à¸£à¸´à¸‡à¸à¸£à¸´à¸§"
+ "à¸à¸£à¸´à¸Š"
+ "à¸à¸£à¸´à¸š"
+ "à¸à¸£à¸´à¸¡"
+ "à¸à¸£à¸´à¸¢à¸²"
+ "à¸à¸£à¸´à¸§"
+ "à¸à¸£à¸´à¹ˆà¸‡"
+ "à¸à¸£à¸´à¹ˆà¸¡"
+ "à¸à¸£à¸´à¹‰à¸§"
+ "à¸à¸£à¸´à¹Šà¸"
+ "à¸à¸£à¸´à¹Šà¸‡"
+ "à¸à¸£à¸µ"
+ "à¸à¸£à¸µà¸"
+ "à¸à¸£à¸µà¸‘า"
+ "à¸à¸£à¸µà¸”"
+ "à¸à¸£à¸µà¸˜à¸²"
+ "à¸à¸£à¸µà¹Šà¸”"
+ "à¸à¸£à¸¸"
+ "à¸à¸£à¸¸à¸"
+ "à¸à¸£à¸¸à¸‡"
+ "à¸à¸£à¸¸à¸‡à¹€à¸—พ"
+ "à¸à¸£à¸¸à¸“า"
+ "à¸à¸£à¸¸à¸“าธิคุณ"
+ "à¸à¸£à¸¸à¸™"
+ "à¸à¸£à¸¸à¸š"
+ "à¸à¸£à¸¸à¸¢"
+ "à¸à¸£à¸¸à¹ˆà¸™"
+ "à¸à¸£à¸¸à¹ˆà¸¡"
+ "à¸à¸£à¸¸à¹‰à¸¡à¸à¸£à¸´à¹ˆà¸¡"
+ "à¸à¸£à¸¸à¹Šà¸›"
+ "à¸à¸£à¸¹"
+ "à¸à¸£à¸¹à¸”"
+ "à¸à¸£à¹‡à¸­à¸à¸à¸£à¹‹à¸­à¸¢"
+ "à¸à¸£à¹ˆà¸­à¸™"
+ "à¸à¸£à¹ˆà¸­à¸¢"
+ "à¸à¸£à¹ˆà¸²à¸‡"
+ "à¸à¸£à¹ˆà¸²à¸¢"
+ "à¸à¸£à¹ˆà¸³"
+ "à¸à¸£à¹‰à¸§à¸¡"
+ "à¸à¸£à¹‰à¸­"
+ "à¸à¸£à¹‰à¸²à¸™"
+ "à¸à¸£à¹‰à¸²à¸§"
+ "à¸à¸¤à¸©à¸Žà¸µà¸à¸²"
+ "à¸à¸¤à¸©à¸“า"
+ "à¸à¸¥"
+ "à¸à¸¥à¸”"
+ "à¸à¸¥à¸š"
+ "à¸à¸¥à¸¡"
+ "à¸à¸¥à¸¢à¸¸à¸—ธ์"
+ "à¸à¸¥à¸§à¸‡"
+ "à¸à¸¥à¸­à¸"
+ "à¸à¸¥à¸­à¸‡"
+ "à¸à¸¥à¸­à¸™"
+ "à¸à¸¥à¸­à¸¢"
+ "à¸à¸¥à¸±à¸"
+ "à¸à¸¥à¸±à¸”"
+ "à¸à¸¥à¸±à¸š"
+ "à¸à¸¥à¸±à¸§"
+ "à¸à¸¥à¸±à¹ˆà¸™"
+ "à¸à¸¥à¸±à¹‰à¸™"
+ "à¸à¸¥à¸±à¹‰à¸§"
+ "à¸à¸¥à¸²à¸"
+ "à¸à¸¥à¸²à¸‡"
+ "à¸à¸¥à¸²à¸”"
+ "à¸à¸¥à¸²à¸¢"
+ "à¸à¸¥à¸²à¹‚หม"
+ "à¸à¸¥à¸´à¹ˆà¸‡"
+ "à¸à¸¥à¸´à¹ˆà¸™"
+ "à¸à¸¥à¸´à¹‰à¸‡"
+ "à¸à¸¥à¸´à¹‰à¸¡"
+ "à¸à¸¥à¸µ"
+ "à¸à¸¥à¸µà¸š"
+ "à¸à¸¥à¸µà¹ˆ"
+ "à¸à¸¥à¸¶à¸‡"
+ "à¸à¸¥à¸·à¸™"
+ "à¸à¸¥à¸¸à¹ˆà¸¡"
+ "à¸à¸¥à¸¸à¹‰à¸¡"
+ "à¸à¸¥à¸¹à¹‚คส"
+ "à¸à¸¥à¹€à¸¡à¹‡à¸”"
+ "à¸à¸¥à¹ˆà¸™"
+ "à¸à¸¥à¹ˆà¸­à¸‡"
+ "à¸à¸¥à¹ˆà¸­à¸™"
+ "à¸à¸¥à¹ˆà¸­à¸¡"
+ "à¸à¸¥à¹ˆà¸²à¸§"
+ "à¸à¸¥à¹ˆà¸³"
+ "à¸à¸¥à¹‰à¸§à¸¢"
+ "à¸à¸¥à¹‰à¸§à¸¢à¹„ม้"
+ "à¸à¸¥à¹‰à¸­"
+ "à¸à¸¥à¹‰à¸­à¸‡"
+ "à¸à¸¥à¹‰à¸­à¸™"
+ "à¸à¸¥à¹‰à¸­à¸¡à¹à¸à¸¥à¹‰à¸¡"
+ "à¸à¸¥à¹‰à¸²"
+ "à¸à¸¥à¹‰à¸²à¸¡"
+ "à¸à¸¥à¹‰à¸³"
+ "à¸à¸§à¸”"
+ "à¸à¸§à¸™"
+ "à¸à¸§à¸¡"
+ "à¸à¸§à¸¢"
+ "à¸à¸§à¸¢à¸ˆà¸±à¹Šà¸š"
+ "à¸à¸§à¸¢à¸ˆà¸µà¹Š"
+ "à¸à¸§à¸±à¸"
+ "à¸à¸§à¸±à¸”"
+ "à¸à¸§à¸²à¸‡"
+ "à¸à¸§à¸²à¸‡à¸•ุ้ง"
+ "à¸à¸§à¸²à¸”"
+ "à¸à¸§à¸²à¸§à¹€à¸„รือ"
+ "à¸à¸§à¸µ"
+ "à¸à¸§à¹ˆà¸²"
+ "à¸à¸§à¹‰à¸²à¸‡"
+ "à¸à¸§à¹‰à¸²à¸™"
+ "à¸à¸§à¹Šà¸²à¸™"
+ "à¸à¸©à¸±à¸•ริย์"
+ "à¸à¸©à¸±à¸¢"
+ "à¸à¸©à¸²à¸›à¸“์"
+ "à¸à¸ªà¸´"
+ "à¸à¸ªà¸´à¸à¸£"
+ "à¸à¸ªà¸´à¸à¸£à¸£à¸¡"
+ "à¸à¸ªà¸´à¸“"
+ "à¸à¸­"
+ "à¸à¸­à¸"
+ "à¸à¸­à¸‡"
+ "à¸à¸­à¸‹"
+ "à¸à¸­à¸”"
+ "à¸à¸­à¸š"
+ "à¸à¸­à¸›à¸£"
+ "à¸à¸­à¸¢"
+ "à¸à¸­à¸£à¸´à¸¥à¸¥à¸²"
+ "à¸à¸­à¸¥à¹Œà¸Ÿ"
+ "à¸à¸­à¹€à¸­à¸µà¹Šà¸¢à¸°"
+ "à¸à¸°"
+ "à¸à¸°à¸Šà¸¶à¹ˆà¸à¸à¸°à¸Šà¸±à¹ˆà¸"
+ "à¸à¸°à¸‹à¸§à¸"
+ "à¸à¸°à¸”ี่"
+ "à¸à¸°à¸•้ำ"
+ "à¸à¸°à¸•๊าà¸"
+ "à¸à¸°à¸—à¸à¸£à¸"
+ "à¸à¸°à¸—ัดรัด"
+ "à¸à¸°à¸—ันหัน"
+ "à¸à¸°à¸—ิ"
+ "à¸à¸°à¸—ือ"
+ "à¸à¸°à¸šà¸±à¸‡à¸¥à¸¡"
+ "à¸à¸°à¸šà¸´à¹‰à¸‡"
+ "à¸à¸°à¸›à¸£à¸´à¸”à¸à¸°à¸›à¸£à¸­à¸¢"
+ "à¸à¸°à¸›à¸§à¸à¸à¸°à¹€à¸›à¸µà¸¢à¸"
+ "à¸à¸°à¸›à¸°"
+ "à¸à¸°à¸›à¸´"
+ "à¸à¸°à¸žà¸‡"
+ "à¸à¸°à¸žà¸£à¸´à¸š"
+ "à¸à¸°à¸žà¸¥à¹ˆà¸­à¸‡à¸à¸°à¹à¸žà¸¥à¹ˆà¸‡"
+ "à¸à¸°à¸žà¹‰à¸­"
+ "à¸à¸°à¸£à¸±à¸•"
+ "à¸à¸°à¸£à¸¸à¹ˆà¸‡à¸à¸°à¸£à¸´à¹ˆà¸‡"
+ "à¸à¸°à¸¥à¸§à¸¢"
+ "à¸à¸°à¸¥à¸­"
+ "à¸à¸°à¸¥à¸°à¸›à¸±à¸‡à¸«à¸²"
+ "à¸à¸°à¸¥à¸°à¸¡à¸±à¸‡"
+ "à¸à¸°à¸¥à¸°à¹à¸¡"
+ "à¸à¸°à¸¥à¸²"
+ "à¸à¸°à¸¥à¸²à¸ªà¸µ"
+ "à¸à¸°à¸¥à¸´à¹‰à¸¡à¸à¸°à¹€à¸«à¸¥à¸µà¹ˆà¸¢"
+ "à¸à¸°à¸¥à¹ˆà¸­à¸™"
+ "à¸à¸°à¸¥à¹ˆà¸­à¸¡à¸à¸°à¹à¸¥à¹ˆà¸¡"
+ "à¸à¸°à¸¥à¹ˆà¸­à¸¢à¸à¸°à¸«à¸¥à¸´à¸š"
+ "à¸à¸°à¸ªà¹‰à¸²à¸«à¸­à¸¢"
+ "à¸à¸°à¸«à¸™à¸¸à¸‡à¸à¸°à¸«à¸™à¸´à¸‡"
+ "à¸à¸°à¸«à¸™à¹‡à¸­à¸‡à¸à¸°à¹à¸«à¸™à¹‡à¸‡"
+ "à¸à¸°à¸«à¸£à¸­à¸”"
+ "à¸à¸°à¸«à¸£à¸µà¹ˆ"
+ "à¸à¸°à¸«à¸£à¹‡à¸­à¸¡à¸à¸°à¹à¸«à¸£à¹‡à¸¡"
+ "à¸à¸°à¸«à¸£à¹ˆà¸­à¸‡"
+ "à¸à¸°à¸«à¸¥à¸µà¹ˆ"
+ "à¸à¸°à¸«à¸¥à¸¸à¸à¸à¸°à¸«à¸¥à¸´à¸"
+ "à¸à¸°à¸«à¸¥à¹ˆà¸³"
+ "à¸à¸°à¹€à¸”à¸"
+ "à¸à¸°à¹€à¸•ง"
+ "à¸à¸°à¹€à¸—ย"
+ "à¸à¸°à¹€à¸—าะ"
+ "à¸à¸°à¹€à¸›à¸´à¹Šà¸šà¸à¸°à¸›à¹Šà¸²à¸š"
+ "à¸à¸°à¹€à¸œà¸¥à¸"
+ "à¸à¸°à¹€à¸£à¸µà¹ˆà¸¢à¸à¸°à¸£à¸²à¸”"
+ "à¸à¸°à¹€à¸¥à¸´à¸”"
+ "à¸à¸°à¹€à¸¥à¹ˆà¸­à¸à¸°à¸¥à¹ˆà¸²"
+ "à¸à¸°à¹€à¸«à¸£à¸µà¹ˆà¸¢à¸‡"
+ "à¸à¸°à¹€à¸«à¸¥à¸²à¸°à¹€à¸›à¸²à¸°"
+ "à¸à¸°à¹à¸Šà¹ˆ"
+ "à¸à¸°à¹‚ตงà¸à¸°à¹€à¸•ง"
+ "à¸à¸°à¹‚ต้งโห่ง"
+ "à¸à¸°à¹‚ต๊à¸"
+ "à¸à¸°à¹‚ปรง"
+ "à¸à¸°à¹‚ปโล"
+ "à¸à¸°à¹‚ผลà¸à¸à¸°à¹€à¸œà¸¥à¸"
+ "à¸à¸°à¹‚หลà¸"
+ "à¸à¸±à¸"
+ "à¸à¸±à¸à¸‚ฬะ"
+ "à¸à¸±à¸‡"
+ "à¸à¸±à¸‡à¸à¹‰à¸²"
+ "à¸à¸±à¸‡à¸‚า"
+ "à¸à¸±à¸‡à¸‰à¸´à¸™"
+ "à¸à¸±à¸‡à¸Ÿà¸¹"
+ "à¸à¸±à¸‡à¸§à¸¥"
+ "à¸à¸±à¸‡à¸§à¸²à¸™"
+ "à¸à¸±à¸‡à¸ªà¸”าล"
+ "à¸à¸±à¸‡à¸«à¸±à¸™"
+ "à¸à¸±à¸‡à¹„ส"
+ "à¸à¸±à¸à¸Šà¸²"
+ "à¸à¸±à¸à¸à¸²"
+ "à¸à¸±à¸“ฑ์"
+ "à¸à¸±à¸”"
+ "à¸à¸±à¸™"
+ "à¸à¸±à¸™à¸”าร"
+ "à¸à¸±à¸™à¸•์"
+ "à¸à¸±à¸™à¸¢à¸²à¸¢à¸™"
+ "à¸à¸±à¸™à¸¢à¹Œ"
+ "à¸à¸±à¸š"
+ "à¸à¸±à¸›"
+ "à¸à¸±à¸›à¸•ัน"
+ "à¸à¸±à¸¡à¸›à¸™à¸²à¸—"
+ "à¸à¸±à¸¡à¸›à¸£à¸°à¹‚ด"
+ "à¸à¸±à¸¡à¸žà¸¹à¸Šà¸²"
+ "à¸à¸±à¸¡à¸¡à¸±à¸™à¸•ภาพรังสี"
+ "à¸à¸±à¸¡à¸¡à¸±à¸™à¸•รังสี"
+ "à¸à¸±à¸¥à¸šà¸"
+ "à¸à¸±à¸¥à¸›à¸žà¸¤à¸à¸©à¹Œ"
+ "à¸à¸±à¸¥à¸›à¸±à¸‡à¸«à¸²"
+ "à¸à¸±à¸¥à¸›à¸²à¸§à¸ªà¸²à¸™"
+ "à¸à¸±à¸¥à¸›à¹Œ"
+ "à¸à¸±à¸¥à¸¢à¸²"
+ "à¸à¸±à¸¥à¸¢à¸²à¸“"
+ "à¸à¸±à¸¥à¸¢à¸²à¸“มิตร"
+ "à¸à¸±à¸¥à¸¢à¸²à¸“ี"
+ "à¸à¸±à¸¥à¹‚ช"
+ "à¸à¸±à¹ˆà¸™"
+ "à¸à¸±à¹‰à¸‡"
+ "à¸à¸±à¹‰à¸™"
+ "à¸à¸±à¹‰à¸™à¸«à¸¢à¸±à¹ˆà¸™"
+ "à¸à¸±à¹Šà¸"
+ "à¸à¸²"
+ "à¸à¸²à¸"
+ "à¸à¸²à¸à¸µ"
+ "à¸à¸²à¸‡"
+ "à¸à¸²à¸‡à¹€à¸à¸‡"
+ "à¸à¸²à¸‡à¹€à¸‚น"
+ "à¸à¸²à¸‹à¸°à¸¥à¸­à¸‡"
+ "à¸à¸²à¸à¸ˆà¸™à¸šà¸¸à¸£à¸µ"
+ "à¸à¸²à¸à¸ˆà¸™à¸²"
+ "à¸à¸²à¸”"
+ "à¸à¸²à¸™"
+ "à¸à¸²à¸™à¸”า"
+ "à¸à¸²à¸™à¸žà¸¥à¸¹"
+ "à¸à¸²à¸š"
+ "à¸à¸²à¸à¸²à¸"
+ "à¸à¸²à¸žà¸¢à¹Œ"
+ "à¸à¸²à¸¡"
+ "à¸à¸²à¸¡à¸²à¸£à¸¡à¸“์"
+ "à¸à¸²à¸¢"
+ "à¸à¸²à¸¢à¸à¸£à¸£à¸¡"
+ "à¸à¸²à¸¢à¸ à¸²à¸ž"
+ "à¸à¸²à¸¢à¸§à¸´à¸ à¸²à¸„"
+ "à¸à¸²à¸¢à¸ªà¸´à¸—ธิ์"
+ "à¸à¸²à¸¢à¸²à¸žà¸¢à¸ž"
+ "à¸à¸²à¸£"
+ "à¸à¸²à¸£à¸“์"
+ "à¸à¸²à¸£à¸šà¸¹à¸£"
+ "à¸à¸²à¸£à¸°à¹€à¸à¸”"
+ "à¸à¸²à¸£à¸±à¸“ย์"
+ "à¸à¸²à¸£à¸±à¸™à¸•์"
+ "à¸à¸²à¸£à¸¸à¸"
+ "à¸à¸²à¸£à¸¸à¸“ย์"
+ "à¸à¸²à¸£à¹€à¸§à¸"
+ "à¸à¸²à¸£à¹Œ"
+ "à¸à¸²à¸£à¹Œà¸”"
+ "à¸à¸²à¸£à¹Œà¸•ูน"
+ "à¸à¸²à¸¥"
+ "à¸à¸²à¸¥à¸à¸´à¸“ี"
+ "à¸à¸²à¸¥à¸µ"
+ "à¸à¸²à¸¥à¹€à¸—ศะ"
+ "à¸à¸²à¸§"
+ "à¸à¸²à¸¨"
+ "à¸à¸²à¸ª"
+ "à¸à¸²à¸ªà¸£"
+ "à¸à¸²à¸ªà¸´à¹‚น"
+ "à¸à¸²à¸«à¸¥à¸‡"
+ "à¸à¸²à¸¬"
+ "à¸à¸²à¹€à¸«à¸§à¹ˆà¸²"
+ "à¸à¸²à¹à¸Ÿ"
+ "à¸à¸²à¹à¸¥à¹‡à¸à¸‹à¸µ"
+ "à¸à¸³"
+ "à¸à¸³à¸à¸§à¸¡"
+ "à¸à¸³à¸à¸±à¸”"
+ "à¸à¸³à¸à¸±à¸š"
+ "à¸à¸³à¸ˆà¸£"
+ "à¸à¸³à¸ˆà¸±à¸”"
+ "à¸à¸³à¸ˆà¸²à¸¢"
+ "à¸à¸³à¸Šà¸±à¸š"
+ "à¸à¸³à¸‹à¸²à¸š"
+ "à¸à¸³à¸”ัด"
+ "à¸à¸³à¸˜à¸£"
+ "à¸à¸³à¸™à¸±à¸™"
+ "à¸à¸³à¸™à¸±à¸¥"
+ "à¸à¸³à¸šà¸±à¸‡"
+ "à¸à¸³à¸›à¸±à¹ˆà¸™"
+ "à¸à¸³à¸žà¸£à¹‰à¸²"
+ "à¸à¸³à¸žà¸·à¸”"
+ "à¸à¸³à¸¡à¸°à¸–ัน"
+ "à¸à¸³à¸¡à¸°à¸¥à¸­"
+ "à¸à¸³à¸¡à¸°à¸«à¸¢à¸µà¹ˆ"
+ "à¸à¸³à¸¢à¸²à¸™"
+ "à¸à¸³à¸¢à¸³"
+ "à¸à¸³à¸£à¸²à¸š"
+ "à¸à¸³à¸¥à¸±à¸‡"
+ "à¸à¸³à¸ªà¸£à¸§à¸¥"
+ "à¸à¸³à¸«à¸™à¸”"
+ "à¸à¸³à¸«à¸™à¸±à¸”"
+ "à¸à¸³à¹€à¸”า"
+ "à¸à¸³à¹€à¸™à¸´à¸”"
+ "à¸à¸³à¹€à¸£à¸´à¸š"
+ "à¸à¸³à¹€à¸«à¸™à¹‡à¸ˆ"
+ "à¸à¸³à¹à¸žà¸‡"
+ "à¸à¸³à¹à¸«à¸‡"
+ "à¸à¸³à¹„ร"
+ "à¸à¸³à¹„ล"
+ "à¸à¸´à¸"
+ "à¸à¸´à¸à¸°"
+ "à¸à¸´à¸ˆ"
+ "à¸à¸´à¸ˆà¸à¸£à¸£à¸¡"
+ "à¸à¸´à¸ˆà¸à¸²à¸£"
+ "à¸à¸´à¸ˆà¸ˆà¸°à¸¥à¸±à¸à¸©à¸“ะ"
+ "à¸à¸´à¸ˆà¸ˆà¸²"
+ "à¸à¸´à¸•ติ"
+ "à¸à¸´à¸•ติคุณ"
+ "à¸à¸´à¸•ติมศัà¸à¸”ิ์"
+ "à¸à¸´à¸•ติศัพท์"
+ "à¸à¸´à¸™"
+ "à¸à¸´à¸™à¸™à¸£"
+ "à¸à¸´à¸™à¸£à¸µ"
+ "à¸à¸´à¸£à¸´à¸“ี"
+ "à¸à¸´à¸£à¸´à¸¢à¸²"
+ "à¸à¸´à¹€à¸¥à¸™"
+ "à¸à¸´à¹€à¸¥à¸ª"
+ "à¸à¸´à¹‚มโน"
+ "à¸à¸´à¹‚ยตีน"
+ "à¸à¸´à¹‚ล"
+ "à¸à¸´à¹‚ลà¸à¸£à¸±à¸¡"
+ "à¸à¸´à¹‚ลลิตร"
+ "à¸à¸´à¹‚ลเมตร"
+ "à¸à¸´à¹‚ลเฮิรตซ์"
+ "à¸à¸´à¹ˆà¸‡"
+ "à¸à¸´à¹ˆà¸§"
+ "à¸à¸´à¹‰à¸‡à¸à¸·à¸­"
+ "à¸à¸´à¹‰à¸‡à¸à¹ˆà¸²"
+ "à¸à¸´à¹Šà¸"
+ "à¸à¸´à¹Šà¸š"
+ "à¸à¸´à¹‹à¸§"
+ "à¸à¸µà¸à¸§à¸´à¸—ยา"
+ "à¸à¸µà¸”"
+ "à¸à¸µà¸•าร์"
+ "à¸à¸µà¸š"
+ "à¸à¸µà¸¬à¸²"
+ "à¸à¸µà¹ˆ"
+ "à¸à¸µà¹‰"
+ "à¸à¸µà¹‹"
+ "à¸à¸¶à¸"
+ "à¸à¸¶à¸à¸à¹‰à¸­à¸‡"
+ "à¸à¸¶à¹ˆà¸‡"
+ "à¸à¸¶à¹‹à¸™"
+ "à¸à¸¸"
+ "à¸à¸¸à¸"
+ "à¸à¸¸à¸à¸à¸±à¸"
+ "à¸à¸¸à¸à¸Šà¸£"
+ "à¸à¸¸à¸à¹à¸ˆ"
+ "à¸à¸¸à¸Žà¸¸à¸¡à¸žà¸µ"
+ "à¸à¸¸à¸à¸à¸±à¸‡"
+ "à¸à¸¸à¸à¸´"
+ "à¸à¸¸à¸“ฑล"
+ "à¸à¸¸à¸”"
+ "à¸à¸¸à¸”ัง"
+ "à¸à¸¸à¸”ั่น"
+ "à¸à¸¸à¸™"
+ "à¸à¸¸à¸™à¸‹à¸·à¸­"
+ "à¸à¸¸à¸™à¹€à¸Šà¸µà¸¢à¸‡"
+ "à¸à¸¸à¸š"
+ "à¸à¸¸à¸¡"
+ "à¸à¸¸à¸¡à¸ à¸²"
+ "à¸à¸¸à¸¡à¸ à¹Œ"
+ "à¸à¸¸à¸¡à¸²à¸£"
+ "à¸à¸¸à¸¡à¸²à¸£à¸²"
+ "à¸à¸¸à¸¡à¸²à¸£à¸µ"
+ "à¸à¸¸à¸¢"
+ "à¸à¸¸à¸¢à¸Šà¹ˆà¸²à¸¢"
+ "à¸à¸¸à¸¢à¹€à¸®à¸‡"
+ "à¸à¸¸à¸¥"
+ "à¸à¸¸à¸¥à¸˜à¸´à¸”า"
+ "à¸à¸¸à¸¥à¸šà¸¸à¸•ร"
+ "à¸à¸¸à¸¥à¸ªà¸•รี"
+ "à¸à¸¸à¸¥à¸²"
+ "à¸à¸¸à¸¥à¸µ"
+ "à¸à¸¸à¸¥à¸µà¸à¸¸à¸ˆà¸­"
+ "à¸à¸¸à¸¨à¸¥"
+ "à¸à¸¸à¸¨à¹‚ลบาย"
+ "à¸à¸¸à¸«à¸¥à¸²à¸š"
+ "à¸à¸¸à¹ˆà¸¡"
+ "à¸à¸¸à¹‰à¸‡"
+ "à¸à¸¸à¹Šà¸"
+ "à¸à¸¸à¹Šà¸™"
+ "à¸à¸¸à¹Šà¸¢"
+ "à¸à¸¸à¹‹à¸¢"
+ "à¸à¸¹"
+ "à¸à¸¹à¸“ฑ์"
+ "à¸à¸¹à¸”"
+ "à¸à¸¹à¸š"
+ "à¸à¸¹à¹ˆ"
+ "à¸à¸¹à¹‰"
+ "à¸à¹€à¸¬à¸§à¸£à¸²à¸"
+ "à¸à¹‡"
+ "à¸à¹ˆà¸‡"
+ "à¸à¹ˆà¸™"
+ "à¸à¹ˆà¸­"
+ "à¸à¹ˆà¸­à¸‡"
+ "à¸à¹ˆà¸­à¸™"
+ "à¸à¹ˆà¸²à¸¢"
+ "à¸à¹ˆà¸³"
+ "à¸à¹‰à¸‡à¹‚ค้ง"
+ "à¸à¹‰à¸™"
+ "à¸à¹‰à¸¡"
+ "à¸à¹‰à¸­"
+ "à¸à¹‰à¸­à¸‡"
+ "à¸à¹‰à¸­à¸™"
+ "à¸à¹‰à¸­à¸¡"
+ "à¸à¹‰à¸­à¸¢"
+ "à¸à¹‰à¸­à¸£à¹ˆà¸­à¸à¹‰à¸­à¸•ิà¸"
+ "à¸à¹‰à¸²à¸‡"
+ "à¸à¹‰à¸²à¸™"
+ "à¸à¹‰à¸²à¸¡"
+ "à¸à¹‰à¸²à¸§"
+ "à¸à¹‰à¸³"
+ "à¸à¹‰à¸³à¸à¸¶à¹ˆà¸‡"
+ "à¸à¹‰à¸³à¹€à¸à¸´à¸™"
+ "à¸à¹Šà¸"
+ "à¸à¹Šà¸‡"
+ "à¸à¹Šà¸­à¸"
+ "à¸à¹Šà¸­à¸šà¸›à¸µà¹‰"
+ "à¸à¹Šà¸­à¸›à¸›à¸µà¹‰"
+ "à¸à¹Šà¸²à¸‹"
+ "à¸à¹Šà¸²à¸”"
+ "à¸à¹‹à¸‡"
+ "à¸à¹‹à¸§à¸¢à¹€à¸•ี๋ยว"
+ "à¸à¹‹à¸­à¸¢"
+ "à¸à¹‹à¸²"
+ "ขงจื๊อ"
+ "ขจร"
+ "ขจัด"
+ "ขจาย"
+ "ขจี"
+ "ขจุย"
+ "ขณะ"
+ "ขด"
+ "ขน"
+ "ขนง"
+ "ขนด"
+ "ขนน"
+ "ขนบ"
+ "ขนม"
+ "ขนมอบ"
+ "ขนัด"
+ "ขนัน"
+ "ขนาà¸"
+ "ขนาง"
+ "ขนาด"
+ "ขนาน"
+ "ขนาบ"
+ "ขนาย"
+ "ขนิษà¸à¸²"
+ "ขนุน"
+ "ขบ"
+ "ขบถ"
+ "ขบวน"
+ "ขม"
+ "ขมวด"
+ "ขมอง"
+ "ขมอย"
+ "ขมัง"
+ "ขมับ"
+ "ขมา"
+ "ขมิบ"
+ "ขมิ้น"
+ "ขมีขมัน"
+ "ขมึง"
+ "ขมุà¸à¸‚มอม"
+ "ขมุà¸à¸‚มัว"
+ "ขมุบ"
+ "ขมุบขมิบ"
+ "ขม่อม"
+ "ขม้ำ"
+ "ขยอà¸"
+ "ขยอง"
+ "ขยะ"
+ "ขยัà¸"
+ "ขยัน"
+ "ขยับ"
+ "ขยั้น"
+ "ขยาด"
+ "ขยาบ"
+ "ขยาย"
+ "ขยำ"
+ "ขยิà¸"
+ "ขยิบ"
+ "ขยิ่ม"
+ "ขยี้"
+ "ขยุà¸à¸‚ยิà¸"
+ "ขยุà¸à¸‚ยุย"
+ "ขยุบ"
+ "ขยุบขยิบ"
+ "ขยุม"
+ "ขยุย"
+ "ขยุ้ม"
+ "ขย่ม"
+ "ขย่อน"
+ "ขย้อน"
+ "ขย้ำ"
+ "ขรม"
+ "ขรรค์"
+ "ขรัว"
+ "ขริบ"
+ "ขรึม"
+ "ขรุขระ"
+ "ขลัง"
+ "ขลับ"
+ "ขลา"
+ "ขลาด"
+ "ขลิบ"
+ "ขลุà¸"
+ "ขลุà¸à¸‚ลัà¸"
+ "ขลุà¸à¸‚ลิà¸"
+ "ขลุบ"
+ "ขลุม"
+ "ขลุ่ย"
+ "ขวง"
+ "ขวด"
+ "ขวนขวาย"
+ "ขวบ"
+ "ขวย"
+ "ขวัà¸à¹„ขว่"
+ "ขวัà¸"
+ "ขวัด"
+ "ขวับ"
+ "ขวับเขวียว"
+ "ขวั้น"
+ "ขวา"
+ "ขวาà¸"
+ "ขวาง"
+ "ขวาด"
+ "ขวาน"
+ "ขวายขวน"
+ "ขวิด"
+ "ขว้าง"
+ "ขอ"
+ "ขอà¸"
+ "ของ"
+ "ขอด"
+ "ขอน"
+ "ขอบ"
+ "ขอบคุณ"
+ "ขอบใจ"
+ "ขอม"
+ "ขะมอมขะà¹à¸¡à¸¡"
+ "ขะมัà¸à¹€à¸‚ม้น"
+ "ขะมุà¸à¸‚ะมอม"
+ "ขะยิà¸"
+ "ขะยุà¸"
+ "ขะเย้อà¹à¸‚ย่ง"
+ "ขะà¹à¸¢à¸°"
+ "ขัง"
+ "ขัณฑสà¸à¸£"
+ "ขัณฑสีมา"
+ "ขัด"
+ "ขัตติยมานะ"
+ "ขัน"
+ "ขันชะเนาะ"
+ "ขันติ"
+ "ขันที"
+ "ขันธ์"
+ "ขันหมาà¸"
+ "ขันโตà¸"
+ "ขับ"
+ "ขัย"
+ "ขั้น"
+ "ขั้ว"
+ "ขา"
+ "ขาà¸"
+ "ขาà¸à¹Šà¸§à¸¢"
+ "ขาง"
+ "ขาด"
+ "ขาน"
+ "ขาบ"
+ "ขาม"
+ "ขาย"
+ "ขาล"
+ "ขาว"
+ "ขำ"
+ "ขิà¸"
+ "ขิง"
+ "ขิม"
+ "ขิ่ง"
+ "ขีด"
+ "ขีปนาวุธ"
+ "ขี่"
+ "ขี้"
+ "ขี้เหร่"
+ "ขึง"
+ "ขึ้ง"
+ "ขึ้น"
+ "ขึ้นฉ่าย"
+ "ขืน"
+ "ขื่น"
+ "ขื่อ"
+ "ขุà¸"
+ "ขุด"
+ "ขุน"
+ "ขุนทอง"
+ "ขุนà¹à¸œà¸™"
+ "ขุม"
+ "ขุย"
+ "ขุ่น"
+ "ขูด"
+ "ขู่"
+ "ขโมย"
+ "ข่ม"
+ "ข่วน"
+ "ข่อ"
+ "ข่อน"
+ "ข่อย"
+ "ข่า"
+ "ข่าง"
+ "ข่าย"
+ "ข่าว"
+ "ข่าวสาร"
+ "ข้น"
+ "ข้อ"
+ "ข้อง"
+ "ข้อน"
+ "ข้อมูล"
+ "ข้อย"
+ "ข้า"
+ "ข้าง"
+ "ข้าพเจ้า"
+ "ข้าม"
+ "ข้าว"
+ "ข้าวสาร"
+ "ข้าวเม่า"
+ "ข้าวโพด"
+ "ข้าศึà¸"
+ "ข้าหลวง"
+ "คคนัมพร"
+ "คคนางค์"
+ "คคนานต์"
+ "คง"
+ "คงคา"
+ "คชราช"
+ "คชสาร"
+ "คชาชาติ"
+ "คชาชีพ"
+ "คชาธาร"
+ "คชาภรณ์"
+ "คณนา"
+ "คณบดี"
+ "คณะ"
+ "คณาจารย์"
+ "คณาธิà¸à¸²à¸£"
+ "คณาธิปไตย"
+ "คณานับ"
+ "คณิà¸à¸²"
+ "คณิต"
+ "คณิตศาสตร์"
+ "คด"
+ "คดี"
+ "คติ"
+ "คติธรรม"
+ "คติพจน์"
+ "คทา"
+ "คน"
+ "คนธรรพ์"
+ "คนโท"
+ "คบ"
+ "คม"
+ "คมนาà¸à¸²à¸£"
+ "คมนาคม"
+ "ครà¸"
+ "ครบ"
+ "ครรชิต"
+ "ครรภ"
+ "ครรภ์"
+ "ครรลอง"
+ "ครรโลง"
+ "ครรไล"
+ "ครวà¸"
+ "ครวัà¸"
+ "ครวี"
+ "ครหา"
+ "ครอà¸"
+ "ครอง"
+ "ครองà¹à¸„รง"
+ "ครอบ"
+ "ครอบครัว"
+ "คระ"
+ "ครัดเคร่ง"
+ "ครัน"
+ "ครับ"
+ "ครัว"
+ "ครั่ง"
+ "ครั่น"
+ "ครั้ง"
+ "ครั้น"
+ "ครา"
+ "คราà¸"
+ "คราง"
+ "คราà¸"
+ "คราด"
+ "คราบ"
+ "คราม"
+ "คราว"
+ "คราส"
+ "ครำ"
+ "คริสตà¸à¸²à¸¥"
+ "คริสตัง"
+ "คริสต์"
+ "คริสต์มาส"
+ "คริสเตียน"
+ "ครีบ"
+ "ครีม"
+ "ครึ"
+ "ครึà¸à¸„รื้น"
+ "ครึà¸à¹‚ครม"
+ "ครึน"
+ "ครึม"
+ "ครึ่ง"
+ "ครึ้ม"
+ "ครืด"
+ "ครืน"
+ "ครือ"
+ "ครื้น"
+ "ครื้นครึà¸"
+ "ครุ"
+ "ครุฑ"
+ "ครุมเครือ"
+ "ครุย"
+ "ครุ่น"
+ "ครู"
+ "ครูด"
+ "ครู่"
+ "คร่ง"
+ "คร่อม"
+ "คร่า"
+ "คร่าว"
+ "คร่ำ"
+ "คร้าน"
+ "คร้าม"
+ "คฤห"
+ "คฤหัสถ์"
+ "คฤหาสน์"
+ "คลอ"
+ "คลอà¸"
+ "คลอง"
+ "คลอด"
+ "คลอน"
+ "คลอรีน"
+ "คลอโรฟอร์ม"
+ "คลอโรฟีลล์"
+ "คละ"
+ "คลัà¸"
+ "คลัง"
+ "คลัตช์"
+ "คลับ"
+ "คลั่à¸"
+ "คลั่ง"
+ "คลา"
+ "คลางà¹à¸„ลง"
+ "คลาด"
+ "คลาน"
+ "คลาย"
+ "คลาส"
+ "คลาสสิค"
+ "คลำ"
+ "คลินิà¸"
+ "คลิ้à¸"
+ "คลี"
+ "คลีนิค"
+ "คลี่"
+ "คลึง"
+ "คลื่น"
+ "คลื่นเหียน"
+ "คลื่นไส้"
+ "คลุà¸"
+ "คลุม"
+ "คลุ่ม"
+ "คลุ้ง"
+ "คลุ้ม"
+ "คล่อง"
+ "คล่องà¹à¸„ล่ว"
+ "คล่ำ"
+ "คล้อง"
+ "คล้อย"
+ "คล้าย"
+ "คล้ำ"
+ "ควง"
+ "ควบ"
+ "ควร"
+ "ควัà¸"
+ "ควัน"
+ "ควั่น"
+ "ควาà¸"
+ "ควาà¸"
+ "ควาน"
+ "ความ"
+ "ควาย"
+ "ควินิน"
+ "ควีน"
+ "คว่ำ"
+ "คว้า"
+ "คว้าง"
+ "คว้าน"
+ "คหà¸à¸£à¸£à¸¡"
+ "คหà¸à¸£à¸£à¸¡à¸¨à¸²à¸ªà¸•ร์"
+ "คหบดี"
+ "คหปตานี"
+ "คอ"
+ "คอà¸"
+ "คอด"
+ "คอน"
+ "คอนà¸à¸£à¸µà¸•"
+ "คอนฟิà¸"
+ "คอนเดนเซอร์"
+ "คอนเสิร์ต"
+ "คอนเสิร์ท"
+ "คอนà¹à¸§à¸™à¸•์"
+ "คอม"
+ "คอมพิวเตอร์"
+ "คอมมานโด"
+ "คอมมิวนิสต์"
+ "คอมà¹à¸žà¸„"
+ "คอมโพเนนท์"
+ "คอย"
+ "คอยล์"
+ "คอรัปชั่น"
+ "คอร์ซิà¸à¸²"
+ "คอร์ด"
+ "คอร์ปอเรชั่น"
+ "คอลัมน์"
+ "คอสตาริà¸à¸²"
+ "คอเคซอยด์"
+ "คอเลสเตอรอล"
+ "คะ"
+ "คะนอง"
+ "คะนึง"
+ "คะน้า"
+ "คะมำ"
+ "คะยั้นคะยอ"
+ "คะเน"
+ "คะเยอ"
+ "คะà¹à¸™à¸™"
+ "คัà¸"
+ "คัคนัมพร"
+ "คัคนางค์"
+ "คัคนานต์"
+ "คัณฑสูตร"
+ "คัด"
+ "คัทลียา"
+ "คัน"
+ "คันฉาย"
+ "คันทรง"
+ "คับ"
+ "คัมภีรภาพ"
+ "คัมภีร์"
+ "คั่à¸"
+ "คั่ง"
+ "คั่น"
+ "คั่ว"
+ "คั้น"
+ "คา"
+ "คาง"
+ "คางคà¸"
+ "คาด"
+ "คาถา"
+ "คาทอลิà¸"
+ "คาน"
+ "คาบ"
+ "คาม"
+ "คามวาสี"
+ "คาย"
+ "คารม"
+ "คารวะ"
+ "คาราวาน"
+ "คาราเต้"
+ "คาราโอเà¸à¸°"
+ "คาร์"
+ "คาร์บอน"
+ "คาร์บอนมอนอà¸à¹„ซด์"
+ "คาร์บอนไดออà¸à¹„ซด์"
+ "คาร์บอลิà¸"
+ "คาร์บอเนต"
+ "คาร์บูเรเตอร์"
+ "คาร์ล"
+ "คาร์โบไฮเดรต"
+ "คาว"
+ "คาวี"
+ "คาเธย์"
+ "คาเฟ่"
+ "คำ"
+ "คำนวณ"
+ "คำนับ"
+ "คำนึง"
+ "คำรน"
+ "คำรบ"
+ "คำราม"
+ "คำà¹à¸«à¸‡"
+ "คำใต้"
+ "คิà¸"
+ "คิง"
+ "คิด"
+ "คิมหันต์"
+ "คิว"
+ "คิ้ว"
+ "คีต"
+ "คีนยา"
+ "คีบ"
+ "คีม"
+ "คีย์"
+ "คีย์บอร์ด"
+ "คีรี"
+ "คี่"
+ "คึà¸"
+ "คึà¸à¸„ัà¸"
+ "คึ่à¸"
+ "คืน"
+ "คืบ"
+ "คือ"
+ "คุ"
+ "คุà¸"
+ "คุà¸à¸à¸µà¹‰"
+ "คุณ"
+ "คุณธรรม"
+ "คุณภาพ"
+ "คุณวุฒิ"
+ "คุณศัพท์"
+ "คุณสมบัติ"
+ "คุณาà¸à¸£"
+ "คุณูปà¸à¸²à¸£"
+ "คุด"
+ "คุดทะราด"
+ "คุม"
+ "คุย"
+ "คุรุ"
+ "คุโณปà¸à¸²à¸£"
+ "คุ่ม"
+ "คุ้ง"
+ "คุ้น"
+ "คุ้ม"
+ "คุ้ย"
+ "คู"
+ "คูณ"
+ "คูน"
+ "คูปอง"
+ "คูหา"
+ "คู่"
+ "คู้"
+ "คเนจร"
+ "ค็อà¸à¹€à¸—ล"
+ "ค่อน"
+ "ค่อม"
+ "ค่อย"
+ "ค่ะ"
+ "ค่า"
+ "ค่าง"
+ "ค่าย"
+ "ค่ำ"
+ "ค้น"
+ "ค้อน"
+ "ค้อม"
+ "ค้า"
+ "ค้าง"
+ "ค้างคาว"
+ "ค้างเติ่ง"
+ "ค้าน"
+ "ค้ำ"
+ "ฆราวาส"
+ "ฆาต"
+ "ฆาตà¸à¸£"
+ "ฆาตà¸à¸£à¸£à¸¡"
+ "ฆ่า"
+ "ฆ้อง"
+ "งà¸"
+ "งง"
+ "งงงวย"
+ "งด"
+ "งบ"
+ "งม"
+ "งวง"
+ "งวด"
+ "งวยงง"
+ "งอ"
+ "งอà¸"
+ "งอà¸à¹à¸‡à¸"
+ "งอด"
+ "งอดà¹à¸‡à¸”"
+ "งอน"
+ "งอนหง่อ"
+ "งอบ"
+ "งอม"
+ "งอย"
+ "งอà¹à¸‡"
+ "งะ"
+ "งัà¸"
+ "งัด"
+ "งัน"
+ "งับ"
+ "งัว"
+ "งัวเงีย"
+ "งั่à¸"
+ "งั่ง"
+ "งั่ว"
+ "งา"
+ "งาน"
+ "งาบ"
+ "งาม"
+ "งาย"
+ "งำ"
+ "งิ้ว"
+ "งีบ"
+ "งึà¸"
+ "งึม"
+ "งึมงำ"
+ "งุด"
+ "งุนงง"
+ "งุบ"
+ "งุบงิบ"
+ "งุย"
+ "งุ่นง่าน"
+ "งุ่มง่าม"
+ "งุ้ม"
+ "งู"
+ "งูสวัด"
+ "ง่วง"
+ "ง่วน"
+ "ง่อง"
+ "ง่อน"
+ "ง่อย"
+ "ง่า"
+ "ง่าน"
+ "ง่าม"
+ "ง่าย"
+ "ง่ำ"
+ "ง้วน"
+ "ง้อ"
+ "ง้อม"
+ "ง้าง"
+ "ง้าว"
+ "ง้ำ"
+ "จà¸"
+ "จง"
+ "จงà¸à¸¥à¸™à¸µ"
+ "จงอาง"
+ "จด"
+ "จตุ"
+ "จตุรงค์"
+ "จตุรพิธ"
+ "จตุสดมภ์"
+ "จน"
+ "จบ"
+ "จม"
+ "จมูà¸"
+ "จร"
+ "จรจัด"
+ "จรด"
+ "จรรยา"
+ "จรรโลง"
+ "จรลี"
+ "จรวด"
+ "จระเข้"
+ "จรัล"
+ "จรัส"
+ "จราจร"
+ "จริง"
+ "จริต"
+ "จริยธรรม"
+ "จริยศาสตร์"
+ "จริยศึà¸à¸©à¸²"
+ "จริยา"
+ "จรุง"
+ "จรูà¸"
+ "จล"
+ "จลนพลศาสตร์"
+ "จลนศาสตร์"
+ "จลาจล"
+ "จวà¸"
+ "จวง"
+ "จวน"
+ "จวบ"
+ "จวัà¸"
+ "จอ"
+ "จอà¸"
+ "จอง"
+ "จองหอง"
+ "จอด"
+ "จอน"
+ "จอบ"
+ "จอม"
+ "จอร์à¹à¸”น"
+ "จอà¹à¸ˆ"
+ "จะ"
+ "จะà¸à¸¥à¸°"
+ "จะà¸à¸¥à¸²à¸¡"
+ "จะละหวั่น"
+ "จะละเม็ด"
+ "จะเข้"
+ "จัà¸"
+ "จัà¸à¸‚ุ"
+ "จัà¸à¸ˆà¸±à¹ˆà¸™"
+ "จัà¸à¸£"
+ "จัà¸à¸£à¸žà¸£à¸£à¸”ิ"
+ "จัà¸à¸£à¸ à¸ž"
+ "จัà¸à¸£à¸¢à¸²à¸™"
+ "จัà¸à¸£à¸§à¸£à¸£à¸”ิ"
+ "จัà¸à¸£à¸§à¸²à¸¥"
+ "จัà¸à¸£à¸µ"
+ "จัà¸à¸©à¸¸"
+ "จัà¸à¹à¸«à¸¥à¹ˆà¸™"
+ "จัง"
+ "จังà¸à¸­à¸š"
+ "จังà¸à¹‰à¸²"
+ "จังงัง"
+ "จังหวะ"
+ "จังหวัด"
+ "จังหัน"
+ "จังไร"
+ "จัà¸à¹„ร"
+ "จัณฑาล"
+ "จัณฑ์"
+ "จัด"
+ "จัดà¸à¸²à¸£"
+ "จัตวา"
+ "จัตุรัส"
+ "จัน"
+ "จันทน์"
+ "จันทบุรี"
+ "จันทร"
+ "จันทรคติ"
+ "จันทรคราส"
+ "จันทรุปราคา"
+ "จันทร์"
+ "จับ"
+ "จับà¸à¸±à¸‡"
+ "จับฉ่าย"
+ "จั่น"
+ "จั่ว"
+ "จั้à¸"
+ "จั๊à¸à¸ˆà¸µà¹‰"
+ "จั๊à¸à¹€à¸”ียม"
+ "จั๊วะ"
+ "จาà¸"
+ "จาง"
+ "จาด"
+ "จาตุรงคสันนิบาต"
+ "จาน"
+ "จาบ"
+ "จาบัล"
+ "จาบัลย์"
+ "จาม"
+ "จามจุรี"
+ "จามร"
+ "จามรี"
+ "จาร"
+ "จาระบี"
+ "จาระไน"
+ "จาริà¸"
+ "จารี"
+ "จารีต"
+ "จารึà¸"
+ "จาว"
+ "จาวา"
+ "จาเมà¸à¸²"
+ "จำ"
+ "จำà¸à¸±à¸”"
+ "จำนง"
+ "จำนน"
+ "จำนรรจา"
+ "จำนรรจ์"
+ "จำนวน"
+ "จำนอง"
+ "จำนำ"
+ "จำปา"
+ "จำปี"
+ "จำพวà¸"
+ "จำรัส"
+ "จำรูà¸"
+ "จำลอง"
+ "จำหน่าย"
+ "จำอวด"
+ "จำเพาะ"
+ "จำเริà¸"
+ "จำเรียง"
+ "จำเลย"
+ "จำà¹à¸™à¸"
+ "จิà¸"
+ "จิงโจ้"
+ "จิต"
+ "จิตร"
+ "จิตรà¸à¸£"
+ "จิตรà¸à¸£à¸£à¸¡"
+ "จิตรลดา"
+ "จิตวิทยา"
+ "จิตเวช"
+ "จิตà¹à¸žà¸—ย์"
+ "จินดา"
+ "จินตà¸à¸§à¸µ"
+ "จินตนา"
+ "จินตนาà¸à¸²à¸£"
+ "จินตภาพ"
+ "จิบ"
+ "จิปาถะ"
+ "จิ่ม"
+ "จิ้งจà¸"
+ "จิ้งจอà¸"
+ "จิ้งหรีด"
+ "จิ้งเหลน"
+ "จิ้ม"
+ "จิ๋ว"
+ "จีน"
+ "จีนà¹à¸ª"
+ "จีบ"
+ "จีวร"
+ "จี่"
+ "จี้"
+ "จี๊"
+ "จี๊ด"
+ "จี๋"
+ "จึง"
+ "จึ่ง"
+ "จึ้ง"
+ "จืด"
+ "จุ"
+ "จุà¸"
+ "จุด"
+ "จุติ"
+ "จุน"
+ "จุบ"
+ "จุบจิบ"
+ "จุมพà¸"
+ "จุมพิต"
+ "จุลจอม"
+ "จุลชีพ"
+ "จุลชีวัน"
+ "จุลชีวิน"
+ "จุลทรรศน์"
+ "จุลภาค"
+ "จุลวรรค"
+ "จุลศัà¸à¸£à¸²à¸Š"
+ "จุลสาร"
+ "จุลินทรีย์"
+ "จุฬา"
+ "จุฬาลงà¸à¸£à¸“์"
+ "จุ่ง"
+ "จุ่น"
+ "จุ่ม"
+ "จุ้น"
+ "จุ้นจู๊"
+ "จุ้ม"
+ "จุ้ย"
+ "จุ๊à¸à¸à¸£à¸¹à¹Š"
+ "จุ๊บ"
+ "จุ๊บà¹à¸ˆà¸‡"
+ "จุ๋งจิ๋ง"
+ "จุ๋มจิ๋ม"
+ "จู"
+ "จูง"
+ "จูบ"
+ "จู่"
+ "จู้"
+ "จู๊ด"
+ "จู๋"
+ "จเร"
+ "จ่อ"
+ "จ่อม"
+ "จ่า"
+ "จ่าง"
+ "จ่าย"
+ "จ้น"
+ "จ้วง"
+ "จ้อ"
+ "จ้อà¸"
+ "จ้อà¸à¹à¸ˆà¹‰à¸"
+ "จ้อง"
+ "จ้อน"
+ "จ้อย"
+ "จ้ะ"
+ "จ้า"
+ "จ้าง"
+ "จ้าน"
+ "จ้าละหวั่น"
+ "จ้าว"
+ "จ้ำ"
+ "จ้ำจี้"
+ "จ้ำม่ำ"
+ "จ๊อà¸"
+ "จ๊ะ"
+ "จ๋อ"
+ "จ๋อง"
+ "จ๋อย"
+ "จ๋ะ"
+ "จ๋า"
+ "ฉà¸"
+ "ฉà¸à¸£à¸£à¸ˆà¹Œ"
+ "ฉà¸à¸©à¸±à¸•ริย์"
+ "ฉà¸à¸²à¸ˆ"
+ "ฉà¸à¸²à¸¡à¸²à¸žà¸ˆà¸£"
+ "ฉงน"
+ "ฉงาย"
+ "ฉนวน"
+ "ฉนัง"
+ "ฉนาà¸"
+ "ฉนำ"
+ "ฉบัง"
+ "ฉบับ"
+ "ฉม"
+ "ฉมวà¸"
+ "ฉมัง"
+ "ฉมา"
+ "ฉมำ"
+ "ฉล"
+ "ฉลวย"
+ "ฉลอง"
+ "ฉลอม"
+ "ฉลัà¸"
+ "ฉลาà¸"
+ "ฉลาด"
+ "ฉลาม"
+ "ฉลาย"
+ "ฉลิว"
+ "ฉลุ"
+ "ฉลุà¸à¸‰à¸¥à¸§à¸¢"
+ "ฉลู"
+ "ฉวย"
+ "ฉวัดเฉวียน"
+ "ฉวาง"
+ "ฉวี"
+ "ฉศà¸"
+ "ฉอà¸"
+ "ฉอด"
+ "ฉอเลาะ"
+ "ฉะ"
+ "ฉะฉาน"
+ "ฉะนั้น"
+ "ฉะนี้"
+ "ฉะอ้อน"
+ "ฉัตร"
+ "ฉัน"
+ "ฉันทลัà¸à¸©à¸“์"
+ "ฉันทะ"
+ "ฉันทา"
+ "ฉันทานุมัติ"
+ "ฉันท์"
+ "ฉับ"
+ "ฉาà¸"
+ "ฉาง"
+ "ฉาด"
+ "ฉาน"
+ "ฉาบ"
+ "ฉาย"
+ "ฉายา"
+ "ฉาว"
+ "ฉำฉา"
+ "ฉิน"
+ "ฉิบ"
+ "ฉิมพลี"
+ "ฉิว"
+ "ฉิ่ง"
+ "ฉีà¸"
+ "ฉีด"
+ "ฉี่"
+ "ฉุ"
+ "ฉุà¸"
+ "ฉุà¸à¹€à¸‰à¸´à¸™"
+ "ฉุด"
+ "ฉุน"
+ "ฉุย"
+ "ฉูด"
+ "ฉู่"
+ "ฉ่อง"
+ "ฉ่อย"
+ "ฉ่า"
+ "ฉ่าง"
+ "ฉ่ำ"
+ "ฉ้อ"
+ "ชà¸"
+ "ชง"
+ "ชงโค"
+ "ชฎา"
+ "ชด"
+ "ชน"
+ "ชนà¸"
+ "ชนนี"
+ "ชนมพรรษา"
+ "ชนม์"
+ "ชนวน"
+ "ชนะ"
+ "ชนัà¸"
+ "ชนิด"
+ "ชบา"
+ "ชม"
+ "ชมดชม้อย"
+ "ชมพู"
+ "ชมพูนท"
+ "ชมพูนุท"
+ "ชมพู่"
+ "ชมรม"
+ "ชมา"
+ "ชม้อย"
+ "ชม้าย"
+ "ชย"
+ "ชร"
+ "ชระ"
+ "ชรัว"
+ "ชรา"
+ "ชล"
+ "ชลธาร"
+ "ชลธี"
+ "ชลนา"
+ "ชลประทาน"
+ "ชลาลัย"
+ "ชลาศัย"
+ "ชว"
+ "ชวด"
+ "ชวน"
+ "ชวร"
+ "ชวลิต"
+ "ชวา"
+ "ชวาล"
+ "ชอà¸"
+ "ชอà¸à¸Šà¹‰à¸³"
+ "ชอง"
+ "ชอน"
+ "ชอบ"
+ "ชอปปิ้ง"
+ "ชอม"
+ "ชอล์à¸"
+ "ชอื้อ"
+ "ชอุ่ม"
+ "ชอ่ำ"
+ "ชะ"
+ "ชะงัà¸"
+ "ชะงัด"
+ "ชะงุ้ม"
+ "ชะง่อน"
+ "ชะง้ำ"
+ "ชะตา"
+ "ชะนี"
+ "ชะมด"
+ "ชะมัด"
+ "ชะรอย"
+ "ชะลอ"
+ "ชะลอม"
+ "ชะลูด"
+ "ชะล่า"
+ "ชะเง้อ"
+ "ชะเนาะ"
+ "ชะà¹à¸‡à¹‰"
+ "ชะà¹à¸¥à¸‡"
+ "ชะโงà¸"
+ "ชะโด"
+ "ชัà¸"
+ "ชัง"
+ "ชัชวาล"
+ "ชัà¸"
+ "ชัด"
+ "ชัน"
+ "ชันนะตุ"
+ "ชันษา"
+ "ชันสูตร"
+ "ชัย"
+ "ชัยพฤà¸à¸©à¹Œ"
+ "ชัยภูมิ"
+ "ชั่ง"
+ "ชั่ว"
+ "ชั่วโมง"
+ "ชั้น"
+ "ชั้ว"
+ "ชา"
+ "ชาà¸"
+ "ชาด"
+ "ชาดà¸"
+ "ชาตรี"
+ "ชาตะ"
+ "ชาติ"
+ "ชาน"
+ "ชานุ"
+ "ชาม"
+ "ชาย"
+ "ชายา"
+ "ชาลา"
+ "ชาว"
+ "ชาวเล"
+ "ชำ"
+ "ชำนัà¸"
+ "ชำนาà¸"
+ "ชำนิ"
+ "ชำระ"
+ "ชำรุด"
+ "ชำร่วย"
+ "ชำเนียน"
+ "ชำเนียร"
+ "ชำเรา"
+ "ชำเลือง"
+ "ชำà¹à¸«à¸¥à¸°"
+ "ชิ"
+ "ชิคาโà¸"
+ "ชิง"
+ "ชิงช้า"
+ "ชิด"
+ "ชิน"
+ "ชิป"
+ "ชิพ"
+ "ชิม"
+ "ชิมà¹à¸›à¸™à¸‹à¸µ"
+ "ชิวหา"
+ "ชิ่ง"
+ "ชิ้น"
+ "ชี"
+ "ชีปะขาว"
+ "ชีพ"
+ "ชีพิตัà¸à¸©à¸±à¸¢"
+ "ชีวประวัติ"
+ "ชีววิทยา"
+ "ชีวาตม์"
+ "ชีวาลัย"
+ "ชีวิต"
+ "ชีวิตัà¸à¸©à¸±à¸¢"
+ "ชีวิน"
+ "ชีวี"
+ "ชีวเคมี"
+ "ชี้"
+ "ชืด"
+ "ชื่น"
+ "ชื่นมื่น"
+ "ชื่อ"
+ "ชื้น"
+ "ชื้อ"
+ "ชุà¸"
+ "ชุด"
+ "ชุน"
+ "ชุบ"
+ "ชุม"
+ "ชุมนุม"
+ "ชุมพร"
+ "ชุลมุน"
+ "ชุลี"
+ "ชุ่ม"
+ "ชุ่ย"
+ "ชุ้ง"
+ "ชู"
+ "ชู้"
+ "ชโย"
+ "ชโลทร"
+ "ชโลม"
+ "ชไม"
+ "ช็อà¸à¹‚à¸à¹€à¸¥à¸•"
+ "ช็อà¸à¹‚à¸à¹à¸¥à¸•"
+ "ช่วง"
+ "ช่วย"
+ "ช่อ"
+ "ช่อง"
+ "ช่อน"
+ "ช่าง"
+ "ช่ำ"
+ "ช่ำชอง"
+ "ช้อง"
+ "ช้อน"
+ "ช้อย"
+ "ช้า"
+ "ช้าง"
+ "ช้ำ"
+ "ซà¸"
+ "ซด"
+ "ซน"
+ "ซบ"
+ "ซม"
+ "ซวดเซ"
+ "ซวน"
+ "ซวย"
+ "ซอ"
+ "ซอà¸"
+ "ซอง"
+ "ซอน"
+ "ซอฟต์à¹à¸§à¸£à¹Œ"
+ "ซอฟท์"
+ "ซอฟท์à¹à¸§à¸£à¹Œ"
+ "ซอมซ่อ"
+ "ซอย"
+ "ซอส"
+ "ซัà¸"
+ "ซัง"
+ "ซัด"
+ "ซัน"
+ "ซันตาคลอส"
+ "ซับ"
+ "ซัพพอร์ต"
+ "ซัลฟา"
+ "ซา"
+ "ซาà¸"
+ "ซาà¸à¸¸à¸£à¸°"
+ "ซาง"
+ "ซาน"
+ "ซาบซึ้ง"
+ "ซาบซ่าน"
+ "ซามูไร"
+ "ซาลาเปา"
+ "ซาว"
+ "ซาวด์"
+ "ซิ"
+ "ซิà¸"
+ "ซิà¸à¸²à¸£à¹Œ"
+ "ซิà¸à¹à¸‹à¹‡à¸"
+ "ซินà¹à¸ª"
+ "ซิบ"
+ "ซิป"
+ "ซิฟิลิส"
+ "ซิลิคอน"
+ "ซิว"
+ "ซิ่น"
+ "ซี"
+ "ซีà¸"
+ "ซีด"
+ "ซีดี"
+ "ซีนอน"
+ "ซีรอà¸à¸‹à¹Œ"
+ "ซีเà¸à¸¡à¸ªà¹Œ"
+ "ซีเมนต์"
+ "ซีเรีย"
+ "ซี่"
+ "ซี้"
+ "ซึง"
+ "ซึม"
+ "ซึ่ง"
+ "ซึ้ง"
+ "ซื่อ"
+ "ซื้อ"
+ "ซุà¸"
+ "ซุง"
+ "ซุน"
+ "ซุบ"
+ "ซุป"
+ "ซุย"
+ "ซุ่ม"
+ "ซุ่มซ่าม"
+ "ซุ้ม"
+ "ซูชิ"
+ "ซูดซาด"
+ "ซูดาน"
+ "ซูบ"
+ "ซูเปอร์มาเà¸à¹‡à¸•"
+ "ซูโครส"
+ "ซู่"
+ "ซ่à¸"
+ "ซ่อง"
+ "ซ่อน"
+ "ซ่อม"
+ "ซ่า"
+ "ซ่าน"
+ "ซ่าหริ่ม"
+ "ซ้น"
+ "ซ้อง"
+ "ซ้อน"
+ "ซ้อม"
+ "ซ้าย"
+ "ซ้ำ"
+ "ฌาน"
+ "ฌาปนà¸à¸´à¸ˆ"
+ "ฌาปนสถาน"
+ "à¸à¸§à¸™"
+ "à¸à¸±à¸•ติ"
+ "à¸à¸²à¸“"
+ "à¸à¸²à¸•ิ"
+ "à¸à¸µà¹ˆà¸›à¸¸à¹ˆà¸™"
+ "à¸à¸²à¸™"
+ "à¸à¸²à¸™à¸°"
+ "à¸à¸²à¸™à¸±à¸™à¸”ร"
+ "à¸à¸²à¸›à¸™à¸²"
+ "ดà¸"
+ "ดง"
+ "ดนตรี"
+ "ดนโด่"
+ "ดม"
+ "ดรรชนี"
+ "ดราฟต์"
+ "ดรุณ"
+ "ดรุณี"
+ "ดล"
+ "ดวง"
+ "ดวด"
+ "ดวล"
+ "ดอà¸"
+ "ดอà¸à¹€à¸šà¸µà¹‰à¸¢"
+ "ดอà¸à¹„ม้"
+ "ดอง"
+ "ดอด"
+ "ดอน"
+ "ดอม"
+ "ดอย"
+ "ดอลลาร์"
+ "ดอส"
+ "ดะ"
+ "ดัà¸"
+ "ดัà¸à¸”าน"
+ "ดัà¸à¹à¸”้"
+ "ดัง"
+ "ดัชนี"
+ "ดัด"
+ "ดัตซ์"
+ "ดัน"
+ "ดับ"
+ "ดับเบิ้ล"
+ "ดัมพ์"
+ "ดัสà¸à¸£"
+ "ดั่ง"
+ "ดั้ง"
+ "ดั้น"
+ "ดา"
+ "ดาà¸"
+ "ดาด"
+ "ดาต้า"
+ "ดาน"
+ "ดาบ"
+ "ดาบส"
+ "ดาม"
+ "ดามพ์"
+ "ดาย"
+ "ดารณี"
+ "ดารดาษ"
+ "ดารา"
+ "ดาร์"
+ "ดาล"
+ "ดาลัด"
+ "ดาว"
+ "ดาวดึงส์"
+ "ดาวน์โหลด"
+ "ดาวโจนส์"
+ "ดาษ"
+ "ดาษดา"
+ "ดำ"
+ "ดำรง"
+ "ดำรัส"
+ "ดำริ"
+ "ดำฤษณา"
+ "ดำเà¸à¸´à¸‡"
+ "ดำเนิน"
+ "ดำà¹à¸„ง"
+ "ดิ"
+ "ดิà¸"
+ "ดิจิตอล"
+ "ดิฉัน"
+ "ดิถี"
+ "ดิน"
+ "ดิบ"
+ "ดิรัจฉาน"
+ "ดิลà¸"
+ "ดิวิชั่น"
+ "ดิสนีย์"
+ "ดิสเà¸à¸•"
+ "ดิ่ง"
+ "ดิ่ว"
+ "ดิ้น"
+ "ดิ้ว"
+ "ดี"
+ "ดีà¸à¸£à¸µ"
+ "ดีด"
+ "ดีดีที"
+ "ดีบุà¸"
+ "ดีวีดี"
+ "ดีเซล"
+ "ดีเปรสชั่น"
+ "ดีไซน์"
+ "ดีไซเนอร์"
+ "ดึà¸"
+ "ดึà¸à¸”ำบรรพ์"
+ "ดึง"
+ "ดึงสะ"
+ "ดึ่ง"
+ "ดึ่ม"
+ "ดือ"
+ "ดื่น"
+ "ดื่ม"
+ "ดื้อ"
+ "ดุ"
+ "ดุà¸"
+ "ดุจ"
+ "ดุด"
+ "ดุน"
+ "ดุบ"
+ "ดุม"
+ "ดุรงค์"
+ "ดุริยางคศาสตร์"
+ "ดุริยางคศิลป์"
+ "ดุริยางค์"
+ "ดุล"
+ "ดุลพินิจ"
+ "ดุลภาค"
+ "ดุลยพินิจ"
+ "ดุลยภาพ"
+ "ดุษฎี"
+ "ดุษณี"
+ "ดุษิต"
+ "ดุสิต"
+ "ดุเหว่า"
+ "ดุ่ม"
+ "ดุ่ย"
+ "ดุ้ง"
+ "ดุ้งดิ้ง"
+ "ดุ้น"
+ "ดู"
+ "ดูà¸à¸£"
+ "ดูด"
+ "ดูรา"
+ "ด่วน"
+ "ด่อน"
+ "ด่อม"
+ "ด่า"
+ "ด่าง"
+ "ด่าน"
+ "ด่าว"
+ "ด่ำ"
+ "ด้ง"
+ "ด้น"
+ "ด้วง"
+ "ด้วน"
+ "ด้วย"
+ "ด้อม"
+ "ด้อย"
+ "ด้าน"
+ "ด้าม"
+ "ด้าย"
+ "ด้าว"
+ "ด้ำ"
+ "ตà¸"
+ "ตà¸à¸¥à¸‡"
+ "ตง"
+ "ตงฉิน"
+ "ตงิด"
+ "ตด"
+ "ตถาคต"
+ "ตน"
+ "ตบ"
+ "ตบะ"
+ "ตม"
+ "ตรง"
+ "ตรม"
+ "ตรมตรอม"
+ "ตรรà¸à¸§à¸´à¸—ยา"
+ "ตรรà¸à¸¨à¸²à¸ªà¸•ร์"
+ "ตรรà¸à¸°"
+ "ตรวจ"
+ "ตรวน"
+ "ตรอà¸"
+ "ตรอง"
+ "ตรอมตรม"
+ "ตรอมใจ"
+ "ตระ"
+ "ตระà¸à¸¹à¸¥"
+ "ตระหง่าน"
+ "ตระหนà¸"
+ "ตระหนัà¸"
+ "ตระหนี่"
+ "ตระเวน"
+ "ตรัง"
+ "ตรับ"
+ "ตรัย"
+ "ตรัส"
+ "ตรา"
+ "ตราà¸à¸•รำ"
+ "ตราบ"
+ "ตราสัง"
+ "ตรำ"
+ "ตริ"
+ "ตรี"
+ "ตรียัมปวาย"
+ "ตรีโà¸à¸“"
+ "ตรึà¸"
+ "ตรึง"
+ "ตรุ"
+ "ตรุษ"
+ "ตรู"
+ "ตรู่"
+ "ตฤณ"
+ "ตลà¸"
+ "ตลบ"
+ "ตลอด"
+ "ตลับ"
+ "ตลาด"
+ "ตลิ่ง"
+ "ตวง"
+ "ตวัด"
+ "ตวาด"
+ "ตอ"
+ "ตอà¸"
+ "ตอง"
+ "ตอด"
+ "ตอน"
+ "ตอบ"
+ "ตอม"
+ "ตอร์"
+ "ตอร์ปิโด"
+ "ตอà¹à¸¢"
+ "ตอà¹à¸«à¸¥"
+ "ตะ"
+ "ตะà¸à¸£à¸±à¸™"
+ "ตะà¸à¸£à¸¸à¸”"
+ "ตะà¸à¸£à¸¸à¸¡"
+ "ตะà¸à¸£à¹‰à¸­"
+ "ตะà¸à¸£à¹‰à¸²"
+ "ตะà¸à¸¥à¸°"
+ "ตะà¸à¸¥à¸²à¸¡"
+ "ตะà¸à¸­à¸™"
+ "ตะà¸à¸±à¸‡"
+ "ตะà¸à¸±à¹ˆà¸§"
+ "ตะà¸à¸¸à¸à¸•ะà¸à¸±à¸"
+ "ตะขอ"
+ "ตะขาบ"
+ "ตะขิดตะขวง"
+ "ตะคริว"
+ "ตะครุบ"
+ "ตะคอà¸"
+ "ตะนอย"
+ "ตะบอง"
+ "ตะบอย"
+ "ตะบัน"
+ "ตะปุ่มตะป่ำ"
+ "ตะพาบ"
+ "ตะพึด"
+ "ตะพึดตะพือ"
+ "ตะพุ่น"
+ "ตะลีตะลาน"
+ "ตะลึง"
+ "ตะลุง"
+ "ตะลุมบอน"
+ "ตะลุมพุà¸"
+ "ตะล่อม"
+ "ตะวัน"
+ "ตะหลิว"
+ "ตะเà¸à¸µà¸¢à¸à¸•ะà¸à¸²à¸¢"
+ "ตะเà¸à¸µà¸¢à¸‡"
+ "ตะเà¸à¸µà¸¢à¸š"
+ "ตะเข็บ"
+ "ตะเคียน"
+ "ตะเฆ่"
+ "ตะเบ็ง"
+ "ตะเพิด"
+ "ตะเพิ่น"
+ "ตะเพียน"
+ "ตะเภา"
+ "ตะเลง"
+ "ตะà¹à¸à¸£à¸‡"
+ "ตะà¹à¸„ง"
+ "ตะà¹à¸šà¸‡"
+ "ตะโà¸"
+ "ตะโà¸à¸"
+ "ตะโà¸à¸™"
+ "ตะโà¸à¹‰"
+ "ตะโขง"
+ "ตะโบม"
+ "ตะโพà¸"
+ "ตะโหงà¸"
+ "ตะไà¸à¸£"
+ "ตะไคร่"
+ "ตะไคร้"
+ "ตะไบ"
+ "ตะไล"
+ "ตัà¸"
+ "ตัà¸à¸©à¸±à¸¢"
+ "ตัง"
+ "ตังฉ่าย"
+ "ตังเà¸"
+ "ตังเม"
+ "ตังโอ๋"
+ "ตัณหา"
+ "ตัด"
+ "ตัดสิน"
+ "ตัน"
+ "ตันหยง"
+ "ตับ"
+ "ตัว"
+ "ตั่ง"
+ "ตั้ง"
+ "ตั้งà¹à¸•่"
+ "ตั้วโผ"
+ "ตั๊à¸à¹à¸•น"
+ "ตั๋ว"
+ "ตา"
+ "ตาà¸"
+ "ตาด"
+ "ตาน"
+ "ตานี"
+ "ตาบ"
+ "ตาม"
+ "ตาย"
+ "ตาล"
+ "ตาลปัตร"
+ "ตำ"
+ "ตำนาน"
+ "ตำบล"
+ "ตำรวจ"
+ "ตำรับ"
+ "ตำรา"
+ "ตำลึง"
+ "ตำหนัà¸"
+ "ตำหนิ"
+ "ตำà¹à¸¢"
+ "ตำà¹à¸«à¸™à¹ˆà¸‡"
+ "ติ"
+ "ติà¸à¸²à¸«à¸£à¸±à¸‡"
+ "ติง"
+ "ติณ"
+ "ติด"
+ "ติรัจฉาน"
+ "ติลà¸"
+ "ติ่ง"
+ "ติ้ว"
+ "ติ๊à¸"
+ "ติ๋ง"
+ "ตี"
+ "ตีน"
+ "ตีบ"
+ "ตี่"
+ "ตี๋"
+ "ตึ"
+ "ตึà¸"
+ "ตึง"
+ "ตึดตื๋อ"
+ "ตึ้à¸"
+ "ตึ้à¸à¸•ั้à¸"
+ "ตึ๊ดตื๋อ"
+ "ตืด"
+ "ตือฮวน"
+ "ตื่น"
+ "ตื้น"
+ "ตื้อ"
+ "ตื๊อ"
+ "ตื๋อ"
+ "ตุ"
+ "ตุà¸à¸•ิà¸"
+ "ตุง"
+ "ตุน"
+ "ตุนาหงัน"
+ "ตุบ"
+ "ตุรà¸à¸µ"
+ "ตุลา"
+ "ตุลาà¸à¸²à¸£"
+ "ตุลาคม"
+ "ตุหรัดตุเหร่"
+ "ตุ่น"
+ "ตุ่ม"
+ "ตุ่ย"
+ "ตุ้งà¸à¹ˆà¸²"
+ "ตุ้งติ้ง"
+ "ตุ้บ"
+ "ตุ้ม"
+ "ตุ้ย"
+ "ตุ๊"
+ "ตุ๊à¸"
+ "ตุ๊à¸à¸•า"
+ "ตุ๊à¸à¹à¸"
+ "ตุ๊ด"
+ "ตุ๊ต๊ะ"
+ "ตุ๊บป่อง"
+ "ตุ๊ย"
+ "ตุ๋น"
+ "ตุ๋ม"
+ "ตุ๋ยตุ่ย"
+ "ตู"
+ "ตูà¸"
+ "ตูด"
+ "ตูบ"
+ "ตูม"
+ "ตู่"
+ "ตู้"
+ "ต่วน"
+ "ต่อ"
+ "ต่องà¹à¸•่ง"
+ "ต่อม"
+ "ต่อย"
+ "ต่าง"
+ "ต่ำ"
+ "ต้น"
+ "ต้ม"
+ "ต้วมเตี้ยม"
+ "ต้อ"
+ "ต้อง"
+ "ต้องเต"
+ "ต้อน"
+ "ต้อย"
+ "ต้อยติ่ง"
+ "ต้อยตีวิด"
+ "ต้าน"
+ "ต๊อà¸"
+ "ต๊อà¸à¸•๋อย"
+ "ต๋ง"
+ "ต๋อม"
+ "ถà¸"
+ "ถด"
+ "ถนน"
+ "ถนอม"
+ "ถนัด"
+ "ถนัดถนี่"
+ "ถนิม"
+ "ถม"
+ "ถมึงทึง"
+ "ถลà¸"
+ "ถลน"
+ "ถลอà¸"
+ "ถลัน"
+ "ถลา"
+ "ถลาà¸"
+ "ถลำ"
+ "ถลีถลำ"
+ "ถลึงตา"
+ "ถลุง"
+ "ถลุน"
+ "ถล่ม"
+ "ถวัลย์"
+ "ถวาย"
+ "ถวิล"
+ "ถอà¸"
+ "ถอง"
+ "ถอด"
+ "ถอน"
+ "ถอย"
+ "ถะ"
+ "ถัà¸"
+ "ถัง"
+ "ถัด"
+ "ถัน"
+ "ถัว"
+ "ถั่ว"
+ "ถา"
+ "ถาà¸"
+ "ถาง"
+ "ถาด"
+ "ถาน"
+ "ถาม"
+ "ถาวร"
+ "ถิ่น"
+ "ถีบ"
+ "ถี่"
+ "ถึà¸"
+ "ถึง"
+ "ถือ"
+ "ถุง"
+ "ถุน"
+ "ถุย"
+ "ถู"
+ "ถูà¸"
+ "ถ่ม"
+ "ถ่วง"
+ "ถ่อ"
+ "ถ่อง"
+ "ถ่อม"
+ "ถ่อย"
+ "ถ่าง"
+ "ถ่าน"
+ "ถ่าย"
+ "ถ้วน"
+ "ถ้วย"
+ "ถ้อย"
+ "ถ้า"
+ "ถ้ำ"
+ "ทà¸"
+ "ทà¸à¸¥à¹‰à¸²"
+ "ทด"
+ "ทน"
+ "ทนต์"
+ "ทนาย"
+ "ทนโท่"
+ "ทบ"
+ "ทบทวน"
+ "ทบวง"
+ "ทมิฬ"
+ "ทยอย"
+ "ทรà¸à¸£à¸£à¸¡"
+ "ทรง"
+ "ทรชน"
+ "ทรชาติ"
+ "ทรพิษ"
+ "ทรพี"
+ "ทรมาน"
+ "ทรยศ"
+ "ทรยุค"
+ "ทรรป"
+ "ทรรศนะ"
+ "ทรราช"
+ "ทรลัà¸à¸©à¸“์"
+ "ทรวง"
+ "ทรวดทรง"
+ "ทรหด"
+ "ทรัพยาà¸à¸£"
+ "ทรัพย์"
+ "ทรัพย์สิน"
+ "ทรัมเป็ต"
+ "ทรานซิสเตอร์"
+ "ทราบ"
+ "ทราม"
+ "ทราย"
+ "ทรุด"
+ "ทฤษฎี"
+ "ทลาย"
+ "ทวง"
+ "ทวด"
+ "ทวน"
+ "ทวย"
+ "ทวาทศ"
+ "ทวาย"
+ "ทวาร"
+ "ทวิ"
+ "ทวี"
+ "ทวีธาภิเษà¸"
+ "ทวีป"
+ "ทว่า"
+ "ทศ"
+ "ทศนิยม"
+ "ทหาร"
+ "ทอ"
+ "ทอà¸"
+ "ทอง"
+ "ทองà¸à¸§à¸²à¸§"
+ "ทองหลาง"
+ "ทอด"
+ "ทอน"
+ "ทอนซิล"
+ "ทอฟฟี่"
+ "ทอย"
+ "ทอล์ค"
+ "ทะนง"
+ "ทะนาน"
+ "ทะนุ"
+ "ทะมัดทะà¹à¸¡à¸‡"
+ "ทะมึน"
+ "ทะมื่น"
+ "ทะยาน"
+ "ทะลวง"
+ "ทะลัà¸"
+ "ทะลาย"
+ "ทะลึ่ง"
+ "ทะลุ"
+ "ทะวาย"
+ "ทะเบียน"
+ "ทะเยอทะยาน"
+ "ทะเล"
+ "ทะเลาะ"
+ "ทะเล่อทะล่า"
+ "ทะเล้น"
+ "ทะà¹à¸¡à¹ˆà¸‡"
+ "ทัà¸"
+ "ทัà¸à¸‚ิà¸"
+ "ทัà¸à¸‚ิณา"
+ "ทัà¸à¸‚ิณาวัà¸"
+ "ทัà¸à¸‚์"
+ "ทัà¸à¸©à¸°"
+ "ทัà¸à¸©à¸´à¸“"
+ "ทัà¸à¸©à¸´à¸“า"
+ "ทัà¸à¸©à¸´à¸“าวรรต"
+ "ทัà¸à¸©à¸´à¹‚ณทà¸"
+ "ทังสเตน"
+ "ทัณฑà¸à¸£à¸£à¸¡"
+ "ทัณฑฆาต"
+ "ทัณฑสถาน"
+ "ทัณฑ์"
+ "ทัด"
+ "ทัน"
+ "ทันตà¹à¸žà¸—ย์"
+ "ทันต์"
+ "ทันที"
+ "ทับ"
+ "ทับสมิงคลา"
+ "ทัพ"
+ "ทัพพี"
+ "ทัศนคติ"
+ "ทัศนวิสัย"
+ "ทัศนศึà¸à¸©à¸²"
+ "ทัศนะ"
+ "ทัศนา"
+ "ทัศนาจร"
+ "ทัศนียภาพ"
+ "ทัศนีย์"
+ "ทัศนูปà¸à¸£à¸“์"
+ "ทัศน์"
+ "ทัศไนย"
+ "ทั่ง"
+ "ทั่ว"
+ "ทั้ง"
+ "ทา"
+ "ทาà¸"
+ "ทาง"
+ "ทาน"
+ "ทาบ"
+ "ทาม"
+ "ทาย"
+ "ทายาด"
+ "ทายาท"
+ "ทารà¸"
+ "ทาริà¸à¸²"
+ "ทารุณ"
+ "ทาร์ซาน"
+ "ทาส"
+ "ทำ"
+ "ทำนบ"
+ "ทำนอง"
+ "ทำนาย"
+ "ทำนุ"
+ "ทำลาย"
+ "ทำเนา"
+ "ทำเนียบ"
+ "ทำเล"
+ "ทำไม"
+ "ทิคัมพร"
+ "ทิฆัมพร"
+ "ทิงเจอร์"
+ "ทิà¸à¸´"
+ "ทิด"
+ "ทิพยจัà¸à¸©à¸¸"
+ "ทิพยà¸à¸²à¸“"
+ "ทิพยรส"
+ "ทิพยเนตร"
+ "ทิพย์"
+ "ทิพาà¸à¸£"
+ "ทิม"
+ "ทิว"
+ "ทิวงคต"
+ "ทิวทัศน์"
+ "ทิวา"
+ "ทิศ"
+ "ทิศา"
+ "ทิศานุทิศ"
+ "ทิเบต"
+ "ทิ่ม"
+ "ทิ้ง"
+ "ที"
+ "ทีฆชาติ"
+ "ทีม"
+ "ทีเอนที"
+ "ที่"
+ "ที่ดิน"
+ "ทึà¸"
+ "ทึนทึà¸"
+ "ทึบ"
+ "ทึม"
+ "ทึ่ง"
+ "ทึ่ม"
+ "ทึ้ง"
+ "ทื่อ"
+ "ทุ"
+ "ทุà¸"
+ "ทุà¸à¸‚ลาภ"
+ "ทุà¸à¸‚ารมณ์"
+ "ทุà¸à¸‚เวทนา"
+ "ทุà¸à¸‚์"
+ "ทุà¸à¸£à¸à¸´à¸£à¸´à¸¢à¸²"
+ "ทุคติ"
+ "ทุจริต"
+ "ทุด"
+ "ทุน"
+ "ทุบ"
+ "ทุพพล"
+ "ทุพภิà¸à¸‚ภัย"
+ "ทุย"
+ "ทุรà¸à¸±à¸™à¸”าร"
+ "ทุรชน"
+ "ทุรชาติ"
+ "ทุรนทุราย"
+ "ทุรพล"
+ "ทุลัà¸à¸—ุเล"
+ "ทุศีล"
+ "ทุเรศ"
+ "ทุเรียน"
+ "ทุเลา"
+ "ทุ่ง"
+ "ทุ่น"
+ "ทุ่ม"
+ "ทุ้ง"
+ "ทุ้ม"
+ "ทุ้ย"
+ "ทู"
+ "ทูต"
+ "ทูตานุทูต"
+ "ทูน"
+ "ทูบ"
+ "ทูม"
+ "ทูล"
+ "ทู่"
+ "ทู้"
+ "ทà¹à¸à¸¥à¹‰à¸§"
+ "ทà¹à¸¢à¸‡"
+ "ทโมน"
+ "ท่วงทำนอง"
+ "ท่วงที"
+ "ท่วงท่า"
+ "ท่วม"
+ "ท่อ"
+ "ท่อง"
+ "ท่อน"
+ "ท่อม"
+ "ท่า"
+ "ท่าน"
+ "ท่ามà¸à¸¥à¸²à¸‡"
+ "ท้น"
+ "ท้วง"
+ "ท้วน"
+ "ท้วม"
+ "ท้อ"
+ "ท้อง"
+ "ท้า"
+ "ท้าย"
+ "ท้าว"
+ "ธง"
+ "ธน"
+ "ธนบัตร"
+ "ธนบุรี"
+ "ธนสมบัติ"
+ "ธนสาร"
+ "ธนาคาร"
+ "ธนาณัติ"
+ "ธนารัà¸à¸©à¹Œ"
+ "ธนู"
+ "ธม"
+ "ธร"
+ "ธรณี"
+ "ธรรม"
+ "ธรรมà¸à¸²à¸¢"
+ "ธรรมชาติ"
+ "ธรรมดา"
+ "ธรรมศาสตร์"
+ "ธรรมะ"
+ "ธรรมะธัมโม"
+ "ธรรมาทิตย์"
+ "ธรรมาธรรม"
+ "ธรรมาธิปไตย"
+ "ธรรมาธิษà¸à¸²à¸™"
+ "ธรรมานุสาน"
+ "ธรรมาภิมุข"
+ "ธรรมาภิสมัย"
+ "ธรรมายตนะ"
+ "ธรรมารมณ์"
+ "ธรรมาสน์"
+ "ธรรมิà¸"
+ "ธราธร"
+ "ธราธาร"
+ "ธราธิบดี"
+ "ธราธิป"
+ "ธัà¸"
+ "ธัà¸à¸à¸²à¸«à¸²à¸£"
+ "ธัà¸à¸žà¸·à¸Š"
+ "ธันวาคม"
+ "ธัมมะ"
+ "ธาตุ"
+ "ธานี"
+ "ธาร"
+ "ธารา"
+ "ธำมรงค์"
+ "ธำรง"
+ "ธิดา"
+ "ธิเบต"
+ "ธุดงค์"
+ "ธุรà¸à¸£à¸£à¸¡"
+ "ธุรà¸à¸²à¸£"
+ "ธุรà¸à¸´à¸ˆ"
+ "ธุระ"
+ "ธุลี"
+ "ธุวดารา"
+ "ธุวภาค"
+ "ธุวมณฑล"
+ "ธูป"
+ "นà¸"
+ "นคร"
+ "นครราชสีมา"
+ "นครินทร์"
+ "นคเรศ"
+ "นงคราà¸"
+ "นงนุช"
+ "นงพะงา"
+ "นงพาล"
+ "นงราม"
+ "นงลัà¸à¸©à¸“์"
+ "นงเยาว์"
+ "นที"
+ "นนทบุรี"
+ "นนทรี"
+ "นนทลี"
+ "นบ"
+ "นพ"
+ "นพปฎล"
+ "นพศà¸"
+ "นพศูล"
+ "นภา"
+ "นภาลัย"
+ "นม"
+ "นมัสà¸à¸²à¸£"
+ "นรà¸"
+ "นรสิงห์"
+ "นรีเวช"
+ "นรีà¹à¸žà¸—ย์"
+ "นฤคหิต"
+ "นฤนาท"
+ "นฤมล"
+ "นฤมิต"
+ "นลาà¸"
+ "นลินี"
+ "นวด"
+ "นวนิยาย"
+ "นวม"
+ "นวย"
+ "นวล"
+ "นวลลออ"
+ "นวลละออง"
+ "นอ"
+ "นอà¸"
+ "นอง"
+ "นอต"
+ "นอน"
+ "นอบ"
+ "นอย"
+ "นอร์เวย์"
+ "นะ"
+ "นัà¸"
+ "นัà¸à¸‚ัต"
+ "นัà¸à¸¨à¸¶à¸à¸©à¸²"
+ "นัà¸à¸©à¸±à¸•ร"
+ "นัà¸à¹€à¸£à¸µà¸¢à¸™"
+ "นังคัล"
+ "นัด"
+ "นัดดา"
+ "นัตถุ์"
+ "นันทนาà¸à¸²à¸£"
+ "นับ"
+ "นัย"
+ "นัยน์"
+ "นัว"
+ "นั่ง"
+ "นั่น"
+ "นั้น"
+ "นา"
+ "นาà¸"
+ "นาค"
+ "นาคร"
+ "นาคราช"
+ "นาคี"
+ "นาง"
+ "นางสาว"
+ "นางà¹à¸­à¹ˆà¸™"
+ "นาซา"
+ "นาà¸"
+ "นาด"
+ "นาถ"
+ "นาท"
+ "นาที"
+ "นาน"
+ "นานัปà¸à¸²à¸£"
+ "นานา"
+ "นาบ"
+ "นาภี"
+ "นาม"
+ "นามà¸à¸£"
+ "นามสà¸à¸¸à¸¥"
+ "นามานุà¸à¸£à¸¡"
+ "นามาภิไธย"
+ "นาย"
+ "นายà¸"
+ "นารายณ์"
+ "นารี"
+ "นาวา"
+ "นาวิà¸"
+ "นาวิน"
+ "นาวี"
+ "นาสิà¸"
+ "นาฬิà¸à¸²"
+ "นาฬิเà¸"
+ "นาโน"
+ "นำ"
+ "นิ"
+ "นิà¸à¸£"
+ "นิà¸à¸£à¸­à¸¢à¸”์"
+ "นิà¸à¸²à¸¢"
+ "นิà¸à¹€à¸à¸´à¸¥"
+ "นิคม"
+ "นิครนถ์"
+ "นิคหิต"
+ "นิจ"
+ "นิด"
+ "นิตยสาร"
+ "นิตย์"
+ "นิติ"
+ "นิทรรศ"
+ "นิทรา"
+ "นิทัศน์"
+ "นิทาน"
+ "นินทา"
+ "นิบาต"
+ "นิพนธ์"
+ "นิพพาน"
+ "นิมนต์"
+ "นิมมาน"
+ "นิมมานรดี"
+ "นิมิต"
+ "นิยม"
+ "นิยาม"
+ "นิยาย"
+ "นิรทุà¸à¸‚์"
+ "นิรนาม"
+ "นิรภัย"
+ "นิรมล"
+ "นิรมิต"
+ "นิรันดร"
+ "นิราศ"
+ "นิรโทษ"
+ "นิล"
+ "นิลุบล"
+ "นิวà¸à¸´à¸™à¸µ"
+ "นิวคลิอิà¸"
+ "นิวซีà¹à¸¥à¸™à¸”์"
+ "นิวตรอน"
+ "นิวยอร์ค"
+ "นิวรณ์"
+ "นิวัต"
+ "นิวัตน์"
+ "นิวาต"
+ "นิวาส"
+ "นิวเคลียร์"
+ "นิวเคลียส"
+ "นิสัย"
+ "นิสิต"
+ "นิเทศ"
+ "นิเวศ"
+ "นิเวศน์"
+ "นิโคติน"
+ "นิโรธ"
+ "นิโลบล"
+ "นิ่ง"
+ "นิ่ม"
+ "นิ่ว"
+ "นิ้ว"
+ "นี"
+ "นีออน"
+ "นีโอดิเมียม"
+ "นี่"
+ "นี้"
+ "นึà¸"
+ "นึ่ง"
+ "นุง"
+ "นุช"
+ "นุ่ง"
+ "นุ่น"
+ "นุ่ม"
+ "นุ้ย"
+ "นูน"
+ "นู่น"
+ "นู้น"
+ "นเรศวร"
+ "นโยบาย"
+ "นโรดม"
+ "น่วม"
+ "น่อง"
+ "น่า"
+ "น่าน"
+ "น้อง"
+ "น้อม"
+ "น้อย"
+ "น้อยหน่า"
+ "น้อยโหน่ง"
+ "น้า"
+ "น้าว"
+ "น้ำ"
+ "น้ำมัน"
+ "น้ำเงิน"
+ "บà¸"
+ "บà¸à¸žà¸£à¹ˆà¸­à¸‡"
+ "บง"
+ "บงà¸à¸Š"
+ "บด"
+ "บดินทรเดชา"
+ "บดินทร์"
+ "บดี"
+ "บท"
+ "บน"
+ "บพิตร"
+ "บพิธ"
+ "บรม"
+ "บรมัตถ์"
+ "บรร"
+ "บรรจง"
+ "บรรจถรณ์"
+ "บรรจบ"
+ "บรรจวบ"
+ "บรรจุ"
+ "บรรณ"
+ "บรรณาà¸à¸²à¸£"
+ "บรรณาคม"
+ "บรรณาธิà¸à¸²à¸£"
+ "บรรณานุà¸à¸£à¸¡"
+ "บรรณารัà¸à¸©à¸¨à¸²à¸ªà¸•ร์"
+ "บรรณารัà¸à¸©à¹Œ"
+ "บรรดา"
+ "บรรทม"
+ "บรรทัด"
+ "บรรทุà¸"
+ "บรรพ"
+ "บรรพชา"
+ "บรรพชิต"
+ "บรรพต"
+ "บรรพบุรุษ"
+ "บรรยง"
+ "บรรยงà¸à¹Œ"
+ "บรรยาà¸à¸²à¸¨"
+ "บรรยาย"
+ "บรรลัย"
+ "บรรลุ"
+ "บรรษัท"
+ "บรรหาร"
+ "บรรเจิด"
+ "บรรเทา"
+ "บรรเลง"
+ "บรรโลม"
+ "บรั่นดี"
+ "บราวเซอร์"
+ "บริ"
+ "บริà¸à¸£à¸£à¸¡"
+ "บริà¸à¸²à¸£"
+ "บริขาร"
+ "บริคณห์"
+ "บริจาค"
+ "บริจารà¸"
+ "บริจาริà¸à¸²"
+ "บริบาล"
+ "บริบูรณ์"
+ "บริพัตร"
+ "บริพาร"
+ "บริภัณฑ์"
+ "บริภาษ"
+ "บริรัà¸à¸©à¹Œ"
+ "บริราช"
+ "บริวาร"
+ "บริษัท"
+ "บริสุทธิ์"
+ "บริหาร"
+ "บริเฉท"
+ "บริเตน"
+ "บริเวณ"
+ "บริโภค"
+ "บล็อà¸"
+ "บวà¸"
+ "บวง"
+ "บวช"
+ "บวน"
+ "บวบ"
+ "บวม"
+ "บวร"
+ "บอ"
+ "บอà¸"
+ "บอด"
+ "บอดี้"
+ "บอน"
+ "บอบ"
+ "บอร์à¸"
+ "บอร์ด"
+ "บอร์เนียว"
+ "บอล"
+ "บอลลูน"
+ "บะหมี่"
+ "บัà¸"
+ "บัคเตรี"
+ "บัง"
+ "บังà¸à¸°à¹‚ล"
+ "บังคม"
+ "บังคล"
+ "บังคับ"
+ "บังสุà¸à¸¸à¸¥"
+ "บังอร"
+ "บังอาจ"
+ "บังเà¸à¸´à¸”"
+ "บังเหียน"
+ "บังเอิà¸"
+ "บัà¸à¸Šà¸£"
+ "บัà¸à¸Šà¸²"
+ "บัà¸à¸Šà¸µ"
+ "บัà¸à¸à¸±à¸•ิ"
+ "บัณฑิต"
+ "บัณฑิตย์"
+ "บัณฑุ"
+ "บัณฑูร"
+ "บัณณาส"
+ "บัณรส"
+ "บัณรสี"
+ "บัณเฑาะà¸à¹Œ"
+ "บัณเฑาะว์"
+ "บัด"
+ "บัดà¸à¸£à¸µ"
+ "บัดซบ"
+ "บัดสี"
+ "บัตร"
+ "บัน"
+ "บันดาล"
+ "บันทึà¸"
+ "บันยะบันยัง"
+ "บันลือ"
+ "บันเทิง"
+ "บันได"
+ "บัปผาสะ"
+ "บัพ"
+ "บัลà¸à¸²à¹€à¸£à¸µà¸¢"
+ "บัลลังà¸à¹Œ"
+ "บัลลูน"
+ "บัว"
+ "บัส"
+ "บั่น"
+ "บั้ง"
+ "บั้น"
+ "บั๊à¸"
+ "บา"
+ "บาà¸"
+ "บาง"
+ "บาด"
+ "บาดทะยัà¸"
+ "บาดาล"
+ "บาต"
+ "บาตร"
+ "บาท"
+ "บาทบงสุ์"
+ "บาทหลวง"
+ "บาทาธึà¸"
+ "บาทุà¸à¸²"
+ "บาน"
+ "บานชื่น"
+ "บานบุรี"
+ "บานียะ"
+ "บานเช้า"
+ "บานเย็น"
+ "บาป"
+ "บาย"
+ "บารมี"
+ "บารอมิเตอร์"
+ "บาร์"
+ "บาร์เรล"
+ "บาล"
+ "บาลี"
+ "บาศ"
+ "บาศà¸à¹Œ"
+ "บาสเà¸à¸•บอล"
+ "บาหลี"
+ "บำนาà¸"
+ "บำบัด"
+ "บำราบ"
+ "บำราศ"
+ "บำรุง"
+ "บำรู"
+ "บำเพ็à¸"
+ "บำเรอ"
+ "บำเหน็จ"
+ "บิ"
+ "บิà¸"
+ "บิณฑบาต"
+ "บิด"
+ "บิดพลิ้ว"
+ "บิดร"
+ "บิดา"
+ "บิต"
+ "บิน"
+ "บิล"
+ "บิลเลียด"
+ "บิ่น"
+ "บีฑา"
+ "บีน"
+ "บีบ"
+ "บี้"
+ "บึà¸"
+ "บึà¸à¸šà¸¶à¸™"
+ "บึง"
+ "บึ่ง"
+ "บึ้ง"
+ "บุ"
+ "บุà¸"
+ "บุà¸à¸£à¸¸à¸"
+ "บุà¸à¸©à¸"
+ "บุคคล"
+ "บุคลาà¸à¸£"
+ "บุคลาธิษà¸à¸²à¸™"
+ "บุคลิà¸"
+ "บุคลิà¸à¸ à¸²à¸ž"
+ "บุà¸"
+ "บุà¸à¸à¸²à¸™à¸¸à¸ à¸²à¸ž"
+ "บุà¸à¸à¸²à¸ à¸´à¸™à¸´à¸«à¸²à¸£"
+ "บุณฑริà¸"
+ "บุณย์"
+ "บุตร"
+ "บุตรา"
+ "บุตรี"
+ "บุบ"
+ "บุปผชาติ"
+ "บุพà¸à¸£à¸£à¸¡"
+ "บุพà¸à¸²à¸£à¸µ"
+ "บุพà¸à¸´à¸ˆ"
+ "บุพชาติ"
+ "บุพทัà¸à¸©à¸´à¸“"
+ "บุพนิมิต"
+ "บุพบท"
+ "บุพพาจารย์"
+ "บุพเพสันนิวาส"
+ "บุฟเฟ่ต์"
+ "บุรพทิศ"
+ "บุรพบท"
+ "บุรพาจารย์"
+ "บุราณ"
+ "บุริมทิศ"
+ "บุริมพรรษา"
+ "บุริมสิทธิ"
+ "บุรี"
+ "บุรุษ"
+ "บุษà¸à¸£"
+ "บุษบง"
+ "บุษบา"
+ "บุษยมาส"
+ "บุษราคัม"
+ "บุหงัน"
+ "บุหงา"
+ "บุหรง"
+ "บุหรี่"
+ "บุหลัน"
+ "บุโรทั่ง"
+ "บุ่มบ่าม"
+ "บุ้ง"
+ "บุ้ย"
+ "บุ๋ม"
+ "บูชา"
+ "บูชายัà¸"
+ "บูด"
+ "บูต"
+ "บูรณภาพ"
+ "บูรณะ"
+ "บูรพา"
+ "บูรพาจารย์"
+ "บู้"
+ "บู๊"
+ "บ่"
+ "บ่ง"
+ "บ่น"
+ "บ่ม"
+ "บ่วง"
+ "บ่อ"
+ "บ่อง"
+ "บ่อน"
+ "บ่อย"
+ "บ่า"
+ "บ่าง"
+ "บ่าย"
+ "บ่าว"
+ "บ้วน"
+ "บ้อง"
+ "บ้องà¹à¸šà¹Šà¸§"
+ "บ้อม"
+ "บ้า"
+ "บ้าง"
+ "บ้าน"
+ "บ้าระห่ำ"
+ "บ๊งเบ๊ง"
+ "บ๊วย"
+ "บ๊อง"
+ "บ๊ะ"
+ "บ๋อม"
+ "บ๋อย"
+ "บ๋ำ"
+ "ปà¸"
+ "ปà¸à¸„รอง"
+ "ปà¸à¸•ิ"
+ "ปà¸à¸£à¸“์"
+ "ปà¸à¸²à¸£"
+ "ปà¸à¸´à¸“à¸à¸°"
+ "ปà¸à¸±à¸"
+ "ปà¸à¸´à¸à¸£à¸“์"
+ "ปà¸à¸´à¸à¸£à¸£à¸¡"
+ "ปà¸à¸´à¸à¸´à¸£à¸´à¸¢à¸²"
+ "ปà¸à¸´à¸à¸¹à¸¥"
+ "ปà¸à¸´à¸„ม"
+ "ปà¸à¸´à¸Šà¸µà¸§à¸™à¸°"
+ "ปà¸à¸´à¸à¸à¸²"
+ "ปà¸à¸´à¸à¸²à¸“"
+ "ปà¸à¸´à¸—ิน"
+ "ปà¸à¸´à¸šà¸–"
+ "ปà¸à¸´à¸šà¸±à¸•ิ"
+ "ปà¸à¸´à¸›à¸—า"
+ "ปà¸à¸´à¸›à¸±à¸à¸©à¹Œ"
+ "ปà¸à¸´à¸žà¸±à¸—ธ์"
+ "ปà¸à¸´à¸žà¸²à¸à¸¢à¹Œ"
+ "ปà¸à¸´à¸ à¸²à¸„"
+ "ปà¸à¸´à¸ à¸²à¸“"
+ "ปà¸à¸´à¸¡à¸²"
+ "ปà¸à¸´à¸¡à¸²à¸à¸£"
+ "ปà¸à¸´à¸¢à¸¸à¸—ธ์"
+ "ปà¸à¸´à¸£à¸¹à¸›"
+ "ปà¸à¸´à¸§à¸±à¸•ิ"
+ "ปà¸à¸´à¸§à¸²à¸•"
+ "ปà¸à¸´à¸§à¸²à¸—"
+ "ปà¸à¸´à¸ªà¸™à¸˜à¸´"
+ "ปà¸à¸´à¸ªà¸±à¸‡à¸‚รณ์"
+ "ปà¸à¸´à¸ªà¸±à¸™à¸–าร"
+ "ปà¸à¸´à¸ªà¸±à¸¡à¸žà¸±à¸™à¸˜à¹Œ"
+ "ปà¸à¸´à¹€à¸§à¸˜"
+ "ปà¸à¸´à¹€à¸ªà¸˜"
+ "ปà¸à¸´à¹‚ลม"
+ "ปà¸à¸žà¸µ"
+ "ปà¸à¸¡"
+ "ปà¸à¸¡à¸—ัศน์"
+ "ปà¸à¸¡à¸™à¸´à¹€à¸—ศ"
+ "ปà¸à¸¡à¸žà¸¢à¸²à¸šà¸²à¸¥"
+ "ปà¸à¸¡à¸¤à¸à¸©à¹Œ"
+ "ปà¸à¸¡à¸§à¸±à¸¢"
+ "ปà¸à¸¡à¹€à¸—ศนา"
+ "ปณต"
+ "ปณิธาน"
+ "ปด"
+ "ปถพี"
+ "ปทานุà¸à¸£à¸¡"
+ "ปทุม"
+ "ปทุมธานี"
+ "ปน"
+ "ปนัดดา"
+ "ปนเป"
+ "ปบ"
+ "ปม"
+ "ปรà¸"
+ "ปรà¸à¸•ิ"
+ "ปรง"
+ "ปรน"
+ "ปรนนิบัติ"
+ "ปรนัย"
+ "ปรบ"
+ "ปรปัà¸à¸©à¹Œ"
+ "ปรมัตถ์"
+ "ปรมาจารย์"
+ "ปรมาณู"
+ "ปรมาภิเษà¸"
+ "ปรมาภิไธย"
+ "ปรวด"
+ "ปรวนà¹à¸›à¸£"
+ "ปรวาที"
+ "ปรสิต"
+ "ปรองดอง"
+ "ปรอด"
+ "ปรอท"
+ "ปรอย"
+ "ประ"
+ "ประà¸à¸š"
+ "ประà¸à¸§à¸”"
+ "ประà¸à¸­à¸š"
+ "ประà¸à¸±à¸™"
+ "ประà¸à¸±à¸š"
+ "ประà¸à¸²à¸¢"
+ "ประà¸à¸²à¸£"
+ "ประà¸à¸²à¸¨"
+ "ประà¸à¸²à¸¨à¸™à¸µà¸¢à¸šà¸±à¸•ร"
+ "ประà¸à¸²à¸¨à¸´à¸•"
+ "ประà¸à¸´à¸”"
+ "ประคบ"
+ "ประคบประหงม"
+ "ประคอง"
+ "ประคำ"
+ "ประจบ"
+ "ประจวบ"
+ "ประจัà¸à¸©à¹Œ"
+ "ประจัà¸"
+ "ประจัน"
+ "ประจาค"
+ "ประจาน"
+ "ประจำ"
+ "ประจิม"
+ "ประจุ"
+ "ประจ๋อประà¹à¸ˆà¹‹"
+ "ประชด"
+ "ประชวร"
+ "ประชัน"
+ "ประชา"
+ "ประชาชน"
+ "ประชาธิปัตย์"
+ "ประชาธิปไตย"
+ "ประชาภิบาล"
+ "ประชิด"
+ "ประชุม"
+ "ประณต"
+ "ประณม"
+ "ประณาม"
+ "ประณิธาน"
+ "ประณิธิ"
+ "ประณีต"
+ "ประดน"
+ "ประดวน"
+ "ประดอน"
+ "ประดัà¸à¸›à¸£à¸°à¹€à¸”ิด"
+ "ประดัง"
+ "ประดับ"
+ "ประดา"
+ "ประดาป"
+ "ประดาษ"
+ "ประดิดประดอย"
+ "ประดิทิน"
+ "ประดิษà¸à¸²à¸™"
+ "ประดิษà¸à¹Œ"
+ "ประดุง"
+ "ประดุจ"
+ "ประดู่"
+ "ประตู"
+ "ประถม"
+ "ประทวน"
+ "ประทัà¸à¸©à¹Œ"
+ "ประทัง"
+ "ประทัด"
+ "ประทับ"
+ "ประทาน"
+ "ประทิน"
+ "ประทิ่น"
+ "ประทีป"
+ "ประทุน"
+ "ประทุษ"
+ "ประทุษร้าย"
+ "ประท้วง"
+ "ประธาน"
+ "ประธานาธิบดี"
+ "ประนม"
+ "ประนอม"
+ "ประนีประนอม"
+ "ประปราย"
+ "ประปา"
+ "ประพฤติ"
+ "ประพฤธิ์"
+ "ประพัทธ์"
+ "ประพันธ์"
+ "ประพาต"
+ "ประพาส"
+ "ประพาฬ"
+ "ประพิณ"
+ "ประพุทธ์"
+ "ประภัสสร"
+ "ประภา"
+ "ประภาคาร"
+ "ประภาพ"
+ "ประภาส"
+ "ประมง"
+ "ประมวà¸"
+ "ประมวล"
+ "ประมาณ"
+ "ประมาท"
+ "ประมุข"
+ "ประมุท"
+ "ประมูล"
+ "ประยุà¸à¸•์"
+ "ประยุทธ์"
+ "ประยูร"
+ "ประลมพ์"
+ "ประลอง"
+ "ประลัย"
+ "ประลาต"
+ "ประวรรต"
+ "ประวรรตน์"
+ "ประวัติ"
+ "ประวัติà¸à¸²à¸£à¸“์"
+ "ประวัติศาสตร์"
+ "ประวาต"
+ "ประวาล"
+ "ประวาส"
+ "ประวิง"
+ "ประวิช"
+ "ประวิตร"
+ "ประวีณ"
+ "ประศม"
+ "ประศาสน์"
+ "ประสà¸"
+ "ประสงค์"
+ "ประสบ"
+ "ประสบà¸à¸²à¸£à¸“์"
+ "ประสพ"
+ "ประสา"
+ "ประสาท"
+ "ประสาน"
+ "ประสิทธิผล"
+ "ประสิทธิภาพ"
+ "ประสิทธิ์"
+ "ประสูติ"
+ "ประหม่า"
+ "ประหยัด"
+ "ประหลาด"
+ "ประหล่ำ"
+ "ประหาร"
+ "ประฮาม"
+ "ประเคน"
+ "ประเจà¸"
+ "ประเจิดประเจ้อ"
+ "ประเจียด"
+ "ประเด"
+ "ประเดิม"
+ "ประเดียง"
+ "ประเดี๋ยว"
+ "ประเดี๋ยวประด๋าว"
+ "ประเด็น"
+ "ประเทศ"
+ "ประเทศราช"
+ "ประเทศไทย"
+ "ประเทือง"
+ "ประเพณี"
+ "ประเภท"
+ "ประเมิน"
+ "ประเวณี"
+ "ประเวศ"
+ "ประเวศน์"
+ "ประเสริà¸"
+ "ประà¹à¸à¸"
+ "ประà¹à¸ˆ"
+ "ประโคม"
+ "ประโยค"
+ "ประโยชน์"
+ "ประโลม"
+ "ปรัà¸"
+ "ปรัง"
+ "ปรัชà¸à¸²"
+ "ปรัตยุตบัน"
+ "ปรัตยุบัน"
+ "ปรัน"
+ "ปรับ"
+ "ปรัมปรา"
+ "ปรัศนี"
+ "ปรัศว์"
+ "ปราà¸à¸"
+ "ปราà¸à¸£à¸¡"
+ "ปราà¸à¸²à¸£"
+ "ปราคภาร"
+ "ปราง"
+ "ปรางค์"
+ "ปราจีน"
+ "ปราชà¸à¸²"
+ "ปราชà¸à¹Œ"
+ "ปราชัย"
+ "ปราชิต"
+ "ปราณ"
+ "ปราณี"
+ "ปราด"
+ "ปรานี"
+ "ปราบ"
+ "ปราบดาภิเษà¸"
+ "ปราปต์"
+ "ปราภพ"
+ "ปราม"
+ "ปรามาส"
+ "ปราย"
+ "ปรารถนา"
+ "ปรารภ"
+ "ปรารมภ์"
+ "ปราศ"
+ "ปราศรัย"
+ "ปราศาร"
+ "ปราษณี"
+ "ปราษาณ"
+ "ปราสาท"
+ "ปราโมช"
+ "ปราโมทย์"
+ "ปรำ"
+ "ปริ"
+ "ปริà¸"
+ "ปริคณห์"
+ "ปริจาค"
+ "ปริจาริà¸à¸²"
+ "ปริซึม"
+ "ปริà¸à¸à¸²"
+ "ปริณาม"
+ "ปริณายà¸"
+ "ปริต"
+ "ปริตตะ"
+ "ปริตร"
+ "ปริทรรศน์"
+ "ปริทัศน์"
+ "ปริน"
+ "ปรินส์"
+ "ปรินิพพาน"
+ "ปริบ"
+ "ปริมณฑล"
+ "ปริมัท"
+ "ปริมาณ"
+ "ปริมาตร"
+ "ปริยัติ"
+ "ปริยาย"
+ "ปริวรรต"
+ "ปริวาส"
+ "ปริศนา"
+ "ปริเฉท"
+ "ปริ่ม"
+ "ปรีชา"
+ "ปรีดา"
+ "ปรีดิ์"
+ "ปรียา"
+ "ปรี่"
+ "ปรี๊ด"
+ "ปรึà¸à¸©à¸²"
+ "ปรือ"
+ "ปรื๋อ"
+ "ปรุ"
+ "ปรุง"
+ "ปรูด"
+ "ปรู๊ดปร๊าด"
+ "ปรู๊ฟ"
+ "ปรเมนทร์"
+ "ปรโลà¸"
+ "ปร่า"
+ "ปร๋อ"
+ "ปฤจฉา"
+ "ปฤษฎางค์"
+ "ปลà¸"
+ "ปลง"
+ "ปลด"
+ "ปลวà¸"
+ "ปลอà¸"
+ "ปลอด"
+ "ปลอดภัย"
+ "ปลอบ"
+ "ปลอม"
+ "ปละ"
+ "ปลัà¸"
+ "ปลัด"
+ "ปลั่ง"
+ "ปลั๊à¸"
+ "ปลั๊à¸à¸­à¸´à¸™"
+ "ปลา"
+ "ปลาต"
+ "ปลาบ"
+ "ปลาย"
+ "ปลาวาฬ"
+ "ปลาสนาà¸à¸²à¸£"
+ "ปลาสเตอร์"
+ "ปลิง"
+ "ปลิด"
+ "ปลิว"
+ "ปลิโพธ"
+ "ปลิ่ม"
+ "ปลิ้น"
+ "ปลี"
+ "ปลีà¸"
+ "ปลื้ม"
+ "ปลุà¸"
+ "ปลูà¸"
+ "ปล่ง"
+ "ปล่อง"
+ "ปล่อย"
+ "ปล้น"
+ "ปล้อง"
+ "ปล้อน"
+ "ปล้ำ"
+ "ปวà¸à¹€à¸›à¸µà¸¢à¸"
+ "ปวง"
+ "ปวด"
+ "ปวารณา"
+ "ปศุ"
+ "ปอ"
+ "ปอà¸"
+ "ปอง"
+ "ปอด"
+ "ปอน"
+ "ปอนด์"
+ "ปอบ"
+ "ปอย"
+ "ปอร์"
+ "ปอร์ตุเà¸à¸ª"
+ "ปะ"
+ "ปะà¸à¸™"
+ "ปะà¸à¸²à¸£à¸±à¸‡"
+ "ปะขาว"
+ "ปะทะ"
+ "ปะทุ"
+ "ปะหงับ"
+ "ปะเหลาะ"
+ "ปะà¹à¸¥à¹ˆà¸¡"
+ "ปะโลง"
+ "ปัà¸"
+ "ปัà¸à¸à¸´à¹ˆà¸‡"
+ "ปัà¸à¸©à¸²"
+ "ปัà¸à¸©à¸²à¸§à¸ªà¸²à¸™"
+ "ปัà¸à¸©à¸´à¸“"
+ "ปัà¸à¸©à¸´à¸™"
+ "ปัà¸à¸©à¸µ"
+ "ปัà¸à¸©à¹Œ"
+ "ปัà¸à¹€à¸›à¹‰à¸²"
+ "ปัง"
+ "ปังสุà¸à¸¸à¸¥"
+ "ปัจจันตคาม"
+ "ปัจจันตชนบท"
+ "ปัจจันตประเทศ"
+ "ปัจจันต์"
+ "ปัจจัย"
+ "ปัจจามิตร"
+ "ปัจจุบัน"
+ "ปัจจุสมัย"
+ "ปัจฉา"
+ "ปัจฉิม"
+ "ปัจเจà¸"
+ "ปัà¸à¸ˆà¸§à¸±à¸„คีย์"
+ "ปัà¸à¸à¸²"
+ "ปัà¸à¸«à¸²"
+ "ปัด"
+ "ปัตตานี"
+ "ปัตตาเวีย"
+ "ปัทม์"
+ "ปัน"
+ "ปับ"
+ "ปัปผาสะ"
+ "ปัสสาวะ"
+ "ปัสสาสะ"
+ "ปั่น"
+ "ปั้น"
+ "ปั๊บ"
+ "ปั๊ม"
+ "ปั๋ง"
+ "ปา"
+ "ปาà¸"
+ "ปาà¸à¸à¸²"
+ "ปาà¸à¸µà¸ªà¸–าน"
+ "ปาง"
+ "ปาà¸à¸´à¸«à¸²à¸£à¸´à¸¢à¹Œ"
+ "ปาà¸à¸"
+ "ปาà¸à¸à¸–า"
+ "ปาณาติบาต"
+ "ปาด"
+ "ปาติโมà¸à¸‚์"
+ "ปาทังà¸à¸²"
+ "ปาท่องโà¸à¹‹"
+ "ปาน"
+ "ปาปัว"
+ "ปาม"
+ "ปายาส"
+ "ปาราชิà¸"
+ "ปาริฉัตร"
+ "ปาริชาต"
+ "ปารีส"
+ "ปาร์เà¸à¸•์"
+ "ปาลี"
+ "ปาล์ม"
+ "ปาว"
+ "ปาหนัน"
+ "ปาหี่"
+ "ปาโมà¸à¸‚์"
+ "ปำ"
+ "ปิà¸à¸™à¸´à¸"
+ "ปิงปอง"
+ "ปิฎà¸"
+ "ปิด"
+ "ปิตา"
+ "ปิติ"
+ "ปิตุ"
+ "ปิตุฆาต"
+ "ปิตุภูมิ"
+ "ปิตุลา"
+ "ปิยมิตร"
+ "ปิยะ"
+ "ปิศาจ"
+ "ปิโตรเลียม"
+ "ปิโยรส"
+ "ปิ่น"
+ "ปิ่นโต"
+ "ปิ่ม"
+ "ปิ้ง"
+ "ปิ้ม"
+ "ปิ๋ว"
+ "ปี"
+ "ปีà¸"
+ "ปีน"
+ "ปีบ"
+ "ปีมะโว้"
+ "ปีศาจ"
+ "ปี่"
+ "ปี้"
+ "ปี๊ด"
+ "ปี๊บ"
+ "ปี๋"
+ "ปึà¸"
+ "ปึง"
+ "ปึ่ง"
+ "ปึ้ด"
+ "ปึ๋ง"
+ "ปืน"
+ "ปื้น"
+ "ปื๋อ"
+ "ปุ"
+ "ปุà¸"
+ "ปุจฉา"
+ "ปุด"
+ "ปุถุชน"
+ "ปุบ"
+ "ปุย"
+ "ปุโรหิต"
+ "ปุ่ม"
+ "ปุ้งà¸à¸µà¹‹"
+ "ปุ้ม"
+ "ปุ๊"
+ "ปุ๊บ"
+ "ปุ๋ม"
+ "ปุ๋ย"
+ "ปู"
+ "ปูชนียบุคคล"
+ "ปูชนียวัตถุ"
+ "ปูด"
+ "ปูน"
+ "ปูม"
+ "ปู่"
+ "ปู้ยี้ปู้ยำ"
+ "ปเวณี"
+ "ป่น"
+ "ป่วง"
+ "ป่วน"
+ "ป่วย"
+ "ป่อง"
+ "ป่า"
+ "ป่าน"
+ "ป่าย"
+ "ป่าว"
+ "ป้วน"
+ "ป้วนเปี้ยน"
+ "ป้อ"
+ "ป้อง"
+ "ป้องà¸à¸±à¸™"
+ "ป้อน"
+ "ป้อม"
+ "ป้อย"
+ "ป้อà¹à¸›à¹‰"
+ "ป้า"
+ "ป้าง"
+ "ป้าน"
+ "ป้าบ"
+ "ป้าย"
+ "ป้ำ"
+ "ป๊อà¸à¸à¸µà¹‰"
+ "ป๊าบ"
+ "ป๋อ"
+ "ป๋อม"
+ "ป๋า"
+ "ผà¸"
+ "ผà¸à¸²"
+ "ผà¸à¸²à¸¢"
+ "ผง"
+ "ผงà¸"
+ "ผงะ"
+ "ผงาด"
+ "ผจง"
+ "ผจà¸"
+ "ผด"
+ "ผดุง"
+ "ผนวà¸"
+ "ผนวช"
+ "ผนัง"
+ "ผนึà¸"
+ "ผม"
+ "ผมบ๊อบ"
+ "ผยอง"
+ "ผรุสวาท"
+ "ผล"
+ "ผละ"
+ "ผลัà¸"
+ "ผลัด"
+ "ผลัวะ"
+ "ผลาà¸"
+ "ผลานิสงส์"
+ "ผลาผล"
+ "ผลาหาร"
+ "ผลิ"
+ "ผลิต"
+ "ผลิตภัณฑ์"
+ "ผลีผลาม"
+ "ผลึà¸"
+ "ผลึ่ง"
+ "ผลุ"
+ "ผลุง"
+ "ผลุด"
+ "ผลุน"
+ "ผลุบ"
+ "ผลุย"
+ "ผลู"
+ "ผล็อย"
+ "ผวน"
+ "ผวย"
+ "ผวา"
+ "ผสม"
+ "ผสาน"
+ "ผสาย"
+ "ผอà¸"
+ "ผอง"
+ "ผอด"
+ "ผอบ"
+ "ผอม"
+ "ผอวด"
+ "ผอูน"
+ "ผะ"
+ "ผัà¸"
+ "ผัง"
+ "ผัด"
+ "ผัน"
+ "ผันผวน"
+ "ผับ"
+ "ผัว"
+ "ผัวะ"
+ "ผา"
+ "ผาà¸"
+ "ผาง"
+ "ผาณิต"
+ "ผาด"
+ "ผาย"
+ "ผิ"
+ "ผิง"
+ "ผิด"
+ "ผิน"
+ "ผิว"
+ "ผี"
+ "ผึง"
+ "ผึ่ง"
+ "ผึ้ง"
+ "ผืน"
+ "ผื่น"
+ "ผุ"
+ "ผุด"
+ "ผุยผง"
+ "ผูà¸"
+ "ผู้"
+ "ผ็อย"
+ "ผ่อง"
+ "ผ่อน"
+ "ผ่อย"
+ "ผ่า"
+ "ผ่าน"
+ "ผ่ายผอม"
+ "ผ่าว"
+ "ผ้า"
+ "à¸à¸™"
+ "à¸à¸£à¸±à¹ˆà¸‡"
+ "à¸à¸£à¸±à¹ˆà¸‡à¹€à¸¨à¸ª"
+ "à¸à¸­à¸¢"
+ "à¸à¸±à¸"
+ "à¸à¸±à¸‡"
+ "à¸à¸±à¸”"
+ "à¸à¸±à¸™"
+ "à¸à¸±à¹ˆà¸‡"
+ "à¸à¸²"
+ "à¸à¸²à¸"
+ "à¸à¸²à¸‡"
+ "à¸à¸²à¸”"
+ "à¸à¸²à¸™"
+ "à¸à¸²à¸¢"
+ "à¸à¸´à¹ˆà¸™"
+ "à¸à¸µ"
+ "à¸à¸¶à¸"
+ "à¸à¸·à¸”"
+ "à¸à¸·à¸™"
+ "à¸à¸¸à¹ˆà¸™"
+ "à¸à¸¹à¸‡"
+ "à¸à¹ˆà¸­"
+ "à¸à¹ˆà¸²"
+ "à¸à¹ˆà¸²à¸¢"
+ "à¸à¹‰à¸²"
+ "à¸à¹‰à¸²à¸¢"
+ "พà¸"
+ "พง"
+ "พงศาวดาร"
+ "พงศ์"
+ "พจนา"
+ "พจนานุà¸à¸£à¸¡"
+ "พจนารถ"
+ "พจนีย์"
+ "พจน์"
+ "พจมาน"
+ "พจี"
+ "พà¸à¸²"
+ "พà¸à¸²à¸¥à¸­"
+ "พณิช"
+ "พณิชย์"
+ "พด"
+ "พธู"
+ "พนม"
+ "พนัà¸"
+ "พนัà¸à¸‡à¸²à¸™"
+ "พนัง"
+ "พนัน"
+ "พนัส"
+ "พนา"
+ "พนาดร"
+ "พนาราม"
+ "พนาลัย"
+ "พนิดา"
+ "พบ"
+ "พม่า"
+ "พยนต์"
+ "พยศ"
+ "พยัà¸"
+ "พยัà¸à¸žà¹€à¸¢à¸´à¸”"
+ "พยัคฆา"
+ "พยัคฆิน"
+ "พยัคฆี"
+ "พยัคฆ์"
+ "พยัà¸à¸Šà¸™à¸°"
+ "พยัต"
+ "พยับ"
+ "พยาà¸à¸£à¸“์"
+ "พยางค์"
+ "พยาธิ"
+ "พยาน"
+ "พยาบาท"
+ "พยาบาล"
+ "พยายาม"
+ "พยุ"
+ "พยุง"
+ "พยุหยาตรา"
+ "พยุหะ"
+ "พยุหเสนา"
+ "พร"
+ "พรต"
+ "พรม"
+ "พรร"
+ "พรรค"
+ "พรรค์"
+ "พรรณ"
+ "พรรณนา"
+ "พรรษ"
+ "พรรษา"
+ "พรวด"
+ "พรวน"
+ "พรหม"
+ "พรหมจรรย์"
+ "พรหมจาริณี"
+ "พรหมจารี"
+ "พรอด"
+ "พระ"
+ "พระราชวัง"
+ "พระองค์"
+ "พระเจ้าอยู่หัว"
+ "พรัà¸à¸žà¸£à¹‰à¸­à¸¡"
+ "พรัด"
+ "พรั่ง"
+ "พรั่น"
+ "พราà¸"
+ "พราง"
+ "พราด"
+ "พราน"
+ "พราย"
+ "พราว"
+ "พราหมณ์"
+ "พรำ"
+ "พริà¸"
+ "พรินเตอร์"
+ "พริบ"
+ "พริ้ง"
+ "พริ้ม"
+ "พรีเมียม"
+ "พรีเมียร์"
+ "พรึง"
+ "พรึน"
+ "พรึบ"
+ "พรืด"
+ "พรุ"
+ "พรุà¸"
+ "พรุน"
+ "พรุ่ง"
+ "พรู"
+ "พรูด"
+ "พร่อง"
+ "พร่อมพร้อ"
+ "พร่อย"
+ "พร่า"
+ "พร่าง"
+ "พร่ำ"
+ "พร้อง"
+ "พร้อม"
+ "พร้อมพรัà¸"
+ "พร้อย"
+ "พร้า"
+ "พร้ำ"
+ "พฤà¸à¸©à¸Šà¸²à¸•ิ"
+ "พฤà¸à¸©à¸—ล"
+ "พฤà¸à¸©à¸£à¸²à¸Š"
+ "พฤà¸à¸©à¸¨à¸²à¸ªà¸•ร์"
+ "พฤà¸à¸©à¸²"
+ "พฤà¸à¸©à¹€à¸—วดา"
+ "พฤà¸à¸©à¹Œ"
+ "พฤฒ"
+ "พฤฒา"
+ "พฤฒาจารย์"
+ "พฤฒิ"
+ "พฤต"
+ "พฤติ"
+ "พฤติà¸à¸£à¸£à¸¡"
+ "พฤติà¸à¸²à¸£à¸“์"
+ "พฤตินัย"
+ "พฤทธิ์"
+ "พฤทธ์"
+ "พฤนต์"
+ "พฤนท์"
+ "พฤศจิ"
+ "พฤศจิà¸à¸²à¸¢à¸™"
+ "พฤษภ"
+ "พฤษภาคม"
+ "พฤหัส"
+ "พฤหัสบดี"
+ "พล"
+ "พลà¸à¸²à¸£"
+ "พลความ"
+ "พลบ"
+ "พลวง"
+ "พลวัต"
+ "พลศึà¸à¸©à¸²"
+ "พลอง"
+ "พลอด"
+ "พลอมà¹à¸žà¸¥à¸¡"
+ "พลอย"
+ "พละ"
+ "พลัง"
+ "พลังงาน"
+ "พลัด"
+ "พลัน"
+ "พลับ"
+ "พลับพลา"
+ "พลับพลึง"
+ "พลั่à¸"
+ "พลั่ง"
+ "พลั่ว"
+ "พลั้ง"
+ "พลาà¸à¸£"
+ "พลาง"
+ "พลาด"
+ "พลาธิà¸à¸²à¸£"
+ "พลานามัย"
+ "พลาม"
+ "พลาย"
+ "พลาสติà¸"
+ "พลาสมา"
+ "พลาหà¸"
+ "พลิà¸"
+ "พลิ้ว"
+ "พลี"
+ "พลุ"
+ "พลุà¸"
+ "พลุ่à¸"
+ "พลุ่ง"
+ "พลุ้ย"
+ "พลู"
+ "พลเมือง"
+ "พลเรือน"
+ "พลโลà¸"
+ "พล่อย"
+ "พล่า"
+ "พล่าน"
+ "พล่าม"
+ "พล้ำ"
+ "พวà¸"
+ "พวง"
+ "พวน"
+ "พวย"
+ "พสà¸"
+ "พสุธา"
+ "พหล"
+ "พหลโยธิน"
+ "พหุ"
+ "พหู"
+ "พหูพจน์"
+ "พหูสูต"
+ "พอ"
+ "พอà¸"
+ "พอง"
+ "พอทัล"
+ "พอร์ต"
+ "พะ"
+ "พะพิง"
+ "พะยูน"
+ "พะรุงพะรัง"
+ "พะวง"
+ "พะวัà¸à¸žà¸°à¸§à¸™"
+ "พะว้าพะวัง"
+ "พะอง"
+ "พะอืดพะอม"
+ "พะเนียง"
+ "พะเน้าพะนอ"
+ "พะเยิบ"
+ "พะเยิบพะยาบ"
+ "พะà¹à¸™à¸‡"
+ "พะโล้"
+ "พัà¸"
+ "พัà¸à¸•ร์"
+ "พัง"
+ "พังงา"
+ "พังผืด"
+ "พังพวย"
+ "พังพอน"
+ "พังพาบ"
+ "พังเพย"
+ "พัชร"
+ "พัฒนะ"
+ "พัฒนา"
+ "พัด"
+ "พัตร"
+ "พัทธสีมา"
+ "พัทยา"
+ "พัทลุง"
+ "พัน"
+ "พันทาง"
+ "พันธà¸à¸£à¸“ี"
+ "พันธทิพย์"
+ "พันธนาà¸à¸²à¸£"
+ "พันธบัตร"
+ "พันธมิตร"
+ "พันธะ"
+ "พันธุ"
+ "พันธุ์"
+ "พันธ์"
+ "พับ"
+ "พัลลภ"
+ "พัลวัน"
+ "พัว"
+ "พัวะ"
+ "พัศดี"
+ "พัสดุ"
+ "พัสตร์"
+ "พัสถาน"
+ "พา"
+ "พาà¸"
+ "พาà¸à¸¢à¹Œ"
+ "พาง"
+ "พาณ"
+ "พาณิช"
+ "พาณิชย์"
+ "พาณี"
+ "พาณีนี"
+ "พาด"
+ "พาต"
+ "พาท"
+ "พาทย์"
+ "พาธ"
+ "พาธา"
+ "พาน"
+ "พานร"
+ "พาม"
+ "พาย"
+ "พายัพ"
+ "พายุ"
+ "พารณ"
+ "พารา"
+ "พาราฟิน"
+ "พาร์"
+ "พาล"
+ "พาลี"
+ "พาส"
+ "พาสนา"
+ "พาสน์"
+ "พาสุà¸à¸£à¸µ"
+ "พาสเวิร์ด"
+ "พาหนะ"
+ "พาหะ"
+ "พาหา"
+ "พาหุ"
+ "พาหุรัด"
+ "พาฬหะ"
+ "พาเนล"
+ "พาเหรด"
+ "พาเหียร"
+ "พาโล"
+ "พำ"
+ "พำนัà¸"
+ "พิà¸à¸¥"
+ "พิà¸à¸±à¸”"
+ "พิà¸à¸±à¸•ิ"
+ "พิà¸à¸²à¸£"
+ "พิà¸à¸¸à¸¥"
+ "พิฆาต"
+ "พิฆเนศ"
+ "พิง"
+ "พิจารณา"
+ "พิจารณ์"
+ "พิจิตร"
+ "พิชัย"
+ "พิชาน"
+ "พิชิต"
+ "พิซซ่า"
+ "พิณ"
+ "พิถีพิถัน"
+ "พิทยา"
+ "พิทัà¸à¸©à¹Œ"
+ "พิธาน"
+ "พิธี"
+ "พินทุ"
+ "พินอบพิเทา"
+ "พินัย"
+ "พินาศ"
+ "พินิจ"
+ "พินิต"
+ "พินิศ"
+ "พิบัติ"
+ "พิบูล"
+ "พิพม์"
+ "พิพัà¸à¸žà¸´à¸žà¹ˆà¸§à¸™"
+ "พิพัฒน์"
+ "พิพาà¸à¸©à¸²"
+ "พิพาà¸à¸©à¹Œ"
+ "พิพาท"
+ "พิพิธ"
+ "พิพิธภัณฑสถาน"
+ "พิพิธภัณฑ์"
+ "พิภพ"
+ "พิมพ์"
+ "พิมล"
+ "พิมาน"
+ "พิมุข"
+ "พิมเสน"
+ "พิรอด"
+ "พิราบ"
+ "พิราลัย"
+ "พิรี้พิไร"
+ "พิรุณ"
+ "พิรุธ"
+ "พิลาป"
+ "พิลาส"
+ "พิลึà¸"
+ "พิลึà¸à¸à¸¶à¸à¸à¸·à¸­"
+ "พิลึà¸à¸žà¸´à¸¥à¸±à¹ˆà¸™"
+ "พิศ"
+ "พิศวง"
+ "พิศวาส"
+ "พิศาล"
+ "พิศุทธิ์"
+ "พิศุทธ์"
+ "พิษ"
+ "พิษณุโลà¸"
+ "พิษสง"
+ "พิสดาร"
+ "พิสมัย"
+ "พิสัย"
+ "พิสิà¸"
+ "พิสุทธิ์"
+ "พิสูจน์"
+ "พิหาร"
+ "พิฬาร"
+ "พิเคราะห์"
+ "พิเศษ"
+ "พิโยà¸à¸žà¸´à¹€à¸à¸™"
+ "พิโยค"
+ "พิโรธ"
+ "พิไร"
+ "พิไล"
+ "พี"
+ "พีชคณิต"
+ "พีซี"
+ "พีระมิด"
+ "พี่"
+ "พี้"
+ "พึง"
+ "พึม"
+ "พึมพำ"
+ "พึ่ง"
+ "พึ่บ"
+ "พืช"
+ "พืด"
+ "พื้น"
+ "พื้นที่"
+ "พุ"
+ "พุà¸"
+ "พุง"
+ "พุฒ"
+ "พุฒิ"
+ "พุด"
+ "พุทธ"
+ "พุทธะ"
+ "พุทธาวาส"
+ "พุทธิ"
+ "พุทรา"
+ "พุทโธ่"
+ "พุธ"
+ "พุ่ง"
+ "พุ่ม"
+ "พุ้ย"
+ "พู"
+ "พูด"
+ "พูน"
+ "พู่"
+ "พู้น"
+ "พเนจร"
+ "พ่น"
+ "พ่วง"
+ "พ่อ"
+ "พ่าง"
+ "พ่าน"
+ "พ่าย"
+ "พ่าห์"
+ "พ้น"
+ "พ้อ"
+ "พ้อง"
+ "พ้อม"
+ "ฟà¸"
+ "ฟรอยด์"
+ "ฟรี"
+ "ฟลอเรนซ์"
+ "ฟลูออรีน"
+ "ฟอà¸"
+ "ฟอง"
+ "ฟอด"
+ "ฟอน"
+ "ฟอนต์"
+ "ฟอร์ม"
+ "ฟอร์มาลดีไฮด์"
+ "ฟอร์มาลิน"
+ "ฟอร์à¹à¸¡à¸•"
+ "ฟอสซิล"
+ "ฟอสฟอรัส"
+ "ฟอสเฟต"
+ "ฟัà¸"
+ "ฟัง"
+ "ฟังà¸à¹Œà¸Šà¸±à¸™"
+ "ฟังà¸à¹Œà¸Šà¸±à¹ˆà¸™"
+ "ฟัด"
+ "ฟัน"
+ "ฟั่น"
+ "ฟั้น"
+ "ฟาà¸"
+ "ฟาง"
+ "ฟาด"
+ "ฟาทอม"
+ "ฟาน"
+ "ฟาย"
+ "ฟาร์ม"
+ "ฟาสซิสต์"
+ "ฟิà¸"
+ "ฟิด"
+ "ฟินà¹à¸¥à¸™à¸”์"
+ "ฟิบ"
+ "ฟิลด์"
+ "ฟิลิปปินส์"
+ "ฟิล์ม"
+ "ฟิวส์"
+ "ฟิสิà¸à¸ªà¹Œ"
+ "ฟีฟ่า"
+ "ฟี่"
+ "ฟี้"
+ "ฟืน"
+ "ฟืม"
+ "ฟื้น"
+ "ฟุ"
+ "ฟุต"
+ "ฟุตบอล"
+ "ฟุน"
+ "ฟุบ"
+ "ฟุฟะ"
+ "ฟุลสà¹à¸à¹Šà¸›"
+ "ฟุ่บ"
+ "ฟุ่มเฟือย"
+ "ฟุ้ง"
+ "ฟู"
+ "ฟูà¸"
+ "ฟูจิ"
+ "ฟูด"
+ "ฟูม"
+ "ฟูมฟาย"
+ "ฟู่"
+ "ฟ่อ"
+ "ฟ่อง"
+ "ฟ่อน"
+ "ฟ่าง"
+ "ฟ่าม"
+ "ฟ้อ"
+ "ฟ้อง"
+ "ฟ้อน"
+ "ฟ้า"
+ "ภคนี"
+ "ภพ"
+ "ภมร"
+ "ภยันตราย"
+ "ภรต"
+ "ภรร"
+ "ภรรยา"
+ "ภราดร"
+ "ภริยา"
+ "ภวตัณหา"
+ "ภวังค์"
+ "ภัà¸à¸”ี"
+ "ภัà¸à¸©à¸²"
+ "ภัà¸à¸©à¸²à¸«à¸²à¸£"
+ "ภัณฑ์"
+ "ภัตตาคาร"
+ "ภัตตาหาร"
+ "ภัทร"
+ "ภัพ"
+ "ภัย"
+ "ภัสดา"
+ "ภัสตรา"
+ "ภาค"
+ "ภาคี"
+ "ภาชนะ"
+ "ภาณุ"
+ "ภาพ"
+ "ภาพยนตร์"
+ "ภาย"
+ "ภาร"
+ "ภารà¸à¸´à¸ˆ"
+ "ภารดี"
+ "ภารต"
+ "ภาระ"
+ "ภารา"
+ "ภารโรง"
+ "ภาวนา"
+ "ภาวะ"
+ "ภาษ"
+ "ภาษà¸"
+ "ภาษณ์"
+ "ภาษา"
+ "ภาษิต"
+ "ภาษี"
+ "ภาสà¸à¸£"
+ "ภาสน์"
+ "ภาสวร"
+ "ภิà¸à¸‚า"
+ "ภิà¸à¸‚าจาร"
+ "ภิà¸à¸‚ุ"
+ "ภิà¸à¸‚ุนี"
+ "ภิà¸à¸©à¸²"
+ "ภิà¸à¸©à¸¸"
+ "ภิà¸à¸©à¸¸à¸“ี"
+ "ภิงคาร"
+ "ภิà¸à¹‚à¸"
+ "ภินทนาà¸à¸²à¸£"
+ "ภินท์"
+ "ภิรมย์"
+ "ภุช"
+ "ภุชงค์"
+ "ภุมรา"
+ "ภุมริน"
+ "ภุมรี"
+ "ภู"
+ "ภูต"
+ "ภูติ"
+ "ภูมิ"
+ "ภูมิประเทศ"
+ "ภูมิภาค"
+ "ภูมิลำเนา"
+ "ภูมิศาสตร์"
+ "ภูมี"
+ "ภูริ"
+ "ภูรี"
+ "ภูวดล"
+ "ภูวนาถ"
+ "ภูวเนตร"
+ "ภูวไนย"
+ "ภูษา"
+ "ภูษิต"
+ "ภูเà¸à¹‡à¸•"
+ "ภู่"
+ "มà¸"
+ "มà¸à¸£"
+ "มà¸à¸£à¸²à¸„ม"
+ "มà¸à¸¸à¸Ž"
+ "มà¸à¸¸à¸¥"
+ "มงà¸à¸¸à¸Ž"
+ "มงคล"
+ "มณฑà¸"
+ "มณฑป"
+ "มณฑล"
+ "มณี"
+ "มณเฑียร"
+ "มด"
+ "มติ"
+ "มธุ"
+ "มน"
+ "มนตรี"
+ "มนตร์"
+ "มนต์"
+ "มนสิà¸à¸²à¸£"
+ "มนัส"
+ "มนัสวี"
+ "มนิลา"
+ "มนุษยชาติ"
+ "มนุษยธรรม"
+ "มนุษยศาสตร์"
+ "มนุษยสัมพันธ์"
+ "มนุษยเทพ"
+ "มนุษยโลà¸"
+ "มนุษย์"
+ "มนเทียร"
+ "มยุรา"
+ "มยุรี"
+ "มยุเรศ"
+ "มยูร"
+ "มร"
+ "มรà¸à¸•"
+ "มรณะ"
+ "มรณ์"
+ "มรดà¸"
+ "มรรค"
+ "มรรคนายà¸"
+ "มรรคา"
+ "มรรยา"
+ "มรรยาท"
+ "มรสุม"
+ "มฤค"
+ "มฤตยู"
+ "มล"
+ "มลทิน"
+ "มลาย"
+ "มลายู"
+ "มล้าง"
+ "มวน"
+ "มวย"
+ "มวล"
+ "มหà¸à¸£à¸£à¸¡"
+ "มหรณพ"
+ "มหรรณพ"
+ "มหรสพ"
+ "มหันตโทษ"
+ "มหันต์"
+ "มหัศจรรย์"
+ "มหา"
+ "มหาชน"
+ "มหาดเล็à¸"
+ "มหาดไทย"
+ "มหาตมะ"
+ "มหายาน"
+ "มหาราช"
+ "มหาวิทยาลัย"
+ "มหาศาล"
+ "มหาสมุทร"
+ "มหาหิงคุ์"
+ "มหิงส์"
+ "มหิดล"
+ "มหิมา"
+ "มหึมา"
+ "มอ"
+ "มอง"
+ "มองโà¸à¸¥à¸­à¸¢à¸”์"
+ "มอà¸"
+ "มอด"
+ "มอนิเตอร์"
+ "มอบ"
+ "มอม"
+ "มอมà¹à¸¡à¸¡"
+ "มอรอคโค"
+ "มอร์ฟีน"
+ "มอลโทส"
+ "มอสโคว์"
+ "มอเตอร์"
+ "มะ"
+ "มะà¸à¸£à¸¹à¸”"
+ "มะà¸à¸­à¸"
+ "มะà¸à¸°à¹‚รนี"
+ "มะขวิด"
+ "มะขาม"
+ "มะข่วง"
+ "มะค่า"
+ "มะงั่ว"
+ "มะงุมมะงาหรา"
+ "มะซาง"
+ "มะดัน"
+ "มะตะบะ"
+ "มะตึ่ง"
+ "มะตูม"
+ "มะต้อง"
+ "มะนาว"
+ "มะปราง"
+ "มะพร้าว"
+ "มะพลับ"
+ "มะพูด"
+ "มะม่วง"
+ "มะยม"
+ "มะระ"
+ "มะรืน"
+ "มะละà¸à¸­"
+ "มะลิ"
+ "มะหะหมัด"
+ "มะฮอà¸à¸à¸²à¸™à¸µ"
+ "มะเà¸à¸¥à¸·à¸­"
+ "มะเขือ"
+ "มะเดื่อ"
+ "มะเฟือง"
+ "มะเร็ง"
+ "มะเส็ง"
+ "มะà¹à¸¡"
+ "มะโรง"
+ "มะไฟ"
+ "มัà¸"
+ "มัà¸à¸à¸°à¸ªà¸±à¸™"
+ "มัคคุเทศà¸à¹Œ"
+ "มัคนายà¸"
+ "มัฆวาน"
+ "มังà¸à¸£"
+ "มังคุด"
+ "มังค่า"
+ "มัจจุ"
+ "มัจฉา"
+ "มัชฌิมยาม"
+ "มัชฌิมวัย"
+ "มัชฌิมา"
+ "มัณฑนศิลป์"
+ "มัณฑนา"
+ "มัด"
+ "มัตสยา"
+ "มัทนะ"
+ "มัทนียะ"
+ "มัทยะ"
+ "มัธยà¸à¸²à¸™"
+ "มัธยม"
+ "มัธยัสถ์"
+ "มัน"
+ "มับ"
+ "มัมมี่"
+ "มัย"
+ "มัลติ"
+ "มัลลิà¸à¸²"
+ "มัว"
+ "มัศยา"
+ "มัสตาร์ด"
+ "มัสมั่น"
+ "มัสยิด"
+ "มัสลิน"
+ "มั่ง"
+ "มั่น"
+ "มั่ว"
+ "มา"
+ "มาà¸"
+ "มาà¸à¸à¸§à¹ˆà¸²"
+ "มาฆบูชา"
+ "มาฆะ"
+ "มาณพ"
+ "มาณวิà¸à¸²"
+ "มาด"
+ "มาตร"
+ "มาตรà¸à¸²à¸£"
+ "มาตรà¸à¸²à¸™"
+ "มาตรา"
+ "มาตุ"
+ "มาตุลา"
+ "มาน"
+ "มานพ"
+ "มานะ"
+ "มานิต"
+ "มานี"
+ "มานุษ"
+ "มานุษยวิทยา"
+ "มาบตาพุด"
+ "มาย"
+ "มายา"
+ "มายาวี"
+ "มาร"
+ "มารค"
+ "มารดร"
+ "มารดา"
+ "มารยา"
+ "มารยาท"
+ "มารศรี"
+ "มารุต"
+ "มาลัย"
+ "มาลาเรีย"
+ "มาลี"
+ "มาศ"
+ "มาส"
+ "มาสเตอร์"
+ "มาเลเซีย"
+ "มาโคร"
+ "มาโนชà¸à¹Œ"
+ "มำเลือง"
+ "มิ"
+ "มิคสัà¸à¸à¸µ"
+ "มิจฉา"
+ "มิด"
+ "มิตร"
+ "มิติ"
+ "มิถุนายน"
+ "มิยันม่า"
+ "มิลลิà¸à¸£à¸±à¸¡"
+ "มิลลิบาร์"
+ "มิลลิลิตร"
+ "มิลลิเมตร"
+ "มิลาต"
+ "มิวสิค"
+ "มิส"
+ "มิสซา"
+ "มิสเตอร์"
+ "มิเตอร์"
+ "มิ่ง"
+ "มิ้ม"
+ "มี"
+ "มีด"
+ "มีน"
+ "มีนาคม"
+ "มีเทน"
+ "มี่"
+ "มี่สั้ว"
+ "มึง"
+ "มึน"
+ "มืด"
+ "มืน"
+ "มือ"
+ "มื่น"
+ "มื้อ"
+ "มุ"
+ "มุà¸"
+ "มุà¸à¸”า"
+ "มุà¸à¸”าหาร"
+ "มุข"
+ "มุง"
+ "มุจลินท์"
+ "มุด"
+ "มุตà¸à¸´à¸”"
+ "มุทิตา"
+ "มุทุ"
+ "มุนินทร์"
+ "มุนี"
+ "มุบ"
+ "มุบมิบ"
+ "มุม"
+ "มุสลิม"
+ "มุสา"
+ "มุ่ง"
+ "มุ่น"
+ "มุ่ย"
+ "มุ้ง"
+ "มูà¸"
+ "มูตร"
+ "มูน"
+ "มูมมาม"
+ "มูล"
+ "มูลค่า"
+ "มูลà¸à¸²à¸™"
+ "มูลนิธิ"
+ "มูเซอ"
+ "มู่ทู่"
+ "มู่ลี่"
+ "มเหศวร"
+ "มเหสี"
+ "มเหาฬาร"
+ "มโน"
+ "มโนราห์"
+ "มโนสาเร่"
+ "มโหรสพ"
+ "มโหระทึà¸"
+ "มโหรี"
+ "มโหฬาร"
+ "ม่วง"
+ "ม่วน"
+ "ม่อต้อ"
+ "ม่อย"
+ "ม่อฮ่อม"
+ "ม่าน"
+ "ม่าย"
+ "ม้วน"
+ "ม้วย"
+ "ม้า"
+ "ม้าน"
+ "ม้าม"
+ "ยà¸"
+ "ยà¸à¸¢à¹ˆà¸­à¸‡"
+ "ยง"
+ "ยงโย่"
+ "ยติ"
+ "ยถาà¸à¸£à¸£à¸¡"
+ "ยนตร์"
+ "ยนต์"
+ "ยม"
+ "ยมà¸"
+ "ยรรยง"
+ "ยล"
+ "ยวง"
+ "ยวด"
+ "ยวน"
+ "ยวบ"
+ "ยศ"
+ "ยอ"
+ "ยอà¸"
+ "ยอง"
+ "ยอด"
+ "ยอน"
+ "ยอบ"
+ "ยอม"
+ "ยะ"
+ "ยัà¸"
+ "ยัà¸à¸‚ินี"
+ "ยัà¸à¸‚์"
+ "ยัà¸à¸¢à¸­à¸"
+ "ยัà¸à¸©à¸´à¸“ี"
+ "ยัà¸à¸©à¸µ"
+ "ยัà¸à¸©à¹Œ"
+ "ยัง"
+ "ยัด"
+ "ยัดเยียด"
+ "ยัน"
+ "ยันตรà¸à¸£à¸£à¸¡"
+ "ยันตร์"
+ "ยันต์"
+ "ยับ"
+ "ยั่งยืน"
+ "ยั่น"
+ "ยั่ว"
+ "ยั้ง"
+ "ยั้ว"
+ "ยั้วเยี้ย"
+ "ยา"
+ "ยาà¸"
+ "ยาง"
+ "ยาจà¸"
+ "ยาด"
+ "ยาดา"
+ "ยาตร"
+ "ยาตรา"
+ "ยาน"
+ "ยานี"
+ "ยาบ"
+ "ยาบ้า"
+ "ยาม"
+ "ยาย"
+ "ยาว"
+ "ยำ"
+ "ยิà¸"
+ "ยิง"
+ "ยิน"
+ "ยิบ"
+ "ยิปซัม"
+ "ยิปซี"
+ "ยิมนาสติà¸"
+ "ยิว"
+ "ยิหวา"
+ "ยิ่ง"
+ "ยิ้ม"
+ "ยี"
+ "ยีน"
+ "ยีราฟ"
+ "ยี่"
+ "ยี่สà¸"
+ "ยี่สง"
+ "ยี่สุ่น"
+ "ยี่ส่าน"
+ "ยี่หระ"
+ "ยี่หร่า"
+ "ยี่ห้อ"
+ "ยึà¸à¸¢à¸·à¸­"
+ "ยึด"
+ "ยืด"
+ "ยืน"
+ "ยืม"
+ "ยื่น"
+ "ยื้อ"
+ "ยุ"
+ "ยุà¸à¸•์"
+ "ยุค"
+ "ยุคล"
+ "ยุง"
+ "ยุด"
+ "ยุติ"
+ "ยุติธรรม"
+ "ยุทธ"
+ "ยุทธà¸à¸²à¸£"
+ "ยุทธนา"
+ "ยุทธ์"
+ "ยุทโธปà¸à¸£à¸“์"
+ "ยุบ"
+ "ยุพดี"
+ "ยุพยง"
+ "ยุพราช"
+ "ยุพเยาว์"
+ "ยุพเรศ"
+ "ยุรยาตร"
+ "ยุวชน"
+ "ยุโรป"
+ "ยุ่ง"
+ "ยุ่มย่าม"
+ "ยุ่ย"
+ "ยุ้ง"
+ "ยุ้ย"
+ "ยูง"
+ "ยูนิà¸à¸‹à¹Œ"
+ "ยูรยาตร"
+ "ยูริà¸"
+ "ยูสเซอร์"
+ "ยูเรนัส"
+ "ยูเรเนียม"
+ "ยูโà¸à¸ªà¸¥à¸²à¹€à¸§à¸µà¸¢"
+ "ยูโด"
+ "ยูโร"
+ "ยู่"
+ "ยโส"
+ "ย่น"
+ "ย่อ"
+ "ย่อง"
+ "ย่อม"
+ "ย่อย"
+ "ย่ะ"
+ "ย่า"
+ "ย่าง"
+ "ย่าน"
+ "ย่าม"
+ "ย่ำ"
+ "ย้วย"
+ "ย้อน"
+ "ย้อม"
+ "ย้อย"
+ "ย้าย"
+ "ย้ำ"
+ "รà¸"
+ "รง"
+ "รงควัตถุ"
+ "รงค์"
+ "รจนา"
+ "รจิต"
+ "รจเรจ"
+ "รจเลข"
+ "รณ"
+ "รณัà¸"
+ "รด"
+ "รดี"
+ "รตะ"
+ "รติ"
+ "รถ"
+ "รถเมล์"
+ "รน"
+ "รบ"
+ "รพ"
+ "รพี"
+ "รม"
+ "รมณี"
+ "รมณีย์"
+ "รมย์"
+ "รยางค์"
+ "รวà¸"
+ "รวง"
+ "รวด"
+ "รวน"
+ "รวนเร"
+ "รวบ"
+ "รวม"
+ "รวย"
+ "รวิ"
+ "รวี"
+ "รศนา"
+ "รส"
+ "รสนา"
+ "รสายนเวท"
+ "รสิà¸"
+ "รหัส"
+ "รหิต"
+ "รอ"
+ "รอà¸"
+ "รอง"
+ "รองเง็ง"
+ "รอด"
+ "รอน"
+ "รอบ"
+ "รอบคอบ"
+ "รอม"
+ "รอย"
+ "ระ"
+ "ระà¸à¸³"
+ "ระคน"
+ "ระคาย"
+ "ระฆัง"
+ "ระงม"
+ "ระงับ"
+ "ระดม"
+ "ระดับ"
+ "ระดู"
+ "ระทด"
+ "ระทม"
+ "ระทวย"
+ "ระทึà¸"
+ "ระนาด"
+ "ระนาบ"
+ "ระนาว"
+ "ระบบ"
+ "ระบม"
+ "ระบอบ"
+ "ระบับ"
+ "ระบาà¸"
+ "ระบาด"
+ "ระบาย"
+ "ระบำ"
+ "ระบิล"
+ "ระบือ"
+ "ระบุ"
+ "ระยะ"
+ "ระยับ"
+ "ระยำ"
+ "ระยิบ"
+ "ระย้า"
+ "ระริà¸"
+ "ระลอà¸"
+ "ระลึà¸"
+ "ระวัง"
+ "ระวาง"
+ "ระหว่าง"
+ "ระหุย"
+ "ระอา"
+ "ระอุ"
+ "ระเนน"
+ "ระเนระนาด"
+ "ระเนียด"
+ "ระเบิด"
+ "ระเบียง"
+ "ระเบียน"
+ "ระเบียบ"
+ "ระเบ็ง"
+ "ระเมียร"
+ "ระเหย"
+ "ระเหิด"
+ "ระเห็จ"
+ "ระà¹à¸„ะ"
+ "ระà¹à¸‡à¹‰"
+ "ระà¹à¸™à¸‡"
+ "ระà¹à¸§à¸‡"
+ "รัà¸"
+ "รัà¸à¸‚์"
+ "รัà¸à¸šà¸µà¹‰"
+ "รัà¸à¸©à¸²"
+ "รัà¸à¸©à¹Œ"
+ "รัà¸à¹à¸£à¹‰"
+ "รัง"
+ "รังสิต"
+ "รังสี"
+ "รังà¹à¸"
+ "รังà¹à¸„"
+ "รัจฉา"
+ "รัช"
+ "รัชฎาภิเษà¸"
+ "รัชดาภิเษà¸"
+ "รัชนี"
+ "รัà¸à¸ˆà¸§à¸™"
+ "รัà¸"
+ "รัà¸à¸šà¸²à¸¥"
+ "รัà¸à¸šà¸¸à¸£à¸¸à¸©"
+ "รัà¸à¸›à¸£à¸°à¸¨à¸²à¸ªà¸™à¸¨à¸²à¸ªà¸•ร์"
+ "รัà¸à¸›à¸£à¸°à¸«à¸²à¸£"
+ "รัà¸à¸¡à¸™à¸•รี"
+ "รัà¸à¸§à¸´à¸ªà¸²à¸«à¸à¸´à¸ˆ"
+ "รัà¸à¸¨à¸²à¸ªà¸•ร์"
+ "รัà¸à¸ªà¸ à¸²"
+ "รัด"
+ "รัต"
+ "รัตติ"
+ "รัตน"
+ "รัตนตรัย"
+ "รัตนบัลลังà¸à¹Œ"
+ "รัตนะ"
+ "รัตนา"
+ "รัตนโà¸à¸ªà¸´à¸™à¸—ร์"
+ "รัตน์"
+ "รัถยา"
+ "รัน"
+ "รันทด"
+ "รับ"
+ "รับรอง"
+ "รัมภา"
+ "รัมมี่"
+ "รัว"
+ "รัศมิมัต"
+ "รัศมิมาน"
+ "รัศมี"
+ "รัษฎาà¸à¸£"
+ "รัสเซีย"
+ "รั่ว"
+ "รั้ง"
+ "รั้น"
+ "รั้ว"
+ "รา"
+ "ราà¸"
+ "ราà¸à¸©à¸ª"
+ "ราคะ"
+ "ราคา"
+ "ราคิน"
+ "ราคี"
+ "ราง"
+ "รางชาง"
+ "รางวัล"
+ "ราช"
+ "ราชà¸à¸²à¸£"
+ "ราชนิà¸à¸¸à¸¥"
+ "ราชบัณฑิตยสถาน"
+ "ราชย์"
+ "ราชวงศ์"
+ "ราชวโรงà¸à¸²à¸£"
+ "ราชสีมา"
+ "ราชสีห์"
+ "ราชันย์"
+ "ราชา"
+ "ราชาธิราช"
+ "ราชาภิเษà¸"
+ "ราชาวดี"
+ "ราชินิà¸à¸¸à¸¥"
+ "ราชินี"
+ "ราชินูปถัมภ์"
+ "ราชูปถัมภ์"
+ "ราชูปโภค"
+ "ราà¸"
+ "ราด"
+ "ราต"
+ "ราตร"
+ "ราตรี"
+ "ราน"
+ "ราบ"
+ "ราพณาสูร"
+ "ราม"
+ "รามคำà¹à¸«à¸‡"
+ "รามสูร"
+ "รามัà¸"
+ "รามา"
+ "รามาธิบดี"
+ "รามเà¸à¸µà¸¢à¸£à¸•ิ์"
+ "ราย"
+ "รายà¸à¸²à¸£"
+ "รายงาน"
+ "ราว"
+ "ราวี"
+ "ราศี"
+ "ราษฎร"
+ "ราษฎร์"
+ "ราหู"
+ "ราเชนทร์"
+ "ราโชบาย"
+ "ราโชวาท"
+ "รำ"
+ "รำคาà¸"
+ "รำจวน"
+ "รำพัน"
+ "รำพึง"
+ "รำมะนา"
+ "รำลึà¸"
+ "รำเพย"
+ "ริ"
+ "ริà¸"
+ "ริดสีดวง"
+ "ริน"
+ "ริบ"
+ "ริบบิ้น"
+ "ริม"
+ "ริษยา"
+ "ริ้น"
+ "ริ้ว"
+ "รี"
+ "รีจิสทรี"
+ "รีด"
+ "รีต"
+ "รีบ"
+ "รีม"
+ "รีวิว"
+ "รีเสิร์ช"
+ "รีเสิร์ซ"
+ "รีโมต"
+ "รี่"
+ "รี้"
+ "รึง"
+ "รึ้ง"
+ "รื่น"
+ "รื้อ"
+ "รุ"
+ "รุà¸"
+ "รุà¸à¸‚à¸à¸°"
+ "รุà¸à¸‚ชาติ"
+ "รุà¸à¸‚มูล"
+ "รุà¸à¸‚เทวดา"
+ "รุà¸à¸‚์"
+ "รุงรัง"
+ "รุจิ"
+ "รุจี"
+ "รุด"
+ "รุต"
+ "รุทธ์"
+ "รุทร"
+ "รุน"
+ "รุนà¹à¸£à¸‡"
+ "รุบรู่"
+ "รุม"
+ "รุษà¸à¹Œ"
+ "รุสโซ"
+ "รุ่ง"
+ "รุ่น"
+ "รุ่ม"
+ "รุ่มร่าม"
+ "รุ่ย"
+ "รุ้ง"
+ "รู"
+ "รูด"
+ "รูป"
+ "รูมาเนีย"
+ "รูสเซีย"
+ "รูเมเนีย"
+ "รูเล็ตต์"
+ "รู่"
+ "รู้"
+ "รู้จัà¸"
+ "รโห"
+ "ร่น"
+ "ร่ม"
+ "ร่วง"
+ "ร่วน"
+ "ร่วม"
+ "ร่อ"
+ "ร่อง"
+ "ร่อน"
+ "ร่อย"
+ "ร่า"
+ "ร่าง"
+ "ร่าน"
+ "ร่าย"
+ "ร่ำ"
+ "ร่ำรวย"
+ "ร้น"
+ "ร้อง"
+ "ร้อน"
+ "ร้อย"
+ "ร้า"
+ "ร้าง"
+ "ร้าน"
+ "ร้าย"
+ "ร้าว"
+ "ฤà¸à¸©à¹Œ"
+ "ฤชา"
+ "ฤชุ"
+ "ฤณ"
+ "ฤดี"
+ "ฤดู"
+ "ฤต"
+ "ฤทธา"
+ "ฤทธิ์"
+ "ฤทัย"
+ "ฤษภ"
+ "ฤษี"
+ "ฤๅ"
+ "ลง"
+ "ลด"
+ "ลดา"
+ "ลดาวัลย์"
+ "ลน"
+ "ลบ"
+ "ลพบุรี"
+ "ลม"
+ "ลลนา"
+ "ลลาà¸"
+ "ลลิต"
+ "ลวà¸"
+ "ลวง"
+ "ลวด"
+ "ลวนลาม"
+ "ลวนะ"
+ "ลวะ"
+ "ลหุ"
+ "ลอà¸"
+ "ลอà¸à¸²à¸£à¸´à¸—ึม"
+ "ลอง"
+ "ลองà¸à¸­à¸‡"
+ "ลองจิจูด"
+ "ลอด"
+ "ลอตเตอรี่"
+ "ลอน"
+ "ลอนดอน"
+ "ลอบ"
+ "ลอม"
+ "ลอย"
+ "ลออ"
+ "ละ"
+ "ละคร"
+ "ละติจูด"
+ "ละติน"
+ "ละบัด"
+ "ละมั่ง"
+ "ละมุน"
+ "ละม่อม"
+ "ละม้าย"
+ "ละลวย"
+ "ละหมาด"
+ "ละหาน"
+ "ละหุ่ง"
+ "ละออง"
+ "ละอาย"
+ "ละเมอ"
+ "ละเมาะ"
+ "ละเมิด"
+ "ละเมียด"
+ "ละเลง"
+ "ละเลิง"
+ "ละเลียด"
+ "ละเวง"
+ "ละเหี่ย"
+ "ละเอียด"
+ "ละà¹à¸§à¸"
+ "ละโมบ"
+ "ละโว้"
+ "ละไม"
+ "ลัà¸"
+ "ลัà¸à¸‚ณะ"
+ "ลัà¸à¸©à¸“ะ"
+ "ลัà¸à¸©à¸¡à¸µ"
+ "ลัคคะ"
+ "ลัคนา"
+ "ลัคน์"
+ "ลัง"
+ "ลังเล"
+ "ลัชชา"
+ "ลัชชี"
+ "ลัà¸à¸ˆà¸à¸£"
+ "ลัà¸à¸ˆà¸™à¹Œ"
+ "ลัà¸à¸‰"
+ "ลัà¸à¸‰à¸à¸£"
+ "ลัà¸à¸‰à¸™à¹Œ"
+ "ลัด"
+ "ลัดา"
+ "ลัทธิ"
+ "ลัทธ์"
+ "ลัน"
+ "ลับ"
+ "ลัพธ์"
+ "ลัย"
+ "ลั่น"
+ "ลั่นทม"
+ "ลา"
+ "ลาà¸"
+ "ลาง"
+ "ลาà¸"
+ "ลาด"
+ "ลาน"
+ "ลาบ"
+ "ลาป"
+ "ลาภ"
+ "ลาม"
+ "ลามà¸"
+ "ลาย"
+ "ลายสือ"
+ "ลาลนะ"
+ "ลาลส"
+ "ลาว"
+ "ลาวà¸"
+ "ลาวัณย์"
+ "ลาวา"
+ "ลาสนะ"
+ "ลำ"
+ "ลำดวน"
+ "ลำดับ"
+ "ลำบาà¸"
+ "ลำพวน"
+ "ลำพอง"
+ "ลำพัง"
+ "ลำภุขัน"
+ "ลำยอง"
+ "ลำเค็à¸"
+ "ลำเจียà¸"
+ "ลำเนา"
+ "ลำเพา"
+ "ลำเลิà¸"
+ "ลำเลียง"
+ "ลำโพง"
+ "ลำไย"
+ "ลิ"
+ "ลิà¸à¹„นต์"
+ "ลิขสิทธิ์"
+ "ลิขิต"
+ "ลิง"
+ "ลิงà¸à¹Œ"
+ "ลิงค์"
+ "ลิด"
+ "ลิต"
+ "ลิตมัส"
+ "ลิตร"
+ "ลินิน"
+ "ลิบ"
+ "ลิปดา"
+ "ลิปต์"
+ "ลิปสติà¸"
+ "ลิปิ"
+ "ลิฟต์"
+ "ลิลิต"
+ "ลิว"
+ "ลิสง"
+ "ลิเà¸"
+ "ลิเบีย"
+ "ลิเวอร์พูล"
+ "ลิ่ม"
+ "ลิ่ว"
+ "ลิ้น"
+ "ลิ้นจี่"
+ "ลิ้ม"
+ "ลี"
+ "ลีà¸"
+ "ลีนุà¸à¸‹à¹Œ"
+ "ลีบ"
+ "ลีลา"
+ "ลีลาศ"
+ "ลี่"
+ "ลี้"
+ "ลึà¸"
+ "ลึงค์"
+ "ลืด"
+ "ลืบ"
+ "ลืม"
+ "ลือ"
+ "ลื่น"
+ "ลื่อ"
+ "ลื้น"
+ "ลื้อ"
+ "ลุ"
+ "ลุà¸"
+ "ลุง"
+ "ลุย"
+ "ลุ่น"
+ "ลุ่ม"
+ "ลุ่ย"
+ "ลุ้ง"
+ "ลุ้ย"
+ "ลูà¸"
+ "ลูà¸à¸„้า"
+ "ลูà¸à¸šà¸²à¸¨à¸à¹Œ"
+ "ลูบ"
+ "ลู่"
+ "ล็อà¸à¹€à¸à¸•"
+ "ล่น"
+ "ล่ม"
+ "ล่วง"
+ "ล่วม"
+ "ล่อ"
+ "ล่อง"
+ "ล่อน"
+ "ล่อย"
+ "ล่อà¹à¸¥à¹ˆ"
+ "ล่ะ"
+ "ล่า"
+ "ล่าง"
+ "ล่าน"
+ "ล่าม"
+ "ล่ำ"
+ "ล้งเล้ง"
+ "ล้น"
+ "ล้ม"
+ "ล้วง"
+ "ล้วน"
+ "ล้อ"
+ "ล้อม"
+ "ล้า"
+ "ล้าง"
+ "ล้าต้า"
+ "ล้าน"
+ "ล้ำ"
+ "วà¸"
+ "วà¸à¸°"
+ "วง"
+ "วงà¸à¸•"
+ "วงà¸à¹Œ"
+ "วงจร"
+ "วงศà¸à¸£"
+ "วงศา"
+ "วงศ์"
+ "วจนะ"
+ "วจะ"
+ "วจี"
+ "วชะ"
+ "วชิระ"
+ "วชิราวุธ"
+ "วณบัตร"
+ "วณพันธน์"
+ "วณะ"
+ "วณิช"
+ "วณิชชา"
+ "วณิชยา"
+ "วณิชย์"
+ "วณิพà¸"
+ "วดี"
+ "วตะ"
+ "วทะ"
+ "วทัà¸à¸à¸¸à¸•า"
+ "วธุà¸à¸²"
+ "วธู"
+ "วน"
+ "วนัส"
+ "วนา"
+ "วนานต์"
+ "วนิดา"
+ "วนิพà¸"
+ "วยัสย์"
+ "วรงค์"
+ "วรณะ"
+ "วรมหาวิหาร"
+ "วรรค"
+ "วรรคย์"
+ "วรรช"
+ "วรรชย์"
+ "วรรณà¸à¸£à¸£à¸¡"
+ "วรรณคดี"
+ "วรรณนา"
+ "วรรณพฤติ"
+ "วรรณยุà¸à¸•์"
+ "วรรณยุต"
+ "วรรณศิลป์"
+ "วรรณะ"
+ "วรรณึà¸"
+ "วรรธà¸"
+ "วรรธนะ"
+ "วรรษ"
+ "วรรษา"
+ "วรวิหาร"
+ "วรัà¸à¸à¸¹"
+ "วรางคนา"
+ "วราหะ"
+ "วราห์"
+ "วรุณ"
+ "วลัà¸à¸Šà¸™à¹Œ"
+ "วลัย"
+ "วลาหà¸"
+ "วลี"
+ "วศะ"
+ "วสสะ"
+ "วสสี"
+ "วสะ"
+ "วสันตดิลà¸"
+ "วสันต์"
+ "วสา"
+ "วสี"
+ "วสุ"
+ "วสุธา"
+ "วสุนธรา"
+ "วสุมดี"
+ "วหะ"
+ "วหา"
+ "วอ"
+ "วอà¸"
+ "วอà¸à¹à¸§à¸"
+ "วอด"
+ "วอน"
+ "วอร์à¹à¸£à¸™à¸—์"
+ "วอลล์สตรีท"
+ "วอลเลย์"
+ "วอลเลย์บอล"
+ "วอà¹à¸§"
+ "วะ"
+ "วัà¸"
+ "วัà¸à¸à¸°"
+ "วัค"
+ "วัคคีย์"
+ "วัคคุ"
+ "วัคซีน"
+ "วัง"
+ "วังà¸à¹Œ"
+ "วังเวง"
+ "วัจนะ"
+ "วัช"
+ "วัชฌ์"
+ "วัชระ"
+ "วัชรินทร์"
+ "วัชรี"
+ "วัà¸à¸ˆà¸±à¸à¸£"
+ "วัà¸à¸à¸´"
+ "วัà¸à¸ªà¸‡à¸ªà¸²à¸£"
+ "วัฒà¸à¸°"
+ "วัฒà¸à¸µ"
+ "วัฒนธรรม"
+ "วัฒนะ"
+ "วัฒนา"
+ "วัณ"
+ "วัณà¸à¹Œ"
+ "วัณนา"
+ "วัด"
+ "วัต"
+ "วัตตา"
+ "วัตต์"
+ "วัตถุ"
+ "วัตถ์"
+ "วัตนะ"
+ "วัตร"
+ "วัติ"
+ "วัน"
+ "วันทนา"
+ "วันทนีย์"
+ "วันทยหัตถ์"
+ "วันทยาวุธ"
+ "วันทา"
+ "วับ"
+ "วัปปะ"
+ "วัมมิà¸"
+ "วัย"
+ "วัลย์"
+ "วัลลภ"
+ "วัลลี"
+ "วัว"
+ "วัสดุ"
+ "วัสสะ"
+ "วัสสานะ"
+ "วัสโสทà¸"
+ "วา"
+ "วาà¸"
+ "วาà¸à¸¢à¸ªà¸±à¸¡à¸žà¸±à¸™à¸˜à¹Œ"
+ "วาà¸à¸¢à¸°"
+ "วาง"
+ "วาจà¸"
+ "วาจา"
+ "วาณิช"
+ "วาณิชย์"
+ "วาณี"
+ "วาด"
+ "วาตภัย"
+ "วาตะ"
+ "วาท"
+ "วาทà¸"
+ "วาทยà¸à¸£"
+ "วาทย์"
+ "วาทิต"
+ "วาทิน"
+ "วาที"
+ "วาน"
+ "วานร"
+ "วานรินทร์"
+ "วาบ"
+ "วาปะ"
+ "วาปิตะ"
+ "วาปี"
+ "วาม"
+ "วามะ"
+ "วาย"
+ "วายทูเค"
+ "วายสะ"
+ "วาร"
+ "วารสาร"
+ "วาริ"
+ "วารี"
+ "วารุณ"
+ "วารุณี"
+ "วาล"
+ "วาล์ว"
+ "วาว"
+ "วาสนะ"
+ "วาสนา"
+ "วาสพ"
+ "วาหะ"
+ "วาหินี"
+ "วาฬ"
+ "วิà¸à¸£à¸¡"
+ "วิà¸à¸¤à¸•"
+ "วิà¸à¸¤à¸•à¸à¸²à¸£à¸“์"
+ "วิà¸à¸¤à¸•ิ"
+ "วิà¸à¸¥"
+ "วิà¸à¸ªà¸´à¸•"
+ "วิà¸à¸±à¸›"
+ "วิà¸à¸²à¸¥"
+ "วิคหะ"
+ "วิง"
+ "วิงวอน"
+ "วิจยุต"
+ "วิจรณะ"
+ "วิจล"
+ "วิจัà¸à¸‚ณ์"
+ "วิจัà¸à¸©à¸“์"
+ "วิจัย"
+ "วิจาร"
+ "วิจารณà¸à¸²à¸“"
+ "วิจารณ์"
+ "วิจิ"
+ "วิจิà¸à¸´à¸ˆà¸‰à¸²"
+ "วิจิต"
+ "วิจิตร"
+ "วิจิน"
+ "วิจุณ"
+ "วิจุรณ"
+ "วิชชา"
+ "วิชชุ"
+ "วิชชุลดา"
+ "วิชà¸à¸°"
+ "วิชนี"
+ "วิชา"
+ "วิชานนะ"
+ "วิชิต"
+ "วิà¸à¸à¸±à¸•ิ"
+ "วิà¸à¸à¸²à¸“"
+ "วิà¸à¸à¸¹"
+ "วิฑูรย์"
+ "วิด"
+ "วิดีโอ"
+ "วิตà¸"
+ "วิตถาร"
+ "วิตามิน"
+ "วิถี"
+ "วิทยà¸à¸²à¸™à¸°"
+ "วิทยา"
+ "วิทยาลัย"
+ "วิทยุ"
+ "วิทยุต"
+ "วิทวัส"
+ "วิทารณ์"
+ "วิทาลน์"
+ "วิทิต"
+ "วิทู"
+ "วิทูร"
+ "วิธ"
+ "วิธวา"
+ "วิธา"
+ "วิธาน"
+ "วิธี"
+ "วิธูปนะ"
+ "วินันตู"
+ "วินัย"
+ "วินาที"
+ "วินาศ"
+ "วินิจ"
+ "วินิจฉัย"
+ "วินิต"
+ "วินิบาต"
+ "วินิปาติà¸"
+ "วินโดวส์"
+ "วินโดว์"
+ "วิบัติ"
+ "วิบาà¸"
+ "วิบุล"
+ "วิบุลย์"
+ "วิบูล"
+ "วิบูลย์"
+ "วิปà¸à¸²à¸£"
+ "วิปà¸à¸´à¸ªà¸²à¸£"
+ "วิประà¸à¸²à¸£"
+ "วิประติสาร"
+ "วิประลาป"
+ "วิประวาส"
+ "วิปริต"
+ "วิปลาป"
+ "วิปลาส"
+ "วิปวาส"
+ "วิปัà¸à¸©à¹Œ"
+ "วิปัสสà¸"
+ "วิปัสสนา"
+ "วิปโยค"
+ "วิพาà¸à¸©à¹Œ"
+ "วิพิธทัศนา"
+ "วิภวตัณหา"
+ "วิภังค์"
+ "วิภัช"
+ "วิภัตติ"
+ "วิภา"
+ "วิภาวดี"
+ "วิมัติ"
+ "วิมุต"
+ "วิมุตติ"
+ "วิรตะ"
+ "วิรมณะ"
+ "วิรรรธน์"
+ "วิรวะ"
+ "วิรัช"
+ "วิรัต"
+ "วิรัติ"
+ "วิริยภาพ"
+ "วิริยะ"
+ "วิรุธ"
+ "วิรุฬหà¸"
+ "วิรุฬห์"
+ "วิลันดา"
+ "วิลาด"
+ "วิลาป"
+ "วิลาวัณย์"
+ "วิลาศ"
+ "วิลาส"
+ "วิลาสินี"
+ "วิว"
+ "วิวรณ์"
+ "วิวระ"
+ "วิวัà¸"
+ "วิวัฒนาà¸à¸²à¸£"
+ "วิวัฒน์"
+ "วิวาท"
+ "วิวาหมงคล"
+ "วิวาหะ"
+ "วิวาห์"
+ "วิวิจ"
+ "วิวิต"
+ "วิวิธ"
+ "วิศรุต"
+ "วิศวà¸à¸£"
+ "วิศวà¸à¸£à¸£à¸¡"
+ "วิศัลย์"
+ "วิศาขะ"
+ "วิศาขา"
+ "วิศางค์"
+ "วิศาล"
+ "วิศิษà¸à¹Œ"
+ "วิศุทธิ์"
+ "วิศุทธ์"
+ "วิษณุ"
+ "วิษธร"
+ "วิษัà¸à¸•์"
+ "วิษัย"
+ "วิษาณ"
+ "วิษุวัต"
+ "วิสà¸à¸µà¹‰"
+ "วิสรรชนีย์"
+ "วิสฤต"
+ "วิสสุà¸à¸£à¸£à¸¡"
+ "วิสัชนา"
+ "วิสัà¸à¸à¸µ"
+ "วิสัย"
+ "วิสาขบูชา"
+ "วิสาขะ"
+ "วิสามัà¸"
+ "วิสาสะ"
+ "วิสาหà¸à¸´à¸ˆ"
+ "วิสิà¸"
+ "วิสุงคามสีมา"
+ "วิสุทธิ์"
+ "วิสุทธ์"
+ "วิสูตร"
+ "วิหค"
+ "วิหงค์"
+ "วิหลั่น"
+ "วิหายสะ"
+ "วิหาร"
+ "วิหิงสะ"
+ "วิหิงสา"
+ "วิฬังค์"
+ "วิฬาร"
+ "วิฬาร์"
+ "วิเคราะห์"
+ "วิเชียร"
+ "วิเทวษ"
+ "วิเทศ"
+ "วิเทโศบาย"
+ "วิเนต"
+ "วิเยน"
+ "วิเรนทร์"
+ "วิเลป"
+ "วิเวà¸"
+ "วิเศษ"
+ "วิเศษณ์"
+ "วิเสท"
+ "วิเหสา"
+ "วิโนทà¸"
+ "วิโมà¸à¸‚์"
+ "วิโยค"
+ "วิโรจ"
+ "วิโรจน์"
+ "วิโรฒ"
+ "วิโรธ"
+ "วิโรธน์"
+ "วิโลจนะ"
+ "วิไล"
+ "วิ่ง"
+ "วิ่งเปี้ยว"
+ "วิ่น"
+ "วี"
+ "วีจิ"
+ "วีชนี"
+ "วีซ่า"
+ "วีณา"
+ "วีรà¸à¸£à¸£à¸¡"
+ "วีรชน"
+ "วีรบุรุษ"
+ "วีรสตรี"
+ "วี่วัน"
+ "วี่à¹à¸§à¸§"
+ "วี้ด"
+ "วุà¸à¸´"
+ "วุฒ"
+ "วุฒิ"
+ "วุด"
+ "วุบ"
+ "วุ่น"
+ "วุ้ง"
+ "วุ้น"
+ "วุ้ย"
+ "วูดวาด"
+ "วูธู"
+ "วูบ"
+ "วู่วาม"
+ "วู้"
+ "วเนจร"
+ "วโนทยาน"
+ "วโร"
+ "วโรà¸à¸²à¸ª"
+ "วโรดม"
+ "ว่อง"
+ "ว่อน"
+ "ว่า"
+ "ว่าง"
+ "ว่าน"
+ "ว่าย"
+ "ว่าว"
+ "ว้า"
+ "ว้าง"
+ "ว้าย"
+ "ศà¸"
+ "ศต"
+ "ศตวรรษ"
+ "ศพ"
+ "ศร"
+ "ศรัทธา"
+ "ศรัย"
+ "ศรี"
+ "ศรีวิไลฤทธิ์"
+ "ศรีษะเà¸à¸©"
+ "ศฤงคาร"
+ "ศศิ"
+ "ศอ"
+ "ศอà¸"
+ "ศัà¸à¸”า"
+ "ศัà¸à¸”ินา"
+ "ศัà¸à¸”ิ์"
+ "ศัà¸à¸¢à¸ à¸²à¸ž"
+ "ศัà¸à¸¢à¸°"
+ "ศัà¸à¸¢à¹Œ"
+ "ศัà¸à¸£à¸²à¸Š"
+ "ศัตรู"
+ "ศัพท์"
+ "ศัลยà¸à¸£à¸£à¸¡"
+ "ศัลยศาสตร์"
+ "ศัลยà¹à¸žà¸—ย์"
+ "ศัลย์"
+ "ศาà¸à¸¢à¸žà¸¸à¸—ธ"
+ "ศาà¸à¸¢à¸¡à¸¸à¸™à¸µ"
+ "ศาà¸à¸¢à¸°"
+ "ศาตราจารย์"
+ "ศานติ"
+ "ศานต์"
+ "ศารท"
+ "ศารทูล"
+ "ศาล"
+ "ศาลา"
+ "ศาสà¸"
+ "ศาสดา"
+ "ศาสตรา"
+ "ศาสตราจารย์"
+ "ศาสตร์"
+ "ศาสนจัà¸à¸£"
+ "ศาสนา"
+ "ศาสนูปถัมภà¸"
+ "ศาสน์"
+ "ศิขริน"
+ "ศิริราช"
+ "ศิลปà¸à¸£"
+ "ศิลปà¸à¸£à¸£à¸¡"
+ "ศิลปà¸à¸²à¸£"
+ "ศิลปà¸à¸´à¸ˆ"
+ "ศิลปวิทยา"
+ "ศิลปศาสตร์"
+ "ศิลปะ"
+ "ศิลปาà¸à¸£"
+ "ศิลปิน"
+ "ศิลปี"
+ "ศิลป์"
+ "ศิลา"
+ "ศิวลึงค์"
+ "ศิวะ"
+ "ศิวเวท"
+ "ศิวโมà¸à¸‚์"
+ "ศิษย์"
+ "ศิโรราบ"
+ "ศีรษะ"
+ "ศีล"
+ "ศึà¸"
+ "ศึà¸à¸©à¸²"
+ "ศึà¸à¸©à¸²à¸˜à¸´à¸à¸²à¸£"
+ "ศึà¸à¸©à¸²à¸™à¸´à¹€à¸—ศà¸à¹Œ"
+ "ศุà¸à¸£à¹Œ"
+ "ศุภà¸à¸£"
+ "ศุภนิมิต"
+ "ศุภมัสดุ"
+ "ศุภมาตรา"
+ "ศุภมาส"
+ "ศุภอัà¸à¸©à¸£"
+ "ศุภางค์"
+ "ศุภเคราะห์"
+ "ศุลà¸à¸²à¸à¸£"
+ "ศุลà¸à¸²à¸£à¸±à¸à¸©à¹Œ"
+ "ศุลี"
+ "ศูทร"
+ "ศูนย์"
+ "สà¸"
+ "สà¸à¸™à¸˜à¹Œ"
+ "สà¸à¸›à¸£à¸"
+ "สà¸à¸¥"
+ "สà¸à¸§à¸²à¸—ี"
+ "สà¸à¸­à¸•à¹à¸¥à¸™à¸”์"
+ "สà¸à¸±à¸”"
+ "สà¸à¸²"
+ "สà¸à¸²à¸§"
+ "สà¸à¸µ"
+ "สà¸à¸¸à¸“"
+ "สà¸à¸¸à¸“า"
+ "สà¸à¸¸à¸“ี"
+ "สà¸à¸¸à¸™à¸•์"
+ "สà¸à¸¸à¸¥"
+ "สà¸à¹‡à¸­à¸•à¹à¸¥à¸™à¸”์"
+ "สง"
+ "สงà¸à¸£à¸²à¸™à¸•์"
+ "สงà¸à¸²"
+ "สงขลา"
+ "สงคราม"
+ "สงฆ์"
+ "สงบ"
+ "สงวน"
+ "สงสัย"
+ "สงสาร"
+ "สงสารวัà¸"
+ "สงัด"
+ "สงเคราะห์"
+ "สง่า"
+ "สณฑ์"
+ "สด"
+ "สดมภ์"
+ "สดับ"
+ "สดุดี"
+ "สตรี"
+ "สตอà¸"
+ "สตัฟฟ์"
+ "สตางค์"
+ "สตาร์ท"
+ "สติ"
+ "สติ๊à¸à¹€à¸à¸­à¸£à¹Œ"
+ "สตู"
+ "สต๊อà¸"
+ "สถล"
+ "สถาน"
+ "สถานà¸à¸²à¸£à¸“์"
+ "สถานะ"
+ "สถานี"
+ "สถาบัน"
+ "สถาปนา"
+ "สถาปนิà¸"
+ "สถาปัตยà¸à¸£à¸£à¸¡"
+ "สถาพร"
+ "สถาวร"
+ "สถิต"
+ "สถิตย"
+ "สถิตยศาสตร์"
+ "สถิตย์"
+ "สถิติ"
+ "สถุล"
+ "สถูป"
+ "สทอพ"
+ "สน"
+ "สนทนา"
+ "สนธยา"
+ "สนธิ"
+ "สนนราคา"
+ "สนม"
+ "สนอง"
+ "สนับ"
+ "สนับสนุน"
+ "สนั่น"
+ "สนาน"
+ "สนาม"
+ "สนิท"
+ "สนิม"
+ "สนุà¸"
+ "สนุ่น"
+ "สนเทศ"
+ "สนเท่ห์"
+ "สนใจ"
+ "สบ"
+ "สบง"
+ "สบถ"
+ "สบาย"
+ "สบู่"
+ "สปริง"
+ "สปาย"
+ "สปาเà¸à¸•ตี"
+ "สปิริต"
+ "สภา"
+ "สภาพ"
+ "สภาพัฒน์"
+ "สภาวะ"
+ "สม"
+ "สมà¸à¸²à¸£"
+ "สมควร"
+ "สมà¸à¸²"
+ "สมณศัà¸à¸”ิ์"
+ "สมณะ"
+ "สมดุล"
+ "สมถะ"
+ "สมนาคุณ"
+ "สมบัติ"
+ "สมบูรณาà¸à¸²à¸ªà¸´à¸—ธิราชย์"
+ "สมบูรณ์"
+ "สมประดี"
+ "สมปฤดี"
+ "สมภพ"
+ "สมภาร"
+ "สมมต"
+ "สมมติ"
+ "สมมาตร"
+ "สมมุติ"
+ "สมร"
+ "สมรรถ"
+ "สมรรถนะ"
+ "สมรส"
+ "สมอ"
+ "สมอง"
+ "สมัคร"
+ "สมัชชา"
+ "สมัน"
+ "สมัย"
+ "สมา"
+ "สมาคม"
+ "สมาจาร"
+ "สมาชิà¸"
+ "สมาธิ"
+ "สมาน"
+ "สมาบัติ"
+ "สมาส"
+ "สมิง"
+ "สมิต"
+ "สมี"
+ "สมุà¸à¸à¸²à¸™"
+ "สมุด"
+ "สมุทร"
+ "สมุทัย"
+ "สมุน"
+ "สมุนไพร"
+ "สมุห์"
+ "สมเด็จ"
+ "สมเพช"
+ "สมเสร็จ"
+ "สมโพธิ"
+ "สมโภค"
+ "สมโภช"
+ "สม่ำเสมอ"
+ "สยด"
+ "สยบ"
+ "สยมภู"
+ "สยอง"
+ "สยาม"
+ "สยาย"
+ "สยิว"
+ "สยุมพร"
+ "สยุมภู"
+ "สรง"
+ "สรณะ"
+ "สรณาคมน์"
+ "สรตะ"
+ "สรร"
+ "สรรค์"
+ "สรรพ"
+ "สรรพาà¸à¸£"
+ "สรรพางค์"
+ "สรรเพชà¸"
+ "สรรเสริà¸"
+ "สรวง"
+ "สรวม"
+ "สรวล"
+ "สระ"
+ "สราà¸"
+ "สรีรà¸à¸´à¸ˆ"
+ "สรีรธาตุ"
+ "สรีรวิทยา"
+ "สรีรศาสตร์"
+ "สรีระ"
+ "สรุป"
+ "สร่ง"
+ "สร่าง"
+ "สร้อย"
+ "สร้าง"
+ "สร้าวเสียว"
+ "สฤต"
+ "สฤษà¸à¹Œ"
+ "สล"
+ "สลด"
+ "สลบ"
+ "สลวน"
+ "สลวย"
+ "สลอด"
+ "สลอน"
+ "สลอย"
+ "สละ"
+ "สลัà¸"
+ "สลัà¸à¹€à¸•้"
+ "สลัด"
+ "สลัดได"
+ "สลับ"
+ "สลัม"
+ "สลัว"
+ "สลา"
+ "สลาà¸"
+ "สลาด"
+ "สลาตัน"
+ "สลาบ"
+ "สลาย"
+ "สลิด"
+ "สลิล"
+ "สลึà¸"
+ "สลึง"
+ "สลุต"
+ "สลุบ"
+ "สลุมพร"
+ "สล็อต"
+ "สล้าง"
+ "สวà¸"
+ "สวด"
+ "สวน"
+ "สวนะ"
+ "สวนาà¸à¸²à¸£"
+ "สวบ"
+ "สวม"
+ "สวย"
+ "สวร"
+ "สวรรคต"
+ "สวรรคาลัย"
+ "สวรรค์"
+ "สวรรยา"
+ "สวอป"
+ "สวะ"
+ "สวัสดิà¸à¸²à¸£"
+ "สวัสดิภาพ"
+ "สวัสดิ์"
+ "สวัสดี"
+ "สวัสติà¸à¸°"
+ "สวา"
+ "สวาง"
+ "สวาด"
+ "สวาท"
+ "สวามิ"
+ "สวามี"
+ "สวาย"
+ "สวาสดิ์"
+ "สวาหะ"
+ "สวิง"
+ "สวิตช์"
+ "สวิตซ์"
+ "สวิสเซอร์à¹à¸¥à¸™à¸”์"
+ "สวีเดน"
+ "สว่าง"
+ "สว่าน"
+ "สว้าน"
+ "สสาร"
+ "สหà¸à¸£à¸“์"
+ "สหà¸à¸²à¸£"
+ "สหจร"
+ "สหชาติ"
+ "สหประชาชาติ"
+ "สหพันธรัà¸"
+ "สหพันธ์"
+ "สหภาพ"
+ "สหรัà¸"
+ "สหวิริยา"
+ "สหศึà¸à¸©à¸²"
+ "สหัช"
+ "สหัมบดี"
+ "สหัสนัยน์"
+ "สหัสวรรษ"
+ "สหัสสะ"
+ "สหัสสา"
+ "สหาย"
+ "สอ"
+ "สอง"
+ "สอด"
+ "สอน"
+ "สอบ"
+ "สอพลอ"
+ "สอย"
+ "สะ"
+ "สะà¸à¸”"
+ "สะà¸à¸´à¸”"
+ "สะคราà¸"
+ "สะดม"
+ "สะดวà¸"
+ "สะดิ้ง"
+ "สะดึง"
+ "สะดือ"
+ "สะดุด"
+ "สะดุ้ง"
+ "สะตอ"
+ "สะตึ"
+ "สะตือ"
+ "สะท้อน"
+ "สะท้าน"
+ "สะบัà¸"
+ "สะบัด"
+ "สะบัดสะบิ้ง"
+ "สะบั้น"
+ "สะบ้า"
+ "สะพรัà¸"
+ "สะพรั่ง"
+ "สะพัด"
+ "สะพั้น"
+ "สะพาน"
+ "สะพาย"
+ "สะระตะ"
+ "สะระà¹à¸«à¸™à¹ˆ"
+ "สะลึมสะลือ"
+ "สะวี้ดสะว้าด"
+ "สะสม"
+ "สะสาง"
+ "สะอาง"
+ "สะอาด"
+ "สะอิดสะเอียน"
+ "สะอิ้ง"
+ "สะอึà¸"
+ "สะอื้น"
+ "สะอ้าน"
+ "สะเà¸à¹‡à¸”"
+ "สะเด็ด"
+ "สะเทิ้น"
+ "สะเทือน"
+ "สะเทื้อน"
+ "สะเพร่า"
+ "สะเออะ"
+ "สะโพà¸"
+ "สะโอดสะอง"
+ "สะใภ้"
+ "สัà¸"
+ "สัà¸à¸‚ี"
+ "สัà¸à¸§à¸²"
+ "สัà¸à¸«à¸¥à¸²à¸”"
+ "สัขยะ"
+ "สังà¸à¸¡à¸—รัพย์"
+ "สังà¸à¸£"
+ "สังà¸à¸£à¸“ี"
+ "สังà¸à¸°à¸•ัง"
+ "สังà¸à¸°à¸ªà¸µ"
+ "สังà¸à¸±à¸”"
+ "สังà¸à¸±à¸›à¸›à¸°"
+ "สังà¸à¸²"
+ "สังà¸à¸²à¸¨"
+ "สังขยา"
+ "สังขาร"
+ "สังข์"
+ "สังคà¸à¸²à¸•ิ"
+ "สังคม"
+ "สังคัง"
+ "สังคายนา"
+ "สังคายนาย"
+ "สังคีต"
+ "สังค์"
+ "สังฆà¸à¸£à¸£à¸¡"
+ "สังฆนายà¸"
+ "สังฆมณฑล"
+ "สังฆมนตรี"
+ "สังฆราช"
+ "สังฆสภา"
+ "สังฆาà¸à¸´"
+ "สังฆาวาส"
+ "สังวร"
+ "สังวัธยาย"
+ "สังวาล"
+ "สังวาส"
+ "สังสดมภ์"
+ "สังสรรค์"
+ "สังสารวัà¸"
+ "สังหร"
+ "สังหรณ์"
+ "สังหาร"
+ "สังหาริมทรัพย์"
+ "สังหิต"
+ "สังเà¸à¸•"
+ "สังเขป"
+ "สังเคราะห์"
+ "สังเวคะ"
+ "สังเวช"
+ "สังเวย"
+ "สังเวียน"
+ "สังโยค"
+ "สังโยชน์"
+ "สัจ"
+ "สัจà¸à¸´à¸£à¸´à¸¢à¸²"
+ "สัจจะ"
+ "สัจà¸à¸²à¸“"
+ "สัจนิยม"
+ "สัจพจน์"
+ "สัชฌุ"
+ "สัà¸à¸ˆà¸£"
+ "สัà¸à¸ˆà¸²à¸£"
+ "สัà¸à¸Šà¸²à¸•à¸à¸²à¸“"
+ "สัà¸à¸Šà¸²à¸•ิ"
+ "สัà¸à¸Œà¸²"
+ "สัà¸à¸à¸²"
+ "สัà¸à¸à¸²à¸“"
+ "สัà¸à¸à¸µ"
+ "สัà¸à¸›à¸£à¸°à¸à¸²à¸¨"
+ "สัà¸à¸¥à¸±à¸à¸©à¸“์"
+ "สัà¸à¹€à¸ˆà¸•นา"
+ "สัณà¸à¸²à¸™"
+ "สัณฑ์"
+ "สัณห์"
+ "สัด"
+ "สัต"
+ "สัตตะ"
+ "สัตบรรณ"
+ "สัตยาบัน"
+ "สัตย์"
+ "สัตวบาล"
+ "สัตววิทยา"
+ "สัตวา"
+ "สัตวาร"
+ "สัตวà¹à¸žà¸—ย์"
+ "สัตวโลà¸"
+ "สัตว์"
+ "สัทธรรม"
+ "สัทธา"
+ "สัทศาสตร์"
+ "สัน"
+ "สันดาน"
+ "สันดาป"
+ "สันตะปาปา"
+ "สันติ"
+ "สันต์"
+ "สันถวไมตรี"
+ "สันถัต"
+ "สันถาร"
+ "สันทนะ"
+ "สันทนาà¸à¸²à¸£"
+ "สันทะ"
+ "สันทัด"
+ "สันธาน"
+ "สันนิบาต"
+ "สันนิวาส"
+ "สันนิษà¸à¸²à¸™"
+ "สันนิเวส"
+ "สันสà¸à¸¤à¸•"
+ "สันโดษ"
+ "สับ"
+ "สับปลับ"
+ "สับปะรด"
+ "สัปคับ"
+ "สัปดน"
+ "สัปดาห์"
+ "สัปทน"
+ "สัประยุทธ์"
+ "สัปหงà¸"
+ "สัปเหร่อ"
+ "สัพ"
+ "สัพพะ"
+ "สัพพัà¸à¸à¸¹"
+ "สัพยอà¸"
+ "สัพเพเหระ"
+ "สัมบูรณ์"
+ "สัมปชัà¸à¸à¸°"
+ "สัมปทา"
+ "สัมปทาน"
+ "สัมปยุต"
+ "สัมประสิทธิ์"
+ "สัมประหาร"
+ "สัมปรายภพ"
+ "สัมปรายิà¸à¸ à¸ž"
+ "สัมปโยค"
+ "สัมผัส"
+ "สัมพัทธ์"
+ "สัมพันธน์"
+ "สัมพันธภาพ"
+ "สัมพันธมิตร"
+ "สัมพันธไมตรี"
+ "สัมพันธ์"
+ "สัมพาธะ"
+ "สัมพุทธะ"
+ "สัมภาระ"
+ "สัมภาษณ์"
+ "สัมมนา"
+ "สัมมา"
+ "สัมมาชีพ"
+ "สัมฤทธิ์"
+ "สัมโพธิ"
+ "สัมโมทนียà¸à¸–า"
+ "สัสดี"
+ "สัสสะ"
+ "สั่ง"
+ "สั่น"
+ "สั้น"
+ "สา"
+ "สาà¸"
+ "สาà¸à¸£à¸£à¸ˆà¹Œ"
+ "สาà¸à¸¥"
+ "สาขา"
+ "สาคร"
+ "สาคู"
+ "สาคเรส"
+ "สาง"
+ "สาด"
+ "สาทร"
+ "สาทิส"
+ "สาธà¸"
+ "สาธยาย"
+ "สาธารณภัย"
+ "สาธารณรัà¸"
+ "สาธารณสุข"
+ "สาธารณะ"
+ "สาธารณูปà¸à¸²à¸£"
+ "สาธารณูปโภค"
+ "สาธิต"
+ "สาธุ"
+ "สาน"
+ "สานุศิษย์"
+ "สาบ"
+ "สาบสูà¸"
+ "สาบาน"
+ "สาป"
+ "สาม"
+ "สามัคคี"
+ "สามัà¸"
+ "สามานย์"
+ "สามารถ"
+ "สามิต"
+ "สามิภัà¸à¸”ิ์"
+ "สามี"
+ "สามเณร"
+ "สาย"
+ "สายชู"
+ "สายยู"
+ "สายัณห์"
+ "สาร"
+ "สารคดี"
+ "สารถี"
+ "สารท"
+ "สารนิเทศ"
+ "สารบบ"
+ "สารบรรณ"
+ "สารบัà¸"
+ "สารบับ"
+ "สารบาà¸"
+ "สารพัด"
+ "สารพัน"
+ "สารพางค์"
+ "สารภาพ"
+ "สารภี"
+ "สารวัตร"
+ "สาระ"
+ "สาระà¹à¸™"
+ "สารัทธ์"
+ "สารัมภ์"
+ "สาราณียà¸à¸£"
+ "สารานุà¸à¸£à¸¡"
+ "สารีริà¸à¸˜à¸²à¸•ุ"
+ "สาละวน"
+ "สาลิà¸à¸²"
+ "สาลินี"
+ "สาลี"
+ "สาลี่"
+ "สาว"
+ "สาวà¸"
+ "สาวิà¸à¸²"
+ "สาวิตร"
+ "สาวิตรี"
+ "สาสน์"
+ "สาส์น"
+ "สาหร่าย"
+ "สาหัส"
+ "สาเà¸"
+ "สาเหตุ"
+ "สาà¹à¸«à¸£à¸"
+ "สาโท"
+ "สาโรช"
+ "สาไถย"
+ "สำ"
+ "สำคัà¸"
+ "สำทับ"
+ "สำนวน"
+ "สำนัà¸"
+ "สำนึà¸"
+ "สำบัดสำนวน"
+ "สำปะหลัง"
+ "สำปั้น"
+ "สำมะหา"
+ "สำมะเลเทเมา"
+ "สำมะโนครัว"
+ "สำรวจ"
+ "สำรวม"
+ "สำรวย"
+ "สำรวล"
+ "สำรอà¸"
+ "สำรอง"
+ "สำรับ"
+ "สำราà¸"
+ "สำราà¸"
+ "สำริด"
+ "สำลัà¸"
+ "สำลาน"
+ "สำลี"
+ "สำส่อน"
+ "สำหรับ"
+ "สำหา"
+ "สำออย"
+ "สำอาง"
+ "สำเนา"
+ "สำเนียง"
+ "สำเภา"
+ "สำเริง"
+ "สำเร็จ"
+ "สำเหนียà¸"
+ "สำเหร่"
+ "สำà¹à¸”ง"
+ "สำà¹à¸¥à¸‡"
+ "สำโรง"
+ "สิ"
+ "สิà¸à¸‚า"
+ "สิขร"
+ "สิคาล"
+ "สิง"
+ "สิงขร"
+ "สิงคาร"
+ "สิงคาล"
+ "สิงคโปร์"
+ "สิงค์"
+ "สิงสาราสัตว์"
+ "สิงหนาท"
+ "สิงหบัà¸à¸Šà¸£"
+ "สิงหราช"
+ "สิงหล"
+ "สิงหาคม"
+ "สิงหาสน์"
+ "สิงห์"
+ "สิงโต"
+ "สิà¸à¸ˆà¸™à¹Œ"
+ "สิต"
+ "สิถิล"
+ "สิทธ"
+ "สิทธา"
+ "สิทธารถ"
+ "สิทธิ"
+ "สิทธิ์"
+ "สิน"
+ "สินค้า"
+ "สินธุ"
+ "สินี"
+ "สินเธาว์"
+ "สิบ"
+ "สิมพลี"
+ "สิริ"
+ "สิริà¸à¸´à¸•ิ์"
+ "สิลา"
+ "สิว"
+ "สิเนหà¸"
+ "สิเนหา"
+ "สิเน่หา"
+ "สิ่ง"
+ "สิ่ว"
+ "สิ้น"
+ "สี"
+ "สีà¸à¸²"
+ "สีดอ"
+ "สี่"
+ "สึà¸"
+ "สืบ"
+ "สื่อ"
+ "สุ"
+ "สุà¸"
+ "สุà¸à¸‚์"
+ "สุà¸à¸£"
+ "สุà¸à¸µà¹‰à¸¢à¸²à¸à¸µà¹‰"
+ "สุข"
+ "สุขะ"
+ "สุขา"
+ "สุขาภิบาล"
+ "สุขารมณ์"
+ "สุขาวดี"
+ "สุขี"
+ "สุขุม"
+ "สุขุมาล"
+ "สุคต"
+ "สุคติ"
+ "สุคนธรส"
+ "สุคนธ์"
+ "สุคันธ์"
+ "สุงà¸à¸²à¸à¸£"
+ "สุงสิง"
+ "สุจริต"
+ "สุจหนี่"
+ "สุจิ"
+ "สุชน"
+ "สุชาดา"
+ "สุà¸"
+ "สุà¸à¸à¸²à¸à¸²à¸¨"
+ "สุณ"
+ "สุณิสา"
+ "สุด"
+ "สุดา"
+ "สุต"
+ "สุตตะ"
+ "สุติ"
+ "สุทธาวาส"
+ "สุทธิ"
+ "สุทธ์"
+ "สุทัศน์"
+ "สุธา"
+ "สุธี"
+ "สุนทร"
+ "สุนทรี"
+ "สุนทรียภาพ"
+ "สุนทรียศาสตร์"
+ "สุนัข"
+ "สุนันท์"
+ "สุบรรณ"
+ "สุบิน"
+ "สุพรรณ"
+ "สุภัค"
+ "สุภาพ"
+ "สุภาษิต"
+ "สุม"
+ "สุมทุม"
+ "สุมน"
+ "สุมนา"
+ "สุมาลี"
+ "สุรสีหนาท"
+ "สุรัติ"
+ "สุรัสวดี"
+ "สุรา"
+ "สุรางคนา"
+ "สุรางคนางค์"
+ "สุรารัà¸à¸©à¹Œ"
+ "สุราลัย"
+ "สุราษฎร์"
+ "สุรินทร์"
+ "สุริยà¸à¸²à¸£"
+ "สุริยà¸à¸²à¸¥"
+ "สุริยคติ"
+ "สุริยคราส"
+ "สุริยง"
+ "สุริยน"
+ "สุริยมณฑล"
+ "สุริยะ"
+ "สุริยัน"
+ "สุริยา"
+ "สุริยุปราคา"
+ "สุริยเคราะห์"
+ "สุริเยนทร์"
+ "สุริเยศ"
+ "สุริโย"
+ "สุรีย์"
+ "สุรุ่ยสุร่าย"
+ "สุรเสียง"
+ "สุลต่าน"
+ "สุวภาพ"
+ "สุวรรณ"
+ "สุวาน"
+ "สุวิทย์"
+ "สุวินัย"
+ "สุวิมล"
+ "สุสาน"
+ "สุหนัต"
+ "สุหร่าย"
+ "สุเมธ"
+ "สุเมรุ"
+ "สุเหร่า"
+ "สุเอซ"
+ "สุ่ม"
+ "สุ้ม"
+ "สู"
+ "สูง"
+ "สูจิ"
+ "สูà¸"
+ "สูด"
+ "สูต"
+ "สูตร"
+ "สูติ"
+ "สูติà¸à¸£à¸£à¸¡"
+ "สูติบัตร"
+ "สูติศาสตร์"
+ "สูติà¹à¸žà¸—ย์"
+ "สูท"
+ "สูบ"
+ "สูสี"
+ "สู่"
+ "สู้"
+ "สเà¸à¸•"
+ "สเตอริโอ"
+ "สเต็à¸"
+ "สเน่ห์"
+ "สเปà¸"
+ "สเปà¸à¸•รัม"
+ "สเปน"
+ "สเปรดชีต"
+ "สà¹à¸à¸™"
+ "สà¹à¸¥à¸‡"
+ "สโมสร"
+ "สโรช"
+ "สไตล์"
+ "สไบ"
+ "สไลด์"
+ "ส่ง"
+ "ส่วน"
+ "ส่วย"
+ "ส่อ"
+ "ส่อง"
+ "ส่อน"
+ "ส่า"
+ "ส่าน"
+ "ส่าย"
+ "ส่าหรี่"
+ "ส่าเหล้า"
+ "ส่ำ"
+ "ส้น"
+ "ส้ม"
+ "ส้มป่อย"
+ "ส้วง"
+ "ส้วม"
+ "ส้วย"
+ "ส้อง"
+ "ส้อม"
+ "หà¸"
+ "หง"
+ "หงส์"
+ "หงอ"
+ "หงอà¸"
+ "หงอด"
+ "หงอน"
+ "หงอย"
+ "หงัà¸"
+ "หงับ"
+ "หงาย"
+ "หงำ"
+ "หงิà¸"
+ "หงิง"
+ "หงิม"
+ "หงึà¸"
+ "หงุงหงิง"
+ "หงุดหงิด"
+ "หงุบ"
+ "หงุ่ย"
+ "หง่อม"
+ "หง่าง"
+ "หง่าว"
+ "หà¸à¸´à¸‡"
+ "หà¸à¸´à¸š"
+ "หà¸à¹‰à¸²"
+ "หด"
+ "หทัย"
+ "หน"
+ "หนวà¸"
+ "หนวด"
+ "หนอ"
+ "หนอà¸"
+ "หนอง"
+ "หนอน"
+ "หนัà¸"
+ "หนัง"
+ "หนังสือ"
+ "หนับ"
+ "หนั่น"
+ "หนา"
+ "หนาด"
+ "หนาน"
+ "หนาม"
+ "หนาว"
+ "หนำ"
+ "หนำเลี้ยบ"
+ "หนี"
+ "หนีบ"
+ "หนี้"
+ "หนึบ"
+ "หนึ่ง"
+ "หนืด"
+ "หนุ"
+ "หนุน"
+ "หนุบ"
+ "หนุ่ม"
+ "หนุ่ย"
+ "หนู"
+ "หน็อยà¹à¸™à¹ˆ"
+ "หน่วง"
+ "หน่วย"
+ "หน่วยà¸à¸´à¸•"
+ "หน่อ"
+ "หน่อย"
+ "หน่า"
+ "หน่าง"
+ "หน่าย"
+ "หน้า"
+ "หน้าที่"
+ "หมà¸"
+ "หมด"
+ "หมวà¸"
+ "หมวด"
+ "หมอ"
+ "หมอà¸"
+ "หมอง"
+ "หมอน"
+ "หมอบ"
+ "หมอย"
+ "หมัà¸"
+ "หมัด"
+ "หมัน"
+ "หมับ"
+ "หมั่น"
+ "หมั้น"
+ "หมา"
+ "หมาà¸"
+ "หมาà¸à¸®à¸­à¸ª"
+ "หมาง"
+ "หมาด"
+ "หมาย"
+ "หมิ่น"
+ "หมี"
+ "หมี่"
+ "หมึà¸"
+ "หมื่น"
+ "หมุด"
+ "หมุน"
+ "หมุบ"
+ "หมุบหมิบ"
+ "หมุ่ย"
+ "หมู"
+ "หมู่"
+ "หม่น"
+ "หม่อง"
+ "หม่อน"
+ "หม่อม"
+ "หม่า"
+ "หม่ำ"
+ "หม้อ"
+ "หม้าย"
+ "หยà¸"
+ "หยด"
+ "หยวà¸"
+ "หยวบ"
+ "หยอà¸"
+ "หยอà¸à¹€à¸­à¸´à¸™"
+ "หยอง"
+ "หยอด"
+ "หยอมà¹à¸«à¸¢à¸¡"
+ "หยอย"
+ "หยัà¸"
+ "หยัง"
+ "หยัด"
+ "หยัน"
+ "หยับ"
+ "หยั่ง"
+ "หยาà¸à¹„ย่"
+ "หยาด"
+ "หยาบ"
+ "หยาม"
+ "หยาว"
+ "หยำเป"
+ "หยิà¸"
+ "หยิบ"
+ "หยิม"
+ "หยิ่ง"
+ "หยี"
+ "หยุà¸à¸«à¸¢à¸´à¸"
+ "หยุด"
+ "หยุบ"
+ "หยุมหยิม"
+ "หยุ่น"
+ "หยูà¸à¸¢à¸²"
+ "หย็องà¹à¸«à¸¢à¹‡à¸‡"
+ "หย่ง"
+ "หย่อง"
+ "หย่อน"
+ "หย่อม"
+ "หย่อย"
+ "หย่า"
+ "หรดี"
+ "หรรษา"
+ "หรอ"
+ "หรอà¸"
+ "หรอย"
+ "หรา"
+ "หริ"
+ "หริ่ง"
+ "หรีด"
+ "หรี่"
+ "หรือ"
+ "หรุบ"
+ "หรุบรู่"
+ "หรุบหรู่"
+ "หรุ่ม"
+ "หรู"
+ "หร็อมà¹à¸«à¸£à¹‡à¸¡"
+ "หฤทัย"
+ "หฤหรรษ์"
+ "หฤโหด"
+ "หล"
+ "หลง"
+ "หลด"
+ "หลน"
+ "หลบ"
+ "หลวง"
+ "หลวม"
+ "หลอ"
+ "หลอà¸"
+ "หลอด"
+ "หลอน"
+ "หลอม"
+ "หละ"
+ "หลัà¸"
+ "หลัง"
+ "หลัด"
+ "หลับ"
+ "หลัว"
+ "หลั่ง"
+ "หลั่น"
+ "หลา"
+ "หลาà¸"
+ "หลาน"
+ "หลาบ"
+ "หลาม"
+ "หลาย"
+ "หลาว"
+ "หลิà¸"
+ "หลิม"
+ "หลิว"
+ "หลิ่ว"
+ "หลี"
+ "หลีà¸"
+ "หลีฮื้อ"
+ "หลืบ"
+ "หลุà¸à¸«à¸¥à¸´à¸"
+ "หลุด"
+ "หลุน"
+ "หลุบ"
+ "หลุม"
+ "หลู่"
+ "หล่น"
+ "หล่ม"
+ "หล่อ"
+ "หล่อน"
+ "หล่ะ"
+ "หล้า"
+ "หวง"
+ "หวด"
+ "หวน"
+ "หวย"
+ "หวอ"
+ "หวอด"
+ "หวะ"
+ "หวัง"
+ "หวัด"
+ "หวัว"
+ "หวัวร่อ"
+ "หวั่น"
+ "หวา"
+ "หวาด"
+ "หวาน"
+ "หวาม"
+ "หวาย"
+ "หวำ"
+ "หวิด"
+ "หวิว"
+ "หวี"
+ "หวีด"
+ "หวี่"
+ "หวือ"
+ "หวุดหวิด"
+ "หวุม"
+ "หวูด"
+ "หว็อย"
+ "หว่า"
+ "หว่าง"
+ "หว่าน"
+ "หว้า"
+ "หอ"
+ "หอà¸"
+ "หอง"
+ "หอน"
+ "หอบ"
+ "หอม"
+ "หอย"
+ "หะà¹à¸£à¸"
+ "หัà¸"
+ "หัด"
+ "หัตถà¸à¸£à¸£à¸¡"
+ "หัตถà¸à¸²à¸£"
+ "หัตถà¸à¸´à¸ˆ"
+ "หัตถบาส"
+ "หัตถศิลป์"
+ "หัตถศึà¸à¸©à¸²"
+ "หัตถี"
+ "หัตถ์"
+ "หัน"
+ "หับ"
+ "หัว"
+ "หัวบุà¸"
+ "หัวหน้า"
+ "หัวเราะ"
+ "หัส"
+ "หั่น"
+ "หั้น"
+ "หา"
+ "หาà¸"
+ "หาง"
+ "หาà¸"
+ "หาด"
+ "หาน"
+ "หาบ"
+ "หาม"
+ "หาย"
+ "หายนะ"
+ "หาร"
+ "หารือ"
+ "หาว"
+ "หำ"
+ "หิงสา"
+ "หิงห้อย"
+ "หิด"
+ "หิน"
+ "หิมะ"
+ "หิมาลัย"
+ "หิรัà¸"
+ "หิริ"
+ "หิว"
+ "หิ่งห้อย"
+ "หิ้ง"
+ "หิ้ว"
+ "หีนยาน"
+ "หีบ"
+ "หึ"
+ "หึง"
+ "หึ่ง"
+ "หืด"
+ "หืน"
+ "หือ"
+ "หื่น"
+ "หื้อ"
+ "หุง"
+ "หุน"
+ "หุบ"
+ "หุยฮา"
+ "หุ่น"
+ "หุ้น"
+ "หุ้ม"
+ "หู"
+ "หูà¸"
+ "หูด"
+ "หู่"
+ "หโยดม"
+ "ห่ม"
+ "ห่วง"
+ "ห่วย"
+ "ห่อ"
+ "ห่อน"
+ "ห่า"
+ "ห่าง"
+ "ห่าน"
+ "ห่าม"
+ "ห้วง"
+ "ห้วน"
+ "ห้วย"
+ "ห้อ"
+ "ห้อง"
+ "ห้อม"
+ "ห้อย"
+ "ห้า"
+ "ห้าง"
+ "ห้าม"
+ "ห้าว"
+ "ห้ำ"
+ "อà¸"
+ "อà¸à¸•ัà¸à¸à¸¸à¸•า"
+ "อà¸à¸•ัà¸à¸à¸¹"
+ "อà¸à¸™à¸´à¸©à¸à¹Œ"
+ "อà¸à¸£à¸“ีย์"
+ "อà¸à¸£à¸£à¸¡à¸à¸£à¸´à¸¢à¸²"
+ "อà¸à¸¸à¸¨à¸¥"
+ "อคติ"
+ "อคาธ"
+ "องà¸à¹Œ"
+ "องคชาติ"
+ "องคมนตรี"
+ "องคมรรษ"
+ "องครัà¸à¸©à¹Œ"
+ "องควิทยา"
+ "องคาพยพ"
+ "องคุล"
+ "องคุลี"
+ "องค์"
+ "องค์à¸à¸£"
+ "องค์à¸à¸²à¸£"
+ "องศา"
+ "องอาจ"
+ "องุ่น"
+ "อจลา"
+ "อจิตติ"
+ "อจินตา"
+ "อจินไตย"
+ "อจิระ"
+ "อช"
+ "อชา"
+ "อชิน"
+ "อชินี"
+ "อชิร"
+ "อà¸à¸§à¸µ"
+ "อณิ"
+ "อณุ"
+ "อณู"
+ "อด"
+ "อดิถี"
+ "อดิศร"
+ "อดิศวร"
+ "อดิศัย"
+ "อดิเทพ"
+ "อดิเรà¸"
+ "อดีต"
+ "อดุล"
+ "อดุลย"
+ "อดุลย์"
+ "อติชาต"
+ "อติมานะ"
+ "อติราช"
+ "อติสาร"
+ "อติเรà¸"
+ "อทินนาทาน"
+ "อธรรม"
+ "อธิà¸à¸¡à¸²à¸ª"
+ "อธิà¸à¸£à¸“์"
+ "อธิà¸à¸§à¸²à¸£"
+ "อธิà¸à¸ªà¸¸à¸£à¸—ิน"
+ "อธิà¸à¸²à¸£"
+ "อธิคม"
+ "อธิà¸à¸à¸²à¸™"
+ "อธิบดี"
+ "อธิบาย"
+ "อธิป"
+ "อธิปไตย"
+ "อธิราช"
+ "อธิษà¸à¸²à¸™"
+ "อธึà¸"
+ "อนงคณะ"
+ "อนงคเลขา"
+ "อนงค์"
+ "อนงเลข"
+ "อนธà¸à¸²à¸£"
+ "อนัตตา"
+ "อนันต์"
+ "อนาคต"
+ "อนาคามี"
+ "อนาจาร"
+ "อนาถ"
+ "อนาถา"
+ "อนาทร"
+ "อนาธิปไตย"
+ "อนามัย"
+ "อนารยชน"
+ "อนารยธรรม"
+ "อนารยะ"
+ "อนาลัย"
+ "อนิจ"
+ "อนิจจัง"
+ "อนิจจา"
+ "อนิà¸à¸à¸²à¸£à¸¡à¸¢à¹Œ"
+ "อนิยม"
+ "อนึ่ง"
+ "อนุ"
+ "อนุà¸à¸£"
+ "อนุà¸à¸£à¸¡"
+ "อนุà¸à¸£à¸£à¸¡à¸à¸²à¸£"
+ "อนุà¸à¸²à¸Šà¸²à¸”"
+ "อนุà¸à¸²à¸£"
+ "อนุà¸à¸¹à¸¥"
+ "อนุจร"
+ "อนุชน"
+ "อนุชา"
+ "อนุชาต"
+ "อนุชิต"
+ "อนุà¸à¸²à¸•"
+ "อนุà¸à¸²à¹‚ตตุลาà¸à¸²à¸£"
+ "อนุทิน"
+ "อนุบท"
+ "อนุบาล"
+ "อนุปริà¸à¸à¸²"
+ "อนุพงศ์"
+ "อนุพันธ์"
+ "อนุภรรยา"
+ "อนุภริยา"
+ "อนุภาค"
+ "อนุมัติ"
+ "อนุมาตรา"
+ "อนุมาน"
+ "อนุมูล"
+ "อนุรัà¸à¸©à¸™à¸´à¸¢à¸¡"
+ "อนุรัà¸à¸©à¹Œ"
+ "อนุราช"
+ "อนุรูป"
+ "อนุวงศ์"
+ "อนุวัต"
+ "อนุศาสà¸"
+ "อนุศาสตราจารย์"
+ "อนุศาสน์"
+ "อนุศิษà¸à¹Œ"
+ "อนุสติ"
+ "อนุสนธิ"
+ "อนุสร"
+ "อนุสรณ์"
+ "อนุสัà¸à¸à¸²"
+ "อนุสัย"
+ "อนุสาวรีย์"
+ "อนุสาสนี"
+ "อนุเคราะห์"
+ "อนุเถระ"
+ "อนุโมทนา"
+ "อนุโยค"
+ "อนุโลม"
+ "อบ"
+ "อบาย"
+ "อบายภูมิ"
+ "อบายมุข"
+ "อปมงคล"
+ "อพยพ"
+ "อพาร์ตเมนต์"
+ "อภัย"
+ "อภิชน"
+ "อภิชาต"
+ "อภิà¸à¸à¸²"
+ "อภิธรรม"
+ "อภิธาน"
+ "อภินันท์"
+ "อภินัย"
+ "อภินิหาร"
+ "อภิบาล"
+ "อภิปรัชà¸à¸²"
+ "อภิปราย"
+ "อภิมหาอำนาจ"
+ "อภิมานะ"
+ "อภิมุข"
+ "อภิรดี"
+ "อภิรมย์"
+ "อภิรัà¸à¸©à¹Œ"
+ "อภิลัà¸à¸‚ิตสมัย"
+ "อภิวันท์"
+ "อภิวาทน์"
+ "อภิสมัย"
+ "อภิสมาจาร"
+ "อภิสมโพธิ"
+ "อภิสัมโพธิ"
+ "อภิสิทธิ์"
+ "อภิเลปน์"
+ "อภิเษà¸"
+ "อภิไธย"
+ "อม"
+ "อมตะ"
+ "อมนุษย์"
+ "อมร"
+ "อมรา"
+ "อมราวดี"
+ "อมรินทร์"
+ "อมฤต"
+ "อมฤตยู"
+ "อมิตร"
+ "อมเรศ"
+ "อยาà¸"
+ "อยุธยา"
+ "อยู่"
+ "อย่า"
+ "อย่าง"
+ "อร"
+ "อรชร"
+ "อรรณพ"
+ "อรรถ"
+ "อรรถาธิบาย"
+ "อรหะ"
+ "อรหัง"
+ "อรหันต์"
+ "อรัà¸"
+ "อริ"
+ "อริยบุคคล"
+ "อริยะ"
+ "อริสโตเติล"
+ "อรุณ"
+ "อรุโณทัย"
+ "อรไท"
+ "อร่อย"
+ "อร่าม"
+ "อลงà¸à¸•"
+ "อลงà¸à¸£à¸“์"
+ "อลงà¸à¸²à¸£"
+ "อลวน"
+ "อลหม่าน"
+ "อลังà¸à¸²à¸£"
+ "อลัชชี"
+ "อลึ่งฉึ่ง"
+ "อลเวง"
+ "อล่องฉ่อง"
+ "อล่างฉ่าง"
+ "อวà¸à¸²à¸¨"
+ "อวด"
+ "อวตาร"
+ "อวน"
+ "อวบ"
+ "อวมงคล"
+ "อวย"
+ "อวล"
+ "อวสาน"
+ "อวหาร"
+ "อวัยวะ"
+ "อวิชชา"
+ "อสงไขย"
+ "อสนีบาต"
+ "อสมà¸à¸²à¸£"
+ "อสมมาตร"
+ "อสรพิษ"
+ "อสังหาริมทรัพย์"
+ "อสัà¸à¸à¸µ"
+ "อสัà¸à¹à¸”หวา"
+ "อสัตย์"
+ "อสีติ"
+ "อสุจิ"
+ "อสุนีบาต"
+ "อสุรà¸à¸²à¸¢"
+ "อสุรี"
+ "อสูร"
+ "อหังà¸à¸²à¸£"
+ "อหิงสา"
+ "อหิวาตà¸à¹‚รค"
+ "ออ"
+ "ออà¸"
+ "ออà¸à¸‹à¸´à¹€à¸ˆà¸™"
+ "ออà¸à¸‹à¸´à¹€à¸”ชัน"
+ "ออà¸à¸à¸²"
+ "ออà¸à¹„ซด์"
+ "ออด"
+ "ออดิโอ"
+ "ออนชอร์"
+ "ออนซอน"
+ "ออนซ์"
+ "ออนไลน์"
+ "ออปชัน"
+ "ออปเจ็à¸à¸•์"
+ "ออฟ"
+ "ออฟชอร์"
+ "ออฟฟิศ"
+ "ออม"
+ "ออราเคิล"
+ "ออร์à¹à¸à¸™"
+ "ออส"
+ "ออสเตรเลีย"
+ "อะคร้าว"
+ "อะดรีนาลิน"
+ "อะตอม"
+ "อะร้าอร่าม"
+ "อะลุ่มอล่วย"
+ "อะลุ้มอล่วย"
+ "อะลูมิเนียม"
+ "อะเคื้อ"
+ "อะเซทิลีน"
+ "อะไร"
+ "อะไหล่"
+ "อัà¸"
+ "อัà¸à¸‚"
+ "อัà¸à¸‚รวิธี"
+ "อัà¸à¸‚รวิบัติ"
+ "อัà¸à¸‚รสมัย"
+ "อัà¸à¸‚ระ"
+ "อัà¸à¸©à¸£"
+ "อัà¸à¸©à¸°"
+ "อัà¸à¹€à¸ªà¸š"
+ "อัà¸à¹‚ข"
+ "อัคคะ"
+ "อัคคี"
+ "อัคนี"
+ "อัครชายา"
+ "อัครมเหสี"
+ "อัครราชทูต"
+ "อัง"
+ "อังà¸à¸¤à¸©"
+ "อังà¸à¸°à¸¥à¸¸à¸‡"
+ "อังคณา"
+ "อังคาร"
+ "อังคาส"
+ "อังสตรอม"
+ "อังสนา"
+ "อัจà¸à¸¥à¸±à¸š"
+ "อัจจันต์"
+ "อัจจัย"
+ "อัจจิ"
+ "อัจฉรา"
+ "อัจฉริยบุคคล"
+ "อัจฉริยะ"
+ "อัจนา"
+ "อัชฌา"
+ "อัชฌาสัย"
+ "อัà¸à¸Šà¸™à¸°"
+ "อัà¸à¸Šà¸¥à¸µ"
+ "อัà¸à¸Šà¸±à¸™"
+ "อัà¸à¸›à¸£à¸°à¸à¸²à¸¨"
+ "อัà¸à¸¡à¸“ี"
+ "อัà¸à¸¡à¸±à¸à¸à¸°"
+ "อัà¸à¸£à¸¹à¸›"
+ "อัà¸à¹€à¸Šà¸´à¸"
+ "อัà¸"
+ "อัà¸à¸à¸°"
+ "อัà¸"
+ "อัà¸à¸¬à¸ª"
+ "อัà¸à¸´"
+ "อัฒจันทร์"
+ "อัฒภาค"
+ "อัฒมณฑล"
+ "อัฒมาส"
+ "อัฒรัตติ"
+ "อัณฑชะ"
+ "อัณฑะ"
+ "อัณฑาà¸à¸²à¸£"
+ "อัด"
+ "อัตคัด"
+ "อัตชีวประวัติ"
+ "อัตตะ"
+ "อัตตา"
+ "อัตตาธิปไตย"
+ "อัตนัย"
+ "อัตภาพ"
+ "อัตรา"
+ "อัตวินิบาตà¸à¸£à¸£à¸¡"
+ "อัตโนมัติ"
+ "อัธยาศัย"
+ "อัน"
+ "อันดับ"
+ "อันตรธาน"
+ "อันตราย"
+ "อันธà¸à¸²à¸£"
+ "อันธพาล"
+ "อันเดอร์"
+ "อับ"
+ "อัปภาคย์"
+ "อัปมงคล"
+ "อัปยศ"
+ "อัประมาณ"
+ "อัปราชัย"
+ "อัปรีย์"
+ "อัปลัà¸à¸©à¸“์"
+ "อัปสร"
+ "อัปเปหิ"
+ "อัพเà¸à¸£à¸”"
+ "อัพเดต"
+ "อัพเดท"
+ "อัฟ"
+ "อัมพร"
+ "อัมพฤà¸à¸©à¹Œ"
+ "อัมพา"
+ "อัมพาต"
+ "อัมพุช"
+ "อัมสเตอร์ดัม"
+ "อัยà¸à¸²"
+ "อัยà¸à¸²à¸£"
+ "อัยยิà¸à¸²"
+ "อัลจีเรีย"
+ "อัลบั้ม"
+ "อัลบาเนีย"
+ "อัลเบเนีย"
+ "อัศจรรย์"
+ "อัศวิน"
+ "อัศวินี"
+ "อัศเจรีย์"
+ "อัษฎายุท"
+ "อัษฎาวุธ"
+ "อัสดง"
+ "อัสดงคต"
+ "อัสดร"
+ "อัสนี"
+ "อัสสะ"
+ "อัสสาสะ"
+ "อัสสุ"
+ "อั้à¸"
+ "อั้งยี่"
+ "อั้งโล่"
+ "อั้น"
+ "อั๊à¸"
+ "อั๋น"
+ "อา"
+ "อาà¸à¸£"
+ "อาà¸à¸±à¸›à¸à¸´à¸£à¸´à¸¢à¸²"
+ "อาà¸à¸²à¸£"
+ "อาà¸à¸²à¸¨"
+ "อาà¸à¸¹à¸¥"
+ "อาà¸à¹‰à¸²"
+ "อาขยาน"
+ "อาคม"
+ "อาคันตุà¸à¸°"
+ "อาคาร"
+ "อาคเนย์"
+ "อาฆาต"
+ "อางขนาง"
+ "อาจ"
+ "อาจม"
+ "อาจริยวัตร"
+ "อาจาด"
+ "อาจารย์"
+ "อาจิณ"
+ "อาชà¸à¸²"
+ "อาชา"
+ "อาชาไนย"
+ "อาชีพ"
+ "อาชีวศึà¸à¸©à¸²"
+ "อาชีวะ"
+ "อาà¸à¸²"
+ "อาณัติ"
+ "อาณา"
+ "อาด"
+ "อาดูร"
+ "อาตมภาพ"
+ "อาตมา"
+ "อาถรรพณ์"
+ "อาถรรพ์"
+ "อาทร"
+ "อาทิ"
+ "อาทิตย์"
+ "อาน"
+ "อานิสงส์"
+ "อานุภาพ"
+ "อาบ"
+ "อาบัติ"
+ "อาพาธ"
+ "อาฟà¸à¸²à¸™à¸´à¸ªà¸–าน"
+ "อาฟริà¸à¸²"
+ "อาภรณ์"
+ "อาภัพ"
+ "อาภา"
+ "อามิส"
+ "อาย"
+ "อายตนะ"
+ "อายัด"
+ "อายุ"
+ "อายุรศาสตร์"
+ "อายุรเวช"
+ "อายุรà¹à¸žà¸—ย์"
+ "อารบิค"
+ "อารมณ์"
+ "อารยชน"
+ "อารยชาติ"
+ "อารยธรรม"
+ "อารยประเทศ"
+ "อารยะ"
+ "อารยัน"
+ "อารัà¸à¸‚า"
+ "อารัà¸à¸©à¹Œ"
+ "อารัมภà¸à¸–า"
+ "อารัมภบท"
+ "อาราธนา"
+ "อาราม"
+ "อารามิà¸"
+ "อาราเบีย"
+ "อารี"
+ "อาร์คติà¸"
+ "อาร์เซนอล"
+ "อาลปนะ"
+ "อาละวาด"
+ "อาลัà¸à¸©à¸“์"
+ "อาลัย"
+ "อาลัว"
+ "อาว"
+ "อาวรณ์"
+ "อาวาส"
+ "อาวาหะ"
+ "อาวุธ"
+ "อาวุโส"
+ "อาว์"
+ "อาศรม"
+ "อาศัย"
+ "อาศิรวาท"
+ "อาสนะ"
+ "อาสน์"
+ "อาสัà¸"
+ "อาสา"
+ "อาสาฬหบูชา"
+ "อาสูร"
+ "อาหรับ"
+ "อาหาร"
+ "อาเจียน"
+ "อาเซีย"
+ "อาเรเบีย"
+ "อาเวค"
+ "อาเวศ"
+ "อาเศียรวาท"
+ "อำ"
+ "อำนวย"
+ "อำนาจ"
+ "อำพะนำ"
+ "อำพัน"
+ "อำมฤต"
+ "อำมหิต"
+ "อำมาตย์"
+ "อำลา"
+ "อำเภอ"
+ "อำไพ"
+ "อิง"
+ "อิงค์"
+ "อิงค์เจ็ต"
+ "อิจฉา"
+ "อิฉัน"
+ "อิà¸à¸à¸²à¸£à¸¡à¸“์"
+ "อิà¸"
+ "อิด"
+ "อิตถี"
+ "อิตาลี"
+ "อิตาเลียน"
+ "อิทธิ"
+ "อิน"
+ "อินซูลิน"
+ "อินทนิล"
+ "อินทผลัม"
+ "อินทรธนู"
+ "อินทรวงศ์"
+ "อินทรวิเชียร"
+ "อินทรา"
+ "อินทราเน็ต"
+ "อินทรี"
+ "อินทรียสังวร"
+ "อินทรีย์"
+ "อินทร์"
+ "อินพุต"
+ "อินฟราเรด"
+ "อินฟอร์มิà¸"
+ "อินัง"
+ "อินเดีย"
+ "อินเดียนà¹à¸”ง"
+ "อินเตอร์"
+ "อินเตอร์เน็ต"
+ "อินเตอร์เฟซ"
+ "อินเทล"
+ "อินเทอร์เนต"
+ "อินเทอร์เน็ต"
+ "อินเทอร์เฟซ"
+ "อินโดนิเซีย"
+ "อินโดนีเซีย"
+ "อินโดเซีย"
+ "อิมพอร์ต"
+ "อิมเมจ"
+ "อิยิปต์"
+ "อิริยาบถ"
+ "อิศวร"
+ "อิษà¸à¸µ"
+ "อิษà¸à¹Œ"
+ "อิส"
+ "อิสตรี"
+ "อิสรภาพ"
+ "อิสระ"
+ "อิสราเอล"
+ "อิสริยยศ"
+ "อิสริยะ"
+ "อิสริยาภรณ์"
+ "อิสสา"
+ "อิสิ"
+ "อิสี"
+ "อิหม่าม"
+ "อิหร่าน"
+ "อิหลัà¸à¸­à¸´à¹€à¸«à¸¥à¸·à¹ˆà¸­"
+ "อิเล็à¸à¸•รอน"
+ "อิเล็à¸à¸—รอนิà¸à¸ªà¹Œ"
+ "อิเล็à¸à¹‚ทน"
+ "อิ่ม"
+ "อี"
+ "อีà¸"
+ "อีà¸à¸²"
+ "อีà¸à¹‰à¸­"
+ "อีคอมเมิร์ซ"
+ "อีนุงตุงนัง"
+ "อีมู"
+ "อียิปต์"
+ "อีลุ่ยฉุยà¹à¸‰à¸"
+ "อีลุ้ม"
+ "อีสาน"
+ "อีสุà¸à¸­à¸µà¹ƒà¸ª"
+ "อีหรอบ"
+ "อีหลัà¸à¸­à¸´à¹€à¸«à¸¥à¸·à¹ˆà¸­"
+ "อีหลี"
+ "อีเต้อ"
+ "อีเทอร์"
+ "อีเมล์"
+ "อีเหละเขะขะ"
+ "อีโหลà¸à¹‚ขลà¸à¹€à¸‚ลà¸"
+ "อี๊ด"
+ "อี๋"
+ "อึ"
+ "อึà¸"
+ "อึà¸à¸—ึà¸"
+ "อึà¸à¸­à¸±à¸"
+ "อึง"
+ "อึงมี่"
+ "อึงอล"
+ "อึด"
+ "อึ่ง"
+ "อึ้ง"
+ "อึ้ดทึ่ด"
+ "อึ๊à¸"
+ "อืด"
+ "อือ"
+ "อื่น"
+ "อื้น"
+ "อื้อ"
+ "อุ"
+ "อุà¸"
+ "อุà¸à¸à¸²à¸šà¸²à¸•"
+ "อุà¸à¸¤à¸©à¸à¹Œ"
+ "อุจจาระ"
+ "อุจาด"
+ "อุจารมรรค"
+ "อุจเฉท"
+ "อุชุ"
+ "อุà¸à¸à¸²à¸à¸²à¸£"
+ "อุณหภูมิ"
+ "อุณหะ"
+ "อุณหาà¸à¸²à¸£"
+ "อุณหิส"
+ "อุณา"
+ "อุด"
+ "อุดม"
+ "อุดร"
+ "อุดหนุน"
+ "อุตพิด"
+ "อุตรดิตถ์"
+ "อุตริ"
+ "อุตลุด"
+ "อุตสาหà¸à¸£à¸£à¸¡"
+ "อุตสาหะ"
+ "อุตส่าห์"
+ "อุตุ"
+ "อุทà¸"
+ "อุทธรณ์"
+ "อุทธัจ"
+ "อุทยาน"
+ "อุทร"
+ "อุทลุม"
+ "อุทัช"
+ "อุทัย"
+ "อุทาน"
+ "อุทาร"
+ "อุทาหรณ์"
+ "อุทิศ"
+ "อุทุมพร"
+ "อุธัจ"
+ "อุบ"
+ "อุบล"
+ "อุบอิบ"
+ "อุบะ"
+ "อุบัติ"
+ "อุบาท"
+ "อุบาทว์"
+ "อุบาย"
+ "อุบาสà¸"
+ "อุบาสิà¸à¸²"
+ "อุบ๊ะ"
+ "อุป"
+ "อุปà¸à¸£à¸“์"
+ "อุปà¸à¸£à¸¡"
+ "อุปà¸à¸²à¸£à¸°"
+ "อุปà¸à¸²à¸£à¸µ"
+ "อุปถัมภà¸"
+ "อุปถัมภ์"
+ "อุปทาน"
+ "อุปทูต"
+ "อุปนัย"
+ "อุปนายà¸"
+ "อุปนิสัย"
+ "อุปมา"
+ "อุปมาน"
+ "อุปราช"
+ "อุปสงค์"
+ "อุปสมบท"
+ "อุปสรรค"
+ "อุปสัมปทา"
+ "อุปัชฌายะ"
+ "อุปัชฌาย์"
+ "อุปัà¸à¸à¸²à¸"
+ "อุปัà¸à¸à¸²à¸™à¸°"
+ "อุปัทวันตราย"
+ "อุปัทวเหตุ"
+ "อุปาทาน"
+ "อุปโภค"
+ "อุปโยค"
+ "อุปโลà¸à¸™à¹Œ"
+ "อุปไมย"
+ "อุย"
+ "อุระ"
+ "อุรังอุตัง"
+ "อุรา"
+ "อุรุ"
+ "อุรุงอุตัง"
+ "อุษณีย์"
+ "อุษา"
+ "อุสา"
+ "อุสุ"
+ "อุเบà¸à¸‚า"
+ "อุเหม่"
+ "อุà¹à¸§à¹‰"
+ "อุโฆษ"
+ "อุโบสถ"
+ "อุโมงค์"
+ "อุไร"
+ "อุ่น"
+ "อุ่ย"
+ "อุ้ง"
+ "อุ้ม"
+ "อุ้ย"
+ "อุ๊ย"
+ "อู"
+ "อูà¸"
+ "อูด"
+ "อูม"
+ "อูรุ"
+ "อู่"
+ "อู้"
+ "อู้อี้"
+ "อู๋อี๋"
+ "อเจลà¸"
+ "อเจละ"
+ "อเนà¸"
+ "อเนà¸à¸„ุณ"
+ "อเนจอนาถ"
+ "อเปหิ"
+ "อเม"
+ "อเมริà¸à¸±à¸™"
+ "อเมริà¸à¸²"
+ "อเวจี"
+ "อà¹à¸”ปเตอร์"
+ "อโฆษะ"
+ "อโณทัย"
+ "อโนชา"
+ "อโนดาต"
+ "อโลหะ"
+ "อโศà¸"
+ "อโหสิ"
+ "อ่อง"
+ "อ่อน"
+ "อ่อย"
+ "อ่า"
+ "อ่าง"
+ "อ่าน"
+ "อ่าว"
+ "อ่ำ"
+ "อ้น"
+ "อ้วà¸"
+ "อ้วน"
+ "อ้อ"
+ "อ้อน"
+ "อ้อนà¹à¸­à¹‰à¸™"
+ "อ้อม"
+ "อ้อย"
+ "อ้อยส้อย"
+ "อ้อยอิ่ง"
+ "อ้า"
+ "อ้าง"
+ "อ้าย"
+ "อ้าว"
+ "อ้ำอึ้ง"
+ "อ๊อด"
+ "อ๊ะ"
+ "อ๋อ"
+ "อ๋อง"
+ "อ๋อย"
+ "ฮà¸à¹€à¸à¸µà¹‰à¸¢à¸™"
+ "ฮวงซุ้ย"
+ "ฮวน"
+ "ฮวบ"
+ "ฮอà¸à¸à¸µà¹‰"
+ "ฮอด"
+ "ฮอนโนลูลู"
+ "ฮอร์โมน"
+ "ฮอลันดา"
+ "ฮอลà¹à¸¥à¸™à¸”์"
+ "ฮะ"
+ "ฮัà¸"
+ "ฮังà¸à¸²à¸£à¸µ"
+ "ฮั่น"
+ "ฮั้ว"
+ "ฮา"
+ "ฮาม"
+ "ฮาร์ดดิสค์"
+ "ฮาร์ดà¹à¸§à¸£à¹Œ"
+ "ฮาเร็ม"
+ "ฮาโลวีน"
+ "ฮิต"
+ "ฮินดู"
+ "ฮิปโปโปเตมัส"
+ "ฮิสทีเรีย"
+ "ฮีเลียม"
+ "ฮีโร่"
+ "ฮึ"
+ "ฮึà¸"
+ "ฮึด"
+ "ฮึดฮัด"
+ "ฮึม"
+ "ฮึย"
+ "ฮึ่ม"
+ "ฮืดฮาด"
+ "ฮือ"
+ "ฮื่อ"
+ "ฮื้อ"
+ "ฮุบ"
+ "ฮุยเลฮุย"
+ "ฮูà¸"
+ "ฮูม"
+ "ฮู้"
+ "ฮ่อ"
+ "ฮ่องà¸à¸‡"
+ "ฮ่องเต้"
+ "ฮ้อ"
+ "ฮ้า"
+ "เà¸"
+ "เà¸à¸à¸¡à¸°à¹€à¸«à¸£à¸"
+ "เà¸à¸ˆà¸´à¸­à¸²à¸ˆà¸²à¸£à¸¢à¹Œ"
+ "เà¸à¸“ฑ์"
+ "เà¸à¸”"
+ "เà¸à¸•ุ"
+ "เà¸à¸™"
+ "เà¸à¸¡"
+ "เà¸à¸¡à¸ªà¹Œ"
+ "เà¸à¸¢"
+ "เà¸à¸£à¸‡"
+ "เà¸à¸£à¸”"
+ "เà¸à¸£à¸­à¸°"
+ "เà¸à¸£à¸²à¸°"
+ "เà¸à¸£à¸´à¸"
+ "เà¸à¸£à¸´à¹ˆà¸™"
+ "เà¸à¸£à¸µà¸¢à¸"
+ "เà¸à¸£à¸µà¸¢à¸‡"
+ "เà¸à¸£à¸µà¸¢à¸™"
+ "เà¸à¸£à¸µà¸¢à¸š"
+ "เà¸à¸£à¸µà¸¢à¸¡"
+ "เà¸à¸£à¸µà¸¢à¸§"
+ "เà¸à¸£à¸µà¹‰à¸¢à¸§"
+ "เà¸à¸£à¹‡à¸‡"
+ "เà¸à¸£à¹‡à¸”"
+ "เà¸à¸£à¹ˆà¸­"
+ "เà¸à¸¥"
+ "เà¸à¸¥à¸­"
+ "เà¸à¸¥à¸²"
+ "เà¸à¸¥à¸µà¸¢à¸‡"
+ "เà¸à¸¥à¸µà¸¢à¸”"
+ "เà¸à¸¥à¸µà¸¢à¸§"
+ "เà¸à¸¥à¸µà¹ˆà¸¢"
+ "เà¸à¸¥à¸µà¹‰à¸¢"
+ "เà¸à¸¥à¸µà¹‰à¸¢à¸‡"
+ "เà¸à¸¥à¸·à¸­"
+ "เà¸à¸¥à¸·à¸­à¸"
+ "เà¸à¸¥à¸·à¹ˆà¸­à¸™"
+ "เà¸à¸¥à¸·à¹‰à¸­"
+ "เà¸à¸¥à¸·à¹‰à¸­à¸™"
+ "เà¸à¸¥à¹‡à¸”"
+ "เà¸à¸¥à¹‰à¸²"
+ "เà¸à¸§à¸µà¸¢à¸™"
+ "เà¸à¸¨"
+ "เà¸à¸¨à¸²"
+ "เà¸à¸¨à¸´à¸™à¸µ"
+ "เà¸à¸©à¸•ร"
+ "เà¸à¸©à¸•รà¸à¸£"
+ "เà¸à¸©à¸•รà¸à¸£à¸£à¸¡"
+ "เà¸à¸©à¸¡"
+ "เà¸à¸©à¸µà¸¢à¸“"
+ "เà¸à¸©à¸µà¸¢à¸™"
+ "เà¸à¸ªà¸£"
+ "เà¸à¸­"
+ "เà¸à¸­à¸£à¹Œ"
+ "เà¸à¸­à¸´à¸Šà¸²"
+ "เà¸à¸°"
+ "เà¸à¸°à¸à¸°"
+ "เà¸à¸²"
+ "เà¸à¸²à¸•์"
+ "เà¸à¸²à¸—ัณฑ์"
+ "เà¸à¸²à¸¥à¸±à¸”"
+ "เà¸à¸²à¸«à¸¥à¸µ"
+ "เà¸à¸²à¸°"
+ "เà¸à¸²à¹€à¸«à¸¥à¸²"
+ "เà¸à¸´à¸‡"
+ "เà¸à¸´à¸”"
+ "เà¸à¸´à¸™"
+ "เà¸à¸µà¸¢"
+ "เà¸à¸µà¸¢à¸‡"
+ "เà¸à¸µà¸¢à¸ˆ"
+ "เà¸à¸µà¸¢à¸”"
+ "เà¸à¸µà¸¢à¸™"
+ "เà¸à¸µà¸¢à¸£à¸•ิ"
+ "เà¸à¸µà¸¢à¸£à¸•ิคุณ"
+ "เà¸à¸µà¸¢à¸£à¸•ินิยม"
+ "เà¸à¸µà¸¢à¸£à¸•ิประวัติ"
+ "เà¸à¸µà¸¢à¸£à¸•ิภูมิ"
+ "เà¸à¸µà¸¢à¸£à¸•ิยศ"
+ "เà¸à¸µà¸¢à¸£à¸•ิศัà¸à¸”ิ์"
+ "เà¸à¸µà¸¢à¸£à¸•ิ์"
+ "เà¸à¸µà¸¢à¸£à¹Œ"
+ "เà¸à¸µà¹ˆà¸¢"
+ "เà¸à¸µà¹ˆà¸¢à¸‡"
+ "เà¸à¸µà¹ˆà¸¢à¸§"
+ "เà¸à¸µà¹‰à¸¢à¸¡à¸­à¸µà¹‹"
+ "เà¸à¸µà¹‰à¸¢à¸¡à¹„ฉ่"
+ "เà¸à¸µà¹‰à¸¢à¸§"
+ "เà¸à¸µà¹Šà¸¢à¸§"
+ "เà¸à¸µà¹Šà¸¢à¸°"
+ "เà¸à¸·à¸­à¸"
+ "เà¸à¸·à¸­à¸š"
+ "เà¸à¸·à¹‰à¸­"
+ "เà¸à¹€à¸£"
+ "เà¸à¹‡à¸‡"
+ "เà¸à¹‡à¸ˆ"
+ "เà¸à¹‡à¸š"
+ "เà¸à¹ˆà¸‡"
+ "เà¸à¹ˆà¸‡à¸à¸²à¸ˆ"
+ "เà¸à¹ˆà¸™"
+ "เà¸à¹ˆà¸²"
+ "เà¸à¹‰"
+ "เà¸à¹‰à¸‡"
+ "เà¸à¹‰à¸‡à¸à¹‰à¸²à¸‡"
+ "เà¸à¹‰à¸­"
+ "เà¸à¹‰à¸²"
+ "เà¸à¹‰à¸²à¸­à¸µà¹‰"
+ "เà¸à¹Š"
+ "เà¸à¹Šà¸"
+ "เà¸à¹Šà¸à¸®à¸§à¸¢"
+ "เà¸à¹‹"
+ "เà¸à¹‹à¸‡"
+ "เà¸à¹‹à¸²"
+ "เข"
+ "เขà¸"
+ "เขต"
+ "เขน"
+ "เขนง"
+ "เขนย"
+ "เขน็ด"
+ "เขบ็จขบวน"
+ "เขบ็ต"
+ "เขมร"
+ "เขมา"
+ "เขมือบ"
+ "เขม็ง"
+ "เขม็ดà¹à¸‚ม่"
+ "เขม่น"
+ "เขม่า"
+ "เขม้น"
+ "เขย"
+ "เขยà¸"
+ "เขยิบ"
+ "เขยื้อน"
+ "เขย่ง"
+ "เขย่า"
+ "เขย้อà¹à¸‚ย่ง"
+ "เขรอะ"
+ "เขลง"
+ "เขลอะ"
+ "เขละ"
+ "เขลา"
+ "เขลาะ"
+ "เขว"
+ "เขษม"
+ "เขฬะ"
+ "เขะขะ"
+ "เขา"
+ "เขิน"
+ "เขียง"
+ "เขียด"
+ "เขียน"
+ "เขียม"
+ "เขียว"
+ "เขี่ย"
+ "เขี้ยว"
+ "เขือ"
+ "เขื่อง"
+ "เขื่อน"
+ "เข็à¸"
+ "เข็ด"
+ "เข็น"
+ "เข็ม"
+ "เข่ง"
+ "เข่น"
+ "เข่า"
+ "เข้ม"
+ "เข้า"
+ "เคนยา"
+ "เคมี"
+ "เคย"
+ "เครง"
+ "เครดิต"
+ "เครา"
+ "เคราะห์"
+ "เครียด"
+ "เครือ"
+ "เครื่อง"
+ "เครื่องพิมพ์"
+ "เคร่ง"
+ "เคร่งครัด"
+ "เคลิบเคลิ้ม"
+ "เคลิ้ม"
+ "เคลีย"
+ "เคลือบ"
+ "เคลื่อน"
+ "เคล็ด"
+ "เคล้น"
+ "เคล้า"
+ "เคว้ง"
+ "เคห"
+ "เคหะ"
+ "เคหา"
+ "เคอร์เนล"
+ "เคอะ"
+ "เคาน์เตอร์"
+ "เคารพ"
+ "เคาะ"
+ "เคียง"
+ "เคียด"
+ "เคียน"
+ "เคียว"
+ "เคี่ยม"
+ "เคี่ยว"
+ "เคี้ยว"
+ "เคือง"
+ "เคเบิล"
+ "เค็ม"
+ "เค้à¸"
+ "เค้น"
+ "เค้า"
+ "เค้เà¸à¹‰"
+ "เฆี่ยน"
+ "เงà¸"
+ "เงย"
+ "เงอะ"
+ "เงอะงะ"
+ "เงา"
+ "เงาะ"
+ "เงิน"
+ "เงียบ"
+ "เงี่ยง"
+ "เงี่ยน"
+ "เงี่ยหู"
+ "เงี้ยว"
+ "เงือà¸"
+ "เงือด"
+ "เงือบ"
+ "เงื่อง"
+ "เงื่อน"
+ "เงื่อนไข"
+ "เงื้อ"
+ "เงื้อม"
+ "เง่า"
+ "เง้า"
+ "เจ"
+ "เจดียสถาน"
+ "เจดีย์"
+ "เจต"
+ "เจตคติ"
+ "เจตจำนง"
+ "เจตนา"
+ "เจตนารมณ์"
+ "เจตภูต"
+ "เจตสิà¸"
+ "เจน"
+ "เจมส์"
+ "เจรจา"
+ "เจริà¸"
+ "เจริด"
+ "เจว็ด"
+ "เจษฎา"
+ "เจอ"
+ "เจอร์"
+ "เจอะ"
+ "เจาะ"
+ "เจิด"
+ "เจิม"
+ "เจิ่ง"
+ "เจิ่น"
+ "เจียด"
+ "เจียน"
+ "เจียม"
+ "เจียระไน"
+ "เจียว"
+ "เจี๊ยบ"
+ "เจี๊ยว"
+ "เจี๊ยวจ๊าว"
+ "เจี๋ยน"
+ "เจี๋ยมเจี้ยม"
+ "เจือ"
+ "เจื่อน"
+ "เจื้อย"
+ "เจ็ด"
+ "เจ็บ"
+ "เจ่อ"
+ "เจ่า"
+ "เจ้า"
+ "เจ้าชู้"
+ "เจ๊"
+ "เจ๊à¸"
+ "เจ๊ง"
+ "เจ๊ต"
+ "เจ๊า"
+ "เจ๋อ"
+ "เฉ"
+ "เฉà¸"
+ "เฉด"
+ "เฉพาะ"
+ "เฉย"
+ "เฉยเมย"
+ "เฉลย"
+ "เฉลา"
+ "เฉลิม"
+ "เฉลียง"
+ "เฉลียว"
+ "เฉลี่ย"
+ "เฉวียง"
+ "เฉวียน"
+ "เฉอะà¹à¸‰à¸°"
+ "เฉา"
+ "เฉาà¸à¹Šà¸§à¸¢"
+ "เฉาะ"
+ "เฉิด"
+ "เฉิบ"
+ "เฉียง"
+ "เฉียด"
+ "เฉียบ"
+ "เฉียว"
+ "เฉี่ยว"
+ "เฉือน"
+ "เฉื่อย"
+ "เฉโà¸"
+ "เฉ่ง"
+ "เชน"
+ "เชย"
+ "เชล"
+ "เชลย"
+ "เชษà¸à¸²"
+ "เชอ"
+ "เชอร์"
+ "เชาวน์"
+ "เชาว์"
+ "เชิง"
+ "เชิà¸"
+ "เชิด"
+ "เชิ้ต"
+ "เชียง"
+ "เชียงใหม่"
+ "เชียบ"
+ "เชียร์"
+ "เชียว"
+ "เชี่ยน"
+ "เชี่ยว"
+ "เชือà¸"
+ "เชือด"
+ "เชือน"
+ "เชื่อ"
+ "เชื่อง"
+ "เชื่อม"
+ "เชื้อ"
+ "เช็ค"
+ "เช็ด"
+ "เช่น"
+ "เช่า"
+ "เช้ง"
+ "เช้า"
+ "เซ"
+ "เซต"
+ "เซน"
+ "เซนติà¸à¸£à¸±à¸¡"
+ "เซนติลิตร"
+ "เซนติเà¸à¸£à¸”"
+ "เซนติเมตร"
+ "เซนต์"
+ "เซปัà¸à¸•ระà¸à¸£à¹‰à¸­"
+ "เซฟ"
+ "เซรุ่ม"
+ "เซลลูลอยด์"
+ "เซลลูโลส"
+ "เซลล์"
+ "เซลส์"
+ "เซลเซียส"
+ "เซอ"
+ "เซอร์"
+ "เซอร์วิส"
+ "เซอะ"
+ "เซา"
+ "เซาะ"
+ "เซิง"
+ "เซิร์ฟเวอร์"
+ "เซิ้ง"
+ "เซียน"
+ "เซียมซี"
+ "เซียว"
+ "เซี่ยงไฮ้"
+ "เซื่อง"
+ "เซ็à¸à¹€à¸¡à¸™à¸•์"
+ "เซ็ง"
+ "เซ็น"
+ "เซ็นเตอร์"
+ "เซ่ง"
+ "เซ่น"
+ "เซ่อ"
+ "เซ้ง"
+ "เซ้าซี้"
+ "เฌอ"
+ "เฌอเอม"
+ "เฒ่า"
+ "เณร"
+ "เดà¸à¸‹à¹Œà¹‚ทรส"
+ "เดคาà¸à¸£à¸±à¸¡"
+ "เดคาลิตร"
+ "เดคาเมตร"
+ "เดช"
+ "เดชะ"
+ "เดซิà¸à¸£à¸±à¸¡"
+ "เดซิลิตร"
+ "เดซิเมตร"
+ "เดน"
+ "เดนมาร์à¸"
+ "เดนมาร์ค"
+ "เดบิต"
+ "เดรัจฉาน"
+ "เดลล์"
+ "เดวิด"
+ "เดสà¸à¹Œà¸—อป"
+ "เดอะ"
+ "เดา"
+ "เดาะ"
+ "เดิน"
+ "เดิม"
+ "เดีย"
+ "เดียง"
+ "เดียด"
+ "เดียร"
+ "เดียรดาษ"
+ "เดียรถีย์"
+ "เดียรัจฉาน"
+ "เดียว"
+ "เดียะ"
+ "เดี่ยว"
+ "เดี้ย"
+ "เดี๋ยว"
+ "เดือด"
+ "เดือน"
+ "เดือย"
+ "เดโช"
+ "เด็à¸"
+ "เด็จ"
+ "เด็ด"
+ "เด่"
+ "เด่น"
+ "เด่า"
+ "เด้ง"
+ "เด้า"
+ "เด๋อ"
+ "เด๋อด๋า"
+ "เตย"
+ "เตรีย"
+ "เตรียด"
+ "เตรียม"
+ "เตร็ด"
+ "เตร่"
+ "เตลิด"
+ "เตว็ด"
+ "เตอร์"
+ "เตอร์à¸à¸µ"
+ "เตอะ"
+ "เตะ"
+ "เตา"
+ "เตาะà¹à¸•ะ"
+ "เติบ"
+ "เติม"
+ "เติ่ง"
+ "เตียง"
+ "เตียน"
+ "เตียบ"
+ "เตี่ย"
+ "เตี่ยว"
+ "เตี้ย"
+ "เตี๋ยม"
+ "เตือน"
+ "เตื้อ"
+ "เต็ง"
+ "เต็นท์"
+ "เต็ม"
+ "เต่ง"
+ "เต่อ"
+ "เต่า"
+ "เต้น"
+ "เต้า"
+ "เต้าทึง"
+ "เต้าส่วน"
+ "เต้าหู้"
+ "เต้าฮวย"
+ "เต้าเจี้ยว"
+ "เต้าเสียบ"
+ "เต๊à¸"
+ "เต๊ะ"
+ "เต๋า"
+ "เถà¸à¸´à¸‡"
+ "เถน"
+ "เถร"
+ "เถระ"
+ "เถรานุเถระ"
+ "เถลิง"
+ "เถลือà¸à¸–ลน"
+ "เถลไถล"
+ "เถอะ"
+ "เถา"
+ "เถาวัลย์"
+ "เถาะ"
+ "เถิà¸"
+ "เถิด"
+ "เถิดเทิง"
+ "เถิน"
+ "เถียง"
+ "เถือ"
+ "เถือà¸"
+ "เถื่อน"
+ "เถ่อ"
+ "เถ้า"
+ "เท"
+ "เทคนิค"
+ "เทคโนโลยี"
+ "เทนนิส"
+ "เทป"
+ "เทพ"
+ "เทพดา"
+ "เทพธิดา"
+ "เทพนม"
+ "เทพยดา"
+ "เทพยเจ้า"
+ "เทพารัà¸à¸©à¹Œ"
+ "เทพี"
+ "เทพเจ้า"
+ "เทมปุระ"
+ "เทรดเดอร์"
+ "เทรนเนอร์"
+ "เทวดา"
+ "เทวทัณฑ์"
+ "เทวทูต"
+ "เทวธรรม"
+ "เทวธิดา"
+ "เทวนิยม"
+ "เทวรูป"
+ "เทวษ"
+ "เทวสถาน"
+ "เทวัà¸"
+ "เทวัน"
+ "เทวาลัย"
+ "เทวี"
+ "เทวโลà¸"
+ "เทศ"
+ "เทศà¸à¸²à¸¥"
+ "เทศนา"
+ "เทศน์"
+ "เทศบาล"
+ "เทศมนตรี"
+ "เทศาภิบาล"
+ "เทสต์"
+ "เทหวัตถุ"
+ "เทห์"
+ "เทอà¸"
+ "เทอม"
+ "เทอร์โมมิเตอร์"
+ "เทอะทะ"
+ "เทา"
+ "เทิด"
+ "เทิน"
+ "เทิบ"
+ "เทิ่ง"
+ "เทิ้ม"
+ "เทียน"
+ "เทียบ"
+ "เทียม"
+ "เทียว"
+ "เที่ยง"
+ "เที่ยว"
+ "เทือà¸"
+ "เทเบิล"
+ "เทเลคอม"
+ "เทเวศร์"
+ "เทเวศวร์"
+ "เทโพ"
+ "เท็จ"
+ "เท่"
+ "เท่อ"
+ "เท่า"
+ "เท้งเต้ง"
+ "เท้อ"
+ "เท้า"
+ "เธน"
+ "เธนส์"
+ "เธอ"
+ "เนคไท"
+ "เนต"
+ "เนตร"
+ "เนตสเคป"
+ "เนติ"
+ "เนบิวลา"
+ "เนปจูน"
+ "เนปาล"
+ "เนย"
+ "เนรคุณ"
+ "เนรมิต"
+ "เนรเทศ"
+ "เนา"
+ "เนิน"
+ "เนิบ"
+ "เนิ่น"
+ "เนีย"
+ "เนียน"
+ "เนียม"
+ "เนือง"
+ "เนือย"
+ "เนื่อง"
+ "เนื้อ"
+ "เน็ต"
+ "เน็ตเวิร์à¸"
+ "เน็ตเวิร์ค"
+ "เน่า"
+ "เน้น"
+ "เน้อ"
+ "เบ"
+ "เบคอน"
+ "เบงà¸à¸­à¸¥"
+ "เบà¸à¸ˆ"
+ "เบà¸à¸ˆà¸"
+ "เบà¸à¸ˆà¸à¸±à¸¥à¸¢à¸²à¸“ี"
+ "เบà¸à¸ˆà¸à¸²à¸¡à¸„ุณ"
+ "เบà¸à¸ˆà¸˜à¸£à¸£à¸¡"
+ "เบà¸à¸ˆà¸šà¸£à¸£à¸žà¸•"
+ "เบà¸à¸ˆà¸¡à¸²à¸¨"
+ "เบà¸à¸ˆà¸£à¸‡à¸„์"
+ "เบà¸à¸ˆà¸²"
+ "เบà¸à¸ˆà¸²à¸‡à¸„ประดิษà¸à¹Œ"
+ "เบà¸à¸ˆà¸²à¸‡à¸„์"
+ "เบà¸à¸ˆà¹€à¸žà¸ª"
+ "เบต้า"
+ "เบน"
+ "เบนซิน"
+ "เบนซ์"
+ "เบรà¸"
+ "เบร์à¸"
+ "เบลเยี่ยม"
+ "เบศ"
+ "เบส"
+ "เบสบอล"
+ "เบอร์"
+ "เบอร์ลิน"
+ "เบอะ"
+ "เบอะบะ"
+ "เบะ"
+ "เบา"
+ "เบาะ"
+ "เบาะà¹à¸ª"
+ "เบิà¸"
+ "เบิร์à¸"
+ "เบิ่ง"
+ "เบียด"
+ "เบียน"
+ "เบียร์"
+ "เบี่ยง"
+ "เบี้ย"
+ "เบี้ยว"
+ "เบือ"
+ "เบือน"
+ "เบื่อ"
+ "เบื้อ"
+ "เบื้อง"
+ "เบ็ด"
+ "เบ็ดเตล็ด"
+ "เบ็ดเสร็จ"
+ "เบ่ง"
+ "เบ้"
+ "เบ้อ"
+ "เบ้อเริ่ม"
+ "เบ้อเร่อ"
+ "เบ้า"
+ "เปà¸"
+ "เปรต"
+ "เปรม"
+ "เปรย"
+ "เปรอ"
+ "เปรอะ"
+ "เปราะ"
+ "เปรียง"
+ "เปรียà¸"
+ "เปรียบ"
+ "เปรียว"
+ "เปรียะ"
+ "เปรี้ยง"
+ "เปรี้ยว"
+ "เปรี๊ยะ"
+ "เปรื่อง"
+ "เปรื้อย"
+ "เปล"
+ "เปลว"
+ "เปลาะ"
+ "เปลี่ยน"
+ "เปลี่ยว"
+ "เปลี้ย"
+ "เปลือà¸"
+ "เปลือง"
+ "เปลือย"
+ "เปลื้อง"
+ "เปล่ง"
+ "เปล่า"
+ "เปอ"
+ "เปอร์"
+ "เปอร์เซ็นต์"
+ "เปะ"
+ "เปา"
+ "เปาะ"
+ "เปาเปา"
+ "เปิà¸"
+ "เปิง"
+ "เปิด"
+ "เปิบ"
+ "เปิ่น"
+ "เปิ๊บ"
+ "เปีย"
+ "เปียà¸"
+ "เปี่ยม"
+ "เปี้ยว"
+ "เปี๊ยà¸"
+ "เปี๊ยะ"
+ "เปือà¸"
+ "เปื่อย"
+ "เปื้อน"
+ "เป็ด"
+ "เป็น"
+ "เป็นต้น"
+ "เป่ง"
+ "เป่า"
+ "เป้"
+ "เป้ง"
+ "เป้า"
+ "เป๊à¸"
+ "เป๋"
+ "เป๋ง"
+ "เป๋อ"
+ "เป๋อเหลอ"
+ "เป๋า"
+ "เป๋าฮื้อ"
+ "เผ"
+ "เผง"
+ "เผชิà¸"
+ "เผดิม"
+ "เผดียง"
+ "เผด็จ"
+ "เผย"
+ "เผยอ"
+ "เผลอ"
+ "เผลอไผล"
+ "เผละ"
+ "เผลาะ"
+ "เผล่"
+ "เผอิà¸"
+ "เผอเรอ"
+ "เผะ"
+ "เผา"
+ "เผาะ"
+ "เผิน"
+ "เผือà¸"
+ "เผือด"
+ "เผื่อ"
+ "เผ็ด"
+ "เผ่น"
+ "เผ่า"
+ "เผ้า"
+ "เà¸à¸·à¸­"
+ "เà¸à¸·à¸­à¸"
+ "เà¸à¸·à¹ˆà¸­à¸™"
+ "เà¸à¹‰à¸²"
+ "เพ"
+ "เพจ"
+ "เพชฌฆาต"
+ "เพชร"
+ "เพชรายุธ"
+ "เพดาน"
+ "เพทนา"
+ "เพทาย"
+ "เพทุบาย"
+ "เพนà¸à¸§à¸´à¸™"
+ "เพนียด"
+ "เพนเทียม"
+ "เพรง"
+ "เพรา"
+ "เพราะ"
+ "เพริด"
+ "เพริศ"
+ "เพรียà¸"
+ "เพรียง"
+ "เพรียบ"
+ "เพรียว"
+ "เพรื่อ"
+ "เพล"
+ "เพลง"
+ "เพลา"
+ "เพลาะ"
+ "เพลิง"
+ "เพลิดเพลิน"
+ "เพลิน"
+ "เพลีย"
+ "เพลี่ยง"
+ "เพลี้ย"
+ "เพศ"
+ "เพาะ"
+ "เพิà¸"
+ "เพิง"
+ "เพิ่ง"
+ "เพิ่ม"
+ "เพียง"
+ "เพียบ"
+ "เพียร"
+ "เพี้ย"
+ "เพี้ยง"
+ "เพี้ยน"
+ "เพื่อ"
+ "เพื่อน"
+ "เพ็ง"
+ "เพ็จ"
+ "เพ็à¸"
+ "เพ็ดทูล"
+ "เพ่ง"
+ "เพ่นพ่าน"
+ "เพ่อ"
+ "เพ้อ"
+ "เฟด"
+ "เฟอ"
+ "เฟอร์"
+ "เฟอร์นิเจอร์"
+ "เฟอร์เมียม"
+ "เฟอะ"
+ "เฟะ"
+ "เฟิน"
+ "เฟี้ยม"
+ "เฟี้ยว"
+ "เฟือ"
+ "เฟือง"
+ "เฟือน"
+ "เฟือย"
+ "เฟื่อง"
+ "เฟื้อ"
+ "เฟื้อง"
+ "เฟื้อย"
+ "เฟ็ด"
+ "เฟ้น"
+ "เฟ้อ"
+ "เภตรา"
+ "เภท"
+ "เภทุบาย"
+ "เภรี"
+ "เภสัช"
+ "เม"
+ "เมà¸à¸°"
+ "เมà¸à¸°à¹€à¸®à¸´à¸£à¸•ซ์"
+ "เมขลา"
+ "เมฆ"
+ "เมฆา"
+ "เมฆินทร์"
+ "เมฆี"
+ "เมตตา"
+ "เมตร"
+ "เมตริà¸"
+ "เมถุน"
+ "เมทนี"
+ "เมทินี"
+ "เมธา"
+ "เมธี"
+ "เมนทอล"
+ "เมนบอร์ด"
+ "เมนู"
+ "เมมโมรี"
+ "เมรัย"
+ "เมรุ"
+ "เมลือง"
+ "เมลื่อย"
+ "เมลื้อย"
+ "เมล็ด"
+ "เมล์"
+ "เมษ"
+ "เมษายน"
+ "เมะ"
+ "เมา"
+ "เมาลี"
+ "เมาส์"
+ "เมาฬี"
+ "เมาะ"
+ "เมิน"
+ "เมีย"
+ "เมียง"
+ "เมี่ยง"
+ "เมี้ยน"
+ "เมือà¸"
+ "เมือง"
+ "เมื่อ"
+ "เมื่อย"
+ "เมโมรี"
+ "เม็à¸à¸‹à¸´à¹‚à¸"
+ "เม็ด"
+ "เม่น"
+ "เม่า"
+ "เม้ม"
+ "เม้าส์"
+ "เย"
+ "เยง"
+ "เยซู"
+ "เยน"
+ "เยอ"
+ "เยอรมัน"
+ "เยอรมันนี"
+ "เยอรมันี"
+ "เยอะ"
+ "เยา"
+ "เยาวชน"
+ "เยาวพา"
+ "เยาวพาน"
+ "เยาวมาลย์"
+ "เยาวยอด"
+ "เยาวราช"
+ "เยาวลัà¸à¸©à¸“์"
+ "เยาวเรศ"
+ "เยาว์"
+ "เยาะ"
+ "เยิน"
+ "เยิบ"
+ "เยิ่น"
+ "เยิ่นเย้อ"
+ "เยิ้ม"
+ "เยีย"
+ "เยียน"
+ "เยียบ"
+ "เยียว"
+ "เยี่ยง"
+ "เยี่ยม"
+ "เยี่ยว"
+ "เยือà¸"
+ "เยือน"
+ "เยื่อ"
+ "เยื้อ"
+ "เยื้อง"
+ "เยื้อน"
+ "เย็น"
+ "เย็บ"
+ "เย่น"
+ "เย่อ"
+ "เย้"
+ "เย้ย"
+ "เย้า"
+ "เรข"
+ "เรขา"
+ "เรขาคณิต"
+ "เรณู"
+ "เรดอน"
+ "เรดาร์"
+ "เรรวน"
+ "เรวดี"
+ "เรอ"
+ "เรา"
+ "เราะ"
+ "เริง"
+ "เริด"
+ "เริม"
+ "เริ่ม"
+ "เริ้ม"
+ "เรียà¸"
+ "เรียง"
+ "เรียด"
+ "เรียน"
+ "เรียบ"
+ "เรียม"
+ "เรียว"
+ "เรี่ย"
+ "เรี่ยม"
+ "เรี่ยว"
+ "เรี้ยวรà¸"
+ "เรือ"
+ "เรือà¸"
+ "เรือง"
+ "เรือด"
+ "เรือน"
+ "เรื่อ"
+ "เรื่อง"
+ "เรื่อย"
+ "เรื้อ"
+ "เรื้อน"
+ "เรไร"
+ "เร็ว"
+ "เร่"
+ "เร่ง"
+ "เร่อ"
+ "เร่า"
+ "เร้น"
+ "เร้า"
+ "เลข"
+ "เลขา"
+ "เลขาธิà¸à¸²à¸£"
+ "เลขานุà¸à¸²à¸£"
+ "เลดี้"
+ "เลต"
+ "เลน"
+ "เลนส์"
+ "เลบานอน"
+ "เลย"
+ "เลว"
+ "เลศ"
+ "เลหลัง"
+ "เลอ"
+ "เลอะ"
+ "เลอะเทอะ"
+ "เละ"
+ "เละเทะ"
+ "เลา"
+ "เลาะ"
+ "เลิà¸"
+ "เลิà¸à¸¥à¸±à¹ˆà¸"
+ "เลินเล่อ"
+ "เลิศ"
+ "เลิ้ง"
+ "เลีย"
+ "เลียง"
+ "เลียน"
+ "เลียบ"
+ "เลียม"
+ "เลียว"
+ "เลี่ยง"
+ "เลี่ยน"
+ "เลี่ยม"
+ "เลี้ยง"
+ "เลี้ยว"
+ "เลือà¸"
+ "เลือด"
+ "เลือน"
+ "เลื่อง"
+ "เลื่อน"
+ "เลื่อม"
+ "เลื่อมใส"
+ "เลื่อย"
+ "เลื้อย"
+ "เลเซอร์"
+ "เลเพ"
+ "เล็à¸"
+ "เล็ง"
+ "เล็ด"
+ "เล็น"
+ "เล็บ"
+ "เล็ม"
+ "เล่น"
+ "เล่ม"
+ "เล่ห์"
+ "เล่อ"
+ "เล่า"
+ "เล้ง"
+ "เล้า"
+ "เวค"
+ "เวคิน"
+ "เวคี"
+ "เวจ"
+ "เวช"
+ "เวชà¸à¸£à¸£à¸¡"
+ "เวà¸à¸™à¹Œ"
+ "เวณะ"
+ "เวณิ"
+ "เวณิà¸"
+ "เวณุ"
+ "เวตน์"
+ "เวตร"
+ "เวตาล"
+ "เวท"
+ "เวทนา"
+ "เวทย์"
+ "เวทางคศาสตร์"
+ "เวทางค์"
+ "เวทานตะ"
+ "เวทานต์"
+ "เวทิ"
+ "เวที"
+ "เวธะ"
+ "เวน"
+ "เวนิส"
+ "เวนไตย"
+ "เวบไซต์"
+ "เวมบลีย์"
+ "เวมะ"
+ "เวมัต"
+ "เวมาติà¸"
+ "เวร"
+ "เวรมณี"
+ "เวรัณ"
+ "เวรัณณิยะ"
+ "เวรี"
+ "เวลส์"
+ "เวลา"
+ "เวศม์"
+ "เวศยา"
+ "เวศย์"
+ "เวสต์"
+ "เวสน์"
+ "เวสภู"
+ "เวสมะ"
+ "เวสม์"
+ "เวสวัณ"
+ "เวสสะ"
+ "เวสสันดร"
+ "เวสสุà¸à¸£à¸£à¸¡"
+ "เวสสุวัณ"
+ "เวสารัช"
+ "เวสิ"
+ "เวสิยา"
+ "เวหน"
+ "เวหะ"
+ "เวหังค์"
+ "เวหัปติ"
+ "เวหา"
+ "เวหายส"
+ "เวหาส"
+ "เวฬุ"
+ "เวอ"
+ "เวอร์"
+ "เวอร์ชัน"
+ "เวิà¸"
+ "เวิร์à¸à¸ªà¹€à¸•ชัน"
+ "เวิร์ด"
+ "เวิ้ง"
+ "เวียง"
+ "เวียดนาม"
+ "เวียน"
+ "เวโรจน์"
+ "เวไนย"
+ "เว็บ"
+ "เว็ป"
+ "เว่อ"
+ "เว้"
+ "เว้น"
+ "เว้ย"
+ "เว้า"
+ "เศรษà¸à¸à¸´à¸ˆ"
+ "เศรษà¸à¸¨à¸²à¸ªà¸•ร์"
+ "เศรษà¸à¸²à¸™à¸°"
+ "เศรษà¸à¸µ"
+ "เศรษà¸à¹Œ"
+ "เศร้า"
+ "เศวต"
+ "เศษ"
+ "เศียร"
+ "เส"
+ "เสà¸"
+ "เสงี่ยม"
+ "เสฉวน"
+ "เสด"
+ "เสด็จ"
+ "เสถียร"
+ "เสถียรภาพ"
+ "เสน"
+ "เสนง"
+ "เสนหา"
+ "เสนอ"
+ "เสนะ"
+ "เสนา"
+ "เสนาธิà¸à¸²à¸£"
+ "เสนาบดี"
+ "เสนาสนะ"
+ "เสนาะ"
+ "เสนียด"
+ "เสนีย์"
+ "เสน่ง"
+ "เสน่หา"
+ "เสน่ห์"
+ "เสน่า"
+ "เสบย"
+ "เสบียง"
+ "เสพ"
+ "เสพย์"
+ "เสภา"
+ "เสมหะ"
+ "เสมอ"
+ "เสมา"
+ "เสมียน"
+ "เสมือน"
+ "เสม็ด"
+ "เสย"
+ "เสริด"
+ "เสริฟ"
+ "เสริม"
+ "เสรี"
+ "เสร็จ"
+ "เสลด"
+ "เสลา"
+ "เสลี่ยง"
+ "เสลือà¸à¸ªà¸¥à¸™"
+ "เสวà¸"
+ "เสวà¸à¸²à¸¡à¸²à¸•ย์"
+ "เสวนะ"
+ "เสวนา"
+ "เสวย"
+ "เสวียน"
+ "เสา"
+ "เสารภย์"
+ "เสาร์"
+ "เสาวคนธ์"
+ "เสาวณิต"
+ "เสาวนา"
+ "เสาวนีย์"
+ "เสาวภา"
+ "เสาวภาคย์"
+ "เสาวภาพ"
+ "เสาวรส"
+ "เสาวลัà¸à¸©à¸“์"
+ "เสาะ"
+ "เสิร์ฟ"
+ "เสีย"
+ "เสียง"
+ "เสียด"
+ "เสียบ"
+ "เสียม"
+ "เสียว"
+ "เสี่ย"
+ "เสี่ยง"
+ "เสี่ยว"
+ "เสี้ยน"
+ "เสี้ยม"
+ "เสี้ยว"
+ "เสือ"
+ "เสือà¸"
+ "เสื่อ"
+ "เสื่อม"
+ "เสื้อ"
+ "เสเพล"
+ "เสโท"
+ "เสโล"
+ "เส็งเคร็ง"
+ "เส้ง"
+ "เส้น"
+ "เส้า"
+ "เห"
+ "เหง"
+ "เหงา"
+ "เหงือà¸"
+ "เหงื่อ"
+ "เหง่ง"
+ "เหตุ"
+ "เหตุà¸à¸²à¸£à¸“์"
+ "เหนอะ"
+ "เหนอะหนะ"
+ "เหนาะ"
+ "เหนียง"
+ "เหนียม"
+ "เหนียว"
+ "เหนี่ยว"
+ "เหนือ"
+ "เหนื่อย"
+ "เหน็ด"
+ "เหน็บ"
+ "เหน่ง"
+ "เหน่อ"
+ "เหน้า"
+ "เหม"
+ "เหมวดี"
+ "เหมันต์"
+ "เหมา"
+ "เหมาะ"
+ "เหมียว"
+ "เหมี่ยว"
+ "เหมือง"
+ "เหมือด"
+ "เหมือน"
+ "เหม็น"
+ "เหม่"
+ "เหม่ง"
+ "เหม่อ"
+ "เหย"
+ "เหยง"
+ "เหยาะ"
+ "เหยิง"
+ "เหยียด"
+ "เหยียบ"
+ "เหยี่ยว"
+ "เหยือà¸"
+ "เหยื่อ"
+ "เหย้า"
+ "เหรัà¸à¸à¸´à¸"
+ "เหรา"
+ "เหรียà¸"
+ "เหลน"
+ "เหลว"
+ "เหลอ"
+ "เหลา"
+ "เหลาะà¹à¸«à¸¥à¸°"
+ "เหลิง"
+ "เหลียน"
+ "เหลียว"
+ "เหลี่ยม"
+ "เหลือ"
+ "เหลือà¸"
+ "เหลือง"
+ "เหลือบ"
+ "เหลื่อม"
+ "เหล็à¸"
+ "เหล่"
+ "เหล่า"
+ "เหล้า"
+ "เหว"
+ "เหวง"
+ "เหวย"
+ "เหวอะ"
+ "เหวอะหวะ"
+ "เหวี่ยง"
+ "เหว่"
+ "เหอะ"
+ "เหา"
+ "เหาะ"
+ "เหิน"
+ "เหิม"
+ "เหียน"
+ "เหี่ยว"
+ "เหี้ย"
+ "เหี้ยน"
+ "เหี้ยม"
+ "เหือด"
+ "เหื่อ"
+ "เห็จ"
+ "เห็ด"
+ "เห็น"
+ "เห็บ"
+ "เห่"
+ "เห่อ"
+ "เห่า"
+ "เอ"
+ "เอà¸"
+ "เอà¸à¸‰à¸±à¸™à¸—์"
+ "เอà¸à¸Šà¸™"
+ "เอà¸à¸‹à¹€à¸£à¸¢à¹Œ"
+ "เอà¸à¸‹à¹‚ป"
+ "เอà¸à¸ à¸ž"
+ "เอà¸à¸ à¸²à¸ž"
+ "เอà¸à¸¡à¸±à¸¢"
+ "เอà¸à¸£à¸£à¸–ประโยค"
+ "เอà¸à¸£à¸²à¸Š"
+ "เอà¸à¸¥à¸±à¸à¸©à¸“์"
+ "เอà¸à¸ªà¸²à¸£"
+ "เอà¸à¸±à¸„ตา"
+ "เอà¸à¸²à¸˜à¸´à¸›à¹„ตย"
+ "เอà¸à¹€à¸‚นà¸"
+ "เอà¸à¹€à¸—ศ"
+ "เอง"
+ "เอชพี"
+ "เอดส์"
+ "เอดิเตอร์"
+ "เอตทัคคะ"
+ "เอทีเอ็ม"
+ "เอน"
+ "เอนทรานซ์"
+ "เอนไซม์"
+ "เอปสัน"
+ "เอม"
+ "เอย"
+ "เอราวัณ"
+ "เอร็ดอร่อย"
+ "เอว"
+ "เอวัง"
+ "เอส"
+ "เอฬà¸"
+ "เอฬา"
+ "เออ"
+ "เอะอะ"
+ "เอะใจ"
+ "เอา"
+ "เอาท์พุต"
+ "เอาฬาร"
+ "เอิà¸"
+ "เอิบ"
+ "เอิ้น"
+ "เอียง"
+ "เอียด"
+ "เอียน"
+ "เอี่ยน"
+ "เอี่ยม"
+ "เอี่ยว"
+ "เอี้ยง"
+ "เอี้ยมเฟี้ยม"
+ "เอี้ยว"
+ "เอี๊ยด"
+ "เอี๊ยม"
+ "เอี๊ยมจุ๊น"
+ "เอือน"
+ "เอือม"
+ "เอื่อย"
+ "เอื้อ"
+ "เอื้อง"
+ "เอื้อน"
+ "เอื้อม"
+ "เอื้อย"
+ "เอเคอร์"
+ "เอเชีย"
+ "เอเชี่ยนเà¸à¸¡à¸ªà¹Œ"
+ "เอเซีย"
+ "เอเย่นต์"
+ "เอà¹à¸šà¸„"
+ "เอ็à¸à¸‹à¹Œ"
+ "เอ็à¸à¸‹à¹Œà¸žà¸¥à¸­à¹€à¸£à¸­à¸£à¹Œ"
+ "เอ็à¸à¸‹à¹Œà¹€à¸žà¸£à¸ª"
+ "เอ็ง"
+ "เอ็ด"
+ "เอ็ดตะโร"
+ "เอ็ดอึง"
+ "เอ็น"
+ "เอ็นดู"
+ "เอ็นเตอร์เทน"
+ "เอ่ย"
+ "เอ่อ"
+ "เอ้"
+ "เอ้à¸à¸²"
+ "เอ้อระเหย"
+ "เอ้อเฮอ"
+ "เอ๊à¸"
+ "เอ๊ย"
+ "เอ๊ะ"
+ "เอ๋"
+ "เอ๋ง"
+ "เอ๋ย"
+ "เฮ"
+ "เฮง"
+ "เฮย"
+ "เฮลิคอปเตอร์"
+ "เฮิรตซ์"
+ "เฮีย"
+ "เฮี้ยน"
+ "เฮี้ยบ"
+ "เฮี้ยว"
+ "เฮือà¸"
+ "เฮือน"
+ "เฮโรอีน"
+ "เฮโล"
+ "เฮ้ย"
+ "เฮ้ว"
+ "เฮ้อ"
+ "à¹à¸"
+ "à¹à¸à¸‡"
+ "à¹à¸à¸™"
+ "à¹à¸à¸¡"
+ "à¹à¸à¸¡à¸¡à¸²"
+ "à¹à¸à¸£à¸"
+ "à¹à¸à¸£à¸™à¸´à¸•"
+ "à¹à¸à¸£à¸°"
+ "à¹à¸à¸£à¹„ฟต์"
+ "à¹à¸à¸£à¹‡à¸™"
+ "à¹à¸à¸£à¹ˆà¸‡"
+ "à¹à¸à¸£à¹ˆà¸§"
+ "à¹à¸à¸¥"
+ "à¹à¸à¸¥à¸š"
+ "à¹à¸à¸¥à¸¥à¸­à¸™"
+ "à¹à¸à¸¥à¸°"
+ "à¹à¸à¸¥à¹€à¸¥à¸µà¸¢à¸¡"
+ "à¹à¸à¸¥à¹‰à¸‡"
+ "à¹à¸à¸¥à¹‰à¸¡"
+ "à¹à¸à¸¥à¹‰à¸§"
+ "à¹à¸à¸§"
+ "à¹à¸à¸§à¹ˆà¸‡"
+ "à¹à¸à¸§à¹ˆà¸™"
+ "à¹à¸à¸°"
+ "à¹à¸à¹‚ดลิเนียม"
+ "à¹à¸à¹ˆ"
+ "à¹à¸à¹ˆà¸‡"
+ "à¹à¸à¹ˆà¸‡à¹à¸¢à¹ˆà¸‡"
+ "à¹à¸à¹ˆà¸™"
+ "à¹à¸à¹‰"
+ "à¹à¸à¹‰à¸‡"
+ "à¹à¸à¹‰à¸¡"
+ "à¹à¸à¹‰à¸§"
+ "à¹à¸à¹Šà¸‡"
+ "à¹à¸à¹Šà¸›"
+ "à¹à¸à¹Šà¸ª"
+ "à¹à¸‚"
+ "à¹à¸‚à¸"
+ "à¹à¸‚น"
+ "à¹à¸‚นง"
+ "à¹à¸‚ม"
+ "à¹à¸‚ม็บ"
+ "à¹à¸‚ม่ว"
+ "à¹à¸‚ยง"
+ "à¹à¸‚ย็à¸"
+ "à¹à¸‚ย่ง"
+ "à¹à¸‚วà¸"
+ "à¹à¸‚วง"
+ "à¹à¸‚วน"
+ "à¹à¸‚วะ"
+ "à¹à¸‚็ง"
+ "à¹à¸‚่ง"
+ "à¹à¸‚่งขัน"
+ "à¹à¸‚้ง"
+ "à¹à¸‚้น"
+ "à¹à¸„"
+ "à¹à¸„ชเชียร์"
+ "à¹à¸„ชเมียร์"
+ "à¹à¸„ตตาลอค"
+ "à¹à¸„น"
+ "à¹à¸„บ"
+ "à¹à¸„ปซูล"
+ "à¹à¸„ม"
+ "à¹à¸„รง"
+ "à¹à¸„ระ"
+ "à¹à¸„ร่"
+ "à¹à¸„ร์"
+ "à¹à¸„ลคูลัส"
+ "à¹à¸„ลง"
+ "à¹à¸„ลน"
+ "à¹à¸„ลอรี"
+ "à¹à¸„ลิฟอร์เนีย"
+ "à¹à¸„ลเซียม"
+ "à¹à¸„ล่วคล่อง"
+ "à¹à¸„ล้ว"
+ "à¹à¸„ว"
+ "à¹à¸„วà¸"
+ "à¹à¸„ว้น"
+ "à¹à¸„ะ"
+ "à¹à¸„่"
+ "à¹à¸„่น"
+ "à¹à¸„้น"
+ "à¹à¸‡"
+ "à¹à¸‡à¸°"
+ "à¹à¸‡à¹ˆ"
+ "à¹à¸‡à¹ˆà¸‡"
+ "à¹à¸‡à¹ˆà¸™"
+ "à¹à¸‡à¹‰à¸¡"
+ "à¹à¸ˆ"
+ "à¹à¸ˆà¸"
+ "à¹à¸ˆà¸‡"
+ "à¹à¸ˆà¸§"
+ "à¹à¸ˆà¸°"
+ "à¹à¸ˆà¹ˆà¸¡"
+ "à¹à¸ˆà¹ˆà¸§"
+ "à¹à¸ˆà¹‰"
+ "à¹à¸ˆà¹‰à¸‡"
+ "à¹à¸ˆà¹‰à¸™"
+ "à¹à¸ˆà¹‰à¸§"
+ "à¹à¸ˆà¹Šà¸”"
+ "à¹à¸ˆà¹‹"
+ "à¹à¸ˆà¹‹à¸§"
+ "à¹à¸ˆà¹‹à¸§à¹à¸«à¸§à¸§"
+ "à¹à¸‰"
+ "à¹à¸‰à¸"
+ "à¹à¸‰à¸‡"
+ "à¹à¸‰à¸¥à¸š"
+ "à¹à¸‰à¸¥à¸°"
+ "à¹à¸‰à¸¥à¹‰à¸¡"
+ "à¹à¸‰à¸°"
+ "à¹à¸‰à¹ˆ"
+ "à¹à¸‰à¹ˆà¸‡"
+ "à¹à¸Š"
+ "à¹à¸Šà¸¡à¸›à¹Œ"
+ "à¹à¸Šà¸¡à¹€à¸›à¸"
+ "à¹à¸Šà¸£à¹Œ"
+ "à¹à¸Šà¸¥à¹ˆà¸¡"
+ "à¹à¸Šà¹ˆ"
+ "à¹à¸Šà¹ˆà¸‡"
+ "à¹à¸Šà¹ˆà¸¡"
+ "à¹à¸‹à¸‡"
+ "à¹à¸‹à¸”"
+ "à¹à¸‹à¸™à¸”์วิช"
+ "à¹à¸‹à¸š"
+ "à¹à¸‹à¸¡"
+ "à¹à¸‹à¸¢à¸´à¸”"
+ "à¹à¸‹à¸§"
+ "à¹à¸‹à¸°"
+ "à¹à¸‹à¹ˆ"
+ "à¹à¸‹à¹ˆà¸§"
+ "à¹à¸”"
+ "à¹à¸”à¸"
+ "à¹à¸”ง"
+ "à¹à¸”ด"
+ "à¹à¸”น"
+ "à¹à¸”ะ"
+ "à¹à¸”็à¸"
+ "à¹à¸”่"
+ "à¹à¸”่น"
+ "à¹à¸”่ว"
+ "à¹à¸•à¸"
+ "à¹à¸•ง"
+ "à¹à¸•งà¸à¸§à¸²"
+ "à¹à¸•งเม"
+ "à¹à¸•งโม"
+ "à¹à¸•ด"
+ "à¹à¸•น"
+ "à¹à¸•ร"
+ "à¹à¸•ะ"
+ "à¹à¸•่"
+ "à¹à¸•่ง"
+ "à¹à¸•้"
+ "à¹à¸•้จิ๋ว"
+ "à¹à¸•้ม"
+ "à¹à¸•๊ดà¹à¸•๋"
+ "à¹à¸–"
+ "à¹à¸–à¸"
+ "à¹à¸–บ"
+ "à¹à¸–ม"
+ "à¹à¸–ลง"
+ "à¹à¸–ว"
+ "à¹à¸—ง"
+ "à¹à¸—น"
+ "à¹à¸—นทาลัม"
+ "à¹à¸—บ"
+ "à¹à¸—รà¸"
+ "à¹à¸—รà¸à¹€à¸•อร์"
+ "à¹à¸—ะ"
+ "à¹à¸—็à¸à¸‹à¸µà¹ˆ"
+ "à¹à¸—็งà¸à¹Œà¸™à¹‰à¸³"
+ "à¹à¸—่ง"
+ "à¹à¸—่น"
+ "à¹à¸—้"
+ "à¹à¸—้ง"
+ "à¹à¸™à¸š"
+ "à¹à¸™à¸¡"
+ "à¹à¸™à¸§"
+ "à¹à¸™à¸°"
+ "à¹à¸™à¹ˆ"
+ "à¹à¸™à¹ˆà¸‡"
+ "à¹à¸™à¹ˆà¸™"
+ "à¹à¸™à¹ˆà¸§"
+ "à¹à¸™à¹ˆà¸°"
+ "à¹à¸š"
+ "à¹à¸šà¸"
+ "à¹à¸šà¸„ทีเรีย"
+ "à¹à¸šà¸‡à¸à¹Œ"
+ "à¹à¸šà¸‡à¸„์"
+ "à¹à¸šà¸”มินตัน"
+ "à¹à¸šà¸•เตอรี่"
+ "à¹à¸šà¸™"
+ "à¹à¸šà¸™à¹‚จ"
+ "à¹à¸šà¸š"
+ "à¹à¸šà¸°"
+ "à¹à¸šà¹€à¸£à¸µà¸¢à¸¡"
+ "à¹à¸šà¹‡à¸š"
+ "à¹à¸šà¹ˆà¸‡"
+ "à¹à¸›"
+ "à¹à¸›à¸‹à¸´à¸Ÿà¸´à¸„"
+ "à¹à¸›à¸”"
+ "à¹à¸›à¸š"
+ "à¹à¸›à¸£"
+ "à¹à¸›à¸£à¸"
+ "à¹à¸›à¸£à¸‡"
+ "à¹à¸›à¸£à¸›à¸£à¸§à¸™"
+ "à¹à¸›à¸£à¸°"
+ "à¹à¸›à¸£à¹ˆà¸‡"
+ "à¹à¸›à¸£à¹‰à¸™"
+ "à¹à¸›à¸£à¹Šà¸”"
+ "à¹à¸›à¸£à¹‹"
+ "à¹à¸›à¸¥"
+ "à¹à¸›à¸¥à¸"
+ "à¹à¸›à¸¥à¸‡"
+ "à¹à¸›à¸¥à¸™"
+ "à¹à¸›à¸¥à¸š"
+ "à¹à¸›à¸¥à¹‰"
+ "à¹à¸›à¸°"
+ "à¹à¸›à¹‰à¸‡"
+ "à¹à¸›à¹‰à¸™"
+ "à¹à¸›à¹‰à¸§"
+ "à¹à¸›à¹Šà¸”"
+ "à¹à¸›à¹Šà¸š"
+ "à¹à¸›à¹Šà¸°"
+ "à¹à¸›à¹Šà¸°à¸‹à¸°"
+ "à¹à¸›à¹‹à¸‡"
+ "à¹à¸›à¹‹à¸§"
+ "à¹à¸œà¸"
+ "à¹à¸œà¸‡"
+ "à¹à¸œà¸”"
+ "à¹à¸œà¸™"
+ "à¹à¸œà¸™à¸"
+ "à¹à¸œà¸¥"
+ "à¹à¸œà¸¥à¸‡"
+ "à¹à¸œà¸¥à¸°"
+ "à¹à¸œà¸¥à¹‡à¸š"
+ "à¹à¸œà¸¥à¹‡à¸§"
+ "à¹à¸œà¹ˆ"
+ "à¹à¸œà¹ˆà¸™"
+ "à¹à¸œà¹ˆà¸§"
+ "à¹à¸œà¹‰à¸§"
+ "à¹à¸à¸"
+ "à¹à¸à¸‡"
+ "à¹à¸à¸”"
+ "à¹à¸ž"
+ "à¹à¸žà¸‡"
+ "à¹à¸žà¸‡à¸žà¸§à¸¢"
+ "à¹à¸žà¸—ยศาสตร์"
+ "à¹à¸žà¸—ยสภา"
+ "à¹à¸žà¸—ยา"
+ "à¹à¸žà¸—ย์"
+ "à¹à¸žà¸™"
+ "à¹à¸žà¸™à¸"
+ "à¹à¸žà¸™à¸‡à¹€à¸Šà¸´à¸"
+ "à¹à¸žà¸£"
+ "à¹à¸žà¸£à¸"
+ "à¹à¸žà¸£à¸§"
+ "à¹à¸žà¸£à¹ˆ"
+ "à¹à¸žà¸£à¹ˆà¸‡"
+ "à¹à¸žà¸£à¹‰à¸§"
+ "à¹à¸žà¸¥à¸‡"
+ "à¹à¸žà¸¥à¸•ฟอร์ม"
+ "à¹à¸žà¸¥à¸—ินัม"
+ "à¹à¸žà¸¥à¸¡"
+ "à¹à¸žà¸¨à¸¢à¸²"
+ "à¹à¸žà¸¨à¸¢à¹Œ"
+ "à¹à¸žà¸°"
+ "à¹à¸žà¹‡à¸"
+ "à¹à¸žà¹‡à¸„เà¸à¸ˆ"
+ "à¹à¸žà¹ˆà¸‡"
+ "à¹à¸žà¹ˆà¸™"
+ "à¹à¸žà¹‰"
+ "à¹à¸žà¹‰à¸§"
+ "à¹à¸Ÿà¸à¸‹à¹Œ"
+ "à¹à¸Ÿà¸‡"
+ "à¹à¸Ÿà¸Šà¸±à¹ˆà¸™"
+ "à¹à¸Ÿà¸™"
+ "à¹à¸Ÿà¸™à¸‹à¸µ"
+ "à¹à¸Ÿà¸š"
+ "à¹à¸Ÿà¸£à¹Œ"
+ "à¹à¸Ÿà¸¥à¸à¸‹à¹Œ"
+ "à¹à¸Ÿà¸¥à¸•"
+ "à¹à¸Ÿà¸°"
+ "à¹à¸Ÿà¹‰à¸¡"
+ "à¹à¸¡à¸"
+ "à¹à¸¡à¸à¸™à¸µà¹€à¸‹à¸µà¸¢à¸¡"
+ "à¹à¸¡à¸„โคร"
+ "à¹à¸¡à¸‡"
+ "à¹à¸¡à¸‡à¸à¸²à¸™à¸µà¸ª"
+ "à¹à¸¡à¸™"
+ "à¹à¸¡à¸™à¸ˆà¸¹à¹€à¸£à¸µà¸¢"
+ "à¹à¸¡à¸¥à¸‡"
+ "à¹à¸¡à¸§"
+ "à¹à¸¡à¸°"
+ "à¹à¸¡à¹ˆ"
+ "à¹à¸¡à¹ˆà¸™"
+ "à¹à¸¡à¹ˆà¸®à¹ˆà¸­à¸‡à¸ªà¸­à¸™"
+ "à¹à¸¡à¹‰"
+ "à¹à¸¡à¹‰à¸™"
+ "à¹à¸¡à¹‰à¸§"
+ "à¹à¸¢à¸"
+ "à¹à¸¢à¸‡"
+ "à¹à¸¢à¸š"
+ "à¹à¸¢à¸¡"
+ "à¹à¸¢à¸°"
+ "à¹à¸¢à¹à¸ª"
+ "à¹à¸¢à¹‡à¸š"
+ "à¹à¸¢à¹ˆ"
+ "à¹à¸¢à¹ˆà¸‡"
+ "à¹à¸¢à¹‰"
+ "à¹à¸¢à¹‰à¸‡"
+ "à¹à¸¢à¹‰à¸¡"
+ "à¹à¸£"
+ "à¹à¸£à¸"
+ "à¹à¸£à¸‡"
+ "à¹à¸£à¸”"
+ "à¹à¸£à¸¡"
+ "à¹à¸£à¸°"
+ "à¹à¸£à¹‡à¸à¹€à¸à¸•"
+ "à¹à¸£à¹ˆ"
+ "à¹à¸£à¹ˆà¸‡"
+ "à¹à¸£à¹‰à¸‡"
+ "à¹à¸£à¹‰à¸™à¹à¸„้น"
+ "à¹à¸£à¹‰à¸§"
+ "à¹à¸¥"
+ "à¹à¸¥à¸"
+ "à¹à¸¥à¸‡"
+ "à¹à¸¥à¸™"
+ "à¹à¸¥à¸™à¸”"
+ "à¹à¸¥à¸™à¸”์"
+ "à¹à¸¥à¸š"
+ "à¹à¸¥à¸°"
+ "à¹à¸¥à¹‡à¸à¹‚ทส"
+ "à¹à¸¥à¹ˆ"
+ "à¹à¸¥à¹ˆà¸‡"
+ "à¹à¸¥à¹ˆà¸™"
+ "à¹à¸¥à¹‰"
+ "à¹à¸¥à¹‰à¸‡"
+ "à¹à¸¥à¹‰à¸§"
+ "à¹à¸§à¸‡"
+ "à¹à¸§à¸”"
+ "à¹à¸§à¸š"
+ "à¹à¸§à¸¡"
+ "à¹à¸§à¸§"
+ "à¹à¸§à¸°"
+ "à¹à¸§à¹ˆà¸™"
+ "à¹à¸§à¹ˆà¸§"
+ "à¹à¸§à¹‰"
+ "à¹à¸§à¹‰à¸‡"
+ "à¹à¸ª"
+ "à¹à¸ªà¸"
+ "à¹à¸ªà¸‡"
+ "à¹à¸ªà¸”"
+ "à¹à¸ªà¸”ง"
+ "à¹à¸ªà¸•มป์"
+ "à¹à¸ªà¸™"
+ "à¹à¸ªà¸™à¸¢à¸²à¸à¸£"
+ "à¹à¸ªà¸™à¸¢à¸²à¸™à¸¸à¸ à¸²à¸ž"
+ "à¹à¸ªà¸š"
+ "à¹à¸ªà¸¡"
+ "à¹à¸ªà¸¢à¸"
+ "à¹à¸ªà¸¢à¸‡"
+ "à¹à¸ªà¸¢à¸°"
+ "à¹à¸ªà¸£à¹‰à¸‡"
+ "à¹à¸ªà¸¥à¸‡"
+ "à¹à¸ªà¸§à¸‡"
+ "à¹à¸ªà¸°"
+ "à¹à¸ªà¹ˆ"
+ "à¹à¸ªà¹‰"
+ "à¹à¸ªà¹‰à¸¡à¹‰à¸²"
+ "à¹à¸«"
+ "à¹à¸«à¸"
+ "à¹à¸«à¸‡"
+ "à¹à¸«à¸‡à¸™"
+ "à¹à¸«à¸‡à¹à¸à¹‹"
+ "à¹à¸«à¸‡à¹ˆ"
+ "à¹à¸«à¸‡à¹ˆà¸‡"
+ "à¹à¸«à¸™"
+ "à¹à¸«à¸™à¸‡"
+ "à¹à¸«à¸™à¸š"
+ "à¹à¸«à¸™à¸¡"
+ "à¹à¸«à¸š"
+ "à¹à¸«à¸¡"
+ "à¹à¸«à¸¡à¸°"
+ "à¹à¸«à¸¡à¹ˆ"
+ "à¹à¸«à¸¡à¹ˆà¸¡"
+ "à¹à¸«à¸¢"
+ "à¹à¸«à¸¢à¸‡"
+ "à¹à¸«à¸¢à¸¡"
+ "à¹à¸«à¸¢à¸°"
+ "à¹à¸«à¸¢à¹ˆ"
+ "à¹à¸«à¸¢à¹ˆà¸‡"
+ "à¹à¸«à¸¥"
+ "à¹à¸«à¸¥à¸"
+ "à¹à¸«à¸¥à¸™"
+ "à¹à¸«à¸¥à¸¡"
+ "à¹à¸«à¸¥à¸°"
+ "à¹à¸«à¸¥à¹ˆ"
+ "à¹à¸«à¸¥à¹ˆà¸‡"
+ "à¹à¸«à¸§"
+ "à¹à¸«à¸§à¸"
+ "à¹à¸«à¸§à¸™"
+ "à¹à¸«à¸§à¸°"
+ "à¹à¸«à¸§à¹ˆà¸‡"
+ "à¹à¸«à¸°"
+ "à¹à¸«à¹ˆ"
+ "à¹à¸«à¹ˆà¸‡"
+ "à¹à¸«à¹‰"
+ "à¹à¸«à¹‰à¸‡"
+ "à¹à¸«à¹‰à¸§"
+ "à¹à¸­"
+ "à¹à¸­à¸"
+ "à¹à¸­à¸”"
+ "à¹à¸­à¸”วานซ์"
+ "à¹à¸­à¸”เดรส"
+ "à¹à¸­à¸™"
+ "à¹à¸­à¸™à¸”์"
+ "à¹à¸­à¸™à¸•าร์à¸à¸•ิà¸"
+ "à¹à¸­à¸™à¸•ิบอดี"
+ "à¹à¸­à¸™à¸•ิเจน"
+ "à¹à¸­à¸™à¸•ี้"
+ "à¹à¸­à¸š"
+ "à¹à¸­à¸žà¸žà¸¥à¸´à¹€à¸„ชัน"
+ "à¹à¸­à¸žà¹€à¸žà¸¥à¹‡à¸•"
+ "à¹à¸­à¸Ÿà¸£à¸´à¸à¸²"
+ "à¹à¸­à¸¡à¸¡à¸´à¹€à¸•อร์"
+ "à¹à¸­à¸¡à¹à¸›à¸£à¹Œ"
+ "à¹à¸­à¸¡à¹‚มเนีย"
+ "à¹à¸­à¸£à¹ˆà¸¡"
+ "à¹à¸­à¸£à¹Œ"
+ "à¹à¸­à¸¥"
+ "à¹à¸­à¸¥à¸à¸­à¸®à¸­à¸¥à¹Œ"
+ "à¹à¸­à¸¥à¸Ÿà¸²"
+ "à¹à¸­à¸ªà¸Ÿà¸±à¸¥à¸•์"
+ "à¹à¸­à¸ªà¹„พริน"
+ "à¹à¸­à¸­à¸±à¸”"
+ "à¹à¸­à¹‚นด"
+ "à¹à¸­à¹ˆà¸‡"
+ "à¹à¸­à¹ˆà¸™"
+ "à¹à¸­à¹ˆà¸§"
+ "à¹à¸­à¹‰"
+ "à¹à¸­à¹‰à¸‡à¹à¸¡à¹‰à¸‡"
+ "à¹à¸­à¹‰à¸”"
+ "à¹à¸­à¹‰à¸¡"
+ "à¹à¸­à¹Šà¸„ชั่น"
+ "à¹à¸­à¹Šà¸”"
+ "à¹à¸­à¹‹"
+ "à¹à¸®"
+ "à¹à¸®à¸™à¸”์บอล"
+ "à¹à¸®à¸¡"
+ "à¹à¸®à¸¡à¹€à¸šà¸­à¸£à¹Œà¹€à¸à¸­à¸£à¹Œ"
+ "à¹à¸®à¸°"
+ "à¹à¸®à¹ˆ"
+ "à¹à¸®à¹ˆà¸à¸¶à¹Šà¸™"
+ "โà¸"
+ "โà¸à¸"
+ "โà¸à¸‡"
+ "โà¸à¸‡à¸à¸²à¸‡"
+ "โà¸à¸à¸´"
+ "โà¸à¸”ัง"
+ "โà¸à¸™"
+ "โà¸à¸¡à¸¥"
+ "โà¸à¸¡à¸¸à¸—"
+ "โà¸à¸¢"
+ "โà¸à¸£à¸"
+ "โà¸à¸£à¸‡"
+ "โà¸à¸£à¸˜"
+ "โà¸à¸£à¸˜à¸²"
+ "โà¸à¸£à¹ˆà¸‡"
+ "โà¸à¸£à¹‹à¸™"
+ "โà¸à¸¥à¸”์"
+ "โà¸à¸¥à¸™"
+ "โà¸à¸¥à¸²à¸«à¸¥"
+ "โà¸à¸¨à¸¥"
+ "โà¸à¸ªà¸™"
+ "โà¸à¸ªà¸´à¸™à¸—ร์"
+ "โà¸à¸ªà¸µà¸¢à¹Œ"
+ "โà¸à¸ªà¸¸à¸¡"
+ "โà¸à¸«à¸"
+ "โà¸à¹€à¸¡à¸™"
+ "โà¸à¹‚à¸à¹‰"
+ "โà¸à¹‚รโà¸à¹‚ส"
+ "โà¸à¹„สย"
+ "โà¸à¹ˆà¸‡"
+ "โà¸à¹‰"
+ "โà¸à¹‰à¸‡à¹‚ค้ง"
+ "โà¸à¹‹"
+ "โà¸à¹‹à¸™"
+ "โข"
+ "โขà¸"
+ "โขง"
+ "โขด"
+ "โขน"
+ "โขนง"
+ "โขม"
+ "โขมง"
+ "โขมด"
+ "โขยà¸"
+ "โขยง"
+ "โขย่ง"
+ "โขลà¸"
+ "โขลง"
+ "โข่ง"
+ "โค"
+ "โคà¸"
+ "โคจร"
+ "โคตร"
+ "โคน"
+ "โคนม"
+ "โคบอลต์"
+ "โคม"
+ "โคม่า"
+ "โครà¸"
+ "โครง"
+ "โครงà¸à¸²à¸£"
+ "โครม"
+ "โคราช"
+ "โครเมียม"
+ "โครโมโซม"
+ "โคร่ง"
+ "โคล"
+ "โคลง"
+ "โคลงเคลง"
+ "โคลน"
+ "โคลนนิ่ง"
+ "โคลอมเบีย"
+ "โควตา"
+ "โคเคน"
+ "โค่ง"
+ "โค่น"
+ "โค้ง"
+ "โค้ช"
+ "โค้ด"
+ "โฆษà¸"
+ "โฆษณา"
+ "โฆษะ"
+ "โฆษิต"
+ "โง"
+ "โงà¸"
+ "โงง"
+ "โงงเงง"
+ "โงน"
+ "โงเง"
+ "โง่"
+ "โง่ง"
+ "โง่งเง่ง"
+ "โง้ง"
+ "โจ"
+ "โจà¸"
+ "โจง"
+ "โจงโคร่ง"
+ "โจท"
+ "โจทà¸à¹Œ"
+ "โจทย์"
+ "โจน"
+ "โจม"
+ "โจร"
+ "โจรà¸à¸£à¸£à¸¡"
+ "โจษ"
+ "โจษจัน"
+ "โจ่งครึ่ม"
+ "โจ่งà¹à¸ˆà¹‰à¸‡"
+ "โจ๊à¸"
+ "โจ๋งครึ่ม"
+ "โฉ"
+ "โฉงเฉง"
+ "โฉด"
+ "โฉนด"
+ "โฉบ"
+ "โฉม"
+ "โฉลà¸"
+ "โฉ่"
+ "โฉ่งฉ่าง"
+ "โชà¸"
+ "โชà¸à¸¸à¸™"
+ "โชค"
+ "โชดà¸"
+ "โชดึà¸"
+ "โชติ"
+ "โชน"
+ "โชย"
+ "โชว์"
+ "โซ"
+ "โซà¸"
+ "โซดา"
+ "โซม"
+ "โซรม"
+ "โซลา"
+ "โซลูชั่น"
+ "โซเดียม"
+ "โซเวียต"
+ "โซ่"
+ "โด"
+ "โดà¸à¹€à¸”à¸"
+ "โดด"
+ "โดน"
+ "โดนัท"
+ "โดม"
+ "โดมิโน"
+ "โดย"
+ "โด่"
+ "โด่ง"
+ "โด๊ป"
+ "โต"
+ "โตà¸"
+ "โตงเตง"
+ "โตน"
+ "โตนด"
+ "โตมร"
+ "โตรà¸"
+ "โตเà¸à¸µà¸¢à¸§"
+ "โต่ง"
+ "โต้"
+ "โต้ง"
+ "โต้โผ"
+ "โต๊ด"
+ "โต๊ะ"
+ "โต๊ะอิหม่าม"
+ "โถ"
+ "โถง"
+ "โถบ"
+ "โถม"
+ "โท"
+ "โทà¸à¹€à¸—à¸"
+ "โทง"
+ "โทงเทง"
+ "โทน"
+ "โทมนัส"
+ "โทร"
+ "โทรคมนาคม"
+ "โทรทรรศน์"
+ "โทรทัศน์"
+ "โทรพิมพ์"
+ "โทรภาพ"
+ "โทรม"
+ "โทรศัพท์"
+ "โทรเลข"
+ "โทษ"
+ "โทษทัณฑ์"
+ "โทษานุโทษ"
+ "โทษารมณ์"
+ "โทสะ"
+ "โทสาคติ"
+ "โทโส"
+ "โท่"
+ "โธ่"
+ "โน"
+ "โนน"
+ "โนรา"
+ "โนรี"
+ "โน่น"
+ "โน้ต"
+ "โน้ตบุ๊à¸"
+ "โน้ตส์"
+ "โน้น"
+ "โน้ม"
+ "โบ"
+ "โบà¸"
+ "โบà¸à¸‚รณี"
+ "โบà¸à¸µà¹‰"
+ "โบต"
+ "โบตั๋น"
+ "โบนัส"
+ "โบย"
+ "โบรมีน"
+ "โบรอน"
+ "โบราณ"
+ "โบลิเวีย"
+ "โบว์ลิ่ง"
+ "โบสถ์"
+ "โบ๊เบ๊"
+ "โบ๋"
+ "โป"
+ "โปà¸"
+ "โปง"
+ "โปงลาง"
+ "โปน"
+ "โปร"
+ "โปรง"
+ "โปรด"
+ "โปรตอน"
+ "โปรตีน"
+ "โปรตุเà¸à¸ª"
+ "โปรย"
+ "โปรเซสเซอร์"
+ "โปรเตสà¹à¸•นต์"
+ "โปรà¹à¸à¸£à¸¡"
+ "โปรà¹à¸à¸£à¸¡à¹€à¸¡à¸­à¸£à¹Œ"
+ "โปรโมชัน"
+ "โปรโมต"
+ "โปร่ง"
+ "โปร์"
+ "โปลิโอ"
+ "โปล่ง"
+ "โปสà¸à¸²à¸£à¹Œà¸”"
+ "โปสเตอร์"
+ "โปะ"
+ "โปà¹à¸¥à¸™à¸”์"
+ "โปโล"
+ "โป่ง"
+ "โป่งข่าม"
+ "โป้"
+ "โป้ง"
+ "โป๊"
+ "โป๊à¸"
+ "โป๊à¸à¹€à¸à¸­à¸£à¹Œ"
+ "โป๊ยเซียน"
+ "โป๊ะ"
+ "โผ"
+ "โผง"
+ "โผน"
+ "โผย"
+ "โผลà¸à¹€à¸œà¸¥à¸"
+ "โผลน"
+ "โผละ"
+ "โผล่"
+ "โผะ"
+ "โพ"
+ "โพà¸"
+ "โพง"
+ "โพงพาง"
+ "โพซิตรอน"
+ "โพธิà¸à¸²à¸“"
+ "โพธิบัลลังà¸à¹Œ"
+ "โพธิสมภาร"
+ "โพธิสัตว์"
+ "โพธิ์"
+ "โพน"
+ "โพนทะนา"
+ "โพย"
+ "โพยà¸à¹Šà¸§à¸™"
+ "โพยม"
+ "โพรà¸"
+ "โพรง"
+ "โพระดà¸"
+ "โพรโตคอล"
+ "โพลง"
+ "โพลน"
+ "โพละ"
+ "โพล่ง"
+ "โพล้ง"
+ "โพล้เพล้"
+ "โพสพ"
+ "โพà¹à¸—สเซียม"
+ "โพ้น"
+ "โฟà¸à¸±à¸ª"
+ "โฟน"
+ "โฟล์เดอร์"
+ "โภค"
+ "โภคิน"
+ "โภคี"
+ "โภชนะ"
+ "โภชนา"
+ "โภชนาà¸à¸£"
+ "โภชนาà¸à¸²à¸£"
+ "โภชนาหาร"
+ "โภชน์"
+ "โม"
+ "โมà¸"
+ "โมà¸à¸‚์"
+ "โมฆà¸à¸£à¸£à¸¡"
+ "โมฆสัà¸à¸à¸²"
+ "โมฆะ"
+ "โมฆียà¸à¸£à¸£à¸¡"
+ "โมฆียะ"
+ "โมง"
+ "โมงครุ่ม"
+ "โมดูล"
+ "โมทนา"
+ "โมลิบดีนัม"
+ "โมลี"
+ "โมหะ"
+ "โมหันธ์"
+ "โมหาคติ"
+ "โมเดล"
+ "โมเด็ม"
+ "โมเม"
+ "โมเมนต์"
+ "โมเลà¸à¸¸à¸¥"
+ "โมเสà¸"
+ "โมเสส"
+ "โมโน"
+ "โมโห"
+ "โมไนย"
+ "โม่"
+ "โม่ง"
+ "โม้"
+ "โย"
+ "โยà¸"
+ "โยà¸à¸•ร์"
+ "โยคะ"
+ "โยคี"
+ "โยง"
+ "โยชน์"
+ "โยธา"
+ "โยธิน"
+ "โยน"
+ "โยนี"
+ "โยม"
+ "โยเย"
+ "โยโส"
+ "โย่ง"
+ "โย่งโย่"
+ "โย้"
+ "โร"
+ "โรค"
+ "โรคจิตเภท"
+ "โรคา"
+ "โรคาพาธ"
+ "โรง"
+ "โรงคัล"
+ "โรงเรียน"
+ "โรงà¹à¸£à¸¡"
+ "โรจ"
+ "โรจน์"
+ "โรตี"
+ "โรธ"
+ "โรธร"
+ "โรม"
+ "โรมัน"
+ "โรมาเนีย"
+ "โรย"
+ "โรษ"
+ "โรหิต"
+ "โรเนียว"
+ "โร่"
+ "โลà¸"
+ "โลà¸à¸§à¸´à¸—ู"
+ "โลà¸à¸±à¸™à¸•ร์"
+ "โลà¸à¸²"
+ "โลà¸à¸²à¸˜à¸´à¸šà¸”ี"
+ "โลà¸à¸²à¸˜à¸´à¹„ตย"
+ "โลà¸à¸²à¸¡à¸´à¸ª"
+ "โลà¸à¸²à¸§à¸´à¸™à¸²à¸¨"
+ "โลà¸à¸´à¸¢à¸°"
+ "โลà¸à¸µà¸¢à¸§à¸±à¸•ร"
+ "โลà¸à¸µà¸¢à¹Œ"
+ "โลà¸à¸¸à¸•รธรรม"
+ "โลà¸à¸¸à¸•ระ"
+ "โลง"
+ "โลจนะ"
+ "โลณะ"
+ "โลด"
+ "โลตัส"
+ "โลน"
+ "โลภ"
+ "โลม"
+ "โลมา"
+ "โลหะ"
+ "โลหัช"
+ "โลหิต"
+ "โละ"
+ "โลเล"
+ "โล่"
+ "โล่ง"
+ "โล้"
+ "โล้น"
+ "โว"
+ "โวย"
+ "โวยวาย"
+ "โวหาร"
+ "โว่"
+ "โว่ง"
+ "โว้ย"
+ "โว้เว้"
+ "โศà¸"
+ "โศà¸à¸²"
+ "โศà¸à¸²à¸”ูร"
+ "โศà¸à¸²à¸¥à¸±à¸¢"
+ "โศà¸à¸µ"
+ "โส"
+ "โสà¸à¸±à¸™à¸•์"
+ "โสณ"
+ "โสณฑ์"
+ "โสด"
+ "โสดา"
+ "โสดาบัน"
+ "โสต"
+ "โสทà¸"
+ "โสทร"
+ "โสธà¸"
+ "โสธนะ"
+ "โสน"
+ "โสภณ"
+ "โสภา"
+ "โสภิณี"
+ "โสภี"
+ "โสม"
+ "โสมนัส"
+ "โสมม"
+ "โสมย์"
+ "โสรจ"
+ "โสร่ง"
+ "โสวรรณ"
+ "โสหุ้ย"
+ "โสฬส"
+ "โสเภณี"
+ "โสโครà¸"
+ "โหง"
+ "โหด"
+ "โหน"
+ "โหนà¸"
+ "โหน่ง"
+ "โหม"
+ "โหมด"
+ "โหม่ง"
+ "โหย"
+ "โหยà¸à¹€à¸«à¸¢à¸"
+ "โหยง"
+ "โหย่ง"
+ "โหร"
+ "โหรงเหรง"
+ "โหระพา"
+ "โหรา"
+ "โหราจารย์"
+ "โหราศาสตร์"
+ "โหล"
+ "โหลงโจ้ง"
+ "โหลน"
+ "โหล่"
+ "โหว"
+ "โหวà¸à¹€à¸«à¸§à¸"
+ "โหวง"
+ "โหวด"
+ "โหวต"
+ "โหว่"
+ "โห่"
+ "โอ"
+ "โอà¸"
+ "โอà¸à¸²à¸ª"
+ "โอà¸à¸´à¸™à¸²à¸§à¸²"
+ "โองà¸à¸²à¸£"
+ "โองโขดง"
+ "โอชะ"
+ "โอชา"
+ "โอด"
+ "โอตตัปปะ"
+ "โอน"
+ "โอบ"
+ "โอภา"
+ "โอภาส"
+ "โอม"
+ "โอย"
+ "โอรส"
+ "โอละพ่อ"
+ "โอลิมปิà¸"
+ "โอวาท"
+ "โอษà¸à¸ à¸±à¸¢"
+ "โอษà¸à¹Œ"
+ "โอสถ"
+ "โอหัง"
+ "โอห์ม"
+ "โอฬาร"
+ "โอฬาริà¸"
+ "โอฬารึà¸"
+ "โอเปà¸"
+ "โอเลี้ยง"
+ "โอเวอร์"
+ "โอเอซิส"
+ "โอเอส"
+ "โอโซน"
+ "โอ่"
+ "โอ่ง"
+ "โอ่อ่า"
+ "โอ้"
+ "โอ้à¸"
+ "โอ้เอ้"
+ "โอ้โลม"
+ "โอ้โฮ"
+ "โอ๊à¸"
+ "โอ๊ย"
+ "โอ๋"
+ "โฮ"
+ "โฮà¸"
+ "โฮม"
+ "โฮล์ม"
+ "โฮสต์"
+ "โฮสเตส"
+ "โฮเต็ล"
+ "ใà¸à¸¥à¹‰"
+ "ใคร"
+ "ใคร่"
+ "ใจ"
+ "ใช่"
+ "ใช้"
+ "ใด"
+ "ใต้"
+ "ใน"
+ "ในหลวง"
+ "ใบ"
+ "ใบ้"
+ "ใà¸à¹ˆ"
+ "ใย"
+ "ใส"
+ "ใส่"
+ "ใหà¸à¹ˆ"
+ "ใหม่"
+ "ให้"
+ "ไà¸"
+ "ไà¸à¸£"
+ "ไà¸à¸£à¸¥à¸²à¸ª"
+ "ไà¸à¸£à¸¨à¸£"
+ "ไà¸à¸£à¸ªà¸£"
+ "ไà¸à¸¥"
+ "ไà¸à¸¥à¹ˆ"
+ "ไà¸à¸§"
+ "ไà¸à¹ˆ"
+ "ไà¸à¹Šà¸”์"
+ "ไà¸à¹‹"
+ "ไข"
+ "ไขว่"
+ "ไขว้"
+ "ไขสือ"
+ "ไข่"
+ "ไข่ดัน"
+ "ไข่มุà¸"
+ "ไข้"
+ "ไค"
+ "ไคร้"
+ "ไคล"
+ "ไคลเอ็นต์"
+ "ไคลà¹à¸­à¸™à¸•์"
+ "ไคล้"
+ "ไค้"
+ "ไง"
+ "ไจ"
+ "ไฉน"
+ "ไฉไล"
+ "ไช"
+ "ไชย"
+ "ไชโย"
+ "ไซ"
+ "ไซต์"
+ "ไซน์"
+ "ไซบีเรีย"
+ "ไซปรัส"
+ "ไซยาไนด์"
+ "ไซร้"
+ "ไซเà¸à¸´à¸¥"
+ "ไซเบอร์"
+ "ไซเรน"
+ "ไซโคลน"
+ "ไซโล"
+ "ไซ้"
+ "ได"
+ "ไดนาโม"
+ "ไดนาไมต์"
+ "ไดรเวอร์"
+ "ไดร์ฟ"
+ "ไดอะล็อà¸"
+ "ไดอะล็อà¸à¸šà¹‡à¸­à¸à¸‹à¹Œ"
+ "ไดอารี่"
+ "ไดเรà¸à¸—อรี"
+ "ไดโนเสาร์"
+ "ได้"
+ "ไต"
+ "ไตร"
+ "ไตรมาส"
+ "ไตร่ตรอง"
+ "ไต่"
+ "ไต้"
+ "ไต้à¸à¹‹à¸‡"
+ "ไต้à¸à¸¸à¹ˆà¸™"
+ "ไต้หวัน"
+ "ไต๋"
+ "ไถ"
+ "ไถล"
+ "ไถ่"
+ "ไถ้"
+ "ไท"
+ "ไทà¸à¸­"
+ "ไทฟอยด์"
+ "ไทย"
+ "ไทยรัà¸"
+ "ไทร"
+ "ไทรอยด์"
+ "ไทเทเนียม"
+ "ไท้"
+ "ไน"
+ "ไนต์คลับ"
+ "ไนลอน"
+ "ไนล์"
+ "ไนโตรเจน"
+ "ไบต์"
+ "ไบออส"
+ "ไบเบิล"
+ "ไป"
+ "ไปยาล"
+ "ไปรษณียบรรณ"
+ "ไปรษณียบัตร"
+ "ไปรษณียภัณฑ์"
+ "ไปรษณียวัตถุ"
+ "ไปรษณียาà¸à¸£"
+ "ไปรษณีย์"
+ "ไปล่"
+ "ไป่"
+ "ไป๋"
+ "ไผ"
+ "ไผท"
+ "ไผ่"
+ "ไà¸"
+ "ไพ"
+ "ไพจิตร"
+ "ไพฑูรย์"
+ "ไพบูลย์"
+ "ไพร"
+ "ไพรจิตร"
+ "ไพรฑูรย์"
+ "ไพรัช"
+ "ไพริน"
+ "ไพรี"
+ "ไพร่"
+ "ไพลิน"
+ "ไพล่"
+ "ไพศาล"
+ "ไพเราะ"
+ "ไพโรจน์"
+ "ไพ่"
+ "ไพ่ป๊อà¸"
+ "ไฟ"
+ "ไฟล์"
+ "ไฟà¹à¸™à¸™à¸‹à¹Œ"
+ "ไมครอน"
+ "ไมตรี"
+ "ไมยราบ"
+ "ไมล์"
+ "ไมโคร"
+ "ไมโครซอฟท์"
+ "ไมโครเวฟ"
+ "ไมโครโฟน"
+ "ไม่"
+ "ไม้"
+ "ไย"
+ "ไย่"
+ "ไร"
+ "ไร่"
+ "ไร้"
+ "ไลย"
+ "ไลเซนส์"
+ "ไล่"
+ "ไล่เลี่ย"
+ "ไล้"
+ "ไว"
+ "ไวà¸à¸¹à¸“à¸à¹Œ"
+ "ไวฑูรย์"
+ "ไวทย์"
+ "ไวน์"
+ "ไวพจน์"
+ "ไวยาà¸à¸£à¸“์"
+ "ไวยาวัจà¸à¸£"
+ "ไวยาวัจมัย"
+ "ไวรัส"
+ "ไวโอลิน"
+ "ไว้"
+ "ไศล"
+ "ไส"
+ "ไสย"
+ "ไสยา"
+ "ไสร้"
+ "ไสว"
+ "ไส้"
+ "ไห"
+ "ไหน"
+ "ไหม"
+ "ไหม้"
+ "ไหร่"
+ "ไหล"
+ "ไหล่"
+ "ไหว"
+ "ไหว้"
+ "ไหหลำ"
+ "ไห่"
+ "ไห้"
+ "ไอ"
+ "ไอคอน"
+ "ไอที"
+ "ไอบีเอ็ม"
+ "ไอยรา"
+ "ไอยเรศ"
+ "ไอราวัณ"
+ "ไอร์à¹à¸¥à¸™à¸”์"
+ "ไอศà¸à¸£à¸µà¸¡"
+ "ไอศวรรย์"
+ "ไอศูรย์"
+ "ไอออน"
+ "ไอโซโทป"
+ "ไอโอดีน"
+ "ไอ้"
+ "ไฮดรา"
+ "ไฮโà¸à¸£à¸¡à¸´à¹€à¸•อร์"
+ "ไฮโดรคาร์บอน"
+ "ไฮโล"
))
(set-nested-alist elt 1 table))
table)
- "Nested alist of Thai words.")
+ "Nested alist of Thai words.")
(defun thai-update-word-table (file &optional append)
@@ -11072,8 +11072,7 @@ With argument, do this that many times."
;; Local Variables:
-;; coding: tis-620
+;; coding: utf-8
;; End:
;; end of thai-word.el
-
diff --git a/lisp/language/thai.el b/lisp/language/thai.el
index abed8f1036e..803e9977d47 100644
--- a/lisp/language/thai.el
+++ b/lisp/language/thai.el
@@ -1,4 +1,4 @@
-;;; thai.el --- support for Thai -*- coding: iso-2022-7bit -*-
+;;; thai.el --- support for Thai -*- coding: utf-8 -*-
;; Copyright (C) 1997-1998, 2000-2013 Free Software Foundation, Inc.
;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
@@ -55,7 +55,7 @@
(exit-function . exit-thai-language-environment-internal)
(sample-text
. (thai-compose-string
- (copy-sequence "Thai (,T@RIRd7B(B) ,TJGQJ4U$CQ:(B, ,TJGQJ4U$hP(B")))
+ (copy-sequence "Thai (ภาษาไทย) สวัสดีครับ, สวัสดีค่ะ")))
(documentation . t)))
(define-coding-system 'cp874
@@ -75,12 +75,12 @@ This is the same as `thai-tis620' with the addition of no-break-space."
:charset-list '(iso-8859-11))
;; For automatic composition.
-(let ((chars ",TQTUVWXYZghijklmn(B")
- (elt '(["[,T!(B-,TO(B].[,Thijkl(B]?,TS(B?" 1 thai-composition-function]
+(let ((chars "ัิีึืฺุู็่้๊๋์à¹à¹Ž")
+ (elt '(["[à¸-ฯ].[่้๊๋์]?ำ?" 1 thai-composition-function]
[nil 0 thai-composition-function])))
(dotimes (i (length chars))
(aset composition-function-table (aref chars i) elt)))
-(aset composition-function-table ?,TS(B '(["[,T!(B-,TO(B]." 1 thai-composition-function]))
+(aset composition-function-table ?ำ '(["[à¸-ฯ]." 1 thai-composition-function]))
(provide 'thai)
diff --git a/lisp/language/tibet-util.el b/lisp/language/tibet-util.el
index 1617c2f3eba..422fc697df8 100644
--- a/lisp/language/tibet-util.el
+++ b/lisp/language/tibet-util.el
@@ -1,4 +1,4 @@
-;;; tibet-util.el --- utilities for Tibetan -*- coding: iso-2022-7bit; -*-
+;;; tibet-util.el --- utilities for Tibetan -*- coding: utf-8-emacs; -*-
;; Copyright (C) 1997, 2001-2013 Free Software Foundation, Inc.
;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
@@ -35,21 +35,21 @@
;;; Code:
(defconst tibetan-obsolete-glyphs
- `(("$(7!=(B" . "$(7!=(B") ; 2 col <-> 1 col
- ("$(7!?(B" . "$(7!?(B")
- ("$(7!@(B" . "$(7!@(B")
- ("$(7!A(B" . "$(7!A(B")
- ("$(7"`(B" . "$(7"`(B")
- ("$(7!;(B" . "$(7!;(B")
- ("$(7!D(B" . "$(7!D(B")
+ `(("à¼" . "à¼") ; 2 col <-> 1 col
+ ("à¼" . "à¼")
+ ("à¼" . "à¼")
+ ("༑" . "༑")
+ ("ཿ" . "ཿ")
+ ("་" . "་")
+ ("༔" . "༔")
;; Yes these are dirty. But ...
- ("$(7!>(B $(7!>(B" . ,(compose-string "$(7!>(B $(7!>(B" 0 3 [?$(7!>(B (Br . Bl) ? (Br . Bl) ?$(7!>(B]))
- ("$(7!4!5!5(B" . ,(compose-string
- "$(7#R#S#S#S(B" 0 4
- [?$(7#R(B (Br . Bl) ?$(7#S(B (Br . Bl) ?$(7#S(B (Br . Bl) ?$(7#S(B]))
- ("$(7!4!5(B" . ,(compose-string "$(7#R#S#S(B" 0 3 [?$(7#R(B (Br . Bl) ?$(7#S(B (Br . Bl) ?$(7#S(B]))
- ("$(7!6(B" . ,(compose-string "$(7#R#S!I(B" 0 3 [?$(7#R(B (Br . Bl) ?$(7#S(B (br . tr) ?$(7!I(B]))
- ("$(7!4(B" . ,(compose-string "$(7#R#S(B" 0 2 [?$(7#R(B (Br . Bl) ?$(7#S(B]))))
+ ("༎ ༎" . ,(compose-string "༎ ༎" 0 3 [?༎ (Br . Bl) ? (Br . Bl) ?༎]))
+ ("༄༅༅" . ,(compose-string
+ "à¿à¿‚à¿‚à¿‚" 0 4
+ [?à¿ (Br . Bl) ?à¿‚ (Br . Bl) ?à¿‚ (Br . Bl) ?à¿‚]))
+ ("༄༅" . ,(compose-string "à¿à¿‚à¿‚" 0 3 [?à¿ (Br . Bl) ?à¿‚ (Br . Bl) ?à¿‚]))
+ ("༆" . ,(compose-string "à¿à¿‚༙" 0 3 [?à¿ (Br . Bl) ?à¿‚ (br . tr) ?༙]))
+ ("༄" . ,(compose-string "à¿à¿‚" 0 2 [?à¿ (Br . Bl) ?à¿‚]))))
;;;###autoload
(defun tibetan-char-p (ch)
@@ -136,7 +136,7 @@ The returned string has no composition information."
;;;
;;; Here are examples of the words "bsgrubs" and "hfauM"
;;;
-;;; $(7"7"G###C"U"7"G(B $(7"H"R"U"_(B
+;;; བསྒྲུབས ཧཱུཾ
;;;
;;; M
;;; b s b s h
@@ -144,7 +144,7 @@ The returned string has no composition information."
;;; r u
;;; u
;;;
-;;; Consonants `'' ($(7"A(B), `w' ($(7">(B), `y' ($(7"B(B), `r' ($(7"C(B) take special
+;;; Consonants `'' (འ), `w' (à½), `y' (ཡ), `r' (ར) take special
;;; forms when they are used as subjoined consonant. Consonant `r'
;;; takes another special form when used as superjoined in such a case
;;; as "rka", while it does not change its form when conjoined with
@@ -161,15 +161,15 @@ The returned string has no composition information."
;; Special treatment for 'a chung.
;; If 'a follows a consonant, turn it into the subjoined form.
;; * Disabled by Tomabechi 2000/06/09 *
- ;; Because in Unicode, $(7"A(B may follow directly a consonant without
- ;; any intervening vowel, as in $(7"9"""Q"A!;(B=$(7"9(B $(7""(B $(7"A(B not $(7"9(B $(7""(B $(7"Q(B $(7"A(B
- ;;(if (and (= char ?$(7"A(B)
+ ;; Because in Unicode, འ may follow directly a consonant without
+ ;; any intervening vowel, as in མà½ö‚Žà½ à¼‹=མ འའ not མ འö‚Ž à½ 
+ ;;(if (and (= char ?འ)
;; (aref (char-category-set (car last)) ?0))
- ;; (setq char ?$(7"R(B)) ;; modified for new font by Tomabechi 1999/12/10
+ ;; (setq char ?ཱ)) ;; modified for new font by Tomabechi 1999/12/10
;; Composite vowel signs are decomposed before being added
;; Added by Tomabechi 2000/06/08
- (if (memq char '(?$(7"T(B ?$(7"V(B ?$(7"W(B ?$(7"X(B ?$(7"Y(B ?$(7"Z(B ?$(7"b(B))
+ (if (memq char '(?ཱི ?ཱུ ?ྲྀ ?ཷ ?ླྀ ?ཹ ?à¾))
(setq comp-vowel
(copy-sequence
(cddr (assoc (char-to-string char)
@@ -184,22 +184,22 @@ The returned string has no composition information."
;; Compose lower vowel sign vertically under.
((aref (char-category-set char) ?3)
- (if (or (eq char ?$(7"Q(B) ;; `$(7"Q(B' and `$,1FP(B' should not visible when composed.
+ (if (or (eq char ?ö‚Ž) ;; `ö‚Ž' and `཰' should not visible when composed.
(eq char #xF70))
(setq rule nil)
(setq rule stack-under)))
;; Transform ra-mgo (superscribed r) if followed by a subjoined
;; consonant other than w, ', y, r.
- ((and (= (car last) ?$(7"C(B)
- (not (memq char '(?$(7#>(B ?$(7"R(B ?$(7#B(B ?$(7#C(B))))
- (setcar last ?$(7!"(B) ;; modified for newfont by Tomabechi 1999/12/10
+ ((and (= (car last) ?ར)
+ (not (memq char '(?ྭ ?ཱ ?ྱ ?ྲ))))
+ (setcar last ?ö€) ;; modified for newfont by Tomabechi 1999/12/10
(setq rule stack-under))
;; Transform initial base consonant if followed by a subjoined
;; consonant but 'a.
(t
(let ((laststr (char-to-string (car last))))
- (if (and (/= char ?$(7"R(B) ;; modified for new font by Tomabechi
- (string-match "[$(7"!(B-$(7"="?"@"D(B-$(7"J"K(B]" laststr))
+ (if (and (/= char ?ཱ) ;; modified for new font by Tomabechi
+ (string-match "[ཀ-ཛྷཞཟལ-ཀྵཪ]" laststr))
(setcar last (string-to-char
(cdr (assoc (char-to-string (car last))
tibetan-base-to-subjoined-alist)))))
@@ -216,7 +216,7 @@ The returned string has no composition information."
(defun tibetan-compose-string (str)
"Compose Tibetan string STR."
(let ((idx 0))
- ;; `$(7"A(B' is included in the pattern for subjoined consonants
+ ;; `འ' is included in the pattern for subjoined consonants
;; because we treat it specially in tibetan-add-components.
;; (This feature is removed by Tomabechi 2000/06/08)
(while (setq idx (string-match tibetan-composable-pattern str idx))
@@ -247,7 +247,7 @@ The returned string has no composition information."
(save-restriction
(narrow-to-region beg end)
(goto-char (point-min))
- ;; `$(7"A(B' is included in the pattern for subjoined consonants
+ ;; `འ' is included in the pattern for subjoined consonants
;; because we treat it specially in tibetan-add-components.
;; (This feature is removed by Tomabechi 2000/06/08)
(while (re-search-forward tibetan-composable-pattern nil t)
@@ -366,18 +366,18 @@ See also docstring of the function tibetan-compose-region."
;;;
(defvar tibetan-canonicalize-for-unicode-alist
- '(("$(7"Q(B" . "") ;; remove vowel a
- ("$(7"T(B" . "$(7"R"S(B") ;; decompose vowels whose use is ``discouraged'' in Unicode 3.0
- ("$(7"V(B" . "$(7"R"U(B")
- ("$(7"W(B" . "$(7#C"a(B")
- ("$(7"X(B" . "$(7#C"R"a(B")
- ("$(7"Y(B" . "$(7#D"a(B")
- ("$(7"Z(B" . "$(7#D"R"a(B")
- ("$(7"b(B" . "$(7"R"a(B"))
+ '(("ö‚Ž" . "") ;; remove vowel a
+ ("ཱི" . "ཱི") ;; decompose vowels whose use is ``discouraged'' in Unicode 3.0
+ ("ཱུ" . "ཱུ")
+ ("ྲྀ" . "ྲྀ")
+ ("ཷ" . "ྲཱྀ")
+ ("ླྀ" . "ླྀ")
+ ("ཹ" . "ླཱྀ")
+ ("à¾" . "ཱྀ"))
"Rules for canonicalizing Tibetan vowels for Unicode.")
(defvar tibetan-canonicalize-for-unicode-regexp
- "[$(7"Q"T"V"W"X"Y"Z"b(B]"
+ "[ö‚Žà½³à½µà½¶à½·à½¸à½¹à¾]"
"Regexp for Tibetan vowels to be canonicalized in Unicode.")
(defun tibetan-canonicalize-for-unicode-region (from to)
diff --git a/lisp/language/tibetan.el b/lisp/language/tibetan.el
index e80ded9c98e..f85284702a2 100644
--- a/lisp/language/tibetan.el
+++ b/lisp/language/tibetan.el
@@ -1,4 +1,4 @@
-;;; tibetan.el --- support for Tibetan language -*- coding: iso-2022-7bit; -*-
+;;; tibetan.el --- support for Tibetan language -*- coding: utf-8-emacs; -*-
;; Copyright (C) 1997, 2001-2013 Free Software Foundation, Inc.
;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
@@ -43,45 +43,45 @@
;;; I hope I can add missing characters later.
;;;
;;; 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
-;;;2120 // $(7!!(B $(7!"(B $(7!#(B $(7!$(B $(7!%(B $(7!&(B $(7!'(B $(7!((B $(7!)(B $(7!*(B $(7!+(B $(7!,(B $(7!-(B $(7!.(B $(7!/(B ; obsolete glyphs (2123-5)
-;;;2130 $(7!0(B $(7!1(B $(7!2(B $(7!3(B $(7!4(B $(7!5(B $(7!6(B $(7!7(B $(7!8(B $(7!9(B $(7!:(B $(7!;(B $(7!<(B $(7!=(B $(7!>(B $(7!?(B ; Punctuation,
-;;;2140 $(7!@(B $(7!A(B $(7!B(B $(7!C(B $(7!D(B $(7!E(B $(7!F(B $(7!G(B $(7!H(B $(7!I(B $(7!J(B $(7!K(B $(7!L(B $(7!M(B $(7!N(B $(7!O(B ; Digits and
-;;;2150 $(7!P(B $(7!Q(B $(7!R(B $(7!S(B $(7!T(B $(7!U(B $(7!V(B $(7!W(B $(7!X(B $(7!Y(B $(7!Z(B $(7![(B $(7!\(B $(7!](B $(7!^(B $(7!_(B ; Special signs.
-;;;2160 $(7!`(B $(7!a(B $(7!b(B $(7!c(B $(7!d(B $(7!e(B $(7!f(B $(7!g(B $(7!h(B $(7!i(B $(7!j(B $(7!k(B $(7!l(B $(7!m(B $(7!n(B $(7!o(B ;
-;;;2170 $(7!p(B $(7!q(B $(7!r(B $(7!s(B $(7!t(B $(7!u(B $(7!v(B $(7!w(B $(7!x(B $(7!y(B $(7!z(B $(7!{(B $(7!|(B $(7!}(B $(7!~(B // ;
+;;;2120 // ö€€ ö€ ö€‚ ö€ƒ ö€„ ö€… ö€† ö€‡ ö€ˆ ö€‰ ö€Š ö€‹ ö€Œ ö€ ö€Ž ; obsolete glyphs (2123-5)
+;;;2130 ༀ ༠༂ ༃ ༄ ༅ ༆ ༇ ༈ ༉ ༊ ་ ༌ ༠༎ ༠; Punctuation,
+;;;2140 ༠༑ ༒ ༓ ༔ ༕ ༖ ༗ ༘ ༙ ༚ ༛ ༜ ༠༞ ༟ ; Digits and
+;;;2150 ༠ ༡ ༢ ༣ ༤ ༥ ༦ ༧ ༨ ༩ ༪ ༫ ༬ ༭ ༮ ༯ ; Special signs.
+;;;2160 ༰ ༱ ༲ ༳ ༴ ༵ ༶ ༷ ༸ ༹ ༺ ༻ ༼ ༽ ༾ ༿ ;
+;;;2170 ö ö ö‘ ö’ ö“ ö” ö• ö– ö— ö˜ ö™ öš ö› öœ ö // ;
;;;
;;; 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
-;;;2220 // $(7"!(B $(7""(B $(7"#(B $(7"$(B $(7"%(B $(7"&(B $(7"'(B $(7"((B $(7")(B $(7"*(B $(7"+(B $(7",(B $(7"-(B $(7".(B $(7"/(B ; Base consonants
-;;;2230 $(7"0(B $(7"1(B $(7"2(B $(7"3(B $(7"4(B $(7"5(B $(7"6(B $(7"7(B $(7"8(B $(7"9(B $(7":(B $(7";(B $(7"<(B $(7"=(B $(7">(B $(7"?(B ; and
-;;;2240 $(7"@(B $(7"A(B $(7"B(B $(7"C(B $(7"D(B $(7"E(B $(7"F(B $(7"G(B $(7"H(B $(7"I(B $(7"J(B $(7"K(B $(7"L(B $(7"M(B $(7"N(B $(7"O(B ; Vowel signs.
-;;;2250 $(7"P(B $(7"Q(B $(7"R(B $(7"S(B $(7"T(B $(7"U(B $(7"V(B $(7"W(B $(7"X(B $(7"Y(B $(7"Z(B $(7"[(B $(7"\(B $(7"](B $(7"^(B $(7"_(B ; (\x2251 = vowel a)
-;;;2260 $(7"`(B $(7"a(B $(7"b(B $(7"c(B $(7"d(B $(7"e(B $(7"f(B $(7"g(B $(7"h(B $(7"i(B $(7"j(B $(7"k(B $(7"l(B $(7"m(B $(7"n(B $(7"o(B ; Long vowels and
-;;;2270 $(7"p(B $(7"q(B $(7"r(B $(7"s(B $(7"t(B $(7"u(B $(7"v(B $(7"w(B $(7"x(B $(7"y(B $(7"z(B $(7"{(B $(7"|(B $(7"}(B $(7"~(B // ; vocalic r, l ARE
+;;;2220 // ཀ འག གྷ ང ཅ ཆ ཇ ö¦ ཉ ཊ ཋ ཌ འཎ ; Base consonants
+;;;2230 འའད དྷ ན པ ཕ བ བྷ མ ཙ ཚ ཛ ཛྷ འཞ ; and
+;;;2240 ཟ འ ཡ ར ལ ཤ ཥ ས ཧ ཨ ཀྵ ཪ ö‚‰ ö‚Š ö‚‹ ö‚Œ ; Vowel signs.
+;;;2250 ö‚ ö‚Ž à½± ི ཱི ུ ཱུ ྲྀ ཷ ླྀ ཹ ེ ཻ ོ ཽ ཾ ; (\x2251 = vowel a)
+;;;2260 ཿ ྀ ྠྂ ྃ ྄ ྅ ྆ ྇ ྈ ྉ ྊ ྋ ö‚ª ö‚« ö‚¬ ; Long vowels and
+;;;2270 ö‚­ ö‚® ö‚¯ ö‚° ö‚± ö‚² ö‚³ ö‚´ ö‚µ ö‚¶ ö‚· ö‚¸ ö‚¹ ö‚º ö‚» // ; vocalic r, l ARE
;;; ; atomically
;;; ; encoded.
;;; 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
-;;;2320 // $(7#!(B $(7#"(B $(7##(B $(7#$(B $(7#%(B $(7#&(B $(7#'(B $(7#((B $(7#)(B $(7#*(B $(7#+(B $(7#,(B $(7#-(B $(7#.(B $(7#/(B ; Subjoined consonants
-;;;2330 $(7#0(B $(7#1(B $(7#2(B $(7#3(B $(7#4(B $(7#5(B $(7#6(B $(7#7(B $(7#8(B $(7#9(B $(7#:(B $(7#;(B $(7#<(B $(7#=(B $(7#>(B $(7#?(B ;
-;;;2340 $(7#@(B $(7#A(B $(7#B(B $(7#C(B $(7#D(B $(7#E(B $(7#F(B $(7#G(B $(7#H(B $(7#I(B $(7#J(B $(7#K(B $(7#L(B $(7#M(B $(7#N(B $(7#O(B ;
-;;;2350 $(7#P(B $(7#Q(B $(7#R(B $(7#S(B $(7#T(B $(7#U(B $(7#V(B $(7#W(B $(7#X(B $(7#Y(B $(7#Z(B $(7#[(B $(7#\(B $(7#](B $(7#^(B $(7#_(B ; Hereafter, the chars
-;;;2360 $(7#`(B $(7#a(B $(7#b(B $(7#c(B $(7#d(B $(7#e(B $(7#f(B $(7#g(B $(7#h(B $(7#i(B $(7#j(B $(7#k(B $(7#l(B $(7#m(B $(7#n(B $(7#o(B ; are not specified
-;;;2370 $(7#p(B $(7#q(B $(7#r(B $(7#s(B $(7#t(B $(7#u(B $(7#v(B $(7#w(B $(7#x(B $(7#y(B $(7#z(B $(7#{(B $(7#|(B $(7#}(B $(7#~(B // ; in Unicode.
+;;;2320 // ྠྑ ྒ ྒྷ ྔ ྕ ྖ ྗ öƒ„ ྙ ྚ ྛ ྜ ྠྞ ; Subjoined consonants
+;;;2330 ྟ ྠ ྡ ྡྷ ྣ ྤ ྥ ྦ ྦྷ ྨ ྩ ྪ ྫ ྫྷ ྭ ྮ ;
+;;;2340 ྯ ྰ ྱ ྲ ླ ྴ ྵ ྶ ྷ ྸ ྐྵ ྺ ྻ ྼ öƒ© ྾ ;
+;;;2350 ྿ à¿€ à¿ à¿‚ ࿃ à¿„ à¿… ࿆ ࿇ ࿈ ࿉ ࿊ à¿‹ ࿌ öƒ¹ öƒº ; Hereafter, the chars
+;;;2360 à¿ öƒ¼ öƒ½ öƒ¾ öƒ¿ ö„€ ö„ ö„‚ ö„ƒ ö„„ ö„… ö„† ö„‡ ö„ˆ ö„‰ ö„Š ; are not specified
+;;;2370 ö„‹ ö„Œ ö„ ö„Ž ö„ ö„ ö„‘ ö„’ ö„“ ö„” ö„• ö„– ö„— ö„˜ ö„™ // ; in Unicode.
;;;
;;; 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
-;;;2420 // $(7$!(B $(7$"(B $(7$#(B $(7$$(B $(7$%(B $(7$&(B $(7$'(B $(7$((B $(7$)(B $(7$*(B $(7$+(B $(7$,(B $(7$-(B $(7$.(B $(7$/(B ; Precomposed
-;;;2430 $(7$0(B $(7$1(B $(7$2(B $(7$3(B $(7$4(B $(7$5(B $(7$6(B $(7$7(B $(7$8(B $(7$9(B $(7$:(B $(7$;(B $(7$<(B $(7$=(B $(7$>(B $(7$?(B ; consonants for
-;;;2440 $(7$@(B $(7$A(B $(7$B(B $(7$C(B $(7$D(B $(7$E(B $(7$F(B $(7$G(B $(7$H(B $(7$I(B $(7$J(B $(7$K(B $(7$L(B $(7$M(B $(7$N(B $(7$O(B ; ordinary Tibetan.
-;;;2450 $(7$P(B $(7$Q(B $(7$R(B $(7$S(B $(7$T(B $(7$U(B $(7$V(B $(7$W(B $(7$X(B $(7$Y(B $(7$Z(B $(7$[(B $(7$\(B $(7$](B $(7$^(B $(7$_(B ; They are decomposed
-;;;2460 $(7$`(B $(7$a(B $(7$b(B $(7$c(B $(7$d(B $(7$e(B $(7$f(B $(7$g(B $(7$h(B $(7$i(B $(7$j(B $(7$k(B $(7$l(B $(7$m(B $(7$n(B $(7$o(B ; into base and
-;;;2470 $(7$p(B $(7$q(B $(7$r(B $(7$s(B $(7$t(B $(7$u(B $(7$v(B $(7$w(B $(7$x(B $(7$y(B $(7$z(B $(7${(B $(7$|(B $(7$}(B $(7$~(B // ; subjoined consonants
+;;;2420 // ö„š ö„› ö„œ ö„ ö„ž ö„Ÿ ö„  ö„¡ ö„¢ ö„£ ö„¤ ö„¥ ö„¦ ö„§ ö„¨ ; Precomposed
+;;;2430 ö„© ö„ª ö„« ö„¬ ö„­ ö„® ö„¯ ö„° ö„± ö„² ö„³ ö„´ ö„µ ö„¶ ö„· ö„¸ ; consonants for
+;;;2440 ö„¹ ö„º ö„» ö„¼ ö„½ ö„¾ ö„¿ ö…€ ö… ö…‚ ö…ƒ ö…„ ö…… ö…† ö…‡ ö…ˆ ; ordinary Tibetan.
+;;;2450 ö…‰ ö…Š ö…‹ ö…Œ ö… ö…Ž ö… ö… ö…‘ ö…’ ö…“ ö…” ö…• ö…– ö…— ö…˜ ; They are decomposed
+;;;2460 ö…™ ö…š ö…› ö…œ ö… ö…ž ö…Ÿ ö…  ö…¡ ö…¢ ö…£ ö…¤ ö…¥ ö…¦ ö…§ ö…¨ ; into base and
+;;;2470 ö…© ö…ª ö…« ö…¬ ö…­ ö…® ö…¯ ö…° ö…± ö…² ö…³ ö…´ ö…µ ö…¶ ö…· // ; subjoined consonants
;;; ; when written on a
;;; 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ; file in Tibetan
-;;;2520 // $(7%!(B $(7%"(B $(7%#(B $(7%$(B $(7%%(B $(7%&(B $(7%'(B $(7%((B $(7%)(B $(7%*(B $(7%+(B $(7%,(B $(7%-(B $(7%.(B $(7%/(B ; coding system.
-;;;2530 $(7%0(B $(7%1(B $(7%2(B $(7%3(B $(7%4(B $(7%5(B $(7%6(B $(7%7(B $(7%8(B $(7%9(B $(7%:(B $(7%;(B $(7%<(B $(7%=(B $(7%>(B $(7%?(B ;
-;;;2540 $(7%@(B $(7%A(B $(7%B(B $(7%C(B $(7%D(B $(7%E(B $(7%F(B $(7%G(B $(7%H(B $(7%I(B $(7%J(B $(7%K(B $(7%L(B $(7%M(B $(7%N(B $(7%O(B ;
-;;;2550 $(7%P(B $(7%Q(B $(7%R(B $(7%S(B $(7%T(B $(7%U(B $(7%V(B $(7%W(B $(7%X(B $(7%Y(B $(7%Z(B $(7%[(B $(7%\(B $(7%](B $(7%^(B $(7%_(B ;
-;;;2560 $(7%`(B $(7%a(B $(7%b(B $(7%c(B $(7%d(B $(7%e(B $(7%f(B $(7%g(B $(7%h(B $(7%i(B $(7%j(B $(7%k(B $(7%l(B $(7%m(B $(7%n(B $(7%o(B ;
-;;;2570 $(7%p(B $(7%q(B $(7%r(B $(7%s(B $(7%t(B $(7%u(B $(7%v(B $(7%w(B $(7%x(B $(7%y(B $(7%z(B $(7%{(B $(7%|(B $(7%}(B $(7%~(B // ;
+;;;2520 // ö…¸ ö…¹ ö…º ö…» ö…¼ ö…½ ö…¾ ö…¿ ö†€ ö† ö†‚ ö†ƒ ö†„ ö†… ö†† ; coding system.
+;;;2530 ö†‡ ö†ˆ ö†‰ ö†Š ö†‹ ö†Œ ö† ö†Ž ö† ö† ö†‘ ö†’ ö†“ ö†” ö†• ö†– ;
+;;;2540 ö†— ö†˜ ö†™ ö†š ö†› ö†œ ö† ö†ž ö†Ÿ ö†  ö†¡ ö†¢ ö†£ ö†¤ ö†¥ ö†¦ ;
+;;;2550 ö†§ ö†¨ ö†© ö†ª ö†« ö†¬ ö†­ ö†® ö†¯ ö†° ö†± ö†² ö†³ ö†´ ö†µ ö†¶ ;
+;;;2560 ö†· ö†¸ ö†¹ ö†º ö†» ö†¼ ö†½ ö†¾ ö†¿ ö‡€ ö‡ ö‡‚ ö‡ƒ ö‡„ ö‡… ö‡† ;
+;;;2570 ö‡‡ ö‡ˆ ö‡‰ ö‡Š ö‡‹ ö‡Œ ö‡ ö‡Ž ö‡ ö‡ ö‡‘ ö‡’ ö‡“ ö‡” ö‡• // ;
;;;
@@ -101,18 +101,18 @@
(input-method . "tibetan-wylie")
(features tibet-util)
(documentation . t)
- (sample-text . "Tibetan ($(7"7"]"2!;"G#!"Q"2!;(B) $(7!4!5!5!>"7"!#C"Q!;"E"S"G!;"7"2"[!;"D"["#"G!>"I"]"_!;"9"Q!;"/"S!;"5"Q"2#9"[!;"H"A"U"c!>(B")))
+ (sample-text . "Tibetan (བོད་སà¾ö‚Žà½‘་) ༄༅༅༎བཀྲö‚Žà¼‹à½¤à½²à½¦à¼‹à½–དེ་ལེགས༎ཨོཾ་མö‚Žà¼‹à½Žà½²à¼‹à½”ö‚Žà½‘ྨེ་ཧའུྂ༎")))
-;; `$(7"A(B' is included in the pattern for subjoined consonants because we
+;; `འ' is included in the pattern for subjoined consonants because we
;; treat it specially in tibetan-add-components.
;; modified by Tomabechi 1999/12/10
;; modified by Tomabechi 2000/06/08
;; To allow infinite addition of vowels/modifiers
;; as specified in Unicode v.3
-;; $(7"A(B is removed from the class of subjoined. Tomabechi 2000/06/08
+;; འ is removed from the class of subjoined. Tomabechi 2000/06/08
;; (for Unicode support)
(defconst tibetan-composable-pattern
- "[$(7"!(B-$(7"J"K(B][$(7#!(B-$(7#J#K#L#M(B]*[$,1FP$(7"Q"R"S(B-$(7"^"a"b"e(B]*[$(7"_"c"d"g(B-$(7"l!I!e!g(B]*"
+ "[ཀ-ཀྵཪ][à¾-ྐྵྺྻྼ]*[཰ö‚Žà½±à½²-ཽྀà¾à¾„]*[ཾྂྃ྆-ྋ༙༵༷]*"
"Regexp matching a composable sequence of Tibetan characters.")
;;;
@@ -123,50 +123,50 @@
;;; alists for tibetan char <-> transcription conversion
;;; longer transcription should come first
(defconst tibetan-consonant-transcription-alist
- '(("tsh" . "$(7";(B")
- ("dzh" . "$(7"=(B")
- ("kSH" . "$(7"J(B")
- ("kh" . "$(7""(B")
- ("gh" . "$(7"$(B")
- ("ng" . "$(7"%(B")
- ("ch" . "$(7"'(B")
- ("ny" . "$(7"*(B")
- ("TH" . "$(7",(B")
- ("DH" . "$(7".(B")
- ("th" . "$(7"1(B")
- ("dh" . "$(7"3(B")
- ("ph" . "$(7"6(B")
- ("bh" . "$(7"8(B")
- ("ts" . "$(7":(B")
- ("dz" . "$(7"<(B")
- ("zh" . "$(7"?(B")
- ("sh" . "$(7"E(B")
- ("SH" . "$(7"F(B")
- ("k" . "$(7"!(B")
- ("g" . "$(7"#(B")
- ("c" . "$(7"&(B")
- ("j" . "$(7"((B")
- ("T" . "$(7"+(B")
- ("D" . "$(7"-(B")
- ("N" . "$(7"/(B")
- ("t" . "$(7"0(B")
- ("d" . "$(7"2(B")
- ("n" . "$(7"4(B")
- ("p" . "$(7"5(B")
- ("b" . "$(7"7(B")
- ("m" . "$(7"9(B")
- ("w" . "$(7">(B")
- ("z" . "$(7"@(B")
- ("'" . "$(7"A(B")
- ("y" . "$(7"B(B")
- ("r" . "$(7"C(B")
- ("l" . "$(7"D(B")
- ("s" . "$(7"G(B")
- ("h" . "$(7"H(B")
- ("H" . "$(7"H(B")
- ("A" . "$(7"I(B")
+ '(("tsh" . "ཚ")
+ ("dzh" . "ཛྷ")
+ ("kSH" . "ཀྵ")
+ ("kh" . "à½")
+ ("gh" . "གྷ")
+ ("ng" . "ང")
+ ("ch" . "ཆ")
+ ("ny" . "ཉ")
+ ("TH" . "ཋ")
+ ("DH" . "à½")
+ ("th" . "à½")
+ ("dh" . "དྷ")
+ ("ph" . "ཕ")
+ ("bh" . "བྷ")
+ ("ts" . "ཙ")
+ ("dz" . "ཛ")
+ ("zh" . "ཞ")
+ ("sh" . "ཤ")
+ ("SH" . "ཥ")
+ ("k" . "ཀ")
+ ("g" . "ག")
+ ("c" . "ཅ")
+ ("j" . "ཇ")
+ ("T" . "ཊ")
+ ("D" . "ཌ")
+ ("N" . "ཎ")
+ ("t" . "à½")
+ ("d" . "ད")
+ ("n" . "ན")
+ ("p" . "པ")
+ ("b" . "བ")
+ ("m" . "མ")
+ ("w" . "à½")
+ ("z" . "ཟ")
+ ("'" . "འ")
+ ("y" . "ཡ")
+ ("r" . "ར")
+ ("l" . "ལ")
+ ("s" . "ས")
+ ("h" . "ཧ")
+ ("H" . "ཧ")
+ ("A" . "ཨ")
;; Added by Tomabechi 1999/12/10
- ("R" . "$(7"K(B") ;; fixed form RA
+ ("R" . "ཪ") ;; fixed form RA
))
@@ -174,203 +174,203 @@
'(
;; Composite Vowels
;; Added by Tomabechi 2000/06/08
- ("frr" . "$(7"X(B")
- ("fll" . "$(7"Z(B")
- ("fa" . "$(7"R(B")
- ("fi" . "$(7"T(B")
- ("fu" . "$(7"V(B")
- ("fr" . "$(7"W(B")
- ("fl" . "$(7"Y(B")
- ("fI" . "$(7"b(B")
+ ("frr" . "ཷ")
+ ("fll" . "ཹ")
+ ("fa" . "ཱ")
+ ("fi" . "ཱི")
+ ("fu" . "ཱུ")
+ ("fr" . "ྲྀ")
+ ("fl" . "ླྀ")
+ ("fI" . "à¾")
;; Normal Vowels
- ("ai" . "$(7"\(B")
- ("au" . "$(7"^(B")
- ("ee" . "$(7"\(B")
- ("oo" . "$(7"^(B")
- ("a" . "$(7"Q(B") ; invisible vowel sign (\x2251)
- ("i" . "$(7"S(B")
- ("u" . "$(7"U(B")
- ("e" . "$(7"[(B")
- ("o" . "$(7"](B")
- ("E" . "$(7"\(B")
- ("O" . "$(7"^(B")
- ("I" . "$(7"a(B")
- ("," . "$(7"e(B") ; idem.
+ ("ai" . "ཻ")
+ ("au" . "ཽ")
+ ("ee" . "ཻ")
+ ("oo" . "ཽ")
+ ("a" . "ö‚Ž") ; invisible vowel sign (\x2251)
+ ("i" . "ི")
+ ("u" . "ུ")
+ ("e" . "ེ")
+ ("o" . "ོ")
+ ("E" . "ཻ")
+ ("O" . "ཽ")
+ ("I" . "ྀ")
+ ("," . "྄") ; idem.
))
(defconst tibetan-modifier-transcription-alist
- '(("M" . "$(7"_(B")
- ("~" . "$(7"c(B")
- ("`" . "$(7"d(B")
- ("x" . "$(7"i(B")
- ("X" . "$(7"j(B")
- ("v" . "$(7"g(B")
- ("V" . "$(7"h(B")
- ("q" . "$(7"k(B")
- ("Q" . "$(7"l(B")
- ("_/" . "$(7!I(B")
- ("_o" . "$(7!g(B")
- ("_O" . "$(7!e(B")))
+ '(("M" . "ཾ")
+ ("~" . "ྂ")
+ ("`" . "ྃ")
+ ("x" . "ྈ")
+ ("X" . "ྉ")
+ ("v" . "྆")
+ ("V" . "྇")
+ ("q" . "ྊ")
+ ("Q" . "ྋ")
+ ("_/" . "༙")
+ ("_o" . "༷")
+ ("_O" . "༵")))
(defconst tibetan-precomposed-transcription-alist
- '(("phyw" . "$(7$G(B")
- ("tshw" . "$(7$)(B")
- ("rtsw" . "$(7%.(B")
- ("khw" . "$(7$"(B")
- ("nyw" . "$(7$%(B")
- ("tsw" . "$(7$((B")
- ("zhw" . "$(7$*(B")
- ("shw" . "$(7$.(B")
- ("khy" . "$(7$A(B")
- ("phy" . "$(7$D(B")
- ("khr" . "$(7$Q(B")
- ("thr" . "$(7$T(B")
- ("phr" . "$(7$W(B")
- ("shr" . "$(7$Z(B")
- ("dzr" . "$(7$^(B")
- ("grw" . "$(7$_(B")
- ("rng" . "$(7%#(B")
- ("rny" . "$(7%%(B")
- ("rts" . "$(7%+(B")
- ("rdz" . "$(7%,(B")
- ("rgw" . "$(7%-(B")
- ("rky" . "$(7%0(B")
- ("rgy" . "$(7%1(B")
- ("rmy" . "$(7%2(B")
- ("lng" . "$(7%B(B")
- ("sng" . "$(7%R(B")
- ("sny" . "$(7%S(B")
- ("sts" . "$(7%Z(B")
- ("sky" . "$(7%`(B")
- ("sgy" . "$(7%a(B")
- ("spy" . "$(7%b(B")
- ("sby" . "$(7%c(B")
- ("smy" . "$(7%d(B")
- ("skr" . "$(7%p(B")
- ("sgr" . "$(7%q(B")
- ("snr" . "$(7%r(B")
- ("spr" . "$(7%s(B")
- ("sbr" . "$(7%t(B")
- ("smr" . "$(7%u(B")
- ("kw" . "$(7$!(B")
- ("gw" . "$(7$#(B")
- ("cw" . "$(7$$(B")
- ("tw" . "$(7$&(B")
- ("dw" . "$(7$'(B")
- ("zw" . "$(7$+(B")
- ("rw" . "$(7$,(B")
- ("lw" . "$(7$-(B")
- ("sw" . "$(7$/(B")
- ("hw" . "$(7$0(B")
- ("ky" . "$(7$@(B")
- ("gy" . "$(7$B(B")
- ("py" . "$(7$C(B")
- ("by" . "$(7$E(B")
- ("my" . "$(7$F(B")
- ("kr" . "$(7$P(B")
- ("gr" . "$(7$R(B")
- ("tr" . "$(7$S(B")
- ("dr" . "$(7$U(B")
- ("pr" . "$(7$V(B")
- ("brk" . "$(7"7%!(B")
- ("brg" . "$(7"7%"(B")
- ("brng" . "$(7"7%#(B")
- ("brj" . "$(7"7%$(B")
- ("brny" . "$(7"7%%(B")
- ("brt" . "$(7"7%&(B")
- ("brd" . "$(7"7%'(B")
- ("brn" . "$(7"7%((B")
- ("brts" . "$(7"7%+(B")
- ("brdz" . "$(7"7%,(B")
- ("brl" . "$(7"7$d(B")
- ("br" . "$(7$X(B")
- ("mr" . "$(7$Y(B")
- ("sr" . "$(7$[(B")
- ("hr" . "$(7$\(B")
- ("jr" . "$(7$](B")
- ("kl" . "$(7$`(B")
- ("gl" . "$(7$a(B")
- ("blt" . "$(7"7%E(B")
- ("bld" . "$(7"7%F(B")
- ("bl" . "$(7$b(B")
- ("zl" . "$(7$c(B")
- ("rl" . "$(7$d(B")
- ("sl" . "$(7$e(B")
- ("rk" . "$(7%!(B")
- ("rg" . "$(7%"(B")
- ("rj" . "$(7%$(B")
- ("rt" . "$(7%&(B")
- ("rd" . "$(7%'(B")
- ("rn" . "$(7%((B")
- ("rb" . "$(7%)(B")
- ("rm" . "$(7%*(B")
- ("lk" . "$(7%@(B")
- ("lg" . "$(7%A(B")
- ("lc" . "$(7%C(B")
- ("lj" . "$(7%D(B")
- ("lt" . "$(7%E(B")
- ("ld" . "$(7%F(B")
- ("ln" . "$(7!!(B") ; dummy \x2121
- ("lp" . "$(7%G(B")
- ("lb" . "$(7%H(B")
- ("lh" . "$(7%I(B")
- ("sk" . "$(7%P(B")
- ("sg" . "$(7%Q(B")
- ("st" . "$(7%T(B")
- ("sd" . "$(7%U(B")
- ("sn" . "$(7%V(B")
- ("sp" . "$(7%W(B")
- ("sb" . "$(7%X(B")
- ("sm" . "$(7%Y(B"))
+ '(("phyw" . "ö…€")
+ ("tshw" . "ö„¢")
+ ("rtsw" . "ö†…")
+ ("khw" . "ö„›")
+ ("nyw" . "ö„ž")
+ ("tsw" . "ö„¡")
+ ("zhw" . "ö„£")
+ ("shw" . "ö„§")
+ ("khy" . "ö„º")
+ ("phy" . "ö„½")
+ ("khr" . "ö…Š")
+ ("thr" . "ö…")
+ ("phr" . "ö…")
+ ("shr" . "ö…“")
+ ("dzr" . "ö…—")
+ ("grw" . "ö…˜")
+ ("rng" . "ö…º")
+ ("rny" . "ö…¼")
+ ("rts" . "ö†‚")
+ ("rdz" . "ö†ƒ")
+ ("rgw" . "ö†„")
+ ("rky" . "ö†‡")
+ ("rgy" . "ö†ˆ")
+ ("rmy" . "ö†‰")
+ ("lng" . "ö†™")
+ ("sng" . "ö†©")
+ ("sny" . "ö†ª")
+ ("sts" . "ö†±")
+ ("sky" . "ö†·")
+ ("sgy" . "ö†¸")
+ ("spy" . "ö†¹")
+ ("sby" . "ö†º")
+ ("smy" . "ö†»")
+ ("skr" . "ö‡‡")
+ ("sgr" . "ö‡ˆ")
+ ("snr" . "ö‡‰")
+ ("spr" . "ö‡Š")
+ ("sbr" . "ö‡‹")
+ ("smr" . "ö‡Œ")
+ ("kw" . "ö„š")
+ ("gw" . "ö„œ")
+ ("cw" . "ö„")
+ ("tw" . "ö„Ÿ")
+ ("dw" . "ö„ ")
+ ("zw" . "ö„¤")
+ ("rw" . "ö„¥")
+ ("lw" . "ö„¦")
+ ("sw" . "ö„¨")
+ ("hw" . "ö„©")
+ ("ky" . "ö„¹")
+ ("gy" . "ö„»")
+ ("py" . "ö„¼")
+ ("by" . "ö„¾")
+ ("my" . "ö„¿")
+ ("kr" . "ö…‰")
+ ("gr" . "ö…‹")
+ ("tr" . "ö…Œ")
+ ("dr" . "ö…Ž")
+ ("pr" . "ö…")
+ ("brk" . "བö…¸")
+ ("brg" . "བö…¹")
+ ("brng" . "བö…º")
+ ("brj" . "བö…»")
+ ("brny" . "བö…¼")
+ ("brt" . "བö…½")
+ ("brd" . "བö…¾")
+ ("brn" . "བö…¿")
+ ("brts" . "བö†‚")
+ ("brdz" . "བö†ƒ")
+ ("brl" . "བö…")
+ ("br" . "ö…‘")
+ ("mr" . "ö…’")
+ ("sr" . "ö…”")
+ ("hr" . "ö…•")
+ ("jr" . "ö…–")
+ ("kl" . "ö…™")
+ ("gl" . "ö…š")
+ ("blt" . "བö†œ")
+ ("bld" . "བö†")
+ ("bl" . "ö…›")
+ ("zl" . "ö…œ")
+ ("rl" . "ö…")
+ ("sl" . "ö…ž")
+ ("rk" . "ö…¸")
+ ("rg" . "ö…¹")
+ ("rj" . "ö…»")
+ ("rt" . "ö…½")
+ ("rd" . "ö…¾")
+ ("rn" . "ö…¿")
+ ("rb" . "ö†€")
+ ("rm" . "ö†")
+ ("lk" . "ö†—")
+ ("lg" . "ö†˜")
+ ("lc" . "ö†š")
+ ("lj" . "ö†›")
+ ("lt" . "ö†œ")
+ ("ld" . "ö†")
+ ("ln" . "ö€€") ; dummy \x2121
+ ("lp" . "ö†ž")
+ ("lb" . "ö†Ÿ")
+ ("lh" . "ö† ")
+ ("sk" . "ö†§")
+ ("sg" . "ö†¨")
+ ("st" . "ö†«")
+ ("sd" . "ö†¬")
+ ("sn" . "ö†­")
+ ("sp" . "ö†®")
+ ("sb" . "ö†¯")
+ ("sm" . "ö†°"))
)
(defconst tibetan-subjoined-transcription-alist
- (sort '(("+k" . "$(7#!(B")
- ("+kh" . "$(7#"(B")
- ("+g" . "$(7##(B")
- ("+gh" . "$(7#$(B")
- ("+ng" . "$(7#%(B")
- ("+c" . "$(7#&(B")
- ("+ch" . "$(7#'(B")
- ("+j" . "$(7#((B")
- ("+ny" . "$(7#*(B")
- ("+T" . "$(7#+(B")
- ("+TH" . "$(7#,(B")
- ("+D" . "$(7#-(B")
- ("+DH" . "$(7#.(B")
- ("+N" . "$(7#/(B")
- ("+t" . "$(7#0(B")
- ("+th" . "$(7#1(B")
- ("+d" . "$(7#2(B")
- ("+dh" . "$(7#3(B")
- ("+n" . "$(7#4(B")
- ("+p" . "$(7#5(B")
- ("+ph" . "$(7#6(B")
- ("+b" . "$(7#7(B")
- ("+bh" . "$(7#8(B")
- ("+m" . "$(7#9(B")
- ("+ts" . "$(7#:(B")
- ("+tsh" . "$(7#;(B")
- ("+dz" . "$(7#<(B")
- ("+dzh" . "$(7#=(B")
- ("+w" . "$(7#>(B")
- ("+zh" . "$(7#?(B")
- ("+z" . "$(7#@(B")
- ("+'" . "$(7#A(B")
- ("+y" . "$(7#B(B")
- ("+r" . "$(7#C(B")
- ("+l" . "$(7#D(B")
- ("+sh" . "$(7#E(B")
- ("+SH" . "$(7#F(B")
- ("+s" . "$(7#G(B")
- ("+h" . "$(7#H(B")
- ("+A" . "$(7#I(B")
- ("+kSH" . "$(7#J(B")
+ (sort '(("+k" . "à¾")
+ ("+kh" . "ྑ")
+ ("+g" . "ྒ")
+ ("+gh" . "ྒྷ")
+ ("+ng" . "ྔ")
+ ("+c" . "ྕ")
+ ("+ch" . "ྖ")
+ ("+j" . "ྗ")
+ ("+ny" . "ྙ")
+ ("+T" . "ྚ")
+ ("+TH" . "ྛ")
+ ("+D" . "ྜ")
+ ("+DH" . "à¾")
+ ("+N" . "ྞ")
+ ("+t" . "ྟ")
+ ("+th" . "ྠ")
+ ("+d" . "ྡ")
+ ("+dh" . "ྡྷ")
+ ("+n" . "ྣ")
+ ("+p" . "ྤ")
+ ("+ph" . "ྥ")
+ ("+b" . "ྦ")
+ ("+bh" . "ྦྷ")
+ ("+m" . "ྨ")
+ ("+ts" . "ྩ")
+ ("+tsh" . "ྪ")
+ ("+dz" . "ྫ")
+ ("+dzh" . "ྫྷ")
+ ("+w" . "ྭ")
+ ("+zh" . "ྮ")
+ ("+z" . "ྯ")
+ ("+'" . "ྰ")
+ ("+y" . "ྱ")
+ ("+r" . "ྲ")
+ ("+l" . "ླ")
+ ("+sh" . "ྴ")
+ ("+SH" . "ྵ")
+ ("+s" . "ྶ")
+ ("+h" . "ྷ")
+ ("+A" . "ྸ")
+ ("+kSH" . "ྐྵ")
;; Added by Tomabechi 1999/12/10
- ("+W" . "$(7#K(B") ;; fixed form subscribed WA
- ("+Y" . "$(7#L(B") ;; fixed form subscribed YA
- ("+R" . "$(7#M(B") ;; fixed form subscribed RA
+ ("+W" . "ྺ") ;; fixed form subscribed WA
+ ("+Y" . "ྻ") ;; fixed form subscribed YA
+ ("+R" . "ྼ") ;; fixed form subscribed RA
)
(lambda (x y) (> (length (car x)) (length (car y))))))
@@ -378,70 +378,70 @@
;;; alist for Tibetan base consonant <-> subjoined consonant conversion.
;;;
(defconst tibetan-base-to-subjoined-alist
- '(("$(7"!(B" . "$(7#!(B")
- ("$(7""(B" . "$(7#"(B")
- ("$(7"#(B" . "$(7##(B")
- ("$(7"$(B" . "$(7#$(B")
- ("$(7"%(B" . "$(7#%(B")
- ("$(7"&(B" . "$(7#&(B")
- ("$(7"'(B" . "$(7#'(B")
- ("$(7"((B" . "$(7#((B")
- ("$(7"*(B" . "$(7#*(B")
- ("$(7"+(B" . "$(7#+(B")
- ("$(7",(B" . "$(7#,(B")
- ("$(7"-(B" . "$(7#-(B")
- ("$(7".(B" . "$(7#.(B")
- ("$(7"/(B" . "$(7#/(B")
- ("$(7"0(B" . "$(7#0(B")
- ("$(7"1(B" . "$(7#1(B")
- ("$(7"2(B" . "$(7#2(B")
- ("$(7"3(B" . "$(7#3(B")
- ("$(7"4(B" . "$(7#4(B")
- ("$(7"5(B" . "$(7#5(B")
- ("$(7"6(B" . "$(7#6(B")
- ("$(7"7(B" . "$(7#7(B")
- ("$(7"8(B" . "$(7#8(B")
- ("$(7"9(B" . "$(7#9(B")
- ("$(7":(B" . "$(7#:(B")
- ("$(7";(B" . "$(7#;(B")
- ("$(7"<(B" . "$(7#<(B")
- ("$(7"=(B" . "$(7#=(B")
- ("$(7">(B" . "$(7#>(B")
- ("$(7"?(B" . "$(7#?(B")
- ("$(7"@(B" . "$(7#@(B")
- ("$(7"A(B" . "$(7#A(B")
- ("$(7"B(B" . "$(7#B(B")
- ("$(7"C(B" . "$(7#C(B")
- ("$(7"D(B" . "$(7#D(B")
- ("$(7"E(B" . "$(7#E(B")
- ("$(7"F(B" . "$(7#F(B")
- ("$(7"G(B" . "$(7#G(B")
- ("$(7"H(B" . "$(7#H(B")
- ("$(7"I(B" . "$(7#I(B")
- ("$(7"J(B" . "$(7#J(B")
+ '(("ཀ" . "à¾")
+ ("à½" . "ྑ")
+ ("ག" . "ྒ")
+ ("གྷ" . "ྒྷ")
+ ("ང" . "ྔ")
+ ("ཅ" . "ྕ")
+ ("ཆ" . "ྖ")
+ ("ཇ" . "ྗ")
+ ("ཉ" . "ྙ")
+ ("ཊ" . "ྚ")
+ ("ཋ" . "ྛ")
+ ("ཌ" . "ྜ")
+ ("à½" . "à¾")
+ ("ཎ" . "ྞ")
+ ("à½" . "ྟ")
+ ("à½" . "ྠ")
+ ("ད" . "ྡ")
+ ("དྷ" . "ྡྷ")
+ ("ན" . "ྣ")
+ ("པ" . "ྤ")
+ ("ཕ" . "ྥ")
+ ("བ" . "ྦ")
+ ("བྷ" . "ྦྷ")
+ ("མ" . "ྨ")
+ ("ཙ" . "ྩ")
+ ("ཚ" . "ྪ")
+ ("ཛ" . "ྫ")
+ ("ཛྷ" . "ྫྷ")
+ ("à½" . "ྭ")
+ ("ཞ" . "ྮ")
+ ("ཟ" . "ྯ")
+ ("འ" . "ྰ")
+ ("ཡ" . "ྱ")
+ ("ར" . "ྲ")
+ ("ལ" . "ླ")
+ ("ཤ" . "ྴ")
+ ("ཥ" . "ྵ")
+ ("ས" . "ྶ")
+ ("ཧ" . "ྷ")
+ ("ཨ" . "ྸ")
+ ("ཀྵ" . "ྐྵ")
;; Added by Tomabechi 1999/12/10
- ("$(7"K(B" . "$(7#M(B") ;; Fixed form RA (224B->234D)
+ ("ཪ" . "ྼ") ;; Fixed form RA (224B->234D)
))
;;; alist for Tibetan composite vowels (long i, vocalic r, etc.)
;;; New variable. created by Tomabechi 2000/06/08
(defconst tibetan-composite-vowel-alist
'(;; LONG A
- ;; ("$(7"R(B" . ((bc . tc) ?$(7"R(B))
+ ;; ("ཱ" . ((bc . tc) ?ཱ))
;; LONG I
- ("$(7"T(B" . (?$(7"R(B (tc . bc) ?$(7"S(B))
+ ("ཱི" . (?ཱ (tc . bc) ?ི))
;; LONG U
- ("$(7"V(B" . (?$(7"R(B (bc . tc) ?$(7"U(B))
+ ("ཱུ" . (?ཱ (bc . tc) ?ུ))
;; VOCALIC R
- ("$(7"W(B" . (?$(7#C(B (tc . bc) ?$(7"a(B))
+ ("ྲྀ" . (?ྲ (tc . bc) ?ྀ))
;; LONG VOCALIC R
- ("$(7"X(B" . (?$(7#C(B (bc . tc) ?$(7"R(B (tc . bc) ?$(7"a(B))
+ ("ཷ" . (?ྲ (bc . tc) ?ཱ (tc . bc) ?ྀ))
;; VOCALIC L
- ("$(7"Y(B" . (?$(7#D(B (tc . bc) ?$(7"a(B))
- ;;$(7!;(BLONG VOCALIC L
- ("$(7"Z(B" . (?$(7#D(B (bc . tc) ?$(7"R(B (tc . bc) ?$(7"a(B))
+ ("ླྀ" . (?ླ (tc . bc) ?ྀ))
+ ;;་LONG VOCALIC L
+ ("ཹ" . (?ླ (bc . tc) ?ཱ (tc . bc) ?ྀ))
;; LONG REVERSE I
- ("$(7"b(B" . (?$(7"R(B (tc . bc) ?$(7"a(B))
+ ("à¾" . (?ཱ (tc . bc) ?ྀ))
))
@@ -451,102 +451,102 @@
;;; (includes some punctuation conversion rules)
;;;
(defconst tibetan-precomposition-rule-alist
- `(("$(7"6#B#>(B" . "$(7$G(B")
- ("$(7"##C#>(B" . "$(7$_(B")
- ("$(7";#>(B" . "$(7$)(B")
- ("$(7"C#:#>(B" . "$(7%.(B")
- ("$(7"C###>(B" . "$(7%-(B")
- ("$(7"C#!#B(B" . "$(7%0(B")
- ("$(7"C###B(B" . "$(7%1(B")
- ("$(7"C#9#B(B" . "$(7%2(B")
- ("$(7"G#!#B(B" . "$(7%`(B")
- ("$(7"G###B(B" . "$(7%a(B")
- ("$(7"G#5#B(B" . "$(7%b(B")
- ("$(7"G#7#B(B" . "$(7%c(B")
- ("$(7"G#9#B(B" . "$(7%d(B")
- ("$(7"G#!#C(B" . "$(7%p(B")
- ("$(7"G###C(B" . "$(7%q(B")
- ("$(7"G#4#C(B" . "$(7%r(B")
- ("$(7"G#5#C(B" . "$(7%s(B")
- ("$(7"G#7#C(B" . "$(7%t(B")
- ("$(7"G#9#C(B" . "$(7%u(B")
- ("$(7""#>(B" . "$(7$"(B")
- ("$(7"*#>(B" . "$(7$%(B")
- ("$(7":#>(B" . "$(7$((B")
- ("$(7"?#>(B" . "$(7$*(B")
- ("$(7"E#>(B" . "$(7$.(B")
- ("$(7""#B(B" . "$(7$A(B")
- ("$(7"6#B(B" . "$(7$D(B")
- ("$(7""#C(B" . "$(7$Q(B")
- ("$(7"1#C(B" . "$(7$T(B")
- ("$(7"6#C(B" . "$(7$W(B")
- ("$(7"E#C(B" . "$(7$Z(B")
- ("$(7"<#C(B" . "$(7$^(B")
- ("$(7"C#%(B" . "$(7%#(B")
- ("$(7"C#*(B" . "$(7%%(B")
- ("$(7"C#:(B" . "$(7%+(B")
- ("$(7"C#<(B" . "$(7%,(B")
- ("$(7"D#%(B" . "$(7%B(B")
- ("$(7"G#%(B" . "$(7%R(B")
- ("$(7"G#*(B" . "$(7%S(B")
- ("$(7"G#:(B" . "$(7%Z(B")
- ("$(7"!#>(B" . "$(7$!(B")
- ("$(7"##>(B" . "$(7$#(B")
- ("$(7"&#>(B" . "$(7$$(B")
- ("$(7"0#>(B" . "$(7$&(B")
- ("$(7"2#>(B" . "$(7$'(B")
- ("$(7"@#>(B" . "$(7$+(B")
- ("$(7"C#>(B" . "$(7$,(B")
- ("$(7"D#>(B" . "$(7$-(B")
- ("$(7"G#>(B" . "$(7$/(B")
- ("$(7"H#>(B" . "$(7$0(B")
- ("$(7"!#B(B" . "$(7$@(B")
- ("$(7"##B(B" . "$(7$B(B")
- ("$(7"5#B(B" . "$(7$C(B")
- ("$(7"7#B(B" . "$(7$E(B")
- ("$(7"9#B(B" . "$(7$F(B")
- ("$(7"!#C(B" . "$(7$P(B")
- ("$(7"##C(B" . "$(7$R(B")
- ("$(7"0#C(B" . "$(7$S(B")
- ("$(7"2#C(B" . "$(7$U(B")
- ("$(7"5#C(B" . "$(7$V(B")
- ("$(7"7#C(B" . "$(7$X(B")
- ("$(7"9#C(B" . "$(7$Y(B")
- ("$(7"G#C(B" . "$(7$[(B")
- ("$(7"H#C(B" . "$(7$\(B")
- ("$(7"(#C(B" . "$(7$](B")
- ("$(7"!#D(B" . "$(7$`(B")
- ("$(7"##D(B" . "$(7$a(B")
- ("$(7"7#D(B" . "$(7$b(B")
- ("$(7"@#D(B" . "$(7$c(B")
- ("$(7"C#D(B" . "$(7$d(B")
- ("$(7"G#D(B" . "$(7$e(B")
- ("$(7"C#!(B" . "$(7%!(B")
- ("$(7"C##(B" . "$(7%"(B")
- ("$(7"C#((B" . "$(7%$(B")
- ("$(7"C#0(B" . "$(7%&(B")
- ("$(7"C#2(B" . "$(7%'(B")
- ("$(7"C#4(B" . "$(7%((B")
- ("$(7"C#7(B" . "$(7%)(B")
- ("$(7"C#9(B" . "$(7%*(B")
- ("$(7"D#!(B" . "$(7%@(B")
- ("$(7"D##(B" . "$(7%A(B")
- ("$(7"D#4(B" . "$(7!!(B") ; dummy 0x2121 added 2000/06/08 for transition l -> lng
- ("$(7"D#&(B" . "$(7%C(B")
- ("$(7"D#((B" . "$(7%D(B")
- ("$(7"D#0(B" . "$(7%E(B")
- ("$(7"D#2(B" . "$(7%F(B")
- ("$(7"D#5(B" . "$(7%G(B")
- ("$(7"D#7(B" . "$(7%H(B")
- ("$(7"D#H(B" . "$(7%I(B")
- ("$(7"G#!(B" . "$(7%P(B")
- ("$(7"G##(B" . "$(7%Q(B")
- ("$(7"G#0(B" . "$(7%T(B")
- ("$(7"G#2(B" . "$(7%U(B")
- ("$(7"G#4(B" . "$(7%V(B")
- ("$(7"G#5(B" . "$(7%W(B")
- ("$(7"G#7(B" . "$(7%X(B")
- ("$(7"G#9(B" . "$(7%Y(B")))
+ `(("ཕྱྭ" . "ö…€")
+ ("གྲྭ" . "ö…˜")
+ ("ཚྭ" . "ö„¢")
+ ("རྩྭ" . "ö†…")
+ ("རྒྭ" . "ö†„")
+ ("རà¾à¾±" . "ö†‡")
+ ("རྒྱ" . "ö†ˆ")
+ ("རྨྱ" . "ö†‰")
+ ("སà¾à¾±" . "ö†·")
+ ("སྒྱ" . "ö†¸")
+ ("སྤྱ" . "ö†¹")
+ ("སྦྱ" . "ö†º")
+ ("སྨྱ" . "ö†»")
+ ("སà¾à¾²" . "ö‡‡")
+ ("སྒྲ" . "ö‡ˆ")
+ ("སྣྲ" . "ö‡‰")
+ ("སྤྲ" . "ö‡Š")
+ ("སྦྲ" . "ö‡‹")
+ ("སྨྲ" . "ö‡Œ")
+ ("à½à¾­" . "ö„›")
+ ("ཉྭ" . "ö„ž")
+ ("ཙྭ" . "ö„¡")
+ ("ཞྭ" . "ö„£")
+ ("ཤྭ" . "ö„§")
+ ("à½à¾±" . "ö„º")
+ ("ཕྱ" . "ö„½")
+ ("à½à¾²" . "ö…Š")
+ ("à½à¾²" . "ö…")
+ ("ཕྲ" . "ö…")
+ ("ཤྲ" . "ö…“")
+ ("ཛྲ" . "ö…—")
+ ("རྔ" . "ö…º")
+ ("རྙ" . "ö…¼")
+ ("རྩ" . "ö†‚")
+ ("རྫ" . "ö†ƒ")
+ ("ལྔ" . "ö†™")
+ ("སྔ" . "ö†©")
+ ("སྙ" . "ö†ª")
+ ("སྩ" . "ö†±")
+ ("ཀྭ" . "ö„š")
+ ("གྭ" . "ö„œ")
+ ("ཅྭ" . "ö„")
+ ("à½à¾­" . "ö„Ÿ")
+ ("དྭ" . "ö„ ")
+ ("ཟྭ" . "ö„¤")
+ ("རྭ" . "ö„¥")
+ ("ལྭ" . "ö„¦")
+ ("སྭ" . "ö„¨")
+ ("ཧྭ" . "ö„©")
+ ("ཀྱ" . "ö„¹")
+ ("གྱ" . "ö„»")
+ ("པྱ" . "ö„¼")
+ ("བྱ" . "ö„¾")
+ ("མྱ" . "ö„¿")
+ ("ཀྲ" . "ö…‰")
+ ("གྲ" . "ö…‹")
+ ("à½à¾²" . "ö…Œ")
+ ("དྲ" . "ö…Ž")
+ ("པྲ" . "ö…")
+ ("བྲ" . "ö…‘")
+ ("མྲ" . "ö…’")
+ ("སྲ" . "ö…”")
+ ("ཧྲ" . "ö…•")
+ ("ཇྲ" . "ö…–")
+ ("ཀླ" . "ö…™")
+ ("གླ" . "ö…š")
+ ("བླ" . "ö…›")
+ ("ཟླ" . "ö…œ")
+ ("རླ" . "ö…")
+ ("སླ" . "ö…ž")
+ ("རà¾" . "ö…¸")
+ ("རྒ" . "ö…¹")
+ ("རྗ" . "ö…»")
+ ("རྟ" . "ö…½")
+ ("རྡ" . "ö…¾")
+ ("རྣ" . "ö…¿")
+ ("རྦ" . "ö†€")
+ ("རྨ" . "ö†")
+ ("ལà¾" . "ö†—")
+ ("ལྒ" . "ö†˜")
+ ("ལྣ" . "ö€€") ; dummy 0x2121 added 2000/06/08 for transition l -> lng
+ ("ལྕ" . "ö†š")
+ ("ལྗ" . "ö†›")
+ ("ལྟ" . "ö†œ")
+ ("ལྡ" . "ö†")
+ ("ལྤ" . "ö†ž")
+ ("ལྦ" . "ö†Ÿ")
+ ("ལྷ" . "ö† ")
+ ("སà¾" . "ö†§")
+ ("སྒ" . "ö†¨")
+ ("སྟ" . "ö†«")
+ ("སྡ" . "ö†¬")
+ ("སྣ" . "ö†­")
+ ("སྤ" . "ö†®")
+ ("སྦ" . "ö†¯")
+ ("སྨ" . "ö†°")))
(defconst tibetan-regexp
(let ((l (list tibetan-precomposed-transcription-alist
diff --git a/lisp/language/viet-util.el b/lisp/language/viet-util.el
index a0487df9ea8..a4e7ff564e0 100644
--- a/lisp/language/viet-util.el
+++ b/lisp/language/viet-util.el
@@ -1,4 +1,4 @@
-;;; viet-util.el --- utilities for Vietnamese -*- coding: iso-2022-7bit; -*-
+;;; viet-util.el --- utilities for Vietnamese -*- coding: utf-8; -*-
;; Copyright (C) 1998, 2001-2013 Free Software Foundation, Inc.
;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
@@ -52,159 +52,159 @@
;; ------------+----------+--------
;; mark | mnemonic | example
;; ------------+----------+---------
-;; breve | ( | a( -> ,1e(B
-;; circumflex | ^ | a^ -> ,1b(B
-;; horn | + | o+ -> ,1=(B
+;; breve | ( | a( -> ă
+;; circumflex | ^ | a^ -> â
+;; horn | + | o+ -> Æ¡
;; ------------+----------+---------
-;; acute | ' | a' -> ,1a(B
-;; grave | ` | a` -> ,1`(B
-;; hook above | ? | a? -> ,1d(B
-;; tilde | ~ | a~ -> ,1c(B
-;; dot below | . | a. -> ,1U(B
+;; acute | ' | a' -> á
+;; grave | ` | a` -> à
+;; hook above | ? | a? -> ả
+;; tilde | ~ | a~ -> ã
+;; dot below | . | a. -> ạ
;; ------------+----------+---------
-;; d bar | dd | dd -> ,1p(B
+;; d bar | dd | dd -> Ä‘
;; ------------+----------+---------
(defvar viet-viqr-alist
'(;; lowercase
- (?,1!(B . "a('") ; 161
- (?,1"(B . "a(`") ; 162
- (?,1#(B . "a(.") ; 163
- (?,1$(B . "a^'") ; 164
- (?,1%(B . "a^`") ; 165
- (?,1&(B . "a^?") ; 166
- (?,1'(B . "a^.") ; 167
- (?,1((B . "e~") ; 168
- (?,1)(B . "e.") ; 169
- (?,1*(B . "e^'") ; 170
- (?,1+(B . "e^`") ; 171
- (?,1,(B . "e^?") ; 172
- (?,1-(B . "e^~") ; 173
- (?,1.(B . "e^.") ; 174
- (?,1/(B . "o^'") ; 175
- (?,10(B . "o^`") ; 176
- (?,11(B . "o^?") ; 177
- (?,12(B . "o^~") ; 178
- (?,15(B . "o^.") ; 181
- (?,16(B . "o+`") ; 182
- (?,17(B . "o+?") ; 183
- (?,18(B . "i.") ; 184
- (?,1=(B . "o+") ; 189
- (?,1>(B . "o+'") ; 190
- (?,1F(B . "a(?") ; 198
- (?,1G(B . "a(~") ; 199
- (?,1O(B . "y`") ; 207
- (?,1Q(B . "u+'") ; 209
- (?,1U(B . "a.") ; 213
- (?,1V(B . "y?") ; 214
- (?,1W(B . "u+`") ; 215
- (?,1X(B . "u+?") ; 216
- (?,1[(B . "y~") ; 219
- (?,1\(B . "y.") ; 220
- (?,1^(B . "o+~") ; 222
- (?,1_(B . "u+") ; 223
- (?,1`(B . "a`") ; 224
- (?,1a(B . "a'") ; 225
- (?,1b(B . "a^") ; 226
- (?,1c(B . "a~") ; 227
- (?,1d(B . "a?") ; 228
- (?,1e(B . "a(") ; 229
- (?,1f(B . "u+~") ; 230
- (?,1g(B . "a^~") ; 231
- (?,1h(B . "e`") ; 232
- (?,1i(B . "e'") ; 233
- (?,1j(B . "e^") ; 234
- (?,1k(B . "e?") ; 235
- (?,1l(B . "i`") ; 236
- (?,1m(B . "i'") ; 237
- (?,1n(B . "i~") ; 238
- (?,1o(B . "i?") ; 239
- (?,1p(B . "dd") ; 240
- (?,1q(B . "u+.") ; 241
- (?,1r(B . "o`") ; 242
- (?,1s(B . "o'") ; 243
- (?,1t(B . "o^") ; 244
- (?,1u(B . "o~") ; 245
- (?,1v(B . "o?") ; 246
- (?,1w(B . "o.") ; 247
- (?,1x(B . "u.") ; 248
- (?,1y(B . "u`") ; 249
- (?,1z(B . "u'") ; 250
- (?,1{(B . "u~") ; 251
- (?,1|(B . "u?") ; 252
- (?,1}(B . "y'") ; 253
- (?,1~(B . "o+.") ; 254
+ (?ắ . "a('") ; 161
+ (?ằ . "a(`") ; 162
+ (?ặ . "a(.") ; 163
+ (?ấ . "a^'") ; 164
+ (?ầ . "a^`") ; 165
+ (?ẩ . "a^?") ; 166
+ (?ậ . "a^.") ; 167
+ (?ẽ . "e~") ; 168
+ (?ẹ . "e.") ; 169
+ (?ế . "e^'") ; 170
+ (?á» . "e^`") ; 171
+ (?ể . "e^?") ; 172
+ (?á»… . "e^~") ; 173
+ (?ệ . "e^.") ; 174
+ (?ố . "o^'") ; 175
+ (?ồ . "o^`") ; 176
+ (?ổ . "o^?") ; 177
+ (?á»— . "o^~") ; 178
+ (?á»™ . "o^.") ; 181
+ (?á» . "o+`") ; 182
+ (?ở . "o+?") ; 183
+ (?ị . "i.") ; 184
+ (?Æ¡ . "o+") ; 189
+ (?á»› . "o+'") ; 190
+ (?ẳ . "a(?") ; 198
+ (?ẵ . "a(~") ; 199
+ (?ỳ . "y`") ; 207
+ (?ứ . "u+'") ; 209
+ (?ạ . "a.") ; 213
+ (?á»· . "y?") ; 214
+ (?ừ . "u+`") ; 215
+ (?á»­ . "u+?") ; 216
+ (?ỹ . "y~") ; 219
+ (?ỵ . "y.") ; 220
+ (?ỡ . "o+~") ; 222
+ (?ư . "u+") ; 223
+ (?à . "a`") ; 224
+ (?á . "a'") ; 225
+ (?â . "a^") ; 226
+ (?ã . "a~") ; 227
+ (?ả . "a?") ; 228
+ (?ă . "a(") ; 229
+ (?ữ . "u+~") ; 230
+ (?ẫ . "a^~") ; 231
+ (?è . "e`") ; 232
+ (?é . "e'") ; 233
+ (?ê . "e^") ; 234
+ (?ẻ . "e?") ; 235
+ (?ì . "i`") ; 236
+ (?í . "i'") ; 237
+ (?Ä© . "i~") ; 238
+ (?ỉ . "i?") ; 239
+ (?Ä‘ . "dd") ; 240
+ (?á»± . "u+.") ; 241
+ (?ò . "o`") ; 242
+ (?ó . "o'") ; 243
+ (?ô . "o^") ; 244
+ (?õ . "o~") ; 245
+ (?á» . "o?") ; 246
+ (?á» . "o.") ; 247
+ (?ụ . "u.") ; 248
+ (?ù . "u`") ; 249
+ (?ú . "u'") ; 250
+ (?Å© . "u~") ; 251
+ (?á»§ . "u?") ; 252
+ (?ý . "y'") ; 253
+ (?ợ . "o+.") ; 254
;; upper case
- (?,2!(B . "A('") ; 161
- (?,2"(B . "A(`") ; 162
- (?,2#(B . "A(.") ; 163
- (?,2$(B . "A^'") ; 164
- (?,2%(B . "A^`") ; 165
- (?,2&(B . "A^?") ; 166
- (?,2'(B . "A^.") ; 167
- (?,2((B . "E~") ; 168
- (?,2)(B . "E.") ; 169
- (?,2*(B . "E^'") ; 170
- (?,2+(B . "E^`") ; 171
- (?,2,(B . "E^?") ; 172
- (?,2-(B . "E^~") ; 173
- (?,2.(B . "E^.") ; 174
- (?,2/(B . "O^'") ; 175
- (?,20(B . "O^`") ; 176
- (?,21(B . "O^?") ; 177
- (?,22(B . "O^~") ; 178
- (?,25(B . "O^.") ; 181
- (?,26(B . "O+`") ; 182
- (?,27(B . "O+?") ; 183
- (?,28(B . "I.") ; 184
- (?,2=(B . "O+") ; 189
- (?,2>(B . "O+'") ; 190
- (?,2F(B . "A(?") ; 198
- (?,2G(B . "A(~") ; 199
- (?,2O(B . "Y`") ; 207
- (?,2Q(B . "U+'") ; 209
- (?,2U(B . "A.") ; 213
- (?,2V(B . "Y?") ; 214
- (?,2W(B . "U+`") ; 215
- (?,2X(B . "U+?") ; 216
- (?,2[(B . "Y~") ; 219
- (?,2\(B . "Y.") ; 220
- (?,2^(B . "O+~") ; 222
- (?,2_(B . "U+") ; 223
- (?,2`(B . "A`") ; 224
- (?,2a(B . "A'") ; 225
- (?,2b(B . "A^") ; 226
- (?,2c(B . "A~") ; 227
- (?,2d(B . "A?") ; 228
- (?,2e(B . "A(") ; 229
- (?,2f(B . "U+~") ; 230
- (?,2g(B . "A^~") ; 231
- (?,2h(B . "E`") ; 232
- (?,2i(B . "E'") ; 233
- (?,2j(B . "E^") ; 234
- (?,2k(B . "E?") ; 235
- (?,2l(B . "I`") ; 236
- (?,2m(B . "I'") ; 237
- (?,2n(B . "I~") ; 238
- (?,2o(B . "I?") ; 239
- (?,2p(B . "DD") ; 240
- (?,2p(B . "dD") ; 240
- (?,2p(B . "Dd") ; 240
- (?,2q(B . "U+.") ; 241
- (?,2r(B . "O`") ; 242
- (?,2s(B . "O'") ; 243
- (?,2t(B . "O^") ; 244
- (?,2u(B . "O~") ; 245
- (?,2v(B . "O?") ; 246
- (?,2w(B . "O.") ; 247
- (?,2x(B . "U.") ; 248
- (?,2y(B . "U`") ; 249
- (?,2z(B . "U'") ; 250
- (?,2{(B . "U~") ; 251
- (?,2|(B . "U?") ; 252
- (?,2}(B . "Y'") ; 253
- (?,2~(B . "O+.") ; 254
+ (?Ắ . "A('") ; 161
+ (?Ằ . "A(`") ; 162
+ (?Ặ . "A(.") ; 163
+ (?Ấ . "A^'") ; 164
+ (?Ầ . "A^`") ; 165
+ (?Ẩ . "A^?") ; 166
+ (?Ậ . "A^.") ; 167
+ (?Ẽ . "E~") ; 168
+ (?Ẹ . "E.") ; 169
+ (?Ế . "E^'") ; 170
+ (?Ề . "E^`") ; 171
+ (?Ể . "E^?") ; 172
+ (?Ễ . "E^~") ; 173
+ (?Ệ . "E^.") ; 174
+ (?á» . "O^'") ; 175
+ (?á»’ . "O^`") ; 176
+ (?á»” . "O^?") ; 177
+ (?á»– . "O^~") ; 178
+ (?Ộ . "O^.") ; 181
+ (?Ờ . "O+`") ; 182
+ (?Ở . "O+?") ; 183
+ (?Ị . "I.") ; 184
+ (?Æ  . "O+") ; 189
+ (?Ớ . "O+'") ; 190
+ (?Ẳ . "A(?") ; 198
+ (?Ẵ . "A(~") ; 199
+ (?Ỳ . "Y`") ; 207
+ (?Ứ . "U+'") ; 209
+ (?Ạ . "A.") ; 213
+ (?á»¶ . "Y?") ; 214
+ (?Ừ . "U+`") ; 215
+ (?Ử . "U+?") ; 216
+ (?Ỹ . "Y~") ; 219
+ (?á»´ . "Y.") ; 220
+ (?á»  . "O+~") ; 222
+ (?Ư . "U+") ; 223
+ (?À . "A`") ; 224
+ (?Ã . "A'") ; 225
+ (? . "A^") ; 226
+ (?Ã . "A~") ; 227
+ (?Ả . "A?") ; 228
+ (?Ä‚ . "A(") ; 229
+ (?á»® . "U+~") ; 230
+ (?Ẫ . "A^~") ; 231
+ (?È . "E`") ; 232
+ (?É . "E'") ; 233
+ (?Ê . "E^") ; 234
+ (?Ẻ . "E?") ; 235
+ (?Ì . "I`") ; 236
+ (?Ã . "I'") ; 237
+ (?Ĩ . "I~") ; 238
+ (?Ỉ . "I?") ; 239
+ (?Ä . "DD") ; 240
+ (?Ä . "dD") ; 240
+ (?Ä . "Dd") ; 240
+ (?á»° . "U+.") ; 241
+ (?Ã’ . "O`") ; 242
+ (?Ó . "O'") ; 243
+ (?Ô . "O^") ; 244
+ (?Õ . "O~") ; 245
+ (?Ỏ . "O?") ; 246
+ (?Ọ . "O.") ; 247
+ (?Ụ . "U.") ; 248
+ (?Ù . "U`") ; 249
+ (?Ú . "U'") ; 250
+ (?Ũ . "U~") ; 251
+ (?Ủ . "U?") ; 252
+ (?Ã . "Y'") ; 253
+ (?Ợ . "O+.") ; 254
;; escape from composition
(?\( . "\\(") ; breve (left parenthesis)
diff --git a/lisp/language/vietnamese.el b/lisp/language/vietnamese.el
index e0d4423e911..5bc49b07e08 100644
--- a/lisp/language/vietnamese.el
+++ b/lisp/language/vietnamese.el
@@ -1,4 +1,4 @@
-;;; vietnamese.el --- support for Vietnamese -*- coding: iso-2022-7bit; -*-
+;;; vietnamese.el --- support for Vietnamese -*- coding: utf-8; -*-
;; Copyright (C) 1998, 2001-2013 Free Software Foundation, Inc.
;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
@@ -80,7 +80,7 @@
(input-method . "vietnamese-viqr")
(unibyte-display . vietnamese-viscii)
(features viet-util)
- (sample-text . "Vietnamese (Ti,1*(Bng Vi,1.(Bt) Ch,1`(Bo b,1U(Bn")
+ (sample-text . "Vietnamese (Tiếng Việt) Chào bạn")
(documentation . "\
For Vietnamese, Emacs uses special charsets internally.
They can be decoded from and encoded to VISCII, VSCII, TCVN-5712, VIQR
diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el
index dd6965c9e05..2e05d6b02fb 100644
--- a/lisp/ldefs-boot.el
+++ b/lisp/ldefs-boot.el
@@ -5,7 +5,7 @@
;;;### (autoloads (5x5-crack 5x5-crack-xor-mutate 5x5-crack-mutating-best
;;;;;; 5x5-crack-mutating-current 5x5-crack-randomly 5x5) "5x5"
-;;;;;; "play/5x5.el" (20707 18685 911514 0))
+;;;;;; "play/5x5.el" (20709 26818 907104 0))
;;; Generated autoloads from play/5x5.el
(autoload '5x5 "5x5" "\
@@ -68,7 +68,7 @@ should return a grid vector array that is the new solution.
;;;***
;;;### (autoloads (ada-mode ada-add-extensions) "ada-mode" "progmodes/ada-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/ada-mode.el
(autoload 'ada-add-extensions "ada-mode" "\
@@ -88,7 +88,7 @@ Ada mode is the major mode for editing Ada code.
;;;***
;;;### (autoloads (ada-header) "ada-stmt" "progmodes/ada-stmt.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/ada-stmt.el
(autoload 'ada-header "ada-stmt" "\
@@ -99,7 +99,7 @@ Insert a descriptive header at the top of the file.
;;;***
;;;### (autoloads (ada-find-file) "ada-xref" "progmodes/ada-xref.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/ada-xref.el
(autoload 'ada-find-file "ada-xref" "\
@@ -114,15 +114,16 @@ Completion is available.
;;;;;; add-change-log-entry-other-window add-change-log-entry find-change-log
;;;;;; prompt-for-change-log-name add-log-mailing-address add-log-full-name
;;;;;; add-log-current-defun-function) "add-log" "vc/add-log.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from vc/add-log.el
(put 'change-log-default-name 'safe-local-variable 'string-or-null-p)
(defvar add-log-current-defun-function nil "\
If non-nil, function to guess name of surrounding function.
-It is used by `add-log-current-defun' in preference to built-in rules.
-Returns function's name as a string, or nil if outside a function.")
+It is called by `add-log-current-defun' with no argument, and
+should return the function's name as a string, or nil if point is
+outside a function.")
(custom-autoload 'add-log-current-defun-function "add-log" t)
@@ -213,15 +214,6 @@ Runs `change-log-mode-hook'.
\(fn)" t nil)
-(defvar add-log-lisp-like-modes '(emacs-lisp-mode lisp-mode scheme-mode dsssl-mode lisp-interaction-mode) "\
-Modes that look like Lisp to `add-log-current-defun'.")
-
-(defvar add-log-c-like-modes '(c-mode c++-mode c++-c-mode objc-mode) "\
-Modes that look like C to `add-log-current-defun'.")
-
-(defvar add-log-tex-like-modes '(TeX-mode plain-TeX-mode LaTeX-mode tex-mode) "\
-Modes that look like TeX to `add-log-current-defun'.")
-
(autoload 'add-log-current-defun "add-log" "\
Return name of function definition point is in, or nil.
@@ -253,7 +245,7 @@ old-style time formats for entries are supported.
;;;### (autoloads (defadvice ad-activate ad-add-advice ad-disable-advice
;;;;;; ad-enable-advice ad-default-compilation-action ad-redefinition-action)
-;;;;;; "advice" "emacs-lisp/advice.el" (20707 18685 911514 0))
+;;;;;; "advice" "emacs-lisp/advice.el" (20725 15032 264919 0))
;;; Generated autoloads from emacs-lisp/advice.el
(defvar ad-redefinition-action 'warn "\
@@ -352,7 +344,7 @@ POSITION ::= `first' | `last' | NUMBER. Optional, defaults to `first',
ARGLIST ::= An optional argument list to be used for the advised function
instead of the argument list of the original. The first one found in
before/around/after-advices will be used.
-FLAG ::= `protect'|`disable'|`activate'|`compile'|`preactivate'|`freeze'.
+FLAG ::= `protect'|`disable'|`activate'|`compile'|`preactivate'.
All flags can be specified with unambiguous initial substrings.
DOCSTRING ::= Optional documentation for this piece of advice.
INTERACTIVE-FORM ::= Optional interactive form to be used for the advised
@@ -378,13 +370,6 @@ time. This generates a compiled advised definition according to the current
advice state that will be used during activation if appropriate. Only use
this if the `defadvice' gets actually compiled.
-`freeze': Expands the `defadvice' into a redefining `defun/defmacro' according
-to this particular single advice. No other advice information will be saved.
-Frozen advices cannot be undone, they behave like a hard redefinition of
-the advised function. `freeze' implies `activate' and `preactivate'. The
-documentation of the advised function can be dumped onto the `DOC' file
-during preloading.
-
See Info node `(elisp)Advising Functions' for comprehensive documentation.
usage: (defadvice FUNCTION (CLASS NAME [POSITION] [ARGLIST] FLAG...)
[DOCSTRING] [INTERACTIVE-FORM]
@@ -398,7 +383,7 @@ usage: (defadvice FUNCTION (CLASS NAME [POSITION] [ARGLIST] FLAG...)
;;;### (autoloads (align-newline-and-indent align-unhighlight-rule
;;;;;; align-highlight-rule align-current align-entire align-regexp
-;;;;;; align) "align" "align.el" (20707 18685 911514 0))
+;;;;;; align) "align" "align.el" (20709 26818 907104 0))
;;; Generated autoloads from align.el
(autoload 'align "align" "\
@@ -489,7 +474,7 @@ A replacement function for `newline-and-indent', aligning as it goes.
;;;### (autoloads (outlineify-sticky allout-mode allout-mode-p allout-auto-activation
;;;;;; allout-setup allout-auto-activation-helper) "allout" "allout.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from allout.el
(autoload 'allout-auto-activation-helper "allout" "\
@@ -850,7 +835,7 @@ for details on preparing Emacs for automatic allout activation.
;;;### (autoloads (allout-widgets-mode allout-widgets-auto-activation
;;;;;; allout-widgets-setup allout-widgets) "allout-widgets" "allout-widgets.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from allout-widgets.el
(let ((loads (get 'allout-widgets 'custom-loads))) (if (member '"allout-widgets" loads) nil (put 'allout-widgets 'custom-loads (cons '"allout-widgets" loads))))
@@ -910,7 +895,7 @@ outline hot-spot navigation (see `allout-mode').
;;;***
;;;### (autoloads (ange-ftp-hook-function ange-ftp-reread-dir) "ange-ftp"
-;;;;;; "net/ange-ftp.el" (20760 17829 498761 0))
+;;;;;; "net/ange-ftp.el" (20763 30266 231060 0))
;;; Generated autoloads from net/ange-ftp.el
(defalias 'ange-ftp-re-read-dir 'ange-ftp-reread-dir)
@@ -932,7 +917,7 @@ directory, so that Emacs will know its current contents.
;;;***
;;;### (autoloads (animate-birthday-present animate-sequence animate-string)
-;;;;;; "animate" "play/animate.el" (20707 18685 911514 0))
+;;;;;; "animate" "play/animate.el" (20709 26818 907104 0))
;;; Generated autoloads from play/animate.el
(autoload 'animate-string "animate" "\
@@ -965,7 +950,7 @@ the buffer *Birthday-Present-for-Name*.
;;;***
;;;### (autoloads (ansi-color-process-output ansi-color-for-comint-mode-on)
-;;;;;; "ansi-color" "ansi-color.el" (20707 18685 911514 0))
+;;;;;; "ansi-color" "ansi-color.el" (20709 26818 907104 0))
;;; Generated autoloads from ansi-color.el
(autoload 'ansi-color-for-comint-mode-on "ansi-color" "\
@@ -991,7 +976,7 @@ This is a good function to put in `comint-output-filter-functions'.
;;;***
;;;### (autoloads (antlr-set-tabs antlr-mode antlr-show-makefile-rules)
-;;;;;; "antlr-mode" "progmodes/antlr-mode.el" (20707 18685 911514
+;;;;;; "antlr-mode" "progmodes/antlr-mode.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from progmodes/antlr-mode.el
@@ -1028,7 +1013,7 @@ Used in `antlr-mode'. Also a useful function in `java-mode-hook'.
;;;***
;;;### (autoloads (appt-activate appt-add) "appt" "calendar/appt.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from calendar/appt.el
(autoload 'appt-add "appt" "\
@@ -1051,8 +1036,8 @@ ARG is positive, otherwise off.
;;;### (autoloads (apropos-documentation apropos-value apropos-library
;;;;;; apropos apropos-documentation-property apropos-command apropos-variable
-;;;;;; apropos-read-pattern) "apropos" "apropos.el" (20707 18685
-;;;;;; 911514 0))
+;;;;;; apropos-user-option apropos-read-pattern) "apropos" "apropos.el"
+;;;;;; (20716 56 356960 0))
;;; Generated autoloads from apropos.el
(autoload 'apropos-read-pattern "apropos" "\
@@ -1065,18 +1050,25 @@ kind of objects to search.
\(fn SUBJECT)" nil nil)
-(autoload 'apropos-variable "apropos" "\
-Show user variables that match PATTERN.
+(autoload 'apropos-user-option "apropos" "\
+Show user options that match PATTERN.
PATTERN can be a word, a list of words (separated by spaces),
or a regexp (using some regexp special characters). If it is a word,
search for matches for that word as a substring. If it is a list of words,
search for matches for any two (or more) of those words.
With \\[universal-argument] prefix, or if `apropos-do-all' is non-nil, also show
-normal variables.
+variables, not just user options.
\(fn PATTERN &optional DO-ALL)" t nil)
+(autoload 'apropos-variable "apropos" "\
+Show variables that match PATTERN.
+When DO-NOT-ALL is not-nil, show user options only, i.e. behave
+like `apropos-user-option'.
+
+\(fn PATTERN &optional DO-NOT-ALL)" t nil)
+
(defalias 'command-apropos 'apropos-command)
(autoload 'apropos-command "apropos" "\
@@ -1160,8 +1152,8 @@ Returns list of symbols and documentation found.
;;;***
-;;;### (autoloads (archive-mode) "arc-mode" "arc-mode.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (archive-mode) "arc-mode" "arc-mode.el" (20759
+;;;;;; 33211 414988 0))
;;; Generated autoloads from arc-mode.el
(autoload 'archive-mode "arc-mode" "\
@@ -1181,7 +1173,7 @@ archive.
;;;***
-;;;### (autoloads (array-mode) "array" "array.el" (20707 18685 911514
+;;;### (autoloads (array-mode) "array" "array.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from array.el
@@ -1253,8 +1245,8 @@ Entering array mode calls the function `array-mode-hook'.
;;;***
-;;;### (autoloads (artist-mode) "artist" "textmodes/artist.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (artist-mode) "artist" "textmodes/artist.el" (20777
+;;;;;; 63161 848428 0))
;;; Generated autoloads from textmodes/artist.el
(autoload 'artist-mode "artist" "\
@@ -1459,8 +1451,8 @@ Keymap summary
;;;***
-;;;### (autoloads (asm-mode) "asm-mode" "progmodes/asm-mode.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (asm-mode) "asm-mode" "progmodes/asm-mode.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from progmodes/asm-mode.el
(autoload 'asm-mode "asm-mode" "\
@@ -1488,7 +1480,7 @@ Special commands:
;;;***
;;;### (autoloads (auth-source-cache-expiry) "auth-source" "gnus/auth-source.el"
-;;;;;; (20755 17565 391628 0))
+;;;;;; (20755 36154 171386 0))
;;; Generated autoloads from gnus/auth-source.el
(defvar auth-source-cache-expiry 7200 "\
@@ -1501,7 +1493,7 @@ let-binding.")
;;;***
;;;### (autoloads (autoarg-kp-mode autoarg-mode) "autoarg" "autoarg.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from autoarg.el
(defvar autoarg-mode nil "\
@@ -1562,7 +1554,7 @@ This is similar to `autoarg-mode' but rebinds the keypad keys
;;;***
;;;### (autoloads (autoconf-mode) "autoconf" "progmodes/autoconf.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/autoconf.el
(autoload 'autoconf-mode "autoconf" "\
@@ -1573,7 +1565,7 @@ Major mode for editing Autoconf configure.ac files.
;;;***
;;;### (autoloads (auto-insert-mode define-auto-insert auto-insert)
-;;;;;; "autoinsert" "autoinsert.el" (20707 18685 911514 0))
+;;;;;; "autoinsert" "autoinsert.el" (20709 26818 907104 0))
;;; Generated autoloads from autoinsert.el
(autoload 'auto-insert "autoinsert" "\
@@ -1613,7 +1605,7 @@ insert a template for the file depending on the mode of the buffer.
;;;### (autoloads (batch-update-autoloads update-directory-autoloads
;;;;;; update-file-autoloads) "autoload" "emacs-lisp/autoload.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/autoload.el
(put 'generated-autoload-file 'safe-local-variable 'stringp)
@@ -1664,7 +1656,7 @@ should be non-nil).
;;;### (autoloads (global-auto-revert-mode turn-on-auto-revert-tail-mode
;;;;;; auto-revert-tail-mode turn-on-auto-revert-mode auto-revert-mode)
-;;;;;; "autorevert" "autorevert.el" (20707 18685 911514 0))
+;;;;;; "autorevert" "autorevert.el" (20767 27320 533690 0))
;;; Generated autoloads from autorevert.el
(autoload 'auto-revert-mode "autorevert" "\
@@ -1753,7 +1745,7 @@ specifies in the mode line.
;;;***
;;;### (autoloads (mouse-avoidance-mode mouse-avoidance-mode) "avoid"
-;;;;;; "avoid.el" (20707 18685 911514 0))
+;;;;;; "avoid.el" (20709 26818 907104 0))
;;; Generated autoloads from avoid.el
(defvar mouse-avoidance-mode nil "\
@@ -1794,7 +1786,7 @@ definition of \"random distance\".)
;;;***
;;;### (autoloads (display-battery-mode battery) "battery" "battery.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20791 9657 561026 0))
;;; Generated autoloads from battery.el
(put 'battery-mode-line-string 'risky-local-variable t)
@@ -1830,7 +1822,7 @@ seconds.
;;;***
;;;### (autoloads (benchmark benchmark-run-compiled benchmark-run)
-;;;;;; "benchmark" "emacs-lisp/benchmark.el" (20707 18685 911514
+;;;;;; "benchmark" "emacs-lisp/benchmark.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from emacs-lisp/benchmark.el
@@ -1868,7 +1860,7 @@ For non-interactive use see also `benchmark-run' and
;;;***
;;;### (autoloads (bibtex-search-entry bibtex-mode bibtex-initialize)
-;;;;;; "bibtex" "textmodes/bibtex.el" (20707 18685 911514 0))
+;;;;;; "bibtex" "textmodes/bibtex.el" (20709 26818 907104 0))
;;; Generated autoloads from textmodes/bibtex.el
(autoload 'bibtex-initialize "bibtex" "\
@@ -1957,7 +1949,7 @@ A prefix arg negates the value of `bibtex-search-entry-globally'.
;;;***
;;;### (autoloads (bibtex-style-mode) "bibtex-style" "textmodes/bibtex-style.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from textmodes/bibtex-style.el
(autoload 'bibtex-style-mode "bibtex-style" "\
@@ -1969,7 +1961,7 @@ Major mode for editing BibTeX style files.
;;;### (autoloads (binhex-decode-region binhex-decode-region-external
;;;;;; binhex-decode-region-internal) "binhex" "mail/binhex.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from mail/binhex.el
(defconst binhex-begin-line "^:...............................................................$" "\
@@ -1993,8 +1985,8 @@ Binhex decode region between START and END.
;;;***
-;;;### (autoloads (blackbox) "blackbox" "play/blackbox.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (blackbox) "blackbox" "play/blackbox.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from play/blackbox.el
(autoload 'blackbox "blackbox" "\
@@ -2117,7 +2109,7 @@ a reflection.
;;;;;; bookmark-save bookmark-write bookmark-delete bookmark-insert
;;;;;; bookmark-rename bookmark-insert-location bookmark-relocate
;;;;;; bookmark-jump-other-window bookmark-jump bookmark-set) "bookmark"
-;;;;;; "bookmark.el" (20707 18685 911514 0))
+;;;;;; "bookmark.el" (20793 51383 764318 0))
;;; Generated autoloads from bookmark.el
(define-key ctl-x-r-map "b" 'bookmark-jump)
(define-key ctl-x-r-map "m" 'bookmark-set)
@@ -2318,7 +2310,7 @@ Incremental search of bookmarks, hiding the non-matches as we go.
;;;;;; browse-url-xdg-open browse-url-at-mouse browse-url-at-point
;;;;;; browse-url browse-url-of-region browse-url-of-dired-file
;;;;;; browse-url-of-buffer browse-url-of-file browse-url-browser-function)
-;;;;;; "browse-url" "net/browse-url.el" (20707 18685 911514 0))
+;;;;;; "browse-url" "net/browse-url.el" (20709 26818 907104 0))
;;; Generated autoloads from net/browse-url.el
(defvar browse-url-browser-function 'browse-url-default-browser "\
@@ -2634,7 +2626,7 @@ from `browse-url-elinks-wrapper'.
;;;***
;;;### (autoloads (bs-show bs-customize bs-cycle-previous bs-cycle-next)
-;;;;;; "bs" "bs.el" (20707 18685 911514 0))
+;;;;;; "bs" "bs.el" (20709 26818 907104 0))
;;; Generated autoloads from bs.el
(autoload 'bs-cycle-next "bs" "\
@@ -2674,8 +2666,8 @@ name of buffer configuration.
;;;***
-;;;### (autoloads (bubbles) "bubbles" "play/bubbles.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (bubbles) "bubbles" "play/bubbles.el" (20791 9657
+;;;;;; 561026 0))
;;; Generated autoloads from play/bubbles.el
(autoload 'bubbles "bubbles" "\
@@ -2697,7 +2689,7 @@ columns on its right towards the left.
;;;***
;;;### (autoloads (bug-reference-prog-mode bug-reference-mode) "bug-reference"
-;;;;;; "progmodes/bug-reference.el" (20707 18685 911514 0))
+;;;;;; "progmodes/bug-reference.el" (20709 26818 907104 0))
;;; Generated autoloads from progmodes/bug-reference.el
(put 'bug-reference-url-format 'safe-local-variable (lambda (s) (or (stringp s) (and (symbolp s) (get s 'bug-reference-url-format)))))
@@ -2721,7 +2713,7 @@ Like `bug-reference-mode', but only buttonize in comments and strings.
;;;;;; batch-byte-compile-if-not-done display-call-tree byte-compile
;;;;;; compile-defun byte-compile-file byte-recompile-directory
;;;;;; byte-force-recompile byte-compile-enable-warning byte-compile-disable-warning)
-;;;;;; "bytecomp" "emacs-lisp/bytecomp.el" (20707 18685 911514 0))
+;;;;;; "bytecomp" "emacs-lisp/bytecomp.el" (20780 39352 990623 0))
;;; Generated autoloads from emacs-lisp/bytecomp.el
(put 'byte-compile-dynamic 'safe-local-variable 'booleanp)
(put 'byte-compile-disable-print-circle 'safe-local-variable 'booleanp)
@@ -2841,8 +2833,8 @@ and corresponding effects.
;;;***
-;;;### (autoloads nil "cal-china" "calendar/cal-china.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads nil "cal-china" "calendar/cal-china.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from calendar/cal-china.el
(put 'calendar-chinese-time-zone 'risky-local-variable t)
@@ -2851,8 +2843,8 @@ and corresponding effects.
;;;***
-;;;### (autoloads nil "cal-dst" "calendar/cal-dst.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads nil "cal-dst" "calendar/cal-dst.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from calendar/cal-dst.el
(put 'calendar-daylight-savings-starts 'risky-local-variable t)
@@ -2864,7 +2856,7 @@ and corresponding effects.
;;;***
;;;### (autoloads (calendar-hebrew-list-yahrzeits) "cal-hebrew" "calendar/cal-hebrew.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from calendar/cal-hebrew.el
(autoload 'calendar-hebrew-list-yahrzeits "cal-hebrew" "\
@@ -2880,13 +2872,13 @@ from the cursor position.
;;;### (autoloads (defmath calc-embedded-activate calc-embedded calc-grab-rectangle
;;;;;; calc-grab-region full-calc-keypad calc-keypad calc-eval quick-calc
-;;;;;; full-calc calc calc-dispatch) "calc" "calc/calc.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; full-calc calc calc-dispatch) "calc" "calc/calc.el" (20759
+;;;;;; 33211 414988 0))
;;; Generated autoloads from calc/calc.el
(define-key ctl-x-map "*" 'calc-dispatch)
(autoload 'calc-dispatch "calc" "\
-Invoke the GNU Emacs Calculator. See `calc-dispatch-help' for details.
+Invoke the GNU Emacs Calculator. See \\[calc-dispatch-help] for details.
\(fn &optional ARG)" t nil)
@@ -2965,8 +2957,8 @@ See Info node `(calc)Defining Functions'.
;;;***
-;;;### (autoloads (calc-undo) "calc-undo" "calc/calc-undo.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (calc-undo) "calc-undo" "calc/calc-undo.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from calc/calc-undo.el
(autoload 'calc-undo "calc-undo" "\
@@ -2976,8 +2968,8 @@ See Info node `(calc)Defining Functions'.
;;;***
-;;;### (autoloads (calculator) "calculator" "calculator.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (calculator) "calculator" "calculator.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from calculator.el
(autoload 'calculator "calculator" "\
@@ -2988,8 +2980,8 @@ See the documentation for `calculator-mode' for more information.
;;;***
-;;;### (autoloads (calendar) "calendar" "calendar/calendar.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (calendar) "calendar" "calendar/calendar.el" (20762
+;;;;;; 9398 526093 0))
;;; Generated autoloads from calendar/calendar.el
(autoload 'calendar "calendar" "\
@@ -3033,7 +3025,7 @@ This function is suitable for execution in an init file.
;;;***
;;;### (autoloads (canlock-verify canlock-insert-header) "canlock"
-;;;;;; "gnus/canlock.el" (20707 18685 911514 0))
+;;;;;; "gnus/canlock.el" (20709 26818 907104 0))
;;; Generated autoloads from gnus/canlock.el
(autoload 'canlock-insert-header "canlock" "\
@@ -3051,7 +3043,7 @@ it fails.
;;;***
;;;### (autoloads (capitalized-words-mode) "cap-words" "progmodes/cap-words.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/cap-words.el
(autoload 'capitalized-words-mode "cap-words" "\
@@ -3090,15 +3082,15 @@ Obsoletes `c-forward-into-nomenclature'.
;;;***
-;;;### (autoloads nil "cc-compat" "progmodes/cc-compat.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads nil "cc-compat" "progmodes/cc-compat.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from progmodes/cc-compat.el
(put 'c-indent-level 'safe-local-variable 'integerp)
;;;***
;;;### (autoloads (c-guess-basic-syntax) "cc-engine" "progmodes/cc-engine.el"
-;;;;;; (20750 47885 906996 0))
+;;;;;; (20791 9657 561026 0))
;;; Generated autoloads from progmodes/cc-engine.el
(autoload 'c-guess-basic-syntax "cc-engine" "\
@@ -3110,8 +3102,8 @@ Return the syntactic context of the current line.
;;;### (autoloads (c-guess-install c-guess-region-no-install c-guess-region
;;;;;; c-guess-buffer-no-install c-guess-buffer c-guess-no-install
-;;;;;; c-guess) "cc-guess" "progmodes/cc-guess.el" (20707 18685
-;;;;;; 911514 0))
+;;;;;; c-guess) "cc-guess" "progmodes/cc-guess.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from progmodes/cc-guess.el
(defvar c-guess-guessed-offsets-alist nil "\
@@ -3211,7 +3203,7 @@ the absolute file name of the file if STYLE-NAME is nil.
;;;### (autoloads (awk-mode pike-mode idl-mode java-mode objc-mode
;;;;;; c++-mode c-mode c-initialize-cc-mode) "cc-mode" "progmodes/cc-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/cc-mode.el
(autoload 'c-initialize-cc-mode "cc-mode" "\
@@ -3388,7 +3380,7 @@ Key bindings:
;;;***
;;;### (autoloads (c-set-offset c-add-style c-set-style) "cc-styles"
-;;;;;; "progmodes/cc-styles.el" (20707 18685 911514 0))
+;;;;;; "progmodes/cc-styles.el" (20709 26818 907104 0))
;;; Generated autoloads from progmodes/cc-styles.el
(autoload 'c-set-style "cc-styles" "\
@@ -3439,8 +3431,8 @@ and exists only for compatibility reasons.
;;;***
-;;;### (autoloads nil "cc-vars" "progmodes/cc-vars.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads nil "cc-vars" "progmodes/cc-vars.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from progmodes/cc-vars.el
(put 'c-basic-offset 'safe-local-variable 'integerp)
(put 'c-backslash-column 'safe-local-variable 'integerp)
@@ -3450,7 +3442,7 @@ and exists only for compatibility reasons.
;;;### (autoloads (ccl-execute-with-args check-ccl-program define-ccl-program
;;;;;; declare-ccl-program ccl-dump ccl-compile) "ccl" "international/ccl.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from international/ccl.el
(autoload 'ccl-compile "ccl" "\
@@ -3711,7 +3703,7 @@ See the documentation of `define-ccl-program' for the detail of CCL program.
;;;***
;;;### (autoloads (cconv-closure-convert) "cconv" "emacs-lisp/cconv.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/cconv.el
(autoload 'cconv-closure-convert "cconv" "\
@@ -3726,7 +3718,7 @@ Returns a form where all lambdas don't have any free variables.
;;;***
;;;### (autoloads (cfengine-auto-mode cfengine2-mode cfengine3-mode)
-;;;;;; "cfengine" "progmodes/cfengine.el" (20707 18685 911514 0))
+;;;;;; "cfengine" "progmodes/cfengine.el" (20813 33065 721081 0))
;;; Generated autoloads from progmodes/cfengine.el
(autoload 'cfengine3-mode "cfengine" "\
@@ -3756,7 +3748,7 @@ on the buffer contents
;;;***
;;;### (autoloads (check-declare-directory check-declare-file) "check-declare"
-;;;;;; "emacs-lisp/check-declare.el" (20707 18685 911514 0))
+;;;;;; "emacs-lisp/check-declare.el" (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/check-declare.el
(autoload 'check-declare-file "check-declare" "\
@@ -3781,7 +3773,7 @@ Returns non-nil if any false statements are found.
;;;;;; checkdoc-comments checkdoc-continue checkdoc-start checkdoc-current-buffer
;;;;;; checkdoc-eval-current-buffer checkdoc-message-interactive
;;;;;; checkdoc-interactive checkdoc checkdoc-list-of-strings-p)
-;;;;;; "checkdoc" "emacs-lisp/checkdoc.el" (20707 18685 911514 0))
+;;;;;; "checkdoc" "emacs-lisp/checkdoc.el" (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/checkdoc.el
(put 'checkdoc-force-docstrings-flag 'safe-local-variable 'booleanp)
(put 'checkdoc-force-history-flag 'safe-local-variable 'booleanp)
@@ -3977,7 +3969,7 @@ checking of documentation strings.
;;;### (autoloads (pre-write-encode-hz post-read-decode-hz encode-hz-buffer
;;;;;; encode-hz-region decode-hz-buffer decode-hz-region) "china-util"
-;;;;;; "language/china-util.el" (20707 18685 911514 0))
+;;;;;; "language/china-util.el" (20799 169 640767 0))
;;; Generated autoloads from language/china-util.el
(autoload 'decode-hz-region "china-util" "\
@@ -4015,7 +4007,7 @@ Encode the text in the current buffer to HZ.
;;;***
;;;### (autoloads (command-history list-command-history repeat-matching-complex-command)
-;;;;;; "chistory" "chistory.el" (20707 18685 911514 0))
+;;;;;; "chistory" "chistory.el" (20709 26818 907104 0))
;;; Generated autoloads from chistory.el
(autoload 'repeat-matching-complex-command "chistory" "\
@@ -4055,7 +4047,7 @@ and runs the normal hook `command-history-hook'.
;;;***
;;;### (autoloads (common-lisp-indent-function) "cl-indent" "emacs-lisp/cl-indent.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/cl-indent.el
(autoload 'common-lisp-indent-function "cl-indent" "\
@@ -4133,8 +4125,8 @@ For example, the function `case' has an indent property
;;;***
-;;;### (autoloads nil "cl-lib" "emacs-lisp/cl-lib.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads nil "cl-lib" "emacs-lisp/cl-lib.el" (20772 12071
+;;;;;; 425443 833000))
;;; Generated autoloads from emacs-lisp/cl-lib.el
(define-obsolete-variable-alias 'custom-print-functions 'cl-custom-print-functions "24.3")
@@ -4162,7 +4154,7 @@ a future Emacs interpreter will be able to use it.")
;;;***
;;;### (autoloads (c-macro-expand) "cmacexp" "progmodes/cmacexp.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/cmacexp.el
(autoload 'c-macro-expand "cmacexp" "\
@@ -4182,8 +4174,8 @@ For use inside Lisp programs, see also `c-macro-expansion'.
;;;***
-;;;### (autoloads (run-scheme) "cmuscheme" "cmuscheme.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (run-scheme) "cmuscheme" "cmuscheme.el" (20774
+;;;;;; 53405 584723 417000))
;;; Generated autoloads from cmuscheme.el
(autoload 'run-scheme "cmuscheme" "\
@@ -4203,8 +4195,8 @@ is run).
;;;***
-;;;### (autoloads (color-name-to-rgb) "color" "color.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (color-name-to-rgb) "color" "color.el" (20721 17977
+;;;;;; 14204 0))
;;; Generated autoloads from color.el
(autoload 'color-name-to-rgb "color" "\
@@ -4226,7 +4218,7 @@ If FRAME cannot display COLOR, return nil.
;;;### (autoloads (comint-redirect-results-list-from-process comint-redirect-results-list
;;;;;; comint-redirect-send-command-to-process comint-redirect-send-command
;;;;;; comint-run make-comint make-comint-in-buffer) "comint" "comint.el"
-;;;;;; (20714 7872 790163 728000))
+;;;;;; (20797 44848 327754 0))
;;; Generated autoloads from comint.el
(defvar comint-output-filter-functions '(ansi-color-process-output comint-postoutput-scroll-to-bottom comint-watch-for-password-prompt) "\
@@ -4326,7 +4318,7 @@ REGEXP-GROUP is the regular expression group in REGEXP to use.
;;;***
;;;### (autoloads (compare-windows) "compare-w" "vc/compare-w.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20721 17977 14204 0))
;;; Generated autoloads from vc/compare-w.el
(autoload 'compare-windows "compare-w" "\
@@ -4363,27 +4355,24 @@ on third call it again advances points to the next difference and so on.
;;;;;; compilation-shell-minor-mode compilation-mode compilation-start
;;;;;; compile compilation-disable-input compile-command compilation-search-path
;;;;;; compilation-ask-about-save compilation-window-height compilation-start-hook
-;;;;;; compilation-mode-hook) "compile" "progmodes/compile.el" (20763
-;;;;;; 5110 492774 0))
+;;;;;; compilation-mode-hook) "compile" "progmodes/compile.el" (20808
+;;;;;; 15152 87827 0))
;;; Generated autoloads from progmodes/compile.el
(defvar compilation-mode-hook nil "\
-List of hook functions run by `compilation-mode' (see `run-mode-hooks').")
+List of hook functions run by `compilation-mode'.")
(custom-autoload 'compilation-mode-hook "compile" t)
(defvar compilation-start-hook nil "\
-List of hook functions run by `compilation-start' on the compilation process.
-\(See `run-hook-with-args').
-If you use \"omake -P\" and do not want \\[save-buffers-kill-terminal] to ask whether you want
-the compilation to be killed, you can use this hook:
- (add-hook 'compilation-start-hook
- (lambda (process) (set-process-query-on-exit-flag process nil)) nil t)")
+Hook run after starting a new compilation process.
+The hook is run with one argument, the new process.")
(custom-autoload 'compilation-start-hook "compile" t)
(defvar compilation-window-height nil "\
-Number of lines in a compilation window. If nil, use Emacs default.")
+Number of lines in a compilation window.
+If nil, use Emacs default.")
(custom-autoload 'compilation-window-height "compile" t)
@@ -4458,8 +4447,9 @@ and move to the source code that caused it.
If optional second arg COMINT is t the buffer will be in Comint mode with
`compilation-shell-minor-mode'.
-Interactively, prompts for the command if `compilation-read-command' is
-non-nil; otherwise uses `compile-command'. With prefix arg, always prompts.
+Interactively, prompts for the command if the variable
+`compilation-read-command' is non-nil; otherwise uses`compile-command'.
+With prefix arg, always prompts.
Additionally, with universal prefix arg, compilation buffer will be in
comint mode, i.e. interactive.
@@ -4546,7 +4536,7 @@ This is the value of `next-error-function' in Compilation buffers.
;;;***
;;;### (autoloads (dynamic-completion-mode) "completion" "completion.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from completion.el
(defvar dynamic-completion-mode nil "\
@@ -4571,7 +4561,7 @@ if ARG is omitted or nil.
;;;### (autoloads (conf-xdefaults-mode conf-ppd-mode conf-colon-mode
;;;;;; conf-space-keywords conf-space-mode conf-javaprop-mode conf-windows-mode
;;;;;; conf-unix-mode conf-mode) "conf-mode" "textmodes/conf-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20791 9657 561026 0))
;;; Generated autoloads from textmodes/conf-mode.el
(autoload 'conf-mode "conf-mode" "\
@@ -4727,7 +4717,7 @@ For details see `conf-mode'. Example:
;;;***
;;;### (autoloads (shuffle-vector cookie-snarf cookie-insert cookie)
-;;;;;; "cookie1" "play/cookie1.el" (20707 18685 911514 0))
+;;;;;; "cookie1" "play/cookie1.el" (20709 26818 907104 0))
;;; Generated autoloads from play/cookie1.el
(autoload 'cookie "cookie1" "\
@@ -4759,8 +4749,8 @@ Randomly permute the elements of VECTOR (all permutations equally likely).
;;;***
;;;### (autoloads (copyright-update-directory copyright copyright-fix-years
-;;;;;; copyright-update) "copyright" "emacs-lisp/copyright.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; copyright-update) "copyright" "emacs-lisp/copyright.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from emacs-lisp/copyright.el
(put 'copyright-at-end-flag 'safe-local-variable 'booleanp)
(put 'copyright-names-regexp 'safe-local-variable 'stringp)
@@ -4799,7 +4789,7 @@ If FIX is non-nil, run `copyright-fix-years' instead.
;;;***
;;;### (autoloads (cperl-perldoc-at-point cperl-perldoc cperl-mode)
-;;;;;; "cperl-mode" "progmodes/cperl-mode.el" (20763 5110 492774
+;;;;;; "cperl-mode" "progmodes/cperl-mode.el" (20763 30266 231060
;;;;;; 0))
;;; Generated autoloads from progmodes/cperl-mode.el
(put 'cperl-indent-level 'safe-local-variable 'integerp)
@@ -4999,7 +4989,7 @@ Run a `perldoc' on the word around point.
;;;***
;;;### (autoloads (cpp-parse-edit cpp-highlight-buffer) "cpp" "progmodes/cpp.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20762 9398 526093 0))
;;; Generated autoloads from progmodes/cpp.el
(autoload 'cpp-highlight-buffer "cpp" "\
@@ -5018,7 +5008,7 @@ Edit display information for cpp conditionals.
;;;***
;;;### (autoloads (crisp-mode crisp-mode) "crisp" "emulation/crisp.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emulation/crisp.el
(defvar crisp-mode nil "\
@@ -5044,7 +5034,7 @@ if ARG is omitted or nil.
;;;***
;;;### (autoloads (completing-read-multiple) "crm" "emacs-lisp/crm.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20825 24233 991089 0))
;;; Generated autoloads from emacs-lisp/crm.el
(autoload 'completing-read-multiple "crm" "\
@@ -5053,12 +5043,12 @@ By using this functionality, a user may specify multiple strings at a
single prompt, optionally using completion.
Multiple strings are specified by separating each of the strings with
-a prespecified separator character. For example, if the separator
-character is a comma, the strings 'alice', 'bob', and 'eve' would be
+a prespecified separator regexp. For example, if the separator
+regexp is \",\", the strings 'alice', 'bob', and 'eve' would be
specified as 'alice,bob,eve'.
-The default value for the separator character is the value of
-`crm-default-separator' (comma). The separator character may be
+The default value for the separator regexp is the value of
+`crm-default-separator' (comma). The separator regexp may be
changed by modifying the value of `crm-separator'.
Contiguous strings of non-separator-characters are referred to as
@@ -5069,7 +5059,8 @@ Completion is available on a per-element basis. For example, if the
contents of the minibuffer are 'alice,bob,eve' and point is between
'l' and 'i', pressing TAB operates on the element 'alice'.
-The return value of this function is a list of the read strings.
+The return value of this function is a list of the read strings
+with empty strings removed.
See the documentation for `completing-read' for details on the arguments:
PROMPT, TABLE, PREDICATE, REQUIRE-MATCH, INITIAL-INPUT, HIST, DEF, and
@@ -5079,8 +5070,8 @@ INHERIT-INPUT-METHOD.
;;;***
-;;;### (autoloads (css-mode) "css-mode" "textmodes/css-mode.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (css-mode) "css-mode" "textmodes/css-mode.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from textmodes/css-mode.el
(autoload 'css-mode "css-mode" "\
@@ -5091,7 +5082,7 @@ Major mode to edit Cascading Style Sheets.
;;;***
;;;### (autoloads (cua-selection-mode cua-mode) "cua-base" "emulation/cua-base.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emulation/cua-base.el
(defvar cua-mode nil "\
@@ -5151,7 +5142,7 @@ Enable CUA selection mode without the C-z/C-x/C-c/C-v bindings.
;;;;;; customize-mode customize customize-push-and-save customize-save-variable
;;;;;; customize-set-variable customize-set-value custom-menu-sort-alphabetically
;;;;;; custom-buffer-sort-alphabetically custom-browse-sort-alphabetically)
-;;;;;; "cus-edit" "cus-edit.el" (20707 18685 911514 0))
+;;;;;; "cus-edit" "cus-edit.el" (20762 9398 526093 0))
;;; Generated autoloads from cus-edit.el
(defvar custom-browse-sort-alphabetically nil "\
@@ -5463,8 +5454,8 @@ The format is suitable for use with `easy-menu-define'.
;;;***
;;;### (autoloads (customize-themes describe-theme custom-theme-visit-theme
-;;;;;; customize-create-theme) "cus-theme" "cus-theme.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; customize-create-theme) "cus-theme" "cus-theme.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from cus-theme.el
(autoload 'customize-create-theme "cus-theme" "\
@@ -5498,7 +5489,7 @@ omitted, a buffer named *Custom Themes* is used.
;;;***
;;;### (autoloads (cvs-status-mode) "cvs-status" "vc/cvs-status.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from vc/cvs-status.el
(autoload 'cvs-status-mode "cvs-status" "\
@@ -5509,7 +5500,7 @@ Mode used for cvs status output.
;;;***
;;;### (autoloads (global-cwarn-mode cwarn-mode) "cwarn" "progmodes/cwarn.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/cwarn.el
(autoload 'cwarn-mode "cwarn" "\
@@ -5554,7 +5545,7 @@ See `cwarn-mode' for more information on Cwarn mode.
;;;### (autoloads (standard-display-cyrillic-translit cyrillic-encode-alternativnyj-char
;;;;;; cyrillic-encode-koi8-r-char) "cyril-util" "language/cyril-util.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from language/cyril-util.el
(autoload 'cyrillic-encode-koi8-r-char "cyril-util" "\
@@ -5583,7 +5574,7 @@ If the argument is nil, we return the display table to its standard state.
;;;***
;;;### (autoloads (dabbrev-expand dabbrev-completion) "dabbrev" "dabbrev.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from dabbrev.el
(put 'dabbrev-case-fold-search 'risky-local-variable t)
(put 'dabbrev-case-replace 'risky-local-variable t)
@@ -5630,7 +5621,7 @@ See also `dabbrev-abbrev-char-regexp' and \\[dabbrev-completion].
;;;***
;;;### (autoloads (data-debug-new-buffer) "data-debug" "cedet/data-debug.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from cedet/data-debug.el
(autoload 'data-debug-new-buffer "data-debug" "\
@@ -5640,8 +5631,8 @@ Create a new data-debug buffer with NAME.
;;;***
-;;;### (autoloads (dbus-handle-event) "dbus" "net/dbus.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (dbus-handle-event) "dbus" "net/dbus.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from net/dbus.el
(autoload 'dbus-handle-event "dbus" "\
@@ -5655,7 +5646,7 @@ If the HANDLER returns a `dbus-error', it is propagated as return message.
;;;***
;;;### (autoloads (dcl-mode) "dcl-mode" "progmodes/dcl-mode.el" (20763
-;;;;;; 5110 492774 0))
+;;;;;; 30266 231060 0))
;;; Generated autoloads from progmodes/dcl-mode.el
(autoload 'dcl-mode "dcl-mode" "\
@@ -5782,7 +5773,7 @@ There is some minimal font-lock support (see vars
;;;***
;;;### (autoloads (cancel-debug-on-entry debug-on-entry debug) "debug"
-;;;;;; "emacs-lisp/debug.el" (20707 18685 911514 0))
+;;;;;; "emacs-lisp/debug.el" (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/debug.el
(setq debugger 'debug)
@@ -5796,7 +5787,7 @@ You may call with no args, or you may pass nil as the first arg and
any other args you like. In that case, the list of args after the
first will be printed into the backtrace buffer.
-\(fn &rest DEBUGGER-ARGS)" t nil)
+\(fn &rest ARGS)" t nil)
(autoload 'debug-on-entry "debug" "\
Request FUNCTION to invoke debugger each time it is called.
@@ -5826,7 +5817,7 @@ To specify a nil argument interactively, exit with an empty minibuffer.
;;;***
;;;### (autoloads (decipher-mode decipher) "decipher" "play/decipher.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from play/decipher.el
(autoload 'decipher "decipher" "\
@@ -5855,8 +5846,8 @@ The most useful commands are:
;;;***
;;;### (autoloads (delimit-columns-rectangle delimit-columns-region
-;;;;;; delimit-columns-customize) "delim-col" "delim-col.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; delimit-columns-customize) "delim-col" "delim-col.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from delim-col.el
(autoload 'delimit-columns-customize "delim-col" "\
@@ -5880,60 +5871,8 @@ START and END delimits the corners of text rectangle.
;;;***
-;;;### (autoloads (delphi-mode) "delphi" "progmodes/delphi.el" (20707
-;;;;;; 18685 911514 0))
-;;; Generated autoloads from progmodes/delphi.el
-
-(autoload 'delphi-mode "delphi" "\
-Major mode for editing Delphi code. \\<delphi-mode-map>
-\\[delphi-tab] - Indents the current line (or region, if Transient Mark mode
- is enabled and the region is active) of Delphi code.
-\\[delphi-find-unit] - Search for a Delphi source file.
-\\[delphi-fill-comment] - Fill the current comment.
-\\[delphi-new-comment-line] - If in a // comment, do a new comment line.
-
-\\[indent-region] also works for indenting a whole region.
-
-Customization:
-
- `delphi-indent-level' (default 3)
- Indentation of Delphi statements with respect to containing block.
- `delphi-compound-block-indent' (default 0)
- Extra indentation for blocks in compound statements.
- `delphi-case-label-indent' (default 0)
- Extra indentation for case statement labels.
- `delphi-tab-always-indents' (default t)
- Non-nil means TAB in Delphi mode should always reindent the current line,
- regardless of where in the line point is when the TAB command is used.
- `delphi-newline-always-indents' (default t)
- Non-nil means NEWLINE in Delphi mode should always reindent the current
- line, insert a blank line and move to the default indent column of the
- blank line.
- `delphi-search-path' (default .)
- Directories to search when finding external units.
- `delphi-verbose' (default nil)
- If true then Delphi token processing progress is reported to the user.
-
-Coloring:
-
- `delphi-comment-face' (default font-lock-comment-face)
- Face used to color Delphi comments.
- `delphi-string-face' (default font-lock-string-face)
- Face used to color Delphi strings.
- `delphi-keyword-face' (default font-lock-keyword-face)
- Face used to color Delphi keywords.
- `delphi-other-face' (default nil)
- Face used to color everything else.
-
-Turning on Delphi mode calls the value of the variable `delphi-mode-hook'
-with no args, if that value is non-nil.
-
-\(fn)" t nil)
-
-;;;***
-
-;;;### (autoloads (delete-selection-mode) "delsel" "delsel.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (delete-selection-mode) "delsel" "delsel.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from delsel.el
(defalias 'pending-delete-mode 'delete-selection-mode)
@@ -5963,7 +5902,7 @@ any selection.
;;;***
;;;### (autoloads (derived-mode-init-mode-variables define-derived-mode)
-;;;;;; "derived" "emacs-lisp/derived.el" (20707 18685 911514 0))
+;;;;;; "derived" "emacs-lisp/derived.el" (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/derived.el
(autoload 'define-derived-mode "derived" "\
@@ -6030,7 +5969,7 @@ the first time the mode is used.
;;;***
;;;### (autoloads (describe-char describe-text-properties) "descr-text"
-;;;;;; "descr-text.el" (20707 18685 911514 0))
+;;;;;; "descr-text.el" (20764 51137 83502 0))
;;; Generated autoloads from descr-text.el
(autoload 'describe-text-properties "descr-text" "\
@@ -6067,7 +6006,7 @@ relevant to POS.
;;;### (autoloads (desktop-revert desktop-save-in-desktop-dir desktop-change-dir
;;;;;; desktop-load-default desktop-read desktop-remove desktop-save
;;;;;; desktop-clear desktop-locals-to-save desktop-save-mode) "desktop"
-;;;;;; "desktop.el" (20707 18685 911514 0))
+;;;;;; "desktop.el" (20817 30120 173418 0))
;;; Generated autoloads from desktop.el
(defvar desktop-save-mode nil "\
@@ -6232,7 +6171,7 @@ Also inhibit further loading of it.
\(fn)" nil nil)
-(make-obsolete 'desktop-load-default 'desktop-save-mode "22.1")
+(make-obsolete 'desktop-load-default 'desktop-save-mode '"22.1")
(autoload 'desktop-change-dir "desktop" "\
Change to desktop saved in DIRNAME.
@@ -6256,7 +6195,7 @@ Revert to the last loaded desktop.
;;;### (autoloads (gnus-article-outlook-deuglify-article gnus-outlook-deuglify-article
;;;;;; gnus-article-outlook-repair-attribution gnus-article-outlook-unwrap-lines)
-;;;;;; "deuglify" "gnus/deuglify.el" (20707 18685 911514 0))
+;;;;;; "deuglify" "gnus/deuglify.el" (20791 9657 561026 0))
;;; Generated autoloads from gnus/deuglify.el
(autoload 'gnus-article-outlook-unwrap-lines "deuglify" "\
@@ -6289,7 +6228,7 @@ Deuglify broken Outlook (Express) articles and redisplay.
;;;***
;;;### (autoloads (diary-mode diary-mail-entries diary) "diary-lib"
-;;;;;; "calendar/diary-lib.el" (20707 18685 911514 0))
+;;;;;; "calendar/diary-lib.el" (20709 26818 907104 0))
;;; Generated autoloads from calendar/diary-lib.el
(autoload 'diary "diary-lib" "\
@@ -6333,7 +6272,7 @@ Major mode for editing the diary file.
;;;### (autoloads (diff-buffer-with-file diff-latest-backup-file
;;;;;; diff-backup diff diff-command diff-switches) "diff" "vc/diff.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20760 54070 584283 0))
;;; Generated autoloads from vc/diff.el
(defvar diff-switches (purecopy "-c") "\
@@ -6355,7 +6294,7 @@ exists. If NO-ASYNC is non-nil, call diff synchronously.
When called interactively with a prefix argument, prompt
interactively for diff switches. Otherwise, the switches
-specified in `diff-switches' are passed to the diff command.
+specified in the variable `diff-switches' are passed to the diff command.
\(fn OLD NEW &optional SWITCHES NO-ASYNC)" t nil)
@@ -6382,7 +6321,7 @@ This requires the external program `diff' to be in your `exec-path'.
;;;***
;;;### (autoloads (diff-minor-mode diff-mode) "diff-mode" "vc/diff-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20814 53928 50501 0))
;;; Generated autoloads from vc/diff-mode.el
(autoload 'diff-mode "diff-mode" "\
@@ -6414,7 +6353,7 @@ the mode if ARG is omitted or nil.
;;;***
-;;;### (autoloads (dig) "dig" "net/dig.el" (20707 18685 911514 0))
+;;;### (autoloads (dig) "dig" "net/dig.el" (20709 26818 907104 0))
;;; Generated autoloads from net/dig.el
(autoload 'dig "dig" "\
@@ -6425,9 +6364,9 @@ Optional arguments are passed to `dig-invoke'.
;;;***
-;;;### (autoloads (dired-mode dired-noselect dired-other-frame dired-other-window
-;;;;;; dired dired-listing-switches) "dired" "dired.el" (20730 4700
-;;;;;; 471174 0))
+;;;### (autoloads (dired-hide-details-mode dired-mode dired-noselect
+;;;;;; dired-other-frame dired-other-window dired dired-listing-switches)
+;;;;;; "dired" "dired.el" (20784 36406 653593 0))
;;; Generated autoloads from dired.el
(defvar dired-listing-switches (purecopy "-al") "\
@@ -6545,10 +6484,15 @@ Keybindings:
\(fn &optional DIRNAME SWITCHES)" nil nil)
(put 'dired-find-alternate-file 'disabled t)
+(autoload 'dired-hide-details-mode "dired" "\
+Hide details in `dired-mode'.
+
+\(fn &optional ARG)" t nil)
+
;;;***
;;;### (autoloads (dirtrack dirtrack-mode) "dirtrack" "dirtrack.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from dirtrack.el
(autoload 'dirtrack-mode "dirtrack" "\
@@ -6578,8 +6522,8 @@ from `default-directory'.
;;;***
-;;;### (autoloads (disassemble) "disass" "emacs-lisp/disass.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (disassemble) "disass" "emacs-lisp/disass.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from emacs-lisp/disass.el
(autoload 'disassemble "disass" "\
@@ -6598,7 +6542,7 @@ redefine OBJECT if it is a symbol.
;;;;;; standard-display-g1 standard-display-ascii standard-display-default
;;;;;; standard-display-8bit describe-current-display-table describe-display-table
;;;;;; set-display-table-slot display-table-slot make-display-table)
-;;;;;; "disp-table" "disp-table.el" (20707 18685 911514 0))
+;;;;;; "disp-table" "disp-table.el" (20709 26818 907104 0))
;;; Generated autoloads from disp-table.el
(autoload 'make-display-table "disp-table" "\
@@ -6720,7 +6664,7 @@ in `.emacs'.
;;;***
;;;### (autoloads (dissociated-press) "dissociate" "play/dissociate.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from play/dissociate.el
(autoload 'dissociated-press "dissociate" "\
@@ -6736,8 +6680,8 @@ Default is 2.
;;;***
-;;;### (autoloads (dnd-protocol-alist) "dnd" "dnd.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (dnd-protocol-alist) "dnd" "dnd.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from dnd.el
(defvar dnd-protocol-alist `((,(purecopy "^file:///") . dnd-open-local-file) (,(purecopy "^file://") . dnd-open-file) (,(purecopy "^file:") . dnd-open-local-file) (,(purecopy "^\\(https?\\|ftp\\|file\\|nfs\\)://") . dnd-open-file)) "\
@@ -6758,7 +6702,7 @@ if some action was made, or nil if the URL is ignored.")
;;;***
;;;### (autoloads (dns-mode-soa-increment-serial dns-mode) "dns-mode"
-;;;;;; "textmodes/dns-mode.el" (20707 18685 911514 0))
+;;;;;; "textmodes/dns-mode.el" (20709 26818 907104 0))
;;; Generated autoloads from textmodes/dns-mode.el
(autoload 'dns-mode "dns-mode" "\
@@ -6782,8 +6726,8 @@ Locate SOA record and increment the serial field.
;;;***
;;;### (autoloads (doc-view-bookmark-jump doc-view-minor-mode doc-view-mode-maybe
-;;;;;; doc-view-mode doc-view-mode-p) "doc-view" "doc-view.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; doc-view-mode doc-view-mode-p) "doc-view" "doc-view.el" (20806
+;;;;;; 59818 347907 0))
;;; Generated autoloads from doc-view.el
(autoload 'doc-view-mode-p "doc-view" "\
@@ -6829,8 +6773,8 @@ See the command `doc-view-mode' for more information on this mode.
;;;***
-;;;### (autoloads (doctor) "doctor" "play/doctor.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (doctor) "doctor" "play/doctor.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from play/doctor.el
(autoload 'doctor "doctor" "\
@@ -6840,8 +6784,8 @@ Switch to *doctor* buffer and start giving psychotherapy.
;;;***
-;;;### (autoloads (double-mode) "double" "double.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (double-mode) "double" "double.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from double.el
(autoload 'double-mode "double" "\
@@ -6857,8 +6801,8 @@ strings when pressed twice. See `double-map' for details.
;;;***
-;;;### (autoloads (dunnet) "dunnet" "play/dunnet.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (dunnet) "dunnet" "play/dunnet.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from play/dunnet.el
(autoload 'dunnet "dunnet" "\
@@ -6870,7 +6814,7 @@ Switch to *dungeon* buffer and start game.
;;;### (autoloads (easy-mmode-defsyntax easy-mmode-defmap easy-mmode-define-keymap
;;;;;; define-globalized-minor-mode define-minor-mode) "easy-mmode"
-;;;;;; "emacs-lisp/easy-mmode.el" (20765 7114 233956 846000))
+;;;;;; "emacs-lisp/easy-mmode.el" (20780 39352 990623 0))
;;; Generated autoloads from emacs-lisp/easy-mmode.el
(defalias 'easy-mmode-define-minor-mode 'define-minor-mode)
@@ -6967,6 +6911,10 @@ correctly with the current major mode. This is important to
prevent problems with derived modes, that is, major modes that
call another major mode in their body.
+When a major mode is initialized, MODE is actually turned on just
+after running the major mode's hook. However, MODE is not turned
+on if the hook has explicitly disabled it.
+
\(fn GLOBAL-MODE MODE TURN-ON &rest KEYS)" nil t)
(put 'define-globalized-minor-mode 'doc-string-elt '2)
@@ -7006,8 +6954,8 @@ CSS contains a list of syntax specifications of the form (CHAR . SYNTAX).
;;;***
;;;### (autoloads (easy-menu-change easy-menu-create-menu easy-menu-do-define
-;;;;;; easy-menu-define) "easymenu" "emacs-lisp/easymenu.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; easy-menu-define) "easymenu" "emacs-lisp/easymenu.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from emacs-lisp/easymenu.el
(autoload 'easy-menu-define "easymenu" "\
@@ -7152,7 +7100,7 @@ To implement dynamic menus, either call this from
;;;;;; ebnf-eps-file ebnf-eps-directory ebnf-spool-region ebnf-spool-buffer
;;;;;; ebnf-spool-file ebnf-spool-directory ebnf-print-region ebnf-print-buffer
;;;;;; ebnf-print-file ebnf-print-directory ebnf-customize) "ebnf2ps"
-;;;;;; "progmodes/ebnf2ps.el" (20707 18685 911514 0))
+;;;;;; "progmodes/ebnf2ps.el" (20709 26818 907104 0))
;;; Generated autoloads from progmodes/ebnf2ps.el
(autoload 'ebnf-customize "ebnf2ps" "\
@@ -7426,8 +7374,8 @@ See `ebnf-style-database' documentation.
;;;;;; ebrowse-tags-find-declaration-other-window ebrowse-tags-find-definition
;;;;;; ebrowse-tags-view-definition ebrowse-tags-find-declaration
;;;;;; ebrowse-tags-view-declaration ebrowse-member-mode ebrowse-electric-choose-tree
-;;;;;; ebrowse-tree-mode) "ebrowse" "progmodes/ebrowse.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; ebrowse-tree-mode) "ebrowse" "progmodes/ebrowse.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from progmodes/ebrowse.el
(autoload 'ebrowse-tree-mode "ebrowse" "\
@@ -7576,7 +7524,7 @@ Display statistics for a class tree.
;;;***
;;;### (autoloads (electric-buffer-list) "ebuff-menu" "ebuff-menu.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from ebuff-menu.el
(autoload 'electric-buffer-list "ebuff-menu" "\
@@ -7609,7 +7557,7 @@ Run hooks in `electric-buffer-menu-mode-hook' on entry.
;;;***
;;;### (autoloads (Electric-command-history-redo-expression) "echistory"
-;;;;;; "echistory.el" (20707 18685 911514 0))
+;;;;;; "echistory.el" (20709 26818 907104 0))
;;; Generated autoloads from echistory.el
(autoload 'Electric-command-history-redo-expression "echistory" "\
@@ -7621,7 +7569,7 @@ With prefix arg NOCONFIRM, execute current line as-is without editing.
;;;***
;;;### (autoloads (ecomplete-setup) "ecomplete" "gnus/ecomplete.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/ecomplete.el
(autoload 'ecomplete-setup "ecomplete" "\
@@ -7631,8 +7579,8 @@ With prefix arg NOCONFIRM, execute current line as-is without editing.
;;;***
-;;;### (autoloads (global-ede-mode) "ede" "cedet/ede.el" (20748 34276
-;;;;;; 6200 0))
+;;;### (autoloads (global-ede-mode) "ede" "cedet/ede.el" (20813 33065
+;;;;;; 721081 0))
;;; Generated autoloads from cedet/ede.el
(defvar global-ede-mode nil "\
@@ -7659,7 +7607,7 @@ an EDE controlled project.
;;;### (autoloads (edebug-all-forms edebug-all-defs edebug-eval-top-level-form
;;;;;; edebug-basic-spec edebug-all-forms edebug-all-defs) "edebug"
-;;;;;; "emacs-lisp/edebug.el" (20707 18685 911514 0))
+;;;;;; "emacs-lisp/edebug.el" (20825 24233 991089 0))
;;; Generated autoloads from emacs-lisp/edebug.el
(defvar edebug-all-defs nil "\
@@ -7732,8 +7680,8 @@ Toggle edebugging of all forms.
;;;;;; ediff-merge-directories-with-ancestor ediff-merge-directories
;;;;;; ediff-directories3 ediff-directory-revisions ediff-directories
;;;;;; ediff-buffers3 ediff-buffers ediff-backup ediff-current-file
-;;;;;; ediff-files3 ediff-files) "ediff" "vc/ediff.el" (20707 18685
-;;;;;; 911514 0))
+;;;;;; ediff-files3 ediff-files) "ediff" "vc/ediff.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from vc/ediff.el
(autoload 'ediff-files "ediff" "\
@@ -7965,7 +7913,7 @@ With optional NODE, goes to that node.
;;;***
;;;### (autoloads (ediff-customize) "ediff-help" "vc/ediff-help.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from vc/ediff-help.el
(autoload 'ediff-customize "ediff-help" "\
@@ -7976,7 +7924,7 @@ With optional NODE, goes to that node.
;;;***
;;;### (autoloads (ediff-show-registry) "ediff-mult" "vc/ediff-mult.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from vc/ediff-mult.el
(autoload 'ediff-show-registry "ediff-mult" "\
@@ -7989,7 +7937,7 @@ Display Ediff's registry.
;;;***
;;;### (autoloads (ediff-toggle-use-toolbar ediff-toggle-multiframe)
-;;;;;; "ediff-util" "vc/ediff-util.el" (20707 18685 911514 0))
+;;;;;; "ediff-util" "vc/ediff-util.el" (20777 63161 848428 0))
;;; Generated autoloads from vc/ediff-util.el
(autoload 'ediff-toggle-multiframe "ediff-util" "\
@@ -8010,7 +7958,7 @@ To change the default, set the variable `ediff-use-toolbar-p', which see.
;;;### (autoloads (format-kbd-macro read-kbd-macro edit-named-kbd-macro
;;;;;; edit-last-kbd-macro edit-kbd-macro) "edmacro" "edmacro.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from edmacro.el
(autoload 'edit-kbd-macro "edmacro" "\
@@ -8059,7 +8007,7 @@ or nil, use a compact 80-column format.
;;;***
;;;### (autoloads (edt-emulation-on edt-set-scroll-margins) "edt"
-;;;;;; "emulation/edt.el" (20707 18685 911514 0))
+;;;;;; "emulation/edt.el" (20709 26818 907104 0))
;;; Generated autoloads from emulation/edt.el
(autoload 'edt-set-scroll-margins "edt" "\
@@ -8077,7 +8025,7 @@ Turn on EDT Emulation.
;;;***
;;;### (autoloads (electric-helpify with-electric-help) "ehelp" "ehelp.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20762 9398 526093 0))
;;; Generated autoloads from ehelp.el
(autoload 'with-electric-help "ehelp" "\
@@ -8114,7 +8062,7 @@ BUFFER is put back into its original major mode.
;;;***
;;;### (autoloads (customize-object) "eieio-custom" "emacs-lisp/eieio-custom.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20771 24374 643644 0))
;;; Generated autoloads from emacs-lisp/eieio-custom.el
(autoload 'customize-object "eieio-custom" "\
@@ -8127,7 +8075,7 @@ Optional argument GROUP is the sub-group of slots to display.
;;;### (autoloads (eieio-describe-generic eieio-describe-constructor
;;;;;; eieio-describe-class eieio-browse) "eieio-opt" "emacs-lisp/eieio-opt.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20771 24374 643644 0))
;;; Generated autoloads from emacs-lisp/eieio-opt.el
(autoload 'eieio-browse "eieio-opt" "\
@@ -8160,8 +8108,9 @@ Also extracts information about all methods specific to this generic.
;;;***
-;;;### (autoloads (turn-on-eldoc-mode eldoc-mode eldoc-minor-mode-string)
-;;;;;; "eldoc" "emacs-lisp/eldoc.el" (20707 18685 911514 0))
+;;;### (autoloads (turn-on-eldoc-mode eldoc-post-insert-mode eldoc-mode
+;;;;;; eldoc-minor-mode-string) "eldoc" "emacs-lisp/eldoc.el" (20806
+;;;;;; 59818 347907 0))
;;; Generated autoloads from emacs-lisp/eldoc.el
(defvar eldoc-minor-mode-string (purecopy " ElDoc") "\
@@ -8184,6 +8133,15 @@ expression point is on.
\(fn &optional ARG)" t nil)
+(autoload 'eldoc-post-insert-mode "eldoc" "\
+Toggle Eldoc-Post-Insert mode on or off.
+With a prefix argument ARG, enable Eldoc-Post-Insert mode if ARG is
+positive, and disable it otherwise. If called from Lisp, enable
+the mode if ARG is omitted or nil, and toggle it if ARG is `toggle'.
+\\{eldoc-post-insert-mode-map}
+
+\(fn &optional ARG)" t nil)
+
(autoload 'turn-on-eldoc-mode "eldoc" "\
Unequivocally turn on ElDoc mode (see command `eldoc-mode').
@@ -8208,7 +8166,7 @@ Emacs Lisp mode) that support ElDoc.")
;;;***
;;;### (autoloads (electric-layout-mode electric-pair-mode electric-indent-mode)
-;;;;;; "electric" "electric.el" (20707 18685 911514 0))
+;;;;;; "electric" "electric.el" (20709 26818 907104 0))
;;; Generated autoloads from electric.el
(defvar electric-indent-chars '(10) "\
@@ -8278,8 +8236,8 @@ The variable `electric-layout-rules' says when and how to insert newlines.
;;;***
-;;;### (autoloads (elide-head) "elide-head" "elide-head.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (elide-head) "elide-head" "elide-head.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from elide-head.el
(autoload 'elide-head "elide-head" "\
@@ -8296,7 +8254,7 @@ This is suitable as an entry on `find-file-hook' or appropriate mode hooks.
;;;### (autoloads (elint-initialize elint-defun elint-current-buffer
;;;;;; elint-directory elint-file) "elint" "emacs-lisp/elint.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/elint.el
(autoload 'elint-file "elint" "\
@@ -8332,8 +8290,8 @@ optional prefix argument REINIT is non-nil.
;;;***
;;;### (autoloads (elp-results elp-instrument-package elp-instrument-list
-;;;;;; elp-instrument-function) "elp" "emacs-lisp/elp.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; elp-instrument-function) "elp" "emacs-lisp/elp.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from emacs-lisp/elp.el
(autoload 'elp-instrument-function "elp" "\
@@ -8368,7 +8326,7 @@ displayed.
;;;***
;;;### (autoloads (emacs-lock-mode) "emacs-lock" "emacs-lock.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emacs-lock.el
(autoload 'emacs-lock-mode "emacs-lock" "\
@@ -8396,7 +8354,7 @@ Other values are interpreted as usual.
;;;***
;;;### (autoloads (report-emacs-bug) "emacsbug" "mail/emacsbug.el"
-;;;;;; (20758 63604 302072 0))
+;;;;;; (20759 33211 414988 0))
;;; Generated autoloads from mail/emacsbug.el
(autoload 'report-emacs-bug "emacsbug" "\
@@ -8411,7 +8369,7 @@ Prompts for bug subject. Leaves you in a mail buffer.
;;;;;; emerge-revisions emerge-files-with-ancestor-remote emerge-files-remote
;;;;;; emerge-files-with-ancestor-command emerge-files-command emerge-buffers-with-ancestor
;;;;;; emerge-buffers emerge-files-with-ancestor emerge-files) "emerge"
-;;;;;; "vc/emerge.el" (20627 28531 447943 0))
+;;;;;; "vc/emerge.el" (20576 42138 697312 0))
;;; Generated autoloads from vc/emerge.el
(autoload 'emerge-files "emerge" "\
@@ -8472,7 +8430,7 @@ Emerge two RCS revisions of a file, with another revision as ancestor.
;;;***
;;;### (autoloads (enriched-decode enriched-encode enriched-mode)
-;;;;;; "enriched" "textmodes/enriched.el" (20707 18685 911514 0))
+;;;;;; "enriched" "textmodes/enriched.el" (20709 26818 907104 0))
;;; Generated autoloads from textmodes/enriched.el
(autoload 'enriched-mode "enriched" "\
@@ -8512,8 +8470,8 @@ Commands:
;;;;;; epa-sign-region epa-verify-cleartext-in-region epa-verify-region
;;;;;; epa-decrypt-armor-in-region epa-decrypt-region epa-encrypt-file
;;;;;; epa-sign-file epa-verify-file epa-decrypt-file epa-select-keys
-;;;;;; epa-list-secret-keys epa-list-keys) "epa" "epa.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; epa-list-secret-keys epa-list-keys) "epa" "epa.el" (20762
+;;;;;; 9398 526093 0))
;;; Generated autoloads from epa.el
(autoload 'epa-list-keys "epa" "\
@@ -8691,8 +8649,8 @@ Insert selected KEYS after the point.
;;;***
;;;### (autoloads (epa-dired-do-encrypt epa-dired-do-sign epa-dired-do-verify
-;;;;;; epa-dired-do-decrypt) "epa-dired" "epa-dired.el" (20707 18685
-;;;;;; 911514 0))
+;;;;;; epa-dired-do-decrypt) "epa-dired" "epa-dired.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from epa-dired.el
(autoload 'epa-dired-do-decrypt "epa-dired" "\
@@ -8718,7 +8676,7 @@ Encrypt marked files.
;;;***
;;;### (autoloads (epa-file-disable epa-file-enable epa-file-handler)
-;;;;;; "epa-file" "epa-file.el" (20707 18685 911514 0))
+;;;;;; "epa-file" "epa-file.el" (20709 26818 907104 0))
;;; Generated autoloads from epa-file.el
(autoload 'epa-file-handler "epa-file" "\
@@ -8740,7 +8698,7 @@ Encrypt marked files.
;;;### (autoloads (epa-global-mail-mode epa-mail-import-keys epa-mail-encrypt
;;;;;; epa-mail-sign epa-mail-verify epa-mail-decrypt epa-mail-mode)
-;;;;;; "epa-mail" "epa-mail.el" (20707 18685 911514 0))
+;;;;;; "epa-mail" "epa-mail.el" (20709 26818 907104 0))
;;; Generated autoloads from epa-mail.el
(autoload 'epa-mail-mode "epa-mail" "\
@@ -8810,8 +8768,8 @@ if ARG is omitted or nil.
;;;***
-;;;### (autoloads (epg-make-context) "epg" "epg.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (epg-make-context) "epg" "epg.el" (20712 3008 596088
+;;;;;; 0))
;;; Generated autoloads from epg.el
(autoload 'epg-make-context "epg" "\
@@ -8822,7 +8780,7 @@ Return a context object.
;;;***
;;;### (autoloads (epg-expand-group epg-check-configuration epg-configuration)
-;;;;;; "epg-config" "epg-config.el" (20707 18685 911514 0))
+;;;;;; "epg-config" "epg-config.el" (20709 26818 907104 0))
;;; Generated autoloads from epg-config.el
(autoload 'epg-configuration "epg-config" "\
@@ -8843,7 +8801,7 @@ Look at CONFIG and try to expand GROUP.
;;;***
;;;### (autoloads (erc-handle-irc-url erc-tls erc erc-select-read-args)
-;;;;;; "erc" "erc/erc.el" (20707 18685 911514 0))
+;;;;;; "erc" "erc/erc.el" (20709 26818 907104 0))
;;; Generated autoloads from erc/erc.el
(autoload 'erc-select-read-args "erc" "\
@@ -8891,36 +8849,36 @@ Otherwise, connect to HOST:PORT as USER and /join CHANNEL.
;;;***
-;;;### (autoloads nil "erc-autoaway" "erc/erc-autoaway.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads nil "erc-autoaway" "erc/erc-autoaway.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from erc/erc-autoaway.el
(autoload 'erc-autoaway-mode "erc-autoaway")
;;;***
-;;;### (autoloads nil "erc-button" "erc/erc-button.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads nil "erc-button" "erc/erc-button.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from erc/erc-button.el
(autoload 'erc-button-mode "erc-button" nil t)
;;;***
-;;;### (autoloads nil "erc-capab" "erc/erc-capab.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads nil "erc-capab" "erc/erc-capab.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from erc/erc-capab.el
(autoload 'erc-capab-identify-mode "erc-capab" nil t)
;;;***
-;;;### (autoloads nil "erc-compat" "erc/erc-compat.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads nil "erc-compat" "erc/erc-compat.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from erc/erc-compat.el
(autoload 'erc-define-minor-mode "erc-compat")
;;;***
;;;### (autoloads (erc-ctcp-query-DCC pcomplete/erc-mode/DCC erc-cmd-DCC)
-;;;;;; "erc-dcc" "erc/erc-dcc.el" (20707 18685 911514 0))
+;;;;;; "erc-dcc" "erc/erc-dcc.el" (20759 33211 414988 0))
;;; Generated autoloads from erc/erc-dcc.el
(autoload 'erc-dcc-mode "erc-dcc")
@@ -8950,7 +8908,7 @@ that subcommand.
;;;***
;;;### (autoloads nil "erc-desktop-notifications" "erc/erc-desktop-notifications.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from erc/erc-desktop-notifications.el
(autoload 'erc-notifications-mode "erc-desktop-notifications" "" t)
@@ -8960,7 +8918,7 @@ that subcommand.
;;;;;; erc-ezb-add-session erc-ezb-end-of-session-list erc-ezb-init-session-list
;;;;;; erc-ezb-identify erc-ezb-notice-autodetect erc-ezb-lookup-action
;;;;;; erc-ezb-get-login erc-cmd-ezb) "erc-ezbounce" "erc/erc-ezbounce.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from erc/erc-ezbounce.el
(autoload 'erc-cmd-ezb "erc-ezbounce" "\
@@ -9022,8 +8980,8 @@ Add EZBouncer convenience functions to ERC.
;;;***
-;;;### (autoloads (erc-fill) "erc-fill" "erc/erc-fill.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (erc-fill) "erc-fill" "erc/erc-fill.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from erc/erc-fill.el
(autoload 'erc-fill-mode "erc-fill" nil t)
@@ -9036,7 +8994,7 @@ You can put this on `erc-insert-modify-hook' and/or `erc-send-modify-hook'.
;;;***
;;;### (autoloads (erc-identd-stop erc-identd-start) "erc-identd"
-;;;;;; "erc/erc-identd.el" (20707 18685 911514 0))
+;;;;;; "erc/erc-identd.el" (20709 26818 907104 0))
;;; Generated autoloads from erc/erc-identd.el
(autoload 'erc-identd-mode "erc-identd")
@@ -9058,7 +9016,7 @@ system.
;;;***
;;;### (autoloads (erc-create-imenu-index) "erc-imenu" "erc/erc-imenu.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from erc/erc-imenu.el
(autoload 'erc-create-imenu-index "erc-imenu" "\
@@ -9068,14 +9026,14 @@ system.
;;;***
-;;;### (autoloads nil "erc-join" "erc/erc-join.el" (20707 18685 911514
+;;;### (autoloads nil "erc-join" "erc/erc-join.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from erc/erc-join.el
(autoload 'erc-autojoin-mode "erc-join" nil t)
;;;***
-;;;### (autoloads nil "erc-list" "erc/erc-list.el" (20707 18685 911514
+;;;### (autoloads nil "erc-list" "erc/erc-list.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from erc/erc-list.el
(autoload 'erc-list-mode "erc-list")
@@ -9083,7 +9041,7 @@ system.
;;;***
;;;### (autoloads (erc-save-buffer-in-logs erc-logging-enabled) "erc-log"
-;;;;;; "erc/erc-log.el" (20707 18685 911514 0))
+;;;;;; "erc/erc-log.el" (20709 26818 907104 0))
;;; Generated autoloads from erc/erc-log.el
(autoload 'erc-log-mode "erc-log" nil t)
@@ -9115,7 +9073,7 @@ You can save every individual message by putting this function on
;;;### (autoloads (erc-delete-dangerous-host erc-add-dangerous-host
;;;;;; erc-delete-keyword erc-add-keyword erc-delete-fool erc-add-fool
;;;;;; erc-delete-pal erc-add-pal) "erc-match" "erc/erc-match.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20763 30266 231060 0))
;;; Generated autoloads from erc/erc-match.el
(autoload 'erc-match-mode "erc-match")
@@ -9161,7 +9119,7 @@ Delete dangerous-host interactively to `erc-dangerous-hosts'.
;;;***
-;;;### (autoloads nil "erc-menu" "erc/erc-menu.el" (20707 18685 911514
+;;;### (autoloads nil "erc-menu" "erc/erc-menu.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from erc/erc-menu.el
(autoload 'erc-menu-mode "erc-menu" nil t)
@@ -9169,7 +9127,7 @@ Delete dangerous-host interactively to `erc-dangerous-hosts'.
;;;***
;;;### (autoloads (erc-cmd-WHOLEFT) "erc-netsplit" "erc/erc-netsplit.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from erc/erc-netsplit.el
(autoload 'erc-netsplit-mode "erc-netsplit")
@@ -9181,7 +9139,7 @@ Show who's gone.
;;;***
;;;### (autoloads (erc-server-select erc-determine-network) "erc-networks"
-;;;;;; "erc/erc-networks.el" (20707 18685 911514 0))
+;;;;;; "erc/erc-networks.el" (20709 26818 907104 0))
;;; Generated autoloads from erc/erc-networks.el
(autoload 'erc-determine-network "erc-networks" "\
@@ -9199,7 +9157,7 @@ Interactively select a server to connect to using `erc-server-alist'.
;;;***
;;;### (autoloads (pcomplete/erc-mode/NOTIFY erc-cmd-NOTIFY) "erc-notify"
-;;;;;; "erc/erc-notify.el" (20707 18685 911514 0))
+;;;;;; "erc/erc-notify.el" (20709 26818 907104 0))
;;; Generated autoloads from erc/erc-notify.el
(autoload 'erc-notify-mode "erc-notify" nil t)
@@ -9217,28 +9175,28 @@ with args, toggle notify status of people.
;;;***
-;;;### (autoloads nil "erc-page" "erc/erc-page.el" (20707 18685 911514
+;;;### (autoloads nil "erc-page" "erc/erc-page.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from erc/erc-page.el
(autoload 'erc-page-mode "erc-page")
;;;***
-;;;### (autoloads nil "erc-pcomplete" "erc/erc-pcomplete.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads nil "erc-pcomplete" "erc/erc-pcomplete.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from erc/erc-pcomplete.el
(autoload 'erc-completion-mode "erc-pcomplete" nil t)
;;;***
-;;;### (autoloads nil "erc-replace" "erc/erc-replace.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads nil "erc-replace" "erc/erc-replace.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from erc/erc-replace.el
(autoload 'erc-replace-mode "erc-replace")
;;;***
-;;;### (autoloads nil "erc-ring" "erc/erc-ring.el" (20707 18685 911514
+;;;### (autoloads nil "erc-ring" "erc/erc-ring.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from erc/erc-ring.el
(autoload 'erc-ring-mode "erc-ring" nil t)
@@ -9246,7 +9204,7 @@ with args, toggle notify status of people.
;;;***
;;;### (autoloads (erc-nickserv-identify erc-nickserv-identify-mode)
-;;;;;; "erc-services" "erc/erc-services.el" (20707 18685 911514
+;;;;;; "erc-services" "erc/erc-services.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from erc/erc-services.el
(autoload 'erc-services-mode "erc-services" nil t)
@@ -9264,15 +9222,15 @@ When called interactively, read the password using `read-passwd'.
;;;***
-;;;### (autoloads nil "erc-sound" "erc/erc-sound.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads nil "erc-sound" "erc/erc-sound.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from erc/erc-sound.el
(autoload 'erc-sound-mode "erc-sound")
;;;***
;;;### (autoloads (erc-speedbar-browser) "erc-speedbar" "erc/erc-speedbar.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from erc/erc-speedbar.el
(autoload 'erc-speedbar-browser "erc-speedbar" "\
@@ -9283,22 +9241,22 @@ This will add a speedbar major display mode.
;;;***
-;;;### (autoloads nil "erc-spelling" "erc/erc-spelling.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads nil "erc-spelling" "erc/erc-spelling.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from erc/erc-spelling.el
(autoload 'erc-spelling-mode "erc-spelling" nil t)
;;;***
-;;;### (autoloads nil "erc-stamp" "erc/erc-stamp.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads nil "erc-stamp" "erc/erc-stamp.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from erc/erc-stamp.el
(autoload 'erc-timestamp-mode "erc-stamp" nil t)
;;;***
;;;### (autoloads (erc-track-minor-mode) "erc-track" "erc/erc-track.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from erc/erc-track.el
(defvar erc-track-minor-mode nil "\
@@ -9324,7 +9282,7 @@ keybindings will not do anything useful.
;;;***
;;;### (autoloads (erc-truncate-buffer erc-truncate-buffer-to-size)
-;;;;;; "erc-truncate" "erc/erc-truncate.el" (20707 18685 911514
+;;;;;; "erc-truncate" "erc/erc-truncate.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from erc/erc-truncate.el
(autoload 'erc-truncate-mode "erc-truncate" nil t)
@@ -9345,7 +9303,7 @@ Meant to be used in hooks, like `erc-insert-post-hook'.
;;;***
;;;### (autoloads (erc-xdcc-add-file) "erc-xdcc" "erc/erc-xdcc.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from erc/erc-xdcc.el
(autoload 'erc-xdcc-mode "erc-xdcc")
@@ -9358,7 +9316,7 @@ Add a file to `erc-xdcc-files'.
;;;### (autoloads (ert-describe-test ert-run-tests-interactively
;;;;;; ert-run-tests-batch-and-exit ert-run-tests-batch ert-deftest)
-;;;;;; "ert" "emacs-lisp/ert.el" (20707 18685 911514 0))
+;;;;;; "ert" "emacs-lisp/ert.el" (20751 39094 700824 0))
;;; Generated autoloads from emacs-lisp/ert.el
(autoload 'ert-deftest "ert" "\
@@ -9424,7 +9382,7 @@ Display the documentation for TEST-OR-TEST-NAME (a symbol or ert-test).
;;;***
;;;### (autoloads (ert-kill-all-test-buffers) "ert-x" "emacs-lisp/ert-x.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/ert-x.el
(put 'ert-with-test-buffer 'lisp-indent-function 1)
@@ -9436,8 +9394,8 @@ Kill all test buffers that are still live.
;;;***
-;;;### (autoloads (eshell-mode) "esh-mode" "eshell/esh-mode.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (eshell-mode) "esh-mode" "eshell/esh-mode.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from eshell/esh-mode.el
(autoload 'eshell-mode "esh-mode" "\
@@ -9450,7 +9408,7 @@ Emacs shell interactive mode.
;;;***
;;;### (autoloads (eshell-command-result eshell-command eshell) "eshell"
-;;;;;; "eshell/eshell.el" (20707 18685 911514 0))
+;;;;;; "eshell/eshell.el" (20709 26818 907104 0))
;;; Generated autoloads from eshell/eshell.el
(autoload 'eshell "eshell" "\
@@ -9491,7 +9449,7 @@ corresponding to a successful execution.
;;;;;; visit-tags-table tags-table-mode find-tag-default-function
;;;;;; find-tag-hook tags-add-tables tags-compression-info-list
;;;;;; tags-table-list tags-case-fold-search) "etags" "progmodes/etags.el"
-;;;;;; (20728 47414 952831 0))
+;;;;;; (20731 53823 676680 0))
;;; Generated autoloads from progmodes/etags.el
(defvar tags-file-name nil "\
@@ -9806,7 +9764,7 @@ for \\[find-tag] (which see).
;;;;;; ethio-fidel-to-sera-marker ethio-fidel-to-sera-region ethio-fidel-to-sera-buffer
;;;;;; ethio-sera-to-fidel-marker ethio-sera-to-fidel-region ethio-sera-to-fidel-buffer
;;;;;; setup-ethiopic-environment-internal) "ethio-util" "language/ethio-util.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from language/ethio-util.el
(autoload 'setup-ethiopic-environment-internal "ethio-util" "\
@@ -9976,7 +9934,7 @@ With ARG, insert that many delimiters.
;;;### (autoloads (eudc-load-eudc eudc-query-form eudc-expand-inline
;;;;;; eudc-get-phone eudc-get-email eudc-set-server) "eudc" "net/eudc.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20791 9657 561026 0))
;;; Generated autoloads from net/eudc.el
(autoload 'eudc-set-server "eudc" "\
@@ -10032,7 +9990,7 @@ This does nothing except loading eudc by autoload side-effect.
;;;### (autoloads (eudc-display-jpeg-as-button eudc-display-jpeg-inline
;;;;;; eudc-display-sound eudc-display-mail eudc-display-url eudc-display-generic-binary)
-;;;;;; "eudc-bob" "net/eudc-bob.el" (20707 18685 911514 0))
+;;;;;; "eudc-bob" "net/eudc-bob.el" (20791 9657 561026 0))
;;; Generated autoloads from net/eudc-bob.el
(autoload 'eudc-display-generic-binary "eudc-bob" "\
@@ -10068,7 +10026,7 @@ Display a button for the JPEG DATA.
;;;***
;;;### (autoloads (eudc-try-bbdb-insert eudc-insert-record-at-point-into-bbdb)
-;;;;;; "eudc-export" "net/eudc-export.el" (20707 18685 911514 0))
+;;;;;; "eudc-export" "net/eudc-export.el" (20791 9657 561026 0))
;;; Generated autoloads from net/eudc-export.el
(autoload 'eudc-insert-record-at-point-into-bbdb "eudc-export" "\
@@ -10085,7 +10043,7 @@ Call `eudc-insert-record-at-point-into-bbdb' if on a record.
;;;***
;;;### (autoloads (eudc-edit-hotlist) "eudc-hotlist" "net/eudc-hotlist.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20791 9657 561026 0))
;;; Generated autoloads from net/eudc-hotlist.el
(autoload 'eudc-edit-hotlist "eudc-hotlist" "\
@@ -10095,8 +10053,8 @@ Edit the hotlist of directory servers in a specialized buffer.
;;;***
-;;;### (autoloads (ewoc-create) "ewoc" "emacs-lisp/ewoc.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (ewoc-create) "ewoc" "emacs-lisp/ewoc.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from emacs-lisp/ewoc.el
(autoload 'ewoc-create "ewoc" "\
@@ -10125,7 +10083,7 @@ fourth arg NOSEP non-nil inhibits this.
;;;### (autoloads (executable-make-buffer-file-executable-if-script-p
;;;;;; executable-self-display executable-set-magic executable-interpret
;;;;;; executable-command-find-posix-p) "executable" "progmodes/executable.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/executable.el
(autoload 'executable-command-find-posix-p "executable" "\
@@ -10168,7 +10126,7 @@ file modes.
;;;### (autoloads (expand-jump-to-next-slot expand-jump-to-previous-slot
;;;;;; expand-abbrev-hook expand-add-abbrevs) "expand" "expand.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from expand.el
(autoload 'expand-add-abbrevs "expand" "\
@@ -10217,8 +10175,8 @@ This is used only in conjunction with `expand-add-abbrevs'.
;;;***
-;;;### (autoloads (f90-mode) "f90" "progmodes/f90.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (f90-mode) "f90" "progmodes/f90.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from progmodes/f90.el
(autoload 'f90-mode "f90" "\
@@ -10288,8 +10246,8 @@ with no args, if that value is non-nil.
;;;### (autoloads (variable-pitch-mode buffer-face-toggle buffer-face-set
;;;;;; buffer-face-mode text-scale-adjust text-scale-decrease text-scale-increase
;;;;;; text-scale-set face-remap-set-base face-remap-reset-base
-;;;;;; face-remap-add-relative) "face-remap" "face-remap.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; face-remap-add-relative) "face-remap" "face-remap.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from face-remap.el
(autoload 'face-remap-add-relative "face-remap" "\
@@ -10452,8 +10410,8 @@ Besides the choice of face, it is the same as `buffer-face-mode'.
;;;### (autoloads (feedmail-queue-reminder feedmail-run-the-queue
;;;;;; feedmail-run-the-queue-global-prompt feedmail-run-the-queue-no-prompts
-;;;;;; feedmail-send-it) "feedmail" "mail/feedmail.el" (20627 28531
-;;;;;; 447943 0))
+;;;;;; feedmail-send-it) "feedmail" "mail/feedmail.el" (20759 33211
+;;;;;; 414988 0))
;;; Generated autoloads from mail/feedmail.el
(autoload 'feedmail-send-it "feedmail" "\
@@ -10508,7 +10466,7 @@ you can set `feedmail-queue-reminder-alist' to nil.
;;;### (autoloads (ffap-bindings ffap-guess-file-name-at-point dired-at-point
;;;;;; ffap-at-mouse ffap-menu find-file-at-point ffap-next) "ffap"
-;;;;;; "ffap.el" (20707 18685 911514 0))
+;;;;;; "ffap.el" (20752 26669 524456 0))
;;; Generated autoloads from ffap.el
(autoload 'ffap-next "ffap" "\
@@ -10517,7 +10475,7 @@ Optional argument BACK says to search backwards.
Optional argument WRAP says to try wrapping around if necessary.
Interactively: use a single prefix to search backwards,
double prefix to wrap forward, triple to wrap backwards.
-Actual search is done by `ffap-next-guess'.
+Actual search is done by the function `ffap-next-guess'.
\(fn &optional BACK WRAP)" t nil)
@@ -10574,23 +10532,24 @@ Evaluate the forms in variable `ffap-bindings'.
;;;### (autoloads (file-cache-minibuffer-complete file-cache-add-directory-recursively
;;;;;; file-cache-add-directory-using-locate file-cache-add-directory-using-find
;;;;;; file-cache-add-file file-cache-add-directory-list file-cache-add-directory)
-;;;;;; "filecache" "filecache.el" (20707 18685 911514 0))
+;;;;;; "filecache" "filecache.el" (20709 26818 907104 0))
;;; Generated autoloads from filecache.el
(autoload 'file-cache-add-directory "filecache" "\
-Add DIRECTORY to the file cache.
-If the optional REGEXP argument is non-nil, only files which match it will
-be added to the cache.
+Add all files in DIRECTORY to the file cache.
+If called from Lisp with a non-nil REGEXP argument is non-nil,
+only add files whose names match REGEXP.
\(fn DIRECTORY &optional REGEXP)" t nil)
(autoload 'file-cache-add-directory-list "filecache" "\
-Add DIRECTORY-LIST (a list of directory names) to the file cache.
+Add DIRECTORIES (a list of directory names) to the file cache.
+If called interactively, read the directory names one by one.
If the optional REGEXP argument is non-nil, only files which match it
will be added to the cache. Note that the REGEXP is applied to the
files in each directory, not to the directory list itself.
-\(fn DIRECTORY-LIST &optional REGEXP)" t nil)
+\(fn DIRECTORIES &optional REGEXP)" t nil)
(autoload 'file-cache-add-file "filecache" "\
Add FILE to the file cache.
@@ -10634,8 +10593,8 @@ the name is considered already unique; only the second substitution
;;;;;; copy-file-locals-to-dir-locals delete-dir-local-variable
;;;;;; add-dir-local-variable delete-file-local-variable-prop-line
;;;;;; add-file-local-variable-prop-line delete-file-local-variable
-;;;;;; add-file-local-variable) "files-x" "files-x.el" (20707 18685
-;;;;;; 911514 0))
+;;;;;; add-file-local-variable) "files-x" "files-x.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from files-x.el
(autoload 'add-file-local-variable "files-x" "\
@@ -10700,8 +10659,8 @@ Copy directory-local variables to the -*- line.
;;;***
-;;;### (autoloads (filesets-init) "filesets" "filesets.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (filesets-init) "filesets" "filesets.el" (20791
+;;;;;; 9657 561026 0))
;;; Generated autoloads from filesets.el
(autoload 'filesets-init "filesets" "\
@@ -10712,8 +10671,8 @@ Set up hooks, load the cache file -- if existing -- and build the menu.
;;;***
-;;;### (autoloads (find-cmd) "find-cmd" "find-cmd.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (find-cmd) "find-cmd" "find-cmd.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from find-cmd.el
(autoload 'find-cmd "find-cmd" "\
@@ -10733,7 +10692,7 @@ result is a string that should be ready for the command line.
;;;***
;;;### (autoloads (find-grep-dired find-name-dired find-dired) "find-dired"
-;;;;;; "find-dired.el" (20707 18685 911514 0))
+;;;;;; "find-dired.el" (20763 30266 231060 0))
;;; Generated autoloads from find-dired.el
(autoload 'find-dired "find-dired" "\
@@ -10773,7 +10732,7 @@ use in place of \"-ls\" as the final argument.
;;;### (autoloads (ff-mouse-find-other-file-other-window ff-mouse-find-other-file
;;;;;; ff-find-other-file ff-get-other-file ff-special-constructs)
-;;;;;; "find-file" "find-file.el" (20707 18685 911514 0))
+;;;;;; "find-file" "find-file.el" (20709 26818 907104 0))
;;; Generated autoloads from find-file.el
(defvar ff-special-constructs `((,(purecopy "^#\\s *\\(include\\|import\\)\\s +[<\"]\\(.*\\)[>\"]") lambda nil (buffer-substring (match-beginning 2) (match-end 2)))) "\
@@ -10869,7 +10828,7 @@ Visit the file you click on in another window.
;;;;;; find-variable find-variable-noselect find-function-other-frame
;;;;;; find-function-other-window find-function find-function-noselect
;;;;;; find-function-search-for-symbol find-library) "find-func"
-;;;;;; "emacs-lisp/find-func.el" (20707 18685 911514 0))
+;;;;;; "emacs-lisp/find-func.el" (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/find-func.el
(autoload 'find-library "find-func" "\
@@ -11028,8 +10987,8 @@ Define some key bindings for the find-function family of functions.
;;;***
;;;### (autoloads (find-lisp-find-dired-filter find-lisp-find-dired-subdirectories
-;;;;;; find-lisp-find-dired) "find-lisp" "find-lisp.el" (20707 18685
-;;;;;; 911514 0))
+;;;;;; find-lisp-find-dired) "find-lisp" "find-lisp.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from find-lisp.el
(autoload 'find-lisp-find-dired "find-lisp" "\
@@ -11050,7 +11009,7 @@ Change the filter on a find-lisp-find-dired buffer to REGEXP.
;;;***
;;;### (autoloads (finder-by-keyword finder-commentary finder-list-keywords)
-;;;;;; "finder" "finder.el" (20707 18685 911514 0))
+;;;;;; "finder" "finder.el" (20709 26818 907104 0))
;;; Generated autoloads from finder.el
(autoload 'finder-list-keywords "finder" "\
@@ -11072,7 +11031,7 @@ Find packages matching a given keyword.
;;;***
;;;### (autoloads (enable-flow-control-on enable-flow-control) "flow-ctrl"
-;;;;;; "flow-ctrl.el" (20707 18685 911514 0))
+;;;;;; "flow-ctrl.el" (20709 26818 907104 0))
;;; Generated autoloads from flow-ctrl.el
(autoload 'enable-flow-control "flow-ctrl" "\
@@ -11094,7 +11053,7 @@ to get the effect of a C-q.
;;;***
;;;### (autoloads (fill-flowed fill-flowed-encode) "flow-fill" "gnus/flow-fill.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/flow-fill.el
(autoload 'fill-flowed-encode "flow-fill" "\
@@ -11110,8 +11069,8 @@ to get the effect of a C-q.
;;;***
;;;### (autoloads (flymake-find-file-hook flymake-mode-off flymake-mode-on
-;;;;;; flymake-mode) "flymake" "progmodes/flymake.el" (20707 18685
-;;;;;; 911514 0))
+;;;;;; flymake-mode) "flymake" "progmodes/flymake.el" (20717 20920
+;;;;;; 410005 0))
;;; Generated autoloads from progmodes/flymake.el
(autoload 'flymake-mode "flymake" "\
@@ -11141,7 +11100,7 @@ Turn flymake mode off.
;;;### (autoloads (flyspell-buffer flyspell-region flyspell-mode-off
;;;;;; turn-off-flyspell turn-on-flyspell flyspell-mode flyspell-prog-mode)
-;;;;;; "flyspell" "textmodes/flyspell.el" (20707 18685 911514 0))
+;;;;;; "flyspell" "textmodes/flyspell.el" (20721 17977 14204 0))
;;; Generated autoloads from textmodes/flyspell.el
(autoload 'flyspell-prog-mode "flyspell" "\
@@ -11213,7 +11172,7 @@ Flyspell whole buffer.
;;;### (autoloads (follow-delete-other-windows-and-split follow-mode
;;;;;; turn-off-follow-mode turn-on-follow-mode) "follow" "follow.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from follow.el
(autoload 'turn-on-follow-mode "follow" "\
@@ -11281,8 +11240,8 @@ selected if the original window is the first one in the frame.
;;;***
-;;;### (autoloads (footnote-mode) "footnote" "mail/footnote.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (footnote-mode) "footnote" "mail/footnote.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from mail/footnote.el
(autoload 'footnote-mode "footnote" "\
@@ -11301,7 +11260,7 @@ play around with the following keys:
;;;***
;;;### (autoloads (forms-find-file-other-window forms-find-file forms-mode)
-;;;;;; "forms" "forms.el" (20707 18685 911514 0))
+;;;;;; "forms" "forms.el" (20709 26818 907104 0))
;;; Generated autoloads from forms.el
(autoload 'forms-mode "forms" "\
@@ -11338,7 +11297,7 @@ Visit a file in Forms mode in other window.
;;;***
;;;### (autoloads (fortran-mode) "fortran" "progmodes/fortran.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/fortran.el
(autoload 'fortran-mode "fortran" "\
@@ -11416,8 +11375,8 @@ with no args, if that value is non-nil.
;;;***
;;;### (autoloads (fortune fortune-to-signature fortune-compile fortune-from-region
-;;;;;; fortune-add-fortune) "fortune" "play/fortune.el" (20707 18685
-;;;;;; 911514 0))
+;;;;;; fortune-add-fortune) "fortune" "play/fortune.el" (20765 36517
+;;;;;; 595445 191000))
;;; Generated autoloads from play/fortune.el
(autoload 'fortune-add-fortune "fortune" "\
@@ -11466,7 +11425,7 @@ and choose the directory as the fortune-file.
;;;***
;;;### (autoloads (gdb gdb-enable-debug) "gdb-mi" "progmodes/gdb-mi.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20799 169 640767 0))
;;; Generated autoloads from progmodes/gdb-mi.el
(defvar gdb-enable-debug nil "\
@@ -11492,16 +11451,16 @@ and source-file directory for your debugger.
COMMAND-LINE is the shell command for starting the gdb session.
It should be a string consisting of the name of the gdb
-executable followed by command-line options. The command-line
+executable followed by command line options. The command line
options should include \"-i=mi\" to use gdb's MI text interface.
Note that the old \"--annotate\" option is no longer supported.
-If `gdb-many-windows' is nil (the default value) then gdb just
+If option `gdb-many-windows' is nil (the default value) then gdb just
pops up the GUD buffer unless `gdb-show-main' is t. In this case
it starts with two windows: one displaying the GUD buffer and the
other with the source file with the main routine of the inferior.
-If `gdb-many-windows' is t, regardless of the value of
+If option `gdb-many-windows' is t, regardless of the value of
`gdb-show-main', the layout below will appear. Keybindings are
shown in some of the buffers.
@@ -11544,8 +11503,8 @@ detailed description of this mode.
;;;***
;;;### (autoloads (generic-make-keywords-list generic-mode generic-mode-internal
-;;;;;; define-generic-mode) "generic" "emacs-lisp/generic.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; define-generic-mode) "generic" "emacs-lisp/generic.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from emacs-lisp/generic.el
(defvar generic-mode-list nil "\
@@ -11624,7 +11583,7 @@ regular expression that can be used as an element of
;;;***
;;;### (autoloads (glasses-mode) "glasses" "progmodes/glasses.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/glasses.el
(autoload 'glasses-mode "glasses" "\
@@ -11640,7 +11599,7 @@ add virtual separators (like underscores) at places they belong to.
;;;### (autoloads (gmm-tool-bar-from-list gmm-widget-p gmm-error
;;;;;; gmm-message gmm-regexp-concat) "gmm-utils" "gnus/gmm-utils.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/gmm-utils.el
(autoload 'gmm-regexp-concat "gmm-utils" "\
@@ -11695,8 +11654,8 @@ DEFAULT-MAP specifies the default key map for ICON-LIST.
;;;***
;;;### (autoloads (gnus gnus-other-frame gnus-slave gnus-no-server
-;;;;;; gnus-slave-no-server) "gnus" "gnus/gnus.el" (20707 18685
-;;;;;; 911514 0))
+;;;;;; gnus-slave-no-server) "gnus" "gnus/gnus.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from gnus/gnus.el
(when (fboundp 'custom-autoload)
(custom-autoload 'gnus-select-method "gnus"))
@@ -11726,8 +11685,9 @@ Read news as a slave.
Pop up a frame to read news.
This will call one of the Gnus commands which is specified by the user
option `gnus-other-frame-function' (default `gnus') with the argument
-ARG if Gnus is not running, otherwise just pop up a Gnus frame. The
-optional second argument DISPLAY should be a standard display string
+ARG if Gnus is not running, otherwise pop up a Gnus frame and run the
+command specified by `gnus-other-frame-resume-function'.
+The optional second argument DISPLAY should be a standard display string
such as \"unix:0\" to specify where to pop up a frame. If DISPLAY is
omitted or the function `make-frame-on-display' is not available, the
current display is used.
@@ -11749,7 +11709,7 @@ prompt the user for the name of an NNTP server to use.
;;;;;; gnus-agent-get-undownloaded-list gnus-agent-delete-group
;;;;;; gnus-agent-rename-group gnus-agent-possibly-save-gcc gnus-agentize
;;;;;; gnus-slave-unplugged gnus-plugged gnus-unplugged) "gnus-agent"
-;;;;;; "gnus/gnus-agent.el" (20707 18685 911514 0))
+;;;;;; "gnus/gnus-agent.el" (20709 26818 907104 0))
;;; Generated autoloads from gnus/gnus-agent.el
(autoload 'gnus-unplugged "gnus-agent" "\
@@ -11840,7 +11800,7 @@ If CLEAN, obsolete (ignore).
;;;***
;;;### (autoloads (gnus-article-prepare-display) "gnus-art" "gnus/gnus-art.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20763 30266 231060 0))
;;; Generated autoloads from gnus/gnus-art.el
(autoload 'gnus-article-prepare-display "gnus-art" "\
@@ -11851,7 +11811,7 @@ Make the current buffer look like a nice article.
;;;***
;;;### (autoloads (gnus-bookmark-bmenu-list gnus-bookmark-jump gnus-bookmark-set)
-;;;;;; "gnus-bookmark" "gnus/gnus-bookmark.el" (20707 18685 911514
+;;;;;; "gnus-bookmark" "gnus/gnus-bookmark.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from gnus/gnus-bookmark.el
@@ -11877,8 +11837,8 @@ deletion, or > if it is flagged for displaying.
;;;### (autoloads (gnus-cache-delete-group gnus-cache-rename-group
;;;;;; gnus-cache-generate-nov-databases gnus-cache-generate-active
-;;;;;; gnus-jog-cache) "gnus-cache" "gnus/gnus-cache.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; gnus-jog-cache) "gnus-cache" "gnus/gnus-cache.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from gnus/gnus-cache.el
(autoload 'gnus-jog-cache "gnus-cache" "\
@@ -11920,7 +11880,7 @@ supported.
;;;***
;;;### (autoloads (gnus-delay-initialize gnus-delay-send-queue gnus-delay-article)
-;;;;;; "gnus-delay" "gnus/gnus-delay.el" (20707 18685 911514 0))
+;;;;;; "gnus-delay" "gnus/gnus-delay.el" (20791 9657 561026 0))
;;; Generated autoloads from gnus/gnus-delay.el
(autoload 'gnus-delay-article "gnus-delay" "\
@@ -11956,7 +11916,7 @@ Checking delayed messages is skipped if optional arg NO-CHECK is non-nil.
;;;***
;;;### (autoloads (gnus-user-format-function-D gnus-user-format-function-d)
-;;;;;; "gnus-diary" "gnus/gnus-diary.el" (20707 18685 911514 0))
+;;;;;; "gnus-diary" "gnus/gnus-diary.el" (20709 26818 907104 0))
;;; Generated autoloads from gnus/gnus-diary.el
(autoload 'gnus-user-format-function-d "gnus-diary" "\
@@ -11972,7 +11932,7 @@ Checking delayed messages is skipped if optional arg NO-CHECK is non-nil.
;;;***
;;;### (autoloads (turn-on-gnus-dired-mode) "gnus-dired" "gnus/gnus-dired.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/gnus-dired.el
(autoload 'turn-on-gnus-dired-mode "gnus-dired" "\
@@ -11983,7 +11943,7 @@ Convenience method to turn on gnus-dired-mode.
;;;***
;;;### (autoloads (gnus-draft-reminder) "gnus-draft" "gnus/gnus-draft.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/gnus-draft.el
(autoload 'gnus-draft-reminder "gnus-draft" "\
@@ -11995,8 +11955,8 @@ Reminder user if there are unsent drafts.
;;;### (autoloads (gnus-convert-png-to-face gnus-convert-face-to-png
;;;;;; gnus-face-from-file gnus-x-face-from-file gnus-insert-random-x-face-header
-;;;;;; gnus-random-x-face) "gnus-fun" "gnus/gnus-fun.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; gnus-random-x-face) "gnus-fun" "gnus/gnus-fun.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from gnus/gnus-fun.el
(autoload 'gnus-random-x-face "gnus-fun" "\
@@ -12041,7 +12001,7 @@ FILE should be a PNG file that's 48x48 and smaller than or equal to
;;;***
;;;### (autoloads (gnus-treat-mail-gravatar gnus-treat-from-gravatar)
-;;;;;; "gnus-gravatar" "gnus/gnus-gravatar.el" (20707 18685 911514
+;;;;;; "gnus-gravatar" "gnus/gnus-gravatar.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from gnus/gnus-gravatar.el
@@ -12060,7 +12020,7 @@ If gravatars are already displayed, remove them.
;;;***
;;;### (autoloads (gnus-fetch-group-other-frame gnus-fetch-group)
-;;;;;; "gnus-group" "gnus/gnus-group.el" (20763 5110 492774 0))
+;;;;;; "gnus-group" "gnus/gnus-group.el" (20763 30266 231060 0))
;;; Generated autoloads from gnus/gnus-group.el
(autoload 'gnus-fetch-group "gnus-group" "\
@@ -12078,7 +12038,7 @@ Pop up a frame and enter GROUP.
;;;***
;;;### (autoloads (gnus-html-prefetch-images gnus-article-html) "gnus-html"
-;;;;;; "gnus/gnus-html.el" (20707 18685 911514 0))
+;;;;;; "gnus/gnus-html.el" (20709 26818 907104 0))
;;; Generated autoloads from gnus/gnus-html.el
(autoload 'gnus-article-html "gnus-html" "\
@@ -12094,7 +12054,7 @@ Pop up a frame and enter GROUP.
;;;***
;;;### (autoloads (gnus-batch-score) "gnus-kill" "gnus/gnus-kill.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/gnus-kill.el
(defalias 'gnus-batch-kill 'gnus-batch-score)
@@ -12109,7 +12069,7 @@ Usage: emacs -batch -l ~/.emacs -l gnus -f gnus-batch-score
;;;### (autoloads (gnus-mailing-list-mode gnus-mailing-list-insinuate
;;;;;; turn-on-gnus-mailing-list-mode) "gnus-ml" "gnus/gnus-ml.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/gnus-ml.el
(autoload 'turn-on-gnus-mailing-list-mode "gnus-ml" "\
@@ -12134,7 +12094,7 @@ Minor mode for providing mailing-list commands.
;;;### (autoloads (gnus-group-split-fancy gnus-group-split gnus-group-split-update
;;;;;; gnus-group-split-setup) "gnus-mlspl" "gnus/gnus-mlspl.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/gnus-mlspl.el
(autoload 'gnus-group-split-setup "gnus-mlspl" "\
@@ -12235,7 +12195,7 @@ Calling (gnus-group-split-fancy nil nil \"mail.others\") returns:
;;;***
;;;### (autoloads (gnus-button-reply gnus-button-mailto gnus-msg-mail)
-;;;;;; "gnus-msg" "gnus/gnus-msg.el" (20707 18685 911514 0))
+;;;;;; "gnus-msg" "gnus/gnus-msg.el" (20820 6311 856169 0))
;;; Generated autoloads from gnus/gnus-msg.el
(autoload 'gnus-msg-mail "gnus-msg" "\
@@ -12262,7 +12222,7 @@ Like `message-reply'.
;;;***
;;;### (autoloads (gnus-notifications) "gnus-notifications" "gnus/gnus-notifications.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/gnus-notifications.el
(autoload 'gnus-notifications "gnus-notifications" "\
@@ -12280,7 +12240,7 @@ This is typically a function to add in
;;;### (autoloads (gnus-treat-newsgroups-picon gnus-treat-mail-picon
;;;;;; gnus-treat-from-picon) "gnus-picon" "gnus/gnus-picon.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/gnus-picon.el
(autoload 'gnus-treat-from-picon "gnus-picon" "\
@@ -12307,7 +12267,7 @@ If picons are already displayed, remove them.
;;;;;; gnus-sorted-nintersection gnus-sorted-range-intersection
;;;;;; gnus-sorted-intersection gnus-intersection gnus-sorted-complement
;;;;;; gnus-sorted-ndifference gnus-sorted-difference) "gnus-range"
-;;;;;; "gnus/gnus-range.el" (20707 18685 911514 0))
+;;;;;; "gnus/gnus-range.el" (20709 26818 907104 0))
;;; Generated autoloads from gnus/gnus-range.el
(autoload 'gnus-sorted-difference "gnus-range" "\
@@ -12375,7 +12335,7 @@ Add NUM into sorted LIST by side effect.
;;;***
;;;### (autoloads (gnus-registry-install-hooks gnus-registry-initialize)
-;;;;;; "gnus-registry" "gnus/gnus-registry.el" (20707 18685 911514
+;;;;;; "gnus-registry" "gnus/gnus-registry.el" (20779 18487 859617
;;;;;; 0))
;;; Generated autoloads from gnus/gnus-registry.el
@@ -12392,8 +12352,8 @@ Install the registry hooks.
;;;***
;;;### (autoloads (gnus-sieve-article-add-rule gnus-sieve-generate
-;;;;;; gnus-sieve-update) "gnus-sieve" "gnus/gnus-sieve.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; gnus-sieve-update) "gnus-sieve" "gnus/gnus-sieve.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from gnus/gnus-sieve.el
(autoload 'gnus-sieve-update "gnus-sieve" "\
@@ -12421,7 +12381,7 @@ See the documentation for these variables and functions for details.
;;;***
;;;### (autoloads (gnus-update-format) "gnus-spec" "gnus/gnus-spec.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20791 9657 561026 0))
;;; Generated autoloads from gnus/gnus-spec.el
(autoload 'gnus-update-format "gnus-spec" "\
@@ -12432,7 +12392,7 @@ Update the format specification near point.
;;;***
;;;### (autoloads (gnus-declare-backend) "gnus-start" "gnus/gnus-start.el"
-;;;;;; (20763 5110 492774 0))
+;;;;;; (20763 30266 231060 0))
;;; Generated autoloads from gnus/gnus-start.el
(autoload 'gnus-declare-backend "gnus-start" "\
@@ -12443,7 +12403,7 @@ Declare back end NAME with ABILITIES as a Gnus back end.
;;;***
;;;### (autoloads (gnus-summary-bookmark-jump) "gnus-sum" "gnus/gnus-sum.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20791 9657 561026 0))
;;; Generated autoloads from gnus/gnus-sum.el
(autoload 'gnus-summary-bookmark-jump "gnus-sum" "\
@@ -12455,7 +12415,7 @@ BOOKMARK is a bookmark name or a bookmark record.
;;;***
;;;### (autoloads (gnus-sync-install-hooks gnus-sync-initialize)
-;;;;;; "gnus-sync" "gnus/gnus-sync.el" (20707 18685 911514 0))
+;;;;;; "gnus-sync" "gnus/gnus-sync.el" (20709 26818 907104 0))
;;; Generated autoloads from gnus/gnus-sync.el
(autoload 'gnus-sync-initialize "gnus-sync" "\
@@ -12471,7 +12431,7 @@ Install the sync hooks.
;;;***
;;;### (autoloads (gnus-add-configuration) "gnus-win" "gnus/gnus-win.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/gnus-win.el
(autoload 'gnus-add-configuration "gnus-win" "\
@@ -12482,7 +12442,7 @@ Add the window configuration CONF to `gnus-buffer-configuration'.
;;;***
;;;### (autoloads (gnutls-min-prime-bits) "gnutls" "net/gnutls.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from net/gnutls.el
(defvar gnutls-min-prime-bits 256 "\
@@ -12498,8 +12458,8 @@ A value of nil says to use the default GnuTLS value.")
;;;***
-;;;### (autoloads (gomoku) "gomoku" "play/gomoku.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (gomoku) "gomoku" "play/gomoku.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from play/gomoku.el
(autoload 'gomoku "gomoku" "\
@@ -12526,8 +12486,8 @@ Use \\[describe-mode] for more info.
;;;***
;;;### (autoloads (goto-address-prog-mode goto-address-mode goto-address
-;;;;;; goto-address-at-point) "goto-addr" "net/goto-addr.el" (20765
-;;;;;; 6822 917289 0))
+;;;;;; goto-address-at-point) "goto-addr" "net/goto-addr.el" (20766
+;;;;;; 6456 368550 0))
;;; Generated autoloads from net/goto-addr.el
(define-obsolete-function-alias 'goto-address-at-mouse 'goto-address-at-point "22.1")
@@ -12569,7 +12529,7 @@ Like `goto-address-mode', but only for comments and strings.
;;;***
;;;### (autoloads (gravatar-retrieve-synchronously gravatar-retrieve)
-;;;;;; "gravatar" "gnus/gravatar.el" (20707 18685 911514 0))
+;;;;;; "gravatar" "gnus/gravatar.el" (20709 26818 907104 0))
;;; Generated autoloads from gnus/gravatar.el
(autoload 'gravatar-retrieve "gravatar" "\
@@ -12587,8 +12547,8 @@ Retrieve MAIL-ADDRESS gravatar and returns it.
;;;### (autoloads (zrgrep rgrep lgrep grep-find grep grep-mode grep-compute-defaults
;;;;;; grep-process-setup grep-setup-hook grep-find-command grep-command
-;;;;;; grep-window-height) "grep" "progmodes/grep.el" (20707 18685
-;;;;;; 911514 0))
+;;;;;; grep-window-height) "grep" "progmodes/grep.el" (20762 9398
+;;;;;; 526093 0))
;;; Generated autoloads from progmodes/grep.el
(defvar grep-window-height nil "\
@@ -12621,7 +12581,7 @@ List of hook functions run by `grep-process-setup' (see `run-hooks').")
(custom-autoload 'grep-setup-hook "grep" t)
-(defconst grep-regexp-alist '(("^\\(.+?\\)\\(:[ ]*\\)\\([1-9][0-9]*\\)\\2" 1 3 ((lambda nil (when grep-highlight-matches (let* ((beg (match-end 0)) (end (save-excursion (goto-char beg) (line-end-position))) (mbeg (text-property-any beg end 'font-lock-face 'match))) (when mbeg (- mbeg beg))))) lambda nil (when grep-highlight-matches (let* ((beg (match-end 0)) (end (save-excursion (goto-char beg) (line-end-position))) (mbeg (text-property-any beg end 'font-lock-face 'match)) (mend (and mbeg (next-single-property-change mbeg 'font-lock-face nil end)))) (when mend (- mend beg)))))) ("^Binary file \\(.+\\) matches$" 1 nil nil 0 1)) "\
+(defconst grep-regexp-alist '(("^\\(.+?\\)\\(:[ ]*\\)\\([1-9][0-9]*\\)\\2" 1 3 ((lambda nil (when grep-highlight-matches (let* ((beg (match-end 0)) (end (save-excursion (goto-char beg) (line-end-position))) (mbeg (text-property-any beg end 'font-lock-face grep-match-face))) (when mbeg (- mbeg beg))))) lambda nil (when grep-highlight-matches (let* ((beg (match-end 0)) (end (save-excursion (goto-char beg) (line-end-position))) (mbeg (text-property-any beg end 'font-lock-face grep-match-face)) (mend (and mbeg (next-single-property-change mbeg 'font-lock-face nil end)))) (when mend (- mend beg)))))) ("^Binary file \\(.+\\) matches$" 1 nil nil 0 1)) "\
Regexp used to match grep hits. See `compilation-error-regexp-alist'.")
(defvar grep-program (purecopy "grep") "\
@@ -12751,7 +12711,7 @@ file name to `*.gz', and sets `grep-highlight-matches' to `always'.
;;;***
-;;;### (autoloads (gs-load-image) "gs" "gs.el" (20707 18685 911514
+;;;### (autoloads (gs-load-image) "gs" "gs.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from gs.el
@@ -12766,8 +12726,8 @@ the form \"WINDOW-ID PIXMAP-ID\". Value is non-nil if successful.
;;;***
;;;### (autoloads (gud-tooltip-mode gdb-script-mode jdb pdb perldb
-;;;;;; xdb dbx sdb gud-gdb) "gud" "progmodes/gud.el" (20712 38790
-;;;;;; 413794 0))
+;;;;;; xdb dbx sdb gud-gdb) "gud" "progmodes/gud.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from progmodes/gud.el
(autoload 'gud-gdb "gud" "\
@@ -12855,9 +12815,9 @@ it if ARG is omitted or nil.
;;;***
-;;;### (autoloads (setf gv-define-simple-setter gv-define-setter
+;;;### (autoloads (gv-ref setf gv-define-simple-setter gv-define-setter
;;;;;; gv--defun-declaration gv-define-expander gv-letplace gv-get)
-;;;;;; "gv" "emacs-lisp/gv.el" (20707 18685 911514 0))
+;;;;;; "gv" "emacs-lisp/gv.el" (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/gv.el
(autoload 'gv-get "gv" "\
@@ -12948,10 +12908,16 @@ The return value is the last VAL in the list.
(put 'gv-place 'edebug-form-spec 'edebug-match-form)
+(autoload 'gv-ref "gv" "\
+Return a reference to PLACE.
+This is like the `&' operator of the C language.
+
+\(fn PLACE)" nil t)
+
;;;***
-;;;### (autoloads (handwrite) "handwrite" "play/handwrite.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (handwrite) "handwrite" "play/handwrite.el" (20791
+;;;;;; 9657 561026 0))
;;; Generated autoloads from play/handwrite.el
(autoload 'handwrite "handwrite" "\
@@ -12969,7 +12935,7 @@ Variables: `handwrite-linespace' (default 12)
;;;***
;;;### (autoloads (hanoi-unix-64 hanoi-unix hanoi) "hanoi" "play/hanoi.el"
-;;;;;; (20627 28531 447943 0))
+;;;;;; (20478 3673 653810 0))
;;; Generated autoloads from play/hanoi.el
(autoload 'hanoi "hanoi" "\
@@ -12998,7 +12964,7 @@ to be updated.
;;;### (autoloads (mail-check-payment mail-add-payment-async mail-add-payment
;;;;;; hashcash-verify-payment hashcash-insert-payment-async hashcash-insert-payment)
-;;;;;; "hashcash" "mail/hashcash.el" (20707 18685 911514 0))
+;;;;;; "hashcash" "mail/hashcash.el" (20709 26818 907104 0))
;;; Generated autoloads from mail/hashcash.el
(autoload 'hashcash-insert-payment "hashcash" "\
@@ -13043,8 +13009,8 @@ Prefix arg sets default accept amount temporarily.
;;;### (autoloads (scan-buf-previous-region scan-buf-next-region
;;;;;; scan-buf-move-to-region help-at-pt-display-when-idle help-at-pt-set-timer
;;;;;; help-at-pt-cancel-timer display-local-help help-at-pt-kbd-string
-;;;;;; help-at-pt-string) "help-at-pt" "help-at-pt.el" (20707 18685
-;;;;;; 911514 0))
+;;;;;; help-at-pt-string) "help-at-pt" "help-at-pt.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from help-at-pt.el
(autoload 'help-at-pt-string "help-at-pt" "\
@@ -13174,7 +13140,7 @@ different regions. With numeric argument ARG, behaves like
;;;### (autoloads (doc-file-to-info doc-file-to-man describe-categories
;;;;;; describe-syntax describe-variable variable-at-point describe-function-1
;;;;;; find-lisp-object-file-name help-C-file-name describe-function)
-;;;;;; "help-fns" "help-fns.el" (20707 18685 911514 0))
+;;;;;; "help-fns" "help-fns.el" (20764 51137 83502 0))
;;; Generated autoloads from help-fns.el
(autoload 'describe-function "help-fns" "\
@@ -13254,7 +13220,7 @@ Produce a texinfo buffer with sorted doc-strings from the DOC file.
;;;***
;;;### (autoloads (three-step-help) "help-macro" "help-macro.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from help-macro.el
(defvar three-step-help nil "\
@@ -13271,7 +13237,7 @@ gives the window that lists the options.")
;;;### (autoloads (help-bookmark-jump help-xref-on-pp help-insert-xref-button
;;;;;; help-xref-button help-make-xrefs help-buffer help-setup-xref
;;;;;; help-mode-finish help-mode-setup help-mode) "help-mode" "help-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20721 17977 14204 0))
;;; Generated autoloads from help-mode.el
(autoload 'help-mode "help-mode" "\
@@ -13371,7 +13337,7 @@ BOOKMARK is a bookmark name or a bookmark record.
;;;***
;;;### (autoloads (Helper-help Helper-describe-bindings) "helper"
-;;;;;; "emacs-lisp/helper.el" (20707 18685 911514 0))
+;;;;;; "emacs-lisp/helper.el" (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/helper.el
(autoload 'Helper-describe-bindings "helper" "\
@@ -13387,7 +13353,7 @@ Provide help for current mode.
;;;***
;;;### (autoloads (hexlify-buffer hexl-find-file hexl-mode) "hexl"
-;;;;;; "hexl.el" (20763 5110 492774 0))
+;;;;;; "hexl.el" (20763 30266 231060 0))
;;; Generated autoloads from hexl.el
(autoload 'hexl-mode "hexl" "\
@@ -13484,7 +13450,7 @@ This discards the buffer's undo information.
;;;### (autoloads (hi-lock-write-interactive-patterns hi-lock-unface-buffer
;;;;;; hi-lock-face-phrase-buffer hi-lock-face-buffer hi-lock-line-face-buffer
;;;;;; global-hi-lock-mode hi-lock-mode) "hi-lock" "hi-lock.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20825 24233 991089 0))
;;; Generated autoloads from hi-lock.el
(autoload 'hi-lock-mode "hi-lock" "\
@@ -13573,13 +13539,13 @@ See `hi-lock-mode' for more information on Hi-Lock mode.
(autoload 'hi-lock-line-face-buffer "hi-lock" "\
Set face of all lines containing a match of REGEXP to FACE.
-Interactively, prompt for REGEXP then FACE, using a buffer-local
-history list for REGEXP and a global history list for FACE.
+Interactively, prompt for REGEXP then FACE. Use
+`hi-lock-read-regexp-defaults-function' to retrieve default
+value(s) of REGEXP. Use the global history list for FACE.
-If Font Lock mode is enabled in the buffer, it is used to
-highlight REGEXP. If Font Lock mode is disabled, overlays are
-used for highlighting; in this case, the highlighting will not be
-updated as you type.
+Use Font lock mode, if enabled, to highlight REGEXP. Otherwise,
+use overlays for highlighting. If overlays are used, the
+highlighting will not update as you type.
\(fn REGEXP &optional FACE)" t nil)
@@ -13587,13 +13553,13 @@ updated as you type.
(autoload 'hi-lock-face-buffer "hi-lock" "\
Set face of each match of REGEXP to FACE.
-Interactively, prompt for REGEXP then FACE, using a buffer-local
-history list for REGEXP and a global history list for FACE.
+Interactively, prompt for REGEXP then FACE. Use
+`hi-lock-read-regexp-defaults-function' to retrieve default
+value(s) REGEXP. Use the global history list for FACE.
-If Font Lock mode is enabled in the buffer, it is used to
-highlight REGEXP. If Font Lock mode is disabled, overlays are
-used for highlighting; in this case, the highlighting will not be
-updated as you type.
+Use Font lock mode, if enabled, to highlight REGEXP. Otherwise,
+use overlays for highlighting. If overlays are used, the
+highlighting will not update as you type.
\(fn REGEXP &optional FACE)" t nil)
@@ -13601,13 +13567,16 @@ updated as you type.
(autoload 'hi-lock-face-phrase-buffer "hi-lock" "\
Set face of each match of phrase REGEXP to FACE.
-If called interactively, replaces whitespace in REGEXP with
-arbitrary whitespace and makes initial lower-case letters case-insensitive.
+Interactively, prompt for REGEXP then FACE. Use
+`hi-lock-read-regexp-defaults-function' to retrieve default
+value(s) of REGEXP. Use the global history list for FACE. When
+called interactively, replace whitespace in user provided regexp
+with arbitrary whitespace and make initial lower-case letters
+case-insensitive before highlighting with `hi-lock-set-pattern'.
-If Font Lock mode is enabled in the buffer, it is used to
-highlight REGEXP. If Font Lock mode is disabled, overlays are
-used for highlighting; in this case, the highlighting will not be
-updated as you type.
+Use Font lock mode, if enabled, to highlight REGEXP. Otherwise,
+use overlays for highlighting. If overlays are used, the
+highlighting will not update as you type.
\(fn REGEXP &optional FACE)" t nil)
@@ -13617,6 +13586,8 @@ updated as you type.
Remove highlighting of each match to REGEXP set by hi-lock.
Interactively, prompt for REGEXP, accepting only regexps
previously inserted by hi-lock interactive functions.
+If REGEXP is t (or if \\[universal-argument] was specified interactively),
+then remove all hi-lock highlighting.
\(fn REGEXP)" t nil)
@@ -13632,7 +13603,7 @@ be found in variable `hi-lock-interactive-patterns'.
;;;***
;;;### (autoloads (hide-ifdef-mode) "hideif" "progmodes/hideif.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/hideif.el
(autoload 'hide-ifdef-mode "hideif" "\
@@ -13676,7 +13647,7 @@ Several variables affect how the hiding is done:
;;;***
;;;### (autoloads (turn-off-hideshow hs-minor-mode) "hideshow" "progmodes/hideshow.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20791 9657 561026 0))
;;; Generated autoloads from progmodes/hideshow.el
(defvar hs-special-modes-alist (mapcar 'purecopy '((c-mode "{" "}" "/[*/]" nil nil) (c++-mode "{" "}" "/[*/]" nil nil) (bibtex-mode ("@\\S(*\\(\\s(\\)" 1)) (java-mode "{" "}" "/[*/]" nil nil) (js-mode "{" "}" "/[*/]" nil))) "\
@@ -13742,8 +13713,8 @@ Unconditionally turn off `hs-minor-mode'.
;;;;;; highlight-compare-buffers highlight-changes-rotate-faces
;;;;;; highlight-changes-previous-change highlight-changes-next-change
;;;;;; highlight-changes-remove-highlight highlight-changes-visible-mode
-;;;;;; highlight-changes-mode) "hilit-chg" "hilit-chg.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; highlight-changes-mode) "hilit-chg" "hilit-chg.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from hilit-chg.el
(autoload 'highlight-changes-mode "hilit-chg" "\
@@ -13875,7 +13846,7 @@ See `highlight-changes-mode' for more information on Highlight-Changes mode.
;;;***
;;;### (autoloads (make-hippie-expand-function hippie-expand hippie-expand-try-functions-list)
-;;;;;; "hippie-exp" "hippie-exp.el" (20707 18685 911514 0))
+;;;;;; "hippie-exp" "hippie-exp.el" (20709 26818 907104 0))
;;; Generated autoloads from hippie-exp.el
(defvar hippie-expand-try-functions-list '(try-complete-file-name-partially try-complete-file-name try-expand-all-abbrevs try-expand-list try-expand-line try-expand-dabbrev try-expand-dabbrev-all-buffers try-expand-dabbrev-from-kill try-complete-lisp-symbol-partially try-complete-lisp-symbol) "\
@@ -13907,7 +13878,7 @@ argument VERBOSE non-nil makes the function verbose.
;;;***
;;;### (autoloads (global-hl-line-mode hl-line-mode) "hl-line" "hl-line.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from hl-line.el
(autoload 'hl-line-mode "hl-line" "\
@@ -13960,7 +13931,7 @@ Global-Hl-Line mode uses the functions `global-hl-line-unhighlight' and
;;;;;; holiday-bahai-holidays holiday-islamic-holidays holiday-christian-holidays
;;;;;; holiday-hebrew-holidays holiday-other-holidays holiday-local-holidays
;;;;;; holiday-oriental-holidays holiday-general-holidays) "holidays"
-;;;;;; "calendar/holidays.el" (20707 18685 911514 0))
+;;;;;; "calendar/holidays.el" (20709 26818 907104 0))
;;; Generated autoloads from calendar/holidays.el
(define-obsolete-variable-alias 'general-holidays 'holiday-general-holidays "23.1")
@@ -14108,8 +14079,8 @@ The optional LABEL is used to label the buffer created.
;;;***
-;;;### (autoloads (html2text) "html2text" "gnus/html2text.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (html2text) "html2text" "gnus/html2text.el" (20791
+;;;;;; 9657 561026 0))
;;; Generated autoloads from gnus/html2text.el
(autoload 'html2text "html2text" "\
@@ -14120,7 +14091,7 @@ Convert HTML to plain text in the current buffer.
;;;***
;;;### (autoloads (htmlfontify-copy-and-link-dir htmlfontify-buffer)
-;;;;;; "htmlfontify" "htmlfontify.el" (20707 18685 911514 0))
+;;;;;; "htmlfontify" "htmlfontify.el" (20774 51822 616889 64000))
;;; Generated autoloads from htmlfontify.el
(autoload 'htmlfontify-buffer "htmlfontify" "\
@@ -14153,8 +14124,8 @@ You may also want to set `hfy-page-header' and `hfy-page-footer'.
;;;***
;;;### (autoloads (define-ibuffer-filter define-ibuffer-op define-ibuffer-sorter
-;;;;;; define-ibuffer-column) "ibuf-macs" "ibuf-macs.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; define-ibuffer-column) "ibuf-macs" "ibuf-macs.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from ibuf-macs.el
(autoload 'define-ibuffer-column "ibuf-macs" "\
@@ -14243,7 +14214,7 @@ bound to the current value of the filter.
;;;***
;;;### (autoloads (ibuffer ibuffer-other-window ibuffer-list-buffers)
-;;;;;; "ibuffer" "ibuffer.el" (20707 18685 911514 0))
+;;;;;; "ibuffer" "ibuffer.el" (20792 30519 8548 0))
;;; Generated autoloads from ibuffer.el
(autoload 'ibuffer-list-buffers "ibuffer" "\
@@ -14284,7 +14255,7 @@ FORMATS is the value to use for `ibuffer-formats'.
;;;### (autoloads (icalendar-import-buffer icalendar-import-file
;;;;;; icalendar-export-region icalendar-export-file) "icalendar"
-;;;;;; "calendar/icalendar.el" (20707 18685 911514 0))
+;;;;;; "calendar/icalendar.el" (20709 26818 907104 0))
;;; Generated autoloads from calendar/icalendar.el
(autoload 'icalendar-export-file "icalendar" "\
@@ -14336,8 +14307,8 @@ buffer `*icalendar-errors*'.
;;;***
-;;;### (autoloads (icomplete-mode) "icomplete" "icomplete.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (icomplete-mode) "icomplete" "icomplete.el" (20766
+;;;;;; 59066 666084 0))
;;; Generated autoloads from icomplete.el
(defvar icomplete-mode nil "\
@@ -14359,8 +14330,8 @@ the mode if ARG is omitted or nil.
;;;***
-;;;### (autoloads (icon-mode) "icon" "progmodes/icon.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (icon-mode) "icon" "progmodes/icon.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from progmodes/icon.el
(autoload 'icon-mode "icon" "\
@@ -14401,7 +14372,7 @@ with no args, if that value is non-nil.
;;;***
;;;### (autoloads (idlwave-shell) "idlw-shell" "progmodes/idlw-shell.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/idlw-shell.el
(autoload 'idlwave-shell "idlw-shell" "\
@@ -14427,7 +14398,7 @@ See also the variable `idlwave-shell-prompt-pattern'.
;;;***
;;;### (autoloads (idlwave-mode) "idlwave" "progmodes/idlwave.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20799 169 640767 0))
;;; Generated autoloads from progmodes/idlwave.el
(autoload 'idlwave-mode "idlwave" "\
@@ -14561,8 +14532,8 @@ The main features of this mode are
;;;;;; ido-find-alternate-file ido-find-file-other-window ido-find-file
;;;;;; ido-find-file-in-dir ido-switch-buffer-other-frame ido-insert-buffer
;;;;;; ido-kill-buffer ido-display-buffer ido-switch-buffer-other-window
-;;;;;; ido-switch-buffer ido-mode ido-mode) "ido" "ido.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; ido-switch-buffer ido-mode ido-mode) "ido" "ido.el" (20809
+;;;;;; 36008 682209 0))
;;; Generated autoloads from ido.el
(defvar ido-mode nil "\
@@ -14821,7 +14792,7 @@ DEF, if non-nil, is the default value.
;;;***
-;;;### (autoloads (ielm) "ielm" "ielm.el" (20707 18685 911514 0))
+;;;### (autoloads (ielm) "ielm" "ielm.el" (20709 26818 907104 0))
;;; Generated autoloads from ielm.el
(autoload 'ielm "ielm" "\
@@ -14832,8 +14803,8 @@ Switches to the buffer `*ielm*', or creates it if it does not exist.
;;;***
-;;;### (autoloads (iimage-mode) "iimage" "iimage.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (iimage-mode) "iimage" "iimage.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from iimage.el
(define-obsolete-function-alias 'turn-on-iimage-mode 'iimage-mode "24.1")
@@ -14854,7 +14825,7 @@ the mode if ARG is omitted or nil, and toggle it if ARG is `toggle'.
;;;;;; create-image image-type-auto-detected-p image-type-available-p
;;;;;; image-type image-type-from-file-name image-type-from-file-header
;;;;;; image-type-from-buffer image-type-from-data) "image" "image.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20772 45239 494620 0))
;;; Generated autoloads from image.el
(autoload 'image-type-from-data "image" "\
@@ -15054,7 +15025,7 @@ If Emacs is compiled without ImageMagick support, this does nothing.
;;;;;; image-dired-jump-thumbnail-buffer image-dired-delete-tag
;;;;;; image-dired-tag-files image-dired-show-all-from-dir image-dired-display-thumbs
;;;;;; image-dired-dired-with-window-configuration image-dired-dired-toggle-marked-thumbs)
-;;;;;; "image-dired" "image-dired.el" (20707 18685 911514 0))
+;;;;;; "image-dired" "image-dired.el" (20768 48184 78670 0))
;;; Generated autoloads from image-dired.el
(autoload 'image-dired-dired-toggle-marked-thumbs "image-dired" "\
@@ -15119,7 +15090,7 @@ displayed.
(defalias 'image-dired 'image-dired-show-all-from-dir)
-(defalias 'tumme 'image-dired-show-all-from-dir)
+(define-obsolete-function-alias 'tumme 'image-dired "24.4")
(autoload 'image-dired-tag-files "image-dired" "\
Tag marked file(s) in dired. With prefix ARG, tag file at point.
@@ -15192,7 +15163,7 @@ easy-to-use form.
;;;### (autoloads (auto-image-file-mode insert-image-file image-file-name-regexp
;;;;;; image-file-name-regexps image-file-name-extensions) "image-file"
-;;;;;; "image-file.el" (20707 18685 911514 0))
+;;;;;; "image-file.el" (20709 26818 907104 0))
;;; Generated autoloads from image-file.el
(defvar image-file-name-extensions (purecopy '("png" "jpeg" "jpg" "gif" "tiff" "tif" "xbm" "xpm" "pbm" "pgm" "ppm" "pnm" "svg")) "\
@@ -15255,8 +15226,8 @@ An image file is one whose name has an extension in
;;;***
;;;### (autoloads (image-bookmark-jump image-mode-as-text image-minor-mode
-;;;;;; image-mode) "image-mode" "image-mode.el" (20718 7922 212742
-;;;;;; 0))
+;;;;;; image-mode) "image-mode" "image-mode.el" (20774 51931 214714
+;;;;;; 829000))
;;; Generated autoloads from image-mode.el
(autoload 'image-mode "image-mode" "\
@@ -15301,8 +15272,8 @@ on these modes.
;;;***
;;;### (autoloads (imenu imenu-add-menubar-index imenu-add-to-menubar
-;;;;;; imenu-sort-function) "imenu" "imenu.el" (20744 53127 564979
-;;;;;; 207000))
+;;;;;; imenu-sort-function) "imenu" "imenu.el" (20784 36406 653593
+;;;;;; 0))
;;; Generated autoloads from imenu.el
(defvar imenu-sort-function nil "\
@@ -15442,7 +15413,7 @@ for more information.
;;;### (autoloads (indian-2-column-to-ucs-region in-is13194-pre-write-conversion
;;;;;; in-is13194-post-read-conversion indian-compose-string indian-compose-region)
-;;;;;; "ind-util" "language/ind-util.el" (20707 18685 911514 0))
+;;;;;; "ind-util" "language/ind-util.el" (20709 26818 907104 0))
;;; Generated autoloads from language/ind-util.el
(autoload 'indian-compose-region "ind-util" "\
@@ -15473,7 +15444,7 @@ Convert old Emacs Devanagari characters to UCS.
;;;***
;;;### (autoloads (inferior-lisp) "inf-lisp" "progmodes/inf-lisp.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20774 53405 644725 888000))
;;; Generated autoloads from progmodes/inf-lisp.el
(autoload 'inferior-lisp "inf-lisp" "\
@@ -15495,7 +15466,7 @@ of `inferior-lisp-program'). Runs the hooks from
;;;;;; Info-goto-emacs-key-command-node Info-goto-emacs-command-node
;;;;;; Info-mode info-finder info-apropos Info-index Info-directory
;;;;;; Info-on-current-buffer info-standalone info-emacs-bug info-emacs-manual
-;;;;;; info info-other-window) "info" "info.el" (20707 18685 911514
+;;;;;; info info-other-window) "info" "info.el" (20813 33065 721081
;;;;;; 0))
;;; Generated autoloads from info.el
@@ -15521,7 +15492,7 @@ reasons. Normally, you should either set INFOPATH or customize
(autoload 'info-other-window "info" "\
Like `info' but show the Info buffer in another window.
-\(fn &optional FILE-OR-NODE)" t nil)
+\(fn &optional FILE-OR-NODE BUFFER)" t nil)
(put 'info 'info-file (purecopy "emacs"))
(autoload 'info "info" "\
@@ -15537,8 +15508,9 @@ with the top-level Info directory.
In interactive use, a non-numeric prefix argument directs
this command to read a file name from the minibuffer.
-A numeric prefix argument selects an Info buffer with the prefix number
-appended to the Info buffer name.
+
+A numeric prefix argument N selects an Info buffer named
+\"*info*<%s>\".
The search path for Info files is in the variable `Info-directory-list'.
The top-level Info directory is made by combining all the files named `dir'
@@ -15698,7 +15670,9 @@ type returned by `Info-bookmark-make-record', which see.
\(fn BMK)" nil nil)
(autoload 'info-display-manual "info" "\
-Go to Info buffer that displays MANUAL, creating it if none already exists.
+Display an Info buffer displaying MANUAL.
+If there is an existing Info buffer for MANUAL, display it.
+Otherwise, visit the manual in a new Info buffer.
\(fn MANUAL)" t nil)
@@ -15706,7 +15680,7 @@ Go to Info buffer that displays MANUAL, creating it if none already exists.
;;;### (autoloads (info-complete-file info-complete-symbol info-lookup-file
;;;;;; info-lookup-symbol info-lookup-reset) "info-look" "info-look.el"
-;;;;;; (20770 60415 653135 179000))
+;;;;;; (20771 24374 643644 0))
;;; Generated autoloads from info-look.el
(autoload 'info-lookup-reset "info-look" "\
@@ -15755,7 +15729,7 @@ Perform completion on file preceding point.
;;;### (autoloads (info-xref-docstrings info-xref-check-all-custom
;;;;;; info-xref-check-all info-xref-check) "info-xref" "info-xref.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from info-xref.el
(autoload 'info-xref-check "info-xref" "\
@@ -15838,8 +15812,7 @@ the sources handy.
;;;***
;;;### (autoloads (batch-info-validate Info-validate Info-split Info-split-threshold
-;;;;;; Info-tagify) "informat" "informat.el" (20707 18685 911514
-;;;;;; 0))
+;;;;;; Info-tagify) "informat" "informat.el" (20774 566 676067 0))
;;; Generated autoloads from informat.el
(autoload 'Info-tagify "informat" "\
@@ -15885,7 +15858,7 @@ For example, invoke \"emacs -batch -f batch-info-validate $info/ ~/*.info\"
;;;***
;;;### (autoloads (inversion-require-emacs) "inversion" "cedet/inversion.el"
-;;;;;; (20741 50977 527555 250000))
+;;;;;; (20745 310 425822 0))
;;; Generated autoloads from cedet/inversion.el
(autoload 'inversion-require-emacs "inversion" "\
@@ -15898,7 +15871,7 @@ Only checks one based on which kind of Emacs is being run.
;;;### (autoloads (isearch-process-search-multibyte-characters isearch-toggle-input-method
;;;;;; isearch-toggle-specified-input-method) "isearch-x" "international/isearch-x.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from international/isearch-x.el
(autoload 'isearch-toggle-specified-input-method "isearch-x" "\
@@ -15918,8 +15891,8 @@ Toggle input method in interactive search.
;;;***
-;;;### (autoloads (isearchb-activate) "isearchb" "isearchb.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (isearchb-activate) "isearchb" "isearchb.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from isearchb.el
(autoload 'isearchb-activate "isearchb" "\
@@ -15935,7 +15908,7 @@ accessed via isearchb.
;;;### (autoloads (iso-cvt-define-menu iso-cvt-write-only iso-cvt-read-only
;;;;;; iso-sgml2iso iso-iso2sgml iso-iso2duden iso-iso2gtex iso-gtex2iso
;;;;;; iso-tex2iso iso-iso2tex iso-german iso-spanish) "iso-cvt"
-;;;;;; "international/iso-cvt.el" (20707 18685 911514 0))
+;;;;;; "international/iso-cvt.el" (20791 9657 561026 0))
;;; Generated autoloads from international/iso-cvt.el
(autoload 'iso-spanish "iso-cvt" "\
@@ -16026,7 +15999,7 @@ Add submenus to the File menu, to convert to and from various formats.
;;;***
;;;### (autoloads nil "iso-transl" "international/iso-transl.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20791 9657 561026 0))
;;; Generated autoloads from international/iso-transl.el
(define-key key-translation-map "\C-x8" 'iso-transl-ctl-x-8-map)
(autoload 'iso-transl-ctl-x-8-map "iso-transl" "Keymap for C-x 8 prefix." t 'keymap)
@@ -16034,10 +16007,11 @@ Add submenus to the File menu, to convert to and from various formats.
;;;***
;;;### (autoloads (ispell-message ispell-minor-mode ispell ispell-complete-word-interior-frag
-;;;;;; ispell-complete-word ispell-continue ispell-buffer ispell-comments-and-strings
-;;;;;; ispell-region ispell-change-dictionary ispell-kill-ispell
-;;;;;; ispell-help ispell-pdict-save ispell-word ispell-personal-dictionary)
-;;;;;; "ispell" "textmodes/ispell.el" (20775 13766 532814 0))
+;;;;;; ispell-complete-word ispell-continue ispell-buffer-with-debug
+;;;;;; ispell-buffer ispell-comments-and-strings ispell-region ispell-change-dictionary
+;;;;;; ispell-kill-ispell ispell-help ispell-pdict-save ispell-word
+;;;;;; ispell-personal-dictionary) "ispell" "textmodes/ispell.el"
+;;;;;; (20787 12616 976036 0))
;;; Generated autoloads from textmodes/ispell.el
(put 'ispell-check-comments 'safe-local-variable (lambda (a) (memq a '(nil t exclusive))))
@@ -16190,6 +16164,12 @@ Check the current buffer for spelling errors interactively.
\(fn)" t nil)
+(autoload 'ispell-buffer-with-debug "ispell" "\
+`ispell-buffer' with some output sent to `ispell-debug-buffer' buffer.
+Use APPEND to append the info to previous buffer if exists.
+
+\(fn &optional APPEND)" t nil)
+
(autoload 'ispell-continue "ispell" "\
Continue a halted spelling session beginning with the current word.
@@ -16264,8 +16244,8 @@ You can bind this to the key C-c i in GNUS or mail by adding to
;;;***
-;;;### (autoloads (iswitchb-mode) "iswitchb" "iswitchb.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (iswitchb-mode) "iswitchb" "iswitchb.el" (20824
+;;;;;; 3367 300658 0))
;;; Generated autoloads from iswitchb.el
(defvar iswitchb-mode nil "\
@@ -16293,7 +16273,7 @@ between buffers using substrings. See `iswitchb' for details.
;;;### (autoloads (read-hiragana-string japanese-zenkaku-region japanese-hankaku-region
;;;;;; japanese-hiragana-region japanese-katakana-region japanese-zenkaku
;;;;;; japanese-hankaku japanese-hiragana japanese-katakana setup-japanese-environment-internal)
-;;;;;; "japan-util" "language/japan-util.el" (20707 18685 911514
+;;;;;; "japan-util" "language/japan-util.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from language/japan-util.el
@@ -16372,7 +16352,7 @@ If non-nil, second arg INITIAL-INPUT is a string to insert before reading.
;;;***
;;;### (autoloads (jka-compr-uninstall jka-compr-handler) "jka-compr"
-;;;;;; "jka-compr.el" (20707 18685 911514 0))
+;;;;;; "jka-compr.el" (20759 33211 414988 0))
;;; Generated autoloads from jka-compr.el
(defvar jka-compr-inhibit nil "\
@@ -16395,7 +16375,7 @@ by `jka-compr-installed'.
;;;***
-;;;### (autoloads (js-mode) "js" "progmodes/js.el" (20707 18685 911514
+;;;### (autoloads (js-mode) "js" "progmodes/js.el" (20793 51383 764318
;;;;;; 0))
;;; Generated autoloads from progmodes/js.el
@@ -16403,14 +16383,13 @@ by `jka-compr-installed'.
Major mode for editing JavaScript.
\(fn)" t nil)
-
-(defalias 'javascript-mode 'js-mode)
+ (defalias 'javascript-mode 'js-mode)
;;;***
;;;### (autoloads (keypad-setup keypad-numlock-shifted-setup keypad-shifted-setup
;;;;;; keypad-numlock-setup keypad-setup) "keypad" "emulation/keypad.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emulation/keypad.el
(defvar keypad-setup nil "\
@@ -16466,7 +16445,7 @@ the decimal key on the keypad is mapped to DECIMAL instead of `.'
;;;***
;;;### (autoloads (kinsoku) "kinsoku" "international/kinsoku.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from international/kinsoku.el
(autoload 'kinsoku "kinsoku" "\
@@ -16487,8 +16466,8 @@ the context of text formatting.
;;;***
-;;;### (autoloads (kkc-region) "kkc" "international/kkc.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (kkc-region) "kkc" "international/kkc.el" (20799
+;;;;;; 169 640767 0))
;;; Generated autoloads from international/kkc.el
(defvar kkc-after-update-conversion-functions nil "\
@@ -16513,7 +16492,7 @@ and the return value is the length of the conversion.
;;;### (autoloads (kmacro-end-call-mouse kmacro-end-and-call-macro
;;;;;; kmacro-end-or-call-macro kmacro-start-macro-or-insert-counter
;;;;;; kmacro-call-macro kmacro-end-macro kmacro-start-macro kmacro-exec-ring-item)
-;;;;;; "kmacro" "kmacro.el" (20707 18685 911514 0))
+;;;;;; "kmacro" "kmacro.el" (20824 3367 300658 0))
;;; Generated autoloads from kmacro.el
(global-set-key "\C-x(" 'kmacro-start-macro)
(global-set-key "\C-x)" 'kmacro-end-macro)
@@ -16566,8 +16545,9 @@ An argument of zero means repeat until error.
\(fn ARG)" t nil)
(autoload 'kmacro-call-macro "kmacro" "\
-Call the last keyboard macro that you defined with \\[kmacro-start-macro].
+Call the keyboard MACRO that you defined with \\[kmacro-start-macro].
A prefix argument serves as a repeat count. Zero means repeat until error.
+MACRO defaults to `last-kbd-macro'.
When you call the macro, you can call the macro again by repeating
just the last key in the key sequence that you used to call this
@@ -16577,7 +16557,7 @@ for details on how to adjust or disable this behavior.
To make a macro permanent so you can call it even after defining
others, use \\[kmacro-name-last-macro].
-\(fn ARG &optional NO-REPEAT END-MACRO)" t nil)
+\(fn ARG &optional NO-REPEAT END-MACRO MACRO)" t nil)
(autoload 'kmacro-start-macro-or-insert-counter "kmacro" "\
Record subsequent keyboard input, defining a keyboard macro.
@@ -16624,7 +16604,7 @@ If kbd macro currently being defined end it before activating it.
;;;***
;;;### (autoloads (setup-korean-environment-internal) "korea-util"
-;;;;;; "language/korea-util.el" (20707 18685 911514 0))
+;;;;;; "language/korea-util.el" (20709 26818 907104 0))
;;; Generated autoloads from language/korea-util.el
(defvar default-korean-keyboard (purecopy (if (string-match "3" (or (getenv "HANGUL_KEYBOARD_TYPE") "")) "3" "")) "\
@@ -16639,7 +16619,7 @@ The kind of Korean keyboard for Korean input method.
;;;***
;;;### (autoloads (landmark landmark-test-run) "landmark" "play/landmark.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from play/landmark.el
(defalias 'landmark-repeat 'landmark-test-run)
@@ -16671,7 +16651,7 @@ Use \\[describe-mode] for more info.
;;;### (autoloads (lao-compose-region lao-composition-function lao-transcribe-roman-to-lao-string
;;;;;; lao-transcribe-single-roman-syllable-to-lao lao-compose-string)
-;;;;;; "lao-util" "language/lao-util.el" (20707 18685 911514 0))
+;;;;;; "lao-util" "language/lao-util.el" (20709 26818 907104 0))
;;; Generated autoloads from language/lao-util.el
(autoload 'lao-compose-string "lao-util" "\
@@ -16710,7 +16690,7 @@ Transcribe Romanized Lao string STR to Lao character string.
;;;### (autoloads (latexenc-find-file-coding-system latexenc-coding-system-to-inputenc
;;;;;; latexenc-inputenc-to-coding-system latex-inputenc-coding-alist)
-;;;;;; "latexenc" "international/latexenc.el" (20707 18685 911514
+;;;;;; "latexenc" "international/latexenc.el" (20799 169 640767
;;;;;; 0))
;;; Generated autoloads from international/latexenc.el
@@ -16743,8 +16723,8 @@ coding system names is determined from `latex-inputenc-coding-alist'.
;;;***
;;;### (autoloads (latin1-display-ucs-per-lynx latin1-display latin1-display)
-;;;;;; "latin1-disp" "international/latin1-disp.el" (20707 18685
-;;;;;; 911514 0))
+;;;;;; "latin1-disp" "international/latin1-disp.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from international/latin1-disp.el
(defvar latin1-display nil "\
@@ -16786,7 +16766,7 @@ use either \\[customize] or the function `latin1-display'.")
;;;***
;;;### (autoloads (ld-script-mode) "ld-script" "progmodes/ld-script.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/ld-script.el
(autoload 'ld-script-mode "ld-script" "\
@@ -16796,7 +16776,7 @@ A major mode to edit GNU ld script files
;;;***
-;;;### (autoloads (life) "life" "play/life.el" (20707 18685 911514
+;;;### (autoloads (life) "life" "play/life.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from play/life.el
@@ -16811,7 +16791,7 @@ generations (this defaults to 1).
;;;***
;;;### (autoloads (global-linum-mode linum-mode) "linum" "linum.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from linum.el
(autoload 'linum-mode "linum" "\
@@ -16847,8 +16827,8 @@ See `linum-mode' for more information on Linum mode.
;;;***
-;;;### (autoloads (unload-feature) "loadhist" "loadhist.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (unload-feature) "loadhist" "loadhist.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from loadhist.el
(autoload 'unload-feature "loadhist" "\
@@ -16880,7 +16860,7 @@ something strange, such as redefining an Emacs function.
;;;***
;;;### (autoloads (locate-with-filter locate locate-ls-subdir-switches)
-;;;;;; "locate" "locate.el" (20707 18685 911514 0))
+;;;;;; "locate" "locate.el" (20763 30266 231060 0))
;;; Generated autoloads from locate.el
(defvar locate-ls-subdir-switches (purecopy "-al") "\
@@ -16932,8 +16912,8 @@ except that FILTER is not optional.
;;;***
-;;;### (autoloads (log-edit) "log-edit" "vc/log-edit.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (log-edit) "log-edit" "vc/log-edit.el" (20721 17977
+;;;;;; 14204 0))
;;; Generated autoloads from vc/log-edit.el
(autoload 'log-edit "log-edit" "\
@@ -16964,8 +16944,8 @@ done. Otherwise, it uses the current buffer.
;;;***
-;;;### (autoloads (log-view-mode) "log-view" "vc/log-view.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (log-view-mode) "log-view" "vc/log-view.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from vc/log-view.el
(autoload 'log-view-mode "log-view" "\
@@ -16975,35 +16955,9 @@ Major mode for browsing CVS log output.
;;;***
-;;;### (autoloads (longlines-mode) "longlines" "longlines.el" (20707
-;;;;;; 18685 911514 0))
-;;; Generated autoloads from longlines.el
-
-(autoload 'longlines-mode "longlines" "\
-Toggle Long Lines mode in this buffer.
-With a prefix argument ARG, enable Long Lines mode if ARG is
-positive, and disable it otherwise. If called from Lisp, enable
-the mode if ARG is omitted or nil.
-
-When Long Lines mode is enabled, long lines are wrapped if they
-extend beyond `fill-column'. The soft newlines used for line
-wrapping will not show up when the text is yanked or saved to
-disk.
-
-If the variable `longlines-auto-wrap' is non-nil, lines are
-automatically wrapped whenever the buffer is changed. You can
-always call `fill-paragraph' to fill individual paragraphs.
-
-If the variable `longlines-show-hard-newlines' is non-nil, hard
-newlines are indicated with a symbol.
-
-\(fn &optional ARG)" t nil)
-
-;;;***
-
;;;### (autoloads (print-region lpr-region print-buffer lpr-buffer
-;;;;;; lpr-command lpr-switches printer-name) "lpr" "lpr.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; lpr-command lpr-switches printer-name) "lpr" "lpr.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from lpr.el
(defvar lpr-windows-system (memq system-type '(ms-dos windows-nt)) "\
@@ -17099,7 +17053,7 @@ for further customization of the printer command.
;;;***
;;;### (autoloads (ls-lisp-support-shell-wildcards) "ls-lisp" "ls-lisp.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from ls-lisp.el
(defvar ls-lisp-support-shell-wildcards t "\
@@ -17110,8 +17064,8 @@ Otherwise they are treated as Emacs regexps (for backward compatibility).")
;;;***
-;;;### (autoloads (lunar-phases) "lunar" "calendar/lunar.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (lunar-phases) "lunar" "calendar/lunar.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from calendar/lunar.el
(autoload 'lunar-phases "lunar" "\
@@ -17125,8 +17079,8 @@ This function is suitable for execution in an init file.
;;;***
-;;;### (autoloads (m4-mode) "m4-mode" "progmodes/m4-mode.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (m4-mode) "m4-mode" "progmodes/m4-mode.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from progmodes/m4-mode.el
(autoload 'm4-mode "m4-mode" "\
@@ -17137,7 +17091,7 @@ A major mode to edit m4 macro files.
;;;***
;;;### (autoloads (apply-macro-to-region-lines kbd-macro-query insert-kbd-macro
-;;;;;; name-last-kbd-macro) "macros" "macros.el" (20707 18685 911514
+;;;;;; name-last-kbd-macro) "macros" "macros.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from macros.el
@@ -17227,7 +17181,7 @@ and then select the region of un-tablified names and use
;;;***
;;;### (autoloads (what-domain mail-extract-address-components) "mail-extr"
-;;;;;; "mail/mail-extr.el" (20707 18685 911514 0))
+;;;;;; "mail/mail-extr.el" (20709 26818 907104 0))
;;; Generated autoloads from mail/mail-extr.el
(autoload 'mail-extract-address-components "mail-extr" "\
@@ -17259,7 +17213,7 @@ Convert mail domain DOMAIN to the country it corresponds to.
;;;### (autoloads (mail-hist-put-headers-into-history mail-hist-keep-history
;;;;;; mail-hist-enable mail-hist-define-keys) "mail-hist" "mail/mail-hist.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from mail/mail-hist.el
(autoload 'mail-hist-define-keys "mail-hist" "\
@@ -17291,7 +17245,7 @@ This function normally would be called when the message is sent.
;;;### (autoloads (mail-fetch-field mail-unquote-printable-region
;;;;;; mail-unquote-printable mail-quote-printable-region mail-quote-printable
;;;;;; mail-file-babyl-p mail-dont-reply-to-names mail-use-rfc822)
-;;;;;; "mail-utils" "mail/mail-utils.el" (20707 18685 911514 0))
+;;;;;; "mail-utils" "mail/mail-utils.el" (20709 26818 907104 0))
;;; Generated autoloads from mail/mail-utils.el
(defvar mail-use-rfc822 nil "\
@@ -17366,8 +17320,8 @@ matches may be returned from the message body.
;;;***
;;;### (autoloads (define-mail-abbrev build-mail-abbrevs mail-abbrevs-setup
-;;;;;; mail-abbrevs-mode) "mailabbrev" "mail/mailabbrev.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; mail-abbrevs-mode) "mailabbrev" "mail/mailabbrev.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from mail/mailabbrev.el
(defvar mail-abbrevs-mode nil "\
@@ -17418,7 +17372,7 @@ double-quotes.
;;;### (autoloads (mail-complete mail-completion-at-point-function
;;;;;; define-mail-alias expand-mail-aliases mail-complete-style)
-;;;;;; "mailalias" "mail/mailalias.el" (20707 18685 911514 0))
+;;;;;; "mailalias" "mail/mailalias.el" (20709 26818 907104 0))
;;; Generated autoloads from mail/mailalias.el
(defvar mail-complete-style 'angles "\
@@ -17467,12 +17421,12 @@ current header, calls `mail-complete-function' and passes prefix ARG if any.
\(fn ARG)" t nil)
-(make-obsolete 'mail-complete 'mail-completion-at-point-function "24.1")
+(make-obsolete 'mail-complete 'mail-completion-at-point-function '"24.1")
;;;***
;;;### (autoloads (mailclient-send-it) "mailclient" "mail/mailclient.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from mail/mailclient.el
(autoload 'mailclient-send-it "mailclient" "\
@@ -17486,7 +17440,8 @@ The mail client is taken to be the handler of mailto URLs.
;;;### (autoloads (makefile-imake-mode makefile-bsdmake-mode makefile-makepp-mode
;;;;;; makefile-gmake-mode makefile-automake-mode makefile-mode)
-;;;;;; "make-mode" "progmodes/make-mode.el" (20746 5161 430619 0))
+;;;;;; "make-mode" "progmodes/make-mode.el" (20748 62911 684442
+;;;;;; 0))
;;; Generated autoloads from progmodes/make-mode.el
(autoload 'makefile-mode "make-mode" "\
@@ -17603,8 +17558,8 @@ An adapted `makefile-mode' that knows about imake.
;;;***
-;;;### (autoloads (make-command-summary) "makesum" "makesum.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (make-command-summary) "makesum" "makesum.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from makesum.el
(autoload 'make-command-summary "makesum" "\
@@ -17616,7 +17571,7 @@ Previous contents of that buffer are killed first.
;;;***
;;;### (autoloads (Man-bookmark-jump man-follow man) "man" "man.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20762 9398 526093 0))
;;; Generated autoloads from man.el
(defalias 'manual-entry 'man)
@@ -17670,8 +17625,8 @@ Default bookmark handler for Man buffers.
;;;***
-;;;### (autoloads (master-mode) "master" "master.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (master-mode) "master" "master.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from master.el
(autoload 'master-mode "master" "\
@@ -17694,7 +17649,7 @@ yourself the value of `master-of' by calling `master-show-slave'.
;;;***
;;;### (autoloads (minibuffer-depth-indicate-mode) "mb-depth" "mb-depth.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from mb-depth.el
(defvar minibuffer-depth-indicate-mode nil "\
@@ -17727,7 +17682,7 @@ recursion depth in the minibuffer prompt. This is only useful if
;;;;;; message-forward-make-body message-forward message-recover
;;;;;; message-supersede message-cancel-news message-followup message-wide-reply
;;;;;; message-reply message-news message-mail message-mode) "message"
-;;;;;; "gnus/message.el" (20707 18685 911514 0))
+;;;;;; "gnus/message.el" (20808 15152 87827 0))
;;; Generated autoloads from gnus/message.el
(define-mail-user-agent 'message-user-agent 'message-mail 'message-send-and-exit 'message-kill-buffer 'message-send-hook)
@@ -17893,7 +17848,7 @@ which specify the range to operate on.
;;;***
;;;### (autoloads (metapost-mode metafont-mode) "meta-mode" "progmodes/meta-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/meta-mode.el
(autoload 'metafont-mode "meta-mode" "\
@@ -17910,7 +17865,7 @@ Major mode for editing MetaPost sources.
;;;### (autoloads (metamail-region metamail-buffer metamail-interpret-body
;;;;;; metamail-interpret-header) "metamail" "mail/metamail.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from mail/metamail.el
(autoload 'metamail-interpret-header "metamail" "\
@@ -17955,7 +17910,7 @@ redisplayed as output is inserted.
;;;### (autoloads (mh-fully-kill-draft mh-send-letter mh-user-agent-compose
;;;;;; mh-smail-batch mh-smail-other-window mh-smail) "mh-comp"
-;;;;;; "mh-e/mh-comp.el" (20707 18685 911514 0))
+;;;;;; "mh-e/mh-comp.el" (20787 12616 976036 0))
;;; Generated autoloads from mh-e/mh-comp.el
(autoload 'mh-smail "mh-comp" "\
@@ -18045,8 +18000,8 @@ delete the draft message.
;;;***
-;;;### (autoloads (mh-version) "mh-e" "mh-e/mh-e.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (mh-version) "mh-e" "mh-e/mh-e.el" (20787 12616
+;;;;;; 976036 0))
;;; Generated autoloads from mh-e/mh-e.el
(put 'mh-progs 'risky-local-variable t)
@@ -18063,7 +18018,7 @@ Display version information about MH-E and the MH mail handling system.
;;;***
;;;### (autoloads (mh-folder-mode mh-nmail mh-rmail) "mh-folder"
-;;;;;; "mh-e/mh-folder.el" (20707 18685 911514 0))
+;;;;;; "mh-e/mh-folder.el" (20787 12616 976036 0))
;;; Generated autoloads from mh-e/mh-folder.el
(autoload 'mh-rmail "mh-folder" "\
@@ -18145,7 +18100,7 @@ perform the operation on all messages in that region.
;;;***
;;;### (autoloads (midnight-delay-set clean-buffer-list) "midnight"
-;;;;;; "midnight.el" (20707 18685 911514 0))
+;;;;;; "midnight.el" (20709 26818 907104 0))
;;; Generated autoloads from midnight.el
(autoload 'clean-buffer-list "midnight" "\
@@ -18172,7 +18127,7 @@ to its second argument TM.
;;;***
;;;### (autoloads (minibuffer-electric-default-mode) "minibuf-eldef"
-;;;;;; "minibuf-eldef.el" (20707 18685 911514 0))
+;;;;;; "minibuf-eldef.el" (20760 54070 584283 0))
;;; Generated autoloads from minibuf-eldef.el
(defvar minibuffer-electric-default-mode nil "\
@@ -18202,7 +18157,7 @@ is modified to remove the default indication.
;;;***
;;;### (autoloads (list-dynamic-libraries butterfly) "misc" "misc.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from misc.el
(autoload 'butterfly "misc" "\
@@ -18232,7 +18187,7 @@ The return value is always nil.
;;;### (autoloads (multi-isearch-files-regexp multi-isearch-files
;;;;;; multi-isearch-buffers-regexp multi-isearch-buffers multi-isearch-setup)
-;;;;;; "misearch" "misearch.el" (20707 18685 911514 0))
+;;;;;; "misearch" "misearch.el" (20721 17977 14204 0))
;;; Generated autoloads from misearch.el
(add-hook 'isearch-mode-hook 'multi-isearch-setup)
@@ -18251,7 +18206,7 @@ end of the search space).
The first argument of this function is the current buffer where the
search is currently searching. It defines the base buffer relative to
which this function should find the next buffer. When the isearch
-direction is backward (when `isearch-forward' is nil), this function
+direction is backward (when option `isearch-forward' is nil), this function
should return the previous buffer to search.
If the second argument of this function WRAP is non-nil, then it
@@ -18314,7 +18269,7 @@ whose file names match the specified wildcard.
;;;***
;;;### (autoloads (mixal-mode) "mixal-mode" "progmodes/mixal-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/mixal-mode.el
(autoload 'mixal-mode "mixal-mode" "\
@@ -18325,7 +18280,7 @@ Major mode for the mixal asm language.
;;;***
;;;### (autoloads (mm-default-file-encoding) "mm-encode" "gnus/mm-encode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/mm-encode.el
(autoload 'mm-default-file-encoding "mm-encode" "\
@@ -18336,7 +18291,7 @@ Return a default encoding for FILE.
;;;***
;;;### (autoloads (mm-inline-external-body mm-extern-cache-contents)
-;;;;;; "mm-extern" "gnus/mm-extern.el" (20707 18685 911514 0))
+;;;;;; "mm-extern" "gnus/mm-extern.el" (20709 26818 907104 0))
;;; Generated autoloads from gnus/mm-extern.el
(autoload 'mm-extern-cache-contents "mm-extern" "\
@@ -18355,7 +18310,7 @@ If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing.
;;;***
;;;### (autoloads (mm-inline-partial) "mm-partial" "gnus/mm-partial.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/mm-partial.el
(autoload 'mm-inline-partial "mm-partial" "\
@@ -18369,7 +18324,7 @@ If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing.
;;;***
;;;### (autoloads (mm-url-insert-file-contents-external mm-url-insert-file-contents)
-;;;;;; "mm-url" "gnus/mm-url.el" (20707 18685 911514 0))
+;;;;;; "mm-url" "gnus/mm-url.el" (20709 26818 907104 0))
;;; Generated autoloads from gnus/mm-url.el
(autoload 'mm-url-insert-file-contents "mm-url" "\
@@ -18386,7 +18341,7 @@ Insert file contents of URL using `mm-url-program'.
;;;***
;;;### (autoloads (mm-uu-dissect-text-parts mm-uu-dissect) "mm-uu"
-;;;;;; "gnus/mm-uu.el" (20707 18685 911514 0))
+;;;;;; "gnus/mm-uu.el" (20709 26818 907104 0))
;;; Generated autoloads from gnus/mm-uu.el
(autoload 'mm-uu-dissect "mm-uu" "\
@@ -18406,7 +18361,7 @@ Assume text has been decoded if DECODED is non-nil.
;;;***
;;;### (autoloads (mml-attach-file mml-to-mime) "mml" "gnus/mml.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20745 310 425822 0))
;;; Generated autoloads from gnus/mml.el
(autoload 'mml-to-mime "mml" "\
@@ -18432,7 +18387,7 @@ body) or \"attachment\" (separate from the body).
;;;***
;;;### (autoloads (mml1991-sign mml1991-encrypt) "mml1991" "gnus/mml1991.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20791 9657 561026 0))
;;; Generated autoloads from gnus/mml1991.el
(autoload 'mml1991-encrypt "mml1991" "\
@@ -18449,7 +18404,7 @@ body) or \"attachment\" (separate from the body).
;;;### (autoloads (mml2015-self-encrypt mml2015-sign mml2015-encrypt
;;;;;; mml2015-verify-test mml2015-verify mml2015-decrypt-test mml2015-decrypt)
-;;;;;; "mml2015" "gnus/mml2015.el" (20707 18685 911514 0))
+;;;;;; "mml2015" "gnus/mml2015.el" (20780 39352 990623 0))
;;; Generated autoloads from gnus/mml2015.el
(autoload 'mml2015-decrypt "mml2015" "\
@@ -18489,16 +18444,16 @@ body) or \"attachment\" (separate from the body).
;;;***
-;;;### (autoloads nil "mode-local" "cedet/mode-local.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads nil "mode-local" "cedet/mode-local.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from cedet/mode-local.el
(put 'define-overloadable-function 'doc-string-elt 3)
;;;***
-;;;### (autoloads (m2-mode) "modula2" "progmodes/modula2.el" (20627
-;;;;;; 28531 447943 0))
+;;;### (autoloads (m2-mode) "modula2" "progmodes/modula2.el" (20355
+;;;;;; 10021 546955 0))
;;; Generated autoloads from progmodes/modula2.el
(defalias 'modula-2-mode 'm2-mode)
@@ -18532,7 +18487,7 @@ followed by the first character of the construct.
;;;***
;;;### (autoloads (denato-region nato-region unmorse-region morse-region)
-;;;;;; "morse" "play/morse.el" (20707 18685 911514 0))
+;;;;;; "morse" "play/morse.el" (20709 26818 907104 0))
;;; Generated autoloads from play/morse.el
(autoload 'morse-region "morse" "\
@@ -18558,7 +18513,7 @@ Convert NATO phonetic alphabet in region to ordinary ASCII text.
;;;***
;;;### (autoloads (mouse-drag-drag mouse-drag-throw) "mouse-drag"
-;;;;;; "mouse-drag.el" (20707 18685 911514 0))
+;;;;;; "mouse-drag.el" (20709 26818 907104 0))
;;; Generated autoloads from mouse-drag.el
(autoload 'mouse-drag-throw "mouse-drag" "\
@@ -18605,7 +18560,7 @@ To test this function, evaluate:
;;;***
-;;;### (autoloads (mpc) "mpc" "mpc.el" (20707 18685 911514 0))
+;;;### (autoloads (mpc) "mpc" "mpc.el" (20822 48073 524485 0))
;;; Generated autoloads from mpc.el
(autoload 'mpc "mpc" "\
@@ -18615,7 +18570,7 @@ Main entry point for MPC.
;;;***
-;;;### (autoloads (mpuz) "mpuz" "play/mpuz.el" (20707 18685 911514
+;;;### (autoloads (mpuz) "mpuz" "play/mpuz.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from play/mpuz.el
@@ -18626,7 +18581,7 @@ Multiplication puzzle with GNU Emacs.
;;;***
-;;;### (autoloads (msb-mode) "msb" "msb.el" (20707 18685 911514 0))
+;;;### (autoloads (msb-mode) "msb" "msb.el" (20709 26818 907104 0))
;;; Generated autoloads from msb.el
(defvar msb-mode nil "\
@@ -18656,7 +18611,7 @@ different buffer menu using the function `msb'.
;;;;;; describe-current-coding-system describe-current-coding-system-briefly
;;;;;; describe-coding-system describe-character-set list-charset-chars
;;;;;; read-charset list-character-sets) "mule-diag" "international/mule-diag.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from international/mule-diag.el
(autoload 'list-character-sets "mule-diag" "\
@@ -18793,7 +18748,7 @@ The default is 20. If LIMIT is negative, do not limit the listing.
;;;;;; coding-system-translation-table-for-decode coding-system-pre-write-conversion
;;;;;; coding-system-post-read-conversion lookup-nested-alist set-nested-alist
;;;;;; truncate-string-to-width store-substring) "mule-util" "international/mule-util.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from international/mule-util.el
(defsubst string-to-list (string) "\
@@ -18904,7 +18859,7 @@ coding systems ordered by priority.
\(fn FROM TO PRIORITY-LIST)" nil t)
-(make-obsolete 'detect-coding-with-priority 'with-coding-priority "23.1")
+(make-obsolete 'detect-coding-with-priority 'with-coding-priority '"23.1")
(autoload 'detect-coding-with-language-environment "mule-util" "\
Detect a coding system for the text between FROM and TO with LANG-ENV.
@@ -18924,11 +18879,88 @@ per-character basis, this may not be accurate.
;;;***
+;;;### (autoloads (advice-member-p advice-remove advice-add advice--add-function
+;;;;;; add-function advice--buffer-local advice--remove-function)
+;;;;;; "nadvice" "emacs-lisp/nadvice.el" (20785 57270 519804 0))
+;;; Generated autoloads from emacs-lisp/nadvice.el
+
+(autoload 'advice--remove-function "nadvice" "\
+
+
+\(fn FLIST FUNCTION)" nil nil)
+
+(autoload 'advice--buffer-local "nadvice" "\
+Buffer-local value of VAR, presumed to contain a function.
+
+\(fn VAR)" nil nil)
+
+(autoload 'add-function "nadvice" "\
+Add a piece of advice on the function stored at PLACE.
+FUNCTION describes the code to add. WHERE describes where to add it.
+WHERE can be explained by showing the resulting new function, as the
+result of combining FUNCTION and the previous value of PLACE, which we
+call OLDFUN here:
+`:before' (lambda (&rest r) (apply FUNCTION r) (apply OLDFUN r))
+`:after' (lambda (&rest r) (prog1 (apply OLDFUN r) (apply FUNCTION r)))
+`:around' (lambda (&rest r) (apply FUNCTION OLDFUN r))
+`:before-while' (lambda (&rest r) (and (apply FUNCTION r) (apply OLDFUN r)))
+`:before-until' (lambda (&rest r) (or (apply FUNCTION r) (apply OLDFUN r)))
+`:after-while' (lambda (&rest r) (and (apply OLDFUN r) (apply FUNCTION r)))
+`:after-until' (lambda (&rest r) (or (apply OLDFUN r) (apply FUNCTION r)))
+If FUNCTION was already added, do nothing.
+PROPS is an alist of additional properties, among which the following have
+a special meaning:
+- `name': a string or symbol. It can be used to refer to this piece of advice.
+
+PLACE cannot be a simple variable. Instead it should either be
+\(default-value 'VAR) or (local 'VAR) depending on whether FUNCTION
+should be applied to VAR buffer-locally or globally.
+
+If one of FUNCTION or OLDFUN is interactive, then the resulting function
+is also interactive. There are 3 cases:
+- FUNCTION is not interactive: the interactive spec of OLDFUN is used.
+- The interactive spec of FUNCTION is itself a function: it should take one
+ argument (the interactive spec of OLDFUN, which it can pass to
+ `advice-eval-interactive-spec') and return the list of arguments to use.
+- Else, use the interactive spec of FUNCTION and ignore the one of OLDFUN.
+
+\(fn WHERE PLACE FUNCTION &optional PROPS)" nil t)
+
+(autoload 'advice--add-function "nadvice" "\
+
+
+\(fn WHERE REF FUNCTION PROPS)" nil nil)
+
+(autoload 'advice-add "nadvice" "\
+Like `add-function' but for the function named SYMBOL.
+Contrary to `add-function', this will properly handle the cases where SYMBOL
+is defined as a macro, alias, command, ...
+
+\(fn SYMBOL WHERE FUNCTION &optional PROPS)" nil nil)
+
+(autoload 'advice-remove "nadvice" "\
+Like `remove-function' but for the function named SYMBOL.
+Contrary to `remove-function', this will work also when SYMBOL is a macro
+and it will not signal an error if SYMBOL is not `fboundp'.
+Instead of the actual function to remove, FUNCTION can also be the `name'
+of the piece of advice.
+
+\(fn SYMBOL FUNCTION)" nil nil)
+
+(autoload 'advice-member-p "nadvice" "\
+Return non-nil if ADVICE has been added to FUNCTION-NAME.
+Instead of ADVICE being the actual function, it can also be the `name'
+of the piece of advice.
+
+\(fn ADVICE FUNCTION-NAME)" nil nil)
+
+;;;***
+
;;;### (autoloads (network-connection network-connection-to-service
;;;;;; whois-reverse-lookup whois finger ftp run-dig dns-lookup-host
;;;;;; nslookup nslookup-host ping traceroute route arp netstat
-;;;;;; iwconfig ifconfig) "net-utils" "net/net-utils.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; iwconfig ifconfig) "net-utils" "net/net-utils.el" (20799
+;;;;;; 169 640767 0))
;;; Generated autoloads from net/net-utils.el
(autoload 'ifconfig "net-utils" "\
@@ -19022,8 +19054,8 @@ Open a network connection to HOST on PORT.
;;;***
-;;;### (autoloads (netrc-credentials) "netrc" "net/netrc.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (netrc-credentials) "netrc" "net/netrc.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from net/netrc.el
(autoload 'netrc-credentials "netrc" "\
@@ -19036,7 +19068,7 @@ listed in the PORTS list.
;;;***
;;;### (autoloads (open-network-stream) "network-stream" "net/network-stream.el"
-;;;;;; (20766 62090 677076 128000))
+;;;;;; (20770 3512 176098 0))
;;; Generated autoloads from net/network-stream.el
(autoload 'open-network-stream "network-stream" "\
@@ -19127,7 +19159,7 @@ STARTTLS upgrades even if Emacs doesn't have built-in TLS functionality.
;;;***
;;;### (autoloads (newsticker-start newsticker-running-p) "newst-backend"
-;;;;;; "net/newst-backend.el" (20707 18685 911514 0))
+;;;;;; "net/newst-backend.el" (20709 26818 907104 0))
;;; Generated autoloads from net/newst-backend.el
(autoload 'newsticker-running-p "newst-backend" "\
@@ -19149,7 +19181,7 @@ Run `newsticker-start-hook' if newsticker was not running already.
;;;***
;;;### (autoloads (newsticker-plainview) "newst-plainview" "net/newst-plainview.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20762 9398 526093 0))
;;; Generated autoloads from net/newst-plainview.el
(autoload 'newsticker-plainview "newst-plainview" "\
@@ -19160,7 +19192,7 @@ Start newsticker plainview.
;;;***
;;;### (autoloads (newsticker-show-news) "newst-reader" "net/newst-reader.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from net/newst-reader.el
(autoload 'newsticker-show-news "newst-reader" "\
@@ -19171,7 +19203,7 @@ Start reading news. You may want to bind this to a key.
;;;***
;;;### (autoloads (newsticker-start-ticker newsticker-ticker-running-p)
-;;;;;; "newst-ticker" "net/newst-ticker.el" (20707 18685 911514
+;;;;;; "newst-ticker" "net/newst-ticker.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from net/newst-ticker.el
@@ -19193,7 +19225,7 @@ running already.
;;;***
;;;### (autoloads (newsticker-treeview) "newst-treeview" "net/newst-treeview.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from net/newst-treeview.el
(autoload 'newsticker-treeview "newst-treeview" "\
@@ -19204,7 +19236,7 @@ Start newsticker treeview.
;;;***
;;;### (autoloads (nndiary-generate-nov-databases) "nndiary" "gnus/nndiary.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/nndiary.el
(autoload 'nndiary-generate-nov-databases "nndiary" "\
@@ -19214,8 +19246,8 @@ Generate NOV databases in all nndiary directories.
;;;***
-;;;### (autoloads (nndoc-add-type) "nndoc" "gnus/nndoc.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (nndoc-add-type) "nndoc" "gnus/nndoc.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from gnus/nndoc.el
(autoload 'nndoc-add-type "nndoc" "\
@@ -19230,7 +19262,7 @@ symbol in the alist.
;;;***
;;;### (autoloads (nnfolder-generate-active-file) "nnfolder" "gnus/nnfolder.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/nnfolder.el
(autoload 'nnfolder-generate-active-file "nnfolder" "\
@@ -19242,7 +19274,7 @@ This command does not work if you use short group names.
;;;***
;;;### (autoloads (nnml-generate-nov-databases) "nnml" "gnus/nnml.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/nnml.el
(autoload 'nnml-generate-nov-databases "nnml" "\
@@ -19253,7 +19285,7 @@ Generate NOV databases in all nnml directories.
;;;***
;;;### (autoloads (disable-command enable-command disabled-command-function)
-;;;;;; "novice" "novice.el" (20707 18685 911514 0))
+;;;;;; "novice" "novice.el" (20709 26818 907104 0))
;;; Generated autoloads from novice.el
(define-obsolete-variable-alias 'disabled-command-hook 'disabled-command-function "22.1")
@@ -19286,7 +19318,7 @@ future sessions.
;;;***
;;;### (autoloads (nroff-mode) "nroff-mode" "textmodes/nroff-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from textmodes/nroff-mode.el
(autoload 'nroff-mode "nroff-mode" "\
@@ -19301,7 +19333,7 @@ closing requests for requests that are used in matched pairs.
;;;***
;;;### (autoloads (nxml-glyph-display-string) "nxml-glyph" "nxml/nxml-glyph.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from nxml/nxml-glyph.el
(autoload 'nxml-glyph-display-string "nxml-glyph" "\
@@ -19313,8 +19345,8 @@ Return nil if the face cannot display a glyph for N.
;;;***
-;;;### (autoloads (nxml-mode) "nxml-mode" "nxml/nxml-mode.el" (20763
-;;;;;; 5110 492774 0))
+;;;### (autoloads (nxml-mode) "nxml-mode" "nxml/nxml-mode.el" (20813
+;;;;;; 33065 721081 0))
;;; Generated autoloads from nxml/nxml-mode.el
(autoload 'nxml-mode "nxml-mode" "\
@@ -19376,7 +19408,7 @@ Many aspects this mode can be customized using
;;;***
;;;### (autoloads (nxml-enable-unicode-char-name-sets) "nxml-uchnm"
-;;;;;; "nxml/nxml-uchnm.el" (20707 18685 911514 0))
+;;;;;; "nxml/nxml-uchnm.el" (20709 26818 907104 0))
;;; Generated autoloads from nxml/nxml-uchnm.el
(autoload 'nxml-enable-unicode-char-name-sets "nxml-uchnm" "\
@@ -19389,7 +19421,7 @@ the variable `nxml-enabled-unicode-blocks'.
;;;***
;;;### (autoloads (inferior-octave) "octave-inf" "progmodes/octave-inf.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/octave-inf.el
(autoload 'inferior-octave "octave-inf" "\
@@ -19412,7 +19444,7 @@ startup file, `~/.emacs-octave'.
;;;***
;;;### (autoloads (octave-mode) "octave-mod" "progmodes/octave-mod.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/octave-mod.el
(autoload 'octave-mode "octave-mod" "\
@@ -19494,13 +19526,61 @@ including a reproducible test case and send the message.
;;;***
+;;;### (autoloads (opascal-mode) "opascal" "progmodes/opascal.el"
+;;;;;; (20746 21181 635406 0))
+;;; Generated autoloads from progmodes/opascal.el
+
+(define-obsolete-function-alias 'delphi-mode 'opascal-mode "24.4")
+
+(autoload 'opascal-mode "opascal" "\
+Major mode for editing OPascal code. \\<opascal-mode-map>
+\\[opascal-find-unit] - Search for a OPascal source file.
+\\[opascal-fill-comment] - Fill the current comment.
+\\[opascal-new-comment-line] - If in a // comment, do a new comment line.
+
+\\[indent-region] also works for indenting a whole region.
+
+Customization:
+
+ `opascal-indent-level' (default 3)
+ Indentation of OPascal statements with respect to containing block.
+ `opascal-compound-block-indent' (default 0)
+ Extra indentation for blocks in compound statements.
+ `opascal-case-label-indent' (default 0)
+ Extra indentation for case statement labels.
+ `opascal-tab-always-indents' (default `tab-always-indents')
+ Non-nil means TAB in OPascal mode should always reindent the current line,
+ regardless of where in the line point is when the TAB command is used.
+ `opascal-search-path' (default .)
+ Directories to search when finding external units.
+ `opascal-verbose' (default nil)
+ If true then OPascal token processing progress is reported to the user.
+
+Coloring:
+
+ `opascal-comment-face' (default font-lock-comment-face)
+ Face used to color OPascal comments.
+ `opascal-string-face' (default font-lock-string-face)
+ Face used to color OPascal strings.
+ `opascal-keyword-face' (default font-lock-keyword-face)
+ Face used to color OPascal keywords.
+ `opascal-other-face' (default nil)
+ Face used to color everything else.
+
+Turning on OPascal mode calls the value of the variable `opascal-mode-hook'
+with no args, if that value is non-nil.
+
+\(fn)" t nil)
+
+;;;***
+
;;;### (autoloads (org-customize org-reload org-submit-bug-report
;;;;;; org-cycle-agenda-files org-switchb org-open-link-from-string
;;;;;; org-open-at-point-global org-insert-link-global org-store-link
;;;;;; org-run-like-in-org-mode turn-on-orgstruct++ turn-on-orgstruct
;;;;;; orgstruct-mode org-global-cycle org-cycle org-mode org-clock-persistence-insinuate
;;;;;; turn-on-orgtbl org-version org-babel-do-load-languages) "org"
-;;;;;; "org/org.el" (20782 62165 534425 0))
+;;;;;; "org/org.el" (20783 15545 430927 0))
;;; Generated autoloads from org/org.el
(autoload 'org-babel-do-load-languages "org" "\
@@ -19726,7 +19806,7 @@ Call the customize function with org as argument.
;;;;;; org-search-view org-agenda-list org-batch-store-agenda-views
;;;;;; org-store-agenda-views org-batch-agenda-csv org-batch-agenda
;;;;;; org-agenda org-toggle-sticky-agenda) "org-agenda" "org/org-agenda.el"
-;;;;;; (20782 62165 534425 0))
+;;;;;; (20783 15545 430927 0))
;;; Generated autoloads from org/org-agenda.el
(autoload 'org-toggle-sticky-agenda "org-agenda" "\
@@ -19983,7 +20063,7 @@ to override `appt-message-warning-time'.
;;;***
;;;### (autoloads (org-beamer-mode org-beamer-sectioning) "org-beamer"
-;;;;;; "org/org-beamer.el" (20707 18685 911514 0))
+;;;;;; "org/org-beamer.el" (20709 26818 907104 0))
;;; Generated autoloads from org/org-beamer.el
(autoload 'org-beamer-sectioning "org-beamer" "\
@@ -20006,7 +20086,7 @@ Special support for editing Org-mode files made to export to beamer.
;;;### (autoloads (org-capture-import-remember-templates org-capture
;;;;;; org-capture-string) "org-capture" "org/org-capture.el" (20723
-;;;;;; 1786 641767 0))
+;;;;;; 59703 12265 0))
;;; Generated autoloads from org/org-capture.el
(autoload 'org-capture-string "org-capture" "\
@@ -20047,8 +20127,8 @@ Set org-capture-templates to be similar to `org-remember-templates'.
;;;***
;;;### (autoloads (org-agenda-columns org-insert-columns-dblock org-dblock-write:columnview
-;;;;;; org-columns) "org-colview" "org/org-colview.el" (20716 21904
-;;;;;; 19206 0))
+;;;;;; org-columns) "org-colview" "org/org-colview.el" (20717 20920
+;;;;;; 410005 0))
;;; Generated autoloads from org/org-colview.el
(autoload 'org-columns "org-colview" "\
@@ -20092,7 +20172,7 @@ Turn on or update column view in the agenda.
;;;***
;;;### (autoloads (org-check-version) "org-compat" "org/org-compat.el"
-;;;;;; (20723 1786 641767 0))
+;;;;;; (20723 59703 12265 0))
;;; Generated autoloads from org/org-compat.el
(autoload 'org-check-version "org-compat" "\
@@ -20103,7 +20183,7 @@ Try very hard to provide sensible version strings.
;;;***
;;;### (autoloads (org-git-version org-release) "org-version" "org/org-version.el"
-;;;;;; (20782 62165 534425 0))
+;;;;;; (20783 15545 430927 0))
;;; Generated autoloads from org/org-version.el
(autoload 'org-release "org-version" "\
@@ -20124,7 +20204,7 @@ The location of ODT styles.")
;;;***
;;;### (autoloads (outline-minor-mode outline-mode) "outline" "outline.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20773 35190 350513 0))
;;; Generated autoloads from outline.el
(put 'outline-regexp 'safe-local-variable 'stringp)
(put 'outline-heading-end-regexp 'safe-local-variable 'stringp)
@@ -20188,7 +20268,7 @@ See the command `outline-mode' for more information on this mode.
;;;### (autoloads (list-packages describe-package package-initialize
;;;;;; package-refresh-contents package-install-file package-install-from-buffer
;;;;;; package-install package-enable-at-startup) "package" "emacs-lisp/package.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20764 51137 83502 0))
;;; Generated autoloads from emacs-lisp/package.el
(defvar package-enable-at-startup t "\
@@ -20258,8 +20338,8 @@ The list is displayed in a buffer named `*Packages*'.
;;;***
-;;;### (autoloads (show-paren-mode) "paren" "paren.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (show-paren-mode) "paren" "paren.el" (20738 27061
+;;;;;; 124069 0))
;;; Generated autoloads from paren.el
(defvar show-paren-mode nil "\
@@ -20286,7 +20366,7 @@ matching parenthesis is highlighted in `show-paren-style' after
;;;***
;;;### (autoloads (parse-time-string) "parse-time" "calendar/parse-time.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from calendar/parse-time.el
(put 'parse-time-rules 'risky-local-variable t)
@@ -20299,8 +20379,8 @@ unknown are returned as nil.
;;;***
-;;;### (autoloads (pascal-mode) "pascal" "progmodes/pascal.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (pascal-mode) "pascal" "progmodes/pascal.el" (20746
+;;;;;; 21181 635406 0))
;;; Generated autoloads from progmodes/pascal.el
(autoload 'pascal-mode "pascal" "\
@@ -20353,7 +20433,7 @@ no args, if that value is non-nil.
;;;***
;;;### (autoloads (password-in-cache-p password-cache-expiry password-cache)
-;;;;;; "password-cache" "password-cache.el" (20707 18685 911514
+;;;;;; "password-cache" "password-cache.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from password-cache.el
@@ -20376,7 +20456,7 @@ Check if KEY is in the cache.
;;;***
;;;### (autoloads (pcase-let pcase-let* pcase) "pcase" "emacs-lisp/pcase.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20717 20920 410005 0))
;;; Generated autoloads from emacs-lisp/pcase.el
(autoload 'pcase "pcase" "\
@@ -20437,8 +20517,8 @@ of the form (UPAT EXP).
;;;***
-;;;### (autoloads (pcomplete/cvs) "pcmpl-cvs" "pcmpl-cvs.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (pcomplete/cvs) "pcmpl-cvs" "pcmpl-cvs.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from pcmpl-cvs.el
(autoload 'pcomplete/cvs "pcmpl-cvs" "\
@@ -20449,7 +20529,7 @@ Completion rules for the `cvs' command.
;;;***
;;;### (autoloads (pcomplete/tar pcomplete/make pcomplete/bzip2 pcomplete/gzip)
-;;;;;; "pcmpl-gnu" "pcmpl-gnu.el" (20707 18685 911514 0))
+;;;;;; "pcmpl-gnu" "pcmpl-gnu.el" (20709 26818 907104 0))
;;; Generated autoloads from pcmpl-gnu.el
(autoload 'pcomplete/gzip "pcmpl-gnu" "\
@@ -20477,7 +20557,7 @@ Completion for the GNU tar utility.
;;;***
;;;### (autoloads (pcomplete/mount pcomplete/umount pcomplete/kill)
-;;;;;; "pcmpl-linux" "pcmpl-linux.el" (20707 18685 911514 0))
+;;;;;; "pcmpl-linux" "pcmpl-linux.el" (20709 26818 907104 0))
;;; Generated autoloads from pcmpl-linux.el
(autoload 'pcomplete/kill "pcmpl-linux" "\
@@ -20497,8 +20577,8 @@ Completion for GNU/Linux `mount'.
;;;***
-;;;### (autoloads (pcomplete/rpm) "pcmpl-rpm" "pcmpl-rpm.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (pcomplete/rpm) "pcmpl-rpm" "pcmpl-rpm.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from pcmpl-rpm.el
(autoload 'pcomplete/rpm "pcmpl-rpm" "\
@@ -20510,7 +20590,7 @@ Completion for the `rpm' command.
;;;### (autoloads (pcomplete/scp pcomplete/ssh pcomplete/chgrp pcomplete/chown
;;;;;; pcomplete/which pcomplete/xargs pcomplete/rm pcomplete/rmdir
-;;;;;; pcomplete/cd) "pcmpl-unix" "pcmpl-unix.el" (20707 18685 911514
+;;;;;; pcomplete/cd) "pcmpl-unix" "pcmpl-unix.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from pcmpl-unix.el
@@ -20568,8 +20648,8 @@ Includes files as well as host names followed by a colon.
;;;### (autoloads (pcomplete-shell-setup pcomplete-comint-setup pcomplete-list
;;;;;; pcomplete-help pcomplete-expand pcomplete-continue pcomplete-expand-and-complete
-;;;;;; pcomplete-reverse pcomplete) "pcomplete" "pcomplete.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; pcomplete-reverse pcomplete) "pcomplete" "pcomplete.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from pcomplete.el
(autoload 'pcomplete "pcomplete" "\
@@ -20628,7 +20708,7 @@ Setup `shell-mode' to use pcomplete.
;;;### (autoloads (cvs-dired-use-hook cvs-dired-action cvs-status
;;;;;; cvs-update cvs-examine cvs-quickdir cvs-checkout) "pcvs"
-;;;;;; "vc/pcvs.el" (20707 18685 911514 0))
+;;;;;; "vc/pcvs.el" (20717 20920 410005 0))
;;; Generated autoloads from vc/pcvs.el
(autoload 'cvs-checkout "pcvs" "\
@@ -20703,8 +20783,8 @@ The exact behavior is determined also by `cvs-dired-use-hook'." (when (stringp d
;;;***
-;;;### (autoloads nil "pcvs-defs" "vc/pcvs-defs.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads nil "pcvs-defs" "vc/pcvs-defs.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from vc/pcvs-defs.el
(defvar cvs-global-menu (let ((m (make-sparse-keymap "PCL-CVS"))) (define-key m [status] `(menu-item ,(purecopy "Directory Status") cvs-status :help ,(purecopy "A more verbose status of a workarea"))) (define-key m [checkout] `(menu-item ,(purecopy "Checkout Module") cvs-checkout :help ,(purecopy "Check out a module from the repository"))) (define-key m [update] `(menu-item ,(purecopy "Update Directory") cvs-update :help ,(purecopy "Fetch updates from the repository"))) (define-key m [examine] `(menu-item ,(purecopy "Examine Directory") cvs-examine :help ,(purecopy "Examine the current state of a workarea"))) (fset 'cvs-global-menu m)) "\
@@ -20713,7 +20793,7 @@ Global menu used by PCL-CVS.")
;;;***
;;;### (autoloads (perl-mode) "perl-mode" "progmodes/perl-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/perl-mode.el
(put 'perl-indent-level 'safe-local-variable 'integerp)
(put 'perl-continued-statement-offset 'safe-local-variable 'integerp)
@@ -20775,7 +20855,7 @@ Turning on Perl mode runs the normal hook `perl-mode-hook'.
;;;***
;;;### (autoloads (picture-mode) "picture" "textmodes/picture.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from textmodes/picture.el
(autoload 'picture-mode "picture" "\
@@ -20856,7 +20936,7 @@ they are not by default assigned to keys.
;;;***
;;;### (autoloads (plstore-mode plstore-open) "plstore" "gnus/plstore.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/plstore.el
(autoload 'plstore-open "plstore" "\
@@ -20872,7 +20952,7 @@ Major mode for editing PLSTORE files.
;;;***
;;;### (autoloads (po-find-file-coding-system) "po" "textmodes/po.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20791 9657 561026 0))
;;; Generated autoloads from textmodes/po.el
(autoload 'po-find-file-coding-system "po" "\
@@ -20883,7 +20963,7 @@ Called through `file-coding-system-alist', before the file is visited for real.
;;;***
-;;;### (autoloads (pong) "pong" "play/pong.el" (20707 18685 911514
+;;;### (autoloads (pong) "pong" "play/pong.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from play/pong.el
@@ -20900,8 +20980,8 @@ pong-mode keybindings:\\<pong-mode-map>
;;;***
-;;;### (autoloads (pop3-movemail) "pop3" "gnus/pop3.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (pop3-movemail) "pop3" "gnus/pop3.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from gnus/pop3.el
(autoload 'pop3-movemail "pop3" "\
@@ -20914,7 +20994,7 @@ Use streaming commands.
;;;### (autoloads (pp-macroexpand-last-sexp pp-eval-last-sexp pp-macroexpand-expression
;;;;;; pp-eval-expression pp pp-buffer pp-to-string) "pp" "emacs-lisp/pp.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/pp.el
(autoload 'pp-to-string "pp" "\
@@ -20982,7 +21062,7 @@ Ignores leading comment characters.
;;;;;; pr-ps-buffer-print pr-ps-buffer-using-ghostscript pr-ps-buffer-preview
;;;;;; pr-ps-directory-ps-print pr-ps-directory-print pr-ps-directory-using-ghostscript
;;;;;; pr-ps-directory-preview pr-interface) "printing" "printing.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20721 17977 14204 0))
;;; Generated autoloads from printing.el
(autoload 'pr-interface "printing" "\
@@ -21569,7 +21649,7 @@ are both set to t.
;;;***
-;;;### (autoloads (proced) "proced" "proced.el" (20707 18685 911514
+;;;### (autoloads (proced) "proced" "proced.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from proced.el
@@ -21590,7 +21670,7 @@ Proced buffers.
;;;### (autoloads (profiler-find-profile-other-frame profiler-find-profile-other-window
;;;;;; profiler-find-profile profiler-start) "profiler" "profiler.el"
-;;;;;; (20731 13121 306545 521000))
+;;;;;; (20824 3367 300658 0))
;;; Generated autoloads from profiler.el
(autoload 'profiler-start "profiler" "\
@@ -21619,7 +21699,7 @@ Open profile FILENAME.
;;;***
;;;### (autoloads (run-prolog mercury-mode prolog-mode) "prolog"
-;;;;;; "progmodes/prolog.el" (20707 18685 911514 0))
+;;;;;; "progmodes/prolog.el" (20791 9657 561026 0))
;;; Generated autoloads from progmodes/prolog.el
(autoload 'prolog-mode "prolog" "\
@@ -21654,8 +21734,8 @@ With prefix argument ARG, restart the Prolog process if running before.
;;;***
-;;;### (autoloads (bdf-directory-list) "ps-bdf" "ps-bdf.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (bdf-directory-list) "ps-bdf" "ps-bdf.el" (20799
+;;;;;; 169 640767 0))
;;; Generated autoloads from ps-bdf.el
(defvar bdf-directory-list (if (memq system-type '(ms-dos windows-nt)) (list (expand-file-name "fonts/bdf" installation-directory)) '("/usr/local/share/emacs/fonts/bdf")) "\
@@ -21666,8 +21746,8 @@ The default value is '(\"/usr/local/share/emacs/fonts/bdf\").")
;;;***
-;;;### (autoloads (ps-mode) "ps-mode" "progmodes/ps-mode.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (ps-mode) "ps-mode" "progmodes/ps-mode.el" (20777
+;;;;;; 63161 848428 0))
;;; Generated autoloads from progmodes/ps-mode.el
(autoload 'ps-mode "ps-mode" "\
@@ -21718,8 +21798,8 @@ Typing \\<ps-run-mode-map>\\[ps-run-goto-error] when the cursor is at the number
;;;;;; ps-spool-region ps-spool-buffer-with-faces ps-spool-buffer
;;;;;; ps-print-region-with-faces ps-print-region ps-print-buffer-with-faces
;;;;;; ps-print-buffer ps-print-customize ps-print-color-p ps-paper-type
-;;;;;; ps-page-dimensions-database) "ps-print" "ps-print.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; ps-page-dimensions-database) "ps-print" "ps-print.el" (20721
+;;;;;; 17977 14204 0))
;;; Generated autoloads from ps-print.el
(defvar ps-page-dimensions-database (purecopy (list (list 'a4 (/ (* 72 21.0) 2.54) (/ (* 72 29.7) 2.54) "A4") (list 'a3 (/ (* 72 29.7) 2.54) (/ (* 72 42.0) 2.54) "A3") (list 'letter (* 72 8.5) (* 72 11.0) "Letter") (list 'legal (* 72 8.5) (* 72 14.0) "Legal") (list 'letter-small (* 72 7.68) (* 72 10.16) "LetterSmall") (list 'tabloid (* 72 11.0) (* 72 17.0) "Tabloid") (list 'ledger (* 72 17.0) (* 72 11.0) "Ledger") (list 'statement (* 72 5.5) (* 72 8.5) "Statement") (list 'executive (* 72 7.5) (* 72 10.0) "Executive") (list 'a4small (* 72 7.47) (* 72 10.85) "A4Small") (list 'b4 (* 72 10.125) (* 72 14.33) "B4") (list 'b5 (* 72 7.16) (* 72 10.125) "B5") '(addresslarge 236.0 99.0 "AddressLarge") '(addresssmall 236.0 68.0 "AddressSmall") '(cuthanging13 90.0 222.0 "CutHanging13") '(cuthanging15 90.0 114.0 "CutHanging15") '(diskette 181.0 136.0 "Diskette") '(eurofilefolder 139.0 112.0 "EuropeanFilefolder") '(eurofoldernarrow 526.0 107.0 "EuroFolderNarrow") '(eurofolderwide 526.0 136.0 "EuroFolderWide") '(euronamebadge 189.0 108.0 "EuroNameBadge") '(euronamebadgelarge 223.0 136.0 "EuroNameBadgeLarge") '(filefolder 230.0 37.0 "FileFolder") '(jewelry 76.0 136.0 "Jewelry") '(mediabadge 180.0 136.0 "MediaBadge") '(multipurpose 126.0 68.0 "MultiPurpose") '(retaillabel 90.0 104.0 "RetailLabel") '(shipping 271.0 136.0 "Shipping") '(slide35mm 26.0 104.0 "Slide35mm") '(spine8mm 187.0 26.0 "Spine8mm") '(topcoated 425.19685 136.0 "TopCoatedPaper") '(topcoatedpaper 396.0 136.0 "TopcoatedPaper150") '(vhsface 205.0 127.0 "VHSFace") '(vhsspine 400.0 50.0 "VHSSpine") '(zipdisk 156.0 136.0 "ZipDisk"))) "\
@@ -21802,9 +21882,9 @@ Use the command `ps-despool' to send the spooled images to the printer.
(autoload 'ps-spool-buffer-with-faces "ps-print" "\
Generate and spool a PostScript image of the buffer.
-Like `ps-spool-buffer', but includes font, color, and underline information in
-the generated image. This command works only if you are using a window system,
-so it has a way to determine color values.
+Like the command `ps-spool-buffer', but includes font, color, and underline
+information in the generated image. This command works only if you are using
+a window system, so it has a way to determine color values.
Use the command `ps-despool' to send the spooled images to the printer.
@@ -21916,7 +21996,7 @@ If EXTENSION is any other symbol, it is ignored.
;;;***
;;;### (autoloads (python-mode run-python) "python" "progmodes/python.el"
-;;;;;; (20773 47373 975742 0))
+;;;;;; (20824 3367 300658 0))
;;; Generated autoloads from progmodes/python.el
(add-to-list 'auto-mode-alist (cons (purecopy "\\.py\\'") 'python-mode))
@@ -21952,7 +22032,7 @@ if that value is non-nil.
;;;***
;;;### (autoloads (quoted-printable-decode-region) "qp" "gnus/qp.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/qp.el
(autoload 'quoted-printable-decode-region "qp" "\
@@ -21975,7 +22055,7 @@ them into characters should be done separately.
;;;;;; quail-defrule quail-install-decode-map quail-install-map
;;;;;; quail-define-rules quail-show-keyboard-layout quail-set-keyboard-layout
;;;;;; quail-define-package quail-use-package quail-title) "quail"
-;;;;;; "international/quail.el" (20707 18685 911514 0))
+;;;;;; "international/quail.el" (20709 26818 907104 0))
;;; Generated autoloads from international/quail.el
(autoload 'quail-title "quail" "\
@@ -22206,8 +22286,8 @@ of each directory.
;;;### (autoloads (quickurl-list quickurl-list-mode quickurl-edit-urls
;;;;;; quickurl-browse-url-ask quickurl-browse-url quickurl-add-url
-;;;;;; quickurl-ask quickurl) "quickurl" "net/quickurl.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; quickurl-ask quickurl) "quickurl" "net/quickurl.el" (20799
+;;;;;; 169 640767 0))
;;; Generated autoloads from net/quickurl.el
(defconst quickurl-reread-hook-postfix "\n;; Local Variables:\n;; eval: (progn (require 'quickurl) (add-hook 'local-write-file-hooks (lambda () (quickurl-read) nil)))\n;; End:\n" "\
@@ -22279,7 +22359,7 @@ Display `quickurl-list' as a formatted list using `quickurl-list-mode'.
;;;***
;;;### (autoloads (rcirc-track-minor-mode rcirc-connect rcirc) "rcirc"
-;;;;;; "net/rcirc.el" (20707 18685 911514 0))
+;;;;;; "net/rcirc.el" (20770 3512 176098 0))
;;; Generated autoloads from net/rcirc.el
(autoload 'rcirc "rcirc" "\
@@ -22317,8 +22397,8 @@ if ARG is omitted or nil.
;;;***
-;;;### (autoloads (remote-compile) "rcompile" "net/rcompile.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (remote-compile) "rcompile" "net/rcompile.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from net/rcompile.el
(autoload 'remote-compile "rcompile" "\
@@ -22330,7 +22410,7 @@ See \\[compile].
;;;***
;;;### (autoloads (re-builder) "re-builder" "emacs-lisp/re-builder.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/re-builder.el
(defalias 'regexp-builder 're-builder)
@@ -22348,8 +22428,8 @@ matching parts of the target buffer will be highlighted.
;;;***
-;;;### (autoloads (recentf-mode) "recentf" "recentf.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (recentf-mode) "recentf" "recentf.el" (20799 169
+;;;;;; 640767 0))
;;; Generated autoloads from recentf.el
(defvar recentf-mode nil "\
@@ -22379,7 +22459,7 @@ were operated on recently.
;;;;;; string-rectangle delete-whitespace-rectangle open-rectangle
;;;;;; insert-rectangle yank-rectangle copy-rectangle-as-kill kill-rectangle
;;;;;; extract-rectangle delete-extract-rectangle delete-rectangle)
-;;;;;; "rect" "rect.el" (20707 18685 911514 0))
+;;;;;; "rect" "rect.el" (20709 26818 907104 0))
;;; Generated autoloads from rect.el
(autoload 'delete-rectangle "rect" "\
@@ -22513,8 +22593,8 @@ with a prefix argument, prompt for START-AT and FORMAT.
;;;***
-;;;### (autoloads (refill-mode) "refill" "textmodes/refill.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (refill-mode) "refill" "textmodes/refill.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from textmodes/refill.el
(autoload 'refill-mode "refill" "\
@@ -22535,8 +22615,8 @@ For true \"word wrap\" behavior, use `visual-line-mode' instead.
;;;***
;;;### (autoloads (reftex-reset-scanning-information reftex-mode
-;;;;;; turn-on-reftex) "reftex" "textmodes/reftex.el" (20707 18685
-;;;;;; 911514 0))
+;;;;;; turn-on-reftex) "reftex" "textmodes/reftex.el" (20777 63161
+;;;;;; 848428 0))
;;; Generated autoloads from textmodes/reftex.el
(autoload 'turn-on-reftex "reftex" "\
@@ -22586,7 +22666,7 @@ This enforces rescanning the buffer on next use.
;;;***
;;;### (autoloads (reftex-citation) "reftex-cite" "textmodes/reftex-cite.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20734 30007 218637 0))
;;; Generated autoloads from textmodes/reftex-cite.el
(autoload 'reftex-citation "reftex-cite" "\
@@ -22616,7 +22696,7 @@ While entering the regexp, completion on knows citation keys is possible.
;;;***
;;;### (autoloads (reftex-isearch-minor-mode) "reftex-global" "textmodes/reftex-global.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from textmodes/reftex-global.el
(autoload 'reftex-isearch-minor-mode "reftex-global" "\
@@ -22633,7 +22713,7 @@ With no argument, this command toggles
;;;***
;;;### (autoloads (reftex-index-phrases-mode) "reftex-index" "textmodes/reftex-index.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from textmodes/reftex-index.el
(autoload 'reftex-index-phrases-mode "reftex-index" "\
@@ -22666,7 +22746,7 @@ Here are all local bindings.
;;;***
;;;### (autoloads (reftex-all-document-files) "reftex-parse" "textmodes/reftex-parse.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from textmodes/reftex-parse.el
(autoload 'reftex-all-document-files "reftex-parse" "\
@@ -22678,8 +22758,8 @@ of master file.
;;;***
-;;;### (autoloads nil "reftex-vars" "textmodes/reftex-vars.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads nil "reftex-vars" "textmodes/reftex-vars.el" (20734
+;;;;;; 30007 218637 0))
;;; Generated autoloads from textmodes/reftex-vars.el
(put 'reftex-vref-is-default 'safe-local-variable (lambda (x) (or (stringp x) (symbolp x))))
(put 'reftex-fref-is-default 'safe-local-variable (lambda (x) (or (stringp x) (symbolp x))))
@@ -22689,7 +22769,7 @@ of master file.
;;;***
;;;### (autoloads (regexp-opt-depth regexp-opt) "regexp-opt" "emacs-lisp/regexp-opt.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/regexp-opt.el
(autoload 'regexp-opt "regexp-opt" "\
@@ -22720,7 +22800,7 @@ This means the number of non-shy regexp grouping constructs
;;;### (autoloads (remember-diary-extract-entries remember-clipboard
;;;;;; remember-other-frame remember) "remember" "textmodes/remember.el"
-;;;;;; (20746 41950 779927 439000))
+;;;;;; (20799 169 640767 0))
;;; Generated autoloads from textmodes/remember.el
(autoload 'remember "remember" "\
@@ -22750,7 +22830,7 @@ Extract diary entries from the region.
;;;***
-;;;### (autoloads (repeat) "repeat" "repeat.el" (20707 18685 911514
+;;;### (autoloads (repeat) "repeat" "repeat.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from repeat.el
@@ -22774,7 +22854,7 @@ recently executed command not bound to an input event\".
;;;***
;;;### (autoloads (reporter-submit-bug-report) "reporter" "mail/reporter.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from mail/reporter.el
(autoload 'reporter-submit-bug-report "reporter" "\
@@ -22806,7 +22886,7 @@ mail-sending package is used for editing and sending the message.
;;;***
;;;### (autoloads (reposition-window) "reposition" "reposition.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from reposition.el
(autoload 'reposition-window "reposition" "\
@@ -22833,7 +22913,7 @@ first comment line visible (if point is in a comment).
;;;***
;;;### (autoloads (global-reveal-mode reveal-mode) "reveal" "reveal.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from reveal.el
(autoload 'reveal-mode "reveal" "\
@@ -22869,7 +22949,7 @@ the mode if ARG is omitted or nil.
;;;***
;;;### (autoloads (make-ring ring-p) "ring" "emacs-lisp/ring.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/ring.el
(autoload 'ring-p "ring" "\
@@ -22884,8 +22964,8 @@ Make a ring that can contain SIZE elements.
;;;***
-;;;### (autoloads (rlogin) "rlogin" "net/rlogin.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (rlogin) "rlogin" "net/rlogin.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from net/rlogin.el
(autoload 'rlogin "rlogin" "\
@@ -22934,7 +23014,7 @@ variable.
;;;;;; rmail-secondary-file-directory rmail-primary-inbox-list rmail-highlighted-headers
;;;;;; rmail-retry-ignored-headers rmail-displayed-headers rmail-ignored-headers
;;;;;; rmail-user-mail-address-regexp rmail-movemail-variant-p rmail-spool-directory
-;;;;;; rmail-file-name) "rmail" "mail/rmail.el" (20728 47414 952831
+;;;;;; rmail-file-name) "rmail" "mail/rmail.el" (20762 9398 526093
;;;;;; 0))
;;; Generated autoloads from mail/rmail.el
@@ -23133,8 +23213,8 @@ Set PASSWORD to be used for retrieving mail from a POP or IMAP server.
;;;***
;;;### (autoloads (rmail-output-body-to-file rmail-output-as-seen
-;;;;;; rmail-output) "rmailout" "mail/rmailout.el" (20707 18685
-;;;;;; 911514 0))
+;;;;;; rmail-output) "rmailout" "mail/rmailout.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from mail/rmailout.el
(put 'rmail-output-file-alist 'risky-local-variable t)
@@ -23199,7 +23279,7 @@ than appending to it. Deletes the message after writing if
;;;***
;;;### (autoloads (rng-c-load-schema) "rng-cmpct" "nxml/rng-cmpct.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from nxml/rng-cmpct.el
(autoload 'rng-c-load-schema "rng-cmpct" "\
@@ -23211,7 +23291,7 @@ Return a pattern.
;;;***
;;;### (autoloads (rng-nxml-mode-init) "rng-nxml" "nxml/rng-nxml.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20813 33065 721081 0))
;;; Generated autoloads from nxml/rng-nxml.el
(autoload 'rng-nxml-mode-init "rng-nxml" "\
@@ -23224,7 +23304,7 @@ Validation will be enabled if `rng-nxml-auto-validate-flag' is non-nil.
;;;***
;;;### (autoloads (rng-validate-mode) "rng-valid" "nxml/rng-valid.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20814 53928 50501 0))
;;; Generated autoloads from nxml/rng-valid.el
(autoload 'rng-validate-mode "rng-valid" "\
@@ -23254,8 +23334,8 @@ to use for finding the schema.
;;;***
-;;;### (autoloads (rng-xsd-compile) "rng-xsd" "nxml/rng-xsd.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (rng-xsd-compile) "rng-xsd" "nxml/rng-xsd.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from nxml/rng-xsd.el
(put 'http://www\.w3\.org/2001/XMLSchema-datatypes 'rng-dt-compile 'rng-xsd-compile)
@@ -23283,7 +23363,7 @@ must be equal.
;;;***
;;;### (autoloads (robin-use-package robin-modify-package robin-define-package)
-;;;;;; "robin" "international/robin.el" (20627 28531 447943 0))
+;;;;;; "robin" "international/robin.el" (20523 62082 997685 0))
;;; Generated autoloads from international/robin.el
(autoload 'robin-define-package "robin" "\
@@ -23316,7 +23396,7 @@ Start using robin package NAME, which is a string.
;;;***
;;;### (autoloads (toggle-rot13-mode rot13-other-window rot13-region
-;;;;;; rot13-string rot13) "rot13" "rot13.el" (20707 18685 911514
+;;;;;; rot13-string rot13) "rot13" "rot13.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from rot13.el
@@ -23355,7 +23435,7 @@ Toggle the use of ROT13 encoding for the current window.
;;;***
;;;### (autoloads (rst-minor-mode rst-mode) "rst" "textmodes/rst.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from textmodes/rst.el
(add-to-list 'auto-mode-alist (purecopy '("\\.re?st\\'" . rst-mode)))
@@ -23386,7 +23466,7 @@ for modes derived from Text mode, like Mail mode.
;;;***
;;;### (autoloads (ruby-mode) "ruby-mode" "progmodes/ruby-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20792 30519 8548 0))
;;; Generated autoloads from progmodes/ruby-mode.el
(autoload 'ruby-mode "ruby-mode" "\
@@ -23403,12 +23483,16 @@ The variable `ruby-indent-level' controls the amount of indentation.
(add-to-list 'auto-mode-alist (cons (purecopy "\\.rb\\'") 'ruby-mode))
+(add-to-list 'auto-mode-alist (cons (purecopy "Rakefile\\'") 'ruby-mode))
+
+(add-to-list 'auto-mode-alist (cons (purecopy "\\.gemspec\\'") 'ruby-mode))
+
(dolist (name (list "ruby" "rbx" "jruby" "ruby1.9" "ruby1.8")) (add-to-list 'interpreter-mode-alist (cons (purecopy name) 'ruby-mode)))
;;;***
-;;;### (autoloads (ruler-mode) "ruler-mode" "ruler-mode.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (ruler-mode) "ruler-mode" "ruler-mode.el" (20791
+;;;;;; 9657 561026 0))
;;; Generated autoloads from ruler-mode.el
(defvar ruler-mode nil "\
@@ -23425,8 +23509,8 @@ if ARG is omitted or nil.
;;;***
-;;;### (autoloads (rx rx-to-string) "rx" "emacs-lisp/rx.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (rx rx-to-string) "rx" "emacs-lisp/rx.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from emacs-lisp/rx.el
(autoload 'rx-to-string "rx" "\
@@ -23737,8 +23821,8 @@ enclosed in `(and ...)'.
;;;***
-;;;### (autoloads (savehist-mode) "savehist" "savehist.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (savehist-mode) "savehist" "savehist.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from savehist.el
(defvar savehist-mode nil "\
@@ -23770,7 +23854,7 @@ histories, which is probably undesirable.
;;;***
;;;### (autoloads (dsssl-mode scheme-mode) "scheme" "progmodes/scheme.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20805 38951 572072 0))
;;; Generated autoloads from progmodes/scheme.el
(autoload 'scheme-mode "scheme" "\
@@ -23812,7 +23896,7 @@ that variable's value is a string.
;;;***
;;;### (autoloads (gnus-score-mode) "score-mode" "gnus/score-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/score-mode.el
(autoload 'gnus-score-mode "score-mode" "\
@@ -23826,7 +23910,7 @@ This mode is an extended emacs-lisp mode.
;;;***
;;;### (autoloads (scroll-all-mode) "scroll-all" "scroll-all.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from scroll-all.el
(defvar scroll-all-mode nil "\
@@ -23852,7 +23936,7 @@ one window apply to all visible windows in the same frame.
;;;***
;;;### (autoloads (scroll-lock-mode) "scroll-lock" "scroll-lock.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from scroll-lock.el
(autoload 'scroll-lock-mode "scroll-lock" "\
@@ -23868,7 +23952,7 @@ vertically fixed relative to window boundaries during scrolling.
;;;***
-;;;### (autoloads nil "secrets" "net/secrets.el" (20707 18685 911514
+;;;### (autoloads nil "secrets" "net/secrets.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from net/secrets.el
(when (featurep 'dbusbind)
@@ -23877,7 +23961,7 @@ vertically fixed relative to window boundaries during scrolling.
;;;***
;;;### (autoloads (semantic-mode semantic-default-submodes) "semantic"
-;;;;;; "cedet/semantic.el" (20748 34276 6200 0))
+;;;;;; "cedet/semantic.el" (20813 33065 721081 0))
;;; Generated autoloads from cedet/semantic.el
(defvar semantic-default-submodes '(global-semantic-idle-scheduler-mode global-semanticdb-minor-mode) "\
@@ -23934,7 +24018,7 @@ Semantic mode.
;;;***
;;;### (autoloads (bovine-grammar-mode) "semantic/bovine/grammar"
-;;;;;; "cedet/semantic/bovine/grammar.el" (20707 18685 911514 0))
+;;;;;; "cedet/semantic/bovine/grammar.el" (20709 26818 907104 0))
;;; Generated autoloads from cedet/semantic/bovine/grammar.el
(autoload 'bovine-grammar-mode "semantic/bovine/grammar" "\
@@ -23945,7 +24029,7 @@ Major mode for editing Bovine grammars.
;;;***
;;;### (autoloads (wisent-grammar-mode) "semantic/wisent/grammar"
-;;;;;; "cedet/semantic/wisent/grammar.el" (20707 18685 911514 0))
+;;;;;; "cedet/semantic/wisent/grammar.el" (20709 26818 907104 0))
;;; Generated autoloads from cedet/semantic/wisent/grammar.el
(autoload 'wisent-grammar-mode "semantic/wisent/grammar" "\
@@ -23963,7 +24047,7 @@ Major mode for editing Wisent grammars.
;;;;;; mail-personal-alias-file mail-default-reply-to mail-archive-file-name
;;;;;; mail-header-separator send-mail-function mail-interactive
;;;;;; mail-self-blind mail-specify-envelope-from mail-from-style)
-;;;;;; "sendmail" "mail/sendmail.el" (20707 18685 911514 0))
+;;;;;; "sendmail" "mail/sendmail.el" (20723 59703 12265 0))
;;; Generated autoloads from mail/sendmail.el
(defvar mail-from-style 'default "\
@@ -24246,7 +24330,7 @@ Like `mail' command, but display mail buffer in another frame.
;;;### (autoloads (server-save-buffers-kill-terminal server-mode
;;;;;; server-force-delete server-start) "server" "server.el" (20763
-;;;;;; 5110 492774 0))
+;;;;;; 30266 231060 0))
;;; Generated autoloads from server.el
(put 'server-host 'risky-local-variable t)
@@ -24313,7 +24397,7 @@ only these files will be asked to be saved.
;;;***
-;;;### (autoloads (ses-mode) "ses" "ses.el" (20707 18685 911514 0))
+;;;### (autoloads (ses-mode) "ses" "ses.el" (20709 26818 907104 0))
;;; Generated autoloads from ses.el
(autoload 'ses-mode "ses" "\
@@ -24332,7 +24416,7 @@ These are active only in the minibuffer, when entering or editing a formula:
;;;***
;;;### (autoloads (html-mode sgml-mode) "sgml-mode" "textmodes/sgml-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20784 36406 653593 0))
;;; Generated autoloads from textmodes/sgml-mode.el
(autoload 'sgml-mode "sgml-mode" "\
@@ -24398,7 +24482,7 @@ To work around that, do:
;;;***
;;;### (autoloads (sh-mode) "sh-script" "progmodes/sh-script.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20791 9657 561026 0))
;;; Generated autoloads from progmodes/sh-script.el
(put 'sh-shell 'safe-local-variable 'symbolp)
@@ -24462,7 +24546,7 @@ with your script for an edit-interpret-debug cycle.
;;;***
;;;### (autoloads (list-load-path-shadows) "shadow" "emacs-lisp/shadow.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/shadow.el
(autoload 'list-load-path-shadows "shadow" "\
@@ -24512,8 +24596,8 @@ function, `load-path-shadows-find'.
;;;***
;;;### (autoloads (shadow-initialize shadow-define-regexp-group shadow-define-literal-group
-;;;;;; shadow-define-cluster) "shadowfile" "shadowfile.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; shadow-define-cluster) "shadowfile" "shadowfile.el" (20799
+;;;;;; 169 640767 0))
;;; Generated autoloads from shadowfile.el
(autoload 'shadow-define-cluster "shadowfile" "\
@@ -24552,7 +24636,7 @@ Set up file shadowing.
;;;***
;;;### (autoloads (shell shell-dumb-shell-regexp) "shell" "shell.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from shell.el
(defvar shell-dumb-shell-regexp (purecopy "cmd\\(proxy\\)?\\.exe") "\
@@ -24600,8 +24684,8 @@ Otherwise, one argument `-i' is passed to the shell.
;;;***
-;;;### (autoloads (shr-insert-document) "shr" "gnus/shr.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (shr-insert-document) "shr" "gnus/shr.el" (20791
+;;;;;; 9657 561026 0))
;;; Generated autoloads from gnus/shr.el
(autoload 'shr-insert-document "shr" "\
@@ -24614,7 +24698,7 @@ DOM should be a parse tree as generated by
;;;***
;;;### (autoloads (sieve-upload-and-kill sieve-upload-and-bury sieve-upload
-;;;;;; sieve-manage) "sieve" "gnus/sieve.el" (20707 18685 911514
+;;;;;; sieve-manage) "sieve" "gnus/sieve.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from gnus/sieve.el
@@ -24641,7 +24725,7 @@ DOM should be a parse tree as generated by
;;;***
;;;### (autoloads (sieve-mode) "sieve-mode" "gnus/sieve-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/sieve-mode.el
(autoload 'sieve-mode "sieve-mode" "\
@@ -24656,8 +24740,8 @@ Turning on Sieve mode runs `sieve-mode-hook'.
;;;***
-;;;### (autoloads (simula-mode) "simula" "progmodes/simula.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (simula-mode) "simula" "progmodes/simula.el" (20777
+;;;;;; 63161 848428 0))
;;; Generated autoloads from progmodes/simula.el
(autoload 'simula-mode "simula" "\
@@ -24706,7 +24790,7 @@ with no arguments, if that value is non-nil.
;;;***
;;;### (autoloads (skeleton-pair-insert-maybe skeleton-insert skeleton-proxy-new
-;;;;;; define-skeleton) "skeleton" "skeleton.el" (20707 18685 911514
+;;;;;; define-skeleton) "skeleton" "skeleton.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from skeleton.el
@@ -24819,7 +24903,7 @@ symmetrical ones, and the same character twice for the others.
;;;***
;;;### (autoloads (smerge-start-session smerge-mode smerge-ediff)
-;;;;;; "smerge-mode" "vc/smerge-mode.el" (20707 18685 911514 0))
+;;;;;; "smerge-mode" "vc/smerge-mode.el" (20709 26818 907104 0))
;;; Generated autoloads from vc/smerge-mode.el
(autoload 'smerge-ediff "smerge-mode" "\
@@ -24847,7 +24931,7 @@ If no conflict maker is found, turn off `smerge-mode'.
;;;***
;;;### (autoloads (smiley-buffer smiley-region) "smiley" "gnus/smiley.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20726 5184 974741 509000))
;;; Generated autoloads from gnus/smiley.el
(autoload 'smiley-region "smiley" "\
@@ -24865,7 +24949,7 @@ interactively. If there's no argument, do it at the current buffer.
;;;***
;;;### (autoloads (smtpmail-send-queued-mail smtpmail-send-it) "smtpmail"
-;;;;;; "mail/smtpmail.el" (20707 18685 911514 0))
+;;;;;; "mail/smtpmail.el" (20709 26818 907104 0))
;;; Generated autoloads from mail/smtpmail.el
(autoload 'smtpmail-send-it "smtpmail" "\
@@ -24880,7 +24964,7 @@ Send mail that was queued as a result of setting `smtpmail-queue-mail'.
;;;***
-;;;### (autoloads (snake) "snake" "play/snake.el" (20707 18685 911514
+;;;### (autoloads (snake) "snake" "play/snake.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from play/snake.el
@@ -24905,7 +24989,7 @@ Snake mode keybindings:
;;;***
;;;### (autoloads (snmpv2-mode snmp-mode) "snmp-mode" "net/snmp-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from net/snmp-mode.el
(autoload 'snmp-mode "snmp-mode" "\
@@ -24934,8 +25018,8 @@ then `snmpv2-mode-hook'.
;;;***
-;;;### (autoloads (sunrise-sunset) "solar" "calendar/solar.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (sunrise-sunset) "solar" "calendar/solar.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from calendar/solar.el
(autoload 'sunrise-sunset "solar" "\
@@ -24950,8 +25034,8 @@ This function is suitable for execution in an init file.
;;;***
-;;;### (autoloads (solitaire) "solitaire" "play/solitaire.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (solitaire) "solitaire" "play/solitaire.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from play/solitaire.el
(autoload 'solitaire "solitaire" "\
@@ -25026,10 +25110,10 @@ Pick your favorite shortcuts:
;;;***
-;;;### (autoloads (reverse-region sort-columns sort-regexp-fields
-;;;;;; sort-fields sort-numeric-fields sort-pages sort-paragraphs
-;;;;;; sort-lines sort-subr) "sort" "sort.el" (20707 18685 911514
-;;;;;; 0))
+;;;### (autoloads (delete-duplicate-lines reverse-region sort-columns
+;;;;;; sort-regexp-fields sort-fields sort-numeric-fields sort-pages
+;;;;;; sort-paragraphs sort-lines sort-subr) "sort" "sort.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from sort.el
(put 'sort-fold-case 'safe-local-variable 'booleanp)
@@ -25181,10 +25265,30 @@ From a program takes two point or marker arguments, BEG and END.
\(fn BEG END)" t nil)
+(autoload 'delete-duplicate-lines "sort" "\
+Delete duplicate lines in the region between BEG and END.
+
+If REVERSE is nil, search and delete duplicates forward keeping the first
+occurrence of duplicate lines. If REVERSE is non-nil (when called
+interactively with C-u prefix), search and delete duplicates backward
+keeping the last occurrence of duplicate lines.
+
+If ADJACENT is non-nil (when called interactively with two C-u prefixes),
+delete repeated lines only if they are adjacent. It works like the utility
+`uniq' and is useful when lines are already sorted in a large file since
+this is more efficient in performance and memory usage than when ADJACENT
+is nil that uses additional memory to remember previous lines.
+
+When called from Lisp and INTERACTIVE is omitted or nil, return the number
+of deleted duplicate lines, do not print it; if INTERACTIVE is t, the
+function behaves in all respects as if it had been called interactively.
+
+\(fn BEG END &optional REVERSE ADJACENT INTERACTIVE)" t nil)
+
;;;***
-;;;### (autoloads (spam-initialize) "spam" "gnus/spam.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (spam-initialize) "spam" "gnus/spam.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from gnus/spam.el
(autoload 'spam-initialize "spam" "\
@@ -25200,7 +25304,7 @@ installed through `spam-necessary-extra-headers'.
;;;### (autoloads (spam-report-deagentize spam-report-agentize spam-report-url-to-file
;;;;;; spam-report-url-ping-mm-url spam-report-process-queue) "spam-report"
-;;;;;; "gnus/spam-report.el" (20707 18685 911514 0))
+;;;;;; "gnus/spam-report.el" (20709 26818 907104 0))
;;; Generated autoloads from gnus/spam-report.el
(autoload 'spam-report-process-queue "spam-report" "\
@@ -25243,7 +25347,7 @@ Spam reports will be queued with the method used when
;;;***
;;;### (autoloads (speedbar-get-focus speedbar-frame-mode) "speedbar"
-;;;;;; "speedbar.el" (20707 18685 911514 0))
+;;;;;; "speedbar.el" (20709 26818 907104 0))
;;; Generated autoloads from speedbar.el
(defalias 'speedbar 'speedbar-frame-mode)
@@ -25267,8 +25371,8 @@ selected. If the speedbar frame is active, then select the attached frame.
;;;***
-;;;### (autoloads (snarf-spooks spook) "spook" "play/spook.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (snarf-spooks spook) "spook" "play/spook.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from play/spook.el
(autoload 'spook "spook" "\
@@ -25286,8 +25390,8 @@ Return a vector containing the lines from `spook-phrases-file'.
;;;### (autoloads (sql-linter sql-db2 sql-interbase sql-postgres
;;;;;; sql-ms sql-ingres sql-solid sql-mysql sql-sqlite sql-informix
;;;;;; sql-sybase sql-oracle sql-product-interactive sql-connect
-;;;;;; sql-mode sql-help sql-add-product-keywords) "sql" "progmodes/sql.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; sql-mode sql-add-product-keywords) "sql" "progmodes/sql.el"
+;;;;;; (20797 44848 327754 0))
;;; Generated autoloads from progmodes/sql.el
(autoload 'sql-add-product-keywords "sql" "\
@@ -25311,40 +25415,7 @@ adds a fontification pattern to fontify identifiers ending in
\(fn PRODUCT KEYWORDS &optional APPEND)" nil nil)
-(autoload 'sql-help "sql" "\
-Show short help for the SQL modes.
-
-Use an entry function to open an interactive SQL buffer. This buffer is
-usually named `*SQL*'. The name of the major mode is SQLi.
-
-Use the following commands to start a specific SQL interpreter:
-
- \\\\FREE
-
-Other non-free SQL implementations are also supported:
-
- \\\\NONFREE
-
-But we urge you to choose a free implementation instead of these.
-
-You can also use \\[sql-product-interactive] to invoke the
-interpreter for the current `sql-product'.
-
-Once you have the SQLi buffer, you can enter SQL statements in the
-buffer. The output generated is appended to the buffer and a new prompt
-is generated. See the In/Out menu in the SQLi buffer for some functions
-that help you navigate through the buffer, the input history, etc.
-
-If you have a really complex SQL statement or if you are writing a
-procedure, you can do this in a separate buffer. Put the new buffer in
-`sql-mode' by calling \\[sql-mode]. The name of this buffer can be
-anything. The name of the major mode is SQL.
-
-In this SQL buffer (SQL mode), you can send the region or the entire
-buffer to the interactive SQL buffer (SQLi mode). The results are
-appended to the SQLi buffer without disturbing your SQL buffer.
-
-\(fn)" t nil)
+(eval '(defun sql-help nil #("Show short help for the SQL modes.\n\nUse an entry function to open an interactive SQL buffer. This buffer is\nusually named `*SQL*'. The name of the major mode is SQLi.\n\nUse the following commands to start a specific SQL interpreter:\n\n \\\\FREE\n\nOther non-free SQL implementations are also supported:\n\n \\\\NONFREE\n\nBut we urge you to choose a free implementation instead of these.\n\nYou can also use \\[sql-product-interactive] to invoke the\ninterpreter for the current `sql-product'.\n\nOnce you have the SQLi buffer, you can enter SQL statements in the\nbuffer. The output generated is appended to the buffer and a new prompt\nis generated. See the In/Out menu in the SQLi buffer for some functions\nthat help you navigate through the buffer, the input history, etc.\n\nIf you have a really complex SQL statement or if you are writing a\nprocedure, you can do this in a separate buffer. Put the new buffer in\n`sql-mode' by calling \\[sql-mode]. The name of this buffer can be\nanything. The name of the major mode is SQL.\n\nIn this SQL buffer (SQL mode), you can send the region or the entire\nbuffer to the interactive SQL buffer (SQLi mode). The results are\nappended to the SQLi buffer without disturbing your SQL buffer." 0 1 (dynamic-docstring-function sql--make-help-docstring)) (interactive) (describe-function 'sql-help)))
(autoload 'sql-mode "sql" "\
Major mode to edit SQL.
@@ -25783,7 +25854,7 @@ buffer.
;;;***
;;;### (autoloads (srecode-template-mode) "srecode/srt-mode" "cedet/srecode/srt-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20813 33065 721081 0))
;;; Generated autoloads from cedet/srecode/srt-mode.el
(autoload 'srecode-template-mode "srecode/srt-mode" "\
@@ -25796,7 +25867,7 @@ Major-mode for writing SRecode macros.
;;;***
;;;### (autoloads (starttls-open-stream) "starttls" "gnus/starttls.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from gnus/starttls.el
(autoload 'starttls-open-stream "starttls" "\
@@ -25823,8 +25894,8 @@ GnuTLS requires a port number.
;;;;;; strokes-mode strokes-list-strokes strokes-load-user-strokes
;;;;;; strokes-help strokes-describe-stroke strokes-do-complex-stroke
;;;;;; strokes-do-stroke strokes-read-complex-stroke strokes-read-stroke
-;;;;;; strokes-global-set-stroke) "strokes" "strokes.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; strokes-global-set-stroke) "strokes" "strokes.el" (20799
+;;;;;; 169 640767 0))
;;; Generated autoloads from strokes.el
(autoload 'strokes-global-set-stroke "strokes" "\
@@ -25938,7 +26009,7 @@ Read a complex stroke and insert its glyph into the current buffer.
;;;***
;;;### (autoloads (studlify-buffer studlify-word studlify-region)
-;;;;;; "studly" "play/studly.el" (20360 54279 565993 0))
+;;;;;; "studly" "play/studly.el" (20355 10021 546955 0))
;;; Generated autoloads from play/studly.el
(autoload 'studlify-region "studly" "\
@@ -25958,8 +26029,9 @@ Studlify-case the current buffer.
;;;***
-;;;### (autoloads (global-subword-mode subword-mode) "subword" "progmodes/subword.el"
-;;;;;; (20707 18685 911514 0))
+;;;### (autoloads (global-superword-mode superword-mode global-subword-mode
+;;;;;; subword-mode) "subword" "progmodes/subword.el" (20822 48073
+;;;;;; 524485 0))
;;; Generated autoloads from progmodes/subword.el
(autoload 'subword-mode "subword" "\
@@ -26012,10 +26084,49 @@ See `subword-mode' for more information on Subword mode.
\(fn &optional ARG)" t nil)
+(autoload 'superword-mode "subword" "\
+Toggle superword movement and editing (Superword mode).
+With a prefix argument ARG, enable Superword mode if ARG is
+positive, and disable it otherwise. If called from Lisp, enable
+the mode if ARG is omitted or nil.
+
+Superword mode is a buffer-local minor mode. Enabling it remaps
+word-based editing commands to superword-based commands that
+treat symbols as words, e.g. \"this_is_a_symbol\".
+
+The superword oriented commands activated in this minor mode
+recognize symbols as superwords to move between superwords and to
+edit them as words.
+
+\\{superword-mode-map}
+
+\(fn &optional ARG)" t nil)
+
+(defvar global-superword-mode nil "\
+Non-nil if Global-Superword mode is enabled.
+See the command `global-superword-mode' for a description of this minor mode.
+Setting this variable directly does not take effect;
+either customize it (see the info node `Easy Customization')
+or call the function `global-superword-mode'.")
+
+(custom-autoload 'global-superword-mode "subword" nil)
+
+(autoload 'global-superword-mode "subword" "\
+Toggle Superword mode in all buffers.
+With prefix ARG, enable Global-Superword mode if ARG is positive;
+otherwise, disable it. If called from Lisp, enable the mode if
+ARG is omitted or nil.
+
+Superword mode is enabled in all buffers where
+`(lambda nil (superword-mode 1))' would do it.
+See `superword-mode' for more information on Superword mode.
+
+\(fn &optional ARG)" t nil)
+
;;;***
;;;### (autoloads (sc-cite-original) "supercite" "mail/supercite.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from mail/supercite.el
(autoload 'sc-cite-original "supercite" "\
@@ -26047,8 +26158,8 @@ and `sc-post-hook' is run after the guts of this function.
;;;***
-;;;### (autoloads (gpm-mouse-mode) "t-mouse" "t-mouse.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (gpm-mouse-mode) "t-mouse" "t-mouse.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from t-mouse.el
(define-obsolete-function-alias 't-mouse-mode 'gpm-mouse-mode "23.1")
@@ -26076,8 +26187,8 @@ It relies on the `gpm' daemon being activated.
;;;***
-;;;### (autoloads (tabify untabify) "tabify" "tabify.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (tabify untabify) "tabify" "tabify.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from tabify.el
(autoload 'untabify "tabify" "\
@@ -26112,7 +26223,7 @@ The variable `tab-width' controls the spacing of tab stops.
;;;;;; table-recognize table-insert-row-column table-insert-column
;;;;;; table-insert-row table-insert table-point-left-cell-hook
;;;;;; table-point-entered-cell-hook table-load-hook table-cell-map-hook)
-;;;;;; "table" "textmodes/table.el" (20707 18685 911514 0))
+;;;;;; "table" "textmodes/table.el" (20709 26818 907104 0))
;;; Generated autoloads from textmodes/table.el
(defvar table-cell-map-hook nil "\
@@ -26704,8 +26815,8 @@ converts a table into plain text without frames. It is a companion to
;;;***
-;;;### (autoloads (talk talk-connect) "talk" "talk.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (talk talk-connect) "talk" "talk.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from talk.el
(autoload 'talk-connect "talk" "\
@@ -26720,8 +26831,8 @@ Connect to the Emacs talk group from the current X display or tty frame.
;;;***
-;;;### (autoloads (tar-mode) "tar-mode" "tar-mode.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (tar-mode) "tar-mode" "tar-mode.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from tar-mode.el
(autoload 'tar-mode "tar-mode" "\
@@ -26745,7 +26856,7 @@ See also: variables `tar-update-datestamp' and `tar-anal-blocksize'.
;;;***
;;;### (autoloads (tcl-help-on-word inferior-tcl tcl-mode) "tcl"
-;;;;;; "progmodes/tcl.el" (20707 18685 911514 0))
+;;;;;; "progmodes/tcl.el" (20774 53405 704746 172000))
;;; Generated autoloads from progmodes/tcl.el
(autoload 'tcl-mode "tcl" "\
@@ -26793,8 +26904,8 @@ Prefix argument means invert sense of `tcl-use-smart-word-finder'.
;;;***
-;;;### (autoloads (rsh telnet) "telnet" "net/telnet.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (rsh telnet) "telnet" "net/telnet.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from net/telnet.el
(autoload 'telnet "telnet" "\
@@ -26820,7 +26931,7 @@ Normally input is edited in Emacs and sent a line at a time.
;;;***
;;;### (autoloads (serial-term ansi-term term make-term) "term" "term.el"
-;;;;;; (20709 10021 126382 806000))
+;;;;;; (20712 3008 596088 0))
;;; Generated autoloads from term.el
(autoload 'make-term "term" "\
@@ -26862,45 +26973,8 @@ use in that buffer.
;;;***
-;;;### (autoloads (terminal-emulator) "terminal" "terminal.el" (20707
-;;;;;; 18685 911514 0))
-;;; Generated autoloads from terminal.el
-
-(autoload 'terminal-emulator "terminal" "\
-Under a display-terminal emulator in BUFFER, run PROGRAM on arguments ARGS.
-ARGS is a list of argument-strings. Remaining arguments are WIDTH and HEIGHT.
-BUFFER's contents are made an image of the display generated by that program,
-and any input typed when BUFFER is the current Emacs buffer is sent to that
-program as keyboard input.
-
-Interactively, BUFFER defaults to \"*terminal*\" and PROGRAM and ARGS
-are parsed from an input-string using your usual shell.
-WIDTH and HEIGHT are determined from the size of the current window
--- WIDTH will be one less than the window's width, HEIGHT will be its height.
-
-To switch buffers and leave the emulator, or to give commands
-to the emulator itself (as opposed to the program running under it),
-type Control-^. The following character is an emulator command.
-Type Control-^ twice to send it to the subprogram.
-This escape character may be changed using the variable `terminal-escape-char'.
-
-`Meta' characters may not currently be sent through the terminal emulator.
-
-Here is a list of some of the variables which control the behavior
-of the emulator -- see their documentation for more information:
-terminal-escape-char, terminal-scrolling, terminal-more-processing,
-terminal-redisplay-interval.
-
-This function calls the value of terminal-mode-hook if that exists
-and is non-nil after the terminal buffer has been set up and the
-subprocess started.
-
-\(fn BUFFER PROGRAM ARGS &optional WIDTH HEIGHT)" t nil)
-
-;;;***
-
;;;### (autoloads (testcover-this-defun) "testcover" "emacs-lisp/testcover.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/testcover.el
(autoload 'testcover-this-defun "testcover" "\
@@ -26910,8 +26984,8 @@ Start coverage on function under point.
;;;***
-;;;### (autoloads (tetris) "tetris" "play/tetris.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (tetris) "tetris" "play/tetris.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from play/tetris.el
(autoload 'tetris "tetris" "\
@@ -26942,7 +27016,7 @@ tetris-mode keybindings:
;;;;;; tex-start-commands tex-start-options slitex-run-command latex-run-command
;;;;;; tex-run-command tex-offer-save tex-main-file tex-first-line-header-regexp
;;;;;; tex-directory tex-shell-file-name) "tex-mode" "textmodes/tex-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20774 53405 754743 8000))
;;; Generated autoloads from textmodes/tex-mode.el
(defvar tex-shell-file-name nil "\
@@ -27244,7 +27318,7 @@ Major mode to edit DocTeX files.
;;;***
;;;### (autoloads (texi2info texinfo-format-region texinfo-format-buffer)
-;;;;;; "texinfmt" "textmodes/texinfmt.el" (20707 18685 911514 0))
+;;;;;; "texinfmt" "textmodes/texinfmt.el" (20709 26818 907104 0))
;;; Generated autoloads from textmodes/texinfmt.el
(autoload 'texinfo-format-buffer "texinfmt" "\
@@ -27284,7 +27358,7 @@ if large. You can use `Info-split' to do this manually.
;;;***
;;;### (autoloads (texinfo-mode texinfo-close-quote texinfo-open-quote)
-;;;;;; "texinfo" "textmodes/texinfo.el" (20707 18685 911514 0))
+;;;;;; "texinfo" "textmodes/texinfo.el" (20709 26818 907104 0))
;;; Generated autoloads from textmodes/texinfo.el
(defvar texinfo-open-quote (purecopy "``") "\
@@ -27370,7 +27444,7 @@ value of `texinfo-mode-hook'.
;;;### (autoloads (thai-composition-function thai-compose-buffer
;;;;;; thai-compose-string thai-compose-region) "thai-util" "language/thai-util.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from language/thai-util.el
(autoload 'thai-compose-region "thai-util" "\
@@ -27399,7 +27473,7 @@ Compose Thai characters in the current buffer.
;;;### (autoloads (list-at-point number-at-point symbol-at-point
;;;;;; sexp-at-point thing-at-point bounds-of-thing-at-point forward-thing)
-;;;;;; "thingatpt" "thingatpt.el" (20707 18685 911514 0))
+;;;;;; "thingatpt" "thingatpt.el" (20822 48073 524485 0))
;;; Generated autoloads from thingatpt.el
(autoload 'forward-thing "thingatpt" "\
@@ -27462,7 +27536,7 @@ Return the Lisp list at point, or nil if none is found.
;;;### (autoloads (thumbs-dired-setroot thumbs-dired-show thumbs-dired-show-marked
;;;;;; thumbs-show-from-dir thumbs-find-thumb) "thumbs" "thumbs.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from thumbs.el
(autoload 'thumbs-find-thumb "thumbs" "\
@@ -27500,8 +27574,8 @@ In dired, call the setroot program on the image at point.
;;;;;; tibetan-post-read-conversion tibetan-compose-buffer tibetan-decompose-buffer
;;;;;; tibetan-decompose-string tibetan-decompose-region tibetan-compose-region
;;;;;; tibetan-compose-string tibetan-transcription-to-tibetan tibetan-tibetan-to-transcription
-;;;;;; tibetan-char-p) "tibet-util" "language/tibet-util.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; tibetan-char-p) "tibet-util" "language/tibet-util.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from language/tibet-util.el
(autoload 'tibetan-char-p "tibet-util" "\
@@ -27575,7 +27649,7 @@ See also docstring of the function tibetan-compose-region.
;;;***
;;;### (autoloads (tildify-buffer tildify-region) "tildify" "textmodes/tildify.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20791 9657 561026 0))
;;; Generated autoloads from textmodes/tildify.el
(autoload 'tildify-region "tildify" "\
@@ -27600,7 +27674,7 @@ This function performs no refilling of the changed text.
;;;### (autoloads (emacs-init-time emacs-uptime display-time-world
;;;;;; display-time-mode display-time display-time-day-and-date)
-;;;;;; "time" "time.el" (20707 18685 911514 0))
+;;;;;; "time" "time.el" (20709 26818 907104 0))
;;; Generated autoloads from time.el
(defvar display-time-day-and-date nil "\
@@ -27666,7 +27740,7 @@ Return a string giving the duration of the Emacs initialization.
;;;;;; time-to-day-in-year date-leap-year-p days-between date-to-day
;;;;;; time-add time-subtract time-since days-to-time time-less-p
;;;;;; seconds-to-time date-to-time) "time-date" "calendar/time-date.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from calendar/time-date.el
(autoload 'date-to-time "time-date" "\
@@ -27677,9 +27751,7 @@ If DATE lacks timezone information, GMT is assumed.
(if (or (featurep 'emacs)
(and (fboundp 'float-time)
(subrp (symbol-function 'float-time))))
- (progn
- (defalias 'time-to-seconds 'float-time)
- (make-obsolete 'time-to-seconds 'float-time "21.1"))
+ (defalias 'time-to-seconds 'float-time)
(autoload 'time-to-seconds "time-date"))
(autoload 'seconds-to-time "time-date" "\
@@ -27780,7 +27852,7 @@ This function does not work for SECONDS greater than `most-positive-fixnum'.
;;;***
;;;### (autoloads (time-stamp-toggle-active time-stamp) "time-stamp"
-;;;;;; "time-stamp.el" (20707 18685 911514 0))
+;;;;;; "time-stamp.el" (20709 26818 907104 0))
;;; Generated autoloads from time-stamp.el
(put 'time-stamp-format 'safe-local-variable 'stringp)
(put 'time-stamp-time-zone 'safe-local-variable 'string-or-null-p)
@@ -27824,7 +27896,7 @@ With ARG, turn time stamping on if and only if arg is positive.
;;;;;; timeclock-workday-remaining-string timeclock-reread-log timeclock-query-out
;;;;;; timeclock-change timeclock-status-string timeclock-out timeclock-in
;;;;;; timeclock-mode-line-display) "timeclock" "calendar/timeclock.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20799 169 640767 0))
;;; Generated autoloads from calendar/timeclock.el
(autoload 'timeclock-mode-line-display "timeclock" "\
@@ -27924,7 +27996,7 @@ relative only to the time worked today, and not to past time.
;;;***
;;;### (autoloads (batch-titdic-convert titdic-convert) "titdic-cnv"
-;;;;;; "international/titdic-cnv.el" (20707 18685 911514 0))
+;;;;;; "international/titdic-cnv.el" (20709 26818 907104 0))
;;; Generated autoloads from international/titdic-cnv.el
(autoload 'titdic-convert "titdic-cnv" "\
@@ -27947,7 +28019,7 @@ To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\".
;;;***
;;;### (autoloads (tmm-prompt tmm-menubar-mouse tmm-menubar) "tmm"
-;;;;;; "tmm.el" (20707 18685 911514 0))
+;;;;;; "tmm.el" (20764 51137 83502 0))
;;; Generated autoloads from tmm.el
(define-key global-map "\M-`" 'tmm-menubar)
(define-key global-map [menu-bar mouse-1] 'tmm-menubar-mouse)
@@ -27987,7 +28059,7 @@ Its value should be an event that has a binding in MENU.
;;;### (autoloads (todo-show todo-cp todo-mode todo-print todo-top-priorities
;;;;;; todo-insert-item todo-add-item-non-interactively todo-add-category)
-;;;;;; "todo-mode" "calendar/todo-mode.el" (20707 18685 911514 0))
+;;;;;; "todo-mode" "calendar/todo-mode.el" (20799 169 640767 0))
;;; Generated autoloads from calendar/todo-mode.el
(autoload 'todo-add-category "todo-mode" "\
@@ -28047,7 +28119,7 @@ Show TODO list.
;;;### (autoloads (tool-bar-local-item-from-menu tool-bar-add-item-from-menu
;;;;;; tool-bar-local-item tool-bar-add-item toggle-tool-bar-mode-from-frame)
-;;;;;; "tool-bar" "tool-bar.el" (20707 18685 911514 0))
+;;;;;; "tool-bar" "tool-bar.el" (20709 26818 907104 0))
;;; Generated autoloads from tool-bar.el
(autoload 'toggle-tool-bar-mode-from-frame "tool-bar" "\
@@ -28118,7 +28190,7 @@ holds a keymap.
;;;***
;;;### (autoloads (tpu-edt-on tpu-edt-mode) "tpu-edt" "emulation/tpu-edt.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emulation/tpu-edt.el
(defvar tpu-edt-mode nil "\
@@ -28148,7 +28220,7 @@ Turn on TPU/edt emulation.
;;;***
;;;### (autoloads (tpu-mapper) "tpu-mapper" "emulation/tpu-mapper.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emulation/tpu-mapper.el
(autoload 'tpu-mapper "tpu-mapper" "\
@@ -28182,8 +28254,8 @@ your local X guru can try to figure out why the key is being ignored.
;;;***
-;;;### (autoloads (tq-create) "tq" "emacs-lisp/tq.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (tq-create) "tq" "emacs-lisp/tq.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from emacs-lisp/tq.el
(autoload 'tq-create "tq" "\
@@ -28196,16 +28268,17 @@ to a tcp server on another machine.
;;;***
-;;;### (autoloads (trace-function-background trace-function trace-buffer)
-;;;;;; "trace" "emacs-lisp/trace.el" (20716 60089 50197 777000))
+;;;### (autoloads (trace-function-background trace-function-foreground
+;;;;;; trace-buffer) "trace" "emacs-lisp/trace.el" (20727 56759
+;;;;;; 628211 0))
;;; Generated autoloads from emacs-lisp/trace.el
-(defvar trace-buffer (purecopy "*trace-output*") "\
+(defvar trace-buffer "*trace-output*" "\
Trace output will by default go to that buffer.")
(custom-autoload 'trace-buffer "trace" t)
-(autoload 'trace-function "trace" "\
+(autoload 'trace-function-foreground "trace" "\
Traces FUNCTION with trace output going to BUFFER.
For every call of FUNCTION Lisp-style trace messages that display argument
and return values will be inserted into BUFFER. This function generates the
@@ -28216,29 +28289,23 @@ display oriented stuff, use `trace-function-background' instead.
To untrace a function, use `untrace-function' or `untrace-all'.
-\(fn FUNCTION &optional BUFFER)" t nil)
+\(fn FUNCTION &optional BUFFER CONTEXT)" t nil)
(autoload 'trace-function-background "trace" "\
Traces FUNCTION with trace output going quietly to BUFFER.
-When this tracing is enabled, every call to FUNCTION writes
-a Lisp-style trace message (showing the arguments and return value)
-into BUFFER. This function generates advice to trace FUNCTION
-and activates it together with any other advice there might be.
-The trace output goes to BUFFER quietly, without changing
-the window or buffer configuration.
+Like `trace-function-foreground' but without popping up the trace BUFFER or
+changing the window configuration.
-BUFFER defaults to `trace-buffer'.
+\(fn FUNCTION &optional BUFFER CONTEXT)" t nil)
-To untrace a function, use `untrace-function' or `untrace-all'.
-
-\(fn FUNCTION &optional BUFFER)" t nil)
+(defalias 'trace-function 'trace-function-foreground)
;;;***
;;;### (autoloads (tramp-unload-tramp tramp-completion-handle-file-name-completion
;;;;;; tramp-completion-handle-file-name-all-completions tramp-unload-file-name-handlers
;;;;;; tramp-file-name-handler tramp-syntax tramp-mode) "tramp"
-;;;;;; "net/tramp.el" (20773 47373 975742 0))
+;;;;;; "net/tramp.el" (20824 3367 300658 0))
;;; Generated autoloads from net/tramp.el
(defvar tramp-mode t "\
@@ -28371,7 +28438,7 @@ Discard Tramp from loading remote files.
;;;***
;;;### (autoloads (tramp-ftp-enable-ange-ftp) "tramp-ftp" "net/tramp-ftp.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from net/tramp-ftp.el
(autoload 'tramp-ftp-enable-ange-ftp "tramp-ftp" "\
@@ -28381,8 +28448,8 @@ Discard Tramp from loading remote files.
;;;***
-;;;### (autoloads (help-with-tutorial) "tutorial" "tutorial.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (help-with-tutorial) "tutorial" "tutorial.el" (20760
+;;;;;; 54070 584283 0))
;;; Generated autoloads from tutorial.el
(autoload 'help-with-tutorial "tutorial" "\
@@ -28407,7 +28474,7 @@ resumed later.
;;;***
;;;### (autoloads (tai-viet-composition-function) "tv-util" "language/tv-util.el"
-;;;;;; (20360 54279 565993 0))
+;;;;;; (20355 10021 546955 0))
;;; Generated autoloads from language/tv-util.el
(autoload 'tai-viet-composition-function "tv-util" "\
@@ -28418,7 +28485,7 @@ resumed later.
;;;***
;;;### (autoloads (2C-split 2C-associate-buffer 2C-two-columns) "two-column"
-;;;;;; "textmodes/two-column.el" (20763 5110 492774 0))
+;;;;;; "textmodes/two-column.el" (20763 30266 231060 0))
;;; Generated autoloads from textmodes/two-column.el
(autoload '2C-command "two-column" () t 'keymap)
(global-set-key "\C-x6" '2C-command)
@@ -28467,7 +28534,7 @@ First column's text sSs Second column's text
;;;### (autoloads (type-break-guesstimate-keystroke-threshold type-break-statistics
;;;;;; type-break type-break-mode) "type-break" "type-break.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20799 169 640767 0))
;;; Generated autoloads from type-break.el
(defvar type-break-mode nil "\
@@ -28599,8 +28666,8 @@ FRAC should be the inverse of the fractional value; for example, a value of
;;;***
-;;;### (autoloads (uce-reply-to-uce) "uce" "mail/uce.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (uce-reply-to-uce) "uce" "mail/uce.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from mail/uce.el
(autoload 'uce-reply-to-uce "uce" "\
@@ -28618,7 +28685,7 @@ You might need to set `uce-mail-reader' before using this.
;;;;;; ucs-normalize-NFKC-string ucs-normalize-NFKC-region ucs-normalize-NFKD-string
;;;;;; ucs-normalize-NFKD-region ucs-normalize-NFC-string ucs-normalize-NFC-region
;;;;;; ucs-normalize-NFD-string ucs-normalize-NFD-region) "ucs-normalize"
-;;;;;; "international/ucs-normalize.el" (20707 18685 911514 0))
+;;;;;; "international/ucs-normalize.el" (20709 26818 907104 0))
;;; Generated autoloads from international/ucs-normalize.el
(autoload 'ucs-normalize-NFD-region "ucs-normalize" "\
@@ -28684,7 +28751,7 @@ Normalize the string STR by the Unicode NFC and Mac OS's HFS Plus.
;;;***
;;;### (autoloads (ununderline-region underline-region) "underline"
-;;;;;; "textmodes/underline.el" (20707 18685 911514 0))
+;;;;;; "textmodes/underline.el" (20709 26818 907104 0))
;;; Generated autoloads from textmodes/underline.el
(autoload 'underline-region "underline" "\
@@ -28705,11 +28772,11 @@ which specify the range to operate on.
;;;***
;;;### (autoloads (unrmail batch-unrmail) "unrmail" "mail/unrmail.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20731 53823 676680 0))
;;; Generated autoloads from mail/unrmail.el
(autoload 'batch-unrmail "unrmail" "\
-Convert old-style Rmail Babyl files to system inbox format.
+Convert old-style Rmail Babyl files to mbox format.
Specify the input Rmail Babyl file names as command line arguments.
For each Rmail file, the corresponding output file name
is made by adding `.mail' at the end.
@@ -28718,14 +28785,15 @@ For example, invoke `emacs -batch -f batch-unrmail RMAIL'.
\(fn)" nil nil)
(autoload 'unrmail "unrmail" "\
-Convert old-style Rmail Babyl file FILE to system inbox format file TO-FILE.
+Convert old-style Rmail Babyl file FILE to mbox format file TO-FILE.
+The variable `unrmail-mbox-format' controls which mbox format to use.
\(fn FILE TO-FILE)" t nil)
;;;***
-;;;### (autoloads (unsafep) "unsafep" "emacs-lisp/unsafep.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (unsafep) "unsafep" "emacs-lisp/unsafep.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from emacs-lisp/unsafep.el
(autoload 'unsafep "unsafep" "\
@@ -28738,7 +28806,7 @@ UNSAFEP-VARS is a list of symbols with local bindings.
;;;***
;;;### (autoloads (url-retrieve-synchronously url-retrieve) "url"
-;;;;;; "url/url.el" (20707 18685 911514 0))
+;;;;;; "url/url.el" (20709 26818 907104 0))
;;; Generated autoloads from url/url.el
(autoload 'url-retrieve "url" "\
@@ -28786,7 +28854,7 @@ no further processing). URL is either a string or a parsed URL.
;;;***
;;;### (autoloads (url-register-auth-scheme url-get-authentication)
-;;;;;; "url-auth" "url/url-auth.el" (20707 18685 911514 0))
+;;;;;; "url-auth" "url/url-auth.el" (20709 26818 907104 0))
;;; Generated autoloads from url/url-auth.el
(autoload 'url-get-authentication "url-auth" "\
@@ -28828,7 +28896,7 @@ RATING a rating between 1 and 10 of the strength of the authentication.
;;;***
;;;### (autoloads (url-cache-extract url-is-cached url-store-in-cache)
-;;;;;; "url-cache" "url/url-cache.el" (20707 18685 911514 0))
+;;;;;; "url-cache" "url/url-cache.el" (20751 39094 700824 0))
;;; Generated autoloads from url/url-cache.el
(autoload 'url-store-in-cache "url-cache" "\
@@ -28849,8 +28917,8 @@ Extract FNAM from the local disk cache.
;;;***
-;;;### (autoloads (url-cid) "url-cid" "url/url-cid.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (url-cid) "url-cid" "url/url-cid.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from url/url-cid.el
(autoload 'url-cid "url-cid" "\
@@ -28861,7 +28929,7 @@ Extract FNAM from the local disk cache.
;;;***
;;;### (autoloads (url-dav-vc-registered url-dav-request url-dav-supported-p)
-;;;;;; "url-dav" "url/url-dav.el" (20707 18685 911514 0))
+;;;;;; "url-dav" "url/url-dav.el" (20709 26818 907104 0))
;;; Generated autoloads from url/url-dav.el
(autoload 'url-dav-supported-p "url-dav" "\
@@ -28895,8 +28963,8 @@ added to this list, so most requests can just pass in nil.
;;;***
-;;;### (autoloads (url-file) "url-file" "url/url-file.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (url-file) "url-file" "url/url-file.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from url/url-file.el
(autoload 'url-file "url-file" "\
@@ -28907,7 +28975,7 @@ Handle file: and ftp: URLs.
;;;***
;;;### (autoloads (url-open-stream url-gateway-nslookup-host) "url-gw"
-;;;;;; "url/url-gw.el" (20707 18685 911514 0))
+;;;;;; "url/url-gw.el" (20709 26818 907104 0))
;;; Generated autoloads from url/url-gw.el
(autoload 'url-gateway-nslookup-host "url-gw" "\
@@ -28927,7 +28995,7 @@ Might do a non-blocking connection; use `process-status' to check.
;;;### (autoloads (url-insert-file-contents url-file-local-copy url-copy-file
;;;;;; url-file-handler url-handler-mode) "url-handlers" "url/url-handlers.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from url/url-handlers.el
(defvar url-handler-mode nil "\
@@ -28981,8 +29049,8 @@ accessible.
;;;***
-;;;### (autoloads nil "url-http" "url/url-http.el" (20707 18685 911514
-;;;;;; 0))
+;;;### (autoloads nil "url-http" "url/url-http.el" (20766 59628 334727
+;;;;;; 618000))
;;; Generated autoloads from url/url-http.el
(autoload 'url-default-expander "url-expand")
@@ -28994,8 +29062,8 @@ accessible.
;;;***
-;;;### (autoloads (url-irc) "url-irc" "url/url-irc.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (url-irc) "url-irc" "url/url-irc.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from url/url-irc.el
(autoload 'url-irc "url-irc" "\
@@ -29005,8 +29073,8 @@ accessible.
;;;***
-;;;### (autoloads (url-ldap) "url-ldap" "url/url-ldap.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (url-ldap) "url-ldap" "url/url-ldap.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from url/url-ldap.el
(autoload 'url-ldap "url-ldap" "\
@@ -29020,7 +29088,7 @@ URL can be a URL string, or a URL vector of the type returned by
;;;***
;;;### (autoloads (url-mailto url-mail) "url-mailto" "url/url-mailto.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from url/url-mailto.el
(autoload 'url-mail "url-mailto" "\
@@ -29036,7 +29104,7 @@ Handle the mailto: URL syntax.
;;;***
;;;### (autoloads (url-data url-generic-emulator-loader url-info
-;;;;;; url-man) "url-misc" "url/url-misc.el" (20707 18685 911514
+;;;;;; url-man) "url-misc" "url/url-misc.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from url/url-misc.el
@@ -29069,7 +29137,7 @@ Fetch a data URL (RFC 2397).
;;;***
;;;### (autoloads (url-snews url-news) "url-news" "url/url-news.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from url/url-news.el
(autoload 'url-news "url-news" "\
@@ -29086,7 +29154,7 @@ Fetch a data URL (RFC 2397).
;;;### (autoloads (url-ns-user-pref url-ns-prefs isInNet isResolvable
;;;;;; dnsResolve dnsDomainIs isPlainHostName) "url-ns" "url/url-ns.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from url/url-ns.el
(autoload 'isPlainHostName "url-ns" "\
@@ -29127,7 +29195,7 @@ Fetch a data URL (RFC 2397).
;;;***
;;;### (autoloads (url-generic-parse-url url-recreate-url) "url-parse"
-;;;;;; "url/url-parse.el" (20707 18685 911514 0))
+;;;;;; "url/url-parse.el" (20709 26818 907104 0))
;;; Generated autoloads from url/url-parse.el
(autoload 'url-recreate-url "url-parse" "\
@@ -29179,7 +29247,7 @@ parses to
;;;***
;;;### (autoloads (url-setup-privacy-info) "url-privacy" "url/url-privacy.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from url/url-privacy.el
(autoload 'url-setup-privacy-info "url-privacy" "\
@@ -29190,7 +29258,7 @@ Setup variables that expose info about you and your system.
;;;***
;;;### (autoloads (url-queue-retrieve) "url-queue" "url/url-queue.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from url/url-queue.el
(autoload 'url-queue-retrieve "url-queue" "\
@@ -29210,8 +29278,8 @@ The variable `url-queue-timeout' sets a timeout.
;;;;;; url-percentage url-display-percentage url-pretty-length url-strip-leading-spaces
;;;;;; url-eat-trailing-space url-get-normalized-date url-lazy-message
;;;;;; url-normalize-url url-insert-entities-in-string url-parse-args
-;;;;;; url-debug url-debug) "url-util" "url/url-util.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; url-debug url-debug) "url-util" "url/url-util.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from url/url-util.el
(defvar url-debug nil "\
@@ -29385,7 +29453,7 @@ This uses `url-current-object', set locally to the buffer.
;;;***
;;;### (autoloads (ask-user-about-supersession-threat ask-user-about-lock)
-;;;;;; "userlock" "userlock.el" (20707 18685 911514 0))
+;;;;;; "userlock" "userlock.el" (20709 26818 907104 0))
;;; Generated autoloads from userlock.el
(autoload 'ask-user-about-lock "userlock" "\
@@ -29415,7 +29483,7 @@ The buffer in question is current when this function is called.
;;;### (autoloads (utf-7-imap-pre-write-conversion utf-7-pre-write-conversion
;;;;;; utf-7-imap-post-read-conversion utf-7-post-read-conversion)
-;;;;;; "utf-7" "international/utf-7.el" (20707 18685 911514 0))
+;;;;;; "utf-7" "international/utf-7.el" (20709 26818 907104 0))
;;; Generated autoloads from international/utf-7.el
(autoload 'utf-7-post-read-conversion "utf-7" "\
@@ -29440,8 +29508,8 @@ The buffer in question is current when this function is called.
;;;***
-;;;### (autoloads (utf7-encode) "utf7" "gnus/utf7.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (utf7-encode) "utf7" "gnus/utf7.el" (20791 9657
+;;;;;; 561026 0))
;;; Generated autoloads from gnus/utf7.el
(autoload 'utf7-encode "utf7" "\
@@ -29453,7 +29521,7 @@ Encode UTF-7 STRING. Use IMAP modification if FOR-IMAP is non-nil.
;;;### (autoloads (uudecode-decode-region uudecode-decode-region-internal
;;;;;; uudecode-decode-region-external) "uudecode" "mail/uudecode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from mail/uudecode.el
(autoload 'uudecode-decode-region-external "uudecode" "\
@@ -29483,8 +29551,8 @@ If FILE-NAME is non-nil, save the result to FILE-NAME.
;;;;;; vc-print-log vc-retrieve-tag vc-create-tag vc-merge vc-insert-headers
;;;;;; vc-revision-other-window vc-root-diff vc-ediff vc-version-ediff
;;;;;; vc-diff vc-version-diff vc-register vc-next-action vc-before-checkin-hook
-;;;;;; vc-checkin-hook vc-checkout-hook) "vc" "vc/vc.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; vc-checkin-hook vc-checkout-hook) "vc" "vc/vc.el" (20752
+;;;;;; 26669 524456 0))
;;; Generated autoloads from vc/vc.el
(defvar vc-checkout-hook nil "\
@@ -29730,11 +29798,15 @@ backend to NEW-BACKEND, and unregister FILE from the current backend.
(autoload 'vc-delete-file "vc" "\
Delete file and mark it as such in the version control system.
+If called interactively, read FILE, defaulting to the current
+buffer's file name if it's under version control.
\(fn FILE)" t nil)
(autoload 'vc-rename-file "vc" "\
Rename file OLD to NEW in both work area and repository.
+If called interactively, read OLD and NEW, defaulting OLD to the
+current buffer's file name if it's under version control.
\(fn OLD NEW)" t nil)
@@ -29762,7 +29834,7 @@ Return the branch part of a revision number REV.
;;;***
;;;### (autoloads (vc-annotate) "vc-annotate" "vc/vc-annotate.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from vc/vc-annotate.el
(autoload 'vc-annotate "vc-annotate" "\
@@ -29799,18 +29871,18 @@ mode-specific menu. `vc-annotate-color-map' and
;;;***
-;;;### (autoloads nil "vc-arch" "vc/vc-arch.el" (20707 18685 911514
+;;;### (autoloads nil "vc-arch" "vc/vc-arch.el" (20748 62911 684442
;;;;;; 0))
;;; Generated autoloads from vc/vc-arch.el
(defun vc-arch-registered (file)
(if (vc-find-root file "{arch}/=tagging-method")
(progn
- (load "vc-arch")
+ (load "vc-arch" nil t)
(vc-arch-registered file))))
;;;***
-;;;### (autoloads nil "vc-bzr" "vc/vc-bzr.el" (20707 18685 911514
+;;;### (autoloads nil "vc-bzr" "vc/vc-bzr.el" (20820 6311 856169
;;;;;; 0))
;;; Generated autoloads from vc/vc-bzr.el
@@ -29822,27 +29894,66 @@ Name of the format file in a .bzr directory.")
(defun vc-bzr-registered (file)
(if (vc-find-root file vc-bzr-admin-checkout-format-file)
(progn
- (load "vc-bzr")
+ (load "vc-bzr" nil t)
(vc-bzr-registered file))))
;;;***
-;;;### (autoloads nil "vc-cvs" "vc/vc-cvs.el" (20707 18685 911514
+;;;### (autoloads nil "vc-cvs" "vc/vc-cvs.el" (20748 62911 684442
;;;;;; 0))
;;; Generated autoloads from vc/vc-cvs.el
(defun vc-cvs-registered (f)
"Return non-nil if file F is registered with CVS."
(when (file-readable-p (expand-file-name
"CVS/Entries" (file-name-directory f)))
- (load "vc-cvs")
+ (load "vc-cvs" nil t)
(vc-cvs-registered f)))
;;;***
-;;;### (autoloads (vc-dir) "vc-dir" "vc/vc-dir.el" (20707 18685 911514
-;;;;;; 0))
+;;;### (autoloads (vc-dir vc-dir-mode) "vc-dir" "vc/vc-dir.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from vc/vc-dir.el
+(autoload 'vc-dir-mode "vc-dir" "\
+Major mode for VC directory buffers.
+Marking/Unmarking key bindings and actions:
+m - mark a file/directory
+ - if the region is active, mark all the files in region.
+ Restrictions: - a file cannot be marked if any parent directory is marked
+ - a directory cannot be marked if any child file or
+ directory is marked
+u - unmark a file/directory
+ - if the region is active, unmark all the files in region.
+M - if the cursor is on a file: mark all the files with the same state as
+ the current file
+ - if the cursor is on a directory: mark all child files
+ - with a prefix argument: mark all files
+U - if the cursor is on a file: unmark all the files with the same state
+ as the current file
+ - if the cursor is on a directory: unmark all child files
+ - with a prefix argument: unmark all files
+mouse-2 - toggles the mark state
+
+VC commands
+VC commands in the `C-x v' prefix can be used.
+VC commands act on the marked entries. If nothing is marked, VC
+commands act on the current entry.
+
+Search & Replace
+S - searches the marked files
+Q - does a query replace on the marked files
+M-s a C-s - does an isearch on the marked files
+M-s a C-M-s - does a regexp isearch on the marked files
+If nothing is marked, these commands act on the current entry.
+When a directory is current or marked, the Search & Replace
+commands act on the child files of that directory that are displayed in
+the *vc-dir* buffer.
+
+\\{vc-dir-mode-map}
+
+\(fn)" t nil)
+
(autoload 'vc-dir "vc-dir" "\
Show the VC status for \"interesting\" files in and below DIR.
This allows you to mark files and perform VC operations on them.
@@ -29865,7 +29976,7 @@ These are the commands available for use in the file status buffer:
;;;***
;;;### (autoloads (vc-do-command) "vc-dispatcher" "vc/vc-dispatcher.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from vc/vc-dispatcher.el
(autoload 'vc-do-command "vc-dispatcher" "\
@@ -29888,30 +29999,30 @@ case, and the process object in the asynchronous case.
;;;***
-;;;### (autoloads nil "vc-git" "vc/vc-git.el" (20707 18685 911514
+;;;### (autoloads nil "vc-git" "vc/vc-git.el" (20748 62911 684442
;;;;;; 0))
;;; Generated autoloads from vc/vc-git.el
(defun vc-git-registered (file)
"Return non-nil if FILE is registered with git."
(if (vc-find-root file ".git") ; Short cut.
(progn
- (load "vc-git")
+ (load "vc-git" nil t)
(vc-git-registered file))))
;;;***
-;;;### (autoloads nil "vc-hg" "vc/vc-hg.el" (20707 18685 911514 0))
+;;;### (autoloads nil "vc-hg" "vc/vc-hg.el" (20748 62911 684442 0))
;;; Generated autoloads from vc/vc-hg.el
(defun vc-hg-registered (file)
"Return non-nil if FILE is registered with hg."
(if (vc-find-root file ".hg") ; short cut
(progn
- (load "vc-hg")
+ (load "vc-hg" nil t)
(vc-hg-registered file))))
;;;***
-;;;### (autoloads nil "vc-mtn" "vc/vc-mtn.el" (20707 18685 911514
+;;;### (autoloads nil "vc-mtn" "vc/vc-mtn.el" (20748 62911 684442
;;;;;; 0))
;;; Generated autoloads from vc/vc-mtn.el
@@ -29923,13 +30034,13 @@ Name of the monotone directory's format file.")
(defun vc-mtn-registered (file)
(if (vc-find-root file vc-mtn-admin-format)
(progn
- (load "vc-mtn")
+ (load "vc-mtn" nil t)
(vc-mtn-registered file))))
;;;***
;;;### (autoloads (vc-rcs-master-templates) "vc-rcs" "vc/vc-rcs.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from vc/vc-rcs.el
(defvar vc-rcs-master-templates (purecopy '("%sRCS/%s,v" "%s%s,v" "%sRCS/%s")) "\
@@ -29943,7 +30054,7 @@ For a description of possible values, see `vc-check-master-templates'.")
;;;***
;;;### (autoloads (vc-sccs-master-templates) "vc-sccs" "vc/vc-sccs.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from vc/vc-sccs.el
(defvar vc-sccs-master-templates (purecopy '("%sSCCS/s.%s" "%ss.%s" vc-sccs-search-project-dir)) "\
@@ -29961,7 +30072,7 @@ find any project directory." (let ((project-dir (getenv "PROJECTDIR")) dirs dir)
;;;***
-;;;### (autoloads nil "vc-svn" "vc/vc-svn.el" (20707 18685 911514
+;;;### (autoloads nil "vc-svn" "vc/vc-svn.el" (20760 54070 584283
;;;;;; 0))
;;; Generated autoloads from vc/vc-svn.el
(defun vc-svn-registered (f)
@@ -29970,13 +30081,13 @@ find any project directory." (let ((project-dir (getenv "PROJECTDIR")) dirs dir)
"_svn")
(t ".svn"))))
(when (vc-find-root f admin-dir)
- (load "vc-svn")
+ (load "vc-svn" nil t)
(vc-svn-registered f))))
;;;***
;;;### (autoloads (vera-mode) "vera-mode" "progmodes/vera-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20777 63161 848428 0))
;;; Generated autoloads from progmodes/vera-mode.el
(add-to-list 'auto-mode-alist (cons (purecopy "\\.vr[hi]?\\'") 'vera-mode))
@@ -30034,7 +30145,7 @@ Key bindings:
;;;***
;;;### (autoloads (verilog-mode) "verilog-mode" "progmodes/verilog-mode.el"
-;;;;;; (20763 5110 492774 0))
+;;;;;; (20763 30266 231060 0))
;;; Generated autoloads from progmodes/verilog-mode.el
(autoload 'verilog-mode "verilog-mode" "\
@@ -30173,7 +30284,7 @@ Key bindings specific to `verilog-mode-map' are:
;;;***
;;;### (autoloads (vhdl-mode) "vhdl-mode" "progmodes/vhdl-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from progmodes/vhdl-mode.el
(autoload 'vhdl-mode "vhdl-mode" "\
@@ -30727,7 +30838,7 @@ Key bindings:
;;;***
-;;;### (autoloads (vi-mode) "vi" "emulation/vi.el" (20627 28531 447943
+;;;### (autoloads (vi-mode) "vi" "emulation/vi.el" (20566 63671 243798
;;;;;; 0))
;;; Generated autoloads from emulation/vi.el
@@ -30783,7 +30894,7 @@ Syntax table and abbrevs while in vi mode remain as they were in Emacs.
;;;### (autoloads (viqr-pre-write-conversion viqr-post-read-conversion
;;;;;; viet-encode-viqr-buffer viet-encode-viqr-region viet-decode-viqr-buffer
;;;;;; viet-decode-viqr-region viet-encode-viscii-char) "viet-util"
-;;;;;; "language/viet-util.el" (20707 18685 911514 0))
+;;;;;; "language/viet-util.el" (20709 26818 907104 0))
;;; Generated autoloads from language/viet-util.el
(autoload 'viet-encode-viscii-char "viet-util" "\
@@ -30831,7 +30942,7 @@ Convert Vietnamese characters of the current buffer to `VIQR' mnemonics.
;;;;;; view-mode view-buffer-other-frame view-buffer-other-window
;;;;;; view-buffer view-file-other-frame view-file-other-window
;;;;;; view-file kill-buffer-if-not-modified view-remove-frame-by-deleting)
-;;;;;; "view" "view.el" (20707 18685 911514 0))
+;;;;;; "view" "view.el" (20762 9398 526093 0))
;;; Generated autoloads from view.el
(defvar view-remove-frame-by-deleting t "\
@@ -30993,8 +31104,8 @@ Digits provide prefix arguments.
\\[View-scroll-to-buffer-end] scroll so that buffer end is at last line of window.
SPC scroll forward \"page size\" lines.
With prefix scroll forward prefix lines.
-DEL scroll backward \"page size\" lines.
- With prefix scroll backward prefix lines.
+DEL, S-SPC scroll backward \"page size\" lines.
+ With prefix scroll backward prefix lines.
\\[View-scroll-page-forward-set-page-size] like \\[View-scroll-page-forward] but with prefix sets \"page size\" to prefix.
\\[View-scroll-page-backward-set-page-size] like \\[View-scroll-page-backward] but with prefix sets \"page size\" to prefix.
\\[View-scroll-half-page-forward] scroll forward \"half page size\" lines. With prefix, sets
@@ -31061,7 +31172,7 @@ entry for the selected window, purge that entry from
\(fn BUFFER &optional ITEM)" nil nil)
-(make-obsolete 'view-return-to-alist-update '"this function has no effect." "24.1")
+(make-obsolete 'view-return-to-alist-update '"this function has no effect." '"24.1")
(autoload 'view-mode-enter "view" "\
Enter View mode and set up exit from view mode depending on optional arguments.
@@ -31087,8 +31198,8 @@ Exit View mode and make the current buffer editable.
;;;***
-;;;### (autoloads (vip-mode vip-setup) "vip" "emulation/vip.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (vip-mode vip-setup) "vip" "emulation/vip.el" (20799
+;;;;;; 169 640767 0))
;;; Generated autoloads from emulation/vip.el
(autoload 'vip-setup "vip" "\
@@ -31104,7 +31215,7 @@ Turn on VIP emulation of VI.
;;;***
;;;### (autoloads (viper-mode toggle-viper-mode) "viper" "emulation/viper.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20799 169 640767 0))
;;; Generated autoloads from emulation/viper.el
(autoload 'toggle-viper-mode "viper" "\
@@ -31121,7 +31232,7 @@ Turn on Viper emulation of Vi in Emacs. See Info node `(viper)Top'.
;;;***
;;;### (autoloads (warn lwarn display-warning) "warnings" "emacs-lisp/warnings.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emacs-lisp/warnings.el
(defvar warning-prefix-function nil "\
@@ -31211,7 +31322,7 @@ this is equivalent to `display-warning', using
;;;***
;;;### (autoloads (wdired-change-to-wdired-mode) "wdired" "wdired.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20791 9657 561026 0))
;;; Generated autoloads from wdired.el
(autoload 'wdired-change-to-wdired-mode "wdired" "\
@@ -31228,8 +31339,8 @@ See `wdired-mode'.
;;;***
-;;;### (autoloads (webjump) "webjump" "net/webjump.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (webjump) "webjump" "net/webjump.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from net/webjump.el
(autoload 'webjump "webjump" "\
@@ -31246,7 +31357,7 @@ Please submit bug reports and other feedback to the author, Neil W. Van Dyke
;;;***
;;;### (autoloads (which-function-mode) "which-func" "progmodes/which-func.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20725 15032 264919 0))
;;; Generated autoloads from progmodes/which-func.el
(put 'which-func-format 'risky-local-variable t)
(put 'which-func-current 'risky-local-variable t)
@@ -31279,8 +31390,8 @@ in certain major modes.
;;;### (autoloads (whitespace-report-region whitespace-report whitespace-cleanup-region
;;;;;; whitespace-cleanup global-whitespace-toggle-options whitespace-toggle-options
;;;;;; global-whitespace-newline-mode global-whitespace-mode whitespace-newline-mode
-;;;;;; whitespace-mode) "whitespace" "whitespace.el" (20707 18685
-;;;;;; 911514 0))
+;;;;;; whitespace-mode) "whitespace" "whitespace.el" (20809 36008
+;;;;;; 682209 0))
;;; Generated autoloads from whitespace.el
(autoload 'whitespace-mode "whitespace" "\
@@ -31679,8 +31790,8 @@ cleaning up these problems.
;;;***
;;;### (autoloads (widget-minor-mode widget-browse-other-window widget-browse
-;;;;;; widget-browse-at) "wid-browse" "wid-browse.el" (20707 18685
-;;;;;; 911514 0))
+;;;;;; widget-browse-at) "wid-browse" "wid-browse.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from wid-browse.el
(autoload 'widget-browse-at "wid-browse" "\
@@ -31709,8 +31820,8 @@ if ARG is omitted or nil.
;;;***
;;;### (autoloads (widget-setup widget-insert widget-delete widget-create
-;;;;;; widget-prompt-value widgetp) "wid-edit" "wid-edit.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; widget-prompt-value widgetp) "wid-edit" "wid-edit.el" (20716
+;;;;;; 56 356960 0))
;;; Generated autoloads from wid-edit.el
(autoload 'widgetp "wid-edit" "\
@@ -31753,8 +31864,8 @@ Setup current buffer so editing string widgets works.
;;;***
;;;### (autoloads (windmove-default-keybindings windmove-down windmove-right
-;;;;;; windmove-up windmove-left) "windmove" "windmove.el" (20707
-;;;;;; 18685 911514 0))
+;;;;;; windmove-up windmove-left) "windmove" "windmove.el" (20709
+;;;;;; 26818 907104 0))
;;; Generated autoloads from windmove.el
(autoload 'windmove-left "windmove" "\
@@ -31806,8 +31917,8 @@ Default MODIFIER is 'shift.
;;;***
-;;;### (autoloads (winner-mode) "winner" "winner.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (winner-mode) "winner" "winner.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from winner.el
(defvar winner-mode nil "\
@@ -31831,7 +31942,7 @@ the mode if ARG is omitted or nil, and toggle it if ARG is `toggle'.
;;;***
;;;### (autoloads (woman-bookmark-jump woman-find-file woman-dired-find-file
-;;;;;; woman woman-locale) "woman" "woman.el" (20707 18685 911514
+;;;;;; woman woman-locale) "woman" "woman.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from woman.el
@@ -31881,7 +31992,7 @@ Default bookmark handler for Woman buffers.
;;;***
;;;### (autoloads (wordstar-mode) "ws-mode" "emulation/ws-mode.el"
-;;;;;; (20707 18685 911514 0))
+;;;;;; (20709 26818 907104 0))
;;; Generated autoloads from emulation/ws-mode.el
(autoload 'wordstar-mode "ws-mode" "\
@@ -31993,8 +32104,8 @@ The key bindings are:
;;;***
-;;;### (autoloads (xesam-search) "xesam" "net/xesam.el" (20707 18685
-;;;;;; 911514 0))
+;;;### (autoloads (xesam-search) "xesam" "net/xesam.el" (20709 26818
+;;;;;; 907104 0))
;;; Generated autoloads from net/xesam.el
(autoload 'xesam-search "xesam" "\
@@ -32014,7 +32125,7 @@ Example:
;;;***
;;;### (autoloads (xml-parse-region xml-parse-file) "xml" "xml.el"
-;;;;;; (20764 37850 245357 0))
+;;;;;; (20766 6456 368550 0))
;;; Generated autoloads from xml.el
(autoload 'xml-parse-file "xml" "\
@@ -32071,7 +32182,7 @@ Both features can be combined by providing a cons cell
;;;***
;;;### (autoloads (xmltok-get-declared-encoding-position) "xmltok"
-;;;;;; "nxml/xmltok.el" (20707 18685 911514 0))
+;;;;;; "nxml/xmltok.el" (20709 26818 907104 0))
;;; Generated autoloads from nxml/xmltok.el
(autoload 'xmltok-get-declared-encoding-position "xmltok" "\
@@ -32089,8 +32200,8 @@ If LIMIT is non-nil, then do not consider characters beyond LIMIT.
;;;***
-;;;### (autoloads (xterm-mouse-mode) "xt-mouse" "xt-mouse.el" (20707
-;;;;;; 18685 911514 0))
+;;;### (autoloads (xterm-mouse-mode) "xt-mouse" "xt-mouse.el" (20797
+;;;;;; 44848 327754 0))
;;; Generated autoloads from xt-mouse.el
(defvar xterm-mouse-mode nil "\
@@ -32120,7 +32231,7 @@ down the SHIFT key while pressing the mouse button.
;;;***
;;;### (autoloads (yenc-extract-filename yenc-decode-region) "yenc"
-;;;;;; "gnus/yenc.el" (20707 18685 911514 0))
+;;;;;; "gnus/yenc.el" (20709 26818 907104 0))
;;; Generated autoloads from gnus/yenc.el
(autoload 'yenc-decode-region "yenc" "\
@@ -32135,34 +32246,7 @@ Extract file name from an yenc header.
;;;***
-;;;### (autoloads (psychoanalyze-pinhead apropos-zippy insert-zippyism
-;;;;;; yow) "yow" "play/yow.el" (20707 18685 911514 0))
-;;; Generated autoloads from play/yow.el
-
-(autoload 'yow "yow" "\
-Return or display a random Zippy quotation. With prefix arg, insert it.
-
-\(fn &optional INSERT DISPLAY)" t nil)
-
-(autoload 'insert-zippyism "yow" "\
-Prompt with completion for a known Zippy quotation, and insert it at point.
-
-\(fn &optional ZIPPYISM)" t nil)
-
-(autoload 'apropos-zippy "yow" "\
-Return a list of all Zippy quotes matching REGEXP.
-If called interactively, display a list of matches.
-
-\(fn REGEXP)" t nil)
-
-(autoload 'psychoanalyze-pinhead "yow" "\
-Zippy goes to the analyst.
-
-\(fn)" t nil)
-
-;;;***
-
-;;;### (autoloads (zone) "zone" "play/zone.el" (20707 18685 911514
+;;;### (autoloads (zone) "zone" "play/zone.el" (20709 26818 907104
;;;;;; 0))
;;; Generated autoloads from play/zone.el
@@ -32179,46 +32263,46 @@ Zone out, completely.
;;;;;; "calc/calc-fin.el" "calc/calc-forms.el" "calc/calc-frac.el"
;;;;;; "calc/calc-funcs.el" "calc/calc-graph.el" "calc/calc-help.el"
;;;;;; "calc/calc-incom.el" "calc/calc-keypd.el" "calc/calc-lang.el"
-;;;;;; "calc/calc-macs.el" "calc/calc-map.el" "calc/calc-math.el"
-;;;;;; "calc/calc-menu.el" "calc/calc-misc.el" "calc/calc-mode.el"
-;;;;;; "calc/calc-mtx.el" "calc/calc-nlfit.el" "calc/calc-poly.el"
-;;;;;; "calc/calc-prog.el" "calc/calc-rewr.el" "calc/calc-rules.el"
-;;;;;; "calc/calc-sel.el" "calc/calc-stat.el" "calc/calc-store.el"
-;;;;;; "calc/calc-stuff.el" "calc/calc-trail.el" "calc/calc-units.el"
-;;;;;; "calc/calc-vec.el" "calc/calc-yank.el" "calc/calcalg2.el"
-;;;;;; "calc/calcalg3.el" "calc/calccomp.el" "calc/calcsel2.el"
-;;;;;; "calendar/cal-bahai.el" "calendar/cal-coptic.el" "calendar/cal-french.el"
-;;;;;; "calendar/cal-html.el" "calendar/cal-islam.el" "calendar/cal-iso.el"
-;;;;;; "calendar/cal-julian.el" "calendar/cal-loaddefs.el" "calendar/cal-mayan.el"
-;;;;;; "calendar/cal-menu.el" "calendar/cal-move.el" "calendar/cal-persia.el"
-;;;;;; "calendar/cal-tex.el" "calendar/cal-x.el" "calendar/diary-loaddefs.el"
-;;;;;; "calendar/hol-loaddefs.el" "cdl.el" "cedet/cedet-cscope.el"
-;;;;;; "cedet/cedet-files.el" "cedet/cedet-global.el" "cedet/cedet-idutils.el"
-;;;;;; "cedet/cedet.el" "cedet/ede/auto.el" "cedet/ede/autoconf-edit.el"
-;;;;;; "cedet/ede/base.el" "cedet/ede/cpp-root.el" "cedet/ede/custom.el"
-;;;;;; "cedet/ede/dired.el" "cedet/ede/emacs.el" "cedet/ede/files.el"
-;;;;;; "cedet/ede/generic.el" "cedet/ede/linux.el" "cedet/ede/locate.el"
-;;;;;; "cedet/ede/make.el" "cedet/ede/makefile-edit.el" "cedet/ede/pconf.el"
-;;;;;; "cedet/ede/pmake.el" "cedet/ede/proj-archive.el" "cedet/ede/proj-aux.el"
-;;;;;; "cedet/ede/proj-comp.el" "cedet/ede/proj-elisp.el" "cedet/ede/proj-info.el"
-;;;;;; "cedet/ede/proj-misc.el" "cedet/ede/proj-obj.el" "cedet/ede/proj-prog.el"
-;;;;;; "cedet/ede/proj-scheme.el" "cedet/ede/proj-shared.el" "cedet/ede/proj.el"
-;;;;;; "cedet/ede/project-am.el" "cedet/ede/shell.el" "cedet/ede/simple.el"
-;;;;;; "cedet/ede/source.el" "cedet/ede/speedbar.el" "cedet/ede/srecode.el"
-;;;;;; "cedet/ede/system.el" "cedet/ede/util.el" "cedet/pulse.el"
-;;;;;; "cedet/semantic/analyze.el" "cedet/semantic/analyze/complete.el"
-;;;;;; "cedet/semantic/analyze/debug.el" "cedet/semantic/analyze/fcn.el"
-;;;;;; "cedet/semantic/analyze/refs.el" "cedet/semantic/bovine.el"
-;;;;;; "cedet/semantic/bovine/c-by.el" "cedet/semantic/bovine/c.el"
-;;;;;; "cedet/semantic/bovine/debug.el" "cedet/semantic/bovine/el.el"
-;;;;;; "cedet/semantic/bovine/gcc.el" "cedet/semantic/bovine/make-by.el"
-;;;;;; "cedet/semantic/bovine/make.el" "cedet/semantic/bovine/scm-by.el"
-;;;;;; "cedet/semantic/bovine/scm.el" "cedet/semantic/chart.el"
-;;;;;; "cedet/semantic/complete.el" "cedet/semantic/ctxt.el" "cedet/semantic/db-debug.el"
-;;;;;; "cedet/semantic/db-ebrowse.el" "cedet/semantic/db-el.el"
-;;;;;; "cedet/semantic/db-file.el" "cedet/semantic/db-find.el" "cedet/semantic/db-global.el"
-;;;;;; "cedet/semantic/db-javascript.el" "cedet/semantic/db-mode.el"
-;;;;;; "cedet/semantic/db-ref.el" "cedet/semantic/db-typecache.el"
+;;;;;; "calc/calc-loaddefs.el" "calc/calc-macs.el" "calc/calc-map.el"
+;;;;;; "calc/calc-math.el" "calc/calc-menu.el" "calc/calc-misc.el"
+;;;;;; "calc/calc-mode.el" "calc/calc-mtx.el" "calc/calc-nlfit.el"
+;;;;;; "calc/calc-poly.el" "calc/calc-prog.el" "calc/calc-rewr.el"
+;;;;;; "calc/calc-rules.el" "calc/calc-sel.el" "calc/calc-stat.el"
+;;;;;; "calc/calc-store.el" "calc/calc-stuff.el" "calc/calc-trail.el"
+;;;;;; "calc/calc-units.el" "calc/calc-vec.el" "calc/calc-yank.el"
+;;;;;; "calc/calcalg2.el" "calc/calcalg3.el" "calc/calccomp.el"
+;;;;;; "calc/calcsel2.el" "calendar/cal-bahai.el" "calendar/cal-coptic.el"
+;;;;;; "calendar/cal-french.el" "calendar/cal-html.el" "calendar/cal-islam.el"
+;;;;;; "calendar/cal-iso.el" "calendar/cal-julian.el" "calendar/cal-loaddefs.el"
+;;;;;; "calendar/cal-mayan.el" "calendar/cal-menu.el" "calendar/cal-move.el"
+;;;;;; "calendar/cal-persia.el" "calendar/cal-tex.el" "calendar/cal-x.el"
+;;;;;; "calendar/diary-loaddefs.el" "calendar/hol-loaddefs.el" "cdl.el"
+;;;;;; "cedet/cedet-cscope.el" "cedet/cedet-files.el" "cedet/cedet-global.el"
+;;;;;; "cedet/cedet-idutils.el" "cedet/cedet.el" "cedet/ede/auto.el"
+;;;;;; "cedet/ede/autoconf-edit.el" "cedet/ede/base.el" "cedet/ede/cpp-root.el"
+;;;;;; "cedet/ede/custom.el" "cedet/ede/dired.el" "cedet/ede/emacs.el"
+;;;;;; "cedet/ede/files.el" "cedet/ede/generic.el" "cedet/ede/linux.el"
+;;;;;; "cedet/ede/loaddefs.el" "cedet/ede/locate.el" "cedet/ede/make.el"
+;;;;;; "cedet/ede/makefile-edit.el" "cedet/ede/pconf.el" "cedet/ede/pmake.el"
+;;;;;; "cedet/ede/proj-archive.el" "cedet/ede/proj-aux.el" "cedet/ede/proj-comp.el"
+;;;;;; "cedet/ede/proj-elisp.el" "cedet/ede/proj-info.el" "cedet/ede/proj-misc.el"
+;;;;;; "cedet/ede/proj-obj.el" "cedet/ede/proj-prog.el" "cedet/ede/proj-scheme.el"
+;;;;;; "cedet/ede/proj-shared.el" "cedet/ede/proj.el" "cedet/ede/project-am.el"
+;;;;;; "cedet/ede/shell.el" "cedet/ede/simple.el" "cedet/ede/source.el"
+;;;;;; "cedet/ede/speedbar.el" "cedet/ede/srecode.el" "cedet/ede/system.el"
+;;;;;; "cedet/ede/util.el" "cedet/pulse.el" "cedet/semantic/analyze.el"
+;;;;;; "cedet/semantic/analyze/complete.el" "cedet/semantic/analyze/debug.el"
+;;;;;; "cedet/semantic/analyze/fcn.el" "cedet/semantic/analyze/refs.el"
+;;;;;; "cedet/semantic/bovine.el" "cedet/semantic/bovine/c-by.el"
+;;;;;; "cedet/semantic/bovine/c.el" "cedet/semantic/bovine/debug.el"
+;;;;;; "cedet/semantic/bovine/el.el" "cedet/semantic/bovine/gcc.el"
+;;;;;; "cedet/semantic/bovine/make-by.el" "cedet/semantic/bovine/make.el"
+;;;;;; "cedet/semantic/bovine/scm-by.el" "cedet/semantic/bovine/scm.el"
+;;;;;; "cedet/semantic/chart.el" "cedet/semantic/complete.el" "cedet/semantic/ctxt.el"
+;;;;;; "cedet/semantic/db-debug.el" "cedet/semantic/db-ebrowse.el"
+;;;;;; "cedet/semantic/db-el.el" "cedet/semantic/db-file.el" "cedet/semantic/db-find.el"
+;;;;;; "cedet/semantic/db-global.el" "cedet/semantic/db-javascript.el"
+;;;;;; "cedet/semantic/db-mode.el" "cedet/semantic/db-ref.el" "cedet/semantic/db-typecache.el"
;;;;;; "cedet/semantic/db.el" "cedet/semantic/debug.el" "cedet/semantic/decorate.el"
;;;;;; "cedet/semantic/decorate/include.el" "cedet/semantic/decorate/mode.el"
;;;;;; "cedet/semantic/dep.el" "cedet/semantic/doc.el" "cedet/semantic/ede-grammar.el"
@@ -32226,13 +32310,13 @@ Zone out, completely.
;;;;;; "cedet/semantic/fw.el" "cedet/semantic/grammar-wy.el" "cedet/semantic/grammar.el"
;;;;;; "cedet/semantic/html.el" "cedet/semantic/ia-sb.el" "cedet/semantic/ia.el"
;;;;;; "cedet/semantic/idle.el" "cedet/semantic/imenu.el" "cedet/semantic/java.el"
-;;;;;; "cedet/semantic/lex-spp.el" "cedet/semantic/lex.el" "cedet/semantic/mru-bookmark.el"
-;;;;;; "cedet/semantic/sb.el" "cedet/semantic/scope.el" "cedet/semantic/senator.el"
-;;;;;; "cedet/semantic/sort.el" "cedet/semantic/symref.el" "cedet/semantic/symref/cscope.el"
-;;;;;; "cedet/semantic/symref/filter.el" "cedet/semantic/symref/global.el"
-;;;;;; "cedet/semantic/symref/grep.el" "cedet/semantic/symref/idutils.el"
-;;;;;; "cedet/semantic/symref/list.el" "cedet/semantic/tag-file.el"
-;;;;;; "cedet/semantic/tag-ls.el" "cedet/semantic/tag-write.el"
+;;;;;; "cedet/semantic/lex-spp.el" "cedet/semantic/lex.el" "cedet/semantic/loaddefs.el"
+;;;;;; "cedet/semantic/mru-bookmark.el" "cedet/semantic/sb.el" "cedet/semantic/scope.el"
+;;;;;; "cedet/semantic/senator.el" "cedet/semantic/sort.el" "cedet/semantic/symref.el"
+;;;;;; "cedet/semantic/symref/cscope.el" "cedet/semantic/symref/filter.el"
+;;;;;; "cedet/semantic/symref/global.el" "cedet/semantic/symref/grep.el"
+;;;;;; "cedet/semantic/symref/idutils.el" "cedet/semantic/symref/list.el"
+;;;;;; "cedet/semantic/tag-file.el" "cedet/semantic/tag-ls.el" "cedet/semantic/tag-write.el"
;;;;;; "cedet/semantic/tag.el" "cedet/semantic/texi.el" "cedet/semantic/util-modes.el"
;;;;;; "cedet/semantic/util.el" "cedet/semantic/wisent.el" "cedet/semantic/wisent/comp.el"
;;;;;; "cedet/semantic/wisent/java-tags.el" "cedet/semantic/wisent/javascript.el"
@@ -32244,11 +32328,11 @@ Zone out, completely.
;;;;;; "cedet/srecode/el.el" "cedet/srecode/expandproto.el" "cedet/srecode/extract.el"
;;;;;; "cedet/srecode/fields.el" "cedet/srecode/filters.el" "cedet/srecode/find.el"
;;;;;; "cedet/srecode/getset.el" "cedet/srecode/insert.el" "cedet/srecode/java.el"
-;;;;;; "cedet/srecode/map.el" "cedet/srecode/mode.el" "cedet/srecode/semantic.el"
-;;;;;; "cedet/srecode/srt-wy.el" "cedet/srecode/srt.el" "cedet/srecode/table.el"
-;;;;;; "cedet/srecode/template.el" "cedet/srecode/texi.el" "cus-dep.el"
-;;;;;; "dframe.el" "dired-aux.el" "dired-x.el" "dos-fns.el" "dos-vars.el"
-;;;;;; "dos-w32.el" "dynamic-setting.el" "emacs-lisp/authors.el"
+;;;;;; "cedet/srecode/loaddefs.el" "cedet/srecode/map.el" "cedet/srecode/mode.el"
+;;;;;; "cedet/srecode/semantic.el" "cedet/srecode/srt-wy.el" "cedet/srecode/srt.el"
+;;;;;; "cedet/srecode/table.el" "cedet/srecode/template.el" "cedet/srecode/texi.el"
+;;;;;; "cus-dep.el" "dframe.el" "dired-aux.el" "dired-x.el" "dos-fns.el"
+;;;;;; "dos-vars.el" "dos-w32.el" "dynamic-setting.el" "emacs-lisp/authors.el"
;;;;;; "emacs-lisp/avl-tree.el" "emacs-lisp/bindat.el" "emacs-lisp/byte-opt.el"
;;;;;; "emacs-lisp/chart.el" "emacs-lisp/cl-extra.el" "emacs-lisp/cl-loaddefs.el"
;;;;;; "emacs-lisp/cl-macs.el" "emacs-lisp/cl-seq.el" "emacs-lisp/cl.el"
@@ -32267,32 +32351,33 @@ Zone out, completely.
;;;;;; "eshell/em-glob.el" "eshell/em-hist.el" "eshell/em-ls.el"
;;;;;; "eshell/em-pred.el" "eshell/em-prompt.el" "eshell/em-rebind.el"
;;;;;; "eshell/em-script.el" "eshell/em-smart.el" "eshell/em-term.el"
-;;;;;; "eshell/em-unix.el" "eshell/em-xtra.el" "eshell/esh-arg.el"
-;;;;;; "eshell/esh-cmd.el" "eshell/esh-ext.el" "eshell/esh-io.el"
-;;;;;; "eshell/esh-module.el" "eshell/esh-opt.el" "eshell/esh-proc.el"
-;;;;;; "eshell/esh-util.el" "eshell/esh-var.el" "ezimage.el" "foldout.el"
-;;;;;; "format-spec.el" "fringe.el" "generic-x.el" "gnus/compface.el"
-;;;;;; "gnus/gnus-async.el" "gnus/gnus-bcklg.el" "gnus/gnus-cite.el"
-;;;;;; "gnus/gnus-cus.el" "gnus/gnus-demon.el" "gnus/gnus-dup.el"
-;;;;;; "gnus/gnus-eform.el" "gnus/gnus-ems.el" "gnus/gnus-int.el"
-;;;;;; "gnus/gnus-logic.el" "gnus/gnus-mh.el" "gnus/gnus-salt.el"
-;;;;;; "gnus/gnus-score.el" "gnus/gnus-setup.el" "gnus/gnus-srvr.el"
-;;;;;; "gnus/gnus-topic.el" "gnus/gnus-undo.el" "gnus/gnus-util.el"
-;;;;;; "gnus/gnus-uu.el" "gnus/gnus-vm.el" "gnus/gssapi.el" "gnus/ietf-drums.el"
-;;;;;; "gnus/legacy-gnus-agent.el" "gnus/mail-parse.el" "gnus/mail-prsvr.el"
-;;;;;; "gnus/mail-source.el" "gnus/mailcap.el" "gnus/messcompat.el"
-;;;;;; "gnus/mm-archive.el" "gnus/mm-bodies.el" "gnus/mm-decode.el"
-;;;;;; "gnus/mm-util.el" "gnus/mm-view.el" "gnus/mml-sec.el" "gnus/mml-smime.el"
-;;;;;; "gnus/nnagent.el" "gnus/nnbabyl.el" "gnus/nndir.el" "gnus/nndraft.el"
-;;;;;; "gnus/nneething.el" "gnus/nngateway.el" "gnus/nnheader.el"
-;;;;;; "gnus/nnimap.el" "gnus/nnir.el" "gnus/nnmail.el" "gnus/nnmaildir.el"
-;;;;;; "gnus/nnmairix.el" "gnus/nnmbox.el" "gnus/nnmh.el" "gnus/nnnil.el"
-;;;;;; "gnus/nnoo.el" "gnus/nnregistry.el" "gnus/nnrss.el" "gnus/nnspool.el"
-;;;;;; "gnus/nntp.el" "gnus/nnvirtual.el" "gnus/nnweb.el" "gnus/registry.el"
-;;;;;; "gnus/rfc1843.el" "gnus/rfc2045.el" "gnus/rfc2047.el" "gnus/rfc2104.el"
-;;;;;; "gnus/rfc2231.el" "gnus/rtree.el" "gnus/shr-color.el" "gnus/sieve-manage.el"
-;;;;;; "gnus/smime.el" "gnus/spam-stat.el" "gnus/spam-wash.el" "hex-util.el"
-;;;;;; "hfy-cmap.el" "ibuf-ext.el" "international/cp51932.el" "international/eucjp-ms.el"
+;;;;;; "eshell/em-tramp.el" "eshell/em-unix.el" "eshell/em-xtra.el"
+;;;;;; "eshell/esh-arg.el" "eshell/esh-cmd.el" "eshell/esh-ext.el"
+;;;;;; "eshell/esh-groups.el" "eshell/esh-io.el" "eshell/esh-module.el"
+;;;;;; "eshell/esh-opt.el" "eshell/esh-proc.el" "eshell/esh-util.el"
+;;;;;; "eshell/esh-var.el" "ezimage.el" "foldout.el" "format-spec.el"
+;;;;;; "fringe.el" "generic-x.el" "gnus/compface.el" "gnus/gnus-async.el"
+;;;;;; "gnus/gnus-bcklg.el" "gnus/gnus-cite.el" "gnus/gnus-cus.el"
+;;;;;; "gnus/gnus-demon.el" "gnus/gnus-dup.el" "gnus/gnus-eform.el"
+;;;;;; "gnus/gnus-ems.el" "gnus/gnus-int.el" "gnus/gnus-logic.el"
+;;;;;; "gnus/gnus-mh.el" "gnus/gnus-salt.el" "gnus/gnus-score.el"
+;;;;;; "gnus/gnus-setup.el" "gnus/gnus-srvr.el" "gnus/gnus-topic.el"
+;;;;;; "gnus/gnus-undo.el" "gnus/gnus-util.el" "gnus/gnus-uu.el"
+;;;;;; "gnus/gnus-vm.el" "gnus/gssapi.el" "gnus/ietf-drums.el" "gnus/legacy-gnus-agent.el"
+;;;;;; "gnus/mail-parse.el" "gnus/mail-prsvr.el" "gnus/mail-source.el"
+;;;;;; "gnus/mailcap.el" "gnus/messcompat.el" "gnus/mm-archive.el"
+;;;;;; "gnus/mm-bodies.el" "gnus/mm-decode.el" "gnus/mm-util.el"
+;;;;;; "gnus/mm-view.el" "gnus/mml-sec.el" "gnus/mml-smime.el" "gnus/nnagent.el"
+;;;;;; "gnus/nnbabyl.el" "gnus/nndir.el" "gnus/nndraft.el" "gnus/nneething.el"
+;;;;;; "gnus/nngateway.el" "gnus/nnheader.el" "gnus/nnimap.el" "gnus/nnir.el"
+;;;;;; "gnus/nnmail.el" "gnus/nnmaildir.el" "gnus/nnmairix.el" "gnus/nnmbox.el"
+;;;;;; "gnus/nnmh.el" "gnus/nnnil.el" "gnus/nnoo.el" "gnus/nnregistry.el"
+;;;;;; "gnus/nnrss.el" "gnus/nnspool.el" "gnus/nntp.el" "gnus/nnvirtual.el"
+;;;;;; "gnus/nnweb.el" "gnus/registry.el" "gnus/rfc1843.el" "gnus/rfc2045.el"
+;;;;;; "gnus/rfc2047.el" "gnus/rfc2104.el" "gnus/rfc2231.el" "gnus/rtree.el"
+;;;;;; "gnus/shr-color.el" "gnus/sieve-manage.el" "gnus/smime.el"
+;;;;;; "gnus/spam-stat.el" "gnus/spam-wash.el" "hex-util.el" "hfy-cmap.el"
+;;;;;; "ibuf-ext.el" "international/cp51932.el" "international/eucjp-ms.el"
;;;;;; "international/fontset.el" "international/iso-ascii.el" "international/ja-dic-cnv.el"
;;;;;; "international/ja-dic-utl.el" "international/ogonek.el" "international/uni-bidi.el"
;;;;;; "international/uni-category.el" "international/uni-combining.el"
@@ -32319,11 +32404,11 @@ Zone out, completely.
;;;;;; "net/hmac-def.el" "net/hmac-md5.el" "net/imap.el" "net/ldap.el"
;;;;;; "net/mairix.el" "net/newsticker.el" "net/ntlm.el" "net/sasl-cram.el"
;;;;;; "net/sasl-digest.el" "net/sasl-ntlm.el" "net/sasl.el" "net/soap-client.el"
-;;;;;; "net/soap-inspect.el" "net/socks.el" "net/tls.el" "net/tramp-cache.el"
-;;;;;; "net/tramp-cmds.el" "net/tramp-compat.el" "net/tramp-gvfs.el"
-;;;;;; "net/tramp-gw.el" "net/tramp-loaddefs.el" "net/tramp-sh.el"
-;;;;;; "net/tramp-smb.el" "net/tramp-uu.el" "net/trampver.el" "net/zeroconf.el"
-;;;;;; "notifications.el" "nxml/nxml-enc.el" "nxml/nxml-maint.el"
+;;;;;; "net/soap-inspect.el" "net/socks.el" "net/tls.el" "net/tramp-adb.el"
+;;;;;; "net/tramp-cache.el" "net/tramp-cmds.el" "net/tramp-compat.el"
+;;;;;; "net/tramp-gvfs.el" "net/tramp-gw.el" "net/tramp-loaddefs.el"
+;;;;;; "net/tramp-sh.el" "net/tramp-smb.el" "net/tramp-uu.el" "net/trampver.el"
+;;;;;; "net/zeroconf.el" "notifications.el" "nxml/nxml-enc.el" "nxml/nxml-maint.el"
;;;;;; "nxml/nxml-ns.el" "nxml/nxml-outln.el" "nxml/nxml-parse.el"
;;;;;; "nxml/nxml-rap.el" "nxml/nxml-util.el" "nxml/rng-dt.el" "nxml/rng-loc.el"
;;;;;; "nxml/rng-maint.el" "nxml/rng-match.el" "nxml/rng-parse.el"
@@ -32381,8 +32466,8 @@ Zone out, completely.
;;;;;; "vc/ediff-ptch.el" "vc/ediff-vers.el" "vc/ediff-wind.el"
;;;;;; "vc/pcvs-info.el" "vc/pcvs-parse.el" "vc/pcvs-util.el" "vc/vc-dav.el"
;;;;;; "vcursor.el" "vt-control.el" "vt100-led.el" "w32-common-fns.el"
-;;;;;; "w32-fns.el" "w32-vars.el" "x-dnd.el") (20789 27603 535991
-;;;;;; 386000))
+;;;;;; "w32-fns.el" "w32-vars.el" "x-dnd.el") (20825 24458 310780
+;;;;;; 797000))
;;;***
diff --git a/lisp/locate.el b/lisp/locate.el
index 804260969ee..ab0417070e7 100644
--- a/lisp/locate.el
+++ b/lisp/locate.el
@@ -496,6 +496,7 @@ do not work in subdirectories.
(setq revert-buffer-function 'locate-update)
(set (make-local-variable 'page-delimiter) "\n\n")
(run-mode-hooks 'locate-mode-hook))
+(put 'locate-mode 'derived-mode-parent 'dired-mode)
(defun locate-do-setup (search-string)
(goto-char (point-min))
diff --git a/lisp/mail/emacsbug.el b/lisp/mail/emacsbug.el
index 8ed645b15a2..c1bc7e2e1ab 100644
--- a/lisp/mail/emacsbug.el
+++ b/lisp/mail/emacsbug.el
@@ -60,10 +60,6 @@
;; User options end here.
-(defvar report-emacs-bug-tracker-url "http://debbugs.gnu.org/cgi/"
- "Base URL of the GNU bugtracker.
-Used for querying duplicates and linking to existing bugs.")
-
(defvar report-emacs-bug-orig-text nil
"The automatically-created initial text of the bug report.")
@@ -160,11 +156,6 @@ Prompts for bug subject. Leaves you in a mail buffer."
(when (string-match "^\\(\\([.0-9]+\\)*\\)\\.[0-9]+$" emacs-version)
(setq topic (concat (match-string 1 emacs-version) "; " topic))))
(let ((from-buffer (current-buffer))
- ;; Put these properties on semantically-void text.
- ;; report-emacs-bug-hook deletes these regions before sending.
- (prompt-properties '(field emacsbug-prompt
- intangible but-helpful
- rear-nonsticky t))
(can-insert-mail (or (report-emacs-bug-can-use-xdg-email)
(report-emacs-bug-can-use-osx-open)))
user-point message-end-point)
@@ -194,7 +185,7 @@ Prompts for bug subject. Leaves you in a mail buffer."
(insert (format "The report will be sent to %s.\n\n"
report-emacs-bug-address))
(insert "This bug report will be sent to the ")
- (insert-button
+ (insert-text-button
"Bug-GNU-Emacs"
'face 'link
'help-echo (concat "mouse-2, RET: Follow this link")
@@ -202,7 +193,7 @@ Prompts for bug subject. Leaves you in a mail buffer."
(browse-url "http://lists.gnu.org/archive/html/bug-gnu-emacs/"))
'follow-link t)
(insert " mailing list\nand the GNU bug tracker at ")
- (insert-button
+ (insert-text-button
"debbugs.gnu.org"
'face 'link
'help-echo (concat "mouse-2, RET: Follow this link")
@@ -220,11 +211,10 @@ usually do not have translators for other languages.\n\n")))
(insert "Please describe exactly what actions triggered the bug, and\n"
"the precise symptoms of the bug. If you can, give a recipe\n"
"starting from `emacs -Q':\n\n")
- (add-text-properties (save-excursion
- (rfc822-goto-eoh)
- (line-beginning-position 2))
- (point)
- prompt-properties)
+ (let ((txt (delete-and-extract-region
+ (save-excursion (rfc822-goto-eoh) (line-beginning-position 2))
+ (point))))
+ (insert (propertize "\n" 'display txt)))
(setq user-point (point))
(insert "\n\n")
@@ -236,7 +226,8 @@ usually do not have translators for other languages.\n\n")))
(if (file-readable-p debug-file)
(insert "For information about debugging Emacs, please read the file\n"
debug-file ".\n")))
- (add-text-properties (1+ user-point) (point) prompt-properties)
+ (let ((txt (delete-and-extract-region (1+ user-point) (point))))
+ (insert (propertize "\n" 'display txt)))
(insert "\n\nIn " (emacs-version) "\n")
(if (stringp emacs-bzr-version)
@@ -434,100 +425,8 @@ and send the mail again%s."
from))
(not (yes-or-no-p
(format "Is `%s' really your email address? " from)))
- (error "Please edit the From address and try again"))))
- ;; Delete the uninteresting text that was just to help fill out the report.
- (rfc822-goto-eoh)
- (forward-line 1)
- (let ((pos (1- (point))))
- (while (setq pos (text-property-any pos (point-max)
- 'field 'emacsbug-prompt))
- (delete-region pos (field-end (1+ pos)))))))
-
-
-;; Querying the bug database
-
-(defvar report-emacs-bug-bug-alist nil)
-(make-variable-buffer-local 'report-emacs-bug-bug-alist)
-(defvar report-emacs-bug-choice-widget nil)
-(make-variable-buffer-local 'report-emacs-bug-choice-widget)
-
-(defun report-emacs-bug-create-existing-bugs-buffer (bugs keywords)
- (switch-to-buffer (get-buffer-create "*Existing Emacs Bugs*"))
- (setq buffer-read-only t)
- (let ((inhibit-read-only t))
- (erase-buffer)
- (setq report-emacs-bug-bug-alist bugs)
- (widget-insert (propertize (concat "Already known bugs ("
- keywords "):\n\n")
- 'face 'bold))
- (if bugs
- (setq report-emacs-bug-choice-widget
- (apply 'widget-create 'radio-button-choice
- :value (caar bugs)
- (let (items)
- (dolist (bug bugs)
- (push (list
- 'url-link
- :format (concat "Bug#" (number-to-string (nth 2 bug))
- ": " (cadr bug) "\n %[%v%]\n")
- ;; FIXME: Why is only the link of the
- ;; active item clickable?
- (car bug))
- items))
- (nreverse items))))
- (widget-insert "No bugs matching your keywords found.\n"))
- (widget-insert "\n")
- (widget-create 'push-button
- :notify (lambda (&rest ignore)
- ;; TODO: Do something!
- (message "Reporting new bug!"))
- "Report new bug")
- (when bugs
- (widget-insert " ")
- (widget-create 'push-button
- :notify (lambda (&rest ignore)
- (let ((val (widget-value report-emacs-bug-choice-widget)))
- ;; TODO: Do something!
- (message "Appending to bug %s!"
- (nth 2 (assoc val report-emacs-bug-bug-alist)))))
- "Append to chosen bug"))
- (widget-insert " ")
- (widget-create 'push-button
- :notify (lambda (&rest ignore)
- (kill-buffer))
- "Quit reporting bug")
- (widget-insert "\n"))
- (use-local-map widget-keymap)
- (widget-setup)
- (goto-char (point-min)))
-
-(defun report-emacs-bug-parse-query-results (status keywords)
- (goto-char (point-min))
- (let (buglist)
- (while (re-search-forward "<a href=\"bugreport\\.cgi\\?bug=\\([[:digit:]]+\\)\">\\([^<]+\\)</a>" nil t)
- (let ((number (match-string 1))
- (subject (match-string 2)))
- (when (not (string-match "^#" subject))
- (push (list
- ;; first the bug URL
- (concat report-emacs-bug-tracker-url
- "bugreport.cgi?bug=" number)
- ;; then the subject and number
- subject (string-to-number number))
- buglist))))
- (report-emacs-bug-create-existing-bugs-buffer (nreverse buglist) keywords)))
-
-(defun report-emacs-bug-query-existing-bugs (keywords)
- "Query for KEYWORDS at `report-emacs-bug-tracker-url', and return the result.
-The result is an alist with items of the form (URL SUBJECT NO)."
- (interactive "sBug keywords (comma separated): ")
- (url-retrieve (concat report-emacs-bug-tracker-url
- "pkgreport.cgi?include=subject%3A"
- (replace-regexp-in-string "[[:space:]]+" "+" keywords)
- ";package=emacs")
- 'report-emacs-bug-parse-query-results (list keywords)))
-(make-obsolete 'report-emacs-bug-query-existing-bugs
- "use the `debbugs' package from GNU ELPA instead." "24.3")
+ (error "Please edit the From address and try again"))))))
+
(provide 'emacsbug)
diff --git a/lisp/mail/feedmail.el b/lisp/mail/feedmail.el
index 4305094611a..0502e7f9487 100644
--- a/lisp/mail/feedmail.el
+++ b/lisp/mail/feedmail.el
@@ -590,7 +590,7 @@ header is fiddled after the From: header is fiddled."
(defcustom feedmail-force-binary-write t
"If non-nil, force writing file as binary (this applies to queues and Fcc:).
On systems where there is a difference between binary and text files,
-feedmail will temporarily manipulate the value of `buffer-file-type'
+feedmail will temporarily manipulate the value of `coding-system-for-write'
to make the writing as binary. If nil, writing will be in text mode.
On systems where there is no distinction or where it is controlled by other
variables or other means, this option has no effect."
@@ -2016,7 +2016,6 @@ backup file names and the like)."
(setq buffer-offer-save nil)
(buffer-disable-undo blobby-buffer)
(insert-file-contents-literally maybe-file)
- (setq buffer-file-type t) ; binary
(goto-char (point-min))
;; if at least two line-endings with CRLF, translate the file
(if (looking-at ".*\r\n.*\r\n")
@@ -2334,7 +2333,10 @@ mapped to mostly alphanumerics for safety."
(setq filename buffer-file-name)
(setq filename (feedmail-create-queue-filename queue-directory)))
;; make binary file on DOS/Windows 95/Windows NT, etc
- (let ((buffer-file-type feedmail-force-binary-write))
+ (let ((coding-system-for-write
+ (if feedmail-force-binary-write
+ 'no-conversion
+ coding-system-for-write)))
(write-file filename))
;; convenient for moving from draft to q, for example
(if (and previous-buffer-file-name (or (not is-fqm) (not is-in-this-dir))
@@ -2571,26 +2573,27 @@ mapped to mostly alphanumerics for safety."
;; Re-insert and handle any Fcc fields (and, optionally,
;; any Bcc).
(when fcc
- (let ((old (default-value 'buffer-file-type)))
+ (let ((coding-system-for-write
+ (if (and (memq system-type '(ms-dos windows-nt))
+ feedmail-force-binary-write)
+ 'no-conversion
+ coding-system-for-write)))
(unwind-protect
(progn
- (setq-default buffer-file-type
- feedmail-force-binary-write)
(insert fcc)
(unless feedmail-nuke-bcc-in-fcc
(if bcc-holder (insert bcc-holder))
(if resent-bcc-holder
(insert resent-bcc-holder)))
-
+
(run-hooks 'feedmail-before-fcc-hook)
-
+
(when feedmail-nuke-body-in-fcc
(goto-char eoh-marker)
(if (natnump feedmail-nuke-body-in-fcc)
(forward-line feedmail-nuke-body-in-fcc))
(delete-region (point) (point-max)))
- (mail-do-fcc eoh-marker))
- (setq-default buffer-file-type old)))))
+ (mail-do-fcc eoh-marker))))))
;; User bailed out of one-last-look.
(if feedmail-queue-runner-is-active
(throw 'skip-me-q 'skip-me-q)
diff --git a/lisp/mail/mailabbrev.el b/lisp/mail/mailabbrev.el
index 271875e340c..981be8b6a98 100644
--- a/lisp/mail/mailabbrev.el
+++ b/lisp/mail/mailabbrev.el
@@ -182,7 +182,8 @@ no aliases, which is represented by this being a table with no entries.)")
(nth 5 (file-attributes mail-personal-alias-file)))
(build-mail-abbrevs)))
(mail-abbrevs-sync-aliases)
- (add-hook 'abbrev-expand-functions 'mail-abbrev-expand-wrapper nil t)
+ (add-function :around (local 'abbrev-expand-function)
+ #'mail-abbrev-expand-wrapper)
(abbrev-mode 1))
(defun mail-abbrevs-enable ()
@@ -472,10 +473,12 @@ of a mail alias. The value is set up, buffer-local, when first needed.")
(defun mail-abbrev-expand-wrapper (expand)
(if (and mail-abbrevs (not (eq mail-abbrevs t)))
- (if (mail-abbrev-in-expansion-header-p)
+ (if (or (mail-abbrev-in-expansion-header-p)
+ ;; Necessary for `message-read-from-minibuffer' to work.
+ (window-minibuffer-p))
- ;; We are in a To: (or CC:, or whatever) header, and
- ;; should use word-abbrevs to expand mail aliases.
+ ;; We are in a To: (or CC:, or whatever) header or a minibuffer,
+ ;; and should use word-abbrevs to expand mail aliases.
(let ((local-abbrev-table mail-abbrevs))
;; Before anything else, resolve aliases if they need it.
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el
index da19b367f1f..02703026e84 100644
--- a/lisp/mail/rmail.el
+++ b/lisp/mail/rmail.el
@@ -100,6 +100,10 @@ its character representation and its display representation.")
"The current header display style choice, one of
'normal (selected headers) or 'full (all headers).")
+(defvar rmail-mime-decoded nil
+ "Non-nil if message has been processed by `rmail-show-mime-function'.")
+(put 'rmail-mime-decoded 'permanent-local t) ; for rmail-edit
+
(defgroup rmail nil
"Mail reader for Emacs."
:group 'mail)
@@ -1081,6 +1085,7 @@ The buffer is expected to be narrowed to just the header of the message."
(define-key map "<" 'rmail-first-message)
(define-key map ">" 'rmail-last-message)
(define-key map " " 'scroll-up-command)
+ (define-key map [?\S-\ ] 'scroll-down-command)
(define-key map "\177" 'scroll-down-command)
(define-key map "?" 'describe-mode)
(define-key map "\C-c\C-s\C-d" 'rmail-sort-by-date)
@@ -1503,6 +1508,8 @@ If so restore the actual mbox message collection."
(setq file-precious-flag t)
(make-local-variable 'desktop-save-buffer)
(setq desktop-save-buffer t)
+ (make-local-variable 'save-buffer-coding-system)
+ (setq save-buffer-coding-system 'no-conversion)
(setq next-error-move-function 'rmail-next-error-move))
;; Handle M-x revert-buffer done in an rmail-mode buffer.
@@ -2169,20 +2176,35 @@ If MSGNUM is nil, use the current message."
(defun rmail-set-header-1 (name value)
"Subroutine of `rmail-set-header'.
-Narrow to header, set header NAME to VALUE, replacing existing if present.
-VALUE nil means to remove NAME altogether."
+Narrow to headers, set header NAME to VALUE, replacing existing if present.
+VALUE nil means to remove NAME altogether.
+
+Only changes the first instance of NAME. If VALUE is multi-line,
+continuation lines should already be indented. VALUE should not
+end in a newline."
(if (search-forward "\n\n" nil t)
(progn
(forward-char -1)
(narrow-to-region (point-min) (point))
+ ;; cf mail-fetch-field.
(goto-char (point-min))
- (if (re-search-forward (concat "^" (regexp-quote name) ":") nil 'move)
+ (if (let ((case-fold-search t))
+ (re-search-forward (concat "^" (regexp-quote name) "[ \t]*:")
+ nil 'move))
+ (let ((start (point))
+ end)
+ (while (and (zerop (forward-line 1))
+ (looking-at "[ \t]")))
+ ;; Back up over newline.
+ (forward-char -1)
+ (setq end (point))
+ (goto-char start)
(if value
(progn
- (delete-region (point) (line-end-position))
+ (delete-region start end)
(insert " " value))
- (delete-region (line-beginning-position)
- (line-beginning-position 2)))
+ (delete-region (line-beginning-position) (1+ end))))
+ ;; Not already present: insert at end of headers.
(if value (insert name ": " value "\n"))))
(rmail-error-bad-format)))
@@ -2699,6 +2721,27 @@ N defaults to the current message."
:group 'rmail
:version "23.1")
+;; FIXME?
+;; rmail-show-mime-function does not unquote >From lines. Should it?
+(defcustom rmail-mbox-format 'mboxrd
+ "The mbox format that your system uses.
+There is no way to determine this, so you should set the appropriate value.
+The formats quote lines containing \"From \" differently.
+The choices are:
+ `mboxo' : lines that start with \"From \" quoted as \">From \"
+ `mboxrd': lines that start with \">*From \" quoted with another \">\"
+The `mboxo' format is ambiguous, in that one cannot know whether
+a line starting with \">From \" originally had a \">\" or not.
+
+It is not critical to set this to the correct value; it only affects
+how Rmail displays lines starting with \">*From \" in non-MIME messages.
+
+See also `unrmail-mbox-format'."
+ :type '(choice (const mboxrd)
+ (const mboxro))
+ :version "24.4"
+ :group 'rmail-files)
+
(defun rmail-show-message-1 (&optional msg)
"Show message MSG (default: current message) using `rmail-view-buffer'.
Return text to display in the minibuffer if MSG is out of
@@ -2747,6 +2790,7 @@ The current mail message becomes the message displayed."
(re-search-forward "mime-version: 1.0" nil t))
(let ((rmail-buffer mbox-buf)
(rmail-view-buffer view-buf))
+ (set (make-local-variable 'rmail-mime-decoded) t)
(funcall rmail-show-mime-function))
(setq body-start (search-forward "\n\n" nil t))
(narrow-to-region beg (point))
@@ -2791,11 +2835,15 @@ The current mail message becomes the message displayed."
;; Prepare the separator (blank line) before the body.
(goto-char (point-min))
(insert "\n")
- ;; Unquote quoted From lines
- (while (re-search-forward "^>+From " nil t)
- (beginning-of-line)
- (delete-char 1)
- (forward-line))
+ ;; Unquote quoted From lines.
+ (let ((fromline (if (eq 'mboxrd rmail-mbox-format)
+ "^>+From "
+ "^>From "))
+ case-fold-search)
+ (while (re-search-forward fromline nil t)
+ (beginning-of-line)
+ (delete-char 1)
+ (forward-line)))
(goto-char (point-min)))
;; Copy the headers to the front of the message view buffer.
(rmail-copy-headers beg end)
@@ -3869,6 +3917,7 @@ see the documentation of `rmail-resend'."
(msgnum rmail-current-message)
(subject (concat "["
(let ((from (or (mail-fetch-field "From")
+ ;; FIXME - huh?
(mail-fetch-field ">From"))))
(if from
(concat (mail-strip-quoted-names from) ": ")
@@ -4193,31 +4242,25 @@ This has an effect only if a summary buffer exists."
;; Put the summary buffer back on the screen, if user wants that.
(defun rmail-maybe-display-summary ()
- (let ((selected (selected-window))
- (buffer (current-buffer))
- window)
- ;; If requested, make sure the summary is displayed.
- (and rmail-summary-buffer (buffer-name rmail-summary-buffer)
- rmail-redisplay-summary
- (if (get-buffer-window rmail-summary-buffer 0)
- ;; It's already in some frame; show that one.
- (let ((frame (window-frame
- (get-buffer-window rmail-summary-buffer 0))))
- (make-frame-visible frame)
- (raise-frame frame))
- (display-buffer rmail-summary-buffer)))
- ;; If requested, set the height of the summary window.
- (and rmail-summary-buffer (buffer-name rmail-summary-buffer)
- rmail-summary-window-size
- (setq window (get-buffer-window rmail-summary-buffer))
- ;; Don't try to change the size if just one window in frame.
- (not (eq window (frame-root-window (window-frame window))))
- (unwind-protect
- (progn
- (select-window window)
- (enlarge-window (- rmail-summary-window-size (window-height))))
- (select-window selected)
- (set-buffer buffer)))))
+ (cond
+ ((or (not rmail-summary-buffer)
+ (not (buffer-name rmail-summary-buffer))))
+ (rmail-redisplay-summary
+ ;; If `rmail-redisplay-summary' is non-nil, make sure the summary
+ ;; buffer is displayed.
+ (display-buffer
+ rmail-summary-buffer
+ `(nil
+ (reusable-frames . 0)
+ ,(when rmail-summary-window-size
+ `(window-height . ,rmail-summary-window-size)))))
+ (rmail-summary-window-size
+ ;; If `rmail-summary-window-size' is non-nil and the summary buffer
+ ;; is displayed, make sure it gets resized.
+ (let ((window (get-buffer-window rmail-summary-buffer 0)))
+ (when window
+ (window-resize-no-error
+ window (- rmail-summary-window-size (window-height window))))))))
;;;; *** Rmail Local Fontification ***
@@ -4552,7 +4595,7 @@ encoded string (and the same mask) will decode the string."
;;; Start of automatically extracted autoloads.
;;;### (autoloads (rmail-edit-current-message) "rmailedit" "rmailedit.el"
-;;;;;; "1aec1d54f9767ee0fea557bbfb1d547b")
+;;;;;; "0b056146d4775080a1847b8ce7527bc5")
;;; Generated autoloads from rmailedit.el
(autoload 'rmail-edit-current-message "rmailedit" "\
@@ -4607,7 +4650,7 @@ With prefix argument N moves forward N messages with these labels.
;;;***
-;;;### (autoloads (rmail-mime) "rmailmm" "rmailmm.el" "da37981a8295ba2411fdfb77488b1cc3")
+;;;### (autoloads (rmail-mime) "rmailmm" "rmailmm.el" "93951f748e43e1015da1b485088970ca")
;;; Generated autoloads from rmailmm.el
(autoload 'rmail-mime "rmailmm" "\
@@ -4709,7 +4752,7 @@ If prefix argument REVERSE is non-nil, sorts in reverse order.
;;;### (autoloads (rmail-summary-by-senders rmail-summary-by-topic
;;;;;; rmail-summary-by-regexp rmail-summary-by-recipients rmail-summary-by-labels
-;;;;;; rmail-summary) "rmailsum" "rmailsum.el" "341825201e892b8fc875c1ae49ffd560")
+;;;;;; rmail-summary) "rmailsum" "rmailsum.el" "119ce8b431f01e7f54bb6fa99603b3d9")
;;; Generated autoloads from rmailsum.el
(autoload 'rmail-summary "rmailsum" "\
diff --git a/lisp/mail/rmailedit.el b/lisp/mail/rmailedit.el
index b880e21b8ca..68fc35e0e2a 100644
--- a/lisp/mail/rmailedit.el
+++ b/lisp/mail/rmailedit.el
@@ -167,10 +167,25 @@ This function runs the hooks `text-mode-hook' and `rmail-edit-mode-hook'.
(if (or rmail-old-mime-state
(not rmail-old-pruned))
(forward-line 1))
- (while (re-search-forward "^>*From " nil t)
- (beginning-of-line)
- (insert ">")
- (forward-line))
+ ;; When editing a non-MIME message, rmail-show-message-1 has unescaped
+ ;; ^>*From lines according to rmail-mbox-format. We are editing
+ ;; the message as it was displayed, and need to put the escapes when done.
+ ;; When editing a MIME message, we are editing the "raw" message.
+ ;; ^>*From lines have not been escaped, but we still need to ensure
+ ;; a "^From " line is escaped so as not to break later parsing (?).
+ ;; With ^>+From lines, we have no way of knowing whether the person
+ ;; doing the editing escaped them or not, so it seems best to leave
+ ;; them alone. (This all assumes you are using rmailmm rather than
+ ;; something else that behaves differently.)
+ (let ((fromline (if (or (eq 'mboxo rmail-mbox-format)
+ rmail-mime-decoded)
+ "^From "
+ "^>*From "))
+ case-fold-search)
+ (while (re-search-forward fromline nil t)
+ (beginning-of-line)
+ (insert ">")
+ (forward-line)))
;; Make sure buffer ends with a blank line so as not to run this
;; message together with the following one.
(goto-char (point-max))
@@ -201,6 +216,7 @@ This function runs the hooks `text-mode-hook' and `rmail-edit-mode-hook'.
(setq buffer-undo-list t)
(rmail-variables))
;; If text has really changed, mark message as edited.
+ ;; FIXME we should do the comparison before escaping From lines.
(unless (and (= (length old) (- (point-max) (point-min)))
(string= old (buffer-substring (point-min) (point-max))))
(setq old nil)
diff --git a/lisp/mail/rmailmm.el b/lisp/mail/rmailmm.el
index 71590f51dcb..350e3dacbcf 100644
--- a/lisp/mail/rmailmm.el
+++ b/lisp/mail/rmailmm.el
@@ -1365,14 +1365,15 @@ The arguments ARG and STATE have no effect in this case."
(defun rmail-insert-mime-forwarded-message (forward-buffer)
"Insert the message in FORWARD-BUFFER as a forwarded message.
This is the usual value of `rmail-insert-mime-forwarded-message-function'."
- (let ((message-buffer
- (with-current-buffer forward-buffer
- (if rmail-buffer-swapped
- forward-buffer
- rmail-view-buffer))))
- (save-restriction
- (narrow-to-region (point) (point))
- (message-forward-make-body-mime message-buffer))))
+ (let (contents-buffer start end)
+ (with-current-buffer forward-buffer
+ (setq contents-buffer
+ (if rmail-buffer-swapped
+ rmail-view-buffer
+ forward-buffer)
+ start (rmail-msgbeg rmail-current-message)
+ end (rmail-msgend rmail-current-message)))
+ (message-forward-make-body-mime contents-buffer start end)))
(setq rmail-insert-mime-forwarded-message-function
'rmail-insert-mime-forwarded-message)
diff --git a/lisp/mail/rmailsum.el b/lisp/mail/rmailsum.el
index 5b906719c39..13cd7c3f05e 100644
--- a/lisp/mail/rmailsum.el
+++ b/lisp/mail/rmailsum.el
@@ -118,6 +118,7 @@ Setting this option to nil might speed up the generation of summaries."
(define-key map "<" 'rmail-summary-first-message)
(define-key map ">" 'rmail-summary-last-message)
(define-key map " " 'rmail-summary-scroll-msg-up)
+ (define-key map [?\S-\ ] 'rmail-summary-scroll-msg-down)
(define-key map "\177" 'rmail-summary-scroll-msg-down)
(define-key map "?" 'describe-mode)
(define-key map "\C-c\C-n" 'rmail-summary-next-same-subject)
diff --git a/lisp/mail/sendmail.el b/lisp/mail/sendmail.el
index e86229a5cfb..e1dee3295f2 100644
--- a/lisp/mail/sendmail.el
+++ b/lisp/mail/sendmail.el
@@ -1493,6 +1493,9 @@ just append to the file, in Babyl format if necessary."
(insert "\nMail-Followup-To: "))))
(defun mail-position-on-field (field &optional soft)
+ "Move to the start of the contents of header field FIELD.
+If there is none, insert one, unless SOFT is non-nil.
+If there are multiple FIELD fields, this goes to the first."
(let (end
(case-fold-search t))
(setq end (mail-header-end))
diff --git a/lisp/mail/smtpmail.el b/lisp/mail/smtpmail.el
index 534c5fcb523..5bfa29a0175 100644
--- a/lisp/mail/smtpmail.el
+++ b/lisp/mail/smtpmail.el
@@ -529,6 +529,18 @@ The list is in preference order.")
password (plist-get auth-info :secret)))
(when (functionp password)
(setq password (funcall password)))
+ (let ((result (catch 'done
+ (smtpmail-try-auth-method process mech user password))))
+ (if (stringp result)
+ (progn
+ (auth-source-forget+ :host host :port port)
+ (throw 'done result))
+ (when save-function
+ (funcall save-function))
+ result))))
+
+(defun smtpmail-try-auth-method (process mech user password)
+ (let (ret)
(cond
((or (not mech)
(not user)
@@ -554,16 +566,11 @@ The list is in preference order.")
;; are taken as a response to the server, and the
;; authentication fails.
(encoded (base64-encode-string response t)))
- (smtpmail-command-or-throw process encoded)
- (when save-function
- (funcall save-function)))))
+ (smtpmail-command-or-throw process encoded))))
((eq mech 'login)
(smtpmail-command-or-throw process "AUTH LOGIN")
- (smtpmail-command-or-throw
- process (base64-encode-string user t))
- (smtpmail-command-or-throw process (base64-encode-string password t))
- (when save-function
- (funcall save-function)))
+ (smtpmail-command-or-throw process (base64-encode-string user t))
+ (smtpmail-command-or-throw process (base64-encode-string password t)))
((eq mech 'plain)
;; We used to send an empty initial request, and wait for an
;; empty response, and then send the password, but this
@@ -574,9 +581,7 @@ The list is in preference order.")
process
(concat "AUTH PLAIN "
(base64-encode-string (concat "\0" user "\0" password) t))
- 235)
- (when save-function
- (funcall save-function)))
+ 235))
(t
(error "Mechanism %s not implemented" mech)))))
diff --git a/lisp/mail/unrmail.el b/lisp/mail/unrmail.el
index f6347d11051..698e9b0e0a0 100644
--- a/lisp/mail/unrmail.el
+++ b/lisp/mail/unrmail.el
@@ -1,4 +1,4 @@
-;;; unrmail.el --- convert Rmail Babyl files to mailbox files
+;;; unrmail.el --- convert Rmail Babyl files to mbox files
;; Copyright (C) 1992, 2001-2013 Free Software Foundation, Inc.
@@ -26,7 +26,7 @@
;;;###autoload
(defun batch-unrmail ()
- "Convert old-style Rmail Babyl files to system inbox format.
+ "Convert old-style Rmail Babyl files to mbox format.
Specify the input Rmail Babyl file names as command line arguments.
For each Rmail file, the corresponding output file name
is made by adding `.mail' at the end.
@@ -45,9 +45,26 @@ For example, invoke `emacs -batch -f batch-unrmail RMAIL'."
(declare-function mail-mbox-from "mail-utils" ())
(defvar rmime-magic-string) ; in rmime.el, if you have it
+(defcustom unrmail-mbox-format 'mboxrd
+ "The mbox format that `unrmail' should produce.
+These formats separate messages using lines that start with \"From \".
+Therefore any lines in the message bodies that start with \"From \"
+must be quoted. The `mboxo' format just prepends a \">\" to such lines.
+This is not reversible, because given a line starting with \">From \" in
+an mboxo file, it is not possible to know whether the original had a \">\"
+or not. The `mxbord' format avoids this by also quoting \">From \" as
+\">>From \", and so on. For this reason, mboxrd is recommended.
+
+See also `rmail-mbox-format'."
+ :type '(choice (const mboxrd)
+ (const mboxro))
+ :version "24.4"
+ :group 'rmail-files)
+
;;;###autoload
(defun unrmail (file to-file)
- "Convert old-style Rmail Babyl file FILE to system inbox format file TO-FILE."
+ "Convert old-style Rmail Babyl file FILE to mbox format file TO-FILE.
+The variable `unrmail-mbox-format' controls which mbox format to use."
(interactive "fUnrmail (babyl file): \nFUnrmail into (new mailbox file): ")
(with-temp-buffer
;; Read in the old Rmail file with no decoding.
@@ -223,14 +240,15 @@ For example, invoke `emacs -batch -f batch-unrmail RMAIL'."
(insert "X-RMAIL-ATTRIBUTES: " (apply 'string attrs) "\n")
(when keywords
(insert "X-RMAIL-KEYWORDS: " keywords "\n"))
- (goto-char (point-min))
- ;; ``Quote'' "\nFrom " as "\n>From "
- ;; (note that this isn't really quoting, as there is no requirement
- ;; that "\n[>]+From " be quoted in the same transparent way.)
- (let ((case-fold-search nil))
- (while (search-forward "\nFrom " nil t)
- (forward-char -5)
- (insert ?>)))
+ ;; Convert From to >From, etc.
+ (let ((case-fold-search nil)
+ (fromline (if (eq 'mboxrd unrmail-mbox-format)
+ "^>*From "
+ "^From ")))
+ (while (re-search-forward fromline nil t)
+ (beginning-of-line)
+ (insert ?>)
+ (forward-line 1)))
(goto-char (point-max))
;; Add terminator blank line to message.
(insert "\n")
diff --git a/lisp/makefile.w32-in b/lisp/makefile.w32-in
index 2c905fcb9eb..f4bbaf38040 100644
--- a/lisp/makefile.w32-in
+++ b/lisp/makefile.w32-in
@@ -104,27 +104,39 @@ WINS_CEDET=\
cedet/semantic/symref \
cedet/semantic/wisent
-WINS_BASIC=\
+# The list of subdirectories is subdivided into 4 more or less equal
+# parts so that we could have 4-way parallelism while compiling Lisp
+# files, which helps to slash bootstrap times. See the 'compile'
+# target below.
+WINS_BASIC1=\
calc \
calendar \
emacs-lisp \
- emulation \
erc \
- eshell \
+ net \
+ url
+
+WINS_BASIC2=\
gnus \
international \
language \
- mail \
+ mail
+
+WINS_BASIC3=\
+ emulation \
mh-e \
- net \
nxml \
org \
play \
- progmodes \
textmodes \
- url \
vc
+WINS_BASIC4=\
+ eshell \
+ progmodes
+
+WINS_BASIC= $(WINS_BASIC1) $(WINS_BASIC2) $(WINS_BASIC3) $(WINS_BASIC4)
+
# Directories with lisp files to compile, and to extract data from
# (customs, autoloads, etc.)
WINS_UPDATES=$(WINS_BASIC) \
@@ -311,22 +323,71 @@ TAGS-LISP-CMD: $(lisptagsfiles1) $(lisptagsfiles2) $(lisptagsfiles3) $(lisptagsf
# compiled find the right files.
# Need separate version for sh and native cmd.exe
-compile: $(lisp)/subdirs.el compile-$(SHELLTYPE) doit
+compile: $(lisp)/subdirs.el compile0-$(SHELLTYPE) compile1-$(SHELLTYPE) compile2-$(SHELLTYPE) compile3-$(SHELLTYPE) compile4-$(SHELLTYPE) doit
-compile-CMD: autoloads
+compile0-CMD: autoloads
# -for %%f in ($(lisp) $(WINS)) do for %%g in (%%f\*.elc) do @attrib -r %%g
for %%f in ($(COMPILE_FIRST)) do \
$(emacs) -l loaddefs $(BYTE_COMPILE_FLAGS) -f batch-byte-compile-if-not-done %%f
- for %%f in (. $(WINS)) do for %%g in (%%f/*.el) do \
+
+compile1-CMD: autoloads compile0-CMD
+ for %%f in (. $(WINS_BASIC1)) do for %%g in (%%f/*.el) do \
$(emacs) -l loaddefs $(BYTE_COMPILE_FLAGS) -f batch-byte-compile-if-not-done %%f/%%g
-compile-SH: autoloads
+compile2-CMD: autoloads compile0-CMD
+ for %%f in ($(WINS_BASIC2)) do for %%g in (%%f/*.el) do \
+ $(emacs) -l loaddefs $(BYTE_COMPILE_FLAGS) -f batch-byte-compile-if-not-done %%f/%%g
+
+compile3-CMD: autoloads compile0-CMD
+ for %%f in ($(WINS_BASIC3)) do for %%g in (%%f/*.el) do \
+ $(emacs) -l loaddefs $(BYTE_COMPILE_FLAGS) -f batch-byte-compile-if-not-done %%f/%%g
+
+compile4-CMD: autoloads compile0-CMD
+ for %%f in ($(WINS_BASIC4) $(WINS_CEDET) term obsolete) do for %%g in (%%f/*.el) do \
+ $(emacs) -l loaddefs $(BYTE_COMPILE_FLAGS) -f batch-byte-compile-if-not-done %%f/%%g
+
+compile0-SH: autoloads
# for elc in $(lisp)/*.elc $(lisp)/*/*.elc; do attrib -r $$elc; done
for el in $(COMPILE_FIRST); do \
echo Compiling $$el; \
$(emacs) -l loaddefs $(BYTE_COMPILE_FLAGS) -f batch-byte-compile-if-not-done $$el; \
done
- for dir in $(lisp) $(WINS); do \
+
+compile1-SH: autoloads compile0-SH
+ for dir in $(lisp) $(WINS_BASIC1); do \
+ for el in $$dir/*.el; do \
+ if test -f $$el; \
+ then \
+ echo Compiling $$el; \
+ $(emacs) -l loaddefs $(BYTE_COMPILE_FLAGS) -f batch-byte-compile-if-not-done $$el; \
+ fi \
+ done; \
+ done
+
+compile2-SH: autoloads compile0-SH
+ for dir in $(WINS_BASIC2); do \
+ for el in $$dir/*.el; do \
+ if test -f $$el; \
+ then \
+ echo Compiling $$el; \
+ $(emacs) -l loaddefs $(BYTE_COMPILE_FLAGS) -f batch-byte-compile-if-not-done $$el; \
+ fi \
+ done; \
+ done
+
+compile3-SH: autoloads compile0-SH
+ for dir in $(WINS_BASIC3); do \
+ for el in $$dir/*.el; do \
+ if test -f $$el; \
+ then \
+ echo Compiling $$el; \
+ $(emacs) -l loaddefs $(BYTE_COMPILE_FLAGS) -f batch-byte-compile-if-not-done $$el; \
+ fi \
+ done; \
+ done
+
+compile4-SH: autoloads compile0-SH
+ for dir in $(WINS_BASIC4) $(WINS_CEDET) term obsolete; do \
for el in $$dir/*.el; do \
if test -f $$el; \
then \
@@ -447,23 +508,24 @@ $(lisp)/mh-e/mh-loaddefs.el: $(MH_E_SRC) $(lisp)/subdirs.el
$(ARGQUOTE)$(lisp)/mh-e/mh-loaddefs.el$(ARGQUOTE) $(MAKE) ./mh-e
# Update TRAMP internal autoloads. Maybe we could move tramp*.el into
-# its own subdirectory. OTOH, it does not hurt to keep them in
+# an own subdirectory. OTOH, it does not hurt to keep them in
# lisp/net.
-TRAMP_SRC = $(lisp)/net/tramp.el $(lisp)/net/tramp-cache.el \
- $(lisp)/net/tramp-cmds.el $(lisp)/net/tramp-compat.el \
- $(lisp)/net/tramp-ftp.el $(lisp)/net/tramp-gvfs.el \
- $(lisp)/net/tramp-gw.el $(lisp)/net/tramp-sh.el \
- $(lisp)/net/tramp-smb.el $(lisp)/net/tramp-uu.el \
- $(lisp)/net/trampver.el
-
-$(lisp)/net/tramp-loaddefs.el: $(TRAMP_SRC) $(lisp)/subdirs.el
+TRAMP_DIR = $(lisp)/net
+TRAMP_SRC = $(TRAMP_DIR)/tramp.el $(TRAMP_DIR)/tramp-adb.el \
+ $(TRAMP_DIR)/tramp-cache.el $(TRAMP_DIR)/tramp-cmds.el \
+ $(TRAMP_DIR)/tramp-compat.el $(TRAMP_DIR)/tramp-ftp.el \
+ $(TRAMP_DIR)/tramp-gvfs.el $(TRAMP_DIR)/tramp-gw.el \
+ $(TRAMP_DIR)/tramp-sh.el $(TRAMP_DIR)/tramp-smb.el \
+ $(TRAMP_DIR)/tramp-uu.el $(TRAMP_DIR)/trampver.el
+
+$(TRAMP_DIR)/tramp-loaddefs.el: $(TRAMP_SRC) $(lisp)/subdirs.el
"$(EMACS)" $(EMACSOPT) \
-l autoload \
--eval $(ARGQUOTE)(setq generate-autoload-cookie $(DQUOTE);;;###tramp-autoload$(DQUOTE))$(ARGQUOTE) \
--eval $(ARGQUOTE)(setq find-file-suppress-same-file-warnings t)$(ARGQUOTE) \
--eval $(ARGQUOTE)(setq make-backup-files nil)$(ARGQUOTE) \
-f w32-batch-update-autoloads \
- $(ARGQUOTE)$(lisp)/net/tramp-loaddefs.el$(ARGQUOTE) $(MAKE) ./net
+ $(ARGQUOTE)$(TRAMP_DIR)/tramp-loaddefs.el$(ARGQUOTE) $(MAKE) ./net
# Prepare a bootstrap in the lisp subdirectory.
#
diff --git a/lisp/man.el b/lisp/man.el
index b6a6c179374..04abc3d4d88 100644
--- a/lisp/man.el
+++ b/lisp/man.el
@@ -1,4 +1,4 @@
-;;; man.el --- browse UNIX manual pages -*- coding: iso-8859-1 -*-
+;;; man.el --- browse UNIX manual pages -*- coding: utf-8 -*-
;; Copyright (C) 1993-1994, 1996-1997, 2001-2013 Free Software
;; Foundation, Inc.
@@ -276,7 +276,7 @@ Used in `bookmark-set' to get the default bookmark name."
:type 'hook
:group 'man)
-(defvar Man-name-regexp "[-a-zA-Z0-9_­+][-a-zA-Z0-9_.:­+]*"
+(defvar Man-name-regexp "[-a-zA-Z0-9_­+][-a-zA-Z0-9_.:­+]*"
"Regular expression describing the name of a manpage (without section).")
(defvar Man-section-regexp "[0-9][a-zA-Z0-9+]*\\|[LNln]"
@@ -426,6 +426,7 @@ Otherwise, the value is whatever the function
(suppress-keymap map)
(set-keymap-parent map button-buffer-map)
+ (define-key map [?\S-\ ] 'scroll-down-command)
(define-key map " " 'scroll-up-command)
(define-key map "\177" 'scroll-down-command)
(define-key map "n" 'Man-next-section)
@@ -780,6 +781,59 @@ POS defaults to `point'."
;; but apparently that's not the case in all cases, so let's add a cache.
"Cache of completion table of the form (PREFIX . TABLE).")
+(defvar Man-man-k-use-anchor
+ ;; man-db or man-1.*
+ (memq system-type '(gnu gnu/linux gnu/kfreebsd))
+ "If non-nil prepend ^ to the prefix passed to \"man -k\" for completion.
+The value should be nil if \"man -k ^PREFIX\" may omit some man
+pages whose names start with PREFIX.
+
+Currently, the default value depends on `system-type' and is
+non-nil where the standard man programs are known to behave
+properly. Setting the value to nil always gives correct results
+but computing the list of completions may take a bit longer.")
+
+(defun Man-parse-man-k ()
+ "Parse \"man -k\" output and return the list of page names.
+
+The current buffer should contain the output of a command of the
+form \"man -k keyword\", which is traditionally also available with
+apropos(1).
+
+While POSIX man(1p) is a bit vague about what to expect here,
+this function tries to parse some commonly used formats, which
+can be described in the following informal way, with square brackets
+indicating optional parts and whitespace being interpreted
+somewhat loosely.
+
+foo[, bar [, ...]] [other stuff] (sec) - description
+foo(sec)[, bar(sec) [, ...]] [other stuff] - description
+
+For more details and some regression tests, please see
+test/automated/man-tests.el in the emacs bzr repository."
+ (goto-char (point-min))
+ ;; See man-tests for data about which systems use which format (hopefully we
+ ;; will be able to simplify the code if/when some of those formats aren't
+ ;; used any more).
+ (let (table)
+ (while (search-forward-regexp "^\\([^ \t,\n]+\\)\\(.*?\\)\
+\\(?:[ \t]\\(([^ \t,\n]+?)\\)\\)?\\(?:[ \t]+- ?\\(.*\\)\\)?$" nil t)
+ (let ((section (match-string 3))
+ (description (match-string 4))
+ (bound (match-end 2)))
+ (goto-char (match-end 1))
+ (while
+ (progn
+ ;; The first regexp grouping may already match the section
+ ;; tacked on to the name, which is ok since for the formats we
+ ;; claim to support the third (non-shy) grouping does not
+ ;; match in this case, i.e., section is nil.
+ (push (propertize (concat (match-string 1) section)
+ 'help-echo description)
+ table)
+ (search-forward-regexp "\\=, *\\([^ \t,]+\\)" bound t)))))
+ (nreverse table)))
+
(defun Man-completion-table (string pred action)
(cond
;; This ends up returning t for pretty much any string, and hence leads to
@@ -811,16 +865,15 @@ POS defaults to `point'."
;; run differently in Man-getpage-in-background, an error
;; here may not necessarily mean that we'll also get an
;; error later.
- (ignore-errors
- (call-process manual-program nil '(t nil) nil
- "-k" (concat "^" prefix))))
- (goto-char (point-min))
- (while (re-search-forward "^\\([^ \t\n]+\\)\\(?: ?\\((.+?)\\)\\(?:[ \t]+- \\(.*\\)\\)?\\)?" nil t)
- (push (propertize (concat (match-string 1) (match-string 2))
- 'help-echo (match-string 3))
- table)))
- ;; Cache the table for later reuse.
- (setq Man-completion-cache (cons prefix table)))
+ (ignore-errors
+ (call-process manual-program nil '(t nil) nil
+ "-k" (concat (when (or Man-man-k-use-anchor
+ (string-equal prefix ""))
+ "^")
+ prefix))))
+ (setq table (Man-parse-man-k)))
+ ;; Cache the table for later reuse.
+ (setq Man-completion-cache (cons prefix table)))
;; The table may contain false positives since the match is made
;; by "man -k" not just on the manpage's name.
(if section
@@ -891,6 +944,7 @@ names or descriptions. The pattern argument is usually an
;; ("man -k" is case-insensitive similarly, so the
;; table has everything available to complete)
(completion-ignore-case t)
+ Man-completion-cache ;Don't cache across calls.
(input (completing-read
(format "Manual entry%s"
(if (string= default-entry "")
@@ -1395,7 +1449,7 @@ The following key bindings are currently in effect in the buffer:
;; Update len, in case a reference spans
;; more than two lines (paranoia).
len (1- (length word))))
- (if (memq (aref word len) '(?- ?­))
+ (if (memq (aref word len) '(?- ?­))
(setq hyphenated (substring word 0 len)))
(and (string-match Man-reference-regexp word)
(not (member word Man--refpages))
diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el
index 024e2237cae..be459fe38d5 100644
--- a/lisp/menu-bar.el
+++ b/lisp/menu-bar.el
@@ -1518,7 +1518,7 @@ mail status in mode line"))
:button (:toggle . (bound-and-true-p semantic-mode))))
(bindings--define-key menu [ede]
- '(menu-item "Project support (EDE)"
+ '(menu-item "Project Support (EDE)"
global-ede-mode
:help "Toggle the Emacs Development Environment (Global EDE mode)"
:button (:toggle . (bound-and-true-p global-ede-mode))))
@@ -1637,8 +1637,8 @@ key, a click, or a menu-item"))
'(menu-item "Find Options by Value..." apropos-value
:help "Find variables whose values match a regexp"))
(bindings--define-key menu [find-options-by-name]
- '(menu-item "Find Options by Name..." apropos-variable
- :help "Find variables whose names match a regexp"))
+ '(menu-item "Find Options by Name..." apropos-user-option
+ :help "Find user options whose names match a regexp"))
(bindings--define-key menu [find-commands-by-name]
'(menu-item "Find Commands by Name..." apropos-command
:help "Find commands whose names match a regexp"))
diff --git a/lisp/mh-e/ChangeLog b/lisp/mh-e/ChangeLog
index e9473a3e2f3..6894a185ddc 100644
--- a/lisp/mh-e/ChangeLog
+++ b/lisp/mh-e/ChangeLog
@@ -1,6 +1,157 @@
-2013-03-11 Glenn Morris <rgm@gnu.org>
+2013-03-02 Bill Wohler <wohler@newt.com>
- * Version 24.3 released.
+ Release MH-E version 8.5.
+
+ * mh-e.el (Version, mh-version): Update for release 8.5.
+
+2013-03-02 Jeffrey C Honig <jch@honig.net>
+
+ * mh-folder.el (mh-inc-folder): Revert SF #2321115, SF #250
+ which processed pending deletes and refiles. Call to
+ mh-process-or-undo-commands to insure that pending changes are
+ properly tagged after including new mail (closes SF #271).
+
+ * mh-comp.el: Insure that mail-header-separator is set before
+ invoking any mml functions (closes SF #270).
+
+2013-01-23 Dmitry Antipov <dmantipov@yandex.ru>
+
+ * mh-acros.el (mh-do-at-event-location): Use point-marker.
+ * mh-search.el (mh-index-create-imenu-index): Likewise.
+ * mh-xface.el (mh-x-image-url-display): Likewise.
+
+2012-11-25 Bill Wohler <wohler@newt.com>
+
+ Release MH-E version 8.4.
+
+ * mh-e.el (Version, mh-version): Update for release 8.4.
+
+ * mh-comp.el (mh-regexp-in-field-syntax-table): Fix docstring.
+ (mh-edit-again): Format.
+ (mh-components-to-list): Fix docstring.
+ (mh-regexp-in-field-p): Remove unused variable `field'.
+
+ * mh-compat.el (mh-define-obsolete-variable-alias)
+ (mh-make-obsolete-variable): New macros to fix XEmacs compiler
+ warnings.
+
+ * mh-letter.el (mh-yank-hooks): Use new mh-make-obsolete-variable
+ macro.
+
+ * mh-e.el (mh-kill-folder-suppress-prompt-hooks): Use
+ new mh-define-obsolete-variable-alias macro.
+
+ * mh-compat.el (mh-cl-flet): New alias for cl-flet on Emacs 24 and
+ flet elsewhere.
+
+ * mh-thread.el (mh-thread-set-tables): Replace flet with new alias
+ mh-cl-flet.
+
+ * mh-show.el (mh-gnus-article-highlight-citation):
+ Replace flet with new alias mh-cl-flet.
+
+ * mh-mime.el (mh-display-with-external-viewer, mh-mime-display)
+ (mh-press-button, mh-push-button, mh-display-emphasis): Replace
+ flet with new alias mh-cl-flet.
+
+ * mh-e.el (mh-invisible-header-fields-internal):
+ Remove trailing whitespace.
+
+2012-11-25 Jeffrey C Honig <jch@honig.net>
+
+ * mh-comp.el: (mh-edit-again): Use the components file to specify
+ default values for missing headers in the draft.
+ (mh-regexp-in-field-syntax-table, mh-fcc-syntax-table)
+ (mh-addr-syntax-table, mh-regexp-in-field-p): Use a syntax table
+ so we'll properly parse non-address fields.
+ (mh-components-to-list, mh-extract-header-field): New functions to
+ read components file.
+ (mh-find-components, mh-send-sub): Move code to locate components
+ file into a new function.
+ (mh-insert-auto-fields, mh-modify-header-field): New syntax for
+ calling mh-regexp-in-field-p (closes SF #1708292).
+
+ * mh-e.el (mh-invisible-header-fields-internal): Added: X-xsi.
+ (addresses SF #1916032).
+
+ * mh-folder.el (mh-inc-folder): Call mh-process-or-undo-commands
+ before running to insure we do not lose any pending changes.
+ (closes SF #2321115).
+
+2012-11-25 Ted Phelps <phelps@gnusto.com>
+
+ Postpone junk processing (closes SF #2945712). Patch submitted by
+ Ted Phelps and refined by Bill Wohler.
+
+ * mh-e.el (mh-blacklist, mh-whitelist): New variables.
+ (mh-whitelist-preserves-sequences-flag): New option.
+ (mh-before-commands-processed-hook): Update documentation.
+ (mh-blacklist-msg-hook, mh-whitelist-msg-hook): New hooks.
+ (mh-folder-blacklisted, mh-folder-whitelisted): New faces.
+ * mh-folder.el (mh-folder-message-menu): Add "Junk" to "Undo."
+ (mh-folder-font-lock-keywords): Add regexps for blacklisted and
+ whitelisted messages.
+ (mh-folder-mode): Add mh-blacklist and mh-whitelist variables.
+ (mh-execute-commands): Update documentation.
+ (mh-undo, mh-outstanding-commands-p, mh-process-commands)
+ (mh-delete-a-msg, mh-refile-a-msg, mh-undo-msg): Handle
+ blacklisted and whitelisted messages.
+ * mh-junk.el (mh-junk-blacklist, mh-junk-whitelist): Update to put
+ messages in blacklist and whitelist respectively for latter
+ processing.
+ (mh-blacklist-a-msg, mh-junk-whitelist-a-msg): New function to
+ support previous functions.
+ (mh-junk-blacklist-disposition): New function.
+ (mh-junk-process-blacklist, mh-junk-process-whitelist): New
+ functions that perform the blacklisting and whitelisting
+ respectively that used to be performed by mh-junk-blacklist and
+ mh-junk-whitelist.
+ * mh-scan.el (mh-scan-blacklisted-msg-regexp)
+ (mh-scan-whitelisted-msg-regexp): New scan line regexps.
+ (mh-scan-good-msg-regexp): Add B and W characters to regexp.
+ (mh-scan-cmd-note-width): Update documentation.
+ (mh-note-blacklisted, mh-note-whitelisted): New scan line
+ characters.
+ * mh-search.el (mh-index-execute-commands): Handle blacklisted and
+ whitelisted messages.
+
+2012-11-25 Jeffrey C Honig <jch@honig.net>
+
+ * mh-e.el (mh-invisible-header-fields-internal): Added:
+ Bounces-To:, Bounces_to:, X-ACL-Warn:, X-BFI:, X-BPS1:, X-BPS2:,
+ X-Campaign-Id:, X-Campaign:, X-Cloudmark-SP-, X-Destination-ID:,
+ X-detected-operating-system:, X-DocGen-Version:, X-EM-,
+ X-Email-Type-Id:, X-FB-SS:, X-FuHaFi:, X-MailFlowPolicy:,
+ X-mail_abuse-inquires, X-MailingID:, X-Match:,
+ X-MaxCode-Template:, X-ME-Bayesian:, X-Sendergroup:, X-SFDC-,
+ X-SMFBL:, X-SMHeaderMap:, X-VGI-OESCD:, X-VirtualServer:,
+ X-VirtualServerGroup:, X-XPT-XSL-Name:, X-Y-GMX-Trusted:,
+ X-XWALL-, X-ZixNet:. Changed X-Habeas-SWE- to X-Habeas-. Updated
+ the comment. (addresses SF #1916032).
+
+2012-11-25 Bill Wohler <wohler@newt.com>
+
+ * mh-e.el (mh-invisible-header-fields-internal): Add
+ X-AnalysisOut, X-Authentication-Info, X-Auto-Response-Suppress,
+ X-Bayes-Prob, X-Cam-, X-CanIt-Geo, X-Completed, X-Facebook,
+ X-Forwarded-, X-Generated-By, X-Headers-End, X-IEEE-UCE,
+ X-Jira-Fingerprint, X-Junkmail-, X-Launchpad-, X-MXL-Hash,
+ X-Notification-, X-Notifications, X-Oracle-Calendar. Replace
+ X-DCC-Usenix-Metrics with X-DCC- (addresses SF #1916032).
+
+2012-11-25 Jeffrey C Honig <jch@honig.net>
+
+ * mh-letter.el (mh-yank-cur-msg): Replace usage of set-buffer with
+ with-current-buffer in mh-yang-cur-msg, semantics changed in emacs
+ 23 and we do not want to use set-buffer unless we actually want to
+ change the buffer the user is looking at (closes SF #2830504).
+
+ * mh-show.el (mh-show-folder-map): Add missing key binding for
+ mh-show-pack-folder (closes SF #3466086).
+
+2012-11-25 Bill Wohler <wohler@newt.com>
+
+ * mh-e.el (Version, mh-version): Add +bzr to version.
2012-10-23 Stefan Monnier <monnier@iro.umontreal.ca>
diff --git a/lisp/mh-e/ChangeLog.1 b/lisp/mh-e/ChangeLog.1
index 07320246c49..e57911947b1 100644
--- a/lisp/mh-e/ChangeLog.1
+++ b/lisp/mh-e/ChangeLog.1
@@ -5114,7 +5114,7 @@
(mail-abbrevs): Declare it in XEmacs.
(mh-alias-add-alias-to-file): Remove unused code.
-2003-02-14 Ville Skyttä <scop@xemacs.org>
+2003-02-14 Ville Skyttä <scop@xemacs.org>
* mh-comp.el: Add autoloaded auto-mode-alist association.
@@ -11416,3 +11416,7 @@
You should have received a copy of the GNU General Public License
along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
+
+;; Local Variables:
+;; coding: utf-8
+;; End:
diff --git a/lisp/mh-e/mh-acros.el b/lisp/mh-e/mh-acros.el
index 9f7fc0df68b..7d6279e4eca 100644
--- a/lisp/mh-e/mh-acros.el
+++ b/lisp/mh-e/mh-acros.el
@@ -233,7 +233,7 @@ preserved."
(,original-window (selected-window))
(,original-position (progn
(set-buffer (window-buffer ,event-window))
- (set-marker (make-marker) (point))))
+ (point-marker)))
(,modified-flag (buffer-modified-p))
(buffer-read-only nil))
(unwind-protect (progn
diff --git a/lisp/mh-e/mh-comp.el b/lisp/mh-e/mh-comp.el
index f5aa0db7d7f..1f07a7983b1 100644
--- a/lisp/mh-e/mh-comp.el
+++ b/lisp/mh-e/mh-comp.el
@@ -122,6 +122,42 @@ Used by the \\[mh-edit-again] and \\[mh-extract-rejected-mail] commands.")
syntax-table)
"Syntax table used by MH-E while in MH-Letter mode.")
+(defvar mh-regexp-in-field-syntax-table nil
+ "Specify a syntax table for `mh-regexp-in-field-p' to use.")
+
+(defvar mh-fcc-syntax-table
+ (let ((syntax-table (make-syntax-table text-mode-syntax-table)))
+ (modify-syntax-entry ?+ "w" syntax-table)
+ (modify-syntax-entry ?/ "w" syntax-table)
+ syntax-table)
+ "Syntax table used by MH-E while searching an Fcc field.")
+
+(defvar mh-addr-syntax-table
+ (let ((syntax-table (make-syntax-table text-mode-syntax-table)))
+ (modify-syntax-entry ?! "w" syntax-table)
+ (modify-syntax-entry ?# "w" syntax-table)
+ (modify-syntax-entry ?$ "w" syntax-table)
+ (modify-syntax-entry ?% "w" syntax-table)
+ (modify-syntax-entry ?& "w" syntax-table)
+ (modify-syntax-entry ?' "w" syntax-table)
+ (modify-syntax-entry ?* "w" syntax-table)
+ (modify-syntax-entry ?+ "w" syntax-table)
+ (modify-syntax-entry ?- "w" syntax-table)
+ (modify-syntax-entry ?/ "w" syntax-table)
+ (modify-syntax-entry ?= "w" syntax-table)
+ (modify-syntax-entry ?? "w" syntax-table)
+ (modify-syntax-entry ?^ "w" syntax-table)
+ (modify-syntax-entry ?_ "w" syntax-table)
+ (modify-syntax-entry ?` "w" syntax-table)
+ (modify-syntax-entry ?{ "w" syntax-table)
+ (modify-syntax-entry ?| "w" syntax-table)
+ (modify-syntax-entry ?} "w" syntax-table)
+ (modify-syntax-entry ?~ "w" syntax-table)
+ (modify-syntax-entry ?. "w" syntax-table)
+ (modify-syntax-entry ?@ "w" syntax-table)
+ syntax-table)
+ "Syntax table used by MH-E while searching an address field.")
+
(defvar mh-send-args ""
"Extra args to pass to \"send\" command.")
@@ -392,13 +428,81 @@ See also `mh-send'."
(mh-read-draft "clean-up" (mh-msg-filename message) nil)))))
(mh-clean-msg-header (point-min) mh-new-draft-cleaned-headers nil)
(mh-insert-header-separator)
+ ;; Merge in components
+ (mh-mapc
+ (function
+ (lambda (header-field)
+ (let ((field (car header-field))
+ (value (cdr header-field))
+ (case-fold-search t))
+ (cond
+ ;; Address field
+ ((string-match field "^To$\\|^Cc$\\|^From$")
+ (cond
+ ((not (mh-goto-header-field (concat field ":")))
+ ;; Header field does not exist, add it
+ (mh-goto-header-end 0)
+ (insert field ": " value "\n"))
+ ((string-equal value "")
+ ;; Header field already exists and no value
+ )
+ (t
+ ;; Header field exists and we have a value
+ (let (address mailbox (alias (mh-alias-expand value)))
+ (and alias
+ (setq address (ietf-drums-parse-address alias))
+ (setq mailbox (car address)))
+ ;; XXX - Need to parse all addresses out of field
+ (if (and
+ (not (mh-regexp-in-field-p
+ (concat "\\b" (regexp-quote value) "\\b") field))
+ mailbox
+ (not (mh-regexp-in-field-p
+ (concat "\\b" (regexp-quote mailbox) "\\b") field)))
+ (insert " " value ","))
+ ))))
+ ((string-match field "^Fcc$")
+ ;; Folder reference
+ (mh-modify-header-field field value))
+ ;; Text field, that's an easy case
+ (t
+ (mh-modify-header-field field value))))))
+ (mh-components-to-list (mh-find-components)))
(goto-char (point-min))
(save-buffer)
- (mh-compose-and-send-mail draft "" from-folder nil nil nil nil nil nil
- config)
+ (mh-compose-and-send-mail
+ draft "" from-folder nil nil nil nil nil nil config)
(mh-letter-mode-message)
(mh-letter-adjust-point)))
+(defun mh-extract-header-field ()
+ "Extract field name and field value from the field at point.
+Returns a list of field name and value (which may be null)."
+ (let ((end (save-excursion (mh-header-field-end)
+ (point))))
+ (if (looking-at mh-letter-header-field-regexp)
+ (save-excursion
+ (goto-char (match-end 1))
+ (forward-char 1)
+ (skip-chars-forward " \t")
+ (cons (match-string-no-properties 1) (buffer-substring-no-properties (point) end))))))
+
+
+(defun mh-components-to-list (components)
+ "Convert the COMPONENTS file to a list of field names and values."
+ (with-current-buffer (get-buffer-create mh-temp-buffer)
+ (erase-buffer)
+ (insert-file-contents components)
+ (goto-char (point-min))
+ (let
+ ((header-fields nil))
+ (while (mh-in-header-p)
+ (setq header-fields (append header-fields (list (mh-extract-header-field))))
+ (mh-header-field-end)
+ (forward-char 1)
+ )
+ header-fields)))
+
;;;###mh-autoload
(defun mh-extract-rejected-mail (message)
"Edit a MESSAGE that was returned by the mail system.
@@ -483,6 +587,13 @@ See also `mh-compose-forward-as-mime-flag',
(mh-forwarded-letter-subject orig-from orig-subject)))
(mh-insert-fields "Subject:" forw-subject)
(goto-char (point-min))
+ ;; Set the local value of mh-mail-header-separator according to what is
+ ;; present in the buffer...
+ (set (make-local-variable 'mh-mail-header-separator)
+ (save-excursion
+ (goto-char (mh-mail-header-end))
+ (buffer-substring-no-properties (point) (mh-line-end-position))))
+ (set (make-local-variable 'mail-header-separator) mh-mail-header-separator) ;override sendmail.el
;; If using MML, translate MH-style directive
(if (equal mh-compose-insertion 'mml)
(save-excursion
@@ -774,6 +885,22 @@ Optional argument BUFFER can be used to specify the buffer."
(t
nil))))
+(defun mh-find-components ()
+ "Return the path to the components file."
+ (let (components)
+ (cond
+ ((file-exists-p
+ (setq components
+ (expand-file-name mh-comp-formfile mh-user-path)))
+ components)
+ ((file-exists-p
+ (setq components
+ (expand-file-name mh-comp-formfile mh-lib)))
+ components)
+ (t
+ (error "Can't find %s in %s or %s"
+ mh-comp-formfile mh-user-path mh-lib)))))
+
(defun mh-send-sub (to cc subject config)
"Do the real work of composing and sending a letter.
Expects the TO, CC, and SUBJECT fields as arguments.
@@ -783,19 +910,7 @@ CONFIG is the window configuration before sending mail."
(message "Composing a message...")
(let ((draft (mh-read-draft
"message"
- (let (components)
- (cond
- ((file-exists-p
- (setq components
- (expand-file-name mh-comp-formfile mh-user-path)))
- components)
- ((file-exists-p
- (setq components
- (expand-file-name mh-comp-formfile mh-lib)))
- components)
- (t
- (error "Can't find %s in %s or %s"
- mh-comp-formfile mh-user-path mh-lib))))
+ (mh-find-components)
nil)))
(mh-insert-fields "To:" to "Subject:" subject "Cc:" cc)
(goto-char (point-max))
@@ -1072,7 +1187,7 @@ discarded."
(insert " " value)
(delete-region (point) (mh-line-end-position)))
((and (not overwrite-flag)
- (mh-regexp-in-field-p (concat "\\b" value "\\b") field))
+ (mh-regexp-in-field-p (concat "\\b" (regexp-quote value) "\\b") field))
;; Already there, do nothing.
)
((and (not overwrite-flag)
@@ -1084,18 +1199,33 @@ discarded."
(defun mh-regexp-in-field-p (regexp &rest fields)
"Non-nil means REGEXP was found in FIELDS."
- (save-excursion
- (let ((search-result nil)
- (field))
- (while fields
- (setq field (car fields))
- (if (and (mh-goto-header-field field)
- (re-search-forward
- regexp (save-excursion (mh-header-field-end)(point)) t))
- (setq fields nil
- search-result t)
- (setq fields (cdr fields))))
- search-result)))
+ (let ((old-syntax-table (syntax-table)))
+ (unwind-protect
+ (save-excursion
+ (let ((search-result nil))
+ (while fields
+ (let ((field (car fields))
+ (syntax-table mh-regexp-in-field-syntax-table))
+ (if (null syntax-table)
+ (let ((case-fold-search t))
+ (cond
+ ((string-match field "^To$\\|^[BD]?cc$\\|^From$")
+ (setq syntax-table mh-addr-syntax-table))
+ ((string-match field "^Fcc$")
+ (setq syntax-table mh-fcc-syntax-table))
+ (t
+ (setq syntax-table (syntax-table)))
+ )))
+ (if (and (mh-goto-header-field field)
+ (set-syntax-table syntax-table)
+ (re-search-forward
+ regexp (save-excursion (mh-header-field-end)(point)) t))
+ (setq fields nil
+ search-result t)
+ (setq fields (cdr fields)))
+ (set-syntax-table old-syntax-table)))
+ search-result))
+ (set-syntax-table old-syntax-table))))
(defun mh-ascii-buffer-p ()
"Check if current buffer is entirely composed of ASCII.
diff --git a/lisp/mh-e/mh-compat.el b/lisp/mh-e/mh-compat.el
index 2ebe370205f..b755572c957 100644
--- a/lisp/mh-e/mh-compat.el
+++ b/lisp/mh-e/mh-compat.el
@@ -75,6 +75,12 @@ introduced in Emacs 22."
'cancel-timer
'delete-itimer))
+;; Emacs 24 renamed flet to cl-flet.
+(defalias 'mh-cl-flet
+ (if (fboundp 'cl-flet)
+ 'cl-flet
+ 'flet))
+
(defun mh-display-color-cells (&optional display)
"Return the number of color cells supported by DISPLAY.
This function is used by XEmacs to return 2 when `device-color-cells'
@@ -242,6 +248,40 @@ This function returns nil on those systems."
This function returns nil on those systems."
nil)
+(defmacro mh-define-obsolete-variable-alias
+ (obsolete-name current-name &optional when docstring)
+ "Make OBSOLETE-NAME a variable alias for CURRENT-NAME and mark it obsolete.
+See documentation for `define-obsolete-variable-alias' for a description
+of the arguments OBSOLETE-NAME, CURRENT-NAME, and perhaps WHEN
+and DOCSTRING. This macro is used by XEmacs that lacks WHEN and
+DOCSTRING arguments."
+ (if (featurep 'xemacs)
+ `(define-obsolete-variable-alias ,obsolete-name ,current-name)
+ `(define-obsolete-variable-alias ,obsolete-name ,current-name ,when ,docstring)))
+
+(defmacro mh-make-obsolete-variable (obsolete-name current-name &optional when access-type)
+ "Make the byte-compiler warn that OBSOLETE-NAME is obsolete.
+See documentation for `make-obsolete-variable' for a description
+of the arguments OBSOLETE-NAME, CURRENT-NAME, and perhaps WHEN
+and ACCESS-TYPE. This macro is used by XEmacs that lacks WHEN and
+ACCESS-TYPE arguments."
+ (if (featurep 'xemacs)
+ `(make-obsolete-variable ,obsolete-name ,current-name)
+ `(make-obsolete-variable ,obsolete-name ,current-name ,when ,access-type)))
+
+(defmacro mh-make-obsolete-variable (obsolete-name current-name &optional when access-type)
+ "Make the byte-compiler warn that OBSOLETE-NAME is obsolete.
+See documentation for `make-obsolete-variable' for a description
+of the arguments OBSOLETE-NAME, CURRENT-NAME, and perhaps WHEN
+and ACCESS-TYPE. This macro is used by XEmacs that lacks WHEN and
+ACCESS-TYPE arguments and by Emacs versions that lack ACCESS-TYPE,
+introduced in Emacs 24."
+ (if (featurep 'xemacs)
+ `(make-obsolete-variable ,obsolete-name ,current-name)
+ (if (< emacs-major-version 24)
+ `(make-obsolete-variable ,obsolete-name ,current-name ,when)
+ `(make-obsolete-variable ,obsolete-name ,current-name ,when ,access-type))))
+
(defun-mh mh-match-string-no-properties
match-string-no-properties (num &optional string)
"Return string of text matched by last search, without text properties.
diff --git a/lisp/mh-e/mh-e.el b/lisp/mh-e/mh-e.el
index 4f42242c288..6ed033b8fa8 100644
--- a/lisp/mh-e/mh-e.el
+++ b/lisp/mh-e/mh-e.el
@@ -5,7 +5,7 @@
;; Author: Bill Wohler <wohler@newt.com>
;; Maintainer: Bill Wohler <wohler@newt.com>
-;; Version: 8.3.1
+;; Version: 8.5
;; Keywords: mail
;; This file is part of GNU Emacs.
@@ -127,7 +127,7 @@
;; Try to keep variables local to a single file. Provide accessors if
;; variables are shared. Use this section as a last resort.
-(defconst mh-version "8.3.1" "Version number of MH-E.")
+(defconst mh-version "8.5" "Version number of MH-E.")
;; Variants
@@ -230,6 +230,11 @@ User's mail folder directory.")
(defvar mh-arrow-marker nil
"Marker for arrow display in fringe.")
+(defvar mh-blacklist nil
+ "List of messages to use to train the junk filter.
+This variable can be used by
+`mh-before-commands-processed-hook'.")
+
(defvar mh-colors-available-flag nil
"Non-nil means colors are available.")
@@ -291,6 +296,11 @@ Elements have the form (SEQUENCE . MESSAGES).")
"Stack of operations that change the folder view.
These operations include narrowing or threading.")
+(defvar mh-whitelist nil
+ "List of messages to use to train the junk filter.
+This variable can be used by
+`mh-before-commands-processed-hook'.")
+
;; MH-Show Locals (alphabetical)
(defvar mh-globals-hash (make-hash-table)
@@ -2215,6 +2225,17 @@ commands."
:group 'mh-sequences
:package-version '(MH-E . "7.0"))
+(defcustom-mh mh-whitelist-preserves-sequences-flag t
+ "*Non-nil means that sequences are preserved when messages are whitelisted.
+
+If a message is in any sequence (except \"Previous-Sequence:\"
+and \"cur\") when it is whitelisted, then it will still be in
+those sequences in the destination folder. If this behavior is
+not desired, then turn off this option."
+ :type 'boolean
+ :group 'mh-sequences
+ :package-version '(MH-E . "8.4"))
+
;;; Reading Your Mail (:group 'mh-show)
(defcustom-mh mh-bury-show-buffer-flag t
@@ -2400,7 +2421,8 @@ of citations entirely, choose \"None\"."
;; "X-Mailer:" ;
;; "X-Operator:" ; Similar to X-Mailer, so display it
-;; Keep fields alphabetized (set sort-fold-case to t first).
+;; Keep fields alphabetized with case folding. Use M-:(setq
+;; sort-fold-case t) from the minibuffer to accomplish this.
;; Mention source, if known.
(defvar mh-invisible-header-fields-internal
'(
@@ -2418,6 +2440,8 @@ of citations entirely, choose \"None\"."
"Auto-forwarded:" ; RFC 2156
"Autoforwarded:" ; RFC 2156
"Bestservhost:"
+ "Bounces-To:"
+ "Bounces_to:"
"Bytes:"
"Cancel-Key:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
"Cancel-Lock:" ; NNTP posts
@@ -2523,9 +2547,11 @@ of citations entirely, choose \"None\"."
"X-Abuse-Info:"
"X-Accept-Language:" ; Netscape/Mozilla
"X-Ack:"
+ "X-ACL-Warn:" ; http://www.exim.org
"X-Admin:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
"X-Administrivia-To:"
"X-AMAZON" ; Amazon.com
+ "X-AnalysisOut:" ; Exchange
"X-AntiAbuse:" ; cPanel
"X-Antivirus-Scanner:"
"X-AOL-IP:" ; AOL WebMail
@@ -2535,18 +2561,30 @@ of citations entirely, choose \"None\"."
"X-AuditID:"
"X-Authenticated-Info:" ; Verizon.net?
"X-Authenticated-Sender:" ; AT&T Message Center (webmail)
+ "X-Authentication-Info:" ; verizon.net?
"X-Authentication-Warning:" ; sendmail
"X-Authority-Analysis:"
+ "X-Auto-Response-Suppress:" ; Exchange
"X-Barracuda-" ; Barracuda spam scores
+ "X-Bayes-Prob:" ; IEEE spam filter
"X-Beenthere:" ; Mailman mailing list manager
+ "X-BFI:"
"X-Bigfish:"
"X-Bogosity:" ; bogofilter
+ "X-BPS1:" ; http://www.boggletools.com
+ "X-BPS2:" ; http://www.boggletools.com
"X-Brightmail-Tracker:" ; Brightmail
"X-BrightmailFiltered:" ; Brightmail
"X-Bugzilla-" ; Bugzilla
+ "X-Cam-" ; Cambridge scanners
+ "X-Campaign-Id:"
+ "X-Campaign:"
"X-Campaignid:"
+ "X-CanIt-Geo:" ; IEEE spam filter
+ "X-Cloudmark-SP-" ; Cloudmark (www.cloudmark.com)
"X-Comment:" ; AT&T Mailennium
"X-Complaints-To:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
+ "X-Completed:"
"X-Confirm-Reading-To:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
"X-Content-Filtered-By:"
"X-ContentStamp:" ; NetZero
@@ -2554,18 +2592,23 @@ of citations entirely, choose \"None\"."
"X-Cr-Hashedpuzzle:"
"X-Cr-Puzzleid:"
"X-Cron-Env:"
- "X-DCC-Usenix-Metrics:"
+ "X-DCC-" ; SpamAssassin
"X-Declude-" ; http://www.declude.com/x-note.htm
"X-Dedicated:"
"X-Delivered"
+ "X-Destination-ID:"
+ "X-detected-operating-system:" ; GNU.ORG?
"X-DH-Virus-"
"X-DMCA"
+ "X-DocGen-Version:" ; DocGen
"X-Domain:"
"X-Echelon-Distraction"
"X-EFL-Spamscore:" ; MIT alumni spam filtering
"X-eGroups-" ; Egroups/yahoogroups mailing list manager
"X-EID:"
"X-ELNK-Trace:" ; Earthlink mailer
+ "X-EM-" ; Some ecommerce software
+ "X-Email-Type-Id:" ; Paypal http://www.paypal.com
"X-Enigmail-Version:"
"X-Envelope-Date:" ; GNU mailutils
"X-Envelope-From:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
@@ -2575,29 +2618,39 @@ of citations entirely, choose \"None\"."
"X-Evolution:" ; Evolution mail client
"X-ExtLoop"
"X-Face:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
+ "X-Facebook" ; Facebook
+ "X-FB-SS:"
"X-fmx-"
"X-Folder:" ; Spam
+ "X-Forwarded-" ; Google+
"X-From-Line"
+ "X-FuHaFi:" ; http://www.gmx.net/
+ "X-Generated-By:" ; launchpad.net
"X-Gmail-" ; Gmail
"X-Gnus-Mail-Source:" ; gnus
"X-Google-" ; Google mail
"X-Google-Sender-Auth:"
"X-Greylist:" ; milter-greylist-1.2.1
- "X-Habeas-SWE-" ; Spam
+ "X-Habeas-" ; http://www.returnpath.net
"X-Hashcash:" ; hashcash
+ "X-Headers-End:" ; SpamCop
"X-HPL-"
"X-HR-"
"X-HTTP-UserAgent:"
"X-Hz" ; Hertz
"X-Identity:" ; http://www.declude.com/x-note.htm
+ "X-IEEE-UCE-" ; IEEE spam filter
"X-Image-URL:"
"X-IMAP:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
"X-Info:" ; NTMail
"X-IronPort-" ; IronPort AV
"X-ISI-4-30-3-MailScanner:"
"X-J2-"
+ "X-Jira-Fingerprint:" ; JIRA
+ "X-Junkmail-" ; RCN?
"X-Juno-" ; Juno
"X-Key:"
+ "X-Launchpad-" ; plaunchpad.net
"X-List-Host:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
"X-List-Subscribe:" ; Unknown mailing list managers
"X-List-Unsubscribe:" ; Unknown mailing list managers
@@ -2606,18 +2659,24 @@ of citations entirely, choose \"None\"."
"X-Loop:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
"X-Lrde-Mailscanner:"
"X-Lumos-SenderID:" ; Roving ConstantContact
+ "X-mail_abuse_inquiries:" ; http://www.salesforce.com
"X-Mail-from:" ; fastmail.fm
"X-MAIL-INFO:" ; NetZero
"X-Mailer_"
+ "X-MailFlowPolicy:" ; Cisco Email Security (formerly IronPort; http://www.ironport.com)
"X-Mailing-List:" ; Unknown mailing list managers
+ "X-MailingID:"
"X-Mailman-Approved-At:" ; Mailman mailing list manager
"X-Mailman-Version:" ; Mailman mailing list manager
"X-MailScanner" ; ListProc(tm) by CREN
"X-Mailutils-Message-Id" ; GNU Mailutils
"X-Majordomo:" ; Majordomo mailing list manager
+ "X-Match:"
+ "X-MaxCode-Template:" ; Paypal http://www.paypal.com
"X-MB-Message-" ; AOL WebMail
"X-MDaemon-Deliver-To:"
"X-MDRemoteIP:"
+ "X-ME-Bayesian:" ; http://www.newmediadevelopment.net/page.cfm/parent/Client-Area/content/Managing-spam/
"X-Message-Id"
"X-Message-Type:"
"X-MessageWall-Score:" ; Unknown mailing list manager, AUC TeX
@@ -2630,12 +2689,16 @@ of citations entirely, choose \"None\"."
"X-MS-" ; MS Outlook
"X-Msmail-" ; MS Outlook
"X-MSMail-Priority" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
+ "X-MXL-Hash:"
"X-NAI-Spam-" ; Network Associates Inc. SpamKiller
"X-News:" ; News
"X-Newsreader:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
"X-No-Archive:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
"X-Notes-Item:" ; Lotus Notes Domino structured header
+ "X-Notification-" ; Google+
+ "X-Notifications:" ; Google+
"X-OperatingSystem:"
+ "X-Oracle-Calendar:" ; Oracle calendar invitations
"X-ORBL:"
"X-Orcl-Content-Type:"
"X-Organization:"
@@ -2652,6 +2715,7 @@ of citations entirely, choose \"None\"."
"X-PID:"
"X-PMG-"
"X-PMX-Version:"
+ "X-Policyd-Weight:" ; policyd-weight (Postfix)
"X-Postfilter:"
"X-Priority:" ; MS Outlook
"X-Proofpoint-" ; Proofpoint mail filter
@@ -2677,14 +2741,20 @@ of citations entirely, choose \"None\"."
"X-SBRS:"
"X-SBRule:" ; Spam
"X-Scanned-By:"
+ "X-Sender-ID:" ; Google+
"X-Sender:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
+ "X-Sendergroup:" ; Cisco Email Security (formerly IronPort; http://www.ironport.com)
"X-Server-Date:"
"X-Server-Uuid:"
"X-Service-Code:"
+ "X-SFDC-" ; http://www.salesforce.com
"X-Sieve:" ; Sieve filtering
+ "X-SMFBL:"
+ "X-SMHeaderMap:"
"X-SMTP-"
"X-Source"
- "X-Spam-" ; Spamassassin
+ "X-Spam-" ; SpamAssassin
+ "X-Spam:" ; Exchange
"X-SpamBouncer:" ; Spam
"X-SPF-"
"X-Status"
@@ -2692,6 +2762,7 @@ of citations entirely, choose \"None\"."
"X-Submissions-To:"
"X-Sun-Charset:"
"X-Telecom-Digest"
+ "X-TM-IMSS-Message-ID:" ; http://www.trendmicro.com
"X-Trace:"
"X-UID"
"X-UIDL:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
@@ -2702,15 +2773,23 @@ of citations entirely, choose \"None\"."
"X-USANET-" ; usa.net
"X-Usenet-Provider"
"X-UserInfo1:"
+ "X-VGI-OESCD:"
+ "X-VirtualServer:"
+ "X-VirtualServerGroup:"
"X-Virus-" ;
"X-Vms-To:"
"X-VSMLoop:" ; NTMail
"X-WebTV-Signature:"
"X-Wss-Id:" ; Worldtalk gateways
"X-X-Sender:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
+ "X-XPT-XSL-Name:" ; Paypal http://www.paypal.com
+ "X-xsi-"
+ "X-XWALL-" ; http://www.dataenter.co.at/doc/xwall_undocumented_config.htm
+ "X-Y-GMX-Trusted:" ; http://www.gmx.net/
"X-Yahoo"
"X-Yahoo-Newman-"
"X-YMail-"
+ "X-ZixNet:"
"X400-" ; X400
"Xref:" ; RFC 1036
)
@@ -3104,9 +3183,10 @@ annotated messages with `mh-annotate-list'."
(defcustom-mh mh-before-commands-processed-hook nil
"Hook run by \\<mh-folder-mode-map>\\[mh-execute-commands] before performing outstanding refile and delete requests.
-Variables that are useful in this hook include `mh-delete-list'
-and `mh-refile-list' which can be used to see which changes will
-be made to the current folder, `mh-current-folder'."
+Variables that are useful in this hook include `mh-delete-list',
+`mh-refile-list', `mh-blacklist', and `mh-whitelist' which can be
+used to see which changes will be made to the current folder,
+`mh-current-folder'."
:type 'hook
:group 'mh-hooks
:group 'mh-folder
@@ -3136,6 +3216,13 @@ before sending, add the `ispell-message' function."
:group 'mh-letter
:package-version '(MH-E . "6.0"))
+(defcustom-mh mh-blacklist-msg-hook nil
+ "Hook run by \\<mh-letter-mode-map>\\[mh-junk-blacklist] after marking each message for blacklisting."
+ :type 'hook
+ :group 'mh-hooks
+ :group 'mh-show
+ :package-version '(MH-E . "8.4"))
+
(defcustom-mh mh-delete-msg-hook nil
"Hook run by \\<mh-letter-mode-map>\\[mh-delete-msg] after marking each message for deletion.
@@ -3189,7 +3276,7 @@ function used to insert the signature with
:group 'mh-letter
:package-version '(MH-E . "8.0"))
-(define-obsolete-variable-alias 'mh-kill-folder-suppress-prompt-hooks
+(mh-define-obsolete-variable-alias 'mh-kill-folder-suppress-prompt-hooks
'mh-kill-folder-suppress-prompt-functions "24.3")
(defcustom-mh mh-kill-folder-suppress-prompt-functions '(mh-search-p)
"Abnormal hook run at the beginning of \\<mh-folder-mode-map>\\[mh-kill-folder].
@@ -3301,6 +3388,13 @@ sequence."
:group 'mh-sequences
:package-version '(MH-E . "6.0"))
+(defcustom-mh mh-whitelist-msg-hook nil
+ "Hook run by \\<mh-letter-mode-map>\\[mh-junk-whitelist] after marking each message for whitelisting."
+ :type 'hook
+ :group 'mh-hooks
+ :group 'mh-show
+ :package-version '(MH-E . "8.4"))
+
;;; Faces (:group 'mh-faces + group where faces described)
@@ -3519,6 +3613,13 @@ specified colors."
:group 'mh-folder
:package-version '(MH-E . "8.0"))
+(defface-mh mh-folder-blacklisted
+ (mh-face-data 'mh-folder-msg-number '((t (:inherit mh-folder-msg-number))))
+ "Blacklisted message face."
+ :group 'mh-faces
+ :group 'mh-folder
+ :package-version '(MH-E . "8.4"))
+
(defface-mh mh-folder-body
(mh-face-data 'mh-folder-msg-number
'((((class color))
@@ -3608,6 +3709,13 @@ format `mh-scan-format-nmh' and the regular expression
:group 'mh-folder
:package-version '(MH-E . "8.0"))
+(defface-mh mh-folder-whitelisted
+ (mh-face-data 'mh-folder-refiled '((t (:inherit mh-folder-refiled))))
+ "Whitelisted message face."
+ :group 'mh-faces
+ :group 'mh-folder
+ :package-version '(MH-E . "8.4"))
+
(defface-mh mh-letter-header-field (mh-face-data 'mh-letter-header-field)
"Editable header field value face in draft buffers."
:group 'mh-faces
diff --git a/lisp/mh-e/mh-folder.el b/lisp/mh-e/mh-folder.el
index f891997d7bc..01f304a38dc 100644
--- a/lisp/mh-e/mh-folder.el
+++ b/lisp/mh-e/mh-folder.el
@@ -162,9 +162,9 @@ annotation.")
["Go to Last Message" mh-last-msg t]
["Go to Message by Number..." mh-goto-msg t]
["Modify Message" mh-modify t]
- ["Delete Message" mh-delete-msg (mh-get-msg-num nil)]
["Refile Message" mh-refile-msg (mh-get-msg-num nil)]
- ["Undo Delete/Refile" mh-undo (mh-outstanding-commands-p)]
+ ["Delete Message" mh-delete-msg (mh-get-msg-num nil)]
+ ["Undo Delete/Refile/Junk" mh-undo (mh-outstanding-commands-p)]
["Execute Delete/Refile" mh-execute-commands
(mh-outstanding-commands-p)]
"--"
@@ -405,12 +405,18 @@ See `mh-set-help'.")
;; Folders when displaying index buffer
(list "^\\+.*"
'(0 'mh-search-folder))
- ;; Marked for deletion
- (list (concat mh-scan-deleted-msg-regexp ".*")
- '(0 'mh-folder-deleted))
;; Marked for refile
(list (concat mh-scan-refiled-msg-regexp ".*")
'(0 'mh-folder-refiled))
+ ;; Marked for deletion
+ (list (concat mh-scan-deleted-msg-regexp ".*")
+ '(0 'mh-folder-deleted))
+ ;; Marked for blacklisting
+ (list (concat mh-scan-blacklisted-msg-regexp ".*")
+ '(0 'mh-folder-blacklisted))
+ ;; Marked for whitelisting
+ (list (concat mh-scan-whitelisted-msg-regexp ".*")
+ '(0 'mh-folder-whitelisted))
;; After subject
(list mh-scan-body-regexp
'(1 'mh-folder-body nil t))
@@ -614,8 +620,10 @@ perform the operation on all messages in that region.
'overlay-arrow-position nil ; Allow for simultaneous display in
'overlay-arrow-string ">" ; different MH-E buffers.
'mh-showing-mode nil ; Show message also?
- 'mh-delete-list nil ; List of msgs nums to delete
'mh-refile-list nil ; List of folder names in mh-seq-list
+ 'mh-delete-list nil ; List of msgs nums to delete
+ 'mh-blacklist nil ; List of messages to process as spam
+ 'mh-whitelist nil ; List of messages to process as ham
'mh-seq-list nil ; Alist of (seq . msgs) nums
'mh-seen-list nil ; List of displayed messages
'mh-next-direction 'forward ; Direction to move to next message
@@ -709,15 +717,15 @@ RANGE is read in interactive use."
;;;###mh-autoload
(defun mh-execute-commands ()
- "Process outstanding delete and refile requests\\<mh-folder-mode-map>.
+ "Perform outstanding operations\\<mh-folder-mode-map>.
-If you've marked messages to be deleted or refiled and you want
-to go ahead and delete or refile the messages, use this command.
-Many MH-E commands that may affect the numbering of the
-messages (such as \\[mh-rescan-folder] or \\[mh-pack-folder])
-will ask if you want to process refiles or deletes first and then
-either run this command for you or undo the pending refiles and
-deletes.
+If you've marked messages to be refiled, deleted, blacklisted, or
+whitelisted and you want to go ahead and perform these operations
+on these messages, use this command. Many MH-E commands that may
+affect the numbering of the messages (such as
+\\[mh-rescan-folder] or \\[mh-pack-folder]) will ask if you want
+to perform these operations first and then either run this
+command for you or undo the pending operations.
This function runs `mh-before-commands-processed-hook' before the
commands are processed and `mh-after-commands-processed-hook'
@@ -807,6 +815,8 @@ instead."
nil))))
(mh-toggle-threads))
(beginning-of-line)
+ (when (mh-outstanding-commands-p)
+ (mh-notate-deleted-and-refiled))
(if (and mh-showing-mode (looking-at mh-scan-valid-regexp)) (mh-show))
(run-hooks 'mh-inc-folder-hook)))
@@ -1181,14 +1191,18 @@ RANGE is read in interactive use."
(cond ((numberp range)
(let ((original-position (point)))
(beginning-of-line)
- (while (not (or (looking-at mh-scan-deleted-msg-regexp)
- (looking-at mh-scan-refiled-msg-regexp)
+ (while (not (or (looking-at mh-scan-refiled-msg-regexp)
+ (looking-at mh-scan-deleted-msg-regexp)
+ (looking-at mh-scan-blacklisted-msg-regexp)
+ (looking-at mh-scan-whitelisted-msg-regexp)
(and (eq mh-next-direction 'forward) (bobp))
(and (eq mh-next-direction 'backward)
(save-excursion (forward-line) (eobp)))))
(forward-line (if (eq mh-next-direction 'forward) -1 1)))
- (if (or (looking-at mh-scan-deleted-msg-regexp)
- (looking-at mh-scan-refiled-msg-regexp))
+ (if (or (looking-at mh-scan-refiled-msg-regexp)
+ (looking-at mh-scan-deleted-msg-regexp)
+ (looking-at mh-scan-blacklisted-msg-regexp)
+ (looking-at mh-scan-whitelisted-msg-regexp))
(progn
(mh-undo-msg (mh-get-msg-num t))
(mh-maybe-show))
@@ -1520,7 +1534,7 @@ is updated."
(save-excursion
(when (eq major-mode 'mh-show-mode)
(set-buffer mh-show-folder-buffer))
- (or mh-delete-list mh-refile-list)))
+ (or mh-delete-list mh-refile-list mh-blacklist mh-whitelist)))
;;;###mh-autoload
(defun mh-set-folder-modified-p (flag)
@@ -1544,10 +1558,15 @@ after the commands are processed."
(let ((redraw-needed-flag mh-index-data)
(folders-changed (list mh-current-folder))
- (seq-map (and mh-refile-list mh-refile-preserves-sequences-flag
- (mh-create-sequence-map mh-seq-list)))
+ (seq-map (and
+ (or (and mh-refile-list mh-refile-preserves-sequences-flag)
+ (and mh-whitelist
+ mh-whitelist-preserves-sequences-flag))
+ (mh-create-sequence-map mh-seq-list)))
(dest-map (and mh-refile-list mh-refile-preserves-sequences-flag
- (make-hash-table))))
+ (make-hash-table)))
+ (white-map (and mh-whitelist mh-whitelist-preserves-sequences-flag
+ (make-hash-table))))
;; Remove invalid scan lines if we are in an index folder and then remove
;; the real messages
(when mh-index-data
@@ -1594,6 +1613,49 @@ after the commands are processed."
(mh-delete-scan-msgs mh-delete-list)
(setq mh-delete-list nil)))
+ ;; Blacklist messages.
+ (when mh-blacklist
+ (let ((msg-list (mh-coalesce-msg-list mh-blacklist))
+ (dest (mh-junk-blacklist-disposition)))
+ (mh-junk-process-blacklist mh-blacklist)
+ ;; TODO I wonder why mh-exec-cmd is used instead of the following:
+ ;; (mh-refile-a-msg nil (intern dest))
+ ;; (mh-delete-a-msg nil)))
+ (if (null dest)
+ (apply 'mh-exec-cmd "rmm" folder msg-list)
+ (apply 'mh-exec-cmd "refile" "-src" folder dest msg-list)
+ (push dest folders-changed))
+ (setq redraw-needed-flag t)
+ (mh-delete-scan-msgs mh-blacklist)
+ (setq mh-blacklist nil)))
+
+ ;; Whitelist messages.
+ (when mh-whitelist
+ (let ((msg-list (mh-coalesce-msg-list mh-whitelist))
+ (last (car (mh-translate-range mh-inbox "last"))))
+ (mh-junk-process-whitelist mh-whitelist)
+ (apply #'mh-exec-cmd "refile" "-src" folder mh-inbox msg-list)
+ (push mh-inbox folders-changed)
+ (setq redraw-needed-flag t)
+ (mh-delete-scan-msgs mh-whitelist)
+ (when mh-whitelist-preserves-sequences-flag
+ (clrhash white-map)
+ (loop for i from (1+ (or last 0))
+ for msg in (sort (copy-sequence mh-whitelist) #'<)
+ do (loop for seq-name in (gethash msg seq-map)
+ do (push i (gethash seq-name white-map))))
+ (maphash
+ #'(lambda (seq msgs)
+ ;; Can't be run in background, since the current
+ ;; folder is changed by mark this could lead to a
+ ;; race condition with the next refile/whitelist.
+ (apply #'mh-exec-cmd "mark"
+ "-sequence" (symbol-name seq) mh-inbox
+ "-add" (mapcar #'(lambda(x) (format "%s" x))
+ (mh-coalesce-msg-list msgs))))
+ white-map))
+ (setq mh-whitelist nil)))
+
;; Don't need to remove sequences since delete and refile do so.
;; Mark cur message
(if (> (buffer-size) 0)
@@ -1904,6 +1966,10 @@ once when he kept statistics on his mail usage."
(setq message (mh-get-msg-num t)))
(if (looking-at mh-scan-refiled-msg-regexp)
(error "Message %d is refiled; undo refile before deleting" message))
+ (if (looking-at mh-scan-blacklisted-msg-regexp)
+ (error "Message %d is blacklisted; undo before deleting" message))
+ (if (looking-at mh-scan-whitelisted-msg-regexp)
+ (error "Message %d is whitelisted; undo before deleting" message))
(if (looking-at mh-scan-deleted-msg-regexp)
nil
(mh-set-folder-modified-p t)
@@ -1925,6 +1991,10 @@ be refiled."
(setq message (mh-get-msg-num t)))
(cond ((looking-at mh-scan-deleted-msg-regexp)
(error "Message %d is deleted; undo delete before moving" message))
+ ((looking-at mh-scan-blacklisted-msg-regexp)
+ (error "Message %d is blacklisted; undo before moving" message))
+ ((looking-at mh-scan-whitelisted-msg-regexp)
+ (error "Message %d is whitelisted; undo before moving" message))
((looking-at mh-scan-refiled-msg-regexp)
(if (y-or-n-p
(format "Message %d already refiled; copy to %s as well? "
@@ -1943,7 +2013,7 @@ be refiled."
(run-hooks 'mh-refile-msg-hook)))))
(defun mh-undo-msg (msg)
- "Undo the deletion or refile of one MSG.
+ "Undo the deletion, refile, black- or whitelisting of one MSG.
If MSG is nil then act on the message at point"
(save-excursion
(if (numberp msg)
@@ -1952,6 +2022,10 @@ If MSG is nil then act on the message at point"
(setq msg (mh-get-msg-num t)))
(cond ((memq msg mh-delete-list)
(setq mh-delete-list (delq msg mh-delete-list)))
+ ((memq msg mh-blacklist)
+ (setq mh-blacklist (delq msg mh-blacklist)))
+ ((memq msg mh-whitelist)
+ (setq mh-whitelist (delq msg mh-whitelist)))
(t
(dolist (folder-msg-list mh-refile-list)
(setf (cdr folder-msg-list) (remove msg (cdr folder-msg-list))))
diff --git a/lisp/mh-e/mh-junk.el b/lisp/mh-e/mh-junk.el
index 9f42d2581d0..d7632ffc729 100644
--- a/lisp/mh-e/mh-junk.el
+++ b/lisp/mh-e/mh-junk.el
@@ -52,27 +52,64 @@ program, see:
- `mh-bogofilter-blacklist'
- `mh-spamprobe-blacklist'"
(interactive (list (mh-interactive-range "Blacklist")))
+ (mh-iterate-on-range () range (mh-blacklist-a-msg nil))
+ (if (looking-at mh-scan-blacklisted-msg-regexp)
+ (mh-next-msg)))
+
+(defun mh-blacklist-a-msg (message)
+ "Blacklist MESSAGE.
+If MESSAGE is nil then the message at point is blacklisted.
+The hook `mh-blacklisted-msg-hook' is called after you mark a message
+for blacklisting."
+ (save-excursion
+ (if (numberp message)
+ (mh-goto-msg message nil t)
+ (beginning-of-line)
+ (setq message (mh-get-msg-num t)))
+ (cond ((looking-at mh-scan-refiled-msg-regexp)
+ (error "Message %d is refiled; undo refile before blacklisting"
+ message))
+ ((looking-at mh-scan-deleted-msg-regexp)
+ (error "Message %d is deleted; undo delete before blacklisting"
+ message))
+ ((looking-at mh-scan-whitelisted-msg-regexp)
+ (error "Message %d is whitelisted; undo before blacklisting"
+ message))
+ ((looking-at mh-scan-blacklisted-msg-regexp) nil)
+ (t
+ (mh-set-folder-modified-p t)
+ (setq mh-blacklist (cons message mh-blacklist))
+ (if (not (memq message mh-seen-list))
+ (setq mh-seen-list (cons message mh-seen-list)))
+ (mh-notate nil mh-note-blacklisted mh-cmd-note)
+ (run-hooks 'mh-blacklist-msg-hook)))))
+
+;;;###mh-autoload
+(defun mh-junk-blacklist-disposition ()
+ "Determines the fate of the selected spam."
+ (cond ((null mh-junk-disposition) nil)
+ ((equal mh-junk-disposition "") "+")
+ ((eq (aref mh-junk-disposition 0) ?+)
+ mh-junk-disposition)
+ ((eq (aref mh-junk-disposition 0) ?@)
+ (concat mh-current-folder "/"
+ (substring mh-junk-disposition 1)))
+ (t (concat "+" mh-junk-disposition))))
+
+;;;###mh-autoload
+(defun mh-junk-process-blacklist (range)
+ "Blacklist RANGE as spam.
+This command trains the spam program in use (see the option
+`mh-junk-program') with the content of RANGE and then handles the
+message(s) as specified by the option `mh-junk-disposition'."
(let ((blacklist-func (nth 1 (assoc mh-junk-choice mh-junk-function-alist))))
(unless blacklist-func
(error "Customize `mh-junk-program' appropriately"))
- (let ((dest (cond ((null mh-junk-disposition) nil)
- ((equal mh-junk-disposition "") "+")
- ((eq (aref mh-junk-disposition 0) ?+)
- mh-junk-disposition)
- ((eq (aref mh-junk-disposition 0) ?@)
- (concat mh-current-folder "/"
- (substring mh-junk-disposition 1)))
- (t (concat "+" mh-junk-disposition)))))
- (mh-iterate-on-range msg range
- (message "Blacklisting message %d..." msg)
- (funcall (symbol-function blacklist-func) msg)
- (message "Blacklisting message %d...done" msg)
- (if (not (memq msg mh-seen-list))
- (setq mh-seen-list (cons msg mh-seen-list)))
- (if dest
- (mh-refile-a-msg nil (intern dest))
- (mh-delete-a-msg nil)))
- (mh-next-msg))))
+ (mh-iterate-on-range msg range
+ (message "Blacklisting message %d..." msg)
+ (funcall (symbol-function blacklist-func) msg)
+ (message "Blacklisting message %d...done" msg))
+ (mh-next-msg)))
;;;###mh-autoload
(defun mh-junk-whitelist (range)
@@ -85,14 +122,49 @@ refiles the message into the \"+inbox\" folder.
Check the documentation of `mh-interactive-range' to see how
RANGE is read in interactive use."
(interactive (list (mh-interactive-range "Whitelist")))
+ (mh-iterate-on-range () range (mh-junk-whitelist-a-msg nil))
+ (if (looking-at mh-scan-whitelisted-msg-regexp)
+ (mh-next-msg)))
+
+(defun mh-junk-whitelist-a-msg (message)
+ "Whitelist MESSAGE.
+If MESSAGE is nil then the message at point is whitelisted. The
+hook `mh-whitelist-msg-hook' is called after you mark a message
+for whitelisting."
+ (save-excursion
+ (if (numberp message)
+ (mh-goto-msg message nil t)
+ (beginning-of-line)
+ (setq message (mh-get-msg-num t)))
+ (cond ((looking-at mh-scan-refiled-msg-regexp)
+ (error "Message %d is refiled; undo refile before whitelisting"
+ message))
+ ((looking-at mh-scan-deleted-msg-regexp)
+ (error "Message %d is deleted; undo delete before whitelisting"
+ message))
+ ((looking-at mh-scan-blacklisted-msg-regexp)
+ (error "Message %d is blacklisted; undo before whitelisting"
+ message))
+ ((looking-at mh-scan-whitelisted-msg-regexp) nil)
+ (t
+ (mh-set-folder-modified-p t)
+ (setq mh-whitelist (cons message mh-whitelist))
+ (mh-notate nil mh-note-whitelisted mh-cmd-note)
+ (run-hooks 'mh-whitelist-msg-hook)))))
+
+;;;###mh-autoload
+(defun mh-junk-process-whitelist (range)
+ "Whitelist RANGE as ham.
+
+This command reclassifies the RANGE as ham if it were incorrectly
+classified as spam (see the option `mh-junk-program')."
(let ((whitelist-func (nth 2 (assoc mh-junk-choice mh-junk-function-alist))))
(unless whitelist-func
(error "Customize `mh-junk-program' appropriately"))
(mh-iterate-on-range msg range
(message "Whitelisting message %d..." msg)
(funcall (symbol-function whitelist-func) msg)
- (message "Whitelisting message %d...done" msg)
- (mh-refile-a-msg nil (intern mh-inbox)))
+ (message "Whitelisting message %d...done" msg))
(mh-next-msg)))
diff --git a/lisp/mh-e/mh-letter.el b/lisp/mh-e/mh-letter.el
index b2db25f674a..b4d8b625586 100644
--- a/lisp/mh-e/mh-letter.el
+++ b/lisp/mh-e/mh-letter.el
@@ -69,7 +69,7 @@ citation text as modified.
This is a normal hook, misnamed for historical reasons.
It is obsolete and is only used if `mail-citation-hook' is nil.")
-(make-obsolete-variable 'mh-yank-hooks 'mail-citation-hook "19.34")
+(mh-make-obsolete-variable 'mh-yank-hooks 'mail-citation-hook "19.34")
@@ -725,69 +725,71 @@ not inserted. If the option `mh-yank-behavior' is set to one of
the supercite flavors, the hook `mail-citation-hook' is ignored
and `mh-ins-buf-prefix' is not inserted."
(interactive)
- (if (and mh-sent-from-folder
- (with-current-buffer mh-sent-from-folder mh-show-buffer)
- (with-current-buffer mh-sent-from-folder
- (get-buffer mh-show-buffer))
- mh-sent-from-msg)
- (let ((to-point (point))
- (to-buffer (current-buffer)))
- (set-buffer mh-sent-from-folder)
- (if mh-delete-yanked-msg-window-flag
- (delete-windows-on mh-show-buffer))
- (set-buffer mh-show-buffer) ; Find displayed message
- (let* ((from-attr (mh-extract-from-attribution))
- (yank-region (mh-mark-active-p nil))
- (mh-ins-str
- (cond ((and yank-region
- (or (eq 'supercite mh-yank-behavior)
- (eq 'autosupercite mh-yank-behavior)
- (eq t mh-yank-behavior)))
- ;; supercite needs the full header
- (concat
- (buffer-substring (point-min) (mh-mail-header-end))
- "\n"
- (buffer-substring (region-beginning) (region-end))))
- (yank-region
- (buffer-substring (region-beginning) (region-end)))
- ((or (eq 'body mh-yank-behavior)
- (eq 'attribution mh-yank-behavior)
- (eq 'autoattrib mh-yank-behavior))
- (buffer-substring
- (save-excursion
- (goto-char (point-min))
- (mh-goto-header-end 1)
- (point))
- (point-max)))
- ((or (eq 'supercite mh-yank-behavior)
- (eq 'autosupercite mh-yank-behavior)
- (eq t mh-yank-behavior))
- (buffer-substring (point-min) (point-max)))
- (t
- (buffer-substring (point) (point-max))))))
- (set-buffer to-buffer)
- (save-restriction
- (narrow-to-region to-point to-point)
- (insert (mh-filter-out-non-text mh-ins-str))
- (goto-char (point-max)) ;Needed for sc-cite-original
- (push-mark) ;Needed for sc-cite-original
- (goto-char (point-min)) ;Needed for sc-cite-original
- (mh-insert-prefix-string mh-ins-buf-prefix)
- (when (or (eq 'attribution mh-yank-behavior)
- (eq 'autoattrib mh-yank-behavior))
- (insert from-attr)
- (mh-identity-insert-attribution-verb nil)
- (insert "\n\n"))
- ;; If the user has selected a region, he has already "edited" the
- ;; text, so leave the cursor at the end of the yanked text. In
- ;; either case, leave a mark at the opposite end of the included
- ;; text to make it easy to jump or delete to the other end of the
- ;; text.
- (push-mark)
- (goto-char (point-max))
- (if (null yank-region)
- (mh-exchange-point-and-mark-preserving-active-mark)))))
- (error "There is no current message")))
+ (let ((show-buffer))
+ (if (and mh-sent-from-folder
+ (with-current-buffer mh-sent-from-folder mh-show-buffer)
+ (setq show-buffer (with-current-buffer mh-sent-from-folder
+ (get-buffer mh-show-buffer)))
+ mh-sent-from-msg)
+ (let ((to-point (point))
+ (to-buffer (current-buffer)))
+ (if mh-delete-yanked-msg-window-flag
+ (with-current-buffer mh-sent-from-folder
+ (delete-windows-on show-buffer)))
+ ;; Find displayed message
+ (with-current-buffer show-buffer
+ (let* ((from-attr (mh-extract-from-attribution))
+ (yank-region (mh-mark-active-p nil))
+ (mh-ins-str
+ (cond ((and yank-region
+ (or (eq 'supercite mh-yank-behavior)
+ (eq 'autosupercite mh-yank-behavior)
+ (eq t mh-yank-behavior)))
+ ;; supercite needs the full header
+ (concat
+ (buffer-substring (point-min) (mh-mail-header-end))
+ "\n"
+ (buffer-substring (region-beginning) (region-end))))
+ (yank-region
+ (buffer-substring (region-beginning) (region-end)))
+ ((or (eq 'body mh-yank-behavior)
+ (eq 'attribution mh-yank-behavior)
+ (eq 'autoattrib mh-yank-behavior))
+ (buffer-substring
+ (save-excursion
+ (goto-char (point-min))
+ (mh-goto-header-end 1)
+ (point))
+ (point-max)))
+ ((or (eq 'supercite mh-yank-behavior)
+ (eq 'autosupercite mh-yank-behavior)
+ (eq t mh-yank-behavior))
+ (buffer-substring (point-min) (point-max)))
+ (t
+ (buffer-substring (point) (point-max))))))
+ (with-current-buffer to-buffer
+ (save-restriction
+ (narrow-to-region to-point to-point)
+ (insert (mh-filter-out-non-text mh-ins-str))
+ (goto-char (point-max)) ;Needed for sc-cite-original
+ (push-mark) ;Needed for sc-cite-original
+ (goto-char (point-min)) ;Needed for sc-cite-original
+ (mh-insert-prefix-string mh-ins-buf-prefix)
+ (when (or (eq 'attribution mh-yank-behavior)
+ (eq 'autoattrib mh-yank-behavior))
+ (insert from-attr)
+ (mh-identity-insert-attribution-verb nil)
+ (insert "\n\n"))
+ ;; If the user has selected a region, he has already "edited" the
+ ;; text, so leave the cursor at the end of the yanked text. In
+ ;; either case, leave a mark at the opposite end of the included
+ ;; text to make it easy to jump or delete to the other end of the
+ ;; text.
+ (push-mark)
+ (goto-char (point-max))
+ (if (null yank-region)
+ (mh-exchange-point-and-mark-preserving-active-mark)))))))
+ (error "There is no current message"))))
diff --git a/lisp/mh-e/mh-mime.el b/lisp/mh-e/mh-mime.el
index 4af3c452cc0..046f03d5255 100644
--- a/lisp/mh-e/mh-mime.el
+++ b/lisp/mh-e/mh-mime.el
@@ -268,10 +268,12 @@ usually reads the file \"/etc/mailcap\"."
(buffer-read-only nil))
(when (string-match "^[^% \t]+$" method)
(setq method (concat method " %s")))
- (flet ((mm-handle-set-external-undisplayer (handle function)
- (mh-handle-set-external-undisplayer folder handle function)))
- (unwind-protect (mm-display-external part method)
- (set-buffer-modified-p nil)))))
+ (mh-cl-flet
+ ((mm-handle-set-external-undisplayer
+ (handle function)
+ (mh-handle-set-external-undisplayer folder handle function)))
+ (unwind-protect (mm-display-external part method)
+ (set-buffer-modified-p nil)))))
nil))
;;;###mh-autoload
@@ -523,47 +525,48 @@ parsed and then displayed."
(let ((handles ())
(folder mh-show-folder-buffer)
(raw-message-data (buffer-string)))
- (flet ((mm-handle-set-external-undisplayer
- (handle function)
- (mh-handle-set-external-undisplayer folder handle function)))
- (goto-char (point-min))
- (unless (search-forward "\n\n" nil t)
- (goto-char (point-max))
- (insert "\n\n"))
-
- (condition-case err
- (progn
- ;; If needed dissect the current buffer
- (if pre-dissected-handles
- (setq handles pre-dissected-handles)
- (if (setq handles (mm-dissect-buffer nil))
- (mh-mm-uu-dissect-text-parts handles)
- (setq handles (mm-uu-dissect)))
- (setf (mh-mime-handles (mh-buffer-data))
- (mh-mm-merge-handles handles
- (mh-mime-handles (mh-buffer-data))))
- (unless handles
- (mh-decode-message-body)))
-
- (cond ((and handles
- (or (not (stringp (car handles)))
- (cdr handles)))
- ;; Go to start of message body
- (goto-char (point-min))
- (or (search-forward "\n\n" nil t)
- (goto-char (point-max)))
-
- ;; Delete the body
- (delete-region (point) (point-max))
-
- ;; Display the MIME handles
- (mh-mime-display-part handles))
- (t
- (mh-signature-highlight))))
- (error
- (message "Could not display body: %s" (error-message-string err))
- (delete-region (point-min) (point-max))
- (insert raw-message-data))))))
+ (mh-cl-flet
+ ((mm-handle-set-external-undisplayer
+ (handle function)
+ (mh-handle-set-external-undisplayer folder handle function)))
+ (goto-char (point-min))
+ (unless (search-forward "\n\n" nil t)
+ (goto-char (point-max))
+ (insert "\n\n"))
+
+ (condition-case err
+ (progn
+ ;; If needed dissect the current buffer
+ (if pre-dissected-handles
+ (setq handles pre-dissected-handles)
+ (if (setq handles (mm-dissect-buffer nil))
+ (mh-mm-uu-dissect-text-parts handles)
+ (setq handles (mm-uu-dissect)))
+ (setf (mh-mime-handles (mh-buffer-data))
+ (mh-mm-merge-handles handles
+ (mh-mime-handles (mh-buffer-data))))
+ (unless handles
+ (mh-decode-message-body)))
+
+ (cond ((and handles
+ (or (not (stringp (car handles)))
+ (cdr handles)))
+ ;; Go to start of message body
+ (goto-char (point-min))
+ (or (search-forward "\n\n" nil t)
+ (goto-char (point-max)))
+
+ ;; Delete the body
+ (delete-region (point) (point-max))
+
+ ;; Display the MIME handles
+ (mh-mime-display-part handles))
+ (t
+ (mh-signature-highlight))))
+ (error
+ (message "Could not display body: %s" (error-message-string err))
+ (delete-region (point-min) (point-max))
+ (insert raw-message-data))))))
(defun mh-decode-message-body ()
"Decode message based on charset.
@@ -1046,13 +1049,14 @@ attachment, the attachment is hidden."
(function (get-text-property (point) 'mh-callback))
(buffer-read-only nil)
(folder mh-show-folder-buffer))
- (flet ((mm-handle-set-external-undisplayer
- (handle function)
- (mh-handle-set-external-undisplayer folder handle function)))
- (when (and function (eolp))
- (backward-char))
- (unwind-protect (and function (funcall function data))
- (set-buffer-modified-p nil)))))
+ (mh-cl-flet
+ ((mm-handle-set-external-undisplayer
+ (handle function)
+ (mh-handle-set-external-undisplayer folder handle function)))
+ (when (and function (eolp))
+ (backward-char))
+ (unwind-protect (and function (funcall function data))
+ (set-buffer-modified-p nil)))))
(defun mh-push-button (event)
"Click MIME button for EVENT.
@@ -1066,9 +1070,11 @@ to click the MIME button."
(mm-inline-media-tests mh-mm-inline-media-tests)
(data (get-text-property (point) 'mh-data))
(function (get-text-property (point) 'mh-callback)))
- (flet ((mm-handle-set-external-undisplayer (handle func)
- (mh-handle-set-external-undisplayer folder handle func)))
- (and function (funcall function data))))))
+ (mh-cl-flet
+ ((mm-handle-set-external-undisplayer
+ (handle func)
+ (mh-handle-set-external-undisplayer folder handle func)))
+ (and function (funcall function data))))))
(defun mh-handle-set-external-undisplayer (folder handle function)
"Replacement for `mm-handle-set-external-undisplayer'.
@@ -1160,10 +1166,11 @@ this ;-)"
(defun mh-display-emphasis ()
"Display graphical emphasis."
(when (and mh-graphical-emphasis-flag (mh-small-show-buffer-p))
- (flet ((article-goto-body ())) ; shadow this function to do nothing
- (save-excursion
- (goto-char (point-min))
- (article-emphasize)))))
+ (mh-cl-flet
+ ((article-goto-body ())) ; shadow this function to do nothing
+ (save-excursion
+ (goto-char (point-min))
+ (article-emphasize)))))
(defun mh-small-show-buffer-p ()
"Check if show buffer is small.
diff --git a/lisp/mh-e/mh-scan.el b/lisp/mh-e/mh-scan.el
index 1f46c63b14c..e06c02b92b8 100644
--- a/lisp/mh-e/mh-scan.el
+++ b/lisp/mh-e/mh-scan.el
@@ -112,6 +112,22 @@ expression which matches the body text as in the default of
not correct, the body fragment will not be highlighted with the
face `mh-folder-body'.")
+(defvar mh-scan-blacklisted-msg-regexp "^\\( *[0-9]+\\)B"
+ "This regular expression matches blacklisted (spam) messages.
+
+It must match from the beginning of the line. Note that the
+default setting of `mh-folder-font-lock-keywords' expects this
+expression to contain at least one parenthesized expression which
+matches the message number as in the default of
+
+ \"^\\\\( *[0-9]+\\\\)B\".
+
+This expression includes the leading space within parenthesis
+since it looks better to highlight it as well. The highlighting
+is done with the face `mh-folder-blacklisted'. This regular
+expression should be correct as it is needed by non-fontification
+functions. See also `mh-note-blacklisted'.")
+
(defvar mh-scan-cur-msg-number-regexp "^\\( *[0-9]+\\+\\).*"
"This regular expression matches the current message.
@@ -156,7 +172,7 @@ is done with the face `mh-folder-deleted'. This regular
expression should be correct as it is needed by non-fontification
functions. See also `mh-note-deleted'.")
-(defvar mh-scan-good-msg-regexp "^\\( *[0-9]+\\)[^D^0-9]"
+(defvar mh-scan-good-msg-regexp "^\\( *[0-9]+\\)[^^DBW0-9]"
"This regular expression matches \"good\" messages.
It must match from the beginning of the line. Note that the
@@ -164,7 +180,7 @@ default setting of `mh-folder-font-lock-keywords' expects this
expression to contain at least one parenthesized expression which
matches the message number as in the default of
- \"^\\\\( *[0-9]+\\\\)[^D^0-9]\".
+ \"^\\\\( *[0-9]+\\\\)[^^DBW0-9]\".
This expression includes the leading space within the parenthesis
since it looks better to highlight it as well. The highlighting
@@ -278,6 +294,22 @@ non-fontification functions.")
This is used to eliminate error messages that are occasionally
produced by \"inc\".")
+(defvar mh-scan-whitelisted-msg-regexp "^\\( *[0-9]+\\)W"
+ "This regular expression matches whitelisted (non-spam) messages.
+
+It must match from the beginning of the line. Note that the
+default setting of `mh-folder-font-lock-keywords' expects this
+expression to contain at least one parenthesized expression which
+matches the message number as in the default of
+
+ \"^\\\\( *[0-9]+\\\\)W\".
+
+This expression includes the leading space within parenthesis
+since it looks better to highlight it as well. The highlighting
+is done with the face `mh-folder-whitelisted'. This regular
+expression should be correct as it is needed by non-fontification
+functions. See also `mh-note-whitelisted'.")
+
;;; Widths, Offsets and Columns
@@ -295,11 +327,13 @@ Note that columns in Emacs start with 0.")
(defvar mh-scan-cmd-note-width 1
"Number of columns consumed by the cmd-note field in `mh-scan-format'.
-This column will have one of the values: \" \", \"D\", \"^\", \"+\", where
+This column will have one of the values: \" \", \"^\", \"D\", \"B\", \"W\", \"+\", where
\" \" is the default value,
+ \"^\" is the `mh-note-refiled' character,
\"D\" is the `mh-note-deleted' character,
- \"^\" is the `mh-note-refiled' character, and
+ \"B\" is the `mh-note-blacklisted' character,
+ \"W\" is the `mh-note-whitelisted' character, and
\"+\" is the `mh-note-cur' character.")
(defvar mh-scan-destination-width 1
@@ -364,6 +398,10 @@ This column will only ever have spaces in it.")
;; Alphabetical.
+(defvar mh-note-blacklisted ?B
+ "Messages that have been blacklisted are marked by this character.
+See also `mh-scan-blacklisted-msg-regexp'.")
+
(defvar mh-note-cur ?+
"The current message (in MH, not in MH-E) is marked by this character.
See also `mh-scan-cur-msg-number-regexp'.")
@@ -397,6 +435,10 @@ See also `mh-scan-refiled-msg-regexp'.")
Messages in the \"search\" sequence are marked by this character as
well.")
+(defvar mh-note-whitelisted ?W
+ "Messages that have been whitelisted are marked by this character.
+See also `mh-scan-whitelisted-msg-regexp'.")
+
;;; Utilities
diff --git a/lisp/mh-e/mh-search.el b/lisp/mh-e/mh-search.el
index d4fa0df3140..d31d0ca495a 100644
--- a/lisp/mh-e/mh-search.el
+++ b/lisp/mh-e/mh-search.el
@@ -1434,7 +1434,7 @@ being the list of messages originally from that folder."
(beginning-of-line)
(push (cons (buffer-substring-no-properties
(point) (mh-line-end-position))
- (set-marker (make-marker) (point)))
+ (point-marker))
alist)))
(setq imenu--index-alist (nreverse alist)))))
@@ -1449,11 +1449,12 @@ being the list of messages originally from that folder."
;;;###mh-autoload
(defun mh-index-execute-commands ()
- "Delete/refile the actual messages.
-The copies in the searched folder are then deleted/refiled to get
-the desired result. Before deleting the messages we make sure
-that the message being deleted is identical to the one that the
-user has marked in the index buffer."
+ "Perform the outstanding operations on the actual messages.
+The copies in the searched folder are then deleted, refiled,
+blacklisted and whitelisted to get the desired result. Before
+processing the messages we make sure that the message is
+identical to the one that the user has marked in the index
+buffer."
(save-excursion
(let ((folders ())
(mh-speed-flists-inhibit-flag t))
@@ -1466,9 +1467,13 @@ user has marked in the index buffer."
;; Otherwise delete the messages in the source buffer...
(with-current-buffer folder
(let ((old-refile-list mh-refile-list)
- (old-delete-list mh-delete-list))
+ (old-delete-list mh-delete-list)
+ (old-blacklist mh-blacklist)
+ (old-whitelist mh-whitelist))
(setq mh-refile-list nil
- mh-delete-list msgs)
+ mh-delete-list msgs
+ mh-blacklist nil
+ mh-whitelist nil)
(unwind-protect (mh-execute-commands)
(setq mh-refile-list
(mapcar (lambda (x)
@@ -1478,13 +1483,21 @@ user has marked in the index buffer."
old-refile-list)
mh-delete-list
(loop for x in old-delete-list
+ unless (memq x msgs) collect x)
+ mh-blacklist
+ (loop for x in old-blacklist
+ unless (memq x msgs) collect x)
+ mh-whitelist
+ (loop for x in old-whitelist
unless (memq x msgs) collect x))
(mh-set-folder-modified-p (mh-outstanding-commands-p))
(when (mh-outstanding-commands-p)
(mh-notate-deleted-and-refiled)))))))
(mh-index-matching-source-msgs (append (loop for x in mh-refile-list
append (cdr x))
- mh-delete-list)
+ mh-delete-list
+ mh-blacklist
+ mh-whitelist)
t))
folders)))
diff --git a/lisp/mh-e/mh-show.el b/lisp/mh-e/mh-show.el
index 92b9625fc43..87b048dbd60 100644
--- a/lisp/mh-e/mh-show.el
+++ b/lisp/mh-e/mh-show.el
@@ -612,6 +612,7 @@ still visible.\n")
"l" mh-show-list-folders
"n" mh-index-new-messages
"o" mh-show-visit-folder
+ "p" mh-show-pack-folder
"q" mh-show-index-sequenced-messages
"r" mh-show-rescan-folder
"s" mh-search
@@ -899,13 +900,14 @@ See also `mh-folder-mode'.
(interactive)
;; Don't allow Gnus to create buttons while highlighting, maybe this is bad
;; style?
- (flet ((gnus-article-add-button (&rest args) nil))
- (let* ((modified (buffer-modified-p))
- (gnus-article-buffer (buffer-name))
- (gnus-cite-face-list `(,@(cdr gnus-cite-face-list)
- ,(car gnus-cite-face-list))))
- (gnus-article-highlight-citation t)
- (set-buffer-modified-p modified))))
+ (mh-cl-flet
+ ((gnus-article-add-button (&rest args) nil))
+ (let* ((modified (buffer-modified-p))
+ (gnus-article-buffer (buffer-name))
+ (gnus-cite-face-list `(,@(cdr gnus-cite-face-list)
+ ,(car gnus-cite-face-list))))
+ (gnus-article-highlight-citation t)
+ (set-buffer-modified-p modified))))
(provide 'mh-show)
diff --git a/lisp/mh-e/mh-thread.el b/lisp/mh-e/mh-thread.el
index bb9ea94732a..d80e9f3ae53 100644
--- a/lisp/mh-e/mh-thread.el
+++ b/lisp/mh-e/mh-thread.el
@@ -645,19 +645,20 @@ Only information about messages in MSG-LIST are added to the tree."
(defun mh-thread-set-tables (folder)
"Use the tables of FOLDER in current buffer."
- (flet ((mh-get-table (symbol)
- (with-current-buffer folder
- (symbol-value symbol))))
- (setq mh-thread-id-hash (mh-get-table 'mh-thread-id-hash))
- (setq mh-thread-subject-hash (mh-get-table 'mh-thread-subject-hash))
- (setq mh-thread-id-table (mh-get-table 'mh-thread-id-table))
- (setq mh-thread-id-index-map (mh-get-table 'mh-thread-id-index-map))
- (setq mh-thread-index-id-map (mh-get-table 'mh-thread-index-id-map))
- (setq mh-thread-scan-line-map (mh-get-table 'mh-thread-scan-line-map))
- (setq mh-thread-subject-container-hash
- (mh-get-table 'mh-thread-subject-container-hash))
- (setq mh-thread-duplicates (mh-get-table 'mh-thread-duplicates))
- (setq mh-thread-history (mh-get-table 'mh-thread-history))))
+ (mh-cl-flet
+ ((mh-get-table (symbol)
+ (with-current-buffer folder
+ (symbol-value symbol))))
+ (setq mh-thread-id-hash (mh-get-table 'mh-thread-id-hash))
+ (setq mh-thread-subject-hash (mh-get-table 'mh-thread-subject-hash))
+ (setq mh-thread-id-table (mh-get-table 'mh-thread-id-table))
+ (setq mh-thread-id-index-map (mh-get-table 'mh-thread-id-index-map))
+ (setq mh-thread-index-id-map (mh-get-table 'mh-thread-index-id-map))
+ (setq mh-thread-scan-line-map (mh-get-table 'mh-thread-scan-line-map))
+ (setq mh-thread-subject-container-hash
+ (mh-get-table 'mh-thread-subject-container-hash))
+ (setq mh-thread-duplicates (mh-get-table 'mh-thread-duplicates))
+ (setq mh-thread-history (mh-get-table 'mh-thread-history))))
(defun mh-thread-process-in-reply-to (reply-to-header)
"Extract message id's from REPLY-TO-HEADER.
diff --git a/lisp/mh-e/mh-xface.el b/lisp/mh-e/mh-xface.el
index 7582158fefd..4340373f5c4 100644
--- a/lisp/mh-e/mh-xface.el
+++ b/lisp/mh-e/mh-xface.el
@@ -323,7 +323,7 @@ elements of the list are nil."
If the URL isn't present in the cache then it is fetched with wget."
(let* ((cache-filename (mh-x-image-url-cache-canonicalize url))
(state (mh-x-image-get-download-state cache-filename))
- (marker (set-marker (make-marker) (point))))
+ (marker (point-marker)))
(set (make-local-variable 'mh-x-image-marker) marker)
(cond ((not (mh-x-image-url-sane-p url)))
((eq state 'ok)
diff --git a/lisp/minibuf-eldef.el b/lisp/minibuf-eldef.el
index a36df99d4a9..3b59a9c622a 100644
--- a/lisp/minibuf-eldef.el
+++ b/lisp/minibuf-eldef.el
@@ -38,6 +38,7 @@
(defun minibuffer-default--in-prompt-regexps ()
`(("\\( (default\\(?: is\\)? \\(.*\\))\\):? \\'"
1 ,(if minibuffer-eldef-shorten-default " [\\2]"))
+ ("([^(]+?\\(, default\\(?: is\\)? \\(.*\\)\\)):? \\'" 1)
("\\( \\[.*\\]\\):? *\\'" 1)))
(defcustom minibuffer-eldef-shorten-default nil
@@ -152,15 +153,11 @@ been set up by `minibuf-eldef-setup-minibuffer'."
(and (= (point-max) minibuf-eldef-initial-buffer-length)
(string-equal (minibuffer-contents-no-properties)
minibuf-eldef-initial-input)))
- ;; swap state
+ ;; Swap state.
(setq minibuf-eldef-showing-default-in-prompt
(not minibuf-eldef-showing-default-in-prompt))
- (cond (minibuf-eldef-showing-default-in-prompt
- (overlay-put minibuf-eldef-overlay 'invisible nil)
- (overlay-put minibuf-eldef-overlay 'intangible nil))
- (t
- (overlay-put minibuf-eldef-overlay 'invisible t)
- (overlay-put minibuf-eldef-overlay 'intangible t)))))
+ (overlay-put minibuf-eldef-overlay 'invisible
+ (not minibuf-eldef-showing-default-in-prompt))))
;;;###autoload
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index 44ce0b78a3e..ef949f7482e 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -51,6 +51,9 @@
;;; Todo:
+;; - Make *Completions* readable even if some of the completion
+;; entries have LF chars or spaces in them (including at
+;; beginning/end) or are very long.
;; - for M-x, cycle-sort commands that have no key binding first.
;; - Make things like icomplete-mode or lightning-completion work with
;; completion-in-region-mode.
@@ -74,6 +77,9 @@
;; - whether the user wants completion to pay attention to case.
;; e.g. we may want to make it possible for the user to say "first try
;; completion case-sensitively, and if that fails, try to ignore case".
+;; Maybe the trick is that we should distinguish completion-ignore-case in
+;; try/all-completions (obey user's preference) from its use in
+;; test-completion (obey the underlying object's semantics).
;; - add support for ** to pcm.
;; - Add vc-file-name-completion-table to read-file-name-internal.
@@ -519,7 +525,7 @@ for use at QPOS."
(eq t (compare-strings s1 nil nil s2 nil nil 'ignore-case)))
(defun completion--twq-all (string ustring completions boundary
- unquote requote)
+ _unquote requote)
(when completions
(pcase-let*
((prefix
@@ -632,7 +638,8 @@ If ARGS are provided, then pass MESSAGE through `format'."
(defun minibuffer-completion-contents ()
"Return the user input in a minibuffer before point as a string.
-That is what completion commands operate on."
+In Emacs-22, that was what completion commands operated on."
+ (declare (obsolete nil "24.4"))
(buffer-substring (field-beginning) (point)))
(defun delete-minibuffer-contents ()
@@ -1037,7 +1044,8 @@ scroll the window of possible completions."
(cond
;; If there's a fresh completion window with a live buffer,
;; and this command is repeated, scroll that window.
- ((window-live-p minibuffer-scroll-window)
+ ((and (window-live-p minibuffer-scroll-window)
+ (eq t (frame-visible-p (window-frame minibuffer-scroll-window))))
(let ((window minibuffer-scroll-window))
(with-current-buffer (window-buffer window)
(if (pos-visible-in-window-p (point-max) window)
@@ -1100,6 +1108,13 @@ scroll the window of possible completions."
(sort-fun (completion-metadata-get all-md 'cycle-sort-function)))
(when last
(setcdr last nil)
+
+ ;; Delete duplicates: do it after setting last's cdr to nil (so
+ ;; it's a proper list), and be careful to reset `last' since it
+ ;; may be a different cons-cell.
+ (setq all (delete-dups all))
+ (setq last (last all))
+
(setq all (if sort-fun (funcall sort-fun all)
;; Prefer shorter completions, by default.
(sort all (lambda (c1 c2) (< (length c1) (length c2))))))
@@ -1114,10 +1129,20 @@ scroll the window of possible completions."
;; all possibilities.
(completion--cache-all-sorted-completions (nconc all base-size))))))
+(defun minibuffer-force-complete-and-exit ()
+ "Complete the minibuffer with first of the matches and exit."
+ (interactive)
+ (minibuffer-force-complete)
+ (minibuffer--complete-and-exit
+ ;; If the previous completion completed to an element which fails
+ ;; test-completion, then we shouldn't exit, but that should be rare.
+ (lambda () (minibuffer-message "Incomplete"))))
+
(defun minibuffer-force-complete ()
"Complete the minibuffer to an exact match.
Repeated uses step through the possible completions."
(interactive)
+ (setq minibuffer-scroll-window nil)
;; FIXME: Need to deal with the extra-size issue here as well.
;; FIXME: ~/src/emacs/t<M-TAB>/lisp/minibuffer.el completes to
;; ~/src/emacs/trunk/ and throws away lisp/minibuffer.el.
@@ -1140,6 +1165,7 @@ Repeated uses step through the possible completions."
(completion--done (buffer-substring-no-properties start (point)) 'sole)
;; Set cycling after modifying the buffer since the flush hook resets it.
(setq completion-cycling t)
+ (setq this-command 'completion-at-point) ;For minibuffer-complete.
;; If completing file names, (car all) may be a directory, so we'd now
;; have a new set of possible completions and might want to reset
;; completion-all-sorted-completions to nil, but we prefer not to,
@@ -1186,6 +1212,22 @@ If `minibuffer-completion-confirm' is `confirm-after-completion',
`minibuffer-confirm-exit-commands', and accept the input
otherwise."
(interactive)
+ (minibuffer--complete-and-exit
+ (lambda ()
+ (pcase (condition-case nil
+ (completion--do-completion nil 'expect-exact)
+ (error 1))
+ ((or #b001 #b011) (exit-minibuffer))
+ (#b111 (if (not minibuffer-completion-confirm)
+ (exit-minibuffer)
+ (minibuffer-message "Confirm")
+ nil))
+ (_ nil)))))
+
+(defun minibuffer--complete-and-exit (completion-function)
+ "Exit from `require-match' minibuffer.
+COMPLETION-FUNCTION is called if the current buffer's content does not
+appear to be a match."
(let ((beg (field-beginning))
(end (field-end)))
(cond
@@ -1233,15 +1275,7 @@ If `minibuffer-completion-confirm' is `confirm-after-completion',
(t
;; Call do-completion, but ignore errors.
- (pcase (condition-case nil
- (completion--do-completion nil 'expect-exact)
- (error 1))
- ((or #b001 #b011) (exit-minibuffer))
- (#b111 (if (not minibuffer-completion-confirm)
- (exit-minibuffer)
- (minibuffer-message "Confirm")
- nil))
- (_ nil))))))
+ (funcall completion-function)))))
(defun completion--try-word-completion (string table predicate point md)
(let ((comp (completion-try-completion string table predicate point md)))
@@ -1428,9 +1462,11 @@ It also eliminates runs of equal strings."
'mouse-face 'highlight)
(put-text-property (point) (progn (insert (car str)) (point))
'mouse-face 'highlight)
- (add-text-properties (point) (progn (insert (cadr str)) (point))
- '(mouse-face nil
- face completions-annotations)))
+ (let ((beg (point))
+ (end (progn (insert (cadr str)) (point))))
+ (put-text-property beg end 'mouse-face nil)
+ (font-lock-prepend-text-property beg end 'face
+ 'completions-annotations)))
(cond
((eq completions-format 'vertical)
;; Vertical format
@@ -1457,12 +1493,11 @@ See also `display-completion-list'.")
(defface completions-first-difference
'((t (:inherit bold)))
- "Face put on the first uncommon character in completions in *Completions* buffer."
+ "Face added on the first uncommon character in completions in *Completions* buffer."
:group 'completion)
-(defface completions-common-part
- '((t (:inherit default)))
- "Face put on the common prefix substring in completions in *Completions* buffer.
+(defface completions-common-part '((t nil))
+ "Face added on the common prefix substring in completions in *Completions* buffer.
The idea of `completions-common-part' is that you can use it to
make the common parts less visible than normal, so that the rest
of the differing parts is, by contrast, slightly highlighted."
@@ -1483,17 +1518,18 @@ of the differing parts is, by contrast, slightly highlighted."
(car (setq elem (cons (copy-sequence (car elem))
(cdr elem))))
(setq elem (copy-sequence elem)))))
- (put-text-property 0
- ;; If completion-boundaries returns incorrect
- ;; values, all-completions may return strings
- ;; that don't contain the prefix.
- (min com-str-len (length str))
- 'font-lock-face 'completions-common-part
- str)
+ (font-lock-prepend-text-property
+ 0
+ ;; If completion-boundaries returns incorrect
+ ;; values, all-completions may return strings
+ ;; that don't contain the prefix.
+ (min com-str-len (length str))
+ 'face 'completions-common-part str)
(if (> (length str) com-str-len)
- (put-text-property com-str-len (1+ com-str-len)
- 'font-lock-face 'completions-first-difference
- str)))
+ (font-lock-prepend-text-property com-str-len (1+ com-str-len)
+ 'face
+ 'completions-first-difference
+ str)))
elem)
completions)
base-size))))
@@ -1728,14 +1764,15 @@ variables.")
(exit-minibuffer))
(defvar completion-in-region-functions nil
- "Wrapper hook around `completion-in-region'.
-The functions on this special hook are called with 5 arguments:
- NEXT-FUN START END COLLECTION PREDICATE.
-NEXT-FUN is a function of four arguments (START END COLLECTION PREDICATE)
-that performs the default operation. The other four arguments are like
-the ones passed to `completion-in-region'. The functions on this hook
-are expected to perform completion on START..END using COLLECTION
-and PREDICATE, either by calling NEXT-FUN or by doing it themselves.")
+ "Wrapper hook around `completion-in-region'.")
+(make-obsolete-variable 'completion-in-region-functions
+ 'completion-in-region-function "24.4")
+
+(defvar completion-in-region-function #'completion--in-region
+ "Function to perform the job of `completion-in-region'.
+The function is called with 4 arguments: START END COLLECTION PREDICATE.
+The arguments and expected return value are like the ones of
+`completion-in-region'.")
(defvar completion-in-region--data nil)
@@ -1757,6 +1794,9 @@ Point needs to be somewhere between START and END.
PREDICATE (a function called with no arguments) says when to
exit."
(cl-assert (<= start (point)) (<= (point) end))
+ (funcall completion-in-region-function start end collection predicate))
+
+(defun completion--in-region (start end collection &optional predicate)
(with-wrapper-hook
;; FIXME: Maybe we should use this hook to provide a "display
;; completions" operation as well.
@@ -2015,10 +2055,7 @@ with `minibuffer-local-must-match-map'.")
(define-key map "i" 'info)
(define-key map "m" 'mail)
(define-key map "n" 'make-frame)
- (define-key map [mouse-1] (lambda () (interactive)
- (with-current-buffer "*Messages*"
- (goto-char (point-max))
- (display-buffer (current-buffer)))))
+ (define-key map [mouse-1] 'view-echo-area-messages)
;; So the global down-mouse-1 binding doesn't clutter the execution of the
;; above mouse-1 binding.
(define-key map [down-mouse-1] #'ignore)
@@ -2048,6 +2085,8 @@ This is only used when the minibuffer area has no active minibuffer.")
process-environment))
(defconst completion--embedded-envvar-re
+ ;; We can't reuse env--substitute-vars-regexp because we need to match only
+ ;; potentially-unfinished envvars at end of string.
(concat "\\(?:^\\|[^$]\\(?:\\$\\$\\)*\\)"
"$\\([[:alnum:]_]*\\|{\\([^}]*\\)\\)\\'"))
@@ -2966,12 +3005,21 @@ the same set of elements."
;; here any more.
(unless unique
(push elem res)
- (when (memq elem '(star point prefix))
- ;; Extract common suffix additionally to common prefix.
- ;; Only do it for `point', `star', and `prefix' since for
- ;; `any' it could lead to a merged completion that
- ;; doesn't itself match the candidates.
- (let ((suffix (completion--common-suffix comps)))
+ ;; Extract common suffix additionally to common prefix.
+ ;; Don't do it for `any' since it could lead to a merged
+ ;; completion that doesn't itself match the candidates.
+ (when (and (memq elem '(star point prefix))
+ ;; If prefix is one of the completions, there's no
+ ;; suffix left to find.
+ (not (assoc-string prefix comps t)))
+ (let ((suffix
+ (completion--common-suffix
+ (if (zerop (length prefix)) comps
+ ;; Ignore the chars in the common prefix, so we
+ ;; don't merge '("abc" "abbc") as "ab*bc".
+ (let ((skip (length prefix)))
+ (mapcar (lambda (str) (substring str skip))
+ comps))))))
(cl-assert (stringp suffix))
(unless (equal suffix "")
(push suffix res)))))
diff --git a/lisp/misearch.el b/lisp/misearch.el
index 2584f8df77b..0c4cd4ea323 100644
--- a/lisp/misearch.el
+++ b/lisp/misearch.el
@@ -73,7 +73,7 @@ end of the search space).
The first argument of this function is the current buffer where the
search is currently searching. It defines the base buffer relative to
which this function should find the next buffer. When the isearch
-direction is backward (when `isearch-forward' is nil), this function
+direction is backward (when option `isearch-forward' is nil), this function
should return the previous buffer to search.
If the second argument of this function WRAP is non-nil, then it
diff --git a/lisp/mouse.el b/lisp/mouse.el
index a1aa104495a..0367cad87b8 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -93,6 +93,53 @@ point at the click position."
:version "22.1"
:group 'mouse)
+(defun mouse--down-1-maybe-follows-link (&optional _prompt)
+ "Turn `mouse-1' events into `mouse-2' events if follows-link.
+Expects to be bound to `down-mouse-1' in `key-translation-map'."
+ (if (or (null mouse-1-click-follows-link)
+ (not (eq (if (eq mouse-1-click-follows-link 'double)
+ 'double-down-mouse-1 'down-mouse-1)
+ (car-safe last-input-event)))
+ (not (mouse-on-link-p (event-start last-input-event)))
+ (and (not mouse-1-click-in-non-selected-windows)
+ (not (eq (selected-window)
+ (posn-window (event-start last-input-event))))))
+ nil
+ (let ((this-event last-input-event)
+ (timedout
+ (sit-for (if (numberp mouse-1-click-follows-link)
+ (/ (abs mouse-1-click-follows-link) 1000.0)
+ 0))))
+ (if (if (and (numberp mouse-1-click-follows-link)
+ (>= mouse-1-click-follows-link 0))
+ timedout (not timedout))
+ nil
+
+ (let ((event (read-event)))
+ (if (eq (car-safe event) (if (eq mouse-1-click-follows-link 'double)
+ 'double-mouse-1 'mouse-1))
+ ;; Turn the mouse-1 into a mouse-2 to follow links.
+ (let ((newup (if (eq mouse-1-click-follows-link 'double)
+ 'double-mouse-2 'mouse-2))
+ (newdown (if (eq mouse-1-click-follows-link 'double)
+ 'double-down-mouse-2 'down-mouse-2)))
+ ;; If mouse-2 has never been done by the user, it doesn't have
+ ;; the necessary property to be interpreted correctly.
+ (put newup 'event-kind (get (car event) 'event-kind))
+ (put newdown 'event-kind (get (car this-event) 'event-kind))
+ (push (cons newup (cdr event)) unread-command-events)
+ ;; Modify the event in place, so read-key-sequence doesn't
+ ;; generate a second fake prefix key (see fake_prefixed_keys in
+ ;; src/keyboard.c).
+ (setcar this-event newdown)
+ (vector this-event))
+ (push event unread-command-events)
+ nil))))))
+
+(define-key key-translation-map [down-mouse-1]
+ #'mouse--down-1-maybe-follows-link)
+(define-key key-translation-map [double-down-mouse-1]
+ #'mouse--down-1-maybe-follows-link)
;; Provide a mode-specific menu on a mouse button.
@@ -418,8 +465,6 @@ must be one of the symbols `header', `mode', or `vertical'."
(window (posn-window start))
(frame (window-frame window))
(minibuffer-window (minibuffer-window frame))
- (on-link (and mouse-1-click-follows-link
- (mouse-on-link-p start)))
(side (and (eq line 'vertical)
(or (cdr (assq 'vertical-scroll-bars
(frame-parameters frame)))
@@ -507,12 +552,6 @@ must be one of the symbols `header', `mode', or `vertical'."
(- growth)))))))
;; Process the terminating event.
(unless dragged
- (when (and (mouse-event-p event) on-link
- (mouse--remap-link-click-p start-event event))
- ;; If mouse-2 has never been done by the user, it doesn't have
- ;; the necessary property to be interpreted correctly.
- (put 'mouse-2 'event-kind 'mouse-click)
- (setcar event 'mouse-2))
(push event unread-command-events))))
(defun mouse-drag-mode-line (start-event)
@@ -724,6 +763,9 @@ at the same position."
mouse-1-click-in-non-selected-windows
(eq (selected-window) (posn-window pos)))
(or (mouse-posn-property pos 'follow-link)
+ (let ((area (posn-area pos)))
+ (when area
+ (key-binding (vector area 'follow-link) nil t pos)))
(key-binding [follow-link] nil t pos)))))
(cond
((eq action 'mouse-face)
@@ -770,7 +812,6 @@ DO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by
(setq mouse-selection-click-count-buffer (current-buffer))
(deactivate-mark)
(let* ((scroll-margin 0) ; Avoid margin scrolling (Bug#9541).
- (original-window (selected-window))
;; We've recorded what we needed from the current buffer and
;; window, now let's jump to the place of the event, where things
;; are happening.
@@ -788,15 +829,7 @@ DO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by
(nth 3 bounds)
;; Don't count the mode line.
(1- (nth 3 bounds))))
- (on-link (and mouse-1-click-follows-link
- ;; Use start-point before the intangibility
- ;; treatment, in case we click on a link inside
- ;; intangible text.
- (mouse-on-link-p start-posn)))
(click-count (1- (event-click-count start-event)))
- (remap-double-click (and on-link
- (eq mouse-1-click-follows-link 'double)
- (= click-count 1)))
;; Suppress automatic hscrolling, because that is a nuisance
;; when setting point near the right fringe (but see below).
(auto-hscroll-mode-saved auto-hscroll-mode)
@@ -809,8 +842,6 @@ DO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by
(if (< (point) start-point)
(goto-char start-point))
(setq start-point (point))
- (if remap-double-click
- (setq click-count 0))
;; Activate the region, using `mouse-start-end' to determine where
;; to put point and mark (e.g., double-click will select a word).
@@ -865,6 +896,8 @@ DO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by
;; Find its binding.
(let* ((fun (key-binding (vector (car event))))
+ ;; FIXME This doesn't make sense, because
+ ;; event-click-count always returns something >= 1.
(do-multi-click (and (> (event-click-count event) 0)
(functionp fun)
(not (memq fun '(mouse-set-point
@@ -898,21 +931,6 @@ DO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by
(or end-point
(= (window-start start-window)
start-window-start)))
- (when (and on-link
- (= start-point (point))
- (mouse--remap-link-click-p start-event event))
- ;; If we rebind to mouse-2, reselect previous selected
- ;; window, so that the mouse-2 event runs in the same
- ;; situation as if user had clicked it directly. Fixes
- ;; the bug reported by juri@jurta.org on 2005-12-27.
- (if (or (vectorp on-link) (stringp on-link))
- (setq event (aref on-link 0))
- (select-window original-window)
- (setcar event 'mouse-2)
- ;; If this mouse click has never been done by the
- ;; user, it doesn't have the necessary property to be
- ;; interpreted correctly.
- (put 'mouse-2 'event-kind 'mouse-click)))
(push event unread-command-events)))))))
(defun mouse--drag-set-mark-and-point (start click click-count)
@@ -930,22 +948,6 @@ DO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by
(set-mark beg)
(goto-char end)))))
-(defun mouse--remap-link-click-p (start-event end-event)
- (or (and (eq mouse-1-click-follows-link 'double)
- (= (event-click-count start-event) 2))
- (and
- (not (eq mouse-1-click-follows-link 'double))
- (= (event-click-count start-event) 1)
- (= (event-click-count end-event) 1)
- (or (not (integerp mouse-1-click-follows-link))
- (let ((t0 (posn-timestamp (event-start start-event)))
- (t1 (posn-timestamp (event-end end-event))))
- (and (integerp t0) (integerp t1)
- (if (> mouse-1-click-follows-link 0)
- (<= (- t1 t0) mouse-1-click-follows-link)
- (< (- t0 t1) mouse-1-click-follows-link))))))))
-
-
;; Commands to handle xterm-style multiple clicks.
(defun mouse-skip-word (dir)
"Skip over word, over whitespace, or over identical punctuation.
diff --git a/lisp/mpc.el b/lisp/mpc.el
index a2e13dcfd58..ad7381bb4b7 100644
--- a/lisp/mpc.el
+++ b/lisp/mpc.el
@@ -192,7 +192,7 @@ numerically rather than lexicographically."
;; to the fact that MPD tends to disconnect fairly often, although our
;; constant polling often prevents disconnection.
(defvar mpc--find-memoize (make-hash-table :test 'equal)) ;; :weakness t
-(defvar mpc-tag nil) (make-variable-buffer-local 'mpc-tag)
+(defvar-local mpc-tag nil)
;;; Support for the actual connection and MPD command execution ;;;;;;;;;;;;
@@ -279,7 +279,9 @@ defaults to 6600 and HOST defaults to localhost."
(erase-buffer)
(let* ((coding-system-for-read 'utf-8-unix)
(coding-system-for-write 'utf-8-unix)
- (proc (open-network-stream "MPC" (current-buffer) host port)))
+ (proc (condition-case err
+ (open-network-stream "MPC" (current-buffer) host port)
+ (error (user-error (error-message-string err))))))
(when (processp mpc-proc)
;; Inherit the properties of the previous connection.
(let ((plist (process-plist mpc-proc)))
@@ -318,10 +320,11 @@ defaults to 6600 and HOST defaults to localhost."
(if tmp (push (nreverse tmp) alists))
(nreverse alists)))
-(defun mpc-proc ()
+(defun mpc-proc (&optional restart)
(unless (and mpc-proc
(buffer-live-p (process-buffer mpc-proc))
- (not (memq (process-status mpc-proc) '(closed))))
+ (not (and restart
+ (memq (process-status mpc-proc) '(closed)))))
(mpc--proc-connect mpc-host))
mpc-proc)
@@ -354,7 +357,7 @@ otherwise return immediately and call CALLBACK with no argument
when the command terminates.
CMD can be a string which is passed as-is to MPD or a list of strings
which will be concatenated with proper quoting before passing them to MPD."
- (let ((proc (mpc-proc)))
+ (let ((proc (mpc-proc 'restart)))
(if (and callback (not (process-get proc 'ready)))
(let ((old (process-get proc 'callback)))
(process-put proc 'callback
@@ -489,10 +492,10 @@ to call FUN for any change whatsoever.")
(cancel-timer mpc--status-timer)
(setq mpc--status-timer nil)))
(defun mpc--status-timer-run ()
- (when (process-get (mpc-proc) 'ready)
(condition-case err
- (with-local-quit (mpc-status-refresh))
- (error (message "MPC: %s" err)))))
+ (when (process-get (mpc-proc) 'ready)
+ (with-local-quit (mpc-status-refresh)))
+ (error (message "MPC: %s" err))))
(defvar mpc--status-idle-timer nil)
(defun mpc--status-idle-timer-start ()
@@ -1034,11 +1037,8 @@ If PLAYLIST is t or nil or missing, use the main playlist."
(let ((display
(if (and size
(> (+ postwidth textwidth) size))
- ;; This doesn't even obey double-width chars :-(
(propertize
- (if (zerop (- size postwidth 1))
- (substring text 0 1)
- (concat (substring text 0 (- size postwidth textwidth 1)) "…"))
+ (truncate-string-to-width text size nil nil "…")
'help-echo text)
text)))
(when (memq tag '(Artist Album Composer)) ;FIXME: wrong list.
@@ -1082,7 +1082,11 @@ If PLAYLIST is t or nil or missing, use the main playlist."
(define-key map [C-mouse-2] 'mpc-select-toggle)
(define-key map [drag-mouse-2] 'mpc-drag-n-drop)
;; We use `always' because a binding to t is like a binding to nil.
- (define-key map [follow-link] 'always)
+ (define-key map [follow-link] :always)
+ ;; But follow-link doesn't apply blindly to header-line and
+ ;; mode-line clicks.
+ (define-key map [header-line follow-link] 'ignore)
+ (define-key map [mode-line follow-link] 'ignore)
;; Doesn't work because the first click changes the buffer, so the second
;; is applied elsewhere :-(
;; (define-key map [(double mouse-2)] 'mpc-play-at-point)
@@ -1139,17 +1143,18 @@ If PLAYLIST is t or nil or missing, use the main playlist."
"Major mode for the features common to all buffers of MPC."
(buffer-disable-undo)
(setq buffer-read-only t)
- (set (make-local-variable 'tool-bar-map) mpc-tool-bar-map)
- (set (make-local-variable 'truncate-lines) t))
+ (setq-local tool-bar-map mpc-tool-bar-map)
+ (setq-local truncate-lines t))
;;; The mpc-status-mode buffer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-derived-mode mpc-status-mode mpc-mode "MPC-Status"
"Major mode to display MPC status info."
- (set (make-local-variable 'mode-line-format)
- '("%e" mode-line-frame-identification mode-line-buffer-identification))
- (set (make-local-variable 'window-area-factor) 3)
- (set (make-local-variable 'header-line-format) '("MPC " mpc-volume)))
+ (setq-local mode-line-format
+ '("%e" mode-line-frame-identification
+ mode-line-buffer-identification))
+ (setq-local window-area-factor 3)
+ (setq-local header-line-format '("MPC " mpc-volume)))
(defvar mpc-status-buffer-format
'("%-5{Time} / %{Duration} %2{Disc--}%4{Track}" "%{Title}" "%{Album}" "%{Artist}" "%128{Cover}"))
@@ -1173,14 +1178,15 @@ If PLAYLIST is t or nil or missing, use the main playlist."
(defun mpc-status-buffer-show ()
(interactive)
- (let* ((buf (mpc-proc-buffer (mpc-proc) 'status))
- (songs-buf (mpc-proc-buffer (mpc-proc) 'songs))
+ (let* ((proc (mpc-proc))
+ (buf (mpc-proc-buffer proc 'status))
+ (songs-buf (mpc-proc-buffer proc 'songs))
(songs-win (if songs-buf (get-buffer-window songs-buf 0))))
(unless (buffer-live-p buf)
(setq buf (get-buffer-create "*MPC-Status*"))
(with-current-buffer buf
(mpc-status-mode))
- (mpc-proc-buffer (mpc-proc) 'status buf))
+ (mpc-proc-buffer proc 'status buf))
(if (null songs-win) (pop-to-buffer buf)
(let ((_win (split-window songs-win 20 t)))
(set-window-dedicated-p songs-win nil)
@@ -1191,8 +1197,7 @@ If PLAYLIST is t or nil or missing, use the main playlist."
(defvar mpc-separator-ol nil)
-(defvar mpc-select nil)
-(make-variable-buffer-local 'mpc-select)
+(defvar-local mpc-select nil)
(defmacro mpc-select-save (&rest body)
"Execute BODY and restore the selection afterwards."
@@ -1423,20 +1428,18 @@ when constructing the set of constraints."
;;; The TagBrowser mode ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defconst mpc-tagbrowser-all-name (propertize "*ALL*" 'face 'italic))
-(defvar mpc-tagbrowser-all-ol nil)
-(make-variable-buffer-local 'mpc-tagbrowser-all-ol)
-(defvar mpc-tag-name nil) (make-variable-buffer-local 'mpc-tag-name)
+(defvar-local mpc-tagbrowser-all-ol nil)
+(defvar-local mpc-tag-name nil)
(defun mpc-tagbrowser-all-p ()
(and (eq (point-min) (line-beginning-position))
(equal mpc-tagbrowser-all-name
(buffer-substring (point-min) (line-end-position)))))
(define-derived-mode mpc-tagbrowser-mode mpc-mode '("MPC-" mpc-tag-name)
- (set (make-local-variable 'mode-line-process) '("" mpc-tag-name))
- (set (make-local-variable 'mode-line-format) nil)
- (set (make-local-variable 'header-line-format) '("" mpc-tag-name ;; "s"
- ))
- (set (make-local-variable 'buffer-undo-list) t)
+ (setq-local mode-line-process '("" mpc-tag-name))
+ (setq-local mode-line-format nil)
+ (setq-local header-line-format '("" mpc-tag-name)) ;; "s"
+ (setq-local buffer-undo-list t)
)
(defun mpc-tagbrowser-refresh ()
@@ -1542,14 +1545,14 @@ when constructing the set of constraints."
(let ((ol (make-overlay (point) (line-beginning-position 2))))
(overlay-put ol 'face 'region)
(overlay-put ol 'evaporate t)
- (set (make-local-variable 'mpc-tagbrowser-all-ol) ol))))))
+ (setq-local mpc-tagbrowser-all-ol ol))))))
;; (defvar mpc-constraints nil)
(defun mpc-separator (active)
;; Place a separator mark.
(unless mpc-separator-ol
- (set (make-local-variable 'mpc-separator-ol)
- (make-overlay (point) (point)))
+ (setq-local mpc-separator-ol
+ (make-overlay (point) (point)))
(overlay-put mpc-separator-ol 'after-string
(propertize "\n"
'face '(:height 0.05 :inverse-video t))))
@@ -1608,7 +1611,7 @@ Return non-nil if a selection was deactivated."
(let ((constraints (mpc-constraints-get-current (current-buffer)))
(active 'all))
;; (unless (equal constraints mpc-constraints)
- ;; (set (make-local-variable 'mpc-constraints) constraints)
+ ;; (setq-local mpc-constraints constraints)
(dolist (cst constraints)
(let ((vals (apply 'mpc-union
(mapcar (lambda (val)
@@ -1675,7 +1678,7 @@ Return non-nil if a selection was deactivated."
;; '(mpc-tagbrowser-dir-hide-prefix))
(define-derived-mode mpc-tagbrowser-dir-mode mpc-tagbrowser-mode '("MPC-" mpc-tag-name)
- ;; (set (make-local-variable 'font-lock-defaults)
+ ;; (setq-local font-lock-defaults
;; '(mpc-tagbrowser-dir-keywords t))
)
@@ -1691,13 +1694,14 @@ Return non-nil if a selection was deactivated."
(mpc-event-set-point event)
(let ((name (buffer-substring (line-beginning-position)
(line-end-position)))
- (prop (intern mpc-tag)))
- (if (not (member name (process-get (mpc-proc) prop)))
- (process-put (mpc-proc) prop
- (cons name (process-get (mpc-proc) prop)))
- (let ((new (delete name (process-get (mpc-proc) prop))))
+ (prop (intern mpc-tag))
+ (proc (mpc-proc)))
+ (if (not (member name (process-get proc prop)))
+ (process-put proc prop
+ (cons name (process-get proc prop)))
+ (let ((new (delete name (process-get proc prop))))
(setq name (concat name "/"))
- (process-put (mpc-proc) prop
+ (process-put proc prop
(delq nil
(mapcar (lambda (x)
(if (string-prefix-p name x)
@@ -1708,10 +1712,9 @@ Return non-nil if a selection was deactivated."
;;; Playlist management ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defvar mpc-songs-playlist nil
+(defvar-local mpc-songs-playlist nil
"Name of the currently selected playlist, if any.
A value of t means the main playlist.")
-(make-variable-buffer-local 'mpc-songs-playlist)
(defun mpc-playlist-create (name)
"Save current playlist under name NAME."
@@ -1778,12 +1781,14 @@ A value of t means the main playlist.")
(defvar mpc-volume-map
(let ((map (make-sparse-keymap)))
- (define-key map [down-mouse-1] 'mpc-volume-mouse-set)
- (define-key map [mouse-1] 'ignore)
- (define-key map [header-line down-mouse-1] 'mpc-volume-mouse-set)
- (define-key map [header-line mouse-1] 'ignore)
- (define-key map [mode-line down-mouse-1] 'mpc-volume-mouse-set)
- (define-key map [mode-line mouse-1] 'ignore)
+ ;; Bind the up-events rather than the down-event, so the
+ ;; `message' isn't canceled by the subsequent up-event binding.
+ (define-key map [down-mouse-1] 'ignore)
+ (define-key map [mouse-1] 'mpc-volume-mouse-set)
+ (define-key map [header-line mouse-1] 'mpc-volume-mouse-set)
+ (define-key map [header-line down-mouse-1] 'ignore)
+ (define-key map [mode-line mouse-1] 'mpc-volume-mouse-set)
+ (define-key map [mode-line down-mouse-1] 'ignore)
map))
(defvar mpc-volume nil) (put 'mpc-volume 'risky-local-variable t)
@@ -1948,9 +1953,9 @@ This is used so that they can be compared with `eq', which is needed for
(search-backward (cdr curline) nil t))
(beginning-of-line)
(goto-char (point-min)))
- (set (make-local-variable 'mpc-songs-totaltime)
- (unless (zerop totaltime)
- (list " " (mpc-secs-to-time totaltime))))
+ (setq-local mpc-songs-totaltime
+ (unless (zerop totaltime)
+ (list " " (mpc-secs-to-time totaltime))))
))))
(let ((mpc-songpointer-set-visible t))
(mpc-songpointer-refresh)))
@@ -2059,46 +2064,47 @@ This is used so that they can be compared with `eq', which is needed for
(define-derived-mode mpc-songs-mode mpc-mode "MPC-song"
(setq mpc-songs-format-description
(with-temp-buffer (mpc-format mpc-songs-format 'self) (buffer-string)))
- (set (make-local-variable 'header-line-format)
- ;; '("MPC " mpc-volume " " mpc-current-song)
- (list (propertize " " 'display '(space :align-to 0))
- ;; 'mpc-songs-format-description
- '(:eval
- (let ((hscroll (window-hscroll)))
- (with-temp-buffer
- (mpc-format mpc-songs-format 'self hscroll)
- ;; That would be simpler than the hscroll handling in
- ;; mpc-format, but currently move-to-column does not
- ;; recognize :space display properties.
- ;; (move-to-column hscroll)
- ;; (delete-region (point-min) (point))
- (buffer-string))))))
- (set (make-local-variable 'mode-line-format)
- '("%e" mode-line-frame-identification mode-line-buffer-identification
- #(" " 0 3
- (help-echo "mouse-1: Select (drag to resize)\nmouse-2: Make current window occupy the whole frame\nmouse-3: Remove current window from display"))
- mode-line-position
- #(" " 0 2
- (help-echo "mouse-1: Select (drag to resize)\nmouse-2: Make current window occupy the whole frame\nmouse-3: Remove current window from display"))
- mpc-songs-totaltime
- mpc-current-updating
- #(" " 0 2
- (help-echo "mouse-1: Select (drag to resize)\nmouse-2: Make current window occupy the whole frame\nmouse-3: Remove current window from display"))
- (mpc--song-search
- (:propertize
- ("Search=\"" mpc--song-search "\"")
- help-echo "mouse-2: kill this search"
- follow-link t
- mouse-face mode-line-highlight
- keymap (keymap (mode-line keymap
- (mouse-2 . mpc-songs-kill-search))))
- (:propertize "NoSearch"
- help-echo "mouse-2: set a search restriction"
- follow-link t
- mouse-face mode-line-highlight
- keymap (keymap (mode-line keymap (mouse-2 . mpc-songs-search)))))))
-
- ;; (set (make-local-variable 'mode-line-process)
+ (setq-local header-line-format
+ ;; '("MPC " mpc-volume " " mpc-current-song)
+ (list (propertize " " 'display '(space :align-to 0))
+ ;; 'mpc-songs-format-description
+ '(:eval
+ (let ((hscroll (window-hscroll)))
+ (with-temp-buffer
+ (mpc-format mpc-songs-format 'self hscroll)
+ ;; That would be simpler than the hscroll handling in
+ ;; mpc-format, but currently move-to-column does not
+ ;; recognize :space display properties.
+ ;; (move-to-column hscroll)
+ ;; (delete-region (point-min) (point))
+ (buffer-string))))))
+ (setq-local
+ mode-line-format
+ '("%e" mode-line-frame-identification mode-line-buffer-identification
+ #(" " 0 3
+ (help-echo "mouse-1: Select (drag to resize)\nmouse-2: Make current window occupy the whole frame\nmouse-3: Remove current window from display"))
+ mode-line-position
+ #(" " 0 2
+ (help-echo "mouse-1: Select (drag to resize)\nmouse-2: Make current window occupy the whole frame\nmouse-3: Remove current window from display"))
+ mpc-songs-totaltime
+ mpc-current-updating
+ #(" " 0 2
+ (help-echo "mouse-1: Select (drag to resize)\nmouse-2: Make current window occupy the whole frame\nmouse-3: Remove current window from display"))
+ (mpc--song-search
+ (:propertize
+ ("Search=\"" mpc--song-search "\"")
+ help-echo "mouse-2: kill this search"
+ follow-link t
+ mouse-face mode-line-highlight
+ keymap (keymap (mode-line keymap
+ (mouse-2 . mpc-songs-kill-search))))
+ (:propertize "NoSearch"
+ help-echo "mouse-2: set a search restriction"
+ follow-link t
+ mouse-face mode-line-highlight
+ keymap (keymap (mode-line keymap (mouse-2 . mpc-songs-search)))))))
+
+ ;; (setq-local mode-line-process
;; '("" ;; mpc-volume " "
;; mpc-songs-totaltime
;; mpc-current-updating))
@@ -2114,7 +2120,7 @@ This is used so that they can be compared with `eq', which is needed for
(<= (window-start win) overlay-arrow-position)
(< overlay-arrow-position (window-end win)))))))
(unless (local-variable-p 'overlay-arrow-position)
- (set (make-local-variable 'overlay-arrow-position) (make-marker)))
+ (setq-local overlay-arrow-position (make-marker)))
(move-marker overlay-arrow-position pos)
;; If the arrow was visible, try to keep it that way.
(if (and visible pos
@@ -2616,8 +2622,8 @@ This is used so that they can be compared with `eq', which is needed for
(window-minibuffer-p))
(ignore-errors (select-frame (make-frame mpc-frame-alist)))
(with-current-buffer song-buf
- (set (make-local-variable 'mpc-previous-window-config)
- (current-window-configuration))))
+ (setq-local mpc-previous-window-config
+ (current-window-configuration))))
(let* ((win1 (selected-window))
(win2 (split-window))
(tags mpc-browser-tags))
diff --git a/lisp/net/ange-ftp.el b/lisp/net/ange-ftp.el
index 1d910386403..f6efc56023a 100644
--- a/lisp/net/ange-ftp.el
+++ b/lisp/net/ange-ftp.el
@@ -720,6 +720,7 @@ parenthesized expressions in REGEXP for the components (in that order)."
"^Data connection \\|"
"^local:\\|^Trying\\|^125 \\|^550-\\|^221 .*oodbye\\|"
"^500 .*AUTH\\|^KERBEROS\\|"
+ "^500 This security scheme is not implemented\\|"
"^504 Unknown security mechanism\\|"
"^530 Please login with USER and PASS\\|" ; non kerberized vsFTPd
"^534 Kerberos Authentication not enabled\\|"
@@ -3296,7 +3297,6 @@ system TYPE.")
(name (ange-ftp-quote-string (nth 2 parsed)))
(temp (ange-ftp-make-tmp-name host))
(binary (ange-ftp-binary-file filename))
- (buffer-file-type buffer-file-type)
(abbr (ange-ftp-abbreviate-filename filename))
(coding-system-used last-coding-system-used)
size)
@@ -3321,10 +3321,7 @@ system TYPE.")
size
(nth 1 (ange-ftp-real-insert-file-contents
temp visit beg end replace))
- coding-system-used last-coding-system-used
- ;; override autodetection of buffer file type
- ;; to ensure buffer is saved in DOS format
- buffer-file-type binary)
+ coding-system-used last-coding-system-used)
(signal 'ftp-error
(list
"Opening input file:"
@@ -4440,16 +4437,18 @@ NEWNAME should be the name to give the new compressed or uncompressed file.")
;;; Define ways of getting at unmodified Emacs primitives,
;;; turning off our handler.
-;(defun ange-ftp-run-real-handler (operation args)
-; (let ((inhibit-file-name-handlers
-; (cons 'ange-ftp-hook-function
-; (cons 'ange-ftp-completion-hook-function
-; (and (eq inhibit-file-name-operation operation)
-; inhibit-file-name-handlers))))
-; (inhibit-file-name-operation operation))
-; (apply operation args)))
+(defun ange-ftp-run-real-handler-orig (operation args)
+ (let ((inhibit-file-name-handlers
+ (cons 'ange-ftp-hook-function
+ (cons 'ange-ftp-completion-hook-function
+ (and (eq inhibit-file-name-operation operation)
+ inhibit-file-name-handlers))))
+ (inhibit-file-name-operation operation))
+ (apply operation args)))
-(defalias 'ange-ftp-run-real-handler 'tramp-run-real-handler)
+(defalias 'ange-ftp-run-real-handler
+ (if (fboundp 'tramp-run-real-handler)
+ 'tramp-run-real-handler 'ange-ftp-run-real-handler-orig))
(defun ange-ftp-real-file-name-directory (&rest args)
(ange-ftp-run-real-handler 'file-name-directory args))
@@ -5137,7 +5136,7 @@ Other orders of $ and _ seem to all work just fine.")
(forward-line 1))
;; Would like to look for a "Total" line, or a "Directory" line to
;; make sure that the listing isn't complete garbage before putting
- ;; in "." and "..", but we can't even count on all VAX's giving us
+ ;; in "." and "..", but we can't count on VMS giving us
;; either of these.
(puthash "." t tbl)
(puthash ".." t tbl))
diff --git a/lisp/net/eudc-bob.el b/lisp/net/eudc-bob.el
index 45f15b14a54..106aab2ac0a 100644
--- a/lisp/net/eudc-bob.el
+++ b/lisp/net/eudc-bob.el
@@ -1,9 +1,9 @@
-;;; eudc-bob.el --- Binary Objects Support for EUDC
+;;; eudc-bob.el --- Binary Objects Support for EUDC -*- coding: utf-8 -*-
;; Copyright (C) 1999-2013 Free Software Foundation, Inc.
;; Author: Oscar Figueiredo <oscar@cpe.fr>
-;; Maintainer: Pavel Janík <Pavel@Janik.cz>
+;; Maintainer: Pavel Janík <Pavel@Janik.cz>
;; Keywords: comm
;; Package: eudc
diff --git a/lisp/net/eudc-export.el b/lisp/net/eudc-export.el
index 690a5f15c40..b43a8c631e3 100644
--- a/lisp/net/eudc-export.el
+++ b/lisp/net/eudc-export.el
@@ -1,9 +1,9 @@
-;;; eudc-export.el --- functions to export EUDC query results
+;;; eudc-export.el --- functions to export EUDC query results -*- coding: utf-8 -*-
;; Copyright (C) 1998-2013 Free Software Foundation, Inc.
;; Author: Oscar Figueiredo <oscar@cpe.fr>
-;; Maintainer: Pavel Janík <Pavel@Janik.cz>
+;; Maintainer: Pavel Janík <Pavel@Janik.cz>
;; Keywords: comm
;; Package: eudc
diff --git a/lisp/net/eudc-hotlist.el b/lisp/net/eudc-hotlist.el
index 0322fa766f3..a8a51b7d61b 100644
--- a/lisp/net/eudc-hotlist.el
+++ b/lisp/net/eudc-hotlist.el
@@ -1,9 +1,9 @@
-;;; eudc-hotlist.el --- hotlist management for EUDC
+;;; eudc-hotlist.el --- hotlist management for EUDC -*- coding: utf-8 -*-
;; Copyright (C) 1998-2013 Free Software Foundation, Inc.
;; Author: Oscar Figueiredo <oscar@cpe.fr>
-;; Maintainer: Pavel Janík <Pavel@Janik.cz>
+;; Maintainer: Pavel Janík <Pavel@Janik.cz>
;; Keywords: comm
;; Package: eudc
diff --git a/lisp/net/eudc-vars.el b/lisp/net/eudc-vars.el
index c2cc0154151..d53fd83eee7 100644
--- a/lisp/net/eudc-vars.el
+++ b/lisp/net/eudc-vars.el
@@ -1,9 +1,9 @@
-;;; eudc-vars.el --- Emacs Unified Directory Client
+;;; eudc-vars.el --- Emacs Unified Directory Client -*- coding: utf-8 -*-
;; Copyright (C) 1998-2013 Free Software Foundation, Inc.
;; Author: Oscar Figueiredo <oscar@cpe.fr>
-;; Maintainer: Pavel Janík <Pavel@Janik.cz>
+;; Maintainer: Pavel Janík <Pavel@Janik.cz>
;; Keywords: comm
;; Package: eudc
diff --git a/lisp/net/eudc.el b/lisp/net/eudc.el
index 621b9b90879..ef09267f854 100644
--- a/lisp/net/eudc.el
+++ b/lisp/net/eudc.el
@@ -1,9 +1,9 @@
-;;; eudc.el --- Emacs Unified Directory Client
+;;; eudc.el --- Emacs Unified Directory Client -*- coding: utf-8 -*-
;; Copyright (C) 1998-2013 Free Software Foundation, Inc.
;; Author: Oscar Figueiredo <oscar@cpe.fr>
-;; Maintainer: Pavel Janík <Pavel@Janik.cz>
+;; Maintainer: Pavel Janík <Pavel@Janik.cz>
;; Keywords: comm
;; This file is part of GNU Emacs.
diff --git a/lisp/net/eudcb-bbdb.el b/lisp/net/eudcb-bbdb.el
index 58d94622486..9f6dba703b1 100644
--- a/lisp/net/eudcb-bbdb.el
+++ b/lisp/net/eudcb-bbdb.el
@@ -1,9 +1,9 @@
-;;; eudcb-bbdb.el --- Emacs Unified Directory Client - BBDB Backend
+;;; eudcb-bbdb.el --- Emacs Unified Directory Client - BBDB Backend -*- coding: utf-8 -*-
;; Copyright (C) 1998-2013 Free Software Foundation, Inc.
;; Author: Oscar Figueiredo <oscar@cpe.fr>
-;; Maintainer: Pavel Janík <Pavel@Janik.cz>
+;; Maintainer: Pavel Janík <Pavel@Janik.cz>
;; Keywords: comm
;; Package: eudc
diff --git a/lisp/net/eudcb-ldap.el b/lisp/net/eudcb-ldap.el
index 23eed4b3c0a..d0ba47ad753 100644
--- a/lisp/net/eudcb-ldap.el
+++ b/lisp/net/eudcb-ldap.el
@@ -1,9 +1,9 @@
-;;; eudcb-ldap.el --- Emacs Unified Directory Client - LDAP Backend
+;;; eudcb-ldap.el --- Emacs Unified Directory Client - LDAP Backend -*- coding: utf-8 -*-
;; Copyright (C) 1998-2013 Free Software Foundation, Inc.
;; Author: Oscar Figueiredo <oscar@cpe.fr>
-;; Maintainer: Pavel Janík <Pavel@Janik.cz>
+;; Maintainer: Pavel Janík <Pavel@Janik.cz>
;; Keywords: comm
;; Package: eudc
diff --git a/lisp/net/eudcb-ph.el b/lisp/net/eudcb-ph.el
index 3033e945c24..1796f2d9806 100644
--- a/lisp/net/eudcb-ph.el
+++ b/lisp/net/eudcb-ph.el
@@ -1,9 +1,9 @@
-;;; eudcb-ph.el --- Emacs Unified Directory Client - CCSO PH/QI Backend
+;;; eudcb-ph.el --- Emacs Unified Directory Client - CCSO PH/QI Backend -*- coding: utf-8 -*-
;; Copyright (C) 1998-2013 Free Software Foundation, Inc.
;; Author: Oscar Figueiredo <oscar@cpe.fr>
-;; Maintainer: Pavel Janík <Pavel@Janik.cz>
+;; Maintainer: Pavel Janík <Pavel@Janik.cz>
;; Keywords: comm
;; Package: eudc
diff --git a/lisp/net/net-utils.el b/lisp/net/net-utils.el
index 28fd5c67ff8..9a6c7b124c7 100644
--- a/lisp/net/net-utils.el
+++ b/lisp/net/net-utils.el
@@ -54,11 +54,6 @@
:group 'comm
:version "20.3")
-(defcustom net-utils-remove-ctl-m (memq system-type '(windows-nt msdos))
- "If non-nil, remove control-Ms from output."
- :group 'net-utils
- :type 'boolean)
-
(defcustom traceroute-program
(if (eq system-type 'windows-nt)
"tracert"
@@ -285,7 +280,8 @@ This variable is only used if the variable
(define-derived-mode net-utils-mode special-mode "NetworkUtil"
"Major mode for interacting with an external network utility."
(set (make-local-variable 'font-lock-defaults)
- '((net-utils-font-lock-keywords))))
+ '((net-utils-font-lock-keywords)))
+ (setq-local revert-buffer-function #'net-utils--revert-function))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Utility functions
@@ -318,25 +314,17 @@ This variable is only used if the variable
(defun net-utils-remove-ctrl-m-filter (process output-string)
"Remove trailing control Ms."
- (let ((old-buffer (current-buffer))
- (filtered-string output-string))
- (unwind-protect
- (let ((moving))
- (set-buffer (process-buffer process))
- (let ((inhibit-read-only t))
- (setq moving (= (point) (process-mark process)))
-
- (while (string-match "\r" filtered-string)
- (setq filtered-string
- (replace-match "" nil nil filtered-string)))
-
- (save-excursion
- ;; Insert the text, moving the process-marker.
- (goto-char (process-mark process))
- (insert filtered-string)
- (set-marker (process-mark process) (point))))
- (if moving (goto-char (process-mark process))))
- (set-buffer old-buffer))))
+ (with-current-buffer (process-buffer process)
+ (save-excursion
+ (let ((inhibit-read-only t)
+ (filtered-string output-string))
+ (while (string-match "\r" filtered-string)
+ (setq filtered-string
+ (replace-match "" nil nil filtered-string)))
+ ;; Insert the text, moving the process-marker.
+ (goto-char (process-mark process))
+ (insert filtered-string)
+ (set-marker (process-mark process) (point))))))
(defun net-utils-run-program (name header program args)
"Run a network information program."
@@ -354,20 +342,38 @@ This variable is only used if the variable
;; General network utilities (diagnostic)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun net-utils-run-simple (buffer-name program-name args)
+;; Todo: This data could be saved in a bookmark.
+(defvar net-utils--revert-cmd nil)
+
+(defun net-utils-run-simple (buffer program-name args &optional nodisplay)
"Run a network utility for diagnostic output only."
- (interactive)
- (when (get-buffer buffer-name)
- (kill-buffer buffer-name))
- (get-buffer-create buffer-name)
- (with-current-buffer buffer-name
+ (with-current-buffer (if (stringp buffer) (get-buffer-create buffer) buffer)
+ (let ((proc (get-buffer-process (current-buffer))))
+ (when proc
+ (set-process-filter proc nil)
+ (delete-process proc)))
+ (let ((inhibit-read-only t))
+ (erase-buffer))
(net-utils-mode)
+ (setq-local net-utils--revert-cmd
+ `(net-utils-run-simple ,(current-buffer)
+ ,program-name ,args nodisplay))
(set-process-filter
- (apply 'start-process (format "%s" program-name)
- buffer-name program-name args)
- 'net-utils-remove-ctrl-m-filter)
- (goto-char (point-min)))
- (display-buffer buffer-name))
+ (apply 'start-process program-name
+ (current-buffer) program-name args)
+ 'net-utils-remove-ctrl-m-filter)
+ (unless nodisplay (display-buffer (current-buffer)))))
+
+(defun net-utils--revert-function (&optional ignore-auto noconfirm)
+ (message "Reverting `%s'..." (buffer-name))
+ (apply (car net-utils--revert-cmd) (cdr net-utils--revert-cmd))
+ (let ((proc (get-buffer-process (current-buffer))))
+ (when proc
+ (set-process-sentinel
+ proc
+ (lambda (process event)
+ (when (string= event "finished\n")
+ (message "Reverting `%s' done" (process-buffer process))))))))
;;;###autoload
(defun ifconfig ()
@@ -428,9 +434,8 @@ This variable is only used if the variable
(if traceroute-program-options
(append traceroute-program-options (list target))
(list target))))
- (net-utils-run-program
+ (net-utils-run-simple
(concat "Traceroute" " " target)
- (concat "** Traceroute ** " traceroute-program " ** " target)
traceroute-program
options)))
diff --git a/lisp/net/newst-plainview.el b/lisp/net/newst-plainview.el
index 2eb04787bea..c7a3a107078 100644
--- a/lisp/net/newst-plainview.el
+++ b/lisp/net/newst-plainview.el
@@ -5,7 +5,7 @@
;; Author: Ulf Jasper <ulf.jasper@web.de>
;; Filename: newst-plainview.el
;; URL: http://www.nongnu.org/newsticker
-;; Time-stamp: "13. Mai 2011, 19:28:34 (ulf)"
+;; Time-stamp: "Mon 11-Feb-2013 20:27:11 gm on skiddaw"
;; Package: newsticker
;; ======================================================================
@@ -405,6 +405,7 @@ images."
(define-key map "sx" 'newsticker-show-extra)
(define-key map "hx" 'newsticker-hide-extra)
+ (define-key map [?\S-\ ] 'scroll-down-command)
(define-key map " " 'scroll-up-command)
(define-key map "q" 'newsticker-close-buffer)
(define-key map "p" 'newsticker-previous-item)
diff --git a/lisp/net/quickurl.el b/lisp/net/quickurl.el
index ce9ef55f499..1e05d8db336 100644
--- a/lisp/net/quickurl.el
+++ b/lisp/net/quickurl.el
@@ -94,7 +94,8 @@
:group 'abbrev
:prefix "quickurl-")
-(defcustom quickurl-url-file (convert-standard-filename "~/.quickurls")
+(defcustom quickurl-url-file
+ (locate-user-emacs-file "quickurls" ".quickurls")
"File that contains the URL list."
:type 'file
:group 'quickurl)
@@ -272,7 +273,8 @@ It also restores point after the `read'."
(defun quickurl-save-urls ()
"Save the contents of `quickurl-urls' to `quickurl-url-file'."
(with-temp-buffer
- (let ((standard-output (current-buffer)))
+ (let ((standard-output (current-buffer))
+ (print-length nil))
(princ quickurl-prefix)
(pp quickurl-urls)
(princ quickurl-postfix)
diff --git a/lisp/net/rcirc.el b/lisp/net/rcirc.el
index 3afd3aefc96..7c70ded3eaa 100644
--- a/lisp/net/rcirc.el
+++ b/lisp/net/rcirc.el
@@ -406,7 +406,7 @@ will be killed."
"The channel or user associated with this buffer.")
(defvar rcirc-urls nil
- "List of urls seen in the current buffer.")
+ "List of URLs seen in the current buffer and their start positions.")
(put 'rcirc-urls 'permanent-local t)
(defvar rcirc-timeout-seconds 600
@@ -625,7 +625,8 @@ last ping."
(rcirc-float-time))))))
(rcirc-process-list))
;; no processes, clean up timer
- (cancel-timer rcirc-keepalive-timer)
+ (when (timerp rcirc-keepalive-timer)
+ (cancel-timer rcirc-keepalive-timer))
(setq rcirc-keepalive-timer nil)))
(defun rcirc-handler-ctcp-KEEPALIVE (process target sender message)
@@ -2392,12 +2393,25 @@ keywords when no KEYWORD is given."
"\\)")
"Regexp matching URLs. Set to nil to disable URL features in rcirc.")
+;; cf cl-remove-if-not
+(defun rcirc-condition-filter (condp lst)
+ "Remove all items not satisfying condition CONDP in list LST.
+CONDP is a function that takes a list element as argument and returns
+non-nil if that element should be included. Returns a new list."
+ (delq nil (mapcar (lambda (x) (and (funcall condp x) x)) lst)))
+
(defun rcirc-browse-url (&optional arg)
- "Prompt for URL to browse based on URLs in buffer."
+ "Prompt for URL to browse based on URLs in buffer before point.
+
+If ARG is given, opens the URL in a new browser window."
(interactive "P")
- (let ((completions (mapcar (lambda (x) (cons x nil)) rcirc-urls))
- (initial-input (car rcirc-urls))
- (history (cdr rcirc-urls)))
+ (let* ((point (point))
+ (filtered (rcirc-condition-filter
+ (lambda (x) (>= point (cdr x)))
+ rcirc-urls))
+ (completions (mapcar (lambda (x) (car x)) filtered))
+ (initial-input (caar filtered))
+ (history (mapcar (lambda (x) (car x)) (cdr filtered))))
(browse-url (completing-read "rcirc browse-url: "
completions nil nil initial-input 'history)
arg)))
@@ -2441,17 +2455,19 @@ keywords when no KEYWORD is given."
(defun rcirc-markup-urls (sender response)
(while (and rcirc-url-regexp ;; nil means disable URL catching
(re-search-forward rcirc-url-regexp nil t))
- (let ((start (match-beginning 0))
- (end (match-end 0))
- (url (match-string-no-properties 0)))
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (url (match-string-no-properties 0))
+ (link-text (buffer-substring-no-properties start end)))
(make-button start end
'face 'rcirc-url
'follow-link t
'rcirc-url url
'action (lambda (button)
(browse-url (button-get button 'rcirc-url))))
- ;; record the url
- (push url rcirc-urls))))
+ ;; record the url if it is not already the latest stored url
+ (when (not (string= link-text (caar rcirc-urls)))
+ (push (cons link-text start) rcirc-urls)))))
(defun rcirc-markup-keywords (sender response)
(when (and (string= response "PRIVMSG")
diff --git a/lisp/net/soap-client.el b/lisp/net/soap-client.el
index 6b4bc16c111..4ba8e5b5854 100644
--- a/lisp/net/soap-client.el
+++ b/lisp/net/soap-client.el
@@ -1768,7 +1768,11 @@ operations in a WSDL document."
(url-package-name "soap-client.el")
(url-package-version "1.0")
(url-http-version "1.0")
- (url-request-data (soap-create-envelope operation parameters wsdl))
+ (url-request-data
+ ;; url-request-data expects a unibyte string already encoded...
+ (encode-coding-string
+ (soap-create-envelope operation parameters wsdl)
+ 'utf-8))
(url-mime-charset-string "utf-8;q=1, iso-8859-1;q=0.5")
(url-request-coding-system 'utf-8)
(url-http-attempt-keepalives t)
diff --git a/lisp/net/socks.el b/lisp/net/socks.el
index 75b0ebe55ff..415397c4171 100644
--- a/lisp/net/socks.el
+++ b/lisp/net/socks.el
@@ -648,7 +648,7 @@ version.")
(progn
(setq res (buffer-substring (match-beginning 2)
(match-end 2))
- res (mapcar 'string-to-int (split-string res "\\.")))))
+ res (mapcar 'string-to-number (split-string res "\\.")))))
(kill-buffer (current-buffer)))
res)
host))
diff --git a/lisp/net/tls.el b/lisp/net/tls.el
index ed61d62182f..7fc314ef088 100644
--- a/lisp/net/tls.el
+++ b/lisp/net/tls.el
@@ -89,10 +89,14 @@ Also see `tls-success' for what the program should output after
successful negotiation."
:type
'(choice
+ (const :tag "Default list of commands"
+ ("gnutls-cli --insecure -p %p %h"
+ "gnutls-cli --insecure -p %p %h --protocols ssl3"
+ "openssl s_client -connect %h:%p -no_ssl2 -ign_eof"))
(list :tag "Choose commands"
:value
- ("gnutls-cli -p %p %h"
- "gnutls-cli -p %p %h --protocols ssl3"
+ ("gnutls-cli --insecure -p %p %h"
+ "gnutls-cli --insecure -p %p %h --protocols ssl3"
"openssl s_client -connect %h:%p -no_ssl2 -ign_eof")
(set :inline t
;; FIXME: add brief `:tag "..."' descriptions.
@@ -102,14 +106,10 @@ successful negotiation."
(const "gnutls-cli --x509cafile /etc/ssl/certs/ca-certificates.crt -p %p %h --protocols ssl3")
(const "openssl s_client -connect %h:%p -CAfile /etc/ssl/certs/ca-certificates.crt -no_ssl2 -ign_eof")
;; No trust check:
- (const "gnutls-cli -p %p %h")
- (const "gnutls-cli -p %p %h --protocols ssl3")
+ (const "gnutls-cli --insecure -p %p %h")
+ (const "gnutls-cli --insecure -p %p %h --protocols ssl3")
(const "openssl s_client -connect %h:%p -no_ssl2 -ign_eof"))
(repeat :inline t :tag "Other" (string)))
- (const :tag "Default list of commands"
- ("gnutls-cli -p %p %h"
- "gnutls-cli -p %p %h --protocols ssl3"
- "openssl s_client -connect %h:%p -no_ssl2 -ign_eof"))
(list :tag "List of commands"
(repeat :tag "Command" (string))))
:version "22.1"
diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el
new file mode 100644
index 00000000000..613b2067955
--- /dev/null
+++ b/lisp/net/tramp-adb.el
@@ -0,0 +1,1165 @@
+;;; tramp-adb.el --- Functions for calling Android Debug Bridge from Tramp
+
+;; Copyright (C) 2011-2013 Free Software Foundation, Inc.
+
+;; Author: Juergen Hoetzel <juergen@archlinux.org>
+;; Keywords: comm, processes
+;; Package: tramp
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; The Android Debug Bridge "adb" must be installed on your local
+;; machine. If it is not in your $PATH, add the following form into
+;; your .emacs:
+;;
+;; (setq tramp-adb-program "/path/to/adb")
+;;
+;; Due to security it is not possible to access non-root devices.
+
+;;; Code:
+
+(require 'tramp)
+(require 'time-date)
+
+(defvar dired-move-to-filename-regexp)
+
+(defcustom tramp-adb-program "adb"
+ "Name of the Android Debug Bridge program."
+ :group 'tramp
+ :version "24.4"
+ :type 'string)
+
+;;;###tramp-autoload
+(defconst tramp-adb-method "adb"
+ "*When this method name is used, forward all calls to Android Debug Bridge.")
+
+(defcustom tramp-adb-prompt
+ "^\\(?:[[:digit:]]*|?\\)?\\(?:[[:alnum:]]*@[[:alnum:]]*[^#\\$]*\\)?[#\\$][[:space:]]"
+ "Regexp used as prompt in almquist shell."
+ :type 'string
+ :version "24.4"
+ :group 'tramp)
+
+(defconst tramp-adb-ls-date-regexp
+ "[[:space:]][0-9]\\{4\\}-[0-9][0-9]-[0-9][0-9][[:space:]][0-9][0-9]:[0-9][0-9][[:space:]]")
+
+(defconst tramp-adb-ls-toolbox-regexp
+ (concat
+ "^[[:space:]]*\\([-[:alpha:]]+\\)" ; \1 permissions
+ "[[:space:]]*\\([^[:space:]]+\\)" ; \2 username
+ "[[:space:]]+\\([^[:space:]]+\\)" ; \3 group
+ "[[:space:]]+\\([[:digit:]]+\\)" ; \4 size
+ "[[:space:]]+\\([-[:digit:]]+[[:space:]][:[:digit:]]+\\)" ; \5 date
+ "[[:space:]]+\\(.*\\)$")) ; \6 filename
+
+;;;###tramp-autoload
+(add-to-list 'tramp-methods
+ `(,tramp-adb-method
+ (tramp-tmpdir "/data/local/tmp")))
+
+;;;###tramp-autoload
+(add-to-list 'tramp-default-host-alist `(,tramp-adb-method nil ""))
+
+;;;###tramp-autoload
+(eval-after-load 'tramp
+ '(tramp-set-completion-function
+ tramp-adb-method '((tramp-adb-parse-device-names ""))))
+
+;;;###tramp-autoload
+(add-to-list 'tramp-foreign-file-name-handler-alist
+ (cons 'tramp-adb-file-name-p 'tramp-adb-file-name-handler))
+
+(defconst tramp-adb-file-name-handler-alist
+ '((directory-file-name . tramp-handle-directory-file-name)
+ (dired-uncache . tramp-handle-dired-uncache)
+ (file-name-as-directory . tramp-handle-file-name-as-directory)
+ (file-name-completion . tramp-handle-file-name-completion)
+ (file-name-all-completions . tramp-adb-handle-file-name-all-completions)
+ (file-attributes . tramp-adb-handle-file-attributes)
+ (file-name-directory . tramp-handle-file-name-directory)
+ (file-name-nondirectory . tramp-handle-file-name-nondirectory)
+ (file-truename . tramp-adb-handle-file-truename)
+ (file-newer-than-file-p . tramp-handle-file-newer-than-file-p)
+ (file-name-as-directory . tramp-handle-file-name-as-directory)
+ (file-regular-p . tramp-handle-file-regular-p)
+ (file-remote-p . tramp-handle-file-remote-p)
+ (file-accessible-directory-p . tramp-handle-file-accessible-directory-p)
+ (file-directory-p . tramp-adb-handle-file-directory-p)
+ (file-symlink-p . tramp-handle-file-symlink-p)
+ ;; FIXME: This is too sloppy.
+ (file-executable-p . tramp-handle-file-exists-p)
+ (file-exists-p . tramp-handle-file-exists-p)
+ (file-readable-p . tramp-handle-file-exists-p)
+ (file-writable-p . tramp-adb-handle-file-writable-p)
+ (file-local-copy . tramp-adb-handle-file-local-copy)
+ (file-modes . tramp-handle-file-modes)
+ (expand-file-name . tramp-adb-handle-expand-file-name)
+ (find-backup-file-name . tramp-handle-find-backup-file-name)
+ (directory-files . tramp-handle-directory-files)
+ (directory-files-and-attributes
+ . tramp-adb-handle-directory-files-and-attributes)
+ (make-directory . tramp-adb-handle-make-directory)
+ (delete-directory . tramp-adb-handle-delete-directory)
+ (delete-file . tramp-adb-handle-delete-file)
+ (load . tramp-handle-load)
+ (insert-directory . tramp-adb-handle-insert-directory)
+ (insert-file-contents . tramp-handle-insert-file-contents)
+ (substitute-in-file-name . tramp-handle-substitute-in-file-name)
+ (unhandled-file-name-directory . tramp-handle-unhandled-file-name-directory)
+ (vc-registered . ignore) ;no vc control files on Android devices
+ (write-region . tramp-adb-handle-write-region)
+ (set-file-modes . tramp-adb-handle-set-file-modes)
+ (set-file-times . tramp-adb-handle-set-file-times)
+ (copy-file . tramp-adb-handle-copy-file)
+ (rename-file . tramp-adb-handle-rename-file)
+ (process-file . tramp-adb-handle-process-file)
+ (shell-command . tramp-adb-handle-shell-command)
+ (start-file-process . tramp-adb-handle-start-file-process))
+ "Alist of handler functions for Tramp ADB method.")
+
+;; It must be a `defsubst' in order to push the whole code into
+;; tramp-loaddefs.el. Otherwise, there would be recursive autoloading.
+;;;###tramp-autoload
+(defsubst tramp-adb-file-name-p (filename)
+ "Check if it's a filename for ADB."
+ (let ((v (tramp-dissect-file-name filename)))
+ (string= (tramp-file-name-method v) tramp-adb-method)))
+
+;;;###tramp-autoload
+(defun tramp-adb-file-name-handler (operation &rest args)
+ "Invoke the ADB handler for OPERATION.
+First arg specifies the OPERATION, second arg is a list of arguments to
+pass to the OPERATION."
+ (let ((fn (assoc operation tramp-adb-file-name-handler-alist)))
+ (if fn
+ (save-match-data (apply (cdr fn) args))
+ (tramp-run-real-handler operation args))))
+
+;;;###tramp-autoload
+(defun tramp-adb-parse-device-names (ignore)
+ "Return a list of (nil host) tuples allowed to access."
+ (with-timeout (10)
+ (with-temp-buffer
+ ;; `call-process' does not react on timer under MS Windows.
+ ;; That's why we use `start-process'.
+ (let ((p (start-process
+ tramp-adb-program (current-buffer) tramp-adb-program "devices"))
+ result)
+ (tramp-compat-set-process-query-on-exit-flag p nil)
+ (while (eq 'run (process-status p))
+ (sleep-for 0.1))
+ (goto-char (point-min))
+ (while (search-forward-regexp "^\\(\\S-+\\)[[:space:]]+device$" nil t)
+ (add-to-list 'result (list nil (match-string 1))))
+ result))))
+
+(defun tramp-adb-handle-expand-file-name (name &optional dir)
+ "Like `expand-file-name' for Tramp files."
+ ;; If DIR is not given, use DEFAULT-DIRECTORY or "/".
+ (setq dir (or dir default-directory "/"))
+ ;; Unless NAME is absolute, concat DIR and NAME.
+ (unless (file-name-absolute-p name)
+ (setq name (concat (file-name-as-directory dir) name)))
+ ;; If NAME is not a Tramp file, run the real handler.
+ (if (not (tramp-tramp-file-p name))
+ (tramp-run-real-handler 'expand-file-name (list name nil))
+ ;; Dissect NAME.
+ (with-parsed-tramp-file-name name nil
+ (unless (tramp-run-real-handler 'file-name-absolute-p (list localname))
+ (setq localname (concat "/" localname)))
+ ;; Do normal `expand-file-name' (this does "/./" and "/../").
+ ;; We bind `directory-sep-char' here for XEmacs on Windows,
+ ;; which would otherwise use backslash. `default-directory' is
+ ;; bound, because on Windows there would be problems with UNC
+ ;; shares or Cygwin mounts.
+ (let ((directory-sep-char ?/)
+ (default-directory (tramp-compat-temporary-file-directory)))
+ (tramp-make-tramp-file-name
+ method user host
+ (tramp-drop-volume-letter
+ (tramp-run-real-handler
+ 'expand-file-name (list localname))))))))
+
+(defun tramp-adb-handle-file-directory-p (filename)
+ "Like `file-directory-p' for Tramp files."
+ (car (file-attributes (file-truename filename))))
+
+;; This is derived from `tramp-sh-handle-file-truename'. Maybe the
+;; code could be shared?
+(defun tramp-adb-handle-file-truename (filename &optional counter prev-dirs)
+ "Like `file-truename' for Tramp files."
+ (with-parsed-tramp-file-name (expand-file-name filename) nil
+ (with-tramp-file-property v localname "file-truename"
+ (let ((result nil)) ; result steps in reverse order
+ (tramp-message v 4 "Finding true name for `%s'" filename)
+ (let* ((directory-sep-char ?/)
+ (steps (tramp-compat-split-string localname "/"))
+ (localnamedir (tramp-run-real-handler
+ 'file-name-as-directory (list localname)))
+ (is-dir (string= localname localnamedir))
+ (thisstep nil)
+ (numchase 0)
+ ;; Don't make the following value larger than
+ ;; necessary. People expect an error message in a
+ ;; timely fashion when something is wrong; otherwise
+ ;; they might think that Emacs is hung. Of course,
+ ;; correctness has to come first.
+ (numchase-limit 20)
+ symlink-target)
+ (while (and steps (< numchase numchase-limit))
+ (setq thisstep (pop steps))
+ (tramp-message
+ v 5 "Check %s"
+ (mapconcat 'identity
+ (append '("") (reverse result) (list thisstep))
+ "/"))
+ (setq symlink-target
+ (nth 0 (file-attributes
+ (tramp-make-tramp-file-name
+ method user host
+ (mapconcat 'identity
+ (append '("")
+ (reverse result)
+ (list thisstep))
+ "/")))))
+ (cond ((string= "." thisstep)
+ (tramp-message v 5 "Ignoring step `.'"))
+ ((string= ".." thisstep)
+ (tramp-message v 5 "Processing step `..'")
+ (pop result))
+ ((stringp symlink-target)
+ ;; It's a symlink, follow it.
+ (tramp-message v 5 "Follow symlink to %s" symlink-target)
+ (setq numchase (1+ numchase))
+ (when (file-name-absolute-p symlink-target)
+ (setq result nil))
+ ;; If the symlink was absolute, we'll get a string
+ ;; like "/user@host:/some/target"; extract the
+ ;; "/some/target" part from it.
+ (when (tramp-tramp-file-p symlink-target)
+ (unless (tramp-equal-remote filename symlink-target)
+ (tramp-error
+ v 'file-error
+ "Symlink target `%s' on wrong host" symlink-target))
+ (setq symlink-target localname))
+ (setq steps
+ (append (tramp-compat-split-string
+ symlink-target "/")
+ steps)))
+ (t
+ ;; It's a file.
+ (setq result (cons thisstep result)))))
+ (when (>= numchase numchase-limit)
+ (tramp-error
+ v 'file-error
+ "Maximum number (%d) of symlinks exceeded" numchase-limit))
+ (setq result (reverse result))
+ ;; Combine list to form string.
+ (setq result
+ (if result
+ (mapconcat 'identity (cons "" result) "/")
+ "/"))
+ (when (and is-dir (or (string= "" result)
+ (not (string= (substring result -1) "/"))))
+ (setq result (concat result "/"))))
+
+ (tramp-message v 4 "True name of `%s' is `%s'" filename result)
+ (tramp-make-tramp-file-name method user host result)))))
+
+(defun tramp-adb-handle-file-attributes (filename &optional id-format)
+ "Like `file-attributes' for Tramp files."
+ (unless id-format (setq id-format 'integer))
+ (ignore-errors
+ (with-parsed-tramp-file-name filename nil
+ (with-tramp-file-property
+ v localname (format "file-attributes-%s" id-format)
+ (tramp-adb-barf-unless-okay
+ v (format "%s -d -l %s"
+ (tramp-adb-get-ls-command v)
+ (tramp-shell-quote-argument localname)) "")
+ (with-current-buffer (tramp-get-buffer v)
+ (tramp-adb-sh-fix-ls-output)
+ (cdar (tramp-do-parse-file-attributes-with-ls v id-format)))))))
+
+(defun tramp-do-parse-file-attributes-with-ls (vec &optional id-format)
+ "Parse `file-attributes' for Tramp files using the ls(1) command."
+ (with-current-buffer (tramp-get-buffer vec)
+ (goto-char (point-min))
+ (let ((file-properties nil))
+ (while (re-search-forward tramp-adb-ls-toolbox-regexp nil t)
+ (let* ((mod-string (match-string 1))
+ (is-dir (eq ?d (aref mod-string 0)))
+ (is-symlink (eq ?l (aref mod-string 0)))
+ (uid (match-string 2))
+ (gid (match-string 3))
+ (size (string-to-number (match-string 4)))
+ (date (match-string 5))
+ (name (match-string 6))
+ (symlink-target
+ (and is-symlink
+ (cadr (split-string name "\\( -> \\|\n\\)")))))
+ (push (list
+ (if is-symlink
+ (car (split-string name "\\( -> \\|\n\\)"))
+ name)
+ (or is-dir symlink-target)
+ 1 ;link-count
+ ;; no way to handle numeric ids in Androids ash
+ (if (eq id-format 'integer) 0 uid)
+ (if (eq id-format 'integer) 0 gid)
+ '(0 0) ; atime
+ (date-to-time date) ; mtime
+ '(0 0) ; ctime
+ size
+ mod-string
+ ;; fake
+ t 1
+ (tramp-get-device vec))
+ file-properties)))
+ file-properties)))
+
+(defun tramp-adb-handle-directory-files-and-attributes
+ (directory &optional full match nosort id-format)
+ "Like `directory-files-and-attributes' for Tramp files."
+ (when (file-directory-p directory)
+ (with-parsed-tramp-file-name (expand-file-name directory) nil
+ (with-tramp-file-property
+ v localname (format "directory-files-attributes-%s-%s-%s-%s"
+ full match id-format nosort)
+ (tramp-adb-barf-unless-okay
+ v (format "%s -a -l %s"
+ (tramp-adb-get-ls-command v)
+ (tramp-shell-quote-argument localname)) "")
+ (with-current-buffer (tramp-get-buffer v)
+ (tramp-adb-sh-fix-ls-output)
+ (let ((result (tramp-do-parse-file-attributes-with-ls
+ v (or id-format 'integer))))
+ (when full
+ (setq result
+ (mapcar
+ (lambda (x)
+ (cons (expand-file-name (car x) directory) (cdr x)))
+ result)))
+ (unless nosort
+ (setq result
+ (sort result (lambda (x y) (string< (car x) (car y))))))
+ (delq nil
+ (mapcar (lambda (x)
+ (if (or (not match) (string-match match (car x)))
+ x))
+ result))))))))
+
+(defun tramp-adb-get-ls-command (vec)
+ (with-tramp-connection-property vec "ls"
+ (tramp-message vec 5 "Finding a suitable `ls' command")
+ (if (zerop (tramp-adb-command-exit-status
+ vec "ls --color=never -al /dev/null"))
+ ;; On CyanogenMod based system BusyBox is used and "ls" output
+ ;; coloring is enabled by default. So we try to disable it
+ ;; when possible.
+ "ls --color=never"
+ "ls")))
+
+(defun tramp-adb-get-toolbox (vec)
+ "Get shell toolbox implementation: `toolbox' for original distributions
+or `busybox' for CyanogenMod based distributions"
+ (with-tramp-connection-property vec "toolbox"
+ (tramp-message vec 5 "Checking shell toolbox implementation")
+ (cond
+ ((zerop (tramp-adb-command-exit-status vec "busybox")) 'busybox)
+ ((zerop (tramp-adb-command-exit-status vec "toolbox")) 'toolbox)
+ (t 'unknown))))
+
+(defun tramp-adb--gnu-switches-to-ash
+ (switches)
+ "Almquist shell can't handle multiple arguments.
+Convert (\"-al\") to (\"-a\" \"-l\"). Remove arguments like \"--dired\"."
+ (split-string
+ (apply 'concat
+ (mapcar (lambda (s)
+ (replace-regexp-in-string
+ "\\(.\\)" " -\\1"
+ (replace-regexp-in-string "^-" "" s)))
+ ;; FIXME: Warning about removed switches (long and non-dash).
+ (delq nil
+ (mapcar
+ (lambda (s)
+ (and (not (string-match "\\(^--\\|^[^-]\\)" s)) s))
+ switches))))))
+
+(defun tramp-adb-handle-insert-directory
+ (filename switches &optional wildcard full-directory-p)
+ "Like `insert-directory' for Tramp files."
+ (when (stringp switches)
+ (setq switches (tramp-adb--gnu-switches-to-ash (split-string switches))))
+ (with-parsed-tramp-file-name (file-truename filename) nil
+ (with-current-buffer (tramp-get-buffer v)
+ (let ((name (tramp-shell-quote-argument (directory-file-name localname)))
+ (switch-d (member "-d" switches))
+ (switch-t (member "-t" switches))
+ (switches (mapconcat 'identity (remove "-t" switches) " ")))
+ (tramp-adb-barf-unless-okay
+ v (format "%s %s %s" (tramp-adb-get-ls-command v) switches name)
+ "Cannot insert directory listing: %s" filename)
+ (unless switch-d
+ ;; We insert also filename/. and filename/.., because "ls" doesn't.
+ (narrow-to-region (point) (point))
+ (ignore-errors
+ (tramp-adb-barf-unless-okay
+ v (format "%s -d %s %s %s"
+ (tramp-adb-get-ls-command v)
+ switches
+ (concat (file-name-as-directory name) ".")
+ (concat (file-name-as-directory name) ".."))
+ "Cannot insert directory listing: %s" filename))
+ (widen))
+ (tramp-adb-sh-fix-ls-output switch-t)))
+ (insert-buffer-substring (tramp-get-buffer v))))
+
+(defun tramp-adb-sh-fix-ls-output (&optional sort-by-time)
+ "Insert dummy 0 in empty size columns.
+Androids \"ls\" command doesn't insert size column for directories:
+Emacs dired can't find files."
+ (save-excursion
+ ;; Insert missing size.
+ (goto-char (point-min))
+ (while
+ (search-forward-regexp
+ "[[:space:]]\\([[:space:]][0-9]\\{4\\}-[0-9][0-9]-[0-9][0-9][[:space:]]\\)" nil t)
+ (replace-match "0\\1" "\\1" nil)
+ ;; Insert missing "/".
+ (when (looking-at "[0-9][0-9]:[0-9][0-9][[:space:]]+$")
+ (end-of-line)
+ (insert "/")))
+ ;; Sort entries.
+ (let* ((lines (split-string (buffer-string) "\n" t))
+ (sorted-lines
+ (sort
+ lines
+ (if sort-by-time
+ 'tramp-adb-ls-output-time-less-p
+ 'tramp-adb-ls-output-name-less-p))))
+ (delete-region (point-min) (point-max))
+ (insert " " (mapconcat 'identity sorted-lines "\n ")))
+ ;; Add final newline.
+ (goto-char (point-max))
+ (unless (= (point) (line-beginning-position))
+ (insert "\n"))))
+
+
+(defun tramp-adb-ls-output-time-less-p (a b)
+ "Sort \"ls\" output by time, descending."
+ (let (time-a time-b)
+ (string-match tramp-adb-ls-date-regexp a)
+ (setq time-a (apply 'encode-time (parse-time-string (match-string 0 a))))
+ (string-match tramp-adb-ls-date-regexp b)
+ (setq time-b (apply 'encode-time (parse-time-string (match-string 0 b))))
+ (tramp-time-less-p time-b time-a)))
+
+(defun tramp-adb-ls-output-name-less-p (a b)
+ "Sort \"ls\" output by name, ascending."
+ (let (posa posb)
+ (string-match dired-move-to-filename-regexp a)
+ (setq posa (match-end 0))
+ (string-match dired-move-to-filename-regexp b)
+ (setq posb (match-end 0))
+ (string-lessp (substring a posa) (substring b posb))))
+
+(defun tramp-adb-handle-make-directory (dir &optional parents)
+ "Like `make-directory' for Tramp files."
+ (setq dir (expand-file-name dir))
+ (with-parsed-tramp-file-name dir nil
+ (when parents
+ (let ((par (expand-file-name ".." dir)))
+ (unless (file-directory-p par)
+ (make-directory par parents))))
+ (tramp-adb-barf-unless-okay
+ v (format "mkdir %s" (tramp-shell-quote-argument localname))
+ "Couldn't make directory %s" dir)
+ (tramp-flush-directory-property v (file-name-directory localname))))
+
+(defun tramp-adb-handle-delete-directory (directory &optional recursive)
+ "Like `delete-directory' for Tramp files."
+ (setq directory (expand-file-name directory))
+ (with-parsed-tramp-file-name directory nil
+ (tramp-flush-file-property v (file-name-directory localname))
+ (tramp-flush-directory-property v localname)
+ (tramp-adb-barf-unless-okay
+ v (format "%s %s"
+ (if recursive "rm -r" "rmdir")
+ (tramp-shell-quote-argument localname))
+ "Couldn't delete %s" directory)))
+
+(defun tramp-adb-handle-delete-file (filename &optional trash)
+ "Like `delete-file' for Tramp files."
+ (setq filename (expand-file-name filename))
+ (with-parsed-tramp-file-name filename nil
+ (tramp-flush-file-property v (file-name-directory localname))
+ (tramp-flush-file-property v localname)
+ (tramp-adb-barf-unless-okay
+ v (format "rm %s" (tramp-shell-quote-argument localname))
+ "Couldn't delete %s" filename)))
+
+(defun tramp-adb-handle-file-name-all-completions (filename directory)
+ "Like `file-name-all-completions' for Tramp files."
+ (all-completions
+ filename
+ (with-parsed-tramp-file-name directory nil
+ (with-tramp-file-property v localname "file-name-all-completions"
+ (save-match-data
+ (tramp-adb-send-command
+ v (format "%s %s"
+ (tramp-adb-get-ls-command v)
+ (tramp-shell-quote-argument localname)))
+ (mapcar
+ (lambda (f)
+ (if (file-directory-p f)
+ (file-name-as-directory f)
+ f))
+ (with-current-buffer (tramp-get-buffer v)
+ (delq
+ nil
+ (mapcar
+ (lambda (l) (and (not (string-match "^[[:space:]]*$" l)) l))
+ (split-string (buffer-string) "\n"))))))))))
+
+(defun tramp-adb-handle-file-local-copy (filename)
+ "Like `file-local-copy' for Tramp files."
+ (with-parsed-tramp-file-name filename nil
+ (unless (file-exists-p (file-truename filename))
+ (tramp-error
+ v 'file-error
+ "Cannot make local copy of non-existing file `%s'" filename))
+ (let ((tmpfile (tramp-compat-make-temp-file filename)))
+ (with-tramp-progress-reporter
+ v 3 (format "Fetching %s to tmp file %s" filename tmpfile)
+ (when (tramp-adb-execute-adb-command v "pull" localname tmpfile)
+ (delete-file tmpfile)
+ (tramp-error
+ v 'file-error "Cannot make local copy of file `%s'" filename))
+ (set-file-modes tmpfile (file-modes filename)))
+ tmpfile)))
+
+(defun tramp-adb-handle-file-writable-p (filename)
+ "Like `tramp-sh-handle-file-writable-p'.
+But handle the case, if the \"test\" command is not available."
+ (with-parsed-tramp-file-name filename nil
+ (with-tramp-file-property v localname "file-writable-p"
+ (if (tramp-adb-find-test-command v)
+ (if (file-exists-p filename)
+ (zerop
+ (tramp-adb-command-exit-status
+ v (format "test -w %s" (tramp-shell-quote-argument localname))))
+ (and
+ (file-directory-p (file-name-directory filename))
+ (file-writable-p (file-name-directory filename))))
+
+ ;; Missing "test" command on Android < 4.
+ (let ((rw-path "/data/data"))
+ (tramp-message
+ v 5
+ "Not implemented yet (assuming \"/data/data\" is writable): %s"
+ localname)
+ (and (>= (length localname) (length rw-path))
+ (string= (substring localname 0 (length rw-path))
+ rw-path)))))))
+
+(defun tramp-adb-handle-write-region
+ (start end filename &optional append visit lockname confirm)
+ "Like `write-region' for Tramp files."
+ (setq filename (expand-file-name filename))
+ (with-parsed-tramp-file-name filename nil
+ (when append
+ (tramp-error
+ v 'file-error "Cannot append to file using Tramp (`%s')" filename))
+ (when (and confirm (file-exists-p filename))
+ (unless (y-or-n-p (format "File %s exists; overwrite anyway? "
+ filename))
+ (tramp-error v 'file-error "File not overwritten")))
+ ;; We must also flush the cache of the directory, because
+ ;; `file-attributes' reads the values from there.
+ (tramp-flush-file-property v (file-name-directory localname))
+ (tramp-flush-file-property v localname)
+ (let* ((curbuf (current-buffer))
+ (tmpfile (tramp-compat-make-temp-file filename)))
+ (tramp-run-real-handler
+ 'write-region
+ (list start end tmpfile append 'no-message lockname confirm))
+ (with-tramp-progress-reporter
+ v 3 (format "Moving tmp file %s to %s" tmpfile filename)
+ (unwind-protect
+ (when (tramp-adb-execute-adb-command v "push" tmpfile localname)
+ (tramp-error v 'file-error "Cannot write: `%s' filename"))
+ (delete-file tmpfile)))
+
+ (unless (equal curbuf (current-buffer))
+ (tramp-error
+ v 'file-error
+ "Buffer has changed from `%s' to `%s'" curbuf (current-buffer))))))
+
+(defun tramp-adb-handle-set-file-modes (filename mode)
+ "Like `set-file-modes' for Tramp files."
+ (with-parsed-tramp-file-name filename nil
+ (tramp-flush-file-property v localname)
+ (tramp-adb-barf-unless-okay
+ v (format "chmod %s %s" (tramp-compat-decimal-to-octal mode) localname)
+ "Error while changing file's mode %s" filename)))
+
+(defun tramp-adb-handle-set-file-times (filename &optional time)
+ "Like `set-file-times' for Tramp files."
+ (with-parsed-tramp-file-name filename nil
+ (tramp-flush-file-property v localname)
+ (let ((time (if (or (null time) (equal time '(0 0)))
+ (current-time)
+ time)))
+ (tramp-adb-command-exit-status
+ ;; use shell arithmetic because of Emacs integer size limit
+ v (format "touch -t $(( %d * 65536 + %d )) %s"
+ (car time) (cadr time)
+ (tramp-shell-quote-argument localname))))))
+
+(defun tramp-adb-handle-copy-file
+ (filename newname &optional ok-if-already-exists keep-date
+ preserve-uid-gid preserve-extended-attributes)
+ "Like `copy-file' for Tramp files.
+PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
+ (setq filename (expand-file-name filename)
+ newname (expand-file-name newname))
+
+ (if (file-directory-p filename)
+ (tramp-file-name-handler 'copy-directory filename newname keep-date t)
+ (with-tramp-progress-reporter
+ (tramp-dissect-file-name (if (file-remote-p filename) filename newname))
+ 0 (format "Copying %s to %s" filename newname)
+
+ (let ((tmpfile (file-local-copy filename)))
+
+ (if tmpfile
+ ;; Remote filename.
+ (condition-case err
+ (rename-file tmpfile newname ok-if-already-exists)
+ ((error quit)
+ (delete-file tmpfile)
+ (signal (car err) (cdr err))))
+
+ ;; Remote newname.
+ (when (file-directory-p newname)
+ (setq newname
+ (expand-file-name (file-name-nondirectory filename) newname)))
+
+ (with-parsed-tramp-file-name newname nil
+ (when (and (not ok-if-already-exists)
+ (file-exists-p newname))
+ (tramp-error v 'file-already-exists newname))
+
+ ;; We must also flush the cache of the directory, because
+ ;; `file-attributes' reads the values from there.
+ (tramp-flush-file-property v (file-name-directory localname))
+ (tramp-flush-file-property v localname)
+ (when (tramp-adb-execute-adb-command v "push" filename localname)
+ (tramp-error
+ v 'file-error "Cannot copy `%s' `%s'" filename newname))))))
+
+ ;; KEEP-DATE handling.
+ (when keep-date
+ (set-file-times newname (nth 5 (file-attributes filename))))))
+
+(defun tramp-adb-handle-rename-file
+ (filename newname &optional ok-if-already-exists)
+ "Like `rename-file' for Tramp files."
+ (setq filename (expand-file-name filename)
+ newname (expand-file-name newname))
+
+ (with-parsed-tramp-file-name
+ (if (file-remote-p filename) filename newname) nil
+ (with-tramp-progress-reporter
+ v 0 (format "Renaming %s to %s" newname filename)
+
+ (if (and (tramp-equal-remote filename newname)
+ (not (file-directory-p filename)))
+ (progn
+ (when (and (not ok-if-already-exists)
+ (file-exists-p newname))
+ (tramp-error v 'file-already-exists newname))
+ ;; We must also flush the cache of the directory, because
+ ;; `file-attributes' reads the values from there.
+ (tramp-flush-file-property v (file-name-directory localname))
+ (tramp-flush-file-property v localname)
+ ;; Short track.
+ (tramp-adb-barf-unless-okay
+ v (format
+ "mv %s %s"
+ (tramp-file-name-handler 'file-remote-p filename 'localname)
+ localname)
+ "Error renaming %s to %s" filename newname))
+
+ ;; Rename by copy.
+ (copy-file filename newname ok-if-already-exists t t)
+ (delete-file filename)))))
+
+(defun tramp-adb-handle-process-file
+ (program &optional infile destination display &rest args)
+ "Like `process-file' for Tramp files."
+ ;; The implementation is not complete yet.
+ (when (and (numberp destination) (zerop destination))
+ (error "Implementation does not handle immediate return"))
+
+ (with-parsed-tramp-file-name default-directory nil
+ (let (command input tmpinput stderr tmpstderr outbuf ret)
+ ;; Compute command.
+ (setq command (mapconcat 'tramp-shell-quote-argument
+ (cons program args) " "))
+ ;; Determine input.
+ (if (null infile)
+ (setq input "/dev/null")
+ (setq infile (expand-file-name infile))
+ (if (tramp-equal-remote default-directory infile)
+ ;; INFILE is on the same remote host.
+ (setq input (with-parsed-tramp-file-name infile nil localname))
+ ;; INFILE must be copied to remote host.
+ (setq input (tramp-make-tramp-temp-file v)
+ tmpinput (tramp-make-tramp-file-name method user host input))
+ (copy-file infile tmpinput t)))
+ (when input (setq command (format "%s <%s" command input)))
+
+ ;; Determine output.
+ (cond
+ ;; Just a buffer.
+ ((bufferp destination)
+ (setq outbuf destination))
+ ;; A buffer name.
+ ((stringp destination)
+ (setq outbuf (get-buffer-create destination)))
+ ;; (REAL-DESTINATION ERROR-DESTINATION)
+ ((consp destination)
+ ;; output.
+ (cond
+ ((bufferp (car destination))
+ (setq outbuf (car destination)))
+ ((stringp (car destination))
+ (setq outbuf (get-buffer-create (car destination))))
+ ((car destination)
+ (setq outbuf (current-buffer))))
+ ;; stderr.
+ (cond
+ ((stringp (cadr destination))
+ (setcar (cdr destination) (expand-file-name (cadr destination)))
+ (if (tramp-equal-remote default-directory (cadr destination))
+ ;; stderr is on the same remote host.
+ (setq stderr (with-parsed-tramp-file-name
+ (cadr destination) nil localname))
+ ;; stderr must be copied to remote host. The temporary
+ ;; file must be deleted after execution.
+ (setq stderr (tramp-make-tramp-temp-file v)
+ tmpstderr (tramp-make-tramp-file-name
+ method user host stderr))))
+ ;; stderr to be discarded.
+ ((null (cadr destination))
+ (setq stderr "/dev/null"))))
+ ;; 't
+ (destination
+ (setq outbuf (current-buffer))))
+ (when stderr (setq command (format "%s 2>%s" command stderr)))
+
+ ;; Send the command. It might not return in time, so we protect
+ ;; it. Call it in a subshell, in order to preserve working
+ ;; directory.
+ (condition-case nil
+ (progn
+ (setq ret 0)
+ (tramp-adb-barf-unless-okay
+ v (format "(cd %s; %s)"
+ (tramp-shell-quote-argument localname) command)
+ "")
+ ;; We should show the output anyway.
+ (when outbuf
+ (with-current-buffer outbuf
+ (insert-buffer-substring (tramp-get-connection-buffer v)))
+ (when display (display-buffer outbuf))))
+ ;; When the user did interrupt, we should do it also. We use
+ ;; return code -1 as marker.
+ (quit
+ (kill-buffer (tramp-get-connection-buffer v))
+ (setq ret -1))
+ ;; Handle errors.
+ (error
+ (kill-buffer (tramp-get-connection-buffer v))
+ (setq ret 1)))
+
+ ;; Provide error file.
+ (when tmpstderr (rename-file tmpstderr (cadr destination) t))
+
+ ;; Cleanup. We remove all file cache values for the connection,
+ ;; because the remote process could have changed them.
+ (when tmpinput (delete-file tmpinput))
+
+ ;; `process-file-side-effects' has been introduced with GNU
+ ;; Emacs 23.2. If set to `nil', no remote file will be changed
+ ;; by `program'. If it doesn't exist, we assume its default
+ ;; value 't'.
+ (unless (and (boundp 'process-file-side-effects)
+ (not (symbol-value 'process-file-side-effects)))
+ (tramp-flush-directory-property v ""))
+
+ ;; Return exit status.
+ (if (equal ret -1)
+ (keyboard-quit)
+ ret))))
+
+(defun tramp-adb-handle-shell-command
+ (command &optional output-buffer error-buffer)
+ "Like `shell-command' for Tramp files."
+ (let* ((asynchronous (string-match "[ \t]*&[ \t]*\\'" command))
+ ;; We cannot use `shell-file-name' and `shell-command-switch',
+ ;; they are variables of the local host.
+ (args (list "sh" "-c" (substring command 0 asynchronous)))
+ current-buffer-p
+ (output-buffer
+ (cond
+ ((bufferp output-buffer) output-buffer)
+ ((stringp output-buffer) (get-buffer-create output-buffer))
+ (output-buffer
+ (setq current-buffer-p t)
+ (current-buffer))
+ (t (get-buffer-create
+ (if asynchronous
+ "*Async Shell Command*"
+ "*Shell Command Output*")))))
+ (error-buffer
+ (cond
+ ((bufferp error-buffer) error-buffer)
+ ((stringp error-buffer) (get-buffer-create error-buffer))))
+ (buffer
+ (if (and (not asynchronous) error-buffer)
+ (with-parsed-tramp-file-name default-directory nil
+ (list output-buffer (tramp-make-tramp-temp-file v)))
+ output-buffer))
+ (p (get-buffer-process output-buffer)))
+
+ ;; Check whether there is another process running. Tramp does not
+ ;; support 2 (asynchronous) processes in parallel.
+ (when p
+ (if (yes-or-no-p "A command is running. Kill it? ")
+ (ignore-errors (kill-process p))
+ (tramp-compat-user-error "Shell command in progress")))
+
+ (if current-buffer-p
+ (progn
+ (barf-if-buffer-read-only)
+ (push-mark nil t))
+ (with-current-buffer output-buffer
+ (setq buffer-read-only nil)
+ (erase-buffer)))
+
+ (if (and (not current-buffer-p) (integerp asynchronous))
+ (prog1
+ ;; Run the process.
+ (apply 'start-file-process "*Async Shell*" buffer args)
+ ;; Display output.
+ (pop-to-buffer output-buffer)
+ (setq mode-line-process '(":%s"))
+ (shell-mode))
+
+ (prog1
+ ;; Run the process.
+ (apply 'process-file (car args) nil buffer nil (cdr args))
+ ;; Insert error messages if they were separated.
+ (when (listp buffer)
+ (with-current-buffer error-buffer
+ (insert-file-contents (cadr buffer)))
+ (delete-file (cadr buffer)))
+ (if current-buffer-p
+ ;; This is like exchange-point-and-mark, but doesn't
+ ;; activate the mark. It is cleaner to avoid activation,
+ ;; even though the command loop would deactivate the mark
+ ;; because we inserted text.
+ (goto-char (prog1 (mark t)
+ (set-marker (mark-marker) (point)
+ (current-buffer))))
+ ;; There's some output, display it.
+ (when (with-current-buffer output-buffer (> (point-max) (point-min)))
+ (if (functionp 'display-message-or-buffer)
+ (tramp-compat-funcall 'display-message-or-buffer output-buffer)
+ (pop-to-buffer output-buffer))))))))
+
+;; We use BUFFER also as connection buffer during setup. Because of
+;; this, its original contents must be saved, and restored once
+;; connection has been setup.
+(defun tramp-adb-handle-start-file-process (name buffer program &rest args)
+ "Like `start-file-process' for Tramp files."
+ (with-parsed-tramp-file-name default-directory nil
+ ;; When PROGRAM is nil, we should provide a tty. This is not
+ ;; possible here.
+ (unless (stringp program)
+ (tramp-error v 'file-error "PROGRAM must be a string"))
+
+ (let ((command
+ (format "cd %s; %s"
+ (tramp-shell-quote-argument localname)
+ (mapconcat 'tramp-shell-quote-argument
+ (cons program args) " ")))
+ (tramp-process-connection-type
+ (or (null program) tramp-process-connection-type))
+ (bmp (and (buffer-live-p buffer) (buffer-modified-p buffer)))
+ (name1 name)
+ (i 0))
+
+ (unless buffer
+ ;; BUFFER can be nil. We use a temporary buffer.
+ (setq buffer (generate-new-buffer tramp-temp-buffer-name)))
+ (while (get-process name1)
+ ;; NAME must be unique as process name.
+ (setq i (1+ i)
+ name1 (format "%s<%d>" name i)))
+ (setq name name1)
+ ;; Set the new process properties.
+ (tramp-set-connection-property v "process-name" name)
+ (tramp-set-connection-property v "process-buffer" buffer)
+
+ (with-current-buffer (tramp-get-connection-buffer v)
+ (unwind-protect
+ ;; We catch this event. Otherwise, `start-process' could
+ ;; be called on the local host.
+ (save-excursion
+ (save-restriction
+ ;; Activate narrowing in order to save BUFFER
+ ;; contents. Clear also the modification time;
+ ;; otherwise we might be interrupted by
+ ;; `verify-visited-file-modtime'.
+ (let ((buffer-undo-list t)
+ (buffer-read-only nil)
+ (mark (point)))
+ (clear-visited-file-modtime)
+ (narrow-to-region (point-max) (point-max))
+ ;; We call `tramp-adb-maybe-open-connection', in
+ ;; order to cleanup the prompt afterwards.
+ (tramp-adb-maybe-open-connection v)
+ (widen)
+ (delete-region mark (point))
+ (narrow-to-region (point-max) (point-max))
+ ;; Send the command.
+ (let ((tramp-adb-prompt (regexp-quote command)))
+ (tramp-adb-send-command v command))
+ (let ((p (tramp-get-connection-process v)))
+ ;; Set query flag and process marker for this
+ ;; process. We ignore errors, because the process
+ ;; could have finished already.
+ (ignore-errors
+ (tramp-compat-set-process-query-on-exit-flag p t)
+ (set-marker (process-mark p) (point)))
+ ;; Return process.
+ p))))
+
+ ;; Save exit.
+ (if (string-match tramp-temp-buffer-name (buffer-name))
+ (ignore-errors
+ (set-process-buffer (tramp-get-connection-process v) nil)
+ (kill-buffer (current-buffer)))
+ (set-buffer-modified-p bmp))
+ (tramp-set-connection-property v "process-name" nil)
+ (tramp-set-connection-property v "process-buffer" nil))))))
+
+;; Helper functions.
+
+(defun tramp-adb-execute-adb-command (vec &rest args)
+ "Returns nil on success error-output on failure."
+ (when (> (length (tramp-file-name-host vec)) 0)
+ (setq args (append (list "-s" (tramp-file-name-host vec)) args)))
+ (with-temp-buffer
+ (prog1
+ (unless
+ (zerop (apply 'tramp-call-process tramp-adb-program nil t nil args))
+ (buffer-string))
+ (tramp-message vec 6 "%s" (buffer-string)))))
+
+(defun tramp-adb-find-test-command (vec)
+ "Checks, whether the ash has a builtin \"test\" command.
+This happens for Android >= 4.0."
+ (with-tramp-connection-property vec "test"
+ (zerop (tramp-adb-command-exit-status vec "type test"))))
+
+;; Connection functions
+
+(defun tramp-adb-send-command (vec command)
+ "Send the COMMAND to connection VEC."
+ (tramp-adb-maybe-open-connection vec)
+ (tramp-message vec 6 "%s" command)
+ (tramp-send-string vec command)
+ ;; fixme: Race condition
+ (tramp-adb-wait-for-output (tramp-get-connection-process vec))
+ (with-current-buffer (tramp-get-connection-buffer vec)
+ (save-excursion
+ (goto-char (point-min))
+ ;; We can't use stty to disable echo of command.
+ (delete-matching-lines (regexp-quote command))
+ ;; When the local machine is W32, there are still trailing ^M.
+ ;; There must be a better solution by setting the correct coding
+ ;; system, but this requires changes in core Tramp.
+ (goto-char (point-min))
+ (while (re-search-forward "\r+$" nil t)
+ (replace-match "" nil nil)))))
+
+(defun tramp-adb-command-exit-status
+ (vec command)
+ "Run COMMAND and return its exit status.
+Sends `echo $?' along with the COMMAND for checking the exit status. If
+COMMAND is nil, just sends `echo $?'. Returns the exit status found."
+ (tramp-adb-send-command
+ vec (if command
+ (format "%s; echo tramp_exit_status $?" command)
+ "echo tramp_exit_status $?"))
+ (with-current-buffer (tramp-get-connection-buffer vec)
+ (goto-char (point-max))
+ (unless (re-search-backward "tramp_exit_status [0-9]+" nil t)
+ (tramp-error
+ vec 'file-error "Couldn't find exit status of `%s'" command))
+ (skip-chars-forward "^ ")
+ (prog1
+ (read (current-buffer))
+ (let (buffer-read-only)
+ (delete-region (match-beginning 0) (point-max))))))
+
+(defun tramp-adb-barf-unless-okay (vec command fmt &rest args)
+ "Run COMMAND, check exit status, throw error if exit status not okay.
+FMT and ARGS are passed to `error'."
+ (unless (zerop (tramp-adb-command-exit-status vec command))
+ (apply 'tramp-error vec 'file-error fmt args)))
+
+(defun tramp-adb-wait-for-output (proc &optional timeout)
+ "Wait for output from remote command."
+ (unless (buffer-live-p (process-buffer proc))
+ (delete-process proc)
+ (tramp-error proc 'file-error "Process `%s' not available, try again" proc))
+ (with-current-buffer (process-buffer proc)
+ (if (tramp-wait-for-regexp proc timeout tramp-adb-prompt)
+ (let (buffer-read-only)
+ (goto-char (point-min))
+ ;; ADB terminal sends "^H" sequences.
+ (when (re-search-forward "<\b+" (point-at-eol) t)
+ (forward-line 1)
+ (delete-region (point-min) (point)))
+ ;; Delete the prompt.
+ (goto-char (point-min))
+ (when (re-search-forward tramp-adb-prompt (point-at-eol) t)
+ (forward-line 1)
+ (delete-region (point-min) (point)))
+ (goto-char (point-max))
+ (re-search-backward tramp-adb-prompt nil t)
+ (delete-region (point) (point-max)))
+ (if timeout
+ (tramp-error
+ proc 'file-error
+ "[[Remote adb prompt `%s' not found in %d secs]]"
+ tramp-adb-prompt timeout)
+ (tramp-error
+ proc 'file-error
+ "[[Remote prompt `%s' not found]]" tramp-adb-prompt)))))
+
+(defun tramp-adb-maybe-open-connection (vec)
+ "Maybe open a connection VEC.
+Does not do anything if a connection is already open, but re-opens the
+connection if a previous connection has died for some reason."
+ (let* ((buf (tramp-get-connection-buffer vec))
+ (p (get-buffer-process buf))
+ (host (tramp-file-name-host vec))
+ (user (tramp-file-name-user vec))
+ (devices (mapcar 'cadr (tramp-adb-parse-device-names nil))))
+
+ ;; Maybe we know already that "su" is not supported. We cannot
+ ;; use a connection property, because we have not checked yet
+ ;; whether it is still the same device.
+ (when (and user (not (tramp-get-file-property vec "" "su-command-p" t)))
+ (tramp-error vec 'file-error "Cannot switch to user `%s'" user))
+
+ (unless
+ (and p (processp p) (memq (process-status p) '(run open)))
+ (save-match-data
+ (when (and p (processp p)) (delete-process p))
+ (if (not devices)
+ (tramp-error vec 'file-error "No device connected"))
+ (if (and (> (length host) 0) (not (member host devices)))
+ (tramp-error vec 'file-error "Device %s not connected" host))
+ (if (and (> (length devices) 1) (zerop (length host)))
+ (tramp-error
+ vec 'file-error
+ "Multiple Devices connected: No Host/Device specified"))
+ (with-tramp-progress-reporter vec 3 "Opening adb shell connection"
+ (let* ((coding-system-for-read 'utf-8-dos) ;is this correct?
+ (process-connection-type tramp-process-connection-type)
+ (args (if (> (length host) 0)
+ (list "-s" host "shell")
+ (list "shell")))
+ (p (let ((default-directory
+ (tramp-compat-temporary-file-directory)))
+ (apply 'start-process (tramp-get-connection-name vec) buf
+ tramp-adb-program args))))
+ (tramp-message
+ vec 6 "%s" (mapconcat 'identity (process-command p) " "))
+ ;; Wait for initial prompt.
+ (tramp-adb-wait-for-output p 30)
+ (unless (eq 'run (process-status p))
+ (tramp-error vec 'file-error "Terminated!"))
+ (tramp-compat-set-process-query-on-exit-flag p nil)
+
+ ;; Check whether the properties have been changed. If
+ ;; yes, this is a strong indication that we must expire all
+ ;; connection properties. We start again.
+ (tramp-message vec 5 "Checking system information")
+ (tramp-adb-send-command
+ vec "echo \\\"`getprop ro.product.model` `getprop ro.product.version` `getprop ro.build.version.release`\\\"")
+ (let ((old-getprop
+ (tramp-get-connection-property vec "getprop" nil))
+ (new-getprop
+ (tramp-set-connection-property
+ vec "getprop"
+ (with-current-buffer (tramp-get-connection-buffer vec)
+ ;; Read the expression.
+ (goto-char (point-min))
+ (read (current-buffer))))))
+ (when (and (stringp old-getprop)
+ (not (string-equal old-getprop new-getprop)))
+ (tramp-cleanup vec)
+ (tramp-message
+ vec 3
+ "Connection reset, because remote host changed from `%s' to `%s'"
+ old-getprop new-getprop)
+ (tramp-adb-maybe-open-connection vec)))
+
+ ;; Change user if indicated.
+ (when user
+ (tramp-adb-send-command vec (format "su %s" user))
+ (unless (zerop (tramp-adb-command-exit-status vec nil))
+ (delete-process p)
+ (tramp-set-file-property vec "" "su-command-p" nil)
+ (tramp-error
+ vec 'file-error "Cannot switch to user `%s'" user)))
+
+ ;; Set "remote-path" connection property. This is needed
+ ;; for eshell.
+ (tramp-adb-send-command vec "echo \\\"$PATH\\\"")
+ (tramp-set-connection-property
+ vec "remote-path"
+ (split-string
+ (with-current-buffer (tramp-get-connection-buffer vec)
+ ;; Read the expression.
+ (goto-char (point-min))
+ (read (current-buffer)))
+ ":" 'omit-nulls))))))))
+
+(provide 'tramp-adb)
+;;; tramp-adb.el ends here
diff --git a/lisp/net/tramp-cache.el b/lisp/net/tramp-cache.el
index d1ef1739bf7..13a955ff579 100644
--- a/lisp/net/tramp-cache.el
+++ b/lisp/net/tramp-cache.el
@@ -58,6 +58,19 @@
(defvar tramp-cache-data (make-hash-table :test 'equal)
"Hash table for remote files properties.")
+;;;###tramp-autoload
+(defcustom tramp-connection-properties nil
+ "List of static connection properties.
+Every entry has the form (REGEXP PROPERTY VALUE). The regexp
+matches remote file names. It can be nil. PROPERTY is a string,
+and VALUE the corresponding value. They are used, if there is no
+matching entry in for PROPERTY in `tramp-cache-data'."
+ :group 'tramp
+ :version "24.4"
+ :type '(repeat (list (choice :tag "File Name regexp" regexp (const nil))
+ (choice :tag " Property" string)
+ (choice :tag " Value" sexp))))
+
(defcustom tramp-persistency-file-name
(cond
;; GNU Emacs.
@@ -85,16 +98,30 @@
(defvar tramp-cache-data-changed nil
"Whether persistent cache data have been changed.")
+(defun tramp-get-hash-table (key)
+ "Returns the hash table for KEY.
+If it doesn't exist yet, it is created and initialized with
+matching entries of `tramp-connection-properties'."
+ (or (gethash key tramp-cache-data)
+ (let ((hash
+ (puthash key (make-hash-table :test 'equal) tramp-cache-data)))
+ (when (vectorp key)
+ (dolist (elt tramp-connection-properties)
+ (when (string-match
+ (or (nth 0 elt) "")
+ (tramp-make-tramp-file-name
+ (aref key 0) (aref key 1) (aref key 2) nil))
+ (tramp-set-connection-property key (nth 1 elt) (nth 2 elt)))))
+ hash)))
+
;;;###tramp-autoload
-(defun tramp-get-file-property (vec file property default)
- "Get the PROPERTY of FILE from the cache context of VEC.
+(defun tramp-get-file-property (key file property default)
+ "Get the PROPERTY of FILE from the cache context of KEY.
Returns DEFAULT if not set."
;; Unify localname.
- (setq vec (copy-sequence vec))
- (aset vec 3 (tramp-run-real-handler 'directory-file-name (list file)))
- (let* ((hash (or (gethash vec tramp-cache-data)
- (puthash vec (make-hash-table :test 'equal)
- tramp-cache-data)))
+ (setq key (copy-sequence key))
+ (aset key 3 (tramp-run-real-handler 'directory-file-name (list file)))
+ (let* ((hash (tramp-get-hash-table key))
(value (when (hash-table-p hash) (gethash property hash))))
(if
;; We take the value only if there is any, and
@@ -112,7 +139,7 @@ Returns DEFAULT if not set."
(setq value (cdr value))
(setq value default))
- (tramp-message vec 8 "%s %s %s" file property value)
+ (tramp-message key 8 "%s %s %s" file property value)
(when (>= tramp-verbose 10)
(let* ((var (intern (concat "tramp-cache-get-count-" property)))
(val (or (ignore-errors (symbol-value var)) 0)))
@@ -120,18 +147,16 @@ Returns DEFAULT if not set."
value))
;;;###tramp-autoload
-(defun tramp-set-file-property (vec file property value)
- "Set the PROPERTY of FILE to VALUE, in the cache context of VEC.
+(defun tramp-set-file-property (key file property value)
+ "Set the PROPERTY of FILE to VALUE, in the cache context of KEY.
Returns VALUE."
;; Unify localname.
- (setq vec (copy-sequence vec))
- (aset vec 3 (tramp-run-real-handler 'directory-file-name (list file)))
- (let ((hash (or (gethash vec tramp-cache-data)
- (puthash vec (make-hash-table :test 'equal)
- tramp-cache-data))))
+ (setq key (copy-sequence key))
+ (aset key 3 (tramp-run-real-handler 'directory-file-name (list file)))
+ (let ((hash (tramp-get-hash-table key)))
;; We put the timestamp there.
(puthash property (cons (current-time) value) hash)
- (tramp-message vec 8 "%s %s %s" file property value)
+ (tramp-message key 8 "%s %s %s" file property value)
(when (>= tramp-verbose 10)
(let* ((var (intern (concat "tramp-cache-set-count-" property)))
(val (or (ignore-errors (symbol-value var)) 0)))
@@ -139,26 +164,26 @@ Returns VALUE."
value))
;;;###tramp-autoload
-(defun tramp-flush-file-property (vec file)
- "Remove all properties of FILE in the cache context of VEC."
+(defun tramp-flush-file-property (key file)
+ "Remove all properties of FILE in the cache context of KEY."
;; Remove file property of symlinks.
- (let ((truename (tramp-get-file-property vec file "file-truename" nil)))
+ (let ((truename (tramp-get-file-property key file "file-truename" nil)))
(when (and (stringp truename)
(not (string-equal file truename)))
- (tramp-flush-file-property vec truename)))
+ (tramp-flush-file-property key truename)))
;; Unify localname.
- (setq vec (copy-sequence vec))
- (aset vec 3 (tramp-run-real-handler 'directory-file-name (list file)))
- (tramp-message vec 8 "%s" file)
- (remhash vec tramp-cache-data))
+ (setq key (copy-sequence key))
+ (aset key 3 (tramp-run-real-handler 'directory-file-name (list file)))
+ (tramp-message key 8 "%s" file)
+ (remhash key tramp-cache-data))
;;;###tramp-autoload
-(defun tramp-flush-directory-property (vec directory)
- "Remove all properties of DIRECTORY in the cache context of VEC.
+(defun tramp-flush-directory-property (key directory)
+ "Remove all properties of DIRECTORY in the cache context of KEY.
Remove also properties of all files in subdirectories."
(let ((directory (tramp-run-real-handler
'directory-file-name (list directory))))
- (tramp-message vec 8 "%s" directory)
+ (tramp-message key 8 "%s" directory)
(maphash
(lambda (key value)
(when (and (stringp (tramp-file-name-localname key))
@@ -203,7 +228,7 @@ If the value is not set for the connection, returns DEFAULT."
(when (vectorp key)
(setq key (copy-sequence key))
(aset key 3 nil))
- (let* ((hash (gethash key tramp-cache-data))
+ (let* ((hash (tramp-get-hash-table key))
(value (if (hash-table-p hash)
(gethash property hash default)
default)))
@@ -220,15 +245,19 @@ PROPERTY is set persistent when KEY is a vector."
(when (vectorp key)
(setq key (copy-sequence key))
(aset key 3 nil))
- (let ((hash (or (gethash key tramp-cache-data)
- (puthash key (make-hash-table :test 'equal)
- tramp-cache-data))))
+ (let ((hash (tramp-get-hash-table key)))
(puthash property value hash)
(setq tramp-cache-data-changed t)
(tramp-message key 7 "%s %s" property value)
value))
;;;###tramp-autoload
+(defun tramp-connection-property-p (key property)
+ "Check whether named PROPERTY of a connection is defined.
+KEY identifies the connection, it is either a process or a vector."
+ (not (eq (tramp-get-connection-property key property 'undef) 'undef)))
+
+;;;###tramp-autoload
(defun tramp-flush-connection-property (key)
"Remove all properties identified by KEY.
KEY identifies the connection, it is either a process or a vector."
@@ -241,10 +270,8 @@ KEY identifies the connection, it is either a process or a vector."
key 7 "%s %s" key
(let ((hash (gethash key tramp-cache-data))
properties)
- (if (hash-table-p hash)
- (maphash
- (lambda (x y) (add-to-list 'properties x 'append))
- (gethash key tramp-cache-data)))
+ (when (hash-table-p hash)
+ (maphash (lambda (x y) (add-to-list 'properties x 'append)) hash))
properties))
(setq tramp-cache-data-changed t)
(remhash key tramp-cache-data))
@@ -365,7 +392,11 @@ for all methods. Resulting data are derived from connection history."
(while (setq element (pop list))
(setq key (pop element))
(while (setq item (pop element))
- (tramp-set-connection-property key (pop item) (car item)))))
+ ;; We set only values which are not contained in
+ ;; `tramp-connection-properties'. The cache is
+ ;; initialized properly by side effect.
+ (unless (tramp-connection-property-p key (car item))
+ (tramp-set-connection-property key (pop item) (car item))))))
(setq tramp-cache-data-changed nil))
(file-error
;; Most likely because the file doesn't exist yet. No message.
diff --git a/lisp/net/tramp-cmds.el b/lisp/net/tramp-cmds.el
index 58469b22447..462f0d88367 100644
--- a/lisp/net/tramp-cmds.el
+++ b/lisp/net/tramp-cmds.el
@@ -186,7 +186,7 @@ This includes password cache, file cache, connection cache, buffers."
'tramp-load-report-modules ; pre-hook
'tramp-append-tramp-buffers ; post-hook
- "\
+ (propertize "\n" 'display "\
Enter your bug report in this message, including as much detail
as you possibly can about the problem, what you did to cause it
and what the local and remote machines are.
@@ -209,7 +209,7 @@ contents of the *tramp/foo* buffer and the *debug tramp/foo*
buffer in your bug report.
--bug report follows this line--
-"))))
+")))))
(defun tramp-reporter-dump-variable (varsym mailbuf)
"Pretty-print the value of the variable in symbol VARSYM."
@@ -348,10 +348,10 @@ the debug buffer(s).")
(kill-buffer nil)
(switch-to-buffer curbuf)
(goto-char (point-max))
- (insert "\n\
+ (insert (propertize "\n" 'display "\n\
This is a special notion of the `gnus/message' package. If you
use another mail agent (by copying the contents of this buffer)
-please ensure that the buffers are attached to your email.\n\n")
+please ensure that the buffers are attached to your email.\n\n"))
(dolist (buffer buffer-list)
(tramp-compat-funcall
'mml-insert-empty-tag 'part 'type "text/plain"
diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el
index ae91dc35b71..d4115352b34 100644
--- a/lisp/net/tramp-compat.el
+++ b/lisp/net/tramp-compat.el
@@ -52,6 +52,7 @@
(require 'format-spec)
(require 'shell)
+ (require 'trampver)
(require 'tramp-loaddefs)
;; As long as password.el is not part of (X)Emacs, it shouldn't be
@@ -71,22 +72,6 @@
(require 'timer-funcs)
(require 'timer))
- ;; We check whether `start-file-process' is bound.
- ;; Note: we deactivate this. There are problems, at least in SXEmacs.
- (unless t;(fboundp 'start-file-process)
-
- ;; tramp-util offers integration into other (X)Emacs packages like
- ;; compile.el, gud.el etc. Not necessary in Emacs 23.
- (eval-after-load "tramp"
- '(require 'tramp-util))
-
- ;; Make sure that we get integration with the VC package. When it
- ;; is loaded, we need to pull in the integration module. Not
- ;; necessary in Emacs 23.
- (eval-after-load "vc"
- (eval-after-load "tramp"
- '(require 'tramp-vc))))
-
;; Avoid byte-compiler warnings if the byte-compiler supports this.
;; Currently, XEmacs supports this.
(when (featurep 'xemacs)
@@ -112,7 +97,8 @@
;; `remote-file-name-inhibit-cache' has been introduced with Emacs 24.1.
;; Besides `t', `nil', and integer, we use also timestamps (as
;; returned by `current-time') internally.
- (defvar remote-file-name-inhibit-cache nil)
+ (unless (boundp 'remote-file-name-inhibit-cache)
+ (defvar remote-file-name-inhibit-cache nil))
;; For not existing functions, or functions with a changed argument
;; list, there are compiler warnings. We want to avoid them in
@@ -132,9 +118,7 @@
;; mechanism.
;; `file-remote-p' has been introduced with Emacs 22. The version
- ;; of XEmacs is not a magic file name function (yet); this is
- ;; corrected in tramp-util.el. Here it is sufficient if the
- ;; function exists.
+ ;; of XEmacs is not a magic file name function (yet).
(unless (fboundp 'file-remote-p)
(defalias 'file-remote-p
(lambda (file &optional identification connected)
@@ -322,16 +306,17 @@ Not actually used. Use `(format \"%o\" i)' instead?"
(wrong-number-of-arguments (file-attributes filename))))))
;; PRESERVE-UID-GID does not exist in XEmacs.
-;; PRESERVE-SELINUX-CONTEXT has been introduced with Emacs 24.1.
+;; PRESERVE-EXTENDED-ATTRIBUTES has been introduced with Emacs 24.1
+;; (as PRESERVE-SELINUX-CONTEXT), and renamed in Emacs 24.3.
(defun tramp-compat-copy-file
(filename newname &optional ok-if-already-exists keep-date
- preserve-uid-gid preserve-selinux-context)
+ preserve-uid-gid preserve-extended-attributes)
"Like `copy-file' for Tramp files (compat function)."
(cond
- (preserve-selinux-context
+ (preserve-extended-attributes
(tramp-compat-funcall
'copy-file filename newname ok-if-already-exists keep-date
- preserve-uid-gid preserve-selinux-context))
+ preserve-uid-gid preserve-extended-attributes))
(preserve-uid-gid
(tramp-compat-funcall
'copy-file filename newname ok-if-already-exists keep-date
@@ -399,25 +384,30 @@ Not actually used. Use `(format \"%o\" i)' instead?"
trash)))
(delete-file filename)))))
-;; RECURSIVE has been introduced with Emacs 23.2.
-(defun tramp-compat-delete-directory (directory &optional recursive)
+;; RECURSIVE has been introduced with Emacs 23.2. TRASH has been
+;; introduced with Emacs 24.1.
+(defun tramp-compat-delete-directory (directory &optional recursive trash)
"Like `delete-directory' for Tramp files (compat function)."
- (if (null recursive)
- (delete-directory directory)
- (condition-case nil
- (tramp-compat-funcall 'delete-directory directory recursive)
- ;; This Emacs version does not support the RECURSIVE flag. We
- ;; use the implementation from Emacs 23.2.
- (wrong-number-of-arguments
- (setq directory (directory-file-name (expand-file-name directory)))
- (if (not (file-symlink-p directory))
- (mapc (lambda (file)
- (if (eq t (car (file-attributes file)))
- (tramp-compat-delete-directory file recursive)
- (delete-file file)))
- (directory-files
- directory 'full "^\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*")))
- (delete-directory directory)))))
+ (condition-case nil
+ (cond
+ (trash
+ (tramp-compat-funcall 'delete-directory directory recursive trash))
+ (recursive
+ (tramp-compat-funcall 'delete-directory directory recursive))
+ (t
+ (delete-directory directory)))
+ ;; This Emacs version does not support the RECURSIVE or TRASH flag. We
+ ;; use the implementation from Emacs 23.2.
+ (wrong-number-of-arguments
+ (setq directory (directory-file-name (expand-file-name directory)))
+ (if (not (file-symlink-p directory))
+ (mapc (lambda (file)
+ (if (eq t (car (file-attributes file)))
+ (tramp-compat-delete-directory file recursive trash)
+ (tramp-compat-delete-file file trash)))
+ (directory-files
+ directory 'full "^\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*")))
+ (delete-directory directory))))
;; `number-sequence' does not exist in XEmacs. Implementation is
;; taken from Emacs 23.
@@ -448,20 +438,6 @@ This is, the first, empty, element is omitted. In XEmacs, the first
element is not omitted."
(delete "" (split-string string pattern)))
-(defun tramp-compat-call-process
- (program &optional infile destination display &rest args)
- "Calls `call-process' on the local host.
-This is needed because for some Emacs flavors Tramp has
-defadvised `call-process' to behave like `process-file'. The
-Lisp error raised when PROGRAM is nil is trapped also, returning 1."
- (let ((default-directory
- (if (file-remote-p default-directory)
- (tramp-compat-temporary-file-directory)
- default-directory)))
- (if (executable-find program)
- (apply 'call-process program infile destination display args)
- 1)))
-
(defun tramp-compat-process-running-p (process-name)
"Returns `t' if system process PROCESS-NAME is running for `user-login-name'."
(when (stringp process-name)
@@ -543,6 +519,11 @@ EOL-TYPE can be one of `dos', `unix', or `mac'."
"`dos', `unix', or `mac'")))))
(t (error "Can't change EOL conversion -- is MULE missing?"))))
+;; `user-error' has been added to Emacs 24.3.
+(defun tramp-compat-user-error (format &rest args)
+ "Signal a pilot error."
+ (apply (if (fboundp 'user-error) 'user-error 'error) format args))
+
(add-hook 'tramp-unload-hook
(lambda ()
(unload-feature 'tramp-compat 'force)))
diff --git a/lisp/net/tramp-ftp.el b/lisp/net/tramp-ftp.el
index d4e246da2f0..7d266d4d172 100644
--- a/lisp/net/tramp-ftp.el
+++ b/lisp/net/tramp-ftp.el
@@ -200,6 +200,8 @@ pass to the OPERATION."
(inhibit-file-name-operation operation))
(apply 'ange-ftp-hook-function operation args)))))))
+;; It must be a `defsubst' in order to push the whole code into
+;; tramp-loaddefs.el. Otherwise, there would be recursive autoloading.
;;;###tramp-autoload
(defsubst tramp-ftp-file-name-p (filename)
"Check if it's a filename that should be forwarded to Ange-FTP."
diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el
index 7dbd073a8f9..7c3b393873c 100644
--- a/lisp/net/tramp-gvfs.el
+++ b/lisp/net/tramp-gvfs.el
@@ -24,24 +24,28 @@
;;; Commentary:
;; Access functions for the GVFS daemon from Tramp. Tested with GVFS
-;; 1.0.2 (Ubuntu 8.10, Gnome 2.24). It has been reported also to run
+;; 1.0 (Ubuntu 8.10, Gnome 2.24). It has been reported also to run
;; with GVFS 0.2.5 (Ubuntu 8.04, Gnome 2.22), but there is an
;; incompatibility with the mount_info structure, which has been
;; worked around.
-;; It has also been tested with GVFS 1.6.2 (Ubuntu 10.04, Gnome 2.30),
+;; It has also been tested with GVFS 1.6 (Ubuntu 10.04, Gnome 2.30),
;; where the default_location has been added to mount_info (see
;; <https://bugzilla.gnome.org/show_bug.cgi?id=561998>.
+;; With GVFS 1.14 (Ubuntu 12.10, Gnome 3.6) the interfaces have been
+;; changed, again. So we must introspect the D-Bus interfaces.
+
;; All actions to mount a remote location, and to retrieve mount
;; information, are performed by D-Bus messages. File operations
;; themselves are performed via the mounted filesystem in ~/.gvfs.
;; Consequently, GNU Emacs 23.1 with enabled D-Bus bindings is a
;; precondition.
-;; The GVFS D-Bus interface is said to be unstable. There are even no
-;; introspection data. The interface, as discovered during
-;; development time, is given in respective comments.
+;; The GVFS D-Bus interface is said to be unstable. There were even
+;; no introspection data before GVFS 1.14. The interface, as
+;; discovered during development time, is given in respective
+;; comments.
;; The customer option `tramp-gvfs-methods' contains the list of
;; supported connection methods. Per default, these are "dav",
@@ -147,8 +151,9 @@
;; Emacs 23 on some system types. We don't call `dbus-ping', because
;; this would load dbus.el.
(unless (and (tramp-compat-funcall 'dbus-get-unique-name :session)
- (tramp-compat-process-running-p "gvfs-fuse-daemon"))
- (error "Package `tramp-gvfs' not supported"))
+ (or (tramp-compat-process-running-p "gvfs-fuse-daemon")
+ (tramp-compat-process-running-p "gvfsd-fuse")))
+ (tramp-compat-user-error "Package `tramp-gvfs' not supported"))
(defconst tramp-gvfs-path-mounttracker "/org/gtk/vfs/mounttracker"
"The object path of the GVFS daemon.")
@@ -156,6 +161,35 @@
(defconst tramp-gvfs-interface-mounttracker "org.gtk.vfs.MountTracker"
"The mount tracking interface in the GVFS daemon.")
+;; Introspection data exist since GVFS 1.14. If there are no such
+;; data, we expect an earlier interface.
+(defconst tramp-gvfs-methods-mounttracker
+ (dbus-introspect-get-method-names
+ :session tramp-gvfs-service-daemon tramp-gvfs-path-mounttracker
+ tramp-gvfs-interface-mounttracker)
+ "The list of supported methods of the mount tracking interface.")
+
+(defconst tramp-gvfs-listmounts
+ (if (member "ListMounts" tramp-gvfs-methods-mounttracker)
+ "ListMounts"
+ "listMounts")
+ "The name of the \"listMounts\" method.
+It has been changed in GVFS 1.14.")
+
+(defconst tramp-gvfs-mountlocation
+ (if (member "MountLocation" tramp-gvfs-methods-mounttracker)
+ "MountLocation"
+ "mountLocation")
+ "The name of the \"mountLocation\" method.
+It has been changed in GVFS 1.14.")
+
+(defconst tramp-gvfs-mountlocation-signature
+ (dbus-introspect-get-signature
+ :session tramp-gvfs-service-daemon tramp-gvfs-path-mounttracker
+ tramp-gvfs-interface-mounttracker tramp-gvfs-mountlocation)
+ "The D-Bus signature of the \"mountLocation\" method.
+It has been changed in GVFS 1.14.")
+
;; <interface name='org.gtk.vfs.MountTracker'>
;; <method name='listMounts'>
;; <arg name='mount_info_list'
@@ -376,21 +410,22 @@ Every entry is a list (NAME ADDRESS).")
(delete-file . tramp-gvfs-handle-delete-file)
;; `diff-latest-backup-file' performed by default handler.
(directory-file-name . tramp-handle-directory-file-name)
- (directory-files . tramp-gvfs-handle-directory-files)
+ (directory-files . tramp-handle-directory-files)
(directory-files-and-attributes
- . tramp-gvfs-handle-directory-files-and-attributes)
+ . tramp-handle-directory-files-and-attributes)
(dired-call-process . ignore)
(dired-compress-file . ignore)
(dired-uncache . tramp-handle-dired-uncache)
;; `executable-find' is not official yet. performed by default handler.
(expand-file-name . tramp-gvfs-handle-expand-file-name)
- ;; `file-accessible-directory-p' performed by default handler.
+ (file-accessible-directory-p . tramp-handle-file-accessible-directory-p)
+ (file-acl . ignore)
(file-attributes . tramp-gvfs-handle-file-attributes)
(file-directory-p . tramp-gvfs-handle-file-directory-p)
(file-executable-p . tramp-gvfs-handle-file-executable-p)
- (file-exists-p . tramp-gvfs-handle-file-exists-p)
+ (file-exists-p . tramp-handle-file-exists-p)
(file-local-copy . tramp-gvfs-handle-file-local-copy)
- ;; `file-modes' performed by default handler.
+ (file-modes . tramp-handle-file-modes)
(file-name-all-completions . tramp-gvfs-handle-file-name-all-completions)
(file-name-as-directory . tramp-handle-file-name-as-directory)
(file-name-completion . tramp-handle-file-name-completion)
@@ -402,7 +437,7 @@ Every entry is a list (NAME ADDRESS).")
(file-readable-p . tramp-gvfs-handle-file-readable-p)
(file-regular-p . tramp-handle-file-regular-p)
(file-remote-p . tramp-handle-file-remote-p)
- (file-selinux-context . tramp-gvfs-handle-file-selinux-context)
+ (file-selinux-context . ignore)
(file-symlink-p . tramp-handle-file-symlink-p)
;; `file-truename' performed by default handler.
(file-writable-p . tramp-gvfs-handle-file-writable-p)
@@ -415,23 +450,25 @@ Every entry is a list (NAME ADDRESS).")
(make-directory . tramp-gvfs-handle-make-directory)
(make-directory-internal . ignore)
(make-symbolic-link . ignore)
- (process-file . tramp-gvfs-handle-process-file)
+ (process-file . ignore)
(rename-file . tramp-gvfs-handle-rename-file)
- (set-file-modes . tramp-gvfs-handle-set-file-modes)
- (set-file-selinux-context . tramp-gvfs-handle-set-file-selinux-context)
+ (set-file-acl . ignore)
+ (set-file-modes . ignore)
+ (set-file-selinux-context . ignore)
(set-visited-file-modtime . tramp-gvfs-handle-set-visited-file-modtime)
- (shell-command . tramp-gvfs-handle-shell-command)
- (start-file-process . tramp-gvfs-handle-start-file-process)
+ (shell-command . ignore)
+ (start-file-process . ignore)
(substitute-in-file-name . tramp-handle-substitute-in-file-name)
(unhandled-file-name-directory . tramp-handle-unhandled-file-name-directory)
(vc-registered . ignore)
- (verify-visited-file-modtime
- . tramp-gvfs-handle-verify-visited-file-modtime)
+ ;; `verify-visited-file-modtime' performed by default handler.
(write-region . tramp-gvfs-handle-write-region)
)
"Alist of handler functions for Tramp GVFS method.
Operations not mentioned here will be handled by the default Emacs primitives.")
+;; It must be a `defsubst' in order to push the whole code into
+;; tramp-loaddefs.el. Otherwise, there would be recursive autoloading.
;;;###tramp-autoload
(defsubst tramp-gvfs-file-name-p (filename)
"Check if it's a filename handled by the GVFS daemon."
@@ -457,11 +494,30 @@ pass to the OPERATION."
(add-to-list 'tramp-foreign-file-name-handler-alist
(cons 'tramp-gvfs-file-name-p 'tramp-gvfs-file-name-handler)))
+
+;; D-Bus helper function.
+
+(defun tramp-gvfs-dbus-string-to-byte-array (string)
+ "Like `dbus-string-to-byte-array' but add trailing \\0 if needed."
+ (dbus-string-to-byte-array
+ (if (string-match "^(aya{sv})" tramp-gvfs-mountlocation-signature)
+ (concat string (string 0)) string)))
+
+(defun tramp-gvfs-dbus-byte-array-to-string (byte-array)
+ "Like `dbus-byte-array-to-string' but remove trailing \\0 if exists."
+ ;; The byte array could be a variant. Take care.
+ (let ((byte-array
+ (if (and (consp byte-array) (atom (car byte-array)))
+ byte-array (car byte-array))))
+ (dbus-byte-array-to-string
+ (if (and (consp byte-array) (zerop (car (last byte-array))))
+ (butlast byte-array) byte-array))))
+
(defun tramp-gvfs-stringify-dbus-message (message)
"Convert a D-Bus message into readable UTF8 strings, used for traces."
(cond
((and (consp message) (characterp (car message)))
- (format "%S" (dbus-byte-array-to-string message)))
+ (format "%S" (tramp-gvfs-dbus-byte-array-to-string message)))
((consp message)
(mapcar 'tramp-gvfs-stringify-dbus-message message))
((stringp message)
@@ -526,85 +582,104 @@ is no information where to trace the message.")
(tramp-message tramp-gvfs-dbus-event-vector 10 "%S" event)
(tramp-error tramp-gvfs-dbus-event-vector 'file-error "%s" (cadr err))))
-(add-hook 'dbus-event-error-functions 'tramp-gvfs-dbus-event-error)
+;; `dbus-event-error-hooks' has been renamed to `dbus-event-error-functions'.
+(add-hook
+ (if (boundp 'dbus-event-error-functions)
+ 'dbus-event-error-functions 'dbus-event-error-hooks)
+ 'tramp-gvfs-dbus-event-error)
;; File name primitives.
(defun tramp-gvfs-handle-copy-file
(filename newname &optional ok-if-already-exists keep-date
- preserve-uid-gid preserve-selinux-context)
+ preserve-uid-gid preserve-extended-attributes)
"Like `copy-file' for Tramp files."
(with-parsed-tramp-file-name
(if (tramp-tramp-file-p filename) filename newname) nil
- (with-tramp-progress-reporter
- v 0 (format "Copying %s to %s" filename newname)
- (condition-case err
- (let ((args
- (list
- (if (tramp-gvfs-file-name-p filename)
- (tramp-gvfs-fuse-file-name filename)
- filename)
- (if (tramp-gvfs-file-name-p newname)
- (tramp-gvfs-fuse-file-name newname)
- newname)
- ok-if-already-exists keep-date preserve-uid-gid)))
- (when preserve-selinux-context
- (setq args (append args (list preserve-selinux-context))))
- (apply 'copy-file args))
-
- ;; Error case. Let's try it with the GVFS utilities.
- (error
- (tramp-message v 4 "`copy-file' failed, trying `gvfs-copy'")
- (unless
- (zerop
- (let ((args
- (append (if (or keep-date preserve-uid-gid)
- (list "--preserve")
- nil)
- (list
- (tramp-gvfs-url-file-name filename)
- (tramp-gvfs-url-file-name newname)))))
- (apply 'tramp-gvfs-send-command v "gvfs-copy" args)))
- ;; Propagate the error.
- (tramp-error v (car err) "%s" (cdr err)))))))
-
- (when (file-remote-p newname)
- (with-parsed-tramp-file-name newname nil
- (tramp-flush-file-property v (file-name-directory localname))
- (tramp-flush-file-property v localname))))
-
-(defun tramp-gvfs-handle-delete-directory (directory &optional recursive)
+
+ (when (and (not ok-if-already-exists) (file-exists-p newname))
+ (tramp-error
+ v 'file-already-exists "File %s already exists" newname))
+
+ (if (or (and (tramp-tramp-file-p filename)
+ (not (tramp-gvfs-file-name-p filename)))
+ (and (tramp-tramp-file-p newname)
+ (not (tramp-gvfs-file-name-p newname))))
+
+ ;; We cannot copy directly.
+ (let ((tmpfile (tramp-compat-make-temp-file filename)))
+ (cond
+ (preserve-extended-attributes
+ (copy-file
+ filename tmpfile t keep-date preserve-uid-gid
+ preserve-extended-attributes))
+ (preserve-uid-gid
+ (copy-file filename tmpfile t keep-date preserve-uid-gid))
+ (t
+ (copy-file filename tmpfile t keep-date)))
+ (rename-file tmpfile newname ok-if-already-exists))
+
+ ;; Direct copy.
+ (with-tramp-progress-reporter
+ v 0 (format "Copying %s to %s" filename newname)
+ (unless
+ (let ((args
+ (append (if (or keep-date preserve-uid-gid)
+ (list "--preserve")
+ nil)
+ (list
+ (tramp-gvfs-url-file-name filename)
+ (tramp-gvfs-url-file-name newname)))))
+ (apply 'tramp-gvfs-send-command v "gvfs-copy" args))
+ ;; Propagate the error.
+ (with-current-buffer (tramp-get-connection-buffer v)
+ (goto-char (point-min))
+ (tramp-error-with-buffer
+ nil v 'file-error
+ "Copying failed, see buffer `%s' for details." (buffer-name)))))
+
+ (when (file-remote-p newname)
+ (with-parsed-tramp-file-name newname nil
+ (tramp-flush-file-property v (file-name-directory localname))
+ (tramp-flush-file-property v localname))))))
+
+(defun tramp-gvfs-handle-delete-directory (directory &optional recursive trash)
"Like `delete-directory' for Tramp files."
- (tramp-compat-delete-directory
- (tramp-gvfs-fuse-file-name directory) recursive))
+ (when (and recursive (not (file-symlink-p directory)))
+ (mapc (lambda (file)
+ (if (eq t (car (file-attributes file)))
+ (tramp-compat-delete-directory file recursive trash)
+ (tramp-compat-delete-file file trash)))
+ (directory-files
+ directory 'full "^\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*")))
+ (with-parsed-tramp-file-name directory nil
+ (tramp-flush-file-property v (file-name-directory localname))
+ (tramp-flush-directory-property v localname)
+ (unless
+ (tramp-gvfs-send-command
+ v (if (and trash delete-by-moving-to-trash) "gvfs-trash" "gvfs-rm")
+ (tramp-gvfs-url-file-name directory))
+ ;; Propagate the error.
+ (with-current-buffer (tramp-get-connection-buffer v)
+ (goto-char (point-min))
+ (tramp-error-with-buffer
+ nil v 'file-error "Couldn't delete %s" directory)))))
(defun tramp-gvfs-handle-delete-file (filename &optional trash)
"Like `delete-file' for Tramp files."
- (tramp-compat-delete-file (tramp-gvfs-fuse-file-name filename) trash))
-
-(defun tramp-gvfs-handle-directory-files
- (directory &optional full match nosort)
- "Like `directory-files' for Tramp files."
- (let ((fuse-file-name (tramp-gvfs-fuse-file-name directory)))
- (mapcar
- (lambda (x)
- (if (string-match fuse-file-name x)
- (replace-match directory t t x)
- x))
- (directory-files fuse-file-name full match nosort))))
-
-(defun tramp-gvfs-handle-directory-files-and-attributes
- (directory &optional full match nosort id-format)
- "Like `directory-files-and-attributes' for Tramp files."
- (let ((fuse-file-name (tramp-gvfs-fuse-file-name directory)))
- (mapcar
- (lambda (x)
- (when (string-match fuse-file-name (car x))
- (setcar x (replace-match directory t t (car x))))
- x)
- (directory-files-and-attributes
- fuse-file-name full match nosort id-format))))
+ (with-parsed-tramp-file-name filename nil
+ (tramp-flush-file-property v (file-name-directory localname))
+ (tramp-flush-directory-property v localname)
+ (unless
+ (tramp-gvfs-send-command
+ v (if (and trash delete-by-moving-to-trash) "gvfs-trash" "gvfs-rm")
+ (tramp-gvfs-url-file-name filename))
+ ;; Propagate the error.
+ (with-current-buffer (tramp-get-connection-buffer v)
+ (goto-char (point-min))
+ (tramp-error-with-buffer
+ nil v 'file-error "Couldn't delete %s" filename)))))
(defun tramp-gvfs-handle-expand-file-name (name &optional dir)
"Like `expand-file-name' for Tramp files."
@@ -651,19 +726,134 @@ is no information where to trace the message.")
(defun tramp-gvfs-handle-file-attributes (filename &optional id-format)
"Like `file-attributes' for Tramp files."
- (file-attributes (tramp-gvfs-fuse-file-name filename) id-format))
+ (unless id-format (setq id-format 'integer))
+ ;; Don't modify `last-coding-system-used' by accident.
+ (let ((last-coding-system-used last-coding-system-used)
+ dirp res-symlink-target res-numlinks res-uid res-gid res-access
+ res-mod res-change res-size res-filemodes res-inode res-device)
+ (with-parsed-tramp-file-name filename nil
+ (with-tramp-file-property
+ v localname (format "file-attributes-%s" id-format)
+ (tramp-message v 5 "file attributes: %s" localname)
+ (tramp-gvfs-send-command
+ v "gvfs-info" (tramp-gvfs-url-file-name filename))
+ ;; Parse output ...
+ (with-current-buffer (tramp-get-connection-buffer v)
+ (goto-char (point-min))
+ (when (re-search-forward "attributes:" nil t)
+ ;; ... directory or symlink
+ (goto-char (point-min))
+ (setq dirp (if (re-search-forward "type:\\s-+directory" nil t) t))
+ (goto-char (point-min))
+ (setq res-symlink-target
+ (if (re-search-forward
+ "standard::symlink-target:\\s-+\\(\\S-+\\)" nil t)
+ (match-string 1)))
+ ;; ... number links
+ (goto-char (point-min))
+ (setq res-numlinks
+ (if (re-search-forward "unix::nlink:\\s-+\\([0-9]+\\)" nil t)
+ (string-to-number (match-string 1)) 0))
+ ;; ... uid and gid
+ (goto-char (point-min))
+ (setq res-uid
+ (or (if (eq id-format 'integer)
+ (if (re-search-forward
+ "unix::uid:\\s-+\\([0-9]+\\)" nil t)
+ (string-to-number (match-string 1)))
+ (if (re-search-forward
+ "owner::user:\\s-+\\(\\S-+\\)" nil t)
+ (match-string 1)))
+ (tramp-get-local-uid id-format)))
+ (setq res-gid
+ (or (if (eq id-format 'integer)
+ (if (re-search-forward
+ "unix::gid:\\s-+\\([0-9]+\\)" nil t)
+ (string-to-number (match-string 1)))
+ (if (re-search-forward
+ "owner::group:\\s-+\\(\\S-+\\)" nil t)
+ (match-string 1)))
+ (tramp-get-local-gid id-format)))
+ ;; ... last access, modification and change time
+ (goto-char (point-min))
+ (setq res-access
+ (if (re-search-forward
+ "time::access:\\s-+\\([0-9]+\\)" nil t)
+ (seconds-to-time (string-to-number (match-string 1)))
+ '(0 0)))
+ (goto-char (point-min))
+ (setq res-mod
+ (if (re-search-forward
+ "time::modified:\\s-+\\([0-9]+\\)" nil t)
+ (seconds-to-time (string-to-number (match-string 1)))
+ '(0 0)))
+ (goto-char (point-min))
+ (setq res-change
+ (if (re-search-forward
+ "time::changed:\\s-+\\([0-9]+\\)" nil t)
+ (seconds-to-time (string-to-number (match-string 1)))
+ '(0 0)))
+ ;; ... size
+ (goto-char (point-min))
+ (setq res-size
+ (if (re-search-forward
+ "standard::size:\\s-+\\([0-9]+\\)" nil t)
+ (string-to-number (match-string 1)) 0))
+ ;; ... file mode flags
+ (goto-char (point-min))
+ (setq res-filemodes
+ (if (re-search-forward "unix::mode:\\s-+\\([0-9]+\\)" nil t)
+ (tramp-file-mode-from-int (match-string 1))
+ (if dirp "drwx------" "-rwx------")))
+ ;; ... inode and device
+ (goto-char (point-min))
+ (setq res-inode
+ (if (re-search-forward "unix::inode:\\s-+\\([0-9]+\\)" nil t)
+ (string-to-number (match-string 1))
+ (tramp-get-inode v)))
+ (goto-char (point-min))
+ (setq res-device
+ (if (re-search-forward "unix::device:\\s-+\\([0-9]+\\)" nil t)
+ (string-to-number (match-string 1))
+ (tramp-get-device v)))
+
+ ;; Return data gathered.
+ (list
+ ;; 0. t for directory, string (name linked to) for
+ ;; symbolic link, or nil.
+ (or dirp res-symlink-target)
+ ;; 1. Number of links to file.
+ res-numlinks
+ ;; 2. File uid.
+ res-uid
+ ;; 3. File gid.
+ res-gid
+ ;; 4. Last access time, as a list of integers.
+ ;; 5. Last modification time, likewise.
+ ;; 6. Last status change time, likewise.
+ res-access res-mod res-change
+ ;; 7. Size in bytes (-1, if number is out of range).
+ res-size
+ ;; 8. File modes.
+ res-filemodes
+ ;; 9. t if file's gid would change if file were deleted
+ ;; and recreated.
+ nil
+ ;; 10. Inode number.
+ res-inode
+ ;; 11. Device number.
+ res-device
+ )))))))
(defun tramp-gvfs-handle-file-directory-p (filename)
"Like `file-directory-p' for Tramp files."
- (file-directory-p (tramp-gvfs-fuse-file-name filename)))
+ (eq t (car (file-attributes filename))))
(defun tramp-gvfs-handle-file-executable-p (filename)
"Like `file-executable-p' for Tramp files."
- (file-executable-p (tramp-gvfs-fuse-file-name filename)))
-
-(defun tramp-gvfs-handle-file-exists-p (filename)
- "Like `file-exists-p' for Tramp files."
- (file-exists-p (tramp-gvfs-fuse-file-name filename)))
+ (with-parsed-tramp-file-name filename nil
+ (with-tramp-file-property v localname "file-executable-p"
+ (tramp-check-cached-permissions v ?x))))
(defun tramp-gvfs-handle-file-local-copy (filename)
"Like `file-local-copy' for Tramp files."
@@ -679,153 +869,221 @@ is no information where to trace the message.")
(defun tramp-gvfs-handle-file-name-all-completions (filename directory)
"Like `file-name-all-completions' for Tramp files."
(unless (save-match-data (string-match "/" filename))
- (file-name-all-completions filename (tramp-gvfs-fuse-file-name directory))))
+ (with-parsed-tramp-file-name (expand-file-name directory) nil
+
+ (all-completions
+ filename
+ (mapcar
+ 'list
+ (or
+ ;; Try cache entries for filename, filename with last
+ ;; character removed, filename with last two characters
+ ;; removed, ..., and finally the empty string - all
+ ;; concatenated to the local directory name.
+ (let ((remote-file-name-inhibit-cache
+ (or remote-file-name-inhibit-cache
+ tramp-completion-reread-directory-timeout)))
+
+ ;; This is inefficient for very long filenames, pity
+ ;; `reduce' is not available...
+ (car
+ (apply
+ 'append
+ (mapcar
+ (lambda (x)
+ (let ((cache-hit
+ (tramp-get-file-property
+ v
+ (concat localname (substring filename 0 x))
+ "file-name-all-completions"
+ nil)))
+ (when cache-hit (list cache-hit))))
+ ;; We cannot use a length of 0, because file properties
+ ;; for "foo" and "foo/" are identical.
+ (tramp-compat-number-sequence (length filename) 1 -1)))))
+
+ ;; Cache expired or no matching cache entry found so we need
+ ;; to perform a remote operation.
+ (let ((result '("." ".."))
+ entry)
+ ;; Get a list of directories and files.
+ (tramp-gvfs-send-command
+ v "gvfs-ls" (tramp-gvfs-url-file-name directory))
+
+ ;; Now grab the output.
+ (with-temp-buffer
+ (insert-buffer-substring (tramp-get-connection-buffer v))
+ (goto-char (point-max))
+ (while (zerop (forward-line -1))
+ (setq entry (buffer-substring (point) (point-at-eol)))
+ (when (string-match filename entry)
+ (if (file-directory-p (expand-file-name entry directory))
+ (push (concat entry "/") result)
+ (push entry result)))))
+
+ ;; Because the remote op went through OK we know the
+ ;; directory we `cd'-ed to exists.
+ (tramp-set-file-property v localname "file-exists-p" t)
+
+ ;; Because the remote op went through OK we know every
+ ;; file listed by `ls' exists.
+ (mapc (lambda (entry)
+ (tramp-set-file-property
+ v (concat localname entry) "file-exists-p" t))
+ result)
+
+ ;; Store result in the cache.
+ (tramp-set-file-property
+ v (concat localname filename)
+ "file-name-all-completions" result))))))))
(defun tramp-gvfs-handle-file-readable-p (filename)
"Like `file-readable-p' for Tramp files."
- (file-readable-p (tramp-gvfs-fuse-file-name filename)))
-
-(defun tramp-gvfs-handle-file-selinux-context (filename)
- "Like `file-selinux-context' for Tramp files."
- (tramp-compat-funcall
- 'file-selinux-context (tramp-gvfs-fuse-file-name filename)))
+ (with-parsed-tramp-file-name filename nil
+ (with-tramp-file-property v localname "file-executable-p"
+ (tramp-check-cached-permissions v ?r))))
(defun tramp-gvfs-handle-file-writable-p (filename)
"Like `file-writable-p' for Tramp files."
- (file-writable-p (tramp-gvfs-fuse-file-name filename)))
+ (with-parsed-tramp-file-name filename nil
+ (with-tramp-file-property v localname "file-writable-p"
+ (if (file-exists-p filename)
+ (tramp-check-cached-permissions v ?w)
+ ;; If file doesn't exist, check if directory is writable.
+ (and (file-directory-p (file-name-directory filename))
+ (file-writable-p (file-name-directory filename)))))))
(defun tramp-gvfs-handle-insert-directory
(filename switches &optional wildcard full-directory-p)
"Like `insert-directory' for Tramp files."
- (insert-directory
- (tramp-gvfs-fuse-file-name filename) switches wildcard full-directory-p))
+ ;; gvfs-* output is hard to parse. So we let `ls-lisp' do the job.
+ (with-parsed-tramp-file-name (expand-file-name filename) nil
+ (with-tramp-progress-reporter v 0 (format "Opening directory %s" filename)
+ (require 'ls-lisp)
+ (let (ls-lisp-use-insert-directory-program)
+ (tramp-run-real-handler
+ 'insert-directory
+ (list filename switches wildcard full-directory-p))))))
(defun tramp-gvfs-handle-insert-file-contents
(filename &optional visit beg end replace)
"Like `insert-file-contents' for Tramp files."
- (unwind-protect
- (let ((fuse-file-name (tramp-gvfs-fuse-file-name filename))
- (result
- (insert-file-contents
- (tramp-gvfs-fuse-file-name filename) visit beg end replace)))
- (when (string-match fuse-file-name (car result))
- (setcar result (replace-match filename t t (car result))))
- result)
- (setq buffer-file-name filename)))
+ (barf-if-buffer-read-only)
+ (setq filename (expand-file-name filename))
+ (let (tmpfile result)
+ (unwind-protect
+ (if (not (file-exists-p filename))
+ ;; We don't raise a Tramp error, because it might be
+ ;; suppressed, like in `find-file-noselect-1'.
+ (signal 'file-error (list "File not found on remote host" filename))
+
+ (setq tmpfile (file-local-copy filename)
+ result (insert-file-contents tmpfile visit beg end replace)))
+ ;; Save exit.
+ (when visit
+ (setq buffer-file-name filename)
+ (setq buffer-read-only (not (file-writable-p filename)))
+ (set-visited-file-modtime)
+ (set-buffer-modified-p nil))
+ (when (stringp tmpfile)
+ (delete-file tmpfile)))
+
+ ;; Result.
+ (list filename (cadr result))))
(defun tramp-gvfs-handle-make-directory (dir &optional parents)
"Like `make-directory' for Tramp files."
(with-parsed-tramp-file-name dir nil
- (condition-case err
- (with-tramp-gvfs-error-message dir 'make-directory
- (tramp-gvfs-fuse-file-name dir) parents)
-
- ;; Error case. Let's try it with the GVFS utilities.
- (error
- (tramp-message v 4 "`make-directory' failed, trying `gvfs-mkdir'")
- (unless
- (zerop
- (tramp-gvfs-send-command
- v "gvfs-mkdir" (tramp-gvfs-url-file-name dir)))
- ;; Propagate the error.
- (tramp-error v (car err) "%s" (cdr err)))))))
-
-(defun tramp-gvfs-handle-process-file
- (program &optional infile destination display &rest args)
- "Like `process-file' for Tramp files."
- (let ((default-directory (tramp-gvfs-fuse-file-name default-directory)))
- (apply 'call-process program infile destination display args)))
+ (unless
+ (apply
+ 'tramp-gvfs-send-command v "gvfs-mkdir"
+ (if parents
+ (list "-p" (tramp-gvfs-url-file-name dir))
+ (list (tramp-gvfs-url-file-name dir))))
+ ;; Propagate the error.
+ (tramp-error v 'file-error "Couldn't make directory %s" dir))))
(defun tramp-gvfs-handle-rename-file
(filename newname &optional ok-if-already-exists)
"Like `rename-file' for Tramp files."
(with-parsed-tramp-file-name
(if (tramp-tramp-file-p filename) filename newname) nil
- (with-tramp-progress-reporter
- v 0 (format "Renaming %s to %s" filename newname)
- (condition-case err
- (rename-file
- (if (tramp-gvfs-file-name-p filename)
- (tramp-gvfs-fuse-file-name filename)
- filename)
- (if (tramp-gvfs-file-name-p newname)
- (tramp-gvfs-fuse-file-name newname)
- newname)
- ok-if-already-exists)
-
- ;; Error case. Let's try it with the GVFS utilities.
- (error
- (tramp-message v 4 "`rename-file' failed, trying `gvfs-move'")
- (unless
- (zerop
- (tramp-gvfs-send-command
- v "gvfs-move"
- (tramp-gvfs-url-file-name filename)
- (tramp-gvfs-url-file-name newname)))
- ;; Propagate the error.
- (tramp-error v (car err) "%s" (cdr err)))))))
-
- (when (file-remote-p filename)
- (with-parsed-tramp-file-name filename nil
- (tramp-flush-file-property v (file-name-directory localname))
- (tramp-flush-file-property v localname)))
- (when (file-remote-p newname)
- (with-parsed-tramp-file-name newname nil
- (tramp-flush-file-property v (file-name-directory localname))
- (tramp-flush-file-property v localname))))
+ (when (and (not ok-if-already-exists) (file-exists-p newname))
+ (tramp-error
+ v 'file-already-exists "File %s already exists" newname))
-(defun tramp-gvfs-handle-set-file-modes (filename mode)
- "Like `set-file-modes' for Tramp files."
- (with-tramp-gvfs-error-message filename 'set-file-modes
- (tramp-gvfs-fuse-file-name filename) mode))
+ (if (or (and (tramp-tramp-file-p filename)
+ (not (tramp-gvfs-file-name-p filename)))
+ (and (tramp-tramp-file-p newname)
+ (not (tramp-gvfs-file-name-p newname))))
-(defun tramp-gvfs-handle-set-file-selinux-context (filename context)
- "Like `set-file-selinux-context' for Tramp files."
- (with-tramp-gvfs-error-message filename 'set-file-selinux-context
- (tramp-gvfs-fuse-file-name filename) context))
+ ;; We cannot move directly.
+ (let ((tmpfile (tramp-compat-make-temp-file filename)))
+ (rename-file filename tmpfile t)
+ (rename-file tmpfile newname ok-if-already-exists))
+
+ ;; Direct move.
+ (with-tramp-progress-reporter
+ v 0 (format "Renaming %s to %s" filename newname)
+ (unless
+ (tramp-gvfs-send-command
+ v "gvfs-move"
+ (tramp-gvfs-url-file-name filename)
+ (tramp-gvfs-url-file-name newname))
+ ;; Propagate the error.
+ (with-current-buffer (tramp-get-buffer v)
+ (goto-char (point-min))
+ (tramp-error-with-buffer
+ nil v 'file-error
+ "Renaming failed, see buffer `%s' for details." (buffer-name)))))
+
+ (when (file-remote-p filename)
+ (with-parsed-tramp-file-name filename nil
+ (tramp-flush-file-property v (file-name-directory localname))
+ (tramp-flush-file-property v localname)))
+
+ (when (file-remote-p newname)
+ (with-parsed-tramp-file-name newname nil
+ (tramp-flush-file-property v (file-name-directory localname))
+ (tramp-flush-file-property v localname))))))
(defun tramp-gvfs-handle-set-visited-file-modtime (&optional time-list)
"Like `set-visited-file-modtime' for Tramp files."
- (let ((buffer-file-name (tramp-gvfs-fuse-file-name (buffer-file-name))))
- (set-visited-file-modtime time-list)))
-
-(defun tramp-gvfs-handle-shell-command
- (command &optional output-buffer error-buffer)
- "Like `shell-command' for Tramp files."
- (let ((default-directory (tramp-gvfs-fuse-file-name default-directory)))
- (shell-command command output-buffer error-buffer)))
-
-(defun tramp-gvfs-handle-start-file-process (name buffer program &rest args)
- "Like `start-file-process' for Tramp files."
- (let ((default-directory (tramp-gvfs-fuse-file-name default-directory)))
- (apply 'start-process name buffer program args)))
-
-(defun tramp-gvfs-handle-verify-visited-file-modtime (buf)
- "Like `verify-visited-file-modtime' for Tramp files."
- (with-current-buffer buf
- (let ((buffer-file-name (tramp-gvfs-fuse-file-name (buffer-file-name))))
- (verify-visited-file-modtime buf))))
+ (unless (buffer-file-name)
+ (error "Can't set-visited-file-modtime: buffer `%s' not visiting a file"
+ (buffer-name)))
+ (unless time-list
+ (let ((f (buffer-file-name)))
+ (with-parsed-tramp-file-name f nil
+ (let ((remote-file-name-inhibit-cache t)
+ (attr (file-attributes f)))
+ ;; '(-1 65535) means file doesn't exists yet.
+ (setq time-list (or (nth 5 attr) '(-1 65535)))))))
+ ;; We use '(0 0) as a don't-know value.
+ (unless (not (equal time-list '(0 0)))
+ (tramp-run-real-handler 'set-visited-file-modtime (list time-list))))
(defun tramp-gvfs-handle-write-region
(start end filename &optional append visit lockname confirm)
"Like `write-region' for Tramp files."
(with-parsed-tramp-file-name filename nil
- (condition-case err
- (with-tramp-gvfs-error-message filename 'write-region
- start end (tramp-gvfs-fuse-file-name filename)
- append visit lockname confirm)
-
- ;; Error case. Let's try rename.
- (error
- (let ((tmpfile (tramp-compat-make-temp-file filename)))
- (tramp-message v 4 "`write-region' failed, trying `rename-file'")
- (write-region start end tmpfile)
- (condition-case nil
- (rename-file tmpfile filename)
- (error
- (delete-file tmpfile)
- (tramp-error v (car err) "%s" (cdr err)))))))
+ ;; XEmacs takes a coding system as the seventh argument, not `confirm'.
+ (when (and (not (featurep 'xemacs)) confirm (file-exists-p filename))
+ (unless (y-or-n-p (format "File %s exists; overwrite anyway? " filename))
+ (tramp-error v 'file-error "File not overwritten")))
+
+ (let ((tmpfile (tramp-compat-make-temp-file filename)))
+ (write-region start end tmpfile)
+ (condition-case nil
+ (rename-file tmpfile filename)
+ (error
+ (delete-file tmpfile)
+ (tramp-error
+ v 'file-error "Couldn't write region to `%s'" filename))))
+
+ (tramp-flush-file-property v (file-name-directory localname))
+ (tramp-flush-file-property v localname)
;; Set file modification time.
(when (or (eq visit t) (stringp visit))
@@ -842,19 +1100,27 @@ is no information where to trace the message.")
(defun tramp-gvfs-url-file-name (filename)
"Return FILENAME in URL syntax."
;; "/" must NOT be hexlified.
- (let ((url-unreserved-chars (append '(?/) url-unreserved-chars)))
- (url-recreate-url
- (if (tramp-tramp-file-p filename)
- (with-parsed-tramp-file-name (file-truename filename) nil
- (when (string-match tramp-user-with-domain-regexp user)
- (setq user
- (concat (match-string 2 user) ";" (match-string 2 user))))
- (url-parse-make-urlobj
- method user nil
- (tramp-file-name-real-host v) (tramp-file-name-port v)
- (url-hexify-string localname)))
- (url-parse-make-urlobj
- "file" nil nil nil nil (url-hexify-string (file-truename filename)))))))
+ (let ((url-unreserved-chars (append '(?/) url-unreserved-chars))
+ result)
+ (setq
+ result
+ (url-recreate-url
+ (if (tramp-tramp-file-p filename)
+ (with-parsed-tramp-file-name filename nil
+ (when (and user (string-match tramp-user-with-domain-regexp user))
+ (setq user
+ (concat (match-string 2 user) ";" (match-string 1 user))))
+ (url-parse-make-urlobj
+ method (url-hexify-string user) nil
+ (tramp-file-name-real-host v) (tramp-file-name-port v)
+ (url-hexify-string localname) nil nil t))
+ (url-parse-make-urlobj
+ "file" nil nil nil nil
+ (url-hexify-string (file-truename filename)) nil nil t))))
+ (when (tramp-tramp-file-p filename)
+ (with-parsed-tramp-file-name filename nil
+ (tramp-message v 10 "remote file `%s' is URL `%s'" filename result)))
+ result))
(defun tramp-gvfs-object-path (filename)
"Create a D-Bus object path from FILENAME."
@@ -995,24 +1261,26 @@ ADDRESS can have the form \"xx:xx:xx:xx:xx:xx\" or \"[xx:xx:xx:xx:xx:xx]\"."
;; were changes in the entries, we cannot access dedicated
;; elements.
(while (stringp (car elt)) (setq elt (cdr elt)))
- (let* ((fuse-mountpoint (dbus-byte-array-to-string (cadr elt)))
+ (let* ((fuse-mountpoint (tramp-gvfs-dbus-byte-array-to-string (cadr elt)))
(mount-spec (caddr elt))
- (default-location (dbus-byte-array-to-string (cadddr elt)))
- (method (dbus-byte-array-to-string
+ (default-location (tramp-gvfs-dbus-byte-array-to-string
+ (cadddr elt)))
+ (method (tramp-gvfs-dbus-byte-array-to-string
(cadr (assoc "type" (cadr mount-spec)))))
- (user (dbus-byte-array-to-string
+ (user (tramp-gvfs-dbus-byte-array-to-string
(cadr (assoc "user" (cadr mount-spec)))))
- (domain (dbus-byte-array-to-string
+ (domain (tramp-gvfs-dbus-byte-array-to-string
(cadr (assoc "domain" (cadr mount-spec)))))
- (host (dbus-byte-array-to-string
+ (host (tramp-gvfs-dbus-byte-array-to-string
(cadr (or (assoc "host" (cadr mount-spec))
(assoc "server" (cadr mount-spec))))))
- (port (dbus-byte-array-to-string
+ (port (tramp-gvfs-dbus-byte-array-to-string
(cadr (assoc "port" (cadr mount-spec)))))
- (ssl (dbus-byte-array-to-string
+ (ssl (tramp-gvfs-dbus-byte-array-to-string
(cadr (assoc "ssl" (cadr mount-spec)))))
- (prefix (concat (dbus-byte-array-to-string (car mount-spec))
- (dbus-byte-array-to-string
+ (prefix (concat (tramp-gvfs-dbus-byte-array-to-string
+ (car mount-spec))
+ (tramp-gvfs-dbus-byte-array-to-string
(cadr (assoc "share" (cadr mount-spec)))))))
(when (string-match "^smb" method)
(setq method "smb"))
@@ -1030,7 +1298,7 @@ ADDRESS can have the form \"xx:xx:xx:xx:xx:xx\" or \"[xx:xx:xx:xx:xx:xx]\"."
v 6 "%s %s"
signal-name (tramp-gvfs-stringify-dbus-message mount-info))
(tramp-set-file-property v "/" "list-mounts" 'undef)
- (if (string-equal signal-name "unmounted")
+ (if (string-equal (downcase signal-name) "unmounted")
(tramp-set-file-property v "/" "fuse-mountpoint" nil)
;; Set prefix, mountpoint and location.
(unless (string-equal prefix "/")
@@ -1043,11 +1311,19 @@ ADDRESS can have the form \"xx:xx:xx:xx:xx:xx\" or \"[xx:xx:xx:xx:xx:xx]\"."
:session nil tramp-gvfs-path-mounttracker
tramp-gvfs-interface-mounttracker "mounted"
'tramp-gvfs-handler-mounted-unmounted)
+(dbus-register-signal
+ :session nil tramp-gvfs-path-mounttracker
+ tramp-gvfs-interface-mounttracker "Mounted"
+ 'tramp-gvfs-handler-mounted-unmounted)
(dbus-register-signal
:session nil tramp-gvfs-path-mounttracker
tramp-gvfs-interface-mounttracker "unmounted"
'tramp-gvfs-handler-mounted-unmounted)
+(dbus-register-signal
+ :session nil tramp-gvfs-path-mounttracker
+ tramp-gvfs-interface-mounttracker "Unmounted"
+ 'tramp-gvfs-handler-mounted-unmounted)
(defun tramp-gvfs-connection-mounted-p (vec)
"Check, whether the location is already mounted."
@@ -1059,30 +1335,33 @@ ADDRESS can have the form \"xx:xx:xx:xx:xx:xx\" or \"[xx:xx:xx:xx:xx:xx]\"."
(with-tramp-file-property vec "/" "list-mounts"
(with-tramp-dbus-call-method vec t
:session tramp-gvfs-service-daemon tramp-gvfs-path-mounttracker
- tramp-gvfs-interface-mounttracker "listMounts"))
+ tramp-gvfs-interface-mounttracker tramp-gvfs-listmounts))
nil)
;; Jump over the first elements of the mount info. Since there
;; were changes in the entries, we cannot access dedicated
;; elements.
(while (stringp (car elt)) (setq elt (cdr elt)))
- (let* ((fuse-mountpoint (dbus-byte-array-to-string (cadr elt)))
+ (let* ((fuse-mountpoint (tramp-gvfs-dbus-byte-array-to-string
+ (cadr elt)))
(mount-spec (caddr elt))
- (default-location (dbus-byte-array-to-string (cadddr elt)))
- (method (dbus-byte-array-to-string
+ (default-location (tramp-gvfs-dbus-byte-array-to-string
+ (cadddr elt)))
+ (method (tramp-gvfs-dbus-byte-array-to-string
(cadr (assoc "type" (cadr mount-spec)))))
- (user (dbus-byte-array-to-string
+ (user (tramp-gvfs-dbus-byte-array-to-string
(cadr (assoc "user" (cadr mount-spec)))))
- (domain (dbus-byte-array-to-string
+ (domain (tramp-gvfs-dbus-byte-array-to-string
(cadr (assoc "domain" (cadr mount-spec)))))
- (host (dbus-byte-array-to-string
+ (host (tramp-gvfs-dbus-byte-array-to-string
(cadr (or (assoc "host" (cadr mount-spec))
(assoc "server" (cadr mount-spec))))))
- (port (dbus-byte-array-to-string
+ (port (tramp-gvfs-dbus-byte-array-to-string
(cadr (assoc "port" (cadr mount-spec)))))
- (ssl (dbus-byte-array-to-string
+ (ssl (tramp-gvfs-dbus-byte-array-to-string
(cadr (assoc "ssl" (cadr mount-spec)))))
- (prefix (concat (dbus-byte-array-to-string (car mount-spec))
- (dbus-byte-array-to-string
+ (prefix (concat (tramp-gvfs-dbus-byte-array-to-string
+ (car mount-spec))
+ (tramp-gvfs-dbus-byte-array-to-string
(cadr (assoc "share" (cadr mount-spec)))))))
(when (string-match "^smb" method)
(setq method "smb"))
@@ -1109,6 +1388,14 @@ ADDRESS can have the form \"xx:xx:xx:xx:xx:xx\" or \"[xx:xx:xx:xx:xx:xx]\"."
(tramp-set-file-property vec "/" "default-location" default-location)
(throw 'mounted t)))))))
+(defun tramp-gvfs-mount-spec-entry (key value)
+ "Construct a mount-spec entry to be used in a mount_spec.
+It was \"a(say)\", but has changed to \"a{sv})\"."
+ (if (string-match "^(aya{sv})" tramp-gvfs-mountlocation-signature)
+ (list :dict-entry key
+ (list :variant (tramp-gvfs-dbus-string-to-byte-array value)))
+ (list :struct key (tramp-gvfs-dbus-string-to-byte-array value))))
+
(defun tramp-gvfs-mount-spec (vec)
"Return a mount-spec for \"org.gtk.vfs.MountTracker.mountLocation\"."
(let* ((method (tramp-file-name-method vec))
@@ -1128,38 +1415,32 @@ ADDRESS can have the form \"xx:xx:xx:xx:xx:xx\" or \"[xx:xx:xx:xx:xx:xx]\"."
(cond
((string-equal "smb" method)
(string-match "^/?\\([^/]+\\)" localname)
- `((:struct "type" ,(dbus-string-to-byte-array "smb-share"))
- (:struct "server" ,(dbus-string-to-byte-array host))
- (:struct "share" ,(dbus-string-to-byte-array
- (match-string 1 localname)))))
+ (list (tramp-gvfs-mount-spec-entry "type" "smb-share")
+ (tramp-gvfs-mount-spec-entry "server" host)
+ (tramp-gvfs-mount-spec-entry "share" (match-string 1 localname))))
((string-equal "obex" method)
- `((:struct "type" ,(dbus-string-to-byte-array method))
- (:struct "host" ,(dbus-string-to-byte-array
- (concat "[" (tramp-bluez-address host) "]")))))
+ (list (tramp-gvfs-mount-spec-entry "type" method)
+ (tramp-gvfs-mount-spec-entry
+ "host" (concat "[" (tramp-bluez-address host) "]"))))
((string-match "^dav" method)
- `((:struct "type" ,(dbus-string-to-byte-array "dav"))
- (:struct "host" ,(dbus-string-to-byte-array host))
- (:struct "ssl" ,(dbus-string-to-byte-array ssl))))
+ (list (tramp-gvfs-mount-spec-entry "type" "dav")
+ (tramp-gvfs-mount-spec-entry "host" host)
+ (tramp-gvfs-mount-spec-entry "ssl" ssl)))
(t
- `((:struct "type" ,(dbus-string-to-byte-array method))
- (:struct "host" ,(dbus-string-to-byte-array host)))))))
+ (list (tramp-gvfs-mount-spec-entry "type" method)
+ (tramp-gvfs-mount-spec-entry "host" host))))))
(when user
(add-to-list
- 'mount-spec
- `(:struct "user" ,(dbus-string-to-byte-array user))
- 'append))
+ 'mount-spec (tramp-gvfs-mount-spec-entry "user" user) 'append))
(when domain
(add-to-list
- 'mount-spec
- `(:struct "domain" ,(dbus-string-to-byte-array domain))
- 'append))
+ 'mount-spec (tramp-gvfs-mount-spec-entry "domain" domain) 'append))
(when port
(add-to-list
- 'mount-spec
- `(:struct "port" ,(dbus-string-to-byte-array (number-to-string port)))
+ 'mount-spec (tramp-gvfs-mount-spec-entry "port" (number-to-string port))
'append))
(when (and (string-match "^dav" method)
@@ -1167,7 +1448,7 @@ ADDRESS can have the form \"xx:xx:xx:xx:xx:xx\" or \"[xx:xx:xx:xx:xx:xx]\"."
(setq mount-pref (match-string 0 localname)))
;; Return.
- `(:struct ,(dbus-string-to-byte-array mount-pref) ,mount-spec)))
+ `(:struct ,(tramp-gvfs-dbus-string-to-byte-array mount-pref) ,mount-spec)))
;; Connection functions
@@ -1184,10 +1465,10 @@ connection if a previous connection has died for some reason."
;; For password handling, we need a process bound to the connection
;; buffer. Therefore, we create a dummy process. Maybe there is a
;; better solution?
- (unless (get-buffer-process (tramp-get-buffer vec))
+ (unless (get-buffer-process (tramp-get-connection-buffer vec))
(let ((p (make-network-process
:name (tramp-buffer-name vec)
- :buffer (tramp-get-buffer vec)
+ :buffer (tramp-get-connection-buffer vec)
:server t :host 'local :service t)))
(tramp-compat-set-process-query-on-exit-flag p nil)))
@@ -1195,10 +1476,15 @@ connection if a previous connection has died for some reason."
(let* ((method (tramp-file-name-method vec))
(user (tramp-file-name-user vec))
(host (tramp-file-name-host vec))
+ (localname (tramp-file-name-localname vec))
(object-path
(tramp-gvfs-object-path
(tramp-make-tramp-file-name method user host ""))))
+ (when (and (string-equal method "smb")
+ (string-equal localname "/"))
+ (tramp-error vec 'file-error "Filename must contain a Windows share"))
+
(with-tramp-progress-reporter
vec 3
(if (zerop (length user))
@@ -1214,20 +1500,35 @@ connection if a previous connection has died for some reason."
:session dbus-service-emacs object-path
tramp-gvfs-interface-mountoperation "askPassword"
'tramp-gvfs-handler-askpassword)
+ (dbus-register-method
+ :session dbus-service-emacs object-path
+ tramp-gvfs-interface-mountoperation "AskPassword"
+ 'tramp-gvfs-handler-askpassword)
;; There could be a callback of "askQuestion" when adding fingerprint.
(dbus-register-method
:session dbus-service-emacs object-path
tramp-gvfs-interface-mountoperation "askQuestion"
'tramp-gvfs-handler-askquestion)
+ (dbus-register-method
+ :session dbus-service-emacs object-path
+ tramp-gvfs-interface-mountoperation "AskQuestion"
+ 'tramp-gvfs-handler-askquestion)
;; The call must be asynchronously, because of the "askPassword"
;; or "askQuestion"callbacks.
- (with-tramp-dbus-call-method vec nil
- :session tramp-gvfs-service-daemon tramp-gvfs-path-mounttracker
- tramp-gvfs-interface-mounttracker "mountLocation"
- (tramp-gvfs-mount-spec vec) (dbus-get-unique-name :session)
- :object-path object-path)
+ (if (string-match "(so)$" tramp-gvfs-mountlocation-signature)
+ (with-tramp-dbus-call-method vec nil
+ :session tramp-gvfs-service-daemon tramp-gvfs-path-mounttracker
+ tramp-gvfs-interface-mounttracker tramp-gvfs-mountlocation
+ (tramp-gvfs-mount-spec vec)
+ `(:struct :string ,(dbus-get-unique-name :session)
+ :object-path ,object-path))
+ (with-tramp-dbus-call-method vec nil
+ :session tramp-gvfs-service-daemon tramp-gvfs-path-mounttracker
+ tramp-gvfs-interface-mounttracker tramp-gvfs-mountlocation
+ (tramp-gvfs-mount-spec vec)
+ :string (dbus-get-unique-name :session) :object-path object-path))
;; We must wait, until the mount is applied. This will be
;; indicated by the "mounted" signal, i.e. the "fuse-mountpoint"
@@ -1250,22 +1551,30 @@ connection if a previous connection has died for some reason."
(tramp-get-file-property vec "/" "fuse-mountpoint" "") "/")
(tramp-error vec 'file-error "FUSE mount denied"))
- ;; We set the connection property "started" in order to put the
- ;; remote location into the cache, which is helpful for further
- ;; completion.
- (tramp-set-connection-property vec "started" t)))))
+ ;; In `tramp-check-cached-permissions', the connection
+ ;; properties {uig,gid}-{integer,string} are used. We set
+ ;; them to their local counterparts.
+ (tramp-set-connection-property
+ vec "uid-integer" (tramp-get-local-uid 'integer))
+ (tramp-set-connection-property
+ vec "gid-integer" (tramp-get-local-gid 'integer))
+ (tramp-set-connection-property
+ vec "uid-string" (tramp-get-local-uid 'string))
+ (tramp-set-connection-property
+ vec "gid-string" (tramp-get-local-gid 'string))))))
(defun tramp-gvfs-send-command (vec command &rest args)
"Send the COMMAND with its ARGS to connection VEC.
COMMAND is usually a command from the gvfs-* utilities.
-`call-process' is applied, and its return code is returned."
+`call-process' is applied, and it returns `t' if the return code is zero."
(let (result)
- (with-current-buffer (tramp-get-buffer vec)
+ (with-current-buffer (tramp-get-connection-buffer vec)
+ (tramp-gvfs-maybe-open-connection vec)
(erase-buffer)
(tramp-message vec 6 "%s %s" command (mapconcat 'identity args " "))
- (setq result (apply 'tramp-compat-call-process command nil t nil args))
- (tramp-message vec 6 "%s" (buffer-string))
- result)))
+ (setq result (apply 'tramp-call-process command nil t nil args))
+ (tramp-message vec 6 "\n%s" (buffer-string))
+ (zerop result))))
;; D-Bus BLUEZ functions.
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index 29a6344734f..e45c2cf8511 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -109,69 +109,15 @@ detected as prompt when being sent on echoing hosts, therefore.")
(tramp-copy-keep-date t)))
;;;###tramp-autoload
(add-to-list 'tramp-methods
- '("scp"
- (tramp-login-program "ssh")
- (tramp-login-args (("-l" "%u") ("-p" "%p") ("-e" "none") ("%h")))
- (tramp-async-args (("-q")))
- (tramp-remote-shell "/bin/sh")
- (tramp-remote-shell-args ("-c"))
- (tramp-copy-program "scp")
- (tramp-copy-args (("-P" "%p") ("-p" "%k") ("-q") ("-r")))
- (tramp-copy-keep-date t)
- (tramp-copy-recursive t)
- (tramp-gw-args (("-o" "GlobalKnownHostsFile=/dev/null")
- ("-o" "UserKnownHostsFile=/dev/null")
- ("-o" "StrictHostKeyChecking=no")))
- (tramp-default-port 22)))
-;;;###tramp-autoload
-(add-to-list 'tramp-methods
- '("scp1"
- (tramp-login-program "ssh")
- (tramp-login-args (("-l" "%u") ("-p" "%p")
- ("-1") ("-e" "none") ("%h")))
- (tramp-async-args (("-q")))
- (tramp-remote-shell "/bin/sh")
- (tramp-remote-shell-args ("-c"))
- (tramp-copy-program "scp")
- (tramp-copy-args (("-1") ("-P" "%p") ("-p" "%k") ("-q") ("-r")))
- (tramp-copy-keep-date t)
- (tramp-copy-recursive t)
- (tramp-gw-args (("-o" "GlobalKnownHostsFile=/dev/null")
- ("-o" "UserKnownHostsFile=/dev/null")
- ("-o" "StrictHostKeyChecking=no")))
- (tramp-default-port 22)))
-;;;###tramp-autoload
-(add-to-list 'tramp-methods
- '("scp2"
- (tramp-login-program "ssh")
- (tramp-login-args (("-l" "%u") ("-p" "%p")
- ("-2") ("-e" "none") ("%h")))
- (tramp-async-args (("-q")))
- (tramp-remote-shell "/bin/sh")
- (tramp-remote-shell-args ("-c"))
- (tramp-copy-program "scp")
- (tramp-copy-args (("-2") ("-P" "%p") ("-p" "%k") ("-q") ("-r")))
- (tramp-copy-keep-date t)
- (tramp-copy-recursive t)
- (tramp-gw-args (("-o" "GlobalKnownHostsFile=/dev/null")
- ("-o" "UserKnownHostsFile=/dev/null")
- ("-o" "StrictHostKeyChecking=no")))
- (tramp-default-port 22)))
-;;;###tramp-autoload
-(add-to-list 'tramp-methods
- '("scpc"
+ '("scp"
(tramp-login-program "ssh")
- (tramp-login-args (("-l" "%u") ("-p" "%p")
- ("-o" "ControlPath=%t.%%r@%%h:%%p")
- ("-o" "ControlMaster=yes")
+ (tramp-login-args (("-l" "%u") ("-p" "%p") ("%c")
("-e" "none") ("%h")))
(tramp-async-args (("-q")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-args ("-c"))
(tramp-copy-program "scp")
- (tramp-copy-args (("-P" "%p") ("-p" "%k") ("-q") ("-r")
- ("-o" "ControlPath=%t.%%r@%%h:%%p")
- ("-o" "ControlMaster=auto")))
+ (tramp-copy-args (("-P" "%p") ("-p" "%k") ("-q") ("-r") ("%c")))
(tramp-copy-keep-date t)
(tramp-copy-recursive t)
(tramp-gw-args (("-o" "GlobalKnownHostsFile=/dev/null")
@@ -182,14 +128,14 @@ detected as prompt when being sent on echoing hosts, therefore.")
(add-to-list 'tramp-methods
'("scpx"
(tramp-login-program "ssh")
- (tramp-login-args (("-l" "%u") ("-p" "%p")
- ("-e" "none") ("-t" "-t")
- ("%h") ("/bin/sh")))
+ (tramp-login-args (("-l" "%u") ("-p" "%p") ("%c")
+ ("-e" "none") ("-t" "-t") ("%h") ("/bin/sh")))
(tramp-async-args (("-q")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-args ("-c"))
(tramp-copy-program "scp")
- (tramp-copy-args (("-P" "%p") ("-p" "%k") ("-q") ("-r")))
+ (tramp-copy-args (("-P" "%p") ("-p" "%k")
+ ("-q") ("-r") ("%c")))
(tramp-copy-keep-date t)
(tramp-copy-recursive t)
(tramp-gw-args (("-o" "GlobalKnownHostsFile=/dev/null")
@@ -200,42 +146,25 @@ detected as prompt when being sent on echoing hosts, therefore.")
(add-to-list 'tramp-methods
'("sftp"
(tramp-login-program "ssh")
- (tramp-login-args (("-l" "%u") ("-p" "%p") ("-e" "none") ("%h")))
+ (tramp-login-args (("-l" "%u") ("-p" "%p") ("%c")
+ ("-e" "none") ("%h")))
(tramp-async-args (("-q")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-args ("-c"))
- (tramp-copy-program "sftp")))
-;;;###tramp-autoload
+ (tramp-copy-program "sftp")
+ (tramp-copy-args ("%c"))))
+ ;;;###tramp-autoload
(add-to-list 'tramp-methods
'("rsync"
(tramp-login-program "ssh")
- (tramp-login-args (("-l" "%u") ("-p" "%p") ("-e" "none") ("%h")))
- (tramp-async-args (("-q")))
- (tramp-remote-shell "/bin/sh")
- (tramp-remote-shell-args ("-c"))
- (tramp-copy-program "rsync")
- (tramp-copy-args (("-e" "ssh") ("-t" "%k") ("-r")))
- (tramp-copy-keep-date t)
- (tramp-copy-keep-tmpfile t)
- (tramp-copy-recursive t)))
-;;;###tramp-autoload
-(add-to-list 'tramp-methods
- `("rsyncc"
- (tramp-login-program "ssh")
- (tramp-login-args (("-l" "%u") ("-p" "%p")
- ("-o" "ControlPath=%t.%%r@%%h:%%p")
- ("-o" "ControlMaster=yes")
+ (tramp-login-args (("-l" "%u") ("-p" "%p") ("%c")
("-e" "none") ("%h")))
(tramp-async-args (("-q")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-args ("-c"))
(tramp-copy-program "rsync")
(tramp-copy-args (("-t" "%k") ("-r")))
- (tramp-copy-env (("RSYNC_RSH")
- (,(concat
- "ssh"
- " -o ControlPath=%t.%%r@%%h:%%p"
- " -o ControlMaster=auto"))))
+ (tramp-copy-env (("RSYNC_RSH") ("ssh" "%c")))
(tramp-copy-keep-date t)
(tramp-copy-keep-tmpfile t)
(tramp-copy-recursive t)))
@@ -257,33 +186,8 @@ detected as prompt when being sent on echoing hosts, therefore.")
(add-to-list 'tramp-methods
'("ssh"
(tramp-login-program "ssh")
- (tramp-login-args (("-l" "%u") ("-p" "%p") ("-e" "none") ("%h")))
- (tramp-async-args (("-q")))
- (tramp-remote-shell "/bin/sh")
- (tramp-remote-shell-args ("-c"))
- (tramp-gw-args (("-o" "GlobalKnownHostsFile=/dev/null")
- ("-o" "UserKnownHostsFile=/dev/null")
- ("-o" "StrictHostKeyChecking=no")))
- (tramp-default-port 22)))
-;;;###tramp-autoload
-(add-to-list 'tramp-methods
- '("ssh1"
- (tramp-login-program "ssh")
- (tramp-login-args (("-l" "%u") ("-p" "%p")
- ("-1") ("-e" "none") ("%h")))
- (tramp-async-args (("-q")))
- (tramp-remote-shell "/bin/sh")
- (tramp-remote-shell-args ("-c"))
- (tramp-gw-args (("-o" "GlobalKnownHostsFile=/dev/null")
- ("-o" "UserKnownHostsFile=/dev/null")
- ("-o" "StrictHostKeyChecking=no")))
- (tramp-default-port 22)))
-;;;###tramp-autoload
-(add-to-list 'tramp-methods
- '("ssh2"
- (tramp-login-program "ssh")
- (tramp-login-args (("-l" "%u") ("-p" "%p")
- ("-2") ("-e" "none") ("%h")))
+ (tramp-login-args (("-l" "%u") ("-p" "%p") ("%c")
+ ("-e" "none") ("%h")))
(tramp-async-args (("-q")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-args ("-c"))
@@ -295,9 +199,8 @@ detected as prompt when being sent on echoing hosts, therefore.")
(add-to-list 'tramp-methods
'("sshx"
(tramp-login-program "ssh")
- (tramp-login-args (("-l" "%u") ("-p" "%p")
- ("-e" "none") ("-t" "-t")
- ("%h") ("/bin/sh")))
+ (tramp-login-args (("-l" "%u") ("-p" "%p") ("%c")
+ ("-e" "none") ("-t" "-t") ("%h") ("/bin/sh")))
(tramp-async-args (("-q")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-args ("-c"))
@@ -351,14 +254,6 @@ detected as prompt when being sent on echoing hosts, therefore.")
(tramp-default-port 22)))
;;;###tramp-autoload
(add-to-list 'tramp-methods
- '("plink1"
- (tramp-login-program "plink")
- (tramp-login-args (("-l" "%u") ("-P" "%p") ("-1" "-ssh") ("%h")))
- (tramp-remote-shell "/bin/sh")
- (tramp-remote-shell-args ("-c"))
- (tramp-default-port 22)))
-;;;###tramp-autoload
-(add-to-list 'tramp-methods
`("plinkx"
(tramp-login-program "plink")
;; ("%h") must be a single element, see
@@ -471,23 +366,12 @@ detected as prompt when being sent on echoing hosts, therefore.")
(tramp-set-completion-function "rcp" tramp-completion-function-alist-rsh)
(tramp-set-completion-function "remcp" tramp-completion-function-alist-rsh)
(tramp-set-completion-function "scp" tramp-completion-function-alist-ssh)
- (tramp-set-completion-function "scp1" tramp-completion-function-alist-ssh)
- (tramp-set-completion-function "scp2" tramp-completion-function-alist-ssh)
- (tramp-set-completion-function "scpc" tramp-completion-function-alist-ssh)
(tramp-set-completion-function "scpx" tramp-completion-function-alist-ssh)
(tramp-set-completion-function "sftp" tramp-completion-function-alist-ssh)
(tramp-set-completion-function "rsync" tramp-completion-function-alist-ssh)
- (tramp-set-completion-function
- "rsyncc" tramp-completion-function-alist-ssh)
(tramp-set-completion-function "rsh" tramp-completion-function-alist-rsh)
(tramp-set-completion-function "remsh" tramp-completion-function-alist-rsh)
(tramp-set-completion-function "ssh" tramp-completion-function-alist-ssh)
- (tramp-set-completion-function "ssh1" tramp-completion-function-alist-ssh)
- (tramp-set-completion-function "ssh2" tramp-completion-function-alist-ssh)
- (tramp-set-completion-function
- "ssh1_old" tramp-completion-function-alist-ssh)
- (tramp-set-completion-function
- "ssh2_old" tramp-completion-function-alist-ssh)
(tramp-set-completion-function "sshx" tramp-completion-function-alist-ssh)
(tramp-set-completion-function
"telnet" tramp-completion-function-alist-telnet)
@@ -498,8 +382,6 @@ detected as prompt when being sent on echoing hosts, therefore.")
"krlogin" tramp-completion-function-alist-rsh)
(tramp-set-completion-function "plink" tramp-completion-function-alist-ssh)
(tramp-set-completion-function
- "plink1" tramp-completion-function-alist-ssh)
- (tramp-set-completion-function
"plinkx" tramp-completion-function-alist-putty)
(tramp-set-completion-function "pscp" tramp-completion-function-alist-ssh)
(tramp-set-completion-function "fcp" tramp-completion-function-alist-ssh)))
@@ -538,8 +420,9 @@ as given in your `~/.profile'."
(const :tag "Private Directories" tramp-own-remote-path)
(string :tag "Directory"))))
+;;;###tramp-autoload
(defcustom tramp-remote-process-environment
- `("HISTFILE=$HOME/.tramp_history" "HISTSIZE=1" "LC_ALL=C"
+ `("HISTFILE=$HOME/.tramp_history" "HISTSIZE=1" "TMOUT=0" "LC_ALL=C"
,(format "TERM=%s" tramp-terminal-type)
"EMACS=t" ;; Deprecated.
,(format "INSIDE_EMACS='%s,tramp:%s'" emacs-version tramp-version)
@@ -884,6 +767,16 @@ while (my $data = <STDIN>) {
Escape sequence %s is replaced with name of Perl binary.
This string is passed to `format', so percent characters need to be doubled.")
+(defconst tramp-perl-pack
+ "%s -e 'binmode STDIN; binmode STDOUT; print pack(q{u*}, join q{}, <>)'"
+ "Perl program to use for encoding a file.
+Escape sequence %s is replaced with name of Perl binary.")
+
+(defconst tramp-perl-unpack
+ "%s -e 'binmode STDIN; binmode STDOUT; print unpack(q{u*}, join q{}, <>)'"
+ "Perl program to use for decoding a file.
+Escape sequence %s is replaced with name of Perl binary.")
+
(defconst tramp-vc-registered-read-file-names
"echo \"(\"
while read file; do
@@ -905,25 +798,6 @@ existence, and file readability. Input shall be read via
here-document, otherwise the command could exceed maximum length
of command line.")
-(defconst tramp-file-mode-type-map
- '((0 . "-") ; Normal file (SVID-v2 and XPG2)
- (1 . "p") ; fifo
- (2 . "c") ; character device
- (3 . "m") ; multiplexed character device (v7)
- (4 . "d") ; directory
- (5 . "?") ; Named special file (XENIX)
- (6 . "b") ; block device
- (7 . "?") ; multiplexed block device (v7)
- (8 . "-") ; regular file
- (9 . "n") ; network special file (HP-UX)
- (10 . "l") ; symlink
- (11 . "?") ; ACL shadow inode (Solaris, not userspace)
- (12 . "s") ; socket
- (13 . "D") ; door special (Solaris)
- (14 . "w")) ; whiteout (BSD)
- "A list of file types returned from the `stat' system call.
-This is used to map a mode number to a permission string.")
-
;; New handlers should be added here. The following operations can be
;; handled using the normal primitives: file-name-sans-versions,
;; get-file-buffer.
@@ -935,6 +809,7 @@ This is used to map a mode number to a permission string.")
(file-name-nondirectory . tramp-handle-file-name-nondirectory)
(file-truename . tramp-sh-handle-file-truename)
(file-exists-p . tramp-sh-handle-file-exists-p)
+ (file-accessible-directory-p . tramp-handle-file-accessible-directory-p)
(file-directory-p . tramp-sh-handle-file-directory-p)
(file-executable-p . tramp-sh-handle-file-executable-p)
(file-readable-p . tramp-sh-handle-file-readable-p)
@@ -985,6 +860,8 @@ This is used to map a mode number to a permission string.")
(verify-visited-file-modtime . tramp-sh-handle-verify-visited-file-modtime)
(file-selinux-context . tramp-sh-handle-file-selinux-context)
(set-file-selinux-context . tramp-sh-handle-set-file-selinux-context)
+ (file-acl . tramp-sh-handle-file-acl)
+ (set-file-acl . tramp-sh-handle-set-file-acl)
(vc-registered . tramp-sh-handle-vc-registered))
"Alist of handler functions.
Operations not mentioned here will be handled by the normal Emacs functions.")
@@ -1327,7 +1204,8 @@ target of the symlink differ."
(let ((f (buffer-file-name))
coding-system-used)
(with-parsed-tramp-file-name f nil
- (let* ((attr (file-attributes f))
+ (let* ((remote-file-name-inhibit-cache t)
+ (attr (file-attributes f))
;; '(-1 65535) means file doesn't exists yet.
(modtime (or (nth 5 attr) '(-1 65535))))
(when (boundp 'last-coding-system-used)
@@ -1431,7 +1309,7 @@ of."
(utc (not (featurep 'xemacs))))
(tramp-send-command-and-check
v (format "%s touch -t %s %s"
- (if utc "TZ=UTC; export TZ;" "")
+ (if utc "env TZ=UTC" "")
(if utc
(format-time-string "%Y%m%d%H%M.%S" time t)
(format-time-string "%Y%m%d%H%M.%S" time))
@@ -1441,7 +1319,7 @@ of."
;; without `set-file-times', this function is an alias for this.
;; We are local, so we don't need the UTC settings.
(zerop
- (tramp-compat-call-process
+ (tramp-call-process
"touch" nil nil nil "-t"
(format-time-string "%Y%m%d%H%M.%S" time)
(tramp-shell-quote-argument filename)))))
@@ -1475,7 +1353,7 @@ be non-negative integers."
;; `set-file-uid-gid'. On W32 "chown" might not work.
(let ((uid (or (and (natnump uid) uid) (tramp-get-local-uid 'integer)))
(gid (or (and (natnump gid) gid) (tramp-get-local-gid 'integer))))
- (tramp-compat-call-process
+ (tramp-call-process
"chown" nil nil nil
(format "%d:%d" uid gid) (tramp-shell-quote-argument filename))))))
@@ -1528,10 +1406,49 @@ be non-negative integers."
(if (stringp (nth 3 context))
(format "--range=%s" (nth 3 context)) "")
(tramp-shell-quote-argument localname))))
- (tramp-set-file-property v localname "file-selinux-context" context)
- (tramp-set-file-property v localname "file-selinux-context" 'undef)))
- ;; We always return nil.
- nil)
+ (progn
+ (tramp-set-file-property v localname "file-selinux-context" context)
+ t)
+ (tramp-set-file-property v localname "file-selinux-context" 'undef)
+ nil)))
+
+(defun tramp-remote-acl-p (vec)
+ "Check, whether ACL is enabled on the remote host."
+ (with-tramp-connection-property (tramp-get-connection-process vec) "acl-p"
+ (tramp-send-command-and-check vec "getfacl /")))
+
+(defun tramp-sh-handle-file-acl (filename)
+ "Like `file-acl' for Tramp files."
+ (with-parsed-tramp-file-name filename nil
+ (with-tramp-file-property v localname "file-acl"
+ (when (and (tramp-remote-acl-p v)
+ (tramp-send-command-and-check
+ v (format
+ "getfacl -ac %s 2>/dev/null"
+ (tramp-shell-quote-argument localname))))
+ (with-current-buffer (tramp-get-connection-buffer v)
+ (goto-char (point-max))
+ (delete-blank-lines)
+ (when (> (point-max) (point-min))
+ (tramp-compat-funcall
+ 'substring-no-properties (buffer-string))))))))
+
+(defun tramp-sh-handle-set-file-acl (filename acl-string)
+ "Like `set-file-acl' for Tramp files."
+ (with-parsed-tramp-file-name (expand-file-name filename) nil
+ (if (and (stringp acl-string) (tramp-remote-acl-p v)
+ (progn
+ (tramp-send-command
+ v (format "setfacl --set-file=- %s <<'EOF'\n%s\nEOF\n"
+ (tramp-shell-quote-argument localname) acl-string))
+ (tramp-send-command-and-check v nil)))
+ ;; Success.
+ (progn
+ (tramp-set-file-property v localname "file-acl" acl-string)
+ t)
+ ;; In case of errors, we return `nil'.
+ (tramp-set-file-property v localname "file-acl-string" 'undef)
+ nil)))
;; Simple functions using the `test' command.
@@ -1617,7 +1534,7 @@ be non-negative integers."
(and (tramp-run-test "-d" (file-name-directory filename))
(tramp-run-test "-w" (file-name-directory filename)))))))
-(defun tramp-sh-handle-file-ownership-preserved-p (filename)
+(defun tramp-sh-handle-file-ownership-preserved-p (filename &optional group)
"Like `file-ownership-preserved-p' for Tramp files."
(with-parsed-tramp-file-name filename nil
(with-tramp-file-property v localname "file-ownership-preserved-p"
@@ -1625,7 +1542,10 @@ be non-negative integers."
;; Return t if the file doesn't exist, since it's true that no
;; information would be lost by an (attempted) delete and create.
(or (null attributes)
- (= (nth 2 attributes) (tramp-get-remote-uid v 'integer)))))))
+ (and
+ (= (nth 2 attributes) (tramp-get-remote-uid v 'integer))
+ (or (not group)
+ (= (nth 3 attributes) (tramp-get-remote-gid v 'integer)))))))))
;; Directory listings.
@@ -1881,7 +1801,7 @@ tramp-sh-handle-file-name-all-completions: internal error accessing `%s': `%s'"
(defun tramp-sh-handle-copy-file
(filename newname &optional ok-if-already-exists keep-date
- preserve-uid-gid preserve-selinux-context)
+ preserve-uid-gid preserve-extended-attributes)
"Like `copy-file' for Tramp files."
(setq filename (expand-file-name filename))
(setq newname (expand-file-name newname))
@@ -1891,13 +1811,13 @@ tramp-sh-handle-file-name-all-completions: internal error accessing `%s': `%s'"
(tramp-tramp-file-p newname))
(tramp-do-copy-or-rename-file
'copy filename newname ok-if-already-exists keep-date
- preserve-uid-gid preserve-selinux-context))
+ preserve-uid-gid preserve-extended-attributes))
;; Compat section.
- (preserve-selinux-context
+ (preserve-extended-attributes
(tramp-run-real-handler
'copy-file
(list filename newname ok-if-already-exists keep-date
- preserve-uid-gid preserve-selinux-context)))
+ preserve-uid-gid preserve-extended-attributes)))
(preserve-uid-gid
(tramp-run-real-handler
'copy-file
@@ -1960,7 +1880,7 @@ tramp-sh-handle-file-name-all-completions: internal error accessing `%s': `%s'"
(defun tramp-do-copy-or-rename-file
(op filename newname &optional ok-if-already-exists keep-date
- preserve-uid-gid preserve-selinux-context)
+ preserve-uid-gid preserve-extended-attributes)
"Copy or rename a remote file.
OP must be `copy' or `rename' and indicates the operation to perform.
FILENAME specifies the file to copy or rename, NEWNAME is the name of
@@ -1969,7 +1889,7 @@ OK-IF-ALREADY-EXISTS means don't barf if NEWNAME exists already.
KEEP-DATE means to make sure that NEWNAME has the same timestamp
as FILENAME. PRESERVE-UID-GID, when non-nil, instructs to keep
the uid and gid if both files are on the same host.
-PRESERVE-SELINUX-CONTEXT activates selinux commands.
+PRESERVE-EXTENDED-ATTRIBUTES activates selinux and acl commands.
This function is invoked by `tramp-sh-handle-copy-file' and
`tramp-sh-handle-rename-file'. It is an error if OP is neither
@@ -1980,8 +1900,8 @@ file names."
(let ((t1 (tramp-tramp-file-p filename))
(t2 (tramp-tramp-file-p newname))
(length (nth 7 (file-attributes (file-truename filename))))
- (context (and preserve-selinux-context
- (apply 'file-selinux-context (list filename))))
+ (attributes (and preserve-extended-attributes
+ (apply 'file-extended-attributes (list filename))))
pr tm)
(with-parsed-tramp-file-name (if t1 filename newname) nil
@@ -2051,8 +1971,11 @@ file names."
;; One of them must be a Tramp file.
(error "Tramp implementation says this cannot happen")))
- ;; Handle `preserve-selinux-context'.
- (when context (apply 'set-file-selinux-context (list newname context)))
+ ;; Handle `preserve-extended-attributes'. We ignore possible
+ ;; errors, because ACL strings could be incompatible.
+ (when attributes
+ (ignore-errors
+ (apply 'set-file-extended-attributes (list newname attributes))))
;; In case of `rename', we must flush the cache of the source file.
(when (and t1 (eq op 'rename))
@@ -2250,7 +2173,7 @@ The method used must be an out-of-band method."
(t2 (tramp-tramp-file-p newname))
(orig-vec (tramp-dissect-file-name (if t1 filename newname)))
copy-program copy-args copy-env copy-keep-date port spec
- source target)
+ options source target)
(with-parsed-tramp-file-name (if t1 filename newname) nil
(if (and t1 t2)
@@ -2318,9 +2241,11 @@ The method used must be an out-of-band method."
user (or user "")
port (or port "")
spec (format-spec-make
- ?h host ?u user ?p port
?t (tramp-get-connection-property
- (tramp-get-connection-process v) "temp-file" "")
+ (tramp-get-connection-process v) "temp-file" ""))
+ options (format-spec tramp-ssh-controlmaster-options spec)
+ spec (format-spec-make
+ ?h host ?u user ?p port ?c options
?k (if keep-date " " ""))
copy-program (tramp-get-method-parameter
method 'tramp-copy-program)
@@ -2370,7 +2295,7 @@ The method used must be an out-of-band method."
v "process-buffer" (current-buffer))
(while copy-env
(tramp-message
- orig-vec 5 "%s=\"%s\"" (car copy-env) (cadr copy-env))
+ orig-vec 6 "%s=\"%s\"" (car copy-env) (cadr copy-env))
(setenv (pop copy-env) (pop copy-env)))
;; Use an asynchronous process. By this, password can
@@ -2380,17 +2305,38 @@ The method used must be an out-of-band method."
;; last longer than 60 secs.
(let ((p (let ((default-directory
(tramp-compat-temporary-file-directory)))
- (apply 'start-process
+ (apply 'start-process-shell-command
(tramp-get-connection-name v)
(tramp-get-connection-buffer v)
copy-program
- (append copy-args (list source target))))))
+ (append
+ copy-args
+ (list
+ (shell-quote-argument source)
+ (shell-quote-argument target)
+ "&&" "echo" "tramp_exit_status" "0"
+ "||" "echo" "tramp_exit_status" "1"))))))
(tramp-message
orig-vec 6 "%s"
(mapconcat 'identity (process-command p) " "))
(tramp-compat-set-process-query-on-exit-flag p nil)
(tramp-process-actions
- p v nil tramp-actions-copy-out-of-band)))
+ p v nil tramp-actions-copy-out-of-band)
+
+ ;; Check the return code.
+ (goto-char (point-max))
+ (unless
+ (re-search-backward "tramp_exit_status [0-9]+" nil t)
+ (tramp-error
+ orig-vec 'file-error
+ "Couldn't find exit status of `%s'" (process-command p)))
+ (skip-chars-forward "^ ")
+ (unless (zerop (read (current-buffer)))
+ (forward-line -1)
+ (tramp-error
+ orig-vec 'file-error
+ "Error copying: `%s'"
+ (buffer-substring (point-min) (point-at-eol))))))
;; Reset the transfer process properties.
(tramp-message orig-vec 6 "\n%s" (buffer-string))
@@ -2561,10 +2507,13 @@ This is like `dired-recursive-delete-directory' for Tramp files."
(if full-directory-p "yes" "no"))
;; If `full-directory-p', we just say `ls -l FILENAME'.
;; Else we chdir to the parent directory, then say `ls -ld BASENAME'.
+ ;; "--dired" returns byte positions. Therefore, the file names
+ ;; must be encoded, which is guaranteed by "LC_ALL=en_US.utf8
+ ;; LC_CTYPE=''".
(if full-directory-p
(tramp-send-command
v
- (format "%s %s %s 2>/dev/null"
+ (format "env LC_ALL=en_US.utf8 LC_CTYPE='' %s %s %s 2>/dev/null"
(tramp-get-ls-command v)
switches
(if wildcard
@@ -2580,7 +2529,7 @@ This is like `dired-recursive-delete-directory' for Tramp files."
(tramp-run-real-handler 'file-name-directory (list localname))))
(tramp-send-command
v
- (format "%s %s %s"
+ (format "env LC_ALL=en_US.utf8 LC_CTYPE='' %s %s %s 2>/dev/null"
(tramp-get-ls-command v)
switches
(if (or wildcard
@@ -2626,6 +2575,13 @@ This is like `dired-recursive-delete-directory' for Tramp files."
(while (re-search-forward tramp-color-escape-sequence-regexp nil t)
(replace-match "")))
+ ;; Decode the output, it could be multibyte.
+ (decode-coding-region
+ beg (point-max)
+ (or file-name-coding-system
+ (and (boundp 'default-file-name-coding-system)
+ (symbol-value 'default-file-name-coding-system))))
+
;; The inserted file could be from somewhere else.
(when (and (not wildcard) (not full-directory-p))
(goto-char (point-max))
@@ -2759,6 +2715,8 @@ the result will be a local, non-Tramp, filename."
(with-current-buffer (tramp-get-connection-buffer v)
(unwind-protect
+ ;; We catch this event. Otherwise, `start-process' could
+ ;; be called on the local host.
(save-excursion
(save-restriction
;; Activate narrowing in order to save BUFFER
@@ -2772,31 +2730,34 @@ the result will be a local, non-Tramp, filename."
(narrow-to-region (point-max) (point-max))
;; We call `tramp-maybe-open-connection', in order
;; to cleanup the prompt afterwards.
- (tramp-maybe-open-connection v)
- (widen)
- (delete-region mark (point))
- (narrow-to-region (point-max) (point-max))
- ;; Now do it.
- (if command
- ;; Send the command.
- (tramp-send-command v command nil t) ; nooutput
- ;; Check, whether a pty is associated.
- (unless (tramp-compat-process-get
- (tramp-get-connection-process v) 'remote-tty)
- (tramp-error
- v 'file-error
- "pty association is not supported for `%s'" name))))
- (let ((p (tramp-get-connection-process v)))
- ;; Set query flag for this process. We ignore errors,
- ;; because the process could have finished already.
- (ignore-errors
- (tramp-compat-set-process-query-on-exit-flag p t))
- ;; Return process.
- p)))
+ (catch 'suppress
+ (tramp-maybe-open-connection v)
+ (widen)
+ (delete-region mark (point))
+ (narrow-to-region (point-max) (point-max))
+ ;; Now do it.
+ (if command
+ ;; Send the command.
+ (tramp-send-command v command nil t) ; nooutput
+ ;; Check, whether a pty is associated.
+ (unless (tramp-compat-process-get
+ (tramp-get-connection-process v) 'remote-tty)
+ (tramp-error
+ v 'file-error
+ "pty association is not supported for `%s'" name))))
+ (let ((p (tramp-get-connection-process v)))
+ ;; Set query flag and process marker for this
+ ;; process. We ignore errors, because the process
+ ;; could have finished already.
+ (ignore-errors
+ (tramp-compat-set-process-query-on-exit-flag p t)
+ (set-marker (process-mark p) (point)))
+ ;; Return process.
+ p))))
;; Save exit.
(if (string-match tramp-temp-buffer-name (buffer-name))
- (progn
+ (ignore-errors
(set-process-buffer (tramp-get-connection-process v) nil)
(kill-buffer (current-buffer)))
(set-buffer-modified-p bmp))
@@ -2916,16 +2877,6 @@ the result will be a local, non-Tramp, filename."
(keyboard-quit)
ret))))
-(defun tramp-sh-handle-call-process-region
- (start end program &optional delete buffer display &rest args)
- "Like `call-process-region' for Tramp files."
- (let ((tmpfile (tramp-compat-make-temp-file "")))
- (write-region start end tmpfile)
- (when delete (delete-region start end))
- (unwind-protect
- (apply 'call-process program tmpfile buffer display args)
- (delete-file tmpfile))))
-
(defun tramp-sh-handle-file-local-copy (filename)
"Like `file-local-copy' for Tramp files."
(with-parsed-tramp-file-name filename nil
@@ -2950,40 +2901,39 @@ the result will be a local, non-Tramp, filename."
(rem-enc
(save-excursion
(with-tramp-progress-reporter
- v 3 (format "Encoding remote file %s" filename)
+ v 3
+ (format "Encoding remote file `%s' with `%s'" filename rem-enc)
(tramp-barf-unless-okay
v (format rem-enc (tramp-shell-quote-argument localname))
"Encoding remote file failed"))
- (if (functionp loc-dec)
- ;; If local decoding is a function, we call it. We
- ;; must disable multibyte, because
- ;; `uudecode-decode-region' doesn't handle it
- ;; correctly.
- (with-temp-buffer
- (set-buffer-multibyte nil)
- (insert-buffer-substring (tramp-get-buffer v))
- (with-tramp-progress-reporter
- v 3 (format "Decoding remote file %s with function %s"
- filename loc-dec)
+ (with-tramp-progress-reporter
+ v 3 (format "Decoding local file `%s' with `%s'"
+ tmpfile loc-dec)
+ (if (functionp loc-dec)
+ ;; If local decoding is a function, we call it.
+ ;; We must disable multibyte, because
+ ;; `uudecode-decode-region' doesn't handle it
+ ;; correctly.
+ (with-temp-buffer
+ (set-buffer-multibyte nil)
+ (insert-buffer-substring (tramp-get-buffer v))
(funcall loc-dec (point-min) (point-max))
;; Unset `file-name-handler-alist'. Otherwise,
;; epa-file gets confused.
(let (file-name-handler-alist
(coding-system-for-write 'binary))
- (write-region (point-min) (point-max) tmpfile))))
-
- ;; If tramp-decoding-function is not defined for this
- ;; method, we invoke tramp-decoding-command instead.
- (let ((tmpfile2 (tramp-compat-make-temp-file filename)))
- ;; Unset `file-name-handler-alist'. Otherwise,
- ;; epa-file gets confused.
- (let (file-name-handler-alist
- (coding-system-for-write 'binary))
- (write-region (point-min) (point-max) tmpfile2))
- (with-tramp-progress-reporter
- v 3 (format "Decoding remote file %s with command %s"
- filename loc-dec)
+ (write-region (point-min) (point-max) tmpfile)))
+
+ ;; If tramp-decoding-function is not defined for this
+ ;; method, we invoke tramp-decoding-command instead.
+ (let ((tmpfile2 (tramp-compat-make-temp-file filename)))
+ ;; Unset `file-name-handler-alist'. Otherwise,
+ ;; epa-file gets confused.
+ (let (file-name-handler-alist
+ (coding-system-for-write 'binary))
+ (with-current-buffer (tramp-get-buffer v)
+ (write-region (point-min) (point-max) tmpfile2)))
(unwind-protect
(tramp-call-local-coding-command
loc-dec tmpfile2 tmpfile)
@@ -3208,28 +3158,25 @@ Returns a file name in `tramp-auto-save-directory' for autosaving this file."
(with-temp-buffer
(set-buffer-multibyte nil)
;; Use encoding function or command.
- (if (functionp loc-enc)
- (with-tramp-progress-reporter
- v 3 (format "Encoding region using function `%s'"
- loc-enc)
- (let ((coding-system-for-read 'binary))
- (insert-file-contents-literally tmpfile))
- ;; The following `let' is a workaround for the
- ;; base64.el that comes with pgnus-0.84. If
- ;; both of the following conditions are
+ (with-tramp-progress-reporter
+ v 3 (format "Encoding local file `%s' using `%s'"
+ tmpfile loc-enc)
+ (if (functionp loc-enc)
+ ;; The following `let' is a workaround for
+ ;; the base64.el that comes with pgnus-0.84.
+ ;; If both of the following conditions are
;; satisfied, it tries to write to a local
;; file in default-directory, but at this
;; point, default-directory is remote.
;; (`call-process-region' can't write to
;; remote files, it seems.) The file in
;; question is a tmp file anyway.
- (let ((default-directory
+ (let ((coding-system-for-read 'binary)
+ (default-directory
(tramp-compat-temporary-file-directory)))
- (funcall loc-enc (point-min) (point-max))))
+ (insert-file-contents-literally tmpfile)
+ (funcall loc-enc (point-min) (point-max)))
- (with-tramp-progress-reporter
- v 3 (format "Encoding region using command `%s'"
- loc-enc)
(unless (zerop (tramp-call-local-coding-command
loc-enc tmpfile t))
(tramp-error
@@ -3242,8 +3189,8 @@ Returns a file name in `tramp-auto-save-directory' for autosaving this file."
;; writes to remote file. Because this happens on
;; the remote host, we cannot use the function.
(with-tramp-progress-reporter
- v 3
- (format "Decoding region into remote file %s" filename)
+ v 3 (format "Decoding remote file `%s' using `%s'"
+ filename rem-dec)
(goto-char (point-max))
(unless (bolp) (newline))
(tramp-send-command
@@ -3263,7 +3210,7 @@ Returns a file name in `tramp-auto-save-directory' for autosaving this file."
(erase-buffer)
(and
;; cksum runs locally, if possible.
- (zerop (tramp-compat-call-process "cksum" tmpfile t))
+ (zerop (tramp-call-process "cksum" tmpfile t))
;; cksum runs remotely.
(tramp-send-command-and-check
v
@@ -3441,6 +3388,9 @@ Only send the definition if it has not already been done."
(unless (member name scripts)
(with-tramp-progress-reporter vec 5 (format "Sending script `%s'" name)
;; The script could contain a call of Perl. This is masked with `%s'.
+ (when (and (string-match "%s" script)
+ (not (tramp-get-remote-perl vec)))
+ (tramp-error vec 'file-error "No Perl available on remote host"))
(tramp-barf-unless-okay
vec
(format "%s () {\n%s\n}" name
@@ -3870,11 +3820,6 @@ process to set up. VEC specifies the connection."
(tramp-send-command
vec (format "unset %s" (mapconcat 'identity unset " ")) t))))
-;; CCC: We should either implement a Perl version of base64 encoding
-;; and decoding. Then we just use that in the last item. The other
-;; alternative is to use the Perl version of UU encoding. But then
-;; we need a Lisp version of uuencode.
-;;
;; Old text from documentation of tramp-methods:
;; Using a uuencode/uudecode inline method is discouraged, please use one
;; of the base64 methods instead since base64 encoding is much more
@@ -3891,11 +3836,9 @@ process to set up. VEC specifies the connection."
(autoload 'uudecode-decode-region "uudecode")
(defconst tramp-local-coding-commands
- '((b64 base64-encode-region base64-decode-region)
+ `((b64 base64-encode-region base64-decode-region)
(uu tramp-uuencode-region uudecode-decode-region)
- (pack
- "perl -e 'binmode STDIN; binmode STDOUT; print pack(q{u*}, join q{}, <>)'"
- "perl -e 'binmode STDIN; binmode STDOUT; print unpack(q{u*}, join q{}, <>)'"))
+ (pack ,(format tramp-perl-pack "perl") ,(format tramp-perl-unpack "perl")))
"List of local coding commands for inline transfer.
Each item is a list that looks like this:
@@ -3930,9 +3873,7 @@ with the encoded or decoded results, respectively.")
(uu "uuencode xxx" "uudecode -o -")
(uu "uuencode xxx" "uudecode -p")
(uu "uuencode xxx" tramp-uudecode)
- (pack
- "perl -e 'binmode STDIN; binmode STDOUT; print pack(q{u*}, join q{}, <>)'"
- "perl -e 'binmode STDIN; binmode STDOUT; print unpack(q{u*}, join q{}, <>)'"))
+ (pack tramp-perl-pack tramp-perl-unpack))
"List of remote coding commands for inline transfer.
Each item is a list that looks like this:
@@ -4073,7 +4014,7 @@ INPUT can also be nil which means `/dev/null'.
OUTPUT can be a string (which specifies a filename), or t (which
means standard output and thus the current buffer), or nil (which
means discard it)."
- (tramp-compat-call-process
+ (tramp-call-process
tramp-encoding-shell
(when (and input (not (string-match "%s" cmd))) input)
(if (eq output t) t nil)
@@ -4081,7 +4022,7 @@ means discard it)."
tramp-encoding-command-switch
(concat
(if (string-match "%s" cmd) (format cmd input) cmd)
- (if (stringp output) (concat "> " output) ""))))
+ (if (stringp output) (concat " >" output) ""))))
(defconst tramp-inline-compress-commands
'(("gzip" "gzip -d")
@@ -4110,7 +4051,7 @@ Goes through the list `tramp-inline-compress-commands'."
decompress (nth 1 item))
(tramp-message
vec 5
- "Checking local compress command `%s', `%s' for sanity"
+ "Checking local compress commands `%s', `%s' for sanity"
compress decompress)
(unless
(zerop
@@ -4126,7 +4067,7 @@ Goes through the list `tramp-inline-compress-commands'."
(throw 'next nil))
(tramp-message
vec 5
- "Checking remote compress command `%s', `%s' for sanity"
+ "Checking remote compress commands `%s', `%s' for sanity"
compress decompress)
(unless (tramp-send-command-and-check
vec (format "echo %s | %s | %s" magic compress decompress) t)
@@ -4151,6 +4092,9 @@ Goes through the list `tramp-inline-compress-commands'."
(tramp-message
vec 2 "Couldn't find an inline transfer compress command")))))
+(defvar tramp-gw-tunnel-method)
+(defvar tramp-gw-socks-method)
+
(defun tramp-compute-multi-hops (vec)
"Expands VEC according to `tramp-default-proxies-alist'.
Gateway hops are already opened."
@@ -4211,10 +4155,11 @@ Gateway hops are already opened."
(setq choices tramp-default-proxies-alist)))))
;; Handle gateways.
- (when (string-match
- (format
- "^\\(%s\\|%s\\)$" tramp-gw-tunnel-method tramp-gw-socks-method)
- (tramp-file-name-method (car target-alist)))
+ (when (and (boundp 'tramp-gw-tunnel-method) (boundp 'tramp-gw-socks-method)
+ (string-match
+ (format
+ "^\\(%s\\|%s\\)$" tramp-gw-tunnel-method tramp-gw-socks-method)
+ (tramp-file-name-method (car target-alist))))
(let ((gw (pop target-alist))
(hop (pop target-alist)))
;; Is the method prepared for gateways?
@@ -4295,7 +4240,7 @@ connection if a previous connection has died for some reason."
(car tramp-current-connection)))
(> (tramp-time-diff
(current-time) (cdr tramp-current-connection))
- 5))
+ (or tramp-connection-min-time-diff 0)))
(throw 'suppress 'suppress))
;; If too much time has passed since last command was sent, look
@@ -4352,6 +4297,9 @@ connection if a previous connection has died for some reason."
(setenv "PROMPT_COMMAND")
(setenv "PS1" tramp-initial-end-of-output)
(let* ((target-alist (tramp-compute-multi-hops vec))
+ ;; We will apply `tramp-ssh-controlmaster-options'
+ ;; only for the first hop.
+ (options tramp-ssh-controlmaster-options)
(process-connection-type tramp-process-connection-type)
(process-adaptive-read-buffering nil)
(coding-system-for-read nil)
@@ -4413,14 +4361,16 @@ connection if a previous connection has died for some reason."
;; temporary file has another name, and it is
;; created and protected by ssh. It is also
;; removed by ssh when the connection is
- ;; closed.
+ ;; closed. The temporary file name is cached
+ ;; in the main connection process, therefore
+ ;; we cannot use `tramp-get-connection-process'.
(tmpfile
- (tramp-set-connection-property
- p "temp-file"
- (make-temp-name
- (expand-file-name
- tramp-temp-name-prefix
- (tramp-compat-temporary-file-directory)))))
+ (with-tramp-connection-property
+ (get-process (tramp-buffer-name vec)) "temp-file"
+ (make-temp-name
+ (expand-file-name
+ tramp-temp-name-prefix
+ (tramp-compat-temporary-file-directory)))))
spec r-shell)
;; Add arguments for asynchronous processes.
@@ -4454,8 +4404,10 @@ connection if a previous connection has died for some reason."
l-host (or l-host "")
l-user (or l-user "")
l-port (or l-port "")
+ spec (format-spec-make ?t tmpfile)
+ options (format-spec options spec)
spec (format-spec-make
- ?h l-host ?u l-user ?p l-port ?t tmpfile)
+ ?h l-host ?u l-user ?p l-port ?c options)
command
(concat
;; We do not want to see the trailing local
@@ -4482,7 +4434,8 @@ connection if a previous connection has died for some reason."
(tramp-message
vec 3 "Found remote shell prompt on `%s'" l-host))
;; Next hop.
- (setq target-alist (cdr target-alist)))
+ (setq options ""
+ target-alist (cdr target-alist)))
;; Make initial shell settings.
(tramp-open-connection-setup-interactive-shell p vec))))
@@ -4684,76 +4637,6 @@ Return ATTR."
(tramp-get-device vec))
attr))
-(defun tramp-check-cached-permissions (vec access)
- "Check `file-attributes' caches for VEC.
-Return t if according to the cache access type ACCESS is known to
-be granted."
- (let ((result nil)
- (offset (cond
- ((eq ?r access) 1)
- ((eq ?w access) 2)
- ((eq ?x access) 3))))
- (dolist (suffix '("string" "integer") result)
- (setq
- result
- (or
- result
- (let ((file-attr
- (tramp-get-file-property
- vec (tramp-file-name-localname vec)
- (concat "file-attributes-" suffix) nil))
- (remote-uid
- (tramp-get-connection-property
- vec (concat "uid-" suffix) nil))
- (remote-gid
- (tramp-get-connection-property
- vec (concat "gid-" suffix) nil)))
- (and
- file-attr
- (or
- ;; Not a symlink
- (eq t (car file-attr))
- (null (car file-attr)))
- (or
- ;; World accessible.
- (eq access (aref (nth 8 file-attr) (+ offset 6)))
- ;; User accessible and owned by user.
- (and
- (eq access (aref (nth 8 file-attr) offset))
- (equal remote-uid (nth 2 file-attr)))
- ;; Group accessible and owned by user's
- ;; principal group.
- (and
- (eq access (aref (nth 8 file-attr) (+ offset 3)))
- (equal remote-gid (nth 3 file-attr)))))))))))
-
-(defun tramp-file-mode-from-int (mode)
- "Turn an integer representing a file mode into an ls(1)-like string."
- (let ((type (cdr
- (assoc (logand (lsh mode -12) 15) tramp-file-mode-type-map)))
- (user (logand (lsh mode -6) 7))
- (group (logand (lsh mode -3) 7))
- (other (logand (lsh mode -0) 7))
- (suid (> (logand (lsh mode -9) 4) 0))
- (sgid (> (logand (lsh mode -9) 2) 0))
- (sticky (> (logand (lsh mode -9) 1) 0)))
- (setq user (tramp-file-mode-permissions user suid "s"))
- (setq group (tramp-file-mode-permissions group sgid "s"))
- (setq other (tramp-file-mode-permissions other sticky "t"))
- (concat type user group other)))
-
-(defun tramp-file-mode-permissions (perm suid suid-text)
- "Convert a permission bitset into a string.
-This is used internally by `tramp-file-mode-from-int'."
- (let ((r (> (logand perm 4) 0))
- (w (> (logand perm 2) 0))
- (x (> (logand perm 1) 0)))
- (concat (or (and r "r") "-")
- (or (and w "w") "-")
- (or (and suid x suid-text) ; suid, execute
- (and suid (upcase suid-text)) ; suid, !execute
- (and x "x") "-")))) ; !suid
-
(defun tramp-shell-case-fold (string)
"Converts STRING to shell glob pattern which ignores case."
(mapconcat
@@ -5022,12 +4905,6 @@ This is used internally by `tramp-file-mode-from-int'."
;; The command might not always return a number.
(if (and (equal id-format 'integer) (not (integerp res))) -1 res))))
-(defun tramp-get-local-uid (id-format)
- (if (equal id-format 'integer) (user-uid) (user-login-name)))
-
-(defun tramp-get-local-gid (id-format)
- (nth 3 (tramp-compat-file-attributes "~/" id-format)))
-
;; Some predefined connection properties.
(defun tramp-get-inline-compress (vec prop size)
"Return the compress command related to PROP.
@@ -5104,10 +4981,12 @@ function cell is returned to be applied on a buffer."
;; Windows shells need the program file name after
;; the pipe symbol be quoted if they use forward
;; slashes as directory separators.
- (if (and (string-match "local" prop)
- (memq system-type '(windows-nt)))
- "(%s | \"%s\" >%%s)"
- "(%s | %s >%%s)")
+ (cond
+ ((and (string-match "local" prop)
+ (memq system-type '(windows-nt)))
+ "(%s | \"%s\")")
+ ((string-match "local" prop) "(%s | %s)")
+ (t "(%s | %s >%%s)"))
coding compress))
(compress
(format
@@ -5120,38 +4999,12 @@ function cell is returned to be applied on a buffer."
"(%s <%%s | %s)")
compress coding))
((string-match "decoding" prop)
- (format "%s >%%s" coding))
+ (cond
+ ((string-match "local" prop) (format "%s" coding))
+ (t (format "%s >%%s" coding))))
(t
(format "%s <%%s" coding)))))))
-;;; Integration of eshell.el:
-
-(eval-when-compile
- (defvar eshell-path-env))
-
-;; eshell.el keeps the path in `eshell-path-env'. We must change it
-;; when `default-directory' points to another host.
-(defun tramp-eshell-directory-change ()
- "Set `eshell-path-env' to $PATH of the host related to `default-directory'."
- (setq eshell-path-env
- (if (file-remote-p default-directory)
- (with-parsed-tramp-file-name default-directory nil
- (mapconcat
- 'identity
- (tramp-get-remote-path v)
- ":"))
- (getenv "PATH"))))
-
-(eval-after-load "esh-util"
- '(progn
- (tramp-eshell-directory-change)
- (add-hook 'eshell-directory-change-hook
- 'tramp-eshell-directory-change)
- (add-hook 'tramp-unload-hook
- (lambda ()
- (remove-hook 'eshell-directory-change-hook
- 'tramp-eshell-directory-change)))))
-
(add-hook 'tramp-unload-hook
(lambda ()
(unload-feature 'tramp-sh 'force)))
diff --git a/lisp/net/tramp-smb.el b/lisp/net/tramp-smb.el
index b4bf10d4715..65c52ae4f3c 100644
--- a/lisp/net/tramp-smb.el
+++ b/lisp/net/tramp-smb.el
@@ -195,6 +195,7 @@ See `tramp-actions-before-shell' for more info.")
(dired-uncache . tramp-handle-dired-uncache)
(expand-file-name . tramp-smb-handle-expand-file-name)
(file-accessible-directory-p . tramp-smb-handle-file-directory-p)
+ (file-acl . tramp-smb-handle-file-acl)
(file-attributes . tramp-smb-handle-file-attributes)
(file-directory-p . tramp-smb-handle-file-directory-p)
(file-executable-p . tramp-handle-file-exists-p)
@@ -227,8 +228,9 @@ See `tramp-actions-before-shell' for more info.")
(make-symbolic-link . tramp-smb-handle-make-symbolic-link)
(process-file . tramp-smb-handle-process-file)
(rename-file . tramp-smb-handle-rename-file)
+ (set-file-acl . ignore)
(set-file-modes . tramp-smb-handle-set-file-modes)
- ;; `set-file-selinux-context' performed by default handler.
+ (set-file-selinux-context . ignore)
(set-file-times . ignore)
(set-visited-file-modtime . ignore)
(shell-command . tramp-handle-shell-command)
@@ -265,6 +267,8 @@ This can be used to disable echo etc."
:type 'string
:version "24.3")
+;; It must be a `defsubst' in order to push the whole code into
+;; tramp-loaddefs.el. Otherwise, there would be recursive autoloading.
;;;###tramp-autoload
(defsubst tramp-smb-file-name-p (filename)
"Check if it's a filename for SMB servers."
@@ -485,10 +489,10 @@ pass to the OPERATION."
(defun tramp-smb-handle-copy-file
(filename newname &optional ok-if-already-exists keep-date
- preserve-uid-gid preserve-selinux-context)
+ preserve-uid-gid preserve-extended-attributes)
"Like `copy-file' for Tramp files.
KEEP-DATE has no effect in case NEWNAME resides on an SMB server.
-PRESERVE-UID-GID and PRESERVE-SELINUX-CONTEXT are completely ignored."
+PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are completely ignored."
(setq filename (expand-file-name filename)
newname (expand-file-name newname))
(with-tramp-progress-reporter
@@ -637,6 +641,23 @@ PRESERVE-UID-GID and PRESERVE-SELINUX-CONTEXT are completely ignored."
method user host
(tramp-run-real-handler 'expand-file-name (list localname))))))
+(defun tramp-smb-handle-file-acl (filename)
+ "Like `file-acl' for Tramp files."
+ (with-parsed-tramp-file-name filename nil
+ (with-tramp-file-property v localname "file-acl"
+ (when (tramp-smb-send-command
+ v (format "getfacl \"%s\"" (tramp-smb-get-localname v)))
+ (with-current-buffer (tramp-get-connection-buffer v)
+ (goto-char (point-min))
+ (while (looking-at "^#")
+ (forward-line)
+ (delete-region (point-min) (point)))
+ (goto-char (point-max))
+ (delete-blank-lines)
+ (when (> (point-max) (point-min))
+ (tramp-compat-funcall
+ 'substring-no-properties (buffer-string))))))))
+
(defun tramp-smb-handle-file-attributes (filename &optional id-format)
"Like `file-attributes' for Tramp files."
(unless id-format (setq id-format 'integer))
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index c4c8efcbfe8..4ec3a4b7829 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -220,7 +220,8 @@ pair of the form (KEY VALUE). The following KEYs are defined:
argument. By this, arguments like (\"-l\" \"%u\") are optional.
\"%t\" is replaced by the temporary file name produced with
`tramp-make-tramp-temp-file'. \"%k\" indicates the keep-date
- parameter of a program, if exists.
+ parameter of a program, if exists. \"%c\" adds additional
+ `tramp-ssh-controlmaster-options' options for the first hop.
* `tramp-async-args'
When an asynchronous process is started, we know already that
the connection works. Therefore, we can pass additional
@@ -280,15 +281,24 @@ started on the local host. You should specify a remote host
`localhost' or the name of the local host. Another host name is
useful only in combination with `tramp-default-proxies-alist'.")
-(defun tramp-detect-ssh-controlmaster ()
- "Call ssh to detect whether it supports the ControlMaster argument.
-This function may return nil when the argument is supported, but
-shouldn't return t when it isn't."
- (ignore-errors
- (with-temp-buffer
- (call-process "ssh" nil t nil "-o" "ControlMaster")
- (goto-char (point-min))
- (search-forward-regexp "Missing ControlMaster argument" nil t))))
+;;;###tramp-autoload
+(defconst tramp-ssh-controlmaster-options
+ (let ((result ""))
+ (ignore-errors
+ (with-temp-buffer
+ (call-process "ssh" nil t nil "-o" "ControlMaster")
+ (goto-char (point-min))
+ (when (search-forward-regexp "Missing ControlMaster argument" nil t)
+ (setq result "-o ControlPath=%t.%%r@%%h:%%p -o ControlMaster=auto")))
+ (when result
+ (with-temp-buffer
+ (call-process "ssh" nil t nil "-o" "ControlPersist")
+ (goto-char (point-min))
+ (when (search-forward-regexp "Missing ControlPersist argument" nil t)
+ (setq result (concat result " -o ControlPersist=no"))))))
+ result)
+ "Call ssh to detect whether it supports the Control* arguments.
+Return a string to be used in `tramp-methods'.")
(defcustom tramp-default-method
;; An external copy method seems to be preferred, because it performs
@@ -297,8 +307,9 @@ shouldn't return t when it isn't."
;; permanent password queries. Either a password agent like
;; "ssh-agent" or "Pageant" shall run, or the optional
;; password-cache.el or auth-sources.el packages shall be active for
- ;; password caching. "scpc" is chosen if we detect that the user is
- ;; running OpenSSH 4.0 or newer.
+ ;; password caching. If we detect that the user is running OpenSSH
+ ;; 4.0 or newer, we could reuse the connection, which calls also for
+ ;; an external method.
(cond
;; PuTTY is installed. We don't take it, if it is installed on a
;; non-windows system, or pscp from the pssh (parallel ssh) package
@@ -314,16 +325,16 @@ shouldn't return t when it isn't."
"plink"))
;; There is an ssh installation.
((executable-find "scp")
- (cond
- ((tramp-detect-ssh-controlmaster) "scpc")
- ((or (fboundp 'password-read)
- (fboundp 'auth-source-user-or-password)
- (fboundp 'auth-source-search)
- ;; ssh-agent is running.
- (getenv "SSH_AUTH_SOCK")
- (getenv "SSH_AGENT_PID"))
- "scp")
- (t "ssh")))
+ (if (or (fboundp 'password-read)
+ (fboundp 'auth-source-user-or-password)
+ (fboundp 'auth-source-search)
+ ;; ssh-agent is running.
+ (getenv "SSH_AUTH_SOCK")
+ (getenv "SSH_AGENT_PID")
+ ;; We could reuse the connection.
+ (> (length tramp-ssh-controlmaster-options) 0))
+ "scp"
+ "ssh"))
;; Fallback.
(t "ftp"))
"Default method to use for transferring files.
@@ -381,6 +392,23 @@ Useful for su and sudo methods mostly."
:group 'tramp
:type 'string)
+;;;###tramp-autoload
+(defcustom tramp-default-host-alist nil
+ "Default host to use for specific method/user pairs.
+This is an alist of items (METHOD USER HOST). The first matching item
+specifies the host to use for a file name which does not specify a
+host. METHOD and HOST are regular expressions or nil, which is
+interpreted as a regular expression which always matches. If no entry
+matches, the variable `tramp-default-host' takes effect.
+
+If the file name does not specify the method, lookup is done using the
+empty string for the method name."
+ :group 'tramp
+ :version "24.4"
+ :type '(repeat (list (choice :tag "Method regexp" regexp sexp)
+ (choice :tag " User regexp" regexp sexp)
+ (choice :tag " Host name" string (const nil)))))
+
(defcustom tramp-default-proxies-alist nil
"Route to be followed for specific host/user pairs.
This is an alist of items (HOST USER PROXY). The first matching
@@ -918,7 +946,7 @@ See `tramp-file-name-structure' for more explanations.")
This regexp should match partial Tramp file names only.
Please note that the entry in `file-name-handler-alist' is made when
-this file (tramp.el) is loaded. This means that this variable must be set
+this file \(tramp.el\) is loaded. This means that this variable must be set
before loading tramp.el. Alternatively, `file-name-handler-alist' can be
updated after changing this variable.
@@ -1001,11 +1029,25 @@ this variable to be set as well."
;; for an override of the system default.
(defcustom tramp-process-connection-type t
"Overrides `process-connection-type' for connections from Tramp.
-Tramp binds process-connection-type to the value given here before
+Tramp binds `process-connection-type' to the value given here before
opening a connection to a remote host."
:group 'tramp
:type '(choice (const nil) (const t) (const pty)))
+(defcustom tramp-connection-min-time-diff 5
+ "Defines seconds between two consecutive connection attempts.
+This is necessary as self defense mechanism, in order to avoid
+yo-yo connection attempts when the remote host is unavailable.
+
+A value of 0 or `nil' suppresses this check. This might be
+necessary, when several out-of-order copy operations are
+performed, or when several asynchronous processes will be started
+in a short time frame. In those cases it is recommended to
+let-bind this variable."
+ :group 'tramp
+ :version "24.4"
+ :type '(choice (const nil) integer))
+
(defcustom tramp-completion-reread-directory-timeout 10
"Defines seconds since last remote command before rereading a directory.
A remote directory might have changed its contents. In order to
@@ -1016,7 +1058,7 @@ have been gone since last remote command execution. A value of `t'
would require an immediate reread during filename completion, `nil'
means to use always cached values for the directory contents."
:group 'tramp
- :type '(choice (const nil) integer))
+ :type '(choice (const nil) (const t) integer))
;;; Internal Variables:
@@ -1125,23 +1167,48 @@ If the `tramp-methods' entry does not exist, return nil."
(defun tramp-tramp-file-p (name)
"Return t if NAME is a string with Tramp file name syntax."
(save-match-data
- (and (stringp name) (string-match tramp-file-name-regexp name))))
+ (and (stringp name)
+ (string-match tramp-file-name-regexp name))))
+
+;; Obsoleted with Tramp 2.2.7.
+(defconst tramp-obsolete-methods
+ '("ssh1" "ssh2" "scp1" "scp2" "scpc" "rsyncc" "plink1")
+ "Obsolete methods.")
+
+(defvar tramp-warned-obsolete-methods nil
+ "Which methods the user has been warned to be obsolete.")
(defun tramp-find-method (method user host)
"Return the right method string to use.
This is METHOD, if non-nil. Otherwise, do a lookup in
-`tramp-default-method-alist'."
- (or method
- (let ((choices tramp-default-method-alist)
- lmethod item)
- (while choices
- (setq item (pop choices))
- (when (and (string-match (or (nth 0 item) "") (or host ""))
- (string-match (or (nth 1 item) "") (or user "")))
- (setq lmethod (nth 2 item))
- (setq choices nil)))
- lmethod)
- tramp-default-method))
+`tramp-default-method-alist'. It maps also obsolete methods to
+their replacement."
+ (let ((result
+ (or method
+ (let ((choices tramp-default-method-alist)
+ lmethod item)
+ (while choices
+ (setq item (pop choices))
+ (when (and (string-match (or (nth 0 item) "") (or host ""))
+ (string-match (or (nth 1 item) "") (or user "")))
+ (setq lmethod (nth 2 item))
+ (setq choices nil)))
+ lmethod)
+ tramp-default-method)))
+ ;; This is needed for a transition period only.
+ (when (member result tramp-obsolete-methods)
+ (unless (member result tramp-warned-obsolete-methods)
+ (if noninteractive
+ (warn "Method %s is obsolete, using %s"
+ result (substring result 0 -1))
+ (unless (y-or-n-p (format "Method %s is obsolete, use %s? "
+ result (substring result 0 -1)))
+ (tramp-compat-user-error "Method \"%s\" not supported" result)))
+ (add-to-list 'tramp-warned-obsolete-methods result))
+ ;; This works with the current set of `tramp-obsolete-methods'.
+ ;; Must be improved, if their are more sophisticated replacements.
+ (setq result (substring result 0 -1)))
+ result))
(defun tramp-find-user (method user host)
"Return the right user string to use.
@@ -1163,6 +1230,15 @@ This is USER, if non-nil. Otherwise, do a lookup in
"Return the right host string to use.
This is HOST, if non-nil. Otherwise, it is `tramp-default-host'."
(or (and (> (length host) 0) host)
+ (let ((choices tramp-default-host-alist)
+ lhost item)
+ (while choices
+ (setq item (pop choices))
+ (when (and (string-match (or (nth 0 item) "") (or method ""))
+ (string-match (or (nth 1 item) "") (or user "")))
+ (setq lhost (nth 2 item))
+ (setq choices nil)))
+ lhost)
tramp-default-host))
(defun tramp-dissect-file-name (name &optional nodefault)
@@ -1173,7 +1249,7 @@ non-nil, the file name parts are not expanded to their default
values."
(save-match-data
(let ((match (string-match (nth 0 tramp-file-name-structure) name)))
- (unless match (error "Not a Tramp file name: %s" name))
+ (unless match (tramp-compat-user-error "Not a Tramp file name: %s" name))
(let ((method (match-string (nth 1 tramp-file-name-structure) name))
(user (match-string (nth 2 tramp-file-name-structure) name))
(host (match-string (nth 3 tramp-file-name-structure) name))
@@ -1183,7 +1259,12 @@ values."
(when (string-match tramp-prefix-ipv6-regexp host)
(setq host (replace-match "" nil t host)))
(when (string-match tramp-postfix-ipv6-regexp host)
- (setq host (replace-match "" nil t host))))
+ (setq host (replace-match "" nil t host)))
+ (when (and (equal tramp-syntax 'ftp) (null method) (null user)
+ (member host (mapcar 'car tramp-methods))
+ (not (tramp-completion-mode-p)))
+ (tramp-compat-user-error
+ "Host name must not match method `%s'" host)))
(if nodefault
(vector method user host localname hop)
(vector
@@ -1299,7 +1380,7 @@ The outline level is equal to the verbosity of the Tramp message."
(get-buffer-create (tramp-debug-buffer-name vec))
(when (bobp)
(setq buffer-undo-list t)
- ;; So it does not get loaded while outline-regexp is let-bound.
+ ;; So it does not get loaded while `outline-regexp' is let-bound.
(require 'outline)
;; Activate `outline-mode'. This runs `text-mode-hook' and
;; `outline-mode-hook'. We must prevent that local processes
@@ -1350,8 +1431,11 @@ ARGS to actually emit the message (if applicable)."
(concat
"^"
(regexp-opt
- '("tramp-compat-funcall"
+ '("tramp-backtrace"
+ "tramp-compat-condition-case-unless-debug"
+ "tramp-compat-funcall"
"tramp-compat-with-temp-message"
+ "tramp-condition-case-unless-debug"
"tramp-debug-message"
"tramp-error"
"tramp-error-with-buffer"
@@ -1426,12 +1510,18 @@ applicable)."
(concat (format "(%d) # " level) fmt-string)
args)))))))
+(defsubst tramp-backtrace (vec-or-proc)
+ "Dump a backtrace into the debug buffer.
+This function is meant for debugging purposes."
+ (tramp-message vec-or-proc 10 "\n%s" (with-output-to-string (backtrace))))
+
(defsubst tramp-error (vec-or-proc signal fmt-string &rest args)
"Emit an error.
VEC-OR-PROC identifies the connection to use, SIGNAL is the
signal identifier to be raised, remaining args passed to
`tramp-message'. Finally, signal SIGNAL is raised."
(let (tramp-message-show-message)
+ (tramp-backtrace vec-or-proc)
(tramp-message
vec-or-proc 1 "%s"
(error-message-string
@@ -1457,6 +1547,11 @@ an input event arrives. The other arguments are passed to `tramp-error'."
(or (and (bufferp buffer) buffer)
(and (processp vec-or-proc) (process-buffer vec-or-proc))
(tramp-get-connection-buffer vec-or-proc)))
+ (when (string-equal fmt-string "Process died")
+ (message
+ "%s\n %s"
+ "Tramp failed to connect. If this happens repeatedly, try"
+ "`M-x tramp-cleanup-this-connection'"))
(sit-for 30))))))
(defmacro with-parsed-tramp-file-name (filename var &rest body)
@@ -1622,7 +1717,7 @@ Example:
;; Windows registry.
(and (memq system-type '(cygwin windows-nt))
(zerop
- (tramp-compat-call-process
+ (tramp-call-process
"reg" nil nil nil "query" (nth 1 (car v)))))
;; Configuration file.
(file-exists-p (nth 1 (car v)))))
@@ -1744,19 +1839,22 @@ value of `default-file-modes', without execute permissions."
(logand (default-file-modes) (tramp-compat-octal-to-decimal "0666"))))
(defun tramp-replace-environment-variables (filename)
- "Replace environment variables in FILENAME.
+ "Replace environment variables in FILENAME.
Return the string with the replaced variables."
- (save-match-data
- (let ((idx (string-match "$\\(\\w+\\)" filename)))
- ;; `$' is coded as `$$'.
- (when (and idx
- (or (zerop idx) (not (eq ?$ (aref filename (1- idx)))))
- (getenv (match-string 1 filename)))
- (setq filename
- (replace-match
- (substitute-in-file-name (match-string 0 filename))
- t nil filename)))
- filename)))
+ (or (ignore-errors
+ (tramp-compat-funcall 'substitute-env-vars filename 'only-defined))
+ ;; We need an own implementation.
+ (save-match-data
+ (let ((idx (string-match "$\\(\\w+\\)" filename)))
+ ;; `$' is coded as `$$'.
+ (when (and idx
+ (or (zerop idx) (not (eq ?$ (aref filename (1- idx)))))
+ (getenv (match-string 1 filename)))
+ (setq filename
+ (replace-match
+ (substitute-in-file-name (match-string 0 filename))
+ t nil filename)))
+ filename))))
;; In XEmacs, electricity is implemented via a key map for ?/ and ?~,
;; which calls corresponding functions (see minibuf.el).
@@ -1866,7 +1964,8 @@ ARGS are the arguments OPERATION has been called with."
;; Emacs 22+ only.
'set-file-times
;; Emacs 24+ only.
- 'file-selinux-context 'set-file-selinux-context
+ 'file-acl 'file-selinux-context
+ 'set-file-acl 'set-file-selinux-context
;; XEmacs only.
'abbreviate-file-name 'create-file-buffer
'dired-file-modtime 'dired-make-compressed-filename
@@ -1917,10 +2016,7 @@ ARGS are the arguments OPERATION has been called with."
;; Emacs 23+ only.
'start-file-process
;; XEmacs only.
- 'dired-print-file 'dired-shell-call-process
- ;; nowhere yet.
- 'executable-find 'start-process
- 'call-process 'call-process-region))
+ 'dired-print-file 'dired-shell-call-process))
default-directory)
;; Unknown file primitive.
(t (error "unknown file I/O primitive: %s" operation))))
@@ -1946,6 +2042,15 @@ ARGS are the arguments OPERATION has been called with."
res (cdr elt))))
res))))
+(defvar tramp-debug-on-error nil
+ "Like `debug-on-error' but used Tramp internal.")
+
+(defmacro tramp-condition-case-unless-debug
+ (var bodyform &rest handlers)
+ "Like `condition-case-unless-debug' but `tramp-debug-on-error'."
+ `(let ((debug-on-error tramp-debug-on-error))
+ (tramp-compat-condition-case-unless-debug ,var ,bodyform ,@handlers)))
+
;; Main function.
;;;###autoload
(defun tramp-file-name-handler (operation &rest args)
@@ -1961,7 +2066,7 @@ Falls back to normal file name handler if no Tramp file name handler exists."
(with-parsed-tramp-file-name filename nil
;; Call the backend function.
(if foreign
- (tramp-compat-condition-case-unless-debug err
+ (tramp-condition-case-unless-debug err
(let ((sf (symbol-function foreign))
result)
;; Some packages set the default directory to a
@@ -2014,7 +2119,7 @@ Falls back to normal file name handler if no Tramp file name handler exists."
;; in order to give the user a chance to correct the
;; file name in the minibuffer.
;; In order to get a full backtrace, one could apply
- ;; (setq debug-on-error t debug-on-signal t)
+ ;; (setq tramp-debug-on-error t)
(error
(cond
((and completion (zerop (length localname))
@@ -2664,7 +2769,7 @@ User may be nil."
User is always nil."
(if (memq system-type '(windows-nt))
(with-temp-buffer
- (when (zerop (tramp-compat-call-process
+ (when (zerop (tramp-call-process
"reg" nil t nil "query" registry-or-dirname))
(goto-char (point-min))
(loop while (not (eobp)) collect
@@ -2741,6 +2846,11 @@ User is always nil."
(if (or dir-p (file-directory-p dir)) dir (file-name-directory dir)) nil
(tramp-flush-directory-property v localname)))
+(defun tramp-handle-file-accessible-directory-p (filename)
+ "Like `file-accessible-directory-p' for Tramp files."
+ (and (file-directory-p filename)
+ (file-executable-p filename)))
+
(defun tramp-handle-file-exists-p (filename)
"Like `file-exists-p' for Tramp files."
(not (null (file-attributes filename))))
@@ -2964,13 +3074,15 @@ User is always nil."
(setq tramp-temp-buffer-file-name local-copy))
;; We must ensure that `file-coding-system-alist'
- ;; matches `local-copy'.
+ ;; matches `local-copy'. We must also use `visit',
+ ;; otherwise there might be an error in the
+ ;; `revert-buffer' function under XEmacs.
(let ((file-coding-system-alist
(tramp-find-file-name-coding-system-alist
filename local-copy)))
(setq result
(insert-file-contents
- local-copy nil nil nil replace)))))
+ local-copy visit nil nil replace)))))
;; Save exit.
(progn
@@ -3065,7 +3177,7 @@ User is always nil."
(when p
(if (yes-or-no-p "A command is running. Kill it? ")
(ignore-errors (kill-process p))
- (error "Shell command in progress")))
+ (tramp-compat-user-error "Shell command in progress")))
(if current-buffer-p
(progn
@@ -3547,6 +3659,107 @@ would yield `t'. On the other hand, the following check results in nil:
(t (error "Tenth char `%c' must be one of `xtT-'"
other-execute-or-sticky)))))))
+(defconst tramp-file-mode-type-map
+ '((0 . "-") ; Normal file (SVID-v2 and XPG2)
+ (1 . "p") ; fifo
+ (2 . "c") ; character device
+ (3 . "m") ; multiplexed character device (v7)
+ (4 . "d") ; directory
+ (5 . "?") ; Named special file (XENIX)
+ (6 . "b") ; block device
+ (7 . "?") ; multiplexed block device (v7)
+ (8 . "-") ; regular file
+ (9 . "n") ; network special file (HP-UX)
+ (10 . "l") ; symlink
+ (11 . "?") ; ACL shadow inode (Solaris, not userspace)
+ (12 . "s") ; socket
+ (13 . "D") ; door special (Solaris)
+ (14 . "w")) ; whiteout (BSD)
+ "A list of file types returned from the `stat' system call.
+This is used to map a mode number to a permission string.")
+
+;;;###tramp-autoload
+(defun tramp-file-mode-from-int (mode)
+ "Turn an integer representing a file mode into an ls(1)-like string."
+ (let ((type (cdr
+ (assoc (logand (lsh mode -12) 15) tramp-file-mode-type-map)))
+ (user (logand (lsh mode -6) 7))
+ (group (logand (lsh mode -3) 7))
+ (other (logand (lsh mode -0) 7))
+ (suid (> (logand (lsh mode -9) 4) 0))
+ (sgid (> (logand (lsh mode -9) 2) 0))
+ (sticky (> (logand (lsh mode -9) 1) 0)))
+ (setq user (tramp-file-mode-permissions user suid "s"))
+ (setq group (tramp-file-mode-permissions group sgid "s"))
+ (setq other (tramp-file-mode-permissions other sticky "t"))
+ (concat type user group other)))
+
+(defun tramp-file-mode-permissions (perm suid suid-text)
+ "Convert a permission bitset into a string.
+This is used internally by `tramp-file-mode-from-int'."
+ (let ((r (> (logand perm 4) 0))
+ (w (> (logand perm 2) 0))
+ (x (> (logand perm 1) 0)))
+ (concat (or (and r "r") "-")
+ (or (and w "w") "-")
+ (or (and suid x suid-text) ; suid, execute
+ (and suid (upcase suid-text)) ; suid, !execute
+ (and x "x") "-")))) ; !suid
+
+;;;###tramp-autoload
+(defun tramp-get-local-uid (id-format)
+ (if (equal id-format 'integer) (user-uid) (user-login-name)))
+
+;;;###tramp-autoload
+(defun tramp-get-local-gid (id-format)
+ (if (and (fboundp 'group-gid) (equal id-format 'integer))
+ (tramp-compat-funcall 'group-gid)
+ (nth 3 (tramp-compat-file-attributes "~/" id-format))))
+
+;;;###tramp-autoload
+(defun tramp-check-cached-permissions (vec access)
+ "Check `file-attributes' caches for VEC.
+Return t if according to the cache access type ACCESS is known to
+be granted."
+ (let ((result nil)
+ (offset (cond
+ ((eq ?r access) 1)
+ ((eq ?w access) 2)
+ ((eq ?x access) 3))))
+ (dolist (suffix '("string" "integer") result)
+ (setq
+ result
+ (or
+ result
+ (let ((file-attr
+ (tramp-get-file-property
+ vec (tramp-file-name-localname vec)
+ (concat "file-attributes-" suffix) nil))
+ (remote-uid
+ (tramp-get-connection-property
+ vec (concat "uid-" suffix) nil))
+ (remote-gid
+ (tramp-get-connection-property
+ vec (concat "gid-" suffix) nil)))
+ (and
+ file-attr
+ (or
+ ;; Not a symlink
+ (eq t (car file-attr))
+ (null (car file-attr)))
+ (or
+ ;; World accessible.
+ (eq access (aref (nth 8 file-attr) (+ offset 6)))
+ ;; User accessible and owned by user.
+ (and
+ (eq access (aref (nth 8 file-attr) offset))
+ (equal remote-uid (nth 2 file-attr)))
+ ;; Group accessible and owned by user's
+ ;; principal group.
+ (and
+ (eq access (aref (nth 8 file-attr) (+ offset 3)))
+ (equal remote-gid (nth 3 file-attr)))))))))))
+
;;;###tramp-autoload
(defun tramp-local-host-p (vec)
"Return t if this points to the local host, nil otherwise."
@@ -3684,6 +3897,24 @@ ALIST is of the form ((FROM . TO) ...)."
;;; Compatibility functions section:
+(defun tramp-call-process
+ (program &optional infile destination display &rest args)
+ "Calls `call-process' on the local host.
+This is needed because for some Emacs flavors Tramp has
+defadvised `call-process' to behave like `process-file'. The
+Lisp error raised when PROGRAM is nil is trapped also, returning 1.
+Furthermore, traces are written with verbosity of 6."
+ (let ((default-directory
+ (if (file-remote-p default-directory)
+ (tramp-compat-temporary-file-directory)
+ default-directory)))
+ (tramp-message
+ (vector tramp-current-method tramp-current-user tramp-current-host nil nil)
+ 6 "%s %s %s" program infile args)
+ (if (executable-find program)
+ (apply 'call-process program infile destination display args)
+ 1)))
+
;;;###tramp-autoload
(defun tramp-read-passwd (proc &optional prompt)
"Read a password from user (compat function).
@@ -3842,6 +4073,39 @@ Only works for Bourne-like shells."
t t result)))
result))))
+;;; Integration of eshell.el:
+
+(eval-when-compile
+ (defvar eshell-path-env))
+
+;; eshell.el keeps the path in `eshell-path-env'. We must change it
+;; when `default-directory' points to another host.
+(defun tramp-eshell-directory-change ()
+ "Set `eshell-path-env' to $PATH of the host related to `default-directory'."
+ (setq eshell-path-env
+ (if (file-remote-p default-directory)
+ (with-parsed-tramp-file-name default-directory nil
+ (mapconcat
+ 'identity
+ (or
+ ;; When `tramp-own-remote-path' is in `tramp-remote-path',
+ ;; the remote path is only set in the session cache.
+ (tramp-get-connection-property
+ (tramp-get-connection-process v) "remote-path" nil)
+ (tramp-get-connection-property v "remote-path" nil))
+ ":"))
+ (getenv "PATH"))))
+
+(eval-after-load "esh-util"
+ '(progn
+ (tramp-eshell-directory-change)
+ (add-hook 'eshell-directory-change-hook
+ 'tramp-eshell-directory-change)
+ (add-hook 'tramp-unload-hook
+ (lambda ()
+ (remove-hook 'eshell-directory-change-hook
+ 'tramp-eshell-directory-change)))))
+
;; Checklist for `tramp-unload-hook'
;; - Unload all `tramp-*' packages
;; - Reset `file-name-handler-alist'
diff --git a/lisp/net/trampver.el b/lisp/net/trampver.el
index 993fbda6dd7..0e54cd60d98 100644
--- a/lisp/net/trampver.el
+++ b/lisp/net/trampver.el
@@ -31,7 +31,7 @@
;; should be changed only there.
;;;###tramp-autoload
-(defconst tramp-version "2.2.6-24.3"
+(defconst tramp-version "2.2.8-pre"
"This version of Tramp.")
;;;###tramp-autoload
@@ -44,7 +44,7 @@
(= emacs-major-version 21)
(>= emacs-minor-version 4)))
"ok"
- (format "Tramp 2.2.6-24.3 is not fit for %s"
+ (format "Tramp 2.2.8-pre is not fit for %s"
(when (string-match "^.*$" (emacs-version))
(match-string 0 (emacs-version)))))))
(unless (string-match "\\`ok\\'" x) (error "%s" x)))
diff --git a/lisp/newcomment.el b/lisp/newcomment.el
index d55feaa3c1a..bcb5f721ae8 100644
--- a/lisp/newcomment.el
+++ b/lisp/newcomment.el
@@ -1206,7 +1206,8 @@ changed with `comment-style'."
(defun comment-box (beg end &optional arg)
"Comment out the BEG .. END region, putting it inside a box.
The numeric prefix ARG specifies how many characters to add to begin- and
-end- comment markers additionally to what `comment-add' already specifies."
+end- comment markers additionally to what variable `comment-add' already
+specifies."
(interactive "*r\np")
(comment-normalize-vars)
(let ((comment-style (if (cadr (assoc comment-style comment-styles))
diff --git a/lisp/notifications.el b/lisp/notifications.el
index 8133ac72da2..5c8c8f1dc68 100644
--- a/lisp/notifications.el
+++ b/lisp/notifications.el
@@ -66,6 +66,9 @@
(defconst notifications-get-capabilities-method "GetCapabilities"
"D-Bus notifications get capabilities method.")
+(defconst notifications-get-server-information-method "GetServerInformation"
+ "D-Bus notifications get server information method.")
+
(defconst notifications-action-signal "ActionInvoked"
"D-Bus notifications action signal.")
@@ -199,142 +202,144 @@ This function returns a notification id, an integer, which can be
used to manipulate the notification item with
`notifications-close-notification' or the `:replaces-id' argument
of another `notifications-notify' call."
- (let ((bus (or (plist-get params :bus) :session))
- (title (plist-get params :title))
- (body (plist-get params :body))
- (app-name (plist-get params :app-name))
- (replaces-id (plist-get params :replaces-id))
- (app-icon (plist-get params :app-icon))
- (actions (plist-get params :actions))
- (timeout (plist-get params :timeout))
- ;; Hints
- (hints '())
- (urgency (plist-get params :urgency))
- (category (plist-get params :category))
- (desktop-entry (plist-get params :desktop-entry))
- (image-data (plist-get params :image-data))
- (image-path (plist-get params :image-path))
- (action-items (plist-get params :action-items))
- (sound-file (plist-get params :sound-file))
- (sound-name (plist-get params :sound-name))
- (suppress-sound (plist-get params :suppress-sound))
- (resident (plist-get params :resident))
- (transient (plist-get params :transient))
- (x (plist-get params :x))
- (y (plist-get params :y))
- id)
- ;; Build hints array
- (when urgency
- (add-to-list 'hints `(:dict-entry
- "urgency"
- (:variant :byte ,(pcase urgency
- (`low 0)
- (`critical 2)
- (_ 1)))) t))
- (when category
- (add-to-list 'hints `(:dict-entry
- "category"
- (:variant :string ,category)) t))
- (when desktop-entry
- (add-to-list 'hints `(:dict-entry
- "desktop-entry"
- (:variant :string ,desktop-entry)) t))
- (when image-data
- (add-to-list 'hints `(:dict-entry
- "image-data"
- (:variant :struct ,image-data)) t))
- (when image-path
- (add-to-list 'hints `(:dict-entry
- "image-path"
- (:variant :string ,image-path)) t))
- (when action-items
- (add-to-list 'hints `(:dict-entry
- "action-items"
- (:variant :boolean ,action-items)) t))
- (when sound-file
- (add-to-list 'hints `(:dict-entry
- "sound-file"
- (:variant :string ,sound-file)) t))
- (when sound-name
- (add-to-list 'hints `(:dict-entry
- "sound-name"
- (:variant :string ,sound-name)) t))
- (when suppress-sound
- (add-to-list 'hints `(:dict-entry
- "suppress-sound"
- (:variant :boolean ,suppress-sound)) t))
- (when resident
- (add-to-list 'hints `(:dict-entry
- "resident"
- (:variant :boolean ,resident)) t))
- (when transient
- (add-to-list 'hints `(:dict-entry
- "transient"
- (:variant :boolean ,transient)) t))
- (when x
- (add-to-list 'hints `(:dict-entry "x" (:variant :int32 ,x)) t))
- (when y
- (add-to-list 'hints `(:dict-entry "y" (:variant :int32 ,y)) t))
-
- ;; Call Notify method.
- (setq id
- (dbus-call-method bus
- notifications-service
- notifications-path
- notifications-interface
- notifications-notify-method
- :string (or app-name
- notifications-application-name)
- :uint32 (or replaces-id 0)
- :string (if app-icon
- (expand-file-name app-icon)
- ;; If app-icon is nil because user
- ;; requested it to be so, send the
- ;; empty string
- (if (plist-member params :app-icon)
- ""
- ;; Otherwise send the default icon path
- notifications-application-icon))
- :string (or title "")
- :string (or body "")
- `(:array ,@actions)
- (or hints '(:array :signature "{sv}"))
- :int32 (or timeout -1)))
-
- ;; Register close/action callback function. We must also remember
- ;; the daemon's unique name, because the daemon could have
- ;; restarted.
- (let ((on-action (plist-get params :on-action))
- (on-close (plist-get params :on-close))
- (unique-name (dbus-get-name-owner bus notifications-service)))
- (when on-action
- (add-to-list 'notifications-on-action-map
- (list (list bus unique-name id) on-action))
- (unless notifications-on-action-object
- (setq notifications-on-action-object
- (dbus-register-signal
- bus
- nil
- notifications-path
- notifications-interface
- notifications-action-signal
- 'notifications-on-action-signal))))
-
- (when on-close
- (add-to-list 'notifications-on-close-map
- (list (list bus unique-name id) on-close))
- (unless notifications-on-close-object
- (setq notifications-on-close-object
- (dbus-register-signal
- bus
- nil
- notifications-path
- notifications-interface
- notifications-closed-signal
- 'notifications-on-closed-signal)))))
-
- ;; Return notification id
- id))
+ (with-demoted-errors
+ (let ((bus (or (plist-get params :bus) :session))
+ (title (plist-get params :title))
+ (body (plist-get params :body))
+ (app-name (plist-get params :app-name))
+ (replaces-id (plist-get params :replaces-id))
+ (app-icon (plist-get params :app-icon))
+ (actions (plist-get params :actions))
+ (timeout (plist-get params :timeout))
+ ;; Hints
+ (hints '())
+ (urgency (plist-get params :urgency))
+ (category (plist-get params :category))
+ (desktop-entry (plist-get params :desktop-entry))
+ (image-data (plist-get params :image-data))
+ (image-path (plist-get params :image-path))
+ (action-items (plist-get params :action-items))
+ (sound-file (plist-get params :sound-file))
+ (sound-name (plist-get params :sound-name))
+ (suppress-sound (plist-get params :suppress-sound))
+ (resident (plist-get params :resident))
+ (transient (plist-get params :transient))
+ (x (plist-get params :x))
+ (y (plist-get params :y))
+ id)
+ ;; Build hints array
+ (when urgency
+ (add-to-list 'hints `(:dict-entry
+ "urgency"
+ (:variant :byte ,(pcase urgency
+ (`low 0)
+ (`critical 2)
+ (_ 1)))) t))
+ (when category
+ (add-to-list 'hints `(:dict-entry
+ "category"
+ (:variant :string ,category)) t))
+ (when desktop-entry
+ (add-to-list 'hints `(:dict-entry
+ "desktop-entry"
+ (:variant :string ,desktop-entry)) t))
+ (when image-data
+ (add-to-list 'hints `(:dict-entry
+ "image-data"
+ (:variant :struct ,image-data)) t))
+ (when image-path
+ (add-to-list 'hints `(:dict-entry
+ "image-path"
+ (:variant :string ,image-path)) t))
+ (when action-items
+ (add-to-list 'hints `(:dict-entry
+ "action-items"
+ (:variant :boolean ,action-items)) t))
+ (when sound-file
+ (add-to-list 'hints `(:dict-entry
+ "sound-file"
+ (:variant :string ,sound-file)) t))
+ (when sound-name
+ (add-to-list 'hints `(:dict-entry
+ "sound-name"
+ (:variant :string ,sound-name)) t))
+ (when suppress-sound
+ (add-to-list 'hints `(:dict-entry
+ "suppress-sound"
+ (:variant :boolean ,suppress-sound)) t))
+ (when resident
+ (add-to-list 'hints `(:dict-entry
+ "resident"
+ (:variant :boolean ,resident)) t))
+ (when transient
+ (add-to-list 'hints `(:dict-entry
+ "transient"
+ (:variant :boolean ,transient)) t))
+ (when x
+ (add-to-list 'hints `(:dict-entry "x" (:variant :int32 ,x)) t))
+ (when y
+ (add-to-list 'hints `(:dict-entry "y" (:variant :int32 ,y)) t))
+
+ ;; Call Notify method.
+ (setq id
+ (dbus-call-method bus
+ notifications-service
+ notifications-path
+ notifications-interface
+ notifications-notify-method
+ :string (or app-name
+ notifications-application-name)
+ :uint32 (or replaces-id 0)
+ :string (if app-icon
+ (expand-file-name app-icon)
+ ;; If app-icon is nil because user
+ ;; requested it to be so, send the
+ ;; empty string
+ (if (plist-member params :app-icon)
+ ""
+ ;; Otherwise send the
+ ;; default icon path
+ notifications-application-icon))
+ :string (or title "")
+ :string (or body "")
+ `(:array ,@actions)
+ (or hints '(:array :signature "{sv}"))
+ :int32 (or timeout -1)))
+
+ ;; Register close/action callback function. We must also
+ ;; remember the daemon's unique name, because the daemon could
+ ;; have restarted.
+ (let ((on-action (plist-get params :on-action))
+ (on-close (plist-get params :on-close))
+ (unique-name (dbus-get-name-owner bus notifications-service)))
+ (when on-action
+ (add-to-list 'notifications-on-action-map
+ (list (list bus unique-name id) on-action))
+ (unless notifications-on-action-object
+ (setq notifications-on-action-object
+ (dbus-register-signal
+ bus
+ nil
+ notifications-path
+ notifications-interface
+ notifications-action-signal
+ 'notifications-on-action-signal))))
+
+ (when on-close
+ (add-to-list 'notifications-on-close-map
+ (list (list bus unique-name id) on-close))
+ (unless notifications-on-close-object
+ (setq notifications-on-close-object
+ (dbus-register-signal
+ bus
+ nil
+ notifications-path
+ notifications-interface
+ notifications-closed-signal
+ 'notifications-on-closed-signal)))))
+
+ ;; Return notification id
+ id)))
(defun notifications-close-notification (id &optional bus)
"Close a notification with identifier ID.
@@ -349,7 +354,7 @@ BUS can be a string denoting a D-Bus connection, the default is `:session'."
(defvar dbus-debug) ; used in the macroexpansion of dbus-ignore-errors
(defun notifications-get-capabilities (&optional bus)
- "Return the capabilities of the notification server, a list of strings.
+ "Return the capabilities of the notification server, a list of symbols.
BUS can be a string denoting a D-Bus connection, the default is `:session'.
The following capabilities can be expected:
@@ -371,12 +376,34 @@ The following capabilities can be expected:
Further vendor-specific caps start with `:x-vendor', like `:x-gnome-foo-cap'."
(dbus-ignore-errors
- (mapcar
- (lambda (x) (intern (concat ":" x)))
+ (mapcar
+ (lambda (x) (intern (concat ":" x)))
+ (dbus-call-method (or bus :session)
+ notifications-service
+ notifications-path
+ notifications-interface
+ notifications-get-capabilities-method))))
+
+(defun notifications-get-server-information (&optional bus)
+ "Return information on the notification server, a list of strings.
+BUS can be a string denoting a D-Bus connection, the default is `:session'.
+The returned list is (NAME VENDOR VERSION SPEC-VERSION).
+
+ NAME The product name of the server.
+ VENDOR The vendor name. For example, \"KDE\", \"GNOME\".
+ VERSION The server's version number.
+ SPEC-VERSION The specification version the server is compliant with.
+
+If SPEC_VERSION is missing, the server supports a specification
+prior to \"1.0\".
+
+See `notifications-specification-version' for the specification
+version this library is compliant with."
+ (dbus-ignore-errors
(dbus-call-method (or bus :session)
notifications-service
notifications-path
notifications-interface
- notifications-get-capabilities-method))))
+ notifications-get-server-information-method)))
(provide 'notifications)
diff --git a/lisp/novice.el b/lisp/novice.el
index 7966a89b995..92ba3d5277b 100644
--- a/lisp/novice.el
+++ b/lisp/novice.el
@@ -50,7 +50,6 @@ If nil, the feature is disabled, i.e., all commands work normally.")
(unless keys (setq keys (this-command-keys)))
(let (char)
(save-window-excursion
- (help-setup-xref (list 'disabled-command-function cmd keys) nil)
(with-output-to-temp-buffer "*Disabled Command*" ;; (help-buffer)
(if (or (eq (aref keys 0)
(if (stringp keys)
diff --git a/lisp/nxml/nxml-mode.el b/lisp/nxml/nxml-mode.el
index 2ee73235dd0..44271a689cf 100644
--- a/lisp/nxml/nxml-mode.el
+++ b/lisp/nxml/nxml-mode.el
@@ -540,7 +540,7 @@ Many aspects this mode can be customized using
(widen)
(nxml-clear-dependent-regions (point-min) (point-max))
(setq nxml-scan-end (copy-marker (point-min) nil))
- (nxml-with-unmodifying-text-property-changes
+ (with-silent-modifications
(nxml-clear-inside (point-min) (point-max))
(nxml-with-invisible-motion
(nxml-scan-prolog)))))
@@ -601,7 +601,7 @@ Many aspects this mode can be customized using
(save-excursion
(save-restriction
(widen)
- (nxml-with-unmodifying-text-property-changes
+ (with-silent-modifications
(nxml-clear-inside (point-min) (point-max))))))
;;; Change management
@@ -625,7 +625,7 @@ Many aspects this mode can be customized using
(widen)
(save-match-data
(nxml-with-invisible-motion
- (nxml-with-unmodifying-text-property-changes
+ (with-silent-modifications
(nxml-after-change1
start end pre-change-length)))))))))
@@ -910,7 +910,7 @@ Called with `font-lock-beg' and `font-lock-end' dynamically bound."
(widen)
(save-match-data
(nxml-with-invisible-motion
- (nxml-with-unmodifying-text-property-changes
+ (with-silent-modifications
(nxml-extend-after-change-region1
start end pre-change-length)))))))))
(if (consp region) region))))
diff --git a/lisp/nxml/nxml-outln.el b/lisp/nxml/nxml-outln.el
index e30aee3de53..dab22f7559f 100644
--- a/lisp/nxml/nxml-outln.el
+++ b/lisp/nxml/nxml-outln.el
@@ -149,7 +149,7 @@ See the variable `nxml-section-element-name-regexp' for more details."
(defun nxml-show-all ()
"Show all elements in the buffer normally."
(interactive)
- (nxml-with-unmodifying-text-property-changes
+ (with-silent-modifications
(remove-text-properties (point-min)
(point-max)
'(nxml-outline-state nil)))
@@ -370,7 +370,7 @@ customize which elements are recognized as sections and headings."
(get-text-property pos 'nxml-outline-state))
(defun nxml-set-outline-state (pos state)
- (nxml-with-unmodifying-text-property-changes
+ (with-silent-modifications
(if state
(put-text-property pos (1+ pos) 'nxml-outline-state state)
(remove-text-properties pos (1+ pos) '(nxml-outline-state nil)))))
diff --git a/lisp/nxml/nxml-rap.el b/lisp/nxml/nxml-rap.el
index bc87044cde6..5bc4d74456b 100644
--- a/lisp/nxml/nxml-rap.el
+++ b/lisp/nxml/nxml-rap.el
@@ -293,7 +293,7 @@ Sets variables like `nxml-token-after'."
(cond ((memq xmltok-type '(comment
cdata-section
processing-instruction))
- (nxml-with-unmodifying-text-property-changes
+ (with-silent-modifications
(nxml-set-inside (1+ xmltok-start) (point) xmltok-type)))
(xmltok-dependent-regions
(nxml-mark-parse-dependent-regions)))
@@ -338,7 +338,7 @@ Leave point unmoved if it is not inside anything special."
'(comment
processing-instruction
cdata-section))
- (nxml-with-unmodifying-text-property-changes
+ (with-silent-modifications
(nxml-set-inside (1+ xmltok-start)
(point)
xmltok-type)))
diff --git a/lisp/nxml/nxml-util.el b/lisp/nxml/nxml-util.el
index b2d9cdde183..6ba6d21f7ed 100644
--- a/lisp/nxml/nxml-util.el
+++ b/lisp/nxml/nxml-util.el
@@ -78,27 +78,6 @@ This is the inverse of `nxml-make-namespace'."
(nxml-degrade ,context ,error-symbol))))
`(progn ,@body)))
-(defmacro nxml-with-unmodifying-text-property-changes (&rest body)
- "Evaluate BODY without any text property changes modifying the buffer.
-Any text properties changes happen as usual but the changes are not treated as
-modifications to the buffer."
- (let ((modified (make-symbol "modified")))
- `(let ((,modified (buffer-modified-p))
- (inhibit-read-only t)
- (inhibit-modification-hooks t)
- (buffer-undo-list t)
- (deactivate-mark nil)
- ;; Apparently these avoid file locking problems.
- (buffer-file-name nil)
- (buffer-file-truename nil))
- (unwind-protect
- (progn ,@body)
- (unless ,modified
- (restore-buffer-modified-p nil))))))
-
-(put 'nxml-with-unmodifying-text-property-changes 'lisp-indent-function 0)
-(def-edebug-spec nxml-with-unmodifying-text-property-changes t)
-
(defmacro nxml-with-invisible-motion (&rest body)
"Evaluate body without calling any point motion hooks."
`(let ((inhibit-point-motion-hooks t))
diff --git a/lisp/nxml/rng-maint.el b/lisp/nxml/rng-maint.el
index 74192f213dc..ff73e3718ec 100644
--- a/lisp/nxml/rng-maint.el
+++ b/lisp/nxml/rng-maint.el
@@ -259,7 +259,7 @@
(defun rng-validate-buffer ()
(save-restriction
(widen)
- (nxml-with-unmodifying-text-property-changes
+ (with-silent-modifications
(rng-clear-cached-state (point-min) (point-max)))
;; 1+ to clear empty overlays at (point-max)
(rng-clear-overlays (point-min) (1+ (point-max))))
diff --git a/lisp/nxml/rng-nxml.el b/lisp/nxml/rng-nxml.el
index cfb8e33cccb..bc070136adb 100644
--- a/lisp/nxml/rng-nxml.el
+++ b/lisp/nxml/rng-nxml.el
@@ -380,9 +380,7 @@ set `xmltok-dtd'. Returns the position of the end of the token."
(< rng-validate-up-to-date-end pos))
;; Display percentage validated.
(force-mode-line-update)
- ;; Force redisplay but don't allow idle timers to run.
- (let ((timer-idle-list nil))
- (sit-for 0)))
+ (sit-for 0))
(message "Parsing...done"))
(save-excursion
(save-restriction
diff --git a/lisp/nxml/rng-valid.el b/lisp/nxml/rng-valid.el
index a87ab2532ce..e1140980813 100644
--- a/lisp/nxml/rng-valid.el
+++ b/lisp/nxml/rng-valid.el
@@ -244,7 +244,7 @@ to use for finding the schema."
(> (prefix-numeric-value arg) 0)))
(save-restriction
(widen)
- (nxml-with-unmodifying-text-property-changes
+ (with-silent-modifications
(rng-clear-cached-state (point-min) (point-max)))
;; 1+ to clear empty overlays at (point-max)
(rng-clear-overlays (point-min) (1+ (point-max)))
@@ -305,7 +305,7 @@ The schema is set like `rng-auto-set-schema'."
(defun rng-after-change-function (start end pre-change-len)
(setq rng-message-overlay-inhibit-point nil)
- (nxml-with-unmodifying-text-property-changes
+ (with-silent-modifications
(rng-clear-cached-state start end))
;; rng-validate-up-to-date-end holds the position before the change
;; Adjust it to reflect the change.
@@ -414,26 +414,17 @@ The schema is set like `rng-auto-set-schema'."
(defvar rng-validate-display-modified-p nil)
(defun rng-validate-while-idle-continue-p ()
- ;; input-pending-p and sit-for run timers that are
- ;; ripe. Binding timer-idle-list to nil prevents
- ;; this. If we don't do this, then any ripe timers
- ;; will get run, and we won't get any chance to
- ;; validate until Emacs becomes idle again or until
- ;; the other lower priority timers finish (which
- ;; can take a very long time in the case of
- ;; jit-lock).
- (let ((timer-idle-list nil))
- (and (not (input-pending-p))
- ;; Fake rng-validate-up-to-date-end so that the mode line
- ;; shows progress. Also use this to save point.
- (let ((rng-validate-up-to-date-end (point)))
- (goto-char rng-validate-display-point)
- (when (not rng-validate-display-modified-p)
- (restore-buffer-modified-p nil))
- (force-mode-line-update)
- (let ((continue (sit-for 0)))
- (goto-char rng-validate-up-to-date-end)
- continue)))))
+ (and (not (input-pending-p))
+ ;; Fake rng-validate-up-to-date-end so that the mode line
+ ;; shows progress. Also use this to save point.
+ (let ((rng-validate-up-to-date-end (point)))
+ (goto-char rng-validate-display-point)
+ (when (not rng-validate-display-modified-p)
+ (restore-buffer-modified-p nil))
+ (force-mode-line-update)
+ (let ((continue (sit-for 0)))
+ (goto-char rng-validate-up-to-date-end)
+ continue))))
;; Calling rng-do-some-validation once with a continue-p function, as
;; opposed to calling it repeatedly, helps on initial validation of a
@@ -442,24 +433,26 @@ The schema is set like `rng-auto-set-schema'."
;; validation process down.
(defun rng-validate-while-idle (buffer)
- (with-current-buffer buffer
- (if rng-validate-mode
- (if (let ((rng-validate-display-point (point))
- (rng-validate-display-modified-p (buffer-modified-p)))
- (rng-do-some-validation 'rng-validate-while-idle-continue-p))
- (force-mode-line-update)
- (rng-validate-done))
- ;; must have done kill-all-local-variables
- (rng-kill-timers))))
+ (when (buffer-live-p buffer) ; bug#13999
+ (with-current-buffer buffer
+ (if rng-validate-mode
+ (if (let ((rng-validate-display-point (point))
+ (rng-validate-display-modified-p (buffer-modified-p)))
+ (rng-do-some-validation 'rng-validate-while-idle-continue-p))
+ (force-mode-line-update)
+ (rng-validate-done))
+ ;; must have done kill-all-local-variables
+ (rng-kill-timers)))))
(defun rng-validate-quick-while-idle (buffer)
- (with-current-buffer buffer
- (if rng-validate-mode
- (if (rng-do-some-validation)
- (force-mode-line-update)
- (rng-validate-done))
- ;; must have done kill-all-local-variables
- (rng-kill-timers))))
+ (when (buffer-live-p buffer) ; bug#13999
+ (with-current-buffer buffer
+ (if rng-validate-mode
+ (if (rng-do-some-validation)
+ (force-mode-line-update)
+ (rng-validate-done))
+ ;; must have done kill-all-local-variables
+ (rng-kill-timers)))))
(defun rng-validate-done ()
(when (or (not (current-message))
@@ -478,7 +471,7 @@ The schema is set like `rng-auto-set-schema'."
(condition-case-unless-debug err
(and (rng-validate-prepare)
(let ((rng-dt-namespace-context-getter '(nxml-ns-get-context)))
- (nxml-with-unmodifying-text-property-changes
+ (with-silent-modifications
(rng-do-some-validation-1 continue-p-function))))
;; errors signaled from a function run by an idle timer
;; are ignored; if we don't catch them, validation
@@ -880,9 +873,7 @@ means goto the first error."
(< rng-validate-up-to-date-end (point-max)))
;; Display percentage validated.
(force-mode-line-update)
- ;; Force redisplay but don't allow idle timers to run.
- (let ((timer-idle-list nil))
- (sit-for 0))
+ (sit-for 0)
(setq pos
(max pos (1- rng-validate-up-to-date-end)))
t)))))
@@ -905,9 +896,7 @@ means goto the first error."
(while (and (rng-do-some-validation)
(< rng-validate-up-to-date-end (min pos (point-max))))
(force-mode-line-update)
- ;; Force redisplay but don't allow idle timers to run.
- (let ((timer-idle-list nil))
- (sit-for 0)))
+ (sit-for 0))
(while (and (> arg 0)
(setq err (rng-find-previous-error-overlay pos)))
(setq pos (overlay-start err))
diff --git a/lisp/obsolete/iso-insert.el b/lisp/obsolete/iso-insert.el
index 18cf87a4c6f..2c0adf32d12 100644
--- a/lisp/obsolete/iso-insert.el
+++ b/lisp/obsolete/iso-insert.el
@@ -1,4 +1,4 @@
-;;; iso-insert.el --- insert functions for ISO 8859/1 -*- coding: iso-8859-1;-*-
+;;; iso-insert.el --- insert functions for ISO 8859/1 -*- coding: utf-8;-*-
;; Copyright (C) 1987, 1994, 2001-2013 Free Software Foundation, Inc.
@@ -31,482 +31,482 @@
(defun insert-no-break-space ()
(interactive "*")
- (insert ?\ )
+ (insert ?\ )
)
(defun insert-inverted-exclamation-mark ()
(interactive "*")
- (insert ?\¡)
+ (insert ?\¡)
)
(defun insert-cent-sign ()
(interactive "*")
- (insert ?\¢)
+ (insert ?\¢)
)
(defun insert-pound-sign ()
(interactive "*")
- (insert ?\£)
+ (insert ?\£)
)
(defun insert-general-currency-sign ()
(interactive "*")
- (insert ?\¤)
+ (insert ?\¤)
)
(defun insert-yen-sign ()
(interactive "*")
- (insert ?\¥)
+ (insert ?\Â¥)
)
(defun insert-broken-vertical-line ()
(interactive "*")
- (insert ?\¦)
+ (insert ?\¦)
)
(defun insert-section-sign ()
(interactive "*")
- (insert ?\§)
+ (insert ?\§)
)
(defun insert-diaeresis ()
(interactive "*")
- (insert ?\¨)
+ (insert ?\¨)
)
(defun insert-copyright-sign ()
(interactive "*")
- (insert ?\©)
+ (insert ?\©)
)
(defun insert-ordinal-indicator-feminine ()
(interactive "*")
- (insert ?\ª)
+ (insert ?\ª)
)
(defun insert-angle-quotation-mark-left ()
(interactive "*")
- (insert ?\«)
+ (insert ?\«)
)
(defun insert-not-sign ()
(interactive "*")
- (insert ?\¬)
+ (insert ?\¬)
)
(defun insert-soft-hyphen ()
(interactive "*")
- (insert ?\­)
+ (insert ?\­)
)
(defun insert-registered-sign ()
(interactive "*")
- (insert ?\®)
+ (insert ?\®)
)
(defun insert-macron ()
(interactive "*")
- (insert ?\¯)
+ (insert ?\¯)
)
(defun insert-degree-sign ()
(interactive "*")
- (insert ?\°)
+ (insert ?\°)
)
(defun insert-plus-or-minus-sign ()
(interactive "*")
- (insert ?\±)
+ (insert ?\±)
)
(defun insert-superscript-two ()
(interactive "*")
- (insert ?\²)
+ (insert ?\²)
)
(defun insert-superscript-three ()
(interactive "*")
- (insert ?\³)
+ (insert ?\³)
)
(defun insert-acute-accent ()
(interactive "*")
- (insert ?\´)
+ (insert ?\´)
)
(defun insert-micro-sign ()
(interactive "*")
- (insert ?\µ)
+ (insert ?\µ)
)
(defun insert-pilcrow ()
(interactive "*")
- (insert ?\¶)
+ (insert ?\¶)
)
(defun insert-middle-dot ()
(interactive "*")
- (insert ?\·)
+ (insert ?\·)
)
(defun insert-cedilla ()
(interactive "*")
- (insert ?\¸)
+ (insert ?\¸)
)
(defun insert-superscript-one ()
(interactive "*")
- (insert ?\¹)
+ (insert ?\¹)
)
(defun insert-ordinal-indicator-masculine ()
(interactive "*")
- (insert ?\º)
+ (insert ?\º)
)
(defun insert-angle-quotation-mark-right ()
(interactive "*")
- (insert ?\»)
+ (insert ?\»)
)
(defun insert-fraction-one-quarter ()
(interactive "*")
- (insert ?\¼)
+ (insert ?\¼)
)
(defun insert-fraction-one-half ()
(interactive "*")
- (insert ?\½)
+ (insert ?\½)
)
(defun insert-fraction-three-quarters ()
(interactive "*")
- (insert ?\¾)
+ (insert ?\¾)
)
(defun insert-inverted-question-mark ()
(interactive "*")
- (insert ?\¿)
+ (insert ?\¿)
)
(defun insert-A-grave ()
(interactive "*")
- (insert ?\À)
+ (insert ?\À)
)
(defun insert-A-acute ()
(interactive "*")
- (insert ?\Á)
+ (insert ?\Ã)
)
(defun insert-A-circumflex ()
(interactive "*")
- (insert ?\Â)
+ (insert ?\Â)
)
(defun insert-A-tilde ()
(interactive "*")
- (insert ?\Ã)
+ (insert ?\Ã)
)
(defun insert-A-umlaut ()
(interactive "*")
- (insert ?\Ä)
+ (insert ?\Ä)
)
(defun insert-A-ring ()
(interactive "*")
- (insert ?\Å)
+ (insert ?\Ã…)
)
(defun insert-AE ()
(interactive "*")
- (insert ?\Æ)
+ (insert ?\Æ)
)
(defun insert-C-cedilla ()
(interactive "*")
- (insert ?\Ç)
+ (insert ?\Ç)
)
(defun insert-E-grave ()
(interactive "*")
- (insert ?\È)
+ (insert ?\È)
)
(defun insert-E-acute ()
(interactive "*")
- (insert ?\É)
+ (insert ?\É)
)
(defun insert-E-circumflex ()
(interactive "*")
- (insert ?\Ê)
+ (insert ?\Ê)
)
(defun insert-E-umlaut ()
(interactive "*")
- (insert ?\Ë)
+ (insert ?\Ë)
)
(defun insert-I-grave ()
(interactive "*")
- (insert ?\Ì)
+ (insert ?\Ì)
)
(defun insert-I-acute ()
(interactive "*")
- (insert ?\Í)
+ (insert ?\Ã)
)
(defun insert-I-circumflex ()
(interactive "*")
- (insert ?\Î)
+ (insert ?\ÃŽ)
)
(defun insert-I-umlaut ()
(interactive "*")
- (insert ?\Ï)
+ (insert ?\Ã)
)
(defun insert-D-stroke ()
(interactive "*")
- (insert ?\Ð)
+ (insert ?\Ã)
)
(defun insert-N-tilde ()
(interactive "*")
- (insert ?\Ñ)
+ (insert ?\Ñ)
)
(defun insert-O-grave ()
(interactive "*")
- (insert ?\Ò)
+ (insert ?\Ã’)
)
(defun insert-O-acute ()
(interactive "*")
- (insert ?\Ó)
+ (insert ?\Ó)
)
(defun insert-O-circumflex ()
(interactive "*")
- (insert ?\Ô)
+ (insert ?\Ô)
)
(defun insert-O-tilde ()
(interactive "*")
- (insert ?\Õ)
+ (insert ?\Õ)
)
(defun insert-O-umlaut ()
(interactive "*")
- (insert ?\Ö)
+ (insert ?\Ö)
)
(defun insert-multiplication-sign ()
(interactive "*")
- (insert ?\×)
+ (insert ?\×)
)
(defun insert-O-slash ()
(interactive "*")
- (insert ?\Ø)
+ (insert ?\Ø)
)
(defun insert-U-grave ()
(interactive "*")
- (insert ?\Ù)
+ (insert ?\Ù)
)
(defun insert-U-acute ()
(interactive "*")
- (insert ?\Ú)
+ (insert ?\Ú)
)
(defun insert-U-circumflex ()
(interactive "*")
- (insert ?\Û)
+ (insert ?\Û)
)
(defun insert-U-umlaut ()
(interactive "*")
- (insert ?\Ü)
+ (insert ?\Ü)
)
(defun insert-Y-acute ()
(interactive "*")
- (insert ?\Ý)
+ (insert ?\Ã)
)
(defun insert-THORN ()
(interactive "*")
- (insert ?\Þ)
+ (insert ?\Þ)
)
(defun insert-ss ()
(interactive "*")
- (insert ?\ß)
+ (insert ?\ß)
)
(defun insert-a-grave ()
(interactive "*")
- (insert ?\à)
+ (insert ?\à)
)
(defun insert-a-acute ()
(interactive "*")
- (insert ?\á)
+ (insert ?\á)
)
(defun insert-a-circumflex ()
(interactive "*")
- (insert ?\â)
+ (insert ?\â)
)
(defun insert-a-tilde ()
(interactive "*")
- (insert ?\ã)
+ (insert ?\ã)
)
(defun insert-a-umlaut ()
(interactive "*")
- (insert ?\ä)
+ (insert ?\ä)
)
(defun insert-a-ring ()
(interactive "*")
- (insert ?\å)
+ (insert ?\Ã¥)
)
(defun insert-ae ()
(interactive "*")
- (insert ?\æ)
+ (insert ?\æ)
)
(defun insert-c-cedilla ()
(interactive "*")
- (insert ?\ç)
+ (insert ?\ç)
)
(defun insert-e-grave ()
(interactive "*")
- (insert ?\è)
+ (insert ?\è)
)
(defun insert-e-acute ()
(interactive "*")
- (insert ?\é)
+ (insert ?\é)
)
(defun insert-e-circumflex ()
(interactive "*")
- (insert ?\ê)
+ (insert ?\ê)
)
(defun insert-e-umlaut ()
(interactive "*")
- (insert ?\ë)
+ (insert ?\ë)
)
(defun insert-i-grave ()
(interactive "*")
- (insert ?\ì)
+ (insert ?\ì)
)
(defun insert-i-acute ()
(interactive "*")
- (insert ?\í)
+ (insert ?\í)
)
(defun insert-i-circumflex ()
(interactive "*")
- (insert ?\î)
+ (insert ?\î)
)
(defun insert-i-umlaut ()
(interactive "*")
- (insert ?\ï)
+ (insert ?\ï)
)
(defun insert-d-stroke ()
(interactive "*")
- (insert ?\ð)
+ (insert ?\ð)
)
(defun insert-n-tilde ()
(interactive "*")
- (insert ?\ñ)
+ (insert ?\ñ)
)
(defun insert-o-grave ()
(interactive "*")
- (insert ?\ò)
+ (insert ?\ò)
)
(defun insert-o-acute ()
(interactive "*")
- (insert ?\ó)
+ (insert ?\ó)
)
(defun insert-o-circumflex ()
(interactive "*")
- (insert ?\ô)
+ (insert ?\ô)
)
(defun insert-o-tilde ()
(interactive "*")
- (insert ?\õ)
+ (insert ?\õ)
)
(defun insert-o-umlaut ()
(interactive "*")
- (insert ?\ö)
+ (insert ?\ö)
)
(defun insert-division-sign ()
(interactive "*")
- (insert ?\÷)
+ (insert ?\÷)
)
(defun insert-o-slash ()
(interactive "*")
- (insert ?\ø)
+ (insert ?\ø)
)
(defun insert-u-grave ()
(interactive "*")
- (insert ?\ù)
+ (insert ?\ù)
)
(defun insert-u-acute ()
(interactive "*")
- (insert ?\ú)
+ (insert ?\ú)
)
(defun insert-u-circumflex ()
(interactive "*")
- (insert ?\û)
+ (insert ?\û)
)
(defun insert-u-umlaut ()
(interactive "*")
- (insert ?\ü)
+ (insert ?\ü)
)
(defun insert-y-acute ()
(interactive "*")
- (insert ?\ý)
+ (insert ?\ý)
)
(defun insert-thorn ()
(interactive "*")
- (insert ?\þ)
+ (insert ?\þ)
)
(defun insert-y-umlaut ()
(interactive "*")
- (insert ?\ÿ)
+ (insert ?\ÿ)
)
(defvar 8859-1-map nil "Keymap for ISO 8859/1 character insertion.")
diff --git a/lisp/longlines.el b/lisp/obsolete/longlines.el
index 833cede360b..b68a191d55a 100644
--- a/lisp/longlines.el
+++ b/lisp/obsolete/longlines.el
@@ -6,6 +6,7 @@
;; Alex Schroeder <alex@gnu.org>
;; Chong Yidong <cyd@stupidchicken.com>
;; Maintainer: Chong Yidong <cyd@stupidchicken.com>
+;; Obsolete-since: 24.4
;; Keywords: convenience, wp
;; This file is part of GNU Emacs.
@@ -278,7 +279,7 @@ end of the buffer."
If wrapping is performed, point remains on the line. If the line does
not need to be wrapped, move point to the next line and return t."
(if (longlines-set-breakpoint)
- (progn (insert-before-markers ?\n)
+ (progn (insert-before-markers-and-inherit ?\n)
(backward-char 1)
(delete-char -1)
(forward-char 1)
@@ -384,8 +385,12 @@ compatibility with `format-alist', and is ignored."
(mod (buffer-modified-p)))
(goto-char (min beg end))
(while (search-forward "\n" reg-max t)
- (unless (get-text-property (match-beginning 0) 'hard)
- (replace-match " ")))
+ (let ((pos (match-beginning 0)))
+ (unless (get-text-property pos 'hard)
+ (goto-char (1+ pos))
+ (insert-and-inherit " ")
+ (delete-region pos (1+ pos))
+ (remove-text-properties pos (1+ pos) 'hard))))
(set-buffer-modified-p mod)
end)))
diff --git a/lisp/terminal.el b/lisp/obsolete/terminal.el
index e7903c65061..7f65d336899 100644
--- a/lisp/terminal.el
+++ b/lisp/obsolete/terminal.el
@@ -5,6 +5,7 @@
;; Author: Richard Mlynarik <mly@eddie.mit.edu>
;; Maintainer: FSF
+;; Obsolete-since: 24.4
;; Keywords: comm, terminals
;; This file is part of GNU Emacs.
@@ -24,14 +25,14 @@
;;; Commentary:
-;;; This file has been censored by the Communications Decency Act.
-;;; That law was passed under the guise of a ban on pornography, but
-;;; it bans far more than that. This file did not contain pornography,
-;;; but it was censored nonetheless.
+;; This file has been censored by the Communications Decency Act.
+;; That law was passed under the guise of a ban on pornography, but
+;; it bans far more than that. This file did not contain pornography,
+;; but it was censored nonetheless.
-;;; For information on US government censorship of the Internet, and
-;;; what you can do to bring back freedom of the press, see the web
-;;; site http://www.vtw.org/
+;; For information on US government censorship of the Internet, and
+;; what you can do to bring back freedom of the press, see the web
+;; site http://www.vtw.org/
;;; Code:
diff --git a/lisp/play/yow.el b/lisp/obsolete/yow.el
index 10c69347469..42bb0a0b354 100644
--- a/lisp/play/yow.el
+++ b/lisp/obsolete/yow.el
@@ -5,6 +5,7 @@
;; Maintainer: FSF
;; Author: Richard Mlynarik
;; Keywords: games
+;; Obsolete-since: 24.4
;; This file is part of GNU Emacs.
@@ -24,6 +25,8 @@
;;; Commentary:
;; Important pinheadery for GNU Emacs.
+;; This file is obsolete. For similar functionality, see
+;; fortune.el and cookie1.el.
;;; Code:
diff --git a/lisp/org/ChangeLog b/lisp/org/ChangeLog
index cb3d201ee25..7ea780f2aa6 100644
--- a/lisp/org/ChangeLog
+++ b/lisp/org/ChangeLog
@@ -1,6 +1,8 @@
-2013-03-11 Glenn Morris <rgm@gnu.org>
+2013-04-18 Stefan Monnier <monnier@iro.umontreal.ca>
- * Version 24.3 released.
+ * org-agenda.el (org-agenda-mode):
+ * org-indent.el (org-indent-mode): Use the `local' arg of
+ add-hook/remove-hook.
2013-03-08 Bastien Guerry <bzg@gnu.org>
@@ -15,9 +17,8 @@
2013-02-28 Bastien Guerry <bzg@gnu.org>
- * org-indent.el
- (org-indent-add-properties): Bugfix: prevent negative value for
- `added-ind-per-lvl'.
+ * org-indent.el (org-indent-add-properties): Bugfix: prevent
+ negative value for `added-ind-per-lvl'.
* org.el (org-mode): Add `org-fix-ellipsis-at-bol' to
`isearch-mode-end-hook' so that any isearch fixes the problem with
@@ -25,12 +26,12 @@
(org-fix-ellipsis-at-bol): New defsubst.
(org-show-context, org-isearch-end): Use it.
- * org.el (org-show-context): Remove useless catch. Make sure the
- top of the window is a visible headline.
+ * org.el (org-show-context): Remove useless catch.
+ Make sure the top of the window is a visible headline.
(org-activate-plain-links): Remove unused catch.
- * org-macs.el (org-get-alist-option): Return nil, not (nil), so
- that `org-show-context' DTRT.
+ * org-macs.el (org-get-alist-option): Return nil, not (nil),
+ so that `org-show-context' DTRT.
* org.el (org-imenu-get-tree): Fix bug when matching against empty
headlines.
@@ -38,7 +39,6 @@
* org.el (org-overview): Stay on current line.
(org-map-entries): Fix docstring.
(org-at-clock-log-p): Delete.
-
* org-clock.el (org-at-clock-log-p): Move here.
* org.el (org-tsr-regexp-both): Don't activate dates in links.
@@ -57,30 +57,28 @@
* org-mobile.el (org-mobile-edit): DTRT when inserting a heading
in an invisible region.
- * org.el (org-insert-heading-respect-content): New `invisible-ok'
- parameter. Add docstring.
+ * org.el (org-insert-heading-respect-content): Add docstring.
+ New `invisible-ok' parameter.
(org-insert-todo-heading-respect-content): Add docstring.
- * ob-tangle.el (org-babel-tangle-collect-blocks): Bugfix: remove
- code references from blocks.
+ * ob-tangle.el (org-babel-tangle-collect-blocks):
+ Bugfix: remove code references from blocks.
* org-agenda.el (org-agenda-schedule, org-agenda-deadline):
Cosmetic changes.
(org-agenda-show-new-time): Fix bug when displaying a temporary
overlay with the scheduled/deadline information.
- * org.el (org-fill-paragraph-with-timestamp-nobreak-p): New
- function.
+ * org.el (org-fill-paragraph-with-timestamp-nobreak-p): New function.
(org-setup-filling): Use it to prevent breaking a timestamp when
filling a paragraph.
- * org-id.el (org-id-get-with-outline-path-completion): Fix
- docstring.
+ * org-id.el (org-id-get-with-outline-path-completion): Fix docstring.
2013-02-28 Tim Burt <tcburt@rochester.rr.com> (tiny change)
- * org-datetree.el (org-datetree-find-year-create): Match headlines
- with tags.
+ * org-datetree.el (org-datetree-find-year-create):
+ Match headlines with tags.
2013-02-07 Bastien Guerry <bzg@gnu.org>
@@ -127,8 +125,8 @@
(org-agenda-get-blocks): Don't use
`org-agenda-no-heading-message', skip the entry.
- * org.el (org-agenda-inhibit-startup-visibility-cycling): New
- option.
+ * org.el (org-agenda-inhibit-startup-visibility-cycling):
+ New option.
(org-agenda-prepare-buffers): Use it to speed up the agenda
generation.
@@ -203,8 +201,8 @@
* org-compat.el (org-condition-case-unless-debug): Delete.
- * org-odt.el (org-odt-cleanup-xml-buffers): Use
- `condition-case' instead of `org-condition-case-unless-debug',
+ * org-odt.el (org-odt-cleanup-xml-buffers):
+ Use `condition-case' instead of `org-condition-case-unless-debug',
which is now deleted.
* org-capture.el (org-capture-templates-contexts):
@@ -235,10 +233,10 @@
2013-01-13 Michael Albinus <michael.albinus@gmx.de>
- * ob-eval.el (org-babel-shell-command-on-region): Use
- `executable-find' for local `shell-file-name'.
+ * ob-eval.el (org-babel-shell-command-on-region):
+ Use `executable-find' for local `shell-file-name'.
-2013-01-08 Achim Gratz <Stromeko@Stromeko.de>
+2013-01-09 Achim Gratz <Stromeko@Stromeko.de>
* org-faces.el: Define face alias mode-line for XEmacs (it's
called modeline there).
@@ -249,21 +247,20 @@
byte-compiling.
* org.el (org-get-location, org-switch-to-buffer-other-window):
- Use the wrapper `org-no-popups´ to let-bind the correct variables
+ Use the wrapper `org-no-popups' to let-bind the correct variables
for suppression of popup windows.
- * org-compat.el (user-error): Defalias to `error´ for Emacsen that
+ * org-compat.el (user-error): Defalias to `error' for Emacsen that
don't have it.
* org-agenda.el (org-agenda-write): Use org-called-interactively-p
instead of called-interactively-p.
* org.el (org-find-invisible-foreground): Do not use the value of
- variables `default-frame-alist´, `initial-frame-alist´ and
- `window-system-default-frame-alist´ when their symbol is not
- bound.
+ variables `default-frame-alist', `initial-frame-alist' and
+ `window-system-default-frame-alist' when their symbol is not bound.
-2013-01-08 Bastien Guerry <bzg@gnu.org>
+2013-01-09 Bastien Guerry <bzg@gnu.org>
* org-src.el (org-edit-src-code): Fix bug when trying to edit a
table.el table.
@@ -272,8 +269,7 @@
whole function.
* org.el (org-entry-get): Speed up by let-binding some variables
- only if needed. Also fix a bug: consider an empty drawer as no
- drawer.
+ only if needed. Also fix a bug: consider an empty drawer as no drawer.
* org-agenda.el (org-search-view, org-agenda-get-todos)
(org-agenda-get-timestamps, org-agenda-get-sexps)
@@ -299,8 +295,8 @@
* org-clock.el (org-clock-in): Use the renamed defun.
- * org-icalendar.el (org-icalendar-print-entries): Refresh the
- 'org-appt-warntime property.
+ * org-icalendar.el (org-icalendar-print-entries):
+ Refresh the 'org-appt-warntime property.
(org-icalendar-print-entries):
* org-agenda.el (org-agenda-get-timestamps)
(org-agenda-get-sexps, org-agenda-get-deadlines)
@@ -311,28 +307,24 @@
* org-agenda.el (org-agenda-format-item): Do not use
`org-get-effort' to get the effort text property.
- (org-agenda-get-sexps): Use `org-back-to-heading' when setting the
- tags.
+ (org-agenda-get-sexps): Use `org-back-to-heading' when setting tags.
* org-clock.el (org-clock-in): Refresh effort properties.
* org.el (org-refresh-effort-properties): New defun.
(org-get-effort): Delete.
(org-set-effort):
- (org-property-next-allowed-value): Set the 'org-effort text
- property.
+ (org-property-next-allowed-value): Set the 'org-effort text property.
(org-agenda-prepare-buffers): Refresh effort properties.
* org.el (org-read-date): Let-bind `mouse-autoselect-window' to
- nil so that the mouse doesn't jump when the option is set to t
- globally.
+ nil so that the mouse doesn't jump when the option is set to t globally.
* org-agenda.el (org-agenda-dim-blocked-tasks): Default to nil.
(org-agenda-dim-blocked-tasks): Make interactive and allow an
optional parameter 'invisible to hide blocked tasks instead of
just dimming them.
- (org-agenda-mode-map): Bind `org-agenda-dim-blocked-tasks' to
- "#".
+ (org-agenda-mode-map): Bind `org-agenda-dim-blocked-tasks' to "#".
* org-agenda.el (org-agenda-finalize): Don't try to align tags
when there are no tags. Only try to draw the habit consistency
@@ -344,17 +336,16 @@
* org.el (org-get-priority): Save match data even when using
`org-get-priority-function'.
- * org-mobile.el (org-mobile-create-index-file): Possibly normalize
- `org-todo-keywords'.
+ * org-mobile.el (org-mobile-create-index-file):
+ Possibly normalize `org-todo-keywords'.
- * org-mobile.el (org-mobile-push): Use the correct agenda buffer
- names.
+ * org-mobile.el (org-mobile-push): Use the correct agenda buffer names.
* org.el (org-store-link): Use `org-id-link-to-org-use-id' instead
of the obsolete variable name.
- * org.el (org-fontify-meta-lines-and-blocks-1): Fix bug when
- fontifying keywords with no value.
+ * org.el (org-fontify-meta-lines-and-blocks-1):
+ Fix bug when fontifying keywords with no value.
* org.el (org-goto-auto-isearch): Enhance docstring.
(org-goto-map): Make a defun, so that the customized value of
@@ -366,8 +357,8 @@
* org-exp.el (org-export-as-org): Remove useless argument.
* org-docbook.el (org-export-as-docbook-batch)
- (org-export-region-as-docbook, org-export-as-docbook-pdf): Fix
- the number of arguments.
+ (org-export-region-as-docbook, org-export-as-docbook-pdf):
+ Fix the number of arguments.
(org-export-as-docbook): Remove useless argument.
* org.el (org-speed-commands-default): Use ":" instead of ";" for
@@ -381,8 +372,7 @@
* org-latex.el (org-export-as-latex): Fix typo in docstring.
- * org-list.el (org-cycle-include-plain-lists): Docstring
- enhancement.
+ * org-list.el (org-cycle-include-plain-lists): Docstring enhancement.
* org.el (org-fontify-meta-lines-and-blocks-1): Fix fontification
bug when fontifying a keyword with no associated value.
@@ -415,15 +405,14 @@
* org.el (org-offer-links-in-entry): Do not open the link directly
through `org-open-link-from-string', only offer to select a link
- and return a cons with the link (as a string) and the end of
- entry.
+ and return a cons with the link (as a string) and the end of entry.
(org-open-at-point): Use `org-offer-links-in-entry' correctly.
- * org.el (org-cycle-internal-local): Fix bug: allow headings with
- leading blank characters.
+ * org.el (org-cycle-internal-local):
+ Fix bug: allow headings with leading blank characters.
- * org-clock.el (org-clock-persist): Docstring fix: document the
- 'history value.
+ * org-clock.el (org-clock-persist):
+ Docstring fix: document the 'history value.
* org.el (org-insert-link): Fix bug when inserting links to
headlines containing the ">" character.
@@ -434,8 +423,8 @@
for Emacs 22, where `delete-directory' does not support recursive
deletion.
- * org-odt.el (org-odt-cleanup-xml-buffers): Use the new
- compatibility function.
+ * org-odt.el (org-odt-cleanup-xml-buffers):
+ Use the new compatibility function.
* org.el (org-table-map-tables): Fix allowed blocks.
@@ -460,8 +449,8 @@
(org-edit-special): Fix bug about editing special blocks
"example" and "verbatim".
- * org.el (org-delete-backward-char, org-delete-char): Save match
- data, `delete-backward-char' and `delete-char' don't.
+ * org.el (org-delete-backward-char, org-delete-char):
+ Save match data, `delete-backward-char' and `delete-char' don't.
* org.el (org-enable-table-editor, org-insert-heading)
(org-remove-timestamp-with-keyword, org-self-insert-command):
@@ -469,8 +458,8 @@
(orgtbl-self-insert-command):
* org-latex.el (org-export-latex-subcontent):
* org-clock.el (org-clocktable-write-default):
- * org-ascii.el (org-export-ascii-preprocess): Use
- `delete-backward-char' instead of `backward-delete-char'.
+ * org-ascii.el (org-export-ascii-preprocess):
+ Use `delete-backward-char' instead of `backward-delete-char'.
* org.el (org-todo): Ignore the comment string when changing the
TODO state of a headline.
@@ -484,8 +473,7 @@
(org-export-as-html-and-open, org-export-as-html-batch)
(org-export-region-as-html): Don't use obsolete arg.
- * org-ascii.el (org-export-as-ascii): Delete obsolete arg
- `hidden'.
+ * org-ascii.el (org-export-as-ascii): Delete obsolete arg `hidden'.
(org-export-as-ascii-to-buffer): Don't use obsolete arg.
* org.el (org-in-fixed-width-region-p): Save match data.
@@ -517,11 +505,10 @@
* org-agenda.el (org-agenda-skip): Only check if point is
inside a code block, not at a code block.
- * org.el (org-in-fixed-width-region-p): Rewrite using
- org-element.el.
+ * org.el (org-in-fixed-width-region-p):
+ Rewrite using org-element.el.
- * org.el (org-fill-paragraph): Fill correctly in source code
- block.
+ * org.el (org-fill-paragraph): Fill correctly in source code block.
* org.el (org-in-fixed-width-region-p): New function.
(org-edit-special): Fix bug: make sure to DTRT in every
@@ -540,7 +527,7 @@
* org-src.el (org-edit-src-code): Fix bug triggered by the sexp
(copy-marker nil) on Emacs <24.1.
-2013-01-08 Dmitry Antipov <dmantipov@yandex.ru>
+2013-01-09 Dmitry Antipov <dmantipov@yandex.ru>
* org-agenda.el (org-agenda-get-restriction-and-command):
* org-capture.el (org-capture-place-template):
@@ -549,17 +536,17 @@
* org-table.el (org-table-convert-region):
* org.el (org-update-statistics-cookies): Use `point-marker'.
-2013-01-08 Eric Schulte <eric.schulte@gmx.com>
+2013-01-09 Eric Schulte <eric.schulte@gmx.com>
* org-exp.el (org-export-string): Pass the dir option on through
to any subsequent export functions.
-2013-01-08 Henning Weiss <hdweiss@gmail.com> (tiny change)
+2013-01-09 Henning Weiss <hdweiss@gmail.com> (tiny change)
* org-mobile.el (org-mobile-sumo-agenda-command): Remove match
description from block agendas when they have a title.
-2013-01-08 Jambunathan K <kjambunathan@gmail.com>
+2013-01-09 Jambunathan K <kjambunathan@gmail.com>
* org-odt.el (org-export-as-odt-batch): Init `org-odt-zip-dir'.
Fix Emacs Bug#13254.
@@ -567,20 +554,11 @@
* org-odt.el (org-odt-format-org-link): Add check for presence of
description in headline links.
-2013-01-08 Michael Albinus <michael.albinus@gmx.de>
-
- * ob.el (org-babel-temp-file): Fix setting of
- `temporary-file-directory' on remote hosts.
-
- * ob-eval.el (org-babel-shell-command-on-region): Use
- `process-file' instead of `call-process-region'. The latter one
- does not work on remote hosts.
-
-2013-01-08 Michael Gauland <mike_gauland@stanfordalumni.org> (tiny change)
+2013-01-09 Michael Gauland <mike_gauland@stanfordalumni.org> (tiny change)
* org-src.el: Create a marker to pass to copy-marker.
-2013-01-08 Nicolas Goaziou <n.goaziou@gmail.com>
+2013-01-09 Nicolas Goaziou <n.goaziou@gmail.com>
* org.el (org-setup-filling): Set `auto-fill-inhibit-regexp' to
nil because `org-adaptive-fill-function' already determines which
@@ -589,15 +567,23 @@
* org.el (org-fill-paragraph): Small refactoring.
* org-element.el (org-element--parse-elements)
- (org-element-at-point): Fix parsing of a list in a block in a
- list.
+ (org-element-at-point): Fix parsing of a list in a block in a list.
+
+2013-01-09 Sebastien Vauban <wxhgmqzgwmuf-geNee64TY+gS+FvcfC7Uqw@public.gmane.org>
-2013-01-08 Sebastien Vauban <wxhgmqzgwmuf-geNee64TY+gS+FvcfC7Uqw@public.gmane.org>
+ * org.el (org-copy-subtree, org-paste-subtree):
+ Fix whitespace handling when copying/pasting a subtree.
- * org.el (org-copy-subtree, org-paste-subtree): Fix whitespace
- handling when copying/pasting a subtree.
+2012-12-20 Michael Albinus <michael.albinus@gmx.de>
-2012-12-12 Bastien Guerry <bzg@gnu.org>
+ * ob.el (org-babel-temp-file): Fix setting of
+ `temporary-file-directory' on remote hosts.
+
+ * ob-eval.el (org-babel-shell-command-on-region):
+ Use `process-file' instead of `call-process-region'. The latter one
+ does not work on remote hosts.
+
+2012-12-13 Bastien Guerry <bzg@gnu.org>
* org-latex.el (org-export-latex-links): Escape raw path when
exporting links to files.
@@ -623,8 +609,8 @@
* org-timer.el (org-timer-stop): Add message.
- * org-agenda.el (org-agenda-schedule, org-agenda-deadline): Fix
- redundant messages.
+ * org-agenda.el (org-agenda-schedule, org-agenda-deadline):
+ Fix redundant messages.
* org-agenda.el (org-agenda-finalize): Fix clock highlighting.
@@ -632,28 +618,28 @@
* org-install.el: Enhance warning.
-2012-12-12 Erik Hetzner <egh@e6h.org> (tiny change)
+2012-12-13 Erik Hetzner <egh@e6h.org> (tiny change)
* org.el (org-log-into-drawer): Honor the nil value for the
:LOG_INTO_DRAWER: property.
-2012-12-12 Le Wang <l26wang@gmail.com> (tiny change)
+2012-12-13 Le Wang <l26wang@gmail.com> (tiny change)
* org-src.el (org-edit-src-exit): Fix editing source section with
blank lines.
-2012-12-12 Le Wang <le.wang@agworld.com.au>
+2012-12-13 Le Wang <le.wang@agworld.com.au>
* org-src.el (org-edit-src-code): Use marker with insertion type
t to track end and remove hack requiring delete from beg to (1- end).
-2012-12-12 Nicolas Goaziou <n.goaziou@gmail.com>
+2012-12-13 Nicolas Goaziou <n.goaziou@gmail.com>
* org-element.el (org-element-context): When point is between two
objects, be sure to return the second one.
- * org-list.el (org-list-separating-blank-lines-number): When
- computing number of blank lines separating items, also count those
+ * org-list.el (org-list-separating-blank-lines-number):
+ When computing number of blank lines separating items, also count those
in unparsed blocks, like example blocks.
* org.el (org-end-of-line): When visual line mode is on, really
@@ -663,7 +649,7 @@
delegate motion to `end-of-line' instead of `move-end-of-line' in
order to stay on the current line.
-2012-12-12 Rafael Laboissiere <rafael@laboissiere.net> (tiny change)
+2012-12-13 Rafael Laboissiere <rafael@laboissiere.net> (tiny change)
* org-bibtex.el: In the documentation section of the file, fix the
broken URL to Andrew Roberts' document on BibTeX entries.
@@ -676,14 +662,18 @@
commented lines in the Remember temporary buffer with the
appropriate characters.
-2012-12-12 Toby S. Cubitt <tsc25@cantab.net>
+2012-12-13 Toby S. Cubitt <tsc25@cantab.net>
* org.el (org-beginning-of-line): Check `visual-line-mode' instead
- of `line-visual-mode' to determine whether to move by visual
- lines.
+ of `line-visual-mode' to determine whether to move by visual lines.
* org.el (org-kill-line): Use the `org-bound-and-true-p' macro.
+2012-12-04 Chong Yidong <cyd@gnu.org>
+
+ * org-bibtex.el (org-bibtex-ask): Use visual-line-mode instead of
+ longlines-mode.
+
2012-10-26 Achim Gratz <stromeko@stromeko.de>
* ob-ditaa.el: Needs to (require 'org-compat) for
@@ -733,8 +723,8 @@
when the current buffer is not a file.
(org-check-agenda-file): Enhance the message.
(org-element-type): Autoload.
- (org-element-context, org-element-paragraph-parser): Don't
- declare as these two functions are not used in org.el.
+ (org-element-context, org-element-paragraph-parser):
+ Don't declare as these two functions are not used in org.el.
* org-lparse.el (browse-url-file-url): Declare.
@@ -771,22 +761,22 @@
functions.
(org-clock-update-time-maybe): Move to org-clock.el.
- * org-exp.el (org-insert-export-options-template): Remove
- autoload cookie.
+ * org-exp.el (org-insert-export-options-template):
+ Remove autoload cookie.
* org-clock.el (org-resolve-clocks, org-clock-in)
(org-clock-out, org-clock-cancel, org-clock-goto)
(org-clock-sum, org-clock-display, org-clock-report)
(org-dblock-write:clocktable): Add autoload cookie.
- (org-clock-update-time-maybe): Moved from org.el.
+ (org-clock-update-time-maybe): Move from org.el.
* org-beamer.el (org-beamer-sectioning, org-beamer-mode): Ditto.
* org-ascii.el (org-export-ascii-preprocess): Ditto.
* org-archive.el (org-archive-subtree)
- (org-archive-to-archive-sibling, org-toggle-archive-tag): Add
- autoload cookie.
+ (org-archive-to-archive-sibling, org-toggle-archive-tag):
+ Add autoload cookie.
* org-colview.el (org-columns, org-dblock-write:columnview)
(org-insert-columns-dblock, org-agenda-columns): Ditto.
@@ -820,8 +810,8 @@
(orgtbl-to-tsv, orgtbl-to-csv, orgtbl-to-latex)
(orgtbl-to-html, orgtbl-to-texinfo, orgtbl-to-orgtbl): Ditto.
- * org.el (turn-on-orgtbl): Moved here from org-table.el.
- (org-clock-persistence-insinuate): Moved here from org-clock.el.
+ * org.el (turn-on-orgtbl): Move here from org-table.el.
+ (org-clock-persistence-insinuate): Move here from org-clock.el.
(org-update-all-dblocks, org-map-entries)
(org-require-autoloaded-modules, org-forward-element)
(org-backward-element, org-up-element)
@@ -837,12 +827,12 @@
* org-capture.el: Do no set `generated-autoload-file' locally.
Minor code clean up.
- * org-agenda.el (org-agenda-list): Use
- `org-clock-get-clocktable'. Do no set
+ * org-agenda.el (org-agenda-list):
+ Use `org-clock-get-clocktable'. Do no set
`generated-autoload-file' locally.
- * org-table.el (org-table-iterate-buffer-tables): Minor
- reformatting.
+ * org-table.el (org-table-iterate-buffer-tables):
+ Minor reformatting.
(turn-on-orgtbl): Move to org.el.
* org-html.el (org-export-htmlize-generate-css): Don't autoload.
@@ -887,7 +877,7 @@
2012-10-26 Myles English <mylesenglish@gmail.com> (tiny change)
- * org-clock.el (org-clock-in): Moved the call to
+ * org-clock.el (org-clock-in): Move the call to
org-clock-in-prepare-hook until the task's properties
can be accessed.
@@ -907,11 +897,11 @@
* org.el (org-sparse-tree): Allow to call `org-show-todo-tree'
with an argument.
- * org-element.el (org-element--get-next-object-candidates): Fix
- parsing of objects of the same type in a single paragraph.
+ * org-element.el (org-element--get-next-object-candidates):
+ Fix parsing of objects of the same type in a single paragraph.
- * org-element.el (org-element-sub/superscript-successor): Fix
- parsing of sub/superscript at beginning of item.
+ * org-element.el (org-element-sub/superscript-successor):
+ Fix parsing of sub/superscript at beginning of item.
(org-element-latex-or-entity-successor): Fix parsing of latex
fragments at beginning of item.
@@ -953,7 +943,7 @@
(org-unescape-code-in-region): New functions.
(org-edit-src-code, org-edit-src-exit): Use new functions.
- * org.el (org-strip-protective-commas): Removed function.
+ * org.el (org-strip-protective-commas): Remove function.
* org-exp.el (org-export-select-backend-specific-text): Use new
function.
@@ -983,8 +973,8 @@
2012-09-30 Abdó Roig-Maranges <abdo.roig@gmail.com>
* org-html.el (org-export-html-preprocess)
- (org-export-html-format-image): Use
- `org-latex-preview-ltxpng-directory'.
+ (org-export-html-format-image):
+ Use `org-latex-preview-ltxpng-directory'.
* org-odt.el (org-export-odt-do-preprocess-latex-fragments):
Ditto.
@@ -1000,8 +990,8 @@
variable is true, so act accordingly if it is found unbound.
* ob-R.el: Remove initialization with `nil´ from
- `ess-ask-for-ess-directory´ and `ess-local-process-name´. Remove
- second declaration for `ess-local-process-name´.
+ `ess-ask-for-ess-directory´ and `ess-local-process-name´.
+ Remove second declaration for `ess-local-process-name´.
* org-gnus.el: Add a missing require for gnus-util.
@@ -1017,8 +1007,8 @@
* org.el (org-mode-map): Add keybindings to
`org-element-transpose' and `org-narrow-to-element'.
(org-metaup): Fall back on `org-element-drag-backward'.
- (org-metadown): Fall back on `org-element-drag-forward'. Also
- move chunks of declarations and require statements to get rid of
+ (org-metadown): Fall back on `org-element-drag-forward'.
+ Also move chunks of declarations and require statements to get rid of
compiler warnings.
* org-exp-blocks.el (org): Don't require org. Add declarations.
@@ -1049,8 +1039,8 @@
* org.el: Use org-check-version.
* org.el: Fix a subtle error resulting in version functions
- sometimes not being defined and byte-compiling failing. Always
- compile in fallback definitions into org.elc -- org-fixup either
+ sometimes not being defined and byte-compiling failing.
+ Always compile in fallback definitions into org.elc -- org-fixup either
provides re-definitions at compile-time or checks org-version.el
and then the git work tree when run uncompiled. So the fallback
definitions will only come into effect when org-fixup is not
@@ -1093,8 +1083,8 @@
* org.el: Add with-not-warnings around call of (org-fixup).
- * org-compat.el (org-find-library-dir): Rename
- org-find-library-name (misleading) and implement with a function
+ * org-compat.el (org-find-library-dir):
+ Rename org-find-library-name (misleading) and implement with a function
that exists identically in Emacs/XEmacs.
* org-exp-blocks.el: Change calls to org-find-library-dir.
@@ -1204,8 +1194,8 @@
base-dir argument and use (file-name-directory file) to get the
file's directory.
(org-publish-update-timestamp)
- (org-publish-cache-file-needs-publishing): Call
- `org-publish-cache-ctime-of-src' with only one argument.
+ (org-publish-cache-file-needs-publishing):
+ Call `org-publish-cache-ctime-of-src' with only one argument.
* org.el (org-follow-timestamp-link): Fix bug when using sticky
agenda. Add a docstring.
@@ -1322,8 +1312,8 @@
hook twice.
* org-agenda.el (org-agenda-menu-two-column)
- (org-finalize-agenda-hook, org-agenda-ndays): Use
- `define-obsolete-variable-alias' instead of
+ (org-finalize-agenda-hook, org-agenda-ndays):
+ Use `define-obsolete-variable-alias' instead of
`make-obsolete-variable'.
* org.el (org-link-to-org-use-id): Move to org-id.el.
@@ -1488,8 +1478,8 @@
(org-tags-view, org-diary, org-agenda-finalize-entries)
(org-agenda-change-all-lines): Use the new names.
- * org-agenda.el (org-agenda-local-vars): Remove
- ̀org-agenda-last-arguments' from the list of local variables.
+ * org-agenda.el (org-agenda-local-vars):
+ Remove ̀org-agenda-last-arguments' from the list of local variables.
(org-agenda-mode-map): `g' does the same than `r' in buffers with
only one agenda view, but its behavior differs when there are
several views. In manually appended agendas (with `A'), `g'
@@ -1598,20 +1588,20 @@
value.
(org-agenda-multi-back-to-pos): New variable.
(org-agenda-later): Retrieve `org-agenda-current-span' and
- `org-agenda-overriding-arguments' from text properties. Also
- handle numeric span.
- (org-agenda-later, org-agenda-change-time-span): Set
- `org-agenda-overriding-cmd' so that we to take overriding
+ `org-agenda-overriding-arguments' from text properties.
+ Also handle numeric span.
+ (org-agenda-later, org-agenda-change-time-span):
+ Set `org-agenda-overriding-cmd' so that we to take overriding
arguments into account for this command only.
- * org-agenda.el (org-agenda-kill, org-agenda-archive-with): Fix
- bug when called with a non-nil value of `org-agenda-stick'.
+ * org-agenda.el (org-agenda-kill, org-agenda-archive-with):
+ Fix bug when called with a non-nil value of `org-agenda-stick'.
* org-agenda.el (org-agenda-refile): Fix bug when refiling an
entry from a sticky agenda.
- * org-agenda.el (org-prepare-agenda-window): Use
- `org-pre-agenda-window-conf' if already set.
+ * org-agenda.el (org-prepare-agenda-window):
+ Use `org-pre-agenda-window-conf' if already set.
(org-agenda-Quit): Set `org-pre-agenda-window-conf' to nil when
quitting.
(org-agenda-quit): Ditto.
@@ -1634,8 +1624,8 @@
* org-capture.el (org-capture-templates-contexts): Ditto.
- * org.el (org-contextualize-agenda-or-capture): Normalize
- contexts.
+ * org.el (org-contextualize-agenda-or-capture):
+ Normalize contexts.
* org.el (org-contextualize-agenda-or-capture): Handle key
replacement depending on the contexts.
@@ -1669,8 +1659,8 @@
`org-icalendar-use-plain-timestamp' is nil, scheduled and deadline
items should not be ignored.
- * org.el (org-ds-keyword-length, org-make-tags-matcher): Docstring
- clean-up.
+ * org.el (org-ds-keyword-length, org-make-tags-matcher):
+ Docstring clean-up.
* org-freemind.el (org-freemind-convert-links-from-org): Replace
literally to prevent errors when replacing with string containing
@@ -1679,8 +1669,8 @@
* org-pcomplete.el (org-thing-at-point): Allow to match (and then
complete) a "thing" containing dashes.
- * org-table.el (org-table-toggle-coordinate-overlays): Better
- message when interactively toggling.
+ * org-table.el (org-table-toggle-coordinate-overlays):
+ Better message when interactively toggling.
* org-table.el (org-table-number-regexp): Update the docstring to
show an example of a decimal number using the comma as a
@@ -1693,8 +1683,8 @@
* org-agenda.el (org-search-view, org-agenda-get-todos)
(org-agenda-get-timestamps, org-agenda-get-sexps)
(org-agenda-get-progress, org-agenda-get-deadlines)
- (org-agenda-get-scheduled, org-agenda-get-blocks): Use
- `category-pos' instead of `org-category-pos'.
+ (org-agenda-get-scheduled, org-agenda-get-blocks):
+ Use `category-pos' instead of `org-category-pos'.
* ob-fortran.el (org-babel-fortran-transform-list): Rename from
`ob-fortran-transform-list'.
@@ -1788,8 +1778,8 @@
and don't allow whitespaces between the hashtag and the plus sign.
* org.el (org-refresh-category-properties)
- (org-find-dblock, org-dblock-start-re, org-dblock-end-re): Allow
- lowercase "#+category" and "#+begin:" dynamic blocks.
+ (org-find-dblock, org-dblock-start-re, org-dblock-end-re):
+ Allow lowercase "#+category" and "#+begin:" dynamic blocks.
* org.el (org-context): Use case-folding when trying to match
clocktables and source blocks contexts.
@@ -1848,8 +1838,8 @@
* org-agenda.el (org-agenda-menu-two-column): Rename to
`org-agenda-menu-two-columns'.
- * ob.el (org-babel-sha1-hash, org-babel-noweb-p): Replace
- `org-labels' by `let*'.
+ * ob.el (org-babel-sha1-hash, org-babel-noweb-p):
+ Replace `org-labels' by `let*'.
* org-bibtex.el (org-bibtex-headline): Ditto.
@@ -1858,8 +1848,8 @@
* ob.el (org-babel-get-src-block-info)
(org-babel-check-src-block, org-babel-current-result-hash)
(org-babel-parse-src-block-match, org-babel-read-link)
- (org-babel-insert-result, org-babel-clean-text-properties): Use
- ̀org-no-properties' instead of `org-babel-clean-text-properties'.
+ (org-babel-insert-result, org-babel-clean-text-properties):
+ Use ̀org-no-properties' instead of `org-babel-clean-text-properties'.
(org-babel-clean-text-properties): Delete redundant function
`org-babel-clean-text-properties'.
@@ -1888,8 +1878,8 @@
removal of text properties.
(org-capture-fill-template): Use `org-no-properties'.
- * org-gnus.el (org-gnus-open, org-gnus-follow-link): Use
- `org-no-properties'.
+ * org-gnus.el (org-gnus-open, org-gnus-follow-link):
+ Use `org-no-properties'.
* org-colview.el (org-columns-display-here): Ditto.
@@ -1983,8 +1973,8 @@
* ob.el (org-babel-edit-distance, org-babel-sha1-hash)
(org-babel-get-rownames, org-babel-insert-result)
(org-babel-merge-params)
- (org-babel-expand-noweb-references): Don't use `org-flet'. Also
- indent some functions correctly.
+ (org-babel-expand-noweb-references): Don't use `org-flet'.
+ Also indent some functions correctly.
* ob.el (org-babel-execute-src-block)
(org-babel-join-splits-near-ch, org-babel-format-result)
@@ -1995,8 +1985,8 @@
* ob-sh.el (org-babel-sh-var-to-string): Ditto.
- * ob-tangle.el (org-babel-tangle, org-babel-spec-to-string): Don't
- use `org-flet'.
+ * ob-tangle.el (org-babel-tangle, org-babel-spec-to-string):
+ Don't use `org-flet'.
* org-pcomplete.el (org-compat): Require.
@@ -2108,8 +2098,8 @@
* org.el (org-forward-same-level): Fix typo in docstring.
- * org-agenda.el (org-agenda-mode-map): Bind
- `org-agenda-show-priority' to `C-c,' instead of `P'.
+ * org-agenda.el (org-agenda-mode-map):
+ Bind `org-agenda-show-priority' to `C-c,' instead of `P'.
(org-agenda-next-item, org-agenda-previous-item): New commands to
move by one item down/up in the agenda.
(org-agenda-mode-map): Bind `org-agenda-next-item' and
@@ -2134,8 +2124,8 @@
(org-element-transpose, org-element-unindent-buffer): Autoload.
Require 'org and remove all declarations.
- * org.el (org-outline-regexp-bol, org-heading-regexp): Use
- variables instead of constants.
+ * org.el (org-outline-regexp-bol, org-heading-regexp):
+ Use variables instead of constants.
* org-archive.el (org-datetree-find-date-create): Declare.
@@ -2143,8 +2133,8 @@
`clean-buffer-list-kill-buffer-names' when the feature 'midnight
has been loaded.
- * org-icalendar.el (org-print-icalendar-entries): Let
- APPT_WARNTIME take precedence over ̀org-icalendar-alarm-time'.
+ * org-icalendar.el (org-print-icalendar-entries):
+ Let APPT_WARNTIME take precedence over ̀org-icalendar-alarm-time'.
* org.el (org-special-properties): New special property
CLOCKSUM_T.
@@ -2207,8 +2197,8 @@
creating a new output buffer for each shell process. The new
buffer is added to `clean-buffer-list-kill-buffer-names'.
- * org-mobile.el (org-mobile-create-index-file): Use
- `org-global-tags-completion-table' instead of
+ * org-mobile.el (org-mobile-create-index-file):
+ Use `org-global-tags-completion-table' instead of
`org-tag-alist-for-agenda' to get the tags for the index file.
* org.el (org-global-tags-completion-table): Fix typo in
@@ -2279,8 +2269,8 @@
(org-mode-flyspell-verify): Exclude keywords from the new
constant.
- * org-pcomplete.el (pcomplete/org-mode/file-option): Use
- `org-options-keywords'.
+ * org-pcomplete.el (pcomplete/org-mode/file-option):
+ Use `org-options-keywords'.
* org.el (org-toggle-heading): Bugfix: use
`org-element-mark-element' instead of `org-mark-list'.
@@ -2378,8 +2368,8 @@
* org.el (org-mode-map): Add keybindings to
`org-element-transpose' and `org-narrow-to-element'.
(org-metaup): Fall back on `org-element-drag-backward'.
- (org-metadown): Fall back on `org-element-drag-forward'. Also
- move chunks of declarations and require statements to get rid of
+ (org-metadown): Fall back on `org-element-drag-forward'.
+ Also move chunks of declarations and require statements to get rid of
compiler warnings.
* org-exp-blocks.el (org): Don't require org. Add declarations.
@@ -2390,8 +2380,8 @@
* org.el (org-timestamp-change): Don't use the `position'.
- * org.el (org-clock-history, org-clock-adjust-closest): New
- variables.
+ * org.el (org-clock-history, org-clock-adjust-closest):
+ New variables.
(org-timestamp-change): Maybe adjust the next or previous clock in
`org-clock-history'.
(org-shiftmetaup, org-shiftmetadown): On clock logs, update the
@@ -2495,8 +2485,8 @@
(org-edit-src-code, org-edit-src-continue)
(org-edit-fixed-width-region)
(org-src-do-key-sequence-at-code-block)
- (org-src-font-lock-fontify-block, org-src-fontify-buffer): Fix
- typos in docstrings.
+ (org-src-font-lock-fontify-block, org-src-fontify-buffer):
+ Fix typos in docstrings.
* org-docbook.el (org-export-docbook-emphasis-alist): Fix typo:
use "format string" instead of "formatting string".
@@ -2506,8 +2496,8 @@
* org-html.el (org-export-html-postamble): Ditto.
- * org-latex.el (org-export-latex-hyperref-options-format): New
- option.
+ * org-latex.el (org-export-latex-hyperref-options-format):
+ New option.
(org-export-latex-make-header): Use it.
* ob.el (org-babel-confirm-evaluate): Prevent errors when
@@ -2566,8 +2556,8 @@
* org-capture.el (org-capture-bookmark): New option.
(org-capture-finalize): Use it.
- * org-publish.el (org-publish-cache-file-needs-publishing): Make
- the column mandatory after #+include:.
+ * org-publish.el (org-publish-cache-file-needs-publishing):
+ Make the column mandatory after #+include:.
* org-exp.el (org-export-handle-include-files): Ditto.
@@ -2577,8 +2567,8 @@
* org-exp.el (org-export-handle-include-files): Allow to use
#+include with no column.
- * org-publish.el (org-publish-cache-file-needs-publishing): Make
- quotes mandatory around the file name and allow spaces in it.
+ * org-publish.el (org-publish-cache-file-needs-publishing):
+ Make quotes mandatory around the file name and allow spaces in it.
* org-html.el (org-export-as-html): Add link to Org's and Emacs's
websites.
@@ -2637,8 +2627,8 @@
(org-clock-frame-title-format): New option.
(org-frame-title-string): Delete.
(org-clock-update-mode-line): Minor code reformatting.
- (org-clock-in, org-clock-out, org-clock-cancel): Use
- `org-clock-frame-title-format'.
+ (org-clock-in, org-clock-out, org-clock-cancel):
+ Use `org-clock-frame-title-format'.
* org-clock.el (org-clock-get-clock-string): Add a space.
@@ -2664,7 +2654,7 @@
`org-agenda-bulk-unmark-all'. Check against
`org-agenda-bulk-marked-entries' before trying to unmark entries.
Minor docstring fix.
- (org-agenda-bulk-unmark-all): Renamed from
+ (org-agenda-bulk-unmark-all): Rename from
Ì€org-agenda-bulk-remove-all-marks'.
* org-agenda.el (org-agenda-bulk-mark-char): New option.
@@ -2681,8 +2671,8 @@
(org-set-property): Fix the check against
`org-properties-postprocess-alist'.
- * org-macs.el (orgstruct++-ignore-org-filling): Set
- `def-edebug-spec' correctly.
+ * org-macs.el (orgstruct++-ignore-org-filling):
+ Set `def-edebug-spec' correctly.
* org-colview.el (org-columns-string-to-number): When computing
the values for the colview, match durations and convert them to
@@ -2746,8 +2736,8 @@
active region when exporting a subtree/region.
* org-clock.el (org-program-exists): Remove.
- (org-show-notification, org-clock-play-sound): Use
- `executable-find' instead of `org-program-exists'.
+ (org-show-notification, org-clock-play-sound):
+ Use `executable-find' instead of `org-program-exists'.
* org-agenda.el (org-diary): Prevent failure from
`org-compile-prefix-format' when there is no agenda buffer.
@@ -2807,8 +2797,8 @@
* org.el (org-goto): Fix docstring and document what C-u does.
- * org-publish.el (org-publish-cache-file-needs-publishing): Use
- (case-fold-search t) when looking for #+INCLUDE:.
+ * org-publish.el (org-publish-cache-file-needs-publishing):
+ Use (case-fold-search t) when looking for #+INCLUDE:.
* org.el: Use (case-fold-search t).
(org-edit-special, org-ctrl-c-ctrl-c): Ditto.
@@ -2842,15 +2832,15 @@
* org-agenda.el (org-toggle-sticky-agenda): Only shout a message
when called interactively.
- (org-agenda-get-restriction-and-command): Call
- `org-toggle-sticky-agenda' interactively.
+ (org-agenda-get-restriction-and-command):
+ Call `org-toggle-sticky-agenda' interactively.
* org-agenda.el (org-agenda-top-category-filter): New variable for
storing the current top-category filter.
(org-agenda-redo): Apply a top-category filter, if any.
(org-agenda-filter-by-top-category)
- (org-agenda-filter-top-category-apply): Set
- `org-agenda-top-category-filter' to the right value.
+ (org-agenda-filter-top-category-apply):
+ Set `org-agenda-top-category-filter' to the right value.
* org-clock.el (org-clock-out, org-clock-cancel)
(org-clock-in): Don't modify `frame-title-format' if it is a
@@ -2861,8 +2851,8 @@
* org.el (org-read-date): Set cursor-type to nil in the calendar.
- * org-faces.el (org-date-selected): Use inverse video. Don't
- explicitely set bold to nil as it causes `customize-face' to show
+ * org-faces.el (org-date-selected): Use inverse video.
+ Don't explicitely set bold to nil as it causes `customize-face' to show
the weight property and thus encourage the user to change it.
Warn in the docstring that using bold might cause problems when
displaying the calendar.
@@ -2942,8 +2932,8 @@
(org-time-stamp, org-read-date, org-read-date-get-relative)
(org-display-custom-time, org-get-wdays)
(org-time-string-to-absolute, org-closest-date)
- (org-timestamp-change): Allow to set hourly repeat cookie. Send
- an error when an hourly repeat cookie is set and no hour is
+ (org-timestamp-change): Allow to set hourly repeat cookie.
+ Send an error when an hourly repeat cookie is set and no hour is
specified in the timestamp.
* org-icalendar.el (org-print-icalendar-entries): Handle hourly
@@ -2964,8 +2954,8 @@
`org-agenda-filter-by-top-category'.
* org-ascii.el (org-export-ascii-underline): Change the default
- underlining characters for headlines of level 1 and 2. Also
- introduce \. as the underline character for headlines of level 5.
+ underlining characters for headlines of level 1 and 2.
+ Also introduce \. as the underline character for headlines of level 5.
* org-table.el (org-table-recalculate-buffer-tables)
(org-table-iterate-buffer-tables): Add autoload cookie.
@@ -3054,8 +3044,8 @@
2012-09-30 Christoph Dittmann <github@christoph-d.de> (tiny change)
- * org-beamer.el (org-beamer-auto-fragile-frames): Make
- [fragile] work with overlay specifications.
+ * org-beamer.el (org-beamer-auto-fragile-frames):
+ Make [fragile] work with overlay specifications.
2012-09-30 Christophe Junke <christophe.junke@inria.fr> (tiny change)
@@ -3267,7 +3257,7 @@
* ob.el (org-babel-result-to-file): New optional description
argument.
- (org-babel-insert-result): Moved description logic to another
+ (org-babel-insert-result): Move description logic to another
function.
* ob.el (org-babel-insert-result): Change name of filelinkdescr to
@@ -3295,8 +3285,8 @@
2012-09-30 Feng Shu <tumashu@gmail.com>
- * org.el (org-create-formula-image-with-imagemagick): Use
- 'call-process to launch latex so that no shell output buffer will
+ * org.el (org-create-formula-image-with-imagemagick):
+ Use 'call-process to launch latex so that no shell output buffer will
be shown when previewing formulas.
* org.el (org-create-formula-image-with-imagemagick): Fix typo.
@@ -3342,7 +3332,7 @@
2012-09-30 Henning Weiss <hdweiss@gmail.com>
- * org-mobile.el (org-mobile-edit): Added handling of addheading,
+ * org-mobile.el (org-mobile-edit): Add handling of addheading,
refile, archive, archive-sibling and delete edit nodes.
(org-mobile-locate-entry): Olp links containing only a file are
now be located correctly.
@@ -3365,8 +3355,8 @@
* org-colview.el (org-columns): New argument `columns-fmt-string'.
- * org-colview.el (org-columns-get-format-end-top-level): Split
- into `org-columns-get-format' and `org-columns-goto-top-level'.
+ * org-colview.el (org-columns-get-format-end-top-level):
+ Split into `org-columns-get-format' and `org-columns-goto-top-level'.
* org-colview.el (org-dblock-write:columnview): Add a new
parameter :format which specifies the column view format for the
@@ -3387,8 +3377,8 @@
* org-odt.el (org-odt-do-image-size): Replace `flet' with
equivalent construct.
- * org-odt.el (org-odt-cleanup-xml-buffers): Use
- `condition-case-no-debug' instead of
+ * org-odt.el (org-odt-cleanup-xml-buffers):
+ Use `condition-case-no-debug' instead of
`condition-case-unless-debug'. This ensures backward
compatibility with Emacs versions < 24.1.
@@ -3396,14 +3386,14 @@
(org-odt-cleanup-xml-buffers): New.
(org-export-as-odt-and-open, org-export-as-odt)
(org-odt-init-outfile, org-odt-save-as-outfile)
- (org-export-as-odf, org-export-as-odf-and-open): Use
- `org-odt-cleanup-xml-buffers'.
+ (org-export-as-odf, org-export-as-odf-and-open):
+ Use `org-odt-cleanup-xml-buffers'.
- * org-odt.el (org-export-odt-default-org-styles-alist): Add
- default character style.
+ * org-odt.el (org-export-odt-default-org-styles-alist):
+ Add default character style.
- * org-odt.el (org-export-odt-default-org-styles-alist): Add
- default character style.
+ * org-odt.el (org-export-odt-default-org-styles-alist):
+ Add default character style.
* org-lparse.el (org-do-lparse): Remove stray call to
`org-export-html-after-blockquotes-hook'.
@@ -3466,7 +3456,7 @@
* org-entities.el (org-entities): Add new entities for characters
which could cause formatting changes if typed directly.
- * org-entities.el (org-entities): Added \asciicirc entity for ^;
+ * org-entities.el (org-entities): Add \asciicirc entity for ^;
also fixed \circ expansion in latex.
* org.el (org-fontify-entities): Fix bug: The entities \sup[123]
@@ -3475,16 +3465,16 @@
2012-09-30 Mats Lidell <matsl@xemacs.org> (tiny change)
- * org-element.el (org-element-paragraph-separate): Remove
- redundant and misplaced t clause in case.
+ * org-element.el (org-element-paragraph-separate):
+ Remove redundant and misplaced t clause in case.
2012-09-30 Matt Lundin <mdl@imapmail.org>
* org-datetree.el: Fix regexp to allow datetree to find headings
with trailing whitespace. This fixes a bug in which an existing
datetree heading (e.g., "* 2012 ") would not be found by
- org-datetree-find-year-create if it had trailing whitespace. This
- can cause problems, for instance, if one is using column view on
+ org-datetree-find-year-create if it had trailing whitespace.
+ This can cause problems, for instance, if one is using column view on
the date tree, since editing subheadings with column view adds
whitespace at the end of the top heading.
@@ -3500,8 +3490,8 @@
(org-bbdb-make-anniv-hash): Fix org-bbdb anniversary functionality
to accommodate BBDB 3.x. There are two major changes in BBDB 3.x
that need to be taken into account. The first is that
- `bbdb-split' reverses the order of its parameters in 3.x. The
- second is that `bbdb-record-getprop' is replaced by
+ `bbdb-split' reverses the order of its parameters in 3.x.
+ The second is that `bbdb-record-getprop' is replaced by
bbdb-record-note in 3.x.
2012-09-30 Max Mikhanosha <max@openchat.com>
@@ -3542,15 +3532,15 @@
* ob-tangle.el (org-babel-tangle-collect-blocks): Use dummy string
when heading has no text.
- * org-capture.el (org-capture-inside-embedded-elisp-p): Improve
- parsing.
+ * org-capture.el (org-capture-inside-embedded-elisp-p):
+ Improve parsing.
* org-feed.el (org-feed-format-entry): Require `org-capture'.
Expand Elisp %(...) templates.
(org-feed-default-template): Update docstring.
- * org-capture.el (org-capture-expand-embedded-elisp): New
- function.
+ * org-capture.el (org-capture-expand-embedded-elisp):
+ New function.
(org-capture-fill-template): Use it.
(org-capture-inside-embedded-elisp-p): New function to tell if we
are within an Elisp %(...) template.
@@ -3566,16 +3556,16 @@
* org.el (org-fill-paragraph): Pass optional argument to
`fill-paragraph' to fix compatibility with XEmacs.
- * org.el (org-self-insert-cluster-for-undo): Default
- `org-self-insert-cluster-for-undo' also on XEmacs.
+ * org.el (org-self-insert-cluster-for-undo):
+ Default `org-self-insert-cluster-for-undo' also on XEmacs.
* org.el (org-kill-line): Access `visual-line-mode' only if it's
bound.
2012-09-30 Muchenxuan Tong <demon386@gmail.com> (tiny change)
- * org-timer.el (org-timer-set-mode-line): Check
- `org-timer-display' when value is 'off.
+ * org-timer.el (org-timer-set-mode-line):
+ Check `org-timer-display' when value is 'off.
2012-09-30 Nicolas Calderon Asselin <nicolas.calderon.asselin@gmail.com> (tiny change)
@@ -3597,19 +3587,19 @@
* ob-org.el (org-babel-default-header-args:org): By default,
export code from Org src blocks.
- * org-element.el (org-element-inline-src-block-successor): Fix
- inline-src-block parsing at the beginning of an item.
+ * org-element.el (org-element-inline-src-block-successor):
+ Fix inline-src-block parsing at the beginning of an item.
- * org-element.el (org-element--collect-affiliated-keywords): Fix
- caption parsing.
+ * org-element.el (org-element--collect-affiliated-keywords):
+ Fix caption parsing.
* org-element.el (org-element--current-element): At the very
beginning of a footnote definition or an item, next element is
always a paragraph.
* org-element.el (org-element-headline-parser): Handle nil titles.
- (org-element-inlinetask-parser): Add :raw-value property. Also
- handle nil titles.
+ (org-element-inlinetask-parser): Add :raw-value property.
+ Also handle nil titles.
* org.el (org-set-regexps-and-options): Don't consider tags as a
replacement for a missing title in an headline.
@@ -3629,7 +3619,7 @@
* org.el (org-mode): Call external initalizers. Now both filling
code and comments code have their own independant part in org.el.
- (org-setup-filling): Renamed from `org-set-autofill-regexps'.
+ (org-setup-filling): Rename from `org-set-autofill-regexps'.
(org-setup-comments-handling): New function.
* org.el (org-fill-paragraph): Refine filling in comments and in
@@ -3724,7 +3714,7 @@
* org-element.el (org-element-set-element): Rewrite function.
(org-element-adopt-elements): New function.
- (org-element-adopt-element): Removed function.
+ (org-element-adopt-element): Remove function.
(org-element--parse-elements, org-element--parse-objects): Use new
function.
@@ -3804,16 +3794,16 @@
very end of a paragraph.
* org.el (org-mode): Set comments related variables.
- (org-insert-comment, org-comment-or-uncomment-region): New
- functions.
+ (org-insert-comment, org-comment-or-uncomment-region):
+ New functions.
* org.el (org-fill-context-prefix): Small refactoring.
(org-fill-paragraph): Add code comments.
* org-element.el (org-element-at-point): Add :parent property to
output.
- (org-element-context): Add :parent property to output. Also
- return a single element or object instead of a list of parents.
+ (org-element-context): Add :parent property to output.
+ Also return a single element or object instead of a list of parents.
(org-element-forward, org-element-up): Apply changes.
* org.el (org-fill-context-prefix): New function.
@@ -3864,8 +3854,8 @@
* org-footnote.el (org-footnote-normalize): Fix positionning in
HTML export without a footnote section.
- * org-list.el (org-list-struct-indent): Follow
- `org-list-demote-modify-bullet' specifications for ordered
+ * org-list.el (org-list-struct-indent):
+ Follow `org-list-demote-modify-bullet' specifications for ordered
bullets.
(org-list-indent-item-generic, org-indent-item-tree)
(org-outdent-item-tree): Fix bug when operating on a region.
@@ -3919,8 +3909,8 @@
2012-09-30 T.F. Torrey <tftorrey@tftorrey.com> (tiny change)
- * org-exp.el (org-export-remember-html-container-classes): Allow
- exporting a single subtree with HTML_CONTAINER_CLASS property.
+ * org-exp.el (org-export-remember-html-container-classes):
+ Allow exporting a single subtree with HTML_CONTAINER_CLASS property.
* org-rmail.el (org-rmail-follow-link): Use `rmail-widen' instead
of `widen' and don't toggle header as `rmail-widen' already takes
@@ -3936,9 +3926,9 @@
* org-capture.el (org-capture-fill-template): Expand %<num> escape
sequences into text entered for <num>'th %^{PROMPT} escape.
- * org-capture.el (org-capture-fill-template): Fixed regexp for
+ * org-capture.el (org-capture-fill-template): Fix regexp for
%<n> expandos to match any positive integer.
- (org-capture-templates): Updated docstring accordingly.
+ (org-capture-templates): Update docstring accordingly.
* org-agenda.el (org-agenda-skip-timestamp-if-deadline-is-shown):
Skip timestamp items in agenda view if item is already shown as a
@@ -3972,9 +3962,9 @@
property override :empty-lines when inserting empty lines after
captured captured entry.
- * org-agenda.el (org-agenda-skip-if, org-agenda-skip-if-todo): Add
- new todo-unblocked and nottodo-unblocked skip conditions. These
- match as for todo and nottodo, but only for unblocked todo items.
+ * org-agenda.el (org-agenda-skip-if, org-agenda-skip-if-todo):
+ Add new todo-unblocked and nottodo-unblocked skip conditions.
+ These match as for todo and nottodo, but only for unblocked todo items.
2012-09-30 Zachary Kanfer <zkanfer@gmail.com> (tiny change)
@@ -3984,8 +3974,8 @@
2012-09-30 Niels Giesen <niels.giesen@gmail.com>
* org-table.el (orgtbl-to-generic): Add check for :skipheadrule.
- When present, the :hline following the head will be skipped. This
- is necessary to avoid doubling of horizontal rules in LaTeX
+ When present, the :hline following the head will be skipped.
+ This is necessary to avoid doubling of horizontal rules in LaTeX
longtable environments and consequent width problems.
* org-latex.el (org-export-latex-tables-tstart)
@@ -4147,8 +4137,8 @@
2012-04-27 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-list.el (org-list-struct-indent): Follow
- `org-list-demote-modify-bullet' specifications for ordered
+ * org-list.el (org-list-struct-indent):
+ Follow `org-list-demote-modify-bullet' specifications for ordered
bullets.
(org-list-indent-item-generic, org-indent-item-tree)
(org-outdent-item-tree): Fix bug when operating on a region.
@@ -4280,7 +4270,7 @@
2012-04-01 Ilya Shlyakhter <ilya_shl@alum.mit.edu> (tiny change)
- * org.el (org-delete-property-globally): Fixed a bug that left
+ * org.el (org-delete-property-globally): Fix a bug that left
blank line in place of the property, instead of removing the line.
2012-04-01 Bastien Guerry <bzg@gnu.org>
@@ -4305,8 +4295,8 @@
2012-04-01 Bastien Guerry <bzg@gnu.org>
- * org-table.el (orgtbl-self-insert-command): Use
- `backward-delete-char' instead of `delete-backward-char' as this
+ * org-table.el (orgtbl-self-insert-command):
+ Use `backward-delete-char' instead of `delete-backward-char' as this
last command gets caught by the compiler which says to not use it
in programs. `backward-delete-char' is just an alias for
`delete-backward-char' which is internally remapped to
@@ -4330,8 +4320,8 @@
2012-04-01 Bastien Guerry <bzg@gnu.org>
- * org-mime.el (org-mime-htmlize): Set
- `org-export-with-LaTeX-fragments' correctly.
+ * org-mime.el (org-mime-htmlize):
+ Set `org-export-with-LaTeX-fragments' correctly.
2012-04-01 Bastien Guerry <bzg@gnu.org>
@@ -4354,7 +4344,7 @@
2012-04-01 Eric Schulte <eric.schulte@gmx.com>
- * ob-lob.el (org-babel-lob-get-info): Removed extra []s when
+ * ob-lob.el (org-babel-lob-get-info): Remove extra []s when
parsing inline call_foo lines.
2012-04-01 Eric Schulte <eric.schulte@gmx.com>
@@ -4401,8 +4391,8 @@
2012-04-01 Thomas Morgan <tlm@ziiuu.com> (tiny change)
- * org-habit.el (org-habit-insert-consistency-graphs): Fix
- alignment of consistency graph in filtered agenda view.
+ * org-habit.el (org-habit-insert-consistency-graphs):
+ Fix alignment of consistency graph in filtered agenda view.
2012-04-01 Bastien Guerry <bzg@gnu.org>
@@ -4425,8 +4415,8 @@
2012-04-01 Bastien Guerry <bzg@gnu.org>
- * org-agenda.el (org-agenda-custom-commands-local-options): Fix
- incorrect custom option definition.
+ * org-agenda.el (org-agenda-custom-commands-local-options):
+ Fix incorrect custom option definition.
2012-04-01 Bastien Guerry <bzg@gnu.org>
@@ -4463,14 +4453,14 @@
* org-odt.el (org-export-odt-category-strings): New custom
variable.
- (org-odt-category-map-alist): Modify interpretation. Don't
- use the same field to double up as both a OpenDocument
+ (org-odt-category-map-alist): Modify interpretation.
+ Don't use the same field to double up as both a OpenDocument
variable and a category string. Entries in this list now
specify only the OpenDocument variable. Category strings are
obtained through an indirect lookup of
`org-export-odt-category-strings'. Use same OpenDocument
- variables as what LibreOffice uses for various entities. Fix
- docstring.
+ variables as what LibreOffice uses for various entities.
+ Fix docstring.
(org-odt-add-label-definition)
(org-odt-format-label-definition)
(org-odt-format-label-reference): Propagate above changes.
@@ -4517,8 +4507,8 @@
2012-04-01 Jambunathan K <kjambunathan@gmail.com>
* org-lparse.el (org-do-lparse): Make effective setting of
- `org-export-headline-levels' available to the ODT exporter. Also
- remove some stale comments.
+ `org-export-headline-levels' available to the ODT exporter.
+ Also remove some stale comments.
2012-04-01 Jambunathan K <kjambunathan@gmail.com>
@@ -4599,7 +4589,7 @@
2012-04-01 Ilya Shlyakhter <ilya_shl@alum.mit.edu> (tiny change)
- * ob-lilypond.el (ly-compile-lilyfile): Fixed misplaced comma in a
+ * ob-lilypond.el (ly-compile-lilyfile): Fix misplaced comma in a
quoting expression.
2012-04-01 Eric Schulte <eric.schulte@gmx.com>
@@ -4753,7 +4743,7 @@
2012-04-01 Eric Schulte <eric.schulte@gmx.com>
- * ob.el (org-babel-examplize-region): Fixed bug in examplization.
+ * ob.el (org-babel-examplize-region): Fix bug in examplization.
2012-04-01 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -4851,7 +4841,7 @@
2012-04-01 Nicolas Goaziou <n.goaziou@gmail.com>
* org-list.el (org-list-ending-method, org-list-end-regexp):
- Removed variables.
+ Remove variables.
(org-in-item-p, org-list-separating-blank-lines-number)
(org-list-parse-list, org-list-struct): Apply changes.
@@ -4889,7 +4879,7 @@
2012-04-01 David Maus <dmaus@ictsoc.de>
- * org-clock.el (org-in-clocktable-p): Moved to org.el.
+ * org-clock.el (org-in-clocktable-p): Move to org.el.
* org.el (org-in-clocktable-p): New function. Moved from
org-clock.el.
@@ -4952,14 +4942,14 @@
2012-04-01 Eric Schulte <eric.schulte@gmx.com>
- * ob.el (org-babel-strip-protective-commas): Use
- `org-strip-protective-commas'.
+ * ob.el (org-babel-strip-protective-commas):
+ Use `org-strip-protective-commas'.
- * org-exp.el (org-export-select-backend-specific-text): Use
- `org-strip-protective-commas'.
+ * org-exp.el (org-export-select-backend-specific-text):
+ Use `org-strip-protective-commas'.
- * org-src.el (org-edit-src-code): Use
- `org-strip-protective-commas'.
+ * org-src.el (org-edit-src-code):
+ Use `org-strip-protective-commas'.
* org.el (org-strip-protective-commas): Single definition for this
functionality.
@@ -4993,7 +4983,7 @@
2012-04-01 Nicolas Goaziou <n.goaziou@gmail.com>
* org-list.el (org-list-ending-method, org-list-end-regexp):
- Removed variables.
+ Remove variables.
(org-in-item-p, org-list-separating-blank-lines-number)
(org-list-parse-list, org-list-struct): Apply changes.
@@ -5021,8 +5011,8 @@
2012-04-01 Jambunathan K <kjambunathan@gmail.com>
* org-odt.el (org-export-as-odt-to-buffer)
- (org-replace-region-by-odt, org-export-region-as-odt): Remove
- these interactive functions. They are of questionable value.
+ (org-replace-region-by-odt, org-export-region-as-odt):
+ Remove these interactive functions. They are of questionable value.
2012-04-01 Toby S. Cubitt <tsc25@cantab.net> (tiny change)
@@ -5065,7 +5055,7 @@
2012-04-01 David Maus <dmaus@ictsoc.de>
- * org-clock.el (org-in-clocktable-p): Moved to org.el.
+ * org-clock.el (org-in-clocktable-p): Move to org.el.
* org.el (org-in-clocktable-p): New function. Moved from org-clock.el.
@@ -5087,7 +5077,7 @@
2012-04-01 Eric Schulte <eric.schulte@gmx.com>
- * org-exp-blocks.el (org-export-blocks): Changed the name of
+ * org-exp-blocks.el (org-export-blocks): Change the name of
exporting comment blocks given that it seems regular comment
blocks no longer export.
@@ -5102,8 +5092,8 @@
2012-04-01 Nicolas Goaziou <n.goaziou@gmail.com>
* ob-exp.el (org-babel-exp-in-export-file)
- (org-babel-exp-src-block, org-babel-exp-inline-src-blocks): Allow
- org-current-export-file to contain a buffer.
+ (org-babel-exp-src-block, org-babel-exp-inline-src-blocks):
+ Allow org-current-export-file to contain a buffer.
2012-04-01 Jambunathan K <kjambunathan@gmail.com>
@@ -5178,8 +5168,8 @@
* org-inlinetask.el (org-inlinetask-show-first-star): New option.
(org-inlinetask-fontify): Honor `org-inlinetask-show-first-star'.
- * org-indent.el (org-indent-set-line-properties): Honor
- `org-inlinetask-show-first-star'.
+ * org-indent.el (org-indent-set-line-properties):
+ Honor `org-inlinetask-show-first-star'.
2012-04-01 Bastien Guerry <bzg@gnu.org>
@@ -5190,8 +5180,8 @@
* org.el (org-at-drawer-p): Normalize the docstring to match other
`org-at-*-p' docstrings.
- (org-indent-block, org-indent-drawer, org-at-block-p): New
- functions.
+ (org-indent-block, org-indent-drawer, org-at-block-p):
+ New functions.
(org-metaright): Use the new functions to indent a drawer or a
block depending on the context. Also update the docstring.
@@ -5208,8 +5198,8 @@
2012-04-01 Bastien Guerry <bzg@gnu.org>
- * org-inlinetask.el (org-inlinetask-toggle-visibility): Use
- `org-show-entry' instead of `outline-flag-region' to keep the
+ * org-inlinetask.el (org-inlinetask-toggle-visibility):
+ Use `org-show-entry' instead of `outline-flag-region' to keep the
drawers folded when unfolding an inline task.
2012-04-01 Torsten Anders <torsten.anders@beds.ac.uk> (tiny change)
@@ -5405,16 +5395,16 @@
* org-odt.el (org-odt-table-style-format): New. Template for
auto-generated table styles.
- (org-odt-automatic-styles, org-odt-object-counters): New
- variables.
+ (org-odt-automatic-styles, org-odt-object-counters):
+ New variables.
(org-odt-add-automatic-style): New function.
- (org-odt-write-automatic-styles): New function. Create
- automatic styles for tables that have custom :rel-width.
+ (org-odt-write-automatic-styles): New function.
+ Create automatic styles for tables that have custom :rel-width.
(org-odt-begin-table): Parse attributes specified with
"#+ATTR_ODT: " option and use it to create an automatic table
style.
- (org-odt-save-as-outfile): Call
- `org-odt-add-write-automatic-styles'.
+ (org-odt-save-as-outfile):
+ Call `org-odt-add-write-automatic-styles'.
(org-odt-init-outfile): Init newly add variables.
(org-odt-section-count): Remove it.
(org-odt-begin-section): Use `org-odt-add-automatic-style' to
@@ -5489,13 +5479,13 @@
2012-04-01 Bastien Guerry <bzg@gnu.org>
- * org-html.el (org-export-as-html): Initialize
- `html-pre-real-contents' correctly.
+ * org-html.el (org-export-as-html):
+ Initialize `html-pre-real-contents' correctly.
2012-04-01 Bastien Guerry <bzg@gnu.org>
- * org-html.el (org-export-as-html): Initialize
- `html-pre-real-contents' correctly.
+ * org-html.el (org-export-as-html):
+ Initialize `html-pre-real-contents' correctly.
2012-04-01 Eric Schulte <eric.schulte@gmx.com>
@@ -5510,7 +5500,7 @@
2012-04-01 Eric Schulte <eric.schulte@gmx.com>
- * ob-clojure.el (org-babel-execute:clojure): Removed dependency
+ * ob-clojure.el (org-babel-execute:clojure): Remove dependency
on deprecated swank-clojure.
2012-04-01 Eric Schulte <eric.schulte@gmx.com>
@@ -5561,8 +5551,8 @@
* ob-exp.el (org-babel-exp-src-block): Use `org-babel-noweb-p'.
(org-babel-exp-inline-src-blocks): Use `org-babel-noweb-p'.
- * ob-tangle.el (org-babel-tangle-collect-blocks): Use
- `org-babel-noweb-p'.
+ * ob-tangle.el (org-babel-tangle-collect-blocks):
+ Use `org-babel-noweb-p'.
* ob.el (org-babel-execute-src-block): Use `org-babel-noweb-p'.
(org-babel-expand-src-block): Use `org-babel-noweb-p'.
@@ -5593,7 +5583,7 @@
2012-04-01 Bernt Hansen <bernt@norang.ca>
- * org.el: Honour existing restrictions when regenerating the agenda.
+ * org.el: Honor existing restrictions when regenerating the agenda.
2012-04-01 Bastien Guerry <bzg@gnu.org>
@@ -5731,20 +5721,20 @@
2012-01-03 Bastien Guerry <bzg@gnu.org>
- * org-agenda.el (org-agenda-filter-by-tag): Use
- `read-char-exclusive' instead of `read-char'.
+ * org-agenda.el (org-agenda-filter-by-tag):
+ Use `read-char-exclusive' instead of `read-char'.
2012-01-03 Carsten Dominik <carsten.dominik@gmail.com> (tiny change)
- * org-clock.el (org-clock-in, org-clock-find-position): Remove
- erraneous space in regexp.
+ * org-clock.el (org-clock-in, org-clock-find-position):
+ Remove erraneous space in regexp.
2012-01-03 Eric Schulte <eric.schulte@gmx.com>
* ob.el (org-babel-expand-noweb-references): Rather than using
a pure regexp solution to resolve noweb references, actually
- check the information of every code block in the buffer. This
- will cause a slowdown in noweb reference expansion, but is
+ check the information of every code block in the buffer.
+ This will cause a slowdown in noweb reference expansion, but is
necessary for correct behavior.
2012-01-03 Bastien Guerry <bzg@gnu.org>
@@ -5774,19 +5764,19 @@
2012-01-03 Eric Schulte <eric.schulte@gmx.com>
- * ob.el (org-babel-map-call-lines): Moved this file from
+ * ob.el (org-babel-map-call-lines): Move this file from
ob-lob.el into ob.el to ease dependency pains.
2012-01-03 Bastien Guerry <bzg@gnu.org>
- * org-publish.el (org-publish-index-generate-theindex): Use
- theindex.inc for storing index entries, and theindex.org for
+ * org-publish.el (org-publish-index-generate-theindex):
+ Use theindex.inc for storing index entries, and theindex.org for
including theindex.inc.
2012-01-03 Bastien Guerry <bzg@gnu.org>
- * org-publish.el (org-publish-index-generate-theindex): Create
- proper file target for index entries in subdirectories.
+ * org-publish.el (org-publish-index-generate-theindex):
+ Create proper file target for index entries in subdirectories.
2012-01-03 Bastien Guerry <bzg@gnu.org>
@@ -5802,11 +5792,11 @@
customize what goes before the document body. Currently it
outputs title, author and email, date and toc.
(org-odt-begin-document-body): Use `org-odt-format-preamble'.
- (org-odt-format-date): Renamed from
+ (org-odt-format-date): Rename from
`org-odt-iso-date-from-org-timestamp'. Also added an
additional param for format string.
- (org-odt-begin-annotation, org-odt-update-meta-file): Use
- `org-odt-format-date'.
+ (org-odt-begin-annotation, org-odt-update-meta-file):
+ Use `org-odt-format-date'.
2012-01-03 Bastien Guerry <bzg@gnu.org>
@@ -5851,8 +5841,8 @@
overlays.
(org-agenda-category-filter-preset): New variable.
(org-finalize-agenda, org-agenda-redo)
- (org-agenda-filter-make-matcher, org-agenda-filter-apply): Handle
- both category and tag filters.
+ (org-agenda-filter-make-matcher, org-agenda-filter-apply):
+ Handle both category and tag filters.
(org-agenda-filter-show-all-tag): Rename from
`org-agenda-filter-by-tag-show-all'.
(org-agenda-filter-show-all-cat): New function.
@@ -5886,8 +5876,8 @@
2012-01-03 Bastien Guerry <bzg@gnu.org>
- * org.el (org-loop-over-headlines-in-active-region): Fix
- docstring.
+ * org.el (org-loop-over-headlines-in-active-region):
+ Fix docstring.
(org-todo, org-deadline, org-schedule): Honor the 'start-level
value of `org-loop-over-headlines-in-active-region'.
@@ -5903,8 +5893,8 @@
2012-01-03 Bastien Guerry <bzg@gnu.org>
- * org-agenda.el (org-agenda-filter-by-tag): Use
- `read-char-exclusive' instead of `read-char'.
+ * org-agenda.el (org-agenda-filter-by-tag):
+ Use `read-char-exclusive' instead of `read-char'.
2012-01-03 Carsten Dominik <carsten.dominik@gmail.com>
@@ -5913,8 +5903,8 @@
2012-01-03 Carsten Dominik <carsten.dominik@gmail.com> (tiny change)
- * org-clock.el (org-clock-in, org-clock-find-position): Remove
- erraneous space in regexp.
+ * org-clock.el (org-clock-in, org-clock-find-position):
+ Remove erraneous space in regexp.
2012-01-03 Jambunathan K <kjambunathan@gmail.com>
@@ -5924,8 +5914,8 @@
OpenDocument styles and schema files from. Set this variable
explicitly only if the in-built heuristics for locating the
above files fails.
- (org-odt-styles-dir-list, org-odt-schema-dir-list): New
- variables. Pay specific attention to (eval-when-compile ...)
+ (org-odt-styles-dir-list, org-odt-schema-dir-list):
+ New variables. Pay specific attention to (eval-when-compile ...)
form through which Makefile's $(datadir) - contained in
`org-odt-data-dir' - gets compiled in as a "hard coded"
constant.
@@ -5965,8 +5955,8 @@
* ob.el (org-babel-expand-noweb-references): Rather than using
a pure regexp solution to resolve noweb references, actually
- check the information of every code block in the buffer. This
- will cause a slowdown in noweb reference expansion, but is
+ check the information of every code block in the buffer.
+ This will cause a slowdown in noweb reference expansion, but is
necessary for correct behavior.
2012-01-03 Bastien Guerry <bzg@gnu.org>
@@ -6033,19 +6023,19 @@
2012-01-03 Eric Schulte <eric.schulte@gmx.com>
- * ob.el (org-babel-map-call-lines): Moved this file from
+ * ob.el (org-babel-map-call-lines): Move this file from
ob-lob.el into ob.el to ease dependency pains.
2012-01-03 Bastien Guerry <bzg@gnu.org>
- * org-publish.el (org-publish-index-generate-theindex): Use
- theindex.inc for storing index entries, and theindex.org for
+ * org-publish.el (org-publish-index-generate-theindex):
+ Use theindex.inc for storing index entries, and theindex.org for
including theindex.inc.
2012-01-03 Bastien Guerry <bzg@gnu.org>
- * org-publish.el (org-publish-index-generate-theindex): Create
- proper file target for index entries in subdirectories.
+ * org-publish.el (org-publish-index-generate-theindex):
+ Create proper file target for index entries in subdirectories.
2012-01-03 Bastien Guerry <bzg@gnu.org>
@@ -6054,18 +6044,18 @@
2012-01-03 Jambunathan K <kjambunathan@gmail.com>
- * org-odt.el (org-export-odt-default-org-styles-alist): Add
- styles for title and subtitle.
+ * org-odt.el (org-export-odt-default-org-styles-alist):
+ Add styles for title and subtitle.
(org-odt-format-toc): New.
(org-odt-format-preamble): New. Users can redefine this to
customize what goes before the document body. Currently it
outputs title, author and email, date and toc.
(org-odt-begin-document-body): Use `org-odt-format-preamble'.
- (org-odt-format-date): Renamed from
+ (org-odt-format-date): Rename from
`org-odt-iso-date-from-org-timestamp'. Also added an
additional param for format string.
- (org-odt-begin-annotation, org-odt-update-meta-file): Use
- `org-odt-format-date'.
+ (org-odt-begin-annotation, org-odt-update-meta-file):
+ Use `org-odt-format-date'.
2012-01-03 Eric Schulte <eric.schulte@gmx.com>
@@ -6088,8 +6078,8 @@
2012-01-03 Dave Abrahams <dave@boostpro.com> (tiny change)
- * org-agenda.el (org-agenda-do-tree-to-indirect-buffer): New
- function.
+ * org-agenda.el (org-agenda-do-tree-to-indirect-buffer):
+ New function.
(org-agenda-tree-to-indirect-buffer): Use the new function.
2012-01-03 Bastien Guerry <bzg@gnu.org>
@@ -6099,8 +6089,8 @@
2012-01-03 Jambunathan K <kjambunathan@gmail.com>
- * org-odt.el (org-odt-format-source-code-or-example): Try
- loading htmlfontify safely.
+ * org-odt.el (org-odt-format-source-code-or-example):
+ Try loading htmlfontify safely.
2012-01-03 Bastien Guerry <bzg@gnu.org>
@@ -6114,7 +6104,7 @@
2012-01-03 Eric Schulte <eric.schulte@gmx.com>
- * ob.el (org-babel-expand-noweb-references): Fixed regexp.
+ * ob.el (org-babel-expand-noweb-references): Fix regexp.
2012-01-03 Michael Brand <michael.ch.brand@gmail.com>
@@ -6123,8 +6113,8 @@
2012-01-03 Christian Moe <mail@christianmoe.com> (tiny change)
- * org-html.el (org-export-as-html): Apply
- `org-export-html-get-todo-kwd-class-name' to the class
+ * org-html.el (org-export-as-html):
+ Apply `org-export-html-get-todo-kwd-class-name' to the class
attribute of the todo-keyword span tag, not to its text
content.
@@ -6183,20 +6173,20 @@
2012-01-03 Bastien Guerry <bzg@gnu.org>
- * org-html.el (org-export-html-headline-anchor-format): New
- option.
+ * org-html.el (org-export-html-headline-anchor-format):
+ New option.
(org-html-level-start): Use the new option.
2012-01-03 Rob Giardina <rob@giardina.us> (tiny change)
- * org-agenda.el (org-agenda-with-point-at-orig-entry): Small
- bugfix.
+ * org-agenda.el (org-agenda-with-point-at-orig-entry):
+ Small bugfix.
2012-01-03 Christian Moe <mail@christianmoe.com> (tiny change)
* org-special-blocks.el
- (org-special-blocks-convert-html-special-cookies): Close
- paragraph before opening or closing the <div>, and open
+ (org-special-blocks-convert-html-special-cookies):
+ Close paragraph before opening or closing the <div>, and open
paragraph after. Also changed newline placement to be the same
as for other blocks.
@@ -6213,9 +6203,9 @@
2012-01-03 Jambunathan K <kjambunathan@gmail.com>
- * org-odt.el (org-odt-data-dir): Removed.
- (org-odt-styles-dir, org-export-odt-schema-dir): New
- variables.
+ * org-odt.el (org-odt-data-dir): Remove.
+ (org-odt-styles-dir, org-export-odt-schema-dir):
+ New variables.
* org-odt.el, org-lparse.el: New files.
@@ -6264,8 +6254,8 @@
2012-01-03 Bastien Guerry <bzg@gnu.org>
- * org.el (org-link-unescape, org-link-unescape-compound): Fix
- two typos in docstrings.
+ * org.el (org-link-unescape, org-link-unescape-compound):
+ Fix two typos in docstrings.
2012-01-03 Thomas Dye <dk@poto.local>
@@ -6288,8 +6278,8 @@
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
- * org-exp.el (org-export-grab-title-from-buffer): Don't
- license to kill text inside blocks when getting a title.
+ * org-exp.el (org-export-grab-title-from-buffer):
+ Don't license to kill text inside blocks when getting a title.
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
@@ -6317,13 +6307,13 @@
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
- * org.el (org-reduce): Added a less functional Org-mode copy of
+ * org.el (org-reduce): Add a less functional Org-mode copy of
the cl reduce function.
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
- * org.el (org-fontify-meta-lines-and-blocks-1): Recognize
- "name" as a valid keyword that can preceed a block.
+ * org.el (org-fontify-meta-lines-and-blocks-1):
+ Recognize "name" as a valid keyword that can preceed a block.
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
@@ -6337,8 +6327,8 @@
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
- * ob.el (org-babel-named-src-block-regexp-for-name): Ensure
- that partial names are not matched.
+ * ob.el (org-babel-named-src-block-regexp-for-name):
+ Ensure that partial names are not matched.
(org-babel-named-data-regexp-for-name): Ensure that partial names
are not matched.
@@ -6362,15 +6352,15 @@
2012-01-03 Milan Zamazal <pdm@zamazal.org>
- * org.el (org-set-outline-overlay-data): Use
- outline-flag-region to make a region invisible. This ensures
+ * org.el (org-set-outline-overlay-data):
+ Use outline-flag-region to make a region invisible. This ensures
all necessary actions, especially adding
isearch-open-invisible property, are applied.
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
- * ob-lob.el (org-babel-in-example-or-verbatim): Fix
- compilation warning.
+ * ob-lob.el (org-babel-in-example-or-verbatim):
+ Fix compilation warning.
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
@@ -6379,8 +6369,8 @@
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
- * ob-lisp.el (org-babel-execute:lisp): Fixed typo.
- (org-babel-lisp-vector-to-list): Fixed typo.
+ * ob-lisp.el (org-babel-execute:lisp): Fix typo.
+ (org-babel-lisp-vector-to-list): Fix typo.
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
@@ -6395,11 +6385,11 @@
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
- * ob-exp.el (org-exp-res/src-name-cleanup): Updated Documentation.
+ * ob-exp.el (org-exp-res/src-name-cleanup): Update Documentation.
- * ob-lob.el (org-babel-block-lob-one-liner-regexp): Updated
- regular expression.
- (org-babel-inline-lob-one-liner-regexp): Updated regular
+ * ob-lob.el (org-babel-block-lob-one-liner-regexp):
+ Update regular expression.
+ (org-babel-inline-lob-one-liner-regexp): Update regular
expression.
* ob-ref.el (org-babel-ref-resolve): Notice when something that
@@ -6407,15 +6397,15 @@
* ob-table.el: Updated documentation.
- * ob.el (org-babel-src-name-regexp): Simplified regexp.
- (org-babel-get-src-block-info): Updated match strings.
- (org-babel-data-names): Simplified acceptable names.
+ * ob.el (org-babel-src-name-regexp): Simplify regexp.
+ (org-babel-get-src-block-info): Update match strings.
+ (org-babel-data-names): Simplify acceptable names.
(org-babel-find-named-block): Indentation.
- (org-babel-find-named-result): Updated to not return a code block
+ (org-babel-find-named-result): Update to not return a code block
as a result.
- * org.el (org-fontify-meta-lines-and-blocks-1): Removing
- references to old syntactic elements.
+ * org.el (org-fontify-meta-lines-and-blocks-1):
+ Removing references to old syntactic elements.
(org-additional-option-like-keywords): Removing references to
old syntactic elements.
@@ -6729,7 +6719,7 @@
(org-set-regexps-and-options): Create regexps according to the
following rule: use spaces only to separate elements from an headline,
while allowing mixed tabs and spaces for any indentation job.
- (org-nl-done-regexp, org-looking-at-done-regexp): Removed variables.
+ (org-nl-done-regexp, org-looking-at-done-regexp): Remove variables.
(org-set-font-lock-defaults): Fontify again headlines with a keyword
and no other text. Use new format strings.
(org-get-heading, org-toggle-comment, org-prepare-agenda-buffers)
@@ -6800,7 +6790,7 @@
2012-01-03 Kai Tetzlaff <kai.tetzlaff@web.de> (tiny change)
- * org-publish.el (org-publish-file): Added 'eval'ing the value of
+ * org-publish.el (org-publish-file): Add 'eval'ing the value of
the :publishing-directory property before using it as destination
of the publishing project. This allows to construct the publish
destination directory dynamically at run-time using the return
@@ -6872,11 +6862,11 @@
* ob.el: Removing `org-babel-params-from-buffer' and
#+PROPERTIES: entirely.
- * ob-exp.el (org-babel-exp-src-block): Removing
- `org-babel-params-from-buffer' and #+PROPERTIES: entirely.
+ * ob-exp.el (org-babel-exp-src-block):
+ Removing `org-babel-params-from-buffer' and #+PROPERTIES: entirely.
- * ob-lob.el (org-babel-lob-execute): Removing
- `org-babel-params-from-buffer' and #+PROPERTIES: entirely.
+ * ob-lob.el (org-babel-lob-execute):
+ Removing `org-babel-params-from-buffer' and #+PROPERTIES: entirely.
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
@@ -6932,8 +6922,8 @@
property for consistency. Renamed local variable `aligns' to
`cookies'.
- * org-html.el (org-format-org-table-html): Use
- `org-col-cookies'. Renamed local variable forced-aligns to
+ * org-html.el (org-format-org-table-html):
+ Use `org-col-cookies'. Renamed local variable forced-aligns to
col-cookies.
2012-01-03 Carsten Dominik <carsten.dominik@gmail.com>
@@ -6945,8 +6935,8 @@
(org-format-latex-as-mathml): New functions.
(org-format-latex): Add a new local variable block-type that notes
the nature of the equation - inline or display. Associate it's
- value to `org-latex-src-embed-type' property of dvipng links. Add
- mathml as new processing type.
+ value to `org-latex-src-embed-type' property of dvipng links.
+ Add mathml as new processing type.
2012-01-03 Sébastien Vauban <wxhgmqzgwmuf@spammotel.com>
@@ -6954,8 +6944,8 @@
2012-01-03 Carsten Dominik <carsten.dominik@gmail.com>
- * org-latex.el (org-export-latex-tables): Honor
- `org-export-latex-table-caption-above'
+ * org-latex.el (org-export-latex-tables):
+ Honor `org-export-latex-table-caption-above'
(org-export-latex-table-caption-above): New option.
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
@@ -6965,11 +6955,11 @@
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
- * ob.el (org-babel-insert-header-arg): Fixed typo.
+ * ob.el (org-babel-insert-header-arg): Fix typo.
2012-01-03 Jambunathan K <kjambunathan@gmail.com>
- * org-exp.el (org-export-number-lines): Modified. Add a new
+ * org-exp.el (org-export-number-lines): Modify. Add a new
parameter `preprocess' and use this for backend-agnostic
handling of literal examples.
@@ -7076,8 +7066,8 @@
2012-01-03 Carsten Dominik <carsten.dominik@gmail.com>
* org-agenda.el
- (org-agenda-skip-additional-timestamps-same-entry): Change
- default value.
+ (org-agenda-skip-additional-timestamps-same-entry):
+ Change default value.
2012-01-03 Carsten Dominik <carsten.dominik@gmail.com>
@@ -7099,8 +7089,8 @@
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
* org-list.el (org-list-parents-alist): When no parent is found
- for an item, set it as the closest less indented item above. If
- none is found, make it a top level item.
+ for an item, set it as the closest less indented item above.
+ If none is found, make it a top level item.
(org-list-write-struct): Externalize code.
(org-list-struct-fix-item-end): New function.
(org-list-struct): Remove a now useless fix.
@@ -7126,8 +7116,8 @@
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-footnote.el (org-footnote-at-definition-p): Remove
- useless `org-re'.
+ * org-footnote.el (org-footnote-at-definition-p):
+ Remove useless `org-re'.
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -7170,8 +7160,8 @@
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
- * ob-asymptote.el (org-babel-asymptote-define-type): Silence
- byte-compiler.
+ * ob-asymptote.el (org-babel-asymptote-define-type):
+ Silence byte-compiler.
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
@@ -7180,8 +7170,8 @@
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
- * org-bibtex.el (org-bibtex-type-property-name): Configurable
- property name for bibtex entry types.
+ * org-bibtex.el (org-bibtex-type-property-name):
+ Configurable property name for bibtex entry types.
(org-bibtex-headline): Use new configurable property name.
(org-bibtex-check): Use new configurable property name.
(org-bibtex-create): Use new configurable property name.
@@ -7207,8 +7197,8 @@
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
- * ob-tangle.el (org-babel-tangle-collect-blocks): Better
- delimiting of Org-mode text preceding a code block.
+ * ob-tangle.el (org-babel-tangle-collect-blocks):
+ Better delimiting of Org-mode text preceding a code block.
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
@@ -7217,8 +7207,8 @@
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
- * ob-tangle.el (org-babel-process-comment-text): Customizable
- function to process comment text.
+ * ob-tangle.el (org-babel-process-comment-text):
+ Customizable function to process comment text.
(org-babel-tangle-collect-blocks): Make use of new
customizable processing function.
(org-babel-spec-to-string): Call customizable function rather than
@@ -7284,8 +7274,8 @@
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
- * org-exp.el (org-export-select-backend-specific-text): Only
- remove commas on the front line of a code block.
+ * org-exp.el (org-export-select-backend-specific-text):
+ Only remove commas on the front line of a code block.
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
@@ -7299,8 +7289,8 @@
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-footnote.el (org-footnote-in-valid-context-p): No
- footnote in latex fragments.
+ * org-footnote.el (org-footnote-in-valid-context-p):
+ No footnote in latex fragments.
2012-01-03 Martin Rudalics <rudalics@gmx.at>
@@ -7314,14 +7304,14 @@
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-inlinetask.el (org-inlinetask-goto-end): Small
- refactoring.
+ * org-inlinetask.el (org-inlinetask-goto-end):
+ Small refactoring.
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
* ob-asymptote.el (org-babel-asymptote-var-to-asymptote):
refactor code.
- (org-babel-asymptote-table-to-array): Removed function.
+ (org-babel-asymptote-table-to-array): Remove function.
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -7335,8 +7325,8 @@
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-inlinetask.el (org-inlinetask-goto-end): Correctly
- detect the end of an inlinetask when the next one starts
+ * org-inlinetask.el (org-inlinetask-goto-end):
+ Correctly detect the end of an inlinetask when the next one starts
immediately after the current one. Also, return position of
point.
@@ -7347,8 +7337,8 @@
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
- * ob-asymptote.el (org-babel-asymptote-define-type): Elisp
- floats are asymptote reals.
+ * ob-asymptote.el (org-babel-asymptote-define-type):
+ Elisp floats are asymptote reals.
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -7380,8 +7370,8 @@
2012-01-03 Bastien Guerry <bzg@gnu.org>
* org-agenda.el (org-search-view, org-agenda-get-todos)
- (org-agenda-get-deadlines, org-agenda-get-scheduled): Add
- `category-pos' in let construct.
+ (org-agenda-get-deadlines, org-agenda-get-scheduled):
+ Add `category-pos' in let construct.
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -7479,8 +7469,8 @@
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
- * org-exp-blocks.el (org-export-blocks-preprocess): Explicitly
- cleaning up markers.
+ * org-exp-blocks.el (org-export-blocks-preprocess):
+ Explicitly cleaning up markers.
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
@@ -7511,8 +7501,8 @@
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-list.el (org-list-separating-blank-lines-number): The
- behaviour of `org-back-over-empty-lines' depends on the
+ * org-list.el (org-list-separating-blank-lines-number):
+ The behaviour of `org-back-over-empty-lines' depends on the
associated value of `headline' in
`org-blank-before-new-entry', which is out of context in a
list.
@@ -7523,7 +7513,7 @@
buffer isn't being watched, resume initialization of other watched
buffers. In that case, give hand to others idle timers or
processes more frequently.
- (org-indent-agent-active-delay): Renamed from
+ (org-indent-agent-active-delay): Rename from
`org-indent-agent-process-duration'.
(org-indent-agent-passive-delay): New variable.
(org-indent-agent-resume-delay): Change value.
@@ -7560,7 +7550,7 @@
* org-agenda.el (org-agenda-include-all-todo): Declare this option
as no longer working.
(org-timeline): Rename the include-all argument to dotodo.
- (org-arg-loc): Renamed from` org-include-all-loc'.
+ (org-arg-loc): Rename from` org-include-all-loc'.
(org-agenda-list): Rename the INCLUDE-ALL argument to ARG,
because its function has changed.
@@ -7578,7 +7568,7 @@
(org-indent-initial-timer, org-indent-initial-resume-timer)
(org-indent-initial-process-duration)
(org-indent-initial-resume-delay)
- (org-indent-initial-lock): Removed variables.
+ (org-indent-initial-lock): Remove variables.
(org-indent-mode): Set up an agent to watch current buffer, or
add it to the list of already watched buffers.
(org-indent-initialize-agent): New function.
@@ -7628,9 +7618,9 @@
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-indent.el (org-indent-modified-headline-flag): Renamed from
+ * org-indent.el (org-indent-modified-headline-flag): Rename from
`org-indent-deleted-headline-flag'
- (org-indent-notify-modified-headline): Renamed from
+ (org-indent-notify-modified-headline): Rename from
`org-indent-notify-deleted-headline'. Handle situations when
the stars of an headline are modified.
(org-indent-refresh-maybe): Remove case now handled by
@@ -7639,8 +7629,8 @@
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-indent.el (org-indent-inlinetask-first-star): New
- variable.
+ * org-indent.el (org-indent-inlinetask-first-star):
+ New variable.
(org-indent-add-properties): Set the first star of inline-tasks'
virtual indentation in `org-warning' face.
@@ -7651,8 +7641,8 @@
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
* org-indent.el (org-indent-initial-marker)
- (org-indent-initial-timer, org-indent-initial-lock): New
- variables.
+ (org-indent-initial-timer, org-indent-initial-lock):
+ New variables.
(org-indent-mode): At initialization, start an idle timer to indent
the whole buffer. When the user is asking for control, interrupt the
process, and resume at the same point when idle again.
@@ -7686,16 +7676,16 @@
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-indent.el (org-indent-fix-section-after-idle-time): Remove
- variable.
+ * org-indent.el (org-indent-fix-section-after-idle-time):
+ Remove variable.
(org-indent-initialize): Remove timer.
(org-indent-add-properties): Refactor code.
(org-indent-refresh-subtree, org-indent-refresh-section)
- (org-indent-refresh-buffer,org-indent-set-initial-properties): Remove
- functions.
+ (org-indent-refresh-buffer,org-indent-set-initial-properties):
+ Remove functions.
(org-indent-deleted-headline): New variable.
- (org-indent-notify-deleted-headline,org-indent-refresh-maybe): New
- functions.
+ (org-indent-notify-deleted-headline,org-indent-refresh-maybe):
+ New functions.
(org-indent-mode): Insert new functions into a hook.
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -7708,8 +7698,8 @@
line, as required by `wrap-prefix' specificity.
(org-indent-refresh-section,org-indent-refresh-subtree): Refactor.
(org-indent-refresh-view): New function.
- (org-indent-refresh-to, org-indent-refresh-section): Removed
- functions.
+ (org-indent-refresh-to, org-indent-refresh-section):
+ Remove functions.
* org.el (org-unfontify-region): Do not remove prefix
properties when unfontifying a region.
@@ -7730,8 +7720,8 @@
2012-01-03 Bastien Guerry <bzg@gnu.org>
* org-clock.el (org-duration-string-to-minutes)
- (org-minutes-to-hh:mm-string, org-hh:mm-string-to-minutes): Move
- from org.el.
+ (org-minutes-to-hh:mm-string, org-hh:mm-string-to-minutes):
+ Move from org.el.
2012-01-03 Bastien Guerry <bzg@gnu.org>
@@ -7757,8 +7747,8 @@
2012-01-03 Bastien Guerry <bzg@gnu.org>
- * org-archive.el (org-archive-to-archive-sibling): Use
- `org-outline-regexp' instead of `outline-regexp'.
+ * org-archive.el (org-archive-to-archive-sibling):
+ Use `org-outline-regexp' instead of `outline-regexp'.
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -7804,8 +7794,8 @@
2012-01-03 Jambunathan K <kjambunathan@gmail.com>
- * org-inlinetask.el (org-inlinetask-export-templates): Fixed
- template for html so that the exported file is valid
+ * org-inlinetask.el (org-inlinetask-export-templates):
+ Fix template for html so that the exported file is valid
xhtml. Added template for odt.
(org-inlinetask-export-handler): Fix typo in the regexp that
trims content. Make sure that the content is flanked by
@@ -7925,8 +7915,8 @@
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-inlinetask.el (org-inlinetask-export-templates): Fix
- docstring.
+ * org-inlinetask.el (org-inlinetask-export-templates):
+ Fix docstring.
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -7950,8 +7940,8 @@
2012-01-03 Jambunathan K <kjambunathan@gmail.com>
- * org-inlinetask.el (org-inlinetask-export-handler): Don't
- export inline tasks if the current backend has provided no
+ * org-inlinetask.el (org-inlinetask-export-handler):
+ Don't export inline tasks if the current backend has provided no
entries in `org-inlinetask-export-templates'.
2012-01-03 Valentin Wüstholz <wuestholz@gmail.com> (tiny change)
@@ -7971,24 +7961,24 @@
2012-01-03 David Maus <dmaus@ictsoc.de>
- * org-agenda.el (org-batch-agenda, org-batch-agenda-csv): Use
- `org-eval-in-environment.
+ * org-agenda.el (org-batch-agenda, org-batch-agenda-csv):
+ Use `org-eval-in-environment.
2012-01-03 David Maus <dmaus@ictsoc.de>
- * org-macs.el (org-make-parameter-alist): New function. Turn
- flat list of alternating symbol names and values into an alist
+ * org-macs.el (org-make-parameter-alist): New function.
+ Turn flat list of alternating symbol names and values into an alist
with symbol name in car and value in cdr.
2012-01-03 David Maus <dmaus@ictsoc.de>
- * org-agenda.el (org-agenda-with-point-at-orig-entry): Use
- macro `org-with-gensyms'.
+ * org-agenda.el (org-agenda-with-point-at-orig-entry):
+ Use macro `org-with-gensyms'.
2012-01-03 David Maus <dmaus@ictsoc.de>
- * org-macs.el (org-substitute-posix-classes): New
- function. Substitute posix classes in regular expression.
+ * org-macs.el (org-substitute-posix-classes):
+ New function. Substitute posix classes in regular expression.
(org-re): Use new function.
2012-01-03 David Maus <dmaus@ictsoc.de>
@@ -8032,8 +8022,8 @@
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-footnote.el (org-footnote-label-history): Removed
- variable
+ * org-footnote.el (org-footnote-label-history):
+ Remove variable
(org-footnote-new): Remove call to that variable.
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -8044,7 +8034,7 @@
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
- * ob.el (org-babel-sha1-hash): Removed use of `copy-seq'.
+ * ob.el (org-babel-sha1-hash): Remove use of `copy-seq'.
2012-01-03 Eric Schulte <schulte.eric@gmail.com>
@@ -8058,8 +8048,8 @@
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-footnote.el (org-footnote-in-valid-context-p): Check
- `org-protected' property before allowing to match a footnote.
+ * org-footnote.el (org-footnote-in-valid-context-p):
+ Check `org-protected' property before allowing to match a footnote.
(org-footnote-at-reference-p): Remove an obsolete test. It is now
done in the previous function.
@@ -8070,8 +8060,8 @@
(org-narrow-to-block, org-in-block-p)
(org-indent-line-function): Applied the rename.
- * ob-exp.el (org-babel-in-example-or-verbatim): Applied
- rename. Also removed a white space.
+ * ob-exp.el (org-babel-in-example-or-verbatim):
+ Applied rename. Also removed a white space.
2012-01-03 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -8159,7 +8149,7 @@
2011-09-02 Chong Yidong <cyd@stupidchicken.com>
- * org-compat.el (org-pop-to-buffer-same-window): Deleted.
+ * org-compat.el (org-pop-to-buffer-same-window): Delete.
* ob-ref.el (org-babel-ref-goto-headline-id):
* org.el (org-get-location, org-tree-to-indirect-buffer)
@@ -8200,8 +8190,8 @@
2011-07-28 Bastien Guerry <bzg@gnu.org>
- * org-publish.el (org-publish-index-generate-theindex): Rename
- from `org-publish-index-generate-theindex.inc'. Use the file
+ * org-publish.el (org-publish-index-generate-theindex):
+ Rename from `org-publish-index-generate-theindex.inc'. Use the file
theindex.org directly instead of including theindex.inc.
(org-publish-projects): Don't delete .orgx files.
(org-publish-aux-preprocess): Use .file.orgx.
@@ -8225,8 +8215,8 @@
unless they were already visited.
(org-sitemap-sort-files, org-sitemap-sort-folders)
(org-sitemap-ignore-case, org-sitemap-requested)
- (org-sitemap-date-format, org-sitemap-file-entry-format): Use
- a correct prefix.
+ (org-sitemap-date-format, org-sitemap-file-entry-format):
+ Use a correct prefix.
(org-publish-projects): Make sure to delete .orgx files.
(org-publish-index-generate-theindex.inc): Small docstring fix.
@@ -8373,8 +8363,8 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
* org.el (org-paste-subtree, org-kill-is-subtree-p)
- (org-yank-folding-would-swallow-text, org-yank-generic): Use
- `org-with-limited-levels' macro.
+ (org-yank-folding-would-swallow-text, org-yank-generic):
+ Use `org-with-limited-levels' macro.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -8461,8 +8451,8 @@
2011-07-28 Matt Lundin <mdl@imapmail.org>
- * org-bibtex.el (org-bibtex-create, org-bibtex-write): Change
- argument of `org-toggle-tag' to 'on. (Other arguments, e.g., t,
+ * org-bibtex.el (org-bibtex-create, org-bibtex-write):
+ Change argument of `org-toggle-tag' to 'on. (Other arguments, e.g., t,
have no effect).
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
@@ -8501,8 +8491,8 @@
(org-fill-paragraph, org-toggle-fixed-width-section)
(org-yank-generic, org-yank-folding-would-swallow-text)
(org-first-sibling-p, org-goto-sibling)
- (org-goto-first-child, org-show-entry): Use
- `org-outline-regexp' and `org-outline-regexp-bol'.
+ (org-goto-first-child, org-show-entry):
+ Use `org-outline-regexp' and `org-outline-regexp-bol'.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -8525,8 +8515,8 @@
2011-07-28 Bastien Guerry <bzg@gnu.org>
- * org-latex.el (org-export-latex-image-default-option): Change
- default value.
+ * org-latex.el (org-export-latex-image-default-option):
+ Change default value.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -8542,8 +8532,8 @@
2011-07-28 Jon Anders Skorpen <jonas@ifi.uio.no> (tiny change)
- * org-publish.el (org-publish-cache-file-needs-publishing): Regexp
- did not find includes with double quoted file names.
+ * org-publish.el (org-publish-cache-file-needs-publishing):
+ Regexp did not find includes with double quoted file names.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -8587,8 +8577,8 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-latex.el (org-export-latex-list-parameters): Complete
- default value with cbtrans option.
+ * org-latex.el (org-export-latex-list-parameters):
+ Complete default value with cbtrans option.
* org-list.el (org-list-to-latex): Set a more consistent default
value.
@@ -8613,8 +8603,8 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-list.el (org-list-delete-item, org-list-send-item): New
- functions.
+ * org-list.el (org-list-delete-item, org-list-send-item):
+ New functions.
2011-07-28 Bastien Guerry <bzg@gnu.org>
@@ -8694,8 +8684,8 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-list.el (org-plain-list-ordered-item-terminator): Remove
- incorrect assumption.
+ * org-list.el (org-plain-list-ordered-item-terminator):
+ Remove incorrect assumption.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -8782,8 +8772,8 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
* org-exp.el (org-export-preprocess-string): If the last subtree
- is a task, footnotes may be removed along with the subtree. This
- patch ensures footnotes are put at the end of the buffer after the
+ is a task, footnotes may be removed along with the subtree.
+ This patch ensures footnotes are put at the end of the buffer after the
subtree has been removed.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -8805,8 +8795,8 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * ob-python.el (org-babel-python-evaluate-session): Enough
- newlines to ensure a return when ":results output :session".
+ * ob-python.el (org-babel-python-evaluate-session):
+ Enough newlines to ensure a return when ":results output :session".
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
@@ -8817,8 +8807,8 @@
2011-07-28 Bastien Guerry <bzg@gnu.org>
- * org-table.el (org-table-time-seconds-to-string): Use
- `org-format-seconds' instead of `format-seconds'.
+ * org-table.el (org-table-time-seconds-to-string):
+ Use `org-format-seconds' instead of `format-seconds'.
2011-07-28 David Maus <dmaus@ictsoc.de>
@@ -8844,14 +8834,14 @@
2011-07-28 David Maus <dmaus@ictsoc.de>
- * ob-haskell.el (org-babel-haskell-export-to-lhs): Call
- `kill-buffer' with argument indiciating to kill current
+ * ob-haskell.el (org-babel-haskell-export-to-lhs):
+ Call `kill-buffer' with argument indiciating to kill current
buffer. Emacs 22 compatibility.
2011-07-28 David Maus <dmaus@ictsoc.de>
- * org-macs.el (org-without-partial-completion): Toggle
- partial-completion-mode only if it is turned on.
+ * org-macs.el (org-without-partial-completion):
+ Toggle partial-completion-mode only if it is turned on.
2011-07-28 Bastien Guerry <bzg@gnu.org>
@@ -8894,8 +8884,8 @@
2011-07-28 Eric S Fraga <e.fraga@ucl.ac.uk>
- * org-latex.el (org-export-latex-timestamp-inactive-markup): New
- option to allow different markup for inactive timestamps.
+ * org-latex.el (org-export-latex-timestamp-inactive-markup):
+ New option to allow different markup for inactive timestamps.
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
@@ -9098,15 +9088,15 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-docbook.el (org-export-docbook-footnote-separator): New
- variable.
+ * org-docbook.el (org-export-docbook-footnote-separator):
+ New variable.
(org-export-as-docbook): Add a separator between footnotes.
* org-html.el (org-export-html-footnote-separator): New variable.
(org-export-as-html): Add a separator between footnotes.
- * org-latex.el (org-export-latex-footnote-separator): New
- variable.
+ * org-latex.el (org-export-latex-footnote-separator):
+ New variable.
(org-export-latex-preprocess): Add a separator between footnotes.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -9124,8 +9114,8 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-footnote.el (org-footnote-next-reference-or-definition): New
- function.
+ * org-footnote.el (org-footnote-next-reference-or-definition):
+ New function.
* org.el (org-activate-footnote-links): Activate the whole
footnote, but only fontify its label.
@@ -9169,8 +9159,8 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * org-exp.el (org-export-select-backend-specific-text): Strip
- protective commas from literal code blocks.
+ * org-exp.el (org-export-select-backend-specific-text):
+ Strip protective commas from literal code blocks.
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
@@ -9275,10 +9265,10 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * ob-lob.el (org-babel-inline-lob-one-liner-regexp): Updated to
+ * ob-lob.el (org-babel-inline-lob-one-liner-regexp): Update to
successfully match optional trailing header arguments in square
brackets.
- (org-babel-lob-get-info): Updated to match the new regexp.
+ (org-babel-lob-get-info): Update to match the new regexp.
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
@@ -9300,8 +9290,8 @@
2011-07-28 Jambunathan K <kjambunathan@gmail.com>
- * org-exp.el (org-export-format-source-code-or-example): Fix
- signature of org-<backend>-format-source-code-or-example function.
+ * org-exp.el (org-export-format-source-code-or-example):
+ Fix signature of org-<backend>-format-source-code-or-example function.
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
@@ -9310,8 +9300,8 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * ob-exp.el (org-babel-exp-lob-one-liners): Appropriate
- replacement of inline call blocks with their results.
+ * ob-exp.el (org-babel-exp-lob-one-liners):
+ Appropriate replacement of inline call blocks with their results.
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
@@ -9363,8 +9353,8 @@
2011-07-28 Jambunathan K <kjambunathan@gmail.com>
- * org-exp.el (org-export-format-source-code-or-example): Add
- support for: - custom formatters for existing backends - seamless
+ * org-exp.el (org-export-format-source-code-or-example):
+ Add support for: - custom formatters for existing backends - seamless
plugging in of new backends.
2011-07-28 Jambunathan K <kjambunathan@gmail.com>
@@ -9424,8 +9414,8 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * ob-emacs-lisp.el (org-babel-execute:emacs-lisp): Respects
- ":results verbatim".
+ * ob-emacs-lisp.el (org-babel-execute:emacs-lisp):
+ Respects ":results verbatim".
2011-07-28 Carsten Dominik <carsten.dominik@gmail.com>
@@ -9433,8 +9423,8 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * ob-python.el (org-babel-python-evaluate-session): Send
- comint-send-input after every line when interacting with an
+ * ob-python.el (org-babel-python-evaluate-session):
+ Send comint-send-input after every line when interacting with an
interactive python process.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -9667,8 +9657,8 @@
2011-07-28 Carsten Dominik <carsten.dominik@gmail.com>
- * org-html.el (org-export-as-html, org-html-level-start): Only
- convert section number underscores to dashes.
+ * org-html.el (org-export-as-html, org-html-level-start):
+ Only convert section number underscores to dashes.
2011-07-28 Carsten Dominik <carsten.dominik@gmail.com>
@@ -9688,8 +9678,8 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * org-exp-blocks.el (org-export-blocks-preprocess): Ensure
- balanced nested begin/end blocks in block bodies.
+ * org-exp-blocks.el (org-export-blocks-preprocess):
+ Ensure balanced nested begin/end blocks in block bodies.
2011-07-28 Dan Davison <dandavison7@gmail.com>
@@ -9697,15 +9687,15 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * ob-tangle.el (org-babel-tangle-named-block-combination): Block
- combination can now take a number of values.
+ * ob-tangle.el (org-babel-tangle-named-block-combination):
+ Block combination can now take a number of values.
(org-babel-tangle-combine-named-blocks): More sophisticated block
combination behavior.
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * ob-tangle.el (org-babel-tangle-do-combine-named-blocks): Switch
- to turn on the combination of code blocks of the same name.
+ * ob-tangle.el (org-babel-tangle-do-combine-named-blocks):
+ Switch to turn on the combination of code blocks of the same name.
(org-babel-tangle-combine-named-blocks): Combine blocks of the same
name.
@@ -9798,8 +9788,8 @@
* org-exp.el (org-export): Use new compatibility function
`org-activate-mark'.
- * org-compat.el (org-activate-mark): New function. Provide
- `activate-mark' if not present (e.g. Emacs 22).
+ * org-compat.el (org-activate-mark): New function.
+ Provide `activate-mark' if not present (e.g. Emacs 22).
2011-07-28 David Maus <dmaus@ictsoc.de>
@@ -9844,8 +9834,8 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-latex.el (org-export-latex-preprocess): Add
- `original-indentation' property to footnotes so they cannot
+ * org-latex.el (org-export-latex-preprocess):
+ Add `original-indentation' property to footnotes so they cannot
possibly end a list by being less indented than the item they
belong to.
@@ -9953,10 +9943,10 @@
2011-07-28 Roland Kaufmann <rlndkfmn+orgmode@gmail.com> (tiny change)
- * org-exp.el (org-remove-formatting-on-newlines-in-region): New
- function.
- (org-export-format-source-code-or-example): Call
- `org-remove-formatting-on-newlines-in-region'.
+ * org-exp.el (org-remove-formatting-on-newlines-in-region):
+ New function.
+ (org-export-format-source-code-or-example):
+ Call `org-remove-formatting-on-newlines-in-region'.
2011-07-28 David Maus <dmaus@ictsoc.de>
@@ -9967,14 +9957,14 @@
* org-html.el (org-export-as-html): Don't expand non-data lines of
table.el tables.
- (org-html-expand): Removed the (buggy) test for non-data lines
+ (org-html-expand): Remove the (buggy) test for non-data lines
in table.el tables. The test is now done as part of
org-export-as-html.
(org-format-table-table-html-using-table-generate-source):
- Added test for spanning of cells in table.el tables using
+ Add test for spanning of cells in table.el tables using
table.el's own library routine. Optionally suppress export of
simple table.el tables.
- (org-format-table-html): Removed the (buggy) test for spanned
+ (org-format-table-html): Remove the (buggy) test for spanned
table.el tables. The test is now done as part of
org-format-table-table-html-using-table-generate-source.
@@ -10018,8 +10008,8 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-list.el (org-list-separating-blank-lines-number): Fix
- confusion between point and item beginning. Now, if no
+ * org-list.el (org-list-separating-blank-lines-number):
+ Fix confusion between point and item beginning. Now, if no
information is available, truly follow user preference when it
inserts blank lines manually.
(org-list-insert-item): Send correct argument to the preceding
@@ -10100,8 +10090,8 @@
2011-07-28 Robert P. Goldman <rpgoldman@real-time.com> (tiny change)
- * ob-exp.el (org-babel-exp-in-export-file): Bind
- `org-link-search-inhibit-query' to t to inhibit prompts.
+ * ob-exp.el (org-babel-exp-in-export-file):
+ Bind `org-link-search-inhibit-query' to t to inhibit prompts.
2011-07-28 Carsten Dominik <carsten.dominik@gmail.com>
@@ -10152,8 +10142,8 @@
2011-07-28 Matt Lundin <mdl@imapmail.org>
- * org-bibtex.el (org-bibtex-treat-headline-as-title): New
- defcustom.
+ * org-bibtex.el (org-bibtex-treat-headline-as-title):
+ New defcustom.
(org-bibtex-headline): Only use headline text (not TODO or other
metadata) to generate title field and auto key.
(org-bibtex-fleshout): Allow user to choose whether to treat
@@ -10204,7 +10194,7 @@
2011-07-28 Carsten Dominik <carsten.dominik@gmail.com>
- * org.el (org-remove-uninherited-tags): Renamed from
+ * org.el (org-remove-uninherited-tags): Rename from
`org-remove-iniherited-tags'.
(org-scan-tags): Fix typo in function call.
(org-get-tags-at): Fix typo in function call.
@@ -10239,11 +10229,11 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * org-bibtex.el (org-bibtex-headline): Renamed flet function `get'
+ * org-bibtex.el (org-bibtex-headline): Rename flet function `get'
which was causing compile problems.
- (org-bibtex-fleshout): Renamed flet function `get' which was causing
+ (org-bibtex-fleshout): Rename flet function `get' which was causing
compile problems.
- (org-bibtex-write): Renamed flet function `get' which was causing
+ (org-bibtex-write): Rename flet function `get' which was causing
compile problems.
2011-07-28 Christian Egli <christian.egli@sbszh.ch>
@@ -10381,8 +10371,8 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * ob-ocaml.el (org-babel-ocaml-read-list): Use
- `org-babel-script-escape'.
+ * ob-ocaml.el (org-babel-ocaml-read-list):
+ Use `org-babel-script-escape'.
(org-babel-ocaml-read-array): Use `org-babel-script-escape'.
2011-07-28 Manuel Giraud <manuel.giraud@univ-nantes.fr>
@@ -10397,7 +10387,7 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * org-src.el (org-src-lang-modes): Added a language alias of "C"
+ * org-src.el (org-src-lang-modes): Add a language alias of "C"
to "c".
2011-07-28 Shaun Johnson <shaun@slugfest.demon.co.uk> (tiny change)
@@ -10432,8 +10422,8 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * ob-python.el (org-babel-python-evaluate-external-process): Allow
- parsing as a table in the case of ":results output table".
+ * ob-python.el (org-babel-python-evaluate-external-process):
+ Allow parsing as a table in the case of ":results output table".
(org-babel-python-evaluate-session): Allow parsing as a table in
the case of ":results output table".
@@ -10451,8 +10441,8 @@
2011-07-28 Julien Danjou <julien@danjou.info>
* org.el (org-entry-get, org-entry-delete, org-entry-put)
- (org-property-values, org-delete-property-globally): Use
- `org-re-property'.
+ (org-property-values, org-delete-property-globally):
+ Use `org-re-property'.
(org-re-property): New function allowing to build a regexp to
match a property.
@@ -10471,12 +10461,12 @@
2011-07-28 Julien Danjou <julien@danjou.info>
- * org-table.el (org-table-cleanup-narrow-column-properties): Use
- point-min rather than 1 when moving in the buffer.
+ * org-table.el (org-table-cleanup-narrow-column-properties):
+ Use point-min rather than 1 when moving in the buffer.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-list.el (org-list-in-valid-context-p): Renamed from
+ * org-list.el (org-list-in-valid-context-p): Rename from
`org-list-in-valid-block-p'.
(org-at-item-p,org-list-search-generic): Use renamed function.
@@ -10522,13 +10512,13 @@
2011-07-28 Lawrence Mitchell <wence@gmx.li>
- * org-latex.el (org-export-latex-convert-table.el-table): Fix
- format-string for insertion of captions.
+ * org-latex.el (org-export-latex-convert-table.el-table):
+ Fix format-string for insertion of captions.
2011-07-28 Nick Dokos <nicholas.dokos@hp.com> (tiny change)
- * org-exp.el (org-export-remove-comment-blocks-and-subtrees): Fix
- regexp.
+ * org-exp.el (org-export-remove-comment-blocks-and-subtrees):
+ Fix regexp.
2011-07-28 Carsten Dominik <carsten.dominik@gmail.com> (tiny change)
@@ -10570,8 +10560,8 @@
2011-07-28 Lawrence Mitchell <wence@gmx.li>
- * org-html.el (org-export-as-html, org-html-level-start): Fix
- logic for section number printing when NUM is an integer.
+ * org-html.el (org-export-as-html, org-html-level-start):
+ Fix logic for section number printing when NUM is an integer.
2011-07-28 Lawrence Mitchell <wence@gmx.li>
@@ -10580,8 +10570,8 @@
2011-07-28 Lawrence Mitchell <wence@gmx.li>
- * org.el (org-point-at-end-of-empty-headline): Bind
- `case-fold-search' to nil.
+ * org.el (org-point-at-end-of-empty-headline):
+ Bind `case-fold-search' to nil.
2011-07-28 Carsten Dominik <carsten.dominik@gmail.com>
@@ -10716,8 +10706,8 @@
2011-07-28 Lawrence Mitchell <wence@gmx.li>
* org-html.el (org-export-as-html): Get local value of
- org-export-with-section-numbers from the buffer's plist. Deal
- specially with the case the resulting value is an integer.
+ org-export-with-section-numbers from the buffer's plist.
+ Deal specially with the case the resulting value is an integer.
(org-html-level-start): New optional argument of the option plist used
instead of `org-export-with-section-numbers'. Also deal specially
with the case that the value is an integer.
@@ -10750,7 +10740,7 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * ob-sh.el (org-babel-sh-var-to-sh): Fixed insertion of tabular
+ * ob-sh.el (org-babel-sh-var-to-sh): Fix insertion of tabular
data into shell variables.
2011-07-28 David Maus <dmaus@ictsoc.de>
@@ -10765,8 +10755,8 @@
2011-07-28 Carsten Dominik <carsten.dominik@gmail.com>
- * org-table.el (org-table-formula-handle-first/last-rc): Bind
- `char'.
+ * org-table.el (org-table-formula-handle-first/last-rc):
+ Bind `char'.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -10882,8 +10872,8 @@
* org-html.el (org-export-as-html): Handle links with
`org-html-handle-links' after we handle special characters
conversions.
- (org-html-make-link, org-export-html-format-image): Don't
- protect html with @ anymore, as links are now handled after
+ (org-html-make-link, org-export-html-format-image):
+ Don't protect html with @ anymore, as links are now handled after
special characters conversions.
2011-07-28 Julien Danjou <julien@danjou.info>
@@ -10965,8 +10955,8 @@
* org-html.el (org-export-html-insert-plist-item): Remove.
(org-export-html-preamble): Default to `t'. Accept functions.
- (org-export-html-postamble): Default to `auto'. Accept
- functions and distinguish between 'auto (no formatting string)
+ (org-export-html-postamble): Default to `auto'.
+ Accept functions and distinguish between 'auto (no formatting string)
and `t' (default formatting string).
(org-export-as-html): Handle org-export-html-preamble and
org-export-html-postamble new defaults/allowed values.
@@ -10984,7 +10974,7 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-list.el (org-list-parse-list): Fixed regexp.
+ * org-list.el (org-list-parse-list): Fix regexp.
2011-07-28 David Maus <dmaus@ictsoc.de>
@@ -11000,8 +10990,8 @@
2011-07-28 David Maus <dmaus@ictsoc.de>
- * org-html.el (org-html-make-link, org-html-handle-links): Protect
- generated XHTML elements.
+ * org-html.el (org-html-make-link, org-html-handle-links):
+ Protect generated XHTML elements.
(org-export-as-html): Expand character entities after creating markup
for links and timestamps.
@@ -11080,8 +11070,8 @@
2011-07-28 Jason Dunsmore <emacs-orgmode@deathroller.dunsmor.com> (tiny change)
- * org.el (org-back-over-empty-lines): Bugfix. Honor
- `org-blank-before-new-entry' correctly in various contexts.
+ * org.el (org-back-over-empty-lines): Bugfix.
+ Honor `org-blank-before-new-entry' correctly in various contexts.
2011-07-28 Bastien Guerry <bzg@gnu.org>
@@ -11103,8 +11093,8 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
* org-list.el (org-update-checkbox-count): Ensure cookies on an
- heading are correctly updated when checkboxes are hidden. It
- allows, for example, to use C-c C-x C-b on a collapsed tree and
+ heading are correctly updated when checkboxes are hidden.
+ It allows, for example, to use C-c C-x C-b on a collapsed tree and
still get the update.
2011-07-28 David Maus <dmaus@ictsoc.de>
@@ -11163,8 +11153,8 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org.el (org-demote-subtree,org-promote-subtree): Wrap
- `org-map-tree' into `org-with-limited-levels' macro, so it avoids
+ * org.el (org-demote-subtree,org-promote-subtree):
+ Wrap `org-map-tree' into `org-with-limited-levels' macro, so it avoids
operating on inline tasks.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -11295,8 +11285,8 @@
2011-07-28 Bastien Guerry <bzg@gnu.org>
- * org-exp-bibtex.el (org-export-bibtex-preprocess): Use
- `org-export-current-backend'.
+ * org-exp-bibtex.el (org-export-bibtex-preprocess):
+ Use `org-export-current-backend'.
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
@@ -11311,8 +11301,8 @@
2011-07-28 Bastien Guerry <bzg@gnu.org>
* org-special-blocks.el
- (org-special-blocks-make-special-cookies): Use
- `org-export-current-backend'.
+ (org-special-blocks-make-special-cookies):
+ Use `org-export-current-backend'.
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
@@ -11320,7 +11310,7 @@
as an argument.
(org-babel-exp-src-block): Explicitly pass language to
`org-babel-exp-in-export-file'.
- (org-babel-exp-inline-src-blocks): Removed unused code.
+ (org-babel-exp-inline-src-blocks): Remove unused code.
(org-babel-exp-results): Explicitly pass language to
`org-babel-exp-in-export-file'.
@@ -11373,7 +11363,7 @@
* org-table.el (orgtbl-ctrl-c-ctrl-c): Bind local variable
`const-str'.
- * org.el (org-eval): Moved function here from org-agenda.el.
+ * org.el (org-eval): Move function here from org-agenda.el.
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
@@ -11484,8 +11474,8 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * org-exp-blocks.el (org-export-blocks-format-comment): Explicitly
- append a newline to the body.
+ * org-exp-blocks.el (org-export-blocks-format-comment):
+ Explicitly append a newline to the body.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -11539,8 +11529,8 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
* org-list.el (org-cycle-item-indentation): Do not break an
- indentation cycle because visibility cycling is requested. This
- happens when an item becomes a parent, due to indentation change.
+ indentation cycle because visibility cycling is requested.
+ This happens when an item becomes a parent, due to indentation change.
Not considered empty anymore, the function cannot change its
indentation again.
@@ -11603,8 +11593,8 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-list.el (org-toggle-checkbox, org-update-checkbox-count): No
- need to wrap `org-entry-get' in `ignore-errors'.
+ * org-list.el (org-toggle-checkbox, org-update-checkbox-count):
+ No need to wrap `org-entry-get' in `ignore-errors'.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -11615,8 +11605,8 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-exp.el (org-export-select-backend-specific-text): Add
- `original-indentation' property when replacing #+begin_backend and
+ * org-exp.el (org-export-select-backend-specific-text):
+ Add `original-indentation' property when replacing #+begin_backend and
#+backend blocks with their content. This is needed for lists, as
they must know if the block belonged to them.
@@ -11651,8 +11641,8 @@
* org.el (org-cycle, org-cycle-internal-local): Separate lists and
inline tasks from headlines.
- (org-outline-level): Do not consider lists as headlines. Cycling
- visibility is using different tools.
+ (org-outline-level): Do not consider lists as headlines.
+ Cycling visibility is using different tools.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -11717,8 +11707,8 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org.el (org-toggle-item): Now accepts a prefix argument. When
- used without argument on normal text, it will make the whole
+ * org.el (org-toggle-item): Now accepts a prefix argument.
+ When used without argument on normal text, it will make the whole
region one item. With an argument, it defaults to old behavior:
change each line in region into an item.
@@ -11749,23 +11739,23 @@
* org-exp.el (org-export-mark-list-properties): Apply renaming.
- * org-list.el (org-list-prevs-alist): Renamed from
+ * org-list.el (org-list-prevs-alist): Rename from
`org-list-struct-prev-alist'.
- (org-list-parents-alist): Renamed from `org-list-struct-parent-alist'.
- (org-list-write-struct): Renamed from `org-list-struct-fix-struct'.
+ (org-list-parents-alist): Rename from `org-list-struct-parent-alist'.
+ (org-list-write-struct): Rename from `org-list-struct-fix-struct'.
(org-list-parse-list, org-sort-list, org-list-indent-item-generic)
(org-toggle-checkbox, org-update-checkbox-count)
(org-cycle-list-bullet, org-list-repair, org-insert-item)
(org-move-item-up, org-move-item-up, org-move-item-down)
(org-next-item, org-previous-item, org-end-of-item-list)
(org-beginning-of-item-list, org-apply-on-list): Apply renaming.
- (org-get-bullet): Removed function, as it is not needed anymore.
+ (org-get-bullet): Remove function, as it is not needed anymore.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
* org-list.el (org-list-insert-item-generic): Change arguments.
- The function now accepts structure and previous items alist. This
- allows to insert an item programmatically more easily.
+ The function now accepts structure and previous items alist.
+ This allows to insert an item programmatically more easily.
(org-insert-item): Apply changes to
`org-list-insert-item-generic'. The function now takes care about
repairing structure and updating checkboxes.
@@ -11778,11 +11768,11 @@
* org-list.el (org-list-make-subtree): Function now uses
`org-list-parse-list mechanism'.
- (org-list-make-subtrees): Removed function.
- (org-list-to-generic): Added a parameter and every parameter can
+ (org-list-make-subtrees): Remove function.
+ (org-list-to-generic): Add a parameter and every parameter can
be a sexp returning a string, for finer control.
- (org-list-to-html, org-list-to-latex, org-list-to-texinfo): Slight
- modifications to apply changes to `org-list-to-generic'.
+ (org-list-to-html, org-list-to-latex, org-list-to-texinfo):
+ Slight modifications to apply changes to `org-list-to-generic'.
(org-list-to-subtree): New function.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -11804,8 +11794,8 @@
(org-list-parse-list): Handle counters and list depth.
(org-list-to-generic): A special string is used when an item has a
counter.
- (org-list-to-latex): Use new special string for counters. This
- fixes the counter bug in LaTeX export, as the enumi counter was
+ (org-list-to-latex): Use new special string for counters.
+ This fixes the counter bug in LaTeX export, as the enumi counter was
the only one modified.
* org-latex.el (org-export-latex-lists): Use new
@@ -11824,9 +11814,9 @@
* org-list.el (org-alphabetical-lists): New variable
(org-item-re, org-list-full-item, org-cycle-list-bullet)
- (org-list-struct-fix-bul, org-list-inc-bullet-maybe): Reflect
- introduction of the new variable.
- (org-item-beginning-re): Changed into a function, so any
+ (org-list-struct-fix-bul, org-list-inc-bullet-maybe):
+ Reflect introduction of the new variable.
+ (org-item-beginning-re): Change into a function, so any
modification of `org-alphabetical-lists' will not require
reloading Org.
(org-at-item-p, org-toggle-checkbox, org-update-checkbox-count)
@@ -11857,7 +11847,7 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-list.el (org-list-end-re): Removed function and made it a
+ * org-list.el (org-list-end-re): Remove function and made it a
variable. There's no need for the overhead of calling the
function every at every line in a list. User will have to reload
Org if he change value of either `org-list-end-regexp' or
@@ -11867,8 +11857,8 @@
* org-exp.el (org-export-mark-list-end)
(org-export-mark-list-properties): Apply change.
- * org-latex.el (org-export-latex-lists): Apply change. Also
- prevent items with org-example property to be considered as real
+ * org-latex.el (org-export-latex-lists): Apply change.
+ Also prevent items with org-example property to be considered as real
items.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -11896,8 +11886,8 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-list.el (org-list-automatic-rules): Removed insert rule.
- (org-list-insert-item-generic): Removed code preventing user to
+ * org-list.el (org-list-automatic-rules): Remove insert rule.
+ (org-list-insert-item-generic): Remove code preventing user to
insert another item in a block within a list. It is because new
list context make it impossible to see if a point in a block is
also in a list.
@@ -11911,7 +11901,7 @@
can easily be included in lists.
(org-export-mark-list-end): New function.
(org-export-mark-list-properties): New function.
- (org-export-mark-lists): Removed function. It was split into the
+ (org-export-mark-lists): Remove function. It was split into the
two preceding functions.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -11929,19 +11919,19 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-list.el (org-list-forbidden-blocks): Renamed from
+ * org-list.el (org-list-forbidden-blocks): Rename from
`org-list-blocks'.
(org-list-export-context): New variable.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-list.el (org-list-search-generic): Renamed form
+ * org-list.el (org-list-search-generic): Rename form
`org-search-unenclosed-generic' to reflect the new behavior. Now,
match can only be in a valid context for lists, as determined by
`org-list-context'.
- (org-list-search-backward): Renamed from
+ (org-list-search-backward): Rename from
`org-search-backward-unenclosed'.
- (org-list-search-forward): Renamed from
+ (org-list-search-forward): Rename from
`org-search-forward-unenclosed'.
(org-toggle-checkbox,org-update-checkbox-count): Use new
functions.
@@ -11964,7 +11954,7 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org.el (org-get-string-indentation): Moved in generally useful
+ * org.el (org-get-string-indentation): Move in generally useful
functions section, as it wasn't specific to plain lists and that
no code was using it in org-list.el.
@@ -11985,8 +11975,8 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-list.el (org-apply-on-list): Use new structures. Function
- is now applied in reverse order so modifications do not change
+ * org-list.el (org-apply-on-list): Use new structures.
+ Function is now applied in reverse order so modifications do not change
positions of items in buffer.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -12000,7 +11990,7 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-list.el (org-list-has-child-p): Renamed from
+ * org-list.el (org-list-has-child-p): Rename from
`org-list-get-child'. Returning first child is only useful as a
predicate, as we are allowing an item to have more than one
sub-list.
@@ -12052,34 +12042,34 @@
* org-list.el (org-list-in-item-p): Unify methods for this
predicate.
- (org-list-in-item-p-with-indent): Removed function.
- (org-list-ending-between): Removed function.
- (org-list-maybe-skip-block): Removed function.
- (org-list-in-item-p-with-regexp): Removed function.
- (org-list-top-point-with-regexp): Removed function.
- (org-list-top-point-with-indent): Removed function.
- (org-list-bottom-point-with-indent): Removed function.
- (org-list-bottom-point-with-regexp): Removed function.
- (org-list-get-item-same-level): Removed function.
- (org-list-top-point): Removed function.
- (org-list-bottom-point): Removed function.
- (org-get-item-beginning): Renamed to `org-list-get-item-begin' to
+ (org-list-in-item-p-with-indent): Remove function.
+ (org-list-ending-between): Remove function.
+ (org-list-maybe-skip-block): Remove function.
+ (org-list-in-item-p-with-regexp): Remove function.
+ (org-list-top-point-with-regexp): Remove function.
+ (org-list-top-point-with-indent): Remove function.
+ (org-list-bottom-point-with-indent): Remove function.
+ (org-list-bottom-point-with-regexp): Remove function.
+ (org-list-get-item-same-level): Remove function.
+ (org-list-top-point): Remove function.
+ (org-list-bottom-point): Remove function.
+ (org-get-item-beginning): Rename to `org-list-get-item-begin' to
be consistent with naming policy of non-interactive functions.
- (org-get-beginning-of-list): Removed function.
+ (org-get-beginning-of-list): Remove function.
(org-beginning-of-item-list): Use new accessors.
- (org-get-end-of-list): Removed function.
+ (org-get-end-of-list): Remove function.
(org-end-of-list): Use new accessors.
- (org-get-end-of-item): Removed function.
+ (org-get-end-of-item): Remove function.
(org-end-of-item): Use new accessors.
- (org-get-previous-item): Removed function.
+ (org-get-previous-item): Remove function.
(org-previous-item): Use new accessors.
- (org-get-next-item): Removed function.
+ (org-get-next-item): Remove function.
(org-next-item): Use new accessors.
(org-list-get-item-end-before-blank): Use new accessors.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
- * org-list.el (org-list-repair): Removed optional argument
+ * org-list.el (org-list-repair): Remove optional argument
FORCE-BULLET. The job of this interactive function is to
completely fix a list at point. Changing bullets is a separate
task. Also removed others optional arguments TOP and BOTTOM to
@@ -12094,8 +12084,8 @@
(org-list-insert-item-generic): Reflect changes to `org-list-repair'.
(org-list-exchange-items): Use new accessors. Now modify struct
to avoid re-reading it later.
- (org-move-item-down): Reflect changes to `org-list-repair'. Use
- new accessors.
+ (org-move-item-down): Reflect changes to `org-list-repair'.
+ Use new accessors.
(org-move-item-up): Reflect changes to `org-list-repair'. Use new
accessors.
(org-cycle-list-bullet): Use new structures. Also use a shortcut
@@ -12139,7 +12129,7 @@
new accessors.
(org-list-struct-fix-ind): Make use of new accessors.
(org-list-struct-fix-box): New function.
- (org-list-struct-fix-checkboxes): Removed function.
+ (org-list-struct-fix-checkboxes): Remove function.
(org-list-struct-outdent): Use new accessors. Use the fact that
there is no longer a virtual item at beginning of structure.
(org-list-struct-indent): Use helper functions
@@ -12150,7 +12140,7 @@
first.
(org-list-struct-apply-struct): Comment function. Rewrite using
new accessors. Use new variable `org-list-full-item-re'.
- (org-list-shift-item-indentation): Removed function, now included
+ (org-list-shift-item-indentation): Remove function, now included
in `org-list-struct-apply-struct' because it is too specific.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -12162,7 +12152,7 @@
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
* org-list.el (org-list-struct-fix-checkboxes): New function.
- (org-checkbox-blocked-p): Removed function.
+ (org-checkbox-blocked-p): Remove function.
2011-07-28 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -12179,8 +12169,8 @@
(org-list-struct-fix-bul): Use new accessors.
(org-list-repair): Use new accessors.
(org-list-indent-item-generic): Make use of accessors.
- (org-list-get-parent): Renamed from `org-list-struct-get-parent'.
- (org-list-get-child): Renamed from `org-list-struct-get-child'.
+ (org-list-get-parent): Rename from `org-list-struct-get-parent'.
+ (org-list-get-child): Rename from `org-list-struct-get-child'.
(org-list-struct-fix-ind): Make use of accessors.
(org-list-get-next-item): New function.
(org-list-get-subtree): New function.
@@ -12204,8 +12194,8 @@
2011-07-28 David Maus <dmaus@ictsoc.de>
* org-protocol.el (org-protocol-unhex-single-byte-sequence)
- (org-protocol-unhex-string, org-protocol-unhex-compound): Change
- date of obsolete declaration to 2011-02-17.
+ (org-protocol-unhex-string, org-protocol-unhex-compound):
+ Change date of obsolete declaration to 2011-02-17.
2011-07-28 David Maus <dmaus@ictsoc.de>
@@ -12292,8 +12282,8 @@
2011-07-28 Sebastian Rose <sebastian_rose@gmx.de>
- * org-protocol.el (org-protocol-unhex-single-byte-sequence): New
- function. Decode hex-encoded singly byte sequences.
+ * org-protocol.el (org-protocol-unhex-single-byte-sequence):
+ New function. Decode hex-encoded singly byte sequences.
(org-protocol-unhex-compound): Use new function if decoding sequence
as Unicode character failed.
@@ -12303,8 +12293,8 @@
2011-07-28 Bastien Guerry <bzg@gnu.org>
- * org-publish.el (org-publish-cache-ctime-of-src): Improve
- docstring.
+ * org-publish.el (org-publish-cache-ctime-of-src):
+ Improve docstring.
(org-publish-find-title): New option to explicitly reset the title
in the cache.
(org-publish-format-file-entry): Use this new option.
@@ -12317,13 +12307,13 @@
2011-07-28 Dan Davison <dandavison7@gmail.com>
- * org-exp.el (org-export-format-source-code-or-example): Allow
- empty string as second element in minted/listings options.
+ * org-exp.el (org-export-format-source-code-or-example):
+ Allow empty string as second element in minted/listings options.
2011-07-28 Dan Davison <dandavison7@gmail.com>
- * org-exp.el (org-export-format-source-code-or-example): Support
- new user-customizable options.
+ * org-exp.el (org-export-format-source-code-or-example):
+ Support new user-customizable options.
(org-export-latex-custom-lang-environments): Ensure new variable
is defined.
(org-export-latex-listings-options): Ensure new variable is defined.
@@ -12425,8 +12415,8 @@
2011-07-28 Bastien Guerry <bzg@gnu.org>
- * org-latex.el (org-export-latex-hyperref-format): Update
- docstring.
+ * org-latex.el (org-export-latex-hyperref-format):
+ Update docstring.
2011-07-28 Tom Dye <tsd@tsdye.com>
@@ -12529,8 +12519,8 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * org-exp-blocks.el (org-export-blocks-format-ditaa): This
- function is begin deprecated in favor of begin_src blocks.
+ * org-exp-blocks.el (org-export-blocks-format-ditaa):
+ This function is begin deprecated in favor of begin_src blocks.
(org-export-blocks-format-dot): This function is begin deprecated in
favor of begin_src blocks.
@@ -12559,8 +12549,8 @@
2011-07-28 Julien Danjou <julien@danjou.info>
- * org-agenda.el (org-agenda): Kill all local variables. This
- assures we are not keeping buffer variable from an old agenda view
+ * org-agenda.el (org-agenda): Kill all local variables.
+ This assures we are not keeping buffer variable from an old agenda view
when switching to a new custom agenda.
2011-07-28 Julien Danjou <julien@danjou.info>
@@ -12621,8 +12611,8 @@
2011-07-28 Bastien Guerry <bzg@gnu.org>
* org-agenda.el (org-agenda-repeating-timestamp-show-all): Allow
- to use a list of TODO keywords as the value of this variable. The
- agenda will show repeating stamps for entries matching these TODO
+ to use a list of TODO keywords as the value of this variable.
+ The agenda will show repeating stamps for entries matching these TODO
keywords.
(org-agenda-get-timestamps, org-agenda-get-deadlines)
(org-agenda-get-scheduled): Allow the use of a list of keywords in
@@ -12673,8 +12663,8 @@
2011-07-28 Bastien Guerry <bzg@gnu.org>
- * org-latex.el (org-export-latex-emphasis-alist): Use
- \protectedtexttt for the =...= emphasis and \verb for the ~...~
+ * org-latex.el (org-export-latex-emphasis-alist):
+ Use \protectedtexttt for the =...= emphasis and \verb for the ~...~
emphasis.
(org-export-latex-use-verb): Now defaults to t.
(org-export-latex-emph-format): Distinguish between =...= and
@@ -12731,18 +12721,18 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * ob-exp.el (org-babel-exp-do-export): Simplified, no longer need
+ * ob-exp.el (org-babel-exp-do-export): Simplify, no longer need
to do anything to export code.
(org-babel-exp-results): No longer returns a replacement for the
code block.
- (org-babel-exp-inline-src-blocks): Simplified.
- (org-babel-exp-src-block): Removed unnecessary pluralization from
+ (org-babel-exp-inline-src-blocks): Simplify.
+ (org-babel-exp-src-block): Remove unnecessary pluralization from
function name.
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * ob-exp.el (org-babel-exp-inline-src-blocks): Simplified
- exportation of inline code blocks using normal code block
+ * ob-exp.el (org-babel-exp-inline-src-blocks):
+ Simplify exportation of inline code blocks using normal code block
execution mechanism to insert results.
(org-babel-exp-results): Results exportation mechanism is unified
for both inline and regular code blocks.
@@ -13045,8 +13035,8 @@
(org-entry-properties): Remove refresh - this is now done in
org-get-category.
- * org-clock.el (org-clock-insert-selection-line): Let
- `org-get-category' do the property refresh.
+ * org-clock.el (org-clock-insert-selection-line):
+ Let `org-get-category' do the property refresh.
* org-archive.el (org-archive-subtree): Force a refresh of
category properties.
@@ -13105,7 +13095,7 @@
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
- * ob.el (org-babel-execute-src-block): Removed unused flet
+ * ob.el (org-babel-execute-src-block): Remove unused flet
function.
2011-07-28 Dan Davison <dandavison7@gmail.com>
@@ -13194,13 +13184,13 @@
2011-07-28 Carsten Dominik <carsten.dominik@gmail.com>
- * org-capture.el (org-capture-set-target-location): Use
- `current-time'.
+ * org-capture.el (org-capture-set-target-location):
+ Use `current-time'.
2011-07-28 Carsten Dominik <carsten.dominik@gmail.com>
- * org-capture.el (org-capture-set-target-location): Use
- `current-time'.
+ * org-capture.el (org-capture-set-target-location):
+ Use `current-time'.
2011-07-28 Bernt Hansen <bernt@norang.ca>
@@ -13243,8 +13233,8 @@
2011-07-28 Julien Danjou <julien@danjou.info>
- * org-capture.el (org-capture-fill-template): Use
- `org-set-property' directly.
+ * org-capture.el (org-capture-fill-template):
+ Use `org-set-property' directly.
2011-07-28 Julien Danjou <julien@danjou.info>
@@ -13293,8 +13283,8 @@
2011-07-28 Konrad Hinsen <konrad.hinsen@fastmail.net>
- * ob-python.el (org-babel-python-initiate-session-by-key): Make
- sure that py-which-bufname is initialized, as otherwise it will be
+ * ob-python.el (org-babel-python-initiate-session-by-key):
+ Make sure that py-which-bufname is initialized, as otherwise it will be
overwritten the first time a Python buffer is created.
2011-07-28 Eric Schulte <schulte.eric@gmail.com>
@@ -13338,8 +13328,8 @@
2011-07-28 Åukasz Stelmach <lukasz.stelmach@iem.pw.edu.pl>
- * org-html.el (org-export-html-mathjax-template): Displaymath
- environment and MathJax.
+ * org-html.el (org-export-html-mathjax-template):
+ Displaymath environment and MathJax.
2011-07-28 Carsten Dominik <carsten.dominik@gmail.com>
@@ -14358,7 +14348,7 @@
2010-11-11 Eric Schulte <schulte.eric@gmail.com>
- * ob.el (org-babel-demarcate-block): Updated to reflect the new
+ * ob.el (org-babel-demarcate-block): Update to reflect the new
info list contents.
2010-11-11 Dan Davison <davison@stats.ox.ac.uk>
@@ -14398,7 +14388,7 @@
2010-11-11 Eric Schulte <schulte.eric@gmail.com>
- * ob-table.el (sbe): Simplified to reflect to var resolution.
+ * ob-table.el (sbe): Simplify to reflect to var resolution.
2010-11-11 Eric Schulte <schulte.eric@gmail.com>
@@ -15297,7 +15287,7 @@
(org-speed-command-default-hook): The default hook for
org-speed-command-hook. Factored out from org-self-insert-command
and mimics existing behavior.
- (org-self-insert-command): Modified to use org-speed-command-hook.
+ (org-self-insert-command): Modify to use org-speed-command-hook.
2010-11-11 Carsten Dominik <carsten.dominik@gmail.com>
@@ -15785,8 +15775,8 @@
2010-11-11 Dan Davison <davison@stats.ox.ac.uk>
* org.el (org-fontify-meta-lines-and-blocks): Alter main regexp to
- match code blocks with switches and header args. Call
- `org-src-font-lock-fontify-block' for automatic fontification of
+ match code blocks with switches and header args.
+ Call `org-src-font-lock-fontify-block' for automatic fontification of
code in code blocks, controlled by variable
`org-src-fontify-natively'.
(org-src-fontify-natively): New variable.
@@ -15955,8 +15945,8 @@
change.
* org-list.el (org-indent-item-tree): Prevent whole list from
- being moved when user is not moving subtree. Thus
- `org-cycle-item-indentation' will not allow to move the list.
+ being moved when user is not moving subtree.
+ Thus `org-cycle-item-indentation' will not allow to move the list.
2010-11-11 Nicolas Goaziou <n.goaziou@gmail.com>
@@ -16048,7 +16038,7 @@
`org-toggle-checkbox' is trying to insert a checkbox at a
description item.
- * org-list.el (org-item-re): Modified regexp so it can catch
+ * org-list.el (org-item-re): Modify regexp so it can catch
correct number of white space before item body.
* org-list.el (org-list-at-regexp-after-bullet-p): Take into
@@ -16660,7 +16650,7 @@
2010-11-11 Nicolas Goaziou <n.goaziou@gmail.com>
- * org.el (org-make-link-regexps): Modified regexp of
+ * org.el (org-make-link-regexps): Modify regexp of
org-plain-link-re.
2010-11-11 Noorul Islam <noorul@noorul.com> (tiny change)
@@ -16785,7 +16775,7 @@
* org-feed.el (xml-substitute-special): Declare function for byte
compiler.
- (org-feed-unescape): Removed.
+ (org-feed-unescape): Remove.
(org-feed-parse-rss-entry, org-feed-parse-atom-entry):
Use `xml-substitute-special' to unescape XML entities.
@@ -17119,7 +17109,7 @@
2010-11-11 Eric Schulte <schulte.eric@gmail.com>
- * ob-R.el (org-babel-R-evaluate): Improved prompt-stripping regexp.
+ * ob-R.el (org-babel-R-evaluate): Improve prompt-stripping regexp.
2010-11-11 Eric Schulte <schulte.eric@gmail.com>
@@ -21710,7 +21700,7 @@
2009-08-06 Carsten Dominik <carsten.dominik@gmail.com>
- * org.el (org-cycle-internal-local): Improved version of finding
+ * org.el (org-cycle-internal-local): Improve version of finding
next visible line.
(org-cycle-hide-drawers): Only hide drawers if this is really
necessary.
diff --git a/lisp/org/org-agenda.el b/lisp/org/org-agenda.el
index 79217b6a6e6..764b15ff6c5 100644
--- a/lisp/org/org-agenda.el
+++ b/lisp/org/org-agenda.el
@@ -2015,10 +2015,10 @@ The following commands are available:
(org-add-hook 'post-command-hook 'org-agenda-update-agenda-type nil 'local)
(org-add-hook 'pre-command-hook 'org-unhighlight nil 'local)
;; Make sure properties are removed when copying text
- (make-local-variable 'filter-buffer-substring-functions)
(add-hook 'filter-buffer-substring-functions
(lambda (fun start end delete)
- (substring-no-properties (funcall fun start end delete))))
+ (substring-no-properties (funcall fun start end delete)))
+ nil t)
(unless org-agenda-keep-modes
(setq org-agenda-follow-mode org-agenda-start-with-follow-mode
org-agenda-entry-text-mode org-agenda-start-with-entry-text-mode
diff --git a/lisp/org/org-bibtex.el b/lisp/org/org-bibtex.el
index 704b20497b9..6ed6abc42b5 100644
--- a/lisp/org/org-bibtex.el
+++ b/lisp/org/org-bibtex.el
@@ -120,7 +120,6 @@
(declare-function bibtex-generate-autokey "bibtex" ())
(declare-function bibtex-parse-entry "bibtex" (&optional content))
(declare-function bibtex-url "bibtex" (&optional pos no-browse))
-(declare-function longlines-mode "longlines" (&optional arg))
(declare-function org-babel-trim "ob" (string &optional regexp))
@@ -381,7 +380,7 @@ This variable is relevant only if `org-bibtex-export-tags-as-keywords' is t."
(buf-name (format "*Bibtex Help %s*" name)))
(with-output-to-temp-buffer buf-name
(princ (cdr (assoc field org-bibtex-fields))))
- (with-current-buffer buf-name (longlines-mode t))
+ (with-current-buffer buf-name (visual-line-mode 1))
(org-fit-window-to-buffer (get-buffer-window buf-name))
((lambda (result) (when (> (length result) 0) result))
(read-from-minibuffer (format "%s: " name))))))
diff --git a/lisp/org/org-freemind.el b/lisp/org/org-freemind.el
index c33b70224fa..3b1c6863f54 100644
--- a/lisp/org/org-freemind.el
+++ b/lisp/org/org-freemind.el
@@ -275,7 +275,7 @@ will also unescape &#nn;."
)))
org-str))))
-;; (let* ((str1 "a quote: \", an amp: &, lt: <; over 256: öåäÖÅÄ")
+;; (let* ((str1 "a quote: \", an amp: &, lt: <; over 256: öåäÖÅÄ")
;; (str2 (org-freemind-escape-str-from-org str1))
;; (str3 (org-freemind-unescape-str-to-org str2)))
;; (unless (string= str1 str3)
@@ -1221,6 +1221,7 @@ PATH should be a list of steps, where each step has the form
;; Local variables:
;; generated-autoload-file: "org-loaddefs.el"
+;; coding: utf-8
;; End:
;;; org-freemind.el ends here
diff --git a/lisp/org/org-indent.el b/lisp/org/org-indent.el
index 6e6f2bf1589..9719a1fa035 100644
--- a/lisp/org/org-indent.el
+++ b/lisp/org/org-indent.el
@@ -182,11 +182,11 @@ during idle time."
(org-set-local 'org-hide-leading-stars-before-indent-mode
org-hide-leading-stars)
(org-set-local 'org-hide-leading-stars t))
- (make-local-variable 'filter-buffer-substring-functions)
(add-hook 'filter-buffer-substring-functions
(lambda (fun start end delete)
(org-indent-remove-properties-from-string
- (funcall fun start end delete))))
+ (funcall fun start end delete)))
+ nil t)
(org-add-hook 'after-change-functions 'org-indent-refresh-maybe nil 'local)
(org-add-hook 'before-change-functions
'org-indent-notify-modified-headline nil 'local)
@@ -213,7 +213,8 @@ during idle time."
(remove-hook 'filter-buffer-substring-functions
(lambda (fun start end delete)
(org-indent-remove-properties-from-string
- (funcall fun start end delete))))
+ (funcall fun start end delete)))
+ t)
(remove-hook 'after-change-functions 'org-indent-refresh-maybe 'local)
(remove-hook 'before-change-functions
'org-indent-notify-modified-headline 'local)
diff --git a/lisp/outline.el b/lisp/outline.el
index 24f25fd2fb7..0ec5227a286 100644
--- a/lisp/outline.el
+++ b/lisp/outline.el
@@ -43,25 +43,21 @@
:prefix "outline-"
:group 'wp)
-(defcustom outline-regexp "[*\^L]+"
+(defvar outline-regexp "[*\^L]+"
"Regular expression to match the beginning of a heading.
Any line whose beginning matches this regexp is considered to start a heading.
Note that Outline mode only checks this regexp at the start of a line,
so the regexp need not (and usually does not) start with `^'.
The recommended way to set this is with a Local Variables: list
-in the file it applies to. See also `outline-heading-end-regexp'."
- :type 'regexp
- :group 'outlines)
+in the file it applies to. See also `outline-heading-end-regexp'.")
;;;###autoload(put 'outline-regexp 'safe-local-variable 'stringp)
-(defcustom outline-heading-end-regexp "\n"
+(defvar outline-heading-end-regexp "\n"
"Regular expression to match the end of a heading line.
You can assume that point is at the beginning of a heading when this
regexp is searched for. The heading ends at the end of the match.
The recommended way to set this is with a `Local Variables:' list
-in the file it applies to."
- :type 'regexp
- :group 'outlines)
+in the file it applies to.")
;;;###autoload(put 'outline-heading-end-regexp 'safe-local-variable 'stringp)
(defvar outline-mode-prefix-map
diff --git a/lisp/paren.el b/lisp/paren.el
index b87c8bde89a..a9d3be60622 100644
--- a/lisp/paren.el
+++ b/lisp/paren.el
@@ -243,27 +243,26 @@ matching parenthesis is highlighted in `show-paren-style' after
;;
;; Turn on highlighting for the matching paren, if found.
;; If it's an unmatched paren, turn off any such highlighting.
- (unless (integerp pos)
- (delete-overlay show-paren-overlay))
- (let ((to (if (or (eq show-paren-style 'expression)
- (and (eq show-paren-style 'mixed)
- (not (pos-visible-in-window-p pos))))
- (point)
- pos))
- (from (if (or (eq show-paren-style 'expression)
+ (if (not (integerp pos))
+ (when show-paren-overlay (delete-overlay show-paren-overlay))
+ (let ((to (if (or (eq show-paren-style 'expression)
(and (eq show-paren-style 'mixed)
(not (pos-visible-in-window-p pos))))
- pos
- (save-excursion
- (goto-char pos)
- (- (point) dir)))))
- (if show-paren-overlay
- (move-overlay show-paren-overlay from to (current-buffer))
- (setq show-paren-overlay (make-overlay from to nil t))))
- ;;
- ;; Always set the overlay face, since it varies.
- (overlay-put show-paren-overlay 'priority show-paren-priority)
- (overlay-put show-paren-overlay 'face face)))
+ (point)
+ pos))
+ (from (if (or (eq show-paren-style 'expression)
+ (and (eq show-paren-style 'mixed)
+ (not (pos-visible-in-window-p pos))))
+ pos
+ (save-excursion
+ (goto-char pos)
+ (- (point) dir)))))
+ (if show-paren-overlay
+ (move-overlay show-paren-overlay from to (current-buffer))
+ (setq show-paren-overlay (make-overlay from to nil t))))
+ ;; Always set the overlay face, since it varies.
+ (overlay-put show-paren-overlay 'priority show-paren-priority)
+ (overlay-put show-paren-overlay 'face face))))
;; show-paren-mode is nil in this buffer.
(and show-paren-overlay
(delete-overlay show-paren-overlay))
diff --git a/lisp/pcmpl-x.el b/lisp/pcmpl-x.el
new file mode 100644
index 00000000000..86d8dc652c3
--- /dev/null
+++ b/lisp/pcmpl-x.el
@@ -0,0 +1,251 @@
+;;; pcmpl-x.el --- completion for miscellaneous tools -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2013 Free Software Foundation, Inc.
+
+;; Author: Leo Liu <sdl.web@gmail.com>
+;; Keywords: processes, tools, convenience
+;; Package: pcomplete
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Code:
+
+(eval-when-compile (require 'cl-lib))
+(require 'pcomplete)
+
+
+;;;; tlmgr - http://www.tug.org/texlive/tlmgr.html
+
+(defcustom pcmpl-x-tlmgr-program "tlmgr"
+ "Name of the tlmgr program."
+ :type 'file
+ :group 'pcomplete)
+
+(defvar pcmpl-x-tlmgr-common-options
+ '("--repository"
+ "--gui"
+ "--gui-lang"
+ "--machine-readable"
+ "--package-logfile"
+ "--pause"
+ "--persistent-downloads"
+ "--no-persistent-downloads"
+ "--no-execute-actions"
+ "--debug-translation"
+ "--help"
+ "--version"))
+
+(defvar pcmpl-x-tlmgr-actions
+ '(("help")
+ ("version")
+ ("gui")
+ ("install")
+ ("update")
+ ("backup")
+ ("restore")
+ ("remove")
+ ("repository" ("list" "add" "remove" "set"))
+ ("candidates")
+ ("option" ("show"
+ "showall"
+ "repository"
+ "formats"
+ "postcode"
+ "docfiles"
+ "srcfiles"
+ "backupdir"
+ "autobackup"
+ "sys_bin"
+ "sys_man"
+ "sys_info"
+ "desktop_integration"
+ "fileassocs"
+ "multiuser"))
+ ("conf" ("texmf" "tlmgr"))
+ ("paper"
+ ("a4" "letter" "xdvi" "pdftex" "dvips" "dvipdfmx" "dvipdfm" "context")
+ (lambda ()
+ (unless (member (pcomplete-arg 1) '("a4" "letter"))
+ (pcomplete-here* '("paper"))
+ (pcomplete-here* '("a4" "letter")))))
+ ("platform" ("list" "add" "remove"))
+ ("print-platform" ("collections" "schemes"))
+ ("arch" ("list" "add" "remove"))
+ ("print-arch" ("collections" "schemes"))
+ ("info" ("collections" "schemes"))
+ ("search")
+ ("dump-tlpdb")
+ ("check" ("files" "depends" "executes" "runfiles" "all"))
+ ("path" ("add" "remove"))
+ ("postaction" ("install" "remove") ("shortcut" "fileassoc" "script"))
+ ("uninstall")
+ ("generate" ("language"
+ "language.dat"
+ "language.def"
+ "language.dat.lua"
+ "fmtutil"))))
+
+(defvar pcmpl-x-tlmgr-options-cache (make-hash-table :size 31 :test 'equal))
+
+(defun pcmpl-x-tlmgr-action-options (action)
+ "Get the list of long options for ACTION."
+ (if (eq (gethash action pcmpl-x-tlmgr-options-cache 'missing) 'missing)
+ (with-temp-buffer
+ (when (zerop
+ (call-process pcmpl-x-tlmgr-program nil t nil action "-h"))
+ (goto-char (point-min))
+ (puthash action
+ (cons "--help"
+ (cl-loop while (re-search-forward
+ "^[ \t]+\\(--[[:alnum:]-]+=?\\)"
+ nil t)
+ collect (match-string 1)))
+ pcmpl-x-tlmgr-options-cache)
+ (pcmpl-x-tlmgr-action-options action)))
+ (gethash action pcmpl-x-tlmgr-options-cache)))
+
+;;;###autoload
+(defun pcomplete/tlmgr ()
+ "Completion for the `tlmgr' command."
+ (while (pcomplete-match "^--" 0)
+ (pcomplete-here* pcmpl-x-tlmgr-common-options)
+ (unless (or (pcomplete-match "^--" 0)
+ (all-completions (pcomplete-arg 0) pcmpl-x-tlmgr-actions))
+ (pcomplete-here* (pcomplete-dirs-or-entries))))
+ (pcomplete-here* pcmpl-x-tlmgr-actions)
+ (let ((action (substring-no-properties (pcomplete-arg 1))))
+ (while t
+ (if (pcomplete-match "^--" 0)
+ (pcomplete-here* (pcmpl-x-tlmgr-action-options action))
+ (dolist (completions (cdr (assoc action pcmpl-x-tlmgr-actions)))
+ (cond ((functionp completions)
+ (funcall completions))
+ ((all-completions (pcomplete-arg 0) completions)
+ (pcomplete-here* completions))
+ (t (pcomplete-here* (pcomplete-dirs-or-entries)))))
+ (unless (pcomplete-match "^--" 0)
+ (pcomplete-here* (pcomplete-dirs-or-entries)))))))
+
+
+;;;; ack - http://betterthangrep.com
+
+;; Usage:
+;; - To complete short options type '-' first
+;; - To complete long options type '--' first
+;; - Color name completion is supported following
+;; --color-filename=, --color-match= and --color-lineno=
+;; - Type completion is supported following --type=
+
+(defcustom pcmpl-x-ack-program
+ (file-name-nondirectory (or (executable-find "ack-grep")
+ (executable-find "ack")
+ "ack"))
+ "Name of the ack program."
+ :type 'file
+ :group 'pcomplete)
+
+(defvar pcmpl-x-ack-color-options
+ '("clear"
+ "reset"
+ "dark"
+ "bold"
+ "underline"
+ "underscore"
+ "blink"
+ "reverse"
+ "concealed"
+ "black"
+ "red"
+ "green"
+ "yellow"
+ "blue"
+ "magenta"
+ "on_black"
+ "on_red"
+ "on_green"
+ "on_yellow"
+ "on_blue"
+ "on_magenta"
+ "on_cyan"
+ "on_white")
+ "Color names for the `ack' command.")
+
+(defun pcmpl-x-ack-run (buffer &rest args)
+ "Run ack with ARGS and send the output to BUFFER."
+ (condition-case nil
+ (apply 'call-process (or pcmpl-x-ack-program "ack") nil buffer nil args)
+ (file-error -1)))
+
+(defun pcmpl-x-ack-short-options ()
+ "Short options for the `ack' command."
+ (with-temp-buffer
+ (let (options)
+ (when (zerop (pcmpl-x-ack-run t "--help"))
+ (goto-char (point-min))
+ (while (re-search-forward "^ -\\([^-]\\)" nil t)
+ (push (match-string 1) options))
+ (mapconcat 'identity (nreverse options) "")))))
+
+(defun pcmpl-x-ack-long-options (&optional arg)
+ "Long options for the `ack' command."
+ (with-temp-buffer
+ (let (options)
+ (when (zerop (pcmpl-x-ack-run t (or arg "--help")))
+ (goto-char (point-min))
+ (while (re-search-forward
+ "\\(?: ?\\|, \\)\\(--\\(\\[no\\]\\)?\\([[:alnum:]-]+=?\\)\\)"
+ nil t)
+ (if (not (match-string 2))
+ (push (match-string 1) options)
+ (push (concat "--" (match-string 3)) options)
+ (push (concat "--no" (match-string 3)) options)))
+ (nreverse options)))))
+
+(defun pcmpl-x-ack-type-options ()
+ "A list of types for the `ack' command."
+ (pcmpl-x-ack-long-options "--help-types"))
+
+;;;###autoload
+(defun pcomplete/ack ()
+ "Completion for the `ack' command.
+Start an argument with '-' to complete short options and '--' for
+long options."
+ ;; No space after =
+ (while t
+ (if (pcomplete-match "^-" 0)
+ (cond
+ ((pcomplete-match "^--color-\\w+=\\(\\S-*\\)" 0)
+ (pcomplete-here* pcmpl-x-ack-color-options
+ (pcomplete-match-string 1 0) t))
+ ((pcomplete-match "^--\\(?:no\\)?ignore-dir=\\(\\S-*\\)" 0)
+ (pcomplete-here* (pcomplete-dirs)
+ (pcomplete-match-string 1 0) t))
+ ((pcomplete-match "^--type=\\(\\S-*\\)" 0)
+ (pcomplete-here* (mapcar (lambda (type-option)
+ (substring type-option 2))
+ (pcmpl-x-ack-type-options))
+ (pcomplete-match-string 1 0) t))
+ ((pcomplete-match "^--" 0)
+ (pcomplete-here* (append (pcmpl-x-ack-long-options)
+ (pcmpl-x-ack-type-options))))
+ (t (pcomplete-opt (pcmpl-x-ack-short-options))))
+ (pcomplete-here* (pcomplete-dirs-or-entries)))))
+
+;;;###autoload
+(defalias 'pcomplete/ack-grep 'pcomplete/ack)
+
+(provide 'pcmpl-x)
+;;; pcmpl-x.el ends here
diff --git a/lisp/play/bubbles.el b/lisp/play/bubbles.el
index 10493093aad..665e98a69b2 100644
--- a/lisp/play/bubbles.el
+++ b/lisp/play/bubbles.el
@@ -1,4 +1,4 @@
-;;; bubbles.el --- Puzzle game for Emacs
+;;; bubbles.el --- Puzzle game for Emacs -*- coding: utf-8 -*-
;; Copyright (C) 2007-2013 Free Software Foundation, Inc.
@@ -198,7 +198,7 @@ types are present."
:group 'bubbles)
(defcustom bubbles-chars
- '(?+ ?O ?# ?X ?. ?* ?& ?§)
+ '(?+ ?O ?# ?X ?. ?* ?& ?§)
"Characters used for bubbles.
Note that the actual number of different bubbles is determined by
the number of colors, see `bubbles-colors'."
diff --git a/lisp/play/fortune.el b/lisp/play/fortune.el
index 17ab6f98254..cb58c0d0af0 100644
--- a/lisp/play/fortune.el
+++ b/lisp/play/fortune.el
@@ -246,12 +246,11 @@ the value of `fortune-file'. This currently cannot handle directories."
(substitute-in-file-name
(concat fortune-file fortune-database-extension)))))
(cond ((file-exists-p fortune-file)
- (if (file-exists-p fortune-dat)
- (cond ((file-newer-than-file-p fortune-file fortune-dat)
- (message "Compiling new fortune database %s" fortune-dat)
- (shell-command
- (concat fortune-strfile fortune-strfile-options
- " " fortune-file fortune-quiet-strfile-options))))))
+ (cond ((file-newer-than-file-p fortune-file fortune-dat)
+ (message "Compiling new fortune database %s" fortune-dat)
+ (shell-command
+ (concat fortune-strfile fortune-strfile-options
+ " " fortune-file fortune-quiet-strfile-options)))))
(t (error "Can't compile fortune file %s" fortune-file)))))
diff --git a/lisp/play/gamegrid.el b/lisp/play/gamegrid.el
index 8d4fb927a69..b6fd064ca84 100644
--- a/lisp/play/gamegrid.el
+++ b/lisp/play/gamegrid.el
@@ -175,7 +175,7 @@ static unsigned char gamegrid_bits[] = {
(defun gamegrid-make-mono-tty-face ()
(let ((face (make-face 'gamegrid-mono-tty-face)))
- (set-face-inverse-video-p face t)
+ (set-face-inverse-video face t)
face))
(defun gamegrid-make-color-tty-face (color)
@@ -505,16 +505,15 @@ FILE is created there."
(make-directory gamegrid-user-score-file-directory t))
(gamegrid-add-score-insecure file score
gamegrid-user-score-file-directory))
- (t (let ((f (expand-file-name
- gamegrid-user-score-file-directory)))
- (when (file-writable-p f)
- (unless (eq (car-safe (file-attributes f))
- t)
- (make-directory f))
- (setq f (expand-file-name file f))
- (unless (file-exists-p f)
- (write-region "" nil f nil 'silent nil 'excl)))
- (gamegrid-add-score-with-update-game-score-1 file f score))))))
+ (t
+ (unless (file-exists-p
+ (directory-file-name gamegrid-user-score-file-directory))
+ (make-directory gamegrid-user-score-file-directory t))
+ (let ((f (expand-file-name file
+ gamegrid-user-score-file-directory)))
+ (unless (file-exists-p f)
+ (write-region "" nil f nil 'silent nil 'excl))
+ (gamegrid-add-score-with-update-game-score-1 file f score))))))
(defun gamegrid-add-score-with-update-game-score-1 (file target score)
(let ((default-directory "/")
@@ -560,7 +559,7 @@ FILE is created there."
(goto-char (point-min))
(search-forward (concat (int-to-string score)
" " (user-login-name) " "
- marker-string))
+ marker-string) nil t)
(beginning-of-line)))))
(defun gamegrid-add-score-insecure (file score &optional directory)
diff --git a/lisp/play/gametree.el b/lisp/play/gametree.el
index 5cd39d535c8..3daf9d5f784 100644
--- a/lisp/play/gametree.el
+++ b/lisp/play/gametree.el
@@ -435,7 +435,7 @@ only work of Black's moves are explicitly numbered, for instance
gametree-half-ply-regexp)) limit))
(goto-char (match-beginning 0))))
(gametree-transpose-following-leaves)
- (let* ((pt (set-marker (make-marker) (point)))
+ (let* ((pt (point-marker))
(plys (gametree-current-branch-ply))
(depth (gametree-current-branch-depth))
(old-depth depth))
diff --git a/lisp/play/handwrite.el b/lisp/play/handwrite.el
index de6c198092e..63b09895e85 100644
--- a/lisp/play/handwrite.el
+++ b/lisp/play/handwrite.el
@@ -1,4 +1,4 @@
-;;; handwrite.el --- turns your emacs buffer into a handwritten document -*- coding: iso-latin-1; -*-
+;;; handwrite.el --- turns your emacs buffer into a handwritten document -*- coding: utf-8; -*-
;; Copyright (C) 1996, 2001-2013 Free Software Foundation, Inc.
@@ -170,15 +170,15 @@ Variables: `handwrite-linespace' (default 12)
(textp)
(ps-buf-name) ;name of the PostScript buffer
(trans-table
- '(("ÿ" . "264") ("á" . "207") ("à" . "210") ("â" . "211")
- ("ä" . "212") ("ã" . "213") ("å" . "214") ("é" . "216")
- ("è" . "217") ("ê" . "220") ("ë" . "221") ("í" . "222")
- ("ì" . "223") ("î" . "224") ("ï" . "225") ("ó" . "227")
- ("ò" . "230") ("ô" . "231") ("ö" . "232") ("õ" . "233")
- ("ú" . "234") ("ù" . "235") ("û" . "236") ("ü" . "237")
- ("ß" . "247") ("°" . "241") ("®" . "250") ("©" . "251")
- ("ij" . "264") ("ç" . "215") ("§" . "244") ("ñ" . "226")
- ("£" . "243")))
+ '(("ÿ" . "264") ("á" . "207") ("à" . "210") ("â" . "211")
+ ("ä" . "212") ("ã" . "213") ("å" . "214") ("é" . "216")
+ ("è" . "217") ("ê" . "220") ("ë" . "221") ("í" . "222")
+ ("ì" . "223") ("î" . "224") ("ï" . "225") ("ó" . "227")
+ ("ò" . "230") ("ô" . "231") ("ö" . "232") ("õ" . "233")
+ ("ú" . "234") ("ù" . "235") ("û" . "236") ("ü" . "237")
+ ("ß" . "247") ("°" . "241") ("®" . "250") ("©" . "251")
+ ("ij" . "264") ("ç" . "215") ("§" . "244") ("ñ" . "226")
+ ("£" . "243")))
(escape-table '("\\\\" "(" ")")) ; \\ comes first to not work
; on inserted backslashes
line)
diff --git a/lisp/printing.el b/lisp/printing.el
index 9d7efad83b4..bf50aa8f679 100644
--- a/lisp/printing.el
+++ b/lisp/printing.el
@@ -1383,6 +1383,10 @@ Used by `pr-menu-bind' and `pr-update-menus'.")
(eval-when-compile
(require 'easymenu)) ; to avoid compilation gripes
+ (declare-function easy-menu-add-item "easymenu"
+ (map path item &optional before))
+ (declare-function easy-menu-remove-item "easymenu" (map path name))
+
(eval-and-compile
(defun pr-global-menubar (pr-menu-spec)
(require 'easymenu)
@@ -1796,7 +1800,7 @@ The alist element has the form:
Where:
SYMBOL It's a symbol to identify a text printer. It's for
- `pr-txt-name' variable setting and for menu selection.
+ setting option `pr-txt-name' and for menu selection.
Examples:
'prt_06a
'my_printer
@@ -1947,7 +1951,7 @@ The alist element has the form:
Where:
SYMBOL It's a symbol to identify a PostScript printer. It's for
- `pr-ps-name' variable setting and for menu selection.
+ setting option `pr-ps-name' and for menu selection.
Examples:
'prt_06a
'my_printer
@@ -2931,9 +2935,9 @@ INHERITS Specify the inheritance for SYMBOL group. It's a symbol name
The example above has two setting groups: no-duplex and
no-duplex-and-landscape. When setting no-duplex is activated
- through `inherits-from:' (see `pr-ps-utility', `pr-mode-alist'
- and `pr-ps-printer-alist'), the variables pr-file-duplex and
- pr-file-tumble are both set to nil.
+ through `inherits-from:' (see option `pr-ps-utility',
+ `pr-mode-alist' and `pr-ps-printer-alist'), the variables
+ pr-file-duplex and pr-file-tumble are both set to nil.
Now when setting no-duplex-and-landscape is activated through
`inherits-from:', the variable pr-file-landscape is set to nil
@@ -6079,6 +6083,8 @@ COMMAND.exe, COMMAND.bat and COMMAND.com in this order."
(and pr-i-region ; let region activated
(pr-keep-region-active)))
+(declare-function widget-field-action "wid-edit" (widget &optional _event))
+(declare-function widget-value-set "wid-edit" (widget value))
(defun pr-insert-section-1 ()
;; 1. Print:
diff --git a/lisp/profiler.el b/lisp/profiler.el
index 25309ecceda..093a01a8602 100644
--- a/lisp/profiler.el
+++ b/lisp/profiler.el
@@ -202,11 +202,18 @@ function name of a function itself."
(goto-char (point-min))
(read (current-buffer))))
+(defun profiler-running-p (&optional mode)
+ "Return non-nil if the profiler is running.
+Optional argument MODE means only check for the specified mode (cpu or mem)."
+ (cond ((eq mode 'cpu) (and (fboundp 'profiler-cpu-running-p)
+ (profiler-cpu-running-p)))
+ ((eq mode 'mem) (profiler-memory-running-p))
+ (t (or (profiler-running-p 'cpu)
+ (profiler-running-p 'mem)))))
+
(defun profiler-cpu-profile ()
"Return CPU profile."
- (when (and (fboundp 'profiler-cpu-running-p)
- (fboundp 'profiler-cpu-log)
- (profiler-cpu-running-p))
+ (when (profiler-running-p 'cpu)
(profiler-make-profile
:type 'cpu
:timestamp (current-time)
@@ -406,7 +413,6 @@ RET: expand or collapse"))
(defvar profiler-report-mode-map
(let ((map (make-sparse-keymap)))
- ;; FIXME: Add menu.
(define-key map "n" 'profiler-report-next-entry)
(define-key map "p" 'profiler-report-previous-entry)
;; I find it annoying more than helpful to not be able to navigate
@@ -426,8 +432,50 @@ RET: expand or collapse"))
(define-key map "D" 'profiler-report-descending-sort)
(define-key map "=" 'profiler-report-compare-profile)
(define-key map (kbd "C-x C-w") 'profiler-report-write-profile)
- (define-key map "q" 'quit-window)
- map))
+ (easy-menu-define profiler-report-menu map "Menu for Profiler Report mode."
+ '("Profiler"
+ ["Next Entry" profiler-report-next-entry :active t
+ :help "Move to next entry"]
+ ["Previous Entry" profiler-report-previous-entry :active t
+ :help "Move to previous entry"]
+ "--"
+ ["Toggle Entry" profiler-report-toggle-entry
+ :active (profiler-report-calltree-at-point)
+ :help "Expand or collapse the current entry"]
+ ["Find Entry" profiler-report-find-entry
+ ;; FIXME should deactivate if not on a known function.
+ :active (profiler-report-calltree-at-point)
+ :help "Find the definition of the current entry"]
+ ["Describe Entry" profiler-report-describe-entry
+ :active (profiler-report-calltree-at-point)
+ :help "Show the documentation of the current entry"]
+ "--"
+ ["Show Calltree" profiler-report-render-calltree
+ :active profiler-report-reversed
+ :help "Show calltree view"]
+ ["Show Reversed Calltree" profiler-report-render-reversed-calltree
+ :active (not profiler-report-reversed)
+ :help "Show reversed calltree view"]
+ ["Sort Ascending" profiler-report-ascending-sort
+ :active (not (eq profiler-report-order 'ascending))
+ :help "Sort calltree view in ascending order"]
+ ["Sort Descending" profiler-report-descending-sort
+ :active (not (eq profiler-report-order 'descending))
+ :help "Sort calltree view in descending order"]
+ "--"
+ ["Compare Profile..." profiler-report-compare-profile :active t
+ :help "Compare current profile with another"]
+ ["Write Profile..." profiler-report-write-profile :active t
+ :help "Write current profile to a file"]
+ "--"
+ ["Start Profiler" profiler-start :active (not (profiler-running-p))
+ :help "Start profiling"]
+ ["Stop Profiler" profiler-stop :active (profiler-running-p)
+ :help "Stop profiling"]
+ ["New Report" profiler-report :active (profiler-running-p)
+ :help "Make a new report"]))
+ map)
+ "Keymap for `profiler-report-mode'.")
(defun profiler-report-make-buffer-name (profile)
(format "*%s-Profiler-Report %s*"
@@ -531,11 +579,15 @@ otherwise collapse."
(defun profiler-report-find-entry (&optional event)
"Find entry at point."
(interactive (list last-nonmenu-event))
- (if event (posn-set-point (event-end event)))
- (let ((tree (profiler-report-calltree-at-point)))
- (when tree
- (let ((entry (profiler-calltree-entry tree)))
- (find-function entry)))))
+ (with-current-buffer
+ (if event (window-buffer (posn-window (event-start event)))
+ (current-buffer))
+ (and event (setq event (event-end event))
+ (posn-set-point event))
+ (let ((tree (profiler-report-calltree-at-point)))
+ (when tree
+ (let ((entry (profiler-calltree-entry tree)))
+ (find-function entry))))))
(defun profiler-report-describe-entry ()
"Describe entry at point."
diff --git a/lisp/progmodes/autoconf.el b/lisp/progmodes/autoconf.el
index 7a24192cee0..8a99ad6e1b3 100644
--- a/lisp/progmodes/autoconf.el
+++ b/lisp/progmodes/autoconf.el
@@ -78,22 +78,19 @@ searching backwards at another AC_... command."
;;;###autoload
(define-derived-mode autoconf-mode prog-mode "Autoconf"
"Major mode for editing Autoconf configure.ac files."
- (set (make-local-variable 'parens-require-spaces) nil) ; for M4 arg lists
- (set (make-local-variable 'defun-prompt-regexp)
- "^[ \t]*A[CM]_\\(\\sw\\|\\s_\\)+")
- (set (make-local-variable 'comment-start) "dnl ")
- (set (make-local-variable 'comment-start-skip)
- "\\(?:\\(\\W\\|\\`\\)dnl\\|#\\) +")
- (set (make-local-variable 'syntax-propertize-function)
- (syntax-propertize-rules ("\\<dnl\\>" (0 "<"))))
- (set (make-local-variable 'font-lock-defaults)
- `(autoconf-font-lock-keywords nil nil (("_" . "w"))))
- (set (make-local-variable 'imenu-generic-expression)
- autoconf-imenu-generic-expression)
- (set (make-local-variable 'imenu-syntax-alist) '(("_" . "w")))
- (set (make-local-variable 'indent-line-function) #'indent-relative)
- (set (make-local-variable 'add-log-current-defun-function)
- #'autoconf-current-defun-function))
+ (setq-local parens-require-spaces nil) ; for M4 arg lists
+ (setq-local defun-prompt-regexp "^[ \t]*A[CM]_\\(\\sw\\|\\s_\\)+")
+ (setq-local comment-start "dnl ")
+ (setq-local comment-start-skip "\\(?:\\(\\W\\|\\`\\)dnl\\|#\\) +")
+ (setq-local syntax-propertize-function
+ (syntax-propertize-rules ("\\<dnl\\>" (0 "<"))))
+ (setq-local font-lock-defaults
+ `(autoconf-font-lock-keywords nil nil (("_" . "w"))))
+ (setq-local imenu-generic-expression autoconf-imenu-generic-expression)
+ (setq-local imenu-syntax-alist '(("_" . "w")))
+ (setq-local indent-line-function #'indent-relative)
+ (setq-local add-log-current-defun-function
+ #'autoconf-current-defun-function))
(provide 'autoconf-mode)
(provide 'autoconf)
diff --git a/lisp/progmodes/cc-align.el b/lisp/progmodes/cc-align.el
index cb8d2d23c84..33836f25335 100644
--- a/lisp/progmodes/cc-align.el
+++ b/lisp/progmodes/cc-align.el
@@ -737,7 +737,7 @@ arglist-cont-nonempty."
(setq startpos (c-langelem-pos langelem)))))
(setq startpos (c-langelem-pos langelem)
- endpos (point))
+ endpos (c-point 'bol))
;; Find a syntactically relevant and unnested "=" token on the
;; current line. equalp is in that case set to the number of
@@ -1039,6 +1039,7 @@ brace-list-close, brace-list-intro, statement-block-intro,
arglist-intro, arglist-cont-nonempty, arglist-close, and all in*
symbols, e.g. inclass and inextern-lang."
(save-excursion
+ (beginning-of-line)
(if (and (c-go-up-list-backward)
(= (point) (c-point 'boi)))
nil
@@ -1191,6 +1192,7 @@ Works with: arglist-cont, arglist-cont-nonempty."
(let ((orig-pos (point))
alignto)
(save-excursion
+ (beginning-of-line)
(and
c-opt-asm-stmt-key
@@ -1284,7 +1286,7 @@ newline is added. In either case, checking is stopped. This supports
exactly the old newline insertion behavior."
;; newline only after semicolon, but only if that semicolon is not
;; inside a parenthesis list (e.g. a for loop statement)
- (if (not (eq last-command-event ?\;))
+ (if (not (eq (c-last-command-char) ?\;))
nil ; continue checking
(if (condition-case nil
(save-excursion
@@ -1301,7 +1303,7 @@ If a comma was inserted, no determination is made. If a semicolon was
inserted, and the following line is not blank, no newline is inserted.
Otherwise, no determination is made."
(save-excursion
- (if (and (= last-command-event ?\;)
+ (if (and (= (c-last-command-char) ?\;)
;;(/= (point-max)
;; (save-excursion (skip-syntax-forward " ") (point))
(zerop (forward-line 1))
@@ -1318,13 +1320,13 @@ suppressed in one-liners, if the line is an in-class inline function.
For other semicolon contexts, no determination is made."
(let ((syntax (c-guess-basic-syntax))
(bol (save-excursion
- (if (c-safe (up-list -1) t)
- (c-point 'bol)
- -1))))
- (if (and (eq last-command-event ?\;)
- (eq (car (car syntax)) 'inclass)
- (eq (car (car (cdr syntax))) 'topmost-intro)
- (= (c-point 'bol) bol))
+ (if (c-safe (up-list -1) t)
+ (c-point 'bol)
+ -1))))
+ (if (and (eq (c-last-command-char) ?\;)
+ (eq (car (car syntax)) 'inclass)
+ (eq (car (car (cdr syntax))) 'topmost-intro)
+ (= (c-point 'bol) bol))
'stop
nil)))
diff --git a/lisp/progmodes/cc-awk.el b/lisp/progmodes/cc-awk.el
index c4099c7c5d3..4b3fc91b0ff 100644
--- a/lisp/progmodes/cc-awk.el
+++ b/lisp/progmodes/cc-awk.el
@@ -127,22 +127,29 @@
;; escaped EOL.
;; REGEXPS FOR "HARMLESS" STRINGS/LINES.
-(defconst c-awk-harmless-char-re "[^_#/\"\\\\\n\r]")
-;; Matches any character but a _, #, /, ", \, or newline. N.B. _" starts a
-;; localization string in gawk 3.1
(defconst c-awk-harmless-_ "_\\([^\"]\\|\\'\\)")
;; Matches an underline NOT followed by ".
+(defconst c-awk-harmless-char-re "[^_#/\"{}();\\\\\n\r]")
+;; Matches any character not significant in the state machine applying
+;; syntax-table properties to "s and /s.
(defconst c-awk-harmless-string*-re
(concat "\\(" c-awk-harmless-char-re "\\|" c-awk-esc-pair-re "\\|" c-awk-harmless-_ "\\)*"))
-;; Matches a (possibly empty) sequence of chars without unescaped /, ", \,
-;; #, or newlines.
+;; Matches a (possibly empty) sequence of characters insignificant in the
+;; state machine applying syntax-table properties to "s and /s.
(defconst c-awk-harmless-string*-here-re
(concat "\\=" c-awk-harmless-string*-re))
-;; Matches the (possibly empty) sequence of chars without unescaped /, ", \,
-;; at point.
+;; Matches the (possibly empty) sequence of "insignificant" chars at point.
+
+(defconst c-awk-harmless-line-char-re "[^_#/\"\\\\\n\r]")
+;; Matches any character but a _, #, /, ", \, or newline. N.B. _" starts a
+;; localization string in gawk 3.1
+(defconst c-awk-harmless-line-string*-re
+ (concat "\\(" c-awk-harmless-line-char-re "\\|" c-awk-esc-pair-re "\\|" c-awk-harmless-_ "\\)*"))
+;; Matches a (possibly empty) sequence of chars without unescaped /, ", \,
+;; #, or newlines.
(defconst c-awk-harmless-line-re
- (concat c-awk-harmless-string*-re
- "\\(" c-awk-comment-without-nl "\\)?" c-awk-nl-or-eob))
+ (concat c-awk-harmless-line-string*-re
+ "\\(" c-awk-comment-without-nl "\\)?" c-awk-nl-or-eob))
;; Matches (the tail of) an AWK \"logical\" line not containing an unescaped
;; " or /. "logical" means "possibly containing escaped newlines". A comment
;; is matched as part of the line even if it contains a " or a /. The End of
@@ -211,11 +218,11 @@
;; division sign.
(defconst c-awk-neutral-re
; "\\([{}@` \t]\\|\\+\\+\\|--\\|\\\\.\\)+") ; changed, 2003/6/7
- "\\([{}@` \t]\\|\\+\\+\\|--\\|\\\\.\\)")
+ "\\([}@` \t]\\|\\+\\+\\|--\\|\\\\\\(.\\|[\n\r]\\)\\)")
;; A "neutral" char(pair). Doesn't change the "state" of a subsequent /.
-;; This is space/tab, braces, an auto-increment/decrement operator or an
+;; This is space/tab, close brace, an auto-increment/decrement operator or an
;; escaped character. Or one of the (invalid) characters @ or `. But NOT an
-;; end of line (even if escaped).
+;; end of line (unless escaped).
(defconst c-awk-neutrals*-re
(concat "\\(" c-awk-neutral-re "\\)*"))
;; A (possibly empty) string of neutral characters (or character pairs).
@@ -231,8 +238,8 @@
;; will only work when there won't be a preceding " or / before the sought /
;; to foul things up.
(defconst c-awk-non-arith-op-bra-re
- "[[\(&=:!><,?;'~|]")
-;; Matches an opening BRAcket, round or square, or any operator character
+ "[[\({&=:!><,?;'~|]")
+;; Matches an opening BRAcket (of any sort), or any operator character
;; apart from +,-,/,*,%. For the purpose at hand (detecting a / which is a
;; regexp bracket) these arith ops are unnecessary and a pain, because of "++"
;; and "--".
@@ -242,6 +249,16 @@
;; bracket, in a context where an immediate / would be a division sign. This
;; will only work when there won't be a preceding " or / before the sought /
;; to foul things up.
+(defconst c-awk-pre-exp-alphanum-kwd-re
+ (concat "\\(^\\|\\=\\|[^_\n\r]\\)\\<"
+ (regexp-opt '("print" "return" "case") t)
+ "\\>\\([^_\n\r]\\|$\\)"))
+;; Matches all AWK keywords which can precede expressions (including
+;; /regexp/).
+(defconst c-awk-kwd-regexp-sign-re
+ (concat c-awk-pre-exp-alphanum-kwd-re c-awk-escaped-nls*-with-space* "/"))
+;; Matches a piece of AWK buffer ending in <kwd> /, where <kwd> is a keyword
+;; which can precede an expression.
;; REGEXPS USED FOR FINDING THE POSITION OF A "virtual semicolon"
(defconst c-awk-_-harmless-nonws-char-re "[^#/\"\\\\\n\r \t]")
@@ -721,9 +738,10 @@
(goto-char anchor)
;; Analyze the line to find out what the / is.
(if (if anchor-state-/div
- (not (search-forward-regexp c-awk-regexp-sign-re (1+ /point) t))
- (search-forward-regexp c-awk-div-sign-re (1+ /point) t))
- ;; A division sign.
+ (not (search-forward-regexp c-awk-regexp-sign-re (1+ /point) t))
+ (and (not (search-forward-regexp c-awk-kwd-regexp-sign-re (1+ /point) t))
+ (search-forward-regexp c-awk-div-sign-re (1+ /point) t)))
+ ;; A division sign.
(progn (goto-char (1+ /point)) nil)
;; A regexp opener
;; Jump over the regexp innards, setting the match data.
@@ -776,12 +794,21 @@
(< (point) lim))
(setq anchor (point))
(search-forward-regexp c-awk-harmless-string*-here-re nil t)
- ;; We are now looking at either a " or a /.
- ;; Do our thing on the string, regexp or division sign.
+ ;; We are now looking at either a " or a / or a brace/paren/semicolon.
+ ;; Do our thing on the string, regexp or division sign or update
+ ;; our state.
(setq anchor-state-/div
- (if (looking-at "_?\"")
- (c-awk-syntax-tablify-string)
- (c-awk-syntax-tablify-/ anchor anchor-state-/div))))
+ (cond
+ ((looking-at "_?\"")
+ (c-awk-syntax-tablify-string))
+ ((eq (char-after) ?/)
+ (c-awk-syntax-tablify-/ anchor anchor-state-/div))
+ ((memq (char-after) '(?{ ?} ?\( ?\;))
+ (forward-char)
+ nil)
+ (t ; ?\)
+ (forward-char)
+ t))))
nil))
;; ACM, 2002/07/21: Thoughts: We need an AWK Mode after-change function to set
diff --git a/lisp/progmodes/cc-cmds.el b/lisp/progmodes/cc-cmds.el
index e7b12ba04c8..0bb804799dc 100644
--- a/lisp/progmodes/cc-cmds.el
+++ b/lisp/progmodes/cc-cmds.el
@@ -475,7 +475,7 @@ inside a literal or a macro, nothing special happens."
(bolp (bolp)))
(beginning-of-line)
(delete-horizontal-space)
- (insert last-command-event)
+ (insert (c-last-command-char))
(and (not bolp)
(goto-char (- (point-max) pos)))
)))
@@ -737,7 +737,7 @@ settings of `c-cleanup-list' are done."
;; `}': clean up empty defun braces
(when (c-save-buffer-state ()
(and (memq 'empty-defun-braces c-cleanup-list)
- (eq last-command-event ?\})
+ (eq (c-last-command-char) ?\})
(c-intersect-lists '(defun-close class-close inline-close)
syntax)
(progn
@@ -753,14 +753,14 @@ settings of `c-cleanup-list' are done."
;; `}': compact to a one-liner defun?
(save-match-data
(when
- (and (eq last-command-event ?\})
+ (and (eq (c-last-command-char) ?\})
(memq 'one-liner-defun c-cleanup-list)
(c-intersect-lists '(defun-close) syntax)
(c-try-one-liner))
(setq here (- (point-max) pos))))
;; `{': clean up brace-else-brace and brace-elseif-brace
- (when (eq last-command-event ?\{)
+ (when (eq (c-last-command-char) ?\{)
(cond
((and (memq 'brace-else-brace c-cleanup-list)
(re-search-backward
@@ -814,7 +814,7 @@ settings of `c-cleanup-list' are done."
))))
;; blink the paren
- (and (eq last-command-event ?\})
+ (and (eq (c-last-command-char) ?\})
(not executing-kbd-macro)
old-blink-paren
(save-excursion
@@ -851,7 +851,7 @@ is inhibited."
(when (and (not arg)
(eq literal 'c)
(memq 'comment-close-slash c-cleanup-list)
- (eq last-command-event ?/)
+ (eq (c-last-command-char) ?/)
(looking-at (concat "[ \t]*\\("
(regexp-quote comment-end) "\\)?$"))
; (eq c-block-comment-ender "*/") ; C-style comments ALWAYS end in */
@@ -867,7 +867,7 @@ is inhibited."
(setq indentp (and (not arg)
c-syntactic-indentation
c-electric-flag
- (eq last-command-event ?/)
+ (eq (c-last-command-char) ?/)
(eq (char-before) (if literal ?* ?/))))
(self-insert-command (prefix-numeric-value arg))
(if indentp
@@ -941,10 +941,10 @@ settings of `c-cleanup-list'."
(let ((pos (- (point-max) (point))))
(if (c-save-buffer-state ()
(and (or (and
- (eq last-command-event ?,)
+ (eq (c-last-command-char) ?,)
(memq 'list-close-comma c-cleanup-list))
(and
- (eq last-command-event ?\;)
+ (eq (c-last-command-char) ?\;)
(memq 'defun-close-semi c-cleanup-list)))
(progn
(forward-char -1)
@@ -1101,7 +1101,7 @@ numeric argument is supplied, or the point is inside a literal."
;; Indent the line if appropriate.
(when (and c-electric-flag c-syntactic-indentation c-recognize-<>-arglists)
(setq found-delim
- (if (eq last-command-event ?<)
+ (if (eq (c-last-command-char) ?<)
;; If a <, basically see if it's got "template" before it .....
(or (and (progn
(backward-char)
@@ -1195,7 +1195,7 @@ newline cleanups are done if appropriate; see the variable `c-cleanup-list'."
;; clean up brace-elseif-brace
(when
(and (memq 'brace-elseif-brace c-cleanup-list)
- (eq last-command-event ?\()
+ (eq (c-last-command-char) ?\()
(re-search-backward
(concat "}"
"\\([ \t\n]\\|\\\\\n\\)*"
@@ -1213,7 +1213,7 @@ newline cleanups are done if appropriate; see the variable `c-cleanup-list'."
;; clean up brace-catch-brace
(when
(and (memq 'brace-catch-brace c-cleanup-list)
- (eq last-command-event ?\()
+ (eq (c-last-command-char) ?\()
(re-search-backward
(concat "}"
"\\([ \t\n]\\|\\\\\n\\)*"
@@ -1234,7 +1234,7 @@ newline cleanups are done if appropriate; see the variable `c-cleanup-list'."
;; space-before-funcall clean-up?
((and (memq 'space-before-funcall c-cleanup-list)
- (eq last-command-event ?\()
+ (eq (c-last-command-char) ?\()
(save-excursion
(backward-char)
(skip-chars-backward " \t")
@@ -1252,7 +1252,7 @@ newline cleanups are done if appropriate; see the variable `c-cleanup-list'."
;; compact-empty-funcall clean-up?
((c-save-buffer-state ()
(and (memq 'compact-empty-funcall c-cleanup-list)
- (eq last-command-event ?\))
+ (eq (c-last-command-char) ?\))
(save-excursion
(c-safe (backward-char 2))
(when (looking-at "()")
@@ -1281,7 +1281,7 @@ keyword on the line, the keyword is not inserted inside a literal, and
(when (c-save-buffer-state ()
(and c-electric-flag
c-syntactic-indentation
- (not (eq last-command-event ?_))
+ (not (eq (c-last-command-char) ?_))
(= (save-excursion
(skip-syntax-backward "w")
(point))
diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el
index 78c3f32b7a0..48236c2dca2 100644
--- a/lisp/progmodes/cc-defs.el
+++ b/lisp/progmodes/cc-defs.el
@@ -376,6 +376,13 @@ to it is returned. This function does not modify the point or the mark."
`(int-to-char ,integer)
integer))
+(defmacro c-last-command-char ()
+ ;; The last character just typed. Note that `last-command-event' exists in
+ ;; both Emacs and XEmacs, but with confusingly different meanings.
+ (if (featurep 'xemacs)
+ 'last-command-char
+ 'last-command-event))
+
(defmacro c-sentence-end ()
;; Get the regular expression `sentence-end'.
(if (cc-bytecomp-fboundp 'sentence-end)
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index f23dfff9c2d..4fc270792fc 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -1,4 +1,4 @@
-;;; cc-engine.el --- core syntax guessing engine for CC mode
+;;; cc-engine.el --- core syntax guessing engine for CC mode -*- coding: utf-8 -*-
;; Copyright (C) 1985, 1987, 1992-2013 Free Software Foundation, Inc.
@@ -2180,32 +2180,45 @@ comment at the start of cc-engine.el for more info."
;; reduced by buffer changes, and increased by invocations of
;; `c-state-literal-at'. FIXME!!!
-(defsubst c-state-pp-to-literal (from to)
+(defsubst c-state-pp-to-literal (from to &optional not-in-delimiter)
;; Do a parse-partial-sexp from FROM to TO, returning either
;; (STATE TYPE (BEG . END)) if TO is in a literal; or
;; (STATE) otherwise,
;; where STATE is the parsing state at TO, TYPE is the type of the literal
;; (one of 'c, 'c++, 'string) and (BEG . END) is the boundaries of the literal.
;;
+ ;; Unless NOT-IN-DELIMITER is non-nil, when TO is inside a two-character
+ ;; comment opener, this is recognized as being in a comment literal.
+ ;;
;; Only elements 3 (in a string), 4 (in a comment), 5 (following a quote),
;; 7 (comment type) and 8 (start of comment/string) (and possibly 9) of
;; STATE are valid.
(save-excursion
(let ((s (parse-partial-sexp from to))
- ty)
- (when (or (nth 3 s) (nth 4 s)) ; in a string or comment
+ ty co-st)
+ (cond
+ ((or (nth 3 s) (nth 4 s)) ; in a string or comment
(setq ty (cond
((nth 3 s) 'string)
- ((eq (nth 7 s) t) 'c++)
+ ((nth 7 s) 'c++)
(t 'c)))
(parse-partial-sexp (point) (point-max)
- nil ; TARGETDEPTH
- nil ; STOPBEFORE
- s ; OLDSTATE
- 'syntax-table)) ; stop at end of literal
- (if ty
- `(,s ,ty (,(nth 8 s) . ,(point)))
- `(,s)))))
+ nil ; TARGETDEPTH
+ nil ; STOPBEFORE
+ s ; OLDSTATE
+ 'syntax-table) ; stop at end of literal
+ `(,s ,ty (,(nth 8 s) . ,(point))))
+
+ ((and (not not-in-delimiter) ; inside a comment starter
+ (not (bobp))
+ (progn (backward-char)
+ (looking-at c-comment-start-regexp)))
+ (setq ty (if (looking-at c-block-comment-start-regexp) 'c 'c++)
+ co-st (point))
+ (forward-comment 1)
+ `(,s ,ty (,co-st . ,(point))))
+
+ (t `(,s))))))
(defun c-state-safe-place (here)
;; Return a buffer position before HERE which is "safe", i.e. outside any
@@ -2280,25 +2293,25 @@ comment at the start of cc-engine.el for more info."
(while (and c (> (car c) c-state-semi-nonlit-pos-cache-limit))
(setq c (cdr c)))
(setq c-state-semi-nonlit-pos-cache c)
-
+
(while (and c (> (car c) here))
(setq high-pos (car c))
(setq c (cdr c)))
(setq pos (or (car c) (point-min)))
-
+
(unless high-pos
(while
;; Add an element to `c-state-semi-nonlit-pos-cache' each iteration.
(and
(<= (setq npos (+ pos c-state-nonlit-pos-interval)) here)
-
+
;; Test for being in a literal. If so, go to after it.
(progn
(setq lit (car (cddr (c-state-pp-to-literal pos npos))))
(or (null lit)
(prog1 (<= (cdr lit) here)
(setq npos (cdr lit))))))
-
+
(setq pos npos)
(setq c-state-semi-nonlit-pos-cache
(cons pos c-state-semi-nonlit-pos-cache))))
@@ -2606,11 +2619,11 @@ comment at the start of cc-engine.el for more info."
;; OLD: { (.) {...........}
;; ^ ^
;; FROM HERE
- ;;
+ ;;
;; NEW: { {....} (.) {.........
;; ^ ^ ^
;; LOWER BRACE PAIR HERE or HERE
- ;;
+ ;;
;; This routine should be fast. Since it can get called a LOT, we maintain
;; `c-state-brace-pair-desert', a small cache of "failures", such that we
;; reduce the time wasted in repeated fruitless searches in brace deserts.
@@ -2907,7 +2920,7 @@ comment at the start of cc-engine.el for more info."
start-point))
(goto-char pos)
(while (and c-state-cache
- (or (numberp (car c-state-cache)) ; Have we a { at all?
+ (or (numberp (car c-state-cache)) ; Have we a { at all?
(cdr c-state-cache))
(< (point) here))
(cond
@@ -3143,10 +3156,13 @@ comment at the start of cc-engine.el for more info."
;; This function is called from c-after-change.
;; The caches of non-literals:
- (if (< here c-state-nonlit-pos-cache-limit)
- (setq c-state-nonlit-pos-cache-limit here))
- (if (< here c-state-semi-nonlit-pos-cache-limit)
- (setq c-state-semi-nonlit-pos-cache-limit here))
+ ;; Note that we use "<=" for the possibility of the second char of a two-char
+ ;; comment opener being typed; this would invalidate any cache position at
+ ;; HERE.
+ (if (<= here c-state-nonlit-pos-cache-limit)
+ (setq c-state-nonlit-pos-cache-limit (1- here)))
+ (if (<= here c-state-semi-nonlit-pos-cache-limit)
+ (setq c-state-semi-nonlit-pos-cache-limit (1- here)))
;; `c-state-cache':
;; Case 1: if `here' is in a literal containing point-min, everything
@@ -4444,19 +4460,12 @@ comment at the start of cc-engine.el for more info."
(lim (or lim (c-state-semi-safe-place pos)))
(pp-to-lit (save-restriction
(widen)
- (c-state-pp-to-literal lim pos)))
+ (c-state-pp-to-literal lim pos not-in-delimiter)))
(state (car pp-to-lit))
(lit-limits (car (cddr pp-to-lit))))
(cond
(lit-limits)
- ((and (not not-in-delimiter)
- (not (elt state 5))
- (eq (char-before) ?/)
- (looking-at "[/*]")) ; FIXME!!! use c-line/block-comment-starter. 2008-09-28.
- ;; We're standing in a comment starter.
- (backward-char 1)
- (cons (point) (progn (c-forward-single-comment) (point))))
(near
(goto-char pos)
@@ -4610,7 +4619,7 @@ comment at the start of cc-engine.el for more info."
s ; state
'syntax-table))) ; stop-comment
(setq pos (point)))
-
+
;; Now try and find enough non-literal characters recorded on the stack.
;; Go back one recorded literal each time round this loop.
(while (and (< count how-far-back)
@@ -8516,8 +8525,8 @@ comment at the start of cc-engine.el for more info."
))
(defun c-looking-at-special-brace-list (&optional lim)
- ;; If we're looking at the start of a pike-style list, ie `({ })',
- ;; `([ ])', `(< >)' etc, a cons of a cons of its starting and ending
+ ;; If we're looking at the start of a pike-style list, i.e., `({ })',
+ ;; `([ ])', `(< >)', etc., a cons of a cons of its starting and ending
;; positions and its entry in c-special-brace-lists is returned, nil
;; otherwise. The ending position is nil if the list is still open.
;; LIM is the limit for forward search. The point may either be at
@@ -8762,7 +8771,7 @@ comment at the start of cc-engine.el for more info."
(c-simple-skip-symbol-backward)
(looking-at c-macro-with-semi-re)
(goto-char pos)
- (not (c-in-literal)))))) ; The most expensive check last.
+ (not (c-in-literal)))))) ; The most expensive check last.
(defun c-macro-vsemi-status-unknown-p () t) ; See cc-defs.el.
@@ -9799,6 +9808,18 @@ comment at the start of cc-engine.el for more info."
;; contains any class offset
)))
+ ;; CASE 5P: AWK pattern or function or continuation
+ ;; thereof.
+ ((c-major-mode-is 'awk-mode)
+ (setq placeholder (point))
+ (c-add-stmt-syntax
+ (if (and (eq (c-beginning-of-statement-1) 'same)
+ (/= (point) placeholder))
+ 'topmost-intro-cont
+ 'topmost-intro)
+ nil nil
+ containing-sexp paren-state))
+
;; CASE 5D: this could be a top-level initialization, a
;; member init list continuation, or a template argument
;; list continuation.
@@ -9958,18 +9979,6 @@ comment at the start of cc-engine.el for more info."
(goto-char (point-min)))
(c-add-syntax 'objc-method-intro (c-point 'boi)))
- ;; CASE 5P: AWK pattern or function or continuation
- ;; thereof.
- ((c-major-mode-is 'awk-mode)
- (setq placeholder (point))
- (c-add-stmt-syntax
- (if (and (eq (c-beginning-of-statement-1) 'same)
- (/= (point) placeholder))
- 'topmost-intro-cont
- 'topmost-intro)
- nil nil
- containing-sexp paren-state))
-
;; CASE 5N: At a variable declaration that follows a class
;; definition or some other block declaration that doesn't
;; end at the closing '}'. C.f. case 5D.5.
diff --git a/lisp/progmodes/cc-fonts.el b/lisp/progmodes/cc-fonts.el
index 376edcdc76b..83343b23014 100644
--- a/lisp/progmodes/cc-fonts.el
+++ b/lisp/progmodes/cc-fonts.el
@@ -2049,7 +2049,7 @@ styles specified by `c-doc-comment-style'.")
(defconst c-font-lock-keywords-3 (c-lang-const c-matchers-3 c)
"Accurate normal font locking for C mode.
-Like `c-font-lock-keywords-2' but detects declarations in a more
+Like the variable `c-font-lock-keywords-2' but detects declarations in a more
accurate way that works in most cases for arbitrary types without the
need for `c-font-lock-extra-types'.")
@@ -2207,7 +2207,7 @@ styles specified by `c-doc-comment-style'.")
(defconst c++-font-lock-keywords-3 (c-lang-const c-matchers-3 c++)
"Accurate normal font locking for C++ mode.
-Like `c++-font-lock-keywords-2' but detects declarations in a more
+Like the variable `c++-font-lock-keywords-2' but detects declarations in a more
accurate way that works in most cases for arbitrary types without the
need for `c++-font-lock-extra-types'.")
@@ -2313,7 +2313,7 @@ comment styles specified by `c-doc-comment-style'.")
(defconst objc-font-lock-keywords-3 (c-lang-const c-matchers-3 objc)
"Accurate normal font locking for Objective-C mode.
-Like `objc-font-lock-keywords-2' but detects declarations in a more
+Like the variable `objc-font-lock-keywords-2' but detects declarations in a more
accurate way that works in most cases for arbitrary types without the
need for `objc-font-lock-extra-types'.")
@@ -2356,7 +2356,7 @@ comment styles specified by `c-doc-comment-style'.")
(defconst java-font-lock-keywords-3 (c-lang-const c-matchers-3 java)
"Accurate normal font locking for Java mode.
-Like `java-font-lock-keywords-2' but detects declarations in a more
+Like variable `java-font-lock-keywords-2' but detects declarations in a more
accurate way that works in most cases for arbitrary types without the
need for `java-font-lock-extra-types'.")
@@ -2389,7 +2389,7 @@ styles specified by `c-doc-comment-style'.")
(defconst idl-font-lock-keywords-3 (c-lang-const c-matchers-3 idl)
"Accurate normal font locking for CORBA IDL mode.
-Like `idl-font-lock-keywords-2' but detects declarations in a more
+Like the variable `idl-font-lock-keywords-2' but detects declarations in a more
accurate way that works in most cases for arbitrary types without the
need for `idl-font-lock-extra-types'.")
@@ -2422,7 +2422,7 @@ comment styles specified by `c-doc-comment-style'.")
(defconst pike-font-lock-keywords-3 (c-lang-const c-matchers-3 pike)
"Accurate normal font locking for Pike mode.
-Like `pike-font-lock-keywords-2' but detects declarations in a more
+Like the variable `pike-font-lock-keywords-2' but detects declarations in a more
accurate way that works in most cases for arbitrary types without the
need for `pike-font-lock-extra-types'.")
@@ -2486,7 +2486,7 @@ need for `pike-font-lock-extra-types'.")
(setq comment-beg nil))
(setq region-beg comment-beg))
- (if (eq (elt (parse-partial-sexp comment-beg (+ comment-beg 2)) 7) t)
+ (if (elt (parse-partial-sexp comment-beg (+ comment-beg 2)) 7)
;; Collect a sequence of doc style line comments.
(progn
(goto-char comment-beg)
diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el
index 0d5549e4441..af52ad53aad 100644
--- a/lisp/progmodes/cc-langs.el
+++ b/lisp/progmodes/cc-langs.el
@@ -1,4 +1,4 @@
-;;; cc-langs.el --- language specific settings for CC Mode
+;;; cc-langs.el --- language specific settings for CC Mode -*- coding: utf-8 -*-
;; Copyright (C) 1985, 1987, 1992-2013 Free Software Foundation, Inc.
@@ -812,8 +812,8 @@ Assumed to not contain any submatches or \\| operators."
(c-lang-defconst c-anchored-cpp-prefix
"Regexp matching the prefix of a cpp directive anchored to BOL,
in the languages that have a macro preprocessor."
- t (if (c-lang-const c-opt-cpp-prefix)
- (concat "^" (c-lang-const c-opt-cpp-prefix))))
+ t "^\\s *\\(#\\)\\s *"
+ (java awk) nil)
(c-lang-defvar c-anchored-cpp-prefix (c-lang-const c-anchored-cpp-prefix))
(c-lang-defconst c-opt-cpp-start
@@ -2907,7 +2907,7 @@ is in effect or not."
(c-lang-defconst c-special-brace-lists
"List of open- and close-chars that makes up a pike-style brace list,
-i.e. for a ([ ]) list there should be a cons (?\\[ . ?\\]) in this
+i.e. for a ([ ]) list there should be a cons (?\\[ . ?\\]) in this
list."
t nil
pike '((?{ . ?}) (?\[ . ?\]) (?< . ?>)))
diff --git a/lisp/progmodes/cc-menus.el b/lisp/progmodes/cc-menus.el
index a06eaf566d8..067a4df13dd 100644
--- a/lisp/progmodes/cc-menus.el
+++ b/lisp/progmodes/cc-menus.el
@@ -161,49 +161,132 @@ A sample value might look like: `\\(_P\\|_PROTO\\)'.")
cc-imenu-c++-generic-expression
"Imenu generic expression for C mode. See `imenu-generic-expression'.")
-(defvar cc-imenu-java-generic-expression
+
+;; Auxiliary regexps for Java try to match their trailing whitespace where
+;; appropriate, but _not_ starting whitespace.
+
+(defconst cc-imenu-java-ellipsis-regexp
+ (concat
+ "\\.\\{3\\}"
+ "[ \t\n\r]*"))
+
+(defun cc-imenu-java-build-type-args-regex (depth)
+ "Builds regexp for type arguments list with DEPTH allowed
+nested angle brackets constructs."
+ (if (> depth 0)
+ (concat "<"
+ "[][.," c-alnum "_? \t\n\r]+"
+ (if (> depth 1)
+ "\\(")
+ (cc-imenu-java-build-type-args-regex (1- depth))
+ (if (> depth 1)
+ (concat "[][.," c-alnum "_? \t\n\r]*"
+ "\\)*"))
+ ">")))
+
+(defconst cc-imenu-java-type-spec-regexp
+ (concat
+ ;; zero or more identifiers followed by a dot
+ "\\("
+ "[" c-alpha "_][" c-alnum "_]*\\."
+ "\\)*"
+ ;; a single mandatory identifier without a dot
+ "[" c-alpha "_][" c-alnum "_]*"
+ ;; then choice:
+ "\\("
+ ;; (option 1) type arguments list which _may_ be followed with brackets
+ ;; and/or spaces, then optional variable arity
+ "[ \t\n\r]*"
+ (cc-imenu-java-build-type-args-regex 3)
+ "[][ \t\n\r]*"
+ "\\(" cc-imenu-java-ellipsis-regexp "\\)?"
+ "\\|"
+ ;; (option 2) just brackets and/or spaces (there should be at least one),
+ ;; then optional variable arity
+ "[][ \t\n\r]+"
+ "\\(" cc-imenu-java-ellipsis-regexp "\\)?"
+ "\\|"
+ ;; (option 3) just variable arity
+ cc-imenu-java-ellipsis-regexp
+ "\\)"))
+
+(defconst cc-imenu-java-comment-regexp
+ (concat
+ "/"
+ "\\("
+ ;; a traditional comment
+ "\\*"
+ "\\("
+ "[^*]"
+ "\\|"
+ "\\*+[^/*]"
+ "\\)*"
+ "\\*+/"
+ "\\|"
+ ;; an end-of-line comment
+ "/[^\n\r]*[\n\r]"
+ "\\)"
+ "[ \t\n\r]*"
+ ))
+
+;; Comments are allowed before the argument, after any of the
+;; modifiers and after the identifier.
+(defconst cc-imenu-java-method-arg-regexp
+ (concat
+ "\\(" cc-imenu-java-comment-regexp "\\)*"
+ ;; optional modifiers
+ "\\("
+ ;; a modifier is either an annotation or "final"
+ "\\("
+ "@[" c-alpha "_]"
+ "[" c-alnum "._]*"
+ ;; TODO support element-value pairs!
+ "\\|"
+ "final"
+ "\\)"
+ ;; a modifier ends with comments and/or ws
+ "\\("
+ "\\(" cc-imenu-java-comment-regexp "\\)+"
+ "\\|"
+ "[ \t\n\r]+"
+ "\\(" cc-imenu-java-comment-regexp "\\)*"
+ "\\)"
+ "\\)*"
+ ;; type spec
+ cc-imenu-java-type-spec-regexp
+ ;; identifier
+ "[" c-alpha "_]"
+ "[" c-alnum "_]*"
+ ;; optional comments and/or ws
+ "[ \t\n\r]*"
+ "\\(" cc-imenu-java-comment-regexp "\\)*"
+ ))
+
+(defconst cc-imenu-java-generic-expression
`((nil
,(concat
- "[" c-alpha "_][\]\[." c-alnum "_<> ]+[ \t\n\r]+" ; type spec
- "\\([" c-alpha "_][" c-alnum "_]*\\)" ; method name
+ cc-imenu-java-type-spec-regexp
+ "\\(" ; method name which gets captured
+ ; into index
+ "[" c-alpha "_]"
+ "[" c-alnum "_]*"
+ "\\)"
"[ \t\n\r]*"
- ;; An argument list htat is either empty or contains any number
- ;; of arguments. An argument is any number of annotations
- ;; followed by a type spec followed by a word. A word is an
- ;; identifier. A type spec is an identifier, possibly followed
- ;; by < typespec > possibly followed by [].
- (concat "("
- "\\("
- "[ \t\n\r]*"
- "\\("
- "@"
- "[" c-alpha "_]"
- "[" c-alnum "._]""*"
- "[ \t\n\r]+"
- "\\)*"
- "\\("
- "[" c-alpha "_]"
- "[\]\[" c-alnum "_.]*"
- "\\("
-
- "<"
- "[ \t\n\r]*"
- "[\]\[.," c-alnum "_<> \t\n\r]*"
- ">"
- "\\)?"
- "\\(\\[\\]\\)?"
- "[ \t\n\r]+"
- "\\)"
- "[" c-alpha "_]"
- "[" c-alnum "_]*"
- "[ \t\n\r,]*"
- "\\)*"
- ")"
- "[.," c-alnum " \t\n\r]*"
- "{"
- )) 1))
+ ;; An argument list that contains zero or more arguments.
+ (concat
+ "("
+ "[ \t\n\r]*"
+ "\\("
+ "\\(" cc-imenu-java-method-arg-regexp ",[ \t\n\r]*\\)*"
+ cc-imenu-java-method-arg-regexp
+ "\\)?"
+ ")"
+ "[.,_" c-alnum " \t\n\r]*" ; throws etc.
+ "{"
+ )) 7))
"Imenu generic expression for Java mode. See `imenu-generic-expression'.")
+
;; Internal variables
(defvar cc-imenu-objc-generic-expression-noreturn-index nil)
(defvar cc-imenu-objc-generic-expression-general-func-index nil)
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index c9fe648171d..17e80b8b25b 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -647,7 +647,9 @@ compatible with old code; callers should always specify it."
(set (make-local-variable 'outline-regexp) "[^#\n\^M]")
(set (make-local-variable 'outline-level) 'c-outline-level)
-
+ (set (make-local-variable 'add-log-current-defun-function)
+ (lambda ()
+ (or (c-cpp-define-name) (c-defun-name))))
(let ((rfn (assq mode c-require-final-newline)))
(when rfn
(and (cdr rfn)
@@ -934,7 +936,8 @@ Note that the style variables are always made local to the buffer."
;; Add needed properties to each CPP construct in the region.
(goto-char c-new-BEG)
- (let ((pps-position c-new-BEG) pps-state mbeg)
+ (skip-chars-backward " \t")
+ (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.
@@ -943,14 +946,12 @@ Note that the style variables are always made local to the buffer."
pps-position (point))
(unless (or (nth 3 pps-state) ; in a string?
(nth 4 pps-state)) ; in a comment?
- (goto-char (match-beginning 0))
+ (goto-char (match-beginning 1))
(setq mbeg (point))
(if (> (c-syntactic-end-of-macro) mbeg)
(progn
(c-neutralize-CPP-line mbeg (point))
- (c-set-cpp-delimiters mbeg (point))
- ;(setq pps-position (point))
- )
+ (c-set-cpp-delimiters mbeg (point)))
(forward-line)) ; no infinite loop with, e.g., "#//"
)))))
diff --git a/lisp/progmodes/cfengine.el b/lisp/progmodes/cfengine.el
index 6fb9caa1a42..11eb0eeaf49 100644
--- a/lisp/progmodes/cfengine.el
+++ b/lisp/progmodes/cfengine.el
@@ -5,7 +5,7 @@
;; Author: Dave Love <fx@gnu.org>
;; Maintainer: Ted Zlatanov <tzz@lifelogs.com>
;; Keywords: languages
-;; Version: 1.1
+;; Version: 1.2
;; This file is part of GNU Emacs.
@@ -30,11 +30,13 @@
;; The CFEngine 3.x support doesn't have Imenu support but patches are
;; welcome.
+;; By default, CFEngine 3.x syntax is used.
+
;; You can set it up so either `cfengine2-mode' (2.x and earlier) or
;; `cfengine3-mode' (3.x) will be picked, depending on the buffer
;; contents:
-;; (add-to-list 'auto-mode-alist '("\\.cf\\'" . cfengine-mode))
+;; (add-to-list 'auto-mode-alist '("\\.cf\\'" . cfengine-auto-mode))
;; OR you can choose to always use a specific version, if you prefer
;; it:
@@ -58,6 +60,70 @@
:group 'cfengine
:type 'integer)
+(defcustom cfengine-parameters-indent '(promise pname 0)
+ "*Indentation of CFEngine3 promise parameters (hanging indent).
+
+For example, say you have this code:
+
+bundle x y
+{
+ section:
+ class::
+ promise ...
+ promiseparameter => ...
+}
+
+You can choose to indent promiseparameter from the beginning of
+the line (absolutely) or from the word \"promise\" (relatively).
+
+You can also choose to indent the start of the word
+\"promiseparameter\" or the arrow that follows it.
+
+Finally, you can choose the amount of the indent.
+
+The default is to anchor at promise, indent parameter name, and offset 0:
+
+bundle agent rcfiles
+{
+ files:
+ any::
+ \"/tmp/netrc\"
+ comment => \"my netrc\",
+ perms => mog(\"600\", \"tzz\", \"tzz\");
+}
+
+Here we anchor at beginning of line, indent arrow, and offset 10:
+
+bundle agent rcfiles
+{
+ files:
+ any::
+ \"/tmp/netrc\"
+ comment => \"my netrc\",
+ perms => mog(\"600\", \"tzz\", \"tzz\");
+}
+
+Some, including cfengine_stdlib.cf, like to anchor at promise, indent
+arrow, and offset 16 or so:
+
+bundle agent rcfiles
+{
+ files:
+ any::
+ \"/tmp/netrc\"
+ comment => \"my netrc\",
+ perms => mog(\"600\", \"tzz\", \"tzz\");
+}
+"
+
+ :group 'cfengine
+ :type '(list
+ (choice (const :tag "Anchor at beginning of promise" promise)
+ (const :tag "Anchor at beginning of line" bol))
+ (choice (const :tag "Indent parameter name" pname)
+ (const :tag "Indent arrow" arrow))
+ (integer :tag "Indentation amount from anchor")))
+
(defvar cfengine-mode-debug nil
"Whether `cfengine-mode' should print debugging info.")
@@ -94,7 +160,7 @@ This includes those for cfservd as well as cfagent.")
(regexp-opt cfengine3-defuns t)
"Regex to match the CFEngine 3.x defuns.")
- (defconst cfengine3-class-selector-regex "\\([[:alnum:]_().&|!]+\\)::")
+ (defconst cfengine3-class-selector-regex "\\([[:alnum:]_().&|!:]+\\)::")
(defconst cfengine3-category-regex "\\([[:alnum:]_]+\\):")
@@ -117,7 +183,7 @@ This includes those for cfservd as well as cfagent.")
("$(\\([[:alnum:]_]+\\))" 1 font-lock-variable-name-face)
("${\\([[:alnum:]_]+\\)}" 1 font-lock-variable-name-face)
;; Variable definitions.
- ("\\<\\([[:alnum:]_]+\\)[ \t]*=[ \t]*(" 1 font-lock-variable-name-face)
+ ("\\_<\\([[:alnum:]_]+\\)[ \t]*=[ \t]*(" 1 font-lock-variable-name-face)
;; File, acl &c in group: { token ... }
("{[ \t]*\\([^ \t\n]+\\)" 1 font-lock-constant-face)))
@@ -125,9 +191,9 @@ This includes those for cfservd as well as cfagent.")
`(
;; Defuns. This happens early so they don't get caught by looser
;; patterns.
- (,(concat "\\<" cfengine3-defuns-regex "\\>"
- "[ \t]+\\<\\([[:alnum:]_]+\\)\\>"
- "[ \t]+\\<\\([[:alnum:]_]+\\)"
+ (,(concat "\\_<" cfengine3-defuns-regex "\\_>"
+ "[ \t]+\\_<\\([[:alnum:]_.:]+\\)\\_>"
+ "[ \t]+\\_<\\([[:alnum:]_.:]+\\)"
;; Optional parentheses with variable names inside.
"\\(?:(\\([^)]*\\))\\)?")
(1 font-lock-builtin-face)
@@ -144,14 +210,14 @@ This includes those for cfservd as well as cfagent.")
1 font-lock-builtin-face)
;; Variables, including scope, e.g. module.var
- ("[@$](\\([[:alnum:]_.]+\\))" 1 font-lock-variable-name-face)
- ("[@$]{\\([[:alnum:]_.]+\\)}" 1 font-lock-variable-name-face)
+ ("[@$](\\([[:alnum:]_.:]+\\))" 1 font-lock-variable-name-face)
+ ("[@$]{\\([[:alnum:]_.:]+\\)}" 1 font-lock-variable-name-face)
;; Variable definitions.
- ("\\<\\([[:alnum:]_]+\\)[ \t]*=[ \t]*(" 1 font-lock-variable-name-face)
+ ("\\_<\\([[:alnum:]_]+\\)[ \t]*=[ \t]*(" 1 font-lock-variable-name-face)
;; Variable types.
- (,(concat "\\<" (eval-when-compile (regexp-opt cfengine3-vartypes t)) "\\>")
+ (,(concat "\\_<" (eval-when-compile (regexp-opt cfengine3-vartypes t)) "\\_>")
1 font-lock-type-face)))
(defvar cfengine2-imenu-expression
@@ -159,9 +225,9 @@ This includes those for cfservd as well as cfagent.")
(regexp-opt cfengine2-actions t))
":[^:]")
1)
- ("Variables/classes" "\\<\\([[:alnum:]_]+\\)[ \t]*=[ \t]*(" 1)
- ("Variables/classes" "\\<define=\\([[:alnum:]_]+\\)" 1)
- ("Variables/classes" "\\<DefineClass\\>[ \t]+\\([[:alnum:]_]+\\)" 1))
+ ("Variables/classes" "\\_<\\([[:alnum:]_]+\\)[ \t]*=[ \t]*(" 1)
+ ("Variables/classes" "\\_<define=\\([[:alnum:]_]+\\)" 1)
+ ("Variables/classes" "\\_<DefineClass\\>[ \t]+\\([[:alnum:]_]+\\)" 1))
"`imenu-generic-expression' for CFEngine mode.")
(defun cfengine2-outline-level ()
@@ -274,7 +340,7 @@ Intended as the value of `indent-line-function'."
Treats body/bundle blocks as defuns."
(unless (<= (current-column) (current-indentation))
(end-of-line))
- (if (re-search-backward (concat "^[ \t]*" cfengine3-defuns-regex "\\>") nil t)
+ (if (re-search-backward (concat "^[ \t]*" cfengine3-defuns-regex "\\_>") nil t)
(beginning-of-line)
(goto-char (point-min)))
t)
@@ -283,7 +349,7 @@ Treats body/bundle blocks as defuns."
"`end-of-defun' function for Cfengine 3 mode.
Treats body/bundle blocks as defuns."
(end-of-line)
- (if (re-search-forward (concat "^[ \t]*" cfengine3-defuns-regex "\\>") nil t)
+ (if (re-search-forward (concat "^[ \t]*" cfengine3-defuns-regex "\\_>") nil t)
(beginning-of-line)
(goto-char (point-max)))
t)
@@ -302,13 +368,13 @@ Intended as the value of `indent-line-function'."
(cond
;; Body/bundle blocks start at 0.
- ((looking-at (concat cfengine3-defuns-regex "\\>"))
+ ((looking-at (concat cfengine3-defuns-regex "\\_>"))
(indent-line-to 0))
;; Categories are indented one step.
- ((looking-at (concat cfengine3-category-regex "[ \t]*$"))
+ ((looking-at (concat cfengine3-category-regex "[ \t]*\\(#.*\\)*$"))
(indent-line-to cfengine-indent))
;; Class selectors are indented two steps.
- ((looking-at (concat cfengine3-class-selector-regex "[ \t]*$"))
+ ((looking-at (concat cfengine3-class-selector-regex "[ \t]*\\(#.*\\)*$"))
(indent-line-to (* 2 cfengine-indent)))
;; Outdent leading close brackets one step.
((or (eq ?\} (char-after))
@@ -317,6 +383,8 @@ Intended as the value of `indent-line-function'."
(indent-line-to (save-excursion
(forward-char)
(backward-sexp)
+ (move-beginning-of-line nil)
+ (skip-chars-forward " \t")
(current-column)))
(error nil)))
;; Inside a string and it starts before this line.
@@ -331,7 +399,23 @@ Intended as the value of `indent-line-function'."
;; plus 2. That way, promises indent deeper than class
;; selectors, which in turn are one deeper than categories.
((= 1 (nth 0 parse))
- (indent-line-to (* (+ 2 (nth 0 parse)) cfengine-indent)))
+ (let ((p-anchor (nth 0 cfengine-parameters-indent))
+ (p-what (nth 1 cfengine-parameters-indent))
+ (p-indent (nth 2 cfengine-parameters-indent)))
+ ;; Do we have the parameter anchor and location and indent
+ ;; defined, and are we looking at a promise parameter?
+ (if (and p-anchor p-what p-indent
+ (looking-at "\\([[:alnum:]_]+[ \t]*\\)=>"))
+ (let* ((arrow-offset (* -1 (length (match-string 1))))
+ (extra-offset (if (eq p-what 'arrow) arrow-offset 0))
+ (base-offset (if (eq p-anchor 'promise)
+ (* (+ 2 (nth 0 parse)) cfengine-indent)
+ 0)))
+ (indent-line-to (max 0 (+ p-indent base-offset extra-offset))))
+ ;; Else, indent to cfengine-indent times the nested depth
+ ;; plus 2. That way, promises indent deeper than class
+ ;; selectors, which in turn are one deeper than categories.
+ (indent-line-to (* (+ 2 (nth 0 parse)) cfengine-indent)))))
;; Inside brackets/parens: indent to start column of non-comment
;; token on line following open bracket or by one step from open
;; bracket's column.
@@ -436,7 +520,8 @@ Intended as the value of `indent-line-function'."
;; The syntax defaults seem OK to give reasonable word movement.
(modify-syntax-entry ?# "<" table)
(modify-syntax-entry ?\n ">#" table)
- (modify-syntax-entry ?\" "\"" table)
+ (modify-syntax-entry ?\" "\"" table) ; "string"
+ (modify-syntax-entry ?\' "\"" table) ; 'string'
;; Variable substitution.
(modify-syntax-entry ?$ "." table)
;; Doze path separators.
@@ -475,7 +560,6 @@ to the action header."
;; Shell commands can be quoted by single, double or back quotes.
;; It's debatable whether we should define string syntax, but it
;; should avoid potential confusion in some cases.
- (modify-syntax-entry ?\' "\"" cfengine2-mode-syntax-table)
(modify-syntax-entry ?\` "\"" cfengine2-mode-syntax-table)
(set (make-local-variable 'indent-line-function) #'cfengine2-indent-line)
@@ -501,11 +585,11 @@ on the buffer contents"
(save-restriction
(goto-char (point-min))
(while (not (or (eobp) v3))
- (setq v3 (looking-at (concat cfengine3-defuns-regex "\\>")))
+ (setq v3 (looking-at (concat cfengine3-defuns-regex "\\_>")))
(forward-line)))
(if v3 (cfengine3-mode) (cfengine2-mode))))
-(defalias 'cfengine-mode 'cfengine-auto-mode)
+(defalias 'cfengine-mode 'cfengine3-mode)
(provide 'cfengine3)
(provide 'cfengine)
diff --git a/lisp/progmodes/compile.el b/lisp/progmodes/compile.el
index 68a83b47174..d6f136ec92d 100644
--- a/lisp/progmodes/compile.el
+++ b/lisp/progmodes/compile.el
@@ -42,24 +42,21 @@
;;;###autoload
(defcustom compilation-mode-hook nil
- "List of hook functions run by `compilation-mode' (see `run-mode-hooks')."
+ "List of hook functions run by `compilation-mode'."
:type 'hook
:group 'compilation)
;;;###autoload
(defcustom compilation-start-hook nil
- "List of hook functions run by `compilation-start' on the compilation process.
-\(See `run-hook-with-args').
-If you use \"omake -P\" and do not want \\[save-buffers-kill-terminal] to ask whether you want
-the compilation to be killed, you can use this hook:
- (add-hook 'compilation-start-hook
- (lambda (process) (set-process-query-on-exit-flag process nil)) nil t)"
+ "Hook run after starting a new compilation process.
+The hook is run with one argument, the new process."
:type 'hook
:group 'compilation)
;;;###autoload
(defcustom compilation-window-height nil
- "Number of lines in a compilation window. If nil, use Emacs default."
+ "Number of lines in a compilation window.
+If nil, use Emacs default."
:type '(choice (const :tag "Default" nil)
integer)
:group 'compilation)
@@ -134,6 +131,7 @@ and a string describing how the process finished.")
;; If you make any changes to `compilation-error-regexp-alist-alist',
;; be sure to run the ERT test in test/automated/compile-tests.el.
+;; emacs -batch -l compile-tests.el -f ert-run-tests-batch-and-exit
(defvar compilation-error-regexp-alist-alist
'((absoft
@@ -261,11 +259,12 @@ of[ \t]+\"?\\([a-zA-Z]?:?[^\":\n]+\\)\"?:" 3 2 nil (1))
;; The "in \\|from " exception was added to handle messages from Ruby.
"^\\(?:[[:alpha:]][-[:alnum:].]+: ?\\|[ \t]+\\(?:in \\|from \\)\\)?\
\\([0-9]*[^0-9\n]\\(?:[^\n :]\\| [^-/\n]\\|:[^ \n]\\)*?\\): ?\
-\\([0-9]+\\)\\(?:[.:]\\([0-9]+\\)\\)?\
-\\(?:-\\([0-9]+\\)?\\(?:\\.\\([0-9]+\\)\\)?\\)?:\
+\\([0-9]+\\)\\(?:-\\(?4:[0-9]+\\)\\(?:\\.\\(?5:[0-9]+\\)\\)?\
+\\|[.:]\\(?3:[0-9]+\\)\\(?:-\\(?:\\(?4:[0-9]+\\)\\.\\)?\\(?5:[0-9]+\\)\\)?\\)?:\
\\(?: *\\(\\(?:Future\\|Runtime\\)?[Ww]arning\\|W:\\)\\|\
- *\\([Ii]nfo\\(?:\\>\\|rmationa?l?\\)\\|I:\\|instantiated from\\|[Nn]ote\\)\\|\
- *[Ee]rror\\|\[0-9]?\\(?:[^0-9\n]\\|$\\)\\|[0-9][0-9][0-9]\\)"
+ *\\([Ii]nfo\\(?:\\>\\|rmationa?l?\\)\\|I:\\|\\[ skipping .+ \\]\\|\
+\\(?:instantiated\\|required\\) from\\|[Nn]ote\\)\\|\
+ *[Ee]rror\\|[0-9]?\\(?:[^0-9\n]\\|$\\)\\|[0-9][0-9][0-9]\\)"
1 (2 . 4) (3 . 5) (6 . 7))
(lcc
@@ -1427,8 +1426,9 @@ and move to the source code that caused it.
If optional second arg COMINT is t the buffer will be in Comint mode with
`compilation-shell-minor-mode'.
-Interactively, prompts for the command if `compilation-read-command' is
-non-nil; otherwise uses `compile-command'. With prefix arg, always prompts.
+Interactively, prompts for the command if the variable
+`compilation-read-command' is non-nil; otherwise uses`compile-command'.
+With prefix arg, always prompts.
Additionally, with universal prefix arg, compilation buffer will be in
comint mode, i.e. interactive.
@@ -1611,7 +1611,11 @@ Returns the compilation buffer created."
(format "%s started at %s\n\n"
mode-name
(substring (current-time-string) 0 19))
- command "\n")
+ ;; The command could be split into several lines, see
+ ;; `rgrep' for example. We want to display it as one
+ ;; line.
+ (apply 'concat (split-string command (regexp-quote "\\\n") t))
+ "\n")
(setq thisdir default-directory))
(set-buffer-modified-p nil))
;; Pop up the compilation buffer.
@@ -1810,6 +1814,7 @@ Returns the compilation buffer created."
(define-key map [follow-link] 'mouse-face)
(define-key map "\C-c\C-c" 'compile-goto-error)
(define-key map "\C-m" 'compile-goto-error)
+ (define-key map "\C-o" 'compilation-display-error)
(define-key map "\C-c\C-k" 'kill-compilation)
(define-key map "\M-n" 'compilation-next-error)
(define-key map "\M-p" 'compilation-previous-error)
@@ -1854,6 +1859,7 @@ Returns the compilation buffer created."
(define-key map [follow-link] 'mouse-face)
(define-key map "\C-c\C-c" 'compile-goto-error)
(define-key map "\C-m" 'compile-goto-error)
+ (define-key map "\C-o" 'compilation-display-error)
(define-key map "\C-c\C-k" 'kill-compilation)
(define-key map "\M-n" 'compilation-next-error)
(define-key map "\M-p" 'compilation-previous-error)
@@ -2295,6 +2301,12 @@ Prefix arg N says how many files to move backwards (or forwards, if negative)."
(interactive "p")
(compilation-next-file (- n)))
+(defun compilation-display-error ()
+ "Display the source for current error in another window."
+ (interactive)
+ (setq compilation-current-error (point))
+ (next-error-no-select 0))
+
(defun kill-compilation ()
"Kill the process made by the \\[compile] or \\[grep] commands."
(interactive)
@@ -2370,10 +2382,12 @@ This is the value of `next-error-function' in Compilation buffers."
;; (setq timestamp compilation-buffer-modtime)))
)
(with-current-buffer
- (compilation-find-file
- marker
- (caar (compilation--loc->file-struct loc))
- (cadr (car (compilation--loc->file-struct loc))))
+ (apply #'compilation-find-file
+ marker
+ (caar (compilation--loc->file-struct loc))
+ (cadr (car (compilation--loc->file-struct loc)))
+ (compilation--file-struct->formats
+ (compilation--loc->file-struct loc)))
(let ((screen-columns
;; Obey the compilation-error-screen-columns of the target
;; buffer if its major mode set it buffer-locally.
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index 7a10104120c..e8678fe6281 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -1742,6 +1742,13 @@ or as help on variables `cperl-tips', `cperl-problems',
(setq outline-regexp cperl-outline-regexp)
(make-local-variable 'outline-level)
(setq outline-level 'cperl-outline-level)
+ (make-local-variable 'add-log-current-defun-function)
+ (setq add-log-current-defun-function
+ (lambda ()
+ (save-excursion
+ (if (re-search-backward "^sub[ \t]+\\([^({ \t\n]+\\)" nil t)
+ (match-string-no-properties 1)))))
+
(make-local-variable 'paragraph-start)
(setq paragraph-start (concat "^$\\|" page-delimiter))
(make-local-variable 'paragraph-separate)
@@ -1832,7 +1839,7 @@ or as help on variables `cperl-tips', `cperl-problems',
(make-local-variable 'cperl-syntax-state)
(setq cperl-syntax-state nil) ; reset syntaxification cache
(if cperl-use-syntax-table-text-property
- (if (boundp 'syntax-propertize-function)
+ (if (eval-when-compile (fboundp 'syntax-propertize-rules))
(progn
;; Reset syntaxification cache.
(set (make-local-variable 'cperl-syntax-done-to) nil)
@@ -3113,8 +3120,10 @@ and closing parentheses and brackets."
((eq 'continuation (elt i 0))
;; [continuation statement-start char-after is-block is-brace]
(goto-char (elt i 1)) ; statement-start
- (+ (if (memq (elt i 2) (append "}])" nil)) ; char-after
- 0 ; Closing parenth
+ (+ (if (or (memq (elt i 2) (append "}])" nil)) ; char-after
+ (eq 'continuation ; do not stagger continuations
+ (elt (cperl-sniff-for-indent parse-data) 0)))
+ 0 ; Closing parenth or continuation of a continuation
cperl-continued-statement-offset)
(if (or (elt i 3) ; is-block
(not (elt i 4)) ; is-brace
diff --git a/lisp/progmodes/cpp.el b/lisp/progmodes/cpp.el
index 340b97e80bd..674d98b8dc3 100644
--- a/lisp/progmodes/cpp.el
+++ b/lisp/progmodes/cpp.el
@@ -420,6 +420,7 @@ A prefix arg suppresses display of that buffer."
(define-key map [ down-mouse-2 ] 'cpp-push-button)
(define-key map [ mouse-2 ] 'ignore)
(define-key map " " 'scroll-up-command)
+ (define-key map [?\S-\ ] 'scroll-down-command)
(define-key map "\C-?" 'scroll-down-command)
(define-key map [ delete ] 'scroll-down)
(define-key map "\C-c\C-c" 'cpp-edit-apply)
diff --git a/lisp/progmodes/delphi.el b/lisp/progmodes/delphi.el
deleted file mode 100644
index 85cdaa06322..00000000000
--- a/lisp/progmodes/delphi.el
+++ /dev/null
@@ -1,2033 +0,0 @@
-;;; delphi.el --- major mode for editing Delphi source (Object Pascal) in Emacs
-
-;; Copyright (C) 1998-1999, 2001-2013 Free Software Foundation, Inc.
-
-;; Authors: Ray Blaak <blaak@infomatch.com>,
-;; Simon South <ssouth@member.fsf.org>
-;; Maintainer: Simon South <ssouth@member.fsf.org>
-;; Keywords: languages
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; To enter Delphi mode when you find a Delphi source file, one must override
-;; the auto-mode-alist to associate Delphi with .pas (and .dpr and .dpk)
-;; files. Emacs, by default, will otherwise enter Pascal mode. E.g.
-;;
-;; (autoload 'delphi-mode "delphi")
-;; (setq auto-mode-alist
-;; (cons '("\\.\\(pas\\|dpr\\|dpk\\)$" . delphi-mode) auto-mode-alist))
-
-;; To get keyword, comment, and string literal coloring, be sure that font-lock
-;; is running. One can manually do M-x font-lock-mode in a Delphi buffer, or
-;; one can put in .emacs:
-;;
-;; (add-hook 'delphi-mode-hook 'turn-on-font-lock)
-
-;; If font-lock is not loaded by default, you might have to do:
-;;
-;; (autoload 'font-lock-mode "font-lock")
-;; (autoload 'turn-on-font-lock "font-lock")
-;; (setq font-lock-support-mode 'lazy-lock-mode)
-;;
-;; Lazy lock is very necessary for faster screen updates.
-
-;; For good performance, be sure to byte-compile delphi.el, e.g.
-;;
-;; M-x byte-compile-file <give the path to delphi.el when prompted>
-
-;; This will generate delphi.elc, which will be loaded instead of delphi.el
-;; when delphi-mode is autoloaded.
-
-;; When you have entered Delphi mode, you may get more info by pressing
-;; C-h m.
-
-;; This Delphi mode implementation is fairly tolerant of syntax errors, relying
-;; as much as possible on the indentation of the previous statement. This also
-;; makes it faster and simpler, since there is less searching for properly
-;; constructed beginnings.
-
-;;; Code:
-
-(provide 'delphi)
-
-(defgroup delphi nil
- "Major mode for editing Delphi source in Emacs."
- :version "21.1"
- :group 'languages)
-
-(defconst delphi-debug nil
- "True if in debug mode.")
-
-(defcustom delphi-search-path "."
- "Directories to search when finding external units.
-It is a list of directory strings. If only a single directory,
-it can be a single string instead of a list. If a directory
-ends in \"...\" then that directory is recursively searched."
- :type 'string
- :group 'delphi)
-
-(defcustom delphi-indent-level 3
- "Indentation of Delphi statements with respect to containing block.
-E.g.
-
-begin
- // This is an indent of 3.
-end;"
- :type 'integer
- :group 'delphi)
-
-(defcustom delphi-compound-block-indent 0
- "Extra indentation for blocks in compound statements. E.g.
-
-// block indent = 0 vs // block indent = 2
-if b then if b then
-begin begin
-end else begin end
-end; else
- begin
- end;"
- :type 'integer
- :group 'delphi)
-
-(defcustom delphi-case-label-indent delphi-indent-level
- "Extra indentation for case statement labels. E.g.
-
-// case indent = 0 vs // case indent = 3
-case value of case value of
-v1: process_v1; v1: process_v1;
-v2: process_v2; v2: process_v2;
-else else
- process_else; process_else;
-end; end;"
- :type 'integer
- :group 'delphi)
-
-(defcustom delphi-verbose t ; nil
- "If true then Delphi token processing progress is reported to the user."
- :type 'boolean
- :group 'delphi)
-
-(defcustom delphi-tab-always-indents t
- "Non-nil means TAB in Delphi mode should always reindent the current line,
-regardless of where in the line point is when the TAB command is used."
- :type 'boolean
- :group 'delphi)
-
-(defcustom delphi-newline-always-indents t
- "Non-nil means NEWLINE in Delphi mode should always reindent the current
-line, insert a blank line and move to the default indent column of the blank
-line. If nil, then no indentation occurs, and NEWLINE does the usual
-behavior. This is useful when one needs to do customized indentation that
-differs from the default."
- :type 'boolean
- :group 'delphi)
-
-(defcustom delphi-comment-face 'font-lock-comment-face
- "Face used to color Delphi comments."
- :type 'face
- :group 'delphi)
-
-(defcustom delphi-string-face 'font-lock-string-face
- "Face used to color Delphi strings."
- :type 'face
- :group 'delphi)
-
-(defcustom delphi-keyword-face 'font-lock-keyword-face
- "Face used to color Delphi keywords."
- :type 'face
- :group 'delphi)
-
-(defcustom delphi-other-face nil
- "Face used to color everything else."
- :type '(choice (const :tag "None" nil) face)
- :group 'delphi)
-
-(defconst delphi-directives
- '(absolute abstract assembler automated cdecl default dispid dynamic
- export external far forward index inline message name near nodefault
- overload override pascal private protected public published read readonly
- register reintroduce resident resourcestring safecall stdcall stored
- virtual write writeonly)
- "Delphi4 directives.")
-
-(defconst delphi-keywords
- (append
- '(;; Keywords.
- and array as asm at begin case class const constructor contains
- destructor dispinterface div do downto else end except exports
- file finalization finally for function goto if implementation implements
- in inherited initialization interface is label library mod nil not
- of object on or out package packed procedure program property
- raise record repeat requires result self set shl shr then threadvar
- to try type unit uses until var while with xor
-
- ;; These routines should be keywords, if Borland had the balls.
- break exit)
-
- ;; We want directives to look like keywords.
- delphi-directives)
- "Delphi4 keywords.")
-
-(defconst delphi-previous-terminators `(semicolon comma)
- "Expression/statement terminators that denote a previous expression.")
-
-(defconst delphi-comments
- '(comment-single-line comment-multi-line-1 comment-multi-line-2)
- "Tokens that represent comments.")
-
-(defconst delphi-strings
- '(string double-quoted-string)
- "Tokens that represent string literals.")
-
-(defconst delphi-whitespace `(space newline ,@delphi-comments)
- "Tokens that are considered whitespace.")
-
-(defconst delphi-routine-statements
- '(procedure function constructor destructor property)
- "Marks the start of a routine, or routine-ish looking expression.")
-
-(defconst delphi-body-expr-statements '(if while for on)
- "Statements that have either a single statement or a block as a body and also
-are followed by an expression.")
-
-(defconst delphi-expr-statements `(case ,@delphi-body-expr-statements)
- "Expression statements contain expressions after their keyword.")
-
-(defconst delphi-body-statements `(else ,@delphi-body-expr-statements)
- "Statements that have either a single statement or a block as a body.")
-
-(defconst delphi-expr-delimiters '(then do of)
- "Expression delimiter tokens.")
-
-(defconst delphi-binary-ops
- '(plus minus equals not-equals times divides div mod and or xor)
- "Delphi binary operations.")
-
-(defconst delphi-visibilities '(public private protected published automated)
- "Class visibilities.")
-
-(defconst delphi-block-statements
- '(begin try case repeat initialization finalization asm)
- "Statements that contain multiple substatements.")
-
-(defconst delphi-mid-block-statements
- `(except finally ,@delphi-visibilities)
- "Statements that mark mid sections of the enclosing block.")
-
-(defconst delphi-end-block-statements `(end until)
- "Statements that end block sections.")
-
-(defconst delphi-match-block-statements
- `(,@delphi-end-block-statements ,@delphi-mid-block-statements)
- "Statements that match the indentation of the parent block.")
-
-(defconst delphi-decl-sections '(type const var label resourcestring)
- "Denotes the start of a declaration section.")
-
-(defconst delphi-interface-types '(dispinterface interface)
- "Interface types.")
-
-(defconst delphi-class-types '(class object)
- "Class types.")
-
-(defconst delphi-composite-types
- `(,@delphi-class-types ,@delphi-interface-types record)
- "Types that contain declarations within them.")
-
-(defconst delphi-unit-sections
- '(interface implementation program library package)
- "Unit sections within which the indent is 0.")
-
-(defconst delphi-use-clauses `(uses requires exports contains)
- "Statements that refer to foreign symbols.")
-
-(defconst delphi-unit-statements
- `(,@delphi-use-clauses ,@delphi-unit-sections initialization finalization)
- "Statements indented at level 0.")
-
-(defconst delphi-decl-delimiters
- `(,@delphi-decl-sections ,@delphi-unit-statements
- ,@delphi-routine-statements)
- "Statements that a declaration statement should align with.")
-
-(defconst delphi-decl-matchers
- `(begin ,@delphi-decl-sections)
- "Statements that should match to declaration statement indentation.")
-
-(defconst delphi-enclosing-statements
- `(,@delphi-block-statements ,@delphi-mid-block-statements
- ,@delphi-decl-sections ,@delphi-use-clauses ,@delphi-routine-statements)
- "Delimits an enclosing statement.")
-
-(defconst delphi-previous-statements
- `(,@delphi-unit-statements ,@delphi-routine-statements)
- "Delimits a previous statement.")
-
-(defconst delphi-previous-enclosing-statements
- `(,@delphi-block-statements ,@delphi-mid-block-statements
- ,@delphi-decl-sections)
- "Delimits a previous enclosing statement.")
-
-(defconst delphi-begin-enclosing-tokens
- `(,@delphi-block-statements ,@delphi-mid-block-statements)
- "Tokens that a begin token indents from.")
-
-(defconst delphi-begin-previous-tokens
- `(,@delphi-decl-sections ,@delphi-routine-statements)
- "Tokens that a begin token aligns with, but only if not part of a nested
-routine.")
-
-(defconst delphi-space-chars "\000-\011\013- ") ; all except \n
-(defconst delphi-non-space-chars (concat "^" delphi-space-chars))
-(defconst delphi-spaces-re (concat "[" delphi-space-chars "]*"))
-(defconst delphi-leading-spaces-re (concat "^" delphi-spaces-re))
-(defconst delphi-word-chars "a-zA-Z0-9_")
-
-(defmacro delphi-save-match-data (&rest forms)
- ;; Executes the forms such that the current match data is preserved, so as
- ;; not to disturb any existing search results.
- `(let ((data (match-data)))
- (unwind-protect
- (progn ,@forms)
- (set-match-data data))))
-
-(defmacro delphi-save-excursion (&rest forms)
- ;; Executes the forms such that any movements have no effect, including
- ;; searches.
- `(save-excursion
- (delphi-save-match-data
- (let ((inhibit-point-motion-hooks t)
- (deactivate-mark nil))
- (progn ,@forms)))))
-
-(defmacro delphi-save-state (&rest forms)
- ;; Executes the forms such that any buffer modifications do not have any side
- ;; effects beyond the buffer's actual content changes.
- `(let ((delphi-ignore-changes t)
- (old-supersession-threat
- (symbol-function 'ask-user-about-supersession-threat))
- (buffer-read-only nil)
- (inhibit-read-only t)
- (buffer-undo-list t)
- (before-change-functions nil)
- (after-change-functions nil)
- (modified (buffer-modified-p)))
- ;; Disable any queries about editing obsolete files.
- (fset 'ask-user-about-supersession-threat (lambda (_fn)))
- (unwind-protect
- (progn ,@forms)
- (set-buffer-modified-p modified)
- (fset 'ask-user-about-supersession-threat old-supersession-threat))))
-
-(defsubst delphi-is (element in-set)
- ;; If the element is in the set, the element cdr is returned, otherwise nil.
- (memq element in-set))
-
-(defun delphi-string-of (start end)
- ;; Returns the buffer string from start to end.
- (buffer-substring-no-properties start end))
-
-(defun delphi-looking-at-string (p s)
- ;; True if point p marks the start of string s. s is not a regular
- ;; expression.
- (let ((limit (+ p (length s))))
- (and (<= limit (point-max))
- (string= s (delphi-string-of p limit)))))
-
-(defun delphi-token-of (kind start end)
- ;; Constructs a token from a kind symbol and its start/end points.
- `[,kind ,start ,end])
-
-(defsubst delphi-token-kind (token)
- ;; Returns the kind symbol of the token.
- (if token (aref token 0) nil))
-
-(defun delphi-set-token-kind (token to-kind)
- ;; Sets the kind symbol of the token.
- (if token (aset token 0 to-kind)))
-
-(defsubst delphi-token-start (token)
- ;; Returns the start point of the token.
- (if token (aref token 1) (point-min)))
-
-(defsubst delphi-token-end (token)
- ;; Returns the end point of the token.
- (if token (aref token 2) (point-min)))
-
-(defun delphi-set-token-start (token start)
- ;; Sets the start point of the token.
- (if token (aset token 1 start)))
-
-(defun delphi-set-token-end (token end)
- ;; Sets the end point of the token.
- (if token (aset token 2 end)))
-
-(defun delphi-token-string (token)
- ;; Returns the string image of the token.
- (if token
- (delphi-string-of (delphi-token-start token) (delphi-token-end token))
- ""))
-
-(defun delphi-in-token (p token)
- ;; Returns true if the point p is within the token's start/end points.
- (and (<= (delphi-token-start token) p) (< p (delphi-token-end token))))
-
-(defun delphi-column-of (p)
- ;; Returns the column of the point p.
- (save-excursion (goto-char p) (current-column)))
-
-(defun delphi-face-of (token-kind)
- ;; Returns the face property appropriate for the token kind.
- (cond ((delphi-is token-kind delphi-comments) delphi-comment-face)
- ((delphi-is token-kind delphi-strings) delphi-string-face)
- ((delphi-is token-kind delphi-keywords) delphi-keyword-face)
- (delphi-other-face)))
-
-(defvar delphi-progress-last-reported-point nil
- "The last point at which progress was reported.")
-
-(defconst delphi-parsing-progress-step 16384
- "Number of chars to process before the next parsing progress report.")
-(defconst delphi-scanning-progress-step 2048
- "Number of chars to process before the next scanning progress report.")
-(defconst delphi-fontifying-progress-step delphi-scanning-progress-step
- "Number of chars to process before the next fontification progress report.")
-
-(defun delphi-progress-start ()
- ;; Initializes progress reporting.
- (setq delphi-progress-last-reported-point nil))
-
-(defun delphi-progress-done (&rest msgs)
- ;; Finalizes progress reporting.
- (setq delphi-progress-last-reported-point nil)
- (when delphi-verbose
- (if (null msgs)
- (message "")
- (apply #'message msgs))))
-
-(defun delphi-step-progress (p desc step-size)
- ;; If enough distance has elapsed since the last reported point, then report
- ;; the current progress to the user.
- (cond ((null delphi-progress-last-reported-point)
- ;; This is the first progress step.
- (setq delphi-progress-last-reported-point p))
-
- ((and delphi-verbose
- (>= (abs (- p delphi-progress-last-reported-point)) step-size))
- ;; Report the percentage complete.
- (setq delphi-progress-last-reported-point p)
- (message "%s %s ... %d%%"
- desc (buffer-name) (/ (* 100 p) (point-max))))))
-
-(defun delphi-next-line-start (&optional from-point)
- ;; Returns the first point of the next line.
- (let ((curr-point (point))
- (next nil))
- (if from-point (goto-char from-point))
- (end-of-line)
- (setq next (min (1+ (point)) (point-max)))
- (goto-char curr-point)
- next))
-
-(defvar delphi-ignore-changes t
- "Internal flag to control if the Delphi mode responds to buffer changes.
-Defaults to t in case the `delphi-after-change' function is called on a
-non-Delphi buffer. Set to nil in a Delphi buffer. To override, just do:
- (let ((delphi-ignore-changes t)) ...)")
-
-(defun delphi-set-text-properties (from to properties)
- ;; Like `set-text-properties', except we do not consider this to be a buffer
- ;; modification.
- (delphi-save-state
- (set-text-properties from to properties)))
-
-(defun delphi-literal-kind (p)
- ;; Returns the literal kind the point p is in (or nil if not in a literal).
- (if (and (<= (point-min) p) (<= p (point-max)))
- (get-text-property p 'token)))
-
-(defun delphi-literal-start-pattern (literal-kind)
- ;; Returns the start pattern of the literal kind.
- (cdr (assoc literal-kind
- '((comment-single-line . "//")
- (comment-multi-line-1 . "{")
- (comment-multi-line-2 . "(*")
- (string . "'")
- (double-quoted-string . "\"")))))
-
-(defun delphi-literal-end-pattern (literal-kind)
- ;; Returns the end pattern of the literal kind.
- (cdr (assoc literal-kind
- '((comment-single-line . "\n")
- (comment-multi-line-1 . "}")
- (comment-multi-line-2 . "*)")
- (string . "'")
- (double-quoted-string . "\"")))))
-
-(defun delphi-literal-stop-pattern (literal-kind)
- ;; Returns the pattern that delimits end of the search for the literal kind.
- ;; These are regular expressions.
- (cdr (assoc literal-kind
- '((comment-single-line . "\n")
- (comment-multi-line-1 . "}")
- (comment-multi-line-2 . "\\*)")
- ;; Strings cannot span lines.
- (string . "['\n]")
- (double-quoted-string . "[\"\n]")))))
-
-(defun delphi-is-literal-start (p)
- ;; True if the point p is at the start point of a (completed) literal.
- (let* ((kind (delphi-literal-kind p))
- (pattern (delphi-literal-start-pattern kind)))
- (or (null kind) ; Non-literals are considered as start points.
- (delphi-looking-at-string p pattern))))
-
-(defun delphi-is-literal-end (p)
- ;; True if the point p is at the end point of a (completed) literal.
- (let* ((kind (delphi-literal-kind (1- p)))
- (pattern (delphi-literal-end-pattern kind)))
- (or (null kind) ; Non-literals are considered as end points.
-
- (and (delphi-looking-at-string (- p (length pattern)) pattern)
- (or (not (delphi-is kind delphi-strings))
- ;; Special case: string delimiters are start/end ambiguous.
- ;; We have an end only if there is some string content (at
- ;; least a starting delimiter).
- (not (delphi-is-literal-end (1- p)))))
-
- ;; Special case: strings cannot span lines.
- (and (delphi-is kind delphi-strings) (eq ?\n (char-after (1- p)))))))
-
-(defun delphi-is-stable-literal (p)
- ;; True if the point p marks a stable point. That is, a point outside of a
- ;; literal region, inside of a literal region, or adjacent to completed
- ;; literal regions.
- (let ((at-start (delphi-is-literal-start p))
- (at-end (delphi-is-literal-end p)))
- (or (>= p (point-max))
- (and at-start at-end)
- (and (not at-start) (not at-end)
- (eq (delphi-literal-kind (1- p)) (delphi-literal-kind p))))))
-
-(defun delphi-complete-literal (literal-kind limit)
- ;; Continues the search for a literal's true end point and returns the
- ;; point past the end pattern (if found) or the limit (if not found).
- (let ((pattern (delphi-literal-stop-pattern literal-kind)))
- (if (not (stringp pattern))
- (error "Invalid literal kind %S" literal-kind)
- ;; Search up to the limit.
- (re-search-forward pattern limit 'goto-limit-on-fail)
- (point))))
-
-(defun delphi-literal-text-properties (kind)
- ;; Creates a list of text properties for the literal kind.
- (if (and (boundp 'font-lock-mode)
- font-lock-mode)
- (list 'token kind 'face (delphi-face-of kind) 'lazy-lock t)
- (list 'token kind)))
-
-(defun delphi-parse-next-literal (limit)
- ;; Searches for the next literal region (i.e. comment or string) and sets the
- ;; the point to its end (or the limit, if not found). The literal region is
- ;; marked as such with a text property, to speed up tokenizing during face
- ;; coloring and indentation scanning.
- (let ((search-start (point)))
- (cond ((not (delphi-is-literal-end search-start))
- ;; We are completing an incomplete literal.
- (let ((kind (delphi-literal-kind (1- search-start))))
- (delphi-complete-literal kind limit)
- (delphi-set-text-properties
- search-start (point) (delphi-literal-text-properties kind))))
-
- ((re-search-forward
- "\\(//\\)\\|\\({\\)\\|\\((\\*\\)\\|\\('\\)\\|\\(\"\\)"
- limit 'goto-limit-on-fail)
- ;; We found the start of a new literal. Find its end and mark it.
- (let ((kind (cond ((match-beginning 1) 'comment-single-line)
- ((match-beginning 2) 'comment-multi-line-1)
- ((match-beginning 3) 'comment-multi-line-2)
- ((match-beginning 4) 'string)
- ((match-beginning 5) 'double-quoted-string)))
- (start (match-beginning 0)))
- (delphi-set-text-properties search-start start nil)
- (delphi-complete-literal kind limit)
- (delphi-set-text-properties
- start (point) (delphi-literal-text-properties kind))))
-
- ;; Nothing found. Mark it as a non-literal.
- ((delphi-set-text-properties search-start limit nil)))
- (delphi-step-progress (point) "Parsing" delphi-parsing-progress-step)))
-
-(defun delphi-literal-token-at (p)
- ;; Returns the literal token surrounding the point p, or nil if none.
- (let ((kind (delphi-literal-kind p)))
- (when kind
- (let ((start (previous-single-property-change (1+ p) 'token))
- (end (next-single-property-change p 'token)))
- (delphi-token-of kind (or start (point-min)) (or end (point-max)))))))
-
-(defun delphi-point-token-at (p kind)
- ;; Returns the single character token at the point p.
- (delphi-token-of kind p (1+ p)))
-
-(defsubst delphi-char-token-at (p char kind)
- ;; Returns the token at the point p that describes the specified character.
- ;; If not actually over such a character, nil is returned.
- (when (eq char (char-after p))
- (delphi-token-of kind p (1+ p))))
-
-(defun delphi-charset-token-at (p charset kind)
- ;; Returns the token surrounding point p that contains only members of the
- ;; character set.
- (let ((currp (point))
- (end nil)
- (token nil))
- (goto-char p)
- (when (> (skip-chars-forward charset) 0)
- (setq end (point))
- (goto-char (1+ p))
- (skip-chars-backward charset)
- (setq token (delphi-token-of kind (point) end)))
- (goto-char currp)
- token))
-
-(defun delphi-space-token-at (p)
- ;; If point p is surrounded by space characters, then return the token of the
- ;; contiguous spaces.
- (delphi-charset-token-at p delphi-space-chars 'space))
-
-(defun delphi-word-token-at (p)
- ;; If point p is over a word (i.e. identifier characters), then return a word
- ;; token. If the word is actually a keyword, then return the keyword token.
- (let ((word (delphi-charset-token-at p delphi-word-chars 'word)))
- (when word
- (let* ((word-image (downcase (delphi-token-string word)))
- (keyword (intern-soft word-image)))
- (when (and (or keyword (string= "nil" word-image))
- (delphi-is keyword delphi-keywords))
- (delphi-set-token-kind word keyword))
- word))))
-
-(defun delphi-explicit-token-at (p token-string kind)
- ;; If point p is anywhere in the token string then returns the resulting
- ;; token.
- (let ((token (delphi-charset-token-at p token-string kind)))
- (when (and token (string= token-string (delphi-token-string token)))
- token)))
-
-(defun delphi-token-at (p)
- ;; Returns the token from parsing text at point p.
- (when (and (<= (point-min) p) (<= p (point-max)))
- (cond ((delphi-char-token-at p ?\n 'newline))
-
- ((delphi-literal-token-at p))
-
- ((delphi-space-token-at p))
-
- ((delphi-word-token-at p))
-
- ((delphi-char-token-at p ?\( 'open-group))
- ((delphi-char-token-at p ?\) 'close-group))
- ((delphi-char-token-at p ?\[ 'open-group))
- ((delphi-char-token-at p ?\] 'close-group))
- ((delphi-char-token-at p ?\; 'semicolon))
- ((delphi-char-token-at p ?. 'dot))
- ((delphi-char-token-at p ?, 'comma))
- ((delphi-char-token-at p ?= 'equals))
- ((delphi-char-token-at p ?+ 'plus))
- ((delphi-char-token-at p ?- 'minus))
- ((delphi-char-token-at p ?* 'times))
- ((delphi-char-token-at p ?/ 'divides))
- ((delphi-char-token-at p ?: 'colon))
-
- ((delphi-explicit-token-at p "<>" 'not-equals))
-
- ((delphi-point-token-at p 'punctuation)))))
-
-(defun delphi-current-token ()
- ;; Returns the delphi source token under the current point.
- (delphi-token-at (point)))
-
-(defun delphi-next-token (token)
- ;; Returns the token after the specified token.
- (when token
- (let ((next (delphi-token-at (delphi-token-end token))))
- (if next
- (delphi-step-progress (delphi-token-start next) "Scanning"
- delphi-scanning-progress-step))
- next)))
-
-(defun delphi-previous-token (token)
- ;; Returns the token before the specified token.
- (when token
- (let ((previous (delphi-token-at (1- (delphi-token-start token)))))
- (if previous
- (delphi-step-progress (delphi-token-start previous) "Scanning"
- delphi-scanning-progress-step))
- previous)))
-
-(defun delphi-next-visible-token (token)
- ;; Returns the first non-space token after the specified token.
- (let (next-token)
- (while (progn
- (setq next-token (delphi-next-token token))
- (delphi-is (delphi-token-kind next-token) '(space newline))))
- next-token))
-
-(defun delphi-parse-region (from to)
- ;; Parses the literal tokens in the region. The point is set to "to".
- (save-restriction
- (widen)
- (goto-char from)
- (while (< (point) to)
- (delphi-parse-next-literal to))))
-
-(defun delphi-parse-region-until-stable (from to)
- ;; Parses at least the literal tokens in the region. After that, parsing
- ;; continues as long as obsolete literal regions are encountered. The point
- ;; is set to the encountered stable point.
- (save-restriction
- (widen)
- (delphi-parse-region from to)
- (while (not (delphi-is-stable-literal (point)))
- (delphi-parse-next-literal (point-max)))))
-
-(defun delphi-fontify-region (from to &optional verbose)
- ;; Colors the text in the region according to Delphi rules.
- (delphi-save-excursion
- (delphi-save-state
- (let ((p from)
- (delphi-verbose verbose)
- (token nil))
- (delphi-progress-start)
- (while (< p to)
- ;; Color the token and move past it.
- (setq token (delphi-token-at p))
- (add-text-properties
- (delphi-token-start token) (delphi-token-end token)
- (list 'face (delphi-face-of (delphi-token-kind token)) 'lazy-lock t))
- (setq p (delphi-token-end token))
- (delphi-step-progress p "Fontifying" delphi-fontifying-progress-step))
- (delphi-progress-done)))))
-
-(defun delphi-after-change (change-start change-end _old-length)
- ;; Called when the buffer has changed. Reparses the changed region.
- (unless delphi-ignore-changes
- (let ((delphi-ignore-changes t)) ; Prevent recursive calls.
- (delphi-save-excursion
- (delphi-progress-start)
- ;; Reparse at least from the token previous to the change to the end of
- ;; line after the change.
- (delphi-parse-region-until-stable
- (delphi-token-start (delphi-token-at (1- change-start)))
- (progn (goto-char change-end) (end-of-line) (point)))
- (delphi-progress-done)))))
-
-(defun delphi-group-start (from-token)
- ;; Returns the token that denotes the start of the ()/[] group.
- (let ((token (delphi-previous-token from-token))
- (token-kind nil))
- (catch 'done
- (while token
- (setq token-kind (delphi-token-kind token))
- (cond
- ;; Skip over nested groups.
- ((eq 'close-group token-kind) (setq token (delphi-group-start token)))
- ((eq 'open-group token-kind) (throw 'done token)))
- (setq token (delphi-previous-token token)))
- ;; Start not found.
- nil)))
-
-(defun delphi-group-end (from-token)
- ;; Returns the token that denotes the end of the ()/[] group.
- (let ((token (delphi-next-token from-token))
- (token-kind nil))
- (catch 'done
- (while token
- (setq token-kind (delphi-token-kind token))
- (cond
- ;; Skip over nested groups.
- ((eq 'open-group token-kind) (setq token (delphi-group-end token)))
- ((eq 'close-group token-kind) (throw 'done token)))
- (setq token (delphi-next-token token)))
- ;; end not found.
- nil)))
-
-(defun delphi-indent-of (token &optional offset)
- ;; Returns the start column of the token, plus any offset.
- (let ((indent (+ (delphi-column-of (delphi-token-start token))
- (if offset offset 0))))
- (when delphi-debug
- (delphi-debug-log
- (concat "\n Indent of: %S %S"
- "\n column: %d indent: %d offset: %d")
- token (delphi-token-string token)
- (delphi-column-of (delphi-token-start token))
- indent (if offset offset 0)))
- indent))
-
-(defun delphi-line-indent-of (from-token &optional offset &rest terminators)
- ;; Returns the column of first non-space character on the token's line, plus
- ;; any offset. We also stop if one of the terminators or an open ( or [ is
- ;; encountered.
- (let ((token (delphi-previous-token from-token))
- (last-token from-token)
- (kind nil))
- (catch 'done
- (while token
- (setq kind (delphi-token-kind token))
- (cond
- ;; Skip over ()/[] groups.
- ((eq 'close-group kind) (setq token (delphi-group-start token)))
-
- ;; Stop at the beginning of the line or an open group.
- ((delphi-is kind '(newline open-group)) (throw 'done nil))
-
- ;; Stop at one of the specified terminators.
- ((delphi-is kind terminators) (throw 'done nil)))
- (unless (delphi-is kind delphi-whitespace) (setq last-token token))
- (setq token (delphi-previous-token token))))
- (delphi-indent-of last-token offset)))
-
-(defun delphi-stmt-line-indent-of (from-token &optional offset)
- ;; Like `delphi-line-indent-of' except is also stops on a use clause, and
- ;; colons that precede statements (i.e. case labels).
- (let ((token (delphi-previous-token from-token))
- (last-token from-token)
- (kind nil))
- (catch 'done
- (while token
- (setq kind (delphi-token-kind token))
- (cond
- ((and (eq 'colon kind)
- (delphi-is (delphi-token-kind last-token)
- `(,@delphi-block-statements
- ,@delphi-expr-statements)))
- ;; We hit a label followed by a statement. Indent to the statement.
- (throw 'done nil))
-
- ;; Skip over ()/[] groups.
- ((eq 'close-group kind) (setq token (delphi-group-start token)))
-
- ((delphi-is kind `(newline open-group ,@delphi-use-clauses))
- ;; Stop at the beginning of the line, an open group, or a use clause
- (throw 'done nil)))
- (unless (delphi-is kind delphi-whitespace) (setq last-token token))
- (setq token (delphi-previous-token token))))
- (delphi-indent-of last-token offset)))
-
-(defun delphi-open-group-indent (token last-token &optional offset)
- ;; Returns the indent relative to an unmatched ( or [.
- (when (eq 'open-group (delphi-token-kind token))
- (if last-token
- (delphi-indent-of last-token offset)
- ;; There is nothing following the ( or [. Indent from its line.
- (delphi-stmt-line-indent-of token delphi-indent-level))))
-
-(defun delphi-composite-type-start (token last-token)
- ;; Returns true (actually the last-token) if the pair equals (= class), (=
- ;; dispinterface), (= interface), (= object), or (= record), and nil
- ;; otherwise.
- (if (and (eq 'equals (delphi-token-kind token))
- (delphi-is (delphi-token-kind last-token) delphi-composite-types))
- last-token))
-
-(defun delphi-is-simple-class-type (at-token limit-token)
- ;; True if at-token is the start of a simple class type. E.g.
- ;; class of TClass;
- ;; class (TBaseClass);
- ;; class;
- (when (delphi-is (delphi-token-kind at-token) delphi-class-types)
- (catch 'done
- ;; Scan until the semi colon.
- (let ((token (delphi-next-token at-token))
- (token-kind nil)
- (limit (delphi-token-start limit-token)))
- (while (and token (<= (delphi-token-start token) limit))
- (setq token-kind (delphi-token-kind token))
- (cond
- ;; A semicolon delimits the search.
- ((eq 'semicolon token-kind) (throw 'done token))
-
- ;; Skip over the inheritance list.
- ((eq 'open-group token-kind) (setq token (delphi-group-end token)))
-
- ;; Only allow "of" and whitespace, and an identifier
- ((delphi-is token-kind `(of word ,@delphi-whitespace)))
-
- ;; Otherwise we are not in a simple class declaration.
- ((throw 'done nil)))
- (setq token (delphi-next-token token)))))))
-
-(defun delphi-block-start (from-token &optional stop-on-class)
- ;; Returns the token that denotes the start of the block.
- (let ((token (delphi-previous-token from-token))
- (last-token nil)
- (token-kind nil))
- (catch 'done
- (while token
- (setq token-kind (delphi-token-kind token))
- (cond
- ;; Skip over nested blocks.
- ((delphi-is token-kind delphi-end-block-statements)
- (setq token (delphi-block-start token)))
-
- ;; Regular block start found.
- ((delphi-is token-kind delphi-block-statements)
- (throw 'done
- ;; As a special case, when a "case" block appears
- ;; within a record declaration (to denote a variant
- ;; part), the record declaration should be considered
- ;; the enclosing block.
- (if (eq 'case token-kind)
- (let ((enclosing-token
- (delphi-block-start token
- 'stop-on-class)))
- (if
- (eq 'record
- (delphi-token-kind enclosing-token))
- (if stop-on-class
- enclosing-token
- (delphi-previous-token enclosing-token))
- token))
- token)))
-
- ;; A class/record start also begins a block.
- ((delphi-composite-type-start token last-token)
- (throw 'done (if stop-on-class last-token token)))
- )
- (unless (delphi-is token-kind delphi-whitespace)
- (setq last-token token))
- (setq token (delphi-previous-token token)))
- ;; Start not found.
- nil)))
-
-(defun delphi-else-start (from-else)
- ;; Returns the token of the if or case statement.
- (let ((token (delphi-previous-token from-else))
- (token-kind nil)
- (semicolon-count 0))
- (catch 'done
- (while token
- (setq token-kind (delphi-token-kind token))
- (cond
- ;; Skip over nested groups.
- ((eq 'close-group token-kind) (setq token (delphi-group-start token)))
-
- ;; Skip over any nested blocks.
- ((delphi-is token-kind delphi-end-block-statements)
- (setq token (delphi-block-start token)))
-
- ((eq 'semicolon token-kind)
- ;; Semicolon means we are looking for an enclosing if, unless we
- ;; are in a case statement. Keep counts of the semicolons and decide
- ;; later.
- (setq semicolon-count (1+ semicolon-count)))
-
- ((and (eq 'if token-kind) (= semicolon-count 0))
- ;; We only can match an if when there have been no intervening
- ;; semicolons.
- (throw 'done token))
-
- ((eq 'case token-kind)
- ;; We have hit a case statement start.
- (throw 'done token)))
- (setq token (delphi-previous-token token)))
- ;; No if or case statement found.
- nil)))
-
-(defun delphi-comment-content-start (comment)
- ;; Returns the point of the first non-space character in the comment.
- (let ((kind (delphi-token-kind comment)))
- (when (delphi-is kind delphi-comments)
- (delphi-save-excursion
- (goto-char (+ (delphi-token-start comment)
- (length (delphi-literal-start-pattern kind))))
- (skip-chars-forward delphi-space-chars)
- (point)))))
-
-(defun delphi-comment-block-start (comment)
- ;; Returns the starting comment token of a contiguous // comment block. If
- ;; the comment is multiline (i.e. {...} or (*...*)), the original comment is
- ;; returned.
- (if (not (eq 'comment-single-line (delphi-token-kind comment)))
- comment
- ;; Scan until we run out of // comments.
- (let ((prev-comment comment)
- (start-comment comment))
- (while (let ((kind (delphi-token-kind prev-comment)))
- (cond ((eq kind 'space))
- ((eq kind 'comment-single-line)
- (setq start-comment prev-comment))
- (t nil)))
- (setq prev-comment (delphi-previous-token prev-comment)))
- start-comment)))
-
-(defun delphi-comment-block-end (comment)
- ;; Returns the end comment token of a contiguous // comment block. If the
- ;; comment is multiline (i.e. {...} or (*...*)), the original comment is
- ;; returned.
- (if (not (eq 'comment-single-line (delphi-token-kind comment)))
- comment
- ;; Scan until we run out of // comments.
- (let ((next-comment comment)
- (end-comment comment))
- (while (let ((kind (delphi-token-kind next-comment)))
- (cond ((eq kind 'space))
- ((eq kind 'comment-single-line)
- (setq end-comment next-comment))
- (t nil)))
- (setq next-comment (delphi-next-token next-comment)))
- end-comment)))
-
-(defun delphi-on-first-comment-line (comment)
- ;; Returns true if the current point is on the first line of the comment.
- (save-excursion
- (let ((comment-start (delphi-token-start comment))
- (current-point (point)))
- (goto-char comment-start)
- (end-of-line)
- (and (<= comment-start current-point) (<= current-point (point))))))
-
-(defun delphi-comment-indent-of (comment)
- ;; Returns the correct indentation for the comment.
- (let ((start-comment (delphi-comment-block-start comment)))
- (if (and (eq start-comment comment)
- (delphi-on-first-comment-line comment))
- ;; Indent as a statement.
- (delphi-enclosing-indent-of comment)
- (save-excursion
- (let ((kind (delphi-token-kind comment)))
- (beginning-of-line)
- (cond ((eq 'comment-single-line kind)
- ;; Indent to the first comment in the // block.
- (delphi-indent-of start-comment))
-
- ((looking-at (concat delphi-leading-spaces-re
- (delphi-literal-stop-pattern kind)))
- ;; Indent multi-line comment terminators to the comment start.
- (delphi-indent-of comment))
-
- ;; Indent according to the comment's content start.
- ((delphi-column-of (delphi-comment-content-start comment)))))))
- ))
-
-(defun delphi-is-use-clause-end (at-token last-token last-colon from-kind)
- ;; True if we are after the end of a uses type clause.
- (when (and last-token
- (not last-colon)
- (eq 'comma (delphi-token-kind at-token))
- (eq 'semicolon from-kind))
- ;; Scan for the uses statement, just to be sure.
- (let ((token (delphi-previous-token at-token))
- (token-kind nil))
- (catch 'done
- (while token
- (setq token-kind (delphi-token-kind token))
- (cond ((delphi-is token-kind delphi-use-clauses)
- (throw 'done t))
-
- ;; Whitespace, identifiers, strings, "in" keyword, and commas
- ;; are allowed in use clauses.
- ((or (delphi-is token-kind '(word comma in newline))
- (delphi-is token-kind delphi-whitespace)
- (delphi-is token-kind delphi-strings)))
-
- ;; Nothing else is.
- ((throw 'done nil)))
- (setq token (delphi-previous-token token)))
- nil))))
-
-(defun delphi-is-block-after-expr-statement (token)
- ;; Returns true if we have a block token trailing an expression delimiter (of
- ;; presumably an expression statement).
- (when (delphi-is (delphi-token-kind token) delphi-block-statements)
- (let ((previous (delphi-previous-token token))
- (previous-kind nil))
- (while (progn
- (setq previous-kind (delphi-token-kind previous))
- (eq previous-kind 'space))
- (setq previous (delphi-previous-token previous)))
- (or (delphi-is previous-kind delphi-expr-delimiters)
- (eq previous-kind 'else)))))
-
-(defun delphi-previous-indent-of (from-token)
- ;; Returns the indentation of the previous statement of the token.
- (let ((token (delphi-previous-token from-token))
- (token-kind nil)
- (from-kind (delphi-token-kind from-token))
- (last-colon nil)
- (last-of nil)
- (last-token nil))
- (catch 'done
- (while token
- (setq token-kind (delphi-token-kind token))
- (cond
- ;; An open ( or [ always is an indent point.
- ((eq 'open-group token-kind)
- (throw 'done (delphi-open-group-indent token last-token)))
-
- ;; Skip over any ()/[] groups.
- ((eq 'close-group token-kind) (setq token (delphi-group-start token)))
-
- ((delphi-is token-kind delphi-end-block-statements)
- (if (eq 'newline (delphi-token-kind (delphi-previous-token token)))
- ;; We can stop at an end token that is right up against the
- ;; margin.
- (throw 'done 0)
- ;; Otherwise, skip over any nested blocks.
- (setq token (delphi-block-start token))))
-
- ;; Special case: if we encounter a ", word;" then we assume that we
- ;; are in some kind of uses clause, and thus indent to column 0. This
- ;; works because no other constructs are known to have that form.
- ;; This fixes the irritating case of having indents after a uses
- ;; clause look like:
- ;; uses
- ;; someUnit,
- ;; someOtherUnit;
- ;; // this should be at column 0!
- ((delphi-is-use-clause-end token last-token last-colon from-kind)
- (throw 'done 0))
-
- ;; A previous terminator means we can stop. If we are on a directive,
- ;; however, then we are not actually encountering a new statement.
- ((and last-token
- (delphi-is token-kind delphi-previous-terminators)
- (not (delphi-is (delphi-token-kind last-token)
- delphi-directives)))
- (throw 'done (delphi-stmt-line-indent-of last-token 0)))
-
- ;; Ignore whitespace.
- ((delphi-is token-kind delphi-whitespace))
-
- ;; Remember any "of" we encounter, since that affects how we
- ;; indent to a case statement within a record declaration
- ;; (i.e. a variant part).
- ((eq 'of token-kind)
- (setq last-of token))
-
- ;; Remember any ':' we encounter (until we reach an "of"),
- ;; since that affects how we indent to case statements in
- ;; general.
- ((eq 'colon token-kind)
- (unless last-of (setq last-colon token)))
-
- ;; A case statement delimits a previous statement. We indent labels
- ;; specially.
- ((eq 'case token-kind)
- (throw 'done
- (if last-colon (delphi-line-indent-of last-colon)
- (delphi-line-indent-of token delphi-case-label-indent))))
-
- ;; If we are in a use clause then commas mark an enclosing rather than
- ;; a previous statement.
- ((delphi-is token-kind delphi-use-clauses)
- (throw 'done
- (if (eq 'comma from-kind)
- (if last-token
- ;; Indent to first unit in use clause.
- (delphi-indent-of last-token)
- ;; Indent from use clause keyword.
- (delphi-line-indent-of token delphi-indent-level))
- ;; Indent to use clause keyword.
- (delphi-line-indent-of token))))
-
- ;; Assembly sections always indent in from the asm keyword.
- ((eq token-kind 'asm)
- (throw 'done (delphi-stmt-line-indent-of token delphi-indent-level)))
-
- ;; An enclosing statement delimits a previous statement.
- ;; We try to use the existing indent of the previous statement,
- ;; otherwise we calculate from the enclosing statement.
- ((delphi-is token-kind delphi-previous-enclosing-statements)
- (throw 'done (if last-token
- ;; Otherwise indent to the last token
- (delphi-line-indent-of last-token)
- ;; Just indent from the enclosing keyword
- (delphi-line-indent-of token delphi-indent-level))))
-
- ;; A class or record declaration also delimits a previous statement.
- ((delphi-composite-type-start token last-token)
- (throw
- 'done
- (if (delphi-is-simple-class-type last-token from-token)
- ;; c = class; or c = class of T; are previous statements.
- (delphi-line-indent-of token)
- ;; Otherwise c = class ... or r = record ... are enclosing
- ;; statements.
- (delphi-line-indent-of last-token delphi-indent-level))))
-
- ;; We have a definite previous statement delimiter.
- ((delphi-is token-kind delphi-previous-statements)
- (throw 'done (delphi-stmt-line-indent-of token 0)))
- )
- (unless (delphi-is token-kind delphi-whitespace)
- (setq last-token token))
- (setq token (delphi-previous-token token)))
- ;; We ran out of tokens. Indent to column 0.
- 0)))
-
-(defun delphi-section-indent-of (section-token)
- ;; Returns the indentation appropriate for begin/var/const/type/label
- ;; tokens.
- (let* ((token (delphi-previous-token section-token))
- (token-kind nil)
- (last-token nil)
- (nested-block-count 0)
- (expr-delimited nil)
- (last-terminator nil))
- (catch 'done
- (while token
- (setq token-kind (delphi-token-kind token))
- (cond
- ;; Always stop at unmatched ( or [.
- ((eq token-kind 'open-group)
- (throw 'done (delphi-open-group-indent token last-token)))
-
- ;; Skip over any ()/[] groups.
- ((eq 'close-group token-kind) (setq token (delphi-group-start token)))
-
- ((delphi-is token-kind delphi-end-block-statements)
- (if (eq 'newline (delphi-token-kind (delphi-previous-token token)))
- ;; We can stop at an end token that is right up against the
- ;; margin.
- (throw 'done 0)
- ;; Otherwise, skip over any nested blocks.
- (setq token (delphi-block-start token)
- nested-block-count (1+ nested-block-count))))
-
- ;; Remember if we have encountered any forward routine declarations.
- ((eq 'forward token-kind)
- (setq nested-block-count (1+ nested-block-count)))
-
- ;; Mark the completion of a nested routine traversal.
- ((and (delphi-is token-kind delphi-routine-statements)
- (> nested-block-count 0))
- (setq nested-block-count (1- nested-block-count)))
-
- ;; Remember if we have encountered any statement terminators.
- ((eq 'semicolon token-kind) (setq last-terminator token))
-
- ;; Remember if we have encountered any expression delimiters.
- ((delphi-is token-kind delphi-expr-delimiters)
- (setq expr-delimited token))
-
- ;; Enclosing body statements are delimiting. We indent the compound
- ;; bodies specially.
- ((and (not last-terminator)
- (delphi-is token-kind delphi-body-statements))
- (throw 'done
- (delphi-stmt-line-indent-of token delphi-compound-block-indent)))
-
- ;; An enclosing ":" means a label.
- ((and (eq 'colon token-kind)
- (delphi-is (delphi-token-kind section-token)
- delphi-block-statements)
- (not last-terminator)
- (not expr-delimited)
- (not (eq 'equals (delphi-token-kind last-token))))
- (throw 'done
- (delphi-stmt-line-indent-of token delphi-indent-level)))
-
- ;; Block and mid block tokens are always enclosing
- ((delphi-is token-kind delphi-begin-enclosing-tokens)
- (throw 'done
- (delphi-stmt-line-indent-of token delphi-indent-level)))
-
- ;; Declaration sections and routines are delimiters, unless they
- ;; are part of a nested routine.
- ((and (delphi-is token-kind delphi-decl-delimiters)
- (= 0 nested-block-count))
- (throw 'done (delphi-line-indent-of token 0)))
-
- ;; Unit statements mean we indent right to the left.
- ((delphi-is token-kind delphi-unit-statements) (throw 'done 0))
- )
- (unless (delphi-is token-kind delphi-whitespace)
- (setq last-token token))
- (setq token (delphi-previous-token token)))
- ;; We ran out of tokens. Indent to column 0.
- 0)))
-
-(defun delphi-enclosing-indent-of (from-token)
- ;; Returns the indentation offset from the enclosing statement of the token.
- (let ((token (delphi-previous-token from-token))
- (from-kind (delphi-token-kind from-token))
- (token-kind nil)
- (stmt-start nil)
- (last-token nil)
- (equals-encountered nil)
- (before-equals nil)
- (expr-delimited nil))
- (catch 'done
- (while token
- (setq token-kind (delphi-token-kind token))
- (cond
- ;; An open ( or [ always is an indent point.
- ((eq 'open-group token-kind)
- (throw 'done
- (delphi-open-group-indent
- token last-token
- (if (delphi-is from-kind delphi-binary-ops)
- ;; Keep binary operations aligned with the open group.
- 0
- delphi-indent-level))))
-
- ;; Skip over any ()/[] groups.
- ((eq 'close-group token-kind) (setq token (delphi-group-start token)))
-
- ;; Skip over any nested blocks.
- ((delphi-is token-kind delphi-end-block-statements)
- (setq token (delphi-block-start token)))
-
- ;; An expression delimiter affects indentation depending on whether
- ;; the point is before or after it. Remember that we encountered one.
- ;; Also remember the last encountered token, since if it exists it
- ;; should be the actual indent point.
- ((delphi-is token-kind delphi-expr-delimiters)
- (setq expr-delimited token stmt-start last-token))
-
- ;; With a non-delimited expression statement we indent after the
- ;; statement's keyword, unless we are on the delimiter itself.
- ((and (not expr-delimited)
- (delphi-is token-kind delphi-expr-statements))
- (throw 'done
- (cond ((delphi-is from-kind delphi-expr-delimiters)
- ;; We are indenting a delimiter. Indent to the statement.
- (delphi-stmt-line-indent-of token 0))
-
- ((and last-token (delphi-is from-kind delphi-binary-ops))
- ;; Align binary ops with the expression.
- (delphi-indent-of last-token))
-
- (last-token
- ;; Indent in from the expression.
- (delphi-indent-of last-token delphi-indent-level))
-
- ;; Indent in from the statement's keyword.
- ((delphi-indent-of token delphi-indent-level)))))
-
- ;; A delimited case statement indents the label according to
- ;; a special rule.
- ((eq 'case token-kind)
- (throw 'done
- (if stmt-start
- ;; We are not actually indenting to the case statement,
- ;; but are within a label expression.
- (delphi-stmt-line-indent-of
- stmt-start delphi-indent-level)
- ;; Indent from the case keyword.
- (delphi-stmt-line-indent-of
- token delphi-case-label-indent))))
-
- ;; Body expression statements are enclosing. Indent from the
- ;; statement's keyword, unless we have a non-block statement following
- ;; it.
- ((delphi-is token-kind delphi-body-expr-statements)
- (throw 'done
- (delphi-stmt-line-indent-of
- (or stmt-start token) delphi-indent-level)))
-
- ;; An else statement is enclosing, but it doesn't have an expression.
- ;; Thus we take into account last-token instead of stmt-start.
- ((eq 'else token-kind)
- (throw 'done (delphi-stmt-line-indent-of
- (or last-token token) delphi-indent-level)))
-
- ;; We indent relative to an enclosing declaration section.
- ((delphi-is token-kind delphi-decl-sections)
- (throw 'done (delphi-indent-of (if last-token last-token token)
- delphi-indent-level)))
-
- ;; In unit sections we indent right to the left.
- ((delphi-is token-kind delphi-unit-sections)
- (throw 'done
- ;; Handle specially the case of "interface", which can be used
- ;; to start either a unit section or an interface definition.
- (if (delphi-is token-kind delphi-interface-types)
- (progn
- ;; Find the previous non-whitespace token.
- (while (progn
- (setq last-token token
- token (delphi-previous-token token)
- token-kind (delphi-token-kind token))
- (and token
- (delphi-is token-kind
- delphi-whitespace))))
- ;; If this token is an equals sign, "interface" is being
- ;; used to start an interface definition and we should
- ;; treat it as a composite type; otherwise, we should
- ;; consider it the start of a unit section.
- (if (and token (eq token-kind 'equals))
- (delphi-line-indent-of last-token
- delphi-indent-level)
- 0))
- 0)))
-
- ;; A previous terminator means we can stop.
- ((delphi-is token-kind delphi-previous-terminators)
- (throw 'done
- (cond ((and last-token
- (eq 'comma token-kind)
- (delphi-is from-kind delphi-binary-ops))
- ;; Align binary ops with the expression.
- (delphi-indent-of last-token))
-
- (last-token
- ;; Indent in from the expression.
- (delphi-indent-of last-token delphi-indent-level))
-
- ;; No enclosing expression; use the previous statement's
- ;; indent.
- ((delphi-previous-indent-of token)))))
-
- ;; A block statement after an expression delimiter has its start
- ;; column as the expression statement. E.g.
- ;; if (a = b)
- ;; and (a != c) then begin
- ;; //...
- ;; end;
- ;; Remember it for when we encounter the expression statement start.
- ((delphi-is-block-after-expr-statement token)
- (throw 'done
- (cond (last-token (delphi-indent-of last-token delphi-indent-level))
-
- ((+ (delphi-section-indent-of token) delphi-indent-level)))))
-
- ;; Assembly sections always indent in from the asm keyword.
- ((eq token-kind 'asm)
- (throw 'done (delphi-stmt-line-indent-of token delphi-indent-level)))
-
- ;; Stop at an enclosing statement and indent from it.
- ((delphi-is token-kind delphi-enclosing-statements)
- (throw 'done (delphi-stmt-line-indent-of
- (or last-token token) delphi-indent-level)))
-
- ;; A class/record declaration is also enclosing.
- ((delphi-composite-type-start token last-token)
- (throw 'done
- (delphi-line-indent-of last-token delphi-indent-level)))
-
- ;; A ":" we indent relative to its line beginning. If we are in a
- ;; parameter list, then stop also if we hit a ";".
- ((and (eq token-kind 'colon)
- (not expr-delimited)
- (not (delphi-is from-kind delphi-expr-delimiters))
- (not equals-encountered)
- (not (eq from-kind 'equals)))
- (throw 'done
- (if last-token
- (delphi-indent-of last-token delphi-indent-level)
- (delphi-line-indent-of token delphi-indent-level 'semicolon))))
-
- ;; If the ":" was not processed above and we have token after the "=",
- ;; then indent from the "=". Ignore :=, however.
- ((and (eq token-kind 'colon) equals-encountered before-equals)
- (cond
- ;; Ignore binary ops for now. It would do, for example:
- ;; val := 1 + 2
- ;; + 3;
- ;; which is good, but also
- ;; val := Foo
- ;; (foo, args)
- ;; + 2;
- ;; which doesn't look right.
- ;;;; Align binary ops with the before token.
- ;;((delphi-is from-kind delphi-binary-ops)
- ;;(throw 'done (delphi-indent-of before-equals 0)))
-
- ;; Assignments (:=) we skip over to get a normal indent.
- ((eq (delphi-token-kind last-token) 'equals))
-
- ;; Otherwise indent in from the equals.
- ((throw 'done
- (delphi-indent-of before-equals delphi-indent-level)))))
-
- ;; Remember any "=" we encounter if it has not already been processed.
- ((eq token-kind 'equals)
- (setq equals-encountered token
- before-equals last-token))
- )
- (unless (delphi-is token-kind delphi-whitespace)
- (setq last-token token))
- (setq token (delphi-previous-token token)))
- ;; We ran out of tokens. Indent to column 0.
- 0)))
-
-(defun delphi-corrected-indentation ()
- ;; Returns the corrected indentation for the current line.
- (delphi-save-excursion
- (delphi-progress-start)
- ;; Move to the first token on the line.
- (beginning-of-line)
- (skip-chars-forward delphi-space-chars)
- (let* ((token (delphi-current-token))
- (token-kind (delphi-token-kind token))
- (indent
- (cond ((eq 'close-group token-kind)
- ;; Indent to the matching start ( or [.
- (delphi-indent-of (delphi-group-start token)))
-
- ((delphi-is token-kind delphi-unit-statements) 0)
-
- ((delphi-is token-kind delphi-comments)
- ;; In a comment.
- (delphi-comment-indent-of token))
-
- ((delphi-is token-kind delphi-decl-matchers)
- ;; Use a previous section/routine's indent.
- (delphi-section-indent-of token))
-
- ((delphi-is token-kind delphi-match-block-statements)
- ;; Use the block's indentation.
- (let ((block-start
- (delphi-block-start token 'stop-on-class)))
- (cond
- ;; When trailing a body statement, indent to
- ;; the statement's keyword.
- ((delphi-is-block-after-expr-statement block-start)
- (delphi-section-indent-of block-start))
-
- ;; Otherwise just indent to the block start.
- ((delphi-stmt-line-indent-of block-start 0)))))
-
- ((eq 'else token-kind)
- ;; Find the start of the if or case statement.
- (delphi-stmt-line-indent-of (delphi-else-start token) 0))
-
- ;; Otherwise indent in from enclosing statement.
- ((delphi-enclosing-indent-of
- (if token token (delphi-token-at (1- (point)))))))))
- (delphi-progress-done)
- indent)))
-
-(defun delphi-indent-line ()
- "Indent the current line according to the current language construct.
-If before the indent, the point is moved to the indent."
- (interactive)
- (delphi-save-match-data
- (let ((marked-point (point-marker)) ; Maintain our position reliably.
- (line-start nil)
- (old-indent 0)
- (new-indent 0))
- (beginning-of-line)
- (setq line-start (point))
- (skip-chars-forward delphi-space-chars)
- (setq old-indent (current-column))
- (setq new-indent (delphi-corrected-indentation))
- (if (< marked-point (point))
- ;; If before the indent column, then move to it.
- (set-marker marked-point (point)))
- ;; Advance our marked point after inserted spaces.
- (set-marker-insertion-type marked-point t)
- (when (/= old-indent new-indent)
- (delete-region line-start (point))
- (insert (make-string new-indent ?\s)))
- (goto-char marked-point)
- (set-marker marked-point nil))))
-
-(defvar delphi-mode-abbrev-table nil
- "Abbrev table in use in Delphi mode buffers.")
-(define-abbrev-table 'delphi-mode-abbrev-table ())
-
-(defmacro delphi-ensure-buffer (buffer-var buffer-name)
- ;; Ensures there exists a buffer of the specified name in the specified
- ;; variable.
- `(when (not (buffer-live-p ,buffer-var))
- (setq ,buffer-var (get-buffer-create ,buffer-name))))
-
-(defun delphi-log-msg (to-buffer the-msg)
- ;; Writes a message to the end of the specified buffer.
- (with-current-buffer to-buffer
- (save-selected-window
- (switch-to-buffer-other-window to-buffer)
- (goto-char (point-max))
- (set-window-point (get-buffer-window to-buffer) (point))
- (insert the-msg))))
-
-;; Debugging helpers:
-
-(defvar delphi-debug-buffer nil
- "Buffer to write Delphi mode debug messages to. Created on demand.")
-
-(defun delphi-debug-log (format-string &rest args)
- ;; Writes a message to the log buffer.
- (when delphi-debug
- (delphi-ensure-buffer delphi-debug-buffer "*Delphi Debug Log*")
- (delphi-log-msg delphi-debug-buffer
- (concat (format-time-string "%H:%M:%S " (current-time))
- (apply #'format (cons format-string args))
- "\n"))))
-
-(defun delphi-debug-token-string (token)
- (let* ((image (delphi-token-string token))
- (has-newline (string-match "^\\([^\n]*\\)\n\\(.+\\)?$" image)))
- (when has-newline
- (setq image (concat (match-string 1 image)
- (if (match-beginning 2) "..."))))
- image))
-
-(defun delphi-debug-show-current-token ()
- (interactive)
- (let ((token (delphi-current-token)))
- (delphi-debug-log "Token: %S %S" token (delphi-debug-token-string token))))
-
-(defun delphi-debug-goto-point (p)
- (interactive "NGoto char: ")
- (goto-char p))
-
-(defun delphi-debug-goto-next-token ()
- (interactive)
- (goto-char (delphi-token-start (delphi-next-token (delphi-current-token)))))
-
-(defun delphi-debug-goto-previous-token ()
- (interactive)
- (goto-char
- (delphi-token-start (delphi-previous-token (delphi-current-token)))))
-
-(defun delphi-debug-show-current-string (from to)
- (interactive "r")
- (delphi-debug-log "String: %S" (buffer-substring from to)))
-
-(defun delphi-debug-show-is-stable ()
- (interactive)
- (delphi-debug-log "stable: %S prev: %S next: %S"
- (delphi-is-stable-literal (point))
- (delphi-literal-kind (1- (point)))
- (delphi-literal-kind (point))))
-
-(defun delphi-debug-unparse-buffer ()
- (interactive)
- (delphi-set-text-properties (point-min) (point-max) nil))
-
-(defun delphi-debug-parse-region (from to)
- (interactive "r")
- (let ((delphi-verbose t))
- (delphi-save-excursion
- (delphi-progress-start)
- (delphi-parse-region from to)
- (delphi-progress-done "Parsing done"))))
-
-(defun delphi-debug-parse-window ()
- (interactive)
- (delphi-debug-parse-region (window-start) (window-end)))
-
-(defun delphi-debug-parse-buffer ()
- (interactive)
- (delphi-debug-parse-region (point-min) (point-max)))
-
-(defun delphi-debug-fontify-window ()
- (interactive)
- (delphi-fontify-region (window-start) (window-end) t))
-
-(defun delphi-debug-fontify-buffer ()
- (interactive)
- (delphi-fontify-region (point-min) (point-max) t))
-
-(defun delphi-debug-tokenize-region (from to)
- (interactive)
- (delphi-save-excursion
- (delphi-progress-start)
- (goto-char from)
- (while (< (point) to)
- (goto-char (delphi-token-end (delphi-current-token)))
- (delphi-step-progress (point) "Tokenizing" delphi-scanning-progress-step))
- (delphi-progress-done "Tokenizing done")))
-
-(defun delphi-debug-tokenize-buffer ()
- (interactive)
- (delphi-debug-tokenize-region (point-min) (point-max)))
-
-(defun delphi-debug-tokenize-window ()
- (interactive)
- (delphi-debug-tokenize-region (window-start) (window-end)))
-
-(defun delphi-newline ()
- "Terminate the current line with a newline and indent the next, unless
-`delphi-newline-always-indents' is nil, in which case no reindenting occurs."
- (interactive)
- ;; Remove trailing spaces
- (delete-horizontal-space)
- (newline)
- (when delphi-newline-always-indents
- ;; Indent both the (now) previous and current line first.
- (save-excursion
- (forward-line -1)
- (delphi-indent-line))
- (delphi-indent-line)))
-
-
-(defun delphi-tab ()
- "Indent the region, when Transient Mark mode is enabled and the region is
-active. Otherwise, indent the current line or insert a TAB, depending on the
-value of `delphi-tab-always-indents' and the current line position."
- (interactive)
- (cond ((use-region-p)
- ;; If Transient Mark mode is enabled and the region is active, indent
- ;; the entire region.
- (indent-region (region-beginning) (region-end)))
- ((or delphi-tab-always-indents
- (save-excursion (skip-chars-backward delphi-space-chars) (bolp)))
- ;; Otherwise, if we are configured always to indent (regardless of the
- ;; point's position in the line) or we are before the first non-space
- ;; character on the line, indent the line.
- (delphi-indent-line))
- (t
- ;; Otherwise, insert a tab character.
- (insert "\t"))))
-
-
-(defun delphi-is-directory (path)
- ;; True if the specified path is an existing directory.
- (let ((attributes (file-attributes path)))
- (and attributes (car attributes))))
-
-(defun delphi-is-file (path)
- ;; True if the specified file exists as a file.
- (let ((attributes (file-attributes path)))
- (and attributes (null (car attributes)))))
-
-(defun delphi-search-directory (unit dir &optional recurse)
- ;; Searches for the unit in the specified directory. If recurse is true, then
- ;; the directory is recursively searched. File name comparison is done in a
- ;; case insensitive manner.
- (when (delphi-is-directory dir)
- (let ((files (directory-files dir))
- (unit-file (downcase unit)))
- (catch 'done
- ;; Search for the file.
- (mapc #'(lambda (file)
- (let ((path (concat dir "/" file)))
- (if (and (string= unit-file (downcase file))
- (delphi-is-file path))
- (throw 'done path))))
- files)
-
- ;; Not found. Search subdirectories.
- (when recurse
- (mapc #'(lambda (subdir)
- (unless (member subdir '("." ".."))
- (let ((path (delphi-search-directory
- unit (concat dir "/" subdir) recurse)))
- (if path (throw 'done path)))))
- files))
-
- ;; Not found.
- nil))))
-
-
-(defun delphi-find-unit-in-directory (unit dir)
- ;; Searches for the unit in the specified directory. If the directory ends
- ;; in \"...\", then it is recursively searched.
- (let ((dir-name dir)
- (recurse nil))
- ;; Check if we need to recursively search the directory.
- (if (string-match "^\\(.+\\)\\.\\.\\.$" dir-name)
- (setq dir-name (match-string 1 dir-name)
- recurse t))
- ;; Ensure the trailing slash is removed.
- (if (string-match "^\\(.+\\)[\\\\/]$" dir-name)
- (setq dir-name (match-string 1 dir-name)))
- (delphi-search-directory unit dir-name recurse)))
-
-(defun delphi-find-unit-file (unit)
- ;; Finds the specified delphi source file according to `delphi-search-path'.
- ;; If found, the full path is returned, otherwise nil is returned.
- (catch 'done
- (cond ((null delphi-search-path)
- (delphi-find-unit-in-directory unit "."))
-
- ((stringp delphi-search-path)
- (delphi-find-unit-in-directory unit delphi-search-path))
-
- ((mapc
- #'(lambda (dir)
- (let ((file (delphi-find-unit-in-directory unit dir)))
- (if file (throw 'done file))))
- delphi-search-path)))
- nil))
-
-(defun delphi-find-unit (unit)
- "Find the specified Delphi source file according to `delphi-search-path'.
-If no extension is specified, .pas is assumed. Creates a buffer for the unit."
- (interactive "sDelphi unit name: ")
- (let* ((unit-file (if (string-match "^\\(.*\\)\\.[a-z]+$" unit)
- unit
- (concat unit ".pas")))
- (file (delphi-find-unit-file unit-file)))
- (if (null file)
- (error "unit not found: %s" unit-file)
- (find-file file)
- (if (not (derived-mode-p 'delphi-mode))
- (delphi-mode)))
- file))
-
-(defun delphi-find-current-def ()
- "Find the definition of the identifier under the current point."
- (interactive)
- (error "delphi-find-current-def: not implemented yet"))
-
-(defun delphi-find-current-xdef ()
- "Find the definition of the identifier under the current point, searching
-in external units if necessary (as listed in the current unit's use clause).
-The set of directories to search for a unit is specified by the global variable
-`delphi-search-path'."
- (interactive)
- (error "delphi-find-current-xdef: not implemented yet"))
-
-(defun delphi-find-current-body ()
- "Find the body of the identifier under the current point, assuming
-it is a routine."
- (interactive)
- (error "delphi-find-current-body: not implemented yet"))
-
-(defun delphi-fill-comment ()
- "Fill the text of the current comment, according to `fill-column'.
-An error is raised if not in a comment."
- (interactive)
- (save-excursion
- (save-restriction
- (let* ((comment (delphi-current-token))
- (comment-kind (delphi-token-kind comment)))
- (if (not (delphi-is comment-kind delphi-comments))
- (error "Not in a comment")
- (let* ((start-comment (delphi-comment-block-start comment))
- (end-comment (delphi-comment-block-end comment))
- (comment-start (delphi-token-start start-comment))
- (comment-end (delphi-token-end end-comment))
- (content-start (delphi-comment-content-start start-comment))
- (content-indent (delphi-column-of content-start))
- (content-prefix (make-string content-indent ?\s))
- (content-prefix-re delphi-leading-spaces-re)
- (p nil)
- (marked-point (point-marker))) ; Maintain our position reliably.
- (when (eq 'comment-single-line comment-kind)
- ;; // style comments need more work.
- (setq content-prefix
- (let ((comment-indent (delphi-column-of comment-start)))
- (concat (make-string comment-indent ?\s) "//"
- (make-string (- content-indent comment-indent 2)
- ?\s)))
- content-prefix-re (concat delphi-leading-spaces-re
- "//"
- delphi-spaces-re)
- comment-end (if (delphi-is-literal-end comment-end)
- ;; Don't include the trailing newline.
- (1- comment-end)
- comment-end)))
-
- ;; Advance our marked point after inserted spaces.
- (set-marker-insertion-type marked-point t)
-
- ;; Ensure we can modify the buffer
- (goto-char content-start)
- (insert " ")
- (delete-char -1)
-
- (narrow-to-region content-start comment-end)
-
- ;; Strip off the comment prefixes
- (setq p (point-min))
- (while (when (< p (point-max))
- (goto-char p)
- (re-search-forward content-prefix-re nil t))
- (replace-match "" nil nil)
- (setq p (1+ (point))))
-
- ;; add an extra line to prevent the fill from doing it for us.
- (goto-char (point-max))
- (insert "\n")
-
- ;; Fill the comment contents.
- (let ((fill-column (- fill-column content-indent)))
- (fill-region (point-min) (point-max)))
-
- (goto-char (point-max))
- (delete-char -1)
-
- ;; Restore comment prefixes.
- (goto-char (point-min))
- (end-of-line) ; Don't reset the first line.
- (setq p (point))
- (while (when (< p (point-max))
- (goto-char p)
- (re-search-forward "^" nil t))
- (replace-match content-prefix nil nil)
- (setq p (1+ (point))))
-
- (setq comment-end (point-max))
- (widen)
-
- ;; Restore our position
- (goto-char marked-point)
- (set-marker marked-point nil)
-
- ;; React to the entire fill change as a whole.
- (delphi-progress-start)
- (delphi-parse-region comment-start comment-end)
- (delphi-progress-done)))))))
-
-(defun delphi-new-comment-line ()
- "If in a // comment, do a newline, indented such that one is still in the
-comment block. If not in a // comment, just does a normal newline."
- (interactive)
- (let ((comment (delphi-current-token)))
- (if (not (eq 'comment-single-line (delphi-token-kind comment)))
- ;; Not in a // comment. Just do the normal newline.
- (delphi-newline)
- (let* ((start-comment (delphi-comment-block-start comment))
- (comment-start (delphi-token-start start-comment))
- (content-start (delphi-comment-content-start start-comment))
- (prefix
- (concat (make-string (delphi-column-of comment-start) ?\s) "//"
- (make-string (- content-start comment-start 2) ?\s))))
- (delete-horizontal-space)
- (newline)
- (insert prefix)))))
-
-(defun delphi-match-token (token limit)
- ;; Sets the match region used by (match-string 0) and friends to the token's
- ;; region. Sets the current point to the end of the token (or limit).
- (set-match-data nil)
- (if token
- (let ((end (min (delphi-token-end token) limit)))
- (set-match-data (list (delphi-token-start token) end))
- (goto-char end)
- token)))
-
-(defconst delphi-font-lock-defaults
- '(nil ; We have our own fontify routine, so keywords don't apply.
- t ; Syntactic fontification doesn't apply.
- nil ; Don't care about case since we don't use regexps to find tokens.
- nil ; Syntax alists don't apply.
- nil ; Syntax begin movement doesn't apply
- (font-lock-fontify-region-function . delphi-fontify-region)
- (font-lock-verbose . delphi-fontifying-progress-step))
- "Delphi mode font-lock defaults. Syntactic fontification is ignored.")
-
-(defvar delphi-debug-mode-map
- (let ((kmap (make-sparse-keymap)))
- (mapc #'(lambda (binding) (define-key kmap (car binding) (cadr binding)))
- '(("n" delphi-debug-goto-next-token)
- ("p" delphi-debug-goto-previous-token)
- ("t" delphi-debug-show-current-token)
- ("T" delphi-debug-tokenize-buffer)
- ("W" delphi-debug-tokenize-window)
- ("g" delphi-debug-goto-point)
- ("s" delphi-debug-show-current-string)
- ("a" delphi-debug-parse-buffer)
- ("w" delphi-debug-parse-window)
- ("f" delphi-debug-fontify-window)
- ("F" delphi-debug-fontify-buffer)
- ("r" delphi-debug-parse-region)
- ("c" delphi-debug-unparse-buffer)
- ("x" delphi-debug-show-is-stable)
- ))
- kmap)
- "Keystrokes for Delphi mode debug commands.")
-
-(defvar delphi-mode-map
- (let ((kmap (make-sparse-keymap)))
- (mapc #'(lambda (binding) (define-key kmap (car binding) (cadr binding)))
- (list '("\r" delphi-newline)
- '("\t" delphi-tab)
- '("\177" backward-delete-char-untabify)
-;; '("\C-cd" delphi-find-current-def)
-;; '("\C-cx" delphi-find-current-xdef)
-;; '("\C-cb" delphi-find-current-body)
- '("\C-cu" delphi-find-unit)
- '("\M-q" delphi-fill-comment)
- '("\M-j" delphi-new-comment-line)
- ;; Debug bindings:
- (list "\C-c\C-d" delphi-debug-mode-map)))
- kmap)
- "Keymap used in Delphi mode.")
-
-;;;###autoload
-(define-derived-mode delphi-mode prog-mode "Delphi"
- "Major mode for editing Delphi code. \\<delphi-mode-map>
-\\[delphi-tab]\t- Indents the current line (or region, if Transient Mark mode
-\t is enabled and the region is active) of Delphi code.
-\\[delphi-find-unit]\t- Search for a Delphi source file.
-\\[delphi-fill-comment]\t- Fill the current comment.
-\\[delphi-new-comment-line]\t- If in a // comment, do a new comment line.
-
-\\[indent-region] also works for indenting a whole region.
-
-Customization:
-
- `delphi-indent-level' (default 3)
- Indentation of Delphi statements with respect to containing block.
- `delphi-compound-block-indent' (default 0)
- Extra indentation for blocks in compound statements.
- `delphi-case-label-indent' (default 0)
- Extra indentation for case statement labels.
- `delphi-tab-always-indents' (default t)
- Non-nil means TAB in Delphi mode should always reindent the current line,
- regardless of where in the line point is when the TAB command is used.
- `delphi-newline-always-indents' (default t)
- Non-nil means NEWLINE in Delphi mode should always reindent the current
- line, insert a blank line and move to the default indent column of the
- blank line.
- `delphi-search-path' (default .)
- Directories to search when finding external units.
- `delphi-verbose' (default nil)
- If true then Delphi token processing progress is reported to the user.
-
-Coloring:
-
- `delphi-comment-face' (default font-lock-comment-face)
- Face used to color Delphi comments.
- `delphi-string-face' (default font-lock-string-face)
- Face used to color Delphi strings.
- `delphi-keyword-face' (default font-lock-keyword-face)
- Face used to color Delphi keywords.
- `delphi-other-face' (default nil)
- Face used to color everything else.
-
-Turning on Delphi mode calls the value of the variable `delphi-mode-hook'
-with no args, if that value is non-nil."
-
- ;; Buffer locals:
- (mapc #'(lambda (var)
- (let ((var-symb (car var))
- (var-val (cadr var)))
- (set (make-local-variable var-symb) var-val)))
- (list '(indent-line-function delphi-indent-line)
- '(comment-indent-function delphi-indent-line)
- '(case-fold-search t)
- '(delphi-progress-last-reported-point nil)
- '(delphi-ignore-changes nil)
- (list 'font-lock-defaults delphi-font-lock-defaults)))
-
- ;; We need to keep track of changes to the buffer to determine if we need
- ;; to retokenize changed text.
- (add-hook 'after-change-functions 'delphi-after-change nil t)
-
- (widen)
-
- (delphi-save-excursion
- (let ((delphi-verbose t))
- (delphi-progress-start)
- (delphi-parse-region (point-min) (point-max))
- (delphi-progress-done)))
-
- (run-mode-hooks 'delphi-mode-hook))
-
-;;; delphi.el ends here
diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index 21844d20598..ff6321d74c3 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -199,7 +199,8 @@ Pop back to the last location with \\[negative-argument] \\[find-tag].")
(defvar tags-table-files nil
"List of file names covered by current tags table.
-nil means it has not yet been computed; use `tags-table-files' to do so.")
+nil means it has not yet been computed;
+use function `tags-table-files' to do so.")
(defvar tags-completion-table nil
"Obarray of tag names defined in current tags table.")
@@ -224,7 +225,7 @@ of the format-parsing tags function variables if successful.")
One optional argument, a boolean specifying to return complete path (nil) or
relative path (non-nil).")
(defvar tags-table-files-function nil
- "Function to do the work of `tags-table-files' (which see).")
+ "Function to do the work of function `tags-table-files' (which see).")
(defvar tags-completion-table-function nil
"Function to build the `tags-completion-table'.")
(defvar snarf-tag-function nil
@@ -251,7 +252,7 @@ One argument, the tag info returned by `snarf-tag-function'.")
(defvar tags-apropos-function nil
"Function to do the work of `tags-apropos' (which see).")
(defvar tags-included-tables-function nil
- "Function to do the work of `tags-included-tables' (which see).")
+ "Function to do the work of function `tags-included-tables' (which see).")
(defvar verify-tags-table-function nil
"Function to return t if current buffer contains valid tags file.")
@@ -702,7 +703,9 @@ Returns t if it visits a tags table, or nil if there are no more in the list."
(kill-local-variable 'tags-file-name)
(if (eq local-tags-file-name tags-file-name)
(setq tags-file-name nil))
- (user-error "File %s is not a valid tags table"
+ (user-error (if (file-exists-p local-tags-file-name)
+ "File %s is not a valid tags table"
+ "File %s does not exist")
local-tags-file-name)))))
(defun tags-reset-tags-tables ()
diff --git a/lisp/progmodes/f90.el b/lisp/progmodes/f90.el
index 181704f82b9..dba1d6a2f9b 100644
--- a/lisp/progmodes/f90.el
+++ b/lisp/progmodes/f90.el
@@ -1178,11 +1178,11 @@ and lies before point."
(defsubst f90-line-continued ()
"Return t if the current line is a continued one.
-This includes comment lines embedded in continued lines, but
-not the last line of a continued statement."
+This includes comment or preprocessor lines embedded in continued lines,
+but not the last line of a continued statement."
(save-excursion
(beginning-of-line)
- (while (and (looking-at "[ \t]*\\(!\\|$\\)") (zerop (forward-line -1))))
+ (while (and (looking-at "[ \t]*\\([!#]\\|$\\)") (zerop (forward-line -1))))
(end-of-line)
(while (f90-in-comment)
(search-backward "!" (line-beginning-position))
@@ -1832,11 +1832,15 @@ after indenting."
(f90-indent-line-no)
(setq no-line-number t)
(skip-chars-forward " \t"))
- (if (looking-at "!")
- (setq indent (f90-comment-indent))
- (and f90-smart-end (looking-at "end")
- (f90-match-end))
- (setq indent (f90-calculate-indent)))
+ ;; FIXME This means f90-calculate-indent gives different answers
+ ;; for comments and preprocessor lines to this function.
+ ;; Better to make f90-calculate-indent return the correct answer?
+ (cond ((looking-at "!") (setq indent (f90-comment-indent)))
+ ((looking-at "#") (setq indent 0))
+ (t
+ (and f90-smart-end (looking-at "end")
+ (f90-match-end))
+ (setq indent (f90-calculate-indent))))
(or (= indent (current-column))
(f90-indent-to indent no-line-number))
;; If initial point was within line's indentation,
@@ -1973,12 +1977,13 @@ If run in the middle of a line, the line is not broken."
(f90-indent-to ind-curr))
(while (and (f90-line-continued) (zerop (forward-line 1))
(< (point) end-region-mark))
- (if (looking-at "[ \t]*!")
- (f90-indent-to (f90-comment-indent))
- (or (= (current-indentation)
- (+ ind-curr f90-continuation-indent))
- (f90-indent-to
- (+ ind-curr f90-continuation-indent) 'no-line-no)))))
+ (cond ((looking-at "[ \t]*#") (f90-indent-to 0))
+ ((looking-at "[ \t]*!") (f90-indent-to (f90-comment-indent)))
+ (t
+ (or (= (current-indentation)
+ (+ ind-curr f90-continuation-indent))
+ (f90-indent-to
+ (+ ind-curr f90-continuation-indent) 'no-line-no))))))
;; Restore point, etc.
(setq f90-cache-position nil)
(goto-char save-point)
diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el
index 7ca0ececa78..0f92df95a9d 100644
--- a/lisp/progmodes/flymake.el
+++ b/lisp/progmodes/flymake.el
@@ -844,13 +844,21 @@ Return t if it has at least one flymake overlay, nil if no overlay."
has-flymake-overlays))
(defface flymake-errline
- '((t :inherit error))
+ '((((supports :underline (:style wave)))
+ :underline (:style wave :color "Red1"))
+ (t
+ :inherit error))
"Face used for marking error lines."
+ :version "24.4"
:group 'flymake)
(defface flymake-warnline
- '((t :inherit warning))
+ '((((supports :underline (:style wave)))
+ :underline (:style wave :color "DarkOrange"))
+ (t
+ :inherit warning))
"Face used for marking warning lines."
+ :version "24.4"
:group 'flymake)
(defun flymake-highlight-line (line-no line-err-info-list)
diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el
index fc3d336cf99..8e15ec6584e 100644
--- a/lisp/progmodes/gdb-mi.el
+++ b/lisp/progmodes/gdb-mi.el
@@ -1,4 +1,4 @@
-;;; gdb-mi.el --- User Interface for running GDB
+;;; gdb-mi.el --- User Interface for running GDB -*- lexical-binding: t -*-
;; Copyright (C) 2007-2013 Free Software Foundation, Inc.
@@ -192,8 +192,8 @@ address for root variables.")
(defvar gdb-disassembly-position nil)
(defvar gdb-location-alist nil
- "Alist of breakpoint numbers and full filenames. Only used for files that
-Emacs can't find.")
+ "Alist of breakpoint numbers and full filenames.
+Only used for files that Emacs can't find.")
(defvar gdb-active-process nil
"GUD tooltips display variable values when t, and macro definitions otherwise.")
(defvar gdb-error "Non-nil when GDB is reporting an error.")
@@ -227,9 +227,8 @@ This variable is updated in `gdb-done-or-error' and returned by
It is initialized to `gdb-non-stop-setting' at the beginning of
every GDB session.")
-(defvar gdb-buffer-type nil
+(defvar-local gdb-buffer-type nil
"One of the symbols bound in `gdb-buffer-rules'.")
-(make-variable-buffer-local 'gdb-buffer-type)
(defvar gdb-output-sink 'nil
"The disposition of the output of the current gdb command.
@@ -294,9 +293,7 @@ argument (see `gdb-emit-signal')."
(funcall (cdr subscriber) signal)))
(defvar gdb-buf-publisher '()
- "Used to invalidate GDB buffers by emitting a signal in
-`gdb-update'.
-
+ "Used to invalidate GDB buffers by emitting a signal in `gdb-update'.
Must be a list of pairs with cars being buffers and cdr's being
valid signal handlers.")
@@ -327,8 +324,7 @@ valid signal handlers.")
"When in non-stop mode, stopped threads can be examined while
other threads continue to execute.
-GDB session needs to be restarted for this setting to take
-effect."
+GDB session needs to be restarted for this setting to take effect."
:type 'boolean
:group 'gdb-non-stop
:version "23.2")
@@ -336,19 +332,18 @@ effect."
;; TODO Some commands can't be called with --all (give a notice about
;; it in setting doc)
(defcustom gdb-gud-control-all-threads t
- "When enabled, GUD execution commands affect all threads when
-in non-stop mode. Otherwise, only current thread is affected."
+ "When non-nil, GUD execution commands affect all threads when
+in non-stop mode. Otherwise, only current thread is affected."
:type 'boolean
:group 'gdb-non-stop
:version "23.2")
(defcustom gdb-switch-reasons t
- "List of stop reasons which cause Emacs to switch to the thread
-which caused the stop. When t, switch to stopped thread no matter
-what the reason was. When nil, never switch to stopped thread
-automatically.
+ "List of stop reasons for which Emacs should switch thread.
+When t, switch to stopped thread no matter what the reason was.
+When nil, never switch to stopped thread automatically.
-This setting is used in non-stop mode only. In all-stop mode,
+This setting is used in non-stop mode only. In all-stop mode,
Emacs always switches to the thread which caused the stop."
;; exited, exited-normally and exited-signaled are not
;; thread-specific stop reasons and therefore are not included in
@@ -404,7 +399,7 @@ and GDB buffers were updated in `gdb-stopped'."
:link '(info-link "(gdb)GDB/MI Async Records"))
(defcustom gdb-switch-when-another-stopped t
- "When nil, Emacs won't switch to stopped thread if some other
+ "When nil, don't switch to stopped thread if some other
stopped thread is already selected."
:type 'boolean
:group 'gdb-non-stop
@@ -447,8 +442,7 @@ stopped thread is already selected."
:version "23.2")
(defcustom gdb-show-threads-by-default nil
- "Show threads list buffer instead of breakpoints list by
-default."
+ "Show threads list buffer instead of breakpoints list by default."
:type 'boolean
:group 'gdb-buffers
:version "23.2")
@@ -490,12 +484,12 @@ predefined macros."
(defcustom gdb-create-source-file-list t
"Non-nil means create a list of files from which the executable was built.
- Set this to nil if the GUD buffer displays \"initializing...\" in the mode
- line for a long time when starting, possibly because your executable was
- built from a large number of files. This allows quicker initialization
- but means that these files are not automatically enabled for debugging,
- e.g., you won't be able to click in the fringe to set a breakpoint until
- execution has already stopped there."
+Set this to nil if the GUD buffer displays \"initializing...\" in the mode
+line for a long time when starting, possibly because your executable was
+built from a large number of files. This allows quicker initialization
+but means that these files are not automatically enabled for debugging,
+e.g., you won't be able to click in the fringe to set a breakpoint until
+execution has already stopped there."
:type 'boolean
:group 'gdb
:version "23.1")
@@ -507,6 +501,9 @@ Also display the main routine in the disassembly buffer if present."
:group 'gdb
:version "22.1")
+(defvar gdbmi-debug-mode nil
+ "When non-nil, print the messages sent/received from GDB/MI in *Messages*.")
+
(defun gdb-force-mode-line-update (status)
(let ((buffer gud-comint-buffer))
(if (and buffer (buffer-name buffer))
@@ -570,28 +567,27 @@ When `gdb-non-stop' is nil, return COMMAND unchanged."
(defmacro gdb-gud-context-call (cmd1 &optional cmd2 noall noarg)
"`gud-call' wrapper which adds --thread/--all options between
-CMD1 and CMD2. NOALL is the same as in `gdb-gud-context-command'.
+CMD1 and CMD2. NOALL is the same as in `gdb-gud-context-command'.
NOARG must be t when this macro is used outside `gud-def'"
`(gud-call
(concat (gdb-gud-context-command ,cmd1 ,noall) " " ,cmd2)
,(when (not noarg) 'arg)))
-(defun gdb--check-interpreter (proc string)
+(defun gdb--check-interpreter (filter proc string)
(unless (zerop (length string))
- (let ((filter (process-get proc 'gud-normal-filter)))
- (set-process-filter proc filter)
- (unless (memq (aref string 0) '(?^ ?~ ?@ ?& ?* ?=))
- ;; Apparently we're not running with -i=mi.
- (let ((msg "Error: you did not specify -i=mi on GDB's command line!"))
- (message msg)
- (setq string (concat (propertize msg 'font-lock-face 'error)
- "\n" string)))
- ;; Use the old gud-gbd filter, not because it works, but because it
- ;; will properly display GDB's answers rather than hanging waiting for
- ;; answers that aren't coming.
- (set (make-local-variable 'gud-marker-filter) #'gud-gdb-marker-filter))
- (funcall filter proc string))))
+ (remove-function (process-filter proc) #'gdb--check-interpreter)
+ (unless (memq (aref string 0) '(?^ ?~ ?@ ?& ?* ?=))
+ ;; Apparently we're not running with -i=mi.
+ (let ((msg "Error: you did not specify -i=mi on GDB's command line!"))
+ (message msg)
+ (setq string (concat (propertize msg 'font-lock-face 'error)
+ "\n" string)))
+ ;; Use the old gud-gbd filter, not because it works, but because it
+ ;; will properly display GDB's answers rather than hanging waiting for
+ ;; answers that aren't coming.
+ (set (make-local-variable 'gud-marker-filter) #'gud-gdb-marker-filter))
+ (funcall filter proc string)))
(defvar gdb-control-level 0)
@@ -603,16 +599,16 @@ and source-file directory for your debugger.
COMMAND-LINE is the shell command for starting the gdb session.
It should be a string consisting of the name of the gdb
-executable followed by command-line options. The command-line
+executable followed by command line options. The command line
options should include \"-i=mi\" to use gdb's MI text interface.
Note that the old \"--annotate\" option is no longer supported.
-If `gdb-many-windows' is nil (the default value) then gdb just
+If option `gdb-many-windows' is nil (the default value) then gdb just
pops up the GUD buffer unless `gdb-show-main' is t. In this case
it starts with two windows: one displaying the GUD buffer and the
other with the source file with the main routine of the inferior.
-If `gdb-many-windows' is t, regardless of the value of
+If option `gdb-many-windows' is t, regardless of the value of
`gdb-show-main', the layout below will appear. Keybindings are
shown in some of the buffers.
@@ -665,8 +661,7 @@ detailed description of this mode.
;; Setup a temporary process filter to warn when GDB was not started
;; with -i=mi.
(let ((proc (get-buffer-process gud-comint-buffer)))
- (process-put proc 'gud-normal-filter (process-filter proc))
- (set-process-filter proc #'gdb--check-interpreter))
+ (add-function :around (process-filter proc) #'gdb--check-interpreter))
(set (make-local-variable 'gud-minor-mode) 'gdbmi)
(set (make-local-variable 'gdb-control-level) 0)
@@ -846,6 +841,8 @@ detailed description of this mode.
gdb-register-names '()
gdb-non-stop gdb-non-stop-setting)
;;
+ (gdbmi-bnf-init)
+ ;;
(setq gdb-buffer-type 'gdbmi)
;;
(gdb-force-mode-line-update
@@ -1254,7 +1251,7 @@ With arg, enter name of variable to be watched in the minibuffer."
(cond
((> new previous)
;; Add new children to list.
- (dotimes (dummy previous)
+ (dotimes (_ previous)
(push (pop temp-var-list) var-list))
(dolist (child children)
(let ((varchild
@@ -1268,9 +1265,9 @@ With arg, enter name of variable to be watched in the minibuffer."
(push varchild var-list))))
;; Remove deleted children from list.
((< new previous)
- (dotimes (dummy new)
+ (dotimes (_ new)
(push (pop temp-var-list) var-list))
- (dotimes (dummy (- previous new))
+ (dotimes (_ (- previous new))
(pop temp-var-list)))))
(push var1 var-list))
(setq var1 (pop temp-var-list)))
@@ -1502,7 +1499,7 @@ this trigger is subscribed to `gdb-buf-publisher' and called with
(gdb-input
(concat "-inferior-tty-set " tty) 'ignore))))
-(defun gdb-inferior-io-sentinel (proc str)
+(defun gdb-inferior-io-sentinel (proc _str)
(when (eq (process-status proc) 'failed)
;; When the debugged process exits, Emacs gets an EIO error on
;; read from the pty, and stops listening to it. If the gdb
@@ -1739,6 +1736,7 @@ complete."
(setq gdb-token-number (1+ gdb-token-number))
(setq command (concat (number-to-string gdb-token-number) command))
(push (cons gdb-token-number handler-function) gdb-handler-alist)
+ (if gdbmi-debug-mode (message "gdb-input: %s" command))
(process-send-string (get-buffer-process gud-comint-buffer)
(concat command "\n")))
@@ -1761,8 +1759,7 @@ If `gdb-thread-number' is nil, just wrap NAME in asterisks."
"*"))
(defun gdb-current-context-mode-name (mode)
- "Add thread information to MODE which is to be used as
-`mode-name'."
+ "Add thread information to MODE which is to be used as `mode-name'."
(concat mode
(if gdb-thread-number
(format " [thread %s]" gdb-thread-number)
@@ -1809,7 +1806,8 @@ If NO-PROC is non-nil, do not try to contact the GDB process."
;; because we may need to update current gud-running value without
;; changing current thread (see gdb-running)
(defun gdb-setq-thread-number (number)
- "Only this function must be used to change `gdb-thread-number'
+ "Set `gdb-thread-number' to NUMBER.
+Only this function must be used to change `gdb-thread-number'
value to NUMBER, because `gud-running' and `gdb-frame-number'
need to be updated appropriately when current thread changes."
;; GDB 6.8 and earlier always output thread-id="0" when stopping.
@@ -1824,7 +1822,7 @@ need to be updated appropriately when current thread changes."
Note that when `gdb-gud-control-all-threads' is t, `gud-running'
cannot be reliably used to determine whether or not execution
-control buttons should be shown in menu or toolbar. Use
+control buttons should be shown in menu or toolbar. Use
`gdb-running-threads-count' and `gdb-stopped-threads-count'
instead.
@@ -1874,23 +1872,341 @@ is running."
(set-window-buffer source-window buffer))
source-window))
-(defun gdb-car< (a b)
- (< (car a) (car b)))
-
-(defvar gdbmi-record-list
- '((gdb-gdb . "(gdb) \n")
- (gdb-done . "\\([0-9]*\\)\\^done,?\\(.*?\\)\n")
- (gdb-starting . "\\([0-9]*\\)\\^running\n")
- (gdb-error . "\\([0-9]*\\)\\^error,\\(.*?\\)\n")
- (gdb-console . "~\\(\".*?\"\\)\n")
- (gdb-internals . "&\\(\".*?\"\\)\n")
- (gdb-stopped . "\\*stopped,?\\(.*?\\)\n")
- (gdb-running . "\\*running,\\(.*?\n\\)")
- (gdb-thread-created . "=thread-created,\\(.*?\n\\)")
- (gdb-thread-selected . "=thread-selected,\\(.*?\\)\n")
- (gdb-thread-exited . "=thread-exited,\\(.*?\n\\)")
- (gdb-ignored-notification . "=[-[:alpha:]]+,?\\(.*?\\)\n")
- (gdb-shell . "\\(\\(?:^.+\n\\)+\\)")))
+
+(defun gdbmi-start-with (str offset match)
+ "Return non-nil if string STR starts with MATCH, else returns nil.
+OFFSET is the position in STR at which the comparison takes place."
+ (let ((match-length (length match))
+ (str-length (- (length str) offset)))
+ (when (>= str-length match-length)
+ (string-equal match (substring str offset (+ offset match-length))))))
+
+(defun gdbmi-same-start (str offset match)
+ "Return non-nil iff STR and MATCH are equal up to the end of either strings.
+OFFSET is the position in STR at which the comparison takes place."
+ (let* ((str-length (- (length str) offset))
+ (match-length (length match))
+ (compare-length (min str-length match-length)))
+ (when (> compare-length 0)
+ (string-equal (substring str offset (+ offset compare-length))
+ (substring match 0 compare-length)))))
+
+(defun gdbmi-is-number (character)
+ "Return non-nil iff CHARACTER is a numerical character between 0 and 9."
+ (and (>= character ?0)
+ (<= character ?9)))
+
+
+(defvar-local gdbmi-bnf-state 'gdbmi-bnf-output
+ "Current GDB/MI output parser state.
+The parser is placed in a different state when an incomplete data steam is
+received from GDB.
+This variable will preserve the state required to resume the parsing
+when more data arrives.")
+
+(defvar-local gdbmi-bnf-offset 0
+ "Offset in `gud-marker-acc' at which the parser is reading.
+This offset is used to be able to parse the GDB/MI message
+in-place, without the need of copying the string in a temporary buffer
+or discarding parsed tokens by substringing the message.")
+
+(defun gdbmi-bnf-init ()
+ "Initialize the GDB/MI message parser."
+ (setq gdbmi-bnf-state 'gdbmi-bnf-output)
+ (setq gdbmi-bnf-offset 0)
+ (setq gud-marker-acc ""))
+
+
+(defun gdbmi-bnf-output ()
+ "Implementation of the following GDB/MI output grammar rule:
+
+ output ==>
+ ( out-of-band-record )* [ result-record ] gdb-prompt"
+
+ (gdbmi-bnf-skip-unrecognized)
+ (while (gdbmi-bnf-out-of-band-record))
+ (gdbmi-bnf-result-record)
+ (gdbmi-bnf-gdb-prompt))
+
+
+(defun gdbmi-bnf-skip-unrecognized ()
+ "Skip characters until is encounters the beginning of a valid record.
+Used as a protection mechanism in case something goes wrong when parsing
+a GDB/MI reply message."
+ (let ((acc-length (length gud-marker-acc))
+ (prefix-offset gdbmi-bnf-offset)
+ (prompt "(gdb) \n"))
+
+ (while (and (< prefix-offset acc-length)
+ (gdbmi-is-number (aref gud-marker-acc prefix-offset)))
+ (setq prefix-offset (1+ prefix-offset)))
+
+ (if (and (< prefix-offset acc-length)
+ (not (memq (aref gud-marker-acc prefix-offset)
+ '(?^ ?* ?+ ?= ?~ ?@ ?&)))
+ (not (gdbmi-same-start gud-marker-acc gdbmi-bnf-offset prompt))
+ (string-match "\\([^^*+=~@&]+\\)" gud-marker-acc
+ gdbmi-bnf-offset))
+ (let ((unrecognized-str (match-string 0 gud-marker-acc)))
+ (setq gdbmi-bnf-offset (match-end 0))
+ (if gdbmi-debug-mode
+ (message "gdbmi-bnf-skip-unrecognized: %s" unrecognized-str))
+ (gdb-shell unrecognized-str)
+ t))))
+
+
+(defun gdbmi-bnf-gdb-prompt ()
+ "Implementation of the following GDB/MI output grammar rule:
+ gdb-prompt ==>
+ '(gdb)' nl
+
+ nl ==>
+ CR | CR-LF"
+
+ (let ((prompt "(gdb) \n"))
+ (when (gdbmi-start-with gud-marker-acc gdbmi-bnf-offset prompt)
+ (if gdbmi-debug-mode (message "gdbmi-bnf-gdb-prompt: %s" prompt))
+ (gdb-gdb prompt)
+ (setq gdbmi-bnf-offset (+ gdbmi-bnf-offset (length prompt)))
+
+ ;; Returns non-nil to tell gud-gdbmi-marker-filter we've reached
+ ;; the end of a GDB reply message.
+ t)))
+
+
+(defun gdbmi-bnf-result-record ()
+ "Implementation of the following GDB/MI output grammar rule:
+
+ result-record ==>
+ [ token ] '^' result-class ( ',' result )* nl
+
+ token ==>
+ any sequence of digits."
+
+ (gdbmi-bnf-result-and-async-record-impl))
+
+
+(defun gdbmi-bnf-out-of-band-record ()
+ "Implementation of the following GDB/MI output grammar rule:
+
+ out-of-band-record ==>
+ async-record | stream-record"
+
+ (or (gdbmi-bnf-async-record)
+ (gdbmi-bnf-stream-record)))
+
+
+(defun gdbmi-bnf-async-record ()
+ "Implementation of the following GDB/MI output grammar rules:
+
+ async-record ==>
+ exec-async-output | status-async-output | notify-async-output
+
+ exec-async-output ==>
+ [ token ] '*' async-output
+
+ status-async-output ==>
+ [ token ] '+' async-output
+
+ notify-async-output ==>
+ [ token ] '=' async-output
+
+ async-output ==>
+ async-class ( ',' result )* nl"
+
+ (gdbmi-bnf-result-and-async-record-impl))
+
+
+(defun gdbmi-bnf-stream-record ()
+ "Implement the following GDB/MI output grammar rule:
+ stream-record ==>
+ console-stream-output | target-stream-output | log-stream-output
+
+ console-stream-output ==>
+ '~' c-string
+
+ target-stream-output ==>
+ '@' c-string
+
+ log-stream-output ==>
+ '&' c-string"
+ (when (< gdbmi-bnf-offset (length gud-marker-acc))
+ (if (and (member (aref gud-marker-acc gdbmi-bnf-offset) '(?~ ?@ ?&))
+ (string-match "\\([~@&]\\)\\(\".*?\"\\)\n" gud-marker-acc
+ gdbmi-bnf-offset))
+ (let ((prefix (match-string 1 gud-marker-acc))
+ (c-string (match-string 2 gud-marker-acc)))
+
+ (setq gdbmi-bnf-offset (match-end 0))
+ (if gdbmi-debug-mode (message "gdbmi-bnf-stream-record: %s"
+ (match-string 0 gud-marker-acc)))
+
+ (cond ((string-equal prefix "~")
+ (gdbmi-bnf-console-stream-output c-string))
+ ((string-equal prefix "@")
+ (gdbmi-bnf-target-stream-output c-string))
+ ((string-equal prefix "&")
+ (gdbmi-bnf-log-stream-output c-string)))
+ t))))
+
+(defun gdbmi-bnf-console-stream-output (c-string)
+ "Handler for the console-stream-output GDB/MI output grammar rule."
+ (gdb-console c-string))
+
+(defun gdbmi-bnf-target-stream-output (_c-string)
+ "Handler for the target-stream-output GDB/MI output grammar rule."
+ ;; Not currently used.
+ )
+
+(defun gdbmi-bnf-log-stream-output (c-string)
+ "Handler for the log-stream-output GDB/MI output grammar rule."
+ ;; Suppress "No registers." GDB 6.8 and earlier
+ ;; duplicates MI error message on internal stream.
+ ;; Don't print to GUD buffer.
+ (if (not (string-equal (read c-string) "No registers.\n"))
+ (gdb-internals c-string)))
+
+
+(defconst gdbmi-bnf-result-state-configs
+ '(("^" . (("done" . (gdb-done . progressive))
+ ("error" . (gdb-error . progressive))
+ ("running" . (gdb-starting . atomic))))
+ ("*" . (("stopped" . (gdb-stopped . atomic))
+ ("running" . (gdb-running . atomic))))
+ ("+" . ())
+ ("=" . (("thread-created" . (gdb-thread-created . atomic))
+ ("thread-selected" . (gdb-thread-selected . atomic))
+ ("thread-existed" . (gdb-ignored-notification . atomic))
+ ('default . (gdb-ignored-notification . atomic)))))
+ "Alist of alists, mapping the type and class of message to a handler function.
+Handler functions are all flagged as either `progressive' or `atomic'.
+`progressive' handlers are capable of parsing incomplete messages.
+They can be called several time with new data chunk as they arrive from GDB.
+`progressive' handlers must have an extra argument that is set to a non-nil
+value when the message is complete.
+
+Implement the following GDB/MI output grammar rule:
+ result-class ==>
+ 'done' | 'running' | 'connected' | 'error' | 'exit'
+
+ async-class ==>
+ 'stopped' | others (where others will be added depending on the needs
+ --this is still in development).")
+
+(defun gdbmi-bnf-result-and-async-record-impl ()
+ "Common implementation of the result-record and async-record rule.
+Both rules share the same syntax. Those records may be very large in size.
+For that reason, the \"result\" part of the record is parsed by
+`gdbmi-bnf-incomplete-record-result', which will keep
+receiving characters as they arrive from GDB until the record is complete."
+ (let ((acc-length (length gud-marker-acc))
+ (prefix-offset gdbmi-bnf-offset))
+
+ (while (and (< prefix-offset acc-length)
+ (gdbmi-is-number (aref gud-marker-acc prefix-offset)))
+ (setq prefix-offset (1+ prefix-offset)))
+
+ (if (and (< prefix-offset acc-length)
+ (member (aref gud-marker-acc prefix-offset) '(?* ?+ ?= ?^))
+ (string-match "\\([0-9]*\\)\\([*+=^]\\)\\(.+?\\)\\([,\n]\\)"
+ gud-marker-acc gdbmi-bnf-offset))
+
+ (let ((token (match-string 1 gud-marker-acc))
+ (prefix (match-string 2 gud-marker-acc))
+ (class (match-string 3 gud-marker-acc))
+ (complete (string-equal (match-string 4 gud-marker-acc) "\n"))
+ class-alist
+ class-command)
+
+ (setq gdbmi-bnf-offset (match-end 0))
+ (if gdbmi-debug-mode (message "gdbmi-bnf-result-record: %s"
+ (match-string 0 gud-marker-acc)))
+
+ (setq class-alist
+ (cdr (assoc prefix gdbmi-bnf-result-state-configs)))
+ (setq class-command (cdr (assoc class class-alist)))
+ (if (null class-command)
+ (setq class-command (cdr (assoc 'default class-alist))))
+
+ (if complete
+ (if class-command
+ (if (equal (cdr class-command) 'progressive)
+ (funcall (car class-command) token "" complete)
+ (funcall (car class-command) token "")))
+ (setq gdbmi-bnf-state
+ (lambda ()
+ (gdbmi-bnf-incomplete-record-result token class-command)))
+ (funcall gdbmi-bnf-state))
+ t))))
+
+(defun gdbmi-bnf-incomplete-record-result (token class-command)
+ "State of the parser used to progressively parse a result-record or async-record
+rule from an incomplete data stream. The parser will stay in this state until
+the end of the current result or async record is reached."
+ (when (< gdbmi-bnf-offset (length gud-marker-acc))
+ ;; Search the data stream for the end of the current record:
+ (let* ((newline-pos (string-match "\n" gud-marker-acc gdbmi-bnf-offset))
+ (is-progressive (equal (cdr class-command) 'progressive))
+ (is-complete (not (null newline-pos)))
+ result-str)
+
+ (when gdbmi-debug-mode
+ (message "gdbmi-bnf-incomplete-record-result: %s"
+ (substring gud-marker-acc gdbmi-bnf-offset newline-pos)))
+
+ ;; Update the gdbmi-bnf-offset only if the current chunk of data can
+ ;; be processed by the class-command handler:
+ (when (or is-complete is-progressive)
+ (setq result-str
+ (substring gud-marker-acc gdbmi-bnf-offset newline-pos))
+
+ ;; Move gdbmi-bnf-offset past the end of the chunk.
+ (setq gdbmi-bnf-offset (+ gdbmi-bnf-offset (length result-str)))
+ (when newline-pos
+ (setq gdbmi-bnf-offset (1+ gdbmi-bnf-offset))))
+
+ ;; Update the parsing state before invoking the handler in class-command
+ ;; to make sure it's not left in an invalid state if the handler was
+ ;; to generate an error.
+ (if is-complete
+ (setq gdbmi-bnf-state 'gdbmi-bnf-output))
+
+ (if class-command
+ (if is-progressive
+ (funcall (car class-command) token result-str is-complete)
+ (if is-complete
+ (funcall (car class-command) token result-str))))
+
+ (unless is-complete
+ ;; Incomplete gdb response: abort parsing until we receive more data.
+ (if gdbmi-debug-mode (message "gdbmi-bnf-incomplete-record-result, aborting: incomplete stream"))
+ (throw 'gdbmi-incomplete-stream nil))
+
+ is-complete)))
+
+
+; The following grammar rules are not yet implemented by this GDBMI-BNF parser.
+; The handling of those rules is currently done by the handlers registered
+; in gdbmi-bnf-result-state-configs
+;
+; result ==>
+; variable "=" value
+;
+; variable ==>
+; string
+;
+; value ==>
+; const | tuple | list
+;
+; const ==>
+; c-string
+;
+; tuple ==>
+; "{}" | "{" result ( "," result )* "}"
+;
+; list ==>
+; "[]" | "[" value ( "," value )* "]" | "[" result ( "," result )* "]"
+
(defun gud-gdbmi-marker-filter (string)
"Filter GDB/MI output."
@@ -1907,46 +2223,20 @@ is running."
;; Start accumulating output for the GUD buffer.
(setq gdb-filter-output "")
- (let (output-record-list)
-
- ;; Process all the complete markers in this chunk.
- (dolist (gdbmi-record gdbmi-record-list)
- (while (string-match (cdr gdbmi-record) gud-marker-acc)
- (push (list (match-beginning 0)
- (car gdbmi-record)
- (match-string 1 gud-marker-acc)
- (match-string 2 gud-marker-acc)
- (match-end 0))
- output-record-list)
- (setq gud-marker-acc
- (concat (substring gud-marker-acc 0 (match-beginning 0))
- ;; Pad with spaces to preserve position.
- (make-string (length (match-string 0 gud-marker-acc)) 32)
- (substring gud-marker-acc (match-end 0))))))
-
- (setq output-record-list (sort output-record-list 'gdb-car<))
-
- (dolist (output-record output-record-list)
- (let ((record-type (cadr output-record))
- (arg1 (nth 2 output-record))
- (arg2 (nth 3 output-record)))
- (cond ((eq record-type 'gdb-error)
- (gdb-done-or-error arg2 arg1 'error))
- ((eq record-type 'gdb-done)
- (gdb-done-or-error arg2 arg1 'done))
- ;; Suppress "No registers." GDB 6.8 and earlier
- ;; duplicates MI error message on internal stream.
- ;; Don't print to GUD buffer.
- ((not (and (eq record-type 'gdb-internals)
- (string-equal (read arg1) "No registers.\n")))
- (funcall record-type arg1)))))
- (setq gdb-output-sink 'user)
- ;; Remove padding.
- (string-match "^ *" gud-marker-acc)
- (setq gud-marker-acc (substring gud-marker-acc (match-end 0)))
+ (let ((acc-length (length gud-marker-acc)))
+ (catch 'gdbmi-incomplete-stream
+ (while (and (< gdbmi-bnf-offset acc-length)
+ (funcall gdbmi-bnf-state)))))
+
+ (when (/= gdbmi-bnf-offset 0)
+ (setq gud-marker-acc (substring gud-marker-acc gdbmi-bnf-offset))
+ (setq gdbmi-bnf-offset 0))
+
+ (when (and gdbmi-debug-mode (> (length gud-marker-acc) 0))
+ (message "gud-gdbmi-marker-filter, unparsed string: %s" gud-marker-acc))
- gdb-filter-output))
+ gdb-filter-output)
(defun gdb-gdb (_output-field))
@@ -1954,13 +2244,13 @@ is running."
(setq gdb-filter-output
(concat output-field gdb-filter-output)))
-(defun gdb-ignored-notification (_output-field))
+(defun gdb-ignored-notification (_token _output-field))
;; gdb-invalidate-threads is defined to accept 'update-threads signal
-(defun gdb-thread-created (_output-field))
-(defun gdb-thread-exited (output-field)
- "Handle =thread-exited async record: unset `gdb-thread-number'
- if current thread exited and update threads list."
+(defun gdb-thread-created (_token _output-field))
+(defun gdb-thread-exited (_token output-field)
+ "Handle =thread-exited async record.
+Unset `gdb-thread-number' if current thread exited and update threads list."
(let* ((thread-id (bindat-get-field (gdb-json-string output-field) 'id)))
(if (string= gdb-thread-number thread-id)
(gdb-setq-thread-number nil))
@@ -1971,7 +2261,7 @@ is running."
(gdb-wait-for-pending
(gdb-emit-signal gdb-buf-publisher 'update-threads))))
-(defun gdb-thread-selected (output-field)
+(defun gdb-thread-selected (_token output-field)
"Handler for =thread-selected MI output record.
Sets `gdb-thread-number' to new id."
@@ -1988,7 +2278,7 @@ Sets `gdb-thread-number' to new id."
(gdb-wait-for-pending
(gdb-update))))
-(defun gdb-running (output-field)
+(defun gdb-running (_token output-field)
(let* ((thread-id
(bindat-get-field (gdb-json-string output-field) 'thread-id)))
;; We reset gdb-frame-number to nil if current thread has gone
@@ -2006,7 +2296,7 @@ Sets `gdb-thread-number' to new id."
(setq gdb-active-process t)
(gdb-emit-signal gdb-buf-publisher 'update-threads))
-(defun gdb-starting (_output-field)
+(defun gdb-starting (_output-field _result)
;; CLI commands don't emit ^running at the moment so use gdb-running too.
(setq gdb-inferior-status "running")
(gdb-force-mode-line-update
@@ -2020,7 +2310,7 @@ Sets `gdb-thread-number' to new id."
;; -break-insert -t didn't give a reason before gdb 6.9
-(defun gdb-stopped (output-field)
+(defun gdb-stopped (_token output-field)
"Given the contents of *stopped MI async record, select new
current thread and update GDB buffers."
;; Reason is available with target-async only
@@ -2106,7 +2396,13 @@ current thread and update GDB buffers."
(setq gdb-filter-output
(gdb-concat-output gdb-filter-output (read output-field))))
-(defun gdb-done-or-error (output-field token-number type)
+(defun gdb-done (token-number output-field is-complete)
+ (gdb-done-or-error token-number 'done output-field is-complete))
+
+(defun gdb-error (token-number output-field is-complete)
+ (gdb-done-or-error token-number 'error output-field is-complete))
+
+(defun gdb-done-or-error (token-number type output-field is-complete)
(if (string-equal token-number "")
;; Output from command entered by user
(progn
@@ -2122,14 +2418,12 @@ current thread and update GDB buffers."
;; Output from command from frontend.
(setq gdb-output-sink 'emacs))
- (gdb-clear-partial-output)
-
;; The process may already be dead (e.g. C-d at the gdb prompt).
(let* ((proc (get-buffer-process gud-comint-buffer))
(no-proc (or (null proc)
(memq (process-status proc) '(exit signal)))))
- (when gdb-first-done-or-error
+ (when (and is-complete gdb-first-done-or-error)
(unless (or token-number gud-running no-proc)
(setq gdb-filter-output (concat gdb-filter-output gdb-prompt-name)))
(gdb-update no-proc)
@@ -2138,13 +2432,19 @@ current thread and update GDB buffers."
(setq gdb-filter-output
(gdb-concat-output gdb-filter-output output-field))
- (when token-number
+ ;; We are done concatenating to the output sink. Restore it to user sink:
+ (setq gdb-output-sink 'user)
+
+ (when (and token-number is-complete)
(with-current-buffer
(gdb-get-buffer-create 'gdb-partial-output-buffer)
(funcall
(cdr (assoc (string-to-number token-number) gdb-handler-alist))))
(setq gdb-handler-alist
- (assq-delete-all token-number gdb-handler-alist)))))
+ (assq-delete-all token-number gdb-handler-alist)))
+
+ (when is-complete
+ (gdb-clear-partial-output))))
(defun gdb-concat-output (so-far new)
(cond
@@ -2169,8 +2469,8 @@ Field names are wrapped in double quotes and equal signs are
replaced with semicolons.
If FIX-KEY is non-nil, strip all \"FIX-KEY=\" occurrences from
-partial output. This is used to get rid of useless keys in lists
-in MI messages, e.g.: [key=.., key=..]. -stack-list-frames and
+partial output. This is used to get rid of useless keys in lists
+in MI messages, e.g.: [key=.., key=..]. -stack-list-frames and
-break-info are examples of MI commands which issue such
responses.
@@ -2337,16 +2637,16 @@ calling `gdb-table-string'."
handler-name
&optional signal-list)
"Define a trigger TRIGGER-NAME which sends GDB-COMMAND and sets
-HANDLER-NAME as its handler. HANDLER-NAME is bound to current
+HANDLER-NAME as its handler. HANDLER-NAME is bound to current
buffer with `gdb-bind-function-to-buffer'.
If SIGNAL-LIST is non-nil, GDB-COMMAND is sent only when the
-defined trigger is called with an argument from SIGNAL-LIST. It's
+defined trigger is called with an argument from SIGNAL-LIST. It's
not recommended to define triggers with empty SIGNAL-LIST.
Normally triggers should respond at least to 'update signal.
Normally the trigger defined by this command must be called from
-the buffer where HANDLER-NAME must work. This should be done so
+the buffer where HANDLER-NAME must work. This should be done so
that buffer-local thread number may be used in GDB-COMMAND (by
calling `gdb-current-context-command').
`gdb-bind-function-to-buffer' is used to achieve this, see
@@ -2375,32 +2675,33 @@ Handlers are normally called from the buffers they put output in.
Delete ((current-buffer) . TRIGGER-NAME) from
`gdb-pending-triggers', erase current buffer and evaluate
-CUSTOM-DEFUN. Then `gdb-update-buffer-name' is called.
+CUSTOM-DEFUN. Then `gdb-update-buffer-name' is called.
If NOPRESERVE is non-nil, window point is not restored after CUSTOM-DEFUN."
`(defun ,handler-name ()
(gdb-delete-pending (cons (current-buffer) ',trigger-name))
- (let* ((buffer-read-only nil)
- (window (get-buffer-window (current-buffer) 0))
- (start (window-start window))
- (p (window-point window)))
+ (let* ((inhibit-read-only t)
+ ,@(unless nopreserve
+ '((window (get-buffer-window (current-buffer) 0))
+ (start (window-start window))
+ (p (window-point window)))))
(erase-buffer)
(,custom-defun)
(gdb-update-buffer-name)
- ,(when (not nopreserve)
- '(set-window-start window start)
- '(set-window-point window p)))))
+ ,@(when (not nopreserve)
+ '((set-window-start window start)
+ (set-window-point window p))))))
(defmacro def-gdb-trigger-and-handler (trigger-name gdb-command
handler-name custom-defun
&optional signal-list)
"Define trigger and handler.
-TRIGGER-NAME trigger is defined to send GDB-COMMAND. See
-`def-gdb-auto-update-trigger'.
+TRIGGER-NAME trigger is defined to send GDB-COMMAND.
+See `def-gdb-auto-update-trigger'.
-HANDLER-NAME handler uses customization of CUSTOM-DEFUN. See
-`def-gdb-auto-update-handler'."
+HANDLER-NAME handler uses customization of CUSTOM-DEFUN.
+See `def-gdb-auto-update-handler'."
`(progn
(def-gdb-auto-update-trigger ,trigger-name
,gdb-command
@@ -2757,37 +3058,38 @@ corresponding to the mode line clicked."
gdb-running-threads-count
gdb-stopped-threads-count))
- (gdb-table-add-row table
- (list
- (bindat-get-field thread 'id)
- (concat
- (if gdb-thread-buffer-verbose-names
- (concat (bindat-get-field thread 'target-id) " ") "")
- (bindat-get-field thread 'state)
- ;; Include frame information for stopped threads
- (if (not running)
- (concat
- " in " (bindat-get-field thread 'frame 'func)
- (if gdb-thread-buffer-arguments
- (concat
- " ("
- (let ((args (bindat-get-field thread 'frame 'args)))
- (mapconcat
- (lambda (arg)
- (apply #'format "%s=%s"
- (gdb-get-many-fields arg 'name 'value)))
- args ","))
- ")")
- "")
- (if gdb-thread-buffer-locations
- (gdb-frame-location (bindat-get-field thread 'frame)) "")
- (if gdb-thread-buffer-addresses
- (concat " at " (bindat-get-field thread 'frame 'addr)) ""))
- "")))
- (list
- 'gdb-thread thread
- 'mouse-face 'highlight
- 'help-echo "mouse-2, RET: select thread")))
+ (gdb-table-add-row
+ table
+ (list
+ (bindat-get-field thread 'id)
+ (concat
+ (if gdb-thread-buffer-verbose-names
+ (concat (bindat-get-field thread 'target-id) " ") "")
+ (bindat-get-field thread 'state)
+ ;; Include frame information for stopped threads
+ (if (not running)
+ (concat
+ " in " (bindat-get-field thread 'frame 'func)
+ (if gdb-thread-buffer-arguments
+ (concat
+ " ("
+ (let ((args (bindat-get-field thread 'frame 'args)))
+ (mapconcat
+ (lambda (arg)
+ (apply #'format "%s=%s"
+ (gdb-get-many-fields arg 'name 'value)))
+ args ","))
+ ")")
+ "")
+ (if gdb-thread-buffer-locations
+ (gdb-frame-location (bindat-get-field thread 'frame)) "")
+ (if gdb-thread-buffer-addresses
+ (concat " at " (bindat-get-field thread 'frame 'addr)) ""))
+ "")))
+ (list
+ 'gdb-thread thread
+ 'mouse-face 'highlight
+ 'help-echo "mouse-2, RET: select thread")))
(when (string-equal gdb-thread-number
(bindat-get-field thread 'id))
(setq marked-line (length gdb-threads-list))))
@@ -2803,8 +3105,8 @@ corresponding to the mode line clicked."
"Define a NAME command which will act upon thread on the current line.
CUSTOM-DEFUN may use locally bound `thread' variable, which will
-be the value of 'gdb-thread property of the current line. If
-'gdb-thread is nil, error is signaled."
+be the value of 'gdb-thread property of the current line.
+If `gdb-thread' is nil, error is signaled."
`(defun ,name (&optional event)
,(when doc doc)
(interactive (list last-input-event))
@@ -2953,7 +3255,7 @@ line."
(defun gdb-memory-column-width (size format)
"Return length of string with memory unit of SIZE in FORMAT.
-SIZE is in bytes, as in `gdb-memory-unit'. FORMAT is a string as
+SIZE is in bytes, as in `gdb-memory-unit'. FORMAT is a string as
in `gdb-memory-format'."
(let ((format-base (cdr (assoc format
'(("x" . 16)
@@ -3455,8 +3757,7 @@ DOC is an optional documentation string."
(error "Not recognized as break/watchpoint line")))))
(defun gdb-goto-breakpoint (&optional event)
- "Go to the location of breakpoint at current line of
-breakpoints buffer."
+ "Go to the location of breakpoint at current line of breakpoints buffer."
(interactive (list last-input-event))
(if event (posn-set-point (event-end event)))
;; Hack to stop gdb-goto-breakpoint displaying in GUD buffer.
@@ -3840,7 +4141,7 @@ member."
(defun gdb-get-source-file-list ()
"Create list of source files for current GDB session.
-If buffers already exist for any of these files, gud-minor-mode
+If buffers already exist for any of these files, `gud-minor-mode'
is set in them."
(goto-char (point-min))
(while (re-search-forward gdb-source-file-regexp nil t)
@@ -3851,8 +4152,8 @@ is set in them."
(gdb-init-buffer)))))
(defun gdb-get-main-selected-frame ()
- "Trigger for `gdb-frame-handler' which uses main current
-thread. Called from `gdb-update'."
+ "Trigger for `gdb-frame-handler' which uses main current thread.
+Called from `gdb-update'."
(if (not (gdb-pending-p 'gdb-get-main-selected-frame))
(progn
(gdb-input (gdb-current-context-command "-stack-info-frame")
@@ -3860,7 +4161,7 @@ thread. Called from `gdb-update'."
(gdb-add-pending 'gdb-get-main-selected-frame))))
(defun gdb-frame-handler ()
- "Sets `gdb-selected-frame' and `gdb-selected-file' to show
+ "Set `gdb-selected-frame' and `gdb-selected-file' to show
overlay arrow in source buffer."
(gdb-delete-pending 'gdb-get-main-selected-frame)
(let ((frame (bindat-get-field (gdb-json-partial-output) 'frame)))
@@ -3921,8 +4222,8 @@ overlay arrow in source buffer."
(defun gdb-preempt-existing-or-display-buffer (buf &optional split-horizontal)
"Find window displaying a buffer with the same
-`gdb-buffer-type' as BUF and show BUF there. If no such window
-exists, just call `gdb-display-buffer' for BUF. If the window
+`gdb-buffer-type' as BUF and show BUF there. If no such window
+exists, just call `gdb-display-buffer' for BUF. If the window
found is already dedicated, split window according to
SPLIT-HORIZONTAL and show BUF in the new window."
(if buf
@@ -4069,7 +4370,7 @@ window is dedicated."
(set-window-dedicated-p window t))
(defun gdb-setup-windows ()
- "Layout the window pattern for `gdb-many-windows'."
+ "Layout the window pattern for option `gdb-many-windows'."
(gdb-get-buffer-create 'gdb-locals-buffer)
(gdb-get-buffer-create 'gdb-stack-buffer)
(gdb-get-buffer-create 'gdb-breakpoints-buffer)
@@ -4120,7 +4421,7 @@ of the debugged program. Non-nil means display the layout shown for
(defun gdb-restore-windows ()
"Restore the basic arrangement of windows used by gdb.
-This arrangement depends on the value of `gdb-many-windows'."
+This arrangement depends on the value of option `gdb-many-windows'."
(interactive)
(switch-to-buffer gud-comint-buffer) ;Select the right window and frame.
(delete-other-windows)
@@ -4310,8 +4611,7 @@ CONTEXT is the text before COMMAND on the line."
(gud-gdb-fetch-lines-break (length context))
(gud-gdb-fetched-lines nil)
;; This filter dumps output lines to `gud-gdb-fetched-lines'.
- (gud-marker-filter #'gud-gdbmi-fetch-lines-filter)
- complete-list)
+ (gud-marker-filter #'gud-gdbmi-fetch-lines-filter))
(with-current-buffer (gdb-get-buffer 'gdb-partial-output-buffer)
(gdb-input (concat "complete " context command)
(lambda () (setq gud-gdb-fetch-lines-in-progress nil)))
diff --git a/lisp/progmodes/grep.el b/lisp/progmodes/grep.el
index c8a0dc449df..1e152c6d751 100644
--- a/lisp/progmodes/grep.el
+++ b/lisp/progmodes/grep.el
@@ -246,6 +246,7 @@ See `compilation-error-screen-columns'"
(let ((map (make-sparse-keymap)))
(set-keymap-parent map compilation-minor-mode-map)
(define-key map " " 'scroll-up-command)
+ (define-key map [?\S-\ ] 'scroll-down-command)
(define-key map "\^?" 'scroll-down-command)
(define-key map "\C-c\C-f" 'next-error-follow-minor-mode)
@@ -359,7 +360,7 @@ Notice that using \\[next-error] or \\[compile-goto-error] modifies
(when grep-highlight-matches
(let* ((beg (match-end 0))
(end (save-excursion (goto-char beg) (line-end-position)))
- (mbeg (text-property-any beg end 'font-lock-face 'match)))
+ (mbeg (text-property-any beg end 'font-lock-face grep-match-face)))
(when mbeg
(- mbeg beg)))))
.
@@ -367,7 +368,7 @@ Notice that using \\[next-error] or \\[compile-goto-error] modifies
(when grep-highlight-matches
(let* ((beg (match-end 0))
(end (save-excursion (goto-char beg) (line-end-position)))
- (mbeg (text-property-any beg end 'font-lock-face 'match))
+ (mbeg (text-property-any beg end 'font-lock-face grep-match-face))
(mend (and mbeg (next-single-property-change mbeg 'font-lock-face nil end))))
(when mend
(- mend beg)))))))
@@ -586,7 +587,7 @@ This function is called from `compilation-filter-hook'."
'exec-plus)
((and
(grep-probe find-program `(nil nil nil ,null-device "-print0"))
- (grep-probe xargs-program `(nil nil nil "-0" "-e" "echo")))
+ (grep-probe xargs-program `(nil nil nil "-0" "echo")))
'gnu)
(t
'exec))))
@@ -596,7 +597,7 @@ This function is called from `compilation-filter-hook'."
;; Windows shells need the program file name
;; after the pipe symbol be quoted if they use
;; forward slashes as directory separators.
- (format "%s . -type f -print0 | \"%s\" -0 -e %s"
+ (format "%s . -type f -print0 | \"%s\" -0 %s"
find-program xargs-program grep-command))
((memq grep-find-use-xargs '(exec exec-plus))
(let ((cmd0 (format "%s . -type f -exec %s"
@@ -621,7 +622,7 @@ This function is called from `compilation-filter-hook'."
(format "%s " null-device)
"")))
(cond ((eq grep-find-use-xargs 'gnu)
- (format "%s . <X> -type f <F> -print0 | \"%s\" -0 -e %s"
+ (format "%s . <X> -type f <F> -print0 | \"%s\" -0 %s"
find-program xargs-program gcmd))
((eq grep-find-use-xargs 'exec)
(format "%s . <X> -type f <F> -exec %s {} %s%s"
@@ -992,14 +993,17 @@ to specify a command to run."
(compilation-start regexp 'grep-mode))
(setq dir (file-name-as-directory (expand-file-name dir)))
(require 'find-dired) ; for `find-name-arg'
+ ;; In Tramp, there could be problems if the command line is too
+ ;; long. We escape it, therefore.
(let ((command (grep-expand-template
grep-find-template
regexp
(concat (shell-quote-argument "(")
" " find-name-arg " "
- (mapconcat #'shell-quote-argument
- (split-string files)
- (concat " -o " find-name-arg " "))
+ (mapconcat
+ #'shell-quote-argument
+ (split-string files)
+ (concat "\\\n" " -o " find-name-arg " "))
" "
(shell-quote-argument ")"))
dir
@@ -1020,7 +1024,7 @@ to specify a command to run."
(concat "*/"
(cdr ignore)))))))
grep-find-ignored-directories
- " -o -path ")
+ "\\\n -o -path ")
" "
(shell-quote-argument ")")
" -prune -o "))
@@ -1038,7 +1042,7 @@ to specify a command to run."
(shell-quote-argument
(cdr ignore))))))
grep-find-ignored-files
- " -o -name ")
+ "\\\n -o -name ")
" "
(shell-quote-argument ")")
" -prune -o "))))))
diff --git a/lisp/progmodes/gud.el b/lisp/progmodes/gud.el
index d339495d76a..6076f88dea6 100644
--- a/lisp/progmodes/gud.el
+++ b/lisp/progmodes/gud.el
@@ -1487,14 +1487,38 @@ into one that invokes an Emacs-enabled debugging session.
(let ((output ""))
;; Process all the complete markers in this chunk.
- (while (string-match "\032\032\\(\\([a-zA-Z]:\\)?[^:\n]*\\):\\([0-9]*\\):.*\n"
- gud-marker-acc)
+ ;;
+ ;; Here I match the string coming out of perldb.
+ ;; The strings can look like any of
+ ;;
+ ;; "\032\032/tmp/tst.pl:6:0\n"
+ ;; "\032\032(eval 5)[/tmp/tst.pl:6]:3:0\n"
+ ;; "\032\032(eval 17)[Basic/Core/Core.pm.PL (i.e. PDL::Core.pm):2931]:1:0\n"
+ ;;
+ ;; From those I want the filename and the line number. First I look for
+ ;; the eval case. If that doesn't match, I look for the "normal" case.
+ (while
+ (string-match
+ (eval-when-compile
+ (let ((file-re "\\(?:[a-zA-Z]:\\)?[^:\n]*"))
+ (concat "\032\032\\(?:"
+ (concat
+ "(eval [0-9]+)\\["
+ "\\(" file-re "\\)" ; Filename.
+ "\\(?: (i\\.e\\. [^)]*)\\)?"
+ ":\\([0-9]*\\)\\]") ; Line number.
+ "\\|"
+ (concat
+ "\\(?1:" file-re "\\)" ; Filename.
+ ":\\(?2:[0-9]*\\)") ; Line number.
+ "\\):.*\n")))
+ gud-marker-acc)
(setq
;; Extract the frame position from the marker.
gud-last-frame
(cons (match-string 1 gud-marker-acc)
- (string-to-number (match-string 3 gud-marker-acc)))
+ (string-to-number (match-string 2 gud-marker-acc)))
;; Append any text before the marker to the output we're going
;; to return - we don't include the marker in this text.
@@ -3363,9 +3387,6 @@ ACTIVATEP non-nil means activate mouse motion events."
;;; Tips for `gud'
-(defvar gud-tooltip-original-filter nil
- "Process filter to restore after GUD output has been received.")
-
(defvar gud-tooltip-dereference nil
"Non-nil means print expressions with a `*' in front of them.
For C this would dereference a pointer expression.")
@@ -3399,7 +3420,7 @@ With arg, dereference expr if ARG is positive, otherwise do not dereference."
; gdb-mi.el gets round this problem.
(defun gud-tooltip-process-output (process output)
"Process debugger output and show it in a tooltip window."
- (set-process-filter process gud-tooltip-original-filter)
+ (remove-function (process-filter process) #'gud-tooltip-process-output)
(tooltip-show (tooltip-strip-prompt process output)
(or gud-tooltip-echo-area tooltip-use-echo-area)))
@@ -3466,8 +3487,8 @@ so they have been disabled."))
(gdb-input
(concat cmd "\n")
`(lambda () (gdb-tooltip-print ,expr))))
- (setq gud-tooltip-original-filter (process-filter process))
- (set-process-filter process 'gud-tooltip-process-output)
+ (add-function :override (process-filter process)
+ #'gud-tooltip-process-output)
(gud-basic-call cmd))
expr))))))))
diff --git a/lisp/progmodes/hideshow.el b/lisp/progmodes/hideshow.el
index fbd1ded35a0..fc753bf7264 100644
--- a/lisp/progmodes/hideshow.el
+++ b/lisp/progmodes/hideshow.el
@@ -1,4 +1,4 @@
-;;; hideshow.el --- minor mode cmds to selectively display code/comment blocks
+;;; hideshow.el --- minor mode cmds to selectively display code/comment blocks -*- coding: utf-8 -*-
;; Copyright (C) 1994-2013 Free Software Foundation, Inc.
@@ -207,7 +207,7 @@
;; Dean Andrews, Alf-Ivar Holm, Holger Bauer, Christoph Conrad, Dave Love,
;; Dirk Herrmann, Gael Marziou, Jan Djarv, Guillaume Leray, Moody Ahmad,
;; Preston F. Crow, Lars Lindberg, Reto Zimmermann, Keith Sheffield,
-;; Chew Meng Kuan, Tony Lam, Pete Ware, François Pinard, Stefan Monnier,
+;; Chew Meng Kuan, Tony Lam, Pete Ware, François Pinard, Stefan Monnier,
;; Joseph Eydelnant, Michael Ernst, Peter Heslin
;;
;; Special thanks go to Dan Nicolaescu, who reimplemented hideshow using
diff --git a/lisp/progmodes/idlw-help.el b/lisp/progmodes/idlw-help.el
index 0e44e5366ca..749b0b65576 100644
--- a/lisp/progmodes/idlw-help.el
+++ b/lisp/progmodes/idlw-help.el
@@ -227,6 +227,7 @@ support."
(interactive "p")
(scroll-up arg)))
(define-key map " " 'scroll-up-command)
+ (define-key map [?\S-\ ] 'scroll-down-command)
(define-key map [delete] 'scroll-down-command)
(define-key map "h" 'idlwave-help-find-header)
(define-key map "H" 'idlwave-help-find-first-header)
diff --git a/lisp/progmodes/idlwave.el b/lisp/progmodes/idlwave.el
index ab65933416b..aeaf1acb2ac 100644
--- a/lisp/progmodes/idlwave.el
+++ b/lisp/progmodes/idlwave.el
@@ -27,7 +27,7 @@
;;; Commentary:
;; IDLWAVE enables feature-rich development and interaction with IDL,
-;; the Interactive Data Language. It provides a compelling,
+;; the Interactive Data Language. It provides a compelling,
;; full-featured alternative to the IDLDE development environment
;; bundled with IDL.
@@ -447,7 +447,7 @@ value of `!DIR'. See also `idlwave-library-path'."
;; Configuration files
(defcustom idlwave-config-directory
- (convert-standard-filename "~/.idlwave")
+ (locate-user-emacs-file "idlwave" ".idlwave")
"Directory for configuration files and user-library catalog."
:group 'idlwave-routine-info
:type 'file)
diff --git a/lisp/progmodes/inf-lisp.el b/lisp/progmodes/inf-lisp.el
index 069f5a32a9e..d73e9489d7c 100644
--- a/lisp/progmodes/inf-lisp.el
+++ b/lisp/progmodes/inf-lisp.el
@@ -201,8 +201,8 @@ This process selection is performed by function `inferior-lisp-proc'.
Whenever \\[inferior-lisp] fires up a new process, it resets
`inferior-lisp-buffer' to be the new process's buffer. If you only run
one process, this does the right thing. If you run multiple
-processes, you can change `inferior-lisp-buffer' to another process
-buffer with \\[set-variable].")
+processes, you might need to change `inferior-lisp-buffer' to
+whichever process buffer you want to use.")
(defvar inferior-lisp-mode-hook '()
"Hook for customizing Inferior Lisp mode.")
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index a16bac7a6cd..2ea78fc321c 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -1680,12 +1680,15 @@ This performs fontification according to `js--class-styles'."
"each"))
"Regexp matching keywords optionally followed by an opening brace.")
+(defconst js--declaration-keyword-re
+ (regexp-opt '("var" "let" "const") 'words)
+ "Regular expression matching variable declaration keywords.")
+
(defconst js--indent-operator-re
(concat "[-+*/%<>=&^|?:.]\\([^-+*/]\\|$\\)\\|"
(js--regexp-opt-symbol '("in" "instanceof")))
"Regexp matching operators that affect indentation of continued expressions.")
-
(defun js--looking-at-operator-p ()
"Return non-nil if point is on a JavaScript operator, other than a comma."
(save-match-data
@@ -1764,6 +1767,37 @@ nil."
(list (cons 'c js-comment-lineup-func))))
(c-get-syntactic-indentation (list (cons symbol anchor)))))
+(defun js--multi-line-declaration-indentation ()
+ "Helper function for `js--proper-indentation'.
+Return the proper indentation of the current line if it belongs to a declaration
+statement spanning multiple lines; otherwise, return nil."
+ (let (at-opening-bracket)
+ (save-excursion
+ (back-to-indentation)
+ (when (not (looking-at js--declaration-keyword-re))
+ (when (looking-at js--indent-operator-re)
+ (goto-char (match-end 0)))
+ (while (and (not at-opening-bracket)
+ (not (bobp))
+ (let ((pos (point)))
+ (save-excursion
+ (js--backward-syntactic-ws)
+ (or (eq (char-before) ?,)
+ (and (not (eq (char-before) ?\;))
+ (prog2
+ (skip-syntax-backward ".")
+ (looking-at js--indent-operator-re)
+ (js--backward-syntactic-ws))
+ (not (eq (char-before) ?\;)))
+ (and (>= pos (point-at-bol))
+ (<= pos (point-at-eol)))))))
+ (condition-case nil
+ (backward-sexp)
+ (scan-error (setq at-opening-bracket t))))
+ (when (looking-at js--declaration-keyword-re)
+ (goto-char (match-end 0))
+ (1+ (current-column)))))))
+
(defun js--proper-indentation (parse-status)
"Return the proper indentation for the current line."
(save-excursion
@@ -1772,6 +1806,7 @@ nil."
(js--get-c-offset 'c (nth 8 parse-status)))
((nth 8 parse-status) 0) ; inside string
((js--ctrl-statement-indentation))
+ ((js--multi-line-declaration-indentation))
((eq (char-after) ?#) 0)
((save-excursion (js--beginning-of-macro)) 4)
((nth 1 parse-status)
@@ -1823,22 +1858,31 @@ nil."
;;; Filling
+(defvar js--filling-paragraph nil)
+
+;; FIXME: Such redefinitions are bad style. We should try and use some other
+;; way to get the same result.
+(defadvice c-forward-sws (around js-fill-paragraph activate)
+ (if js--filling-paragraph
+ (setq ad-return-value (js--forward-syntactic-ws (ad-get-arg 0)))
+ ad-do-it))
+
+(defadvice c-backward-sws (around js-fill-paragraph activate)
+ (if js--filling-paragraph
+ (setq ad-return-value (js--backward-syntactic-ws (ad-get-arg 0)))
+ ad-do-it))
+
+(defadvice c-beginning-of-macro (around js-fill-paragraph activate)
+ (if js--filling-paragraph
+ (setq ad-return-value (js--beginning-of-macro (ad-get-arg 0)))
+ ad-do-it))
+
(defun js-c-fill-paragraph (&optional justify)
"Fill the paragraph with `c-fill-paragraph'."
(interactive "*P")
- ;; FIXME: Such redefinitions are bad style. We should try and use some other
- ;; way to get the same result.
- (cl-letf (((symbol-function 'c-forward-sws)
- (lambda (&optional limit)
- (js--forward-syntactic-ws limit)))
- ((symbol-function 'c-backward-sws)
- (lambda (&optional limit)
- (js--backward-syntactic-ws limit)))
- ((symbol-function 'c-beginning-of-macro)
- (lambda (&optional limit)
- (js--beginning-of-macro limit))))
- (let ((fill-paragraph-function 'c-fill-paragraph))
- (c-fill-paragraph justify))))
+ (let ((js--filling-paragraph t)
+ (fill-paragraph-function 'c-fill-paragraph))
+ (c-fill-paragraph justify)))
;;; Type database and Imenu
@@ -3297,29 +3341,21 @@ If one hasn't been set, or if it's stale, prompt for a new one."
(define-derived-mode js-mode prog-mode "Javascript"
"Major mode for editing JavaScript."
:group 'js
+ (setq-local indent-line-function 'js-indent-line)
+ (setq-local beginning-of-defun-function 'js-beginning-of-defun)
+ (setq-local end-of-defun-function 'js-end-of-defun)
+ (setq-local open-paren-in-column-0-is-defun-start nil)
+ (setq-local font-lock-defaults (list js--font-lock-keywords))
+ (setq-local syntax-propertize-function #'js-syntax-propertize)
- (set (make-local-variable 'indent-line-function) 'js-indent-line)
- (set (make-local-variable 'beginning-of-defun-function)
- 'js-beginning-of-defun)
- (set (make-local-variable 'end-of-defun-function)
- 'js-end-of-defun)
-
- (set (make-local-variable 'open-paren-in-column-0-is-defun-start) nil)
- (set (make-local-variable 'font-lock-defaults)
- (list js--font-lock-keywords))
- (set (make-local-variable 'syntax-propertize-function)
- #'js-syntax-propertize)
-
- (set (make-local-variable 'parse-sexp-ignore-comments) t)
- (set (make-local-variable 'parse-sexp-lookup-properties) t)
- (set (make-local-variable 'which-func-imenu-joiner-function)
- #'js--which-func-joiner)
+ (setq-local parse-sexp-ignore-comments t)
+ (setq-local parse-sexp-lookup-properties t)
+ (setq-local which-func-imenu-joiner-function #'js--which-func-joiner)
;; Comments
- (set (make-local-variable 'comment-start) "// ")
- (set (make-local-variable 'comment-end) "")
- (set (make-local-variable 'fill-paragraph-function)
- 'js-c-fill-paragraph)
+ (setq-local comment-start "// ")
+ (setq-local comment-end "")
+ (setq-local fill-paragraph-function 'js-c-fill-paragraph)
;; Parse cache
(add-hook 'before-change-functions #'js--flush-caches t t)
@@ -3329,8 +3365,7 @@ If one hasn't been set, or if it's stale, prompt for a new one."
;; Imenu
(setq imenu-case-fold-search nil)
- (set (make-local-variable 'imenu-create-index-function)
- #'js--imenu-create-index)
+ (setq imenu-create-index-function #'js--imenu-create-index)
;; for filling, pretend we're cc-mode
(setq c-comment-prefix-regexp "//+\\|\\**"
@@ -3341,10 +3376,10 @@ If one hasn't been set, or if it's stale, prompt for a new one."
c-comment-start-regexp "/[*/]\\|\\s!"
comment-start-skip "\\(//+\\|/\\*+\\)\\s *")
- (set (make-local-variable 'electric-indent-chars)
- (append "{}():;," electric-indent-chars)) ;FIXME: js2-mode adds "[]*".
- (set (make-local-variable 'electric-layout-rules)
- '((?\; . after) (?\{ . after) (?\} . before)))
+ (setq-local electric-indent-chars
+ (append "{}():;," electric-indent-chars)) ;FIXME: js2-mode adds "[]*".
+ (setq-local electric-layout-rules
+ '((?\; . after) (?\{ . after) (?\} . before)))
(let ((c-buffer-is-cc-mode t))
;; FIXME: These are normally set by `c-basic-common-init'. Should
@@ -3356,8 +3391,7 @@ If one hasn't been set, or if it's stale, prompt for a new one."
(make-local-variable 'adaptive-fill-regexp)
(c-setup-paragraph-variables))
- (set (make-local-variable 'syntax-begin-function)
- #'js--syntax-begin-function)
+ (setq-local syntax-begin-function #'js--syntax-begin-function)
;; Important to fontify the whole buffer syntactically! If we don't,
;; then we might have regular expression literals that aren't marked
@@ -3371,8 +3405,7 @@ If one hasn't been set, or if it's stale, prompt for a new one."
;; calls to syntax-propertize wherever it's really needed.
(syntax-propertize (point-max)))
-;;;###autoload
-(defalias 'javascript-mode 'js-mode)
+;;;###autoload (defalias 'javascript-mode 'js-mode)
(eval-after-load 'folding
'(when (fboundp 'folding-add-to-marks-list)
diff --git a/lisp/progmodes/m4-mode.el b/lisp/progmodes/m4-mode.el
index b1fd8cb259b..0641fc776de 100644
--- a/lisp/progmodes/m4-mode.el
+++ b/lisp/progmodes/m4-mode.el
@@ -141,13 +141,21 @@
"*m4-output*" nil)
(switch-to-buffer-other-window "*m4-output*"))
+(defun m4-current-defun-name ()
+ "Return the name of the M4 function at point, or nil."
+ (save-excursion
+ (if (re-search-backward
+ "^\\(\\(m4_\\)?define\\|A._DEFUN\\)(\\[?\\([A-Za-z0-9_]+\\)" nil t)
+ (match-string-no-properties 3))))
+
;;;###autoload
(define-derived-mode m4-mode prog-mode "m4"
"A major mode to edit m4 macro files."
:abbrev-table m4-mode-abbrev-table
- (set (make-local-variable 'comment-start) "#")
- (set (make-local-variable 'parse-sexp-ignore-comments) t)
- (set (make-local-variable 'font-lock-defaults) '(m4-font-lock-keywords nil)))
+ (setq-local comment-start "#")
+ (setq-local parse-sexp-ignore-comments t)
+ (setq-local add-log-current-defun-function #'m4-current-defun-name)
+ (setq font-lock-defaults '(m4-font-lock-keywords nil)))
(provide 'm4-mode)
;;stuff to play with for debugging
diff --git a/lisp/progmodes/make-mode.el b/lisp/progmodes/make-mode.el
index 478eb592a22..20673866bc4 100644
--- a/lisp/progmodes/make-mode.el
+++ b/lisp/progmodes/make-mode.el
@@ -879,41 +879,42 @@ Makefile mode can be configured by modifying the following variables:
(make-local-variable 'makefile-need-macro-pickup)
;; Font lock.
- (set (make-local-variable 'font-lock-defaults)
- ;; SYNTAX-BEGIN set to backward-paragraph to avoid slow-down
- ;; near the end of a large buffer, due to parse-partial-sexp's
- ;; trying to parse all the way till the beginning of buffer.
- '(makefile-font-lock-keywords
- nil nil
- ((?$ . "."))
- backward-paragraph))
- (set (make-local-variable 'syntax-propertize-function)
- makefile-syntax-propertize-function)
+ (setq-local font-lock-defaults
+ ;; Set SYNTAX-BEGIN to backward-paragraph to avoid
+ ;; slow-down near the end of a large buffer, due to
+ ;; `parse-partial-sexp' trying to parse all the way till
+ ;; the beginning of buffer.
+ '(makefile-font-lock-keywords
+ nil nil
+ ((?$ . "."))
+ backward-paragraph))
+ (setq-local syntax-propertize-function
+ makefile-syntax-propertize-function)
;; Add-log.
- (set (make-local-variable 'add-log-current-defun-function)
- 'makefile-add-log-defun)
+ (setq-local add-log-current-defun-function
+ 'makefile-add-log-defun)
;; Imenu.
- (set (make-local-variable 'imenu-generic-expression)
- makefile-imenu-generic-expression)
+ (setq-local imenu-generic-expression
+ makefile-imenu-generic-expression)
;; Dabbrev.
- (set (make-local-variable 'dabbrev-abbrev-skip-leading-regexp) "\\$")
+ (setq-local dabbrev-abbrev-skip-leading-regexp "\\$")
;; Other abbrevs.
(setq local-abbrev-table makefile-mode-abbrev-table)
;; Filling.
- (set (make-local-variable 'fill-paragraph-function) 'makefile-fill-paragraph)
+ (setq-local fill-paragraph-function 'makefile-fill-paragraph)
;; Comment stuff.
- (set (make-local-variable 'comment-start) "#")
- (set (make-local-variable 'comment-end) "")
- (set (make-local-variable 'comment-start-skip) "#+[ \t]*")
+ (setq-local comment-start "#")
+ (setq-local comment-end "")
+ (setq-local comment-start-skip "#+[ \t]*")
;; Make sure TAB really inserts \t.
- (set (make-local-variable 'indent-line-function) 'indent-to-left-margin)
+ (setq-local indent-line-function 'indent-to-left-margin)
;; Real TABs are important in makefiles
(setq indent-tabs-mode t))
@@ -934,8 +935,7 @@ Makefile mode can be configured by modifying the following variables:
;;;###autoload
(define-derived-mode makefile-makepp-mode makefile-mode "Makeppfile"
"An adapted `makefile-mode' that knows about makepp."
- (set (make-local-variable 'makefile-rule-action-regex)
- makefile-makepp-rule-action-regex)
+ (setq-local makefile-rule-action-regex makefile-makepp-rule-action-regex)
(setq font-lock-defaults
`(makefile-makepp-font-lock-keywords ,@(cdr font-lock-defaults))
imenu-generic-expression
@@ -945,11 +945,9 @@ Makefile mode can be configured by modifying the following variables:
;;;###autoload
(define-derived-mode makefile-bsdmake-mode makefile-mode "BSDmakefile"
"An adapted `makefile-mode' that knows about BSD make."
- (set (make-local-variable 'makefile-dependency-regex)
- makefile-bsdmake-dependency-regex)
- (set (make-local-variable 'makefile-dependency-skip) "^:!")
- (set (make-local-variable 'makefile-rule-action-regex)
- makefile-bsdmake-rule-action-regex)
+ (setq-local makefile-dependency-regex makefile-bsdmake-dependency-regex)
+ (setq-local makefile-dependency-skip "^:!")
+ (setq-local makefile-rule-action-regex makefile-bsdmake-rule-action-regex)
(setq font-lock-defaults
`(makefile-bsdmake-font-lock-keywords ,@(cdr font-lock-defaults))))
@@ -957,7 +955,7 @@ Makefile mode can be configured by modifying the following variables:
(define-derived-mode makefile-imake-mode makefile-mode "Imakefile"
"An adapted `makefile-mode' that knows about imake."
:syntax-table makefile-imake-mode-syntax-table
- (set (make-local-variable 'syntax-propertize-function) nil)
+ (setq-local syntax-propertize-function nil)
(setq font-lock-defaults
`(makefile-imake-font-lock-keywords ,@(cdr font-lock-defaults))))
@@ -1215,26 +1213,23 @@ definition and conveniently use this command."
(save-excursion
(goto-char from)
(let ((column makefile-backslash-column)
- (endmark (make-marker)))
- (move-marker endmark to)
+ (endmark (copy-marker to)))
;; Compute the smallest column number past the ends of all the lines.
- (if makefile-backslash-align
- (progn
- (if (not delete-flag)
- (while (< (point) to)
- (end-of-line)
- (if (= (preceding-char) ?\\)
- (progn (forward-char -1)
- (skip-chars-backward " \t")))
- (setq column (max column (1+ (current-column))))
- (forward-line 1)))
- ;; Adjust upward to a tab column, if that doesn't push
- ;; past the margin.
- (if (> (% column tab-width) 0)
- (let ((adjusted (* (/ (+ column tab-width -1) tab-width)
- tab-width)))
- (if (< adjusted (window-width))
- (setq column adjusted))))))
+ (when (and makefile-backslash-align (not delete-flag))
+ (while (< (point) to)
+ (end-of-line)
+ (if (= (preceding-char) ?\\)
+ (progn (forward-char -1)
+ (skip-chars-backward " \t")))
+ (setq column (max column (1+ (current-column))))
+ (forward-line 1))
+ ;; Adjust upward to a tab column, if that doesn't push
+ ;; past the margin.
+ (if (> (% column tab-width) 0)
+ (let ((adjusted (* (/ (+ column tab-width -1) tab-width)
+ tab-width)))
+ (if (< adjusted (window-width))
+ (setq column adjusted)))))
;; Don't modify blank lines at start of region.
(goto-char from)
(while (and (< (point) endmark) (eolp))
@@ -1275,9 +1270,9 @@ definition and conveniently use this command."
;; Filling
-(defun makefile-fill-paragraph (_arg)
- ;; Fill comments, backslashed lines, and variable definitions
- ;; specially.
+(defun makefile-fill-paragraph (_justify)
+ "Function used for `fill-paragraph-function' in Makefile mode.
+Fill comments, backslashed lines, and variable definitions specially."
(save-excursion
(beginning-of-line)
(cond
@@ -1297,8 +1292,10 @@ definition and conveniently use this command."
(end-of-line 0)
(while (= (preceding-char) ?\\)
(end-of-line 0))
- (forward-char)
- (point)))
+ ;; Maybe we hit bobp, in which case we are not at EOL.
+ (if (eolp)
+ (1+ (point))
+ (point))))
(end
(save-excursion
(while (= (preceding-char) ?\\)
@@ -1307,7 +1304,7 @@ definition and conveniently use this command."
(save-restriction
(narrow-to-region beginning end)
(makefile-backslash-region (point-min) (point-max) t)
- ;; Backslashed newlines are marked as puncutations, so when
+ ;; Backslashed newlines are marked as punctuation, so when
;; fill-delete-newlines turns the LF into SPC, we end up with spaces
;; which back-to-indentation (called via fill-newline ->
;; fill-indent-to-left-margin -> indent-line-to) thinks are real code
@@ -1507,8 +1504,8 @@ Insertion takes place at point."
(pop-to-buffer browser-buffer)
(makefile-browser-fill targets macros)
(shrink-window-if-larger-than-buffer)
- (set (make-local-variable 'makefile-browser-selection-vector)
- (make-vector (+ (length targets) (length macros)) nil))
+ (setq-local makefile-browser-selection-vector
+ (make-vector (+ (length targets) (length macros)) nil))
(makefile-browser-start-interaction))))
(defun makefile-switch-to-browser ()
diff --git a/lisp/progmodes/octave-inf.el b/lisp/progmodes/octave-inf.el
deleted file mode 100644
index de7ca32befe..00000000000
--- a/lisp/progmodes/octave-inf.el
+++ /dev/null
@@ -1,386 +0,0 @@
-;;; octave-inf.el --- running Octave as an inferior Emacs process
-
-;; Copyright (C) 1997, 2001-2013 Free Software Foundation, Inc.
-
-;; Author: Kurt Hornik <Kurt.Hornik@wu-wien.ac.at>
-;; John Eaton <jwe@bevo.che.wisc.edu>
-;; Maintainer: FSF
-;; Keywords: languages
-;; Package: octave-mod
-
-;; This file is part of GNU Emacs.
-
-;; GNU Emacs is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;;; Code:
-
-(require 'octave-mod)
-(require 'comint)
-
-(defgroup octave-inferior nil
- "Running Octave as an inferior Emacs process."
- :group 'octave)
-
-(defcustom inferior-octave-program "octave"
- "Program invoked by `inferior-octave'."
- :type 'string
- :group 'octave-inferior)
-
-(defcustom inferior-octave-prompt
- "\\(^octave\\(\\|.bin\\|.exe\\)\\(-[.0-9]+\\)?\\(:[0-9]+\\)?\\|^debug\\|^\\)>+ "
- "Regexp to match prompts for the inferior Octave process."
- :type 'regexp
- :group 'octave-inferior)
-
-(defcustom inferior-octave-startup-file nil
- "Name of the inferior Octave startup file.
-The contents of this file are sent to the inferior Octave process on
-startup."
- :type '(choice (const :tag "None" nil)
- file)
- :group 'octave-inferior)
-
-(defcustom inferior-octave-startup-args nil
- "List of command line arguments for the inferior Octave process.
-For example, for suppressing the startup message and using `traditional'
-mode, set this to (\"-q\" \"--traditional\")."
- :type '(repeat string)
- :group 'octave-inferior)
-
-(defvar inferior-octave-mode-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map comint-mode-map)
- (define-key map "\t" 'comint-dynamic-complete)
- (define-key map "\M-?" 'comint-dynamic-list-filename-completions)
- (define-key map "\C-c\C-l" 'inferior-octave-dynamic-list-input-ring)
- (define-key map [menu-bar inout list-history]
- '("List Input History" . inferior-octave-dynamic-list-input-ring))
- ;; FIXME: free C-h so it can do the describe-prefix-bindings.
- (define-key map "\C-c\C-h" 'info-lookup-symbol)
- map)
- "Keymap used in Inferior Octave mode.")
-
-(defvar inferior-octave-mode-syntax-table
- (let ((table (make-syntax-table octave-mode-syntax-table)))
- table)
- "Syntax table in use in inferior-octave-mode buffers.")
-
-(defcustom inferior-octave-mode-hook nil
- "Hook to be run when Inferior Octave mode is started."
- :type 'hook
- :group 'octave-inferior)
-
-(defvar inferior-octave-font-lock-keywords
- (list
- (cons inferior-octave-prompt 'font-lock-type-face))
- ;; Could certainly do more font locking in inferior Octave ...
- "Additional expressions to highlight in Inferior Octave mode.")
-
-
-;;; Compatibility functions
-(if (not (fboundp 'comint-line-beginning-position))
- ;; comint-line-beginning-position is defined in Emacs 21
- (defun comint-line-beginning-position ()
- "Returns the buffer position of the beginning of the line, after any prompt.
-The prompt is assumed to be any text at the beginning of the line matching
-the regular expression `comint-prompt-regexp', a buffer local variable."
- (save-excursion (comint-bol nil) (point))))
-
-
-(defvar inferior-octave-output-list nil)
-(defvar inferior-octave-output-string nil)
-(defvar inferior-octave-receive-in-progress nil)
-
-(defvar inferior-octave-startup-hook nil)
-
-(defvar inferior-octave-complete-impossible nil
- "Non-nil means that `inferior-octave-complete' is impossible.")
-
-(defvar inferior-octave-has-built-in-variables nil
- "Non-nil means that Octave has built-in variables.")
-
-(defvar inferior-octave-dynamic-complete-functions
- '(inferior-octave-completion-at-point comint-filename-completion)
- "List of functions called to perform completion for inferior Octave.
-This variable is used to initialize `comint-dynamic-complete-functions'
-in the Inferior Octave buffer.")
-
-(defvar info-lookup-mode)
-
-(define-derived-mode inferior-octave-mode comint-mode "Inferior Octave"
- "Major mode for interacting with an inferior Octave process.
-Runs Octave as a subprocess of Emacs, with Octave I/O through an Emacs
-buffer.
-
-Entry to this mode successively runs the hooks `comint-mode-hook' and
-`inferior-octave-mode-hook'."
- (setq comint-prompt-regexp inferior-octave-prompt
- mode-line-process '(":%s")
- local-abbrev-table octave-abbrev-table)
-
- (set (make-local-variable 'comment-start) octave-comment-start)
- (set (make-local-variable 'comment-end) "")
- (set (make-local-variable 'comment-column) 32)
- (set (make-local-variable 'comment-start-skip) octave-comment-start-skip)
-
- (set (make-local-variable 'font-lock-defaults)
- '(inferior-octave-font-lock-keywords nil nil))
-
- (set (make-local-variable 'info-lookup-mode) 'octave-mode)
-
- (setq comint-input-ring-file-name
- (or (getenv "OCTAVE_HISTFILE") "~/.octave_hist")
- comint-input-ring-size (or (getenv "OCTAVE_HISTSIZE") 1024))
- (set (make-local-variable 'comint-dynamic-complete-functions)
- inferior-octave-dynamic-complete-functions)
- (add-hook 'comint-input-filter-functions
- 'inferior-octave-directory-tracker nil t)
- (comint-read-input-ring t))
-
-;;;###autoload
-(defun inferior-octave (&optional arg)
- "Run an inferior Octave process, I/O via `inferior-octave-buffer'.
-This buffer is put in Inferior Octave mode. See `inferior-octave-mode'.
-
-Unless ARG is non-nil, switches to this buffer.
-
-The elements of the list `inferior-octave-startup-args' are sent as
-command line arguments to the inferior Octave process on startup.
-
-Additional commands to be executed on startup can be provided either in
-the file specified by `inferior-octave-startup-file' or by the default
-startup file, `~/.emacs-octave'."
- (interactive "P")
- (let ((buffer inferior-octave-buffer))
- (get-buffer-create buffer)
- (if (comint-check-proc buffer)
- ()
- (with-current-buffer buffer
- (comint-mode)
- (inferior-octave-startup)
- (inferior-octave-mode)))
- (if (not arg)
- (pop-to-buffer buffer))))
-
-;;;###autoload
-(defalias 'run-octave 'inferior-octave)
-
-(defun inferior-octave-startup ()
- "Start an inferior Octave process."
- (let ((proc (comint-exec-1
- (substring inferior-octave-buffer 1 -1)
- inferior-octave-buffer
- inferior-octave-program
- (append (list "-i" "--no-line-editing")
- inferior-octave-startup-args))))
- (set-process-filter proc 'inferior-octave-output-digest)
- (setq comint-ptyp process-connection-type
- inferior-octave-process proc
- inferior-octave-output-list nil
- inferior-octave-output-string nil
- inferior-octave-receive-in-progress t)
-
- ;; This may look complicated ... However, we need to make sure that
- ;; we additional startup code only AFTER Octave is ready (otherwise,
- ;; output may be mixed up). Hence, we need to digest the Octave
- ;; output to see when it issues a prompt.
- (while inferior-octave-receive-in-progress
- (accept-process-output inferior-octave-process))
- (goto-char (point-max))
- (set-marker (process-mark proc) (point))
- (insert-before-markers
- (concat
- (if (not (bobp)) " \n")
- (if inferior-octave-output-list
- (concat (mapconcat
- 'identity inferior-octave-output-list "\n")
- "\n"))))
-
- ;; Find out whether Octave has built-in variables.
- (inferior-octave-send-list-and-digest
- (list "exist \"LOADPATH\"\n"))
- (setq inferior-octave-has-built-in-variables
- (string-match "101$" (car inferior-octave-output-list)))
-
- ;; An empty secondary prompt, as e.g. obtained by '--braindead',
- ;; means trouble.
- (inferior-octave-send-list-and-digest (list "PS2\n"))
- (if (string-match "\\(PS2\\|ans\\) = *$" (car inferior-octave-output-list))
- (inferior-octave-send-list-and-digest
- (list (if inferior-octave-has-built-in-variables
- "PS2 = \"> \"\n"
- "PS2 (\"> \");\n"))))
-
- ;; O.k., now we are ready for the Inferior Octave startup commands.
- (let* (commands
- (program (file-name-nondirectory inferior-octave-program))
- (file (or inferior-octave-startup-file
- (concat "~/.emacs-" program))))
- (setq commands
- (list "more off;\n"
- (if (not (string-equal
- inferior-octave-output-string ">> "))
- (if inferior-octave-has-built-in-variables
- "PS1=\"\\\\s> \";\n"
- "PS1 (\"\\\\s> \");\n"))
- (if (file-exists-p file)
- (format "source (\"%s\");\n" file))))
- (inferior-octave-send-list-and-digest commands))
- (insert-before-markers
- (concat
- (if inferior-octave-output-list
- (concat (mapconcat
- 'identity inferior-octave-output-list "\n")
- "\n"))
- inferior-octave-output-string))
- ;; Next, we check whether Octave supports `completion_matches' ...
- (inferior-octave-send-list-and-digest
- (list "exist \"completion_matches\"\n"))
- (setq inferior-octave-complete-impossible
- (not (string-match "5$" (car inferior-octave-output-list))))
-
- ;; And finally, everything is back to normal.
- (set-process-filter proc 'inferior-octave-output-filter)
- (run-hooks 'inferior-octave-startup-hook)
- (run-hooks 'inferior-octave-startup-hook)
- ;; Just in case, to be sure a cd in the startup file
- ;; won't have detrimental effects.
- (inferior-octave-resync-dirs)))
-
-
-(defun inferior-octave-completion-at-point ()
- "Return the data to complete the Octave symbol at point."
- (let* ((end (point))
- (start
- (save-excursion
- (skip-syntax-backward "w_" (comint-line-beginning-position))
- (point))))
- (cond ((eq start end) nil)
- (inferior-octave-complete-impossible
- (message (concat
- "Your Octave does not have `completion_matches'. "
- "Please upgrade to version 2.X."))
- nil)
- (t
- (list
- start end
- (completion-table-dynamic
- (lambda (command)
- (inferior-octave-send-list-and-digest
- (list (concat "completion_matches (\"" command "\");\n")))
- (sort (delete-dups inferior-octave-output-list)
- 'string-lessp))))))))
-
-(define-obsolete-function-alias 'inferior-octave-complete
- 'completion-at-point "24.1")
-
-(defun inferior-octave-dynamic-list-input-ring ()
- "List the buffer's input history in a help buffer."
- ;; We cannot use `comint-dynamic-list-input-ring', because it replaces
- ;; "completion" by "history reference" ...
- (interactive)
- (if (or (not (ring-p comint-input-ring))
- (ring-empty-p comint-input-ring))
- (message "No history")
- (let ((history nil)
- (history-buffer " *Input History*")
- (index (1- (ring-length comint-input-ring)))
- (conf (current-window-configuration)))
- ;; We have to build up a list ourselves from the ring vector.
- (while (>= index 0)
- (setq history (cons (ring-ref comint-input-ring index) history)
- index (1- index)))
- ;; Change "completion" to "history reference"
- ;; to make the display accurate.
- (with-output-to-temp-buffer history-buffer
- (display-completion-list history)
- (set-buffer history-buffer))
- (message "Hit space to flush")
- (let ((ch (read-event)))
- (if (eq ch ?\ )
- (set-window-configuration conf)
- (setq unread-command-events (list ch)))))))
-
-(defun inferior-octave-strip-ctrl-g (string)
- "Strip leading `^G' character.
-If STRING starts with a `^G', ring the bell and strip it."
- (if (string-match "^\a" string)
- (progn
- (ding)
- (setq string (substring string 1))))
- string)
-
-(defun inferior-octave-output-filter (proc string)
- "Standard output filter for the inferior Octave process.
-Ring Emacs bell if process output starts with an ASCII bell, and pass
-the rest to `comint-output-filter'."
- (comint-output-filter proc (inferior-octave-strip-ctrl-g string)))
-
-(defun inferior-octave-output-digest (_proc string)
- "Special output filter for the inferior Octave process.
-Save all output between newlines into `inferior-octave-output-list', and
-the rest to `inferior-octave-output-string'."
- (setq string (concat inferior-octave-output-string string))
- (while (string-match "\n" string)
- (setq inferior-octave-output-list
- (append inferior-octave-output-list
- (list (substring string 0 (match-beginning 0))))
- string (substring string (match-end 0))))
- (if (string-match inferior-octave-prompt string)
- (setq inferior-octave-receive-in-progress nil))
- (setq inferior-octave-output-string string))
-
-(defun inferior-octave-send-list-and-digest (list)
- "Send LIST to the inferior Octave process and digest the output.
-The elements of LIST have to be strings and are sent one by one. All
-output is passed to the filter `inferior-octave-output-digest'."
- (let* ((proc inferior-octave-process)
- (filter (process-filter proc))
- string)
- (set-process-filter proc 'inferior-octave-output-digest)
- (setq inferior-octave-output-list nil)
- (unwind-protect
- (while (setq string (car list))
- (setq inferior-octave-output-string nil
- inferior-octave-receive-in-progress t)
- (comint-send-string proc string)
- (while inferior-octave-receive-in-progress
- (accept-process-output proc))
- (setq list (cdr list)))
- (set-process-filter proc filter))))
-
-(defun inferior-octave-directory-tracker (string)
- "Tracks `cd' commands issued to the inferior Octave process.
-Use \\[inferior-octave-resync-dirs] to resync if Emacs gets confused."
- (cond
- ((string-match "^[ \t]*cd[ \t;]*$" string)
- (cd "~"))
- ((string-match "^[ \t]*cd[ \t]+\\([^ \t\n;]*\\)[ \t\n;]*" string)
- (cd (substring string (match-beginning 1) (match-end 1))))))
-
-(defun inferior-octave-resync-dirs ()
- "Resync the buffer's idea of the current directory.
-This command queries the inferior Octave process about its current
-directory and makes this the current buffer's default directory."
- (interactive)
- (inferior-octave-send-list-and-digest '("disp (pwd ())\n"))
- (cd (car inferior-octave-output-list)))
-
-;;; provide ourself
-
-(provide 'octave-inf)
-
-;;; octave-inf.el ends here
diff --git a/lisp/progmodes/octave-mod.el b/lisp/progmodes/octave.el
index 806afe5a537..640775bfe8b 100644
--- a/lisp/progmodes/octave-mod.el
+++ b/lisp/progmodes/octave.el
@@ -1,4 +1,4 @@
-;;; octave-mod.el --- editing Octave source files under Emacs
+;;; octave.el --- editing octave source files under emacs -*- lexical-binding: t; -*-
;; Copyright (C) 1997, 2001-2013 Free Software Foundation, Inc.
@@ -24,33 +24,23 @@
;;; Commentary:
-;; This package provides Emacs support for Octave.
-;; It defines Octave mode, a major mode for editing
-;; Octave code.
+;; This package provides emacs support for octave. It defines a major
+;; mode for editing octave code and contains code for interacting with
+;; an inferior octave process using comint.
-;; The file octave-inf.el contains code for interacting with an inferior
-;; Octave process using comint.
-
-;; See the documentation of `octave-mode' and
-;; `run-octave' for further information on usage and customization.
+;; See the documentation of `octave-mode' and `run-octave' for further
+;; information on usage and customization.
;;; Code:
-(require 'custom)
+(require 'comint)
(defgroup octave nil
- "Major mode for editing Octave source files."
+ "Editing Octave code."
:link '(custom-group-link :tag "Font Lock Faces group" font-lock-faces)
:group 'languages)
-(defvar inferior-octave-output-list nil)
-(defvar inferior-octave-output-string nil)
-(defvar inferior-octave-receive-in-progress nil)
-
-(declare-function inferior-octave-send-list-and-digest "octave-inf" (list))
-
-(defconst octave-maintainer-address
- "Kurt Hornik <Kurt.Hornik@wu-wien.ac.at>, bug-gnu-emacs@gnu.org"
- "Current maintainer of the Emacs Octave package.")
+(define-obsolete-function-alias 'octave-submit-bug-report
+ 'report-emacs-bug "24.4")
(define-abbrev-table 'octave-abbrev-table
(mapcar (lambda (e) (append e '(nil 0 t)))
@@ -84,7 +74,7 @@
("`upc" "unwind_protect_cleanup")
("`w" "while ()")))
"Abbrev table for Octave's reserved words.
-Used in `octave-mode' and inferior-octave-mode buffers.
+Used in `octave-mode' and `inferior-octave-mode' buffers.
All Octave abbrevs start with a grave accent (`)."
:regexp "\\(?:[^`]\\|^\\)\\(\\(?:\\<\\|`\\)\\w+\\)\\W*")
@@ -156,6 +146,7 @@ All Octave abbrevs start with a grave accent (`)."
The string `function' and its name are given by the first and third
parenthetical grouping.")
+
(defvar octave-font-lock-keywords
(list
;; Fontify all builtin keywords.
@@ -201,12 +192,6 @@ parenthetical grouping.")
(put-text-property (match-beginning 1) (match-end 1)
'syntax-table (string-to-syntax "\"'")))))
-(defcustom inferior-octave-buffer "*Inferior Octave*"
- "Name of buffer for running an inferior Octave process."
- :type 'string
- :group 'octave-inferior)
-
-(defvar inferior-octave-process nil)
(defvar octave-mode-map
(let ((map (make-sparse-keymap)))
@@ -223,22 +208,19 @@ parenthetical grouping.")
(define-key map "\C-c]" 'smie-close-block)
(define-key map "\C-c/" 'smie-close-block)
(define-key map "\C-c\C-f" 'octave-insert-defun)
- ;; FIXME: free C-h so it can do the describe-prefix-bindings.
- (define-key map "\C-c\C-h" 'info-lookup-symbol)
(define-key map "\C-c\C-il" 'octave-send-line)
(define-key map "\C-c\C-ib" 'octave-send-block)
(define-key map "\C-c\C-if" 'octave-send-defun)
(define-key map "\C-c\C-ir" 'octave-send-region)
(define-key map "\C-c\C-is" 'octave-show-process-buffer)
- (define-key map "\C-c\C-ih" 'octave-hide-process-buffer)
+ (define-key map "\C-c\C-iq" 'octave-hide-process-buffer)
(define-key map "\C-c\C-ik" 'octave-kill-process)
(define-key map "\C-c\C-i\C-l" 'octave-send-line)
(define-key map "\C-c\C-i\C-b" 'octave-send-block)
(define-key map "\C-c\C-i\C-f" 'octave-send-defun)
(define-key map "\C-c\C-i\C-r" 'octave-send-region)
(define-key map "\C-c\C-i\C-s" 'octave-show-process-buffer)
- ;; FIXME: free C-h so it can do the describe-prefix-bindings.
- (define-key map "\C-c\C-i\C-h" 'octave-hide-process-buffer)
+ (define-key map "\C-c\C-i\C-q" 'octave-hide-process-buffer)
(define-key map "\C-c\C-i\C-k" 'octave-kill-process)
map)
"Keymap used in Octave mode.")
@@ -347,12 +329,6 @@ newline or semicolon after an else or end keyword."
:type 'string
:group 'octave)
-(defvar octave-completion-alist nil
- "Alist of Octave symbols for completion in Octave mode.
-Each element looks like (VAR . VAR), where the car and cdr are the same
-symbol (an Octave command or variable name).
-Currently, only builtin variables can be completed.")
-
(defvar octave-mode-imenu-generic-expression
(list
;; Functions
@@ -485,6 +461,7 @@ Non-nil means always go to the next Octave code line after sending."
(forward-comment 1))
(cond
((and (looking-at "$\\|[%#]")
+ (not (smie-rule-bolp))
;; Ignore it if it's within parentheses.
(prog1 (let ((ppss (syntax-ppss)))
(not (and (nth 1 ppss)
@@ -607,72 +584,415 @@ including a reproducible test case and send the message."
(smie-setup octave-smie-grammar #'octave-smie-rules
:forward-token #'octave-smie-forward-token
:backward-token #'octave-smie-backward-token)
- (set (make-local-variable 'smie-indent-basic) 'octave-block-offset)
+ (setq-local smie-indent-basic 'octave-block-offset)
- (set (make-local-variable 'smie-blink-matching-triggers)
- (cons ?\; smie-blink-matching-triggers))
+ (setq-local smie-blink-matching-triggers
+ (cons ?\; smie-blink-matching-triggers))
(unless octave-blink-matching-block
(remove-hook 'post-self-insert-hook #'smie-blink-matching-open 'local))
- (set (make-local-variable 'electric-indent-chars)
- (cons ?\; electric-indent-chars))
+ (setq-local electric-indent-chars
+ (cons ?\; electric-indent-chars))
;; IIUC matlab-mode takes the opposite approach: it makes RET insert
;; a ";" at those places where it's correct (i.e. outside of parens).
- (set (make-local-variable 'electric-layout-rules) '((?\; . after)))
+ (setq-local electric-layout-rules '((?\; . after)))
- (set (make-local-variable 'comment-start) octave-comment-start)
- (set (make-local-variable 'comment-end) "")
+ (setq-local comment-start octave-comment-start)
+ (setq-local comment-end "")
;; Don't set it here: it's not really a property of the language,
;; just a personal preference of the author.
- ;; (set (make-local-variable 'comment-column) 32)
- (set (make-local-variable 'comment-start-skip) "\\s<+\\s-*")
- (set (make-local-variable 'comment-add) 1)
-
- (set (make-local-variable 'parse-sexp-ignore-comments) t)
- (set (make-local-variable 'paragraph-start)
- (concat "\\s-*$\\|" page-delimiter))
- (set (make-local-variable 'paragraph-separate) paragraph-start)
- (set (make-local-variable 'paragraph-ignore-fill-prefix) t)
- (set (make-local-variable 'fill-paragraph-function) 'octave-fill-paragraph)
+ ;; (setq-local comment-column 32)
+ (setq-local comment-start-skip "\\s<+\\s-*")
+ (setq-local comment-add 1)
+
+ (setq-local parse-sexp-ignore-comments t)
+ (setq-local paragraph-start (concat "\\s-*$\\|" page-delimiter))
+ (setq-local paragraph-separate paragraph-start)
+ (setq-local paragraph-ignore-fill-prefix t)
+ (setq-local fill-paragraph-function 'octave-fill-paragraph)
;; FIXME: Why disable it?
- ;; (set (make-local-variable 'adaptive-fill-regexp) nil)
+ ;; (setq-local adaptive-fill-regexp nil)
;; Again, this is not a property of the language, don't set it here.
- ;; (set (make-local-variable 'fill-column) 72)
- (set (make-local-variable 'normal-auto-fill-function) 'octave-auto-fill)
+ ;; (setq fill-column 72)
+ (setq-local normal-auto-fill-function 'octave-auto-fill)
- (set (make-local-variable 'font-lock-defaults)
- '(octave-font-lock-keywords))
+ (setq font-lock-defaults '(octave-font-lock-keywords))
- (set (make-local-variable 'syntax-propertize-function)
- #'octave-syntax-propertize-function)
+ (setq-local syntax-propertize-function #'octave-syntax-propertize-function)
- (set (make-local-variable 'imenu-generic-expression)
- octave-mode-imenu-generic-expression)
- (set (make-local-variable 'imenu-case-fold-search) nil)
+ (setq imenu-generic-expression octave-mode-imenu-generic-expression)
+ (setq imenu-case-fold-search nil)
(add-hook 'completion-at-point-functions
'octave-completion-at-point-function nil t)
- (set (make-local-variable 'beginning-of-defun-function)
- 'octave-beginning-of-defun)
+ (setq-local beginning-of-defun-function 'octave-beginning-of-defun)
+
+ (easy-menu-add octave-mode-menu))
+
+
+(defcustom inferior-octave-program "octave"
+ "Program invoked by `inferior-octave'."
+ :type 'string
+ :group 'octave)
+
+(defcustom inferior-octave-buffer "*Inferior Octave*"
+ "Name of buffer for running an inferior Octave process."
+ :type 'string
+ :group 'octave)
+
+(defcustom inferior-octave-prompt
+ "\\(^octave\\(\\|.bin\\|.exe\\)\\(-[.0-9]+\\)?\\(:[0-9]+\\)?\\|^debug\\|^\\)>+ "
+ "Regexp to match prompts for the inferior Octave process."
+ :type 'regexp
+ :group 'octave)
+
+(defcustom inferior-octave-startup-file nil
+ "Name of the inferior Octave startup file.
+The contents of this file are sent to the inferior Octave process on
+startup."
+ :type '(choice (const :tag "None" nil)
+ file)
+ :group 'octave)
+
+(defcustom inferior-octave-startup-args nil
+ "List of command line arguments for the inferior Octave process.
+For example, for suppressing the startup message and using `traditional'
+mode, set this to (\"-q\" \"--traditional\")."
+ :type '(repeat string)
+ :group 'octave)
+
+(defcustom inferior-octave-mode-hook nil
+ "Hook to be run when Inferior Octave mode is started."
+ :type 'hook
+ :group 'octave)
+
+(defvar inferior-octave-process nil)
+
+(defvar inferior-octave-mode-map
+ (let ((map (make-sparse-keymap)))
+ (set-keymap-parent map comint-mode-map)
+ (define-key map "\t" 'comint-dynamic-complete)
+ (define-key map "\M-?" 'comint-dynamic-list-filename-completions)
+ (define-key map "\C-c\C-l" 'inferior-octave-dynamic-list-input-ring)
+ (define-key map [menu-bar inout list-history]
+ '("List Input History" . inferior-octave-dynamic-list-input-ring))
+ map)
+ "Keymap used in Inferior Octave mode.")
+
+(defvar inferior-octave-mode-syntax-table
+ (let ((table (make-syntax-table octave-mode-syntax-table)))
+ table)
+ "Syntax table in use in inferior-octave-mode buffers.")
+
+(defvar inferior-octave-font-lock-keywords
+ (list
+ (cons inferior-octave-prompt 'font-lock-type-face))
+ ;; Could certainly do more font locking in inferior Octave ...
+ "Additional expressions to highlight in Inferior Octave mode.")
+
+
+;;; Compatibility functions
+(if (not (fboundp 'comint-line-beginning-position))
+ ;; comint-line-beginning-position is defined in Emacs 21
+ (defun comint-line-beginning-position ()
+ "Returns the buffer position of the beginning of the line, after any prompt.
+The prompt is assumed to be any text at the beginning of the line matching
+the regular expression `comint-prompt-regexp', a buffer local variable."
+ (save-excursion (comint-bol nil) (point))))
+
+
+(defvar inferior-octave-output-list nil)
+(defvar inferior-octave-output-string nil)
+(defvar inferior-octave-receive-in-progress nil)
+
+(defvar inferior-octave-startup-hook nil)
+
+(defvar inferior-octave-complete-impossible nil
+ "Non-nil means that `inferior-octave-complete' is impossible.")
+
+(defvar inferior-octave-has-built-in-variables nil
+ "Non-nil means that Octave has built-in variables.")
+
+(defvar inferior-octave-dynamic-complete-functions
+ '(inferior-octave-completion-at-point comint-filename-completion)
+ "List of functions called to perform completion for inferior Octave.
+This variable is used to initialize `comint-dynamic-complete-functions'
+in the Inferior Octave buffer.")
+
+(defvar info-lookup-mode)
+
+(define-derived-mode inferior-octave-mode comint-mode "Inferior Octave"
+ "Major mode for interacting with an inferior Octave process.
+Runs Octave as a subprocess of Emacs, with Octave I/O through an Emacs
+buffer.
+
+Entry to this mode successively runs the hooks `comint-mode-hook' and
+`inferior-octave-mode-hook'."
+ (setq comint-prompt-regexp inferior-octave-prompt
+ mode-line-process '(":%s")
+ local-abbrev-table octave-abbrev-table)
+
+ (setq-local comment-start octave-comment-start)
+ (setq-local comment-end "")
+ (setq comment-column 32)
+ (setq-local comment-start-skip octave-comment-start-skip)
+
+ (setq font-lock-defaults '(inferior-octave-font-lock-keywords nil nil))
+
+ (setq info-lookup-mode 'octave-mode)
+
+ (setq comint-input-ring-file-name
+ (or (getenv "OCTAVE_HISTFILE") "~/.octave_hist")
+ comint-input-ring-size (or (getenv "OCTAVE_HISTSIZE") 1024))
+ (setq-local comint-dynamic-complete-functions
+ inferior-octave-dynamic-complete-functions)
+ (add-hook 'comint-input-filter-functions
+ 'inferior-octave-directory-tracker nil t)
+ (comint-read-input-ring t))
+
+;;;###autoload
+(defun inferior-octave (&optional arg)
+ "Run an inferior Octave process, I/O via `inferior-octave-buffer'.
+This buffer is put in Inferior Octave mode. See `inferior-octave-mode'.
+
+Unless ARG is non-nil, switches to this buffer.
+
+The elements of the list `inferior-octave-startup-args' are sent as
+command line arguments to the inferior Octave process on startup.
+
+Additional commands to be executed on startup can be provided either in
+the file specified by `inferior-octave-startup-file' or by the default
+startup file, `~/.emacs-octave'."
+ (interactive "P")
+ (let ((buffer inferior-octave-buffer))
+ (get-buffer-create buffer)
+ (if (comint-check-proc buffer)
+ ()
+ (with-current-buffer buffer
+ (comint-mode)
+ (inferior-octave-startup)
+ (inferior-octave-mode)))
+ (if (not arg)
+ (pop-to-buffer buffer))))
+
+;;;###autoload
+(defalias 'run-octave 'inferior-octave)
+
+(defun inferior-octave-startup ()
+ "Start an inferior Octave process."
+ (let ((proc (comint-exec-1
+ (substring inferior-octave-buffer 1 -1)
+ inferior-octave-buffer
+ inferior-octave-program
+ (append (list "-i" "--no-line-editing")
+ inferior-octave-startup-args))))
+ (set-process-filter proc 'inferior-octave-output-digest)
+ (setq comint-ptyp process-connection-type
+ inferior-octave-process proc
+ inferior-octave-output-list nil
+ inferior-octave-output-string nil
+ inferior-octave-receive-in-progress t)
+
+ ;; This may look complicated ... However, we need to make sure that
+ ;; we additional startup code only AFTER Octave is ready (otherwise,
+ ;; output may be mixed up). Hence, we need to digest the Octave
+ ;; output to see when it issues a prompt.
+ (while inferior-octave-receive-in-progress
+ (accept-process-output inferior-octave-process))
+ (goto-char (point-max))
+ (set-marker (process-mark proc) (point))
+ (insert-before-markers
+ (concat
+ (if (not (bobp)) " \n")
+ (if inferior-octave-output-list
+ (concat (mapconcat
+ 'identity inferior-octave-output-list "\n")
+ "\n"))))
+
+ ;; Find out whether Octave has built-in variables.
+ (inferior-octave-send-list-and-digest
+ (list "exist \"LOADPATH\"\n"))
+ (setq inferior-octave-has-built-in-variables
+ (string-match "101$" (car inferior-octave-output-list)))
+
+ ;; An empty secondary prompt, as e.g. obtained by '--braindead',
+ ;; means trouble.
+ (inferior-octave-send-list-and-digest (list "PS2\n"))
+ (if (string-match "\\(PS2\\|ans\\) = *$" (car inferior-octave-output-list))
+ (inferior-octave-send-list-and-digest
+ (list (if inferior-octave-has-built-in-variables
+ "PS2 = \"> \"\n"
+ "PS2 (\"> \");\n"))))
+
+ ;; O.k., now we are ready for the Inferior Octave startup commands.
+ (let* (commands
+ (program (file-name-nondirectory inferior-octave-program))
+ (file (or inferior-octave-startup-file
+ (concat "~/.emacs-" program))))
+ (setq commands
+ (list "more off;\n"
+ (if (not (string-equal
+ inferior-octave-output-string ">> "))
+ (if inferior-octave-has-built-in-variables
+ "PS1=\"\\\\s> \";\n"
+ "PS1 (\"\\\\s> \");\n"))
+ (if (file-exists-p file)
+ (format "source (\"%s\");\n" file))))
+ (inferior-octave-send-list-and-digest commands))
+ (insert-before-markers
+ (concat
+ (if inferior-octave-output-list
+ (concat (mapconcat
+ 'identity inferior-octave-output-list "\n")
+ "\n"))
+ inferior-octave-output-string))
+ ;; Next, we check whether Octave supports `completion_matches' ...
+ (inferior-octave-send-list-and-digest
+ (list "exist \"completion_matches\"\n"))
+ (setq inferior-octave-complete-impossible
+ (not (string-match "5$" (car inferior-octave-output-list))))
+
+ ;; And finally, everything is back to normal.
+ (set-process-filter proc 'inferior-octave-output-filter)
+ (run-hooks 'inferior-octave-startup-hook)
+ (run-hooks 'inferior-octave-startup-hook)
+ ;; Just in case, to be sure a cd in the startup file
+ ;; won't have detrimental effects.
+ (inferior-octave-resync-dirs)))
+
+(defun inferior-octave-completion-table ()
+ (unless inferior-octave-complete-impossible
+ (completion-table-dynamic
+ (lambda (command)
+ (inferior-octave-send-list-and-digest
+ (list (concat "completion_matches (\"" command "\");\n")))
+ (sort (delete-dups inferior-octave-output-list)
+ 'string-lessp)))))
+
+(defun inferior-octave-completion-at-point ()
+ "Return the data to complete the Octave symbol at point."
+ (let* ((end (point))
+ (start
+ (save-excursion
+ (skip-syntax-backward "w_" (comint-line-beginning-position))
+ (point))))
+ (cond ((eq start end) nil)
+ (inferior-octave-complete-impossible
+ (message (concat
+ "Your Octave does not have `completion_matches'. "
+ "Please upgrade to version 2.X."))
+ nil)
+ (t (list start end (inferior-octave-completion-table))))))
+
+(define-obsolete-function-alias 'inferior-octave-complete
+ 'completion-at-point "24.1")
+
+(defun inferior-octave-dynamic-list-input-ring ()
+ "List the buffer's input history in a help buffer."
+ ;; We cannot use `comint-dynamic-list-input-ring', because it replaces
+ ;; "completion" by "history reference" ...
+ (interactive)
+ (if (or (not (ring-p comint-input-ring))
+ (ring-empty-p comint-input-ring))
+ (message "No history")
+ (let ((history nil)
+ (history-buffer " *Input History*")
+ (index (1- (ring-length comint-input-ring)))
+ (conf (current-window-configuration)))
+ ;; We have to build up a list ourselves from the ring vector.
+ (while (>= index 0)
+ (setq history (cons (ring-ref comint-input-ring index) history)
+ index (1- index)))
+ ;; Change "completion" to "history reference"
+ ;; to make the display accurate.
+ (with-output-to-temp-buffer history-buffer
+ (display-completion-list history)
+ (set-buffer history-buffer))
+ (message "Hit space to flush")
+ (let ((ch (read-event)))
+ (if (eq ch ?\ )
+ (set-window-configuration conf)
+ (setq unread-command-events (list ch)))))))
+
+(defun inferior-octave-strip-ctrl-g (string)
+ "Strip leading `^G' character.
+If STRING starts with a `^G', ring the bell and strip it."
+ (if (string-match "^\a" string)
+ (progn
+ (ding)
+ (setq string (substring string 1))))
+ string)
+
+(defun inferior-octave-output-filter (proc string)
+ "Standard output filter for the inferior Octave process.
+Ring Emacs bell if process output starts with an ASCII bell, and pass
+the rest to `comint-output-filter'."
+ (comint-output-filter proc (inferior-octave-strip-ctrl-g string)))
+
+(defun inferior-octave-output-digest (_proc string)
+ "Special output filter for the inferior Octave process.
+Save all output between newlines into `inferior-octave-output-list', and
+the rest to `inferior-octave-output-string'."
+ (setq string (concat inferior-octave-output-string string))
+ (while (string-match "\n" string)
+ (setq inferior-octave-output-list
+ (append inferior-octave-output-list
+ (list (substring string 0 (match-beginning 0))))
+ string (substring string (match-end 0))))
+ (if (string-match inferior-octave-prompt string)
+ (setq inferior-octave-receive-in-progress nil))
+ (setq inferior-octave-output-string string))
+
+(defun inferior-octave-send-list-and-digest (list)
+ "Send LIST to the inferior Octave process and digest the output.
+The elements of LIST have to be strings and are sent one by one. All
+output is passed to the filter `inferior-octave-output-digest'."
+ (let* ((proc inferior-octave-process)
+ (filter (process-filter proc))
+ string)
+ (set-process-filter proc 'inferior-octave-output-digest)
+ (setq inferior-octave-output-list nil)
+ (unwind-protect
+ (while (setq string (car list))
+ (setq inferior-octave-output-string nil
+ inferior-octave-receive-in-progress t)
+ (comint-send-string proc string)
+ (while inferior-octave-receive-in-progress
+ (accept-process-output proc))
+ (setq list (cdr list)))
+ (set-process-filter proc filter))))
+
+(defun inferior-octave-directory-tracker (string)
+ "Tracks `cd' commands issued to the inferior Octave process.
+Use \\[inferior-octave-resync-dirs] to resync if Emacs gets confused."
+ (cond
+ ((string-match "^[ \t]*cd[ \t;]*$" string)
+ (cd "~"))
+ ((string-match "^[ \t]*cd[ \t]+\\([^ \t\n;]*\\)[ \t\n;]*" string)
+ (cd (substring string (match-beginning 1) (match-end 1))))))
+
+(defun inferior-octave-resync-dirs ()
+ "Resync the buffer's idea of the current directory.
+This command queries the inferior Octave process about its current
+directory and makes this the current buffer's default directory."
+ (interactive)
+ (inferior-octave-send-list-and-digest '("disp (pwd ())\n"))
+ (cd (car inferior-octave-output-list)))
- (easy-menu-add octave-mode-menu)
- (octave-initialize-completions))
;;; Miscellaneous useful functions
-(defsubst octave-in-comment-p ()
- "Return t if point is inside an Octave comment."
+(defun octave-in-comment-p ()
+ "Return non-nil if point is inside an Octave comment."
(nth 4 (syntax-ppss)))
-(defsubst octave-in-string-p ()
- "Return t if point is inside an Octave string."
+(defun octave-in-string-p ()
+ "Return non-nil if point is inside an Octave string."
(nth 3 (syntax-ppss)))
-(defsubst octave-not-in-string-or-comment-p ()
- "Return t if point is not inside an Octave string or comment."
- (let ((pps (syntax-ppss)))
- (not (or (nth 3 pps) (nth 4 pps)))))
-
+(defun octave-in-string-or-comment-p ()
+ "Return non-nil if point is inside an Octave string or comment."
+ (nth 8 (syntax-ppss)))
(defun octave-looking-at-kw (regexp)
"Like `looking-at', but sets `case-fold-search' nil."
@@ -820,8 +1140,8 @@ Returns t unless search stops at the beginning or end of the buffer."
(while (and (/= arg 0)
(setq found
(re-search-backward "\\_<function\\_>" inc)))
- (if (octave-not-in-string-or-comment-p)
- (setq arg (- arg inc))))
+ (unless (octave-in-string-or-comment-p)
+ (setq arg (- arg inc))))
(if found
(progn
(and (< inc 0) (goto-char (match-beginning 0)))
@@ -961,14 +1281,6 @@ otherwise."
;;; Completions
-(defun octave-initialize-completions ()
- "Create an alist for Octave completions."
- (if octave-completion-alist
- ()
- (setq octave-completion-alist
- (append octave-reserved-words
- octave-text-functions
- octave-variables))))
(defun octave-completion-at-point-function ()
"Find the text to complete and the corresponding table."
@@ -978,7 +1290,12 @@ otherwise."
;; Extend region past point, if applicable.
(save-excursion (skip-syntax-forward "w_")
(setq end (point))))
- (list beg end octave-completion-alist)))
+ (list beg end (or (and inferior-octave-process
+ (process-live-p inferior-octave-process)
+ (inferior-octave-completion-table))
+ (append octave-reserved-words
+ octave-text-functions
+ octave-variables)))))
(define-obsolete-function-alias 'octave-complete-symbol
'completion-at-point "24.1")
@@ -1004,7 +1321,7 @@ Note that all Octave mode abbrevs start with a grave accent."
"Insert an Octave function skeleton.
Prompt for the function's name, arguments and return values (to be
entered without parens)."
- (let* ((defname (substring (buffer-name) 0 -2))
+ (let* ((defname (file-name-sans-extension (buffer-name)))
(name (read-string (format "Function name (default %s): " defname)
nil nil defname))
(args (read-string "Arguments: "))
@@ -1124,29 +1441,7 @@ code line."
"\n")))
(mapconcat 'identity inferior-octave-output-list "\n")))
(terpri)))
-
-;;; Bug reporting
-(defun octave-submit-bug-report ()
- "Submit a bug report on the Emacs Octave package via mail."
- (interactive)
- (require 'reporter)
- (and
- (y-or-n-p "Do you want to submit a bug report? ")
- (reporter-submit-bug-report
- octave-maintainer-address
- (concat "Emacs version " emacs-version)
- (list
- 'octave-blink-matching-block
- 'octave-block-offset
- 'octave-comment-char
- 'octave-continuation-offset
- 'octave-continuation-string
- 'octave-send-echo-input
- 'octave-send-line-auto-forward
- 'octave-send-show-buffer))))
-
-;; provide ourself
-
-(provide 'octave-mod)
-
-;;; octave-mod.el ends here
+
+
+(provide 'octave)
+;;; octave.el ends here
diff --git a/lisp/progmodes/opascal.el b/lisp/progmodes/opascal.el
new file mode 100644
index 00000000000..e608ea8af0e
--- /dev/null
+++ b/lisp/progmodes/opascal.el
@@ -0,0 +1,1787 @@
+;;; opascal.el --- major mode for editing Object Pascal source in Emacs -*- lexical-binding: t -*-
+
+;; Copyright (C) 1998-1999, 2001-2013 Free Software Foundation, Inc.
+
+;; Authors: Ray Blaak <blaak@infomatch.com>,
+;; Simon South <ssouth@member.fsf.org>
+;; Maintainer: Simon South <ssouth@member.fsf.org>
+;; Keywords: languages
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; To enter OPascal mode when you find an Object Pascal source file, one must
+;; override the auto-mode-alist to associate OPascal with .pas (and .dpr and
+;; .dpk) files. Emacs, by default, will otherwise enter Pascal mode. E.g.
+;;
+;; (autoload 'opascal-mode "opascal")
+;; (add-to-list 'auto-mode-alist
+;; '("\\.\\(pas\\|dpr\\|dpk\\)\\'" . opascal-mode))
+
+;; When you have entered OPascal mode, you may get more info by pressing
+;; C-h m.
+
+;; This OPascal mode implementation is fairly tolerant of syntax errors,
+;; relying as much as possible on the indentation of the previous statement.
+;; This also makes it faster and simpler, since there is less searching for
+;; properly constructed beginnings.
+
+;;; Code:
+
+(defgroup opascal nil
+ "Major mode for editing OPascal source in Emacs."
+ :version "24.4"
+ :group 'languages)
+
+(defconst opascal-debug nil
+ "True if in debug mode.")
+
+(define-obsolete-variable-alias
+ 'delphi-search-path 'opascal-search-path "24.4")
+(defcustom opascal-search-path "."
+ "Directories to search when finding external units.
+It is a list of directory strings. If only a single directory,
+it can be a single string instead of a list. If a directory
+ends in \"...\" then that directory is recursively searched."
+ :type 'string)
+
+(define-obsolete-variable-alias
+ 'delphi-indent-level 'opascal-indent-level "24.4")
+(defcustom opascal-indent-level 3
+ "Indentation of OPascal statements with respect to containing block.
+E.g.
+
+begin
+ // This is an indent of 3.
+end;"
+ :type 'integer)
+
+(define-obsolete-variable-alias
+ 'delphi-compound-block-indent 'opascal-compound-block-indent "24.4")
+(defcustom opascal-compound-block-indent 0
+ "Extra indentation for blocks in compound statements. E.g.
+
+// block indent = 0 vs // block indent = 2
+if b then if b then
+begin begin
+end else begin end
+end; else
+ begin
+ end;"
+ :type 'integer)
+
+(define-obsolete-variable-alias
+ 'delphi-case-label-indent 'opascal-case-label-indent "24.4")
+(defcustom opascal-case-label-indent opascal-indent-level
+ "Extra indentation for case statement labels. E.g.
+
+// case indent = 0 vs // case indent = 3
+case value of case value of
+v1: process_v1; v1: process_v1;
+v2: process_v2; v2: process_v2;
+else else
+ process_else; process_else;
+end; end;"
+ :type 'integer)
+
+(define-obsolete-variable-alias 'delphi-verbose 'opascal-verbose "24.4")
+(defcustom opascal-verbose t ; nil
+ "If true then OPascal token processing progress is reported to the user."
+ :type 'boolean)
+
+(define-obsolete-variable-alias
+ 'delphi-tab-always-indents 'opascal-tab-always-indents "24.4")
+(defcustom opascal-tab-always-indents tab-always-indent
+ "Non-nil means TAB in OPascal mode should always reindent the current line,
+regardless of where in the line point is when the TAB command is used."
+ :type 'boolean)
+
+(defconst opascal-directives
+ '(absolute abstract assembler automated cdecl default dispid dynamic
+ export external far forward index inline message name near nodefault
+ overload override pascal private protected public published read readonly
+ register reintroduce resident resourcestring safecall stdcall stored
+ virtual write writeonly)
+ "OPascal4 directives.")
+
+(defconst opascal-keywords
+ (append
+ '(;; Keywords.
+ and array as asm at begin case class const constructor contains
+ destructor dispinterface div do downto else end except exports
+ file finalization finally for function goto if implementation implements
+ in inherited initialization interface is label library mod nil not
+ of object on or out package packed procedure program property
+ raise record repeat requires result self set shl shr then threadvar
+ to try type unit uses until var while with xor
+
+ ;; These routines should be keywords, if Borland had the balls.
+ break exit)
+
+ ;; We want directives to look like keywords.
+ opascal-directives)
+ "OPascal4 keywords.")
+
+(defconst opascal-previous-terminators `(semicolon comma)
+ "Expression/statement terminators that denote a previous expression.")
+
+(defconst opascal-comments
+ '(comment-single-line comment-multi-line-1 comment-multi-line-2)
+ "Tokens that represent comments.")
+
+(defconst opascal-strings
+ '(string double-quoted-string)
+ "Tokens that represent string literals.")
+
+(defconst opascal-whitespace `(space newline ,@opascal-comments)
+ "Tokens that are considered whitespace.")
+
+(defconst opascal-routine-statements
+ '(procedure function constructor destructor property)
+ "Marks the start of a routine, or routine-ish looking expression.")
+
+(defconst opascal-body-expr-statements '(if while for on)
+ "Statements that have either a single statement or a block as a body and also
+are followed by an expression.")
+
+(defconst opascal-expr-statements `(case ,@opascal-body-expr-statements)
+ "Expression statements contain expressions after their keyword.")
+
+(defconst opascal-body-statements `(else ,@opascal-body-expr-statements)
+ "Statements that have either a single statement or a block as a body.")
+
+(defconst opascal-expr-delimiters '(then do of)
+ "Expression delimiter tokens.")
+
+(defconst opascal-binary-ops
+ '(plus minus equals not-equals times divides div mod and or xor)
+ "OPascal binary operations.")
+
+(defconst opascal-visibilities '(public private protected published automated)
+ "Class visibilities.")
+
+(defconst opascal-block-statements
+ '(begin try case repeat initialization finalization asm)
+ "Statements that contain multiple substatements.")
+
+(defconst opascal-mid-block-statements
+ `(except finally ,@opascal-visibilities)
+ "Statements that mark mid sections of the enclosing block.")
+
+(defconst opascal-end-block-statements `(end until)
+ "Statements that end block sections.")
+
+(defconst opascal-match-block-statements
+ `(,@opascal-end-block-statements ,@opascal-mid-block-statements)
+ "Statements that match the indentation of the parent block.")
+
+(defconst opascal-decl-sections '(type const var label resourcestring)
+ "Denotes the start of a declaration section.")
+
+(defconst opascal-interface-types '(dispinterface interface)
+ "Interface types.")
+
+(defconst opascal-class-types '(class object)
+ "Class types.")
+
+(defconst opascal-composite-types
+ `(,@opascal-class-types ,@opascal-interface-types record)
+ "Types that contain declarations within them.")
+
+(defconst opascal-unit-sections
+ '(interface implementation program library package)
+ "Unit sections within which the indent is 0.")
+
+(defconst opascal-use-clauses `(uses requires exports contains)
+ "Statements that refer to foreign symbols.")
+
+(defconst opascal-unit-statements
+ `(,@opascal-use-clauses ,@opascal-unit-sections initialization finalization)
+ "Statements indented at level 0.")
+
+(defconst opascal-decl-delimiters
+ `(,@opascal-decl-sections ,@opascal-unit-statements
+ ,@opascal-routine-statements)
+ "Statements that a declaration statement should align with.")
+
+(defconst opascal-decl-matchers
+ `(begin ,@opascal-decl-sections)
+ "Statements that should match to declaration statement indentation.")
+
+(defconst opascal-enclosing-statements
+ `(,@opascal-block-statements ,@opascal-mid-block-statements
+ ,@opascal-decl-sections ,@opascal-use-clauses ,@opascal-routine-statements)
+ "Delimits an enclosing statement.")
+
+(defconst opascal-previous-statements
+ `(,@opascal-unit-statements ,@opascal-routine-statements)
+ "Delimits a previous statement.")
+
+(defconst opascal-previous-enclosing-statements
+ `(,@opascal-block-statements ,@opascal-mid-block-statements
+ ,@opascal-decl-sections)
+ "Delimits a previous enclosing statement.")
+
+(defconst opascal-begin-enclosing-tokens
+ `(,@opascal-block-statements ,@opascal-mid-block-statements)
+ "Tokens that a begin token indents from.")
+
+(defconst opascal-begin-previous-tokens
+ `(,@opascal-decl-sections ,@opascal-routine-statements)
+ "Tokens that a begin token aligns with, but only if not part of a nested
+routine.")
+
+(defconst opascal-space-chars "\000-\011\013- ") ; all except \n
+(defconst opascal-non-space-chars (concat "^" opascal-space-chars))
+(defconst opascal-spaces-re (concat "[" opascal-space-chars "]*"))
+(defconst opascal-leading-spaces-re (concat "^" opascal-spaces-re))
+(defconst opascal-word-chars "a-zA-Z0-9_")
+
+(defvar opascal-mode-syntax-table
+ (let ((st (make-syntax-table)))
+ ;; Strings.
+ (modify-syntax-entry ?\" "\"" st)
+ (modify-syntax-entry ?\' "\"" st)
+ ;; Comments.
+ (modify-syntax-entry ?\{ "<" st)
+ (modify-syntax-entry ?\} ">" st)
+ (modify-syntax-entry ?\( "()1" st)
+ (modify-syntax-entry ?\) ")(4" st)
+ (modify-syntax-entry ?* ". 23b" st)
+ (modify-syntax-entry ?/ ". 12c" st)
+ (modify-syntax-entry ?\n "> c" st)
+ st))
+
+(defmacro opascal-save-excursion (&rest forms)
+ ;; Executes the forms such that any movements have no effect, including
+ ;; searches.
+ `(save-excursion
+ (save-match-data
+ (let ((inhibit-point-motion-hooks t)
+ (deactivate-mark nil))
+ (progn ,@forms)))))
+
+(defsubst opascal-is (element in-set)
+ ;; If the element is in the set, the element cdr is returned, otherwise nil.
+ (memq element in-set))
+
+(defun opascal-string-of (start end)
+ ;; Returns the buffer string from start to end.
+ (buffer-substring-no-properties start end))
+
+(defun opascal-looking-at-string (p s)
+ ;; True if point p marks the start of string s. s is not a regular
+ ;; expression.
+ (let ((limit (+ p (length s))))
+ (and (<= limit (point-max))
+ (string= s (opascal-string-of p limit)))))
+
+(defun opascal-token-of (kind start end)
+ ;; Constructs a token from a kind symbol and its start/end points.
+ `[,kind ,start ,end])
+
+(defsubst opascal-token-kind (token)
+ ;; Returns the kind symbol of the token.
+ (if token (aref token 0) nil))
+
+(defun opascal-set-token-kind (token to-kind)
+ ;; Sets the kind symbol of the token.
+ (if token (aset token 0 to-kind)))
+
+(defsubst opascal-token-start (token)
+ ;; Returns the start point of the token.
+ (if token (aref token 1) (point-min)))
+
+(defsubst opascal-token-end (token)
+ ;; Returns the end point of the token.
+ (if token (aref token 2) (point-min)))
+
+(defun opascal-set-token-start (token start)
+ ;; Sets the start point of the token.
+ (if token (aset token 1 start)))
+
+(defun opascal-set-token-end (token end)
+ ;; Sets the end point of the token.
+ (if token (aset token 2 end)))
+
+(defun opascal-token-string (token)
+ ;; Returns the string image of the token.
+ (if token
+ (opascal-string-of (opascal-token-start token) (opascal-token-end token))
+ ""))
+
+(defun opascal-in-token (p token)
+ ;; Returns true if the point p is within the token's start/end points.
+ (and (<= (opascal-token-start token) p) (< p (opascal-token-end token))))
+
+(defun opascal-column-of (p)
+ ;; Returns the column of the point p.
+ (save-excursion (goto-char p) (current-column)))
+
+(defvar opascal-progress-last-reported-point nil
+ "The last point at which progress was reported.")
+
+(defconst opascal-parsing-progress-step 16384
+ "Number of chars to process before the next parsing progress report.")
+(defconst opascal-scanning-progress-step 2048
+ "Number of chars to process before the next scanning progress report.")
+
+(defun opascal-progress-start ()
+ ;; Initializes progress reporting.
+ (setq opascal-progress-last-reported-point nil))
+
+(defun opascal-progress-done (&rest msgs)
+ ;; Finalizes progress reporting.
+ (setq opascal-progress-last-reported-point nil)
+ (when opascal-verbose
+ (if (null msgs)
+ (message "")
+ (apply #'message msgs))))
+
+(defun opascal-step-progress (p desc step-size)
+ ;; If enough distance has elapsed since the last reported point, then report
+ ;; the current progress to the user.
+ (cond ((null opascal-progress-last-reported-point)
+ ;; This is the first progress step.
+ (setq opascal-progress-last-reported-point p))
+
+ ((and opascal-verbose
+ (>= (abs (- p opascal-progress-last-reported-point)) step-size))
+ ;; Report the percentage complete.
+ (setq opascal-progress-last-reported-point p)
+ (message "%s %s ... %d%%"
+ desc (buffer-name) (/ (* 100 p) (point-max))))))
+
+(defun opascal-next-line-start (&optional from-point)
+ ;; Returns the first point of the next line.
+ (let ((curr-point (point))
+ (next nil))
+ (if from-point (goto-char from-point))
+ (end-of-line)
+ (setq next (min (1+ (point)) (point-max)))
+ (goto-char curr-point)
+ next))
+
+(defconst opascal--literal-start-re (regexp-opt '("//" "{" "(*" "'" "\"")))
+
+(defun opascal-literal-kind (p)
+ ;; Returns the literal kind the point p is in (or nil if not in a literal).
+ (when (and (<= (point-min) p) (<= p (point-max)))
+ (save-excursion
+ (let ((ppss (syntax-ppss p)))
+ ;; We want to return non-nil when right in front
+ ;; of a comment/string.
+ (if (null (nth 8 ppss))
+ (when (looking-at opascal--literal-start-re)
+ (pcase (char-after)
+ (`?/ 'comment-single-line)
+ (`?\{ 'comment-multi-line-1)
+ (`?\( 'comment-multi-line-2)
+ (`?\' 'string)
+ (`?\" 'double-quoted-string)))
+ (if (nth 3 ppss) ;String.
+ (if (eq (nth 3 ppss) ?\")
+ 'double-quoted-string 'string)
+ (pcase (nth 7 ppss)
+ (`2 'comment-single-line)
+ (`1 'comment-multi-line-2)
+ (_ 'comment-multi-line-1))))))))
+
+(defun opascal-literal-start-pattern (literal-kind)
+ ;; Returns the start pattern of the literal kind.
+ (cdr (assoc literal-kind
+ '((comment-single-line . "//")
+ (comment-multi-line-1 . "{")
+ (comment-multi-line-2 . "(*")
+ (string . "'")
+ (double-quoted-string . "\"")))))
+
+(defun opascal-literal-end-pattern (literal-kind)
+ ;; Returns the end pattern of the literal kind.
+ (cdr (assoc literal-kind
+ '((comment-single-line . "\n")
+ (comment-multi-line-1 . "}")
+ (comment-multi-line-2 . "*)")
+ (string . "'")
+ (double-quoted-string . "\"")))))
+
+(defun opascal-literal-stop-pattern (literal-kind)
+ ;; Returns the pattern that delimits end of the search for the literal kind.
+ ;; These are regular expressions.
+ (cdr (assoc literal-kind
+ '((comment-single-line . "\n")
+ (comment-multi-line-1 . "}")
+ (comment-multi-line-2 . "\\*)")
+ ;; Strings cannot span lines.
+ (string . "['\n]")
+ (double-quoted-string . "[\"\n]")))))
+
+(defun opascal-is-literal-end (p)
+ ;; True if the point p is at the end point of a (completed) literal.
+ (save-excursion
+ (and (null (nth 8 (syntax-ppss p)))
+ (nth 8 (syntax-ppss (1- p))))))
+
+(defun opascal-literal-token-at (p)
+ "Return the literal token surrounding the point P, or nil if none."
+ (save-excursion
+ (let ((ppss (syntax-ppss p)))
+ (when (or (nth 8 ppss) (looking-at opascal--literal-start-re))
+ (let* ((new-start (or (nth 8 ppss) p))
+ (new-end (progn
+ (goto-char new-start)
+ (condition-case nil
+ (if (memq (char-after) '(?\' ?\"))
+ (forward-sexp 1)
+ (forward-comment 1))
+ (scan-error (goto-char (point-max))))
+ (point))))
+ (opascal-token-of (opascal-literal-kind p) new-start new-end))))))
+
+(defun opascal-point-token-at (p kind)
+ ;; Returns the single character token at the point p.
+ (opascal-token-of kind p (1+ p)))
+
+(defsubst opascal-char-token-at (p char kind)
+ ;; Returns the token at the point p that describes the specified character.
+ ;; If not actually over such a character, nil is returned.
+ (when (eq char (char-after p))
+ (opascal-token-of kind p (1+ p))))
+
+(defun opascal-charset-token-at (p charset kind)
+ ;; Returns the token surrounding point p that contains only members of the
+ ;; character set.
+ (let ((currp (point))
+ (end nil)
+ (token nil))
+ (goto-char p)
+ (when (> (skip-chars-forward charset) 0)
+ (setq end (point))
+ (goto-char (1+ p))
+ (skip-chars-backward charset)
+ (setq token (opascal-token-of kind (point) end)))
+ (goto-char currp)
+ token))
+
+(defun opascal-space-token-at (p)
+ ;; If point p is surrounded by space characters, then return the token of the
+ ;; contiguous spaces.
+ (opascal-charset-token-at p opascal-space-chars 'space))
+
+(defun opascal-word-token-at (p)
+ ;; If point p is over a word (i.e. identifier characters), then return a word
+ ;; token. If the word is actually a keyword, then return the keyword token.
+ (let ((word (opascal-charset-token-at p opascal-word-chars 'word)))
+ (when word
+ (let* ((word-image (downcase (opascal-token-string word)))
+ (keyword (intern-soft word-image)))
+ (when (and (or keyword (string= "nil" word-image))
+ (opascal-is keyword opascal-keywords))
+ (opascal-set-token-kind word keyword))
+ word))))
+
+(defun opascal-explicit-token-at (p token-string kind)
+ ;; If point p is anywhere in the token string then returns the resulting
+ ;; token.
+ (let ((token (opascal-charset-token-at p token-string kind)))
+ (when (and token (string= token-string (opascal-token-string token)))
+ token)))
+
+(defun opascal-token-at (p)
+ ;; Returns the token from parsing text at point p.
+ (when (and (<= (point-min) p) (<= p (point-max)))
+ (cond ((opascal-char-token-at p ?\n 'newline))
+
+ ((opascal-literal-token-at p))
+
+ ((opascal-space-token-at p))
+
+ ((opascal-word-token-at p))
+
+ ((opascal-char-token-at p ?\( 'open-group))
+ ((opascal-char-token-at p ?\) 'close-group))
+ ((opascal-char-token-at p ?\[ 'open-group))
+ ((opascal-char-token-at p ?\] 'close-group))
+ ((opascal-char-token-at p ?\; 'semicolon))
+ ((opascal-char-token-at p ?. 'dot))
+ ((opascal-char-token-at p ?, 'comma))
+ ((opascal-char-token-at p ?= 'equals))
+ ((opascal-char-token-at p ?+ 'plus))
+ ((opascal-char-token-at p ?- 'minus))
+ ((opascal-char-token-at p ?* 'times))
+ ((opascal-char-token-at p ?/ 'divides))
+ ((opascal-char-token-at p ?: 'colon))
+
+ ((opascal-explicit-token-at p "<>" 'not-equals))
+
+ ((opascal-point-token-at p 'punctuation)))))
+
+(defun opascal-current-token ()
+ ;; Returns the opascal source token under the current point.
+ (opascal-token-at (point)))
+
+(defun opascal-next-token (token)
+ ;; Returns the token after the specified token.
+ (when token
+ (let ((next (opascal-token-at (opascal-token-end token))))
+ (if next
+ (opascal-step-progress (opascal-token-start next) "Scanning"
+ opascal-scanning-progress-step))
+ next)))
+
+(defun opascal-previous-token (token)
+ ;; Returns the token before the specified token.
+ (when token
+ (let ((previous (opascal-token-at (1- (opascal-token-start token)))))
+ (if previous
+ (opascal-step-progress (opascal-token-start previous) "Scanning"
+ opascal-scanning-progress-step))
+ previous)))
+
+(defun opascal-next-visible-token (token)
+ ;; Returns the first non-space token after the specified token.
+ (let (next-token)
+ (while (progn
+ (setq next-token (opascal-next-token token))
+ (opascal-is (opascal-token-kind next-token) '(space newline))))
+ next-token))
+
+(defun opascal-group-start (from-token)
+ ;; Returns the token that denotes the start of the ()/[] group.
+ (let ((token (opascal-previous-token from-token))
+ (token-kind nil))
+ (catch 'done
+ (while token
+ (setq token-kind (opascal-token-kind token))
+ (cond
+ ;; Skip over nested groups.
+ ((eq 'close-group token-kind) (setq token (opascal-group-start token)))
+ ((eq 'open-group token-kind) (throw 'done token)))
+ (setq token (opascal-previous-token token)))
+ ;; Start not found.
+ nil)))
+
+(defun opascal-group-end (from-token)
+ ;; Returns the token that denotes the end of the ()/[] group.
+ (let ((token (opascal-next-token from-token))
+ (token-kind nil))
+ (catch 'done
+ (while token
+ (setq token-kind (opascal-token-kind token))
+ (cond
+ ;; Skip over nested groups.
+ ((eq 'open-group token-kind) (setq token (opascal-group-end token)))
+ ((eq 'close-group token-kind) (throw 'done token)))
+ (setq token (opascal-next-token token)))
+ ;; end not found.
+ nil)))
+
+(defun opascal-indent-of (token &optional offset)
+ ;; Returns the start column of the token, plus any offset.
+ (let ((indent (+ (opascal-column-of (opascal-token-start token))
+ (if offset offset 0))))
+ (when opascal-debug
+ (opascal-debug-log
+ (concat "\n Indent of: %S %S"
+ "\n column: %d indent: %d offset: %d")
+ token (opascal-token-string token)
+ (opascal-column-of (opascal-token-start token))
+ indent (if offset offset 0)))
+ indent))
+
+(defun opascal-line-indent-of (from-token &optional offset &rest terminators)
+ ;; Returns the column of first non-space character on the token's line, plus
+ ;; any offset. We also stop if one of the terminators or an open ( or [ is
+ ;; encountered.
+ (let ((token (opascal-previous-token from-token))
+ (last-token from-token)
+ (kind nil))
+ (catch 'done
+ (while token
+ (setq kind (opascal-token-kind token))
+ (cond
+ ;; Skip over ()/[] groups.
+ ((eq 'close-group kind) (setq token (opascal-group-start token)))
+
+ ;; Stop at the beginning of the line or an open group.
+ ((opascal-is kind '(newline open-group)) (throw 'done nil))
+
+ ;; Stop at one of the specified terminators.
+ ((opascal-is kind terminators) (throw 'done nil)))
+ (unless (opascal-is kind opascal-whitespace) (setq last-token token))
+ (setq token (opascal-previous-token token))))
+ (opascal-indent-of last-token offset)))
+
+(defun opascal-stmt-line-indent-of (from-token &optional offset)
+ ;; Like `opascal-line-indent-of' except is also stops on a use clause, and
+ ;; colons that precede statements (i.e. case labels).
+ (let ((token (opascal-previous-token from-token))
+ (last-token from-token)
+ (kind nil))
+ (catch 'done
+ (while token
+ (setq kind (opascal-token-kind token))
+ (cond
+ ((and (eq 'colon kind)
+ (opascal-is (opascal-token-kind last-token)
+ `(,@opascal-block-statements
+ ,@opascal-expr-statements)))
+ ;; We hit a label followed by a statement. Indent to the statement.
+ (throw 'done nil))
+
+ ;; Skip over ()/[] groups.
+ ((eq 'close-group kind) (setq token (opascal-group-start token)))
+
+ ((opascal-is kind `(newline open-group ,@opascal-use-clauses))
+ ;; Stop at the beginning of the line, an open group, or a use clause
+ (throw 'done nil)))
+ (unless (opascal-is kind opascal-whitespace) (setq last-token token))
+ (setq token (opascal-previous-token token))))
+ (opascal-indent-of last-token offset)))
+
+(defun opascal-open-group-indent (token last-token &optional offset)
+ ;; Returns the indent relative to an unmatched ( or [.
+ (when (eq 'open-group (opascal-token-kind token))
+ (if last-token
+ (opascal-indent-of last-token offset)
+ ;; There is nothing following the ( or [. Indent from its line.
+ (opascal-stmt-line-indent-of token opascal-indent-level))))
+
+(defun opascal-composite-type-start (token last-token)
+ ;; Returns true (actually the last-token) if the pair equals (= class), (=
+ ;; dispinterface), (= interface), (= object), or (= record), and nil
+ ;; otherwise.
+ (if (and (eq 'equals (opascal-token-kind token))
+ (opascal-is (opascal-token-kind last-token) opascal-composite-types))
+ last-token))
+
+(defun opascal-is-simple-class-type (at-token limit-token)
+ ;; True if at-token is the start of a simple class type. E.g.
+ ;; class of TClass;
+ ;; class (TBaseClass);
+ ;; class;
+ (when (opascal-is (opascal-token-kind at-token) opascal-class-types)
+ (catch 'done
+ ;; Scan until the semi colon.
+ (let ((token (opascal-next-token at-token))
+ (token-kind nil)
+ (limit (opascal-token-start limit-token)))
+ (while (and token (<= (opascal-token-start token) limit))
+ (setq token-kind (opascal-token-kind token))
+ (cond
+ ;; A semicolon delimits the search.
+ ((eq 'semicolon token-kind) (throw 'done token))
+
+ ;; Skip over the inheritance list.
+ ((eq 'open-group token-kind) (setq token (opascal-group-end token)))
+
+ ;; Only allow "of" and whitespace, and an identifier
+ ((opascal-is token-kind `(of word ,@opascal-whitespace)))
+
+ ;; Otherwise we are not in a simple class declaration.
+ ((throw 'done nil)))
+ (setq token (opascal-next-token token)))))))
+
+(defun opascal-block-start (from-token &optional stop-on-class)
+ ;; Returns the token that denotes the start of the block.
+ (let ((token (opascal-previous-token from-token))
+ (last-token nil)
+ (token-kind nil))
+ (catch 'done
+ (while token
+ (setq token-kind (opascal-token-kind token))
+ (cond
+ ;; Skip over nested blocks.
+ ((opascal-is token-kind opascal-end-block-statements)
+ (setq token (opascal-block-start token)))
+
+ ;; Regular block start found.
+ ((opascal-is token-kind opascal-block-statements)
+ (throw 'done
+ ;; As a special case, when a "case" block appears
+ ;; within a record declaration (to denote a variant
+ ;; part), the record declaration should be considered
+ ;; the enclosing block.
+ (if (eq 'case token-kind)
+ (let ((enclosing-token
+ (opascal-block-start token
+ 'stop-on-class)))
+ (if
+ (eq 'record
+ (opascal-token-kind enclosing-token))
+ (if stop-on-class
+ enclosing-token
+ (opascal-previous-token enclosing-token))
+ token))
+ token)))
+
+ ;; A class/record start also begins a block.
+ ((opascal-composite-type-start token last-token)
+ (throw 'done (if stop-on-class last-token token)))
+ )
+ (unless (opascal-is token-kind opascal-whitespace)
+ (setq last-token token))
+ (setq token (opascal-previous-token token)))
+ ;; Start not found.
+ nil)))
+
+(defun opascal-else-start (from-else)
+ ;; Returns the token of the if or case statement.
+ (let ((token (opascal-previous-token from-else))
+ (token-kind nil)
+ (semicolon-count 0))
+ (catch 'done
+ (while token
+ (setq token-kind (opascal-token-kind token))
+ (cond
+ ;; Skip over nested groups.
+ ((eq 'close-group token-kind) (setq token (opascal-group-start token)))
+
+ ;; Skip over any nested blocks.
+ ((opascal-is token-kind opascal-end-block-statements)
+ (setq token (opascal-block-start token)))
+
+ ((eq 'semicolon token-kind)
+ ;; Semicolon means we are looking for an enclosing if, unless we
+ ;; are in a case statement. Keep counts of the semicolons and decide
+ ;; later.
+ (setq semicolon-count (1+ semicolon-count)))
+
+ ((and (eq 'if token-kind) (= semicolon-count 0))
+ ;; We only can match an if when there have been no intervening
+ ;; semicolons.
+ (throw 'done token))
+
+ ((eq 'case token-kind)
+ ;; We have hit a case statement start.
+ (throw 'done token)))
+ (setq token (opascal-previous-token token)))
+ ;; No if or case statement found.
+ nil)))
+
+(defun opascal-comment-content-start (comment)
+ ;; Returns the point of the first non-space character in the comment.
+ (let ((kind (opascal-token-kind comment)))
+ (when (opascal-is kind opascal-comments)
+ (opascal-save-excursion
+ (goto-char (+ (opascal-token-start comment)
+ (length (opascal-literal-start-pattern kind))))
+ (skip-chars-forward opascal-space-chars)
+ (point)))))
+
+(defun opascal-comment-block-start (comment)
+ ;; Returns the starting comment token of a contiguous // comment block. If
+ ;; the comment is multiline (i.e. {...} or (*...*)), the original comment is
+ ;; returned.
+ (if (not (eq 'comment-single-line (opascal-token-kind comment)))
+ comment
+ ;; Scan until we run out of // comments.
+ (let ((prev-comment comment)
+ (start-comment comment))
+ (while (let ((kind (opascal-token-kind prev-comment)))
+ (cond ((eq kind 'space))
+ ((eq kind 'comment-single-line)
+ (setq start-comment prev-comment))
+ (t nil)))
+ (setq prev-comment (opascal-previous-token prev-comment)))
+ start-comment)))
+
+(defun opascal-comment-block-end (comment)
+ ;; Returns the end comment token of a contiguous // comment block. If the
+ ;; comment is multiline (i.e. {...} or (*...*)), the original comment is
+ ;; returned.
+ (if (not (eq 'comment-single-line (opascal-token-kind comment)))
+ comment
+ ;; Scan until we run out of // comments.
+ (let ((next-comment comment)
+ (end-comment comment))
+ (while (let ((kind (opascal-token-kind next-comment)))
+ (cond ((eq kind 'space))
+ ((eq kind 'comment-single-line)
+ (setq end-comment next-comment))
+ (t nil)))
+ (setq next-comment (opascal-next-token next-comment)))
+ end-comment)))
+
+(defun opascal-on-first-comment-line (comment)
+ ;; Returns true if the current point is on the first line of the comment.
+ (save-excursion
+ (let ((comment-start (opascal-token-start comment))
+ (current-point (point)))
+ (goto-char comment-start)
+ (end-of-line)
+ (and (<= comment-start current-point) (<= current-point (point))))))
+
+(defun opascal-comment-indent-of (comment)
+ ;; Returns the correct indentation for the comment.
+ (let ((start-comment (opascal-comment-block-start comment)))
+ (if (and (eq start-comment comment)
+ (opascal-on-first-comment-line comment))
+ ;; Indent as a statement.
+ (opascal-enclosing-indent-of comment)
+ (save-excursion
+ (let ((kind (opascal-token-kind comment)))
+ (beginning-of-line)
+ (cond ((eq 'comment-single-line kind)
+ ;; Indent to the first comment in the // block.
+ (opascal-indent-of start-comment))
+
+ ((looking-at (concat opascal-leading-spaces-re
+ (opascal-literal-stop-pattern kind)))
+ ;; Indent multi-line comment terminators to the comment start.
+ (opascal-indent-of comment))
+
+ ;; Indent according to the comment's content start.
+ ((opascal-column-of (opascal-comment-content-start comment)))))))
+ ))
+
+(defun opascal-is-use-clause-end (at-token last-token last-colon from-kind)
+ ;; True if we are after the end of a uses type clause.
+ (when (and last-token
+ (not last-colon)
+ (eq 'comma (opascal-token-kind at-token))
+ (eq 'semicolon from-kind))
+ ;; Scan for the uses statement, just to be sure.
+ (let ((token (opascal-previous-token at-token))
+ (token-kind nil))
+ (catch 'done
+ (while token
+ (setq token-kind (opascal-token-kind token))
+ (cond ((opascal-is token-kind opascal-use-clauses)
+ (throw 'done t))
+
+ ;; Whitespace, identifiers, strings, "in" keyword, and commas
+ ;; are allowed in use clauses.
+ ((or (opascal-is token-kind '(word comma in newline))
+ (opascal-is token-kind opascal-whitespace)
+ (opascal-is token-kind opascal-strings)))
+
+ ;; Nothing else is.
+ ((throw 'done nil)))
+ (setq token (opascal-previous-token token)))
+ nil))))
+
+(defun opascal-is-block-after-expr-statement (token)
+ ;; Returns true if we have a block token trailing an expression delimiter (of
+ ;; presumably an expression statement).
+ (when (opascal-is (opascal-token-kind token) opascal-block-statements)
+ (let ((previous (opascal-previous-token token))
+ (previous-kind nil))
+ (while (progn
+ (setq previous-kind (opascal-token-kind previous))
+ (eq previous-kind 'space))
+ (setq previous (opascal-previous-token previous)))
+ (or (opascal-is previous-kind opascal-expr-delimiters)
+ (eq previous-kind 'else)))))
+
+(defun opascal-previous-indent-of (from-token)
+ ;; Returns the indentation of the previous statement of the token.
+ (let ((token (opascal-previous-token from-token))
+ (token-kind nil)
+ (from-kind (opascal-token-kind from-token))
+ (last-colon nil)
+ (last-of nil)
+ (last-token nil))
+ (catch 'done
+ (while token
+ (setq token-kind (opascal-token-kind token))
+ (cond
+ ;; An open ( or [ always is an indent point.
+ ((eq 'open-group token-kind)
+ (throw 'done (opascal-open-group-indent token last-token)))
+
+ ;; Skip over any ()/[] groups.
+ ((eq 'close-group token-kind) (setq token (opascal-group-start token)))
+
+ ((opascal-is token-kind opascal-end-block-statements)
+ (if (eq 'newline (opascal-token-kind (opascal-previous-token token)))
+ ;; We can stop at an end token that is right up against the
+ ;; margin.
+ (throw 'done 0)
+ ;; Otherwise, skip over any nested blocks.
+ (setq token (opascal-block-start token))))
+
+ ;; Special case: if we encounter a ", word;" then we assume that we
+ ;; are in some kind of uses clause, and thus indent to column 0. This
+ ;; works because no other constructs are known to have that form.
+ ;; This fixes the irritating case of having indents after a uses
+ ;; clause look like:
+ ;; uses
+ ;; someUnit,
+ ;; someOtherUnit;
+ ;; // this should be at column 0!
+ ((opascal-is-use-clause-end token last-token last-colon from-kind)
+ (throw 'done 0))
+
+ ;; A previous terminator means we can stop. If we are on a directive,
+ ;; however, then we are not actually encountering a new statement.
+ ((and last-token
+ (opascal-is token-kind opascal-previous-terminators)
+ (not (opascal-is (opascal-token-kind last-token)
+ opascal-directives)))
+ (throw 'done (opascal-stmt-line-indent-of last-token 0)))
+
+ ;; Ignore whitespace.
+ ((opascal-is token-kind opascal-whitespace))
+
+ ;; Remember any "of" we encounter, since that affects how we
+ ;; indent to a case statement within a record declaration
+ ;; (i.e. a variant part).
+ ((eq 'of token-kind)
+ (setq last-of token))
+
+ ;; Remember any ':' we encounter (until we reach an "of"),
+ ;; since that affects how we indent to case statements in
+ ;; general.
+ ((eq 'colon token-kind)
+ (unless last-of (setq last-colon token)))
+
+ ;; A case statement delimits a previous statement. We indent labels
+ ;; specially.
+ ((eq 'case token-kind)
+ (throw 'done
+ (if last-colon (opascal-line-indent-of last-colon)
+ (opascal-line-indent-of token opascal-case-label-indent))))
+
+ ;; If we are in a use clause then commas mark an enclosing rather than
+ ;; a previous statement.
+ ((opascal-is token-kind opascal-use-clauses)
+ (throw 'done
+ (if (eq 'comma from-kind)
+ (if last-token
+ ;; Indent to first unit in use clause.
+ (opascal-indent-of last-token)
+ ;; Indent from use clause keyword.
+ (opascal-line-indent-of token opascal-indent-level))
+ ;; Indent to use clause keyword.
+ (opascal-line-indent-of token))))
+
+ ;; Assembly sections always indent in from the asm keyword.
+ ((eq token-kind 'asm)
+ (throw 'done (opascal-stmt-line-indent-of token opascal-indent-level)))
+
+ ;; An enclosing statement delimits a previous statement.
+ ;; We try to use the existing indent of the previous statement,
+ ;; otherwise we calculate from the enclosing statement.
+ ((opascal-is token-kind opascal-previous-enclosing-statements)
+ (throw 'done (if last-token
+ ;; Otherwise indent to the last token
+ (opascal-line-indent-of last-token)
+ ;; Just indent from the enclosing keyword
+ (opascal-line-indent-of token opascal-indent-level))))
+
+ ;; A class or record declaration also delimits a previous statement.
+ ((opascal-composite-type-start token last-token)
+ (throw
+ 'done
+ (if (opascal-is-simple-class-type last-token from-token)
+ ;; c = class; or c = class of T; are previous statements.
+ (opascal-line-indent-of token)
+ ;; Otherwise c = class ... or r = record ... are enclosing
+ ;; statements.
+ (opascal-line-indent-of last-token opascal-indent-level))))
+
+ ;; We have a definite previous statement delimiter.
+ ((opascal-is token-kind opascal-previous-statements)
+ (throw 'done (opascal-stmt-line-indent-of token 0)))
+ )
+ (unless (opascal-is token-kind opascal-whitespace)
+ (setq last-token token))
+ (setq token (opascal-previous-token token)))
+ ;; We ran out of tokens. Indent to column 0.
+ 0)))
+
+(defun opascal-section-indent-of (section-token)
+ ;; Returns the indentation appropriate for begin/var/const/type/label
+ ;; tokens.
+ (let* ((token (opascal-previous-token section-token))
+ (token-kind nil)
+ (last-token nil)
+ (nested-block-count 0)
+ (expr-delimited nil)
+ (last-terminator nil))
+ (catch 'done
+ (while token
+ (setq token-kind (opascal-token-kind token))
+ (cond
+ ;; Always stop at unmatched ( or [.
+ ((eq token-kind 'open-group)
+ (throw 'done (opascal-open-group-indent token last-token)))
+
+ ;; Skip over any ()/[] groups.
+ ((eq 'close-group token-kind) (setq token (opascal-group-start token)))
+
+ ((opascal-is token-kind opascal-end-block-statements)
+ (if (eq 'newline (opascal-token-kind (opascal-previous-token token)))
+ ;; We can stop at an end token that is right up against the
+ ;; margin.
+ (throw 'done 0)
+ ;; Otherwise, skip over any nested blocks.
+ (setq token (opascal-block-start token)
+ nested-block-count (1+ nested-block-count))))
+
+ ;; Remember if we have encountered any forward routine declarations.
+ ((eq 'forward token-kind)
+ (setq nested-block-count (1+ nested-block-count)))
+
+ ;; Mark the completion of a nested routine traversal.
+ ((and (opascal-is token-kind opascal-routine-statements)
+ (> nested-block-count 0))
+ (setq nested-block-count (1- nested-block-count)))
+
+ ;; Remember if we have encountered any statement terminators.
+ ((eq 'semicolon token-kind) (setq last-terminator token))
+
+ ;; Remember if we have encountered any expression delimiters.
+ ((opascal-is token-kind opascal-expr-delimiters)
+ (setq expr-delimited token))
+
+ ;; Enclosing body statements are delimiting. We indent the compound
+ ;; bodies specially.
+ ((and (not last-terminator)
+ (opascal-is token-kind opascal-body-statements))
+ (throw 'done
+ (opascal-stmt-line-indent-of token opascal-compound-block-indent)))
+
+ ;; An enclosing ":" means a label.
+ ((and (eq 'colon token-kind)
+ (opascal-is (opascal-token-kind section-token)
+ opascal-block-statements)
+ (not last-terminator)
+ (not expr-delimited)
+ (not (eq 'equals (opascal-token-kind last-token))))
+ (throw 'done
+ (opascal-stmt-line-indent-of token opascal-indent-level)))
+
+ ;; Block and mid block tokens are always enclosing
+ ((opascal-is token-kind opascal-begin-enclosing-tokens)
+ (throw 'done
+ (opascal-stmt-line-indent-of token opascal-indent-level)))
+
+ ;; Declaration sections and routines are delimiters, unless they
+ ;; are part of a nested routine.
+ ((and (opascal-is token-kind opascal-decl-delimiters)
+ (= 0 nested-block-count))
+ (throw 'done (opascal-line-indent-of token 0)))
+
+ ;; Unit statements mean we indent right to the left.
+ ((opascal-is token-kind opascal-unit-statements) (throw 'done 0))
+ )
+ (unless (opascal-is token-kind opascal-whitespace)
+ (setq last-token token))
+ (setq token (opascal-previous-token token)))
+ ;; We ran out of tokens. Indent to column 0.
+ 0)))
+
+(defun opascal-enclosing-indent-of (from-token)
+ ;; Returns the indentation offset from the enclosing statement of the token.
+ (let ((token (opascal-previous-token from-token))
+ (from-kind (opascal-token-kind from-token))
+ (token-kind nil)
+ (stmt-start nil)
+ (last-token nil)
+ (equals-encountered nil)
+ (before-equals nil)
+ (expr-delimited nil))
+ (catch 'done
+ (while token
+ (setq token-kind (opascal-token-kind token))
+ (cond
+ ;; An open ( or [ always is an indent point.
+ ((eq 'open-group token-kind)
+ (throw 'done
+ (opascal-open-group-indent
+ token last-token
+ (if (opascal-is from-kind opascal-binary-ops)
+ ;; Keep binary operations aligned with the open group.
+ 0
+ opascal-indent-level))))
+
+ ;; Skip over any ()/[] groups.
+ ((eq 'close-group token-kind) (setq token (opascal-group-start token)))
+
+ ;; Skip over any nested blocks.
+ ((opascal-is token-kind opascal-end-block-statements)
+ (setq token (opascal-block-start token)))
+
+ ;; An expression delimiter affects indentation depending on whether
+ ;; the point is before or after it. Remember that we encountered one.
+ ;; Also remember the last encountered token, since if it exists it
+ ;; should be the actual indent point.
+ ((opascal-is token-kind opascal-expr-delimiters)
+ (setq expr-delimited token stmt-start last-token))
+
+ ;; With a non-delimited expression statement we indent after the
+ ;; statement's keyword, unless we are on the delimiter itself.
+ ((and (not expr-delimited)
+ (opascal-is token-kind opascal-expr-statements))
+ (throw 'done
+ (cond ((opascal-is from-kind opascal-expr-delimiters)
+ ;; We are indenting a delimiter. Indent to the statement.
+ (opascal-stmt-line-indent-of token 0))
+
+ ((and last-token (opascal-is from-kind opascal-binary-ops))
+ ;; Align binary ops with the expression.
+ (opascal-indent-of last-token))
+
+ (last-token
+ ;; Indent in from the expression.
+ (opascal-indent-of last-token opascal-indent-level))
+
+ ;; Indent in from the statement's keyword.
+ ((opascal-indent-of token opascal-indent-level)))))
+
+ ;; A delimited case statement indents the label according to
+ ;; a special rule.
+ ((eq 'case token-kind)
+ (throw 'done
+ (if stmt-start
+ ;; We are not actually indenting to the case statement,
+ ;; but are within a label expression.
+ (opascal-stmt-line-indent-of
+ stmt-start opascal-indent-level)
+ ;; Indent from the case keyword.
+ (opascal-stmt-line-indent-of
+ token opascal-case-label-indent))))
+
+ ;; Body expression statements are enclosing. Indent from the
+ ;; statement's keyword, unless we have a non-block statement following
+ ;; it.
+ ((opascal-is token-kind opascal-body-expr-statements)
+ (throw 'done
+ (opascal-stmt-line-indent-of
+ (or stmt-start token) opascal-indent-level)))
+
+ ;; An else statement is enclosing, but it doesn't have an expression.
+ ;; Thus we take into account last-token instead of stmt-start.
+ ((eq 'else token-kind)
+ (throw 'done (opascal-stmt-line-indent-of
+ (or last-token token) opascal-indent-level)))
+
+ ;; We indent relative to an enclosing declaration section.
+ ((opascal-is token-kind opascal-decl-sections)
+ (throw 'done (opascal-indent-of (if last-token last-token token)
+ opascal-indent-level)))
+
+ ;; In unit sections we indent right to the left.
+ ((opascal-is token-kind opascal-unit-sections)
+ (throw 'done
+ ;; Handle specially the case of "interface", which can be used
+ ;; to start either a unit section or an interface definition.
+ (if (opascal-is token-kind opascal-interface-types)
+ (progn
+ ;; Find the previous non-whitespace token.
+ (while (progn
+ (setq last-token token
+ token (opascal-previous-token token)
+ token-kind (opascal-token-kind token))
+ (and token
+ (opascal-is token-kind
+ opascal-whitespace))))
+ ;; If this token is an equals sign, "interface" is being
+ ;; used to start an interface definition and we should
+ ;; treat it as a composite type; otherwise, we should
+ ;; consider it the start of a unit section.
+ (if (and token (eq token-kind 'equals))
+ (opascal-line-indent-of last-token
+ opascal-indent-level)
+ 0))
+ 0)))
+
+ ;; A previous terminator means we can stop.
+ ((opascal-is token-kind opascal-previous-terminators)
+ (throw 'done
+ (cond ((and last-token
+ (eq 'comma token-kind)
+ (opascal-is from-kind opascal-binary-ops))
+ ;; Align binary ops with the expression.
+ (opascal-indent-of last-token))
+
+ (last-token
+ ;; Indent in from the expression.
+ (opascal-indent-of last-token opascal-indent-level))
+
+ ;; No enclosing expression; use the previous statement's
+ ;; indent.
+ ((opascal-previous-indent-of token)))))
+
+ ;; A block statement after an expression delimiter has its start
+ ;; column as the expression statement. E.g.
+ ;; if (a = b)
+ ;; and (a != c) then begin
+ ;; //...
+ ;; end;
+ ;; Remember it for when we encounter the expression statement start.
+ ((opascal-is-block-after-expr-statement token)
+ (throw 'done
+ (cond (last-token (opascal-indent-of last-token opascal-indent-level))
+
+ ((+ (opascal-section-indent-of token) opascal-indent-level)))))
+
+ ;; Assembly sections always indent in from the asm keyword.
+ ((eq token-kind 'asm)
+ (throw 'done (opascal-stmt-line-indent-of token opascal-indent-level)))
+
+ ;; Stop at an enclosing statement and indent from it.
+ ((opascal-is token-kind opascal-enclosing-statements)
+ (throw 'done (opascal-stmt-line-indent-of
+ (or last-token token) opascal-indent-level)))
+
+ ;; A class/record declaration is also enclosing.
+ ((opascal-composite-type-start token last-token)
+ (throw 'done
+ (opascal-line-indent-of last-token opascal-indent-level)))
+
+ ;; A ":" we indent relative to its line beginning. If we are in a
+ ;; parameter list, then stop also if we hit a ";".
+ ((and (eq token-kind 'colon)
+ (not expr-delimited)
+ (not (opascal-is from-kind opascal-expr-delimiters))
+ (not equals-encountered)
+ (not (eq from-kind 'equals)))
+ (throw 'done
+ (if last-token
+ (opascal-indent-of last-token opascal-indent-level)
+ (opascal-line-indent-of token opascal-indent-level 'semicolon))))
+
+ ;; If the ":" was not processed above and we have token after the "=",
+ ;; then indent from the "=". Ignore :=, however.
+ ((and (eq token-kind 'colon) equals-encountered before-equals)
+ (cond
+ ;; Ignore binary ops for now. It would do, for example:
+ ;; val := 1 + 2
+ ;; + 3;
+ ;; which is good, but also
+ ;; val := Foo
+ ;; (foo, args)
+ ;; + 2;
+ ;; which doesn't look right.
+ ;;;; Align binary ops with the before token.
+ ;;((opascal-is from-kind opascal-binary-ops)
+ ;;(throw 'done (opascal-indent-of before-equals 0)))
+
+ ;; Assignments (:=) we skip over to get a normal indent.
+ ((eq (opascal-token-kind last-token) 'equals))
+
+ ;; Otherwise indent in from the equals.
+ ((throw 'done
+ (opascal-indent-of before-equals opascal-indent-level)))))
+
+ ;; Remember any "=" we encounter if it has not already been processed.
+ ((eq token-kind 'equals)
+ (setq equals-encountered token
+ before-equals last-token))
+ )
+ (unless (opascal-is token-kind opascal-whitespace)
+ (setq last-token token))
+ (setq token (opascal-previous-token token)))
+ ;; We ran out of tokens. Indent to column 0.
+ 0)))
+
+(defun opascal-corrected-indentation ()
+ ;; Returns the corrected indentation for the current line.
+ (opascal-save-excursion
+ (opascal-progress-start)
+ ;; Move to the first token on the line.
+ (beginning-of-line)
+ (skip-chars-forward opascal-space-chars)
+ (let* ((token (opascal-current-token))
+ (token-kind (opascal-token-kind token))
+ (indent
+ (cond ((eq 'close-group token-kind)
+ ;; Indent to the matching start ( or [.
+ (opascal-indent-of (opascal-group-start token)))
+
+ ((opascal-is token-kind opascal-unit-statements) 0)
+
+ ((opascal-is token-kind opascal-comments)
+ ;; In a comment.
+ (opascal-comment-indent-of token))
+
+ ((opascal-is token-kind opascal-decl-matchers)
+ ;; Use a previous section/routine's indent.
+ (opascal-section-indent-of token))
+
+ ((opascal-is token-kind opascal-match-block-statements)
+ ;; Use the block's indentation.
+ (let ((block-start
+ (opascal-block-start token 'stop-on-class)))
+ (cond
+ ;; When trailing a body statement, indent to
+ ;; the statement's keyword.
+ ((opascal-is-block-after-expr-statement block-start)
+ (opascal-section-indent-of block-start))
+
+ ;; Otherwise just indent to the block start.
+ ((opascal-stmt-line-indent-of block-start 0)))))
+
+ ((eq 'else token-kind)
+ ;; Find the start of the if or case statement.
+ (opascal-stmt-line-indent-of (opascal-else-start token) 0))
+
+ ;; Otherwise indent in from enclosing statement.
+ ((opascal-enclosing-indent-of
+ (if token token (opascal-token-at (1- (point)))))))))
+ (opascal-progress-done)
+ indent)))
+
+(defun opascal-indent-line ()
+ "Indent the current line according to the current language construct.
+If before the indent, the point is moved to the indent."
+ (interactive)
+ (save-match-data
+ (let ((marked-point (point-marker)) ; Maintain our position reliably.
+ (line-start nil)
+ (old-indent 0)
+ (new-indent 0))
+ (beginning-of-line)
+ (setq line-start (point))
+ (skip-chars-forward opascal-space-chars)
+ (setq old-indent (current-column))
+ (setq new-indent (opascal-corrected-indentation))
+ (if (< marked-point (point))
+ ;; If before the indent column, then move to it.
+ (set-marker marked-point (point)))
+ ;; Advance our marked point after inserted spaces.
+ (set-marker-insertion-type marked-point t)
+ (when (/= old-indent new-indent)
+ (delete-region line-start (point))
+ (insert (make-string new-indent ?\s)))
+ (goto-char marked-point)
+ (set-marker marked-point nil))))
+
+(defvar opascal-mode-abbrev-table nil
+ "Abbrev table in use in OPascal mode buffers.")
+(define-abbrev-table 'opascal-mode-abbrev-table ())
+
+(defmacro opascal-ensure-buffer (buffer-var buffer-name)
+ ;; Ensures there exists a buffer of the specified name in the specified
+ ;; variable.
+ `(when (not (buffer-live-p ,buffer-var))
+ (setq ,buffer-var (get-buffer-create ,buffer-name))))
+
+(defun opascal-log-msg (to-buffer the-msg)
+ ;; Writes a message to the end of the specified buffer.
+ (with-current-buffer to-buffer
+ (save-selected-window
+ (switch-to-buffer-other-window to-buffer)
+ (goto-char (point-max))
+ (set-window-point (get-buffer-window to-buffer) (point))
+ (insert the-msg))))
+
+;; Debugging helpers:
+
+(defvar opascal-debug-buffer nil
+ "Buffer to write OPascal mode debug messages to. Created on demand.")
+
+(defun opascal-debug-log (format-string &rest args)
+ ;; Writes a message to the log buffer.
+ (when opascal-debug
+ (opascal-ensure-buffer opascal-debug-buffer "*OPascal Debug Log*")
+ (opascal-log-msg opascal-debug-buffer
+ (concat (format-time-string "%H:%M:%S " (current-time))
+ (apply #'format (cons format-string args))
+ "\n"))))
+
+(defun opascal-debug-token-string (token)
+ (let* ((image (opascal-token-string token))
+ (has-newline (string-match "^\\([^\n]*\\)\n\\(.+\\)?$" image)))
+ (when has-newline
+ (setq image (concat (match-string 1 image)
+ (if (match-beginning 2) "..."))))
+ image))
+
+(defun opascal-debug-show-current-token ()
+ (interactive)
+ (let ((token (opascal-current-token)))
+ (opascal-debug-log "Token: %S %S" token (opascal-debug-token-string token))))
+
+(defun opascal-debug-goto-point (p)
+ (interactive "NGoto char: ")
+ (goto-char p))
+
+(defun opascal-debug-goto-next-token ()
+ (interactive)
+ (goto-char (opascal-token-start (opascal-next-token (opascal-current-token)))))
+
+(defun opascal-debug-goto-previous-token ()
+ (interactive)
+ (goto-char
+ (opascal-token-start (opascal-previous-token (opascal-current-token)))))
+
+(defun opascal-debug-show-current-string (from to)
+ (interactive "r")
+ (opascal-debug-log "String: %S" (buffer-substring from to)))
+
+(defun opascal-debug-tokenize-region (from to)
+ (interactive)
+ (opascal-save-excursion
+ (opascal-progress-start)
+ (goto-char from)
+ (while (< (point) to)
+ (goto-char (opascal-token-end (opascal-current-token)))
+ (opascal-step-progress (point) "Tokenizing" opascal-scanning-progress-step))
+ (opascal-progress-done "Tokenizing done")))
+
+(defun opascal-debug-tokenize-buffer ()
+ (interactive)
+ (opascal-debug-tokenize-region (point-min) (point-max)))
+
+(defun opascal-debug-tokenize-window ()
+ (interactive)
+ (opascal-debug-tokenize-region (window-start) (window-end)))
+
+
+(defun opascal-tab ()
+ "Indent the region, when Transient Mark mode is enabled and the region is
+active. Otherwise, indent the current line or insert a TAB, depending on the
+value of `opascal-tab-always-indents' and the current line position."
+ (interactive)
+ (cond ((use-region-p)
+ ;; If Transient Mark mode is enabled and the region is active, indent
+ ;; the entire region.
+ (indent-region (region-beginning) (region-end)))
+ ((or opascal-tab-always-indents
+ (save-excursion (skip-chars-backward opascal-space-chars) (bolp)))
+ ;; Otherwise, if we are configured always to indent (regardless of the
+ ;; point's position in the line) or we are before the first non-space
+ ;; character on the line, indent the line.
+ (opascal-indent-line))
+ (t
+ ;; Otherwise, insert a tab character.
+ (insert "\t"))))
+
+
+(defun opascal-is-directory (path)
+ ;; True if the specified path is an existing directory.
+ (let ((attributes (file-attributes path)))
+ (and attributes (car attributes))))
+
+(defun opascal-is-file (path)
+ ;; True if the specified file exists as a file.
+ (let ((attributes (file-attributes path)))
+ (and attributes (null (car attributes)))))
+
+(defun opascal-search-directory (unit dir &optional recurse)
+ ;; Searches for the unit in the specified directory. If recurse is true, then
+ ;; the directory is recursively searched. File name comparison is done in a
+ ;; case insensitive manner.
+ (when (opascal-is-directory dir)
+ (let ((files (directory-files dir))
+ (unit-file (downcase unit)))
+ (catch 'done
+ ;; Search for the file.
+ (dolist (file files)
+ (let ((path (concat dir "/" file)))
+ (if (and (string= unit-file (downcase file))
+ (opascal-is-file path))
+ (throw 'done path))))
+
+ ;; Not found. Search subdirectories.
+ (when recurse
+ (dolist (subdir files)
+ (unless (member subdir '("." ".."))
+ (let ((path (opascal-search-directory
+ unit (concat dir "/" subdir) recurse)))
+ (if path (throw 'done path))))))
+
+ ;; Not found.
+ nil))))
+
+
+(defun opascal-find-unit-in-directory (unit dir)
+ ;; Searches for the unit in the specified directory. If the directory ends
+ ;; in \"...\", then it is recursively searched.
+ (let ((dir-name dir)
+ (recurse nil))
+ ;; Check if we need to recursively search the directory.
+ (if (string-match "^\\(.+\\)\\.\\.\\.$" dir-name)
+ (setq dir-name (match-string 1 dir-name)
+ recurse t))
+ ;; Ensure the trailing slash is removed.
+ (if (string-match "^\\(.+\\)[\\\\/]$" dir-name)
+ (setq dir-name (match-string 1 dir-name)))
+ (opascal-search-directory unit dir-name recurse)))
+
+(defun opascal-find-unit-file (unit)
+ ;; Finds the specified opascal source file according to `opascal-search-path'.
+ ;; If found, the full path is returned, otherwise nil is returned.
+ (catch 'done
+ (cond ((null opascal-search-path)
+ (opascal-find-unit-in-directory unit "."))
+
+ ((stringp opascal-search-path)
+ (opascal-find-unit-in-directory unit opascal-search-path))
+
+ ((dolist (dir opascal-search-path)
+ (let ((file (opascal-find-unit-in-directory unit dir)))
+ (if file (throw 'done file))))))
+ nil))
+
+(defun opascal-find-unit (unit)
+ "Find the specified OPascal source file according to `opascal-search-path'.
+If no extension is specified, .pas is assumed. Creates a buffer for the unit."
+ (interactive "sOPascal unit name: ")
+ (let* ((unit-file (if (string-match "^\\(.*\\)\\.[a-z]+$" unit)
+ unit
+ (concat unit ".pas")))
+ (file (opascal-find-unit-file unit-file)))
+ (if (null file)
+ (error "unit not found: %s" unit-file)
+ (find-file file)
+ (if (not (derived-mode-p 'opascal-mode))
+ (opascal-mode)))
+ file))
+
+(defun opascal-find-current-def ()
+ "Find the definition of the identifier under the current point."
+ (interactive)
+ (error "opascal-find-current-def: not implemented yet"))
+
+(defun opascal-find-current-xdef ()
+ "Find the definition of the identifier under the current point, searching
+in external units if necessary (as listed in the current unit's use clause).
+The set of directories to search for a unit is specified by the global variable
+`opascal-search-path'."
+ (interactive)
+ (error "opascal-find-current-xdef: not implemented yet"))
+
+(defun opascal-find-current-body ()
+ "Find the body of the identifier under the current point, assuming
+it is a routine."
+ (interactive)
+ (error "opascal-find-current-body: not implemented yet"))
+
+(defun opascal-fill-comment ()
+ "Fill the text of the current comment, according to `fill-column'.
+An error is raised if not in a comment."
+ (interactive)
+ (save-excursion
+ (save-restriction
+ (let* ((comment (opascal-current-token))
+ (comment-kind (opascal-token-kind comment)))
+ (if (not (opascal-is comment-kind opascal-comments))
+ (error "Not in a comment")
+ (let* ((start-comment (opascal-comment-block-start comment))
+ (end-comment (opascal-comment-block-end comment))
+ ;; FIXME: Don't abuse global variables like `comment-end/start'.
+ (comment-start (opascal-token-start start-comment))
+ (comment-end (opascal-token-end end-comment))
+ (content-start (opascal-comment-content-start start-comment))
+ (content-indent (opascal-column-of content-start))
+ (content-prefix (make-string content-indent ?\s))
+ (content-prefix-re opascal-leading-spaces-re)
+ (p nil)
+ (marked-point (point-marker))) ; Maintain our position reliably.
+ (when (eq 'comment-single-line comment-kind)
+ ;; // style comments need more work.
+ (setq content-prefix
+ (let ((comment-indent (opascal-column-of comment-start)))
+ (concat (make-string comment-indent ?\s) "//"
+ (make-string (- content-indent comment-indent 2)
+ ?\s)))
+ content-prefix-re (concat opascal-leading-spaces-re
+ "//"
+ opascal-spaces-re)
+ comment-end (if (opascal-is-literal-end comment-end)
+ ;; Don't include the trailing newline.
+ (1- comment-end)
+ comment-end)))
+
+ ;; Advance our marked point after inserted spaces.
+ (set-marker-insertion-type marked-point t)
+
+ ;; Ensure we can modify the buffer
+ (goto-char content-start)
+ (insert " ")
+ (delete-char -1)
+
+ (narrow-to-region content-start comment-end)
+
+ ;; Strip off the comment prefixes
+ (setq p (point-min))
+ (while (when (< p (point-max))
+ (goto-char p)
+ (re-search-forward content-prefix-re nil t))
+ (replace-match "" nil nil)
+ (setq p (1+ (point))))
+
+ ;; add an extra line to prevent the fill from doing it for us.
+ (goto-char (point-max))
+ (insert "\n")
+
+ ;; Fill the comment contents.
+ (let ((fill-column (- fill-column content-indent)))
+ (fill-region (point-min) (point-max)))
+
+ (goto-char (point-max))
+ (delete-char -1)
+
+ ;; Restore comment prefixes.
+ (goto-char (point-min))
+ (end-of-line) ; Don't reset the first line.
+ (setq p (point))
+ (while (when (< p (point-max))
+ (goto-char p)
+ (re-search-forward "^" nil t))
+ (replace-match content-prefix nil nil)
+ (setq p (1+ (point))))
+
+ (setq comment-end (point-max))
+ (widen)
+
+ ;; Restore our position
+ (goto-char marked-point)
+ (set-marker marked-point nil)))))))
+
+(defun opascal-new-comment-line ()
+ "If in a // comment, do a newline, indented such that one is still in the
+comment block. If not in a // comment, just does a normal newline."
+ (interactive)
+ (let ((comment (opascal-current-token)))
+ (if (not (eq 'comment-single-line (opascal-token-kind comment)))
+ ;; Not in a // comment. Just do the normal newline.
+ (newline)
+ (let* ((start-comment (opascal-comment-block-start comment))
+ (comment-start (opascal-token-start start-comment))
+ (content-start (opascal-comment-content-start start-comment))
+ (prefix
+ (concat (make-string (opascal-column-of comment-start) ?\s) "//"
+ (make-string (- content-start comment-start 2) ?\s))))
+ (delete-horizontal-space)
+ (insert "\n" prefix)))))
+
+(defun opascal-match-token (token limit)
+ ;; Sets the match region used by (match-string 0) and friends to the token's
+ ;; region. Sets the current point to the end of the token (or limit).
+ (set-match-data nil)
+ (if token
+ (let ((end (min (opascal-token-end token) limit)))
+ (set-match-data (list (opascal-token-start token) end))
+ (goto-char end)
+ token)))
+
+(defconst opascal-font-lock-keywords
+ `(("\\_<\\(function\\|pro\\(cedure\\|gram\\)\\)[ \t]+\\([[:alpha:]][[:alnum:]_]*\\)"
+ (1 font-lock-keyword-face) (3 font-lock-function-name-face))
+ ,(concat "\\_<" (regexp-opt (mapcar #'symbol-name opascal-keywords))
+ "\\_>")))
+
+(defconst opascal-font-lock-defaults
+ '(opascal-font-lock-keywords
+ nil ; Syntactic fontification does apply.
+ nil ; Don't care about case since we don't use regexps to find tokens.
+ nil ; Syntax alists don't apply.
+ nil ; Syntax begin movement doesn't apply.
+ )
+ "OPascal mode font-lock defaults. Syntactic fontification is ignored.")
+
+(defconst opascal--syntax-propertize
+ (syntax-propertize-rules
+ ;; The syntax-table settings are too coarse and end up treating /* and (/
+ ;; as comment starters. Fix it here by removing the "2" from the syntax
+ ;; of the second char of such sequences.
+ ("/\\(\\*\\)" (1 ". 3b"))
+ ("(\\(\\/\\)" (1 (prog1 ". 1c" (forward-char -1) nil)))
+ ;; Pascal uses '' and "" rather than \' and \" to escape quotes.
+ ("''\\|\"\"" (0 (if (save-excursion
+ (nth 3 (syntax-ppss (match-beginning 0))))
+ (string-to-syntax ".")
+ ;; In case of 3 or more quotes in a row, only advance
+ ;; one quote at a time.
+ (forward-char -1)
+ nil)))))
+
+(defvar opascal-debug-mode-map
+ (let ((kmap (make-sparse-keymap)))
+ (dolist (binding '(("n" opascal-debug-goto-next-token)
+ ("p" opascal-debug-goto-previous-token)
+ ("t" opascal-debug-show-current-token)
+ ("T" opascal-debug-tokenize-buffer)
+ ("W" opascal-debug-tokenize-window)
+ ("g" opascal-debug-goto-point)
+ ("s" opascal-debug-show-current-string)))
+ (define-key kmap (car binding) (cadr binding)))
+ kmap)
+ "Keystrokes for OPascal mode debug commands.")
+
+(defvar opascal-mode-map
+ (let ((kmap (make-sparse-keymap)))
+ (dolist (binding
+ (list ;; '("\C-cd" opascal-find-current-def)
+ ;; '("\C-cx" opascal-find-current-xdef)
+ ;; '("\C-cb" opascal-find-current-body)
+ '("\C-cu" opascal-find-unit)
+ '("\M-q" opascal-fill-comment)
+ '("\M-j" opascal-new-comment-line)
+ ;; Debug bindings:
+ (list "\C-c\C-d" opascal-debug-mode-map)))
+ (define-key kmap (car binding) (cadr binding)))
+ kmap)
+ "Keymap used in OPascal mode.")
+
+(define-obsolete-variable-alias 'delphi-mode-hook 'opascal-mode-hook "24.4")
+;;;###autoload
+(define-obsolete-function-alias 'delphi-mode 'opascal-mode "24.4")
+;;;###autoload
+(define-derived-mode opascal-mode prog-mode "OPascal"
+ "Major mode for editing OPascal code. \\<opascal-mode-map>
+\\[opascal-find-unit]\t- Search for a OPascal source file.
+\\[opascal-fill-comment]\t- Fill the current comment.
+\\[opascal-new-comment-line]\t- If in a // comment, do a new comment line.
+
+\\[indent-region] also works for indenting a whole region.
+
+Customization:
+
+ `opascal-indent-level' (default 3)
+ Indentation of OPascal statements with respect to containing block.
+ `opascal-compound-block-indent' (default 0)
+ Extra indentation for blocks in compound statements.
+ `opascal-case-label-indent' (default 0)
+ Extra indentation for case statement labels.
+ `opascal-tab-always-indents' (default `tab-always-indents')
+ Non-nil means TAB in OPascal mode should always reindent the current line,
+ regardless of where in the line point is when the TAB command is used.
+ `opascal-search-path' (default .)
+ Directories to search when finding external units.
+ `opascal-verbose' (default nil)
+ If true then OPascal token processing progress is reported to the user.
+
+Coloring:
+
+ `opascal-keyword-face' (default font-lock-keyword-face)
+ Face used to color OPascal keywords.
+
+Turning on OPascal mode calls the value of the variable `opascal-mode-hook'
+with no args, if that value is non-nil."
+
+ ;; Buffer locals:
+ (setq-local indent-line-function #'opascal-indent-line)
+ (setq-local comment-indent-function #'opascal-indent-line)
+ (setq-local case-fold-search t)
+ (setq-local opascal-progress-last-reported-point nil)
+ (setq-local font-lock-defaults opascal-font-lock-defaults)
+ (setq-local tab-always-indent opascal-tab-always-indents)
+ (setq-local syntax-propertize-function opascal--syntax-propertize)
+
+ (setq-local comment-start "// ")
+ (setq-local comment-start-skip "\\(?://\\|(\\*\\|{\\)[ \t]*")
+ (setq-local comment-end-skip "[ \t]*\\(?:\n\\|\\*)\\|}\\)"))
+
+(provide 'opascal)
+;;; opascal.el ends here
diff --git a/lisp/progmodes/pascal.el b/lisp/progmodes/pascal.el
index de8a4355cd3..829ecda5150 100644
--- a/lisp/progmodes/pascal.el
+++ b/lisp/progmodes/pascal.el
@@ -138,6 +138,9 @@
;; find about the syntax of Pascal's comments said that (* ... } is
;; a valid comment, just as { ... *) or (* ... *) or { ... }.
(modify-syntax-entry ?* ". 23" st)
+ ;; Allow //...\n comments as accepted by Free Pascal (bug#13585).
+ (modify-syntax-entry ?/ ". 12c" st)
+ (modify-syntax-entry ?\n "> c" st)
(modify-syntax-entry ?{ "<" st)
(modify-syntax-entry ?} ">" st)
(modify-syntax-entry ?+ "." st)
diff --git a/lisp/progmodes/perl-mode.el b/lisp/progmodes/perl-mode.el
index 2ee7734e40e..bd58a7300ec 100644
--- a/lisp/progmodes/perl-mode.el
+++ b/lisp/progmodes/perl-mode.el
@@ -1,4 +1,4 @@
-;;; perl-mode.el --- Perl code editing commands for GNU Emacs
+;;; perl-mode.el --- Perl code editing commands for GNU Emacs -*- coding: utf-8 -*-
;; Copyright (C) 1990, 1994, 2001-2013 Free Software Foundation, Inc.
@@ -102,11 +102,6 @@
;;; Code:
-
-(defvar font-lock-comment-face)
-(defvar font-lock-doc-face)
-(defvar font-lock-string-face)
-
(defgroup perl nil
"Major mode for editing Perl code."
:link '(custom-group-link :tag "Font Lock Faces group" font-lock-faces)
@@ -119,16 +114,11 @@
(defvar perl-mode-map
(let ((map (make-sparse-keymap)))
- (define-key map "{" 'perl-electric-terminator)
- (define-key map "}" 'perl-electric-terminator)
- (define-key map ";" 'perl-electric-terminator)
- (define-key map ":" 'perl-electric-terminator)
(define-key map "\e\C-a" 'perl-beginning-of-function)
(define-key map "\e\C-e" 'perl-end-of-function)
(define-key map "\e\C-h" 'perl-mark-function)
(define-key map "\e\C-q" 'perl-indent-exp)
(define-key map "\177" 'backward-delete-char-untabify)
- (define-key map "\t" 'perl-indent-command)
map)
"Keymap used in Perl mode.")
@@ -158,16 +148,54 @@
(defvar perl-imenu-generic-expression
'(;; Functions
- (nil "^sub\\s-+\\([-A-Za-z0-9+_:]+\\)" 1)
+ (nil "^[ \t]*sub\\s-+\\([-A-Za-z0-9+_:]+\\)" 1)
;;Variables
("Variables" "^\\(?:my\\|our\\)\\s-+\\([$@%][-A-Za-z0-9+_:]+\\)\\s-*=" 1)
- ("Packages" "^package\\s-+\\([-A-Za-z0-9+_:]+\\);" 1)
+ ("Packages" "^[ \t]*package\\s-+\\([-A-Za-z0-9+_:]+\\);" 1)
("Doc sections" "^=head[0-9][ \t]+\\(.*\\)" 1))
"Imenu generic expression for Perl mode. See `imenu-generic-expression'.")
;; Regexps updated with help from Tom Tromey <tromey@cambric.colorado.edu> and
;; Jim Campbell <jec@murzim.ca.boeing.com>.
+(defcustom perl-prettify-symbols t
+ "If non-nil, some symbols will be displayed using Unicode chars."
+ :type 'boolean)
+
+(defconst perl--prettify-symbols-alist
+ '(;;("andalso" . ?∧) ("orelse" . ?∨) ("as" . ?≡)("not" . ?¬)
+ ;;("div" . ?÷) ("*" . ?×) ("o" . ?○)
+ ("->" . ?→)
+ ("=>" . ?⇒)
+ ;;("<-" . ?â†) ("<>" . ?≠) (">=" . ?≥) ("<=" . ?≤) ("..." . ?⋯)
+ ("::" . ?∷)
+ ))
+
+(defun perl--font-lock-compose-symbol ()
+ "Compose a sequence of ascii chars into a symbol.
+Regexp match data 0 points to the chars."
+ ;; Check that the chars should really be composed into a symbol.
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (syntaxes (if (eq (char-syntax (char-after start)) ?w)
+ '(?w) '(?. ?\\))))
+ (if (or (memq (char-syntax (or (char-before start) ?\ )) syntaxes)
+ (memq (char-syntax (or (char-after end) ?\ )) syntaxes)
+ (nth 8 (syntax-ppss)))
+ ;; No composition for you. Let's actually remove any composition
+ ;; we may have added earlier and which is now incorrect.
+ (remove-text-properties start end '(composition))
+ ;; That's a symbol alright, so add the composition.
+ (compose-region start end (cdr (assoc (match-string 0)
+ perl--prettify-symbols-alist)))))
+ ;; Return nil because we're not adding any face property.
+ nil)
+
+(defun perl--font-lock-symbols-keywords ()
+ (when perl-prettify-symbols
+ `((,(regexp-opt (mapcar 'car perl--prettify-symbols-alist) t)
+ (0 (perl--font-lock-compose-symbol))))))
+
(defconst perl-font-lock-keywords-1
'(;; What is this for?
;;("\\(--- .* ---\\|=== .* ===\\)" . font-lock-string-face)
@@ -190,32 +218,32 @@
"Subdued level highlighting for Perl mode.")
(defconst perl-font-lock-keywords-2
- (append perl-font-lock-keywords-1
- (list
- ;;
- ;; Fontify keywords, except those fontified otherwise.
- (concat "\\<"
- (regexp-opt '("if" "until" "while" "elsif" "else" "unless"
- "do" "dump" "for" "foreach" "exit" "die"
- "BEGIN" "END" "return" "exec" "eval") t)
- "\\>")
- ;;
- ;; Fontify local and my keywords as types.
- '("\\<\\(local\\|my\\)\\>" . font-lock-type-face)
- ;;
- ;; Fontify function, variable and file name references.
- '("&\\(\\sw+\\(::\\sw+\\)*\\)" 1 font-lock-function-name-face)
- ;; Additionally underline non-scalar variables. Maybe this is a bad idea.
- ;;'("[$@%*][#{]?\\(\\sw+\\)" 1 font-lock-variable-name-face)
- '("[$*]{?\\(\\sw+\\(::\\sw+\\)*\\)" 1 font-lock-variable-name-face)
- '("\\([@%]\\|\\$#\\)\\(\\sw+\\(::\\sw+\\)*\\)"
+ (append
+ perl-font-lock-keywords-1
+ `( ;; Fontify keywords, except those fontified otherwise.
+ ,(concat "\\<"
+ (regexp-opt '("if" "until" "while" "elsif" "else" "unless"
+ "do" "dump" "for" "foreach" "exit" "die"
+ "BEGIN" "END" "return" "exec" "eval") t)
+ "\\>")
+ ;;
+ ;; Fontify local and my keywords as types.
+ ("\\<\\(local\\|my\\)\\>" . font-lock-type-face)
+ ;;
+ ;; Fontify function, variable and file name references.
+ ("&\\(\\sw+\\(::\\sw+\\)*\\)" 1 font-lock-function-name-face)
+ ;; Additionally underline non-scalar variables. Maybe this is a bad idea.
+ ;;'("[$@%*][#{]?\\(\\sw+\\)" 1 font-lock-variable-name-face)
+ ("[$*]{?\\(\\sw+\\(::\\sw+\\)*\\)" 1 font-lock-variable-name-face)
+ ("\\([@%]\\|\\$#\\)\\(\\sw+\\(::\\sw+\\)*\\)"
(2 (cons font-lock-variable-name-face '(underline))))
- '("<\\(\\sw+\\)>" 1 font-lock-constant-face)
- ;;
- ;; Fontify keywords with/and labels as we do in `c++-font-lock-keywords'.
- '("\\<\\(continue\\|goto\\|last\\|next\\|redo\\)\\>[ \t]*\\(\\sw+\\)?"
+ ("<\\(\\sw+\\)>" 1 font-lock-constant-face)
+ ;;
+ ;; Fontify keywords with/and labels as we do in `c++-font-lock-keywords'.
+ ("\\<\\(continue\\|goto\\|last\\|next\\|redo\\)\\>[ \t]*\\(\\sw+\\)?"
(1 font-lock-keyword-face) (2 font-lock-constant-face nil t))
- '("^[ \t]*\\(\\sw+\\)[ \t]*:[^:]" 1 font-lock-constant-face)))
+ ("^[ \t]*\\(\\sw+\\)[ \t]*:[^:]" 1 font-lock-constant-face)
+ ,@(perl--font-lock-symbols-keywords)))
"Gaudy level highlighting for Perl mode.")
(defvar perl-font-lock-keywords perl-font-lock-keywords-1
@@ -543,11 +571,20 @@ create a new comment."
(defun perl-outline-level ()
(cond
- ((looking-at "package\\s-") 0)
- ((looking-at "sub\\s-") 1)
+ ((looking-at "[ \t]*\\(package\\)\\s-")
+ (- (match-beginning 1) (match-beginning 0)))
+ ((looking-at "[ \t]*s\\(ub\\)\\s-")
+ (- (match-beginning 1) (match-beginning 0)))
((looking-at "=head[0-9]") (- (char-before (match-end 0)) ?0))
((looking-at "=cut") 1)
(t 3)))
+
+(defun perl-current-defun-name ()
+ "The `add-log-current-defun' function in Perl mode."
+ (save-excursion
+ (if (re-search-backward "^sub[ \t]+\\([^({ \t\n]+\\)" nil t)
+ (match-string-no-properties 1))))
+
(defvar perl-mode-hook nil
"Normal hook to run when entering Perl mode.")
@@ -601,15 +638,15 @@ Various indentation styles: K&R BSD BLK GNU LW
Turning on Perl mode runs the normal hook `perl-mode-hook'."
:abbrev-table perl-mode-abbrev-table
- (set (make-local-variable 'paragraph-start) (concat "$\\|" page-delimiter))
- (set (make-local-variable 'paragraph-separate) paragraph-start)
- (set (make-local-variable 'paragraph-ignore-fill-prefix) t)
- (set (make-local-variable 'indent-line-function) #'perl-indent-line)
- (set (make-local-variable 'comment-start) "# ")
- (set (make-local-variable 'comment-end) "")
- (set (make-local-variable 'comment-start-skip) "\\(^\\|\\s-\\);?#+ *")
- (set (make-local-variable 'comment-indent-function) #'perl-comment-indent)
- (set (make-local-variable 'parse-sexp-ignore-comments) t)
+ (setq-local paragraph-start (concat "$\\|" page-delimiter))
+ (setq-local paragraph-separate paragraph-start)
+ (setq-local paragraph-ignore-fill-prefix t)
+ (setq-local indent-line-function #'perl-indent-line)
+ (setq-local comment-start "# ")
+ (setq-local comment-end "")
+ (setq-local comment-start-skip "\\(^\\|\\s-\\);?#+ *")
+ (setq-local comment-indent-function #'perl-comment-indent)
+ (setq-local parse-sexp-ignore-comments t)
;; Tell font-lock.el how to handle Perl.
(setq font-lock-defaults '((perl-font-lock-keywords
perl-font-lock-keywords-1
@@ -617,17 +654,21 @@ Turning on Perl mode runs the normal hook `perl-mode-hook'."
nil nil ((?\_ . "w")) nil
(font-lock-syntactic-face-function
. perl-font-lock-syntactic-face-function)))
- (set (make-local-variable 'syntax-propertize-function)
- #'perl-syntax-propertize-function)
+ (setq-local syntax-propertize-function #'perl-syntax-propertize-function)
(add-hook 'syntax-propertize-extend-region-functions
#'syntax-propertize-multiline 'append 'local)
+ ;; Electricity.
+ ;; FIXME: setup electric-layout-rules.
+ (setq-local electric-indent-chars
+ (append '(?\{ ?\} ?\; ?\:) electric-indent-chars))
+ (add-hook 'electric-indent-functions #'perl-electric-noindent-p nil t)
;; Tell imenu how to handle Perl.
- (set (make-local-variable 'imenu-generic-expression)
- perl-imenu-generic-expression)
+ (setq-local imenu-generic-expression perl-imenu-generic-expression)
(setq imenu-case-fold-search nil)
;; Setup outline-minor-mode.
- (set (make-local-variable 'outline-regexp) perl-outline-regexp)
- (set (make-local-variable 'outline-level) 'perl-outline-level))
+ (setq-local outline-regexp perl-outline-regexp)
+ (setq-local outline-level 'perl-outline-level)
+ (setq-local add-log-current-defun-function #'perl-current-defun-name))
;; This is used by indent-for-comment
;; to decide how much to indent a comment in Perl code
@@ -637,7 +678,11 @@ Turning on Perl mode runs the normal hook `perl-mode-hook'."
0 ;Existing comment at bol stays there.
comment-column))
-(defalias 'electric-perl-terminator 'perl-electric-terminator)
+(define-obsolete-function-alias 'electric-perl-terminator
+ 'perl-electric-terminator "22.1")
+(defun perl-electric-noindent-p (char)
+ (unless (eolp) 'no-indent))
+
(defun perl-electric-terminator (arg)
"Insert character and maybe adjust indentation.
If at end-of-line, and not in a comment or a quote, correct the indentation."
@@ -661,6 +706,7 @@ If at end-of-line, and not in a comment or a quote, correct the indentation."
(perl-indent-line)
(delete-char -1))))
(self-insert-command (prefix-numeric-value arg)))
+(make-obsolete 'perl-electric-terminator 'electric-indent-mode "24.4")
;; not used anymore, but may be useful someday:
;;(defun perl-inside-parens-p ()
@@ -744,6 +790,7 @@ following list:
(t
(message "Use backslash to quote # characters.")
(ding t)))))))))
+(make-obsolete 'perl-indent-command 'indent-according-to-mode "24.4")
(defun perl-indent-line (&optional nochange parse-start)
"Indent current line as Perl code.
diff --git a/lisp/progmodes/prolog.el b/lisp/progmodes/prolog.el
index 460dcd69447..8971e97a44e 100644
--- a/lisp/progmodes/prolog.el
+++ b/lisp/progmodes/prolog.el
@@ -1,9 +1,9 @@
-;;; prolog.el --- major mode for editing and running Prolog (and Mercury) code
+;;; prolog.el --- major mode for Prolog (and Mercury) -*- coding: utf-8 -*-
;; Copyright (C) 1986-1987, 1997-1999, 2002-2003, 2011-2013 Free
;; Software Foundation, Inc.
-;; Authors: Emil Åström <emil_astrom(at)hotmail(dot)com>
+;; Authors: Emil Åström <emil_astrom(at)hotmail(dot)com>
;; Milan Zamazal <pdm(at)freesoft(dot)cz>
;; Stefan Bruda <stefan(at)bruda(dot)ca>
;; * See below for more details
@@ -31,7 +31,7 @@
;; Original author: Masanobu UMEDA <umerin(at)mse(dot)kyutech(dot)ac(dot)jp>
;; Parts of this file was taken from a modified version of the original
;; by Johan Andersson, Peter Olin, Mats Carlsson, Johan Bevemyr, Stefan
-;; Andersson, and Per Danielsson (all SICS people), and Henrik Båkman
+;; Andersson, and Per Danielsson (all SICS people), and Henrik BÃ¥kman
;; at Uppsala University, Sweden.
;;
;; Some ideas and also a few lines of code have been borrowed (not stolen ;-)
@@ -1770,7 +1770,8 @@ This function must be called from the source code buffer."
real-file))
(with-current-buffer buffer
(goto-char (point-max))
- (set-process-filter process 'prolog-consult-compile-filter)
+ (add-function :override (process-filter process)
+ #'prolog-consult-compile-filter)
(process-send-string "prolog" command-string)
;; (prolog-build-prolog-command compilep file real-file first-line))
(while (and prolog-process-flag
@@ -1781,7 +1782,8 @@ This function must be called from the source code buffer."
(insert (if compilep
"\nCompilation finished.\n"
"\nConsulted.\n"))
- (set-process-filter process old-filter))))
+ (remove-function (process-filter process)
+ #'prolog-consult-compile-filter))))
(defvar compilation-error-list)
diff --git a/lisp/progmodes/ps-mode.el b/lisp/progmodes/ps-mode.el
index 184de99302e..0f994a8422b 100644
--- a/lisp/progmodes/ps-mode.el
+++ b/lisp/progmodes/ps-mode.el
@@ -5,7 +5,7 @@
;; Author: Peter Kleiweg <p.c.j.kleiweg@rug.nl>
;; Maintainer: Peter Kleiweg <p.c.j.kleiweg@rug.nl>
;; Created: 20 Aug 1997
-;; Version: 1.1h
+;; Version: 1.1i
;; Keywords: PostScript, languages
;; Yoni Rabkin <yoni@rabkins.net> contacted the maintainer of this
@@ -35,8 +35,9 @@
;;; Code:
-(defconst ps-mode-version "1.1h, 16 Jun 2005")
-(defconst ps-mode-maintainer-address "Peter Kleiweg <p.c.j.kleiweg@rug.nl>")
+(defconst ps-mode-version "1.1i, 17 May 2008")
+(defconst ps-mode-maintainer-address
+ "Peter Kleiweg <p.c.j.kleiweg@rug.nl>, bug-gnu-emacs@gnu.org")
(require 'comint)
(require 'easymenu)
@@ -805,7 +806,7 @@ Only one `%' is removed, and it has to be in the first column."
(while (re-search-forward "[\200-\377]" (marker-position endm) t)
(setq i (1+ i))
(backward-char)
- (insert (format "\\%03o" (string-to-char (buffer-substring (point) (1+ (point))))))
+ (insert (format "\\%03o" (string-to-char (string-make-unibyte (buffer-substring (point) (1+ (point)))))))
(delete-char 1))
(message "%d change%s made" i (if (= i 1) "" "s"))
(set-marker endm nil)))))
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 266d193cdda..2165c835057 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -177,12 +177,14 @@
;; might guessed you should run `python-shell-send-buffer' from time
;; to time to get better results too.
-;; Imenu: This mode supports Imenu in its most basic form, letting it
-;; build the necessary alist via `imenu-default-create-index-function'
-;; by having set `imenu-extract-index-name-function' to
-;; `python-info-current-defun' and
-;; `imenu-prev-index-position-function' to
-;; `python-imenu-prev-index-position'.
+;; Imenu: There are two index building functions to be used as
+;; `imenu-create-index-function': `python-imenu-create-index' (the
+;; default one, builds the alist in form of a tree) and
+;; `python-imenu-create-flat-index'. See also
+;; `python-imenu-format-item-label-function',
+;; `python-imenu-format-parent-item-label-function',
+;; `python-imenu-format-parent-item-jump-label-function' variables for
+;; changing the way labels are formatted in the tree version.
;; If you used python-mode.el you probably will miss auto-indentation
;; when inserting newlines. To achieve the same behavior you have
@@ -213,12 +215,10 @@
(require 'ansi-color)
(require 'comint)
-(eval-when-compile
- (require 'cl)
- ;; Avoid compiler warnings
- (defvar view-return-to-alist)
- (defvar compilation-error-regexp-alist)
- (defvar outline-heading-end-regexp))
+;; Avoid compiler warnings
+(defvar view-return-to-alist)
+(defvar compilation-error-regexp-alist)
+(defvar outline-heading-end-regexp)
(autoload 'comint-mode "comint")
@@ -370,16 +370,30 @@ This variant of `rx' supports common python named REGEXPS."
;;; Font-lock and syntax
+(eval-when-compile
+ (defun python-syntax--context-compiler-macro (form type &optional syntax-ppss)
+ (pcase type
+ (`'comment
+ `(let ((ppss (or ,syntax-ppss (syntax-ppss))))
+ (and (nth 4 ppss) (nth 8 ppss))))
+ (`'string
+ `(let ((ppss (or ,syntax-ppss (syntax-ppss))))
+ (and (nth 3 ppss) (nth 8 ppss))))
+ (`'paren
+ `(nth 1 (or ,syntax-ppss (syntax-ppss))))
+ (_ form))))
+
(defun python-syntax-context (type &optional syntax-ppss)
"Return non-nil if point is on TYPE using SYNTAX-PPSS.
TYPE can be `comment', `string' or `paren'. It returns the start
character address of the specified TYPE."
+ (declare (compiler-macro python-syntax--context-compiler-macro))
(let ((ppss (or syntax-ppss (syntax-ppss))))
- (case type
- (comment (and (nth 4 ppss) (nth 8 ppss)))
- (string (and (not (nth 4 ppss)) (nth 8 ppss)))
- (paren (nth 1 ppss))
- (t nil))))
+ (pcase type
+ (`comment (and (nth 4 ppss) (nth 8 ppss)))
+ (`string (and (nth 3 ppss) (nth 8 ppss)))
+ (`paren (nth 1 ppss))
+ (_ nil))))
(defun python-syntax-context-type (&optional syntax-ppss)
"Return the context type using SYNTAX-PPSS.
@@ -491,8 +505,8 @@ The type returned can be `comment', `string' or `paren'."
(when (re-search-forward re limit t)
(while (and (python-syntax-context 'paren)
(re-search-forward re limit t)))
- (if (and (not (python-syntax-context 'paren))
- (not (equal (char-after (point-marker)) ?=)))
+ (if (not (or (python-syntax-context 'paren)
+ (equal (char-after (point-marker)) ?=)))
t
(set-match-data nil)))))
(1 font-lock-variable-name-face nil nil))
@@ -526,7 +540,7 @@ is used to limit the scan."
(while (and (< i 3)
(or (not limit) (< (+ point i) limit))
(eq (char-after (+ point i)) quote-char))
- (incf i))
+ (setq i (1+ i)))
i))
(defun python-syntax-stringify ()
@@ -744,17 +758,17 @@ START is the buffer position where the sexp starts."
(save-restriction
(widen)
(save-excursion
- (case context-status
- ('no-indent 0)
+ (pcase context-status
+ (`no-indent 0)
;; When point is after beginning of block just add one level
;; of indentation relative to the context-start
- ('after-beginning-of-block
+ (`after-beginning-of-block
(goto-char context-start)
(+ (current-indentation) python-indent-offset))
;; When after a simple line just use previous line
;; indentation, in the case current line starts with a
;; `python-indent-dedenters' de-indent one level.
- ('after-line
+ (`after-line
(-
(save-excursion
(goto-char context-start)
@@ -771,11 +785,11 @@ START is the buffer position where the sexp starts."
;; When inside of a string, do nothing. just use the current
;; indentation. XXX: perhaps it would be a good idea to
;; invoke standard text indentation here
- ('inside-string
+ (`inside-string
(goto-char context-start)
(current-indentation))
;; After backslash we have several possibilities.
- ('after-backslash
+ (`after-backslash
(cond
;; Check if current line is a dot continuation. For this
;; the current line must start with a dot and previous
@@ -841,7 +855,7 @@ START is the buffer position where the sexp starts."
(+ (current-indentation) python-indent-offset)))))
;; When inside a paren there's a need to handle nesting
;; correctly
- ('inside-paren
+ (`inside-paren
(cond
;; If current line closes the outermost open paren use the
;; current indentation of the context-start line.
@@ -1180,6 +1194,70 @@ Returns nil if point is not in a def or class."
;; Ensure point moves forward.
(and (> beg-pos (point)) (goto-char beg-pos)))))
+(defun python-nav--syntactically (fn poscompfn &optional contextfn)
+ "Move point using FN avoiding places with specific context.
+FN must take no arguments. POSCOMPFN is a two arguments function
+used to compare current and previous point after it is moved
+using FN, this is normally a less-than or greater-than
+comparison. Optional argument CONTEXTFN defaults to
+`python-syntax-context-type' and is used for checking current
+point context, it must return a non-nil value if this point must
+be skipped."
+ (let ((contextfn (or contextfn 'python-syntax-context-type))
+ (start-pos (point-marker))
+ (prev-pos))
+ (catch 'found
+ (while t
+ (let* ((newpos
+ (and (funcall fn) (point-marker)))
+ (context (funcall contextfn)))
+ (cond ((and (not context) newpos
+ (or (and (not prev-pos) newpos)
+ (and prev-pos newpos
+ (funcall poscompfn newpos prev-pos))))
+ (throw 'found (point-marker)))
+ ((and newpos context)
+ (setq prev-pos (point)))
+ (t (when (not newpos) (goto-char start-pos))
+ (throw 'found nil))))))))
+
+(defun python-nav--forward-defun (arg)
+ "Internal implementation of python-nav-{backward,forward}-defun.
+Uses ARG to define which function to call, and how many times
+repeat it."
+ (let ((found))
+ (while (and (> arg 0)
+ (setq found
+ (python-nav--syntactically
+ (lambda ()
+ (re-search-forward
+ python-nav-beginning-of-defun-regexp nil t))
+ '>)))
+ (setq arg (1- arg)))
+ (while (and (< arg 0)
+ (setq found
+ (python-nav--syntactically
+ (lambda ()
+ (re-search-backward
+ python-nav-beginning-of-defun-regexp nil t))
+ '<)))
+ (setq arg (1+ arg)))
+ found))
+
+(defun python-nav-backward-defun (&optional arg)
+ "Navigate to closer defun backward ARG times.
+Unlikely `python-nav-beginning-of-defun' this doesn't care about
+nested definitions."
+ (interactive "^p")
+ (python-nav--forward-defun (- (or arg 1))))
+
+(defun python-nav-forward-defun (&optional arg)
+ "Navigate to closer defun forward ARG times.
+Unlikely `python-nav-beginning-of-defun' this doesn't care about
+nested definitions."
+ (interactive "^p")
+ (python-nav--forward-defun (or arg 1)))
+
(defun python-nav-beginning-of-statement ()
"Move to start of current statement."
(interactive "^")
@@ -2218,11 +2296,11 @@ INPUT."
'default)
(t nil)))
(completion-code
- (case completion-context
- (pdb python-shell-completion-pdb-string-code)
- (import python-shell-completion-module-string-code)
- (default python-shell-completion-string-code)
- (t nil)))
+ (pcase completion-context
+ (`pdb python-shell-completion-pdb-string-code)
+ (`import python-shell-completion-module-string-code)
+ (`default python-shell-completion-string-code)
+ (_ nil)))
(input
(if (eq completion-context 'import)
(replace-regexp-in-string "^[ \t]+" "" line)
@@ -2335,7 +2413,7 @@ Argument OUTPUT is a string with the output from the comint process."
;; encounters an exception, it prints the _entire_ stack
;; trace. To handle all of these cases, we want to find
;; the _last_ stack frame printed in the most recent
- ;; batch of output, then jump to the corrsponding
+ ;; batch of output, then jump to the corresponding
;; file/line number.
(goto-char (point-max))
(when (re-search-backward python-pdbtrack-stacktrace-info-regexp nil t)
@@ -2530,12 +2608,12 @@ JUSTIFY should be used (if applicable) as in `fill-paragraph'."
JUSTIFY should be used (if applicable) as in `fill-paragraph'."
(let* ((marker (point-marker))
(str-start-pos
- (let ((m (make-marker)))
- (setf (marker-position m)
- (or (python-syntax-context 'string)
- (and (equal (string-to-syntax "|")
- (syntax-after (point)))
- (point)))) m))
+ (set-marker
+ (make-marker)
+ (or (python-syntax-context 'string)
+ (and (equal (string-to-syntax "|")
+ (syntax-after (point)))
+ (point)))))
(num-quotes (python-syntax-count-quotes
(char-after str-start-pos) str-start-pos))
(str-end-pos
@@ -2548,17 +2626,17 @@ JUSTIFY should be used (if applicable) as in `fill-paragraph'."
;; Docstring styles may vary for oneliners and multi-liners.
(> (count-matches "\n" str-start-pos str-end-pos) 0))
(delimiters-style
- (case python-fill-docstring-style
+ (pcase python-fill-docstring-style
;; delimiters-style is a cons cell with the form
;; (START-NEWLINES . END-NEWLINES). When any of the sexps
;; is NIL means to not add any newlines for start or end
;; of docstring. See `python-fill-docstring-style' for a
;; graphic idea of each style.
- (django (cons 1 1))
- (onetwo (and multi-line-p (cons 1 2)))
- (pep-257 (and multi-line-p (cons nil 2)))
- (pep-257-nn (and multi-line-p (cons nil 1)))
- (symmetric (and multi-line-p (cons 1 1)))))
+ (`django (cons 1 1))
+ (`onetwo (and multi-line-p (cons 1 2)))
+ (`pep-257 (and multi-line-p (cons nil 2)))
+ (`pep-257-nn (and multi-line-p (cons nil 1)))
+ (`symmetric (and multi-line-p (cons 1 1)))))
(docstring-p (save-excursion
;; Consider docstrings those strings which
;; start on a line by themselves.
@@ -2644,8 +2722,8 @@ the if condition."
(defvar python-skeleton-available '()
"Internal list of available skeletons.")
-(define-abbrev-table 'python-mode-abbrev-table ()
- "Abbrev table for Python mode."
+(define-abbrev-table 'python-mode-skeleton-abbrev-table ()
+ "Abbrev table for Python mode skeletons."
:case-fixed t
;; Allow / inside abbrevs.
:regexp "\\(?:^\\|[^/]\\)\\<\\([[:word:]/]+\\)\\W*"
@@ -2658,13 +2736,13 @@ the if condition."
(defmacro python-skeleton-define (name doc &rest skel)
"Define a `python-mode' skeleton using NAME DOC and SKEL.
The skeleton will be bound to python-skeleton-NAME and will
-be added to `python-mode-abbrev-table'."
+be added to `python-mode-skeleton-abbrev-table'."
(declare (indent 2))
(let* ((name (symbol-name name))
(function-name (intern (concat "python-skeleton-" name))))
`(progn
- (define-abbrev python-mode-abbrev-table ,name "" ',function-name
- :system t)
+ (define-abbrev python-mode-skeleton-abbrev-table
+ ,name "" ',function-name :system t)
(setq python-skeleton-available
(cons ',function-name python-skeleton-available))
(define-skeleton ,function-name
@@ -2672,6 +2750,10 @@ be added to `python-mode-abbrev-table'."
(format "Insert %s statement." name))
,@skel))))
+(define-abbrev-table 'python-mode-abbrev-table ()
+ "Abbrev table for Python mode."
+ :parents (list python-mode-skeleton-abbrev-table))
+
(defmacro python-define-auxiliary-skeleton (name doc &optional &rest skel)
"Define a `python-mode' auxiliary skeleton using NAME DOC and SKEL.
The skeleton will be bound to python-skeleton-NAME."
@@ -2759,7 +2841,7 @@ The skeleton will be bound to python-skeleton-NAME."
(easy-menu-add-item
nil '("Python" "Skeletons")
`[,(format
- "Insert %s" (caddr (split-string (symbol-name skeleton) "-")))
+ "Insert %s" (nth 2 (split-string (symbol-name skeleton) "-")))
,skeleton t]))))
;;; FFAP
@@ -2928,15 +3010,193 @@ Interactively, prompt for symbol."
;;; Imenu
-(defun python-imenu-prev-index-position ()
- "Python mode's `imenu-prev-index-position-function'."
- (let ((found))
- (while (and (setq found
- (re-search-backward python-nav-beginning-of-defun-regexp nil t))
- (not (python-info-looking-at-beginning-of-defun))))
- (and found
- (python-info-looking-at-beginning-of-defun)
- (python-info-current-defun))))
+(defvar python-imenu-format-item-label-function
+ 'python-imenu-format-item-label
+ "Imenu function used to format an item label.
+It must be a function with two arguments: TYPE and NAME.")
+
+(defvar python-imenu-format-parent-item-label-function
+ 'python-imenu-format-parent-item-label
+ "Imenu function used to format a parent item label.
+It must be a function with two arguments: TYPE and NAME.")
+
+(defvar python-imenu-format-parent-item-jump-label-function
+ 'python-imenu-format-parent-item-jump-label
+ "Imenu function used to format a parent jump item label.
+It must be a function with two arguments: TYPE and NAME.")
+
+(defun python-imenu-format-item-label (type name)
+ "Return imenu label for single node using TYPE and NAME."
+ (format "%s (%s)" name type))
+
+(defun python-imenu-format-parent-item-label (type name)
+ "Return imenu label for parent node using TYPE and NAME."
+ (format "%s..." (python-imenu-format-item-label type name)))
+
+(defun python-imenu-format-parent-item-jump-label (type name)
+ "Return imenu label for parent node jump using TYPE and NAME."
+ (if (string= type "class")
+ "*class definition*"
+ "*function definition*"))
+
+(defun python-imenu--put-parent (type name pos num-children tree &optional root)
+ "Add the parent with TYPE, NAME, POS and NUM-CHILDREN to TREE.
+Optional Argument ROOT must be non-nil when the node being
+processed is the root of the TREE."
+ (let ((label
+ (funcall python-imenu-format-item-label-function type name))
+ (jump-label
+ (funcall python-imenu-format-parent-item-jump-label-function type name)))
+ (if root
+ ;; This is the root, everything is a children.
+ (cons label (cons (cons jump-label pos) tree))
+ ;; This is node a which may contain some children.
+ (cons
+ (cons label (cons (cons jump-label pos)
+ ;; Append all the children
+ (python-util-popn tree num-children)))
+ ;; All previous non-children nodes.
+ (nthcdr num-children tree)))))
+
+(defun python-imenu--build-tree (&optional min-indent prev-indent num-children tree)
+ "Recursively build the tree of nested definitions of a node.
+Arguments MIN-INDENT PREV-INDENT NUM-CHILDREN and TREE are
+internal and should not be passed explicitly unless you know what
+you are doing."
+ (setq num-children (or num-children 0)
+ min-indent (or min-indent 0))
+ (let* ((pos (python-nav-backward-defun))
+ (type)
+ (name (when (and pos (looking-at python-nav-beginning-of-defun-regexp))
+ (let ((split (split-string (match-string-no-properties 0))))
+ (setq type (car split))
+ (cadr split))))
+ (label (when name
+ (funcall python-imenu-format-item-label-function type name)))
+ (indent (current-indentation)))
+ (cond ((not pos)
+ ;; No defun found, nothing to add.
+ tree)
+ ((equal indent 0)
+ (if (> num-children 0)
+ ;; Append it as the parent of everything collected to
+ ;; this point.
+ (python-imenu--put-parent type name pos num-children tree t)
+ ;; There are no children, this is a lonely defun.
+ (cons label pos)))
+ ((equal min-indent indent)
+ ;; Stop collecting nodes after moving to a position with
+ ;; indentation equaling min-indent. This is specially
+ ;; useful for navigating nested definitions recursively.
+ tree)
+ (t
+ (python-imenu--build-tree
+ min-indent
+ indent
+ ;; Add another children, either when this is the
+ ;; first call or when indentation is
+ ;; less-or-equal than previous. And do not
+ ;; discard the number of children, because the
+ ;; way code is scanned, all children are
+ ;; collected until a root node yet to be found
+ ;; appears.
+ (if (or (not prev-indent)
+ (and
+ (> indent min-indent)
+ (<= indent prev-indent)))
+ (1+ num-children)
+ num-children)
+ (cond ((not prev-indent)
+ ;; First call to the function: append this
+ ;; defun to the index.
+ (list (cons label pos)))
+ ((= indent prev-indent)
+ ;; Add another defun with the same depth
+ ;; as the previous.
+ (cons (cons label pos) tree))
+ ((and (< indent prev-indent)
+ (< 0 num-children))
+ ;; There are children to be appended and
+ ;; the previous defun had more
+ ;; indentation, the current one must be a
+ ;; parent.
+ (python-imenu--put-parent type name pos num-children tree))
+ ((> indent prev-indent)
+ ;; There are children defuns deeper than
+ ;; current depth. Fear not, we already
+ ;; know how to treat them.
+ (cons
+ (prog1
+ (python-imenu--build-tree
+ prev-indent indent 1 (list (cons label pos)))
+ ;; Adjustment: after scanning backwards
+ ;; for all deeper children, we need to
+ ;; continue our scan for a parent from
+ ;; the current defun we are looking at.
+ (python-nav-forward-defun))
+ tree))))))))
+
+(defun python-imenu-create-index ()
+ "Return tree Imenu alist for the current python buffer.
+Change `python-imenu-format-item-label-function',
+`python-imenu-format-parent-item-label-function',
+`python-imenu-format-parent-item-jump-label-function' to
+customize how labels are formatted."
+ (goto-char (point-max))
+ (let ((index)
+ (tree))
+ (while (setq tree (python-imenu--build-tree))
+ (setq index (cons tree index)))
+ index))
+
+(defun python-imenu-create-flat-index (&optional alist prefix)
+ "Return flat outline of the current python buffer for Imenu.
+Optional Argument ALIST is the tree to be flattened, when nil
+`python-imenu-build-index' is used with
+`python-imenu-format-parent-item-jump-label-function'
+`python-imenu-format-parent-item-label-function'
+`python-imenu-format-item-label-function' set to (lambda (type
+name) name). Optional Argument PREFIX is used in recursive calls
+and should not be passed explicitly.
+
+Converts this:
+
+ \((\"Foo\" . 103)
+ (\"Bar\" . 138)
+ (\"decorator\"
+ (\"decorator\" . 173)
+ (\"wrap\"
+ (\"wrap\" . 353)
+ (\"wrapped_f\" . 393))))
+
+To this:
+
+ \((\"Foo\" . 103)
+ (\"Bar\" . 138)
+ (\"decorator\" . 173)
+ (\"decorator.wrap\" . 353)
+ (\"decorator.wrapped_f\" . 393))"
+ ;; Inspired by imenu--flatten-index-alist removed in revno 21853.
+ (apply
+ 'nconc
+ (mapcar
+ (lambda (item)
+ (let ((name (if prefix
+ (concat prefix "." (car item))
+ (car item)))
+ (pos (cdr item)))
+ (cond ((or (numberp pos) (markerp pos))
+ (list (cons name pos)))
+ ((listp pos)
+ (cons
+ (cons name (cdar pos))
+ (python-imenu-create-flat-index (cddr item) name))))))
+ (or alist
+ (let* ((fn (lambda (type name) name))
+ (python-imenu-format-item-label-function fn)
+ (python-imenu-format-parent-item-label-function fn)
+ (python-imenu-format-parent-item-jump-label-function fn))
+ (python-imenu-create-index))))))
;;; Misc helpers
@@ -3257,6 +3517,22 @@ Optional argument DIRECTION defines the direction to move to."
(goto-char comment-start))
(forward-comment factor)))
+(defun python-util-popn (lst n)
+ "Return LST first N elements.
+N should be an integer, when it's a natural negative number its
+opposite is used. When N is bigger than the length of LST, the
+list is returned as is."
+ (let* ((n (min (abs n)))
+ (len (length lst))
+ (acc))
+ (if (> n len)
+ lst
+ (while (< 0 n)
+ (setq acc (cons (car lst) acc)
+ lst (cdr lst)
+ n (1- n)))
+ (reverse acc))))
+
;;;###autoload
(define-derived-mode python-mode prog-mode "Python"
@@ -3302,11 +3578,8 @@ if that value is non-nil."
(add-hook 'post-self-insert-hook
'python-indent-post-self-insert-function nil 'local)
- (set (make-local-variable 'imenu-extract-index-name-function)
- #'python-info-current-defun)
-
- (set (make-local-variable 'imenu-prev-index-position-function)
- #'python-imenu-prev-index-position)
+ (set (make-local-variable 'imenu-create-index-function)
+ #'python-imenu-create-index)
(set (make-local-variable 'add-log-current-defun-function)
#'python-info-current-defun)
diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el
index e48ee8e92d3..631badac34c 100644
--- a/lisp/progmodes/ruby-mode.el
+++ b/lisp/progmodes/ruby-mode.el
@@ -103,10 +103,17 @@
'"\\(def\\|class\\|module\\)"
"Regexp to match the beginning of a defun, in the general sense.")
+(defconst ruby-singleton-class-re
+ "class\\s *<<"
+ "Regexp to match the beginning of a singleton class context.")
+
(eval-and-compile
(defconst ruby-here-doc-beg-re
"\\(<\\)<\\(-\\)?\\(\\([a-zA-Z0-9_]+\\)\\|[\"]\\([^\"]+\\)[\"]\\|[']\\([^']+\\)[']\\)"
- "Regexp to match the beginning of a heredoc."))
+ "Regexp to match the beginning of a heredoc.")
+
+ (defconst ruby-expression-expansion-re
+ "[^\\]\\(\\\\\\\\\\)*\\(#\\({[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}\\|\\(\\$\\|@\\|@@\\)\\(\\w\\|_\\)+\\)\\)"))
(defun ruby-here-doc-end-match ()
"Return a regexp to find the end of a heredoc.
@@ -382,10 +389,12 @@ and `\\' when preceded by `?'."
(when pos (goto-char pos))
(forward-word -1)
(and (or (bolp) (not (eq (char-before (point)) ?_)))
- (looking-at "class\\s *<<"))))
+ (looking-at ruby-singleton-class-re))))
(defun ruby-expr-beg (&optional option)
- "TODO: document."
+ "Check if point is possibly at the beginning of an expression.
+OPTION specifies the type of the expression.
+Can be one of `heredoc', `modifier', `expr-qstr', `expr-re'."
(save-excursion
(store-match-data nil)
(let ((space (skip-chars-backward " \t"))
@@ -398,10 +407,10 @@ and `\\' when preceded by `?'."
(or (eq (char-syntax (char-before (point))) ?w)
(ruby-special-char-p))))
nil)
- ((and (eq option 'heredoc) (< space 0))
- (not (progn (goto-char start) (ruby-singleton-class-p))))
- ((or (looking-at ruby-operator-re)
- (looking-at "[\\[({,;]")
+ ((looking-at ruby-operator-re))
+ ((eq option 'heredoc)
+ (and (< space 0) (not (ruby-singleton-class-p start))))
+ ((or (looking-at "[\\[({,;]")
(and (looking-at "[!?]")
(or (not (eq option 'modifier))
(bolp)
@@ -586,8 +595,7 @@ and `\\' when preceded by `?'."
(not (or (eq ?_ w)
(eq ?. w)))))
(goto-char pnt)
- (setq w (char-after (point)))
- (not (eq ?! w))
+ (not (eq ?! (char-after (point))))
(skip-chars-forward " \t")
(goto-char (match-beginning 0))
(or (not (looking-at ruby-modifier-re))
@@ -839,22 +847,24 @@ and `\\' when preceded by `?'."
indent))))
(defun ruby-beginning-of-defun (&optional arg)
- "Move backward to the beginning of the current top-level defun.
+ "Move backward to the beginning of the current defun.
With ARG, move backward multiple defuns. Negative ARG means
move forward."
(interactive "p")
- (and (re-search-backward (concat "^\\s *" ruby-defun-beg-re "\\_>")
- nil t (or arg 1))
- (beginning-of-line)))
-
-(defun ruby-end-of-defun (&optional arg)
- "Move forward to the end of the current top-level defun.
-With ARG, move forward multiple defuns. Negative ARG means
-move backward."
+ (let (case-fold-search)
+ (and (re-search-backward (concat "^\\s *" ruby-defun-beg-re "\\_>")
+ nil t (or arg 1))
+ (beginning-of-line))))
+
+(defun ruby-end-of-defun ()
+ "Move point to the end of the current defun.
+The defun begins at or after the point. This function is called
+by `end-of-defun'."
(interactive "p")
(ruby-forward-sexp)
- (when (looking-back (concat "^\\s *" ruby-block-end-re))
- (forward-line 1)))
+ (let (case-fold-search)
+ (when (looking-back (concat "^\\s *" ruby-block-end-re))
+ (forward-line 1))))
(defun ruby-beginning-of-indent ()
"Backtrack to a line which can be used as a reference for
@@ -866,39 +876,67 @@ calculating indentation on the lines after it."
(beginning-of-line)))))
(defun ruby-move-to-block (n)
- "Move to the beginning (N < 0) or the end (N > 0) of the current block
-or blocks containing the current block."
- ;; TODO: Make this work for n > 1,
- ;; make it not loop for n = 0,
- ;; document body
- (let ((orig (point))
- (start (ruby-calculate-indent))
- (down (looking-at (if (< n 0) ruby-block-end-re
- (concat "\\<\\(" ruby-block-beg-re "\\)\\>"))))
- pos done)
- (while (and (not done) (not (if (< n 0) (bobp) (eobp))))
- (forward-line n)
- (cond
- ((looking-at "^\\s *$"))
- ((looking-at "^\\s *#"))
- ((and (> n 0) (looking-at "^=begin\\>"))
- (re-search-forward "^=end\\>"))
- ((and (< n 0) (looking-at "^=end\\>"))
- (re-search-backward "^=begin\\>"))
- (t
- (setq pos (current-indentation))
+ "Move to the beginning (N < 0) or the end (N > 0) of the
+current block, a sibling block, or an outer block. Do that (abs N) times."
+ (let ((signum (if (> n 0) 1 -1))
+ (backward (< n 0))
+ (depth (or (nth 2 (ruby-parse-region (line-beginning-position)
+ (line-end-position)))
+ 0))
+ case-fold-search
+ down done)
+ (when (< (* depth signum) 0)
+ ;; Moving end -> end or beginning -> beginning.
+ (setq depth 0))
+ (dotimes (_ (abs n))
+ (setq done nil)
+ (setq down (save-excursion
+ (back-to-indentation)
+ ;; There is a block start or block end keyword on this
+ ;; line, don't need to look for another block.
+ (and (re-search-forward
+ (if backward ruby-block-end-re
+ (concat "\\_<\\(" ruby-block-beg-re "\\)\\_>"))
+ (line-end-position) t)
+ (not (nth 8 (syntax-ppss))))))
+ (while (and (not done) (not (if backward (bobp) (eobp))))
+ (forward-line signum)
(cond
- ((< start pos)
- (setq down t))
- ((and down (= pos start))
- (setq done t))
- ((> start pos)
- (setq done t)))))
- (if done
- (save-excursion
- (back-to-indentation)
- (if (looking-at (concat "\\<\\(" ruby-block-mid-re "\\)\\>"))
- (setq done nil)))))
+ ;; Skip empty and commented out lines.
+ ((looking-at "^\\s *$"))
+ ((looking-at "^\\s *#"))
+ ;; Skip block comments;
+ ((and (not backward) (looking-at "^=begin\\>"))
+ (re-search-forward "^=end\\>"))
+ ((and backward (looking-at "^=end\\>"))
+ (re-search-backward "^=begin\\>"))
+ ;; Jump over a multiline literal.
+ ((ruby-in-ppss-context-p 'string)
+ (goto-char (nth 8 (syntax-ppss)))
+ (unless backward
+ (forward-sexp)
+ (when (bolp) (forward-char -1)))) ; After a heredoc.
+ (t
+ (let ((state (ruby-parse-region (point) (line-end-position))))
+ (unless (car state) ; Line ends with unfinished string.
+ (setq depth (+ (nth 2 state) depth))))
+ (cond
+ ;; Deeper indentation, we found a block.
+ ;; FIXME: We can't recognize empty blocks this way.
+ ((> (* signum depth) 0)
+ (setq down t))
+ ;; Block found, and same indentation as when started, stop.
+ ((and down (zerop depth))
+ (setq done t))
+ ;; Shallower indentation, means outer block, can stop now.
+ ((< (* signum depth) 0)
+ (setq done t)))))
+ (if done
+ (save-excursion
+ (back-to-indentation)
+ ;; Not really at the first or last line of the block, move on.
+ (if (looking-at (concat "\\<\\(" ruby-block-mid-re "\\)\\>"))
+ (setq done nil))))))
(back-to-indentation)))
(defun ruby-beginning-of-block (&optional arg)
@@ -910,8 +948,7 @@ With ARG, move up multiple blocks."
(defun ruby-end-of-block (&optional arg)
"Move forward to the end of the current block.
With ARG, move out of multiple blocks."
- ;; Passing a value > 1 to ruby-move-to-block currently doesn't work.
- (interactive)
+ (interactive "p")
(ruby-move-to-block (or arg 1)))
(defun ruby-forward-sexp (&optional arg)
@@ -1034,70 +1071,87 @@ For example:
#exit
String#gsub
Net::HTTP#active?
- File::open.
+ File.open
See `add-log-current-defun-function'."
- ;; TODO: Document body
- ;; Why does this append a period to class methods?
(condition-case nil
(save-excursion
- (let (mname mlist (indent 0))
- ;; get current method (or class/module)
- (if (re-search-backward
- (concat "^[ \t]*" ruby-defun-beg-re "[ \t]+"
- "\\("
- ;; \\. and :: for class method
- "\\([A-Za-z_]" ruby-symbol-re "*\\|\\.\\|::" "\\)"
- "+\\)")
- nil t)
- (progn
- (setq mname (match-string 2))
- (unless (string-equal "def" (match-string 1))
- (setq mlist (list mname) mname nil))
- (goto-char (match-beginning 1))
- (setq indent (current-column))
- (beginning-of-line)))
- ;; nest class/module
+ (let* ((indent 0) mname mlist
+ (start (point))
+ (make-definition-re
+ (lambda (re)
+ (concat "^[ \t]*" re "[ \t]+"
+ "\\("
+ ;; \\. and :: for class methods
+ "\\([A-Za-z_]" ruby-symbol-re "*\\|\\.\\|::" "\\)"
+ "+\\)")))
+ (definition-re (funcall make-definition-re ruby-defun-beg-re))
+ (module-re (funcall make-definition-re "\\(class\\|module\\)")))
+ ;; Get the current method definition (or class/module).
+ (when (re-search-backward definition-re nil t)
+ (goto-char (match-beginning 1))
+ (if (not (string-equal "def" (match-string 1)))
+ (setq mlist (list (match-string 2)))
+ ;; We're inside the method. For classes and modules,
+ ;; this check is skipped for performance.
+ (when (ruby-block-contains-point start)
+ (setq mname (match-string 2))))
+ (setq indent (current-column))
+ (beginning-of-line))
+ ;; Walk up the class/module nesting.
(while (and (> indent 0)
- (re-search-backward
- (concat
- "^[ \t]*\\(class\\|module\\)[ \t]+"
- "\\([A-Z]" ruby-symbol-re "*\\)")
- nil t))
+ (re-search-backward module-re nil t))
(goto-char (match-beginning 1))
- (if (< (current-column) indent)
- (progn
- (setq mlist (cons (match-string 2) mlist))
- (setq indent (current-column))
- (beginning-of-line))))
+ (when (< (current-column) indent)
+ (setq mlist (cons (match-string 2) mlist))
+ (setq indent (current-column))
+ (beginning-of-line)))
+ ;; Process the method name.
(when mname
(let ((mn (split-string mname "\\.\\|::")))
(if (cdr mn)
(progn
- (cond
- ((string-equal "" (car mn))
- (setq mn (cdr mn) mlist nil))
- ((string-equal "self" (car mn))
- (setq mn (cdr mn)))
- ((let ((ml (nreverse mlist)))
+ (unless (string-equal "self" (car mn)) ; def self.foo
+ ;; def C.foo
+ (let ((ml (nreverse mlist)))
+ ;; If the method name references one of the
+ ;; containing modules, drop the more nested ones.
(while ml
(if (string-equal (car ml) (car mn))
(setq mlist (nreverse (cdr ml)) ml nil))
- (or (setq ml (cdr ml)) (nreverse mlist))))))
- (if mlist
- (setcdr (last mlist) mn)
- (setq mlist mn))
- (setq mn (last mn 2))
- (setq mname (concat "." (cadr mn)))
- (setcdr mn nil))
- (setq mname (concat "#" mname)))))
- ;; generate string
+ (or (setq ml (cdr ml)) (nreverse mlist))))
+ (if mlist
+ (setcdr (last mlist) (butlast mn))
+ (setq mlist (butlast mn))))
+ (setq mname (concat "." (car (last mn)))))
+ ;; See if the method is in singleton class context.
+ (let ((in-singleton-class
+ (when (re-search-forward ruby-singleton-class-re start t)
+ (goto-char (match-beginning 0))
+ ;; FIXME: Optimize it out, too?
+ ;; This can be slow in a large file, but
+ ;; unlike class/module declaration
+ ;; indentations, method definitions can be
+ ;; intermixed with these, and may or may not
+ ;; be additionally indented after visibility
+ ;; keywords.
+ (ruby-block-contains-point start))))
+ (setq mname (concat
+ (if in-singleton-class "." "#")
+ mname))))))
+ ;; Generate the string.
(if (consp mlist)
(setq mlist (mapconcat (function identity) mlist "::")))
(if mname
(if mlist (concat mlist mname) mname)
mlist)))))
+(defun ruby-block-contains-point (pt)
+ (save-excursion
+ (save-match-data
+ (ruby-forward-sexp)
+ (> (point) pt))))
+
(defun ruby-brace-to-do-end (orig end)
(let (beg-marker end-marker)
(goto-char end)
@@ -1225,8 +1279,10 @@ It will be properly highlighted even when the call omits parens."))
"\\)\\s *"
;; The regular expression itself.
"\\(/\\)[^/\n\\\\]*\\(?:\\\\.[^/\n\\\\]*\\)*\\(/\\)")
- (2 (string-to-syntax "\"/"))
- (3 (string-to-syntax "\"/")))
+ (3 (unless (nth 3 (syntax-ppss (match-beginning 2)))
+ (put-text-property (match-beginning 2) (match-end 2)
+ 'syntax-table (string-to-syntax "\"/"))
+ (string-to-syntax "\"/"))))
("^=en\\(d\\)\\_>" (1 "!"))
("^\\(=\\)begin\\_>" (1 "!"))
;; Handle here documents.
@@ -1238,7 +1294,8 @@ It will be properly highlighted even when the call omits parens."))
;; Handle percent literals: %w(), %q{}, etc.
((concat "\\(?:^\\|[[ \t\n<+(,=]\\)" ruby-percent-literal-beg-re)
(1 (prog1 "|" (ruby-syntax-propertize-percent-literal end)))))
- (point) end))
+ (point) end)
+ (ruby-syntax-propertize-expansions start end))
(defun ruby-syntax-propertize-heredoc (limit)
(let ((ppss (syntax-ppss))
@@ -1305,6 +1362,23 @@ It will be properly highlighted even when the call omits parens."))
(string-to-syntax "|")))
;; Unclosed literal, leave the following text unpropertized.
((scan-error search-failed) (goto-char limit))))))
+
+ (defun ruby-syntax-propertize-expansions (start end)
+ (remove-text-properties start end '(ruby-expansion-match-data))
+ (goto-char start)
+ ;; Find all expression expansions and
+ ;; - save the match data to a text property, for font-locking later,
+ ;; - set the syntax of all double quotes and backticks to punctuation.
+ (while (re-search-forward ruby-expression-expansion-re end 'move)
+ (let ((beg (match-beginning 2))
+ (end (match-end 2)))
+ (when (and beg (save-excursion (nth 3 (syntax-ppss beg))))
+ (put-text-property beg (1+ beg) 'ruby-expansion-match-data
+ (match-data))
+ (goto-char beg)
+ (while (re-search-forward "[\"`]" end 'move)
+ (put-text-property (match-beginning 0) (match-end 0)
+ 'syntax-table (string-to-syntax ".")))))))
)
;; For Emacsen where syntax-propertize-rules is not (yet) available,
@@ -1505,7 +1579,7 @@ See `font-lock-syntax-table'.")
1 font-lock-function-name-face)
;; keywords
(cons (concat
- "\\(^\\|[^_:.@$]\\|\\.\\.\\)\\b\\(defined\\?\\|"
+ "\\(^\\|[^.@$]\\|\\.\\.\\)\\_<\\(defined\\?\\|"
(regexp-opt
'("alias_method"
"alias"
@@ -1552,9 +1626,10 @@ See `font-lock-syntax-table'.")
ruby-keyword-end-re)
2)
;; here-doc beginnings
- (list ruby-here-doc-beg-re 0 'font-lock-string-face)
+ `(,ruby-here-doc-beg-re 0 (unless (ruby-singleton-class-p (match-beginning 0))
+ 'font-lock-string-face))
;; variables
- '("\\(^\\|[^_:.@$]\\|\\.\\.\\)\\b\\(nil\\|self\\|true\\|false\\)\\>"
+ '("\\(^\\|[^.@$]\\|\\.\\.\\)\\_<\\(nil\\|self\\|true\\|false\\)\\>"
2 font-lock-variable-name-face)
;; symbols
'("\\(^\\|[^:]\\)\\(:\\([-+~]@?\\|[/%&|^`]\\|\\*\\*?\\|<\\(<\\|=>?\\)?\\|>[>=]?\\|===?\\|=~\\|![~=]?\\|\\[\\]=?\\|@?\\(\\w\\|_\\)+\\([!?=]\\|\\b_*\\)\\|#{[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}\\)\\)"
@@ -1565,12 +1640,12 @@ See `font-lock-syntax-table'.")
'("\\(\\$\\|@\\|@@\\)\\(\\w\\|_\\)+"
0 font-lock-variable-name-face)
;; constants
- '("\\(^\\|[^_]\\)\\b\\([A-Z]+\\(\\w\\|_\\)*\\)"
- 2 font-lock-type-face)
+ '("\\(?:\\_<\\|::\\)\\([A-Z]+\\(\\w\\|_\\)*\\)"
+ 1 font-lock-type-face)
'("\\(^\\s *\\|[\[\{\(,]\\s *\\|\\sw\\s +\\)\\(\\(\\sw\\|_\\)+\\):[^:]" 2 font-lock-constant-face)
;; expression expansion
'(ruby-match-expression-expansion
- 0 font-lock-variable-name-face t)
+ 2 font-lock-variable-name-face t)
;; warn lower camel case
;'("\\<[a-z]+[a-z0-9]*[A-Z][A-Za-z0-9]*\\([!?]?\\|\\>\\)"
; 0 font-lock-warning-face)
@@ -1578,9 +1653,14 @@ See `font-lock-syntax-table'.")
"Additional expressions to highlight in Ruby mode.")
(defun ruby-match-expression-expansion (limit)
- (when (re-search-forward "[^\\]\\(\\\\\\\\\\)*\\(#\\({[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}\\|\\(\\$\\|@\\|@@\\)\\(\\w\\|_\\)+\\)\\)" limit 'move)
- (or (ruby-in-ppss-context-p 'string)
- (ruby-match-expression-expansion limit))))
+ (let* ((prop 'ruby-expansion-match-data)
+ (pos (next-single-char-property-change (point) prop nil limit))
+ value)
+ (when (and pos (> pos (point)))
+ (goto-char pos)
+ (or (and (setq value (get-text-property pos prop))
+ (progn (set-match-data value) t))
+ (ruby-match-expression-expansion limit)))))
;;;###autoload
(define-derived-mode ruby-mode prog-mode "Ruby"
@@ -1629,6 +1709,10 @@ The variable `ruby-indent-level' controls the amount of indentation.
;;;###autoload
(add-to-list 'auto-mode-alist (cons (purecopy "\\.rb\\'") 'ruby-mode))
+;;;###autoload
+(add-to-list 'auto-mode-alist (cons (purecopy "Rakefile\\'") 'ruby-mode))
+;;;###autoload
+(add-to-list 'auto-mode-alist (cons (purecopy "\\.gemspec\\'") 'ruby-mode))
;;;###autoload
(dolist (name (list "ruby" "rbx" "jruby" "ruby1.9" "ruby1.8"))
diff --git a/lisp/progmodes/scheme.el b/lisp/progmodes/scheme.el
index 01f0988f08f..fab20102097 100644
--- a/lisp/progmodes/scheme.el
+++ b/lisp/progmodes/scheme.el
@@ -126,44 +126,44 @@
(defun scheme-mode-variables ()
(set-syntax-table scheme-mode-syntax-table)
(setq local-abbrev-table scheme-mode-abbrev-table)
- (set (make-local-variable 'paragraph-start) (concat "$\\|" page-delimiter))
- (set (make-local-variable 'paragraph-separate) paragraph-start)
- (set (make-local-variable 'paragraph-ignore-fill-prefix) t)
- (set (make-local-variable 'fill-paragraph-function) 'lisp-fill-paragraph)
+ (setq-local paragraph-start (concat "$\\|" page-delimiter))
+ (setq-local paragraph-separate paragraph-start)
+ (setq-local paragraph-ignore-fill-prefix t)
+ (setq-local fill-paragraph-function 'lisp-fill-paragraph)
;; Adaptive fill mode gets in the way of auto-fill,
;; and should make no difference for explicit fill
;; because lisp-fill-paragraph should do the job.
- (set (make-local-variable 'adaptive-fill-mode) nil)
- (set (make-local-variable 'indent-line-function) 'lisp-indent-line)
- (set (make-local-variable 'parse-sexp-ignore-comments) t)
- (set (make-local-variable 'outline-regexp) ";;; \\|(....")
- (set (make-local-variable 'comment-start) ";")
- (set (make-local-variable 'comment-add) 1)
+ (setq-local adaptive-fill-mode nil)
+ (setq-local indent-line-function 'lisp-indent-line)
+ (setq-local parse-sexp-ignore-comments t)
+ (setq-local outline-regexp ";;; \\|(....")
+ (setq-local add-log-current-defun-function #'lisp-current-defun-name)
+ (setq-local comment-start ";")
+ (setq-local comment-add 1)
;; Look within the line for a ; following an even number of backslashes
;; after either a non-backslash or the line beginning.
- (set (make-local-variable 'comment-start-skip)
- "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\);+[ \t]*")
- (set (make-local-variable 'font-lock-comment-start-skip) ";+ *")
- (set (make-local-variable 'comment-column) 40)
- (set (make-local-variable 'parse-sexp-ignore-comments) t)
- (set (make-local-variable 'lisp-indent-function) 'scheme-indent-function)
+ (setq-local comment-start-skip
+ "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\);+[ \t]*")
+ (setq-local font-lock-comment-start-skip ";+ *")
+ (setq-local comment-column 40)
+ (setq-local parse-sexp-ignore-comments t)
+ (setq-local lisp-indent-function 'scheme-indent-function)
(setq mode-line-process '("" scheme-mode-line-process))
- (set (make-local-variable 'imenu-case-fold-search) t)
+ (setq-local imenu-case-fold-search t)
(setq imenu-generic-expression scheme-imenu-generic-expression)
- (set (make-local-variable 'imenu-syntax-alist)
+ (setq-local imenu-syntax-alist
'(("+-*/.<>=?!$%_&~^:" . "w")))
- (set (make-local-variable 'font-lock-defaults)
- '((scheme-font-lock-keywords
- scheme-font-lock-keywords-1 scheme-font-lock-keywords-2)
- nil t (("+-*/.<>=!?$%_&~^:" . "w") (?#. "w 14"))
- beginning-of-defun
- (font-lock-mark-block-function . mark-defun)
- (font-lock-syntactic-face-function
- . scheme-font-lock-syntactic-face-function)
- (parse-sexp-lookup-properties . t)
- (font-lock-extra-managed-props syntax-table)))
- (set (make-local-variable 'lisp-doc-string-elt-property)
- 'scheme-doc-string-elt))
+ (setq font-lock-defaults
+ '((scheme-font-lock-keywords
+ scheme-font-lock-keywords-1 scheme-font-lock-keywords-2)
+ nil t (("+-*/.<>=!?$%_&~^:" . "w") (?#. "w 14"))
+ beginning-of-defun
+ (font-lock-mark-block-function . mark-defun)
+ (font-lock-syntactic-face-function
+ . scheme-font-lock-syntactic-face-function)
+ (parse-sexp-lookup-properties . t)
+ (font-lock-extra-managed-props syntax-table)))
+ (setq-local lisp-doc-string-elt-property 'scheme-doc-string-elt))
(defvar scheme-mode-line-process "")
@@ -386,7 +386,7 @@ Blank lines separate paragraphs. Semicolons start comments.
Entering this mode runs the hooks `scheme-mode-hook' and then
`dsssl-mode-hook' and inserts the value of `dsssl-sgml-declaration' if
that variable's value is a string."
- (set (make-local-variable 'page-delimiter) "^;;;") ; ^L not valid SGML char
+ (setq-local page-delimiter "^;;;") ; ^L not valid SGML char
;; Insert a suitable SGML declaration into an empty buffer.
;; FIXME: This should use `auto-insert-alist' instead.
(and (zerop (buffer-size))
@@ -397,10 +397,10 @@ that variable's value is a string."
nil t (("+-*/.<>=?$%_&~^:" . "w"))
beginning-of-defun
(font-lock-mark-block-function . mark-defun)))
- (set (make-local-variable 'imenu-case-fold-search) nil)
+ (setq-local add-log-current-defun-function #'lisp-current-defun-name)
+ (setq-local imenu-case-fold-search nil)
(setq imenu-generic-expression dsssl-imenu-generic-expression)
- (set (make-local-variable 'imenu-syntax-alist)
- '(("+-*/.<>=?$%_&~^:" . "w"))))
+ (setq-local imenu-syntax-alist '(("+-*/.<>=?$%_&~^:" . "w"))))
;; Extra syntax for DSSSL. This isn't separated from Scheme, but
;; shouldn't cause much trouble in scheme-mode.
diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el
index 7baa1972c58..07e9bb85c4e 100644
--- a/lisp/progmodes/sh-script.el
+++ b/lisp/progmodes/sh-script.el
@@ -335,11 +335,11 @@ shell it really is."
. ((nil
;; function FOO
;; function FOO()
- "^\\s-*function\\s-+\\\([[:alpha:]_][[:alnum:]_]+\\)\\s-*\\(?:()\\)?"
+ "^\\s-*function\\s-+\\\([[:alpha:]_][[:alnum:]_]*\\)\\s-*\\(?:()\\)?"
1)
;; FOO()
(nil
- "^\\s-*\\([[:alpha:]_][[:alnum:]_]+\\)\\s-*()"
+ "^\\s-*\\([[:alpha:]_][[:alnum:]_]*\\)\\s-*()"
1)
)))
"Alist of regular expressions for recognizing shell function definitions.
@@ -353,6 +353,28 @@ See `sh-feature' and `imenu-generic-expression'."
:group 'sh-script
:version "20.4")
+(defun sh-current-defun-name ()
+ "Find the name of function or variable at point.
+For use in `add-log-current-defun-function'."
+ (save-excursion
+ (end-of-line)
+ (when (re-search-backward
+ (concat "\\(?:"
+ ;; function FOO
+ ;; function FOO()
+ "^\\s-*function\\s-+\\\([[:alpha:]_][[:alnum:]_]*\\)\\s-*\\(?:()\\)?"
+ "\\)\\|\\(?:"
+ ;; FOO()
+ "^\\s-*\\([[:alpha:]_][[:alnum:]_]*\\)\\s-*()"
+ "\\)\\|\\(?:"
+ ;; FOO=
+ "^\\([[:alpha:]_][[:alnum:]_]*\\)="
+ "\\)")
+ nil t)
+ (or (match-string-no-properties 1)
+ (match-string-no-properties 2)
+ (match-string-no-properties 3)))))
+
(defvar sh-shell-variables nil
"Alist of shell variable names that should be included in completion.
These are used for completion in addition to all the variables named
@@ -1498,42 +1520,42 @@ with your script for an edit-interpret-debug cycle."
(make-local-variable 'sh-shell-file)
(make-local-variable 'sh-shell)
- (set (make-local-variable 'skeleton-pair-default-alist)
- sh-skeleton-pair-default-alist)
- (set (make-local-variable 'skeleton-end-hook)
- (lambda () (or (eolp) (newline) (indent-relative))))
-
- (set (make-local-variable 'paragraph-start) (concat page-delimiter "\\|$"))
- (set (make-local-variable 'paragraph-separate) paragraph-start)
- (set (make-local-variable 'comment-start) "# ")
- (set (make-local-variable 'comment-start-skip) "#+[\t ]*")
- (set (make-local-variable 'local-abbrev-table) sh-mode-abbrev-table)
- (set (make-local-variable 'comint-dynamic-complete-functions)
- sh-dynamic-complete-functions)
+ (setq-local skeleton-pair-default-alist
+ sh-skeleton-pair-default-alist)
+ (setq-local skeleton-end-hook
+ (lambda () (or (eolp) (newline) (indent-relative))))
+
+ (setq-local paragraph-start (concat page-delimiter "\\|$"))
+ (setq-local paragraph-separate paragraph-start)
+ (setq-local comment-start "# ")
+ (setq-local comment-start-skip "#+[\t ]*")
+ (setq-local local-abbrev-table sh-mode-abbrev-table)
+ (setq-local comint-dynamic-complete-functions
+ sh-dynamic-complete-functions)
(add-hook 'completion-at-point-functions 'comint-completion-at-point nil t)
;; we can't look if previous line ended with `\'
- (set (make-local-variable 'comint-prompt-regexp) "^[ \t]*")
- (set (make-local-variable 'imenu-case-fold-search) nil)
- (set (make-local-variable 'font-lock-defaults)
- `((sh-font-lock-keywords
- sh-font-lock-keywords-1 sh-font-lock-keywords-2)
- nil nil
- ((?/ . "w") (?~ . "w") (?. . "w") (?- . "w") (?_ . "w")) nil
- (font-lock-syntactic-face-function
- . sh-font-lock-syntactic-face-function)))
- (set (make-local-variable 'syntax-propertize-function)
- #'sh-syntax-propertize-function)
+ (setq-local comint-prompt-regexp "^[ \t]*")
+ (setq-local imenu-case-fold-search nil)
+ (setq font-lock-defaults
+ `((sh-font-lock-keywords
+ sh-font-lock-keywords-1 sh-font-lock-keywords-2)
+ nil nil
+ ((?/ . "w") (?~ . "w") (?. . "w") (?- . "w") (?_ . "w")) nil
+ (font-lock-syntactic-face-function
+ . sh-font-lock-syntactic-face-function)))
+ (setq-local syntax-propertize-function #'sh-syntax-propertize-function)
(add-hook 'syntax-propertize-extend-region-functions
#'syntax-propertize-multiline 'append 'local)
(sh-electric-here-document-mode 1)
- (set (make-local-variable 'skeleton-pair-alist) '((?` _ ?`)))
- (set (make-local-variable 'skeleton-pair-filter-function) 'sh-quoted-p)
- (set (make-local-variable 'skeleton-further-elements)
- '((< '(- (min sh-indentation (current-column))))))
- (set (make-local-variable 'skeleton-filter-function) 'sh-feature)
- (set (make-local-variable 'skeleton-newline-indent-rigidly) t)
- (set (make-local-variable 'defun-prompt-regexp)
- (concat "^\\(function[ \t]\\|[[:alnum:]]+[ \t]+()[ \t]+\\)"))
+ (setq-local skeleton-pair-alist '((?` _ ?`)))
+ (setq-local skeleton-pair-filter-function 'sh-quoted-p)
+ (setq-local skeleton-further-elements
+ '((< '(- (min sh-indentation (current-column))))))
+ (setq-local skeleton-filter-function 'sh-feature)
+ (setq-local skeleton-newline-indent-rigidly t)
+ (setq-local defun-prompt-regexp
+ (concat "^\\(function[ \t]\\|[[:alnum:]]+[ \t]+()[ \t]+\\)"))
+ (setq-local add-log-current-defun-function #'sh-current-defun-name)
;; Parse or insert magic number for exec, and set all variables depending
;; on the shell thus determined.
(sh-set-shell
@@ -1843,7 +1865,7 @@ May return nil if the line should not be treated as continued."
;; (defconst sh-smie-csh-grammar
;; (smie-prec2->grammar
;; (smie-bnf->prec2
-;; '((exp) ;A constant, or a $var, or a sequence of them…
+;; '((exp) ;A constant, or a $var, or a sequence of them...
;; (elseifcmd (cmd)
;; (cmd "else" "else-if" exp "then" elseifcmd))
;; (cmd ("switch" branches "endsw")
@@ -2105,19 +2127,19 @@ Calls the value of `sh-set-shell-hook' if set."
(executable-set-magic shell (sh-feature sh-shell-arg)
no-query-flag insert-flag)))
(setq mode-line-process (format "[%s]" sh-shell))
- (set (make-local-variable 'sh-shell-variables) nil)
- (set (make-local-variable 'sh-shell-variables-initialized) nil)
- (set (make-local-variable 'imenu-generic-expression)
- (sh-feature sh-imenu-generic-expression))
+ (setq-local sh-shell-variables nil)
+ (setq-local sh-shell-variables-initialized nil)
+ (setq-local imenu-generic-expression
+ (sh-feature sh-imenu-generic-expression))
(let ((tem (sh-feature sh-mode-syntax-table-input)))
(when tem
- (set (make-local-variable 'sh-mode-syntax-table)
- (apply 'sh-mode-syntax-table tem))
+ (setq-local sh-mode-syntax-table
+ (apply 'sh-mode-syntax-table tem))
(set-syntax-table sh-mode-syntax-table)))
(dolist (var (sh-feature sh-variables))
(sh-remember-variable var))
- (if (set (make-local-variable 'sh-indent-supported-here)
- (sh-feature sh-indent-supported))
+ (if (setq-local sh-indent-supported-here
+ (sh-feature sh-indent-supported))
(progn
(message "Setting up indent for shell type %s" sh-shell)
(if sh-use-smie
@@ -2128,16 +2150,16 @@ Calls the value of `sh-set-shell-hook' if set."
(funcall mksym "rules")
:forward-token (funcall mksym "forward-token")
:backward-token (funcall mksym "backward-token")))
- (set (make-local-variable 'parse-sexp-lookup-properties) t)
- (set (make-local-variable 'sh-kw-alist) (sh-feature sh-kw))
+ (setq-local parse-sexp-lookup-properties t)
+ (setq-local sh-kw-alist (sh-feature sh-kw))
(let ((regexp (sh-feature sh-kws-for-done)))
(if regexp
- (set (make-local-variable 'sh-regexp-for-done)
- (sh-mkword-regexpr (regexp-opt regexp t)))))
+ (setq-local sh-regexp-for-done
+ (sh-mkword-regexpr (regexp-opt regexp t)))))
(message "setting up indent stuff")
;; sh-mode has already made indent-line-function local
;; but do it in case this is called before that.
- (set (make-local-variable 'indent-line-function) 'sh-indent-line))
+ (setq-local indent-line-function 'sh-indent-line))
(if sh-make-vars-local
(sh-make-vars-local))
(message "Indentation setup for shell type %s" sh-shell))
diff --git a/lisp/progmodes/simula.el b/lisp/progmodes/simula.el
index d71c9adbef4..77732ed3241 100644
--- a/lisp/progmodes/simula.el
+++ b/lisp/progmodes/simula.el
@@ -244,8 +244,7 @@ for SIMULA mode to function correctly."
; it determines the flavor of the Emacs running
(defvar simula-mode-menu
- '(["Report Bug" simula-submit-bug-report t]
- ["Indent Line" simula-indent-line t]
+ '(["Indent Line" simula-indent-line t]
["Backward Statement" simula-previous-statement t]
["Forward Statement" simula-next-statement t]
["Backward Up Level" simula-backward-up-level t]
@@ -286,10 +285,6 @@ for SIMULA mode to function correctly."
;; Emacs 19 defines menus in the mode map
(define-key map [menu-bar simula]
(cons "SIMULA" (make-sparse-keymap "SIMULA")))
- (define-key map [menu-bar simula bug-report]
- '("Submit Bug Report" . simula-submit-bug-report))
- (define-key map [menu-bar simula separator-indent]
- '("--"))
(define-key map [menu-bar simula indent-exp]
'("Indent Expression" . simula-indent-exp))
(define-key map [menu-bar simula indent-line]
@@ -1622,28 +1617,11 @@ If not nil and not t, move to limit of search and return nil."
(defconst simula-mode-help-address "bug-gnu-emacs@gnu.org"
"Address accepting submission of `simula-mode' bug reports.")
-(defun simula-submit-bug-report ()
- "Submit via mail a bug report on `simula-mode'."
- (interactive)
- (and
- (y-or-n-p "Do you want to submit a report on simula-mode? ")
- (reporter-submit-bug-report
- simula-mode-help-address
- (concat "simula-mode from Emacs " emacs-version)
- (list
- ;; report only the vars that affect indentation
- 'simula-indent-level
- 'simula-substatement-offset
- 'simula-continued-statement-offset
- 'simula-label-offset
- 'simula-if-indent
- 'simula-inspect-indent
- 'simula-electric-indent
- 'simula-abbrev-keyword
- 'simula-abbrev-stdproc
- 'simula-abbrev-file
- 'simula-tab-always-indent
- ))))
+(make-obsolete-variable 'simula-mode-help-address 'report-emacs-bug-address
+ "24.4")
+
+(define-obsolete-function-alias 'simula-submit-bug-report
+ 'report-emacs-bug "24.4")
(provide 'simula)
diff --git a/lisp/progmodes/sql.el b/lisp/progmodes/sql.el
index 52d29746edf..3cf6757d5ec 100644
--- a/lisp/progmodes/sql.el
+++ b/lisp/progmodes/sql.el
@@ -1,10 +1,10 @@
-;;; sql.el --- specialized comint.el for SQL interpreters
+;;; sql.el --- specialized comint.el for SQL interpreters -*- lexical-binding: t -*-
;; Copyright (C) 1998-2013 Free Software Foundation, Inc.
;; Author: Alex Schroeder <alex@gnu.org>
-;; Maintainer: Michael Mauger <mmaug@yahoo.com>
-;; Version: 3.1
+;; Maintainer: Michael Mauger <michael@mauger.com>
+;; Version: 3.2
;; Keywords: comm languages processes
;; URL: http://savannah.gnu.org/projects/emacs/
@@ -80,14 +80,6 @@
;; Hint for newbies: take a look at `dabbrev-expand', `abbrev-mode', and
;; `imenu-add-menubar-index'.
-;;; Requirements for Emacs 19.34:
-
-;; If you are using Emacs 19.34, you will have to get and install
-;; the file regexp-opt.el
-;; <URL:ftp://ftp.ifi.uio.no/pub/emacs/emacs-20.3/lisp/emacs-lisp/regexp-opt.el>
-;; and the custom package
-;; <URL:http://www.dina.kvl.dk/~abraham/custom/>.
-
;;; Bugs:
;; sql-ms now uses osql instead of isql. Osql flushes its error
@@ -169,15 +161,17 @@
;;
;; ;; Do something with `sql-user', `sql-password',
;; ;; `sql-database', and `sql-server'.
-;; (let ((params options))
-;; (if (not (string= "" sql-server))
-;; (setq params (append (list "-S" sql-server) params)))
-;; (if (not (string= "" sql-database))
-;; (setq params (append (list "-D" sql-database) params)))
-;; (if (not (string= "" sql-password))
-;; (setq params (append (list "-P" sql-password) params)))
+;; (let ((params
+;; (append
;; (if (not (string= "" sql-user))
-;; (setq params (append (list "-U" sql-user) params)))
+;; (list "-U" sql-user))
+;; (if (not (string= "" sql-password))
+;; (list "-P" sql-password))
+;; (if (not (string= "" sql-database))
+;; (list "-D" sql-database))
+;; (if (not (string= "" sql-server))
+;; (list "-S" sql-server))
+;; options)))
;; (sql-comint product params)))
;;
;; (sql-set-product-feature 'xyz
@@ -215,7 +209,7 @@
;; nino <nino@inform.dk>
;; Berend de Boer <berend@pobox.com>
;; Adam Jenkins <adam@thejenkins.org>
-;; Michael Mauger <mmaug@yahoo.com> -- improved product support
+;; Michael Mauger <michael@mauger.com> -- improved product support
;; Drew Adams <drew.adams@oracle.com> -- Emacs 20 support
;; Harald Maier <maierh@myself.com> -- sql-send-string
;; Stefan Monnier <monnier@iro.umontreal.ca> -- font-lock corrections;
@@ -224,27 +218,21 @@
;; Andrew Schein <andrew@andrewschein.com> -- sql-port bug
;; Ian Bjorhovde <idbjorh@dataproxy.com> -- db2 escape newlines
;; incorrectly enabled by default
+;; Roman Scherer <roman.scherer@nugg.ad> -- Connection documentation
+;; Mark Wilkinson <wilkinsonmr@gmail.com> -- file-local variables ignored
+;;
;;; Code:
+(require 'cl-lib)
(require 'comint)
;; Need the following to allow GNU Emacs 19 to compile the file.
(eval-when-compile
(require 'regexp-opt))
(require 'custom)
(require 'thingatpt)
-(eval-when-compile ;; needed in Emacs 19, 20
- (setq max-specpdl-size (max max-specpdl-size 2000)))
-
-(defun sql-signum (n)
- "Return 1, 0, or -1 to identify the sign of N."
- (cond
- ((not (numberp n)) nil)
- ((< n 0) -1)
- ((> n 0) 1)
- (t 0)))
(defvar font-lock-keyword-face)
(defvar font-lock-set-defaults)
@@ -620,11 +608,12 @@ Each element of the alist is as follows:
\(CONNECTION \(SQL-VARIABLE VALUE) ...)
-Where CONNECTION is a symbol identifying the connection, SQL-VARIABLE
-is the symbol name of a SQL mode variable, and VALUE is the value to
-be assigned to the variable. The most common SQL-VARIABLE settings
-associated with a connection are: `sql-product', `sql-user',
-`sql-password', `sql-port', `sql-server', and `sql-database'.
+Where CONNECTION is a case-insensitive string identifying the
+connection, SQL-VARIABLE is the symbol name of a SQL mode
+variable, and VALUE is the value to be assigned to the variable.
+The most common SQL-VARIABLE settings associated with a
+connection are: `sql-product', `sql-user', `sql-password',
+`sql-port', `sql-server', and `sql-database'.
If a SQL-VARIABLE is part of the connection, it will not be
prompted for during login. The command `sql-connect' starts a
@@ -636,12 +625,14 @@ making new SQLi sessions."
(set
(group (const :tag "Product" sql-product)
(choice
- ,@(mapcar (lambda (prod-info)
- `(const :tag
- ,(or (plist-get (cdr prod-info) :name)
- (capitalize (symbol-name (car prod-info))))
- (quote ,(car prod-info))))
- sql-product-alist)))
+ ,@(mapcar
+ (lambda (prod-info)
+ `(const :tag
+ ,(or (plist-get (cdr prod-info) :name)
+ (capitalize
+ (symbol-name (car prod-info))))
+ (quote ,(car prod-info))))
+ sql-product-alist)))
(group (const :tag "Username" sql-user) string)
(group (const :tag "Password" sql-password) string)
(group (const :tag "Server" sql-server) string)
@@ -655,8 +646,8 @@ making new SQLi sessions."
:group 'SQL)
(defcustom sql-product 'ansi
- "Select the SQL database product used so that buffers can be
-highlighted properly when you open them."
+ "Select the SQL database product used.
+This allows highlighting buffers properly when you open them."
:type `(choice
,@(mapcar (lambda (prod-info)
`(const :tag
@@ -736,15 +727,15 @@ this variable is nil, that buffer is shown using
(defvar sql-imenu-generic-expression
;; Items are in reverse order because they are rendered in reverse.
- '(("Rules/Defaults" "^\\s-*create\\s-+\\(\\w+\\s-+\\)*\\(rule\\|default\\)\\s-+\\(\\w+\\)" 3)
- ("Sequences" "^\\s-*create\\s-+\\(\\w+\\s-+\\)*sequence\\s-+\\(\\w+\\)" 2)
- ("Triggers" "^\\s-*create\\s-+\\(\\w+\\s-+\\)*trigger\\s-+\\(\\w+\\)" 2)
- ("Functions" "^\\s-*\\(create\\s-+\\(\\w+\\s-+\\)*\\)?function\\s-+\\(\\w+\\)" 3)
- ("Procedures" "^\\s-*\\(create\\s-+\\(\\w+\\s-+\\)*\\)?proc\\(edure\\)?\\s-+\\(\\w+\\)" 4)
- ("Packages" "^\\s-*create\\s-+\\(\\w+\\s-+\\)*package\\s-+\\(body\\s-+\\)?\\(\\w+\\)" 3)
- ("Types" "^\\s-*create\\s-+\\(\\w+\\s-+\\)*type\\s-+\\(body\\s-+\\)?\\(\\w+\\)" 3)
- ("Indexes" "^\\s-*create\\s-+\\(\\w+\\s-+\\)*index\\s-+\\(\\w+\\)" 2)
- ("Tables/Views" "^\\s-*create\\s-+\\(\\w+\\s-+\\)*\\(table\\|view\\)\\s-+\\(\\w+\\)" 3))
+ '(("Rules/Defaults" "^\\s-*create\\s-+\\(?:\\w+\\s-+\\)*\\(?:rule\\|default\\)\\(?:if\\s-+not\\s-+exists\\s-+\\)?\\s-+\\(\\(?:\\w+\\s-*[.]\\s-*\\)*\\w+\\)" 1)
+ ("Sequences" "^\\s-*create\\s-+\\(?:\\w+\\s-+\\)*sequence\\s-+\\(?:if\\s-+not\\s-+exists\\s-+\\)?\\(\\(?:\\w+\\s-*[.]\\s-*\\)*\\w+\\)" 1)
+ ("Triggers" "^\\s-*create\\s-+\\(?:\\w+\\s-+\\)*trigger\\s-+\\(?:if\\s-+not\\s-+exists\\s-+\\)?\\(\\(?:\\w+\\s-*[.]\\s-*\\)*\\w+\\)" 1)
+ ("Functions" "^\\s-*\\(?:create\\s-+\\(?:\\w+\\s-+\\)*\\)?function\\s-+\\(?:if\\s-+not\\s-+exists\\s-+\\)?\\(\\(?:\\w+\\s-*[.]\\s-*\\)*\\w+\\)" 1)
+ ("Procedures" "^\\s-*\\(?:create\\s-+\\(?:\\w+\\s-+\\)*\\)?proc\\(?:edure\\)?\\s-+\\(?:if\\s-+not\\s-+exists\\s-+\\)?\\(\\(?:\\w+\\s-*[.]\\s-*\\)*\\w+\\)" 1)
+ ("Packages" "^\\s-*create\\s-+\\(?:\\w+\\s-+\\)*package\\s-+\\(?:body\\s-+\\)?\\(?:if\\s-+not\\s-+exists\\s-+\\)?\\(\\(?:\\w+\\s-*[.]\\s-*\\)*\\w+\\)" 1)
+ ("Types" "^\\s-*create\\s-+\\(?:\\w+\\s-+\\)*type\\s-+\\(?:body\\s-+\\)?\\(?:if\\s-+not\\s-+exists\\s-+\\)?\\(\\(?:\\w+\\s-*[.]\\s-*\\)*\\w+\\)" 1)
+ ("Indexes" "^\\s-*create\\s-+\\(?:\\w+\\s-+\\)*index\\s-+\\(?:if\\s-+not\\s-+exists\\s-+\\)?\\(\\(?:\\w+\\s-*[.]\\s-*\\)*\\w+\\)" 1)
+ ("Tables/Views" "^\\s-*create\\s-+\\(?:\\w+\\s-+\\)*\\(?:table\\|view\\)\\s-+\\(?:if\\s-+not\\s-+exists\\s-+\\)?\\(\\(?:\\w+\\s-*[.]\\s-*\\)*\\w+\\)" 1))
"Define interesting points in the SQL buffer for `imenu'.
This is used to set `imenu-generic-expression' when SQL mode is
@@ -818,12 +809,11 @@ for the first time."
;; Customization for ANSI
-(defcustom sql-ansi-statement-starters (regexp-opt '(
- "create" "alter" "drop"
- "select" "insert" "update" "delete" "merge"
- "grant" "revoke"
-))
- "Regexp of keywords that start SQL commands
+(defcustom sql-ansi-statement-starters
+ (regexp-opt '("create" "alter" "drop"
+ "select" "insert" "update" "delete" "merge"
+ "grant" "revoke"))
+ "Regexp of keywords that start SQL commands.
All products share this list; products should define a regexp to
identify additional keywords in a variable defined by
@@ -1167,10 +1157,10 @@ You can change `sql-prompt-length' on `sql-interactive-mode-hook'.")
Used by `sql-rename-buffer'.")
(defun sql-buffer-live-p (buffer &optional product connection)
- "Returns non-nil if the process associated with buffer is live.
+ "Return non-nil if the process associated with buffer is live.
BUFFER can be a buffer object or a buffer name. The buffer must
-be a live buffer, have an running process attached to it, be in
+be a live buffer, have a running process attached to it, be in
`sql-interactive-mode', and, if PRODUCT or CONNECTION are
specified, it's `sql-product' or `sql-connection' must match."
@@ -1178,7 +1168,6 @@ specified, it's `sql-product' or `sql-connection' must match."
(setq buffer (get-buffer buffer))
(and buffer
(buffer-live-p buffer)
- (get-buffer-process buffer)
(comint-check-proc buffer)
(with-current-buffer buffer
(and (derived-mode-p 'sql-interactive-mode)
@@ -1287,27 +1276,15 @@ Based on `comint-mode-map'.")
;; Abbreviations -- if you want more of them, define them in your init
;; file. Abbrevs have to be enabled in your init file, too.
-(defvar sql-mode-abbrev-table nil
+(define-abbrev-table 'sql-mode-abbrev-table
+ '(("ins" "insert" nil nil t)
+ ("upd" "update" nil nil t)
+ ("del" "delete" nil nil t)
+ ("sel" "select" nil nil t)
+ ("proc" "procedure" nil nil t)
+ ("func" "function" nil nil t)
+ ("cr" "create" nil nil t))
"Abbrev table used in `sql-mode' and `sql-interactive-mode'.")
-(unless sql-mode-abbrev-table
- (define-abbrev-table 'sql-mode-abbrev-table nil))
-
-(mapc
- ;; In Emacs 22+, provide SYSTEM-FLAG to define-abbrev.
- (lambda (abbrev)
- (let ((name (car abbrev))
- (expansion (cdr abbrev)))
- (condition-case nil
- (define-abbrev sql-mode-abbrev-table name expansion nil 0 t)
- (error
- (define-abbrev sql-mode-abbrev-table name expansion)))))
- '(("ins" . "insert")
- ("upd" . "update")
- ("del" . "delete")
- ("sel" . "select")
- ("proc" . "procedure")
- ("func" . "function")
- ("cr" . "create")))
;; Syntax Table
@@ -1326,7 +1303,7 @@ Based on `comint-mode-map'.")
;; double quotes (") don't delimit strings
(modify-syntax-entry ?\" "." table)
;; Make these all punctuation
- (mapc (lambda (c) (modify-syntax-entry c "." table))
+ (mapc #'(lambda (c) (modify-syntax-entry c "." table))
(string-to-list "!#$%&+,.:;<=>?@\\|"))
table)
"Syntax table used in `sql-mode' and `sql-interactive-mode'.")
@@ -1339,7 +1316,8 @@ Based on `comint-mode-map'.")
"\\(?:\\w+\\s-+\\)*" ;; optional intervening keywords
"\\(?:table\\|view\\|\\(?:package\\|type\\)\\(?:\\s-+body\\)?\\|proc\\(?:edure\\)?"
"\\|function\\|trigger\\|sequence\\|rule\\|default\\)\\s-+"
- "\\(\\w+\\)")
+ "\\(?:if\\s-+not\\s-+exists\\s-+\\)?" ;; IF NOT EXISTS
+ "\\(\\w+\\(?:\\s-*[.]\\s-*\\w+\\)*\\)")
1 'font-lock-function-name-face))
"Pattern to match the names of top-level objects.
@@ -1529,14 +1507,13 @@ function `regexp-opt'. Therefore, take a look at the source before
you define your own `sql-mode-ansi-font-lock-keywords'. You may want
to add functions and PL/SQL keywords.")
-(defun sql-oracle-show-reserved-words ()
+(defun sql--oracle-show-reserved-words ()
;; This function is for use by the maintainer of SQL.EL only.
- (interactive)
(if (or (and (not (derived-mode-p 'sql-mode))
(not (derived-mode-p 'sql-interactive-mode)))
(not sql-buffer)
(not (eq sql-product 'oracle)))
- (error "Not an Oracle buffer")
+ (user-error "Not an Oracle buffer")
(let ((b "*RESERVED WORDS*"))
(sql-execute sql-buffer b
@@ -1719,7 +1696,7 @@ to add functions and PL/SQL keywords.")
"noswitch" "not" "nothing" "notimeout" "novalidate" "nowait" "null"
"nulls" "object" "of" "off" "offline" "oidindex" "old" "on" "online"
"only" "open" "operator" "optimal" "option" "or" "order"
-"organization" "out" "outer" "outline" "overflow" "overriding"
+"organization" "out" "outer" "outline" "over" "overflow" "overriding"
"package" "packages" "parallel" "parallel_enable" "parameters"
"parent" "partition" "partitions" "password" "password_grace_time"
"password_life_time" "password_lock_time" "password_reuse_max"
@@ -1772,7 +1749,7 @@ to add functions and PL/SQL keywords.")
;; Oracle PL/SQL Functions
(sql-font-lock-keywords-builder 'font-lock-builtin-face nil
"delete" "trim" "extend" "exists" "first" "last" "count" "limit"
-"prior" "next"
+"prior" "next" "sqlcode" "sqlerrm"
)
;; Oracle PL/SQL Reserved words
@@ -1957,7 +1934,7 @@ to add functions and PL/SQL keywords.")
;; Postgres non-reserved words
(sql-font-lock-keywords-builder 'font-lock-builtin-face nil
"abort" "absolute" "access" "action" "add" "admin" "after" "aggregate"
-"also" "alter" "always" "assertion" "assignment" "at" "backward"
+"also" "alter" "always" "assertion" "assignment" "at" "attribute" "backward"
"before" "begin" "between" "by" "cache" "called" "cascade" "cascaded"
"catalog" "chain" "characteristics" "checkpoint" "class" "close"
"cluster" "coalesce" "comment" "comments" "commit" "committed"
@@ -1968,40 +1945,40 @@ to add functions and PL/SQL keywords.")
"delimiters" "dictionary" "disable" "discard" "document" "domain"
"drop" "each" "enable" "encoding" "encrypted" "enum" "escape"
"exclude" "excluding" "exclusive" "execute" "exists" "explain"
-"external" "extract" "family" "first" "float" "following" "force"
+"extension" "external" "extract" "family" "first" "float" "following" "force"
"forward" "function" "functions" "global" "granted" "greatest"
"handler" "header" "hold" "hour" "identity" "if" "immediate"
"immutable" "implicit" "including" "increment" "index" "indexes"
"inherit" "inherits" "inline" "inout" "input" "insensitive" "insert"
-"instead" "invoker" "isolation" "key" "language" "large" "last"
-"lc_collate" "lc_ctype" "least" "level" "listen" "load" "local"
+"instead" "invoker" "isolation" "key" "label" "language" "large" "last"
+"lc_collate" "lc_ctype" "leakproof" "least" "level" "listen" "load" "local"
"location" "lock" "login" "mapping" "match" "maxvalue" "minute"
-"minvalue" "mode" "month" "move" "name" "names" "national" "nchar"
+"minvalue" "mode" "month" "move" "names" "national" "nchar"
"next" "no" "nocreatedb" "nocreaterole" "nocreateuser" "noinherit"
-"nologin" "none" "nosuperuser" "nothing" "notify" "nowait" "nullif"
-"nulls" "object" "of" "oids" "operator" "option" "options" "out"
-"overlay" "owned" "owner" "parser" "partial" "partition" "password"
-"plans" "position" "preceding" "prepare" "prepared" "preserve" "prior"
+"nologin" "none" "noreplication" "nosuperuser" "nothing" "notify" "nowait" "nullif"
+"nulls" "object" "of" "off" "oids" "operator" "option" "options" "out"
+"overlay" "owned" "owner" "parser" "partial" "partition" "passing" "password"
+"plans" "position" "preceding" "precision" "prepare" "prepared" "preserve" "prior"
"privileges" "procedural" "procedure" "quote" "range" "read"
-"reassign" "recheck" "recursive" "reindex" "relative" "release"
-"rename" "repeatable" "replace" "replica" "reset" "restart" "restrict"
+"reassign" "recheck" "recursive" "ref" "reindex" "relative" "release"
+"rename" "repeatable" "replace" "replica" "replication" "reset" "restart" "restrict"
"returns" "revoke" "role" "rollback" "row" "rows" "rule" "savepoint"
-"schema" "scroll" "search" "second" "security" "sequence" "sequences"
+"schema" "scroll" "search" "second" "security" "sequence"
"serializable" "server" "session" "set" "setof" "share" "show"
-"simple" "stable" "standalone" "start" "statement" "statistics"
+"simple" "snapshot" "stable" "standalone" "start" "statement" "statistics"
"stdin" "stdout" "storage" "strict" "strip" "substring" "superuser"
"sysid" "system" "tables" "tablespace" "temp" "template" "temporary"
-"transaction" "treat" "trigger" "trim" "truncate" "trusted" "type"
-"unbounded" "uncommitted" "unencrypted" "unknown" "unlisten" "until"
-"update" "vacuum" "valid" "validator" "value" "values" "version"
-"view" "volatile" "whitespace" "work" "wrapper" "write"
-"xmlattributes" "xmlconcat" "xmlelement" "xmlforest" "xmlparse"
-"xmlpi" "xmlroot" "xmlserialize" "year" "yes"
+"transaction" "treat" "trim" "truncate" "trusted" "type" "types"
+"unbounded" "uncommitted" "unencrypted" "unlisten" "unlogged" "until"
+"update" "vacuum" "valid" "validate" "validator" "value" "values" "varying" "version"
+"view" "volatile" "whitespace" "without" "work" "wrapper" "write"
+"xmlattributes" "xmlconcat" "xmlelement" "xmlexists" "xmlforest" "xmlparse"
+"xmlpi" "xmlroot" "xmlserialize" "year" "yes" "zone"
)
;; Postgres Reserved
(sql-font-lock-keywords-builder 'font-lock-keyword-face nil
-"all" "analyse" "analyze" "and" "any" "array" "asc" "as" "asymmetric"
+"all" "analyse" "analyze" "and" "array" "asc" "as" "asymmetric"
"authorization" "binary" "both" "case" "cast" "check" "collate"
"column" "concurrently" "constraint" "create" "cross"
"current_catalog" "current_date" "current_role" "current_schema"
@@ -2010,7 +1987,7 @@ to add functions and PL/SQL keywords.")
"fetch" "foreign" "for" "freeze" "from" "full" "grant" "group"
"having" "ilike" "initially" "inner" "in" "intersect" "into" "isnull"
"is" "join" "leading" "left" "like" "limit" "localtime"
-"localtimestamp" "natural" "notnull" "not" "null" "off" "offset"
+"localtimestamp" "natural" "notnull" "not" "null" "offset"
"only" "on" "order" "or" "outer" "overlaps" "over" "placing" "primary"
"references" "returning" "right" "select" "session_user" "similar"
"some" "symmetric" "table" "then" "to" "trailing" "true" "union"
@@ -2018,15 +1995,21 @@ to add functions and PL/SQL keywords.")
"with"
)
+ ;; Postgres PL/pgSQL
+ (sql-font-lock-keywords-builder 'font-lock-keyword-face nil
+"assign" "if" "case" "loop" "while" "for" "foreach" "exit" "elsif" "return"
+"raise" "execsql" "dynexecute" "perform" "getdiag" "open" "fetch" "move" "close"
+)
+
;; Postgres Data Types
(sql-font-lock-keywords-builder 'font-lock-type-face nil
"bigint" "bigserial" "bit" "bool" "boolean" "box" "bytea" "char"
"character" "cidr" "circle" "date" "decimal" "double" "float4"
"float8" "inet" "int" "int2" "int4" "int8" "integer" "interval" "line"
-"lseg" "macaddr" "money" "numeric" "path" "point" "polygon"
-"precision" "real" "serial" "serial4" "serial8" "smallint" "text"
+"lseg" "macaddr" "money" "name" "numeric" "path" "point" "polygon"
+"precision" "real" "serial" "serial4" "serial8" "sequences" "smallint" "text"
"time" "timestamp" "timestamptz" "timetz" "tsquery" "tsvector"
-"txid_snapshot" "uuid" "varbit" "varchar" "varying" "without"
+"txid_snapshot" "unknown" "uuid" "varbit" "varchar" "varying" "without"
"xml" "zone"
)))
@@ -2423,7 +2406,7 @@ highlighting rules in SQL mode.")
(let ((init (or (and initial (symbol-name initial)) "ansi")))
(intern (completing-read
prompt
- (mapcar (lambda (info) (symbol-name (car info)))
+ (mapcar #'(lambda (info) (symbol-name (car info)))
sql-product-alist)
nil 'require-match
init 'sql-product-history init))))
@@ -2439,7 +2422,7 @@ configuration."
;; Don't do anything if the product is already supported
(if (assoc product sql-product-alist)
- (message "Product `%s' is already defined" product)
+ (user-error "Product `%s' is already defined" product)
;; Add product to the alist
(add-to-list 'sql-product-alist `((,product :name ,display . ,plist)))
@@ -2458,11 +2441,11 @@ configuration."
;; after this product's name.
(let ((next-item)
(down-display (downcase display)))
- (map-keymap (lambda (k b)
- (when (and (not next-item)
- (string-lessp down-display
- (downcase (cadr b))))
- (setq next-item k)))
+ (map-keymap #'(lambda (k b)
+ (when (and (not next-item)
+ (string-lessp down-display
+ (downcase (cadr b))))
+ (setq next-item k)))
(easy-menu-get-map sql-mode-menu '("Product")))
next-item))
product))
@@ -2493,7 +2476,7 @@ argument must be a plist keyword accepted by
(symbolp v))
(set v newvalue)
(setcdr p (plist-put (cdr p) feature newvalue)))
- (message "`%s' is not a known product; use `sql-add-product' to add it first." product))))
+ (error "`%s' is not a known product; use `sql-add-product' to add it first." product))))
(defun sql-get-product-feature (product feature &optional fallback not-indirect)
"Lookup FEATURE associated with a SQL PRODUCT.
@@ -2523,7 +2506,7 @@ See `sql-product-alist' for a list of products and supported features."
(symbolp v))
(symbol-value v)
v))
- (message "`%s' is not a known product; use `sql-add-product' to add it first." product)
+ (error "`%s' is not a known product; use `sql-add-product' to add it first." product)
nil)))
(defun sql-product-font-lock (keywords-only imenu)
@@ -2564,13 +2547,13 @@ also be configured."
(font-lock-mode-internal t))
(add-hook 'font-lock-mode-hook
- (lambda ()
- ;; Provide defaults for new font-lock faces.
- (defvar font-lock-builtin-face
- (if (boundp 'font-lock-preprocessor-face)
- font-lock-preprocessor-face
- font-lock-keyword-face))
- (defvar font-lock-doc-face font-lock-string-face))
+ #'(lambda ()
+ ;; Provide defaults for new font-lock faces.
+ (defvar font-lock-builtin-face
+ (if (boundp 'font-lock-preprocessor-face)
+ font-lock-preprocessor-face
+ font-lock-keyword-face))
+ (defvar font-lock-doc-face font-lock-string-face))
nil t)
;; Setup imenu; it needs the same syntax-alist.
@@ -2610,15 +2593,13 @@ adds a fontification pattern to fontify identifiers ending in
(append keywords old-val))))))
(defun sql-for-each-login (login-params body)
- "Iterates through login parameters and returns a list of results."
-
+ "Iterate through login parameters and return a list of results."
(delq nil
(mapcar
- (lambda (param)
- (let ((token (or (and (listp param) (car param)) param))
- (plist (or (and (listp param) (cdr param)) nil)))
-
- (funcall body token plist)))
+ #'(lambda (param)
+ (let ((token (or (car-safe param) param))
+ (plist (cdr-safe param)))
+ (funcall body token plist)))
login-params)))
@@ -2627,8 +2608,8 @@ adds a fontification pattern to fontify identifiers ending in
(defun sql-product-syntax-table ()
(let ((table (copy-syntax-table sql-mode-syntax-table)))
- (mapc (lambda (entry)
- (modify-syntax-entry (car entry) (cdr entry) table))
+ (mapc #'(lambda (entry)
+ (modify-syntax-entry (car entry) (cdr entry) table))
(sql-get-product-feature sql-product :syntax-alist))
table))
@@ -2636,10 +2617,10 @@ adds a fontification pattern to fontify identifiers ending in
(append
;; Change all symbol character to word characters
(mapcar
- (lambda (entry) (if (string= (substring (cdr entry) 0 1) "_")
- (cons (car entry)
- (concat "w" (substring (cdr entry) 1)))
- entry))
+ #'(lambda (entry) (if (string= (substring (cdr entry) 0 1) "_")
+ (cons (car entry)
+ (concat "w" (substring (cdr entry) 1)))
+ entry))
(sql-get-product-feature sql-product :syntax-alist))
'((?_ . "w"))))
@@ -2662,7 +2643,7 @@ adds a fontification pattern to fontify identifiers ending in
(list (sql-read-product "SQL product: ")))
(if (stringp product) (setq product (intern product)))
(when (not (assoc product sql-product-alist))
- (error "SQL product %s is not supported; treated as ANSI" product)
+ (user-error "SQL product %s is not supported; treated as ANSI" product)
(setq product 'ansi))
;; Save product setting and fontify.
@@ -2681,6 +2662,34 @@ matching the regular expression `comint-prompt-regexp', a buffer
local variable."
(save-excursion (comint-bol nil) (point))))
+;;; SMIE support
+
+;; Needs a lot more love than I can provide. --Stef
+
+;; (require 'smie)
+
+;; (defconst sql-smie-grammar
+;; (smie-prec2->grammar
+;; (smie-bnf->prec2
+;; ;; Partly based on http://www.h2database.com/html/grammar.html
+;; '((cmd ("SELECT" select-exp "FROM" select-table-exp)
+;; )
+;; (select-exp ("*") (exp) (exp "AS" column-alias))
+;; (column-alias)
+;; (select-table-exp (table-exp "WHERE" exp) (table-exp))
+;; (table-exp)
+;; (exp ("CASE" exp "WHEN" exp "THEN" exp "ELSE" exp "END")
+;; ("CASE" exp "WHEN" exp "THEN" exp "END"))
+;; ;; Random ad-hoc additions.
+;; (foo (foo "," foo))
+;; )
+;; '((assoc ",")))))
+
+;; (defun sql-smie-rules (kind token)
+;; (pcase (cons kind token)
+;; (`(:list-intro . ,_) t)
+;; (`(:before . "(") (smie-rule-parent))))
+
;;; Motion Functions
(defun sql-statement-regexp (prod)
@@ -2693,7 +2702,7 @@ local variable."
"\\>")))
(defun sql-beginning-of-statement (arg)
- "Moves the cursor to the beginning of the current SQL statement."
+ "Move to the beginning of the current SQL statement."
(interactive "p")
(let ((here (point))
@@ -2720,10 +2729,10 @@ local variable."
(beginning-of-line)
;; If we didn't move, try again
(when (= here (point))
- (sql-beginning-of-statement (* 2 (sql-signum arg))))))
+ (sql-beginning-of-statement (* 2 (cl-signum arg))))))
(defun sql-end-of-statement (arg)
- "Moves the cursor to the end of the current SQL statement."
+ "Move to the end of the current SQL statement."
(interactive "p")
(let ((term (sql-get-product-feature sql-product :terminator))
(re-search (if (> 0 arg) 're-search-backward 're-search-forward))
@@ -2732,7 +2741,7 @@ local variable."
(when (consp term)
(setq term (car term)))
;; Iterate until we've moved the desired number of stmt ends
- (while (not (= (sql-signum arg) 0))
+ (while (not (= (cl-signum arg) 0))
;; if we're looking at the terminator, jump by 2
(if (or (and (> 0 arg) (looking-back term))
(and (< 0 arg) (looking-at term)))
@@ -2743,7 +2752,7 @@ local variable."
(setq arg 0)
;; count it if we're not in a comment
(unless (nth 7 (syntax-ppss))
- (setq arg (- arg (sql-signum arg))))))
+ (setq arg (- arg (cl-signum arg))))))
(goto-char (if (match-data)
(match-end 0)
here))))
@@ -2760,6 +2769,7 @@ local variable."
(comint-bol nil)
(looking-at "go\\b")))
(comint-send-input)))
+(put 'sql-magic-go 'delete-selection t)
(defun sql-magic-semicolon (arg)
"Insert semicolon and call `comint-send-input'.
@@ -2768,6 +2778,7 @@ local variable."
(self-insert-command (prefix-numeric-value arg))
(if (equal sql-electric-stuff 'semicolon)
(comint-send-input)))
+(put 'sql-magic-semicolon 'delete-selection t)
(defun sql-accumulate-and-indent ()
"Continue SQL statement on the next line."
@@ -2802,8 +2813,12 @@ each line with INDENT."
doc))
;;;###autoload
-(defun sql-help ()
- "Show short help for the SQL modes.
+(eval
+ ;; FIXME: This dynamic-docstring-function trick doesn't work for byte-compiled
+ ;; functions, because of the lazy-loading of docstrings, which strips away
+ ;; text properties.
+ '(defun sql-help ()
+ #("Show short help for the SQL modes.
Use an entry function to open an interactive SQL buffer. This buffer is
usually named `*SQL*'. The name of the major mode is SQLi.
@@ -2834,36 +2849,32 @@ anything. The name of the major mode is SQL.
In this SQL buffer (SQL mode), you can send the region or the entire
buffer to the interactive SQL buffer (SQLi mode). The results are
appended to the SQLi buffer without disturbing your SQL buffer."
+ 0 1 (dynamic-docstring-function sql--make-help-docstring))
(interactive)
+ (describe-function 'sql-help)))
- ;; Insert references to loaded products into the help buffer string
- (let ((doc (documentation 'sql-help t))
- changedp)
- (setq changedp nil)
-
- ;; Insert FREE software list
- (when (string-match "^\\(\\s-*\\)[\\\\][\\\\]FREE\\s-*\n" doc 0)
- (setq doc (replace-match (sql-help-list-products (match-string 1 doc) t)
- t t doc 0)
- changedp t))
+(defun sql--make-help-docstring (doc _fun)
+ "Insert references to loaded products into the help buffer string."
- ;; Insert non-FREE software list
- (when (string-match "^\\(\\s-*\\)[\\\\][\\\\]NONFREE\\s-*\n" doc 0)
- (setq doc (replace-match (sql-help-list-products (match-string 1 doc) nil)
- t t doc 0)
- changedp t))
+ ;; Insert FREE software list
+ (when (string-match "^\\(\\s-*\\)[\\\\][\\\\]FREE\\s-*\n" doc 0)
+ (setq doc (replace-match (sql-help-list-products (match-string 1 doc) t)
+ t t doc 0)))
- ;; If we changed the help text, save the change so that the help
- ;; sub-system will see it
- (when changedp
- (put 'sql-help 'function-documentation doc)))
+ ;; Insert non-FREE software list
+ (when (string-match "^\\(\\s-*\\)[\\\\][\\\\]NONFREE\\s-*\n" doc 0)
+ (setq doc (replace-match (sql-help-list-products (match-string 1 doc) nil)
+ t t doc 0)))
+ doc)
- ;; Call help on this function
- (describe-function 'sql-help))
+(defun sql-default-value (var)
+ "Fetch the value of a variable.
-(defun sql-read-passwd (prompt &optional default)
- "Read a password using PROMPT. Optional DEFAULT is password to start with."
- (read-passwd prompt nil default))
+If the current buffer is in `sql-interactive-mode', then fetch
+the global value, otherwise use the buffer local value."
+ (if (derived-mode-p 'sql-interactive-mode)
+ (default-value var)
+ (buffer-local-value var (current-buffer))))
(defun sql-get-login-ext (symbol prompt history-var plist)
"Prompt user with extended login parameters.
@@ -2886,7 +2897,7 @@ value. (The property value is used as the PREDICATE argument to
(set-default
symbol
(let* ((default (plist-get plist :default))
- (last-value (default-value symbol))
+ (last-value (sql-default-value symbol))
(prompt-def
(if default
(if (string-match "\\(\\):[ \t]*\\'" prompt)
@@ -2916,8 +2927,7 @@ value. (The property value is used as the PREDICATE argument to
(read-number prompt (or default last-value 0)))
(t
- (let ((r (read-from-minibuffer prompt-def last-value nil nil history-var nil)))
- (if (string= "" r) (or default "") r)))))))
+ (read-string prompt-def last-value history-var default))))))
(defun sql-get-login (&rest what)
"Get username, password and database from the user.
@@ -2947,32 +2957,29 @@ supported:
In order to ask the user for username, password and database, call the
function like this: (sql-get-login 'user 'password 'database)."
- (interactive)
- (mapcar
- (lambda (w)
- (let ((token (or (and (consp w) (car w)) w))
- (plist (or (and (consp w) (cdr w)) nil)))
-
- (cond
- ((eq token 'user) ; user
- (sql-get-login-ext 'sql-user "User: " 'sql-user-history plist))
+ (dolist (w what)
+ (let ((plist (cdr-safe w)))
+ (pcase (or (car-safe w) w)
+ (`user
+ (sql-get-login-ext 'sql-user "User: " 'sql-user-history plist))
- ((eq token 'password) ; password
- (setq-default sql-password
- (sql-read-passwd "Password: " sql-password)))
+ (`password
+ (setq-default sql-password
+ (read-passwd "Password: " nil (sql-default-value 'sql-password))))
- ((eq token 'server) ; server
- (sql-get-login-ext 'sql-server "Server: " 'sql-server-history plist))
+ (`server
+ (sql-get-login-ext 'sql-server "Server: " 'sql-server-history plist))
- ((eq token 'database) ; database
- (sql-get-login-ext 'sql-database "Database: " 'sql-database-history plist))
+ (`database
+ (sql-get-login-ext 'sql-database "Database: "
+ 'sql-database-history plist))
- ((eq token 'port) ; port
- (sql-get-login-ext 'sql-port "Port: " nil (append '(:number t) plist))))))
- what))
+ (`port
+ (sql-get-login-ext 'sql-port "Port: "
+ nil (append '(:number t) plist)))))))
(defun sql-find-sqli-buffer (&optional product connection)
- "Returns the name of the current default SQLi buffer or nil.
+ "Return the name of the current default SQLi buffer or nil.
In order to qualify, the SQLi buffer must be alive, be in
`sql-interactive-mode' and have a process."
(let ((buf sql-buffer)
@@ -2986,10 +2993,10 @@ In order to qualify, the SQLi buffer must be alive, be in
(sql-buffer-live-p buf prod connection)
buf)
;; Look thru each buffer
- (car (apply 'append
- (mapcar (lambda (b)
- (and (sql-buffer-live-p b prod connection)
- (list (buffer-name b))))
+ (car (apply #'append
+ (mapcar #'(lambda (b)
+ (and (sql-buffer-live-p b prod connection)
+ (list (buffer-name b))))
(buffer-list)))))))
(defun sql-set-sqli-buffer-generally ()
@@ -3030,10 +3037,10 @@ If you call it from anywhere else, it sets the global copy of
(interactive)
(let ((default-buffer (sql-find-sqli-buffer)))
(if (null default-buffer)
- (error "There is no suitable SQLi buffer")
+ (user-error "There is no suitable SQLi buffer")
(let ((new-buffer (read-buffer "New SQLi buffer: " default-buffer t)))
(if (null (sql-buffer-live-p new-buffer))
- (error "Buffer %s is not a working SQLi buffer" new-buffer)
+ (user-error "Buffer %s is not a working SQLi buffer" new-buffer)
(when new-buffer
(setq sql-buffer new-buffer)
(run-hooks 'sql-set-sqli-hook)))))))
@@ -3046,10 +3053,10 @@ variable `sql-buffer'. See `sql-help' on how to create such a buffer."
(interactive)
(if (or (null sql-buffer)
(null (buffer-live-p (get-buffer sql-buffer))))
- (message "%s has no SQLi buffer set." (buffer-name (current-buffer)))
+ (user-error "%s has no SQLi buffer set" (buffer-name (current-buffer)))
(if (null (get-buffer-process sql-buffer))
- (message "Buffer %s has no process." sql-buffer)
- (message "Current SQLi buffer is %s." sql-buffer))))
+ (user-error "Buffer %s has no process" sql-buffer)
+ (user-error "Current SQLi buffer is %s" sql-buffer))))
(defun sql-make-alternate-buffer-name ()
"Return a string that can be used to rename a SQLi buffer.
@@ -3070,35 +3077,35 @@ server/database name."
;; Build a name using the :sqli-login setting
(setq name
- (apply 'concat
+ (apply #'concat
(cdr
- (apply 'append nil
+ (apply #'append nil
(sql-for-each-login
(sql-get-product-feature sql-product :sqli-login)
- (lambda (token plist)
- (cond
- ((eq token 'user)
- (unless (string= "" sql-user)
- (list "/" sql-user)))
- ((eq token 'port)
- (unless (or (not (numberp sql-port))
- (= 0 sql-port))
- (list ":" (number-to-string sql-port))))
- ((eq token 'server)
- (unless (string= "" sql-server)
- (list "."
- (if (plist-member plist :file)
- (file-name-nondirectory sql-server)
- sql-server))))
- ((eq token 'database)
- (unless (string= "" sql-database)
- (list "@"
- (if (plist-member plist :file)
- (file-name-nondirectory sql-database)
- sql-database))))
-
- ((eq token 'password) nil)
- (t nil))))))))
+ #'(lambda (token plist)
+ (pcase token
+ (`user
+ (unless (string= "" sql-user)
+ (list "/" sql-user)))
+ (`port
+ (unless (or (not (numberp sql-port))
+ (= 0 sql-port))
+ (list ":" (number-to-string sql-port))))
+ (`server
+ (unless (string= "" sql-server)
+ (list "."
+ (if (plist-member plist :file)
+ (file-name-nondirectory sql-server)
+ sql-server))))
+ (`database
+ (unless (string= "" sql-database)
+ (list "@"
+ (if (plist-member plist :file)
+ (file-name-nondirectory sql-database)
+ sql-database))))
+
+ ;; (`password nil)
+ (_ nil))))))))
;; If there's a connection, use it and the name thus far
(if sql-connection
@@ -3133,7 +3140,7 @@ NEW-NAME is empty, then the buffer name will be \"*SQL*\"."
(interactive "P")
(if (not (derived-mode-p 'sql-interactive-mode))
- (message "Current buffer is not a SQL interactive buffer")
+ (user-error "Current buffer is not a SQL interactive buffer")
(setq sql-alternate-buffer-name
(cond
@@ -3143,6 +3150,7 @@ NEW-NAME is empty, then the buffer name will be \"*SQL*\"."
sql-alternate-buffer-name))
(t sql-alternate-buffer-name)))
+ (setq sql-alternate-buffer-name (substring-no-properties sql-alternate-buffer-name))
(rename-buffer (if (string= "" sql-alternate-buffer-name)
"*SQL*"
(format "*SQL: %s*" sql-alternate-buffer-name))
@@ -3227,13 +3235,10 @@ Every newline in STRING will be preceded with a space and a backslash."
Allows the suppression of continuation prompts.")
-(defvar sql-output-by-send nil
- "Non-nil if the command in the input was generated by `sql-send-string'.")
-
(defun sql-input-sender (proc string)
"Send STRING to PROC after applying filters."
- (let* ((product (with-current-buffer (process-buffer proc) sql-product))
+ (let* ((product (buffer-local-value 'sql-product (process-buffer proc)))
(filter (sql-get-product-feature product :input-filter)))
;; Apply filter(s)
@@ -3243,15 +3248,13 @@ Allows the suppression of continuation prompts.")
((functionp filter)
(setq string (funcall filter string)))
((listp filter)
- (mapc (lambda (f) (setq string (funcall f string))) filter))
+ (mapc #'(lambda (f) (setq string (funcall f string))) filter))
(t nil))
;; Count how many newlines in the string
- (setq sql-output-newline-count 0)
- (mapc (lambda (ch)
- (when (eq ch ?\n)
- (setq sql-output-newline-count (1+ sql-output-newline-count))))
- string)
+ (setq sql-output-newline-count
+ (apply #'+ (mapcar #'(lambda (ch)
+ (if (eq ch ?\n) 1 0)) string)))
;; Send the string
(comint-simple-send proc string)))
@@ -3296,8 +3299,7 @@ to avoid deleting non-prompt output."
(if (= sql-output-newline-count 0)
(setq sql-output-newline-count nil
- oline (concat "\n" oline)
- sql-output-by-send nil)
+ oline (concat "\n" oline))
(setq sql-preoutput-hold oline
oline ""))
@@ -3332,7 +3334,7 @@ to avoid deleting non-prompt output."
(if sql-send-terminator
(sql-send-magic-terminator sql-buffer s sql-send-terminator))
- (message "Sent string to buffer %s." sql-buffer)))
+ (message "Sent string to buffer %s" sql-buffer)))
;; Display the sql buffer
(if sql-pop-to-buffer-after-send-region
@@ -3340,7 +3342,7 @@ to avoid deleting non-prompt output."
(display-buffer sql-buffer)))
;; We don't have no stinkin' sql
- (message "No SQL process started."))))
+ (user-error "No SQL process started"))))
(defun sql-send-region (start end)
"Send a region to the SQL process."
@@ -3391,8 +3393,7 @@ to avoid deleting non-prompt output."
(setq sql-output-newline-count
(if sql-output-newline-count
(1+ sql-output-newline-count)
- 1)))
- (setq sql-output-by-send t)))
+ 1)))))
(defun sql-remove-tabs-filter (str)
"Replace tab characters with spaces."
@@ -3434,7 +3435,7 @@ list of SQLi command strings."
(when visible
(message "Executing SQL command..."))
(if (consp command)
- (mapc (lambda (c) (sql-redirect-one sqlbuf c outbuf save-prior))
+ (mapc #'(lambda (c) (sql-redirect-one sqlbuf c outbuf save-prior))
command)
(sql-redirect-one sqlbuf command outbuf save-prior))
(when visible
@@ -3511,11 +3512,11 @@ for each match."
(match-string regexp-groups))
;; list of numbers; return the specified matches only
((consp regexp-groups)
- (mapcar (lambda (c)
- (cond
- ((numberp c) (match-string c))
- ((stringp c) (match-substitute-replacement c))
- (t (error "sql-redirect-value: unknown REGEXP-GROUPS value - %s" c))))
+ (mapcar #'(lambda (c)
+ (cond
+ ((numberp c) (match-string c))
+ ((stringp c) (match-substitute-replacement c))
+ (t (error "sql-redirect-value: unknown REGEXP-GROUPS value - %s" c))))
regexp-groups))
;; String is specified; return replacement string
((stringp regexp-groups)
@@ -3531,7 +3532,7 @@ for each match."
(nreverse results)))
(defun sql-execute (sqlbuf outbuf command enhanced arg)
- "Executes a command in a SQL interactive buffer and captures the output.
+ "Execute a command in a SQL interactive buffer and capture the output.
The commands are run in SQLBUF and the output saved in OUTBUF.
COMMAND must be a string, a function or a list of such elements.
@@ -3539,17 +3540,17 @@ Functions are called with SQLBUF, OUTBUF and ARG as parameters;
strings are formatted with ARG and executed.
If the results are empty the OUTBUF is deleted, otherwise the
-buffer is popped into a view window. "
+buffer is popped into a view window."
(mapc
- (lambda (c)
- (cond
- ((stringp c)
- (sql-redirect sqlbuf (if arg (format c arg) c) outbuf) t)
- ((functionp c)
- (apply c sqlbuf outbuf enhanced arg nil))
- (t (error "Unknown sql-execute item %s" c))))
+ #'(lambda (c)
+ (cond
+ ((stringp c)
+ (sql-redirect sqlbuf (if arg (format c arg) c) outbuf) t)
+ ((functionp c)
+ (apply c sqlbuf outbuf enhanced arg nil))
+ (t (error "Unknown sql-execute item %s" c))))
(if (consp command) command (cons command nil)))
-
+
(setq outbuf (get-buffer outbuf))
(if (zerop (buffer-size outbuf))
(kill-buffer outbuf)
@@ -3564,11 +3565,11 @@ buffer is popped into a view window. "
(defun sql-execute-feature (sqlbuf outbuf feature enhanced arg)
"List objects or details in a separate display buffer."
- (let (command)
- (with-current-buffer sqlbuf
- (setq command (sql-get-product-feature sql-product feature)))
+ (let (command
+ (product (buffer-local-value 'sql-product (get-buffer sqlbuf))))
+ (setq command (sql-get-product-feature product feature))
(unless command
- (error "%s does not support %s" sql-product feature))
+ (error "%s does not support %s" product feature))
(when (consp command)
(setq command (if enhanced
(cdr command)
@@ -3595,7 +3596,7 @@ The list is maintained in SQL interactive buffers.")
(apply f (current-buffer) (cons schema nil)))
cl)
(unless (member e cl) (setq cl (cons e cl))))
- (sort cl (function string<)))))))
+ (sort cl #'string<))))))
(defun sql-build-completions (schema)
"Generate a list of names in the database for use as completions."
@@ -3604,43 +3605,35 @@ The list is maintained in SQL interactive buffers.")
(defvar sql-completion-sqlbuf nil)
-(defun sql-try-completion (string collection &optional predicate)
+(defun sql--completion-table (string pred action)
(when sql-completion-sqlbuf
- (with-current-buffer sql-completion-sqlbuf
- (let ((schema (and (string-match "\\`\\(\\sw\\(:?\\sw\\|\\s_\\)*\\)[.]" string)
- (downcase (match-string 1 string)))))
-
- ;; If we haven't loaded any object name yet, load local schema
- (unless sql-completion-object
- (sql-build-completions nil))
-
- ;; If they want another schema, load it if we haven't yet
- (when schema
- (let ((schema-dot (concat schema "."))
- (schema-len (1+ (length schema)))
- (names sql-completion-object)
- has-schema)
-
- (while (and (not has-schema) names)
- (setq has-schema (and
- (>= (length (car names)) schema-len)
- (string= schema-dot
- (downcase (substring (car names)
- 0 schema-len))))
- names (cdr names)))
- (unless has-schema
- (sql-build-completions schema)))))
-
- ;; Try to find the completion
- (cond
- ((not predicate)
- (try-completion string sql-completion-object))
- ((eq predicate t)
- (all-completions string sql-completion-object))
- ((eq predicate 'lambda)
- (test-completion string sql-completion-object))
- ((eq (car predicate) 'boundaries)
- (completion-boundaries string sql-completion-object nil (cdr predicate)))))))
+ (with-current-buffer sql-completion-sqlbuf
+ (let ((schema (and (string-match "\\`\\(\\sw\\(:?\\sw\\|\\s_\\)*\\)[.]" string)
+ (downcase (match-string 1 string)))))
+
+ ;; If we haven't loaded any object name yet, load local schema
+ (unless sql-completion-object
+ (sql-build-completions nil))
+
+ ;; If they want another schema, load it if we haven't yet
+ (when schema
+ (let ((schema-dot (concat schema "."))
+ (schema-len (1+ (length schema)))
+ (names sql-completion-object)
+ has-schema)
+
+ (while (and (not has-schema) names)
+ (setq has-schema (and
+ (>= (length (car names)) schema-len)
+ (string= schema-dot
+ (downcase (substring (car names)
+ 0 schema-len))))
+ names (cdr names)))
+ (unless has-schema
+ (sql-build-completions schema)))))
+
+ ;; Try to find the completion
+ (complete-with-action action sql-completion-object string pred))))
(defun sql-read-table-name (prompt)
"Read the name of a database table."
@@ -3656,7 +3649,7 @@ The list is maintained in SQL interactive buffers.")
(completion-ignore-case t))
(if (sql-get-product-feature product :completion-object)
- (completing-read prompt (function sql-try-completion)
+ (completing-read prompt #'sql--completion-table
nil nil tname)
(read-from-minibuffer prompt tname))))
@@ -3667,7 +3660,7 @@ details or extends the listing to include other schemas objects."
(interactive "P")
(let ((sqlbuf (sql-find-sqli-buffer)))
(unless sqlbuf
- (error "No SQL interactive buffer found"))
+ (user-error "No SQL interactive buffer found"))
(sql-execute-feature sqlbuf "*List All*" :list-all enhanced nil)
(with-current-buffer sqlbuf
;; Contains the name of database objects
@@ -3683,9 +3676,9 @@ ENHANCED, displays additional details about each column."
current-prefix-arg))
(let ((sqlbuf (sql-find-sqli-buffer)))
(unless sqlbuf
- (error "No SQL interactive buffer found"))
+ (user-error "No SQL interactive buffer found"))
(unless name
- (error "No table name specified"))
+ (user-error "No table name specified"))
(sql-execute-feature sqlbuf (format "*List %s*" name)
:list-table enhanced name)))
@@ -3724,6 +3717,7 @@ must tell Emacs. Here's how to do that in your init file:
(if sql-mode-menu
(easy-menu-add sql-mode-menu)); XEmacs
+ ;; (smie-setup sql-smie-grammar #'sql-smie-rules)
(set (make-local-variable 'comment-start) "--")
;; Make each buffer in sql-mode remember the "current" SQLi buffer.
(make-local-variable 'sql-buffer)
@@ -3737,7 +3731,7 @@ must tell Emacs. Here's how to do that in your init file:
(set (make-local-variable 'paragraph-separate) "[\f]*$")
(set (make-local-variable 'paragraph-start) "[\n\f]")
;; Abbrevs
- (setq abbrev-all-caps 1)
+ (setq-local abbrev-all-caps 1)
;; Contains the name of database objects
(set (make-local-variable 'sql-contains-names) t)
;; Catch changes to sql-product and highlight accordingly
@@ -3872,7 +3866,6 @@ you entered, right above the output it created.
(sql-get-product-feature sql-product :prompt-cont-regexp))
(make-local-variable 'sql-output-newline-count)
(make-local-variable 'sql-preoutput-hold)
- (make-local-variable 'sql-output-by-send)
(add-hook 'comint-preoutput-filter-functions
'sql-interactive-remove-continuation-prompt nil t)
(make-local-variable 'sql-input-ring-separator)
@@ -3919,7 +3912,7 @@ Sentinels will always get the two parameters PROCESS and EVENT."
"Read a connection name."
(let ((completion-ignore-case t))
(completing-read prompt
- (mapcar (lambda (c) (car c))
+ (mapcar #'(lambda (c) (car c))
sql-connection-alist)
nil t initial 'sql-connection-history default)))
@@ -3938,14 +3931,14 @@ is specified in the connection settings."
(if sql-connection-alist
(list (sql-read-connection "Connection: " nil '(nil))
current-prefix-arg)
- nil))
+ (user-error "No SQL Connections defined")))
;; Are there connections defined
(if sql-connection-alist
;; Was one selected
(when connection
;; Get connection settings
- (let ((connect-set (assoc connection sql-connection-alist)))
+ (let ((connect-set (assoc-string connection sql-connection-alist t)))
;; Settings are defined
(if connect-set
;; Set the desired parameters
@@ -3962,38 +3955,38 @@ is specified in the connection settings."
;; Params in the connection
(setq set-params
(mapcar
- (lambda (v)
- (cond
- ((eq (car v) 'sql-user) 'user)
- ((eq (car v) 'sql-password) 'password)
- ((eq (car v) 'sql-server) 'server)
- ((eq (car v) 'sql-database) 'database)
- ((eq (car v) 'sql-port) 'port)
- (t (car v))))
+ #'(lambda (v)
+ (pcase (car v)
+ (`sql-user 'user)
+ (`sql-password 'password)
+ (`sql-server 'server)
+ (`sql-database 'database)
+ (`sql-port 'port)
+ (s s)))
(cdr connect-set)))
;; the remaining params (w/o the connection params)
(setq rem-params
(sql-for-each-login login-params
- (lambda (token plist)
- (unless (member token set-params)
- (if plist (cons token plist) token)))))
+ #'(lambda (token plist)
+ (unless (member token set-params)
+ (if plist (cons token plist) token)))))
;; Set the parameters and start the interactive session
(mapc
- (lambda (vv)
- (set-default (car vv) (eval (cadr vv))))
+ #'(lambda (vv)
+ (set-default (car vv) (eval (cadr vv))))
(cdr connect-set))
(setq-default sql-connection connection)
;; Start the SQLi session with revised list of login parameters
(eval `(let ((,param-var ',rem-params))
- (sql-product-interactive sql-product new-name))))
+ (sql-product-interactive ',sql-product ',new-name))))
- (message "SQL Connection <%s> does not exist" connection)
+ (user-error "SQL Connection <%s> does not exist" connection)
nil)))
- (message "No SQL Connections defined")
+ (user-error "No SQL Connections defined")
nil))
(defun sql-save-connection (name)
@@ -4005,7 +3998,7 @@ optionally is saved to the user's init file."
(interactive "sNew connection name: ")
(unless (derived-mode-p 'sql-interactive-mode)
- (error "Not in a SQL interactive mode!"))
+ (user-error "Not in a SQL interactive mode!"))
;; Capture the buffer local settings
(let* ((buf (current-buffer))
@@ -4030,18 +4023,18 @@ optionally is saved to the user's init file."
;; Add the new connection if it doesn't exist
(if (assoc name alist)
- (message "Connection <%s> already exists" name)
+ (user-error "Connection <%s> already exists" name)
(setq connect
- (append (list name)
- (sql-for-each-login
- `(product ,@login)
- (lambda (token _plist)
- (cond
- ((eq token 'product) `(sql-product ',product))
- ((eq token 'user) `(sql-user ,user))
- ((eq token 'database) `(sql-database ,database))
- ((eq token 'server) `(sql-server ,server))
- ((eq token 'port) `(sql-port ,port)))))))
+ (cons name
+ (sql-for-each-login
+ `(product ,@login)
+ #'(lambda (token _plist)
+ (pcase token
+ (`product `(sql-product ',product))
+ (`user `(sql-user ,user))
+ (`database `(sql-database ,database))
+ (`server `(sql-server ,server))
+ (`port `(sql-port ,port)))))))
(setq alist (append alist (list connect)))
@@ -4051,24 +4044,23 @@ optionally is saved to the user's init file."
(customize-set-variable 'sql-connection-alist alist)))))))
(defun sql-connection-menu-filter (tail)
- "Generates menu entries for using each connection."
+ "Generate menu entries for using each connection."
(append
(mapcar
- (lambda (conn)
- (vector
- (format "Connection <%s>\t%s" (car conn)
- (let ((sql-user "") (sql-database "")
- (sql-server "") (sql-port 0))
- (eval `(let ,(cdr conn) (sql-make-alternate-buffer-name)))))
- (list 'sql-connect (car conn))
- t))
+ #'(lambda (conn)
+ (vector
+ (format "Connection <%s>\t%s" (car conn)
+ (let ((sql-user "") (sql-database "")
+ (sql-server "") (sql-port 0))
+ (eval `(let ,(cdr conn) (sql-make-alternate-buffer-name)))))
+ (list 'sql-connect (car conn))
+ t))
sql-connection-alist)
tail))
;;; Entry functions for different SQL interpreters.
-
;;;###autoload
(defun sql-product-interactive (&optional product new-name)
"Run PRODUCT interpreter as an inferior process.
@@ -4118,7 +4110,8 @@ the call to \\[sql-product-interactive] with
new-sqli-buffer)
;; Get credentials.
- (apply 'sql-get-login (sql-get-product-feature product :sqli-login))
+ (apply #'sql-get-login
+ (sql-get-product-feature product :sqli-login))
;; Connect to database.
(message "Login...")
@@ -4148,11 +4141,19 @@ the call to \\[sql-product-interactive] with
(setq sql-buffer (buffer-name new-sqli-buffer))
(run-hooks 'sql-set-sqli-hook)))
+ ;; Make sure the connection is complete
+ ;; (Sometimes start up can be slow)
+ ;; and call the login hook
+ (let ((proc (get-buffer-process new-sqli-buffer)))
+ (while (and (memq (process-status proc) '(open run))
+ (accept-process-output proc 2.5)
+ (progn (goto-char (point-max))
+ (not (looking-back sql-prompt-regexp))))))
+ (run-hooks 'sql-login-hook)
;; All done.
(message "Login...done")
- (run-hooks 'sql-login-hook)
(pop-to-buffer new-sqli-buffer)))))
- (message "No default SQL product defined. Set `sql-product'.")))
+ (user-error "No default SQL product defined. Set `sql-product'.")))
(defun sql-comint (product params)
"Set up a comint buffer to run the SQL processor.
@@ -4176,7 +4177,7 @@ passed as command line arguments."
(setq buf-name (format "SQL-%s%d" product i))))
(setq i (1+ i))))))
(set-buffer
- (apply 'make-comint buf-name program nil params))))
+ (apply #'make-comint buf-name program nil params))))
;;;###autoload
(defun sql-oracle (&optional buffer)
@@ -4216,7 +4217,7 @@ The default comes from `process-coding-system-alist' and
;; is meaningless; database without user/password is meaningless,
;; because "@param" will ask sqlplus to interpret the script
;; "param".
- (let ((parameter nil))
+ (let (parameter nlslang coding)
(if (not (string= "" sql-user))
(if (not (string= "" sql-password))
(setq parameter (concat sql-user "/" sql-password))
@@ -4226,10 +4227,32 @@ The default comes from `process-coding-system-alist' and
(if parameter
(setq parameter (nconc (list parameter) options))
(setq parameter options))
- (sql-comint product parameter)))
+ (sql-comint product parameter)
+ ;; Set process coding system to agree with the interpreter
+ (setq nlslang (or (getenv "NLS_LANG") "")
+ coding (dolist (cs
+ ;; Are we missing any common NLS character sets
+ '(("US8PC437" . cp437)
+ ("EL8PC737" . cp737)
+ ("WE8PC850" . cp850)
+ ("EE8PC852" . cp852)
+ ("TR8PC857" . cp857)
+ ("WE8PC858" . cp858)
+ ("IS8PC861" . cp861)
+ ("IW8PC1507" . cp862)
+ ("N8PC865" . cp865)
+ ("RU8PC866" . cp866)
+ ("US7ASCII" . us-ascii)
+ ("UTF8" . utf-8)
+ ("AL32UTF8" . utf-8)
+ ("AL16UTF16" . utf-16))
+ (or coding 'utf-8))
+ (when (string-match (format "\\.%s\\'" (car cs)) nlslang)
+ (setq coding (cdr cs)))))
+ (set-buffer-process-coding-system coding coding)))
(defun sql-oracle-save-settings (sqlbuf)
- "Saves most SQL*Plus settings so they may be reset by \\[sql-redirect]."
+ "Save most SQL*Plus settings so they may be reset by \\[sql-redirect]."
;; Note: does not capture the following settings:
;;
;; APPINFO
@@ -4246,7 +4269,7 @@ The default comes from `process-coding-system-alist' and
;;
(append
- ;; (apply 'concat (append
+ ;; (apply #'concat (append
;; '("SET")
;; option value...
@@ -4294,14 +4317,14 @@ The default comes from `process-coding-system-alist' and
;; Remove any settings that haven't changed
(mapc
- (lambda (one-cur-setting)
- (setq saved-settings (delete one-cur-setting saved-settings)))
+ #'(lambda (one-cur-setting)
+ (setq saved-settings (delete one-cur-setting saved-settings)))
(sql-oracle-save-settings sqlbuf))
;; Restore the changed settings
(sql-redirect sqlbuf saved-settings))
-(defun sql-oracle-list-all (sqlbuf outbuf enhanced table-name)
+(defun sql-oracle-list-all (sqlbuf outbuf enhanced _table-name)
;; Query from USER_OBJECTS or ALL_OBJECTS
(let ((settings (sql-oracle-save-settings sqlbuf))
(simple-sql
@@ -4340,7 +4363,7 @@ The default comes from `process-coding-system-alist' and
(sql-oracle-restore-settings sqlbuf settings)))
-(defun sql-oracle-list-table (sqlbuf outbuf enhanced table-name)
+(defun sql-oracle-list-table (sqlbuf outbuf _enhanced table-name)
"Implements :list-table under Oracle."
(let ((settings (sql-oracle-save-settings sqlbuf)))
@@ -4417,15 +4440,17 @@ The default comes from `process-coding-system-alist' and
"Create comint buffer and connect to Sybase."
;; Put all parameters to the program (if defined) in a list and call
;; make-comint.
- (let ((params options))
- (if (not (string= "" sql-server))
- (setq params (append (list "-S" sql-server) params)))
- (if (not (string= "" sql-database))
- (setq params (append (list "-D" sql-database) params)))
- (if (not (string= "" sql-password))
- (setq params (append (list "-P" sql-password) params)))
- (if (not (string= "" sql-user))
- (setq params (append (list "-U" sql-user) params)))
+ (let ((params
+ (append
+ (if (not (string= "" sql-user))
+ (list "-U" sql-user))
+ (if (not (string= "" sql-password))
+ (list "-P" sql-password))
+ (if (not (string= "" sql-database))
+ (list "-D" sql-database))
+ (if (not (string= "" sql-server))
+ (list "-S" sql-server))
+ options)))
(sql-comint product params)))
@@ -4510,14 +4535,13 @@ The default comes from `process-coding-system-alist' and
"Create comint buffer and connect to SQLite."
;; Put all parameters to the program (if defined) in a list and call
;; make-comint.
- (let ((params))
- (if (not (string= "" sql-database))
- (setq params (append (list (expand-file-name sql-database))
- params)))
- (setq params (append options params))
+ (let ((params
+ (append options
+ (if (not (string= "" sql-database))
+ `(,(expand-file-name sql-database))))))
(sql-comint product params)))
-(defun sql-sqlite-completion-object (sqlbuf schema)
+(defun sql-sqlite-completion-object (sqlbuf _schema)
(sql-redirect-value sqlbuf ".tables" "\\sw\\(?:\\sw\\|\\s_\\)*" 0))
@@ -4560,18 +4584,19 @@ The default comes from `process-coding-system-alist' and
"Create comint buffer and connect to MySQL."
;; Put all parameters to the program (if defined) in a list and call
;; make-comint.
- (let ((params))
- (if (not (string= "" sql-database))
- (setq params (append (list sql-database) params)))
- (if (not (string= "" sql-server))
- (setq params (append (list (concat "--host=" sql-server)) params)))
- (if (not (= 0 sql-port))
- (setq params (append (list (concat "--port=" (number-to-string sql-port))) params)))
- (if (not (string= "" sql-password))
- (setq params (append (list (concat "--password=" sql-password)) params)))
- (if (not (string= "" sql-user))
- (setq params (append (list (concat "--user=" sql-user)) params)))
- (setq params (append options params))
+ (let ((params
+ (append
+ options
+ (if (not (string= "" sql-user))
+ (list (concat "--user=" sql-user)))
+ (if (not (string= "" sql-password))
+ (list (concat "--password=" sql-password)))
+ (if (not (= 0 sql-port))
+ (list (concat "--port=" (number-to-string sql-port))))
+ (if (not (string= "" sql-server))
+ (list (concat "--host=" sql-server)))
+ (if (not (string= "" sql-database))
+ (list sql-database)))))
(sql-comint product params)))
@@ -4611,13 +4636,15 @@ The default comes from `process-coding-system-alist' and
"Create comint buffer and connect to Solid."
;; Put all parameters to the program (if defined) in a list and call
;; make-comint.
- (let ((params options))
- ;; It only makes sense if both username and password are there.
- (if (not (or (string= "" sql-user)
- (string= "" sql-password)))
- (setq params (append (list sql-user sql-password) params)))
- (if (not (string= "" sql-server))
- (setq params (append (list sql-server) params)))
+ (let ((params
+ (append
+ (if (not (string= "" sql-server))
+ (list sql-server))
+ ;; It only makes sense if both username and password are there.
+ (if (not (or (string= "" sql-user)
+ (string= "" sql-password)))
+ (list sql-user sql-password))
+ options)))
(sql-comint product params)))
@@ -4699,22 +4726,25 @@ The default comes from `process-coding-system-alist' and
"Create comint buffer and connect to Microsoft SQL Server."
;; Put all parameters to the program (if defined) in a list and call
;; make-comint.
- (let ((params options))
- (if (not (string= "" sql-server))
- (setq params (append (list "-S" sql-server) params)))
- (if (not (string= "" sql-database))
- (setq params (append (list "-d" sql-database) params)))
- (if (not (string= "" sql-user))
- (setq params (append (list "-U" sql-user) params)))
- (if (not (string= "" sql-password))
- (setq params (append (list "-P" sql-password) params))
- (if (string= "" sql-user)
- ;; if neither user nor password is provided, use system
- ;; credentials.
- (setq params (append (list "-E") params))
- ;; If -P is passed to ISQL as the last argument without a
- ;; password, it's considered null.
- (setq params (append params (list "-P")))))
+ (let ((params
+ (append
+ (if (not (string= "" sql-user))
+ (list "-U" sql-user))
+ (if (not (string= "" sql-database))
+ (list "-d" sql-database))
+ (if (not (string= "" sql-server))
+ (list "-S" sql-server))
+ options)))
+ (setq params
+ (if (not (string= "" sql-password))
+ `("-P" ,sql-password ,@params)
+ (if (string= "" sql-user)
+ ;; If neither user nor password is provided, use system
+ ;; credentials.
+ `("-E" ,@params)
+ ;; If -P is passed to ISQL as the last argument without a
+ ;; password, it's considered null.
+ `(,@params "-P"))))
(sql-comint product params)))
@@ -4758,48 +4788,58 @@ Try to set `comint-output-filter-functions' like this:
(defun sql-comint-postgres (product options)
"Create comint buffer and connect to Postgres."
- ;; username and password are ignored. Mark Stosberg suggest to add
- ;; the database at the end. Jason Beegan suggest using --pset and
+ ;; username and password are ignored. Mark Stosberg suggests to add
+ ;; the database at the end. Jason Beegan suggests using --pset and
;; pager=off instead of \\o|cat. The later was the solution by
;; Gregor Zych. Jason's suggestion is the default value for
;; sql-postgres-options.
- (let ((params options))
- (if (not (string= "" sql-database))
- (setq params (append params (list sql-database))))
- (if (not (string= "" sql-server))
- (setq params (append (list "-h" sql-server) params)))
- (if (not (string= "" sql-user))
- (setq params (append (list "-U" sql-user) params)))
- (if (not (= 0 sql-port))
- (setq params (append (list "-p" (number-to-string sql-port)) params)))
+ (let ((params
+ (append
+ (if (not (= 0 sql-port))
+ (list "-p" (number-to-string sql-port)))
+ (if (not (string= "" sql-user))
+ (list "-U" sql-user))
+ (if (not (string= "" sql-server))
+ (list "-h" sql-server))
+ options
+ (if (not (string= "" sql-database))
+ (list sql-database)))))
(sql-comint product params)))
(defun sql-postgres-completion-object (sqlbuf schema)
- (let (cl re fs a r)
- (sql-redirect sqlbuf "\\t on")
- (setq a (car (sql-redirect-value sqlbuf "\\a" "Output format is \\(.*\\)[.]$" 1)))
- (when (string= a "aligned")
- (sql-redirect sqlbuf "\\a"))
- (setq fs (or (car (sql-redirect-value sqlbuf "\\f" "Field separator is \"\\(.\\)[.]$" 1)) "|"))
-
- (setq re (concat "^\\([^" fs "]*\\)" fs "\\([^" fs "]*\\)" fs "[^" fs "]*" fs "[^" fs "]*$"))
- (setq cl (if (not schema)
- (sql-redirect-value sqlbuf "\\d" re '(1 2))
- (append (sql-redirect-value sqlbuf (format "\\dt %s.*" schema) re '(1 2))
- (sql-redirect-value sqlbuf (format "\\dv %s.*" schema) re '(1 2))
- (sql-redirect-value sqlbuf (format "\\ds %s.*" schema) re '(1 2)))))
-
- ;; Restore tuples and alignment to what they were
- (sql-redirect sqlbuf "\\t off")
- (when (not (string= a "aligned"))
+ (sql-redirect sqlbuf "\\t on")
+ (let ((aligned
+ (string= "aligned"
+ (car (sql-redirect-value
+ sqlbuf "\\a"
+ "Output format is \\(.*\\)[.]$" 1)))))
+ (when aligned
(sql-redirect sqlbuf "\\a"))
-
- ;; Return the list of table names (public schema name can be omitted)
- (mapcar (lambda (tbl)
- (if (string= (car tbl) "public")
- (cadr tbl)
- (format "%s.%s" (car tbl) (cadr tbl))))
- cl)))
+ (let* ((fs (or (car (sql-redirect-value
+ sqlbuf "\\f" "Field separator is \"\\(.\\)[.]$" 1))
+ "|"))
+ (re (concat "^\\([^" fs "]*\\)" fs "\\([^" fs "]*\\)"
+ fs "[^" fs "]*" fs "[^" fs "]*$"))
+ (cl (if (not schema)
+ (sql-redirect-value sqlbuf "\\d" re '(1 2))
+ (append (sql-redirect-value
+ sqlbuf (format "\\dt %s.*" schema) re '(1 2))
+ (sql-redirect-value
+ sqlbuf (format "\\dv %s.*" schema) re '(1 2))
+ (sql-redirect-value
+ sqlbuf (format "\\ds %s.*" schema) re '(1 2))))))
+
+ ;; Restore tuples and alignment to what they were.
+ (sql-redirect sqlbuf "\\t off")
+ (when (not aligned)
+ (sql-redirect sqlbuf "\\a"))
+
+ ;; Return the list of table names (public schema name can be omitted)
+ (mapcar #'(lambda (tbl)
+ (if (string= (car tbl) "public")
+ (cadr tbl)
+ (format "%s.%s" (car tbl) (cadr tbl))))
+ cl))))
@@ -4838,13 +4878,15 @@ The default comes from `process-coding-system-alist' and
"Create comint buffer and connect to Interbase."
;; Put all parameters to the program (if defined) in a list and call
;; make-comint.
- (let ((params options))
- (if (not (string= "" sql-user))
- (setq params (append (list "-u" sql-user) params)))
- (if (not (string= "" sql-password))
- (setq params (append (list "-p" sql-password) params)))
- (if (not (string= "" sql-database))
- (setq params (cons sql-database params))) ; add to the front!
+ (let ((params
+ (append
+ (if (not (string= "" sql-database))
+ (list sql-database)) ; Add to the front!
+ (if (not (string= "" sql-password))
+ (list "-p" sql-password))
+ (if (not (string= "" sql-user))
+ (list "-u" sql-user))
+ options)))
(sql-comint product params)))
@@ -4926,19 +4968,18 @@ buffer.
"Create comint buffer and connect to Linter."
;; Put all parameters to the program (if defined) in a list and call
;; make-comint.
- (let ((params options)
- (login nil)
- (old-mbx (getenv "LINTER_MBX")))
- (if (not (string= "" sql-user))
- (setq login (concat sql-user "/" sql-password)))
- (setq params (append (list "-u" login) params))
- (if (not (string= "" sql-server))
- (setq params (append (list "-n" sql-server) params)))
- (if (string= "" sql-database)
- (setenv "LINTER_MBX" nil)
- (setenv "LINTER_MBX" sql-database))
- (sql-comint product params)
- (setenv "LINTER_MBX" old-mbx)))
+ (let* ((login
+ (if (not (string= "" sql-user))
+ (concat sql-user "/" sql-password)))
+ (params
+ (append
+ (if (not (string= "" sql-server))
+ (list "-n" sql-server))
+ (list "-u" login)
+ options)))
+ (cl-letf (((getenv "LINTER_MBX")
+ (unless (string= "" sql-database) sql-database)))
+ (sql-comint product params))))
diff --git a/lisp/progmodes/subword.el b/lisp/progmodes/subword.el
index 80e632c6ef6..6cb4713885e 100644
--- a/lisp/progmodes/subword.el
+++ b/lisp/progmodes/subword.el
@@ -26,7 +26,8 @@
;; This package provides `subword' oriented commands and a minor mode
;; (`subword-mode') that substitutes the common word handling
-;; functions with them.
+;; functions with them. It also provides the `superword-mode' minor
+;; mode that treats symbols as words, the opposite of `subword-mode'.
;; In spite of GNU Coding Standards, it is popular to name a symbol by
;; mixing uppercase and lowercase letters, e.g. "GtkWidget",
@@ -43,12 +44,13 @@
;; The subword oriented commands defined in this package recognize
;; subwords in a nomenclature to move between them and to edit them as
-;; words.
+;; words. You also get a mode to treat symbols as words instead,
+;; called `superword-mode' (the opposite of `subword-mode').
;; In the minor mode, all common key bindings for word oriented
;; commands are overridden by the subword oriented commands:
-;; Key Word oriented command Subword oriented command
+;; Key Word oriented command Subword oriented command (also superword)
;; ============================================================
;; M-f `forward-word' `subword-forward'
;; M-b `backward-word' `subword-backward'
@@ -67,8 +69,13 @@
;; To make the mode turn on automatically, put the following code in
;; your .emacs:
;;
-;; (add-hook 'c-mode-common-hook
-;; (lambda () (subword-mode 1)))
+;; (add-hook 'c-mode-common-hook 'subword-mode)
+;;
+
+;; To make the mode turn `superword-mode' on automatically for
+;; only some modes, put the following code in your .emacs:
+;;
+;; (add-hook 'c-mode-common-hook 'superword-mode)
;;
;; Acknowledgment:
@@ -98,7 +105,8 @@
(let ((map (make-sparse-keymap)))
(dolist (cmd '(forward-word backward-word mark-word kill-word
backward-kill-word transpose-words
- capitalize-word upcase-word downcase-word))
+ capitalize-word upcase-word downcase-word
+ left-word right-word))
(let ((othercmd (let ((name (symbol-name cmd)))
(string-match "\\([[:alpha:]-]+\\)-word[s]?" name)
(intern (concat "subword-" (match-string 1 name))))))
@@ -133,9 +141,8 @@ subwords in a nomenclature to move between subwords and to edit them
as words.
\\{subword-mode-map}"
- nil
- nil
- subword-mode-map)
+ :lighter " ,"
+ (when subword-mode (superword-mode -1)))
(define-obsolete-function-alias 'c-subword-mode 'subword-mode "23.2")
@@ -147,7 +154,7 @@ as words.
"Do the same as `forward-word' but on subwords.
See the command `subword-mode' for a description of subwords.
Optional argument ARG is the same as for `forward-word'."
- (interactive "p")
+ (interactive "^p")
(unless arg (setq arg 1))
(cond
((< 0 arg)
@@ -165,9 +172,23 @@ Optional argument ARG is the same as for `forward-word'."
"Do the same as `backward-word' but on subwords.
See the command `subword-mode' for a description of subwords.
Optional argument ARG is the same as for `backward-word'."
- (interactive "p")
+ (interactive "^p")
(subword-forward (- (or arg 1))))
+(defun subword-right (&optional arg)
+ "Do the same as `right-word' but on subwords."
+ (interactive "^p")
+ (if (eq (current-bidi-paragraph-direction) 'left-to-right)
+ (subword-forward arg)
+ (subword-backward arg)))
+
+(defun subword-left (&optional arg)
+ "Do the same as `left-word' but on subwords."
+ (interactive "^p")
+ (if (eq (current-bidi-paragraph-direction) 'left-to-right)
+ (subword-backward arg)
+ (subword-forward arg)))
+
(defun subword-mark (arg)
"Do the same as `mark-word' but on subwords.
See the command `subword-mode' for a description of subwords.
@@ -254,41 +275,73 @@ Optional argument ARG is the same as for `capitalize-word'."
(unless advance
(goto-char start))))
+
+
+(defvar superword-mode-map subword-mode-map
+ "Keymap used in `superword-mode' minor mode.")
+
+;;;###autoload
+(define-minor-mode superword-mode
+ "Toggle superword movement and editing (Superword mode).
+With a prefix argument ARG, enable Superword mode if ARG is
+positive, and disable it otherwise. If called from Lisp, enable
+the mode if ARG is omitted or nil.
+
+Superword mode is a buffer-local minor mode. Enabling it remaps
+word-based editing commands to superword-based commands that
+treat symbols as words, e.g. \"this_is_a_symbol\".
+
+The superword oriented commands activated in this minor mode
+recognize symbols as superwords to move between superwords and to
+edit them as words.
+
+\\{superword-mode-map}"
+ :lighter " ²"
+ (when superword-mode (subword-mode -1)))
+
+;;;###autoload
+(define-global-minor-mode global-superword-mode superword-mode
+ (lambda () (superword-mode 1)))
;;
;; Internal functions
;;
(defun subword-forward-internal ()
- (if (and
- (save-excursion
- (let ((case-fold-search nil))
- (re-search-forward subword-forward-regexp nil t)))
- (> (match-end 0) (point)))
- (goto-char
- (cond
- ((< 1 (- (match-end 2) (match-beginning 2)))
- (1- (match-end 2)))
- (t
- (match-end 0))))
- (forward-word 1)))
-
+ (if superword-mode
+ (forward-symbol 1)
+ (if (and
+ (save-excursion
+ (let ((case-fold-search nil))
+ (re-search-forward subword-forward-regexp nil t)))
+ (> (match-end 0) (point)))
+ (goto-char
+ (cond
+ ((< 1 (- (match-end 2) (match-beginning 2)))
+ (1- (match-end 2)))
+ (t
+ (match-end 0))))
+ (forward-word 1))))
(defun subword-backward-internal ()
- (if (save-excursion
- (let ((case-fold-search nil))
- (re-search-backward subword-backward-regexp nil t)))
- (goto-char
- (cond
- ((and (match-end 3)
- (< 1 (- (match-end 3) (match-beginning 3)))
- (not (eq (point) (match-end 3))))
- (1- (match-end 3)))
- (t
- (1+ (match-beginning 0)))))
- (backward-word 1)))
+ (if superword-mode
+ (forward-symbol -1)
+ (if (save-excursion
+ (let ((case-fold-search nil))
+ (re-search-backward subword-backward-regexp nil t)))
+ (goto-char
+ (cond
+ ((and (match-end 3)
+ (< 1 (- (match-end 3) (match-beginning 3)))
+ (not (eq (point) (match-end 3))))
+ (1- (match-end 3)))
+ (t
+ (1+ (match-beginning 0)))))
+ (backward-word 1))))
+
(provide 'subword)
+(provide 'superword)
;;; subword.el ends here
diff --git a/lisp/progmodes/tcl.el b/lisp/progmodes/tcl.el
index a32cd969757..9169a433015 100644
--- a/lisp/progmodes/tcl.el
+++ b/lisp/progmodes/tcl.el
@@ -332,8 +332,8 @@ This process selection is performed by function `inferior-tcl-proc'.
Whenever \\[inferior-tcl] fires up a new process, it resets
`inferior-tcl-buffer' to be the new process's buffer. If you only run
one process, this does the right thing. If you run multiple
-processes, you can change `inferior-tcl-buffer' to another process
-buffer with \\[set-variable].")
+processes, you might need to set `inferior-tcl-buffer' to
+whichever process buffer you want to use.")
;;
;; Hooks and other customization.
diff --git a/lisp/progmodes/vera-mode.el b/lisp/progmodes/vera-mode.el
index 0c456d3b944..7b59faca261 100644
--- a/lisp/progmodes/vera-mode.el
+++ b/lisp/progmodes/vera-mode.el
@@ -1423,7 +1423,8 @@ If `vera-intelligent-tab' is nil, always indent line."
;;; Bug reports
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defconst vera-mode-help-address "Reto Zimmermann <reto@gnu.org>"
+(defconst vera-mode-help-address
+ "Reto Zimmermann <reto@gnu.org>, bug-gnu-emacs@gnu.org"
"Address for Vera Mode bug reports.")
;; get reporter-submit-bug-report when byte-compiling
diff --git a/lisp/progmodes/which-func.el b/lisp/progmodes/which-func.el
index 0279319cc89..edfe368479c 100644
--- a/lisp/progmodes/which-func.el
+++ b/lisp/progmodes/which-func.el
@@ -290,7 +290,7 @@ If no function name is found, return nil."
(when (and (null name)
(boundp 'imenu--index-alist) (null imenu--index-alist)
(null which-function-imenu-failed))
- (imenu--make-index-alist t)
+ (ignore-errors (imenu--make-index-alist t))
(unless imenu--index-alist
(set (make-local-variable 'which-function-imenu-failed) t)))
;; If we have an index alist, use it.
@@ -319,7 +319,9 @@ If no function name is found, return nil."
namestack (cons (car pair) namestack)
alist (cdr pair)))
- ((number-or-marker-p (setq mark (cdr pair)))
+ ((or (number-or-marker-p (setq mark (cdr pair)))
+ (and (overlayp mark)
+ (setq mark (overlay-start mark))))
(when (and (>= (setq offset (- (point) mark)) 0)
(< offset minoffset)) ; Find the closest item.
(setq minoffset offset
diff --git a/lisp/progmodes/xscheme.el b/lisp/progmodes/xscheme.el
index 2ad44b4b1c8..37c3cd37a6c 100644
--- a/lisp/progmodes/xscheme.el
+++ b/lisp/progmodes/xscheme.el
@@ -35,7 +35,6 @@
;;;; Internal Variables
(defvar xscheme-previous-mode)
-(defvar xscheme-previous-process-state)
(defvar xscheme-last-input-end)
(defvar xscheme-process-command-line nil
@@ -388,8 +387,6 @@ with no args, if that value is non-nil.
(if (not preserve)
(let ((previous-mode major-mode))
(kill-all-local-variables)
- (make-local-variable 'xscheme-process-name)
- (make-local-variable 'xscheme-previous-process-state)
(make-local-variable 'xscheme-runlight-string)
(make-local-variable 'xscheme-runlight)
(set (make-local-variable 'xscheme-previous-mode) previous-mode)
@@ -397,35 +394,29 @@ with no args, if that value is non-nil.
(set (make-local-variable 'xscheme-buffer-name) (buffer-name buffer))
(set (make-local-variable 'xscheme-last-input-end) (make-marker))
(let ((process (get-buffer-process buffer)))
- (if process
- (progn
- (setq xscheme-process-name (process-name process))
- (setq xscheme-previous-process-state
- (cons (process-filter process)
- (process-sentinel process)))
- (xscheme-process-filter-initialize t)
- (xscheme-mode-line-initialize xscheme-buffer-name)
- (set-process-sentinel process 'xscheme-process-sentinel)
- (set-process-filter process 'xscheme-process-filter))
- (setq xscheme-previous-process-state (cons nil nil)))))))
+ (when process
+ (setq-local xscheme-process-name (process-name process))
+ ;; FIXME: Use add-function!
+ (xscheme-process-filter-initialize t)
+ (xscheme-mode-line-initialize xscheme-buffer-name)
+ (add-function :override (process-sentinel process)
+ #'xscheme-process-sentinel)
+ (add-function :override (process-filter process)
+ #'xscheme-process-filter))))))
(scheme-interaction-mode-initialize)
(scheme-mode-variables)
(run-mode-hooks 'scheme-mode-hook 'scheme-interaction-mode-hook))
(defun exit-scheme-interaction-mode ()
- "Take buffer out of scheme interaction mode"
+ "Take buffer out of scheme interaction mode."
(interactive)
(if (not (derived-mode-p 'scheme-interaction-mode))
(error "Buffer not in scheme interaction mode"))
- (let ((previous-state xscheme-previous-process-state))
- (funcall xscheme-previous-mode)
- (let ((process (get-buffer-process (current-buffer))))
- (if process
- (progn
- (if (eq (process-filter process) 'xscheme-process-filter)
- (set-process-filter process (car previous-state)))
- (if (eq (process-sentinel process) 'xscheme-process-sentinel)
- (set-process-sentinel process (cdr previous-state))))))))
+ (funcall xscheme-previous-mode)
+ (let ((process (get-buffer-process (current-buffer))))
+ (when process
+ (remove-function (process-sentinel process) #'xscheme-process-sentinel)
+ (remove-function (process-filter process) #'xscheme-process-filter))))
(defvar scheme-interaction-mode-commands-alist nil)
(defvar scheme-interaction-mode-map nil)
diff --git a/lisp/ps-bdf.el b/lisp/ps-bdf.el
index 832d1cf55bc..98dd2800b77 100644
--- a/lisp/ps-bdf.el
+++ b/lisp/ps-bdf.el
@@ -91,12 +91,7 @@ If BDFNAME doesn't exist, return nil."
(insert-file-contents bdfname)
buf))))
-(defvar bdf-cache-file (if (eq system-type 'ms-dos)
- ;; convert-standard-filename doesn't
- ;; guarantee that the .el extension will be
- ;; preserved.
- "~/_bdfcache.el"
- (convert-standard-filename "~/.bdfcache.el"))
+(defvar bdf-cache-file (locate-user-emacs-file "bdfcache.el" ".bdfcache.el")
"Name of cache file which contains information of `BDF' font files.")
(defvar bdf-cache nil
diff --git a/lisp/ps-print.el b/lisp/ps-print.el
index 99f22df4107..f7c03c2de85 100644
--- a/lisp/ps-print.el
+++ b/lisp/ps-print.el
@@ -1959,13 +1959,13 @@ Valid values are:
Any other value is treated as nil.
-If you set `ps-selected-pages' (see it for documentation), first the pages are
-filtered by `ps-selected-pages' and then by `ps-even-or-odd-pages'. For
-example, if we have:
+If you set option `ps-selected-pages', first the pages are
+filtered by option `ps-selected-pages' and then by `ps-even-or-odd-pages'.
+For example, if we have:
(setq ps-selected-pages '(1 4 (6 . 10) (12 . 16) 20))
-Combining with `ps-even-or-odd-pages' and `ps-n-up-printing', we have:
+Combining with `ps-even-or-odd-pages' and option `ps-n-up-printing', we have:
`ps-n-up-printing' = 1:
`ps-even-or-odd-pages' PAGES PRINTED
@@ -3566,9 +3566,9 @@ Use the command `ps-despool' to send the spooled images to the printer."
;;;###autoload
(defun ps-spool-buffer-with-faces ()
"Generate and spool a PostScript image of the buffer.
-Like `ps-spool-buffer', but includes font, color, and underline information in
-the generated image. This command works only if you are using a window system,
-so it has a way to determine color values.
+Like the command `ps-spool-buffer', but includes font, color, and underline
+information in the generated image. This command works only if you are using
+a window system, so it has a way to determine color values.
Use the command `ps-despool' to send the spooled images to the printer."
(interactive)
@@ -5369,7 +5369,7 @@ Each element has the following form:
(KIND XCOL YCOL XLIN YLIN REPEAT END XSTART YSTART)
Where:
-KIND is a valid value of `ps-n-up-filling'.
+KIND is a valid value of the variable `ps-n-up-filling'.
XCOL YCOL are the relative position for the next column.
XLIN YLIN are the relative position for the beginning of next line.
REPEAT is the number of repetitions for external loop.
diff --git a/lisp/recentf.el b/lisp/recentf.el
index 02e5b09b981..a4e4359999f 100644
--- a/lisp/recentf.el
+++ b/lisp/recentf.el
@@ -69,7 +69,7 @@ See the command `recentf-save-list'."
:group 'recentf
:type 'integer)
-(defcustom recentf-save-file (convert-standard-filename "~/.recentf")
+(defcustom recentf-save-file (locate-user-emacs-file "recentf" ".recentf")
"File to save the recent list into."
:group 'recentf
:type 'file
diff --git a/lisp/register.el b/lisp/register.el
index ae2f7cf3e2a..4876c614642 100644
--- a/lisp/register.el
+++ b/lisp/register.el
@@ -31,10 +31,6 @@
(eval-when-compile (require 'cl-lib))
-(declare-function semantic-insert-foreign-tag "semantic/tag" (foreign-tag))
-(declare-function semantic-tag-buffer "semantic/tag" (tag))
-(declare-function semantic-tag-start "semantic/tag" (tag))
-
;;; Code:
(cl-defstruct
@@ -174,11 +170,6 @@ delete any existing frames that the frame configuration doesn't mention.
(error "Register access aborted"))
(find-file (nth 1 val))
(goto-char (nth 2 val)))
- ((and (fboundp 'semantic-foreign-tag-p)
- semantic-mode
- (semantic-foreign-tag-p val))
- (switch-to-buffer (semantic-tag-buffer val))
- (goto-char (semantic-tag-start val)))
(t
(error "Register doesn't contain a buffer position or configuration")))))
@@ -349,10 +340,6 @@ Interactively, second arg is non-nil if prefix arg is supplied."
(princ val (current-buffer)))
((and (markerp val) (marker-position val))
(princ (marker-position val) (current-buffer)))
- ((and (fboundp 'semantic-foreign-tag-p)
- semantic-mode
- (semantic-foreign-tag-p val))
- (semantic-insert-foreign-tag val))
(t
(error "Register does not contain text"))))
(if (not arg) (exchange-point-and-mark)))
diff --git a/lisp/replace.el b/lisp/replace.el
index 3eaa5ccf6bd..1bebff448fa 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -583,29 +583,31 @@ of `history-length', which see.")
(defun read-regexp (prompt &optional defaults history)
"Read and return a regular expression as a string.
When PROMPT doesn't end with a colon and space, it adds a final \": \".
-If DEFAULTS is non-nil, it displays the first default in the prompt.
-
-Non-nil optional arg DEFAULTS is a string or a list of strings that
-are prepended to a list of standard default values, which include the
-string at point, the last isearch regexp, the last isearch string, and
-the last replacement regexp.
-
-Non-nil HISTORY is a symbol to use for the history list.
+If the first element of DEFAULTS is non-nil, it's added to the prompt.
+
+Optional arg DEFAULTS has the form (DEFAULT . SUGGESTIONS)
+or simply DEFAULT where DEFAULT, if non-nil, should be a string that
+is returned as the default value when the user enters empty input.
+SUGGESTIONS is a list of strings that can be inserted into
+the minibuffer using \\<minibuffer-local-map>\\[next-history-element]. \
+The values supplied in SUGGESTIONS
+are prepended to the list of standard suggestions that include
+the tag at point, the last isearch regexp, the last isearch string,
+and the last replacement regexp.
+
+Optional arg HISTORY is a symbol to use for the history list.
If HISTORY is nil, `regexp-history' is used."
- (let* ((default (if (consp defaults) (car defaults) defaults))
- (defaults
- (append
- (if (listp defaults) defaults (list defaults))
- (list (regexp-quote
- (or (funcall (or find-tag-default-function
- (get major-mode 'find-tag-default-function)
- 'find-tag-default))
- ""))
- (car regexp-search-ring)
- (regexp-quote (or (car search-ring) ""))
- (car (symbol-value
- query-replace-from-history-variable)))))
- (defaults (delete-dups (delq nil (delete "" defaults))))
+ (let* ((default (if (consp defaults) (car defaults) defaults))
+ (suggestions (if (listp defaults) defaults (list defaults)))
+ (suggestions
+ (append
+ suggestions
+ (list
+ (find-tag-default-as-regexp)
+ (car regexp-search-ring)
+ (regexp-quote (or (car search-ring) ""))
+ (car (symbol-value query-replace-from-history-variable)))))
+ (suggestions (delete-dups (delq nil (delete "" suggestions))))
;; Do not automatically add default to the history for empty input.
(history-add-new-input nil)
(input (read-from-minibuffer
@@ -616,9 +618,11 @@ If HISTORY is nil, `regexp-history' is used."
(query-replace-descr default)))
(t
(format "%s: " prompt)))
- nil nil nil (or history 'regexp-history) defaults t)))
+ nil nil nil (or history 'regexp-history) suggestions t)))
(if (equal input "")
+ ;; Return the default value when the user enters empty input.
(or default input)
+ ;; Otherwise, add non-empty input to the history and return input.
(prog1 input
(add-to-history (or history 'regexp-history) input)))))
@@ -1121,6 +1125,14 @@ If the value is nil, don't highlight the buffer names specially."
:type 'face
:group 'matching)
+(defcustom list-matching-lines-prefix-face 'shadow
+ "Face used by \\[list-matching-lines] to show the prefix column.
+If the face doesn't differ from the default face,
+don't highlight the prefix with line numbers specially."
+ :type 'face
+ :group 'matching
+ :version "24.4")
+
(defcustom occur-excluded-properties
'(read-only invisible intangible field mouse-face help-echo local-map keymap
yank-handler follow-link)
@@ -1131,12 +1143,32 @@ which means to discard all text properties."
:group 'matching
:version "22.1")
+(defvar occur-read-regexp-defaults-function
+ 'occur-read-regexp-defaults
+ "Function that provides default regexp(s) for occur commands.
+This function should take no arguments and return one of nil, a
+regexp or a list of regexps for use with occur commands -
+`occur', `multi-occur' and `multi-occur-in-matching-buffers'.
+The return value of this function is used as DEFAULTS param of
+`read-regexp' while executing the occur command. This function
+is called only during interactive use.
+
+For example, to check for occurrence of symbol at point use
+
+ \(setq occur-read-regexp-defaults-function
+ 'find-tag-default-as-regexp\).")
+
+(defun occur-read-regexp-defaults ()
+ "Return the latest regexp from `regexp-history'.
+See `occur-read-regexp-defaults-function' for details."
+ (car regexp-history))
+
(defun occur-read-primary-args ()
(let* ((perform-collect (consp current-prefix-arg))
(regexp (read-regexp (if perform-collect
"Collect strings matching regexp"
"List lines matching regexp")
- (car regexp-history))))
+ (funcall occur-read-regexp-defaults-function))))
(list regexp
(if perform-collect
;; Perform collect operation
@@ -1310,7 +1342,9 @@ See also `multi-occur'."
(isearch-no-upper-case-p regexp t)
case-fold-search)
list-matching-lines-buffer-name-face
- nil list-matching-lines-face
+ (if (face-differs-from-default-p list-matching-lines-prefix-face)
+ list-matching-lines-prefix-face)
+ list-matching-lines-face
(not (eq occur-excluded-properties t))))))
(let* ((bufcount (length active-bufs))
(diff (- (length bufs) bufcount)))
@@ -1399,7 +1433,7 @@ See also `multi-occur'."
(apply #'propertize (format "%7d:" lines)
(append
(when prefix-face
- `(font-lock-face prefix-face))
+ `(font-lock-face ,prefix-face))
`(occur-prefix t mouse-face (highlight)
;; Allow insertion of text at
;; the end of the prefix (for
@@ -1423,7 +1457,9 @@ See also `multi-occur'."
;; of multi-line matches.
(replace-regexp-in-string
"\n"
- "\n :"
+ (if prefix-face
+ (propertize "\n :" 'font-lock-face prefix-face)
+ "\n :")
match-str)
;; Add marker at eol, but no mouse props.
(propertize "\n" 'occur-target marker)))
@@ -1434,7 +1470,8 @@ See also `multi-occur'."
;; The complex multi-line display style.
(setq ret (occur-context-lines
out-line nlines keep-props begpt endpt
- lines prev-lines prev-after-lines))
+ lines prev-lines prev-after-lines
+ prefix-face))
;; Set first elem of the returned list to `data',
;; and the second elem to `prev-after-lines'.
(setq prev-after-lines (nth 1 ret))
@@ -1458,7 +1495,7 @@ See also `multi-occur'."
(when prev-after-lines
(with-current-buffer out-buf
(insert (apply #'concat (occur-engine-add-prefix
- prev-after-lines)))))))
+ prev-after-lines prefix-face)))))))
(when (not (zerop matches)) ;; is the count zero?
(setq globalcount (+ globalcount matches))
(with-current-buffer out-buf
@@ -1513,10 +1550,13 @@ See also `multi-occur'."
str)
(buffer-substring-no-properties beg end)))
-(defun occur-engine-add-prefix (lines)
+(defun occur-engine-add-prefix (lines &optional prefix-face)
(mapcar
#'(lambda (line)
- (concat " :" line "\n"))
+ (concat (if prefix-face
+ (propertize " :" 'font-lock-face prefix-face)
+ " :")
+ line "\n"))
lines))
(defun occur-accumulate-lines (count &optional keep-props pt)
@@ -1545,7 +1585,8 @@ See also `multi-occur'."
;; Generate a list of lines, add prefixes to all but OUT-LINE,
;; then concatenate them all together.
(defun occur-context-lines (out-line nlines keep-props begpt endpt
- lines prev-lines prev-after-lines)
+ lines prev-lines prev-after-lines
+ &optional prefix-face)
;; Find after- and before-context lines of the current match.
(let ((before-lines
(nreverse (cdr (occur-accumulate-lines
@@ -1585,10 +1626,13 @@ See also `multi-occur'."
;; Return a list where the first element is the output line.
(apply #'concat
(append
- (and prev-after-lines
- (occur-engine-add-prefix prev-after-lines))
- (and separator (list separator))
- (occur-engine-add-prefix before-lines)
+ (if prev-after-lines
+ (occur-engine-add-prefix prev-after-lines prefix-face))
+ (if separator
+ (list (if prefix-face
+ (propertize separator 'font-lock-face prefix-face)
+ separator)))
+ (occur-engine-add-prefix before-lines prefix-face)
(list out-line)))
;; And the second element is the list of context after-lines.
(if (> nlines 0) after-lines))))
diff --git a/lisp/ruler-mode.el b/lisp/ruler-mode.el
index 08c4ba51905..009bb11fc10 100644
--- a/lisp/ruler-mode.el
+++ b/lisp/ruler-mode.el
@@ -137,8 +137,8 @@ or remove a tab stop. \\[ruler-mode-toggle-show-tab-stops] or
(format "Invalid character value: %S" value))
widget))))
-(defcustom ruler-mode-fill-column-char (if (char-displayable-p ?¶)
- ?\¶
+(defcustom ruler-mode-fill-column-char (if (char-displayable-p ?¶)
+ ?\¶
?\|)
"Character used at the `fill-column' location."
:group 'ruler-mode
@@ -163,8 +163,8 @@ or remove a tab stop. \\[ruler-mode-toggle-show-tab-stops] or
(integer :tag "Integer char value"
:validate ruler-mode-character-validate)))
-(defcustom ruler-mode-current-column-char (if (char-displayable-p ?¦)
- ?\¦
+(defcustom ruler-mode-current-column-char (if (char-displayable-p ?¦)
+ ?\¦
?\@)
"Character used at the `current-column' location."
:group 'ruler-mode
@@ -774,7 +774,7 @@ Optional argument PROPS specifies other text properties to apply."
(provide 'ruler-mode)
;; Local Variables:
-;; coding: iso-latin-1
+;; coding: utf-8
;; End:
;;; ruler-mode.el ends here
diff --git a/lisp/saveplace.el b/lisp/saveplace.el
index baa6b794fc4..1b7efcec1b9 100644
--- a/lisp/saveplace.el
+++ b/lisp/saveplace.el
@@ -68,7 +68,7 @@ following code in your init file:
(make-variable-buffer-local 'save-place)
-(defcustom save-place-file (convert-standard-filename "~/.emacs-places")
+(defcustom save-place-file (locate-user-emacs-file "places" ".emacs-places")
"Name of the file that records `save-place-alist' value."
:type 'file
:group 'save-place)
@@ -224,9 +224,7 @@ may have changed\) back to `save-place-alist'."
(symbol-name coding-system-for-write)))
(let ((print-length nil)
(print-level nil))
- (pp (sort save-place-alist
- (lambda (a b) (string< (car a) (car b))))
- (current-buffer)))
+ (pp save-place-alist (current-buffer)))
(let ((version-control
(cond
((null save-place-version-control) nil)
diff --git a/lisp/server.el b/lisp/server.el
index 151ba35503f..05ac345d904 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -361,7 +361,7 @@ Updates `server-clients'."
(defconst server-buffer " *server*"
"Buffer used internally by Emacs's server.
-One use is to log the I/O for debugging purposes (see `server-log'),
+One use is to log the I/O for debugging purposes (see option `server-log'),
the other is to provide a current buffer in which the process filter can
safely let-bind buffer-local variables like `default-directory'.")
@@ -369,7 +369,7 @@ safely let-bind buffer-local variables like `default-directory'.")
"If non-nil, log the server's inputs and outputs in the `server-buffer'.")
(defun server-log (string &optional client)
- "If `server-log' is non-nil, log STRING to `server-buffer'.
+ "If option `server-log' is non-nil, log STRING to `server-buffer'.
If CLIENT is non-nil, add a description of it to the logged message."
(when server-log
(with-current-buffer (get-buffer-create server-buffer)
@@ -1257,12 +1257,17 @@ The following commands are accepted by the client:
(mapc 'funcall (nreverse commands))
;; If we were told only to open a new client, obey
- ;; `initial-buffer-choice' if it specifies a file.
- (unless (or files commands)
- (if (stringp initial-buffer-choice)
- (find-file initial-buffer-choice)
- (switch-to-buffer (get-buffer-create "*scratch*")
- 'norecord)))
+ ;; `initial-buffer-choice' if it specifies a file
+ ;; or a function.
+ (unless (or files commands)
+ (let ((buf
+ (cond ((stringp initial-buffer-choice)
+ (find-file-noselect initial-buffer-choice))
+ ((functionp initial-buffer-choice)
+ (funcall initial-buffer-choice)))))
+ (switch-to-buffer
+ (if (buffer-live-p buf) buf (get-buffer-create "*scratch*"))
+ 'norecord)))
;; Delete the client if necessary.
(cond
diff --git a/lisp/ses.el b/lisp/ses.el
index 552c09bb47e..bf88364456f 100644
--- a/lisp/ses.el
+++ b/lisp/ses.el
@@ -278,6 +278,7 @@ default printer and then modify its output.")
ses--default-printer
ses--deferred-narrow ses--deferred-recalc
ses--deferred-write ses--file-format
+ ses--named-cell-hashmap
(ses--header-hscroll . -1) ; Flag for "initial recalc needed"
ses--header-row ses--header-string ses--linewidth
ses--numcols ses--numrows ses--symbolic-formulas
@@ -511,9 +512,22 @@ PROPERTY-NAME."
`(aref ses--col-printers ,col))
(defmacro ses-sym-rowcol (sym)
- "From a cell-symbol SYM, gets the cons (row . col). A1 => (0 . 0).
-Result is nil if SYM is not a symbol that names a cell."
- `(and (symbolp ,sym) (get ,sym 'ses-cell)))
+ "From a cell-symbol SYM, gets the cons (row . col). A1 => (0 . 0). Result
+is nil if SYM is not a symbol that names a cell."
+ `(let ((rc (and (symbolp ,sym) (get ,sym 'ses-cell))))
+ (if (eq rc :ses-named)
+ (gethash ,sym ses--named-cell-hashmap)
+ rc)))
+
+(defun ses-is-cell-sym-p (sym)
+ "Check whether SYM point at a cell of this spread sheet."
+ (let ((rowcol (get sym 'ses-cell)))
+ (and rowcol
+ (if (eq rowcol :ses-named)
+ (and ses--named-cell-hashmap (gethash sym ses--named-cell-hashmap))
+ (and (< (car rowcol) ses--numrows)
+ (< (cdr rowcol) ses--numcols)
+ (eq (ses-cell-symbol (car rowcol) (cdr rowcol)) sym))))))
(defmacro ses-cell (sym value formula printer references)
"Load a cell SYM from the spreadsheet file. Does not recompute VALUE from
@@ -682,6 +696,28 @@ for this spreadsheet."
"Produce a symbol that names the cell (ROW,COL). (0,0) => 'A1."
(intern (concat (ses-column-letter col) (number-to-string (1+ row)))))
+(defun ses-decode-cell-symbol (str)
+ "Decode a symbol \"A1\" => (0,0). Returns `nil' if STR is not a
+ canonical cell name. Does not save match data."
+ (let (case-fold-search)
+ (and (string-match "\\`\\([A-Z]+\\)\\([0-9]+\\)\\'" str)
+ (let* ((col-str (match-string-no-properties 1 str))
+ (col 0)
+ (col-offset 0)
+ (col-base 1)
+ (col-idx (1- (length col-str)))
+ (row (1- (string-to-number (match-string-no-properties 2 str)))))
+ (and (>= row 0)
+ (progn
+ (while
+ (progn
+ (setq col (+ col (* (- (aref col-str col-idx) ?A) col-base))
+ col-base (* col-base 26)
+ col-idx (1- col-idx))
+ (and (>= col-idx 0)
+ (setq col (+ col col-base)))))
+ (cons row col)))))))
+
(defun ses-create-cell-variable-range (minrow maxrow mincol maxcol)
"Create buffer-local variables for cells. This is undoable."
(push `(apply ses-destroy-cell-variable-range ,minrow ,maxrow ,mincol ,maxcol)
@@ -704,7 +740,11 @@ row and column of the cell, with numbering starting from 0.
Return nil in case of failure."
(unless (local-variable-p sym)
(make-local-variable sym)
- (put sym 'ses-cell (cons row col))))
+ (if (let (case-fold-search) (string-match "\\`[A-Z]+[0-9]+\\'" (symbol-name sym)))
+ (put sym 'ses-cell (cons row col))
+ (put sym 'ses-cell :ses-named)
+ (setq ses--named-cell-hashmap (or ses--named-cell-hashmap (make-hash-table :test 'eq)))
+ (puthash sym (cons row col) ses--named-cell-hashmap))))
;; We do not delete the ses-cell properties for the cell-variables, in
;; case a formula that refers to this cell is in the kill-ring and is
@@ -2678,8 +2718,9 @@ inserts a new row if at bottom of print area. Repeat COUNT times."
;; Cut and paste, import and export
;;----------------------------------------------------------------------------
-(defadvice copy-region-as-kill (around ses-copy-region-as-kill
- activate preactivate)
+(defun ses--advice-copy-region-as-kill (crak-fun beg end &rest args)
+ ;; FIXME: Why doesn't it make sense to copy read-only or
+ ;; intangible attributes? They're removed upon yank!
"It doesn't make sense to copy read-only or intangible attributes into the
kill ring. It probably doesn't make sense to copy keymap properties.
We'll assume copying front-sticky properties doesn't make sense, either.
@@ -2690,14 +2731,15 @@ hard to override how mouse-1 works."
(let ((temp beg))
(setq beg end
end temp)))
- (if (not (and (eq major-mode 'ses-mode)
+ (if (not (and (derived-mode-p 'ses-mode)
(eq (get-text-property beg 'read-only) 'ses)
(eq (get-text-property (1- end) 'read-only) 'ses)))
- ad-do-it ; Normal copy-region-as-kill.
+ (apply crak-fun beg end args) ; Normal copy-region-as-kill.
(kill-new (ses-copy-region beg end))
(if transient-mark-mode
(setq deactivate-mark t))
nil))
+(advice-add 'copy-region-as-kill :around #'ses--advice-copy-region-as-kill)
(defun ses-copy-region (beg end)
"Treat the region as rectangular. Convert the intangible attributes to
@@ -2761,7 +2803,7 @@ We clear the killed cells instead of deleting them."
(ses-clear-cell row col))
(ses-jump (car ses--curcell)))
-(defadvice yank (around ses-yank activate preactivate)
+(defun ses--advice-yank (yank-fun &optional arg &rest args)
"In SES mode, the yanked text is inserted as cells.
If the text contains 'ses attributes (meaning it went to the kill-ring from a
@@ -2779,9 +2821,9 @@ When inserting formulas, the text is treated as a string constant if it doesn't
make sense as a sexp or would otherwise be considered a symbol. Use 'sym to
explicitly insert a symbol, or use the C-u prefix to treat all unmarked words
as symbols."
- (if (not (and (eq major-mode 'ses-mode)
+ (if (not (and (derived-mode-p 'ses-mode)
(eq (get-text-property (point) 'keymap) 'ses-mode-print-map)))
- ad-do-it ; Normal non-SES yank.
+ (apply yank-fun arg args) ; Normal non-SES yank.
(ses-check-curcell 'end)
(push-mark (point))
(let ((text (current-kill (cond
@@ -2799,6 +2841,7 @@ as symbols."
arg)))
(if (consp arg)
(exchange-point-and-mark))))
+(advice-add 'yank :around #'ses--advice-yank)
(defun ses-yank-pop (arg)
"Replace just-yanked stretch of killed text with a different stretch.
@@ -3211,27 +3254,36 @@ highlighted range in the spreadsheet."
(defun ses-rename-cell (new-name &optional cell)
"Rename current cell."
(interactive "*SEnter new name: ")
- (and (local-variable-p new-name)
- (ses-sym-rowcol new-name)
- ;; this test is needed because ses-cell property of deleted cells
- ;; is not deleted in case of subsequent undo
- (memq new-name ses--renamed-cell-symb-list)
- (error "Already a cell name"))
- (and (boundp new-name)
- (null (yes-or-no-p (format "`%S' is already bound outside this buffer, continue? "
- new-name)))
- (error "Already a bound cell name"))
- (let* ((sym (if (ses-cell-p cell)
+ (or
+ (and (local-variable-p new-name)
+ (ses-is-cell-sym-p new-name)
+ (error "Already a cell name"))
+ (and (boundp new-name)
+ (null (yes-or-no-p (format "`%S' is already bound outside this buffer, continue? "
+ new-name)))
+ (error "Already a bound cell name")))
+ (let* (curcell
+ (sym (if (ses-cell-p cell)
(ses-cell-symbol cell)
- (setq cell nil)
+ (setq cell nil
+ curcell t)
(ses-check-curcell)
ses--curcell))
(rowcol (ses-sym-rowcol sym))
(row (car rowcol))
- (col (cdr rowcol)))
- (setq cell (or cell (ses-get-cell row col)))
- (push `(ses-rename-cell ,(ses-cell-symbol cell) ,cell) buffer-undo-list)
- (put new-name 'ses-cell rowcol)
+ (col (cdr rowcol))
+ new-rowcol old-name)
+ (setq cell (or cell (ses-get-cell row col))
+ old-name (ses-cell-symbol cell)
+ new-rowcol (ses-decode-cell-symbol (symbol-name new-name)))
+ (if new-rowcol
+ (if (equal new-rowcol rowcol)
+ (put new-name 'ses-cell rowcol)
+ (error "Not a valid name for this cell location"))
+ (setq ses--named-cell-hashmap (or ses--named-cell-hashmap (make-hash-table :test 'eq)))
+ (put new-name 'ses-cell :ses-named)
+ (puthash new-name rowcol ses--named-cell-hashmap))
+ (push `(ses-rename-cell ,old-name ,cell) buffer-undo-list)
;; replace name by new name in formula of cells refering to renamed cell
(dolist (ref (ses-cell-references cell))
(let* ((x (ses-sym-rowcol ref))
@@ -3251,9 +3303,8 @@ highlighted range in the spreadsheet."
(push new-name ses--renamed-cell-symb-list)
(set new-name (symbol-value sym))
(aset cell 0 new-name)
- (put sym 'ses-cell nil)
(makunbound sym)
- (setq sym new-name)
+ (and curcell (setq ses--curcell new-name))
(let* ((pos (point))
(inhibit-read-only t)
(col (current-column))
@@ -3265,7 +3316,7 @@ highlighted range in the spreadsheet."
(put-text-property pos end 'intangible new-name))
;; update mode line
(setq mode-line-process (list " cell "
- (symbol-name sym)))
+ (symbol-name new-name)))
(force-mode-line-update)))
;;----------------------------------------------------------------------------
@@ -3538,10 +3589,9 @@ current column and continues until the next nonblank column."
(defun ses-unload-function ()
"Unload the Simple Emacs Spreadsheet."
- (dolist (fun '(copy-region-as-kill yank))
- (ad-remove-advice fun 'around (intern (concat "ses-" (symbol-name fun))))
- (ad-update fun))
- ;; continue standard unloading
+ (advice-remove 'yank #'ses--advice-yank)
+ (advice-remove 'copy-region-as-kill #'ses--advice-copy-region-as-kill)
+ ;; Continue standard unloading.
nil)
(provide 'ses)
diff --git a/lisp/shadowfile.el b/lisp/shadowfile.el
index d10ea99afb1..ec6e6e7ff10 100644
--- a/lisp/shadowfile.el
+++ b/lisp/shadowfile.el
@@ -651,7 +651,7 @@ Return t unless files were locked; then return nil."
(beep)
(sit-for 3)
nil)
- (save-excursion
+ (save-current-buffer
(when shadow-info-file
(set-buffer (setq shadow-info-buffer
(find-file-noselect shadow-info-file)))
@@ -683,7 +683,7 @@ Also clear `shadow-hashtable', since when there are new shadows
defined, the old hashtable info is invalid."
(shadow-invalidate-hashtable)
(if shadow-info-file
- (save-excursion
+ (save-current-buffer
(if (not shadow-info-buffer)
(setq shadow-info-buffer (find-file-noselect shadow-info-file)))
(set-buffer shadow-info-buffer)
@@ -802,11 +802,13 @@ look for files that have been changed and need to be copied to other systems."
(file-name-as-directory (shadow-expand-file-name "~"))))
(if (null shadow-info-file)
(setq shadow-info-file
- (shadow-expand-file-name (convert-standard-filename "~/.shadows"))))
+ ;; FIXME: Move defaults to their defcustom.
+ (shadow-expand-file-name
+ (locate-user-emacs-file "shadows" ".shadows"))))
(if (null shadow-todo-file)
(setq shadow-todo-file
(shadow-expand-file-name
- (convert-standard-filename "~/.shadow_todo"))))
+ (locate-user-emacs-file "shadow_todo" ".shadow_todo"))))
(if (not (shadow-read-files))
(progn
(message "Shadowfile information files not found - aborting")
diff --git a/lisp/shell.el b/lisp/shell.el
index d79ca363a0f..d09d7aee43f 100644
--- a/lisp/shell.el
+++ b/lisp/shell.el
@@ -562,10 +562,8 @@ buffer."
;; very inefficient in Shell buffers (e.g. Bug#10835). We use a
;; custom `ansi-color-apply-face-function' to convert color escape
;; sequences into `font-lock-face' properties.
- (set (make-local-variable 'ansi-color-apply-face-function)
- (lambda (beg end face)
- (when face
- (put-text-property beg end 'font-lock-face face))))
+ (setq-local ansi-color-apply-face-function #'shell-apply-ansi-color)
+ (shell-reapply-ansi-color)
;; This is not really correct, since the shell buffer does not really
;; edit this directory. But it is useful in the buffer list and menus.
@@ -604,6 +602,27 @@ buffer."
'shell-filter-ctrl-a-ctrl-b nil t)))
(comint-read-input-ring t)))
+(defun shell-apply-ansi-color (beg end face)
+ "Apply FACE as the ansi-color face for the text between BEG and END."
+ (when face
+ (put-text-property beg end 'ansi-color-face face)
+ (put-text-property beg end 'font-lock-face face)))
+
+(defun shell-reapply-ansi-color ()
+ "Reapply ansi-color faces to the existing contents of the buffer."
+ (save-restriction
+ (widen)
+ (let* ((pos (point-min))
+ (end (or (next-single-property-change pos 'ansi-color-face)
+ (point-max)))
+ face)
+ (while end
+ (if (setq face (get-text-property pos 'ansi-color-face))
+ (put-text-property pos (or end (point-max))
+ 'font-lock-face face))
+ (setq pos end
+ end (next-single-property-change pos 'ansi-color-face))))))
+
(defun shell-filter-ctrl-a-ctrl-b (string)
"Remove `^A' and `^B' characters from comint output.
@@ -672,7 +691,12 @@ Otherwise, one argument `-i' is passed to the shell.
(and current-prefix-arg
(prog1
(read-buffer "Shell buffer: "
- (generate-new-buffer-name "*shell*"))
+ ;; If the current buffer is an inactive
+ ;; shell buffer, use it as the default.
+ (if (and (eq major-mode 'shell-mode)
+ (null (get-buffer-process (current-buffer))))
+ (buffer-name)
+ (generate-new-buffer-name "*shell*")))
(if (file-remote-p default-directory)
;; It must be possible to declare a local default-directory.
;; FIXME: This can't be right: it changes the default-directory
diff --git a/lisp/simple.el b/lisp/simple.el
index 57307baad8c..5fda9021004 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -1,4 +1,4 @@
-;;; simple.el --- basic editing commands for Emacs
+;;; simple.el --- basic editing commands for Emacs -*- lexical-binding: t -*-
;; Copyright (C) 1985-1987, 1993-2013 Free Software Foundation, Inc.
@@ -349,8 +349,7 @@ buffer causes automatic display of the corresponding source code location."
Other major modes are defined by comparison with this one."
(interactive)
(kill-all-local-variables)
- (unless delay-mode-hooks
- (run-hooks 'after-change-major-mode-hook)))
+ (run-mode-hooks))
;; Special major modes to view specially formatted data rather than files.
@@ -359,6 +358,7 @@ Other major modes are defined by comparison with this one."
(suppress-keymap map)
(define-key map "q" 'quit-window)
(define-key map " " 'scroll-up-command)
+ (define-key map [?\S-\ ] 'scroll-down-command)
(define-key map "\C-?" 'scroll-down-command)
(define-key map "?" 'describe-mode)
(define-key map "h" 'describe-mode)
@@ -401,7 +401,7 @@ Other major modes are defined by comparison with this one."
(defun newline (&optional arg)
"Insert a newline, and move to left margin of the new line if it's blank.
-If `use-hard-newlines' is non-nil, the newline is marked with the
+If option `use-hard-newlines' is non-nil, the newline is marked with the
text-property `hard'.
With ARG, insert that many newlines.
Call `auto-fill-function' if the current column number is greater
@@ -746,21 +746,76 @@ If BACKWARD-ONLY is non-nil, only delete them before point."
"Delete all spaces and tabs around point, leaving one space (or N spaces).
If N is negative, delete newlines as well, leaving -N spaces."
(interactive "*p")
- (unless n (setq n 1))
- (let ((orig-pos (point))
- (skip-characters (if (< n 0) " \t\n\r" " \t"))
- (n (abs n)))
- (skip-chars-backward skip-characters)
+ (cycle-spacing n nil t))
+
+(defvar cycle-spacing--context nil
+ "Store context used in consecutive calls to `cycle-spacing' command.
+The first time this function is run, it saves the original point
+position and original spacing around the point in this
+variable.")
+
+(defun cycle-spacing (&optional n preserve-nl-back single-shot)
+ "Manipulate spaces around the point in a smart way.
+
+When run as an interactive command, the first time it's called
+in a sequence, deletes all spaces and tabs around point leaving
+one (or N spaces). If this does not change content of the
+buffer, skips to the second step:
+
+When run for the second time in a sequence, deletes all the
+spaces it has previously inserted.
+
+When run for the third time, returns the whitespace and point in
+a state encountered when it had been run for the first time.
+
+For example, if buffer contains \"foo ^ bar\" with \"^\" denoting the
+point, calling `cycle-spacing' command will replace two spaces with
+a single space, calling it again immediately after, will remove all
+spaces, and calling it for the third time will bring two spaces back
+together.
+
+If N is negative, delete newlines as well. However, if
+PRESERVE-NL-BACK is t new line characters prior to the point
+won't be removed.
+
+If SINGLE-SHOT is non-nil, will only perform the first step. In
+other words, it will work just like `just-one-space' command."
+ (interactive "*p")
+ (let ((orig-pos (point))
+ (skip-characters (if (and n (< n 0)) " \t\n\r" " \t"))
+ (n (abs (or n 1))))
+ (skip-chars-backward (if preserve-nl-back " \t" skip-characters))
(constrain-to-field nil orig-pos)
- (dotimes (i n)
- (if (= (following-char) ?\s)
- (forward-char 1)
- (insert ?\s)))
- (delete-region
- (point)
- (progn
- (skip-chars-forward skip-characters)
- (constrain-to-field nil orig-pos t)))))
+ (cond
+ ;; Command run for the first time or single-shot is non-nil.
+ ((or single-shot
+ (not (equal last-command this-command))
+ (not cycle-spacing--context))
+ (let* ((start (point))
+ (n (- n (skip-chars-forward " " (+ n (point)))))
+ (mid (point))
+ (end (progn
+ (skip-chars-forward skip-characters)
+ (constrain-to-field nil orig-pos t))))
+ (setq cycle-spacing--context ;; Save for later.
+ ;; Special handling for case where there was no space at all.
+ (unless (= start end)
+ (cons orig-pos (buffer-substring start (point)))))
+ ;; If this run causes no change in buffer content, delete all spaces,
+ ;; otherwise delete all excess spaces.
+ (delete-region (if (and (not single-shot) (zerop n) (= mid end))
+ start mid) end)
+ (insert (make-string n ?\s))))
+
+ ;; Command run for the second time.
+ ((not (equal orig-pos (point)))
+ (delete-region (point) orig-pos))
+
+ ;; Command run for the third time.
+ (t
+ (insert (cdr cycle-spacing--context))
+ (goto-char (car cycle-spacing--context))
+ (setq cycle-spacing--context nil)))))
(defun beginning-of-buffer (&optional arg)
"Move point to the beginning of the buffer.
@@ -813,7 +868,8 @@ Don't use this command in Lisp programs!
;; If we went to a place in the middle of the buffer,
;; adjust it to the beginning of a line.
(cond ((and arg (not (consp arg))) (forward-line 1))
- ((> (point) (window-end nil t))
+ ((and (eq (current-buffer) (window-buffer))
+ (> (point) (window-end nil t)))
;; If the end of the buffer is not already on the screen,
;; then scroll specially to put it near, but not at, the bottom.
(overlay-recenter (point))
@@ -837,7 +893,7 @@ instead of deleted."
"Delete the previous N characters (following if N is negative).
If Transient Mark mode is enabled, the mark is active, and N is 1,
delete the text in the region and deactivate the mark instead.
-To disable this, set `delete-active-region' to nil.
+To disable this, set option `delete-active-region' to nil.
Optional second arg KILLFLAG, if non-nil, means to kill (save in
kill ring) instead of delete. Interactively, N is the prefix
@@ -873,7 +929,7 @@ the end of the line."
"Delete the following N characters (previous if N is negative).
If Transient Mark mode is enabled, the mark is active, and N is 1,
delete the text in the region and deactivate the mark instead.
-To disable this, set `delete-active-region' to nil.
+To disable this, set variable `delete-active-region' to nil.
Optional second arg KILLFLAG non-nil means to kill (save in kill
ring) instead of delete. Interactively, N is the prefix arg, and
@@ -1235,15 +1291,17 @@ display the result of expression evaluation."
(format " (#o%o, #x%x, %s)" value value char-string)
(format " (#o%o, #x%x)" value value)))))
+(defvar eval-expression-minibuffer-setup-hook nil
+ "Hook run by `eval-expression' when entering the minibuffer.")
+
;; We define this, rather than making `eval' interactive,
;; for the sake of completion of names like eval-region, eval-buffer.
-(defun eval-expression (eval-expression-arg
- &optional eval-expression-insert-value)
- "Evaluate EVAL-EXPRESSION-ARG and print value in the echo area.
+(defun eval-expression (exp &optional insert-value)
+ "Evaluate EXP and print value in the echo area.
When called interactively, read an Emacs Lisp expression and
evaluate it.
Value is also consed on to front of the variable `values'.
-Optional argument EVAL-EXPRESSION-INSERT-VALUE non-nil (interactively,
+Optional argument INSERT-VALUE non-nil (interactively,
with prefix argument) means insert the result into the current buffer
instead of printing it in the echo area. Truncates long output
according to the value of the variables `eval-expression-print-length'
@@ -1253,18 +1311,20 @@ If `eval-expression-debug-on-error' is non-nil, which is the default,
this command arranges for all errors to enter the debugger."
(interactive
(list (let ((minibuffer-completing-symbol t))
- (read-from-minibuffer "Eval: "
- nil read-expression-map t
- 'read-expression-history))
+ (minibuffer-with-setup-hook
+ (lambda () (run-hooks 'eval-expression-minibuffer-setup-hook))
+ (read-from-minibuffer "Eval: "
+ nil read-expression-map t
+ 'read-expression-history)))
current-prefix-arg))
(if (null eval-expression-debug-on-error)
- (push (eval eval-expression-arg lexical-binding) values)
+ (push (eval exp lexical-binding) values)
(let ((old-value (make-symbol "t")) new-value)
;; Bind debug-on-error to something unique so that we can
;; detect when evalled code changes it.
(let ((debug-on-error old-value))
- (push (eval eval-expression-arg lexical-binding) values)
+ (push (eval exp lexical-binding) values)
(setq new-value debug-on-error))
;; If evalled code has changed the value of debug-on-error,
;; propagate that change to the global binding.
@@ -1272,8 +1332,9 @@ this command arranges for all errors to enter the debugger."
(setq debug-on-error new-value))))
(let ((print-length eval-expression-print-length)
- (print-level eval-expression-print-level))
- (if eval-expression-insert-value
+ (print-level eval-expression-print-level)
+ (deactivate-mark))
+ (if insert-value
(with-no-warnings
(let ((standard-output (current-buffer)))
(prin1 (car values))))
@@ -1344,6 +1405,8 @@ to get different commands to edit and resubmit."
(error "Argument %d is beyond length of command history" arg)
(error "There are no previous complex commands to repeat")))))
+(defvar extended-command-history nil)
+
(defun read-extended-command ()
"Read command name to invoke in `execute-extended-command'."
(minibuffer-with-setup-hook
@@ -1433,6 +1496,53 @@ give to the command you invoke, if it asks for an argument."
(sit-for (if (numberp suggest-key-bindings)
suggest-key-bindings
2))))))))
+
+(defun command-execute (cmd &optional record-flag keys special)
+ ;; BEWARE: Called directly from the C code.
+ "Execute CMD as an editor command.
+CMD must be a symbol that satisfies the `commandp' predicate.
+Optional second arg RECORD-FLAG non-nil
+means unconditionally put this command in the variable `command-history'.
+Otherwise, that is done only if an arg is read using the minibuffer.
+The argument KEYS specifies the value to use instead of (this-command-keys)
+when reading the arguments; if it is nil, (this-command-keys) is used.
+The argument SPECIAL, if non-nil, means that this command is executing
+a special event, so ignore the prefix argument and don't clear it."
+ (setq debug-on-next-call nil)
+ (let ((prefixarg (unless special
+ (prog1 prefix-arg
+ (setq current-prefix-arg prefix-arg)
+ (setq prefix-arg nil)))))
+ (and (symbolp cmd)
+ (get cmd 'disabled)
+ ;; FIXME: Weird calling convention!
+ (run-hooks 'disabled-command-function))
+ (let ((final cmd))
+ (while
+ (progn
+ (setq final (indirect-function final))
+ (if (autoloadp final)
+ (setq final (autoload-do-load final cmd)))))
+ (cond
+ ((arrayp final)
+ ;; If requested, place the macro in the command history. For
+ ;; other sorts of commands, call-interactively takes care of this.
+ (when record-flag
+ (push `(execute-kbd-macro ,final ,prefixarg) command-history)
+ ;; Don't keep command history around forever.
+ (when (and (numberp history-length) (> history-length 0))
+ (let ((cell (nthcdr history-length command-history)))
+ (if (consp cell) (setcdr cell nil)))))
+ (execute-kbd-macro final prefixarg))
+ (t
+ ;; Pass `cmd' rather than `final', for the backtrace's sake.
+ (prog1 (call-interactively cmd record-flag keys)
+ (when (and (symbolp cmd)
+ (get cmd 'byte-obsolete-info)
+ (not (get cmd 'command-execute-obsolete-warned)))
+ (put cmd 'command-execute-obsolete-warned t)
+ (message "%s" (macroexp--obsolete-warning
+ cmd (get cmd 'byte-obsolete-info) "command")))))))))
(defvar minibuffer-history nil
"Default minibuffer history list.
@@ -1778,7 +1888,7 @@ Intended to be added to `minibuffer-setup-hook'."
If there are no search errors, this function displays an overlay with
the isearch prompt which replaces the original minibuffer prompt.
Otherwise, it displays the standard isearch message returned from
-`isearch-message'."
+the function `isearch-message'."
(if (not (and (minibufferp) isearch-success (not isearch-error)))
;; Use standard function `isearch-message' when not in the minibuffer,
;; or search fails, or has an error (like incomplete regexp).
@@ -1815,8 +1925,9 @@ or to the last history element for a backward search."
"Save a function restoring the state of minibuffer history search.
Save `minibuffer-history-position' to the additional state parameter
in the search status stack."
- `(lambda (cmd)
- (minibuffer-history-isearch-pop-state cmd ,minibuffer-history-position)))
+ (let ((pos minibuffer-history-position))
+ (lambda (cmd)
+ (minibuffer-history-isearch-pop-state cmd pos))))
(defun minibuffer-history-isearch-pop-state (_cmd hist-pos)
"Restore the minibuffer history search state.
@@ -1981,6 +2092,117 @@ then call `undo-more' one or more times to undo them."
(if (null pending-undo-list)
(setq pending-undo-list t))))
+(defun primitive-undo (n list)
+ "Undo N records from the front of the list LIST.
+Return what remains of the list."
+
+ ;; This is a good feature, but would make undo-start
+ ;; unable to do what is expected.
+ ;;(when (null (car (list)))
+ ;; ;; If the head of the list is a boundary, it is the boundary
+ ;; ;; preceding this command. Get rid of it and don't count it.
+ ;; (setq list (cdr list))))
+
+ (let ((arg n)
+ ;; In a writable buffer, enable undoing read-only text that is
+ ;; so because of text properties.
+ (inhibit-read-only t)
+ ;; Don't let `intangible' properties interfere with undo.
+ (inhibit-point-motion-hooks t)
+ ;; We use oldlist only to check for EQ. ++kfs
+ (oldlist buffer-undo-list)
+ (did-apply nil)
+ (next nil))
+ (while (> arg 0)
+ (while (setq next (pop list)) ;Exit inner loop at undo boundary.
+ ;; Handle an integer by setting point to that value.
+ (pcase next
+ ((pred integerp) (goto-char next))
+ ;; Element (t . TIME) records previous modtime.
+ ;; Preserve any flag of NONEXISTENT_MODTIME_NSECS or
+ ;; UNKNOWN_MODTIME_NSECS.
+ (`(t . ,time)
+ ;; If this records an obsolete save
+ ;; (not matching the actual disk file)
+ ;; then don't mark unmodified.
+ (when (or (equal time (visited-file-modtime))
+ (and (consp time)
+ (equal (list (car time) (cdr time))
+ (visited-file-modtime))))
+ (when (fboundp 'unlock-buffer)
+ (unlock-buffer))
+ (set-buffer-modified-p nil)))
+ ;; Element (nil PROP VAL BEG . END) is property change.
+ (`(nil . ,(or `(,prop ,val ,beg . ,end) pcase--dontcare))
+ (when (or (> (point-min) beg) (< (point-max) end))
+ (error "Changes to be undone are outside visible portion of buffer"))
+ (put-text-property beg end prop val))
+ ;; Element (BEG . END) means range was inserted.
+ (`(,(and beg (pred integerp)) . ,(and end (pred integerp)))
+ ;; (and `(,beg . ,end) `(,(pred integerp) . ,(pred integerp)))
+ ;; Ideally: `(,(pred integerp beg) . ,(pred integerp end))
+ (when (or (> (point-min) beg) (< (point-max) end))
+ (error "Changes to be undone are outside visible portion of buffer"))
+ ;; Set point first thing, so that undoing this undo
+ ;; does not send point back to where it is now.
+ (goto-char beg)
+ (delete-region beg end))
+ ;; Element (apply FUN . ARGS) means call FUN to undo.
+ (`(apply . ,fun-args)
+ (let ((currbuff (current-buffer)))
+ (if (integerp (car fun-args))
+ ;; Long format: (apply DELTA START END FUN . ARGS).
+ (pcase-let* ((`(,delta ,start ,end ,fun . ,args) fun-args)
+ (start-mark (copy-marker start nil))
+ (end-mark (copy-marker end t)))
+ (when (or (> (point-min) start) (< (point-max) end))
+ (error "Changes to be undone are outside visible portion of buffer"))
+ (apply fun args) ;; Use `save-current-buffer'?
+ ;; Check that the function did what the entry
+ ;; said it would do.
+ (unless (and (= start start-mark)
+ (= (+ delta end) end-mark))
+ (error "Changes to be undone by function different than announced"))
+ (set-marker start-mark nil)
+ (set-marker end-mark nil))
+ (apply fun-args))
+ (unless (eq currbuff (current-buffer))
+ (error "Undo function switched buffer"))
+ (setq did-apply t)))
+ ;; Element (STRING . POS) means STRING was deleted.
+ (`(,(and string (pred stringp)) . ,(and pos (pred integerp)))
+ (when (let ((apos (abs pos)))
+ (or (< apos (point-min)) (> apos (point-max))))
+ (error "Changes to be undone are outside visible portion of buffer"))
+ (if (< pos 0)
+ (progn
+ (goto-char (- pos))
+ (insert string))
+ (goto-char pos)
+ ;; Now that we record marker adjustments
+ ;; (caused by deletion) for undo,
+ ;; we should always insert after markers,
+ ;; so that undoing the marker adjustments
+ ;; put the markers back in the right place.
+ (insert string)
+ (goto-char pos)))
+ ;; (MARKER . OFFSET) means a marker MARKER was adjusted by OFFSET.
+ (`(,(and marker (pred markerp)) . ,(and offset (pred integerp)))
+ (when (marker-buffer marker)
+ (set-marker marker
+ (- marker offset)
+ (marker-buffer marker))))
+ (_ (error "Unrecognized entry in undo list %S" next))))
+ (setq arg (1- arg)))
+ ;; Make sure an apply entry produces at least one undo entry,
+ ;; so the test in `undo' for continuing an undo series
+ ;; will work right.
+ (if (and did-apply
+ (eq oldlist buffer-undo-list))
+ (setq buffer-undo-list
+ (cons (list 'apply 'cdr nil) buffer-undo-list))))
+ list)
+
;; Deep copy of a list
(defun undo-copy-list (list)
"Make a copy of undo list LIST."
@@ -2806,7 +3028,7 @@ value passed."
(or lc infile)
(if stderr-file (list (car buffer) stderr-file) buffer)
display args)
- (when stderr-file (copy-file stderr-file (cadr buffer)))))
+ (when stderr-file (copy-file stderr-file (cadr buffer) t))))
(when stderr-file (delete-file stderr-file))
(when lc (delete-file lc)))))
@@ -3069,46 +3291,33 @@ These commands include \\[set-mark-command] and \\[start-kbd-macro]."
(defvar filter-buffer-substring-functions nil
- "This variable is a wrapper hook around `filter-buffer-substring'.
-Each member of the hook should be a function accepting four arguments:
-\(FUN BEG END DELETE), where FUN is itself a function of three arguments
+ "This variable is a wrapper hook around `filter-buffer-substring'.")
+(make-obsolete-variable 'filter-buffer-substring-functions
+ 'filter-buffer-substring-function "24.4")
+
+(defvar filter-buffer-substring-function #'buffer-substring--filter
+ "Function to perform the filtering in `filter-buffer-substring'.
+The function is called with 3 arguments:
\(BEG END DELETE). The arguments BEG, END, and DELETE are the same
as those of `filter-buffer-substring' in each case.
-
-The first hook function to be called receives a FUN equivalent
-to the default operation of `filter-buffer-substring',
-i.e. one that returns the buffer-substring between BEG and
-END (processed by any `buffer-substring-filters'). Normally,
-the hook function will call FUN and then do its own processing
-of the result. The next hook function receives a FUN equivalent
-to the previous hook function, calls it, and does its own
-processing, and so on. The overall result is that of all hook
-functions acting in sequence.
-
-Any hook may choose not to call FUN though, in which case it
-effectively replaces the default behavior with whatever it chooses.
-Of course, a later hook function may do the same thing.")
+It should return the buffer substring between BEG and END, after filtering.")
(defvar buffer-substring-filters nil
"List of filter functions for `filter-buffer-substring'.
Each function must accept a single argument, a string, and return
a string. The buffer substring is passed to the first function
in the list, and the return value of each function is passed to
-the next. The final result (if `buffer-substring-filters' is
-nil, this is the unfiltered buffer-substring) is passed to the
-first function on `filter-buffer-substring-functions'.
-
+the next.
As a special convention, point is set to the start of the buffer text
being operated on (i.e., the first argument of `filter-buffer-substring')
before these functions are called.")
(make-obsolete-variable 'buffer-substring-filters
- 'filter-buffer-substring-functions "24.1")
+ 'filter-buffer-substring-function "24.1")
(defun filter-buffer-substring (beg end &optional delete)
"Return the buffer substring between BEG and END, after filtering.
-The wrapper hook `filter-buffer-substring-functions' performs
-the actual filtering. The obsolete variable `buffer-substring-filters'
-is also consulted. If both of these are nil, no filtering is done.
+The hook `filter-buffer-substring-function' performs the actual filtering.
+By default, no filtering is done.
If DELETE is non-nil, the text between BEG and END is deleted
from the buffer.
@@ -3116,9 +3325,12 @@ from the buffer.
This function should be used instead of `buffer-substring',
`buffer-substring-no-properties', or `delete-and-extract-region'
when you want to allow filtering to take place. For example,
-major or minor modes can use `filter-buffer-substring-functions' to
+major or minor modes can use `filter-buffer-substring-function' to
extract characters that are special to a buffer, and should not
be copied into other buffers."
+ (funcall filter-buffer-substring-function beg end delete))
+
+(defun buffer-substring--filter (beg end &optional delete)
(with-wrapper-hook filter-buffer-substring-functions (beg end delete)
(cond
((or delete buffer-substring-filters)
@@ -3372,6 +3584,7 @@ to make one entry in the kill ring."
(kill-new string nil yank-handler)))
(when (or string (eq last-command 'kill-region))
(setq this-command 'kill-region))
+ (setq deactivate-mark t)
nil)
((buffer-read-only text-read-only)
;; The code above failed because the buffer, or some of the characters
@@ -3692,7 +3905,7 @@ If `show-trailing-whitespace' is non-nil, this command will just
kill the rest of the current line, even if there are only
nonblanks there.
-If `kill-whole-line' is non-nil, then this command kills the whole line
+If option `kill-whole-line' is non-nil, then this command kills the whole line
including its terminating newline, when used at the beginning of a line
with no argument. As a consequence, you can always kill a whole line
by typing \\[move-beginning-of-line] \\[kill-line].
@@ -3964,7 +4177,7 @@ a mistake; see the documentation of `set-mark'."
(marker-position (mark-marker))
(signal 'mark-inactive nil)))
-(defsubst deactivate-mark (&optional force)
+(defun deactivate-mark (&optional force)
"Deactivate the mark.
If Transient Mark mode is disabled, this function normally does
nothing; but if FORCE is non-nil, it deactivates the mark anyway.
@@ -4014,7 +4227,8 @@ run `deactivate-mark-hook'."
(when (mark t)
(setq mark-active t)
(unless transient-mark-mode
- (setq transient-mark-mode 'lambda))))
+ (setq transient-mark-mode 'lambda))
+ (run-hooks 'activate-mark-hook)))
(defun set-mark (pos)
"Set this buffer's mark to POS. Don't use this function!
@@ -4135,15 +4349,6 @@ after C-u \\[set-mark-command]."
:type 'boolean
:group 'editing-basics)
-(defcustom set-mark-default-inactive nil
- "If non-nil, setting the mark does not activate it.
-This option does the same thing as disabling Transient Mark mode,
-and it will be removed in the near future."
- :type 'boolean
- :group 'editing-basics
- :version "23.1")
-(make-obsolete-variable 'set-mark-default-inactive nil "24.3")
-
(defun set-mark-command (arg)
"Set the mark where point is, or jump to the mark.
Setting the mark also alters the region, which is the text
@@ -4205,8 +4410,7 @@ purposes. See the documentation of `set-mark' for more information."
(activate-mark)
(message "Mark activated")))
(t
- (push-mark-command nil)
- (if set-mark-default-inactive (deactivate-mark)))))
+ (push-mark-command nil))))
(defun push-mark (&optional location nomsg activate)
"Set mark at LOCATION (point, by default) and push old mark on mark ring.
@@ -4270,7 +4474,6 @@ mode temporarily."
(deactivate-mark)
(set-mark (point))
(goto-char omark)
- (if set-mark-default-inactive (deactivate-mark))
(cond (temp-highlight
(setq transient-mark-mode (cons 'only transient-mark-mode)))
((or (and arg (region-active-p)) ; (xor arg (not (region-active-p)))
@@ -4472,13 +4675,13 @@ to use and more reliable (no dependence on goal column, etc.)."
"Non-nil means vertical motion starting at end of line keeps to ends of lines.
This means moving to the end of each line moved onto.
The beginning of a blank line does not count as the end of a line.
-This has no effect when `line-move-visual' is non-nil."
+This has no effect when the variable `line-move-visual' is non-nil."
:type 'boolean
:group 'editing-basics)
(defcustom goal-column nil
"Semipermanent goal column for vertical motion, as set by \\[set-goal-column], or nil.
-A non-nil setting overrides `line-move-visual', which see."
+A non-nil setting overrides the variable `line-move-visual', which see."
:type '(choice integer
(const :tag "None" nil))
:group 'editing-basics)
@@ -4489,7 +4692,7 @@ A non-nil setting overrides `line-move-visual', which see."
It is the column where point was at the start of the current run
of vertical motion commands.
-When moving by visual lines via `line-move-visual', it is a cons
+When moving by visual lines via the function `line-move-visual', it is a cons
cell (COL . HSCROLL), where COL is the x-position, in pixels,
divided by the default column width, and HSCROLL is the number of
columns by which window is scrolled from left margin.
@@ -5311,14 +5514,21 @@ current object."
(setq pos1 pos2 pos2 swap)))
(if (> (cdr pos1) (car pos2)) (error "Don't have two things to transpose"))
(atomic-change-group
- (let (word2)
- ;; FIXME: We first delete the two pieces of text, so markers that
- ;; used to point to after the text end up pointing to before it :-(
- (setq word2 (delete-and-extract-region (car pos2) (cdr pos2)))
- (goto-char (car pos2))
- (insert (delete-and-extract-region (car pos1) (cdr pos1)))
- (goto-char (car pos1))
- (insert word2))))
+ ;; This sequence of insertions attempts to preserve marker
+ ;; positions at the start and end of the transposed objects.
+ (let* ((word (buffer-substring (car pos2) (cdr pos2)))
+ (len1 (- (cdr pos1) (car pos1)))
+ (len2 (length word))
+ (boundary (make-marker)))
+ (set-marker boundary (car pos2))
+ (goto-char (cdr pos1))
+ (insert-before-markers word)
+ (setq word (delete-and-extract-region (car pos1) (+ (car pos1) len1)))
+ (goto-char boundary)
+ (insert word)
+ (goto-char (+ boundary len1))
+ (delete-region (point) (+ (point) len2))
+ (set-marker boundary nil))))
(defun backward-word (&optional arg)
"Move backward until encountering the beginning of a word.
@@ -6408,7 +6618,9 @@ the default method of inserting the completion in BUFFER.")
(defun choose-completion-string (choice &optional
buffer base-position insert-function)
"Switch to BUFFER and insert the completion choice CHOICE.
-BASE-POSITION, says where to insert the completion."
+BASE-POSITION says where to insert the completion.
+INSERT-FUNCTION says how to insert the completion and falls
+back on `completion-list-insert-choice-function' when nil."
;; If BUFFER is the minibuffer, exit the minibuffer
;; unless it is reading a file name and CHOICE is a directory,
diff --git a/lisp/sort.el b/lisp/sort.el
index 47632148598..56e97061d13 100644
--- a/lisp/sort.el
+++ b/lisp/sort.el
@@ -567,6 +567,62 @@ From a program takes two point or marker arguments, BEG and END."
(setq ll (cdr ll)))
(insert (car ll)))))
+;;;###autoload
+(defun delete-duplicate-lines (beg end &optional reverse adjacent interactive)
+ "Delete duplicate lines in the region between BEG and END.
+
+If REVERSE is nil, search and delete duplicates forward keeping the first
+occurrence of duplicate lines. If REVERSE is non-nil (when called
+interactively with C-u prefix), search and delete duplicates backward
+keeping the last occurrence of duplicate lines.
+
+If ADJACENT is non-nil (when called interactively with two C-u prefixes),
+delete repeated lines only if they are adjacent. It works like the utility
+`uniq' and is useful when lines are already sorted in a large file since
+this is more efficient in performance and memory usage than when ADJACENT
+is nil that uses additional memory to remember previous lines.
+
+When called from Lisp and INTERACTIVE is omitted or nil, return the number
+of deleted duplicate lines, do not print it; if INTERACTIVE is t, the
+function behaves in all respects as if it had been called interactively."
+ (interactive
+ (progn
+ (barf-if-buffer-read-only)
+ (list (region-beginning) (region-end)
+ (equal current-prefix-arg '(4))
+ (equal current-prefix-arg '(16))
+ t)))
+ (let ((lines (unless adjacent (make-hash-table :weakness 'key :test 'equal)))
+ line prev-line
+ (count 0)
+ (beg (copy-marker beg))
+ (end (copy-marker end)))
+ (save-excursion
+ (goto-char (if reverse end beg))
+ (if (and reverse (bolp)) (forward-char -1))
+ (while (if reverse
+ (and (> (point) beg) (not (bobp)))
+ (and (< (point) end) (not (eobp))))
+ (setq line (buffer-substring-no-properties
+ (line-beginning-position) (line-end-position)))
+ (if (if adjacent (equal line prev-line) (gethash line lines))
+ (progn
+ (delete-region (progn (forward-line 0) (point))
+ (progn (forward-line 1) (point)))
+ (if reverse (forward-line -1))
+ (setq count (1+ count)))
+ (if adjacent (setq prev-line line) (puthash line t lines))
+ (forward-line (if reverse -1 1)))))
+ (set-marker beg nil)
+ (set-marker end nil)
+ (when interactive
+ (message "Deleted %d %sduplicate line%s%s"
+ count
+ (if adjacent "adjacent " "")
+ (if (= count 1) "" "s")
+ (if reverse " backward" "")))
+ count))
+
(provide 'sort)
;;; sort.el ends here
diff --git a/lisp/speedbar.el b/lisp/speedbar.el
index a0e5f617a24..70bf5f41518 100644
--- a/lisp/speedbar.el
+++ b/lisp/speedbar.el
@@ -3608,6 +3608,7 @@ functions to do caching and flushing if appropriate."
nil
(eval-when-compile (condition-case nil (require 'imenu) (error nil)))
+(declare-function imenu--make-index-alist "imenu" (&optional no-error))
(defun speedbar-fetch-dynamic-imenu (file)
"Load FILE into a buffer, and generate tags using Imenu.
diff --git a/lisp/startup.el b/lisp/startup.el
index aaba900b028..b7b4c156f02 100644
--- a/lisp/startup.el
+++ b/lisp/startup.el
@@ -42,9 +42,10 @@
(defcustom initial-buffer-choice nil
"Buffer to show after starting Emacs.
If the value is nil and `inhibit-startup-screen' is nil, show the
-startup screen. If the value is a string, visit the specified file
-or directory using `find-file'. If t, open the `*scratch*'
-buffer.
+startup screen. If the value is a string, switch to a buffer
+visiting the file or directory specified by that string. If the
+value is a function, switch to the buffer returned by that
+function. If t, open the `*scratch*' buffer.
A string value also causes emacsclient to open the specified file
or directory when no target file is specified."
@@ -52,8 +53,9 @@ or directory when no target file is specified."
(const :tag "Startup screen" nil)
(directory :tag "Directory" :value "~/")
(file :tag "File" :value "~/.emacs")
+ (function :tag "Function")
(const :tag "Lisp scratch buffer" t))
- :version "23.1"
+ :version "24.4"
:group 'initialization)
(defcustom inhibit-startup-screen nil
@@ -768,11 +770,20 @@ Amongst another things, it parses the command-line arguments."
(locate-file "simple" load-path (get-load-suffixes)))
lisp-dir)
;; Don't abort if simple.el cannot be found, but print a warning.
+ ;; Although in most usage we are going to cryptically abort a moment
+ ;; later anyway, due to missing required bidi data files (eg bug#13430).
(if (null simple-file-name)
- (progn
- (princ "Warning: Could not find simple.el nor simple.elc"
- 'external-debugging-output)
- (terpri 'external-debugging-output))
+ (let ((standard-output 'external-debugging-output)
+ (lispdir (expand-file-name "../lisp" data-directory)))
+ (princ "Warning: Could not find simple.el or simple.elc")
+ (terpri)
+ (when (getenv "EMACSLOADPATH")
+ (princ "The EMACSLOADPATH environment variable is set, \
+please check its value")
+ (terpri))
+ (unless (file-readable-p lispdir)
+ (princ (format "Lisp directory %s not readable?" lispdir))
+ (terpri)))
(setq lisp-dir (file-truename (file-name-directory simple-file-name)))
(setq load-history
(mapcar (lambda (elt)
@@ -1455,6 +1466,7 @@ Each element in the list should be a list of strings or pairs
(suppress-keymap map)
(set-keymap-parent map button-buffer-map)
(define-key map "\C-?" 'scroll-down-command)
+ (define-key map [?\S-\ ] 'scroll-down-command)
(define-key map " " 'scroll-up-command)
(define-key map "q" 'exit-splash-screen)
map)
@@ -1570,27 +1582,24 @@ a face or button specification."
:face '(variable-pitch (:height 0.8))
emacs-copyright
"\n")
- (and auto-save-list-file-prefix
- ;; Don't signal an error if the
- ;; directory for auto-save-list files
- ;; does not yet exist.
- (file-directory-p (file-name-directory
- auto-save-list-file-prefix))
- (directory-files
- (file-name-directory auto-save-list-file-prefix)
- nil
- (concat "\\`"
- (regexp-quote (file-name-nondirectory
- auto-save-list-file-prefix)))
- t)
- (fancy-splash-insert :face '(variable-pitch font-lock-comment-face)
- "\nIf an Emacs session crashed recently, "
- "type "
- :face '(fixed-pitch font-lock-comment-face)
- "Meta-x recover-session RET"
- :face '(variable-pitch font-lock-comment-face)
- "\nto recover"
- " the files you were editing."))
+ (when auto-save-list-file-prefix
+ (let ((dir (file-name-directory auto-save-list-file-prefix))
+ (name (file-name-nondirectory auto-save-list-file-prefix))
+ files)
+ ;; Don't warn if the directory for auto-save-list files does not
+ ;; yet exist.
+ (and (file-directory-p dir)
+ (setq files (directory-files dir nil (concat "\\`" name) t))
+ (fancy-splash-insert :face '(variable-pitch font-lock-comment-face)
+ (if (= (length files) 1)
+ "\nAn auto-save file list was found. "
+ "\nAuto-save file lists were found. ")
+ "If an Emacs session crashed recently,\ntype "
+ :link `("M-x recover-session RET"
+ ,(lambda (_button)
+ (call-interactively
+ 'recover-session)))
+ " to recover the files you were editing."))))
(when concise
(fancy-splash-insert
@@ -1847,11 +1856,8 @@ To quit a partially entered command, type Control-g.\n")
(insert "\n" (emacs-version)
"\n" emacs-copyright))
-;; No mouse menus, so give help using kbd commands.
(defun normal-no-mouse-startup-screen ()
-
- ;; If keys have their default meanings,
- ;; use precomputed string to save lots of time.
+ "Show a splash screen suitable for displays without mouse support."
(let* ((c-h-accessible
;; If normal-erase-is-backspace is used on a tty, there's
;; no way to invoke C-h and you have to use F1 instead.
@@ -1929,47 +1935,24 @@ If you have no Meta key, you may instead type ESC followed by the character.)")
'follow-link t)
(insert "\n")
(insert "\n" (emacs-version) "\n" emacs-copyright "\n")
-
- (if (and (eq (key-binding "\C-h\C-c") 'describe-copying)
- (eq (key-binding "\C-h\C-d") 'describe-distribution)
- (eq (key-binding "\C-h\C-w") 'describe-no-warranty))
- (progn
- (insert
- "
-GNU Emacs comes with ABSOLUTELY NO WARRANTY; type C-h C-w for ")
- (insert-button "full details"
- 'action (lambda (_button) (describe-no-warranty))
- 'follow-link t)
- (insert ".
-Emacs is Free Software--Free as in Freedom--so you can redistribute copies
-of Emacs and modify it; type C-h C-c to see ")
- (insert-button "the conditions"
- 'action (lambda (_button) (describe-copying))
- 'follow-link t)
- (insert ".
-Type C-h C-d for information on ")
- (insert-button "getting the latest version"
- 'action (lambda (_button) (describe-distribution))
- 'follow-link t)
- (insert "."))
- (insert (substitute-command-keys
- "
+ (insert (substitute-command-keys
+ "
GNU Emacs comes with ABSOLUTELY NO WARRANTY; type \\[describe-no-warranty] for "))
- (insert-button "full details"
- 'action (lambda (_button) (describe-no-warranty))
- 'follow-link t)
- (insert (substitute-command-keys ".
+ (insert-button "full details"
+ 'action (lambda (_button) (describe-no-warranty))
+ 'follow-link t)
+ (insert (substitute-command-keys ".
Emacs is Free Software--Free as in Freedom--so you can redistribute copies
of Emacs and modify it; type \\[describe-copying] to see "))
- (insert-button "the conditions"
- 'action (lambda (_button) (describe-copying))
- 'follow-link t)
- (insert (substitute-command-keys".
+ (insert-button "the conditions"
+ 'action (lambda (_button) (describe-copying))
+ 'follow-link t)
+ (insert (substitute-command-keys".
Type \\[describe-distribution] for information on "))
- (insert-button "getting the latest version"
- 'action (lambda (_button) (describe-distribution))
- 'follow-link t)
- (insert ".")))
+ (insert-button "getting the latest version"
+ 'action (lambda (_button) (describe-distribution))
+ 'follow-link t)
+ (insert "."))
(defun normal-about-screen ()
(insert "\n" (emacs-version) "\n" emacs-copyright "\n\n")
@@ -2018,14 +2001,11 @@ Type \\[describe-distribution] for information on "))
(insert "\tBuying printed manuals from the FSF\n"))
(defun startup-echo-area-message ()
- (cond ((daemonp)
- "Starting Emacs daemon.")
- ((eq (key-binding "\C-h\C-a") 'about-emacs)
- "For information about GNU Emacs and the GNU system, type C-h C-a.")
- (t
- (substitute-command-keys
- "For information about GNU Emacs and the GNU system, type \
-\\[about-emacs]."))))
+ (if (daemonp)
+ "Starting Emacs daemon."
+ (substitute-command-keys
+ "For information about GNU Emacs and the GNU system, type \
+\\[about-emacs].")))
(defun display-startup-echo-area-message ()
(let ((resize-mini-windows t))
@@ -2327,10 +2307,14 @@ A fancy display is used on graphic displays, normal otherwise."
(set-buffer-modified-p nil))))
(when initial-buffer-choice
- (cond ((eq initial-buffer-choice t)
- (switch-to-buffer (get-buffer-create "*scratch*")))
- ((stringp initial-buffer-choice)
- (find-file initial-buffer-choice))))
+ (let ((buf
+ (cond ((stringp initial-buffer-choice)
+ (find-file-noselect initial-buffer-choice))
+ ((functionp initial-buffer-choice)
+ (funcall initial-buffer-choice)))))
+ (switch-to-buffer
+ (if (buffer-live-p buf) buf (get-buffer-create "*scratch*"))
+ 'norecord)))
(if (or inhibit-startup-screen
initial-buffer-choice
@@ -2386,13 +2370,17 @@ A fancy display is used on graphic displays, normal otherwise."
;; Use arg 1 so that we don't collapse // at the start of the file name.
;; That is significant on some systems.
;; However, /// at the beginning is supposed to mean just /, not //.
- (if (string-match "^///+" file)
+ (if (string-match
+ (if (memq system-type '(ms-dos windows-nt))
+ "^\\([\\/][\\/][\\/]\\)+"
+ "^///+")
+ file)
(setq file (replace-match "/" t t file)))
- (and (memq system-type '(ms-dos windows-nt))
- (string-match "^[A-Za-z]:\\(\\\\[\\\\/]\\)" file) ; C:\/ or C:\\
- (setq file (replace-match "/" t t file 1)))
- (while (string-match "//+" file 1)
- (setq file (replace-match "/" t t file)))
+ (if (memq system-type '(ms-dos windows-nt))
+ (while (string-match "\\([\\/][\\/]\\)+" file 1)
+ (setq file (replace-match "/" t t file)))
+ (while (string-match "//+" file 1)
+ (setq file (replace-match "/" t t file))))
file))
;;; startup.el ends here
diff --git a/lisp/strokes.el b/lisp/strokes.el
index 5acd0dc0120..2c3c3bc6dd4 100644
--- a/lisp/strokes.el
+++ b/lisp/strokes.el
@@ -260,7 +260,7 @@ WARNING: Changing the value of this variable will gravely affect the
:type 'integer
:group 'strokes)
-(defcustom strokes-file (convert-standard-filename "~/.strokes")
+(defcustom strokes-file (locate-user-emacs-file "strokes" ".strokes")
"File containing saved strokes for Strokes mode (default is ~/.strokes)."
:type 'file
:group 'strokes)
diff --git a/lisp/subr.el b/lisp/subr.el
index 88f27c75764..523bec59b29 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -195,11 +195,6 @@ value of last one, or nil if there are none.
(declare (indent 1) (debug t))
(cons 'if (cons cond (cons nil body))))
-(if (null (featurep 'cl))
- (progn
- ;; If we reload subr.el after having loaded CL, be careful not to
- ;; overwrite CL's extended definition of `dolist', `dotimes', `declare'.
-
(defmacro dolist (spec &rest body)
"Loop over a list.
Evaluate BODY with VAR bound to each car from LIST, in turn.
@@ -222,9 +217,7 @@ Then evaluate RESULT to get return value, default nil.
(let ((,(car spec) (car ,temp)))
,@body
(setq ,temp (cdr ,temp))))
- ,@(if (cdr (cdr spec))
- ;; FIXME: This let often leads to "unused var" warnings.
- `((let ((,(car spec) nil)) ,@(cdr (cdr spec))))))
+ ,@(cdr (cdr spec)))
`(let ((,temp ,(nth 1 spec))
,(car spec))
(while ,temp
@@ -281,7 +274,6 @@ The possible values of SPECS are specified by
`defun-declarations-alist' and `macro-declarations-alist'."
;; FIXME: edebug spec should pay attention to defun-declarations-alist.
nil)
-))
(defmacro ignore-errors (&rest body)
"Execute BODY; if an error occurs, return nil.
@@ -1052,14 +1044,17 @@ and `event-end' functions."
(nth 1 position))))
(and (symbolp area) area)))
-(defsubst posn-point (position)
+(defun posn-point (position)
"Return the buffer location in POSITION.
POSITION should be a list of the form returned by the `event-start'
-and `event-end' functions."
+and `event-end' functions.
+Returns nil if POSITION does not correspond to any buffer location (e.g.
+a click on a scroll bar)."
(or (nth 5 position)
- (if (consp (nth 1 position))
- (car (nth 1 position))
- (nth 1 position))))
+ (let ((pt (nth 1 position)))
+ (or (car-safe pt)
+ ;; Apparently this can also be `vertical-scroll-bar' (bug#13979).
+ (if (integerp pt) pt)))))
(defun posn-set-point (position)
"Move point to POSITION.
@@ -1132,12 +1127,14 @@ POSITION should be a list of the form returned by the `event-start'
and `event-end' functions."
(nth 3 position))
-(defsubst posn-string (position)
+(defun posn-string (position)
"Return the string object of POSITION.
Value is a cons (STRING . STRING-POS), or nil if not a string.
POSITION should be a list of the form returned by the `event-start'
and `event-end' functions."
- (nth 4 position))
+ (let ((x (nth 4 position)))
+ ;; Apparently this can also be `handle' or `below-handle' (bug#13979).
+ (when (consp x) x)))
(defsubst posn-image (position)
"Return the image object of POSITION.
@@ -1199,8 +1196,6 @@ is converted into a string by expressing it in decimal."
(make-obsolete 'unfocus-frame "it does nothing." "22.1")
(make-obsolete 'make-variable-frame-local
"explicitly check for a frame-parameter instead." "22.2")
-(make-obsolete 'interactive-p 'called-interactively-p "23.2")
-(set-advertised-calling-convention 'called-interactively-p '(kind) "23.1")
(set-advertised-calling-convention
'all-completions '(string collection &optional predicate) "23.1")
(set-advertised-calling-convention 'unintern '(name obarray) "23.3")
@@ -1239,7 +1234,6 @@ is converted into a string by expressing it in decimal."
(make-obsolete-variable 'default-scroll-down-aggressively 'scroll-down-aggressively "23.2")
(make-obsolete-variable 'default-fill-column 'fill-column "23.2")
(make-obsolete-variable 'default-cursor-type 'cursor-type "23.2")
-(make-obsolete-variable 'default-buffer-file-type 'buffer-file-type "23.2")
(make-obsolete-variable 'default-cursor-in-non-selected-windows 'cursor-in-non-selected-windows "23.2")
(make-obsolete-variable 'default-buffer-file-coding-system 'buffer-file-coding-system "23.2")
(make-obsolete-variable 'default-major-mode 'major-mode "23.2")
@@ -1420,7 +1414,9 @@ Of course, a subsequent hook function may do the same thing.
Each hook function definition is used to construct the FUN passed
to the next hook function, if any. The last (or \"outermost\")
FUN is then called once."
- (declare (indent 2) (debug (form sexp body)))
+ (declare (indent 2) (debug (form sexp body))
+ (obsolete "use a <foo>-function variable modified by add-function."
+ "24.4"))
;; We need those two gensyms because CL's lexical scoping is not available
;; for function arguments :-(
(let ((funs (make-symbol "funs"))
@@ -2632,15 +2628,6 @@ When the hook runs, the temporary buffer is current.
This hook is normally set up with a function to put the buffer in Help
mode.")
-(defvar-local buffer-file-type nil
- "Non-nil if the visited file is a binary file.
-This variable is meaningful on MS-DOG and MS-Windows.
-On those systems, it is automatically local in every buffer.
-On other systems, this variable is normally always nil.
-
-WARNING: This variable is obsolete and will disapper Real Soon Now.
-Don't use it!")
-
;; The `assert' macro from the cl package signals
;; `cl-assertion-failed' at runtime so always define it.
(put 'cl-assertion-failed 'error-conditions '(error))
@@ -2658,13 +2645,17 @@ See also `locate-user-emacs-file'.")
(defun locate-user-emacs-file (new-name &optional old-name)
"Return an absolute per-user Emacs-specific file name.
-If OLD-NAME is non-nil and ~/OLD-NAME exists, return ~/OLD-NAME.
+If NEW-NAME exists in `user-emacs-directory', return it.
+Else If OLD-NAME is non-nil and ~/OLD-NAME exists, return ~/OLD-NAME.
Else return NEW-NAME in `user-emacs-directory', creating the
directory if it does not exist."
(convert-standard-filename
(let* ((home (concat "~" (or init-file-user "")))
- (at-home (and old-name (expand-file-name old-name home))))
- (if (and at-home (file-readable-p at-home))
+ (at-home (and old-name (expand-file-name old-name home)))
+ (bestname (abbreviate-file-name
+ (expand-file-name new-name user-emacs-directory))))
+ (if (and at-home (not (file-readable-p bestname))
+ (file-readable-p at-home))
at-home
;; Make sure `user-emacs-directory' exists,
;; unless we're in batch mode or dumping Emacs
@@ -2678,8 +2669,7 @@ directory if it does not exist."
(set-default-file-modes ?\700)
(make-directory user-emacs-directory))
(set-default-file-modes umask))))
- (abbreviate-file-name
- (expand-file-name new-name user-emacs-directory))))))
+ bestname))))
;;;; Misc. useful functions.
@@ -2714,6 +2704,22 @@ If there is no plausible default, return nil."
(setq to (point)))))
(buffer-substring-no-properties from to))))
+(defun find-tag-default-as-regexp ()
+ "Return regexp that matches the default tag at point.
+If there is no tag at point, return nil.
+
+When in a major mode that does not provide its own
+`find-tag-default-function', return a regexp that matches the
+symbol at point exactly."
+ (let* ((tagf (or find-tag-default-function
+ (get major-mode 'find-tag-default-function)
+ 'find-tag-default))
+ (tag (funcall tagf)))
+ (cond ((not tag))
+ ((eq tagf 'find-tag-default)
+ (format "\\_<%s\\_>" (regexp-quote tag)))
+ (t (regexp-quote tag)))))
+
(defun play-sound (sound)
"SOUND is a list of the form `(sound KEYWORD VALUE...)'.
The following keywords are recognized:
@@ -2809,6 +2815,12 @@ Otherwise, return nil."
Otherwise, return nil."
(and (memq object '(nil t)) t))
+(defun special-form-p (object)
+ "Non-nil if and only if OBJECT is a special form."
+ (if (and (symbolp object) (fboundp object))
+ (setq object (indirect-function object t)))
+ (and (subrp object) (eq (cdr (subr-arity object)) 'unevalled)))
+
(defun field-at-pos (pos)
"Return the field at position POS, taking stickiness etc into account."
(let ((raw-field (get-char-property (field-beginning pos) 'field)))
@@ -3368,16 +3380,17 @@ If BODY finishes, `while-no-input' returns whatever value BODY produced."
(progn ,@body)))))))
(defmacro condition-case-unless-debug (var bodyform &rest handlers)
- "Like `condition-case' except that it does not catch anything when debugging.
-More specifically if `debug-on-error' is set, then it does not catch any signal."
+ "Like `condition-case' except that it does not prevent debugging.
+More specifically if `debug-on-error' is set then the debugger will be invoked
+even if this catches the signal."
(declare (debug condition-case) (indent 2))
- (let ((bodysym (make-symbol "body")))
- `(let ((,bodysym (lambda () ,bodyform)))
- (if debug-on-error
- (funcall ,bodysym)
- (condition-case ,var
- (funcall ,bodysym)
- ,@handlers)))))
+ `(condition-case ,var
+ ,bodyform
+ ,@(mapcar (lambda (handler)
+ `((debug ,@(if (listp (car handler)) (car handler)
+ (list (car handler))))
+ ,@(cdr handler)))
+ handlers)))
(define-obsolete-function-alias 'condition-case-no-debug
'condition-case-unless-debug "24.1")
@@ -3828,6 +3841,58 @@ node `(elisp)Syntax Table Internals' for a list of codes.
If SYNTAX is nil, return nil."
(and syntax (logand (car syntax) 65535)))
+;; Utility motion commands
+
+;; Whitespace
+
+(defun forward-whitespace (arg)
+ "Move point to the end of the next sequence of whitespace chars.
+Each such sequence may be a single newline, or a sequence of
+consecutive space and/or tab characters.
+With prefix argument ARG, do it ARG times if positive, or move
+backwards ARG times if negative."
+ (interactive "^p")
+ (if (natnump arg)
+ (re-search-forward "[ \t]+\\|\n" nil 'move arg)
+ (while (< arg 0)
+ (if (re-search-backward "[ \t]+\\|\n" nil 'move)
+ (or (eq (char-after (match-beginning 0)) ?\n)
+ (skip-chars-backward " \t")))
+ (setq arg (1+ arg)))))
+
+;; Symbols
+
+(defun forward-symbol (arg)
+ "Move point to the next position that is the end of a symbol.
+A symbol is any sequence of characters that are in either the
+word constituent or symbol constituent syntax class.
+With prefix argument ARG, do it ARG times if positive, or move
+backwards ARG times if negative."
+ (interactive "^p")
+ (if (natnump arg)
+ (re-search-forward "\\(\\sw\\|\\s_\\)+" nil 'move arg)
+ (while (< arg 0)
+ (if (re-search-backward "\\(\\sw\\|\\s_\\)+" nil 'move)
+ (skip-syntax-backward "w_"))
+ (setq arg (1+ arg)))))
+
+;; Syntax blocks
+
+(defun forward-same-syntax (&optional arg)
+ "Move point past all characters with the same syntax class.
+With prefix argument ARG, do it ARG times if positive, or move
+backwards ARG times if negative."
+ (interactive "^p")
+ (or arg (setq arg 1))
+ (while (< arg 0)
+ (skip-syntax-backward
+ (char-to-string (char-syntax (char-before))))
+ (setq arg (1+ arg)))
+ (while (> arg 0)
+ (skip-syntax-forward (char-to-string (char-syntax (char-after))))
+ (setq arg (1- arg))))
+
+
;;;; Text clones
(defun text-clone-maintain (ol1 after beg end &optional _len)
@@ -3848,7 +3913,7 @@ This is used on the `modification-hooks' property of text clones."
(if (not (re-search-forward
(overlay-get ol1 'text-clone-syntax) cend t))
;; Mark the overlay for deletion.
- (overlay-put ol1 'text-clones nil)
+ (setq end cbeg)
(when (< (match-end 0) cend)
;; Shrink the clone at its end.
(setq end (min end (match-end 0)))
@@ -3963,6 +4028,153 @@ The properties used on SYMBOL are `composefunc', `sendfunc',
(put symbol 'abortfunc (or abortfunc 'kill-buffer))
(put symbol 'hookvar (or hookvar 'mail-send-hook)))
+(defvar called-interactively-p-functions nil
+ "Special hook called to skip special frames in `called-interactively-p'.
+The functions are called with 3 arguments: (I FRAME1 FRAME2),
+where FRAME1 is a \"current frame\", FRAME2 is the next frame,
+I is the index of the frame after FRAME2. It should return nil
+if those frames don't seem special and otherwise, it should return
+the number of frames to skip (minus 1).")
+
+(defmacro internal--called-interactively-p--get-frame (n)
+ ;; `sym' will hold a global variable, which will be used kind of like C's
+ ;; "static" variables.
+ (let ((sym (make-symbol "base-index")))
+ `(progn
+ (defvar ,sym)
+ (unless (boundp ',sym)
+ (let ((i 1))
+ (while (not (eq (indirect-function (nth 1 (backtrace-frame i)) t)
+ (indirect-function 'called-interactively-p)))
+ (setq i (1+ i)))
+ (setq ,sym i)))
+ ;; (unless (eq (nth 1 (backtrace-frame ,sym)) 'called-interactively-p)
+ ;; (error "called-interactively-p: %s is out-of-sync!" ,sym))
+ (backtrace-frame (+ ,sym ,n)))))
+
+(defun called-interactively-p (&optional kind)
+ "Return t if the containing function was called by `call-interactively'.
+If KIND is `interactive', then only return t if the call was made
+interactively by the user, i.e. not in `noninteractive' mode nor
+when `executing-kbd-macro'.
+If KIND is `any', on the other hand, it will return t for any kind of
+interactive call, including being called as the binding of a key or
+from a keyboard macro, even in `noninteractive' mode.
+
+This function is very brittle, it may fail to return the intended result when
+the code is debugged, advised, or instrumented in some form. Some macros and
+special forms (such as `condition-case') may also sometimes wrap their bodies
+in a `lambda', so any call to `called-interactively-p' from those bodies will
+indicate whether that lambda (rather than the surrounding function) was called
+interactively.
+
+Instead of using this function, it is cleaner and more reliable to give your
+function an extra optional argument whose `interactive' spec specifies
+non-nil unconditionally (\"p\" is a good way to do this), or via
+\(not (or executing-kbd-macro noninteractive)).
+
+The only known proper use of `interactive' for KIND is in deciding
+whether to display a helpful message, or how to display it. If you're
+thinking of using it for any other purpose, it is quite likely that
+you're making a mistake. Think: what do you want to do when the
+command is called from a keyboard macro?"
+ (declare (advertised-calling-convention (kind) "23.1"))
+ (when (not (and (eq kind 'interactive)
+ (or executing-kbd-macro noninteractive)))
+ (let* ((i 1) ;; 0 is the called-interactively-p frame.
+ frame nextframe
+ (get-next-frame
+ (lambda ()
+ (setq frame nextframe)
+ (setq nextframe (internal--called-interactively-p--get-frame i))
+ ;; (message "Frame %d = %S" i nextframe)
+ (setq i (1+ i)))))
+ (funcall get-next-frame) ;; Get the first frame.
+ (while
+ ;; FIXME: The edebug and advice handling should be made modular and
+ ;; provided directly by edebug.el and nadvice.el.
+ (progn
+ ;; frame =(backtrace-frame i-2)
+ ;; nextframe=(backtrace-frame i-1)
+ (funcall get-next-frame)
+ ;; `pcase' would be a fairly good fit here, but it sometimes moves
+ ;; branches within local functions, which then messes up the
+ ;; `backtrace-frame' data we get,
+ (or
+ ;; Skip special forms (from non-compiled code).
+ (and frame (null (car frame)))
+ ;; Skip also `interactive-p' (because we don't want to know if
+ ;; interactive-p was called interactively but if it's caller was)
+ ;; and `byte-code' (idem; this appears in subexpressions of things
+ ;; like condition-case, which are wrapped in a separate bytecode
+ ;; chunk).
+ ;; FIXME: For lexical-binding code, this is much worse,
+ ;; because the frames look like "byte-code -> funcall -> #[...]",
+ ;; which is not a reliable signature.
+ (memq (nth 1 frame) '(interactive-p 'byte-code))
+ ;; Skip package-specific stack-frames.
+ (let ((skip (run-hook-with-args-until-success
+ 'called-interactively-p-functions
+ i frame nextframe)))
+ (pcase skip
+ (`nil nil)
+ (`0 t)
+ (_ (setq i (+ i skip -1)) (funcall get-next-frame)))))))
+ ;; Now `frame' should be "the function from which we were called".
+ (pcase (cons frame nextframe)
+ ;; No subr calls `interactive-p', so we can rule that out.
+ (`((,_ ,(pred (lambda (f) (subrp (indirect-function f)))) . ,_) . ,_) nil)
+ ;; Somehow, I sometimes got `command-execute' rather than
+ ;; `call-interactively' on my stacktrace !?
+ ;;(`(,_ . (t command-execute . ,_)) t)
+ (`(,_ . (t call-interactively . ,_)) t)))))
+
+(defun interactive-p ()
+ "Return t if the containing function was run directly by user input.
+This means that the function was called with `call-interactively'
+\(which includes being called as the binding of a key)
+and input is currently coming from the keyboard (not a keyboard macro),
+and Emacs is not running in batch mode (`noninteractive' is nil).
+
+The only known proper use of `interactive-p' is in deciding whether to
+display a helpful message, or how to display it. If you're thinking
+of using it for any other purpose, it is quite likely that you're
+making a mistake. Think: what do you want to do when the command is
+called from a keyboard macro or in batch mode?
+
+To test whether your function was called with `call-interactively',
+either (i) add an extra optional argument and give it an `interactive'
+spec that specifies non-nil unconditionally (such as \"p\"); or (ii)
+use `called-interactively-p'."
+ (declare (obsolete called-interactively-p "23.2"))
+ (called-interactively-p 'interactive))
+
+(defun function-arity (f &optional num)
+ "Return the (MIN . MAX) arity of F.
+If the maximum arity is infinite, MAX is `many'.
+F can be a function or a macro.
+If NUM is non-nil, return non-nil iff F can be called with NUM args."
+ (if (symbolp f) (setq f (indirect-function f)))
+ (if (eq (car-safe f) 'macro) (setq f (cdr f)))
+ (let ((res
+ (if (subrp f)
+ (let ((x (subr-arity f)))
+ (if (eq (cdr x) 'unevalled) (cons (car x) 'many)))
+ (let* ((args (if (consp f) (cadr f) (aref f 0)))
+ (max (length args))
+ (opt (memq '&optional args))
+ (rest (memq '&rest args))
+ (min (- max (length opt))))
+ (if opt
+ (cons min (if rest 'many (1- max)))
+ (if rest
+ (cons (- max (length rest)) 'many)
+ (cons min max)))))))
+ (if (not num)
+ res
+ (and (>= num (car res))
+ (or (eq 'many (cdr res)) (<= num (cdr res)))))))
+
(defun set-temporary-overlay-map (map &optional keep-pred)
"Set MAP as a temporary keymap taking precedence over most other keymaps.
Note that this does NOT take precedence over the \"overriding\" maps
@@ -4178,6 +4390,36 @@ convenience wrapper around `make-progress-reporter' and friends.
nil ,@(cdr (cdr spec)))))
+;;;; Support for watching filesystem events.
+
+(defun inotify-event-p (event)
+ "Check if EVENT is an inotify event."
+ (and (listp event)
+ (>= (length event) 3)
+ (eq (car event) 'file-inotify)))
+
+;;;###autoload
+(defun inotify-handle-event (event)
+ "Handle inotify file system monitoring event.
+If EVENT is an inotify filewatch event, call its callback.
+Otherwise, signal a `filewatch-error'."
+ (interactive "e")
+ (unless (inotify-event-p event)
+ (signal 'filewatch-error (cons "Not a valid inotify event" event)))
+ (funcall (nth 2 event) (nth 1 event)))
+
+(defun w32notify-handle-event (event)
+ "Handle MS-Windows file system monitoring event.
+If EVENT is an MS-Windows filewatch event, call its callback.
+Otherwise, signal a `filewatch-error'."
+ (interactive "e")
+ (if (and (eq (car event) 'file-w32notify)
+ (= (length event) 3))
+ (funcall (nth 2 event) (nth 1 event))
+ (signal 'filewatch-error
+ (cons "Not a valid MS-Windows file-notify event" event))))
+
+
;;;; Comparing version strings.
(defconst version-separator "."
diff --git a/lisp/term.el b/lisp/term.el
index 1a0dd0cc86f..b37e71280da 100644
--- a/lisp/term.el
+++ b/lisp/term.el
@@ -397,6 +397,12 @@
(require 'ring)
(require 'ehelp)
+(declare-function ring-empty-p "ring" (ring))
+(declare-function ring-ref "ring" (ring index))
+(declare-function ring-insert-at-beginning "ring" (ring item))
+(declare-function ring-length "ring" (ring))
+(declare-function ring-insert "ring" (ring item))
+
(defgroup term nil
"General command interpreter in a window."
:group 'processes)
diff --git a/lisp/term/ns-win.el b/lisp/term/ns-win.el
index 1aad645870b..0d4d3aaa26b 100644
--- a/lisp/term/ns-win.el
+++ b/lisp/term/ns-win.el
@@ -656,18 +656,6 @@ This defines a fontset consisting of the Courier and other fonts that
come with OS X.
See the documentation of `create-fontset-from-fontset-spec' for the format.")
-;; Conditional on new-fontset so bootstrapping works on non-GUI compiles.
-(when (fboundp 'new-fontset)
- ;; Setup the default fontset.
- (create-default-fontset)
- ;; Create the standard fontset.
- (condition-case err
- (create-fontset-from-fontset-spec ns-standard-fontset-spec t)
- (error (display-warning
- 'initialization
- (format "Creation of the standard fontset failed: %s" err)
- :error))))
-
(defvar ns-reg-to-script) ; nsfont.m
;; This maps font registries (not exposed by NS APIs for font selection) to
@@ -907,13 +895,23 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
;; Do the actual Nextstep Windows setup here; the above code just
;; defines functions and variables that we use now.
-(defun ns-initialize-window-system ()
+(defun ns-initialize-window-system (&optional _display)
"Initialize Emacs for Nextstep (Cocoa / GNUstep) windowing."
(cl-assert (not ns-initialized))
;; PENDING: not needed?
(setq command-line-args (x-handle-args command-line-args))
+ ;; Setup the default fontset.
+ (create-default-fontset)
+ ;; Create the standard fontset.
+ (condition-case err
+ (create-fontset-from-fontset-spec ns-standard-fontset-spec t)
+ (error (display-warning
+ 'initialization
+ (format "Creation of the standard fontset failed: %s" err)
+ :error)))
+
(x-open-connection (system-name) nil t)
(dolist (service (ns-list-services))
diff --git a/lisp/term/pc-win.el b/lisp/term/pc-win.el
index cf67aca8343..ab776ea6257 100644
--- a/lisp/term/pc-win.el
+++ b/lisp/term/pc-win.el
@@ -403,7 +403,7 @@ Errors out because it is not supposed to be called, ever."
(error "terminal-init-internal called for window-system `%s'"
(window-system)))
-(defun msdos-initialize-window-system ()
+(defun msdos-initialize-window-system (&optional display)
"Initialization function for the `pc' \"window system\"."
(or (eq (window-system) 'pc)
(error
diff --git a/lisp/term/w32-win.el b/lisp/term/w32-win.el
index eac43fb70dc..acadb0fad43 100644
--- a/lisp/term/w32-win.el
+++ b/lisp/term/w32-win.el
@@ -92,7 +92,7 @@
(declare-function set-message-beep "w32fns.c")
(declare-function cygwin-convert-file-name-from-windows "cygw32.c"
- (path &optional absolute_p))
+ (path &optional absolute_p))
;; Conditional on new-fontset so bootstrapping works on non-GUI compiles
(if (fboundp 'new-fontset)
@@ -119,7 +119,11 @@
"/")
"/")))
(dnd-handle-one-url window 'private
- (concat "file:" file-name)))
+ (concat
+ (if (eq system-type 'cygwin)
+ "file://"
+ "file:")
+ file-name)))
(defun w32-drag-n-drop (event &optional new-frame)
"Edit the files listed in the drag-n-drop EVENT.
@@ -242,7 +246,7 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
(declare-function x-parse-geometry "frame.c" (string))
(defvar x-command-line-resources)
-(defun w32-initialize-window-system ()
+(defun w32-initialize-window-system (&optional _display)
"Initialize Emacs for W32 GUI frames."
(cl-assert (not w32-initialized))
diff --git a/lisp/term/x-win.el b/lisp/term/x-win.el
index 63ef2b402b0..822df0e37e5 100644
--- a/lisp/term/x-win.el
+++ b/lisp/term/x-win.el
@@ -427,7 +427,9 @@ as returned by `x-server-vendor'."
(#x3fe . ?,D~(B)
;; Kana: Fixme: needs conversion to Japanese charset -- seems
;; to require jisx0213, for which the Unicode translation
- ;; isn't clear.
+ ;; isn't clear. Using Emacs to convert this to Unicode and back changes
+ ;; this from "(J~(B" (i.e., bytes "ESC ( J ~ ESC ( B") to "$(G"#(B" (i.e., bytes
+ ;; "ESC $ ( G " # ESC ( B").
(#x47e . ?(J~(B)
(#x4a1 . ?$A!#(B)
(#x4a2 . ?\$A!8(B)
@@ -1127,6 +1129,9 @@ as returned by `x-server-vendor'."
(#x20a8 . ?$,1tH(B)
(#x20aa . ?$,1tJ(B)
(#x20ab . ?$,1tK(B)
+ ;; Kana: Fixme: needs checking. Using Emacs to convert this to Unicode
+ ;; and back changes this from ",b$(B" (i.e., bytes "ESC , b $ ESC ( B") to
+ ;; ",F$(B" (i.e., bytes "ESC , F $ ESC ( B").
(#x20ac . ?,b$(B)))
(puthash (car pair) (cdr pair) x-keysym-table))
@@ -1338,7 +1343,7 @@ Request data types in the order specified by `x-select-request-type'."
(defvar x-display-name)
(defvar x-command-line-resources)
-(defun x-initialize-window-system ()
+(defun x-initialize-window-system (&optional display)
"Initialize Emacs for X frames and open the first connection to an X server."
(cl-assert (not x-initialized))
@@ -1352,7 +1357,7 @@ Request data types in the order specified by `x-select-request-type'."
(while (setq i (string-match "[.*]" x-resource-name))
(aset x-resource-name i ?-))))
- (x-open-connection (or x-display-name
+ (x-open-connection (or display
(setq x-display-name (or (getenv "DISPLAY" (selected-frame))
(getenv "DISPLAY"))))
x-command-line-resources
diff --git a/lisp/term/xterm.el b/lisp/term/xterm.el
index c03d64a2f54..dcf32e5c595 100644
--- a/lisp/term/xterm.el
+++ b/lisp/term/xterm.el
@@ -1,4 +1,4 @@
-;;; xterm.el --- define function key sequences and standard colors for xterm
+;;; xterm.el --- define function key sequences and standard colors for xterm -*- lexical-binding: t -*-
;; Copyright (C) 1995, 2001-2013 Free Software Foundation, Inc.
@@ -37,8 +37,7 @@ If a list, assume that the listed features are supported, without checking.
The relevant features are:
modifyOtherKeys -- if supported, more key bindings work (e.g., \"\\C-,\")
- reportBackground -- if supported, Xterm reports its background color
-"
+ reportBackground -- if supported, Xterm reports its background color"
:version "24.1"
:group 'xterm
:type '(choice (const :tag "No" nil)
@@ -251,120 +250,124 @@ The relevant features are:
;; These keys are available in xterm starting from version 216
;; if the modifyOtherKeys resource is set to 1.
-
- (define-key map "\e[27;5;9~" [C-tab])
- (define-key map "\e[27;5;13~" [C-return])
- (define-key map "\e[27;5;39~" [?\C-\'])
- (define-key map "\e[27;5;44~" [?\C-,])
- (define-key map "\e[27;5;45~" [?\C--])
- (define-key map "\e[27;5;46~" [?\C-.])
- (define-key map "\e[27;5;47~" [?\C-/])
- (define-key map "\e[27;5;48~" [?\C-0])
- (define-key map "\e[27;5;49~" [?\C-1])
- ;; Not all C-DIGIT keys have a distinct binding.
- (define-key map "\e[27;5;57~" [?\C-9])
- (define-key map "\e[27;5;59~" [?\C-\;])
- (define-key map "\e[27;5;61~" [?\C-=])
- (define-key map "\e[27;5;92~" [?\C-\\])
-
- (define-key map "\e[27;6;33~" [?\C-!])
- (define-key map "\e[27;6;34~" [?\C-\"])
- (define-key map "\e[27;6;35~" [?\C-#])
- (define-key map "\e[27;6;36~" [?\C-$])
- (define-key map "\e[27;6;37~" [?\C-%])
- (define-key map "\e[27;6;38~" [?\C-&])
- (define-key map "\e[27;6;40~" [?\C-(])
- (define-key map "\e[27;6;41~" [?\C-)])
- (define-key map "\e[27;6;42~" [?\C-*])
- (define-key map "\e[27;6;43~" [?\C-+])
- (define-key map "\e[27;6;58~" [?\C-:])
- (define-key map "\e[27;6;60~" [?\C-<])
- (define-key map "\e[27;6;62~" [?\C->])
- (define-key map "\e[27;6;63~" [(control ??)])
-
- ;; These are the strings emitted for various C-M- combinations
- ;; for keyboards that the Meta and Alt modifiers are on the same
- ;; key (usually labeled "Alt").
- (define-key map "\e[27;13;9~" [C-M-tab])
- (define-key map "\e[27;13;13~" [C-M-return])
-
- (define-key map "\e[27;13;39~" [?\C-\M-\'])
- (define-key map "\e[27;13;44~" [?\C-\M-,])
- (define-key map "\e[27;13;45~" [?\C-\M--])
- (define-key map "\e[27;13;46~" [?\C-\M-.])
- (define-key map "\e[27;13;47~" [?\C-\M-/])
- (define-key map "\e[27;13;48~" [?\C-\M-0])
- (define-key map "\e[27;13;49~" [?\C-\M-1])
- (define-key map "\e[27;13;50~" [?\C-\M-2])
- (define-key map "\e[27;13;51~" [?\C-\M-3])
- (define-key map "\e[27;13;52~" [?\C-\M-4])
- (define-key map "\e[27;13;53~" [?\C-\M-5])
- (define-key map "\e[27;13;54~" [?\C-\M-6])
- (define-key map "\e[27;13;55~" [?\C-\M-7])
- (define-key map "\e[27;13;56~" [?\C-\M-8])
- (define-key map "\e[27;13;57~" [?\C-\M-9])
- (define-key map "\e[27;13;59~" [?\C-\M-\;])
- (define-key map "\e[27;13;61~" [?\C-\M-=])
- (define-key map "\e[27;13;92~" [?\C-\M-\\])
-
- (define-key map "\e[27;14;33~" [?\C-\M-!])
- (define-key map "\e[27;14;34~" [?\C-\M-\"])
- (define-key map "\e[27;14;35~" [?\C-\M-#])
- (define-key map "\e[27;14;36~" [?\C-\M-$])
- (define-key map "\e[27;14;37~" [?\C-\M-%])
- (define-key map "\e[27;14;38~" [?\C-\M-&])
- (define-key map "\e[27;14;40~" [?\C-\M-\(])
- (define-key map "\e[27;14;41~" [?\C-\M-\)])
- (define-key map "\e[27;14;42~" [?\C-\M-*])
- (define-key map "\e[27;14;43~" [?\C-\M-+])
- (define-key map "\e[27;14;58~" [?\C-\M-:])
- (define-key map "\e[27;14;60~" [?\C-\M-<])
- (define-key map "\e[27;14;62~" [?\C-\M->])
- (define-key map "\e[27;14;63~" [(control meta ??)])
-
- (define-key map "\e[27;7;9~" [C-M-tab])
- (define-key map "\e[27;7;13~" [C-M-return])
-
- (define-key map "\e[27;7;32~" [?\C-\M-\s])
- (define-key map "\e[27;7;39~" [?\C-\M-\'])
- (define-key map "\e[27;7;44~" [?\C-\M-,])
- (define-key map "\e[27;7;45~" [?\C-\M--])
- (define-key map "\e[27;7;46~" [?\C-\M-.])
- (define-key map "\e[27;7;47~" [?\C-\M-/])
- (define-key map "\e[27;7;48~" [?\C-\M-0])
- (define-key map "\e[27;7;49~" [?\C-\M-1])
- (define-key map "\e[27;7;50~" [?\C-\M-2])
- (define-key map "\e[27;7;51~" [?\C-\M-3])
- (define-key map "\e[27;7;52~" [?\C-\M-4])
- (define-key map "\e[27;7;53~" [?\C-\M-5])
- (define-key map "\e[27;7;54~" [?\C-\M-6])
- (define-key map "\e[27;7;55~" [?\C-\M-7])
- (define-key map "\e[27;7;56~" [?\C-\M-8])
- (define-key map "\e[27;7;57~" [?\C-\M-9])
- (define-key map "\e[27;7;59~" [?\C-\M-\;])
- (define-key map "\e[27;7;61~" [?\C-\M-=])
- (define-key map "\e[27;7;92~" [?\C-\M-\\])
-
- (define-key map "\e[27;8;33~" [?\C-\M-!])
- (define-key map "\e[27;8;34~" [?\C-\M-\"])
- (define-key map "\e[27;8;35~" [?\C-\M-#])
- (define-key map "\e[27;8;36~" [?\C-\M-$])
- (define-key map "\e[27;8;37~" [?\C-\M-%])
- (define-key map "\e[27;8;38~" [?\C-\M-&])
- (define-key map "\e[27;8;40~" [?\C-\M-\(])
- (define-key map "\e[27;8;41~" [?\C-\M-\)])
- (define-key map "\e[27;8;42~" [?\C-\M-*])
- (define-key map "\e[27;8;43~" [?\C-\M-+])
- (define-key map "\e[27;8;58~" [?\C-\M-:])
- (define-key map "\e[27;8;60~" [?\C-\M-<])
- (define-key map "\e[27;8;62~" [?\C-\M->])
- (define-key map "\e[27;8;63~" [(control meta ??)])
-
- (define-key map "\e[27;2;9~" [S-tab])
- (define-key map "\e[27;2;13~" [S-return])
-
- (define-key map "\e[27;6;9~" [C-S-tab])
- (define-key map "\e[27;6;13~" [C-S-return])
+ (dolist (bind '((5 9 [C-tab])
+ (5 13 [C-return])
+ (5 39 [?\C-\'])
+ (5 44 [?\C-,])
+ (5 45 [?\C--])
+ (5 46 [?\C-.])
+ (5 47 [?\C-/])
+ (5 48 [?\C-0])
+ (5 49 [?\C-1])
+ ;; Not all C-DIGIT keys have a distinct binding.
+ (5 57 [?\C-9])
+ (5 59 [?\C-\;])
+ (5 61 [?\C-=])
+ (5 92 [?\C-\\])
+
+ (6 33 [?\C-!])
+ (6 34 [?\C-\"])
+ (6 35 [?\C-#])
+ (6 36 [?\C-$])
+ (6 37 [?\C-%])
+ (6 38 [?\C-&])
+ (6 40 [?\C-\(])
+ (6 41 [?\C-\)])
+ (6 42 [?\C-*])
+ (6 43 [?\C-+])
+ (6 58 [?\C-:])
+ (6 60 [?\C-<])
+ (6 62 [?\C->])
+ (6 63 [(control ??)])
+
+ ;; These are the strings emitted for various C-M-
+ ;; combinations for keyboards whose Meta and Alt
+ ;; modifiers are on the same key (usually labeled "Alt").
+ (13 9 [C-M-tab])
+ (13 13 [C-M-return])
+
+ (13 39 [?\C-\M-\'])
+ (13 44 [?\C-\M-,])
+ (13 45 [?\C-\M--])
+ (13 46 [?\C-\M-.])
+ (13 47 [?\C-\M-/])
+ (13 48 [?\C-\M-0])
+ (13 49 [?\C-\M-1])
+ (13 50 [?\C-\M-2])
+ (13 51 [?\C-\M-3])
+ (13 52 [?\C-\M-4])
+ (13 53 [?\C-\M-5])
+ (13 54 [?\C-\M-6])
+ (13 55 [?\C-\M-7])
+ (13 56 [?\C-\M-8])
+ (13 57 [?\C-\M-9])
+ (13 59 [?\C-\M-\;])
+ (13 61 [?\C-\M-=])
+ (13 92 [?\C-\M-\\])
+
+ (14 33 [?\C-\M-!])
+ (14 34 [?\C-\M-\"])
+ (14 35 [?\C-\M-#])
+ (14 36 [?\C-\M-$])
+ (14 37 [?\C-\M-%])
+ (14 38 [?\C-\M-&])
+ (14 40 [?\C-\M-\(])
+ (14 41 [?\C-\M-\)])
+ (14 42 [?\C-\M-*])
+ (14 43 [?\C-\M-+])
+ (14 58 [?\C-\M-:])
+ (14 60 [?\C-\M-<])
+ (14 62 [?\C-\M->])
+ (14 63 [(control meta ??)])
+
+ (7 9 [C-M-tab])
+ (7 13 [C-M-return])
+
+ (7 32 [?\C-\M-\s])
+ (7 39 [?\C-\M-\'])
+ (7 44 [?\C-\M-,])
+ (7 45 [?\C-\M--])
+ (7 46 [?\C-\M-.])
+ (7 47 [?\C-\M-/])
+ (7 48 [?\C-\M-0])
+ (7 49 [?\C-\M-1])
+ (7 50 [?\C-\M-2])
+ (7 51 [?\C-\M-3])
+ (7 52 [?\C-\M-4])
+ (7 53 [?\C-\M-5])
+ (7 54 [?\C-\M-6])
+ (7 55 [?\C-\M-7])
+ (7 56 [?\C-\M-8])
+ (7 57 [?\C-\M-9])
+ (7 59 [?\C-\M-\;])
+ (7 61 [?\C-\M-=])
+ (7 92 [?\C-\M-\\])
+
+ (8 33 [?\C-\M-!])
+ (8 34 [?\C-\M-\"])
+ (8 35 [?\C-\M-#])
+ (8 36 [?\C-\M-$])
+ (8 37 [?\C-\M-%])
+ (8 38 [?\C-\M-&])
+ (8 40 [?\C-\M-\(])
+ (8 41 [?\C-\M-\)])
+ (8 42 [?\C-\M-*])
+ (8 43 [?\C-\M-+])
+ (8 58 [?\C-\M-:])
+ (8 60 [?\C-\M-<])
+ (8 62 [?\C-\M->])
+ (8 63 [(control meta ??)])
+
+ (2 9 [S-tab])
+ (2 13 [S-return])
+
+ (6 9 [C-S-tab])
+ (6 13 [C-S-return])))
+ (define-key map
+ (format "\e[27;%d;%d~" (nth 0 bind) (nth 1 bind)) (nth 2 bind))
+ ;; For formatOtherKeys=1, the sequence is a bit shorter (bug#13839).
+ (define-key map
+ (format "\e[%d;%du" (nth 1 bind) (nth 0 bind)) (nth 2 bind)))
;; Other versions of xterm might emit these.
(define-key map "\e[A" [up])
@@ -463,6 +466,89 @@ The relevant features are:
;; List of terminals for which modify-other-keys has been turned on.
(defvar xterm-modify-other-keys-terminal-list nil)
+(defun xterm--report-background-handler ()
+ (let ((str "")
+ chr)
+ ;; The reply should be: \e ] 11 ; rgb: NUMBER1 / NUMBER2 / NUMBER3 \e \\
+ (while (and (setq chr (read-event nil nil 2)) (not (equal chr ?\\)))
+ (setq str (concat str (string chr))))
+ (when (string-match
+ "rgb:\\([a-f0-9]+\\)/\\([a-f0-9]+\\)/\\([a-f0-9]+\\)" str)
+ (let ((recompute-faces
+ (xterm-maybe-set-dark-background-mode
+ (string-to-number (match-string 1 str) 16)
+ (string-to-number (match-string 2 str) 16)
+ (string-to-number (match-string 3 str) 16))))
+
+ ;; Recompute faces here in case the background mode was
+ ;; set to dark. We used to call
+ ;; `tty-set-up-initial-frame-faces' only once, but that
+ ;; caused the light background faces to be computed
+ ;; incorrectly. See:
+ ;; http://permalink.gmane.org/gmane.emacs.devel/119627
+ (when recompute-faces
+ (tty-set-up-initial-frame-faces))))))
+
+(defun xterm--version-handler ()
+ (let ((str "")
+ chr)
+ ;; The reply should be: \e [ > NUMBER1 ; NUMBER2 ; NUMBER3 c
+ ;; If the timeout is completely removed for read-event, this
+ ;; might hang for terminals that pretend to be xterm, but don't
+ ;; respond to this escape sequence. RMS' opinion was to remove
+ ;; it completely. That might be right, but let's first try to
+ ;; see if by using a longer timeout we get rid of most issues.
+ (while (and (setq chr (read-event nil nil 2)) (not (equal chr ?c)))
+ (setq str (concat str (string chr))))
+ (when (string-match "0;\\([0-9]+\\);0" str)
+ (let ((version (string-to-number (match-string 1 str))))
+ ;; If version is 242 or higher, assume the xterm supports
+ ;; reporting the background color (TODO: maybe earlier
+ ;; versions do too...)
+ (when (>= version 242)
+ (xterm--query "\e]11;?\e\\"
+ '(("\e]11;" . xterm--report-background-handler))))
+
+ ;; If version is 216 (the version when modifyOtherKeys was
+ ;; introduced) or higher, initialize the
+ ;; modifyOtherKeys support.
+ (when (>= version 216)
+ (terminal-init-xterm-modify-other-keys))))))
+
+(defun xterm--query (query handlers)
+ ;; We used to query synchronously, but the need to use `discard-input' is
+ ;; rather annoying (bug#6758). Maybe we could always use the asynchronous
+ ;; approach, but it's less tested.
+ ;; FIXME: Merge the two branches.
+ (if (input-pending-p)
+ (progn
+ (dolist (handler handlers)
+ (define-key input-decode-map (car handler)
+ (lambda (&optional _prompt)
+ ;; Unregister the handler, since we don't expect further answers.
+ (dolist (handler handlers)
+ (define-key input-decode-map (car handler) nil))
+ (funcall (cdr handler))
+ [])))
+ (send-string-to-terminal query))
+ ;; Pending input can be mistakenly returned by the calls to
+ ;; read-event below. Discard it.
+ (send-string-to-terminal query)
+ (while handlers
+ (let ((handler (pop handlers))
+ (i 0))
+ (while (and (< i (length (car handler)))
+ (let ((evt (read-event nil nil 2)))
+ (or (eq evt (aref (car handler) i))
+ (progn (if evt (push evt unread-command-events))
+ nil))))
+ (setq i (1+ i)))
+ (if (= i (length (car handler)))
+ (funcall (cdr handler))
+ (while (> i 0)
+ (push (aref (car handler) (setq i (1- i)))
+ unread-command-events)))))))
+
(defun terminal-init-xterm ()
"Terminal initialization function for xterm."
;; rxvt terminals sometimes set the TERM variable to "xterm", but
@@ -487,92 +573,24 @@ The relevant features are:
(xterm-register-default-colors)
(tty-set-up-initial-frame-faces)
- ;; Try to turn on the modifyOtherKeys feature on modern xterms.
- ;; When it is turned on many more key bindings work: things like
- ;; C-. C-, etc.
- ;; To do that we need to find out if the current terminal supports
- ;; modifyOtherKeys. At this time only xterm does.
- (when xterm-extra-capabilities
- (let ((coding-system-for-read 'binary)
- (chr nil)
- (str "")
- (recompute-faces nil)
- ;; If `xterm-extra-capabilities' is 'check, we don't know
- ;; the capabilities. We need to check for those defined
- ;; as `xterm-extra-capabilities' set options. Otherwise,
- ;; we don't need to check for any capabilities because
- ;; they are given by setting `xterm-extra-capabilities' to
- ;; a list (which could be empty).
- (tocheck-capabilities (if (eq 'check xterm-extra-capabilities)
- '(modifyOtherKeys reportBackground)))
- ;; The given capabilities are either the contents of
- ;; `xterm-extra-capabilities', if it's a list, or an empty list.
- (given-capabilities (if (consp xterm-extra-capabilities)
- xterm-extra-capabilities))
- version)
- ;; 1. Set `version'
-
- ;; Pending input can be mistakenly returned by the calls to
- ;; read-event below. Discard it.
- (discard-input)
+ (if (eq xterm-extra-capabilities 'check)
;; Try to find out the type of terminal by sending a "Secondary
;; Device Attributes (DA)" query.
- (send-string-to-terminal "\e[>0c")
-
- ;; The reply should be: \e [ > NUMBER1 ; NUMBER2 ; NUMBER3 c
- ;; If the timeout is completely removed for read-event, this
- ;; might hang for terminals that pretend to be xterm, but don't
- ;; respond to this escape sequence. RMS' opinion was to remove
- ;; it completely. That might be right, but let's first try to
- ;; see if by using a longer timeout we get rid of most issues.
- (when (and (equal (read-event nil nil 2) ?\e)
- (equal (read-event nil nil 2) ?\[))
- (while (not (equal (setq chr (read-event nil nil 2)) ?c))
- (setq str (concat str (string chr))))
- (if (string-match ">0;\\([0-9]+\\);0" str)
- (setq version (string-to-number (match-string 1 str)))))
- ;; 2. If reportBackground is known to be supported, or the
- ;; version is 242 or higher, assume the xterm supports
- ;; reporting the background color (TODO: maybe earlier
- ;; versions do too...)
- (when (or (memq 'reportBackground given-capabilities)
- (and (memq 'reportBackground tocheck-capabilities)
- version
- (>= version 242)))
- (discard-input)
- (send-string-to-terminal "\e]11;?\e\\")
- (when (and (equal (read-event nil nil 2) ?\e)
- (equal (read-event nil nil 2) ?\]))
- (setq str "")
- (while (not (equal (setq chr (read-event nil nil 2)) ?\\))
- (setq str (concat str (string chr))))
- (if (string-match
- "11;rgb:\\([a-f0-9]+\\)/\\([a-f0-9]+\\)/\\([a-f0-9]+\\)" str)
- (setq recompute-faces
- (xterm-maybe-set-dark-background-mode
- (string-to-number (match-string 1 str) 16)
- (string-to-number (match-string 2 str) 16)
- (string-to-number (match-string 3 str) 16))))))
-
- ;; 3. If modifyOtherKeys is known to be supported or the
- ;; version is 216 (the version when modifyOtherKeys was
- ;; introduced) or higher, initialize the modifyOtherKeys support.
- (if (or (memq 'modifyOtherKeys given-capabilities)
- (and (memq 'modifyOtherKeys tocheck-capabilities)
- version
- (>= version 216)))
- (terminal-init-xterm-modify-other-keys))
-
- ;; Recompute faces here in case the background mode was
- ;; set to dark. We used to call
- ;; `tty-set-up-initial-frame-faces' only once, but that
- ;; caused the light background faces to be computed
- ;; incorrectly. See:
- ;; http://permalink.gmane.org/gmane.emacs.devel/119627
- (when recompute-faces
- (tty-set-up-initial-frame-faces))))
-
- (run-hooks 'terminal-init-xterm-hook))
+ (xterm--query "\e[>0c"
+ ;; Some terminals (like OS X's Terminal.app) respond to
+ ;; this query as if it were a "Primary Device Attributes"
+ ;; query instead, so we should handle that too.
+ '(("\e[?" . xterm--version-handler)
+ ("\e[>" . xterm--version-handler)))
+
+ (when (memq 'reportBackground xterm-extra-capabilities)
+ (xterm--query "\e]11;?\e\\"
+ '(("\e]11;" . xterm--report-background-handler))))
+
+ (when (memq 'modifyOtherKeys xterm-extra-capabilities)
+ (terminal-init-xterm-modify-other-keys)))
+
+ (run-hooks 'terminal-init-xterm-hook))
(defun terminal-init-xterm-modify-other-keys ()
"Terminal initialization for xterm's modifyOtherKeys support."
diff --git a/lisp/textmodes/artist.el b/lisp/textmodes/artist.el
index c2978b0ea40..2bd7283676e 100644
--- a/lisp/textmodes/artist.el
+++ b/lisp/textmodes/artist.el
@@ -198,7 +198,7 @@
;; Variables
(defconst artist-version "1.2.6")
-(defconst artist-maintainer-address "tab@lysator.liu.se")
+(defconst artist-maintainer-address "tab@lysator.liu.se, bug-gnu-emacs@gnu.org")
(defvar x-pointer-crosshair)
diff --git a/lisp/textmodes/bibtex.el b/lisp/textmodes/bibtex.el
index aa20b739946..01a126eb381 100644
--- a/lisp/textmodes/bibtex.el
+++ b/lisp/textmodes/bibtex.el
@@ -3020,11 +3020,14 @@ Parsing initializes `bibtex-reference-keys' and `bibtex-strings'."
Visit the BibTeX files defined by `bibtex-files' and return a list
of corresponding buffers.
Initialize in these buffers `bibtex-reference-keys' if not yet set.
-List of BibTeX buffers includes current buffer if CURRENT is non-nil.
+List of BibTeX buffers includes current buffer if CURRENT is non-nil
+and the current buffer visits a file using `bibtex-mode'.
If FORCE is non-nil, (re)initialize `bibtex-reference-keys' even if
already set. If SELECT is non-nil interactively select a BibTeX buffer.
-When called interactively, FORCE is t, CURRENT is t if current buffer uses
-`bibtex-mode', and SELECT is t if current buffer does not use `bibtex-mode',"
+
+When called interactively, FORCE is t, CURRENT is t if current buffer
+visits a file using `bibtex-mode', and SELECT is t if current buffer
+does not use `bibtex-mode',"
(interactive (list (eq major-mode 'bibtex-mode) t
(not (eq major-mode 'bibtex-mode))))
(let ((file-path (split-string (or bibtex-file-path default-directory) ":+"))
@@ -3062,10 +3065,12 @@ When called interactively, FORCE is t, CURRENT is t if current buffer uses
(if (file-readable-p file)
(push (find-file-noselect file) buffer-list)))
;; Include current buffer iff we want it.
- ;; Exclude current buffer if it doesn't use `bibtex-mode'.
- ;; Thus calling `bibtex-initialize' gives meaningful results for
- ;; any current buffer.
- (unless (and current (eq major-mode 'bibtex-mode)) (setq current nil))
+ ;; Exclude current buffer if it does not visit a file using `bibtex-mode'.
+ ;; This way we exclude BibTeX buffers such as `bibtex-search-buffer'
+ ;; that are not visiting a BibTeX file. Also, calling `bibtex-initialize'
+ ;; gives meaningful results for any current buffer.
+ (unless (and current (eq major-mode 'bibtex-mode) buffer-file-name)
+ (setq current nil))
(cond ((and current (not (memq (current-buffer) buffer-list)))
(push (current-buffer) buffer-list))
((and (not current) (memq (current-buffer) buffer-list))
@@ -5163,6 +5168,9 @@ Return the URL or nil if none can be generated."
(if (stringp (car scheme))
(setq fmt (pop scheme)))
(dolist (step scheme)
+ ;; In the first STEP, if the field contains multiple
+ ;; matches, we want the match the closest to point.
+ ;; (if (eq step (car scheme))
(setq text (cdr (assoc-string (car step) fields-alist t)))
(if (string-match (nth 1 step) text)
(push (cond ((functionp (nth 2 step))
@@ -5233,19 +5241,22 @@ where FILE is the BibTeX file of ENTRY."
(if (string= "" field)
;; Unrestricted search.
(while (re-search-forward regexp nil t)
- (let ((beg (bibtex-beginning-of-entry))
- (end (bibtex-end-of-entry))
- key)
- (if (and (<= beg (match-beginning 0))
- (<= (match-end 0) end)
- (save-excursion
- (goto-char beg)
- (and (looking-at bibtex-entry-head)
- (setq key (bibtex-key-in-head))))
- (not (assoc key entries)))
- (push (list key file
- (buffer-substring-no-properties beg end))
- entries))))
+ (save-excursion
+ (let ((mbeg (match-beginning 0))
+ (mend (match-end 0))
+ (beg (bibtex-beginning-of-entry))
+ (end (bibtex-end-of-entry))
+ key)
+ (if (and (<= beg mbeg)
+ (<= mend end)
+ (progn
+ (goto-char beg)
+ (looking-at bibtex-entry-head))
+ (setq key (bibtex-key-in-head))
+ (not (assoc key entries)))
+ (push (list key file
+ (buffer-substring-no-properties beg end))
+ entries)))))
;; The following is slow. But it works reliably even in more
;; complicated cases with BibTeX string constants and crossrefed
;; entries. If you prefer speed over reliability, perform an
diff --git a/lisp/textmodes/conf-mode.el b/lisp/textmodes/conf-mode.el
index 93ff179229b..67f2d96d003 100644
--- a/lisp/textmodes/conf-mode.el
+++ b/lisp/textmodes/conf-mode.el
@@ -1,4 +1,4 @@
-;;; conf-mode.el --- Simple major mode for editing conf/ini/properties files
+;;; conf-mode.el --- Simple major mode for editing conf/ini/properties files -*- coding: utf-8 -*-
;; Copyright (C) 2004-2013 Free Software Foundation, Inc.
@@ -23,7 +23,7 @@
;;; Commentary:
;;
;; This mode is designed to edit many similar varieties of Conf/Ini files and
-;; Java properties. It started out from Aurélien Tisné's ini-mode.
+;; Java properties. It started out from Aurélien Tisné's ini-mode.
;; `conf-space-keywords' were inspired by Robert Fitzgerald's any-ini-mode.
diff --git a/lisp/textmodes/css-mode.el b/lisp/textmodes/css-mode.el
index 97b1dcfb238..cb19c018839 100644
--- a/lisp/textmodes/css-mode.el
+++ b/lisp/textmodes/css-mode.el
@@ -266,22 +266,22 @@
;;;###autoload
(define-derived-mode css-mode fundamental-mode "CSS"
"Major mode to edit Cascading Style Sheets."
- (set (make-local-variable 'font-lock-defaults) css-font-lock-defaults)
- (set (make-local-variable 'comment-start) "/*")
- (set (make-local-variable 'comment-start-skip) "/\\*+[ \t]*")
- (set (make-local-variable 'comment-end) "*/")
- (set (make-local-variable 'comment-end-skip) "[ \t]*\\*+/")
- (set (make-local-variable 'forward-sexp-function) 'css-forward-sexp)
- (set (make-local-variable 'parse-sexp-ignore-comments) t)
- (set (make-local-variable 'indent-line-function) 'css-indent-line)
- (set (make-local-variable 'fill-paragraph-function)
- 'css-fill-paragraph)
+ (setq-local font-lock-defaults css-font-lock-defaults)
+ (setq-local comment-start "/*")
+ (setq-local comment-start-skip "/\\*+[ \t]*")
+ (setq-local comment-end "*/")
+ (setq-local comment-end-skip "[ \t]*\\*+/")
+ (setq-local forward-sexp-function 'css-forward-sexp)
+ (setq-local parse-sexp-ignore-comments t)
+ (setq-local indent-line-function 'css-indent-line)
+ (setq-local fill-paragraph-function 'css-fill-paragraph)
+ (setq-local add-log-current-defun-function #'css-current-defun-name)
(when css-electric-keys
(let ((fc (make-char-table 'auto-fill-chars)))
(set-char-table-parent fc auto-fill-chars)
(dolist (c css-electric-keys)
(aset fc c 'indent-according-to-mode))
- (set (make-local-variable 'auto-fill-chars) fc))))
+ (setq-local auto-fill-chars fc))))
(defvar comment-continue)
@@ -481,5 +481,15 @@
(save-excursion (indent-line-to indent))
(indent-line-to indent)))))
+(defun css-current-defun-name ()
+ "Return the name of the CSS section at point, or nil."
+ (save-excursion
+ (let ((max (max (point-min) (- (point) 1600)))) ; approx 20 lines back
+ (when (search-backward "{" max t)
+ (skip-chars-backward " \t\r\n")
+ (beginning-of-line)
+ (if (looking-at "^[ \t]*\\([^{\r\n]*[^ {\t\r\n]\\)")
+ (match-string-no-properties 1))))))
+
(provide 'css-mode)
;;; css-mode.el ends here
diff --git a/lisp/textmodes/fill.el b/lisp/textmodes/fill.el
index feb2fa6cc73..5b6d5f359e6 100644
--- a/lisp/textmodes/fill.el
+++ b/lisp/textmodes/fill.el
@@ -721,7 +721,11 @@ space does not end a sentence, so don't break a line there."
(move-to-column (current-fill-column))
(if (when (< (point) to)
;; Find the position where we'll break the line.
- (forward-char 1) ;Use an immediately following space, if any.
+ ;; Use an immediately following space, if any.
+ ;; However, note that `move-to-column' may overshoot
+ ;; if there are wide characters (Bug#3234).
+ (unless (> (current-column) (current-fill-column))
+ (forward-char 1))
(fill-move-to-break-point linebeg)
;; Check again to see if we got to the end of
;; the paragraph.
diff --git a/lisp/textmodes/flyspell.el b/lisp/textmodes/flyspell.el
index 7e692960dbc..81f17c897eb 100644
--- a/lisp/textmodes/flyspell.el
+++ b/lisp/textmodes/flyspell.el
@@ -63,7 +63,7 @@ Non-nil means use highlight, nil means use minibuffer messages."
"Non-nil means Flyspell reports a repeated word as an error.
See `flyspell-mark-duplications-exceptions' to add exceptions to this rule.
Detection of repeated words is not implemented in
-\"large\" regions; see `flyspell-large-region'."
+\"large\" regions; see variable `flyspell-large-region'."
:group 'flyspell
:type 'boolean)
@@ -145,9 +145,10 @@ whose length is specified by `flyspell-delay'."
(defcustom flyspell-default-deplacement-commands
'(next-line previous-line
handle-switch-frame handle-select-window
- scroll-up scroll-down)
+ scroll-up
+ scroll-down)
"The standard list of deplacement commands for Flyspell.
-See `flyspell-deplacement-commands'."
+See variable `flyspell-deplacement-commands'."
:group 'flyspell
:version "21.1"
:type '(repeat (symbol)))
@@ -445,13 +446,23 @@ like <img alt=\"Some thing.\">."
;;*---------------------------------------------------------------------*/
;;* Highlighting */
;;*---------------------------------------------------------------------*/
-(defface flyspell-incorrect '((t :underline t :inherit error))
+(defface flyspell-incorrect
+ '((((supports :underline (:style wave)))
+ :underline (:style wave :color "Red1"))
+ (t
+ :underline t :inherit error))
"Flyspell face for misspelled words."
+ :version "24.4"
:group 'flyspell)
-(defface flyspell-duplicate '((t :underline t :inherit warning))
+(defface flyspell-duplicate
+ '((((supports :underline (:style wave)))
+ :underline (:style wave :color "DarkOrange"))
+ (t
+ :underline t :inherit warning))
"Flyspell face for words that appear twice in a row.
See also `flyspell-duplicate-distance'."
+ :version "24.4"
:group 'flyspell)
(defvar flyspell-overlay nil)
@@ -727,7 +738,7 @@ before the current command."
(let ((ispell-otherchars (ispell-get-otherchars)))
(cond
((not (and (numberp flyspell-pre-point)
- (buffer-live-p flyspell-pre-buffer)))
+ (eq flyspell-pre-buffer (current-buffer))))
nil)
((and (eq flyspell-pre-pre-point flyspell-pre-point)
(eq flyspell-pre-pre-buffer flyspell-pre-buffer))
@@ -945,11 +956,10 @@ Mostly we check word delimiters."
;; Prevent anything we do from affecting the mark.
deactivate-mark)
(if (flyspell-check-pre-word-p)
- (with-current-buffer flyspell-pre-buffer
+ (save-excursion
'(flyspell-debug-signal-pre-word-checked)
- (save-excursion
- (goto-char flyspell-pre-point)
- (flyspell-word))))
+ (goto-char flyspell-pre-point)
+ (flyspell-word)))
(if (flyspell-check-word-p)
(progn
'(flyspell-debug-signal-word-checked)
@@ -963,16 +973,14 @@ Mostly we check word delimiters."
;; FLYSPELL-CHECK-PRE-WORD-P
(setq flyspell-pre-pre-buffer (current-buffer))
(setq flyspell-pre-pre-point (point)))
- (progn
- (setq flyspell-pre-pre-buffer nil)
- (setq flyspell-pre-pre-point nil)
- ;; when a word is not checked because of a delayed command
- ;; we do not disable the ispell cache.
- (if (and (symbolp this-command)
+ (setq flyspell-pre-pre-buffer nil)
+ (setq flyspell-pre-pre-point nil)
+ ;; when a word is not checked because of a delayed command
+ ;; we do not disable the ispell cache.
+ (when (and (symbolp this-command)
(get this-command 'flyspell-delayed))
- (progn
- (setq flyspell-word-cache-end -1)
- (setq flyspell-word-cache-result '_)))))
+ (setq flyspell-word-cache-end -1)
+ (setq flyspell-word-cache-result '_)))
(while (and (not (input-pending-p)) (consp flyspell-changes))
(let ((start (car (car flyspell-changes)))
(stop (cdr (car flyspell-changes))))
diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el
index 1d28de72996..94b184d09a1 100644
--- a/lisp/textmodes/ispell.el
+++ b/lisp/textmodes/ispell.el
@@ -357,6 +357,10 @@ Must be greater than 1."
"ispell")
"Program invoked by \\[ispell-word] and \\[ispell-region] commands."
:type 'string
+ :set (lambda (symbol value)
+ (set-default symbol value)
+ (if (featurep 'ispell)
+ (ispell-set-spellchecker-params)))
:group 'ispell)
(defcustom ispell-alternate-dictionary
@@ -745,8 +749,10 @@ OTHERCHARS slots of the alist should contain the same character
set as casechars and otherchars in the LANGUAGE.aff file \(e.g.,
english.aff\). aspell and hunspell don't have this limitation.")
-(defvar ispell-really-aspell nil) ; Non-nil if we can use aspell extensions.
-(defvar ispell-really-hunspell nil) ; Non-nil if we can use hunspell extensions.
+(defvar ispell-really-aspell nil
+ "Non-nil if we can use aspell extensions.")
+(defvar ispell-really-hunspell nil
+ "Non-nil if we can use hunspell extensions.")
(defvar ispell-encoding8-command nil
"Command line option prefix to select encoding if supported, nil otherwise.
If setting the encoding is supported by spellchecker and is selectable from
@@ -769,6 +775,41 @@ here just for backwards compatibility.")
(make-obsolete-variable 'ispell-aspell-supports-utf8
'ispell-encoding8-command "23.1")
+(defvar ispell-hunspell-dictionary-equivs-alist
+ '(("american" "en_US")
+ ("brasileiro" "pt_BR")
+ ("british" "en_GB")
+ ("castellano" "es_ES")
+ ("castellano8" "es_ES")
+ ("czech" "cs_CZ")
+ ("dansk" "da_DK")
+ ("deutsch" "de_DE")
+ ("deutsch8" "de_DE")
+ ("english" "en_US")
+ ("esperanto" "eo")
+ ("esperanto-tex" "eo")
+ ("finnish" "fi_FI")
+ ("francais7" "fr_FR")
+ ("francais" "fr_FR")
+ ("francais-tex" "fr_FR")
+ ("german" "de_DE")
+ ("german8" "de_DE")
+ ("italiano" "it_IT")
+ ("nederlands" "nl_NL")
+ ("nederlands8" "nl_NL")
+ ("norsk" "nn_NO")
+ ("norsk7-tex" "nn_NO")
+ ("polish" "pl_PL")
+ ("portugues" "pt_PT")
+ ("russian" "ru_RU")
+ ("russianw" "ru_RU")
+ ("slovak" "sk_SK")
+ ("slovenian" "sl_SI")
+ ("svenska" "sv_SE")
+ ("hebrew" "he_IL"))
+ "Alist with matching hunspell dict names for standard dict names in
+ `ispell-dictionary-base-alist'.")
+
(defvar ispell-emacs-alpha-regexp
(if (string-match "^[[:alpha:]]+$" "abcde")
"[[:alpha:]]"
@@ -821,7 +862,7 @@ Otherwise returns the library directory name, if that is defined."
(if (string-match "\\`aspell" speller) "-v" "-vv"))))
(goto-char (point-min))
(if interactivep
- ;; report version information of ispell and ispell.el
+ ;; Report version information of ispell and ispell.el
(progn
(end-of-line)
(setq result (concat (buffer-substring-no-properties (point-min)
@@ -903,6 +944,25 @@ Otherwise returns the library directory name, if that is defined."
(setq default-directory (expand-file-name "~/")))
(apply 'call-process-region args)))
+(defun ispell-create-debug-buffer (&optional append)
+ "Create an ispell debug buffer for debugging output.
+Use APPEND to append the info to previous buffer if exists,
+otherwise is reset. Returns name of ispell debug buffer.
+See `ispell-buffer-with-debug' for an example of use."
+ (let ((ispell-debug-buffer (get-buffer-create "*ispell-debug*")))
+ (with-current-buffer ispell-debug-buffer
+ (if append
+ (insert
+ (format "-----------------------------------------------\n"))
+ (erase-buffer)))
+ ispell-debug-buffer))
+
+(defsubst ispell-print-if-debug (format &rest args)
+ "Print message to `ispell-debug-buffer' buffer if enabled."
+ (if (boundp 'ispell-debug-buffer)
+ (with-current-buffer ispell-debug-buffer
+ (goto-char (point-max))
+ (insert (apply #'format format args)))))
;; The preparation of the menu bar menu must be autoloaded
@@ -1072,6 +1132,176 @@ Return the new dictionary alist."
(push (cons aliasname (cdr realdict)) alist))))))
alist))
+;; Make ispell.el work better with hunspell.
+
+(defvar ispell-hunspell-dict-paths-alist nil
+ "Alist of parsed hunspell dicts and associated affix files.
+Will be used to parse corresponding .aff file and create associated
+parameters to be inserted into `ispell-hunspell-dictionary-alist'.
+Internal use.")
+
+(defvar ispell-hunspell-dictionary-alist nil
+ "Alist of parsed hunspell dicts and associated parameters.
+This alist will initially contain names of found dicts. Associated
+parameters will be added when dict is used for the first time.
+Internal use.")
+
+(defun ispell-hunspell-fill-dictionary-entry (dict)
+ "Fill `ispell-dictionary-alist' uninitialized entries for `DICT' and aliases.
+Value will be extracted from hunspell affix file and used for
+all uninitialized dicts using that affix file."
+ (if (cadr (assoc dict ispell-dictionary-alist))
+ (message "ispell-hfde: Non void entry for %s. Skipping.\n" dict)
+ (let ((dict-alias
+ (cadr (assoc dict ispell-hunspell-dictionary-equivs-alist)))
+ (use-for-dicts (list dict))
+ (dict-args-cdr (cdr (ispell-parse-hunspell-affix-file dict)))
+ newlist)
+ ;; Get a list of uninitialized dicts using the same affix file.
+ (dolist (dict-equiv-alist-entry ispell-hunspell-dictionary-equivs-alist)
+ (let ((dict-equiv-key (car dict-equiv-alist-entry))
+ (dict-equiv-value (cadr dict-equiv-alist-entry)))
+ (if (or (member dict dict-equiv-alist-entry)
+ (member dict-alias dict-equiv-alist-entry))
+ (dolist ( tmp-dict (list dict-equiv-key dict-equiv-value))
+ (if (cadr (assoc tmp-dict ispell-dictionary-alist))
+ (ispell-print-if-debug
+ "ispell-hfde: %s already expanded. Skipping.\n" tmp-dict)
+ (add-to-list 'use-for-dicts tmp-dict))))))
+ (ispell-print-if-debug
+ "ispell-hfde: Filling %s entry. Use for %s.\n" dict use-for-dicts)
+ ;; The final loop.
+ (dolist (entry ispell-dictionary-alist)
+ (if (member (car entry) use-for-dicts)
+ (add-to-list 'newlist
+ (append (list (car entry)) dict-args-cdr))
+ (add-to-list 'newlist entry)))
+ (setq ispell-dictionary-alist newlist))))
+
+(defun ispell-parse-hunspell-affix-file (dict-key)
+ "Parse hunspell affix file to extract parameters for `DICT-KEY'.
+Return a list in `ispell-dictionary-alist' format."
+ (let ((affix-file (cadr (assoc dict-key ispell-hunspell-dict-paths-alist))))
+ (unless affix-file
+ (error "ispell-phaf: No matching entry for %s.\n" dict-key))
+ (if (not (file-exists-p affix-file))
+ (error "ispell-phaf: File \"%s\" not found.\n" affix-file))
+ (let ((dict-name (file-name-sans-extension
+ (file-name-nondirectory affix-file)))
+ otherchars-string otherchars-list)
+ (with-temp-buffer
+ (insert-file-contents affix-file)
+ (setq otherchars-string
+ (save-excursion
+ (goto-char (point-min))
+ (if (search-forward-regexp "^WORDCHARS +" nil t )
+ (buffer-substring (point)
+ (progn (end-of-line) (point))))))
+ ;; Remove trailing whitespace and extra stuff. Make list if
+ ;; non-nil.
+ (setq otherchars-list
+ (if otherchars-string
+ (split-string
+ (if (string-match " +.*$" otherchars-string)
+ (replace-match "" nil nil otherchars-string)
+ otherchars-string)
+ "" t)))
+
+ ;; Fill dict entry
+ (list dict-key
+ "[[:alpha:]]"
+ "[^[:alpha:]]"
+ (if otherchars-list
+ (regexp-opt otherchars-list)
+ "")
+ t ; many-otherchars-p: We can't tell, set to t.
+ (list "-d" dict-name)
+ nil ; extended-char-mode: not supported by hunspell!
+ 'utf-8)))))
+
+(defun ispell-find-hunspell-dictionaries ()
+ "Look for installed hunspell dictionaries.
+Will initialize `ispell-hunspell-dictionary-alist' and
+`ispell-hunspell-dictionary-alist' after values found
+and remove `ispell-hunspell-dictionary-equivs-alist'
+entries if a specific dict was found."
+ (let ((hunspell-found-dicts
+ (split-string
+ (with-temp-buffer
+ (ispell-call-process ispell-program-name
+ null-device
+ t
+ nil
+ "-D")
+ (buffer-string))
+ "[\n\r]+"
+ t))
+ hunspell-default-dict
+ hunspell-default-dict-entry)
+ (dolist (dict hunspell-found-dicts)
+ (let* ((full-name (file-name-nondirectory dict))
+ (basename (file-name-sans-extension full-name))
+ (affix-file (concat dict ".aff")))
+ (if (string-match "\\.aff$" dict)
+ ;; Found default dictionary
+ (if hunspell-default-dict
+ (error "ispell-fhd: Default dict already defined as %s. Not using %s.\n"
+ hunspell-default-dict dict)
+ (setq affix-file dict)
+ (setq hunspell-default-dict (list basename affix-file)))
+ (if (and (not (assoc basename ispell-hunspell-dict-paths-alist))
+ (file-exists-p affix-file))
+ ;; Entry has an associated .aff file and no previous value.
+ (let ((affix-file (expand-file-name affix-file)))
+ (ispell-print-if-debug
+ "++ ispell-fhd: dict-entry:%s name:%s basename:%s affix-file:%s\n"
+ dict full-name basename affix-file)
+ (add-to-list 'ispell-hunspell-dict-paths-alist
+ (list basename affix-file)))
+ (ispell-print-if-debug
+ "-- ispell-fhd: Skipping entry: %s\n" dict)))))
+ ;; Remove entry from aliases alist if explicit dict was found.
+ (let (newlist)
+ (dolist (dict ispell-hunspell-dictionary-equivs-alist)
+ (if (assoc (car dict) ispell-hunspell-dict-paths-alist)
+ (ispell-print-if-debug
+ "-- ispell-fhd: Excluding %s alias. Standalone dict found.\n"
+ (car dict))
+ (add-to-list 'newlist dict)))
+ (setq ispell-hunspell-dictionary-equivs-alist newlist))
+ ;; Add known hunspell aliases
+ (dolist (dict-equiv ispell-hunspell-dictionary-equivs-alist)
+ (let ((dict-equiv-key (car dict-equiv))
+ (dict-equiv-value (cadr dict-equiv))
+ (exclude-aliases (list ;; Exclude TeX aliases
+ "esperanto-tex"
+ "francais7"
+ "francais-tex"
+ "norsk7-tex")))
+ (if (and (assoc dict-equiv-value ispell-hunspell-dict-paths-alist)
+ (not (assoc dict-equiv-key ispell-hunspell-dict-paths-alist))
+ (not (member dict-equiv-key exclude-aliases)))
+ (let ((affix-file (cadr (assoc dict-equiv-value
+ ispell-hunspell-dict-paths-alist))))
+ (ispell-print-if-debug "++ ispell-fhd: Adding alias %s -> %s.\n"
+ dict-equiv-key affix-file)
+ (add-to-list
+ 'ispell-hunspell-dict-paths-alist
+ (list dict-equiv-key affix-file))))))
+ ;; Parse and set values for default dictionary.
+ (setq hunspell-default-dict (car hunspell-default-dict))
+ (setq hunspell-default-dict-entry
+ (ispell-parse-hunspell-affix-file hunspell-default-dict))
+ ;; Create an alist of found dicts with only names, except for default dict.
+ (setq ispell-hunspell-dictionary-alist
+ (list (append (list nil) (cdr hunspell-default-dict-entry))))
+ (dolist (dict (mapcar 'car ispell-hunspell-dict-paths-alist))
+ (if (string= dict hunspell-default-dict)
+ (add-to-list 'ispell-hunspell-dictionary-alist
+ hunspell-default-dict-entry)
+ (add-to-list 'ispell-hunspell-dictionary-alist
+ (list dict))))))
+
;; Set params according to the selected spellchecker
(defvar ispell-last-program-name nil
@@ -1097,24 +1327,83 @@ aspell is used along with Emacs).")
(setq ispell-library-directory (ispell-check-version))
t)
(error nil))
- ispell-really-aspell
ispell-encoding8-command
ispell-emacs-alpha-regexp)
- (unless ispell-aspell-dictionary-alist
- (ispell-find-aspell-dictionaries)))
-
- ;; Substitute ispell-dictionary-alist with the list of dictionaries
- ;; corresponding to the given spellchecker. If a recent aspell, use
- ;; the list of really installed dictionaries and add to it elements
- ;; of the original list that are not present there. Allow distro info.
+ ;; auto-detection will only be used if spellchecker is not
+ ;; ispell, supports a way to set communication to UTF-8 and
+ ;; Emacs flavor supports [:alpha:]
+ (if ispell-really-aspell
+ (or ispell-aspell-dictionary-alist
+ (ispell-find-aspell-dictionaries))
+ (if ispell-really-hunspell
+ (or ispell-hunspell-dictionary-alist
+ (ispell-find-hunspell-dictionaries)))))
+
+ ;; Substitute ispell-dictionary-alist with the list of
+ ;; dictionaries corresponding to the given spellchecker.
+ ;; If a recent aspell or hunspell, use the list of really
+ ;; installed dictionaries and add to it elements of the original
+ ;; list that are not present there. Allow distro info.
(let ((found-dicts-alist
- (if (and ispell-really-aspell
- ispell-encoding8-command)
- ispell-aspell-dictionary-alist
+ (if (and ispell-encoding8-command
+ ispell-emacs-alpha-regexp)
+ (if ispell-really-aspell
+ ispell-aspell-dictionary-alist
+ (if ispell-really-hunspell
+ ispell-hunspell-dictionary-alist))
nil))
+ (ispell-dictionary-base-alist ispell-dictionary-base-alist)
ispell-base-dicts-override-alist ; Override only base-dicts-alist
all-dicts-alist)
+ ;; While ispell and aspell (through aliases) use the traditional
+ ;; dict naming originally expected by ispell.el, hunspell
+ ;; uses locale based names with no alias. We need to map
+ ;; standard names to locale based names to make default dict
+ ;; definitions available for hunspell.
+ (if ispell-really-hunspell
+ (let (tmp-dicts-alist)
+ (dolist (adict ispell-dictionary-base-alist)
+ (let* ((dict-name (nth 0 adict))
+ (dict-equiv
+ (cadr (assoc dict-name
+ ispell-hunspell-dictionary-equivs-alist)))
+ (ispell-args (nth 5 adict))
+ (ispell-args-has-d (member "-d" ispell-args))
+ skip-dict)
+ ;; Remove "-d" option from `ispell-args' if present
+ (if ispell-args-has-d
+ (let ((ispell-args-after-d
+ (cdr (cdr ispell-args-has-d)))
+ (ispell-args-before-d
+ (butlast ispell-args (length ispell-args-has-d))))
+ (setq ispell-args
+ (nconc ispell-args-before-d
+ ispell-args-after-d))))
+ ;; Unless default dict, re-add "-d" option with the mapped value
+ (if dict-name
+ (if dict-equiv
+ (setq ispell-args
+ (nconc ispell-args (list "-d" dict-equiv)))
+ (message
+ "ispell-set-spellchecker-params: Missing hunspell equiv for \"%s\". Skipping."
+ dict-name)
+ (setq skip-dict t)))
+
+ (unless skip-dict
+ (add-to-list 'tmp-dicts-alist
+ (list
+ dict-name ; dict name
+ (nth 1 adict) ; casechars
+ (nth 2 adict) ; not-casechars
+ (nth 3 adict) ; otherchars
+ (nth 4 adict) ; many-otherchars-p
+ ispell-args ; ispell-args
+ (nth 6 adict) ; extended-character-mode
+ (nth 7 adict) ; dict encoding
+ ))))
+ (setq ispell-dictionary-base-alist tmp-dicts-alist))))
+
(run-hooks 'ispell-initialize-spellchecker-hook)
;; Add dicts to ``ispell-dictionary-alist'' unless already present.
@@ -1132,19 +1421,21 @@ aspell is used along with Emacs).")
(if ispell-emacs-alpha-regexp
(let (tmp-dicts-alist)
(dolist (adict ispell-dictionary-alist)
- (add-to-list 'tmp-dicts-alist
- (list
- (nth 0 adict) ; dict name
- "[[:alpha:]]" ; casechars
- "[^[:alpha:]]" ; not-casechars
- (nth 3 adict) ; otherchars
- (nth 4 adict) ; many-otherchars-p
- (nth 5 adict) ; ispell-args
- (nth 6 adict) ; extended-character-mode
- (if ispell-encoding8-command
- 'utf-8
- (nth 7 adict)))))
- (setq ispell-dictionary-alist tmp-dicts-alist)))))
+ (if (cadr adict) ;; Do not touch hunspell uninitialized entries
+ (add-to-list 'tmp-dicts-alist
+ (list
+ (nth 0 adict) ; dict name
+ "[[:alpha:]]" ; casechars
+ "[^[:alpha:]]" ; not-casechars
+ (nth 3 adict) ; otherchars
+ (nth 4 adict) ; many-otherchars-p
+ (nth 5 adict) ; ispell-args
+ (nth 6 adict) ; extended-character-mode
+ (if ispell-encoding8-command
+ 'utf-8
+ (nth 7 adict))))
+ (add-to-list 'tmp-dicts-alist adict)))
+ (setq ispell-dictionary-alist tmp-dicts-alist)))))
(defun ispell-valid-dictionary-list ()
"Return a list of valid dictionaries.
@@ -1572,8 +1863,8 @@ You can set this variable in hooks in your init file -- eg:
(defun ispell-accept-output (&optional timeout-secs timeout-msecs)
"Wait for output from ispell process, or TIMEOUT-SECS and TIMEOUT-MSECS.
-If asynchronous subprocesses are not supported, call `ispell-filter' and
-pass it the output of the last ispell invocation."
+If asynchronous subprocesses are not supported, call function `ispell-filter'
+and pass it the output of the last ispell invocation."
(if ispell-async-processp
(accept-process-output ispell-process timeout-secs timeout-msecs)
(if (null ispell-process)
@@ -2038,10 +2329,14 @@ Global `ispell-quit' set to start location to continue spell session."
((= char ?i) ; accept and insert word into pers dict
(ispell-send-string (concat "*" word "\n"))
(setq ispell-pdict-modified-p '(t)) ; dictionary modified!
+ (and (fboundp 'flyspell-unhighlight-at)
+ (flyspell-unhighlight-at start))
nil)
((or (= char ?a) (= char ?A)) ; accept word without insert
(ispell-send-string (concat "@" word "\n"))
(add-to-list 'ispell-buffer-session-localwords word)
+ (and (fboundp 'flyspell-unhighlight-at)
+ (flyspell-unhighlight-at start))
(or ispell-buffer-local-name ; session localwords might conflict
(setq ispell-buffer-local-name (buffer-name)))
(if (null ispell-pdict-modified-p)
@@ -2630,11 +2925,14 @@ When asynchronous processes are not supported, `run' is always returned."
(defun ispell-start-process ()
"Start the Ispell process, with support for no asynchronous processes.
Keeps argument list for future Ispell invocations for no async support."
- ;; Local dictionary becomes the global dictionary in use.
- (setq ispell-current-dictionary
- (or ispell-local-dictionary ispell-dictionary))
- (setq ispell-current-personal-dictionary
- (or ispell-local-pdict ispell-personal-dictionary))
+ ;; `ispell-current-dictionary' and `ispell-current-personal-dictionary'
+ ;; are properly set in `ispell-internal-change-dictionary'.
+
+ ;; Parse hunspell affix file if using hunspell and entry is uninitialized.
+ (if ispell-really-hunspell
+ (or (cadr (assoc ispell-current-dictionary ispell-dictionary-alist))
+ (ispell-hunspell-fill-dictionary-entry ispell-current-dictionary)))
+
(let* ((default-directory
(if (and (file-directory-p default-directory)
(file-readable-p default-directory))
@@ -2649,8 +2947,7 @@ Keeps argument list for future Ispell invocations for no async support."
(list "-d" ispell-current-dictionary))
orig-args
(if ispell-current-personal-dictionary ; Use specified pers dict.
- (list "-p"
- (expand-file-name ispell-current-personal-dictionary)))
+ (list "-p" ispell-current-personal-dictionary))
;; If we are using recent aspell or hunspell, make sure we use the
;; right encoding for communication. ispell or older aspell/hunspell
;; does not support this.
@@ -2687,6 +2984,9 @@ Keeps argument list for future Ispell invocations for no async support."
(let* (;; Basename of dictionary used by the spell-checker
(dict-bname (or (car (cdr (member "-d" (ispell-get-ispell-args))))
ispell-current-dictionary))
+ ;; The directory where process was started.
+ (current-ispell-directory default-directory)
+ ;; The default directory for the process.
;; Use "~/" as default-directory unless using Ispell with per-dir
;; personal dictionaries and not in a minibuffer under XEmacs
(default-directory
@@ -2877,13 +3177,15 @@ By just answering RET you can find out what the current dictionary is."
"Update the dictionary and the personal dictionary used by Ispell.
This may kill the Ispell process; if so, a new one will be started
when needed."
- (let ((dict (or ispell-local-dictionary ispell-dictionary))
- (pdict (or ispell-local-pdict ispell-personal-dictionary)))
+ (let* ((dict (or ispell-local-dictionary ispell-dictionary))
+ (pdict (or ispell-local-pdict ispell-personal-dictionary))
+ (expanded-pdict (if pdict (expand-file-name pdict))))
(unless (and (equal ispell-current-dictionary dict)
- (equal ispell-current-personal-dictionary pdict))
+ (equal ispell-current-personal-dictionary
+ expanded-pdict))
(ispell-kill-ispell t)
(setq ispell-current-dictionary dict
- ispell-current-personal-dictionary pdict))))
+ ispell-current-personal-dictionary expanded-pdict))))
;; Avoid error messages when compiling for these dynamic variables.
(defvar ispell-start)
@@ -2901,114 +3203,137 @@ amount for last line processed."
(if (not recheckp)
(ispell-accept-buffer-local-defs)) ; set up dictionary, local words, etc.
(let ((skip-region-start (make-marker))
- (rstart (make-marker)))
- (unwind-protect
- (save-excursion
- (message "Spell-checking %s using %s with %s dictionary..."
- (if (and (= reg-start (point-min)) (= reg-end (point-max)))
- (buffer-name) "region")
- (file-name-nondirectory ispell-program-name)
- (or ispell-current-dictionary "default"))
- ;; Returns cursor to original location.
- (save-window-excursion
- (goto-char reg-start)
- (let ((transient-mark-mode)
- (case-fold-search case-fold-search)
- (query-fcc t)
- in-comment key)
- (let (message-log-max)
- (message "searching for regions to skip"))
- (if (re-search-forward (ispell-begin-skip-region-regexp) reg-end t)
- (progn
- (setq key (match-string-no-properties 0))
- (set-marker skip-region-start (- (point) (length key)))
- (goto-char reg-start)))
- (let (message-log-max)
- (message
- "Continuing spelling check using %s with %s dictionary..."
- (file-name-nondirectory ispell-program-name)
- (or ispell-current-dictionary "default")))
- (set-marker rstart reg-start)
- (set-marker ispell-region-end reg-end)
- (while (and (not ispell-quit)
- (< (point) ispell-region-end))
- ;; spell-check region with skipping
- (if (and (marker-position skip-region-start)
- (<= skip-region-start (point)))
+ (rstart (make-marker))
+ (region-type (if (and (= reg-start (point-min)) (= reg-end (point-max)))
+ (buffer-name) "region"))
+ (program-basename (file-name-nondirectory ispell-program-name))
+ (dictionary (or ispell-current-dictionary "default")))
+ (unwind-protect
+ (save-excursion
+ (message "Spell-checking %s using %s with %s dictionary..."
+ region-type program-basename dictionary)
+ ;; Returns cursor to original location.
+ (save-window-excursion
+ (goto-char reg-start)
+ (let ((transient-mark-mode)
+ (case-fold-search case-fold-search)
+ (query-fcc t)
+ in-comment key)
+ (ispell-print-if-debug
+ "ispell-region: (ispell-skip-region-list):\n%s
+ispell-region: (ispell-begin-skip-region-regexp):\n%s
+ispell-region: Search for first region to skip after (ispell-begin-skip-region-regexp)\n"
+ (ispell-skip-region-list)
+ (ispell-begin-skip-region-regexp))
+ (if (re-search-forward (ispell-begin-skip-region-regexp) reg-end t)
(progn
- ;; If region inside line comment, must keep comment start.
- (setq in-comment (point)
- in-comment
- (and comment-start
- (or (null comment-end) (string= "" comment-end))
- (save-excursion
- (beginning-of-line)
- (re-search-forward comment-start in-comment t))
- comment-start))
- ;; Can change skip-regexps (in ispell-message)
- (ispell-skip-region key) ; moves pt past region.
- (set-marker rstart (point))
- ;; check for saving large attachments...
- (setq query-fcc (and query-fcc
- (ispell-ignore-fcc skip-region-start
- rstart)))
- (if (and (< rstart ispell-region-end)
- (re-search-forward
- (ispell-begin-skip-region-regexp)
- ispell-region-end t))
- (progn
- (setq key (match-string-no-properties 0))
- (set-marker skip-region-start
- (- (point) (length key)))
- (goto-char rstart))
- (set-marker skip-region-start nil))))
- (setq reg-end (max (point)
- (if (marker-position skip-region-start)
- (min skip-region-start ispell-region-end)
- (marker-position ispell-region-end))))
- (let* ((ispell-start (point))
- (ispell-end (min (point-at-eol) reg-end))
- (string (ispell-get-line
- ispell-start ispell-end in-comment)))
- (if in-comment ; account for comment chars added
- (setq ispell-start (- ispell-start (length in-comment))
- in-comment nil))
- (setq ispell-end (point)) ; "end" tracks region retrieved.
- (if string ; there is something to spell check!
- ;; (special start end)
- (setq shift (ispell-process-line string
- (and recheckp shift))))
- (goto-char ispell-end)))))
- (if ispell-quit
- nil
- (or shift 0)))
- ;; protected
- (if (and (not (and recheckp ispell-keep-choices-win))
- (get-buffer ispell-choices-buffer))
- (kill-buffer ispell-choices-buffer))
- (set-marker skip-region-start nil)
- (set-marker rstart nil)
- (if ispell-quit
- (progn
- ;; preserve or clear the region for ispell-continue.
- (if (not (numberp ispell-quit))
- (set-marker ispell-region-end nil)
- ;; Ispell-continue enabled - ispell-region-end is set.
- (goto-char ispell-quit))
- ;; Check for aborting
- (if (and ispell-checking-message (numberp ispell-quit))
- (progn
- (setq ispell-quit nil)
- (error "Message send aborted")))
- (if (not recheckp) (setq ispell-quit nil)))
- (if (not recheckp) (set-marker ispell-region-end nil))
- ;; Only save if successful exit.
- (ispell-pdict-save ispell-silently-savep)
- (message "Spell-checking %s using %s with %s dictionary...done"
- (if (and (= reg-start (point-min)) (= reg-end (point-max)))
- (buffer-name) "region")
- (file-name-nondirectory ispell-program-name)
- (or ispell-current-dictionary "default"))))))
+ (setq key (match-string-no-properties 0))
+ (set-marker skip-region-start (- (point) (length key)))
+ (goto-char reg-start)
+ (ispell-print-if-debug
+ "ispell-region: First skip: %s at (pos,line,column): (%s,%s,%s).\n"
+ key
+ (save-excursion (goto-char skip-region-start) (point))
+ (line-number-at-pos skip-region-start)
+ (save-excursion (goto-char skip-region-start) (current-column)))))
+ (ispell-print-if-debug
+ "ispell-region: Continue spell-checking with %s and %s dictionary...\n"
+ program-basename dictionary)
+ (set-marker rstart reg-start)
+ (set-marker ispell-region-end reg-end)
+ (while (and (not ispell-quit)
+ (< (point) ispell-region-end))
+ ;; spell-check region with skipping
+ (if (and (marker-position skip-region-start)
+ (<= skip-region-start (point)))
+ (progn
+ ;; If region inside line comment, must keep comment start.
+ (setq in-comment (point)
+ in-comment
+ (and comment-start
+ (or (null comment-end) (string= "" comment-end))
+ (save-excursion
+ (beginning-of-line)
+ (re-search-forward comment-start in-comment t))
+ comment-start))
+ ;; Can change skip-regexps (in ispell-message)
+ (ispell-skip-region key) ; moves pt past region.
+ (set-marker rstart (point))
+ ;; check for saving large attachments...
+ (setq query-fcc (and query-fcc
+ (ispell-ignore-fcc skip-region-start
+ rstart)))
+ (if (and (< rstart ispell-region-end)
+ (re-search-forward
+ (ispell-begin-skip-region-regexp)
+ ispell-region-end t))
+ (progn
+ (setq key (match-string-no-properties 0))
+ (set-marker skip-region-start
+ (- (point) (length key)))
+ (goto-char rstart)
+ (ispell-print-if-debug
+ "ispell-region: Next skip: %s at (pos,line,column): (%s,%s,%s).\n"
+ key
+ (save-excursion (goto-char skip-region-start) (point))
+ (line-number-at-pos skip-region-start)
+ (save-excursion (goto-char skip-region-start) (current-column))))
+ (set-marker skip-region-start nil))))
+ (setq reg-end (max (point)
+ (if (marker-position skip-region-start)
+ (min skip-region-start ispell-region-end)
+ (marker-position ispell-region-end))))
+ (let* ((ispell-start (point))
+ (ispell-end (min (point-at-eol) reg-end))
+ ;; See if line must be prefixed by comment string to let ispell know this is
+ ;; part of a comment string. This is only supported in some modes.
+ ;; In particular, this is not supported in autoconf mode where adding the
+ ;; comment string messes everything up because ispell tries to spellcheck the
+ ;; `dnl' string header causing misalignments in some cases (debbugs.gnu.org: #12768).
+ (add-comment (and in-comment
+ (not (string= in-comment "dnl "))
+ in-comment))
+ (string (ispell-get-line
+ ispell-start ispell-end add-comment)))
+ (ispell-print-if-debug
+ "ispell-region: string pos (%s->%s), eol: %s, [in-comment]: [%s], [add-comment]: [%s], [string]: [%s]\n"
+ ispell-start ispell-end (point-at-eol) in-comment add-comment string)
+ (if add-comment ; account for comment chars added
+ (setq ispell-start (- ispell-start (length add-comment))
+ add-comment nil))
+ (setq ispell-end (point)) ; "end" tracks region retrieved.
+ (if string ; there is something to spell check!
+ ;; (special start end)
+ (setq shift (ispell-process-line string
+ (and recheckp shift))))
+ (goto-char ispell-end)))))
+ (if ispell-quit
+ nil
+ (or shift 0)))
+ ;; protected
+ (if (and (not (and recheckp ispell-keep-choices-win))
+ (get-buffer ispell-choices-buffer))
+ (kill-buffer ispell-choices-buffer))
+ (set-marker skip-region-start nil)
+ (set-marker rstart nil)
+ (if ispell-quit
+ (progn
+ ;; preserve or clear the region for ispell-continue.
+ (if (not (numberp ispell-quit))
+ (set-marker ispell-region-end nil)
+ ;; Ispell-continue enabled - ispell-region-end is set.
+ (goto-char ispell-quit))
+ ;; Check for aborting
+ (if (and ispell-checking-message (numberp ispell-quit))
+ (progn
+ (setq ispell-quit nil)
+ (error "Message send aborted")))
+ (if (not recheckp) (setq ispell-quit nil)))
+ (if (not recheckp) (set-marker ispell-region-end nil))
+ ;; Only save if successful exit.
+ (ispell-pdict-save ispell-silently-savep)
+ (message "Spell-checking %s using %s with %s dictionary...done"
+ region-type program-basename dictionary)))))
(defun ispell-begin-skip-region-regexp ()
@@ -3255,113 +3580,122 @@ Returns the sum SHIFT due to changes in word replacements."
;; Alignment cannot be tracked and this error will occur when
;; `query-replace' makes multiple corrections on the starting line.
(or (ispell-looking-at (car poss))
- ;; This occurs due to filter pipe problems
- (error (concat "Ispell misalignment: word "
- "`%s' point %d; probably incompatible versions")
- (car poss) (marker-position word-start)))
- ;; ispell-cmd-loop can go recursive & change buffer
- (if ispell-keep-choices-win
- (setq replace (ispell-command-loop
- (car (cdr (cdr poss)))
- (car (cdr (cdr (cdr poss))))
- (car poss) (marker-position word-start)
- (+ word-len (marker-position word-start))))
- (save-window-excursion
- (setq replace (ispell-command-loop
- (car (cdr (cdr poss)))
- (car (cdr (cdr (cdr poss))))
- (car poss) (marker-position word-start)
- (+ word-len (marker-position word-start))))))
-
- (goto-char word-start)
- ;; Recheck when query replace edit changes misspelled word.
- ;; Error in tex mode when a potential math mode change exists.
- (if (and replace (listp replace) (= 2 (length replace)))
- (if (and (eq ispell-parser 'tex)
- (string-match "[\\\\][]()[]\\|\\\\begin\\|\\$"
- (regexp-quote string)))
- (error
- "Don't start query replace on a line with math characters"
- )
- (set-marker line-end (point))
- (setq ispell-filter nil
- recheck-region t)))
-
- ;; insert correction if needed
- (cond
- ((or (null replace)
- (equal 0 replace)) ; ACCEPT/INSERT
- (if (equal 0 replace) ; BUFFER-LOCAL DICT ADD
- (ispell-add-per-file-word-list (car poss)))
- ;; do not recheck accepted word on this line
- (setq accept-list (cons (car poss) accept-list)))
- (t ; replacement word selected or entered
- (delete-region (point) (+ word-len (point)))
- (if (not (listp replace))
- (progn
- (insert replace) ; insert dictionary word
- (ispell-send-replacement (car poss) replace)
- (setq accept-list (cons replace accept-list)))
- (let ((replace-word (car replace)))
- ;; Recheck hand entered replacement word
- (insert replace-word)
- (ispell-send-replacement (car poss) replace-word)
- (if (car (cdr replace))
- (save-window-excursion
- (delete-other-windows) ; to correctly show help.
- ;; Assume case-replace &
- ;; case-fold-search correct?
- (query-replace (car poss) (car replace) t)))
- (goto-char word-start)
- ;; do not recheck if already accepted
- (if (member replace-word accept-list)
- (setq accept-list (cons replace-word accept-list)
- replace replace-word)
- (let ((region-end (copy-marker ispell-region-end)))
- (setq recheck-region ispell-filter
- ispell-filter nil ; save filter
- shift 0 ; already accounted
- shift (ispell-region
- word-start
- (+ word-start (length replace-word))
- t shift))
- (if (null shift) ; quitting check.
- (setq shift 0))
- (set-marker ispell-region-end region-end)
- (set-marker region-end nil)
- (setq ispell-filter recheck-region
- recheck-region nil
- replace replace-word)))))
-
- (setq shift (+ shift (- (length replace) word-len)))
-
- ;; Move line-start across word...
- ;; new shift function does this now...
- ;;(set-marker line-start (+ line-start
- ;; (- (length replace)
- ;; (length (car poss)))))
- ))
- (if (not ispell-quit)
+ ;; This error occurs due to filter pipe problems
+ (let* ((ispell-pipe-word (car poss))
+ (actual-point (marker-position word-start))
+ (actual-line (line-number-at-pos actual-point))
+ (actual-column (save-excursion (goto-char actual-point)
+ (current-column))))
+ (ispell-print-if-debug
+ "ispell-process-line: Ispell misalignment error:
+ [Word from ispell pipe]: [%s], actual (point,line,column): (%s,%s,%s)\n"
+ ispell-pipe-word actual-point actual-line actual-column)
+ (error (concat "Ispell misalignment: word "
+ "`%s' point %d; probably incompatible versions")
+ ispell-pipe-word actual-point)))
+ ;; ispell-cmd-loop can go recursive & change buffer
+ (if ispell-keep-choices-win
+ (setq replace (ispell-command-loop
+ (car (cdr (cdr poss)))
+ (car (cdr (cdr (cdr poss))))
+ (car poss) (marker-position word-start)
+ (+ word-len (marker-position word-start))))
+ (save-window-excursion
+ (setq replace (ispell-command-loop
+ (car (cdr (cdr poss)))
+ (car (cdr (cdr (cdr poss))))
+ (car poss) (marker-position word-start)
+ (+ word-len (marker-position word-start))))))
+
+ (goto-char word-start)
+ ;; Recheck when query replace edit changes misspelled word.
+ ;; Error in tex mode when a potential math mode change exists.
+ (if (and replace (listp replace) (= 2 (length replace)))
+ (if (and (eq ispell-parser 'tex)
+ (string-match "[\\\\][]()[]\\|\\\\begin\\|\\$"
+ (regexp-quote string)))
+ (error
+ "Don't start query replace on a line with math characters"
+ )
+ (set-marker line-end (point))
+ (setq ispell-filter nil
+ recheck-region t)))
+
+ ;; Insert correction if needed.
+ (cond
+ ((or (null replace)
+ (equal 0 replace)) ; ACCEPT/INSERT
+ (if (equal 0 replace) ; BUFFER-LOCAL DICT ADD
+ (ispell-add-per-file-word-list (car poss)))
+ ;; Do not recheck accepted word on this line.
+ (setq accept-list (cons (car poss) accept-list)))
+ (t ; Replacement word selected or entered.
+ (delete-region (point) (+ word-len (point)))
+ (if (not (listp replace))
+ (progn
+ (insert replace) ; Insert dictionary word.
+ (ispell-send-replacement (car poss) replace)
+ (setq accept-list (cons replace accept-list)))
+ (let ((replace-word (car replace)))
+ ;; Recheck hand entered replacement word.
+ (insert replace-word)
+ (ispell-send-replacement (car poss) replace-word)
+ (if (car (cdr replace))
+ (save-window-excursion
+ (delete-other-windows) ; to correctly show help.
+ ;; Assume case-replace &
+ ;; case-fold-search correct?
+ (query-replace (car poss) (car replace) t)))
+ (goto-char word-start)
+ ;; Do not recheck if already accepted.
+ (if (member replace-word accept-list)
+ (setq accept-list (cons replace-word accept-list)
+ replace replace-word)
+ (let ((region-end (copy-marker ispell-region-end)))
+ (setq recheck-region ispell-filter
+ ispell-filter nil ; Save filter.
+ shift 0 ; Already accounted.
+ shift (ispell-region
+ word-start
+ (+ word-start (length replace-word))
+ t shift))
+ (if (null shift) ; Quitting check.
+ (setq shift 0))
+ (set-marker ispell-region-end region-end)
+ (set-marker region-end nil)
+ (setq ispell-filter recheck-region
+ recheck-region nil
+ replace replace-word)))))
+
+ (setq shift (+ shift (- (length replace) word-len)))
+
+ ;; Move line-start across word...
+ ;; new shift function does this now...
+ ;;(set-marker line-start (+ line-start
+ ;; (- (length replace)
+ ;; (length (car poss)))))
+ ))
+ (if (not ispell-quit)
;; FIXME: remove redundancy with identical code above.
- (let (message-log-max)
- (message
+ (let (message-log-max)
+ (message
"Continuing spelling check using %s with %s dictionary..."
(file-name-nondirectory ispell-program-name)
(or ispell-current-dictionary "default"))))
- (sit-for 0)
- (setq ispell-start (marker-position line-start)
- ispell-end (marker-position line-end))
- ;; Adjust markers when end of region lost from highlighting.
- (if (and (not recheck-region)
+ (sit-for 0)
+ (setq ispell-start (marker-position line-start)
+ ispell-end (marker-position line-end))
+ ;; Adjust markers when end of region lost from highlighting.
+ (if (and (not recheck-region)
(< ispell-end (+ word-start word-len)))
- (setq ispell-end (+ word-start word-len)))
- (if (= word-start ispell-region-end)
- (set-marker ispell-region-end (+ word-start word-len)))
- ;; going out of scope - unneeded
- (set-marker line-start nil)
- (set-marker word-start nil)
- (set-marker line-end nil)))
- ;; finished with misspelling!
+ (setq ispell-end (+ word-start word-len)))
+ (if (= word-start ispell-region-end)
+ (set-marker ispell-region-end (+ word-start word-len)))
+ ;; Going out of scope - unneeded.
+ (set-marker line-start nil)
+ (set-marker word-start nil)
+ (set-marker line-end nil)))
+ ;; Finished with misspelling!
(setq ispell-filter (cdr ispell-filter)))
shift))
@@ -3392,6 +3726,13 @@ Returns the sum SHIFT due to changes in word replacements."
(interactive)
(ispell-region (point-min) (point-max)))
+;;;###autoload
+(defun ispell-buffer-with-debug (&optional append)
+ "`ispell-buffer' with some output sent to `ispell-debug-buffer' buffer.
+Use APPEND to append the info to previous buffer if exists."
+ (interactive)
+ (let ((ispell-debug-buffer (ispell-create-debug-buffer append)))
+ (ispell-buffer)))
;;;###autoload
(defun ispell-continue ()
@@ -3995,8 +4336,13 @@ Both should not be used to define a buffer-local dictionary."
(if (fboundp 'comment-padright)
;; Try and use the proper comment marker,
;; e.g. ";;" rather than ";".
- (comment-padright comment-start
- (comment-add nil))
+ (progn
+ ;; XEmacs: comment-normalize-vars
+ ;; (newcomment.el) only in >= 21.5
+ (and (fboundp 'comment-normalize-vars)
+ (comment-normalize-vars))
+ (comment-padright comment-start
+ (comment-add nil)))
comment-start)
" ")
"")
diff --git a/lisp/textmodes/po.el b/lisp/textmodes/po.el
index 331f220f95b..610227af794 100644
--- a/lisp/textmodes/po.el
+++ b/lisp/textmodes/po.el
@@ -1,8 +1,8 @@
-;;; po.el --- basic support of PO translation files -*- coding: latin-1; -*-
+;;; po.el --- basic support of PO translation files -*- coding: utf-8; -*-
;; Copyright (C) 1995-1998, 2000-2013 Free Software Foundation, Inc.
-;; Authors: François Pinard <pinard@iro.umontreal.ca>,
+;; Authors: François Pinard <pinard@iro.umontreal.ca>,
;; Greg McGary <gkm@magilla.cichlid.com>,
;; Bruno Haible <bruno@clisp.org>.
;; Keywords: i18n, files
diff --git a/lisp/textmodes/reftex-cite.el b/lisp/textmodes/reftex-cite.el
index 3b294e62b01..ca29709de2e 100644
--- a/lisp/textmodes/reftex-cite.el
+++ b/lisp/textmodes/reftex-cite.el
@@ -514,12 +514,6 @@
;; remove extra whitespace
(while (string-match "[\n\t\r]\\|[ \t][ \t]+" field)
(setq field (replace-match " " nil t field)))
- ;; remove leading garbage
- (if (string-match (if raw "^[ \t]+" "^[ \t{]+") field)
- (setq field (replace-match "" nil t field)))
- ;; remove trailing garbage
- (if (string-match (if raw "[ \t]+$" "[ \t}]+$") field)
- (setq field (replace-match "" nil t field)))
(push (cons key field) alist))))
alist))
@@ -1043,6 +1037,7 @@ While entering the regexp, completion on knows citation keys is possible.
((= l ?k) (reftex-get-bib-field "key" entry))
((= l ?m) (reftex-get-bib-field "month" entry))
((= l ?n) (reftex-get-bib-field "number" entry))
+ ((= l ?N) (reftex-get-bib-field "note" entry))
((= l ?o) (reftex-get-bib-field "organization" entry))
((= l ?p) (reftex-get-bib-field "pages" entry))
((= l ?P) (car (split-string
@@ -1050,6 +1045,7 @@ While entering the regexp, completion on knows citation keys is possible.
"[- .]+")))
((= l ?s) (reftex-get-bib-field "school" entry))
((= l ?u) (reftex-get-bib-field "publisher" entry))
+ ((= l ?U) (reftex-get-bib-field "url" entry))
((= l ?r) (reftex-get-bib-field "address" entry))
((= l ?t) (reftex-get-bib-field "title" entry))
((= l ?T) (reftex-abbreviate-title
diff --git a/lisp/textmodes/reftex-parse.el b/lisp/textmodes/reftex-parse.el
index 095c5953947..6bfc70c5d44 100644
--- a/lisp/textmodes/reftex-parse.el
+++ b/lisp/textmodes/reftex-parse.el
@@ -234,8 +234,18 @@ of master file."
((match-end 1)
;; It is a label
- (push (reftex-label-info (reftex-match-string 1) file bound)
- docstruct))
+ (when (or (null reftex-label-ignored-macros-and-environments)
+ ;; \label{} defs should always be honored,
+ ;; just no keyval style [label=foo] defs.
+ (string-equal "\label{" (substring (reftex-match-string 0) 0 7))
+ (not (fboundp 'TeX-current-macro))
+ (not (fboundp 'LaTeX-current-environment))
+ (not (or (member (save-match-data (TeX-current-macro))
+ reftex-label-ignored-macros-and-environments)
+ (member (save-match-data (LaTeX-current-environment))
+ reftex-label-ignored-macros-and-environments))))
+ (push (reftex-label-info (reftex-match-string 1) file bound)
+ docstruct)))
((match-end 3)
;; It is a section
@@ -251,7 +261,7 @@ of master file."
;; the next parsing iteration.
(when (eq (char-before) ?\\) (backward-char))
;; Insert in List
- (setq toc-entry (reftex-section-info file))
+ (setq toc-entry (funcall reftex-section-info-function file))
(when toc-entry
;; It can happen that section info returns nil
(setq level (nth 5 toc-entry))
diff --git a/lisp/textmodes/reftex-toc.el b/lisp/textmodes/reftex-toc.el
index 2beb3af628b..248e36a5299 100644
--- a/lisp/textmodes/reftex-toc.el
+++ b/lisp/textmodes/reftex-toc.el
@@ -785,7 +785,7 @@ PRO-OR-DE is assumed to be dynamically scoped into this function."
(marker (nth 4 data)))
(with-current-buffer (marker-buffer marker)
(goto-char (marker-position marker))
- (if (looking-at (concat "\\([ \t]*\\\\\\)" (regexp-quote name)))
+ (if (looking-at (concat "\\([ \t]*" reftex-section-pre-regexp "\\)" (regexp-quote name)))
(replace-match (concat "\\1" newname))
(error "Fatal error during %smotion" pro-or-de)))))
diff --git a/lisp/textmodes/reftex-vars.el b/lisp/textmodes/reftex-vars.el
index db08ca3a514..a68a27bb07e 100644
--- a/lisp/textmodes/reftex-vars.el
+++ b/lisp/textmodes/reftex-vars.el
@@ -863,6 +863,48 @@ 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, ...
+ "\\[[^]]*\\<label[[:space:]]*=[[:space:]]*{?\\(?1:[^],}]+\\)}?")
+ "List of regexps matching \\label definitions.
+The default value matches usual \\label{...} definitions and
+keyval style [..., label = {...}, ...] label definitions. It is
+assumed that the regexp group 1 matches the label text, so you
+have to define it using \\(?1:...\\) when adding new regexps.
+
+When changed from Lisp, make sure to call
+`reftex-compile-variables' afterwards to make the change
+effective."
+ :set (lambda (symbol value)
+ (set symbol value)
+ (when (fboundp 'reftex-compile-variables)
+ (reftex-compile-variables)))
+ :group 'reftex-defining-label-environments
+ :type '(repeat (regexp :tag "Regular Expression")))
+
+(defcustom reftex-label-ignored-macros-and-environments nil
+ "List of macros and environments to be ignored when searching for labels.
+The purpose is to ignore environments and macros that use keyval
+style label=foo arguments, but the label has a different meaning
+than a \\label{foo}. Standard \\label{...} definitions are never
+ignored.
+
+E.g., TikZ defines several macros/environments where [label=foo]
+defines the label to be printed at some node or edge, but it's
+not a label used for referencing.
+
+Note that this feature is only supported if you are using AUCTeX
+and the functions `TeX-current-macro' and
+`LaTeX-current-environment' are bound. Also note that this
+feature might slow down the reftex parsing process for large TeX
+files."
+ :version "24.4"
+ :group 'reftex-defining-label-environments
+ :type '(repeat string))
+
(defcustom reftex-label-illegal-re "[^-a-zA-Z0-9_+=:;,.]"
"Regexp matching characters not valid in labels."
:group 'reftex-making-and-inserting-labels
@@ -1125,12 +1167,12 @@ In the format, the following percent escapes will be expanded.
%e Works like %a, but on list of editor names. (%2e and %E work a well)
It is also possible to access all other BibTeX database fields:
-%b booktitle %c chapter %d edition %h howpublished
-%i institution %j journal %k key %m month
-%n number %o organization %p pages %P first page
-%r address %s school %u publisher %t title
-%v volume %y year
-%B booktitle, abbreviated %T title, abbreviated
+%b booktitle %c chapter %d edition %h howpublished
+%i institution %j journal %k key %m month
+%n number %N note %o organization %p pages
+%P first page %r address %s school %u publisher
+%U url %t title %v volume %y year
+%B booktitle, abbreviated %T title, abbreviated
Usually, only %l is needed. The other stuff is mainly for the echo area
display, and for (setq reftex-comment-citations t).
diff --git a/lisp/textmodes/reftex.el b/lisp/textmodes/reftex.el
index d511bf9ff8b..21083fd188a 100644
--- a/lisp/textmodes/reftex.el
+++ b/lisp/textmodes/reftex.el
@@ -301,7 +301,9 @@ on the menu bar.
(modify-syntax-entry ?\' "." reftex-syntax-table-for-bib)
(modify-syntax-entry ?\" "." reftex-syntax-table-for-bib)
(modify-syntax-entry ?\[ "." reftex-syntax-table-for-bib)
- (modify-syntax-entry ?\] "." reftex-syntax-table-for-bib))
+ (modify-syntax-entry ?\] "." reftex-syntax-table-for-bib)
+
+ (run-hooks 'reftex-mode-hook))
;; Mode was turned off
(easy-menu-remove reftex-mode-menu)))
@@ -664,6 +666,16 @@ will deactivate it."
(defvar reftex-find-label-regexp-format nil)
(defvar reftex-find-label-regexp-format2 nil)
+;; Constants for making RefTeX open to Texinfo hooking
+(defvar reftex-section-pre-regexp "\\\\")
+;; Including `\' as a character to be matched at the end of the regexp
+;; will allow stuff like \begin{foo}\label{bar} to be matched. This
+;; will make the parser to advance one char too much. Therefore
+;; `reftex-parse-from-file' will step one char back if a section is
+;; found.
+(defvar reftex-section-post-regexp "\\*?\\(\\[[^]]*\\]\\)?[[{ \t\r\n\\]")
+(defvar reftex-section-info-function 'reftex-section-info)
+
(defvar reftex-memory nil
"Memorizes old variable values to indicate changes in these variables.")
@@ -1069,13 +1081,7 @@ This enforces rescanning the buffer on next use."
(wbol "\\(^\\)[ \t]*") ; Need to keep the empty group because
; match numbers are hard coded
(label-re (concat "\\(?:"
- ;; Normal \label{...}
- "\\\\label{\\([^}]*\\)}"
- "\\|"
- ;; keyvals [..., label = {foo}, ...]
- ;; forms used by ctable, listings,
- ;; minted, ...
- "\\[[^]]*label[[:space:]]*=[[:space:]]*{?\\(?1:[^],}]+\\)}?"
+ (mapconcat 'identity reftex-label-regexps "\\|")
"\\)"))
(include-re (concat wbol
"\\\\\\("
@@ -1083,16 +1089,10 @@ This enforces rescanning the buffer on next use."
reftex-include-file-commands "\\|")
"\\)[{ \t]+\\([^} \t\n\r]+\\)"))
(section-re
- ;; Including `\' as a character to be matched at the end
- ;; of the regexp will allow stuff like
- ;; \begin{foo}\label{bar} to be matched. This will make
- ;; the parser to advance one char too much. Therefore
- ;; `reftex-parse-from-file' will step one char back if a
- ;; section is found.
- (concat wbol "\\\\\\("
+ (concat wbol reftex-section-pre-regexp "\\("
(mapconcat (lambda (x) (regexp-quote (car x)))
reftex-section-levels-all "\\|")
- "\\)\\*?\\(\\[[^]]*\\]\\)?[[{ \t\r\n\\]"))
+ "\\)" reftex-section-post-regexp))
(appendix-re (concat wbol "\\(\\\\appendix\\)"))
(macro-re
(if macros-with-labels
@@ -2458,7 +2458,7 @@ information about your RefTeX version and configuration."
(require 'reporter)
(let ((reporter-prompt-for-summary-p "Bug report subject: "))
(reporter-submit-bug-report
- "bug-auctex@gnu.org"
+ "bug-auctex@gnu.org, bug-gnu-emacs@gnu.org"
reftex-version
(list 'window-system
'reftex-plug-into-AUCTeX)
diff --git a/lisp/textmodes/remember.el b/lisp/textmodes/remember.el
index eeb04ef250f..76ffeaf30be 100644
--- a/lisp/textmodes/remember.el
+++ b/lisp/textmodes/remember.el
@@ -216,10 +216,11 @@ All functions are run in the remember buffer."
Each function is called with the current buffer narrowed to what the
user wants remembered.
If any function returns non-nil, the data is assumed to have been
-recorded somewhere by that function. "
+recorded somewhere by that function."
:type 'hook
:options '(remember-store-in-mailbox
remember-append-to-file
+ remember-store-in-files
remember-diary-extract-entries
org-remember-handler)
:group 'remember)
@@ -380,7 +381,7 @@ Subject: %s\n\n"
;; Remembering to plain files
-(defcustom remember-data-file (convert-standard-filename "~/.notes")
+(defcustom remember-data-file (locate-user-emacs-file "notes" ".notes")
"The file in which to store unprocessed data."
:type 'file
:group 'remember)
@@ -429,6 +430,29 @@ If you want to remember a region, supply a universal prefix to
(run-hook-with-args-until-success 'remember-handler-functions))
(remember-destroy))))
+(defcustom remember-data-directory "~/remember"
+ "The directory in which to store remember data as files."
+ :type 'directory
+ :version "24.4"
+ :group 'remember)
+
+(defcustom remember-directory-file-name-format "%Y-%m-%d_%T-%z"
+ "Format string for the file name in which to store unprocessed data."
+ :type 'string
+ :version "24.4"
+ :group 'remember)
+
+(defun remember-store-in-files ()
+ "Store remember data in a file in `remember-data-directory'.
+The file is named after `remember-directory-file-name-format'."
+ (let ((name (format-time-string
+ remember-directory-file-name-format (current-time)))
+ (text (buffer-string)))
+ (with-temp-buffer
+ (insert text)
+ (write-file (convert-standard-filename
+ (format "%s/%s" remember-data-directory name))))))
+
;;;###autoload
(defun remember-clipboard ()
"Remember the contents of the current clipboard.
diff --git a/lisp/textmodes/sgml-mode.el b/lisp/textmodes/sgml-mode.el
index 74b26db1064..33dfa277330 100644
--- a/lisp/textmodes/sgml-mode.el
+++ b/lisp/textmodes/sgml-mode.el
@@ -46,9 +46,26 @@
:type 'integer
:group 'sgml)
+(defcustom sgml-xml-mode nil
+ "When non-nil, tag insertion functions will be XML-compliant.
+It is set to be buffer-local when the file has
+a DOCTYPE or an XML declaration."
+ :type 'boolean
+ :version "22.1"
+ :group 'sgml)
+
(defcustom sgml-transformation-function 'identity
"Default value for `skeleton-transformation-function' in SGML mode."
:type 'function
+ :initialize 'custom-initialize-default
+ :set (lambda (sym val)
+ (set-default sym val)
+ (mapc (lambda (buff)
+ (with-current-buffer buff
+ (and (derived-mode-p 'sgml-mode)
+ (not sgml-xml-mode)
+ (setq skeleton-transformation-function val))))
+ (buffer-list)))
:group 'sgml)
(put 'sgml-transformation-function 'variable-interactive
@@ -295,8 +312,8 @@ Any terminating `>' or `/' is not matched.")
(defconst sgml-syntax-propertize-function
(syntax-propertize-rules
- ;; Use the `b' style of comments to avoid interference with the -- ... --
- ;; comments recognized when `sgml-specials' includes ?-.
+ ;; Use the `b' style of comments to avoid interference with the -- ... --
+ ;; comments recognized when `sgml-specials' includes ?-.
;; FIXME: beware of <!--> blabla <!--> !!
("\\(<\\)!--" (1 "< b"))
("--[ \t\n]*\\(>\\)" (1 "> b"))
@@ -305,7 +322,7 @@ Any terminating `>' or `/' is not matched.")
;; going to change, so as not to need to flush the data we just computed.
("\"" (0 (if (prog1 (zerop (car (syntax-ppss (match-beginning 0))))
(goto-char (match-end 0)))
- "."))))
+ (string-to-syntax ".")))))
"Syntactic keywords for `sgml-mode'.")
;; internal
@@ -364,14 +381,6 @@ an optional alist of possible values."
(string :tag "Description")))
:group 'sgml)
-(defcustom sgml-xml-mode nil
- "When non-nil, tag insertion functions will be XML-compliant.
-It is set to be buffer-local when the file has
-a DOCTYPE or an XML declaration."
- :type 'boolean
- :version "22.1"
- :group 'sgml)
-
(defvar sgml-empty-tags nil
"List of tags whose !ELEMENT definition says EMPTY.")
@@ -463,47 +472,39 @@ Do \\[describe-key] on the following bindings to discover what they do.
;; A start or end tag by itself on a line separates a paragraph.
;; This is desirable because SGML discards a newline that appears
;; immediately after a start tag or immediately before an end tag.
- (set (make-local-variable 'paragraph-start) (concat "[ \t]*$\\|\
+ (setq-local paragraph-start (concat "[ \t]*$\\|\
\[ \t]*</?\\(" sgml-name-re sgml-attrs-re "\\)?>"))
- (set (make-local-variable 'paragraph-separate)
- (concat paragraph-start "$"))
- (set (make-local-variable 'adaptive-fill-regexp) "[ \t]*")
+ (setq-local paragraph-separate (concat paragraph-start "$"))
+ (setq-local adaptive-fill-regexp "[ \t]*")
(add-hook 'fill-nobreak-predicate 'sgml-fill-nobreak nil t)
- (set (make-local-variable 'indent-line-function) 'sgml-indent-line)
- (set (make-local-variable 'comment-start) "<!-- ")
- (set (make-local-variable 'comment-end) " -->")
- (set (make-local-variable 'comment-indent-function) 'sgml-comment-indent)
- (set (make-local-variable 'comment-line-break-function)
- 'sgml-comment-indent-new-line)
- (set (make-local-variable 'skeleton-further-elements)
- '((completion-ignore-case t)))
- (set (make-local-variable 'skeleton-end-hook)
- (lambda ()
- (or (eolp)
- (not (or (eq v2 '\n) (eq (car-safe v2) '\n)))
- (newline-and-indent))))
- (set (make-local-variable 'font-lock-defaults)
- '((sgml-font-lock-keywords
- sgml-font-lock-keywords-1
- sgml-font-lock-keywords-2)
- nil t))
- (set (make-local-variable 'syntax-propertize-function)
- sgml-syntax-propertize-function)
- (set (make-local-variable 'facemenu-add-face-function)
- 'sgml-mode-facemenu-add-face-function)
- (set (make-local-variable 'sgml-xml-mode) (sgml-xml-guess))
- (if sgml-xml-mode
- ()
- (set (make-local-variable 'skeleton-transformation-function)
- sgml-transformation-function))
+ (setq-local indent-line-function 'sgml-indent-line)
+ (setq-local comment-start "<!-- ")
+ (setq-local comment-end " -->")
+ (setq-local comment-indent-function 'sgml-comment-indent)
+ (setq-local comment-line-break-function 'sgml-comment-indent-new-line)
+ (setq-local skeleton-further-elements '((completion-ignore-case t)))
+ (setq-local skeleton-end-hook
+ (lambda ()
+ (or (eolp)
+ (not (or (eq v2 '\n) (eq (car-safe v2) '\n)))
+ (newline-and-indent))))
+ (setq font-lock-defaults '((sgml-font-lock-keywords
+ sgml-font-lock-keywords-1
+ sgml-font-lock-keywords-2)
+ nil t))
+ (setq-local syntax-propertize-function sgml-syntax-propertize-function)
+ (setq-local facemenu-add-face-function 'sgml-mode-facemenu-add-face-function)
+ (setq-local sgml-xml-mode (sgml-xml-guess))
+ (unless sgml-xml-mode
+ (setq-local skeleton-transformation-function sgml-transformation-function))
;; This will allow existing comments within declarations to be
;; recognized.
;; I can't find a clear description of SGML/XML comments, but it seems that
;; the only reliable ones are <!-- ... --> although it's not clear what
;; "..." can contain. It used to accept -- ... -- as well, but that was
;; apparently a mistake.
- (set (make-local-variable 'comment-start-skip) "<!--[ \t]*")
- (set (make-local-variable 'comment-end-skip) "[ \t]*--[ \t\n]*>")
+ (setq-local comment-start-skip "<!--[ \t]*")
+ (setq-local comment-end-skip "[ \t]*--[ \t\n]*>")
;; This definition has an HTML leaning but probably fits well for other modes.
(setq imenu-generic-expression
`((nil
@@ -643,10 +644,8 @@ This only works for Latin-1 input."
(define-skeleton sgml-tag
"Prompt for a tag and insert it, optionally with attributes.
Completion and configuration are done according to `sgml-tag-alist'.
-If you like tags and attributes in uppercase do \\[set-variable]
-`skeleton-transformation-function' RET `upcase' RET, or put this
-in your `.emacs':
- (setq sgml-transformation-function 'upcase)"
+If you like tags and attributes in uppercase, customize
+`sgml-transformation-function' to 'upcase."
(funcall (or skeleton-transformation-function 'identity)
(setq sgml-tag-last
(completing-read
@@ -671,13 +670,13 @@ in your `.emacs':
(if (eq v2 t) (setq v2 nil))
;; We use `identity' to prevent skeleton from passing
;; `str' through `skeleton-transformation-function' a second time.
- '(("") v2 _ v2 "</" (identity ',str) ?>))
+ '(("") v2 _ v2 "</" (identity ',str) ?> >))
((eq (car v2) t)
(cons '("") (cdr v2)))
(t
(append '(("") (car v2))
(cdr v2)
- '(resume: (car v2) _ "</" (identity ',str) ?>))))))
+ '(resume: (car v2) _ "</" (identity ',str) ?> >))))))
(autoload 'skeleton-read "skeleton")
@@ -982,10 +981,10 @@ With prefix argument ARG, repeat this ARG times."
(unwind-protect
(save-excursion
(goto-char (point-min))
- (if (set (make-local-variable 'sgml-tags-invisible)
- (if arg
- (>= (prefix-numeric-value arg) 0)
- (not sgml-tags-invisible)))
+ (if (setq-local sgml-tags-invisible
+ (if arg
+ (>= (prefix-numeric-value arg) 0)
+ (not sgml-tags-invisible)))
(while (re-search-forward sgml-tag-name-re nil t)
(setq string
(cdr (assq (intern-soft (downcase (match-string 1)))
@@ -1564,8 +1563,7 @@ Add this to `sgml-mode-hook' for convenience."
(goto-char (point-min))
(if (re-search-forward "^\\([ \t]+\\)<" 500 'noerror)
(progn
- (set (make-local-variable 'sgml-basic-offset)
- (1- (current-column)))
+ (setq-local sgml-basic-offset (1- (current-column)))
(message "Guessed sgml-basic-offset = %d"
sgml-basic-offset)
))))
@@ -1935,12 +1933,25 @@ This takes effect when first loading the library.")
("ul" . "Unordered list")
("var" . "Math variable face")
("wbr" . "Enable <br> within <nobr>"))
- "Value of `sgml-tag-help' for HTML mode.")
+ "Value of variable `sgml-tag-help' for HTML mode.")
(defvar outline-regexp)
(defvar outline-heading-end-regexp)
(defvar outline-level)
+(defun html-current-defun-name ()
+ "Return the name of the last HTML title or heading, or nil."
+ (save-excursion
+ (if (re-search-backward
+ (concat
+ "<[ \t\r\n]*"
+ "\\(?:[hH][0-6]\\|title\\|TITLE\\|Title\\)"
+ "[^>]*>"
+ "[ \t\r\n]*"
+ "\\([^<\r\n]*[^ <\t\r\n]+\\)")
+ nil t)
+ (match-string-no-properties 1))))
+
;;;###autoload
(define-derived-mode html-mode sgml-mode '(sgml-xml-mode "XHTML" "HTML")
@@ -1979,33 +1990,29 @@ To work around that, do:
(eval-after-load \"sgml-mode\" '(aset sgml-char-names ?' nil))
\\{html-mode-map}"
- (set (make-local-variable 'sgml-display-text) html-display-text)
- (set (make-local-variable 'sgml-tag-face-alist) html-tag-face-alist)
- (make-local-variable 'sgml-tag-alist)
- (make-local-variable 'sgml-face-tag-alist)
- (make-local-variable 'sgml-tag-help)
- (make-local-variable 'outline-regexp)
- (make-local-variable 'outline-heading-end-regexp)
- (make-local-variable 'outline-level)
- (make-local-variable 'sentence-end-base)
- (setq sentence-end-base "[.?!][]\"'â€)}]*\\(<[^>]*>\\)*"
- sgml-tag-alist html-tag-alist
- sgml-face-tag-alist html-face-tag-alist
- sgml-tag-help html-tag-help
- outline-regexp "^.*<[Hh][1-6]\\>"
- outline-heading-end-regexp "</[Hh][1-6]>"
- outline-level (lambda ()
- (char-before (match-end 0))))
+ (setq-local sgml-display-text html-display-text)
+ (setq-local sgml-tag-face-alist html-tag-face-alist)
+ (setq-local sgml-tag-alist html-tag-alist)
+ (setq-local sgml-face-tag-alist html-face-tag-alist)
+ (setq-local sgml-tag-help html-tag-help)
+ (setq-local outline-regexp "^.*<[Hh][1-6]\\>")
+ (setq-local outline-heading-end-regexp "</[Hh][1-6]>")
+ (setq-local outline-level
+ (lambda () (char-before (match-end 0))))
+ (setq-local add-log-current-defun-function #'html-current-defun-name)
+ (setq-local sentence-end-base "[.?!][]\"'â€)}]*\\(<[^>]*>\\)*")
+
(setq imenu-create-index-function 'html-imenu-index)
- (set (make-local-variable 'sgml-empty-tags)
- ;; From HTML-4.01's loose.dtd, parsed with `sgml-parse-dtd',
- ;; plus manual addition of "wbr".
- '("area" "base" "basefont" "br" "col" "frame" "hr" "img" "input"
- "isindex" "link" "meta" "param" "wbr"))
- (set (make-local-variable 'sgml-unclosed-tags)
- ;; From HTML-4.01's loose.dtd, parsed with `sgml-parse-dtd'.
- '("body" "colgroup" "dd" "dt" "head" "html" "li" "option"
- "p" "tbody" "td" "tfoot" "th" "thead" "tr"))
+
+ (setq-local sgml-empty-tags
+ ;; From HTML-4.01's loose.dtd, parsed with
+ ;; `sgml-parse-dtd', plus manual addition of "wbr".
+ '("area" "base" "basefont" "br" "col" "frame" "hr" "img" "input"
+ "isindex" "link" "meta" "param" "wbr"))
+ (setq-local sgml-unclosed-tags
+ ;; From HTML-4.01's loose.dtd, parsed with `sgml-parse-dtd'.
+ '("body" "colgroup" "dd" "dt" "head" "html" "li" "option"
+ "p" "tbody" "td" "tfoot" "th" "thead" "tr"))
;; It's for the user to decide if it defeats it or not -stef
;; (make-local-variable 'imenu-sort-function)
;; (setq imenu-sort-function nil) ; sorting the menu defeats the purpose
diff --git a/lisp/textmodes/table.el b/lisp/textmodes/table.el
index 411604088ae..4d8a74323c7 100644
--- a/lisp/textmodes/table.el
+++ b/lisp/textmodes/table.el
@@ -5215,7 +5215,7 @@ instead of the current buffer and returns the OBJECT."
"Update cell face according to the current mode."
(if (featurep 'xemacs)
(set-face-property 'table-cell 'underline table-fixed-width-mode)
- (set-face-inverse-video-p 'table-cell table-fixed-width-mode)))
+ (set-face-inverse-video 'table-cell table-fixed-width-mode)))
(table--update-cell-face)
diff --git a/lisp/textmodes/tex-mode.el b/lisp/textmodes/tex-mode.el
index db012e5cf9b..7b16262233d 100644
--- a/lisp/textmodes/tex-mode.el
+++ b/lisp/textmodes/tex-mode.el
@@ -271,9 +271,7 @@ otherwise the value of `tex-start-options', the \(shell-quoted\)
value of `tex-start-commands', and the file name are added at the end
with blanks as separators.
-In TeX, LaTeX, and SliTeX Mode this variable becomes buffer local.
-In these modes, use \\[set-variable] if you want to change it for the
-current buffer.")
+In TeX, LaTeX, and SliTeX Mode this variable becomes buffer local.")
(defvar tex-trailer nil
"String appended after the end of a region sent to TeX by \\[tex-region].")
@@ -421,6 +419,17 @@ An alternative value is \" . \", if you use a font with a narrow period."
(if (looking-at latex-outline-regexp)
(1+ (or (cdr (assoc (match-string 1) latex-section-alist)) -1))
1000))
+
+(defun tex-current-defun-name ()
+ "Return the name of the TeX section/paragraph/chapter at point, or nil."
+ (save-excursion
+ (when (re-search-backward
+ "\\\\\\(sub\\)*\\(section\\|paragraph\\|chapter\\)"
+ nil t)
+ (goto-char (match-beginning 0))
+ (buffer-substring-no-properties
+ (1+ (point)) ; without initial backslash
+ (line-end-position)))))
;;;;
;;;; Font-Lock support
@@ -1062,10 +1071,10 @@ tex-show-queue-command
Entering Plain-tex mode runs the hook `text-mode-hook', then the hook
`tex-mode-hook', and finally the hook `plain-tex-mode-hook'. When the
special subshell is initiated, the hook `tex-shell-hook' is run."
- (set (make-local-variable 'tex-command) tex-run-command)
- (set (make-local-variable 'tex-start-of-header) "%\\*\\*start of header")
- (set (make-local-variable 'tex-end-of-header) "%\\*\\*end of header")
- (set (make-local-variable 'tex-trailer) "\\bye\n"))
+ (setq-local tex-command tex-run-command)
+ (setq-local tex-start-of-header "%\\*\\*start of header")
+ (setq-local tex-end-of-header "%\\*\\*end of header")
+ (setq-local tex-trailer "\\bye\n"))
;;;###autoload
(define-derived-mode latex-mode tex-mode "LaTeX"
@@ -1108,11 +1117,10 @@ tex-show-queue-command
Entering Latex mode runs the hook `text-mode-hook', then
`tex-mode-hook', and finally `latex-mode-hook'. When the special
subshell is initiated, `tex-shell-hook' is run."
- (set (make-local-variable 'tex-command) latex-run-command)
- (set (make-local-variable 'tex-start-of-header)
- "\\\\document\\(style\\|class\\)")
- (set (make-local-variable 'tex-end-of-header) "\\\\begin\\s-*{document}")
- (set (make-local-variable 'tex-trailer) "\\end{document}\n")
+ (setq-local tex-command latex-run-command)
+ (setq-local tex-start-of-header "\\\\document\\(style\\|class\\)")
+ (setq-local tex-end-of-header "\\\\begin\\s-*{document}")
+ (setq-local tex-trailer "\\end{document}\n")
;; A line containing just $$ is treated as a paragraph separator.
;; A line starting with $$ starts a paragraph,
;; but does not separate paragraphs if it has more stuff on it.
@@ -1138,18 +1146,17 @@ subshell is initiated, `tex-shell-hook' is run."
"marginpar" "parbox" "caption"))
"\\|\\$\\$\\|[a-z]*\\(space\\|skip\\|page[a-z]*\\)"
"\\>\\)[ \t]*\\($\\|%\\)\\)"))
- (set (make-local-variable 'imenu-create-index-function)
- 'latex-imenu-create-index)
- (set (make-local-variable 'tex-face-alist) tex-latex-face-alist)
+ (setq-local imenu-create-index-function 'latex-imenu-create-index)
+ (setq-local tex-face-alist tex-latex-face-alist)
(add-hook 'fill-nobreak-predicate 'latex-fill-nobreak-predicate nil t)
- (set (make-local-variable 'indent-line-function) 'latex-indent)
- (set (make-local-variable 'fill-indent-according-to-mode) t)
+ (setq-local indent-line-function 'latex-indent)
+ (setq-local fill-indent-according-to-mode t)
(add-hook 'completion-at-point-functions
'latex-complete-data nil 'local)
- (set (make-local-variable 'outline-regexp) latex-outline-regexp)
- (set (make-local-variable 'outline-level) 'latex-outline-level)
- (set (make-local-variable 'forward-sexp-function) 'latex-forward-sexp)
- (set (make-local-variable 'skeleton-end-hook) nil))
+ (setq-local outline-regexp latex-outline-regexp)
+ (setq-local outline-level 'latex-outline-level)
+ (setq-local forward-sexp-function 'latex-forward-sexp)
+ (setq-local skeleton-end-hook nil))
;;;###autoload
(define-derived-mode slitex-mode latex-mode "SliTeX"
@@ -1198,39 +1205,36 @@ Entering SliTeX mode runs the hook `text-mode-hook', then the hook
(defun tex-common-initialization ()
;; Regexp isearch should accept newline and formfeed as whitespace.
- (set (make-local-variable 'search-whitespace-regexp) "[ \t\r\n\f]+")
+ (setq-local search-whitespace-regexp "[ \t\r\n\f]+")
;; A line containing just $$ is treated as a paragraph separator.
- (set (make-local-variable 'paragraph-start)
- "[ \t]*$\\|[\f\\\\%]\\|[ \t]*\\$\\$")
+ (setq-local paragraph-start "[ \t]*$\\|[\f\\\\%]\\|[ \t]*\\$\\$")
;; A line starting with $$ starts a paragraph,
;; but does not separate paragraphs if it has more stuff on it.
- (set (make-local-variable 'paragraph-separate)
- "[ \t]*$\\|[\f\\\\%]\\|[ \t]*\\$\\$[ \t]*$")
- (set (make-local-variable 'comment-start) "%")
- (set (make-local-variable 'comment-add) 1)
- (set (make-local-variable 'comment-start-skip)
- "\\(\\(^\\|[^\\\n]\\)\\(\\\\\\\\\\)*\\)\\(%+ *\\)")
- (set (make-local-variable 'parse-sexp-ignore-comments) t)
- (set (make-local-variable 'compare-windows-whitespace)
- 'tex-categorize-whitespace)
- (set (make-local-variable 'facemenu-add-face-function)
- 'tex-facemenu-add-face-function)
- (set (make-local-variable 'facemenu-end-add-face) "}")
- (set (make-local-variable 'facemenu-remove-face-function) t)
- (set (make-local-variable 'font-lock-defaults)
- '((tex-font-lock-keywords tex-font-lock-keywords-1
- tex-font-lock-keywords-2 tex-font-lock-keywords-3)
- nil nil nil nil
- ;; Who ever uses that anyway ???
- (font-lock-mark-block-function . mark-paragraph)
- (font-lock-syntactic-face-function
- . tex-font-lock-syntactic-face-function)
- (font-lock-unfontify-region-function
- . tex-font-lock-unfontify-region)))
- (set (make-local-variable 'syntax-propertize-function)
- (syntax-propertize-rules latex-syntax-propertize-rules))
+ (setq-local paragraph-separate "[ \t]*$\\|[\f\\\\%]\\|[ \t]*\\$\\$[ \t]*$")
+ (setq-local add-log-current-defun-function #'tex-current-defun-name)
+ (setq-local comment-start "%")
+ (setq-local comment-add 1)
+ (setq-local comment-start-skip
+ "\\(\\(^\\|[^\\\n]\\)\\(\\\\\\\\\\)*\\)\\(%+ *\\)")
+ (setq-local parse-sexp-ignore-comments t)
+ (setq-local compare-windows-whitespace 'tex-categorize-whitespace)
+ (setq-local facemenu-add-face-function 'tex-facemenu-add-face-function)
+ (setq-local facemenu-end-add-face "}")
+ (setq-local facemenu-remove-face-function t)
+ (setq-local font-lock-defaults
+ '((tex-font-lock-keywords tex-font-lock-keywords-1
+ tex-font-lock-keywords-2 tex-font-lock-keywords-3)
+ nil nil nil nil
+ ;; Who ever uses that anyway ???
+ (font-lock-mark-block-function . mark-paragraph)
+ (font-lock-syntactic-face-function
+ . tex-font-lock-syntactic-face-function)
+ (font-lock-unfontify-region-function
+ . tex-font-lock-unfontify-region)))
+ (setq-local syntax-propertize-function
+ (syntax-propertize-rules latex-syntax-propertize-rules))
;; TABs in verbatim environments don't do what you think.
- (set (make-local-variable 'indent-tabs-mode) nil)
+ (setq-local indent-tabs-mode nil)
;; Other vars that should be buffer-local.
(make-local-variable 'tex-command)
(make-local-variable 'tex-start-of-header)
@@ -1523,8 +1527,7 @@ Puts point on a blank line between them."
(looking-at bibtex-reference-key))
(push (match-string-no-properties 0) keys)))))
;; Fill the cache.
- (set (make-local-variable 'latex-complete-bibtex-cache)
- (list files key keys)))
+ (setq-local latex-complete-bibtex-cache (list files key keys)))
(complete-with-action action keys key pred)))))
(defun latex-complete-envnames ()
@@ -1885,8 +1888,7 @@ Mark is left at original location."
;; The utility functions:
(define-derived-mode tex-shell shell-mode "TeX-Shell"
- (set (make-local-variable 'compilation-error-regexp-alist)
- tex-error-regexp-alist)
+ (setq-local compilation-error-regexp-alist tex-error-regexp-alist)
(compilation-shell-minor-mode t))
;;;###autoload
@@ -2099,8 +2101,7 @@ of the current buffer."
(with-no-warnings
(when (boundp 'TeX-master)
(cond ((stringp TeX-master)
- (make-local-variable 'tex-main-file)
- (setq tex-main-file TeX-master))
+ (setq-local tex-main-file TeX-master))
((and (eq TeX-master t) buffer-file-name)
(file-relative-name buffer-file-name)))))
;; Try to guess the main file.
@@ -2870,8 +2871,8 @@ There might be text before point."
(cons (car x) 'doctex-font-lock-syntactic-face-function))
(_ x)))
(cdr font-lock-defaults))))
- (set (make-local-variable 'syntax-propertize-function)
- (syntax-propertize-rules doctex-syntax-propertize-rules)))
+ (setq-local syntax-propertize-function
+ (syntax-propertize-rules doctex-syntax-propertize-rules)))
(run-hooks 'tex-mode-load-hook)
diff --git a/lisp/textmodes/texinfo.el b/lisp/textmodes/texinfo.el
index abff7f750c5..44e839d2474 100644
--- a/lisp/textmodes/texinfo.el
+++ b/lisp/textmodes/texinfo.el
@@ -33,6 +33,15 @@
;;; Code:
(eval-when-compile (require 'tex-mode))
+(declare-function tex-buffer "tex-mode" ())
+(declare-function tex-region "tex-mode" (beg end))
+(declare-function tex-send-command "tex-mode")
+(declare-function tex-recenter-output-buffer "tex-mode" (linenum))
+(declare-function tex-print "tex-mode" (&optional alt))
+(declare-function tex-view "tex-mode" ())
+(declare-function tex-shell-running "tex-mode" ())
+(declare-function tex-kill-job "tex-mode" ())
+
(defvar outline-heading-alist)
(defgroup texinfo nil
@@ -502,6 +511,12 @@ Subexpression 1 is what goes into the corresponding `@end' statement.")
(regexp-opt (texinfo-filter 2 texinfo-section-list))
"Regular expression matching just the Texinfo chapter level headings.")
+(defun texinfo-current-defun-name ()
+ "Return the name of the Texinfo node at point, or nil."
+ (save-excursion
+ (if (re-search-backward "^@node[ \t]+\\([^,\n]+\\)" nil t)
+ (match-string-no-properties 1))))
+
;;; Texinfo mode
;;;###autoload
@@ -571,66 +586,53 @@ be the first node in the file.
Entering Texinfo mode calls the value of `text-mode-hook', and then the
value of `texinfo-mode-hook'."
- (set (make-local-variable 'page-delimiter)
- (concat
- "^@node [ \t]*[Tt]op\\|^@\\("
- texinfo-chapter-level-regexp
- "\\)\\>"))
- (make-local-variable 'require-final-newline)
- (setq require-final-newline mode-require-final-newline)
- (make-local-variable 'indent-tabs-mode)
- (setq indent-tabs-mode nil)
- (make-local-variable 'paragraph-separate)
- (setq paragraph-separate
- (concat "\b\\|@[a-zA-Z]*[ \n]\\|" paragraph-separate))
- (make-local-variable 'paragraph-start)
- (setq paragraph-start (concat "\b\\|@[a-zA-Z]*[ \n]\\|" paragraph-start))
- (set (make-local-variable 'sentence-end-base)
- "\\(@\\(end\\)?dots{}\\|[.?!]\\)[]\"'â€)}]*")
- (make-local-variable 'fill-column)
- (setq fill-column 70)
- (make-local-variable 'comment-start)
- (setq comment-start "@c ")
- (make-local-variable 'comment-start-skip)
- (setq comment-start-skip "@c +\\|@comment +")
- (make-local-variable 'words-include-escapes)
- (setq words-include-escapes t)
- (make-local-variable 'imenu-generic-expression)
- (setq imenu-generic-expression texinfo-imenu-generic-expression)
+ (setq-local page-delimiter
+ (concat "^@node [ \t]*[Tt]op\\|^@\\("
+ texinfo-chapter-level-regexp
+ "\\)\\>"))
+ (setq-local require-final-newline mode-require-final-newline)
+ (setq-local indent-tabs-mode nil)
+ (setq-local paragraph-separate
+ (concat "\b\\|@[a-zA-Z]*[ \n]\\|"
+ paragraph-separate))
+ (setq-local paragraph-start (concat "\b\\|@[a-zA-Z]*[ \n]\\|"
+ paragraph-start))
+ (setq-local sentence-end-base "\\(@\\(end\\)?dots{}\\|[.?!]\\)[]\"'â€)}]*")
+ (setq-local fill-column 70)
+ (setq-local comment-start "@c ")
+ (setq-local comment-start-skip "@c +\\|@comment +")
+ (setq-local words-include-escapes t)
+ (setq-local imenu-generic-expression texinfo-imenu-generic-expression)
(setq imenu-case-fold-search nil)
- (make-local-variable 'font-lock-defaults)
(setq font-lock-defaults
'(texinfo-font-lock-keywords nil nil nil backward-paragraph))
- (set (make-local-variable 'syntax-propertize-function)
- texinfo-syntax-propertize-function)
- (set (make-local-variable 'parse-sexp-lookup-properties) t)
+ (setq-local syntax-propertize-function texinfo-syntax-propertize-function)
+ (setq-local parse-sexp-lookup-properties t)
+ (setq-local add-log-current-defun-function #'texinfo-current-defun-name)
;; Outline settings.
- (set (make-local-variable 'outline-heading-alist)
- ;; We should merge outline-heading-alist and texinfo-section-list
- ;; but in the mean time, let's just generate one from the other.
- (mapcar (lambda (x) (cons (concat "@" (car x)) (cadr x)))
- texinfo-section-list))
- (set (make-local-variable 'outline-regexp)
- (concat (regexp-opt (mapcar 'car outline-heading-alist) t)
- "\\>"))
-
- (make-local-variable 'tex-start-of-header)
- (setq tex-start-of-header "%\\*\\*start")
- (make-local-variable 'tex-end-of-header)
- (setq tex-end-of-header "%\\*\\*end")
- (make-local-variable 'tex-first-line-header-regexp)
- (setq tex-first-line-header-regexp "^\\\\input")
- (make-local-variable 'tex-trailer)
- (setq tex-trailer "@bye\n")
-
- ;; Prevent filling certain lines, in addition to ones specified
- ;; by the user.
- (let ((prevent-filling "^@\\(def\\|multitable\\)"))
- (set (make-local-variable 'auto-fill-inhibit-regexp)
- (if (null auto-fill-inhibit-regexp)
- prevent-filling
- (concat auto-fill-inhibit-regexp "\\|" prevent-filling)))))
+ (setq-local outline-heading-alist
+ ;; We should merge `outline-heading-alist' and
+ ;; `texinfo-section-list'. But in the mean time, let's
+ ;; just generate one from the other.
+ (mapcar (lambda (x) (cons (concat "@" (car x)) (cadr x)))
+ texinfo-section-list))
+ (setq-local outline-regexp
+ (concat (regexp-opt (mapcar 'car outline-heading-alist) t)
+ "\\>"))
+
+ (setq-local tex-start-of-header "%\\*\\*start")
+ (setq-local tex-end-of-header "%\\*\\*end")
+ (setq-local tex-first-line-header-regexp "^\\\\input")
+ (setq-local tex-trailer "@bye\n")
+
+ ;; Prevent filling certain lines, in addition to ones specified by
+ ;; the user.
+ (setq-local auto-fill-inhibit-regexp
+ (let ((prevent-filling "^@\\(def\\|multitable\\)"))
+ (if (null auto-fill-inhibit-regexp)
+ prevent-filling
+ (concat auto-fill-inhibit-regexp "\\|" prevent-filling)))))
diff --git a/lisp/textmodes/tildify.el b/lisp/textmodes/tildify.el
index 3ba19bb9f40..f25fa87d0ec 100644
--- a/lisp/textmodes/tildify.el
+++ b/lisp/textmodes/tildify.el
@@ -40,7 +40,7 @@
;; The default variable settings are suited for Czech, so do not try to
;; understand them if you are not familiar with Czech grammar and spelling.
;;
-;; The algorithm was inspired by Petr Ol¹ák's program `vlna'. Abilities of
+;; The algorithm was inspired by Petr Olšák's program `vlna'. Abilities of
;; `tildify.el' are a little limited; if you have improvement suggestions, let
;; me know.
@@ -349,7 +349,7 @@ further questions)."
;; Local variables:
-;; coding: iso-latin-2
+;; coding: utf-8
;; End:
;;; tildify.el ends here
diff --git a/lisp/thingatpt.el b/lisp/thingatpt.el
index 8c45659ee4a..f71a0d4647c 100644
--- a/lisp/thingatpt.el
+++ b/lisp/thingatpt.el
@@ -232,7 +232,7 @@ The bounds of THING are determined by `bounds-of-thing-at-point'."
(put 'defun 'end-op 'end-of-defun)
(put 'defun 'forward-op 'end-of-defun)
-;; Filenames and URLs www.com/foo%32bar
+;; Filenames
(defvar thing-at-point-file-name-chars "-~/[:alnum:]_.${}#%,:"
"Characters allowable in filenames.")
@@ -248,94 +248,224 @@ The bounds of THING are determined by `bounds-of-thing-at-point'."
(forward-char)
(goto-char (point-min)))))
+;; URIs
+
+(defvar thing-at-point-beginning-of-url-regexp nil
+ "Regexp matching the beginning of a well-formed URI.
+If nil, construct the regexp from `thing-at-point-uri-schemes'.")
+
(defvar thing-at-point-url-path-regexp
"[^]\t\n \"'<>[^`{}]*[^]\t\n \"'<>[^`{}.,;]+"
- "A regular expression probably matching the host and filename or e-mail part of a URL.")
+ "Regexp matching the host and filename or e-mail part of a URL.")
(defvar thing-at-point-short-url-regexp
(concat "[-A-Za-z0-9]+\\.[-A-Za-z0-9.]+" thing-at-point-url-path-regexp)
- "A regular expression probably matching a URL without an access scheme.
-Hostname matching is stricter in this case than for
-``thing-at-point-url-regexp''.")
+ "Regexp matching a URI without a scheme component.")
(defvar thing-at-point-uri-schemes
;; Officials from http://www.iana.org/assignments/uri-schemes.html
- '("ftp://" "http://" "gopher://" "mailto:" "news:" "nntp:"
- "telnet://" "wais://" "file:/" "prospero:" "z39.50s:" "z39.50r:"
- "cid:" "mid:" "vemmi:" "service:" "imap:" "nfs:" "acap:" "rtsp:"
- "tip:" "pop:" "data:" "dav:" "opaquelocktoken:" "sip:" "tel:" "fax:"
- "modem:" "ldap:" "https://" "soap.beep:" "soap.beeps:" "urn:" "go:"
- "afs:" "tn3270:" "mailserver:"
- "crid:" "dict:" "dns:" "dtn:" "h323:" "im:" "info:" "ipp:"
- "iris.beep:" "mtqp:" "mupdate:" "pres:" "sips:" "snmp:" "tag:"
- "tftp:" "xmlrpc.beep:" "xmlrpc.beeps:" "xmpp:"
- ;; Compatibility
- "snews:" "irc:" "mms://" "mmsh://")
- "Uniform Resource Identifier (URI) Schemes.")
-
-(defvar thing-at-point-url-regexp
- (concat "\\<\\(" (mapconcat 'identity thing-at-point-uri-schemes "\\|") "\\)"
- thing-at-point-url-path-regexp)
- "A regular expression probably matching a complete URL.")
-
-(defvar thing-at-point-markedup-url-regexp
- "<URL:[^>]+>"
- "A regular expression matching a URL marked up per RFC1738.
-This may contain whitespace (including newlines) .")
+ '("aaa://" "about:" "acap://" "apt:" "bzr://" "bzr+ssh://"
+ "attachment:/" "chrome://" "cid:" "content://" "crid://" "cvs://"
+ "data:" "dav:" "dict://" "doi:" "dns:" "dtn:" "feed:" "file:/"
+ "finger://" "fish://" "ftp://" "geo:" "git://" "go:" "gopher://"
+ "h323:" "http://" "https://" "im:" "imap://" "info:" "ipp:"
+ "irc://" "irc6://" "ircs://" "iris.beep:" "jar:" "ldap://"
+ "ldaps://" "mailto:" "mid:" "mtqp://" "mupdate://" "news:"
+ "nfs://" "nntp://" "opaquelocktoken:" "pop://" "pres:"
+ "resource://" "rmi://" "rsync://" "rtsp://" "rtspu://" "service:"
+ "sftp://" "sip:" "sips:" "smb://" "sms:" "snmp://" "soap.beep://"
+ "soap.beeps://" "ssh://" "svn://" "svn+ssh://" "tag:" "tel:"
+ "telnet://" "tftp://" "tip://" "tn3270://" "udp://" "urn:"
+ "uuid:" "vemmi://" "webcal://" "xri://" "xmlrpc.beep://"
+ "xmlrpc.beeps://" "z39.50r://" "z39.50s://" "xmpp:"
+ ;; Compatibility
+ "fax:" "mms://" "mmsh://" "modem:" "prospero:" "snews:"
+ "wais://")
+ "List of URI schemes recognized by `thing-at-point-url-at-point'.
+Each string in this list should correspond to the start of a
+URI's scheme component, up to and including the trailing // if
+the scheme calls for that to be present.")
+
+(defvar thing-at-point-markedup-url-regexp "<URL:\\([^<>\n]+\\)>"
+ "Regexp matching a URL marked up per RFC1738.
+This kind of markup was formerly recommended as a way to indicate
+URIs, but as of RFC 3986 it is no longer recommended.
+Subexpression 1 should contain the delimited URL.")
+
+(defvar thing-at-point-newsgroup-regexp
+ "\\`[[:lower:]]+\\.[-+[:lower:]_0-9.]+\\'"
+ "Regexp matching a newsgroup name.")
+
+(defvar thing-at-point-newsgroup-heads
+ '("alt" "comp" "gnu" "misc" "news" "sci" "soc" "talk")
+ "Used by `thing-at-point-newsgroup-p' if gnus is not running.")
+
+(defvar thing-at-point-default-mail-uri-scheme "mailto"
+ "Default scheme for ill-formed URIs that look like <foo@example.com>.
+If nil, do not give such URIs a scheme.")
(put 'url 'bounds-of-thing-at-point 'thing-at-point-bounds-of-url-at-point)
-(defun thing-at-point-bounds-of-url-at-point ()
- (let ((strip (thing-at-point-looking-at
- thing-at-point-markedup-url-regexp))) ;; (url "") short
- (if (or strip
- (thing-at-point-looking-at thing-at-point-url-regexp)
- ;; Access scheme omitted?
- ;; (setq short (thing-at-point-looking-at
- ;; thing-at-point-short-url-regexp))
- )
- (let ((beginning (match-beginning 0))
- (end (match-end 0)))
- (when strip
- (setq beginning (+ beginning 5))
- (setq end (- end 1)))
- (cons beginning end)))))
+
+(defun thing-at-point-bounds-of-url-at-point (&optional lax)
+ "Return a cons cell containing the start and end of the URI at point.
+Try to find a URI using `thing-at-point-markedup-url-regexp'.
+If that fails, try with `thing-at-point-beginning-of-url-regexp'.
+If that also fails, and optional argument LAX is non-nil, return
+the bounds of a possible ill-formed URI (one lacking a scheme)."
+ ;; Look for the old <URL:foo> markup. If found, use it.
+ (or (thing-at-point--bounds-of-markedup-url)
+ ;; Otherwise, find the bounds within which a URI may exist. The
+ ;; method is similar to `ffap-string-at-point'. Note that URIs
+ ;; may contain parentheses but may not contain spaces (RFC3986).
+ (let* ((allowed-chars "--:=&?$+@-Z_[:alpha:]~#,%;*()!'")
+ (skip-before "^[0-9a-zA-Z]")
+ (skip-after ":;.,!?")
+ (pt (point))
+ (beg (save-excursion
+ (skip-chars-backward allowed-chars)
+ (skip-chars-forward skip-before pt)
+ (point)))
+ (end (save-excursion
+ (skip-chars-forward allowed-chars)
+ (skip-chars-backward skip-after pt)
+ (point))))
+ (or (thing-at-point--bounds-of-well-formed-url beg end pt)
+ (if lax (cons beg end))))))
+
+(defun thing-at-point--bounds-of-markedup-url ()
+ (when thing-at-point-markedup-url-regexp
+ (let ((case-fold-search t)
+ (pt (point))
+ (beg (line-beginning-position))
+ (end (line-end-position))
+ found)
+ (save-excursion
+ (goto-char beg)
+ (while (and (not found)
+ (<= (point) pt)
+ (< (point) end))
+ (and (re-search-forward thing-at-point-markedup-url-regexp
+ end 1)
+ (> (point) pt)
+ (setq found t))))
+ (if found
+ (cons (match-beginning 1) (match-end 1))))))
+
+(defun thing-at-point--bounds-of-well-formed-url (beg end pt)
+ (save-excursion
+ (goto-char beg)
+ (let (url-beg paren-end regexp)
+ (save-restriction
+ (narrow-to-region beg end)
+ ;; The scheme component must either match at BEG, or have no
+ ;; other alphanumerical ASCII characters before it.
+ (setq regexp (concat "\\(?:\\`\\|[^a-zA-Z0-9]\\)\\("
+ (or thing-at-point-beginning-of-url-regexp
+ (regexp-opt thing-at-point-uri-schemes))
+ "\\)"))
+ (and (re-search-forward regexp end t)
+ ;; URI must have non-empty contents.
+ (< (point) end)
+ (setq url-beg (match-beginning 1))))
+ (when url-beg
+ ;; If there is an open paren before the URI, truncate to the
+ ;; matching close paren.
+ (and (> url-beg (point-min))
+ (eq (car-safe (syntax-after (1- url-beg))) 4)
+ (save-restriction
+ (narrow-to-region (1- url-beg) (min end (point-max)))
+ (setq paren-end (ignore-errors
+ (scan-lists (1- url-beg) 1 0))))
+ (not (blink-matching-check-mismatch (1- url-beg) paren-end))
+ (setq end (1- paren-end)))
+ (cons url-beg end)))))
(put 'url 'thing-at-point 'thing-at-point-url-at-point)
-(defun thing-at-point-url-at-point ()
- "Return the URL around or before point.
-Search backwards for the start of a URL ending at or after point. If
-no URL found, return nil. The access scheme will be prepended if
-absent: \"mailto:\" if the string contains \"@\", \"ftp://\" if it
-starts with \"ftp\" and not \"ftp:/\", or \"http://\" by default."
-
- (let ((url "") short strip)
- (if (or (setq strip (thing-at-point-looking-at
- thing-at-point-markedup-url-regexp))
- (thing-at-point-looking-at thing-at-point-url-regexp)
- ;; Access scheme omitted?
- (setq short (thing-at-point-looking-at
- thing-at-point-short-url-regexp)))
- (progn
- (setq url (buffer-substring-no-properties (match-beginning 0)
- (match-end 0)))
- (and strip (setq url (substring url 5 -1))) ; Drop "<URL:" & ">"
- ;; strip whitespace
- (while (string-match "[ \t\n\r]+" url)
- (setq url (replace-match "" t t url)))
- (and short (setq url (concat (cond ((string-match "^[a-zA-Z]+:" url)
- ;; already has a URL scheme.
- "")
- ((string-match "@" url)
- "mailto:")
- ;; e.g. ftp.swiss... or ftp-swiss...
- ((string-match "^ftp" url)
- "ftp://")
- (t "http://"))
- url)))
- (if (string-equal "" url)
- nil
- url)))))
+(defun thing-at-point-url-at-point (&optional lax bounds)
+ "Return the URL around or before point.
+If no URL is found, return nil.
+
+If optional argument LAX is non-nil, look for URLs that are not
+well-formed, such as foo@bar or <nobody>.
+
+If optional arguments BOUNDS are non-nil, it should be a cons
+cell of the form (START . END), containing the beginning and end
+positions of the URI. Otherwise, these positions are detected
+automatically from the text around point.
+
+If the scheme component is absent, either because a URI delimited
+with <url:...> lacks one, or because an ill-formed URI was found
+with LAX or BEG and END, try to add a scheme in the returned URI.
+The scheme is chosen heuristically: \"mailto:\" if the address
+looks like an email address, \"ftp://\" if it starts with
+\"ftp\", etc."
+ (unless bounds
+ (setq bounds (thing-at-point-bounds-of-url-at-point lax)))
+ (when (and bounds (< (car bounds) (cdr bounds)))
+ (let ((str (buffer-substring-no-properties (car bounds) (cdr bounds))))
+ ;; If there is no scheme component, try to add one.
+ (unless (string-match "\\`[a-zA-Z][-a-zA-Z0-9+.]*:" str)
+ (or
+ ;; If the URI has the form <foo@bar>, treat it according to
+ ;; `thing-at-point-default-mail-uri-scheme'. If there are
+ ;; no angle brackets, it must be mailto.
+ (when (string-match "\\`[^:</>@]+@[-.0-9=&?$+A-Z_a-z~#,%;*]" str)
+ (let ((scheme (if (and (eq (char-before (car bounds)) ?<)
+ (eq (char-after (cdr bounds)) ?>))
+ thing-at-point-default-mail-uri-scheme
+ "mailto")))
+ (if scheme
+ (setq str (concat scheme ":" str)))))
+ ;; If the string is like <FOO>, where FOO is an existing user
+ ;; name on the system, treat that as an email address.
+ (and (string-match "\\`[[:alnum:]]+\\'" str)
+ (eq (char-before (car bounds)) ?<)
+ (eq (char-after (cdr bounds)) ?>)
+ (not (string-match "~" (expand-file-name (concat "~" str))))
+ (setq str (concat "mailto:" str)))
+ ;; If it looks like news.example.com, treat it as news.
+ (if (thing-at-point-newsgroup-p str)
+ (setq str (concat "news:" str)))
+ ;; If it looks like ftp.example.com. treat it as ftp.
+ (if (string-match "\\`ftp\\." str)
+ (setq str (concat "ftp://" str)))
+ ;; If it looks like www.example.com. treat it as http.
+ (if (string-match "\\`www\\." str)
+ (setq str (concat "http://" str)))
+ ;; Otherwise, it just isn't a URI.
+ (setq str nil)))
+ str)))
+
+(defun thing-at-point-newsgroup-p (string)
+ "Return STRING if it looks like a newsgroup name, else nil."
+ (and
+ (string-match thing-at-point-newsgroup-regexp string)
+ (let ((htbs '(gnus-active-hashtb gnus-newsrc-hashtb gnus-killed-hashtb))
+ (heads thing-at-point-newsgroup-heads)
+ htb ret)
+ (while htbs
+ (setq htb (car htbs) htbs (cdr htbs))
+ (condition-case nil
+ (progn
+ ;; errs: htb symbol may be unbound, or not a hash-table.
+ ;; gnus-gethash is just a macro for intern-soft.
+ (and (symbol-value htb)
+ (intern-soft string (symbol-value htb))
+ (setq ret string htbs nil))
+ ;; If we made it this far, gnus is running, so ignore "heads":
+ (setq heads nil))
+ (error nil)))
+ (or ret (not heads)
+ (let ((head (string-match "\\`\\([[:lower:]]+\\)\\." string)))
+ (and head (setq head (substring string 0 (match-end 1)))
+ (member head heads)
+ (setq ret string))))
+ ret)))
+
+(put 'url 'end-op (lambda () (end-of-thing 'url)))
+
+(put 'url 'beginning-op (lambda () (end-of-thing 'url)))
;; The normal thingatpt mechanism doesn't work for complex regexps.
;; This should work for almost any regexp wherever we are in the
@@ -372,19 +502,6 @@ point."
(goto-char match)
(looking-at regexp)))))
-(put 'url 'end-op
- (lambda ()
- (let ((bounds (thing-at-point-bounds-of-url-at-point)))
- (if bounds
- (goto-char (cdr bounds))
- (error "No URL here")))))
-(put 'url 'beginning-op
- (lambda ()
- (let ((bounds (thing-at-point-bounds-of-url-at-point)))
- (if bounds
- (goto-char (car bounds))
- (error "No URL here")))))
-
;; Email addresses
(defvar thing-at-point-email-regexp
"<?[-+_.~a-zA-Z][-+_.~:a-zA-Z0-9]*@[-.a-zA-Z0-9]+>?"
@@ -412,60 +529,11 @@ with angle brackets.")
(buffer-substring-no-properties
(car boundary-pair) (cdr boundary-pair))))))
-;; Whitespace
-
-(defun forward-whitespace (arg)
- "Move point to the end of the next sequence of whitespace chars.
-Each such sequence may be a single newline, or a sequence of
-consecutive space and/or tab characters.
-With prefix argument ARG, do it ARG times if positive, or move
-backwards ARG times if negative."
- (interactive "p")
- (if (natnump arg)
- (re-search-forward "[ \t]+\\|\n" nil 'move arg)
- (while (< arg 0)
- (if (re-search-backward "[ \t]+\\|\n" nil 'move)
- (or (eq (char-after (match-beginning 0)) ?\n)
- (skip-chars-backward " \t")))
- (setq arg (1+ arg)))))
-
;; Buffer
(put 'buffer 'end-op (lambda () (goto-char (point-max))))
(put 'buffer 'beginning-op (lambda () (goto-char (point-min))))
-;; Symbols
-
-(defun forward-symbol (arg)
- "Move point to the next position that is the end of a symbol.
-A symbol is any sequence of characters that are in either the
-word constituent or symbol constituent syntax class.
-With prefix argument ARG, do it ARG times if positive, or move
-backwards ARG times if negative."
- (interactive "p")
- (if (natnump arg)
- (re-search-forward "\\(\\sw\\|\\s_\\)+" nil 'move arg)
- (while (< arg 0)
- (if (re-search-backward "\\(\\sw\\|\\s_\\)+" nil 'move)
- (skip-syntax-backward "w_"))
- (setq arg (1+ arg)))))
-
-;; Syntax blocks
-
-(defun forward-same-syntax (&optional arg)
- "Move point past all characters with the same syntax class.
-With prefix argument ARG, do it ARG times if positive, or move
-backwards ARG times if negative."
- (interactive "p")
- (or arg (setq arg 1))
- (while (< arg 0)
- (skip-syntax-backward
- (char-to-string (char-syntax (char-before))))
- (setq arg (1+ arg)))
- (while (> arg 0)
- (skip-syntax-forward (char-to-string (char-syntax (char-after))))
- (setq arg (1- arg))))
-
;; Aliases
(defun word-at-point ()
diff --git a/lisp/tmm.el b/lisp/tmm.el
index 542270a8761..cd91742649d 100644
--- a/lisp/tmm.el
+++ b/lisp/tmm.el
@@ -1,4 +1,4 @@
-;;; tmm.el --- text mode access to menu-bar
+;;; tmm.el --- text mode access to menu-bar -*- lexical-binding: t -*-
;; Copyright (C) 1994-1996, 2000-2013 Free Software Foundation, Inc.
@@ -54,36 +54,37 @@ we make that menu bar item (the one at that position) the default choice."
(interactive)
(run-hooks 'menu-bar-update-hook)
;; Obey menu-bar-final-items; put those items last.
- (let ((menu-bar (tmm-get-keybind [menu-bar]))
+ (let ((menu-bar '())
+ (menu-end '())
menu-bar-item)
- (let ((list menu-bar-final-items))
- (while list
- (let ((item (car list)))
- ;; ITEM is the name of an item that we want to put last.
- ;; Find it in MENU-BAR and move it to the end.
- (let ((this-one (assq item menu-bar)))
- (setq menu-bar (append (delq this-one menu-bar)
- (list this-one)))))
- (setq list (cdr list))))
+ (map-keymap
+ (lambda (key binding)
+ (push (cons key binding)
+ ;; If KEY is the name of an item that we want to put last,
+ ;; move it to the end.
+ (if (memq key menu-bar-final-items)
+ menu-end
+ menu-bar)))
+ (tmm-get-keybind [menu-bar]))
+ (setq menu-bar `(keymap ,@(nreverse menu-bar) ,@(nreverse menu-end)))
(if x-position
- (let ((tail menu-bar) (column 0)
- this-one name visible)
- (while (and tail (<= column x-position))
- (setq this-one (car tail))
- (if (and (consp this-one)
- (consp (cdr this-one))
- (setq name ;simple menu
- (cond ((stringp (nth 1 this-one))
- (nth 1 this-one))
- ;extended menu
- ((stringp (nth 2 this-one))
- (setq visible (plist-get
- (nthcdr 4 this-one) :visible))
- (unless (and visible (not (eval visible)))
- (nth 2 this-one))))))
- (setq column (+ column (length name) 1)))
- (setq tail (cdr tail)))
- (setq menu-bar-item (car this-one))))
+ (let ((column 0))
+ (catch 'done
+ (map-keymap
+ (lambda (key binding)
+ (when (> column x-position)
+ (setq menu-bar-item key)
+ (throw 'done nil))
+ (pcase binding
+ ((or `(,(and (pred stringp) name) . ,_) ;Simple menu item.
+ `(menu-item ,name ,_cmd ;Extended menu item.
+ . ,(and props
+ (guard (let ((visible
+ (plist-get props :visible)))
+ (or (null visible)
+ (eval visible)))))))
+ (setq column (+ column (length name) 1)))))
+ menu-bar))))
(tmm-prompt menu-bar nil menu-bar-item)))
;;;###autoload
@@ -138,6 +139,12 @@ specify nil for this variable."
"Face used for inactive menu items."
:group 'tmm)
+(defun tmm--completion-table (items)
+ (lambda (string pred action)
+ (if (eq action 'metadata)
+ '(metadata (display-sort-function . identity))
+ (complete-with-action action items string pred))))
+
;;;###autoload
(defun tmm-prompt (menu &optional in-popup default-item)
"Text-mode emulation of calling the bindings in keymap.
@@ -174,6 +181,7 @@ Its value should be an event that has a binding in MENU."
((vectorp elt)
(dotimes (i (length elt))
(tmm-get-keymap (cons i (aref elt i)) not-menu))))))
+ (setq tmm-km-list (nreverse tmm-km-list))
;; Choose an element of tmm-km-list; put it in choice.
(if (and not-menu (= 1 (length tmm-km-list)))
;; If this is the top-level of an x-popup-menu menu,
@@ -226,7 +234,7 @@ Its value should be an event that has a binding in MENU."
(completing-read
(concat gl-str
" (up/down to change, PgUp to menu): ")
- tmm-km-list nil t nil
+ (tmm--completion-table tmm-km-list) nil t nil
(cons 'history
(- (* 2 history-len) index-of-default))))))))
(setq choice (cdr (assoc out tmm-km-list)))
@@ -497,46 +505,7 @@ If KEYSEQ is a prefix key that has local and global bindings,
we merge them into a single keymap which shows the proper order of the menu.
However, for the menu bar itself, the value does not take account
of `menu-bar-final-items'."
- (let (allbind bind minorbind localbind globalbind)
- (setq bind (key-binding keyseq))
- ;; If KEYSEQ is a prefix key, then BIND is either nil
- ;; or a symbol defined as a keymap (which satisfies keymapp).
- (if (keymapp bind)
- (setq bind nil))
- ;; If we have a non-keymap definition, return that.
- (or bind
- (progn
- ;; Otherwise, it is a prefix, so make a list of the subcommands.
- ;; Make a list of all the bindings in all the keymaps.
- ;; FIXME: we'd really like to just use `key-binding' now that it
- ;; returns a keymap that contains really all the bindings under that
- ;; prefix, but `keyseq' is always [menu-bar], so the desired order of
- ;; the bindings is difficult to recover.
- (setq minorbind (mapcar 'cdr (minor-mode-key-binding keyseq)))
- (setq localbind (local-key-binding keyseq))
- (setq globalbind (copy-sequence (cdr (global-key-binding keyseq))))
-
- ;; If items have been redefined/undefined locally, remove them from
- ;; the global list.
- (dolist (minor minorbind)
- (dolist (item (cdr minor))
- (setq globalbind (assq-delete-all (car-safe item) globalbind))))
- (dolist (item (cdr localbind))
- (setq globalbind (assq-delete-all (car-safe item) globalbind)))
-
- (setq globalbind (cons 'keymap globalbind))
- (setq allbind (cons globalbind (cons localbind minorbind)))
-
- ;; Merge all the elements of ALLBIND into one keymap.
- (dolist (in allbind)
- (if (and (symbolp in) (keymapp in))
- (setq in (symbol-function in)))
- (and in (keymapp in)
- (setq bind (if (keymapp bind)
- (nconc bind (copy-sequence (cdr in)))
- (copy-sequence in)))))
- ;; Return that keymap.
- bind))))
+ (lookup-key (cons 'keymap (nreverse (current-active-maps))) keyseq))
(provide 'tmm)
diff --git a/lisp/tutorial.el b/lisp/tutorial.el
index 011461119fc..39eb9e8b9aa 100644
--- a/lisp/tutorial.el
+++ b/lisp/tutorial.el
@@ -829,10 +829,9 @@ Run the Viper tutorial? "))
(progn
(insert-file-contents (tutorial--saved-file))
(let ((enable-local-variables :safe)
- (enable-local-eval nil))
+ (enable-local-eval nil)
+ (enable-dir-local-variables nil)) ; bug#11127
(hack-local-variables))
- ;; FIXME? What we actually want is to ignore dir-locals (?).
- (setq buffer-read-only nil) ; bug#11118
(goto-char (point-min))
(setq old-tut-point
(string-to-number
@@ -849,10 +848,9 @@ Run the Viper tutorial? "))
(setq tutorial--point-before-chkeys (point-marker)))
(insert-file-contents (expand-file-name filename tutorial-directory))
(let ((enable-local-variables :safe)
- (enable-local-eval nil))
+ (enable-local-eval nil)
+ (enable-dir-local-variables nil)) ; bug#11127
(hack-local-variables))
- ;; FIXME? What we actually want is to ignore dir-locals (?).
- (setq buffer-read-only nil) ; bug#11118
(forward-line)
(setq tutorial--point-before-chkeys (point-marker)))
diff --git a/lisp/type-break.el b/lisp/type-break.el
index 212ac392e01..3ddf2e2d20a 100644
--- a/lisp/type-break.el
+++ b/lisp/type-break.el
@@ -204,11 +204,11 @@ key is pressed."
:type 'boolean
:group 'type-break)
-(defcustom type-break-file-name (convert-standard-filename "~/.type-break")
+(defcustom type-break-file-name
+ (locate-user-emacs-file "type-break" ".type-break")
"Name of file used to save state across sessions.
If this is nil, no data will be saved across sessions."
- :type 'file
- :group 'type-break)
+ :type 'file)
(defvar type-break-post-command-hook '(type-break-check)
"Hook run indirectly by `post-command-hook' for typing break functions.
diff --git a/lisp/uniquify.el b/lisp/uniquify.el
index 3340f1962de..546796b619a 100644
--- a/lisp/uniquify.el
+++ b/lisp/uniquify.el
@@ -184,10 +184,9 @@ contains the name of the directory which the buffer is visiting.")
;; Internal variables used free
(defvar uniquify-possibly-resolvable nil)
-(defvar uniquify-managed nil
+(defvar-local uniquify-managed nil
"Non-nil if the name of this buffer is managed by uniquify.
It actually holds the list of `uniquify-item's corresponding to the conflict.")
-(make-variable-buffer-local 'uniquify-managed)
(put 'uniquify-managed 'permanent-local t)
;; Used in desktop.el to save the non-uniquified buffer name
@@ -465,27 +464,34 @@ For use on `kill-buffer-hook'."
;; rename-buffer and create-file-buffer. (Setting find-file-hook isn't
;; sufficient.)
-(defadvice rename-buffer (after rename-buffer-uniquify activate)
+(advice-add 'rename-buffer :around #'uniquify--rename-buffer-advice)
+(defun uniquify--rename-buffer-advice (rb-fun newname &optional unique &rest args)
"Uniquify buffer names with parts of directory name."
+ (let ((retval (apply rb-fun newname unique args)))
(uniquify-maybe-rerationalize-w/o-cb)
- (if (null (ad-get-arg 1)) ; no UNIQUE argument.
+ (if (null unique)
;; Mark this buffer so it won't be renamed by uniquify.
(setq uniquify-managed nil)
(when uniquify-buffer-name-style
;; Rerationalize w.r.t the new name.
(uniquify-rationalize-file-buffer-names
- (ad-get-arg 0)
+ newname
(uniquify-buffer-file-name (current-buffer))
(current-buffer))
- (setq ad-return-value (buffer-name (current-buffer))))))
+ (setq retval (buffer-name (current-buffer)))))
+ retval))
-(defadvice create-file-buffer (after create-file-buffer-uniquify activate)
+
+(advice-add 'create-file-buffer :around #'uniquify--create-file-buffer-advice)
+(defun uniquify--create-file-buffer-advice (cfb-fun filename &rest args)
"Uniquify buffer names with parts of directory name."
+ (let ((retval (apply cfb-fun filename args)))
(if uniquify-buffer-name-style
- (let ((filename (expand-file-name (directory-file-name (ad-get-arg 0)))))
+ (let ((filename (expand-file-name (directory-file-name filename))))
(uniquify-rationalize-file-buffer-names
(file-name-nondirectory filename)
- (file-name-directory filename) ad-return-value))))
+ (file-name-directory filename) retval)))
+ retval))
;;; The End
@@ -497,9 +503,8 @@ For use on `kill-buffer-hook'."
(set-buffer buf)
(when uniquify-managed
(push (cons buf (uniquify-item-base (car uniquify-managed))) buffers)))
- (dolist (fun '(rename-buffer create-file-buffer))
- (ad-remove-advice fun 'after (intern (concat (symbol-name fun) "-uniquify")))
- (ad-update fun))
+ (advice-remove 'rename-buffer #'uniquify--rename-buffer-advice)
+ (advice-remove 'create-file-buffer #'uniquify--create-file-buffer-advice)
(dolist (buf buffers)
(set-buffer (car buf))
(rename-buffer (cdr buf) t))))
diff --git a/lisp/url/ChangeLog b/lisp/url/ChangeLog
index 0927cb83090..f8f24de6b68 100644
--- a/lisp/url/ChangeLog
+++ b/lisp/url/ChangeLog
@@ -1,6 +1,30 @@
-2013-03-11 Glenn Morris <rgm@gnu.org>
+2013-02-16 Glenn Morris <rgm@gnu.org>
- * Version 24.3 released.
+ * url-http.el (url-http-wait-for-headers-change-function):
+ Avoid prematurely finding the end of headers when they arrive
+ line-by-line. (Bug#13598)
+
+2013-02-03 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * url-cache.el (url-cache-create-filename-using-md5): Don't waste your
+ time `requiring' a builtin feature.
+
+2012-12-22 Takafumi Arakaki <aka.tkf@gmail.com> (tiny change)
+
+ * url-http.el (url-http-end-of-document-sentinel): Bind relevant
+ url-request-* variables around the call to url-http (Bug#11469).
+
+ * url-expand.el (url-default-expander): Don't calculate a default
+ url port before checking url-type (Bug#12374).
+
+2012-12-22 Chong Yidong <cyd@gnu.org>
+
+ * url-parse.el (url-port): Doc fix.
+
+2012-12-03 Chong Yidong <cyd@gnu.org>
+
+ * url-misc.el (url-do-terminal-emulator): Use make-term instead of
+ terminal-emulator.
2012-10-13 Liam Stitt <stittl@cuug.ab.ca> (tiny change)
diff --git a/lisp/url/url-cache.el b/lisp/url/url-cache.el
index a5e5ebf1ed4..cb0281b87f2 100644
--- a/lisp/url/url-cache.el
+++ b/lisp/url/url-cache.el
@@ -149,7 +149,6 @@ The actual return value is the last modification time of the cache file."
(defun url-cache-create-filename-using-md5 (url)
"Create a cached filename using MD5.
Very fast if you have an `md5' primitive function, suitably fast otherwise."
- (require 'md5)
(if url
(let* ((checksum (md5 url))
(urlobj (url-generic-parse-url url))
diff --git a/lisp/url/url-expand.el b/lisp/url/url-expand.el
index cd3c0163301..51a3e64064a 100644
--- a/lisp/url/url-expand.el
+++ b/lisp/url/url-expand.el
@@ -112,7 +112,7 @@ path components followed by `..' are removed, along with the `..' itself."
;; Well, they told us the scheme, let's just go with it.
nil
(setf (url-type urlobj) (or (url-type urlobj) (url-type defobj)))
- (setf (url-port urlobj) (or (url-port urlobj)
+ (setf (url-port urlobj) (or (url-portspec urlobj)
(and (string= (url-type urlobj)
(url-type defobj))
(url-port defobj))))
diff --git a/lisp/url/url-http.el b/lisp/url/url-http.el
index 222dbc98e4a..33fc5722759 100644
--- a/lisp/url/url-http.el
+++ b/lisp/url/url-http.el
@@ -890,8 +890,11 @@ should be shown to the user."
(url-http-activate-callback)
;; Call `url-http' again if our connection expired.
(erase-buffer)
- (url-http url-current-object url-callback-function
- url-callback-arguments (current-buffer))))
+ (let ((url-request-method url-http-method)
+ (url-request-extra-headers url-http-extra-headers)
+ (url-request-data url-http-data))
+ (url-http url-current-object url-callback-function
+ url-callback-arguments (current-buffer)))))
((url-http-parse-headers)
(url-http-activate-callback))))))
@@ -1037,7 +1040,9 @@ the end of the document."
(setq end-of-headers t
url-http-end-of-headers 0
old-http t)
- (when (re-search-forward "^\r*$" nil t)
+ ;; Blank line at end of headers.
+ (when (re-search-forward "^\r?\n" nil t)
+ (backward-char 1)
;; Saw the end of the headers
(url-http-debug "Saw end of headers... (%s)" (buffer-name))
(setq url-http-end-of-headers (set-marker (make-marker)
diff --git a/lisp/url/url-misc.el b/lisp/url/url-misc.el
index aca3aff6327..c8e9b591790 100644
--- a/lisp/url/url-misc.el
+++ b/lisp/url/url-misc.el
@@ -45,27 +45,21 @@
nil))
(defun url-do-terminal-emulator (type server port user)
- (terminal-emulator
- (generate-new-buffer (format "%s%s" (if user (concat user "@") "") server))
- (pcase type
- (`rlogin "rlogin")
- (`telnet "telnet")
- (`tn3270 "tn3270")
- (_
- (error "Unknown terminal emulator required: %s" type)))
- (pcase type
- (`rlogin
- (if user
- (list server "-l" user)
- (list server)))
- (`telnet
- (if user (message "Please log in as user: %s" user))
- (if port
- (list server port)
- (list server)))
- (`tn3270
- (if user (message "Please log in as user: %s" user))
- (list server)))))
+ (switch-to-buffer
+ (apply
+ 'make-term
+ (format "%s%s" (if user (concat user "@") "") server)
+ (cond ((eq type 'rlogin) "rlogin")
+ ((eq type 'telnet) "telnet")
+ ((eq type 'tn3270) "tn3270")
+ (t (error "Unknown terminal emulator required: %s" type)))
+ nil
+ (cond ((eq type 'rlogin)
+ (if user (list server "-l" user) (list server)))
+ ((eq type 'telnet)
+ (if port (list server port) (list server)))
+ ((eq type 'tn3270)
+ (list server))))))
;;;###autoload
(defun url-generic-emulator-loader (url)
diff --git a/lisp/url/url-parse.el b/lisp/url/url-parse.el
index 644428d19cd..1628290a358 100644
--- a/lisp/url/url-parse.el
+++ b/lisp/url/url-parse.el
@@ -39,13 +39,14 @@
silent (use-cookies t))
(defsubst url-port (urlobj)
- "Return the port number for the URL specified by URLOBJ."
+ "Return the port number for the URL specified by URLOBJ.
+If the port spec is nil (i.e. URLOBJ specifies no port number),
+return the default port number for URLOBJ's scheme."
(declare (gv-setter (lambda (port) `(setf (url-portspec ,urlobj) ,port))))
(or (url-portspec urlobj)
(if (url-type urlobj)
(url-scheme-get-property (url-type urlobj) 'default-port))))
-
(defun url-path-and-query (urlobj)
"Return the path and query components of URLOBJ.
These two components are stored together in the FILENAME slot of
diff --git a/lisp/vc/add-log.el b/lisp/vc/add-log.el
index bc07b61acff..f0ea9c68464 100644
--- a/lisp/vc/add-log.el
+++ b/lisp/vc/add-log.el
@@ -61,8 +61,9 @@
;;;###autoload
(defcustom add-log-current-defun-function nil
"If non-nil, function to guess name of surrounding function.
-It is used by `add-log-current-defun' in preference to built-in rules.
-Returns function's name as a string, or nil if outside a function."
+It is called by `add-log-current-defun' with no argument, and
+should return the function's name as a string, or nil if point is
+outside a function."
:type '(choice (const nil) function)
:group 'change-log)
@@ -1118,21 +1119,6 @@ parentheses."
:type 'regexp
:group 'change-log)
-;;;###autoload
-(defvar add-log-lisp-like-modes
- '(emacs-lisp-mode lisp-mode scheme-mode dsssl-mode lisp-interaction-mode)
- "Modes that look like Lisp to `add-log-current-defun'.")
-
-;;;###autoload
-(defvar add-log-c-like-modes
- '(c-mode c++-mode c++-c-mode objc-mode)
- "Modes that look like C to `add-log-current-defun'.")
-
-;;;###autoload
-(defvar add-log-tex-like-modes
- '(TeX-mode plain-TeX-mode LaTeX-mode tex-mode)
- "Modes that look like TeX to `add-log-current-defun'.")
-
(declare-function c-cpp-define-name "cc-cmds" ())
(declare-function c-defun-name "cc-cmds" ())
@@ -1152,75 +1138,21 @@ identifiers followed by `:' or `='. See variables
Has a preference of looking backwards."
(condition-case nil
(save-excursion
- (let ((location (point)))
- (cond (add-log-current-defun-function
- (funcall add-log-current-defun-function))
- ((apply 'derived-mode-p add-log-lisp-like-modes)
- ;; If we are now precisely at the beginning of a defun,
- ;; make sure beginning-of-defun finds that one
- ;; rather than the previous one.
- (or (eobp) (forward-char 1))
- (beginning-of-defun)
- ;; Make sure we are really inside the defun found,
- ;; not after it.
- (when (and (looking-at "\\s(")
- (progn (end-of-defun)
- (< location (point)))
- (progn (forward-sexp -1)
- (>= location (point))))
- (if (looking-at "\\s(")
- (forward-char 1))
- ;; Skip the defining construct name, typically "defun"
- ;; or "defvar".
- (forward-sexp 1)
- ;; The second element is usually a symbol being defined.
- ;; If it is not, use the first symbol in it.
- (skip-chars-forward " \t\n'(")
- (buffer-substring-no-properties (point)
- (progn (forward-sexp 1)
- (point)))))
- ((apply 'derived-mode-p add-log-c-like-modes)
- (or (c-cpp-define-name)
- (c-defun-name)))
- ((apply #'derived-mode-p add-log-tex-like-modes)
- (if (re-search-backward
- "\\\\\\(sub\\)*\\(section\\|paragraph\\|chapter\\)"
- nil t)
- (progn
- (goto-char (match-beginning 0))
- (buffer-substring-no-properties
- (1+ (point)) ; without initial backslash
- (line-end-position)))))
- ((derived-mode-p 'texinfo-mode)
- (if (re-search-backward "^@node[ \t]+\\([^,\n]+\\)" nil t)
- (match-string-no-properties 1)))
- ((derived-mode-p 'perl-mode 'cperl-mode)
- (if (re-search-backward "^sub[ \t]+\\([^({ \t\n]+\\)" nil t)
- (match-string-no-properties 1)))
- ;; Emacs's autoconf-mode installs its own
- ;; `add-log-current-defun-function'. This applies to
- ;; a different mode apparently for editing .m4
- ;; autoconf source.
- ((derived-mode-p 'autoconf-mode)
- (if (re-search-backward
- "^\\(\\(m4_\\)?define\\|A._DEFUN\\)(\\[?\\([A-Za-z0-9_]+\\)" nil t)
- (match-string-no-properties 3)))
- (t
- ;; If all else fails, try heuristics
- (let (case-fold-search
- result)
- (end-of-line)
- (when (re-search-backward
- add-log-current-defun-header-regexp
- (- (point) 10000)
- t)
- (setq result (or (match-string-no-properties 1)
- (match-string-no-properties 0)))
- ;; Strip whitespace away
- (when (string-match "\\([^ \t\n\r\f].*[^ \t\n\r\f]\\)"
- result)
- (setq result (match-string-no-properties 1 result)))
- result))))))
+ (if add-log-current-defun-function
+ (funcall add-log-current-defun-function)
+ ;; If all else fails, try heuristics
+ (let (case-fold-search
+ result)
+ (end-of-line)
+ (when (re-search-backward add-log-current-defun-header-regexp
+ (- (point) 10000) t)
+ (setq result (or (match-string-no-properties 1)
+ (match-string-no-properties 0)))
+ ;; Strip whitespace away
+ (when (string-match "\\([^ \t\n\r\f].*[^ \t\n\r\f]\\)"
+ result)
+ (setq result (match-string-no-properties 1 result)))
+ result))))
(error nil)))
(defvar change-log-get-method-definition-md)
diff --git a/lisp/vc/compare-w.el b/lisp/vc/compare-w.el
index 2423d322460..fa451ccbe20 100644
--- a/lisp/vc/compare-w.el
+++ b/lisp/vc/compare-w.el
@@ -53,13 +53,13 @@ whitespace is considered to match, and is skipped."
:group 'compare-windows)
(defcustom compare-ignore-whitespace nil
- "Non-nil means `compare-windows' ignores whitespace."
+ "Non-nil means command `compare-windows' ignores whitespace."
:type 'boolean
:group 'compare-windows
:version "22.1")
(defcustom compare-ignore-case nil
- "Non-nil means `compare-windows' ignores case differences."
+ "Non-nil means command `compare-windows' ignores case differences."
:type 'boolean
:group 'compare-windows)
@@ -379,7 +379,7 @@ on third call it again advances points to the next difference and so on."
(delete-overlay compare-windows-overlay2)))))
(defun compare-windows-dehighlight ()
- "Remove highlighting created by `compare-windows-highlight'."
+ "Remove highlighting created by function `compare-windows-highlight'."
(interactive)
(remove-hook 'pre-command-hook 'compare-windows-dehighlight)
(mapc 'delete-overlay compare-windows-overlays1)
diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el
index 1647e6bca96..e945d6ef160 100644
--- a/lisp/vc/diff-mode.el
+++ b/lisp/vc/diff-mode.el
@@ -124,7 +124,6 @@ when editing big diffs)."
("A" . diff-ediff-patch)
("r" . diff-restrict-view)
("R" . diff-reverse-direction)
- ("/" . diff-undo)
([remap undo] . diff-undo))
"Basic keymap for `diff-mode', bound to various prefix keys."
:inherit special-mode-map)
@@ -575,19 +574,21 @@ next hunk if TRY-HARDER is non-nil; otherwise signal an error."
(easy-mmode-define-navigation
diff-hunk diff-hunk-header-re "hunk" diff-end-of-hunk diff-restrict-view
(when diff-auto-refine-mode
- (setq diff--auto-refine-data (cons (current-buffer) (point-marker)))
- (run-at-time 0.0 nil
- (lambda ()
- (when diff--auto-refine-data
- (let ((buffer (car diff--auto-refine-data))
- (point (cdr diff--auto-refine-data)))
- (setq diff--auto-refine-data nil)
- (with-local-quit
- (when (buffer-live-p buffer)
- (with-current-buffer buffer
- (save-excursion
- (goto-char point)
- (diff-refine-hunk)))))))))))
+ (unless (prog1 diff--auto-refine-data
+ (setq diff--auto-refine-data
+ (cons (current-buffer) (point-marker))))
+ (run-at-time 0.0 nil
+ (lambda ()
+ (when diff--auto-refine-data
+ (let ((buffer (car diff--auto-refine-data))
+ (point (cdr diff--auto-refine-data)))
+ (setq diff--auto-refine-data nil)
+ (with-local-quit
+ (when (buffer-live-p buffer)
+ (with-current-buffer buffer
+ (save-excursion
+ (goto-char point)
+ (diff-refine-hunk))))))))))))
(easy-mmode-define-navigation
diff-file diff-file-header-re "file" diff-end-of-file)
@@ -819,9 +820,11 @@ If the OLD prefix arg is passed, tell the file NAME of the old file."
(progn (diff-hunk-prev) (point))
(error (point-min)))))
(header-files
- (if (looking-at "[-*][-*][-*] \\(\\S-+\\)\\(\\s-.*\\)?\n[-+][-+][-+] \\(\\S-+\\)")
- (list (if old (match-string 1) (match-string 3))
- (if old (match-string 3) (match-string 1)))
+ ;; handle filenames with spaces;
+ ;; cf. diff-font-lock-keywords / diff-file-header-face
+ (if (looking-at "[-*][-*][-*] \\([^\t]+\\)\t.*\n[-+][-+][-+] \\([^\t]+\\)")
+ (list (if old (match-string 1) (match-string 2))
+ (if old (match-string 2) (match-string 1)))
(forward-line 1) nil)))
(delq nil
(append
@@ -830,6 +833,7 @@ If the OLD prefix arg is passed, tell the file NAME of the old file."
(re-search-backward "^Index: \\(.+\\)" limit t)))
(list (match-string 1)))
header-files
+ ;; this assumes that there are no spaces in filenames
(when (re-search-backward
"^diff \\(-\\S-+ +\\)*\\(\\S-+\\)\\( +\\(\\S-+\\)\\)?"
nil t)
@@ -1296,7 +1300,7 @@ See `after-change-functions' for the meaning of BEG, END and LEN."
(re-search-forward diff-context-mid-hunk-header-re
nil t)))))
(when (and ;; Don't try to fixup changes in the hunk header.
- (> (car diff-unhandled-changes) start)
+ (>= (car diff-unhandled-changes) start)
;; Don't try to fixup changes in the mid-hunk header either.
(or (not mid)
(< (cdr diff-unhandled-changes) (match-beginning 0))
diff --git a/lisp/vc/diff.el b/lisp/vc/diff.el
index d0e496d2d21..0fc0d2e3f73 100644
--- a/lisp/vc/diff.el
+++ b/lisp/vc/diff.el
@@ -86,7 +86,7 @@ exists. If NO-ASYNC is non-nil, call diff synchronously.
When called interactively with a prefix argument, prompt
interactively for diff switches. Otherwise, the switches
-specified in `diff-switches' are passed to the diff command."
+specified in the variable `diff-switches' are passed to the diff command."
(interactive
(let* ((newf (if (and buffer-file-name (file-exists-p buffer-file-name))
(read-file-name
@@ -114,6 +114,13 @@ specified in `diff-switches' are passed to the diff command."
tempfile))
(file-local-copy file-or-buf)))
+(defvar diff-use-labels 'check
+ "Whether `diff-command' understands the \"--label\" option.
+Possible values are:
+ t -- yes, it does
+ nil -- no, it does not
+ check -- try to probe whether it does")
+
(defun diff-no-select (old new &optional switches no-async buf)
;; Noninteractive helper for creating and reverting diff buffers
(unless (bufferp new) (setq new (expand-file-name new)))
@@ -121,6 +128,11 @@ specified in `diff-switches' are passed to the diff command."
(or switches (setq switches diff-switches)) ; If not specified, use default.
(unless (listp switches) (setq switches (list switches)))
(or buf (setq buf (get-buffer-create "*Diff*")))
+ (when (eq 'check diff-use-labels)
+ (setq diff-use-labels
+ (with-temp-buffer
+ (when (ignore-errors (call-process diff-command nil t nil "--help"))
+ (if (search-backward "--label" nil t) t)))))
(let* ((old-alt (diff-file-local-copy old))
(new-alt (diff-file-local-copy new))
(command
@@ -130,11 +142,14 @@ specified in `diff-switches' are passed to the diff command."
,@switches
,@(mapcar #'shell-quote-argument
(nconc
- (when (or old-alt new-alt)
- (list "-L" (if (stringp old)
- old (prin1-to-string old))
- "-L" (if (stringp new)
- new (prin1-to-string new))))
+ (and (or old-alt new-alt)
+ (eq diff-use-labels t)
+ (list "--label"
+ (if (stringp old) old
+ (prin1-to-string old))
+ "--label"
+ (if (stringp new) new
+ (prin1-to-string new))))
(list (or old-alt old)
(or new-alt new)))))
" "))
diff --git a/lisp/vc/ediff-diff.el b/lisp/vc/ediff-diff.el
index 9ad1b39ac38..b4d986fb036 100644
--- a/lisp/vc/ediff-diff.el
+++ b/lisp/vc/ediff-diff.el
@@ -453,52 +453,30 @@ one optional arguments, diff-number to refine.")
c-prev c-end)
;; else convert lines to points
(ediff-with-current-buffer A-buffer
- (let ((longlines-mode-val
- (if (and (boundp 'longlines-mode) longlines-mode) 1 0)))
- ;; we must disable and then restore longlines-mode
- (if (eq longlines-mode-val 1)
- (longlines-mode 0))
- (goto-char (or a-prev-pt shift-A (point-min)))
- (forward-line (- a-begin a-prev))
- (setq a-begin-pt (point))
- (forward-line (- a-end a-begin))
- (setq a-end-pt (point)
- a-prev a-end
- a-prev-pt a-end-pt)
- (if (eq longlines-mode-val 1)
- (longlines-mode longlines-mode-val))
- ))
+ (goto-char (or a-prev-pt shift-A (point-min)))
+ (forward-line (- a-begin a-prev))
+ (setq a-begin-pt (point))
+ (forward-line (- a-end a-begin))
+ (setq a-end-pt (point)
+ a-prev a-end
+ a-prev-pt a-end-pt))
(ediff-with-current-buffer B-buffer
- (let ((longlines-mode-val
- (if (and (boundp 'longlines-mode) longlines-mode) 1 0)))
- (if (eq longlines-mode-val 1)
- (longlines-mode 0))
- (goto-char (or b-prev-pt shift-B (point-min)))
- (forward-line (- b-begin b-prev))
- (setq b-begin-pt (point))
- (forward-line (- b-end b-begin))
- (setq b-end-pt (point)
- b-prev b-end
- b-prev-pt b-end-pt)
- (if (eq longlines-mode-val 1)
- (longlines-mode longlines-mode-val))
- ))
+ (goto-char (or b-prev-pt shift-B (point-min)))
+ (forward-line (- b-begin b-prev))
+ (setq b-begin-pt (point))
+ (forward-line (- b-end b-begin))
+ (setq b-end-pt (point)
+ b-prev b-end
+ b-prev-pt b-end-pt))
(if (ediff-buffer-live-p C-buffer)
(ediff-with-current-buffer C-buffer
- (let ((longlines-mode-val
- (if (and (boundp 'longlines-mode) longlines-mode) 1 0)))
- (if (eq longlines-mode-val 1)
- (longlines-mode 0))
- (goto-char (or c-prev-pt (point-min)))
- (forward-line (- c-begin c-prev))
- (setq c-begin-pt (point))
- (forward-line (- c-end c-begin))
- (setq c-end-pt (point)
- c-prev c-end
- c-prev-pt c-end-pt)
- (if (eq longlines-mode-val 1)
- (longlines-mode longlines-mode-val))
- )))
+ (goto-char (or c-prev-pt (point-min)))
+ (forward-line (- c-begin c-prev))
+ (setq c-begin-pt (point))
+ (forward-line (- c-end c-begin))
+ (setq c-end-pt (point)
+ c-prev c-end
+ c-prev-pt c-end-pt)))
(setq diff-list
(nconc
diff-list
@@ -1085,65 +1063,36 @@ delimiter regions"))
c-prev c-end)
;; else convert lines to points
(ediff-with-current-buffer A-buffer
- (let ((longlines-mode-val
- (if (and (boundp 'longlines-mode) longlines-mode) 1 0)))
- ;; we must disable and then restore longlines-mode
- (if (eq longlines-mode-val 1)
- (longlines-mode 0))
- (goto-char (or a-prev-pt shift-A (point-min)))
- (forward-line (- a-begin a-prev))
- (setq a-begin-pt (point))
- (forward-line (- a-end a-begin))
- (setq a-end-pt (point)
- a-prev a-end
- a-prev-pt a-end-pt)
- (if (eq longlines-mode-val 1)
- (longlines-mode longlines-mode-val))
- ))
+ (goto-char (or a-prev-pt shift-A (point-min)))
+ (forward-line (- a-begin a-prev))
+ (setq a-begin-pt (point))
+ (forward-line (- a-end a-begin))
+ (setq a-end-pt (point)
+ a-prev a-end
+ a-prev-pt a-end-pt))
(ediff-with-current-buffer B-buffer
- (let ((longlines-mode-val
- (if (and (boundp 'longlines-mode) longlines-mode) 1 0)))
- (if (eq longlines-mode-val 1)
- (longlines-mode 0))
- (goto-char (or b-prev-pt shift-B (point-min)))
- (forward-line (- b-begin b-prev))
- (setq b-begin-pt (point))
- (forward-line (- b-end b-begin))
- (setq b-end-pt (point)
- b-prev b-end
- b-prev-pt b-end-pt)
- (if (eq longlines-mode-val 1)
- (longlines-mode longlines-mode-val))
- ))
+ (goto-char (or b-prev-pt shift-B (point-min)))
+ (forward-line (- b-begin b-prev))
+ (setq b-begin-pt (point))
+ (forward-line (- b-end b-begin))
+ (setq b-end-pt (point)
+ b-prev b-end
+ b-prev-pt b-end-pt))
(ediff-with-current-buffer C-buffer
- (let ((longlines-mode-val
- (if (and (boundp 'longlines-mode) longlines-mode) 1 0)))
- (if (eq longlines-mode-val 1)
- (longlines-mode 0))
- (goto-char (or c-prev-pt shift-C (point-min)))
- (forward-line (- c-begin c-prev))
- (setq c-begin-pt (point))
- (forward-line (- c-end c-begin))
- (setq c-end-pt (point)
- c-prev c-end
- c-prev-pt c-end-pt)
- (if (eq longlines-mode-val 1)
- (longlines-mode longlines-mode-val))
- ))
+ (goto-char (or c-prev-pt shift-C (point-min)))
+ (forward-line (- c-begin c-prev))
+ (setq c-begin-pt (point))
+ (forward-line (- c-end c-begin))
+ (setq c-end-pt (point)
+ c-prev c-end
+ c-prev-pt c-end-pt))
(if (ediff-buffer-live-p anc-buffer)
(ediff-with-current-buffer anc-buffer
- (let ((longlines-mode-val
- (if (and (boundp 'longlines-mode) longlines-mode) 1 0)))
- (if (eq longlines-mode-val 1)
- (longlines-mode 0))
- (forward-line (- c-or-anc-begin anc-prev))
- (setq anc-begin-pt (point))
- (forward-line (- c-or-anc-end c-or-anc-begin))
- (setq anc-end-pt (point)
- anc-prev c-or-anc-end)
- (if (eq longlines-mode-val 1)
- (longlines-mode longlines-mode-val))
- )))
+ (forward-line (- c-or-anc-begin anc-prev))
+ (setq anc-begin-pt (point))
+ (forward-line (- c-or-anc-end c-or-anc-begin))
+ (setq anc-end-pt (point)
+ anc-prev c-or-anc-end)))
(setq diff-list
(nconc
diff-list
diff --git a/lisp/vc/ediff-ptch.el b/lisp/vc/ediff-ptch.el
index eccd17e5afe..64f4ee4a6ac 100644
--- a/lisp/vc/ediff-ptch.el
+++ b/lisp/vc/ediff-ptch.el
@@ -190,15 +190,15 @@ program."
;; We usually come up with two candidates and ediff-file-name-sans-prefix
;; resolves this later.
;;
-;; The marker `marker1' delimits the beginning of the corresponding patch and
-;; `marker2' does it for the end.
+;; The marker `mark1' delimits the beginning of the corresponding patch and
+;; `mark2' does it for the end.
;; The result of ediff-map-patch-buffer is a list, which is then assigned
;; to ediff-patch-map.
;; The function returns the number of elements in the list ediff-patch-map
(defun ediff-map-patch-buffer (buf)
(ediff-with-current-buffer buf
(let ((count 0)
- (mark1 (move-marker (make-marker) (point-min)))
+ (mark1 (point-min-marker))
(mark1-end (point-min))
(possible-file-names '("/dev/null" . "/dev/null"))
mark2-end mark2 filenames
diff --git a/lisp/vc/ediff-util.el b/lisp/vc/ediff-util.el
index c72e8e2af18..81146c0c931 100644
--- a/lisp/vc/ediff-util.el
+++ b/lisp/vc/ediff-util.el
@@ -143,6 +143,7 @@ to invocation.")
'ediff-previous-difference nil))
;; must come after C-h, or else C-h wipes out backspace's binding in XEmacs
(define-key ediff-mode-map [backspace] 'ediff-previous-difference)
+ (define-key ediff-mode-map [?\S-\ ] 'ediff-previous-difference)
(define-key ediff-mode-map "n" 'ediff-next-difference)
(define-key ediff-mode-map " " 'ediff-next-difference)
(define-key ediff-mode-map "j" 'ediff-jump-to-difference)
@@ -786,7 +787,12 @@ Reestablish the default three-window display."
(frame-live-p ediff-control-frame)
(not ediff-use-long-help-message)
(not (ediff-frame-iconified-p ediff-control-frame)))
- (raise-frame ediff-control-frame))
+ (if (fboundp 'select-frame-set-input-focus)
+ (select-frame-set-input-focus ediff-control-frame)
+ (raise-frame ediff-control-frame)
+ (select-frame ediff-control-frame)
+ (if (fboundp 'focus-frame)
+ (focus-frame ediff-control-frame))))
;; Redisplay whatever buffers are showing, if there is a selected difference
(let ((control-frame ediff-control-frame)
@@ -3378,10 +3384,18 @@ Without an argument, it saves customized diff argument, if available
(set-window-buffer wind cloned-buff)
cloned-buff))
-(defun ediff-clone-buffer-for-current-diff-comparison (buff buf-type reg-name)
- (let ((cloned-buff (ediff-make-cloned-buffer buff reg-name))
- (reg-start (ediff-get-diff-posn buf-type 'beg))
- (reg-end (ediff-get-diff-posn buf-type 'end)))
+(defun ediff-buffer-type (buffer)
+ (cond ((eq buffer ediff-buffer-A) 'A)
+ ((eq buffer ediff-buffer-B) 'B)
+ ((eq buffer ediff-buffer-C) 'C)
+ ((eq buffer ediff-ancestor-buffer) 'Ancestor)
+ (t nil)))
+
+(defun ediff-clone-buffer-for-current-diff-comparison (buff reg-name)
+ (let* ((cloned-buff (ediff-make-cloned-buffer buff reg-name))
+ (buf-type (ediff-buffer-type buff))
+ (reg-start (ediff-get-diff-posn buf-type 'beg))
+ (reg-end (ediff-get-diff-posn buf-type 'end)))
(ediff-with-current-buffer cloned-buff
;; set region to be the current diff region
(goto-char reg-start)
@@ -3466,7 +3480,7 @@ Without an argument, it saves customized diff argument, if available
(defun ediff-inferior-compare-regions ()
"Compare regions in an active Ediff session.
-Like ediff-regions-linewise but is called from under an active Ediff session on
+Like `ediff-regions-linewise' but is called from under an active Ediff session on
the files that belong to that session.
After quitting the session invoked via this function, type C-l to the parent
@@ -3555,7 +3569,7 @@ Ediff Control Panel to restore highlighting."
(setq bufA (if use-current-diff-p
(ediff-clone-buffer-for-current-diff-comparison
- bufA 'A "-Region.A-")
+ bufA "-Region.A-")
(ediff-clone-buffer-for-region-comparison bufA "-Region.A-")))
(ediff-with-current-buffer bufA
(setq begA (region-beginning)
@@ -3570,7 +3584,7 @@ Ediff Control Panel to restore highlighting."
(setq bufB (if use-current-diff-p
(ediff-clone-buffer-for-current-diff-comparison
- bufB 'B "-Region.B-")
+ bufB "-Region.B-")
(ediff-clone-buffer-for-region-comparison bufB "-Region.B-")))
(ediff-with-current-buffer bufB
(setq begB (region-beginning)
@@ -4010,7 +4024,7 @@ Mail anyway? (y or n) ")
(set-buffer ctl-buf))
(setq buffer-name (buffer-name))
(require 'reporter)
- (reporter-submit-bug-report "kifer@cs.stonybrook.edu"
+ (reporter-submit-bug-report "kifer@cs.stonybrook.edu, bug-gnu-emacs@gnu.org"
(ediff-version)
varlist
nil
diff --git a/lisp/vc/log-edit.el b/lisp/vc/log-edit.el
index f8e753772e4..dfc7eee81a6 100644
--- a/lisp/vc/log-edit.el
+++ b/lisp/vc/log-edit.el
@@ -953,13 +953,14 @@ line of MSG."
(while (re-search-forward (concat "^" (car header)
":" log-edit-header-contents-regexp)
nil t)
- (if (eq t (cdr header))
- (setq summary (match-string 1))
- (if (functionp (cdr header))
- (setq res (nconc res (funcall (cdr header) (match-string 1))))
- (push (match-string 1) res)
- (push (or (cdr header) (car header)) res)))
- (replace-match "" t t)))
+ (let ((txt (match-string 1)))
+ (replace-match "" t t)
+ (if (eq t (cdr header))
+ (setq summary txt)
+ (if (functionp (cdr header))
+ (setq res (nconc res (funcall (cdr header) txt)))
+ (push txt res)
+ (push (or (cdr header) (car header)) res))))))
;; Remove header separator if the header is empty.
(widen)
(goto-char (point-min))
diff --git a/lisp/vc/pcvs.el b/lisp/vc/pcvs.el
index 52dc7edfa2d..208b93d9670 100644
--- a/lisp/vc/pcvs.el
+++ b/lisp/vc/pcvs.el
@@ -856,7 +856,8 @@ the problem."
(defun cvs-cleanup-collection (c rm-handled rm-dirs rm-msgs)
"Remove undesired entries.
C is the collection
-RM-HANDLED if non-nil means remove handled entries.
+RM-HANDLED if non-nil means remove handled entries (if file is currently
+ visited, only remove if value is `all').
RM-DIRS behaves like `cvs-auto-remove-directories'.
RM-MSGS if non-nil means remove messages."
(let (last-fi first-dir (rerun t))
@@ -870,16 +871,17 @@ RM-MSGS if non-nil means remove messages."
(subtype (cvs-fileinfo->subtype fi))
(keep
(pcase type
- ;; remove temp messages and keep the others
+ ;; Remove temp messages and keep the others.
(`MESSAGE (not (or rm-msgs (eq subtype 'TEMP))))
- ;; remove entries
+ ;; Remove dead entries.
(`DEAD nil)
- ;; handled also?
+ ;; Handled also?
(`UP-TO-DATE
- (if (find-buffer-visiting (cvs-fileinfo->full-name fi))
- t
- (not rm-handled)))
- ;; keep the rest
+ (not
+ (if (find-buffer-visiting (cvs-fileinfo->full-name fi))
+ (eq rm-handled 'all)
+ rm-handled)))
+ ;; Keep the rest.
(_ (not (run-hook-with-args-until-success
'cvs-cleanup-functions fi))))))
@@ -2121,7 +2123,7 @@ if you are convinced that the process that created the lock is dead."
Empty directories are removed."
(interactive)
(cvs-cleanup-collection cvs-cookies
- t (or cvs-auto-remove-directories 'handled) t))
+ 'all (or cvs-auto-remove-directories 'handled) t))
(defun-cvs-mode cvs-mode-acknowledge ()
diff --git a/lisp/vc/vc-arch.el b/lisp/vc/vc-arch.el
index 3dbaae52b37..52609457ebc 100644
--- a/lisp/vc/vc-arch.el
+++ b/lisp/vc/vc-arch.el
@@ -101,7 +101,7 @@ If nil, use the value of `vc-diff-switches'. If t, use no switches."
;;;###autoload (defun vc-arch-registered (file)
;;;###autoload (if (vc-find-root file "{arch}/=tagging-method")
;;;###autoload (progn
-;;;###autoload (load "vc-arch")
+;;;###autoload (load "vc-arch" nil t)
;;;###autoload (vc-arch-registered file))))
(defun vc-arch-add-tagline ()
diff --git a/lisp/vc/vc-bzr.el b/lisp/vc/vc-bzr.el
index f436d300089..4a08403c93e 100644
--- a/lisp/vc/vc-bzr.el
+++ b/lisp/vc/vc-bzr.el
@@ -291,7 +291,7 @@ in the repository root directory of FILE."
;;;###autoload (defun vc-bzr-registered (file)
;;;###autoload (if (vc-find-root file vc-bzr-admin-checkout-format-file)
;;;###autoload (progn
-;;;###autoload (load "vc-bzr")
+;;;###autoload (load "vc-bzr" nil t)
;;;###autoload (vc-bzr-registered file))))
(defun vc-bzr-registered (file)
@@ -620,15 +620,24 @@ or a superior directory.")
(declare-function log-edit-extract-headers "log-edit" (headers string))
+(defun vc-bzr--sanitize-header (arg)
+ ;; Newlines in --fixes (and probably other fields as well) trigger a nasty
+ ;; Bazaar bug; see https://bugs.launchpad.net/bzr/+bug/1094180.
+ (lambda (str) (list arg
+ (replace-regexp-in-string "\\`[ \t]+\\|[ \t]+\\'"
+ "" (replace-regexp-in-string
+ "\n[ \t]?" " " str)))))
+
(defun vc-bzr-checkin (files rev comment)
"Check FILES in to bzr with log message COMMENT.
REV non-nil gets an error."
(if rev (error "Can't check in a specific revision with bzr"))
- (apply 'vc-bzr-command "commit" nil 0
- files (cons "-m" (log-edit-extract-headers '(("Author" . "--author")
- ("Date" . "--commit-time")
- ("Fixes" . "--fixes"))
- comment))))
+ (apply 'vc-bzr-command "commit" nil 0 files
+ (cons "-m" (log-edit-extract-headers
+ `(("Author" . ,(vc-bzr--sanitize-header "--author"))
+ ("Date" . ,(vc-bzr--sanitize-header "--commit-time"))
+ ("Fixes" . ,(vc-bzr--sanitize-header "--fixes")))
+ comment))))
(defun vc-bzr-find-revision (file rev buffer)
"Fetch revision REV of file FILE and put it into BUFFER."
@@ -644,7 +653,7 @@ REV non-nil gets an error."
(defun vc-bzr-revert (file &optional contents-done)
(unless contents-done
- (with-temp-buffer (vc-bzr-command "revert" t 0 file))))
+ (with-temp-buffer (vc-bzr-command "revert" t 0 file "--no-backup"))))
(defvar log-view-message-re)
(defvar log-view-file-re)
@@ -685,7 +694,10 @@ REV non-nil gets an error."
("^ *timestamp: \\(.*\\)" (1 'change-log-date-face)))))))
(defun vc-bzr-print-log (files buffer &optional shortlog start-revision limit)
- "Get bzr change log for FILES into specified BUFFER."
+ "Print commit log associated with FILES into specified BUFFER.
+If SHORTLOG is non-nil, use --line format.
+If START-REVISION is non-nil, it is the newest revision to show.
+If LIMIT is non-nil, show no more than this many entries."
;; `vc-do-command' creates the buffer, but we need it before running
;; the command.
(vc-setup-buffer buffer)
@@ -698,8 +710,33 @@ REV non-nil gets an error."
(apply 'vc-bzr-command "log" buffer 'async files
(append
(when shortlog '("--line"))
- (when start-revision (list (format "-r..%s" start-revision)))
+ ;; The extra complications here when start-revision and limit
+ ;; are set are due to bzr log's --forward argument, which
+ ;; could be enabled via an alias in bazaar.conf.
+ ;; Svn, for example, does not have this problem, because
+ ;; it doesn't have --forward. Instead, you can use
+ ;; svn --log -r HEAD:0 or -r 0:HEAD as you prefer.
+ ;; Bzr, however, insists in -r X..Y that X come before Y.
+ (if start-revision
+ (list (format
+ (if (and limit (= limit 1))
+ ;; This means we don't have to use --no-aliases.
+ ;; Is -c any different to -r in this case?
+ "-r%s"
+ "-r..%s") start-revision)))
(when limit (list "-l" (format "%s" limit)))
+ ;; There is no sensible way to combine --limit and --forward,
+ ;; and it breaks the meaning of START-REVISION as the
+ ;; _newest_ revision. See bug#14168.
+ ;; Eg bzr log --forward -r ..100 --limit 50 prints
+ ;; revisions 1-50 rather than 50-100. There
+ ;; seems no way in general to get bzr to print revisions
+ ;; 50-100 in --forward order in that case.
+ ;; FIXME There may be other alias stuff we want to keep.
+ ;; Is there a way to just suppress --forward?
+ ;; As of 2013/4 the only caller uses limit = 1, so it does
+ ;; not matter much.
+ (and start-revision limit (> limit 1) '("--no-aliases"))
(if (stringp vc-bzr-log-switches)
(list vc-bzr-log-switches)
vc-bzr-log-switches)))))
diff --git a/lisp/vc/vc-cvs.el b/lisp/vc/vc-cvs.el
index d90596baca0..7a8f8107509 100644
--- a/lisp/vc/vc-cvs.el
+++ b/lisp/vc/vc-cvs.el
@@ -198,7 +198,7 @@ See also variable `vc-cvs-sticky-date-format-string'."
;;;###autoload "Return non-nil if file F is registered with CVS."
;;;###autoload (when (file-readable-p (expand-file-name
;;;###autoload "CVS/Entries" (file-name-directory f)))
-;;;###autoload (load "vc-cvs")
+;;;###autoload (load "vc-cvs" nil t)
;;;###autoload (vc-cvs-registered f)))
(defun vc-cvs-registered (file)
@@ -503,7 +503,8 @@ Will fail unless you have administrative privileges on the repo."
(declare-function vc-rcs-print-log-cleanup "vc-rcs" ())
(defun vc-cvs-print-log (files buffer &optional _shortlog _start-revision limit)
- "Get change logs associated with FILES."
+ "Print commit log associated with FILES into specified BUFFER.
+Remaining arguments are ignored."
(require 'vc-rcs)
;; It's just the catenation of the individual logs.
(vc-cvs-command
@@ -562,14 +563,13 @@ Will fail unless you have administrative privileges on the repo."
(defconst vc-cvs-annotate-first-line-re "^[0-9]")
-(defun vc-cvs-annotate-process-filter (process string)
+(defun vc-cvs-annotate-process-filter (filter process string)
(setq string (concat (process-get process 'output) string))
(if (not (string-match vc-cvs-annotate-first-line-re string))
;; Still waiting for the first real line.
(process-put process 'output string)
- (let ((vc-filter (process-get process 'vc-filter)))
- (set-process-filter process vc-filter)
- (funcall vc-filter process (substring string (match-beginning 0))))))
+ (remove-function (process-filter process) #'vc-cvs-annotate-process-filter)
+ (funcall filter process (substring string (match-beginning 0)))))
(defun vc-cvs-annotate-command (file buffer &optional revision)
"Execute \"cvs annotate\" on FILE, inserting the contents in BUFFER.
@@ -583,9 +583,8 @@ Optional arg REVISION is a revision to annotate from."
(let ((proc (get-buffer-process buffer)))
(if proc
;; If running asynchronously, use a process filter.
- (progn
- (process-put proc 'vc-filter (process-filter proc))
- (set-process-filter proc 'vc-cvs-annotate-process-filter))
+ (add-function :around (process-filter proc)
+ #'vc-cvs-annotate-process-filter)
(with-current-buffer buffer
(goto-char (point-min))
(re-search-forward vc-cvs-annotate-first-line-re)
diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el
index e3b9941fe18..d10e3934680 100644
--- a/lisp/vc/vc-dir.el
+++ b/lisp/vc/vc-dir.el
@@ -930,6 +930,8 @@ If it is a file, return the corresponding cons for the file itself."
(defvar use-vc-backend) ;; dynamically bound
+;; Autoload cookie needed by desktop.el.
+;;;###autoload
(define-derived-mode vc-dir-mode special-mode "VC dir"
"Major mode for VC directory buffers.
Marking/Unmarking key bindings and actions:
@@ -967,6 +969,8 @@ the *vc-dir* buffer.
\\{vc-dir-mode-map}"
(set (make-local-variable 'vc-dir-backend) use-vc-backend)
+ (set (make-local-variable 'desktop-save-buffer)
+ 'vc-dir-desktop-buffer-misc-data)
(setq buffer-read-only t)
(when (boundp 'tool-bar-map)
(set (make-local-variable 'tool-bar-map) vc-dir-tool-bar-map))
@@ -1288,6 +1292,31 @@ These are the commands available for use in the file status buffer:
"Default absence of extra information returned for a file."
nil)
+
+;;; Support for desktop.el (adapted from what dired.el does).
+
+(declare-function desktop-file-name "desktop" (filename dirname))
+
+(defun vc-dir-desktop-buffer-misc-data (dirname)
+ "Auxiliary information to be saved in desktop file."
+ (cons (desktop-file-name default-directory dirname) vc-dir-backend))
+
+(defun vc-dir-restore-desktop-buffer (_filename _buffername misc-data)
+ "Restore a `vc-dir' buffer specified in a desktop file."
+ (let ((dir (car misc-data))
+ (backend (cdr misc-data)))
+ (if (file-directory-p dir)
+ (progn
+ (vc-dir dir backend)
+ (current-buffer))
+ (message "Desktop: Directory %s no longer exists." dir)
+ (when desktop-missing-file-warning (sit-for 1))
+ nil)))
+
+(add-to-list 'desktop-buffer-mode-handlers
+ '(vc-dir-mode . vc-dir-restore-desktop-buffer))
+
+
(provide 'vc-dir)
;;; vc-dir.el ends here
diff --git a/lisp/vc/vc-dispatcher.el b/lisp/vc/vc-dispatcher.el
index b03619e03d9..309cf50404c 100644
--- a/lisp/vc/vc-dispatcher.el
+++ b/lisp/vc/vc-dispatcher.el
@@ -1,4 +1,4 @@
-;;; vc-dispatcher.el -- generic command-dispatcher facility.
+;;; vc-dispatcher.el -- generic command-dispatcher facility. -*- lexical-binding: t -*-
;; Copyright (C) 2008-2013 Free Software Foundation, Inc.
@@ -182,32 +182,29 @@ Another is that undo information is not kept."
(defvar vc-sentinel-movepoint) ;Dynamically scoped.
-(defun vc-process-sentinel (p s)
- (let ((previous (process-get p 'vc-previous-sentinel))
- (buf (process-buffer p)))
+(defun vc--process-sentinel (p code)
+ (let ((buf (process-buffer p)))
;; Impatient users sometime kill "slow" buffers; check liveness
;; to avoid "error in process sentinel: Selecting deleted buffer".
(when (buffer-live-p buf)
- (when previous (funcall previous p s))
(with-current-buffer buf
(setq mode-line-process
(let ((status (process-status p)))
;; Leave mode-line uncluttered, normally.
(unless (eq 'exit status)
(format " (%s)" status))))
- (let (vc-sentinel-movepoint)
+ (let (vc-sentinel-movepoint
+ (m (process-mark p)))
;; Normally, we want async code such as sentinels to not move point.
(save-excursion
- (goto-char (process-mark p))
- (let ((cmds (process-get p 'vc-sentinel-commands)))
- (process-put p 'vc-sentinel-commands nil)
- (dolist (cmd cmds)
+ (goto-char m)
;; Each sentinel may move point and the next one should be run
;; at that new point. We could get the same result by having
;; each sentinel read&set process-mark, but since `cmd' needs
;; to work both for async and sync processes, this would be
;; difficult to achieve.
- (vc-exec-after cmd))))
+ (vc-exec-after code)
+ (move-marker m (point)))
;; But sometimes the sentinels really want to move point.
(when vc-sentinel-movepoint
(let ((win (get-buffer-window (current-buffer) 0)))
@@ -226,7 +223,9 @@ Another is that undo information is not kept."
(defun vc-exec-after (code)
"Eval CODE when the current buffer's process is done.
If the current buffer has no process, just evaluate CODE.
-Else, add CODE to the process' sentinel."
+Else, add CODE to the process' sentinel.
+CODE can be either a function of no arguments, or an expression
+to evaluate."
(let ((proc (get-buffer-process (current-buffer))))
(cond
;; If there's no background process, just execute the code.
@@ -237,20 +236,14 @@ Else, add CODE to the process' sentinel."
((or (null proc) (eq (process-status proc) 'exit))
;; Make sure we've read the process's output before going further.
(when proc (accept-process-output proc))
- (eval code))
+ (if (functionp code) (funcall code) (eval code)))
;; If a process is running, add CODE to the sentinel
((eq (process-status proc) 'run)
(vc-set-mode-line-busy-indicator)
- (let ((previous (process-sentinel proc)))
- (unless (eq previous 'vc-process-sentinel)
- (process-put proc 'vc-previous-sentinel previous))
- (set-process-sentinel proc 'vc-process-sentinel))
- (process-put proc 'vc-sentinel-commands
- ;; We keep the code fragments in the order given
- ;; so that vc-diff-finish's message shows up in
- ;; the presence of non-nil vc-command-messages.
- (append (process-get proc 'vc-sentinel-commands)
- (list code))))
+ (letrec ((fun (lambda (p _msg)
+ (remove-function (process-sentinel p) fun)
+ (vc--process-sentinel p code))))
+ (add-function :after (process-sentinel proc) fun)))
(t (error "Unexpected process state"))))
nil)
@@ -329,7 +322,9 @@ case, and the process object in the asynchronous case."
command squeezed))))
(when vc-command-messages
(message "Running %s in background..." full-command))
- ;;(set-process-sentinel proc (lambda (p msg) (delete-process p)))
+ ;; Get rid of the default message insertion, in case we don't
+ ;; set a sentinel explicitly.
+ (set-process-sentinel proc #'ignore)
(set-process-filter proc 'vc-process-filter)
(setq status proc)
(when vc-command-messages
@@ -386,6 +381,8 @@ Display the buffer in some window, but don't select it."
(set-window-start window new-window-start))
buffer))
+(defvar compilation-error-regexp-alist)
+
(defun vc-compilation-mode (backend)
"Setup `compilation-mode' after with the appropriate `compilation-error-regexp-alist'."
(let* ((error-regexp-alist
@@ -477,7 +474,7 @@ Used by `vc-restore-buffer-context' to later restore the context."
(vc-position-context (mark-marker))))
;; Make the right thing happen in transient-mark-mode.
(mark-active nil))
- (list point-context mark-context nil)))
+ (list point-context mark-context)))
(defun vc-restore-buffer-context (context)
"Restore point/mark, and reparse any affected compilation buffers.
@@ -516,6 +513,8 @@ ARG and NO-CONFIRM are passed on to `revert-buffer'."
(make-variable-buffer-local 'vc-mode-line-hook)
(put 'vc-mode-line-hook 'permanent-local t)
+(defvar view-old-buffer-read-only)
+
(defun vc-resynch-window (file &optional keep noquery reset-vc-info)
"If FILE is in the current buffer, either revert or unvisit it.
The choice between revert (to see expanded keywords) and unvisit
diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el
index fb39f1baec7..06474cb4604 100644
--- a/lisp/vc/vc-git.el
+++ b/lisp/vc/vc-git.el
@@ -168,7 +168,7 @@ matching the resulting Git log output, and KEYWORDS is a list of
;;;###autoload "Return non-nil if FILE is registered with git."
;;;###autoload (if (vc-find-root file ".git") ; Short cut.
;;;###autoload (progn
-;;;###autoload (load "vc-git")
+;;;###autoload (load "vc-git" nil t)
;;;###autoload (vc-git-registered file))))
(defun vc-git-registered (file)
@@ -732,9 +732,11 @@ This prompts for a branch to merge from."
;;; HISTORY FUNCTIONS
(defun vc-git-print-log (files buffer &optional shortlog start-revision limit)
- "Get change log associated with FILES.
-Note that using SHORTLOG requires at least Git version 1.5.6,
-for the --graph option."
+ "Print commit log associated with FILES into specified BUFFER.
+If SHORTLOG is non-nil, use a short format based on `vc-git-root-log-format'.
+\(This requires at least Git version 1.5.6, for the --graph option.)
+If START-REVISION is non-nil, it is the newest revision to show.
+If LIMIT is non-nil, show no more than this many entries."
(let ((coding-system-for-read vc-git-commits-coding-system))
;; `vc-do-command' creates the buffer, but we need it before running
;; the command.
@@ -1148,7 +1150,7 @@ This command shares argument histories with \\[rgrep] and \\[grep]."
The difference to vc-do-command is that this function always invokes
`vc-git-program'."
(apply 'vc-do-command (or buffer "*vc*") okstatus vc-git-program
- file-or-list flags))
+ file-or-list (cons "--no-pager" flags)))
(defun vc-git--empty-db-p ()
"Check if the git db is empty (no commit done yet)."
diff --git a/lisp/vc/vc-hg.el b/lisp/vc/vc-hg.el
index 18667117714..feec015e52a 100644
--- a/lisp/vc/vc-hg.el
+++ b/lisp/vc/vc-hg.el
@@ -93,7 +93,7 @@
;; - clear-headers () ??
;; - delete-file (file) TEST IT
;; - rename-file (old new) OK
-;; - find-file-hook () PROBABLY NOT NEEDED
+;; - find-file-hook () added for bug#10709
;; 2) Implement Stefan Monnier's advice:
;; vc-hg-registered and vc-hg-state
@@ -152,7 +152,7 @@ If nil, use the value of `vc-diff-switches'. If t, use no switches."
(2 'change-log-list)
(3 'change-log-name)
(4 'change-log-date)))
- "Mercurial log template for `vc-print-root-log'.
+ "Mercurial log template for `vc-hg-print-log' short format.
This should be a list (TEMPLATE REGEXP KEYWORDS), where TEMPLATE
is the \"--template\" argument string to pass to Mercurial,
REGEXP is a regular expression matching the resulting Mercurial
@@ -176,7 +176,7 @@ highlighting the Log View buffer."
;;;###autoload "Return non-nil if FILE is registered with hg."
;;;###autoload (if (vc-find-root file ".hg") ; short cut
;;;###autoload (progn
-;;;###autoload (load "vc-hg")
+;;;###autoload (load "vc-hg" nil t)
;;;###autoload (vc-hg-registered file))))
;; Modeled after the similar function in vc-bzr.el
@@ -246,7 +246,10 @@ highlighting the Log View buffer."
:group 'vc-hg)
(defun vc-hg-print-log (files buffer &optional shortlog start-revision limit)
- "Get change log associated with FILES."
+ "Print commit log associated with FILES into specified BUFFER.
+If SHORTLOG is non-nil, use a short format based on `vc-hg-root-log-format'.
+If START-REVISION is non-nil, it is the newest revision to show.
+If LIMIT is non-nil, show no more than this many entries."
;; `vc-do-command' creates the buffer, but we need it before running
;; the command.
(vc-setup-buffer buffer)
@@ -257,7 +260,7 @@ highlighting the Log View buffer."
buffer
(apply 'vc-hg-command buffer 0 files "log"
(nconc
- (when start-revision (list (format "-r%s:" start-revision)))
+ (when start-revision (list (format "-r%s:0" start-revision)))
(when limit (list "-l" (format "%s" limit)))
(when shortlog (list "--template" (car vc-hg-root-log-format)))
vc-hg-log-switches)))))
@@ -357,7 +360,7 @@ Optional arg REVISION is a revision to annotate from."
;;215 Wed Jun 20 21:22:58 2007 -0700 foo.c: CONTENTS
;; i.e. VERSION_NUMBER DATE FILENAME: CONTENTS
(defconst vc-hg-annotate-re
- "^[ \t]*\\([0-9]+\\) \\(.\\{30\\}\\)\\(?:\\(: \\)\\|\\(?: +\\(.+\\): \\)\\)")
+ "^[ \t]*\\([0-9]+\\) \\(.\\{30\\}\\)\\(?:\\(: \\)\\|\\(?: +\\([^:\n]+\\(?::\\(?:[^: \n][^:\n]*\\)?\\)*\\): \\)\\)")
(defun vc-hg-annotate-time ()
(when (looking-at vc-hg-annotate-re)
@@ -384,7 +387,7 @@ Optional arg REVISION is a revision to annotate from."
(let ((newrev (1+ (string-to-number rev)))
(tip-revision
(with-temp-buffer
- (vc-hg-command t 0 nil "tip")
+ (vc-hg-command t 0 nil "tip" "--style=default")
(goto-char (point-min))
(re-search-forward "^changeset:[ \t]*\\([0-9]+\\):")
(string-to-number (match-string-no-properties 1)))))
@@ -464,6 +467,35 @@ REV is the revision to check out into WORKFILE."
(vc-hg-command t 0 file "cat" "-r" rev)
(vc-hg-command t 0 file "cat")))))
+(defun vc-hg-resolve-when-done ()
+ "Call \"hg resolve -m\" if the conflict markers have been removed."
+ (save-excursion
+ (goto-char (point-min))
+ (unless (re-search-forward "^<<<<<<< " nil t)
+ (vc-hg-command nil 0 buffer-file-name "resolve" "-m")
+ ;; Remove the hook so that it is not called multiple times.
+ (remove-hook 'after-save-hook 'vc-hg-resolve-when-done t))))
+
+(defun vc-hg-find-file-hook ()
+ (when (and buffer-file-name
+ (file-exists-p (concat buffer-file-name ".orig"))
+ ;; Hg does not seem to have a "conflict" status, eg
+ ;; hg http://bz.selenic.com/show_bug.cgi?id=2724
+ (memq (vc-file-getprop buffer-file-name 'vc-state)
+ '(edited conflict))
+ ;; Maybe go on to check that "hg resolve -l" says "U"?
+ ;; If "hg resolve -l" says there's a conflict but there are no
+ ;; conflict markers, it's not clear what we should do.
+ (save-excursion
+ (goto-char (point-min))
+ (re-search-forward "^<<<<<<< " nil t)))
+ ;; Hg may not recognize "conflict" as a state, but we can do better.
+ (vc-file-setprop buffer-file-name 'vc-state 'conflict)
+ (smerge-start-session)
+ (add-hook 'after-save-hook 'vc-hg-resolve-when-done nil t)
+ (message "There are unresolved conflicts in this file")))
+
+
;; Modeled after the similar function in vc-bzr.el
(defun vc-hg-workfile-unchanged-p (file)
(eq 'up-to-date (vc-hg-state file)))
diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el
index dd87fb6de79..5c8a4515b7e 100644
--- a/lisp/vc/vc-hooks.el
+++ b/lisp/vc/vc-hooks.el
@@ -703,19 +703,21 @@ Before doing that, check if there are any old backups and get rid of them."
;; the state to 'edited and redisplay the mode line.
(let* ((file buffer-file-name)
(backend (vc-backend file)))
- (and backend
- (or (and (equal (vc-file-getprop file 'vc-checkout-time)
- (nth 5 (file-attributes file)))
- ;; File has been saved in the same second in which
- ;; it was checked out. Clear the checkout-time
- ;; to avoid confusion.
- (vc-file-setprop file 'vc-checkout-time nil))
- t)
- (eq (vc-checkout-model backend (list file)) 'implicit)
- (vc-state-refresh file backend)
- (vc-mode-line file backend))
- ;; Try to avoid unnecessary work, a *vc-dir* buffer is
- ;; present if this is true.
+ (cond
+ ((null backend))
+ ((eq (vc-checkout-model backend (list file)) 'implicit)
+ ;; If the file was saved in the same second in which it was
+ ;; checked out, clear the checkout-time to avoid confusion.
+ (if (equal (vc-file-getprop file 'vc-checkout-time)
+ (nth 5 (file-attributes file)))
+ (vc-file-setprop file 'vc-checkout-time nil))
+ (if (vc-state-refresh file backend)
+ (vc-mode-line file backend)))
+ ;; If we saved an unlocked file on a locking based VCS, that
+ ;; file is not longer up-to-date.
+ ((eq (vc-file-getprop file 'vc-state) 'up-to-date)
+ (vc-file-setprop file 'vc-state nil)))
+ ;; Resynch *vc-dir* buffers, if any are present.
(when vc-dir-buffers
(vc-dir-resynch-file file))))
@@ -856,13 +858,23 @@ current, and kill the buffer that visits the link."
(set (make-local-variable 'backup-inhibited) t))
;; Let the backend setup any buffer-local things he needs.
(vc-call-backend backend 'find-file-hook))
- ((let ((link-type (and (not (equal buffer-file-name buffer-file-truename))
- (vc-backend buffer-file-truename))))
+ ((let* ((truename (and buffer-file-truename
+ (expand-file-name buffer-file-truename)))
+ (link-type (and truename
+ (not (equal buffer-file-name truename))
+ (vc-backend truename))))
(cond ((not link-type) nil) ;Nothing to do.
((eq vc-follow-symlinks nil)
(message
"Warning: symbolic link to %s-controlled source file" link-type))
((or (not (eq vc-follow-symlinks 'ask))
+ ;; Assume we cannot ask, default to yes.
+ noninteractive
+ ;; Copied from server-start. Seems like there should
+ ;; be a better way to ask "can we get user input?"...
+ (and (daemonp)
+ (null (cdr (frame-list)))
+ (eq (selected-frame) terminal-frame))
;; If we already visited this file by following
;; the link, don't ask again if we try to visit
;; it again. GUD does that, and repeated questions
@@ -973,6 +985,10 @@ current, and kill the buffer that visits the link."
"))
(bindings--define-key map [undo]
'(menu-item "Undo Last Check-In" vc-rollback
+ :enable (let ((backend (if buffer-file-name
+ (vc-backend buffer-file-name))))
+ (or (not backend)
+ (vc-find-backend-function backend 'rollback)))
:help "Remove the most recent changeset committed to the repository"))
(bindings--define-key map [vc-revert]
'(menu-item "Revert to Base Version" vc-revert
diff --git a/lisp/vc/vc-mtn.el b/lisp/vc/vc-mtn.el
index f2569e2145d..fbfd89561b7 100644
--- a/lisp/vc/vc-mtn.el
+++ b/lisp/vc/vc-mtn.el
@@ -72,7 +72,7 @@ If nil, use the value of `vc-diff-switches'. If t, use no switches."
;;;###autoload (defun vc-mtn-registered (file)
;;;###autoload (if (vc-find-root file vc-mtn-admin-format)
;;;###autoload (progn
-;;;###autoload (load "vc-mtn")
+;;;###autoload (load "vc-mtn" nil t)
;;;###autoload (vc-mtn-registered file))))
(defun vc-mtn-revision-granularity () 'repository)
@@ -202,6 +202,10 @@ If nil, use the value of `vc-diff-switches'. If t, use no switches."
;; )
(defun vc-mtn-print-log (files buffer &optional _shortlog start-revision limit)
+ "Print commit logs associated with FILES into specified BUFFER.
+_SHORTLOG is ignored.
+If START-REVISION is non-nil, it is the newest revision to show.
+If LIMIT is non-nil, show no more than this many entries."
(apply 'vc-mtn-command buffer 0 files "log"
(append
(when start-revision (list "--from" (format "%s" start-revision)))
diff --git a/lisp/vc/vc-rcs.el b/lisp/vc/vc-rcs.el
index 40d8acb7e07..0a2fc804e6d 100644
--- a/lisp/vc/vc-rcs.el
+++ b/lisp/vc/vc-rcs.el
@@ -567,10 +567,14 @@ directory the operation is applied to all registered files beneath it."
(when (looking-at "[\b\t\n\v\f\r ]+")
(delete-char (- (match-end 0) (match-beginning 0))))))
-(defun vc-rcs-print-log (files buffer &optional shortlog start-revision-ignored limit)
- "Get change log associated with FILE. If FILE is a
-directory the operation is applied to all registered files beneath it."
- (vc-do-command (or buffer "*vc*") 0 "rlog" (mapcar 'vc-name (vc-expand-dirs files)))
+(defun vc-rcs-print-log (files buffer &optional shortlog
+ start-revision-ignored limit)
+ "Print commit log associated with FILES into specified BUFFER.
+Remaining arguments are ignored.
+If FILE is a directory the operation is applied to all registered
+files beneath it."
+ (vc-do-command (or buffer "*vc*") 0 "rlog"
+ (mapcar 'vc-name (vc-expand-dirs files)))
(with-current-buffer (or buffer "*vc*")
(vc-rcs-print-log-cleanup))
(when limit 'limit-unsupported))
diff --git a/lisp/vc/vc-sccs.el b/lisp/vc/vc-sccs.el
index bfbe42222e9..d3cf650ddf9 100644
--- a/lisp/vc/vc-sccs.el
+++ b/lisp/vc/vc-sccs.el
@@ -350,7 +350,8 @@ revert all subfiles."
;;;
(defun vc-sccs-print-log (files buffer &optional shortlog start-revision-ignored limit)
- "Get change log associated with FILES."
+ "Print commit log associated with FILES into specified BUFFER.
+Remaining arguments are ignored."
(setq files (vc-expand-dirs files))
(vc-sccs-do-command buffer 0 "prs" (mapcar 'vc-name files))
(when limit 'limit-unsupported))
diff --git a/lisp/vc/vc-svn.el b/lisp/vc/vc-svn.el
index 2899a5e8737..a94bf0d6117 100644
--- a/lisp/vc/vc-svn.el
+++ b/lisp/vc/vc-svn.el
@@ -50,14 +50,21 @@
:type 'string
:group 'vc-svn)
-(defcustom vc-svn-global-switches nil
- "Global switches to pass to any SVN command."
+;; Might be nice if svn defaulted to non-interactive if stdin not tty.
+;; http://svn.haxx.se/dev/archive-2008-05/0762.shtml
+;; http://svn.haxx.se/dev/archive-2009-04/0094.shtml
+;; Maybe newer ones do?
+(defcustom vc-svn-global-switches (unless (eq system-type 'darwin) ; bug#13513
+ '("--non-interactive"))
+ "Global switches to pass to any SVN command.
+The option \"--non-interactive\" is often needed to prevent SVN
+hanging while prompting for authorization."
:type '(choice (const :tag "None" nil)
(string :tag "Argument String")
(repeat :tag "Argument List"
:value ("")
string))
- :version "22.1"
+ :version "24.4"
:group 'vc-svn)
(defcustom vc-svn-register-switches nil
@@ -123,7 +130,7 @@ If you want to force an empty list of arguments, use t."
;;;###autoload "_svn")
;;;###autoload (t ".svn"))))
;;;###autoload (when (vc-find-root f admin-dir)
-;;;###autoload (load "vc-svn")
+;;;###autoload (load "vc-svn" nil t)
;;;###autoload (vc-svn-registered f))))
(defun vc-svn-registered (file)
@@ -155,9 +162,24 @@ If you want to force an empty list of arguments, use t."
(vc-svn-command t 0 file "status" (if localp "-v" "-u"))
(vc-svn-parse-status file))))
+;; NB this does not handle svn properties, which can be changed
+;; without changing the file timestamp.
+;; Note that unlike vc-cvs-state-heuristic, this is not called from
+;; vc-svn-state. AFAICS, it is only called from vc-state-refresh via
+;; vc-after-save (bug#7850). Therefore the fact that it ignores
+;; properties is irrelevant. If you want to make vc-svn-state call
+;; this, it should be extended to handle svn properties.
(defun vc-svn-state-heuristic (file)
"SVN-specific state heuristic."
- (vc-svn-state file 'local))
+ ;; If the file has not changed since checkout, consider it `up-to-date'.
+ ;; Otherwise consider it `edited'. Copied from vc-cvs-state-heuristic.
+ (let ((checkout-time (vc-file-getprop file 'vc-checkout-time))
+ (lastmod (nth 5 (file-attributes file))))
+ (cond
+ ((equal checkout-time lastmod) 'up-to-date)
+ ((string= (vc-working-revision file) "0") 'added)
+ ((null checkout-time) 'unregistered)
+ (t 'edited))))
;; FIXME it would be better not to have the "remote" argument,
;; but to distinguish the two output formats based on content.
@@ -472,7 +494,10 @@ or svn+ssh://."
(set (make-local-variable 'log-view-per-file-logs) nil))
(defun vc-svn-print-log (files buffer &optional shortlog start-revision limit)
- "Get change log(s) associated with FILES."
+ "Print commit log associated with FILES into specified BUFFER.
+SHORTLOG is ignored.
+If START-REVISION is non-nil, it is the newest revision to show.
+If LIMIT is non-nil, show no more than this many entries."
(save-current-buffer
(vc-setup-buffer buffer)
(let ((inhibit-read-only t))
@@ -490,7 +515,7 @@ or svn+ssh://."
(append
(list
(if start-revision
- (format "-r%s" start-revision)
+ (format "-r%s:1" start-revision)
;; By default Subversion only shows the log up to the
;; working revision, whereas we also want the log of the
;; subsequent commits. At least that's what the
@@ -585,19 +610,11 @@ NAME is assumed to be a URL."
(defun vc-svn-command (buffer okstatus file-or-list &rest flags)
"A wrapper around `vc-do-command' for use in vc-svn.el.
The difference to vc-do-command is that this function always invokes `svn',
-and that it passes \"--non-interactive\" and `vc-svn-global-switches' to
-it before FLAGS."
- ;; Might be nice if svn defaulted to non-interactive if stdin not tty.
- ;; http://svn.haxx.se/dev/archive-2008-05/0762.shtml
- ;; http://svn.haxx.se/dev/archive-2009-04/0094.shtml
- ;; Maybe newer ones do?
- (or (member "--non-interactive"
- (setq flags (if (stringp vc-svn-global-switches)
- (cons vc-svn-global-switches flags)
- (append vc-svn-global-switches flags))))
- (setq flags (cons "--non-interactive" flags)))
+and that it passes `vc-svn-global-switches' to it before FLAGS."
(apply 'vc-do-command (or buffer "*vc*") okstatus vc-svn-program file-or-list
- flags))
+ (if (stringp vc-svn-global-switches)
+ (cons vc-svn-global-switches flags)
+ (append vc-svn-global-switches flags))))
(defun vc-svn-repository-hostname (dirname)
(with-temp-buffer
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index 35c15f1721d..5e1d27c0ea3 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -356,9 +356,11 @@
;; If LIMIT is true insert only insert LIMIT log entries. If the
;; backend does not support limiting the number of entries to show
;; it should return `limit-unsupported'.
-;; If START-REVISION is given, then show the log starting from the
-;; revision. At this point START-REVISION is only required to work
-;; in conjunction with LIMIT = 1.
+;; If START-REVISION is given, then show the log starting from that
+;; revision ("starting" in the sense of it being the _newest_
+;; revision shown, rather than the working revision, which is normally
+;; the case). Not all backends support this. At present, this is
+;; only ever used with LIMIT = 1 (by vc-annotate-show-log-revision-at-line).
;;
;; * log-outgoing (backend remote-location)
;;
@@ -659,6 +661,10 @@
(eval-when-compile
(require 'dired))
+(declare-function dired-get-filename "dired" (&optional localp noerror))
+(declare-function dired-move-to-filename "dired" (&optional err eol))
+(declare-function dired-marker-regexp "dired" ())
+
(unless (assoc 'vc-parent-buffer minor-mode-alist)
(setq minor-mode-alist
(cons '(vc-parent-buffer vc-parent-buffer-name)
@@ -1072,7 +1078,16 @@ For old-style locking-based version control systems, like RCS:
;; among all the `files'.
(model (nth 4 vc-fileset)))
- ;; Do the right thing
+ ;; If a buffer has unsaved changes, a checkout would discard those
+ ;; changes, so treat the buffer as having unlocked changes.
+ (when (and (not (eq model 'implicit)) (eq state 'up-to-date))
+ (dolist (file files)
+ (let ((buffer (get-file-buffer file)))
+ (and buffer
+ (buffer-modified-p buffer)
+ (setq state 'unlocked-changes)))))
+
+ ;; Do the right thing.
(cond
((eq state 'missing)
(error "Fileset files are missing, so cannot be operated on"))
@@ -1271,12 +1286,10 @@ first backend that could register the file is used."
;; many VCS allow that as well.
(dolist (fname files)
(let ((bname (get-file-buffer fname)))
- (unless fname (setq fname buffer-file-name))
- (when (vc-backend fname)
- (if (vc-registered fname)
- (error "This file is already registered")
- (unless (y-or-n-p "Previous master file has vanished. Make a new one? ")
- (error "Aborted"))))
+ (unless fname
+ (setq fname buffer-file-name))
+ (when (vc-call-backend backend 'registered fname)
+ (error "This file is already registered"))
;; Watch out for new buffers of size 0: the corresponding file
;; does not exist yet, even though buffer-modified-p is nil.
(when bname
@@ -2073,6 +2086,11 @@ Not all VC backends support short logs!")
(defvar log-view-vc-fileset)
(defun vc-print-log-setup-buttons (working-revision is-start-revision limit pl-return)
+ "Insert at the end of the current buffer buttons to show more log entries.
+In the new log, leave point at WORKING-REVISION (if non-nil).
+LIMIT is the number of entries currently shown.
+Does nothing if IS-START-REVISION is non-nil, or if LIMIT is nil,
+or if PL-RETURN is 'limit-unsupported."
(when (and limit (not (eq 'limit-unsupported pl-return))
(not is-start-revision))
(goto-char (point-max))
@@ -2093,6 +2111,14 @@ Not all VC backends support short logs!")
(defun vc-print-log-internal (backend files working-revision
&optional is-start-revision limit)
+ "For specified BACKEND and FILES, show the VC log.
+Leave point at WORKING-REVISION, if it is non-nil.
+If IS-START-REVISION is non-nil, start the log from WORKING-REVISION
+\(not all backends support this); i.e., show only WORKING-REVISION and
+earlier revisions. Show up to LIMIT entries (non-nil means unlimited)."
+ ;; As of 2013/04 the only thing that passes IS-START-REVISION non-nil
+ ;; is vc-annotate-show-log-revision-at-line, which sets LIMIT = 1.
+
;; Don't switch to the output buffer before running the command,
;; so that any buffer-local settings in the vc-controlled
;; buffer can be accessed by the command.
@@ -2178,7 +2204,7 @@ WORKING-REVISION and LIMIT."
(interactive
(cond
(current-prefix-arg
- (let ((rev (read-from-minibuffer "Log from revision (default: last revision): " nil
+ (let ((rev (read-from-minibuffer "Leave point at revision (default: last revision): " nil
nil nil nil))
(lim (string-to-number
(read-from-minibuffer
@@ -2556,8 +2582,12 @@ backend to NEW-BACKEND, and unregister FILE from the current backend.
;;;###autoload
(defun vc-delete-file (file)
- "Delete file and mark it as such in the version control system."
- (interactive "fVC delete file: ")
+ "Delete file and mark it as such in the version control system.
+If called interactively, read FILE, defaulting to the current
+buffer's file name if it's under version control."
+ (interactive (list (read-file-name "VC delete file: " nil
+ (when (vc-backend buffer-file-name)
+ buffer-file-name) t)))
(setq file (expand-file-name file))
(let ((buf (get-file-buffer file))
(backend (vc-backend file)))
@@ -2595,8 +2625,13 @@ backend to NEW-BACKEND, and unregister FILE from the current backend.
;;;###autoload
(defun vc-rename-file (old new)
- "Rename file OLD to NEW in both work area and repository."
- (interactive "fVC rename file: \nFRename to: ")
+ "Rename file OLD to NEW in both work area and repository.
+If called interactively, read OLD and NEW, defaulting OLD to the
+current buffer's file name if it's under version control."
+ (interactive (list (read-file-name "VC rename file: " nil
+ (when (vc-backend buffer-file-name)
+ buffer-file-name) t)
+ (read-file-name "Rename to: ")))
;; in CL I would have said (setq new (merge-pathnames new old))
(let ((old-base (file-name-nondirectory old)))
(when (and (not (string= "" old-base))
@@ -2645,14 +2680,11 @@ log entries should be gathered."
(cond ((consp current-prefix-arg) ;C-u
(list buffer-file-name))
(current-prefix-arg ;Numeric argument.
- (let ((files nil)
- (buffers (buffer-list))
- file)
- (while buffers
- (setq file (buffer-file-name (car buffers)))
- (and file (vc-backend file)
- (setq files (cons file files)))
- (setq buffers (cdr buffers)))
+ (let ((files nil))
+ (dolist (buffer (buffer-list))
+ (let ((file (buffer-file-name buffer)))
+ (and file (vc-backend file)
+ (setq files (cons file files)))))
files))
(t
;; Don't supply any filenames to backend; this means
diff --git a/lisp/vcursor.el b/lisp/vcursor.el
index b586145d667..b6ea3383bec 100644
--- a/lisp/vcursor.el
+++ b/lisp/vcursor.el
@@ -882,6 +882,8 @@ ALL-FRAMES is also used to decide whether to split the window."
(vcursor-disable -1))))
)
+(declare-function compare-windows-skip-whitespace "compare-w" (start))
+
;; vcursor-compare-windows is copied from compare-w.el with only
;; minor modifications; these are too bound up with the function
;; to make it really useful to call compare-windows itself.
diff --git a/lisp/view.el b/lisp/view.el
index b814520fceb..f9326399a26 100644
--- a/lisp/view.el
+++ b/lisp/view.el
@@ -199,6 +199,7 @@ This is local in each buffer, once it is used.")
(define-key map "\C-?" 'View-scroll-page-backward)
;; (define-key map "f" 'View-scroll-page-forward)
(define-key map " " 'View-scroll-page-forward)
+ (define-key map [?\S-\ ] 'View-scroll-page-backward)
(define-key map "o" 'View-scroll-to-buffer-end)
(define-key map ">" 'end-of-buffer)
(define-key map "<" 'beginning-of-buffer)
@@ -407,8 +408,8 @@ Digits provide prefix arguments.
\\[View-scroll-to-buffer-end] scroll so that buffer end is at last line of window.
SPC scroll forward \"page size\" lines.
With prefix scroll forward prefix lines.
-DEL scroll backward \"page size\" lines.
- With prefix scroll backward prefix lines.
+DEL, S-SPC scroll backward \"page size\" lines.
+ With prefix scroll backward prefix lines.
\\[View-scroll-page-forward-set-page-size] like \\[View-scroll-page-forward] but with prefix sets \"page size\" to prefix.
\\[View-scroll-page-backward-set-page-size] like \\[View-scroll-page-backward] but with prefix sets \"page size\" to prefix.
\\[View-scroll-half-page-forward] scroll forward \"half page size\" lines. With prefix, sets
@@ -461,15 +462,13 @@ then \\[View-leave], \\[View-quit] and \\[View-kill-and-leave] will return to th
Entry to view-mode runs the normal hook `view-mode-hook'."
:lighter " View" :keymap view-mode-map
- (if view-mode (view-mode-enable) (view-mode-disable)))
+ (if view-mode (view--enable) (view--disable)))
-(defun view-mode-enable ()
- "Turn on View mode."
+(defun view--enable ()
;; Always leave view mode before changing major mode.
;; This is to guarantee that the buffer-read-only variable is restored.
- (add-hook 'change-major-mode-hook 'view-mode-disable nil t)
- (setq view-mode t
- view-page-size nil
+ (add-hook 'change-major-mode-hook 'view--disable nil t)
+ (setq view-page-size nil
view-half-page-size nil
view-old-buffer-read-only buffer-read-only
buffer-read-only t)
@@ -480,15 +479,18 @@ Entry to view-mode runs the normal hook `view-mode-hook'."
(format "continue viewing %s"
(if (buffer-file-name)
(file-name-nondirectory (buffer-file-name))
- (buffer-name)))))
- (force-mode-line-update)
- (run-hooks 'view-mode-hook))
+ (buffer-name))))))
+
+(define-obsolete-function-alias 'view-mode-enable 'view-mode "24.4")
(defun view-mode-disable ()
"Turn off View mode."
- (remove-hook 'change-major-mode-hook 'view-mode-disable t)
+ (declare (obsolete view-mode "24.4"))
+ (view-mode -1))
+
+(defun view--disable ()
+ (remove-hook 'change-major-mode-hook 'view--disable t)
(and view-overlay (delete-overlay view-overlay))
- (force-mode-line-update)
;; Calling toggle-read-only while View mode is enabled
;; sets view-read-only to t as a buffer-local variable
;; after exiting View mode. That arranges that the next toggle-read-only
@@ -497,7 +499,6 @@ Entry to view-mode runs the normal hook `view-mode-hook'."
;; so that View mode stays off if toggle-read-only is called.
(if (local-variable-p 'view-read-only)
(kill-local-variable 'view-read-only))
- (setq view-mode nil)
(if (boundp 'Helper-return-blurb)
(setq Helper-return-blurb view-old-Helper-return-blurb))
(if buffer-read-only
@@ -560,8 +561,7 @@ This function runs the normal hook `view-mode-hook'."
(setq view-exit-action exit-action))
(unless view-mode
- (view-mode-enable)
- (force-mode-line-update)
+ (view-mode 1)
(unless view-inhibit-help-message
(message "%s"
(substitute-command-keys "\
@@ -588,7 +588,7 @@ current buffer. "
(when view-mode
(let ((buffer (window-buffer)))
(unless view-no-disable-on-exit
- (view-mode-disable))
+ (view-mode -1))
(unless exit-only
(cond
@@ -599,8 +599,7 @@ current buffer. "
(quit-window)))
(when exit-action
- (funcall exit-action buffer))
- (force-mode-line-update)))))
+ (funcall exit-action buffer))))))
(defun View-exit ()
"Exit View mode but stay in current buffer."
diff --git a/lisp/wdired.el b/lisp/wdired.el
index 59a09d6d5a0..47cd99f45ac 100644
--- a/lisp/wdired.el
+++ b/lisp/wdired.el
@@ -3,7 +3,7 @@
;; Copyright (C) 2004-2013 Free Software Foundation, Inc.
;; Filename: wdired.el
-;; Author: Juan León Lahoz García <juanleon1@gmail.com>
+;; Author: Juan León Lahoz García <juanleon1@gmail.com>
;; Version: 2.0
;; Keywords: dired, environment, files, renaming
@@ -851,7 +851,7 @@ Like original function but it skips read-only words."
(provide 'wdired)
;; Local Variables:
-;; coding: latin-1
+;; coding: utf-8
;; byte-compile-dynamic: t
;; End:
diff --git a/lisp/whitespace.el b/lisp/whitespace.el
index e2a726f4264..68625e06acb 100644
--- a/lisp/whitespace.el
+++ b/lisp/whitespace.el
@@ -554,13 +554,10 @@ See also `whitespace-display-mappings' for documentation."
(const :tag "(Mark) NEWLINEs" newline-mark)))
:group 'whitespace)
-
-(defcustom whitespace-space 'whitespace-space
+(defvar whitespace-space 'whitespace-space
"Symbol face used to visualize SPACE.
-
-Used when `whitespace-style' includes the value `spaces'."
- :type 'face
- :group 'whitespace)
+Used when `whitespace-style' includes the value `spaces'.")
+(make-obsolete-variable 'whitespace-space "use the face instead" "24.4")
(defface whitespace-space
@@ -573,13 +570,10 @@ Used when `whitespace-style' includes the value `spaces'."
:group 'whitespace)
-(defcustom whitespace-hspace 'whitespace-hspace
+(defvar whitespace-hspace 'whitespace-hspace
"Symbol face used to visualize HARD SPACE.
-
-Used when `whitespace-style' includes the value `spaces'."
- :type 'face
- :group 'whitespace)
-
+Used when `whitespace-style' includes the value `spaces'.")
+(make-obsolete-variable 'whitespace-hspace "use the face instead" "24.4")
(defface whitespace-hspace ; 'nobreak-space
'((((class color) (background dark))
@@ -591,13 +585,10 @@ Used when `whitespace-style' includes the value `spaces'."
:group 'whitespace)
-(defcustom whitespace-tab 'whitespace-tab
+(defvar whitespace-tab 'whitespace-tab
"Symbol face used to visualize TAB.
-
-Used when `whitespace-style' includes the value `tabs'."
- :type 'face
- :group 'whitespace)
-
+Used when `whitespace-style' includes the value `tabs'.")
+(make-obsolete-variable 'whitespace-tab "use the face instead" "24.4")
(defface whitespace-tab
'((((class color) (background dark))
@@ -609,16 +600,12 @@ Used when `whitespace-style' includes the value `tabs'."
:group 'whitespace)
-(defcustom whitespace-newline 'whitespace-newline
+(defvar whitespace-newline 'whitespace-newline
"Symbol face used to visualize NEWLINE char mapping.
-
See `whitespace-display-mappings'.
-
Used when `whitespace-style' includes the values `newline-mark'
-and `newline'."
- :type 'face
- :group 'whitespace)
-
+and `newline'.")
+(make-obsolete-variable 'whitespace-newline "use the face instead" "24.4")
(defface whitespace-newline
'((default :weight normal)
@@ -634,13 +621,10 @@ See `whitespace-display-mappings'."
:group 'whitespace)
-(defcustom whitespace-trailing 'whitespace-trailing
+(defvar whitespace-trailing 'whitespace-trailing
"Symbol face used to visualize trailing blanks.
-
-Used when `whitespace-style' includes the value `trailing'."
- :type 'face
- :group 'whitespace)
-
+Used when `whitespace-style' includes the value `trailing'.")
+(make-obsolete-variable 'whitespace-trailing "use the face instead" "24.4")
(defface whitespace-trailing ; 'trailing-whitespace
'((default :weight bold)
@@ -650,15 +634,11 @@ Used when `whitespace-style' includes the value `trailing'."
:group 'whitespace)
-(defcustom whitespace-line 'whitespace-line
+(defvar whitespace-line 'whitespace-line
"Symbol face used to visualize \"long\" lines.
-
See `whitespace-line-column'.
-
-Used when `whitespace-style' includes the value `line'."
- :type 'face
- :group 'whitespace)
-
+Used when `whitespace-style' includes the value `line'.")
+(make-obsolete-variable 'whitespace-line "use the face instead" "24.4")
(defface whitespace-line
'((((class mono)) :inverse-video t :weight bold :underline t)
@@ -669,13 +649,11 @@ See `whitespace-line-column'."
:group 'whitespace)
-(defcustom whitespace-space-before-tab 'whitespace-space-before-tab
+(defvar whitespace-space-before-tab 'whitespace-space-before-tab
"Symbol face used to visualize SPACEs before TAB.
-
-Used when `whitespace-style' includes the value `space-before-tab'."
- :type 'face
- :group 'whitespace)
-
+Used when `whitespace-style' includes the value `space-before-tab'.")
+(make-obsolete-variable 'whitespace-space-before-tab
+ "use the face instead" "24.4")
(defface whitespace-space-before-tab
'((((class mono)) :inverse-video t :weight bold :underline t)
@@ -684,13 +662,10 @@ Used when `whitespace-style' includes the value `space-before-tab'."
:group 'whitespace)
-(defcustom whitespace-indentation 'whitespace-indentation
+(defvar whitespace-indentation 'whitespace-indentation
"Symbol face used to visualize 8 or more SPACEs at beginning of line.
-
-Used when `whitespace-style' includes the value `indentation'."
- :type 'face
- :group 'whitespace)
-
+Used when `whitespace-style' includes the value `indentation'.")
+(make-obsolete-variable 'whitespace-indentation "use the face instead" "24.4")
(defface whitespace-indentation
'((((class mono)) :inverse-video t :weight bold :underline t)
@@ -699,13 +674,10 @@ Used when `whitespace-style' includes the value `indentation'."
:group 'whitespace)
-(defcustom whitespace-empty 'whitespace-empty
+(defvar whitespace-empty 'whitespace-empty
"Symbol face used to visualize empty lines at beginning and/or end of buffer.
-
-Used when `whitespace-style' includes the value `empty'."
- :type 'face
- :group 'whitespace)
-
+Used when `whitespace-style' includes the value `empty'.")
+(make-obsolete-variable 'whitespace-empty "use the face instead" "24.4")
(defface whitespace-empty
'((((class mono)) :inverse-video t :weight bold :underline t)
@@ -714,13 +686,11 @@ Used when `whitespace-style' includes the value `empty'."
:group 'whitespace)
-(defcustom whitespace-space-after-tab 'whitespace-space-after-tab
+(defvar whitespace-space-after-tab 'whitespace-space-after-tab
"Symbol face used to visualize 8 or more SPACEs after TAB.
-
-Used when `whitespace-style' includes the value `space-after-tab'."
- :type 'face
- :group 'whitespace)
-
+Used when `whitespace-style' includes the value `space-after-tab'.")
+(make-obsolete-variable 'whitespace-space-after-tab
+ "use the face instead" "24.4")
(defface whitespace-space-after-tab
'((((class mono)) :inverse-video t :weight bold :underline t)
@@ -730,15 +700,9 @@ Used when `whitespace-style' includes the value `space-after-tab'."
(defcustom whitespace-hspace-regexp
- "\\(\\(\xA0\\|\x8A0\\|\x920\\|\xE20\\|\xF20\\)+\\)"
+ "\\(\u00A0+\\)"
"Specify HARD SPACE characters regexp.
-If you're using `mule' package, there may be other characters besides:
-
- \"\\xA0\" \"\\x8A0\" \"\\x920\" \"\\xE20\" \"\\xF20\"
-
-that should be considered HARD SPACE.
-
Here are some examples:
\"\\\\(^\\xA0+\\\\)\" \
@@ -806,7 +770,7 @@ Used when `whitespace-style' includes `tabs'."
"\\([\t \u00A0]+\\)$"
"Specify trailing characters regexp.
-If you're using `mule' package, there may be other characters besides:
+There may be other characters besides:
\" \" \"\\t\" \"\\u00A0\"
@@ -823,13 +787,6 @@ Used when `whitespace-style' includes `trailing'."
(defcustom whitespace-space-before-tab-regexp "\\( +\\)\\(\t+\\)"
"Specify SPACEs before TAB regexp.
-If you're using `mule' package, there may be other characters besides:
-
- \" \" \"\\t\" \"\\xA0\" \"\\x8A0\" \"\\x920\" \"\\xE20\" \
-\"\\xF20\"
-
-that should be considered blank.
-
Used when `whitespace-style' includes `space-before-tab',
`space-before-tab::tab' or `space-before-tab::space'."
:type '(regexp :tag "SPACEs Before TAB")
@@ -844,13 +801,6 @@ Used when `whitespace-style' includes `space-before-tab',
It is a cons where the cons car is used for SPACEs visualization
and the cons cdr is used for TABs visualization.
-If you're using `mule' package, there may be other characters besides:
-
- \" \" \"\\t\" \"\\xA0\" \"\\x8A0\" \"\\x920\" \"\\xE20\" \
-\"\\xF20\"
-
-that should be considered blank.
-
Used when `whitespace-style' includes `indentation',
`indentation::tab' or `indentation::space'."
:type '(cons (regexp :tag "Indentation SPACEs")
@@ -861,13 +811,6 @@ Used when `whitespace-style' includes `indentation',
(defcustom whitespace-empty-at-bob-regexp "^\\(\\([ \t]*\n\\)+\\)"
"Specify regexp for empty lines at beginning of buffer.
-If you're using `mule' package, there may be other characters besides:
-
- \" \" \"\\t\" \"\\xA0\" \"\\x8A0\" \"\\x920\" \"\\xE20\" \
-\"\\xF20\"
-
-that should be considered blank.
-
Used when `whitespace-style' includes `empty'."
:type '(regexp :tag "Empty Lines At Beginning Of Buffer")
:group 'whitespace)
@@ -876,13 +819,6 @@ Used when `whitespace-style' includes `empty'."
(defcustom whitespace-empty-at-eob-regexp "^\\([ \t\n]+\\)"
"Specify regexp for empty lines at end of buffer.
-If you're using `mule' package, there may be other characters besides:
-
- \" \" \"\\t\" \"\\xA0\" \"\\x8A0\" \"\\x920\" \"\\xE20\" \
-\"\\xF20\"
-
-that should be considered blank.
-
Used when `whitespace-style' includes `empty'."
:type '(regexp :tag "Empty Lines At End Of Buffer")
:group 'whitespace)
@@ -896,13 +832,6 @@ Used when `whitespace-style' includes `empty'."
It is a cons where the cons car is used for SPACEs visualization
and the cons cdr is used for TABs visualization.
-If you're using `mule' package, there may be other characters besides:
-
- \" \" \"\\t\" \"\\xA0\" \"\\x8A0\" \"\\x920\" \"\\xE20\" \
-\"\\xF20\"
-
-that should be considered blank.
-
Used when `whitespace-style' includes `space-after-tab',
`space-after-tab::tab' or `space-after-tab::space'."
:type '(regexp :tag "SPACEs After TAB")
@@ -1145,29 +1074,31 @@ See also `whitespace-style', `whitespace-newline' and
(unless whitespace-mode
(whitespace-turn-off)))))))
+(defvar whitespace-enable-predicate
+ (lambda ()
+ (and (cond
+ ((eq whitespace-global-modes t))
+ ((listp whitespace-global-modes)
+ (if (eq (car-safe whitespace-global-modes) 'not)
+ (not (memq major-mode (cdr whitespace-global-modes)))
+ (memq major-mode whitespace-global-modes)))
+ (t nil))
+ ;; ...we have a display (we're running a batch job)
+ (not noninteractive)
+ ;; ...the buffer is not internal (name starts with a space)
+ (not (eq (aref (buffer-name) 0) ?\ ))
+ ;; ...the buffer is not special (name starts with *)
+ (or (not (eq (aref (buffer-name) 0) ?*))
+ ;; except the scratch buffer.
+ (string= (buffer-name) "*scratch*"))))
+ "Predicate to decide which buffers obey `global-whitespace-mode'.
+This function is called with no argument and should return non-nil
+if the current buffer should obey `global-whitespace-mode'.
+This variable is normally modified via `add-function'.")
(defun whitespace-turn-on-if-enabled ()
- (when (cond
- ((eq whitespace-global-modes t))
- ((listp whitespace-global-modes)
- (if (eq (car-safe whitespace-global-modes) 'not)
- (not (memq major-mode (cdr whitespace-global-modes)))
- (memq major-mode whitespace-global-modes)))
- (t nil))
- (let (inhibit-quit)
- ;; Don't turn on whitespace mode if...
- (or
- ;; ...we don't have a display (we're running a batch job)
- noninteractive
- ;; ...or if the buffer is invisible (name starts with a space)
- (eq (aref (buffer-name) 0) ?\ )
- ;; ...or if the buffer is temporary (name starts with *)
- (and (eq (aref (buffer-name) 0) ?*)
- ;; except the scratch buffer.
- (not (string= (buffer-name) "*scratch*")))
- ;; Otherwise, turn on whitespace mode.
- (whitespace-turn-on)))))
-
+ (when (funcall whitespace-enable-predicate)
+ (whitespace-turn-on)))
;;;###autoload
(define-minor-mode global-whitespace-newline-mode
@@ -1271,19 +1202,19 @@ SYMBOL is a valid symbol associated with CHAR.
(defvar whitespace-point (point)
"Used to save locally current point value.
-Used by `whitespace-trailing-regexp' function (which see).")
+Used by function `whitespace-trailing-regexp' (which see).")
(defvar whitespace-font-lock-refontify nil
"Used to save locally the font-lock refontify state.
-Used by `whitespace-post-command-hook' function (which see).")
+Used by function `whitespace-post-command-hook' (which see).")
(defvar whitespace-bob-marker nil
"Used to save locally the bob marker value.
-Used by `whitespace-post-command-hook' function (which see).")
+Used by function `whitespace-post-command-hook' (which see).")
(defvar whitespace-eob-marker nil
"Used to save locally the eob marker value.
-Used by `whitespace-post-command-hook' function (which see).")
+Used by function `whitespace-post-command-hook' (which see).")
(defvar whitespace-buffer-changed nil
"Used to indicate locally if buffer changed.
@@ -1930,14 +1861,8 @@ cleaning up these problems."
;;;; Internal functions
-(defvar whitespace-font-lock-mode nil
- "Used to remember whether a buffer had font lock mode on or not.")
-
-(defvar whitespace-font-lock nil
- "Used to remember whether a buffer initially had font lock on or not.")
-
(defvar whitespace-font-lock-keywords nil
- "Used to save locally `font-lock-keywords' value.")
+ "Used to save the value `whitespace-color-on' adds to `font-lock-keywords'.")
(defconst whitespace-help-text
@@ -2175,8 +2100,6 @@ resultant list will be returned."
;; prepare local hooks
(add-hook 'write-file-functions 'whitespace-write-file-hook nil t)
;; create whitespace local buffer environment
- (set (make-local-variable 'whitespace-font-lock-mode) nil)
- (set (make-local-variable 'whitespace-font-lock) nil)
(set (make-local-variable 'whitespace-font-lock-keywords) nil)
(set (make-local-variable 'whitespace-display-table) nil)
(set (make-local-variable 'whitespace-display-table-was-local) nil)
@@ -2226,10 +2149,6 @@ resultant list will be returned."
(defun whitespace-color-on ()
"Turn on color visualization."
(when (whitespace-style-face-p)
- (unless whitespace-font-lock
- (setq whitespace-font-lock t
- whitespace-font-lock-keywords
- (copy-sequence font-lock-keywords)))
;; save current point and refontify when necessary
(set (make-local-variable 'whitespace-point)
(point))
@@ -2243,163 +2162,100 @@ resultant list will be returned."
nil)
(add-hook 'post-command-hook #'whitespace-post-command-hook nil t)
(add-hook 'before-change-functions #'whitespace-buffer-changed nil t)
- ;; turn off font lock
- (set (make-local-variable 'whitespace-font-lock-mode)
- font-lock-mode)
- (font-lock-mode 0)
- ;; add whitespace-mode color into font lock
- (when (memq 'spaces whitespace-active-style)
- (font-lock-add-keywords
- nil
- (list
- ;; Show SPACEs
- (list whitespace-space-regexp 1 whitespace-space t)
- ;; Show HARD SPACEs
- (list whitespace-hspace-regexp 1 whitespace-hspace t))
- t))
- (when (memq 'tabs whitespace-active-style)
- (font-lock-add-keywords
- nil
- (list
- ;; Show TABs
- (list whitespace-tab-regexp 1 whitespace-tab t))
- t))
- (when (memq 'trailing whitespace-active-style)
- (font-lock-add-keywords
- nil
- (list
- ;; Show trailing blanks
- (list #'whitespace-trailing-regexp 1 whitespace-trailing t))
- t))
- (when (or (memq 'lines whitespace-active-style)
- (memq 'lines-tail whitespace-active-style))
- (font-lock-add-keywords
- nil
- (list
- ;; Show "long" lines
- (list
- (let ((line-column (or whitespace-line-column fill-column)))
- (format
- "^\\([^\t\n]\\{%s\\}\\|[^\t\n]\\{0,%s\\}\t\\)\\{%d\\}%s\\(.+\\)$"
- whitespace-tab-width
- (1- whitespace-tab-width)
- (/ line-column whitespace-tab-width)
- (let ((rem (% line-column whitespace-tab-width)))
- (if (zerop rem)
- ""
- (format ".\\{%d\\}" rem)))))
- (if (memq 'lines whitespace-active-style)
- 0 ; whole line
- 2) ; line tail
- whitespace-line t))
- t))
- (cond
- ((memq 'space-before-tab whitespace-active-style)
- (font-lock-add-keywords
- nil
- (list
- ;; Show SPACEs before TAB (indent-tabs-mode)
- (list whitespace-space-before-tab-regexp
- (if whitespace-indent-tabs-mode 1 2)
- whitespace-space-before-tab t))
- t))
- ((memq 'space-before-tab::tab whitespace-active-style)
- (font-lock-add-keywords
- nil
- (list
- ;; Show SPACEs before TAB (SPACEs)
- (list whitespace-space-before-tab-regexp
- 1 whitespace-space-before-tab t))
- t))
- ((memq 'space-before-tab::space whitespace-active-style)
- (font-lock-add-keywords
- nil
- (list
- ;; Show SPACEs before TAB (TABs)
- (list whitespace-space-before-tab-regexp
- 2 whitespace-space-before-tab t))
- t)))
- (cond
- ((memq 'indentation whitespace-active-style)
- (font-lock-add-keywords
- nil
- (list
- ;; Show indentation SPACEs (indent-tabs-mode)
- (list (whitespace-indentation-regexp)
- 1 whitespace-indentation t))
- t))
- ((memq 'indentation::tab whitespace-active-style)
- (font-lock-add-keywords
- nil
- (list
- ;; Show indentation SPACEs (SPACEs)
- (list (whitespace-indentation-regexp 'tab)
- 1 whitespace-indentation t))
- t))
- ((memq 'indentation::space whitespace-active-style)
- (font-lock-add-keywords
- nil
- (list
- ;; Show indentation SPACEs (TABs)
- (list (whitespace-indentation-regexp 'space)
- 1 whitespace-indentation t))
- t)))
- (when (memq 'empty whitespace-active-style)
- (font-lock-add-keywords
- nil
- (list
- ;; Show empty lines at beginning of buffer
- (list #'whitespace-empty-at-bob-regexp
- 1 whitespace-empty t))
- t)
- (font-lock-add-keywords
- nil
- (list
- ;; Show empty lines at end of buffer
- (list #'whitespace-empty-at-eob-regexp
- 1 whitespace-empty t))
- t))
- (cond
- ((memq 'space-after-tab whitespace-active-style)
- (font-lock-add-keywords
- nil
- (list
- ;; Show SPACEs after TAB (indent-tabs-mode)
- (list (whitespace-space-after-tab-regexp)
- 1 whitespace-space-after-tab t))
- t))
- ((memq 'space-after-tab::tab whitespace-active-style)
- (font-lock-add-keywords
- nil
- (list
- ;; Show SPACEs after TAB (SPACEs)
- (list (whitespace-space-after-tab-regexp 'tab)
- 1 whitespace-space-after-tab t))
- t))
- ((memq 'space-after-tab::space whitespace-active-style)
- (font-lock-add-keywords
- nil
- (list
- ;; Show SPACEs after TAB (TABs)
- (list (whitespace-space-after-tab-regexp 'space)
- 1 whitespace-space-after-tab t))
- t)))
- ;; now turn on font lock and highlight blanks
- (font-lock-mode 1)))
+ ;; Add whitespace-mode color into font lock.
+ (setq
+ whitespace-font-lock-keywords
+ `(
+ ,@(when (memq 'spaces whitespace-active-style)
+ ;; Show SPACEs.
+ `((,whitespace-space-regexp 1 whitespace-space t)
+ ;; Show HARD SPACEs.
+ (,whitespace-hspace-regexp 1 whitespace-hspace t)))
+ ,@(when (memq 'tabs whitespace-active-style)
+ ;; Show TABs.
+ `((,whitespace-tab-regexp 1 whitespace-tab t)))
+ ,@(when (memq 'trailing whitespace-active-style)
+ ;; Show trailing blanks.
+ `((,#'whitespace-trailing-regexp 1 whitespace-trailing t)))
+ ,@(when (or (memq 'lines whitespace-active-style)
+ (memq 'lines-tail whitespace-active-style))
+ ;; Show "long" lines.
+ `((,(let ((line-column (or whitespace-line-column fill-column)))
+ (format
+ "^\\([^\t\n]\\{%s\\}\\|[^\t\n]\\{0,%s\\}\t\\)\\{%d\\}%s\\(.+\\)$"
+ whitespace-tab-width
+ (1- whitespace-tab-width)
+ (/ line-column whitespace-tab-width)
+ (let ((rem (% line-column whitespace-tab-width)))
+ (if (zerop rem)
+ ""
+ (format ".\\{%d\\}" rem)))))
+ ,(if (memq 'lines whitespace-active-style)
+ 0 ; whole line
+ 2) ; line tail
+ whitespace-line prepend)))
+ ,@(when (or (memq 'space-before-tab whitespace-active-style)
+ (memq 'space-before-tab::tab whitespace-active-style)
+ (memq 'space-before-tab::space whitespace-active-style))
+ `((,whitespace-space-before-tab-regexp
+ ,(cond
+ ((memq 'space-before-tab whitespace-active-style)
+ ;; Show SPACEs before TAB (indent-tabs-mode).
+ (if whitespace-indent-tabs-mode 1 2))
+ ((memq 'space-before-tab::tab whitespace-active-style)
+ 1)
+ ((memq 'space-before-tab::space whitespace-active-style)
+ 2))
+ whitespace-space-before-tab t)))
+ ,@(when (or (memq 'indentation whitespace-active-style)
+ (memq 'indentation::tab whitespace-active-style)
+ (memq 'indentation::space whitespace-active-style))
+ `((,(cond
+ ((memq 'indentation whitespace-active-style)
+ ;; Show indentation SPACEs (indent-tabs-mode).
+ (whitespace-indentation-regexp))
+ ((memq 'indentation::tab whitespace-active-style)
+ ;; Show indentation SPACEs (SPACEs).
+ (whitespace-indentation-regexp 'tab))
+ ((memq 'indentation::space whitespace-active-style)
+ ;; Show indentation SPACEs (TABs).
+ (whitespace-indentation-regexp 'space)))
+ 1 whitespace-indentation t)))
+ ,@(when (memq 'empty whitespace-active-style)
+ ;; Show empty lines at beginning of buffer.
+ `((,#'whitespace-empty-at-bob-regexp
+ 1 whitespace-empty t)
+ ;; Show empty lines at end of buffer.
+ (,#'whitespace-empty-at-eob-regexp
+ 1 whitespace-empty t)))
+ ,@(when (or (memq 'space-after-tab whitespace-active-style)
+ (memq 'space-after-tab::tab whitespace-active-style)
+ (memq 'space-after-tab::space whitespace-active-style))
+ `((,(cond
+ ((memq 'space-after-tab whitespace-active-style)
+ ;; Show SPACEs after TAB (indent-tabs-mode).
+ (whitespace-space-after-tab-regexp))
+ ((memq 'space-after-tab::tab whitespace-active-style)
+ ;; Show SPACEs after TAB (SPACEs).
+ (whitespace-space-after-tab-regexp 'tab))
+ ((memq 'space-after-tab::space whitespace-active-style)
+ ;; Show SPACEs after TAB (TABs).
+ (whitespace-space-after-tab-regexp 'space)))
+ 1 whitespace-space-after-tab t)))))
+ (font-lock-add-keywords nil whitespace-font-lock-keywords t)
+ (when font-lock-mode
+ (font-lock-fontify-buffer))))
(defun whitespace-color-off ()
"Turn off color visualization."
;; turn off font lock
(when (whitespace-style-face-p)
- (font-lock-mode 0)
(remove-hook 'post-command-hook #'whitespace-post-command-hook t)
(remove-hook 'before-change-functions #'whitespace-buffer-changed t)
- (when whitespace-font-lock
- (setq whitespace-font-lock nil
- font-lock-keywords whitespace-font-lock-keywords))
- ;; restore original font lock state
- (font-lock-mode whitespace-font-lock-mode)))
+ (font-lock-remove-keywords nil whitespace-font-lock-keywords)
+ (when font-lock-mode
+ (font-lock-fontify-buffer))))
(defun whitespace-trailing-regexp (limit)
diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el
index 5402b0ec204..fb62b039d79 100644
--- a/lisp/wid-edit.el
+++ b/lisp/wid-edit.el
@@ -526,7 +526,16 @@ Otherwise, just return the value."
"Extract the default external value of WIDGET."
(widget-apply widget :value-to-external
(or (widget-get widget :value)
- (widget-apply widget :default-get))))
+ (progn
+ (when (widget-get widget :args)
+ (let (args)
+ (dolist (arg (widget-get widget :args))
+ (setq args (append args
+ (if (widget-get arg :inline)
+ (widget-get arg :args)
+ (list arg)))))
+ (widget-put widget :args args)))
+ (widget-apply widget :default-get)))))
(defun widget-match-inline (widget vals)
"In WIDGET, match the start of VALS."
diff --git a/lisp/window.el b/lisp/window.el
index 63d75f60e1e..5b001988ddf 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -1340,7 +1340,7 @@ violate size restrictions of WINDOW or its child windows."
delta))
(t 0)))
-(defun window--resizable-p (window delta &optional horizontal ignore trail noup nodown)
+(defun window-resizable-p (window delta &optional horizontal ignore trail noup nodown)
"Return t if WINDOW can be resized vertically by DELTA lines.
WINDOW must be a valid window and defaults to the selected one.
For the meaning of the arguments of this function see the
@@ -1943,7 +1943,7 @@ instead."
;; nil or the minibuffer window is active, resize the minibuffer
;; window.
(window--resize-mini-window minibuffer-window (- delta)))
- ((window--resizable-p window delta horizontal ignore)
+ ((window-resizable-p window delta horizontal ignore)
(window--resize-reset frame horizontal)
(window--resize-this-window window delta horizontal ignore t)
(if (and (not window-combination-resize)
@@ -1969,6 +1969,14 @@ instead."
(t
(error "Cannot resize window %s" window)))))
+(defun window-resize-no-error (window delta &optional horizontal ignore)
+ "Resize WINDOW vertically if it is resizable by DELTA lines.
+This function is like `window-resize' but does not signal an
+error when WINDOW cannot be resized. For the meaning of the
+optional arguments see the documentation of `window-resize'."
+ (when (window-resizable-p window delta horizontal ignore)
+ (window-resize window delta horizontal ignore)))
+
(defun window--resize-child-windows-skip-p (window)
"Return non-nil if WINDOW shall be skipped by resizing routines."
(memq (window-new-normal window) '(ignore stuck skip)))
@@ -2594,7 +2602,7 @@ negative, shrink selected window by -DELTA lines or columns."
;; If the selected window is full height and `resize-mini-windows'
;; is nil, resize the minibuffer window.
(window--resize-mini-window minibuffer-window (- delta)))
- ((window--resizable-p nil delta horizontal)
+ ((window-resizable-p nil delta horizontal)
(window-resize nil delta horizontal))
(t
(window-resize
@@ -2627,7 +2635,7 @@ Also see the `window-min-height' variable."
;; If the selected window is full height and `resize-mini-windows'
;; is nil, resize the minibuffer window.
(window--resize-mini-window minibuffer-window delta))
- ((window--resizable-p nil (- delta) horizontal)
+ ((window-resizable-p nil (- delta) horizontal)
(window-resize nil (- delta) horizontal))
(t
(window-resize
@@ -2901,7 +2909,7 @@ that is its frame's root window."
(set-window-new-normal
sibling (+ (window-normal-size sibling horizontal)
(window-normal-size window horizontal))))
- ((window--resizable-p window (- size) horizontal nil nil nil t)
+ ((window-resizable-p window (- size) horizontal nil nil nil t)
;; Can do without resizing fixed-size windows.
(window--resize-siblings window (- size) horizontal))
(t
@@ -3678,7 +3686,7 @@ lines or columns tall. If SIZE is negative, make the new window
absolute value can be less than `window-min-height' or
`window-min-width'; so this command can make a new window as
small as one line or two columns. SIZE defaults to half of
-WINDOW's size. Interactively, SIZE is the prefix argument.
+WINDOW's size.
Optional third argument SIDE nil (or `below') specifies that the
new window shall be located below WINDOW. SIDE `above' means the
@@ -3710,7 +3718,6 @@ scrollbars are inherited from WINDOW. If WINDOW is an internal
window, these properties as well as the buffer displayed in the
new window are inherited from the window selected on WINDOW's
frame. The selected window is not changed by this function."
- (interactive "i")
(setq window (window-normalize-window window))
(let* ((side (cond
((not side) 'below)
@@ -4440,13 +4447,13 @@ value can be also stored on disk and read back in a new session."
(let ((delta (- (cdr (assq 'total-height item))
(window-total-height window)))
window-size-fixed)
- (when (window--resizable-p window delta)
+ (when (window-resizable-p window delta)
(window-resize window delta)))
;; Else check whether the window is not high enough.
(let* ((min-size (window-min-size window nil ignore))
(delta (- min-size (window-total-size window))))
(when (and (> delta 0)
- (window--resizable-p window delta nil ignore))
+ (window-resizable-p window delta nil ignore))
(window-resize window delta nil ignore))))
;; Adjust horizontally.
(if (memq window-size-fixed '(t width))
@@ -4454,13 +4461,13 @@ value can be also stored on disk and read back in a new session."
(let ((delta (- (cdr (assq 'total-width item))
(window-total-width window)))
window-size-fixed)
- (when (window--resizable-p window delta)
+ (when (window-resizable-p window delta)
(window-resize window delta)))
;; Else check whether the window is not wide enough.
(let* ((min-size (window-min-size window t ignore))
(delta (- min-size (window-total-size window t))))
(when (and (> delta 0)
- (window--resizable-p window delta t ignore))
+ (window-resizable-p window delta t ignore))
(window-resize window delta t ignore))))
;; Set dedicated status.
(set-window-dedicated-p window (cdr (assq 'dedicated state)))
@@ -5211,7 +5218,7 @@ live."
(* (window-total-size (frame-root-window window))
height))))
(delta (- new-height (window-total-size window))))
- (when (and (window--resizable-p window delta nil 'safe)
+ (when (and (window-resizable-p window delta nil 'safe)
(window-combined-p window))
(window-resize window delta nil 'safe))))
((functionp height)
@@ -5227,7 +5234,7 @@ live."
(* (window-total-size (frame-root-window window) t)
width))))
(delta (- new-width (window-total-size window t))))
- (when (and (window--resizable-p window delta t 'safe)
+ (when (and (window-resizable-p window delta t 'safe)
(window-combined-p window t))
(window-resize window delta t 'safe))))
((functionp width)
diff --git a/lisp/winner.el b/lisp/winner.el
index dfbd15b6676..f521ba0521b 100644
--- a/lisp/winner.el
+++ b/lisp/winner.el
@@ -45,10 +45,8 @@
(if (featurep 'xemacs)
`(if ,store (zmacs-activate-region)
(zmacs-deactivate-region))
- `(setq mark-active ,store)))))
- (if (boundp 'mark-active)
- mark-active
- (region-active-p)))
+ `(if ,store (activate-mark) (deactivate-mark))))))
+ (region-active-p))
(defalias 'winner-edges
(if (featurep 'xemacs) 'window-pixel-edges 'window-edges))
diff --git a/lisp/woman.el b/lisp/woman.el
index e5d5ac1660f..1cead32ab2f 100644
--- a/lisp/woman.el
+++ b/lisp/woman.el
@@ -949,6 +949,7 @@ or different fonts."
(defun woman-default-faces ()
"Set foreground colors of italic and bold faces to their default values."
+ (declare (obsolete choose-completion-guess-base-position "23.2"))
(interactive)
(face-spec-set 'woman-italic (face-user-default-spec 'woman-italic))
(face-spec-set 'woman-bold (face-user-default-spec 'woman-bold)))
@@ -956,6 +957,7 @@ or different fonts."
(defun woman-monochrome-faces ()
"Set foreground colors of italic and bold faces to that of the default face.
This is usually either black or white."
+ (declare (obsolete choose-completion-guess-base-position "23.2"))
(interactive)
(set-face-foreground 'woman-italic 'unspecified)
(set-face-foreground 'woman-bold 'unspecified))
@@ -1303,12 +1305,12 @@ cache to be re-read."
((null (cdr files)) (car (car files))) ; only 1 file for topic.
(t
;; Multiple files for topic, so must select 1.
- ;; Unread the command event (TAB = ?\t = 9) that runs the command
- ;; `minibuffer-complete' in order to automatically complete the
- ;; minibuffer contents as far as possible.
- (setq unread-command-events '(9)) ; and delete any type-ahead!
- (completing-read "Manual file: " files nil 1
- (try-completion "" files) 'woman-file-history))))))
+ ;; Run the command `minibuffer-complete' in order to automatically
+ ;; complete the minibuffer contents as far as possible.
+ (minibuffer-with-setup-hook
+ (lambda () (let ((this-command this-command)) (minibuffer-complete)))
+ (completing-read "Manual file: " files nil 1
+ (try-completion "" files) 'woman-file-history)))))))
(defun woman-select (predicate list)
"Select unique elements for which PREDICATE is true in LIST.
@@ -1550,11 +1552,13 @@ Also make each path-info component into a list.
(woman-dired-define-keys)
(add-hook 'dired-mode-hook 'woman-dired-define-keys))
+(declare-function dired-get-filename "dired"
+ (&optional localp no-error-if-not-filep))
+
;;;###autoload
(defun woman-dired-find-file ()
"In dired, run the WoMan man-page browser on this file."
(interactive)
- ;; dired-get-filename is defined in dired.el
(woman-find-file (dired-get-filename)))
@@ -1826,8 +1830,6 @@ Argument EVENT is the invoking mouse event."
["Use Full Frame Width" woman-toggle-fill-frame
:active t :style toggle :selected woman-fill-frame]
["Reformat Last Man Page" woman-reformat-last-file t]
- ["Use Monochrome Main Faces" woman-monochrome-faces t]
- ["Use Default Main Faces" woman-default-faces t]
["Make Contents Menu" (woman-imenu t) (not woman-imenu-done)]
"--"
["Describe (Wo)Man Mode" describe-mode t]
@@ -1947,6 +1949,9 @@ Optional argument REDRAW, if non-nil, forces mode line to be updated."
(message "Woman fill column set to %s."
(if woman-fill-frame "frame width" woman-fill-column)))
+(declare-function apropos-print "apropos"
+ (do-keys spacing &optional text nosubst))
+
(defun woman-mini-help ()
"Display WoMan commands and user options in an `apropos' buffer."
;; Based on apropos-command in apropos.el
diff --git a/lisp/xt-mouse.el b/lisp/xt-mouse.el
index 9ee6c51c07c..745bca7a2be 100644
--- a/lisp/xt-mouse.el
+++ b/lisp/xt-mouse.el
@@ -135,20 +135,6 @@ http://invisible-island.net/xterm/ctlseqs/ctlseqs.html)."
(terminal-parameter nil 'xterm-mouse-y))))
pos)
-;; Read XTerm sequences above ASCII 127 (#x7f)
-(defun xterm-mouse-event-read ()
- ;; We get the characters decoded by the keyboard coding system. Try
- ;; to recover the raw character.
- (let ((c (read-event)))
- (cond ;; If meta-flag is t we get a meta character
- ((>= c ?\M-\^@)
- (- c (- ?\M-\^@ 128)))
- ;; Reencode the character in the keyboard coding system, if
- ;; this is a non-ASCII character.
- ((>= c #x80)
- (aref (encode-coding-string (string c) (keyboard-coding-system)) 0))
- (t c))))
-
(defun xterm-mouse-truncate-wrap (f)
"Truncate with wrap-around."
(condition-case nil
@@ -167,7 +153,7 @@ http://invisible-island.net/xterm/ctlseqs/ctlseqs.html)."
;; Normal terminal mouse click reporting: expect three bytes, of the
;; form <BUTTON+32> <X+32> <Y+32>. Return a list (EVENT-TYPE X Y).
(defun xterm-mouse--read-event-sequence-1000 ()
- (list (let ((code (- (xterm-mouse-event-read) 32)))
+ (list (let ((code (- (read-event) 32)))
(intern
;; For buttons > 3, the release-event looks differently
;; (see xc/programs/xterm/button.c, function EditorButton),
@@ -188,19 +174,19 @@ http://invisible-island.net/xterm/ctlseqs/ctlseqs.html)."
(setq xterm-mouse-last code)
(format "down-mouse-%d" (+ 1 code))))))
;; x and y coordinates
- (- (xterm-mouse-event-read) 33)
- (- (xterm-mouse-event-read) 33)))
+ (- (read-event) 33)
+ (- (read-event) 33)))
;; XTerm's 1006-mode terminal mouse click reporting has the form
;; <BUTTON> ; <X> ; <Y> <M or m>, where the button and ordinates are
;; in encoded (decimal) form. Return a list (EVENT-TYPE X Y).
(defun xterm-mouse--read-event-sequence-1006 ()
(let (button-bytes x-bytes y-bytes c)
- (while (not (eq (setq c (xterm-mouse-event-read)) ?\;))
+ (while (not (eq (setq c (read-event)) ?\;))
(push c button-bytes))
- (while (not (eq (setq c (xterm-mouse-event-read)) ?\;))
+ (while (not (eq (setq c (read-event)) ?\;))
(push c x-bytes))
- (while (not (memq (setq c (xterm-mouse-event-read)) '(?m ?M)))
+ (while (not (memq (setq c (read-event)) '(?m ?M)))
(push c y-bytes))
(list (let* ((code (string-to-number
(apply 'string (nreverse button-bytes))))