commands - neovim
Equivalentes de Emacs de dd, o, O de Vim (7)
Actualmente estoy jugando con emacs y estoy contento con la mayoría de los conceptos. Pero realmente adoraba la conveniencia de los tres comandos vim: dd, o, O Espero que puedas decirme cómo copiarlos en emacs :)
dd - borra toda la línea, incluida la nueva línea, sin importar dónde esté el cursor.
Encontré algo similar para hacer el truco:
Ca Ck Ck
Mientras Ca
mueve el cursor al comienzo de la línea, la primera Ck
mata al texto, la segunda mata a la nueva línea. El único problema es que esto no funciona en líneas vacías donde solo necesito escribir Ck
que es bastante inconveniente ya que tengo que usar diferentes comandos para la misma tarea: matar una línea.
O / O : crea una nueva línea vacía debajo / debajo del cursor y mueve el cursor a la nueva línea, con sangría correcta
Bueno, Ca Co
es casi como O
, solo falta la identificación. Ce Co
crea una línea vacía debajo de la actual pero no mueve el cursor.
¿Hay alguna solución mejor para mis problemas o tengo que aprender Lisp y definir nuevos comandos para satisfacer mis necesidades?
Así es como me referí al problema de la falta de un comando tipo "O" de Emacs:
(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))
Con esto en su lugar, nunca sentí realmente la necesidad de una versión correspondiente del comando "o" de vi. Cn Co hace el truco.
En cuanto a la orden "dd", al principio eso rechinó un poco, pero finalmente llegué a la forma de hacer las cosas de Emacs. De todos modos, cuando quiero eliminar varias líneas a la vez, que a menudo es el caso, simplemente lo hago usando la región (Ca C-SPC, vaya al otro extremo del texto que quiero eliminar, Cw). O si puedo ver el número de líneas que quiero eliminar, lo haré, por ejemplo. M-9 Ck para eliminar nueve líneas a la vez.
Para o
y O
, aquí hay algunas funciones que escribí hace muchos años:
(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)))
Puede vincular vi-open-line
a, digamos, inserción M de la siguiente manera:
(define-key global-map [(meta insert)] ''vi-open-line)
Para dd
, si quieres que la línea asesinada llegue al anillo asesino, puedes usar esta función que envuelve kill-line
:
(defun kill-current-line (&optional n)
(interactive "p")
(save-excursion
(beginning-of-line)
(let ((kill-whole-line t))
(kill-line n))))
Para completar, acepta un argumento de prefijo y lo aplica a kill-line
, de modo que puede matar mucho más que la línea "actual".
También puede consultar la fuente de viper-mode
para ver cómo implementa los comandos dd
, o
, y O
equivalentes.
Para dd, utilice "kill-whole-line", que está vinculado a "CS-backspace" de forma predeterminada en las versiones recientes de Emacs.
Debo añadir que yo mismo uso whole-line-or-region.el más a menudo, ya que Cw
es más fácil de escribir que CS-backspace
.
Podría crear una macro y vincularla a una secuencia de teclas . No es necesario aprender ningún emacslisp todavía.
Sé que esta respuesta no va directamente al grano, sin embargo, como usuario de vim, descubrí que Spacemacs es el paquete de inicio de emacs más funcional para pasar de vim a emacs. Puedes configurarlo para que sea como vim, emacs like o hybrid.
Darle una oportunidad.
Solo use Viper-mode , Vimpulse o Vim Mode , las combinaciones de teclas de Emacs no son tan ergonómicas.
C+e C+j
De acuerdo con los documentos manuales de emacs . Eso te da una nueva línea y sangría.