瞎扯淡 坑爹, 今天着实让 Emacs 把我忽悠了一回.

zw963 · 2012年07月27日 · 最后由 jinleileiking 回复于 2012年07月30日 · 4485 次阅读

常说没吃过猪肉, 还没见过猪跑, 可是我天天吃猪肉,竟然也能被忽悠。

刚刚在 railscast-china 看了咱社区这位仁兄@yedingding的一个视频,链接如下:

http://railscasts-china.com/assets/episodes/video/013-live-show-with-ye-dingding-1.mp4

也许是标题栏的 apple 风格欺骗了我,

也许是这位仁兄用 Emacs, 没有隐藏 toolbar 和 menubar.

也许是使用 multi-tab 的界面的缘故

也许因为显示器太大 (我估计是那种大屏的苹果一体机吧), mode-line 我根本没有注意到。

其实隐隐约约觉得挺熟悉,尤其是视频中使用点开那个 buffer-menu 时,觉得和 Emacs 好像!可是还是没想到是 Emacs. 直到@poshboytl提及说这是 Emacs, 我才知道,原来这就是 Emacs.

真囧啊~~

@yedingding, 顺便问下,是不是通过 Control + 鼠标左键 点击出来的那个 buffer-menu 呢?这是你自己设定的吧。你是改的 msb-mode 还是直接修改了 mouse-buffer-menu 呢?给分享下代码喽。我很少那样用,不过看你通过那个方式选择 buffer, 给我感觉很不错。

发现视频没法在线看,为了看是什么编辑器,然后下载视频中,还有两小时...

#1 楼 @luoping0425

你真幽默。我都说了是 Emacs, 你还看。

#2 楼 @zw963 17" MBP, :). 在 Mac 下我一直用 Aquamacs 的。我没理解你说的 buffee-menu 具体指什么...

#3 楼 @yedingding

我指的 buffer_menu 就是 mouse 点击的位置,弹出来的那个 menu. 我看到你用那个 menu 很方便的切换 buffer. 我想了解那个菜单是如何定制的?

#4 楼 @zw963 求截图... 我很少用鼠标操作... 1 是在 Controllers/Models/etc list 过长的时候,2 是在选 buffer 的时候有多种匹配的时候

#5 楼 @yedingding

稍等,只要一下载视频,速度那个慢啊。

刚刚又发现你用 Emacs 一个奇葩的地方,就是每个 do 后面得加个空格才会自动补 end, 而且,你还把行尾空格高亮显示。哈哈

#6 楼 @zw963 喔。这个是用 emacs-rails 插件的,我自己也 hack 了一点,https://github.com/sishen/emacs-rails

比如 C-c C-c g g 就是显示所有的 migration,也就是你看到的这个。然后直接用方向键选择。

嗯,提醒一下有 trailing whitespace,而且每次 save 的时候会自动删除。

#7 楼 @yedingding

你这么一说我还想起来了,是不是咱社区有人提过,好像 emacs-rails 有这个功能。我好像也有,等下换上试试。

至于那个 do, 我觉得没必要那样。直接给 do 定义一个 snippet 不就好了。do + TAB, 多省劲儿呀。少敲一个空格,少敲一个回车。

你不忙的话,我想请教你一个问题,就是现在其他还好,就是写测试这块儿还没有养成一个习惯,尤其是你在视频中所说帮助整理思路... 那种 feeling 也正是我所追求的。现在就是两个选择,RSpec 和 Minitest, 觉得都挺好,但是都不熟练,我想知道你怎么看这两个测试框架,还有就是:真正咱们国内这个圈子里面,到底用那个的人多一些?

#8 楼 @zw963 do 是这样的... 因为大部分时候是 do |xxx|

我目前测试基本是 RSpec + Capybara + Jasmine。MiniTest 接触不多,没好好看过 MiniTest,所以无法来做对比,用户群的话谨慎估计目前 RSpec 居多,但是 MiniTest 会慢慢跟上,因为 Rails Core Team 在推。把纠结用哪个框架的时候用来纠结如何写测试吧,:)

#9 楼 @yedingding

哦。我如果要加代码块参数,会是 do1, 其实同样一个 snippet, 也可以通过 C-d 来实现。

知道了,我再考虑下吧。倒是不在乎那个,关键圈子里朋友大家都用,才是正理。

#9 楼 @yedingding

你可以帮我个忙吗?一直闹心,没有系统的学过 Emacs-lisp. 也怪刚开始,没有太专注于 Lisp.

废话少说,我希望实现这样一个简单函数,针对一个双引号的字符串,例如:" this is a string", 首先调用 Emacs 的 ooking-back 函数 , 获取光标之前的第一个 match-beginning 数据 (这里就是开始的那个双引号), 然后调用 looking-at, 获取光标之后的那个双引号的位置。最后,将两个 mark 之间的字符串中的双引号替换为单引号。

废话太多了,总之,我就是希望通过一个快捷键,实现以下功能:

当光标在一个字符串内时,如果这个字符串使用双引号包含,那么就换为单引号包含,如果是单引号包含,就换为双引号包含。我不知道你是否有这个需求,不过 autopair-mode 很好,就是在以上情形下,很讨厌。

如果你有其他实现或 Emacs Wiki 上类似功能的代码片段,请给我介绍一下。

#11 楼 @zw963 无任何边界判断的版本。

(defun quote-repair ()
    "Convert the double quote to single quote"
    (interactive)
    (setq begin-pos (search-backward "\"" nil t))
    (setq end-pos (search-forward "\"" nil t 2))
    (perform-replace "\"" "'" nil nil nil nil nil begin-pos end-pos)
)

#12 楼 @yedingding

谢谢你啦~ 呵呵,有时候就是需要这样提示一下,就可以搞定了。也许很简单,可是如果没有你的提示,我肯定要放弃了。

下面贴出完整的版本,参考了你的代码。会自动判断光标两侧是双引号还是单引号,并自动切换。而且也添加了简单的边界判断 (不允许跨行), 你完全可以把他绑定到一个快键上。我直接绑定到Meta + '上了。只要在字符串上按下快键就好了。

P.S. 原先你那个版本实际使用会有问题,如果本行没有,他会替换很多行之前 (或之后) 的引号,会把程序搞乱的。

(defun swap-quote ()
  "Convert the double quote to single quote, per contra"
  (interactive)
  (if (and (looking-back "^.*\"[^\"\n]*") (looking-at "[^\"\n]*\".*$"))
      (save-excursion
        (progn
          (setq begin-pos (search-backward "\"" nil t))
          (setq end-pos (search-forward "\"" nil t 2))
          (perform-replace "\"" "'" nil nil nil nil nil begin-pos end-pos)))
    (if (and (looking-back "^.*'[^'\n]*") (looking-at "[^'\n]*'.*$"))
        (save-excursion
          (progn
            (setq begin-pos (search-backward "'" nil t))
            (setq end-pos (search-forward "'" nil t 2))
            (perform-replace "'" "\"" nil nil nil nil nil begin-pos end-pos))))))

@skandhas 最近还在坚持用 Emacs 么?. 你也试试。

#12 楼 @yedingding

我觉得我的实现应该有点多余。

你看下这个帮助:


looking-at is a built-in function in `C source code'.

(looking-at REGEXP)

Return t if text after point matches regular expression REGEXP.
This function modifies the match data that `match-beginning',
`match-end' and `match-data' access; save and restore the match
data if you want to preserve them.

我觉得是不是应该有办法直接通过 match-end, match-beginning 来获取位置呢?

#12 楼 @yedingding

其实也无所谓,因为 lisp 实在是不熟,所以,Emacs 我向来的准则是:不管多丑陋,也不用管效率,只要实现功能就行...

#13 楼 @zw963 嗯,因为是你自己按快捷键来替换的.. 所以假设是可用的环境,没有严格考虑边界。

比如 "This's a str'ing" I'm kidding "lolcat", 就彻底混乱了...

#15 楼 @zw963 做库的话就完全不同了,:)

两个 emacs 神之间的对话,vimer 完全不懂的路过..

#18 楼 @jinleileiking

我刚来社区那会儿,你就整天喊着要换,还没开始行动?

#13 楼 @zw963 收下了!thx!Emacs 现在一直在用。

#19 楼 @zw963 没有时间啊..呵呵

需要 登录 后方可回复, 如果你还没有账号请 注册新账号