常说没吃过猪肉, 还没见过猪跑
, 可是我天天吃猪肉,竟然也能被忽悠。
刚刚在 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, 给我感觉很不错。
我指的 buffer_menu 就是 mouse 点击的位置,弹出来的那个 menu. 我看到你用那个 menu 很方便的切换 buffer. 我想了解那个菜单是如何定制的?
稍等,只要一下载视频,速度那个慢啊。
刚刚又发现你用 Emacs 一个奇葩的地方,就是每个 do 后面得加个空格才会自动补 end, 而且,你还把行尾空格高亮显示。哈哈
#6 楼 @zw963 喔。这个是用 emacs-rails 插件的,我自己也 hack 了一点,https://github.com/sishen/emacs-rails
比如 C-c C-c g g 就是显示所有的 migration,也就是你看到的这个。然后直接用方向键选择。
嗯,提醒一下有 trailing whitespace,而且每次 save 的时候会自动删除。
你这么一说我还想起来了,是不是咱社区有人提过,好像 emacs-rails 有这个功能。我好像也有,等下换上试试。
至于那个 do, 我觉得没必要那样。直接给 do 定义一个 snippet 不就好了。do + TAB, 多省劲儿呀。少敲一个空格,少敲一个回车。
你不忙的话,我想请教你一个问题,就是现在其他还好,就是写测试这块儿还没有养成一个习惯,尤其是你在视频中所说帮助整理思路... 那种 feeling 也正是我所追求的。现在就是两个选择,RSpec 和 Minitest, 觉得都挺好,但是都不熟练,我想知道你怎么看这两个测试框架,还有就是:真正咱们国内这个圈子里面,到底用那个的人多一些?
哦。我如果要加代码块参数,会是 do1, 其实同样一个 snippet, 也可以通过 C-d 来实现。
知道了,我再考虑下吧。倒是不在乎那个,关键圈子里朋友大家都用,才是正理。
你可以帮我个忙吗?一直闹心,没有系统的学过 Emacs-lisp. 也怪刚开始,没有太专注于 Lisp.
废话少说,我希望实现这样一个简单函数,针对一个双引号的字符串,例如:" this is a string", 首先调用 Emacs 的 ooking-back 函数 , 获取光标之前的第一个 match-beginning 数据 (这里就是开始的那个双引号), 然后调用 looking-at, 获取光标之后的那个双引号的位置。最后,将两个 mark 之间的字符串中的双引号替换为单引号。
废话太多了,总之,我就是希望通过一个快捷键,实现以下功能:
当光标在一个字符串内时,如果这个字符串使用双引号包含,那么就换为单引号包含,如果是单引号包含,就换为双引号包含。我不知道你是否有这个需求,不过 autopair-mode 很好,就是在以上情形下,很讨厌。
如果你有其他实现或 Emacs Wiki 上类似功能的代码片段,请给我介绍一下。
(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)
)
谢谢你啦~ 呵呵,有时候就是需要这样提示一下,就可以搞定了。也许很简单,可是如果没有你的提示,我肯定要放弃了。
下面贴出完整的版本,参考了你的代码。会自动判断光标两侧是双引号还是单引号,并自动切换。而且也添加了简单的边界判断 (不允许跨行), 你完全可以把他绑定到一个快键上。我直接绑定到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 么?. 你也试试。
我觉得我的实现应该有点多余。
你看下这个帮助:
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 来获取位置呢?
其实也无所谓,因为 lisp 实在是不熟,所以,Emacs 我向来的准则是:不管多丑陋,也不用管效率,只要实现功能就行...