2009-09-20 5 views
6

He intentado entrar en emacs últimamente, y una de las cosas que necesito corregir es la sangría.¿Cómo emulo el 'softtabstop' de Vim en Emacs?

Ejemplo 1:

sub foo { 
    my $bar = 'quux'; 
    | 

Ejemplo 2:

sub foo { 
    my $bar = 'quux';  |# foo 

imaginar que el carácter de canalización en los ejemplos anteriores indica la posición del cursor. Ahora, uso (4) espacios para cada nivel de sangría (sin pestañas), y tengo la configuración de emacs para sangrar mi código automáticamente con eso en mente. No hay problemas allí. Pero en los ejemplos anteriores, si tuviera que presionar retroceso en las posiciones indicadas del cursor, quiero que emacs retroceda hasta el siguiente nivel de sangrado (columna/4). Es decir, quiero que trate el espacio en blanco anterior como si estuviera compuesto de pestañas. En cambio, siempre borra un solo carácter de espacio.

En vim, enciendo 'expandtab' para insertar espacios en lugar de pestañas, y 'softtabstop', lo que hace (entre otras cosas) retroceder a la siguiente "soft tabstop" como se describe arriba.

en Emacs, supongo que podría (si sabía emacs/elisp mejor) de retroceso se unen a una función que hace algo como lo siguiente:

if indent-tabs-mode is nil 
    if the cursor position is preceded by whitespace 
     calculate the position of the previous "soft tabstop" 
     if there's enough whitespace 
      backspace all the way to that point 
     else 
      backspace by one character 

Lo que yo quiero saber es, ¿existe un sencillo forma de hacerlo, y/o alguien sabe de una solución existente?

+0

Esto se complica por el hecho de que parece que va a escribir Perl y cperl-modo (el mejor modo de Perl para Emacs) ya une retroceso para 'cperl -electro-retroceso'. (Aunque esa función no hace nada crítico, por lo que podría pasar sin el comportamiento que proporciona.) – cjm

+0

Una pequeña actualización: Tengo una cosa mal. Cuando vim no puede volver a la siguiente tabulación suave, elimina la mayor cantidad de espacio en blanco posible (es decir, de 1 a 3), no solo 1. – Hinrik

+0

Solución actualizada para eliminar la mayor cantidad de espacio en blanco posible (hasta la tabulación) –

Respuesta

7

Esto funciona para mí, donde 'tab-width se utiliza como el ancho de las columnas. Establecer la clave en los mapas de teclas apropiadas ...

(local-set-key (kbd "DEL") 'backward-delete-whitespace-to-column) 
(defun backward-delete-whitespace-to-column() 
    "delete back to the previous column of whitespace, or as much whitespace as possible, 
or just one char if that's not possible" 
    (interactive) 
    (if indent-tabs-mode 
     (call-interactively 'backward-delete-char-untabify) 
    (let ((movement (% (current-column) tab-width)) 
      (p (point))) 
     (when (= movement 0) (setq movement tab-width)) 
     (save-match-data 
     (if (string-match "\\w*\\(\\s-+\\)$" (buffer-substring-no-properties (- p movement) p)) 
      (backward-delete-char-untabify (- (match-end 1) (match-beginning 1))) 
     (call-interactively 'backward-delete-char-untabify)))))) 
+0

Ver: https://www.emacswiki.org/emacs/BackspaceWhitespaceToTabStop (tiene una versión * mejorada *). – ideasman42

+0

Bueno, pero encontré 'backward-delete-char-untabify' bastante molesto, algunos usuarios pueden querer reemplazarlo por' backward-delete-char'. – ideasman42

Cuestiones relacionadas