2012-03-14 21 views
12

¿Hay alguna manera de que pueda marcar texto en emacs y desplazarlo hacia la izquierda (la eliminación de espacios de partida) de granularidad del espacio/Tab?Disminuir sangría en un par de líneas

misma manera que lo haría en algún otro editor con Shift + Tab.

+0

No estoy seguro de que consiga lo que quiere decir. ¿Podría por favor elaborar su explicación? –

+0

Muchos modos de emacs tienen sangría automática: al presionar [tabulador] en cualquier lugar de la línea, se sangrará la línea donde debería estar. Rara vez tengo que preocuparme por sangrar cualquier cosa manualmente, solo dejo que el editor haga el trabajo por mí. –

+0

Me gustaría poder hacer lo contrario de lo que hace "Tab"; Lo necesito generalmente cuando copio el código pasado posicionado de forma diferente a otro archivo. – sramij

Respuesta

3

En general, emacs coloca cosas donde el estilo actual dicta cuando tocas <TAB>, así que, naturalmente, es un poco diferente aquí. Lo más parecido que se me ocurre es M-\, que colapsa espacios en blanco horizontales alrededor del punto. Si desea eliminar un "rectángulo" de espacio antes de las líneas, entonces delete-rectangle podría ser más apropiado, lo que puede hacer al establecer la marca y el punto de movimiento para seleccionar el rectángulo y luego usar C-x r d.

1

Parece que el problema que estamos tratando de resolver es la sangría incorrecta de código cuando se está cortando/pegar. Puede resolverlo volviendo a indentificar el texto automáticamente con algo como lo siguiente.

Nota: El uso de un fuerzas argumento prefijo no re-entrante (C-u-C y), además de que hay la variable umbral de tamaño.

;; automatically indenting yanked text if in programming-modes 
(defvar yank-indent-modes '(emacs-lisp-mode 
          c-mode c++-mode 
          tcl-mode sql-mode 
          perl-mode cperl-mode 
          java-mode jde-mode 
          lisp-interaction-mode 
          LaTeX-mode TeX-mode) 
    "Modes in which to indent regions that are yanked (or yank-popped)") 

(defvar yank-advised-indent-threshold 1000 
    "Threshold (# chars) over which indentation does not automatically occur.") 

(defun yank-advised-indent-function (beg end) 
    "Do indentation, as long as the region isn't too large." 
    (if (<= (- end beg) yank-advised-indent-threshold) 
     (indent-region beg end nil))) 

(defadvice yank (after yank-indent activate) 
    "If current mode is one of 'yank-indent-modes, indent yanked text (with prefix arg don't indent)." 
    (if (and (not (ad-get-arg 0)) 
      (member major-mode yank-indent-modes)) 
     (let ((transient-mark-mode nil)) 
     (yank-advised-indent-function (region-beginning) (region-end))))) 
+0

Estoy seguro de que este código funciona bien, pero [auto-indent-mode.el] (https://github.com/mlf176f2/auto-indent-mode.el/) se mantiene activamente y tiene más funcionalidad. Aunque el umbral es una muy buena idea. –

+0

@event_jr No entiendo el punto sobre algo que se mantiene activamente. Escribí el código anterior hace más de 3 años y no he necesitado "mantenerlo", hace exactamente lo que se supone que debe hacer ... –

+0

Hace esto y muchas otras cosas para asegurarse de que el código está sangrado correctamente de forma automática. Más características significan más peros y más posibles malas interacciones con otros modos. Por lo tanto, es importante que el autor esté trabajando activamente en ello. –

14
  1. Seleccione su región;
  2. Tipo C-u seguido por el número de espacios que desea sangrar (número negativo si desea reducir la sangría);
  3. Use C-x TAB (por defecto, está vinculado a indent-rigidly) para aplicar la sangría a la región.

Esto es mucho más engorroso que S-TAB, pero en mi humilde opinión es una especie de último recurso en caso de formateo Emacs no resuelve su problema.

EDIT: solución mucho mejor: Shift a region or line in emacs (respuesta aceptada). Esto es lo que estoy usando actualmente en Emacs para cambiar la sangría. ADVERTENCIA: implica algo de Emacs Lisp.

+0

Gracias. ¿Qué sucede si quiero aumentar o disminuir el número de pestañas (en lugar de espacios) con sangría de un par de líneas? – Tim

+0

Simplemente multiplique el valor después de C-u con el ancho de la pestaña. –

+0

@Tim se describe una mejor manera aquí - http://stackoverflow.com/questions/3156450/shift-a-region-or-line-in-emacs (respuesta aceptada) –

2

Esto podría ser más simple y visualmente más intuitivo: primero asegúrese de que cua-mode esté habilitado (M-x cua-mode lo alterna). Luego vaya al comienzo de la línea y presione C-return. Aparece un rectángulo rojo. Ahora mueva el cursor hacia abajo y hacia la derecha para hacer crecer el rectángulo según sea necesario. A continuación, presione C-d para eliminarlo. Eso es.

me encuentro con este problema a menudo cuando el major-mode no dicta ninguna sangría automática (o cuando se mete la pata).

hay mucho más que puede hacer con rectángulos de cua-mode, ver http://trey-jackson.blogspot.com/2008/10/emacs-tip-26-cua-mode-specifically.html

Cuestiones relacionadas