使用viper + vimpulse在Emacs中时,Vim宏无法工作

4
任何其他的调整,使emacs尽可能地像vim一样,也将不胜感激。
附加说明:我不只是使用vim的主要原因是,我喜欢emacs如何让你在两个不同的框架中打开文件[添加:抱歉,这很令人困惑:我指的是单独的窗口,emacs称之为“框架”]。就像制作垂直分割一样,但我不必拥有一个巨大的窗口。

1
太棒了 - 你是第一个使用赏金的人! - Jarrod Dixon
1
FYI,vim 可以让你在同一个 vim 实例的两个不同部分打开相同的文件。你也可以使用 vim 标签页。这不是一个解决方案,而是一个观察结果。 - Jack M.
9个回答

7
你可以在客户端服务器模式下运行VIM,然后你可以有两个窗口连接到一个实例,因此不需要Emacs。

1
Dreeves:是的,这正是 pida IDE 所做的,而且它运行良好。 - Ali Afshar

3

我不知道如何使用Vim宏,但既然您要求将Emacs尽可能地调整为类似于Vim的样式,这里有一些我每天使用的vimpulse补充:

(define-key viper-vi-global-user-map [(delete)] 'delete-char)
(define-key viper-vi-global-user-map "/" 'isearch-forward-regexp)
(define-key viper-vi-global-user-map "?" 'isearch-backward-regexp)
(define-key viper-vi-global-user-map "\C-wh" 'windmove-left)
(define-key viper-vi-global-user-map "\C-wj" 'windmove-down)
(define-key viper-vi-global-user-map "\C-wk" 'windmove-up)
(define-key viper-vi-global-user-map "\C-wl" 'windmove-right)
(define-key viper-vi-global-user-map "\C-wv" '(lambda () (interactive)
                                                (split-window-horizontally)
                                                (other-window 1)
                                                (switch-to-buffer (other-buffer))))

(define-key viper-visual-mode-map "F" 'viper-find-char-backward)
(define-key viper-visual-mode-map "t" 'viper-goto-char-forward)
(define-key viper-visual-mode-map "T" 'viper-goto-char-backward)
(define-key viper-visual-mode-map "e" '(lambda ()
                                         (interactive)
                                         (viper-end-of-word 1)
                                         (viper-forward-char 1)))

(push '("only" (delete-other-windows)) ex-token-alist)
(push '("close" (delete-window)) ex-token-alist)

当然,学习Emacs也非常重要,但是Emacs依赖于定制才能使其按照您的意愿行事。而且默认的Vim键绑定非常舒适,使用Viper只意味着Viper为您进行了一些Emacs定制。
至于使用Vim而不是Emacs,我喜欢Vim,但我喜欢Lisp系统的交互性,这就是Emacs。在编辑器中输入一行代码并立即通过一个按键进行评估,使用单个按键(C-M-x)从编辑器中更改或检查编辑器的状态(包括实时文档),同时它正在运行。

2

我没有任何关于viper或vimpulse的技巧可以给你,但是我建议你尝试一下follow-mode。

当然,我也建议你开始学习Emacs。如果你已经这么深入了,那么最好完成一下教程,也许看看emacswiki。


1

Emacs+vimpulse很棒,但我认为它正确的工作流是要大量地使用emacs命令来搭配vim快捷键。 例如,emacs的宏快捷键F3和F4比vim的qq和@q要更容易。 此外,emacs命令通过Alt+x访问,而不是:命令。尽管vimpulse支持一些重要的vim命令,但它们只是为了兼容性而存在。

以下是我的vimpulse特定自定义设置。

.emacs

   ; I use C-d to quit emacs and vim
   (vimpulse-global-set-key 'vi-state (kbd "C-d") 'save-buffers-kill-terminal)
   ; use ; instead of :
   (vimpulse-global-set-key 'vi-state (kbd ";") 'viper-ex)
   ; use C-e instead of $. This works for all motion command too! (e.g. d C-e is easier to type than d$)
   (vimpulse-global-set-key 'vi-state (kbd "C-e") 'viper-goto-eol)
   (defun t_save() (interactive)(save-buffer)(viper-change-state-to-vi)) 
   (global-set-key (kbd "\C-s") 't_save) ; save using C-s instead of :w<CR> or C-x-s

    (defun command-line-diff (switch)
          (let ((file1 (pop command-line-args-left))
                (file2 (pop command-line-args-left)))
            (ediff file1 file2)))

    ;; Usage: emacs -diff file1 file2 (much better then vimdiff)
    (add-to-list 'command-switch-alist '("-diff" . command-line-diff))

如果你喜欢终端,可以使用emacs -nw。在这种情况下,这个剪贴板插件非常有用。http://www.lingotrek.com/2010/12/integrating-emacs-with-x11-clipboard-in.html .viper
    (setq viper-inhibit-startup-message 't)
    (setq viper-expert-level '3)
    (setq viper-ESC-key "\C-c") ; use C-c instead of ESC. unlike vim, C-c works perfectly with vimpulse.

几乎所有vim所做的事情都可以在emacs+vimpulse中轻松完成(如果不是同样的方式),但绝对不能反过来!

p.s. 大多数上述建议都被最近版本的vimpulse默认支持。


1

我使用的VIM版本支持(Windows版本)使用“Ctrl+W s”将文件分割成两个不同的框架...


有趣;这是仅限于Windows的功能吗? - dreeves
"CTRL+W s"与":split"相同,仍然只有一个主Vim窗口。您无法单独最小化其中一个窗口或将其中一个窗口拖动到第二个监视器上。 - too much php
我不相信这是仅限于Windows的功能。如果我运行vim的控制台版本,我也能做到同样的事情。@Peter:问题并没有提到最小化或拖动到其他监视器... - Sean
在我的 Windows 版本的 gVim 中,"Ctrl-W s"(或 "Ctrl-W v")会将窗口分成两个窗口,而不是两个框架。 - Sébastien RoccaSerra

1

Vim 轻松让您在两个不同的框架中打开文件:

:split 水平分割

:vsplit 垂直分割

您可以在同一文件、不同文件或两者之间无限次数地分割屏幕。

CTRL-w-w 切换框架。

:resize +n:resize -n 调整当前框架的大小。


谢谢,这很不错,但对我来说并不完全适用。例如,您无法将帧放置在不同的监视器上。 - dreeves
我可能在这里漏掉了什么,但如果你想做的就是这个,为什么不使用两个不同的vim窗口打开同一个文件呢? - MCS
打开文件两次并不相同。您将没有共享的撤消历史记录,如果在保存之前编辑了两个窗口,则无法合并。据我所知,Emacs不会这样做... - too much php
彼得是正确的。在Emacs中,它的工作方式就像分割一样,尽管在不同的窗口中(Emacs称之为“框架”)。那就是我想要的。 - dreeves

0

我不确定我是否回答了你的问题,因为你的问题并不是很清楚(宏为什么不能工作,或者在emacs中模拟vim有哪些调整可用)
那么,这是你的问题吗?:

  • 一个使用古老的emacs-snapshot(来自2005年)的用户提到
    除非他删除了该文件中“viper--key-maps”行中的“my-get-emulation-keymap”宏,否则他的键盘上的所有键都会停止工作。

如果是这样,你可以尝试所述的解决方案。

我从emacs wiki获得了这些信息,这是一个已知的错误。


就赏金而言,假设问题是如何使vim宏在viper/emacs中工作。可以考虑其他缩小真正的vim和vimpulse之间差距的提示作为决胜者/奖励。 - dreeves

0
你可以在shell缓冲区中启动vim,并调整大小,使其填满整个框架。

0
如果你想要VIM的功能,直接安装VIM会更有意义!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接