GNU Emacs 24.3 即将发布

GNU Emacs 将于28日发布新的 24.3 版本。感谢 xfq 来稿

GNU Emacs 24.3主要为用户添加了如下新特性(相对于24.2):

  • 默认的X toolkit现在是Gtk+3了。如果你configure的时候不用“--with-x-toolkit”/“--with-x-toolkit=gtk”/“--with-x-toolkit=yes”,configure就会尝试Gtk+3, 如果失败,再尝试Gtk+2。当然,如果你愿意,你也可以用“--with-x-toolkit=gtk2”或者“--with-x-toolkit=gtk3”来configure。

  • 新的configure选项 “--enable-link-time-optimization”,只有用GCC 4.5.0编译的以后的才能用哦。

  • 新的configure选项 “--without-all” 可以关闭各种默认打开的可选特性(比如图像支持等等)。

  • 新的configure选项 “--enable-gcc-warnings” (用于开发和调试Emacs). 如果你用GCC编译Emacs,这可以打开编译时的一些错误检查。

  • configure选项 “--enable-use-lisp-union-type”被改名为“--enable-check-lisp-object-type”,因为Lisp_Object这个类型不再用union来实现了。

  • configure选项 “--disable-maintainer-mode”被移除了,因为没什么人用。

  • 如果你的系统上有libtinfo的话,Emacs不再使用libncurses。

  • 在FreeBSD和NetBSD上,configure不再把/usr/local/lib和/usr/pkg/lib添加到链接器的搜索路径。你若想用,必须自己加。

  • “rcs-checkin”和“vcdiff”这两个脚本被删除了(从bin和libexec目录)。前一个是因为没什么人用了,后一个是因为被vc-sccs替代了。

  • “--no-site-lisp”这个命令行参数现在也可以在Mac OS X上用了。

  • “C-h f” (“describe-function”) 现在可以知道autoloading了。当这个命令被调用时,如果docstring里有key substitution的话,那个函数的feature会被自动load,所以文档将被正确的显示。若要关闭此特性,把“help-enable-auto-load”设置为nil。

  • “C-h f” 现在把之前autoload过的函数显示为“autoloaded”了。

  • ImageMagick支持默认开启。“imagemagick-register-types”函数在Emacs启动时默认执行。

  • 把“imagemagick-types-inhibit”设置为t就会禁用ImageMagick支持。

  • 在minibuffer的文件名prompt里,“C-M-f”和“C-M-b”现在可以分别移动到下一个和前一个目录分割符了。不过这个功能ido和Icicles都可以很轻松的做到。

  • 你可以在mode line的coding system indicator按鼠标中键来调用“set-buffer-file-coding-system”了。

  • emacsclient现在遵循“initial-buffer-choice”这个变量了。

  • 新变量 “server-auth-key”可以指定一个分享式server key了。

  • Emacs现在可以在致命错误上显示backtrace了。

  • “C-x C-q”现在被绑定到了新的次要模式 “read-only-mode”,这个次要模式替代了“toggle-read-only”。

  • 大部分的“y-or-n”提示现在允许你在不退出提示的情况下滚动窗口了。

  • 在Package菜单中,新包会被标记为"new"。

  • 如果你从bzr.sv.gnu.org的repository里的代码编译Emacs,新变量“emacs-bzr-version”会包含你用的Emacs revision。这个在报告bug的时候还是很有用的。

  • 新变量 “enable-remote-dir-locals”,如果不为nil,允许远程目录局部变量的设置。

  • PCL-CVS的命令被从Tools菜单剔除,PCL-CVS的命令现在只能通过键盘调用。

  • 文件局部变量"unibyte: t"被弃用,请使用"coding: raw-text"。

  • 波斯语支持

  • 新的输入法“vietnamese-vni”

  • 在Mac OS X下终于可以使用native fullscreen了,真心不容易。

  • 新的键绑定:“M-g c”绑定到“goto-char”

  • 新的键绑定:“M-g TAB”绑定到“move-to-column”

  • “M-g TAB” (“move-to-column”)如果被交互式(无prefix argument)调用,提示输入列名。

  • 新变量“yank-handled-properties”允许操作召回后的文本属性,而不是移除它们。

  • “C-u M-=”现在可以计算整个缓冲区的行数、字数和单词数了。

  • “C-x 8 RET”被绑定到了“insert-char”,“ucs-insert”被弃用。

  • “z”不再在大部分模式中有命令绑定,这个键以前被绑定为“kill-this-buffer”,但是 “z”太容易被误按了。

  • 调用CL现在需要用 “(require ”cl-lib)”了。“cl-lib”和原来的“cl”差不多,除了“cl-lib”用了更清爽的命名空间,也就是说,所有的函数、宏、变量都有了"cl-"前缀或者"cl--"前缀。如果“cl”有一个特性名为“foo”,那么“cl-lib”的名字就叫“cl-foo”,除了少数 叫做“foo”的被改名为“cl-foo”而不是“cl-foo”。

  • 当当前区域被激活时,dired的“m” (“dired-mark”), “u” (“dired-unmark”),“DEL” (“dired-unmark-backward”)和“d” (“dired-flag-file-deletion”)将mark/unmark/flag激活区域中所有的文件。

  • GHDL编译器被支持。

  • VHDL-AMS的支持被更新。

  • Apropos的face现在可以直接定制了。这些face的名字为“apropos-symbol”,“apropos-keybinding”,等等。详细请见“apropos”定制组,这里就不细说了。

  • 定制apropos的老方法被移除(“apropos-symbol-face”, “apropos-keybinding-face”等等)

  • buffer menu被完全重写,变量“Buffer-menu-buffer+size-width”被弃用,请使用“Buffer-menu-name-width”和“Buffer-menu-size-width”。

  • 你可以定制日历上每个月的标题,请看变量“calendar-month-header”的文档。

  • 新的LaTeX日历风格,请看“cal-tex-cursor-week2-summary”。

  • Compile包有了一个新变量 “compilation-always-kill”。

  • “custom-reset-button-menu”现在默认为t

  • 变量“term-default-fg-color”和“term-default-bg-color”被弃用。

  • 你可以定制ANSI终端颜色了(通过定制“term-color-”,“term-color-underline”和“term-color-bold”这些faces)。

  • notifications.el现在支持Notifications API 1.2了。

  • Flymake现在运用边缘位图来显示错误和警告,请看 “flymake-fringe-indicator-position”, “flymake-error-bitmap”和“flymake-warning-bitmap”.

  • FFAP变量“ffap-url-unwrap-remote”可以是一个链表,默认为'("ftp").

  • 新变量 “mouse-avoidance-banish-position”可以指定“banish”mouse avoidance的移动位置。

  • 新变量 “async-shell-command-buffer”可以指定当“Async Shell Command”正在被用的时候使用的缓冲区。

  • “which-func-modes”的新默认值是t,所以如果Which Function mode被启用,将被用于所有的主要模式。

  • “follow-intercept-processes”变量被移除。

  • “javascript-generic-mode”被弃用。

  • 很多钩子变量被改名:

    • semantic-lex-reset-hooks -> semantic-lex-reset-functions
    • semantic-change-hooks -> semantic-change-functions
    • semantic-edits-new-change-hooks -> semantic-edits-new-change-functions
    • semantic-edits-delete-change-hooks -> semantic-edits-delete-change-functions
    • semantic-edits-reparse-change-hooks -> semantic-edits-reparse-change-functions
    • semanticdb-save-database-hooks -> semanticdb-save-database-functions
    • c-prepare-bug-report-hooks -> c-prepare-bug-report-hook
    • rcirc-sentinel-hooks -> rcirc-sentinel-functions
    • rcirc-receive-message-hooks -> rcirc-receive-message-functions
    • rcirc-activity-hooks -> rcirc-activity-functions
    • rcirc-print-hooks -> rcirc-print-functions
    • dbus-event-error-hooks -> dbus-event-error-functions
    • eieio-pre-method-execution-hooks -> eieio-pre-method-execution-functions
    • checkdoc-style-hooks -> checkdoc-style-functions
    • checkdoc-comment-style-hooks -> checkdoc-comment-style-functions
    • archive-extract-hooks -> archive-extract-hook
    • filesets-cache-fill-content-hooks -> filesets-cache-fill-content-hook
    • hfy-post-html-hooks -> hfy-post-html-hook
    • nndiary-request-create-group-hooks -> nndiary-request-create-group-functions
    • nndiary-request-update-info-hooks -> nndiary-request-update-info-functions
    • nndiary-request-accept-article-hooks -> nndiary-request-accept-article-functions
    • gnus-subscribe-newsgroup-hooks -> gnus-subscribe-newsgroup-functions
    • input-method-inactivate-hook -> input-method-deactivate-hook
    • robin-inactivate-hook -> robin-deactivate-hook
    • quail-inactivate-hook -> quail-deactivate-hook
  • 被弃用的包:

    • assoc.el 大多数情况下,assoc+member+push+delq可以工作的非常好。而且这也是个让人头疼的包:不清晰的语义,低下的效率,还有不干净的命名空间。
    • bruce.el
    • cust-print.el
    • ledit.el
    • mailpost.el
    • mouse-sel.el
    • patcomp.el
  • 以“*”开头的docstring不再表示用户选项。只有用defcustom定义的变量才被看做用户选项。函数“user-variable-p”被弃用,请使用“custom-variable-p”。

  • “defalias”, “defun”和“defmacro”的返回值有所改变,现在的值是未定义。

  • “set-buffer-multibyte” 现在在窄化缓冲区中不能使用了。

  • CL的“get-setf-method”函数将不复存在。

  • “dbus-register-signal”的参数将不只是字符串,而是关键字和关键字-字符串对。

  • 一些函数改名了:

    • hangul-input-method-inactivate -> hangul-input-method-deactivate
    • inactivate-input-method -> deactivate-input-method
    • quail-inactivate -> quail-deactivate
    • robin-inactivate -> robin-deactivate
    • viper-inactivate-input-method -> viper-deactivate-input-method
    • viper-inactivate-input-method-action -> viper-deactivate-input-method-action
    • ucs-input-inactivate -> ucs-input-deactivate
  • 改名的变量:

    • follow-deactive-menu -> follow-inactive-menu
    • inactivate-current-input-method-function -> deactivate-current-input-method-function
  • 全新的基于样例的Elisp profiler。你可以试一试用M-x profiler-start, 干一些其他事,然后M-x profiler-report。结束时,用M-x profiler-stop。

  • 新的宏“setq-local” and “defvar-local”。

  • 下划线的face可以用波浪线了。

  • 新的错误类型和新的函数“user-error”,他们不会触发Lisp调试器。

  • 新变量 “debugger-bury-or-kill”,用来决定退出Lisp调试器的方法。

  • 新命令“fit-frame-to-buffer”,这个命令可以自动调整当前frame的大小。

  • 命令“fit-window-to-buffer”可以调整frame的高度(如果新变量 “fit-frame-to-buffer” 不为nil)

  • 新宏“with-temp-buffer-window”,和“with-output-to-temp-buffer”相似。

  • “temp-buffer-resize-mode”不再调整被重用的窗口的大小。

  • 新变量 “switch-to-buffer-preserve-window-point”,可以在切换缓冲区时恢复一个窗口的光标位置。

  • 函数“get-lru-window”, “get-mru-window”和“get-largest-window”现在有了第三个参数,可以防止选择当前窗口。

  • 以下变量被弃用,因为他们能够被GNU Emacs 24.1中引入的“display-buffer-alist”替代:

    • “dired-shrink-to-fit”
    • “display-buffer-reuse-frames”
    • “display-buffer-function”
    • “special-display-buffer-names”
    • “special-display-frame-alist”
    • “special-display-function”
    • “special-display-regexps”
  • “current-time-string”不再要求参数中的年份在1000到9999之间了,现在,只要是C能支持的年份,它都能支持。

  • 处理浮点型变量的函数现在在遇到错误时会返回NaN而不是报错,如(log -1.0) => NaN。原来Emacs在有些平台上报错,却在另外一些平台上返回NaN。影响到的函数有:acos, asin, tan, exp, expt,log, log10, sqrt,还有mod.

  • “kbd” 现在是一个函数而不是一个宏了。

  • 新函数“autoloadp”可以测试参数是不是autoloaded对象。

  • 新函数“buffer-narrowed-p”可以测试缓冲区是否被窄化。

  • “posnp”可以测试一个对象是否是“posn”。

  • 新函数“system-users”可以返回当前用户名。

  • 新函数“system-groups”可以返回当前组名。

  • Cygwin编译的Emacs可以用MS Losedows的UI了,用configure的“--with-w32”就可以,不过默认的还是X11的UI。

  • Cygwin编译的Emacs将有2个新函数:“cygwin-convert-file-name-from-windows” 和“cygwin-convert-file-name-to-windows”。

  • 当Emacs在Losedows下用-nw参数调用时(cmd.exe),新版的Emacs可以支持“mouse-highlight”, help-echo (在echo area),和“mouse-autoselect-window”。

  • 在MS-Losedows Vista后的版本中,Emacs将支持符号链接。

  • 在“M-x report-emacs-bug”生成的缓冲区中,“C-c m”快捷键已被改为“C-c M-i” (“report-emacs-bug-insert-to-mailer”)。之前的快捷键是一个错误,因为“C-c LETTER”是为了留给用户自定义的。

当然,除了以上新特性,还有各种bug修复,这里就不细说了。因为最近Chong Yidong比较忙,所以他把Emacs的release management交给了Glenn Morris(从1月9日的Emacs pretest 24.2.92开始)。有关 GNU Emacs 24.3 的更多详情,可查看emacs-24的branch changes。Happy hacking!

Read More:

61 Comments

  1. 1 Iven 评论 @ 2013-02-27 10:02Reply to this comment

    我当年也曾这么翻译过特性列表……

  2. 2 ET 评论 @ 2013-02-27 10:21Reply to this comment

    内置的CEDET也更新啦~

  3. 3 Zer4tul 评论 @ 2013-02-27 11:07Reply to this comment

    除了少数 叫做“foo”的被改名为“cl-foo”而不是“cl-foo”

    这地方手误了?两个都是“cl-foo”,其中有一个是cl_foo?

  4. 4 operabug 评论 @ 2013-02-27 11:08Reply to this comment

    gun emacs什么时候启动能够快一点啊........

  5. 5 jiazhoulvke 评论 @ 2013-02-27 11:45Reply to this comment

    vim用户发来贺电

  6. 6 cylinc 评论 @ 2013-02-27 13:02Reply to this comment

    默认的X toolkit现在是Gtk+3了:这个是指界面是GTK3了吗?

  7. 7 Z.Shang 评论 @ 2013-02-27 13:20Reply to this comment

    VIM用户发来贺电,顺便默认使用evil就好了……

  8. 8 xfq 评论 @ 2013-02-27 15:30Reply to this comment

    @ET: Org/Gnus/CEDET/Calc/nXML/DBUS这些的更新我都没写,太多了写不过来。

  9. 9 xfq 评论 @ 2013-02-27 15:33Reply to this comment

    @Zer4tul: 是因为星号被解释成了标签,谢谢指出。

  10. 10 xfq 评论 @ 2013-02-27 15:38Reply to this comment

    Emacs支持很多的X toolkit,比如gtk2、gtk3、athena、motif等等,“默认的X toolkit现在是Gtk+3”是指:如果你系统里有Gtk+3的库,并且使用./configure的默认选项编译的Emacs,界面就是Gtk+3的。

  11. 11 xfq 评论 @ 2013-02-27 15:40Reply to this comment

    @Zer4tul: 晕……又被解释了。。是

    标签……

  12. 12 xfq 评论 @ 2013-02-27 15:43Reply to this comment

    @Zer4tul: pre不管用..是em标签……markdown好像可以用

    \*literal asterisks\*

    来escape,我下次试一下……

  13. 13 比尔盖子 评论 @ 2013-02-27 15:43Reply to this comment

    > Cygwin编译的Emacs可以用MS Losedows的UI了。 亮了。

  14. 14 Kardinal 评论 @ 2013-02-27 21:10Reply to this comment

    我的emacs终于又要升级了么?话说前两天才狠了狠心,把goto-char绑定到了 "M-g g"

    “kbd” 现在是一个函数而不是一个宏了。……这个真是情何以堪呐

    对了yasnippet除了按顺序编辑域,镜像域,还有什么功能?好像你很喜欢它,介绍下参考参考

  15. 15 xfq 评论 @ 2013-02-27 22:06Reply to this comment

    @Kardinal:

    Yas的代码我没好好看过,喜欢是因为毕竟作者是咱中国人,而且用起来确实很方便。我对它的了解仅限于知道这些:

    • 支持好多好多语言;

    • 可以自动创建snippet,手写貌似也不是很难;

    • 可以和helm整合的很好;

    • 和TextMate的snippet语法很像,并且可以导入TextMate的snippet;

    • 命名中各种斜杠,各种不习惯;

    • 菜单写的挺不错的;

    • 可定制性还算不错。

    当然,基本的用法我还是比较熟悉的。

  16. 16 ibear 评论 @ 2013-02-27 22:50Reply to this comment

    没意思,版本号都让chrome超过了

  17. 17 Kardinal 评论 @ 2013-02-27 23:46Reply to this comment

    好多好多语言和textmate的语法倒不是问题,我现在弄的这个在一定程度上兼容 yasnippet 的语法……除了需要计算表达式的部分……主要是这部分已经抽象出来了,比如("\$" (lambda(s p o)(eval (read s))),这个是表syntax-delimiter中的内容,意思是定义中,$符号后面的部分按后面的表达式计算,三个参数分别是定义中 $ 符号后面的字符串,生成overlay时的原始位置,生成的overlay,只要改下这条内容,就可以定义不同行为

    自动创建这个好像有点意思,不过感觉用的人不会太多

    各种斜杠这个……如果不是这个原因,兴许我就研究研究怎么改进下yasnippet了

    菜单这个我不弄了,主要是我不会-__-!!也不值得我会。yas的用户接口貌似也就一般情况,似乎要接到auto-complete才好用……这个我不喜欢……不过倒是不用自己负责清除插入前缓冲区中的冗余代码了,清除冗余代码这块确实出乎意料的很不好弄,用narrow-to-region然后全删再插,效果还勉强一点,但是倒霉催的我,设置了一个选项,可以原样插入snippet或者使用上下文的缩进……所以这个办法也不能用了

    接口这方面,我想设置几个简单的关键词,比如可以匹配的模式(而不是每种模式都要有对应的文件),上下文(比如说在文档头部,直接插入文件头模板)等,但是要在snippet文件中写入额外的关键词信息……不知道这样做好不好,反正我已经把文件格式改了-__-!!!

    我那个现在已经可以试验一下了,下载整个文件夹,加载了l-snippets.el文件后,写个单词然后执行命令 l-snippets-expand(目前只弄了三条emacs-lisp-mode的,分别是test defun 和 let(let这个是使用其它语法的,但是运行时多格式支持还没弄好,所以先展开let的话,另外两个就展不开了-__-!!)),虽然条目比较少,但是目测我这个和条目的数量是无关的,无论多少个差别都不大;还有就是清除已经输入的代码这部分,请自动过滤

    目前正准备通过扩展支持动态插入overlay,就是插入snippets后,有时可能还需要在snippet中再插入overlay(比如参数的数目就不是固定的),相关的功能;还有就是比较智能点的匹配……

    不过这两天没怎么弄,在想一个很重要的问题,类似于多态的机制吧,比如说,输入一个 for ,然后有计数器循环和迭代器循环两种,然后插入哪个呢?是让用户选择?还是先递增输入,先插入相同的部分,等用户决定后面的部分?还是直接自己判断该插入哪条?第一种难度最小,但是我最不喜欢的方法……这块有什么建议没有

    其实我问的意思是,在表面看来,除了按tab到下一个域,然后有些镜像域,还有什么明显的特征?今天我搜索了下textmate的使用方法,里面有一个是在注释后插入当前语句的运行结果,倒有点意思

  18. 18 Kardinal 评论 @ 2013-02-27 23:53Reply to this comment

    helm 是个啥东东?

  19. 19 xfq 评论 @ 2013-02-28 6:43Reply to this comment

    memqmemberassq还有assoc这些函数的效率都比一般的循环要快。我觉得把数据结构重组成可以用这些函数的样子还是挺值得的。

  20. 20 xfq 评论 @ 2013-02-28 6:55Reply to this comment

    @Kardinal:

    Helm是个很不错的包。主要功能是递增式补全和缩小选择范围功能。她能够帮你在Emacs中掌舵(所以叫helm),比如帮你找缓冲区、文件、函数等等。

    Helm是Tamas Patrovic写的anything.el的fork,新的代码比原来的更清新,体积更小,更加模块化,而且没有那么多的“向下兼容”的代码。

    安装的话,在MELPA上就可以装。Helm是Preclude里自带的,你如果装了preclude,helm自然就有了。

    Helm wiki: https://github.com/emacs-helm/helm/wiki

  21. 21 xfq 评论 @ 2013-02-28 15:45Reply to this comment

    今天不一定能够发布,因为bug #13546还有点小问题。

    (居然又要推迟……之前本来准备只发布2个pretest的,因为一个bootstrap问题、一个关于OpenBSD/VAX的小问题还有一些有关鼠标处理的问题又发布了第三个pretest。。各种跳票啊...)

  22. 22 xfq 评论 @ 2013-03-03 6:26Reply to this comment

    发布时间改为了3月4日。

  23. 23 Kardinal 评论 @ 2013-03-03 20:18Reply to this comment

    l-snippets 的基本功能已经差不多了(包括动态插入)

    下载这个文件夹 https://github.com/ran9er/init.emacs/tree/master/l-snippets

    load里面的那个 l-snippets.el 文件,在emacs-lisp-mode下,输入 “defun”然后 M-x l-snippets-expand

    tab 跳到参数那个括号里,随意输入点,按空格……

    这个就是动态插入。如果只是这样的话,早就弄好了。但是加入模板扩展功能时,发现复杂程度超出了我的预期,光是模板采用什么样的格式都想了好几天……后来决定再嵌入snippets的定义(也就是说嵌套定义snippets)……

    这块必须要说的是,开始的时候,分词用的是先序遍历,比较复杂……我灵机一动,改成后序遍历,清爽了……结果今天发现,要实现嵌套定义snippets,用后序不给力……TMD,咬咬牙又给改了回来……为了适应模板扩展,今天改了很多的地方,包括运行时多格式语法支持(在读取模板时直接加载相关语法格式)……总之太TMD痛苦了

  24. 24 xfq 评论 @ 2013-03-04 15:48Reply to this comment

    再次推迟了…… 因为OpenBSD 4.x下的编译问题: http://lists.gnu.org/archive/html/emacs-devel/2013-03/msg00023.html

  25. 25 Fengyuan Chen 评论 @ 2013-03-04 16:54Reply to this comment

    @xfq:

    我真的崩溃了。。。。。。纠结死我了。。。。。。

  26. 26 xfq 评论 @ 2013-03-05 19:50Reply to this comment

    刚刚发布了rc1: ftp://alpha.gnu.org/gnu/emacs/pretest/emacs-24.3-rc1.tar.xz

    预计在一周内发布24.3...

    MirBSD的问题……

  27. 27 Kardinal 评论 @ 2013-03-05 23:14Reply to this comment

    今天把智能匹配做的差不多了(应该是叫智能匹配吧?说起来真TMD郁闷,我把一些相关的想法、笔记记到了一个org文件里,结果刚才用magit加入整个文件夹的时候,org文件显示了出来,我点了下k给删了……本来我以为只是在git的版本库里删除,没想到竟然是真的删除了……)当然,是通过扩展做的

    现在终于可以直接在 scratch 里测试了,而不用专门新建一个临时的文件了,这下舒服多了

    这个功能作用是,现在文件名只是一个 snippet 名称而已,而与模式什么的无关……不用每个模式都有对应的文件,可以直接在 snippet 文件里写上其可以插入的模式。

    可以给 snippet 定义多个 alias ,比如 snippet-defun ,并不一定必须扩展 “defun” 这个单词,你还可以给它定义 def df 这样的alias

    还有就是关键词系统,有一个列表来定义,比如其中一条为“(head (progn (skip-chars-backward " \t\n")(bobp)))”,第一条是关键词,只要expand snippet的时候,第二条的测试条件符合,就可以获得第一个关键词。如果多个条目都匹配一定数目的关键词,那么选用匹配关键词数量最多的那个(如果有必要,还可以给关键词设置权重……这个临时还没有)

    另外有一种三个条目的列表项,“(,major-mode major-mode t)”,如果第三个条目为t,说明这条是严格条目,第一条的内容必须要有(因为临时还没想到除了modes还有什么是严格的,所以在snippets定义文件中,这部分直接用 “<------modes”代表了)

  28. 28 Kardinal 评论 @ 2013-03-05 23:19Reply to this comment

    虽然现在文件名和智能匹配无关,但是原始的,暂时叫二逼匹配吧,是和文件名有关的,如果不用smart-match.el这个扩展,那么还是需要正确的文件名的

  29. 29 Kardinal 评论 @ 2013-03-05 23:37Reply to this comment

    另外我看了下yasnippets,发现他的定义中提供了一些指代……目前我知道的只有yas-text这个,这个需要插入后计算的。l-snippets原来只能支持插入时计算,所以我做了一个 callback 的扩展来支持这种功能。一个典型的功能就是镜像域改变为大写形式,这个我做好了样例,alias 是 uc 或者 upcase

    当然,snippet定义中还是有点复杂,因为我没有提供类似 yas-text 这样的指代,而是通过参数传递当前的overlay……首先,如非必要不用宏,这个是大师的教导,显然不用宏也可以作到;用函数指代的话,在目前这个作用域混乱的时期,是不安全的……实际上在各种条件下,只有参数传递是靠谱的,甚至包括一些别的语言

    如果有必要,可以考虑通过扩展实现对于yas格式的兼容(通过运行期支持多语法),但是有些确实是没法支持的,比如我在 yas 的测试文件中看到一个例子,在一个域的范围内定义另一个域(其实不太有用,第一个域改动后,无法定位第二个域),因为我需要嵌入定义的snippets在插入后运行时解析(未来的模板扩展功能),和这个是冲突的

  30. 30 Kardinal 评论 @ 2013-03-05 23:41Reply to this comment

    还有就是因为要同时支持插入时和插入后计算,为了区别,目前插入后计算只能使用 lambda 表达式的形式,这个比较二 -__-!!!主要是格式区别的问题,又懒把格式识别这块弄出来……又复杂又没什么用

  31. 31 xfq 评论 @ 2013-03-06 6:30Reply to this comment

    list-system-process函数在BSD上的支持真的不好弄:

    OpenBSD的porting guide写的也不太好: http://www.openbsd.org/faq/ports/guide.html

  32. 32 xfq 评论 @ 2013-03-06 6:38Reply to this comment

    @Kardinal: 刚才简单看了下代码,感觉还行,体积也很小巧。版本控制这个我没有用Magit,我在用DVC,因为我是Emacs的开发者,需要用bzr。

  33. 33 xfq 评论 @ 2013-03-06 6:39Reply to this comment

    @Kardinal: 顺便问下,l-snippet中的l是什么意思?

  34. 34 Kardinal 评论 @ 2013-03-06 8:30Reply to this comment

    算是 lite 吧……当时顺手按了个字母……你知道的,起名字不是技术问题,而是哲学问题

  35. 35 Kardinal 评论 @ 2013-03-06 8:46Reply to this comment

    不过我正在考虑换个响亮的名字?比如说x-snippets,z-snippets -___-!!!主要是用其它单词别人不知道这是干什么的,这方面你有什么建议没有?

    还有就是不打算单独弄一个模式出来了……主要问题是我不会 -___-!!!,那个没有什么必要,运行期的开销主要是注册一些函数,一个用来索引的表,一个用来缓存的哈希表

  36. 36 xfq 评论 @ 2013-03-06 12:39Reply to this comment

    NetBSD的状况也差不多: http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/sys/sysctl.h?rev=1.205&content-type=text/x-cvsweb-markup&onlywithtag=MAIN

  37. 37 xfq 评论 @ 2013-03-06 12:45Reply to this comment

    @Kardinal: 起名字这个我也不擅长……模式这个其实不是很困难,特别是次要模式,更简单。了解下define-minor-modedefine-globalized-minor-mode就差不多了。

  38. 38 Kardinal 评论 @ 2013-03-06 15:25Reply to this comment

    怎么把列表转换为字符串,原来用的 pp-to-string ,后来发现,它竟然会给我省略一部分,用“...”代替,真是太会偷懒了

  39. 39 Kardinal 评论 @ 2013-03-06 15:54Reply to this comment

    其实很多扩展没有必要弄成 minor-mode 甚至是 major-mode……过度包装了

  40. 40 xfq 评论 @ 2013-03-06 16:09Reply to this comment

    @Kardinal: 你可以试试把print-lengthprint-levelselective-display-ellipses这些变量设置成nil,我没有试过,不知行否。

  41. 41 xfq 评论 @ 2013-03-06 16:10Reply to this comment

    @Kardinal: 同意,global-whitespace-mode就是一个例子。

  42. 42 xfq 评论 @ 2013-03-06 16:20Reply to this comment

    @Kardinal: 刚才瞎想了几个名字,仅供参考,不好的话完全可以忽略:

    • LINY -- LINY Is Not Yasnippet
    • EmacSnippet
    • LESM -- Lightweight Emacs Snippet Mode
    • SESM -- Superior Emacs Snippet Mode
  43. 43 Kardinal 评论 @ 2013-03-06 23:48Reply to this comment

    你太有才了,第一个名字就很好,完全阐释了我的理念-__-!!!就用这个了

    正好睡觉前把这个体力活干了

    进度:做了一个艰难的决定,插入时计算提供了三个指代 str ovl pos ,分别是参数(字符串)/当前overlay/当前位置,另外由于计算时还没有生成当前snippet的链表,所以不能进行和当前snippet相关的操作,只是操作它自身。为此在 end 域准备了一个 snippet-read 的项,snippet 插入完成后运行,可以对当前snippet整体进行操作

    这样做是因为我尝试作一个文档头的snippet,但是在每行行首根据模式插入注释符有点太二了,所以决定用comment-region,分别在头部及尾部插入域,以获取起止位置,见 https://github.com/ran9er/init.emacs/blob/master/l-snippets/snippets/head

    还是有点复杂,回头我考虑下插入域的同时生成链表

    另外还有一个模板扩展,这个比较复杂,可能要对插入snippet的函数再进行修改……好吧,我是在逃避

    我又想到了一个功能,比如这样一句(mapcar (lambda(x)(car car car car car car car)) (list list list list list list list))(请脑补细节),如果一行能装下,就放在一行,如果一行装不下,设置几个断行点,自动断行……有没有?

    你说的那个 print-length 啥的我试试,越是这样不起眼的地方,越是憋死人……

  44. 44 Kardinal 评论 @ 2013-03-06 23:57Reply to this comment

    管用,这个可以有

  45. 45 Kardinal 评论 @ 2013-03-07 0:03Reply to this comment

    liny LINY lInY lINY INY 这几个哪个好?

  46. 46 Kardinal 评论 @ 2013-03-07 0:05Reply to this comment

    还有一个关键的问题,怎么整,搜索替换么??

  47. 47 xfq 评论 @ 2013-03-07 15:52Reply to this comment

    rc2发布: ftp://alpha.gnu.org/gnu/emacs/pretest/emacs-24.3-rc2.tar.xz

    相对于rc1,只有configure和sysdep.c有变化。

  48. 48 xfq 评论 @ 2013-03-07 15:56Reply to this comment

    @Kardinal: 自动换行?不知refill/auto-fill/visual-line-mode行不?

  49. 49 xfq 评论 @ 2013-03-07 16:01Reply to this comment

    @Kardinal: 我建议全部大写,因为我能想到的递归缩写都是全部大写,比如:GNU、XNU、EINE(EINE Is Not Emacs)、GNE(GNE's Not an Encyclopedia)、KDE(KDE Desktop Environment)还有ZWEI(ZWEI Was EINE Initially)等等。而且在Emacs中也有全部大写的包,比如IELM。

  50. 50 xfq 评论 @ 2013-03-07 16:16Reply to this comment

    @Kardinal: 突然想到2个只是首字母大写的:Bing—Bing is not google,还有Wine—Wine Is Not an Emulator。(第一个是闹着玩的 ;-))

    我建议symbol名中用小写前缀,doc string中如果不引用其他函数/变量/宏,使用大写,如:

    (defgroup liny nil
      "Visual insertion of LINY."
      :group 'abbrev
      :group 'convenience)
    

    关于如何替换,我也没有很完美的办法。暂时想到的就是用dired-do-query-replace-regexp或者tags-query-replace,你可以试试。

  51. 51 xfq 评论 @ 2013-03-09 9:37Reply to this comment

    rc3: ftp://alpha.gnu.org/gnu/emacs/pretest/emacs-24.3-rc3.tar.xz

  52. 52 Kardinal 评论 @ 2013-03-09 19:53Reply to this comment

    已经改名了,为了稳妥起见,用的 query-replace。

    改进了一些小细节,现在退出 snippet 的时候有提示;smart-match 修正了下,不抽风了

    开始设想的功能,只剩下模板扩展了,实现起来出乎意料的简单……当然,还没有进行测试……因为字符串解析又出了问题,所有的环节都要改成先序遍历,才能正确的解析,还有一个比较复杂的没有改完

  53. 53 Fengyuan Chen 评论 @ 2013-03-11 11:57Reply to this comment

    emacs 24.3 is released :D

  54. 54 xfq 评论 @ 2013-03-11 19:09Reply to this comment

    That's true.

    @Fengyuan Chen: 传送门: http://lists.gnu.org/archive/html/info-gnu-emacs/2013-03/msg00001.html

  55. 55 xfq 评论 @ 2013-03-11 22:16Reply to this comment

    @Kardinal: format%S也可以把列表转为字符串。

  56. 56 Kardinal 评论 @ 2013-03-12 16:23Reply to this comment

    用前面你说的办法已经解决了,主要是让它格式好看点所以用pp

    liny 的模板扩展已经基本实现了……为了适应它改动了很多地方……alias 是 co, 跳到form 的时候,再往下跳,会插入新的 “(TEST form)”而且是两个field

    不过动态扩展的模板还没有和前面的连接起来,这块还得接着抽象一下才好使……应该比较快

    前面我说的嵌套定义snippets没什么用的话收回,今天发现原来可以这样用:最外层的field 是默认语句,同意的话,跳到该语句的默认参数上;不同意的话,整个语句换掉。不过应该不难,弄完了当前这块实现一下

    加了一个扩展,现在可以选择跳转的时候是按插入时的顺序,还是按snippet定义中的数字顺序

    试试 24.3 先

  57. 57 Kardinal 评论 @ 2013-03-12 16:26Reply to this comment

    只有源码么?这让我用 windows 的情何以堪

  58. 58 Kardinal 评论 @ 2013-03-12 23:12Reply to this comment

    增加了一个新角色 cur :当snippet 定义中只有一个 $0 时,原样输入,并且光标定位在 $0 的位置

  59. 59 xfq 评论 @ 2013-03-13 15:09Reply to this comment

    目前还没有官方的24.3 for Windows,OSX已经有了。

    你可以先用这个: https://www.dropbox.com/sh/uigdfnb9x7b8ta1/RlHNiwBQ57

    其实自己编译没你想的那么难。

    Ps: 话说这里不是LinuxTOY么…

  60. 60 Kardinal 评论 @ 2013-03-13 23:06Reply to this comment

    其实编译对我来说很简单,C 语言也懂点的说……但咱是文艺青年不是……

    PS:秘密泄漏了……其实emacs在windows下字体显示效果不错……主要是日程挺紧张,也和 IT 没关系,能见缝插针玩下 emacs 就不错了,折腾不起啊

  61. 61 xfq 评论 @ 2013-03-19 13:02Reply to this comment

    今天发布了Losedows版: http://ftp.gnu.org/gnu/emacs/windows/