En vim he reasignado >
y <
cuando estoy en modo visual a >gv
y <gv
respectivamente, así:
vnoremap > >gv
vnoremap < <gv
Dado que mi objetivo para esta pregunta son personas con experiencia en emacs y no vim, qué >
y <
qué es sangrar / sangrar texto seleccionado visualmente. Lo que gv
hace es volver a seleccionar el texto previamente seleccionado. Estos mapas causan >
y <
para sangrar / dedent y luego vuelva a seleccionar el texto previamente seleccionado.
Estoy probando emacs con modo malvado y me gustaría hacer lo mismo, pero tengo dificultades para descubrir cómo, exactamente, lograr la reselección automática.
Parece que necesito llamar de alguna manera evil-shift-right
y evil-visual-restore
secuencialmente, pero no sé cómo crear un mapa que haga ambas cosas, así que intenté crear mi propia función que llamaría tanto secuencialmente como mapa, pero no funcionó. , posiblemente debido al hecho de que ambos están definidos, no como funciones con defun
sino como operadores con evil-define-operator
.
Intenté crear mis propios operadores:
(evil-define-operator shift-left-reselect (beg end)
(evil-shift-left beg end)
(evil-visual-restore))
(evil-define-operator shift-right-reselect (beg end)
(evil-shift-right beg end)
(evil-visual-restore))
pero eso no restaura visual como se esperaba. Una puñalada en la oscuridad me dio esto:
(evil-define-operator shift-left-reselect (beg end)
(evil-shift-left beg end)
('evil-visual-restore))
(evil-define-operator shift-right-reselect (beg end)
(evil-shift-right beg end)
('evil-visual-restore))
pero eso selecciona una línea adicional cuando se supone que debe volver a seleccionar.
Por ahora he estado usando lo siguiente, que solo tiene el problema de que vuelve a seleccionar una línea adicional en el <
operador.
(evil-define-operator shift-right-reselect (beg end)
(evil-shift-right beg end)
(evil-visual-make-selection beg end))
(evil-define-operator shift-left-reselect (beg end)
(evil-shift-left beg end)
(evil-visual-make-selection beg end))
y los he mapeado:
(define-key evil-visual-state-map ">" 'shift-right-reselect)
(define-key evil-visual-state-map "<" 'shift-left-reselect)
Cualquier ayuda / punteros / consejos serían muy apreciados.
Gracias por adelantado.
editar:
Me gustaría poder hacer esto esencialmente:
(define-key evil-visual-state-map ">" (kbd ">gv"))
(define-key evil-visual-state-map "<" (kbd "<gv"))
Pero dado que no existe el concepto de un mapeo predeterminado>
o <
la idea de un mapeo recursivo no tiene ningún sentido, y esto tiene todos los problemas que esperaría de dicho mapa. Sin embargo, lo siguiente funciona, pero es feo ya que requiere la adición de dos mapas descartables. ¿Hay alguna forma de evitar hacer esto?
(define-key evil-visual-state-map "g>" 'evil-shift-right)
(define-key evil-visual-state-map "g<" 'evil-shift-left)
(define-key evil-visual-state-map ">" (kbd "g>gv"))
(define-key evil-visual-state-map "<" (kbd "g<gv"))
Si pasa el tiempo suficiente, tomaré esto, crearé una respuesta y la aceptaré para que otros que encuentren esta pregunta puedan encontrarla / usarla fácilmente.
indent-according-to-mode
(sangrar / desangrar) yC-x C-x
(volver a seleccionar) hacer (incluso más o menos) lo que quieres? Porque si es así, podemos trabajar una función y luego una combinación de teclas alrededor de eso.Respuestas:
El
evil-shift-right
comando necesita un argumento inicial y final, con el requisito de que el argumento inicial sea menor que el argumento final. Una forma de lograr esto es la siguiente:fuente
Terminé usando lo siguiente:
fuente