Emacs-эквиваленты Vim's dd, o, O - PullRequest
27 голосов
/ 01 февраля 2010

Я сейчас играю с 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, только пропущена идентификация. C-e C-o создает пустую строку под текущим, но не перемещает курсор.

Существуют ли более эффективные решения моих проблем или мне нужно изучать Lisp и определять новые команды для удовлетворения моих потребностей?

Ответы [ 8 ]

27 голосов
/ 01 февраля 2010

Для 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-insert следующим образом:

(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.

24 голосов
/ 17 марта 2012
C+e C+j

Согласно Руководству по emacs . Это даст вам новую строку и отступ.

23 голосов
/ 01 февраля 2010

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

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

2 голосов
/ 01 февраля 2010

Вы можете создать макрос и , связать его с последовательностью клавиш . Нет необходимости изучать emacslisp.

1 голос
/ 25 ноября 2015

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

http://spacemacs.org/

Дайте ему попытку.

1 голос
/ 01 февраля 2010

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

(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, чтобы удалить девять строк одновременно.

0 голосов
/ 03 апреля 2019

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

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

0 голосов
/ 01 февраля 2010

Просто используйте Режим Viper , Vimpulse или Режим Vim , сочетания клавиш Emacs просто не так эргономичны.

...