Подтвердить что ты не робот

Emacs эквиваленты Vim dd, o, O

В настоящее время я играю с emacs и довольствуюсь большинством концепций. Но я действительно обожал удобство трех команд vim: dd, o, O Надеюсь, вы можете сказать мне, как отражать их в emacs:)

dd - удаляет всю строку, включая новую строку, независимо от того, где находится курсор.

Я нашел нечто похожее на трюк:

C-a C-k C-k

Пока C-a перемещает курсор в начало строки, первый C-k убивает текст, второй убивает новую строку. Единственная проблема заключается в том, что это не работает в пустых строках, где мне нужно только ввести C-k, что довольно неудобно, так как я должен использовать разные команды для одной и той же задачи: убить строку.

o/O - создает новую пустую строку ниже/выше курсора и перемещает курсор на новую строку с отступом правильно

Ну, C-a C-o почти как O, просто отсутствует idention. C-e C-o создает пустую строку под текущим, но не перемещает курсор.

Есть ли какие-нибудь лучшие решения для моих проблем или мне нужно узнать Lisp и определить новые команды для удовлетворения моих потребностей?

4b9b3361

Ответ 1

Для o и o, вот несколько функций, которые я написал много лет назад:

(defun vi-open-line-above ()
  "Insert a newline above the current line and put point at beginning."
  (interactive)
  (unless (bolp)
    (beginning-of-line))
  (newline)
  (forward-line -1)
  (indent-according-to-mode))

(defun vi-open-line-below ()
  "Insert a newline below the current line and put point at beginning."
  (interactive)
  (unless (eolp)
    (end-of-line))
  (newline-and-indent))

(defun vi-open-line (&optional abovep)
  "Insert a newline below the current line and put point at beginning.
With a prefix argument, insert a newline above the current line."
  (interactive "P")
  (if abovep
      (vi-open-line-above)
    (vi-open-line-below)))

Вы можете привязать vi-open-line к, скажем, M-вставке следующим образом:

(define-key global-map [(meta insert)] 'vi-open-line)

Для dd, если вы хотите, чтобы убитая строка попала в кольцо уничтожения, вы можете использовать эту функцию, которая обертывает kill-line:

(defun kill-current-line (&optional n)
  (interactive "p")
  (save-excursion
    (beginning-of-line)
    (let ((kill-whole-line t))
      (kill-line n))))

Для полноты он принимает префиксный аргумент и применяет его к kill-line, чтобы он мог убить гораздо больше, чем текущая строка.

Вы также можете посмотреть источник viper-mode, чтобы увидеть, как он реализует эквивалентные dd, o и o.

Ответ 3

Для dd используйте "kill-whole-line", который по умолчанию связан с "C-S-backspace" в последних версиях Emacs.

Я должен добавить, что я сам чаще всего использую whole-line-or-region.el, поскольку C-w легче вводить, чем C-S-backspace.

Ответ 5

Вот как я затронул проблему нехватки Emacs vi-подобной команды "O":

(defadvice open-line (around vi-style-open-line activate)
  "Make open-line behave more like vi."
  (beginning-of-line)
  ad-do-it
  (indent-according-to-mode))

С этим на месте я никогда не чувствовал необходимости в соответствующей версии vi "o". C-n C-o делает трюк.

Что касается команды "dd", которая сначала немного терлась, но я в конце концов подошел к Emacs, чтобы делать что-то. В любом случае, когда я хочу удалить сразу несколько строк, что часто бывает, я просто делаю это с помощью области (C-a C-SPC, перейдите на другой конец текста, который я хочу удалить, C-w). Или, если я могу заметить количество строк, которые хочу удалить, я сделаю, например. M-9 C-k, чтобы удалить сразу девять строк.

Ответ 6

Я знаю, этот ответ не прямо к делу, однако, как пользователь vim, я обнаружил, что Spacemacs - это самый функциональный стартовый пакет emacs для перехода от vim к emacs. Вы можете настроить его как vim like, emacs like или hybrid.

http://spacemacs.org/

Попробуйте.

Ответ 7

Просто используйте Viper-mode, Vimpulse или Vim Mode, комбинации клавиш Emacs просто не так эргономичны.

Ответ 8

Этот вопрос был здесь годами, но я хочу добавить свои 2 цента о дд:

Используйте kill-whole-line с привязкой клавиш CS-backspace backspace. Поведение такое же, как у дд.