Макросы Vim не работают при использовании viper + vimpulse в Emacs
Любые другие настройки для того, чтобы сделать emacs как можно более похожим на vim, будут также приветствоваться.
Приложение: Основная причина, по которой я не просто использую vim, заключается в том, что мне нравится, как emacs позволяет открывать файл в двух разных фреймах [ДОБАВЛЕНО: извините, это сбивало с толку: я имею в виду отдельные окна, которые emacs называет "фреймами"]. Это похоже на вертикальное разделение, но мне не нужно иметь одно огромное окно.
9 ответов
Вы можете запустить VIM в режиме клиент-сервер, тогда у вас может быть два окна, подключающихся к одному экземпляру, что устраняет необходимость в Emacs.
Я не знаю, как заставить работать макросы 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
) пока он работает.
У меня нет никаких твиков viper или vimpulse для вас, но я рекомендую вам попробовать режим следования.
Конечно, я также рекомендую вам начать изучать Emacs. Я имею в виду, что если вы находитесь в этом месте, вы можете также изучить руководство и, возможно, взглянуть на emacswiki.
Emacs+vimpulse великолепен, но я думаю, что его правильный рабочий процесс заключается в свободном использовании команд emacs в сочетании с ярлыками vim. Например, ярлыки макросов в Emacs F3 и F4 проще, чем в qim и @q vim. Также команды 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, но определенно не наоборот!
ps большинство предложений выше поддержаны недавним vimpulse BY DEFAULT.
Версия VIM, которую я использую (Windows Window), поддерживает разделение файла на 2 разных фрейма, используя "Ctrl+W s"...
Vim легко позволяет открыть файл в двух разных фреймах:
:split
разделить его по горизонтали
:vsplit
разделить его по вертикали
Вы можете разделить экран столько раз, сколько хотите между одним и тем же файлом, разными файлами или обоими.
CTRL-w-w
переключает кадры.
:resize +n
или же :resize -n
изменяет размер текущего кадра
Я не уверен, отвечу ли я на ваш вопрос, так как не совсем понятно, что вы спрашиваете (почему не работают макросы или какие настройки доступны для эмуляции vim в emacs)
так это твоя проблема?
- Один пользователь, который использует древний снимок emacs (с 2005 года), упоминает
что этот режим приводит к тому, что все клавиши на его клавиатуре перестают работать, если он не удаляет строку, которая читает 'viper- key-maps из макроса my-get-emulation-keymap в этом файле
если это так, вы можете попробовать заявленное решение.
Я получил эту информацию из emacs wiki, и это известная ошибка.
Вы всегда можете запустить vim в буфере оболочки и изменить его размер, чтобы он заполнил весь кадр?
Если вам нужна функциональность VIM, имеет смысл просто установить VIM!