在写代码时,写完括号里内容,如何直接开始下一行?

写这样的一个elisp要怎样写呀,我觉的这是一个比较实用的问题

Paredit

参考了这里介绍的方法,绑定了跟 Sublime Text 一样的快捷键

(defun newline-without-break-of-line ()
"1. move to end of the line.
 2. insert newline with index"
  (interactive)
  (let ((oldpos (point)))
    (end-of-line)
    (newline-and-indent)))
(global-set-key (kbd "<M-return>") 'newline-without-break-of-line)

thank you ,非常感谢你的回答

paredit要智能的多, 比如 https://github.com/manateelazycat/lazycat-emacs/blob/master/site-lisp/extensions/lazycat/paredit-extension.el 中的 paredit-close-round-and-newline+ 的函数

这个函数只会跳出当前右括号,而不是暴力的跳到行尾去换行,在elisp中比较智能

不,跳出当前括号,根本不需要那么复杂,我改个快捷键自己就出来了,有些东西根本不需要用插件来实现

如果你光标后面有连续多个右括号的时候, 你就知道跳出当前右括号换行比跳到行尾再换行的行为要正确的多, 特别是对于 Lisp 这种括号很多的语言.

1.跳出右括号,我只需要将按键改为->的功能,并不需要依靠插件, 2.正因为后面有一大堆括号,所以才需要直接跳到下一行

paredit 能够智能的区分右括号是字符串的 “右括号字符串” 还是 “有语法意义的右括号”, 如果只是简单的搜索右括号, 字符串里面有右括号的时候第一次会识别错.

如果你在 Lisp 写代码, 就会发现复杂的 if … else 等逻辑, 你需要在当前右括号跳出, 因为你直接跳过当前行后面的所有右括号, 你会发现你跳出了很多逻辑块, 然后你又要返回去找刚才中间的逻辑块位置.

Anyway, 我只是告诉你 paredit 对于Lisp编程的中间换行是更好的方案, 如果你不喜欢, 那是你的选择, 我不再会和你讨论到底哪个方案更好, 最后都是你个人的选择.

开启paredit之后newline-and-indent没有自动改成paredit的newline,而) ] <backspace>都自动改了,是我配置的问题?还是默认如此?


另外装了个alfred没有明白该怎么用好它,有兴趣开个帖子介绍一下或者给点资料么?

知乎上好像有一些帖子介绍Alfred的workflow的,去年痛下心买了Alfred^ ^,到现在也不太会用,只用作软件快速跳转。(我也想要点资料)

光标移动到行末,然后按换行键,如:C-e RET。任何编辑器大概都能如此。

1 个赞

跟括号有什么关系呢?你不就是想把跳行末和RET绑一起吗?就像楼上说的。我还以为和这个括号有什么关系呢

是的呀,根本不需要他说的那个东西呀,所以我很郁闷呀,

如果只是单纯的开始下一行,单独为此设一个快捷键是不可取的。

快捷键是稀缺资源。明明 C-e RET 就能做到,为什么要浪费?

快捷键在于精,不在多。配置复杂,快捷键多了,什么奇怪的按键组合都用上,徒增记忆负担。不如少一点快捷键,可以从容安排,安排得有条理:例如有快捷键 f 表示 forward,很自然就会想到 b 表示 backward,如果快捷键多到爆了,就很难协调。

不要迷信迷信快捷键,不要每想到一个功能就设置快捷键,用 emacs 应该首先想到如何不用快捷键或减少快捷键,很多扩展都是为了这个目标设计的,比如 yasnippet 就是个例子,输入 ifTAB 得到 if (...) {...},输入 forTAB 得到 for (..; ..; ..) {...},而不是每个都对应单独的快捷键。

写 elisp 其实有一半甚至更多的情况,是在处理括号/结构的匹配。比较少能很能爽快 C-e RET 的,不是有个段子么,特工去 NASA 偷代码,到手最后几页,结果全是 ))))

识别括号/语法单元,就是 paredit & smartparens 擅长的。

2 个赞

选择适合你的方法就好。我写c/c++用下面的代码,绑定在C-j,现在用着挺好,以后遇到其他问题再改就是。

(defun +my-cc/cc-newline()
  "Insert semicolon at end of line, and `newline-and-indent'"
  (interactive)
  (end-of-line)
  (delete-trailing-whitespace)
  (when (not (equal (char-before) 59))
    (insert ";"))
  (newline-and-indent))