repl - Edentificación masiva de Emacs para Python
emacs python repl (7)
Además de indent-region
, que se asigna a CM-/
por defecto, los comandos de edición de rectángulo son muy útiles para Python. Marque una región como normal, luego:
-
Cx rt
(string-rectangle
): le pedirá los caracteres que le gustaría insertar en cada línea; ideal para insertar un cierto número de espacios -
Cx rk
(kill-rectangle
): elimina una región rectangular; ideal para eliminar sangrías
También puede Cx ry
( yank-rectangle
), pero eso rara vez es útil.
Trabajando con Python en Emacs si quiero agregar un try / except a un bloque de código, a menudo me doy cuenta de que tengo que marcar todo el bloque, línea por línea. En Emacs, ¿cómo sangra todo el bloque de una vez?
No soy un usuario experimentado de Emacs, solo encuentro que es la mejor herramienta para trabajar a través de ssh. Estoy usando Emacs en la línea de comandos (Ubuntu), no como una GUI, si eso hace alguna diferencia.
Hago algo como esto universalmente
;; intent whole buffer
(defun iwb ()
"indent whole buffer"
(interactive)
;;(delete-trailing-whitespace)
(indent-region (point-min) (point-max) nil)
(untabify (point-min) (point-max)))
He estado usando esta función para manejar mi sangría y desincrustación:
(defun unindent-dwim (&optional count-arg)
"Keeps relative spacing in the region. Unindents to the next multiple of the current tab-width"
(interactive)
(let ((deactivate-mark nil)
(beg (or (and mark-active (region-beginning)) (line-beginning-position)))
(end (or (and mark-active (region-end)) (line-end-position)))
(min-indentation)
(count (or count-arg 1)))
(save-excursion
(goto-char beg)
(while (< (point) end)
(add-to-list ''min-indentation (current-indentation))
(forward-line)))
(if (< 0 count)
(if (not (< 0 (apply ''min min-indentation)))
(error "Can''t indent any more. Try `indent-rigidly` with a negative arg.")))
(if (> 0 count)
(indent-rigidly beg end (* (- 0 tab-width) count))
(let (
(indent-amount
(apply ''min (mapcar (lambda (x) (- 0 (mod x tab-width))) min-indentation))))
(indent-rigidly beg end (or
(and (< indent-amount 0) indent-amount)
(* (or count 1) (- 0 tab-width))))))))
Y luego lo asigno a un atajo de teclado:
(global-set-key (kbd "s-[") ''unindent-dwim)
(global-set-key (kbd "s-]") (lambda () (interactive) (unindent-dwim -1)))
Si está programando Python usando Emacs, entonces probablemente debería estar usando el modo python. Con el modo python, después de marcar el bloque de código,
Cc >
o Cc Cl
desplaza la región 4 espacios hacia la derecha
Cc <
o Cc Cr
desplaza la región 4 espacios hacia la izquierda
Si necesita cambiar el código por dos niveles de indención, o alguna cantidad arbitraria, puede anteponer el comando con un argumento:
Cu 8 Cc >
desplaza la región 8 espacios hacia la derecha
Cu 8 Cc <
desplaza la región 8 espacios a la izquierda
Otra alternativa es usar Mx indent-rigidly
que está ligado a Cx TAB
:
Cu 8 Cx TAB
desplaza la región 8 espacios hacia la derecha
Cu -8 Cx TAB
desplaza la región 8 espacios hacia la izquierda
También son útiles los comandos rectangulares que operan en rectángulos de texto en lugar de líneas de texto.
Por ejemplo, después de marcar una región rectangular,
Cx ro
inserta espacio en blanco para llenar la región rectangular (cambiando efectivamente el código a la derecha)
Cx rk
mata la región rectangular (cambiando efectivamente el código a la izquierda)
Cx rt
solicita una cadena para reemplazar el rectángulo con. Ingresando Cu 8 <space>
ingresará 8 espacios.
PD. Con Ubuntu, para hacer que el modo python sea el modo predeterminado para todos los archivos .py, simplemente instale el paquete python-mode
.
Soy un neófito de Emacs, por lo que esta respuesta probablemente bordea lo inútil.
Ninguna de las respuestas mencionadas hasta ahora cubre la redención de literales como dict
o list
. Por ejemplo, Mx indent-region
o Mx python-indent-shift-right
y la empresa no te ayudarán si has cortado y pegado el siguiente literal y necesitas que se lo vuelva a sangrar con sensatez:
foo = {
''bar'' : [
1,
2,
3 ],
''baz'' : {
''asdf'' : {
''banana'' : 1,
''apple'' : 2 } } }
Parece que Mx indent-region
debería hacer algo con sensatez en python-mode
, pero ese no es (todavía) el caso.
Para el caso específico donde sus literales están entre corchetes, el uso de TAB en las líneas en cuestión obtiene lo que desea (porque el espacio en blanco no juega un papel).
Entonces, lo que he estado haciendo en tales casos es grabar rápidamente una macro de teclado como <f3> Cn TAB <f4>
como en F3, Ctrl-n (o flecha abajo), TAB, F4, y luego usar F4 repetidamente para aplicar el macro puede guardar un par de teclas. O puede hacer Cu 10 Cx e
para aplicarlo 10 veces.
(Sé que no parece mucho, pero intenta volver a aplicar sangrías a 100 líneas de basura literal sin perder la flecha hacia abajo, y luego tener que subir 5 líneas y repetir las cosas;)).
Yo uso el siguiente fragmento. En la pestaña cuando la selección está inactiva, sangra la línea actual (como normalmente lo hace); cuando la selección está inactiva, sangra toda la región a la derecha.
(defun my-python-tab-command (&optional _)
"If the region is active, shift to the right; otherwise, indent current line."
(interactive)
(if (not (region-active-p))
(indent-for-tab-command)
(let ((lo (min (region-beginning) (region-end)))
(hi (max (region-beginning) (region-end))))
(goto-char lo)
(beginning-of-line)
(set-mark (point))
(goto-char hi)
(end-of-line)
(python-indent-shift-right (mark) (point)))))
(define-key python-mode-map [remap indent-for-tab-command] ''my-python-tab-command)
indent-region
asignada a CM-/
debería hacer el truco.