在emacs实现VIM和textmate的两个特色功能。。。

来源:互联网 发布:淘宝手机助手 登录失败 编辑:程序博客网 时间:2024/05/29 08:19
不知道你有没有碰到过这样的需要,就是在用两个窗口(在emacs或者vi中的window)编写两个文件时 ,忽然觉得应该把两个窗体的内容(buffer)互换一下,方便查看,这在gvim中,使用Ctrl-w r就可以完成。
---号称无敌的emacs没有这个内置的功能~~

还有一个功能在textmate(macOS和ruby扇子的最爱) 和eclipse的编辑器中有有,就是选定一些文本行,再按alt + up或者alt+down,被选中的文本就会在buffer中逐行穿梭。这在修改程序时相当实用。
---诶,号称无敌的emacs又没有这个内置的功能~~

不过emacs之所以号称无敌就是因为我们可以很轻松实现这两个功能——在emacs lisp中。

(defun circle-windows ()
  "旋转当前frame中的所有windows"
  (interactive)
  (let ((owindow (selected-window))
        (obuffer (current-buffer))
        )
    (while (not (equal owindow (next-window)))
      (set-window-buffer (selected-window) (window-buffer (next-window)))
      (select-window (next-window)))
    (set-window-buffer (selected-window) obuffer)
    (select-window owindow)))

(defun move-region-around (direction beg end)
  (let (real-beg
        real-end
        target-beg
        deactivate-mark
        text)
    (save-excursion
      (goto-char beg)
      (setq real-beg (line-beginning-position))
     
      (when (equal direction 'up)
        (setq target-beg (line-beginning-position 0)))
     
      (goto-char end)
      (setq real-end (line-beginning-position 2))
     
      (when (equal direction 'down)
        (setq target-beg (copy-marker (line-beginning-position 3)))) ;must use marker
     
      (setq text (buffer-substring-no-properties real-beg real-end))
      (delete-region real-beg real-end)
      (goto-char target-beg)
      (insert text)
      )

    (set-mark (+ target-beg (- real-end real-beg 1)))
    (goto-char target-beg)
    (setq transient-mark-mode 'only)))


(defun move-region-up (beg end)
  (interactive "r")
  (move-region-around 'up beg end))

(defun move-region-down (beg end)
  (interactive "r")
  (move-region-around 'down beg end))

(global-set-key (quote [M-up]) (quote move-region-up))
(global-set-key (quote [M-down]) (quote move-region-down))
(global-set-key "/C-c2" 'circle-windows)


注:alt+up/down的使用和textmate是一样的,在区区的办公室PC上,还把alt+left/right也实现了,同事说过于华丽不实用,所以就不贴;
窗体互换的热键是ctrl-c 2,这并不是一个很好的设定,不过ctrl-w是区区用惯的backward-delete-word不能改~
原创粉丝点击