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 и определить новые команды для удовлетворения моих потребностей?
Ответы
Ответ 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
.
Ответ 2
C+e C+j
В соответствии с документами emacs manual. Это дает вам новую строку и отступы.
Ответ 3
Для dd используйте "kill-whole-line", который по умолчанию связан с "C-S-backspace" в последних версиях Emacs.
Я должен добавить, что я сам чаще всего использую whole-line-or-region.el, поскольку C-w
легче вводить, чем C-S-backspace
.
Ответ 4
Вы можете создать macro и привязать его к последовательность клавиш. Нет необходимости изучать emacslisp.
Ответ 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. Поведение такое же, как у дд.