vim: establece la sangría automática para llenar el espacio inicial con espacio o tabulación

StackOverflow https://stackoverflow.com/questions/5878009

  •  28-10-2019
  •  | 
  •  

Pregunta

Parece que si habilitamos 'ai', vim llenará el espacio inicial con tabstop. Puedo hacer que se llene con solo espacio con 'et'.No me gusta un archivo C mezclado con espacio y tabstop.

Mi vimrc:

set ts=4 et
set ai
set hlsearch
syntax on
filetype plugin indent on
autocmd FileType make setlocal noexpandtab

Sin embargo, en alguna condición necesito ingresar tabstop cuando presiono la 'TAB' en el teclado, por ejemplo, en makefile y algunos otros. El comando 'autocmd FileType' no es bueno: no puedo agregar todos los tipos de archivo en vimrc.

Lo que quiero es simple :

  1. sangría automática para rellenar el área inicial con espacio;
  2. cuando presiona "TAB" en el teclado, se detiene entrada, no espacio (por lo que no 'et')

¿Cómo se hace?

¿Fue útil?

Solución

inoremap <expr> <tab> ((getline('.')[:col('.')-2]=~'\S')?("\<C-v>\t"):(repeat(' ', &ts-((virtcol('.')-1)%&ts))))

Hace lo mismo que la respuesta de @Lynch si la leo correctamente.

También puede usar <C-v><Tab>: esto insertará <Tab> sin invocar ninguna asignación e ignorará expandtab a menos que haya reasignado <C-v> o <C-v><Tab> por alguna razón.

Si solo desea insertar una pestaña,

inoremap <Tab> <C-v><Tab>

Ignorará la configuración de la pestaña de expansión.

Otros consejos

Lo hice usando una función. Lo probé, pero tal vez en algún caso particular tengas que arreglar algunos errores. Intente agregar esto a su vimrc:

set et

function! Inserttab()
    let insert = ""
    let line = getline('.')
    let pos = getpos('.')[2]
    let before = ""
    let after = line
    if pos != 1
        let before = line[ 0: pos - 1]  
        let after = line[pos : strlen(line) ]
    endif
    if pos != 1 && substitute(before, "[ \t]", "", "g") != "" 
         let insert = "\t"
    else
         let insert = "    "
    endif
    let line = before . insert . after 
    call setline('.', line)
    call cursor(line('.'), strlen(before . insert))
endfunction

inoremap <tab> <esc>:call Inserttab()<CR>a

Básicamente, reasigna su clave en modo visual a la función Inserttab (). También tenga en cuenta que si cambia ts por algo que no sea 4, todavía generará 4 espacios en lugar de dos porque el valor está codificado.

Además, no estoy muy familiarizado con los scripts de vim, pero creo que todas las variables utilizadas serán globales, lo cual es malo.

Olvidé mencionar que para "ver" los espacios en blanco puedes usar set list. Desactiva esto con set nolist. También en el modo normal puede usar ga para ver información sobre el carácter en el que se encuentra el cursor.

Editar Me doy cuenta de que es posible que desee insertar una pestaña al principio de la línea. Mi secuencia de comandos inserta un espacio al principio y una pestaña en cualquier otro lugar.

Si realmente desea una pestaña cada vez que presiona la tecla de tabulación, simplemente puede usar esto:

set et

function! Inserttab()
    let insert = ""
    let line = getline('.')
    let pos = getpos('.')[2]
    let before = ""
    let after = line
    if pos != 1
        let before = line[ 0: pos - 1]  
        let after = line[pos : strlen(line) ]
    endif
    let insert = "\t"
    let line = before . insert . after 
    call setline('.', line)
    call cursor(line('.'), strlen(before . insert))
endfunction

inoremap <tab> <esc>:call Inserttab()<CR>a

Pero no veo el punto, con esta versión nunca podrá aplicar sangría manualmente desde el modo de inserción.

Una forma de hacerlo es

  1. : establezca sw= 4 (o lo que desee)
  2. : establezca ts= 46 (o un número grande)

Entonces, la sangría automática no insertará pestañas a menos que llegues a 46 espacios, en cuyo caso puedes ingresar un número mayor.

Solo arrastre sobre esto si alguien más está usando pestañas, entonces debe restablecer ts para estar de acuerdo con el archivo que está editando.Por otro lado, hará que las pestañas sean inmediatamente obvias, lo que también puede ser deseable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top