Question

Il semble que si nous activons «AI», VIM remplira l'espace leader avec Tabstop. Je peux le faire remplir avec juste de l'espace avec «et». Je n'aime pas un fichier C mélangé avec de l'espace et des tabstop.

Mon vimrc:

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

Cependant, dans un état, j'ai besoin de saisir Tabstop lorsque j'appuie sur l'onglet «Tab» sur le clavier, par exemple, dans MakeFile et quelques autres. La commande 'AutoCMD FileType' n'est pas bonne: je ne peux pas ajouter chaque type de fichier dans VIMRC.

Ce que je veux est simple:

  1. AutoIndente pour remplir la zone principale avec de l'espace;
  2. Lorsque vous appuyez sur 'Tab' sur le clavier, entrée tabstop, pas espace (donc pas 'et')

Comment faire?

Était-ce utile?

La solution

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

Il fait de même que @Lynch Répondre si je le lis correctement.

Vous pouvez aussi utiliser <C-v><Tab>: cela inséra <Tab> sans invoquer de mappages et ignorer Expandtab à moins que vous ne remuez <C-v> ou <C-v><Tab> pour certaines raisons.

Si vous voulez simplement insérer l'onglet, faites

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

Il ignorera le réglage ExpandTab.

Autres conseils

Je l'ai fait en utilisant une fonction. Je l'ai testé, mais peut-être que dans un cas particulier, vous devrez corriger certains bogues. Essayez d'ajouter cela à votre 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

Basicaly, il remappe votre clé en mode visuel à la fonction insertab (). Notez également que si vous modifiez TS pour autre chose que 4, il sortira toujours 4 espaces au lieu de deux car la valeur est codée en dur.

Je ne suis pas très familier avec les scripts VIM, mais je pense que toutes les variables utilisées seront globales, ce qui est une mauvaise chose.

J'ai oublié de mentionner que pour "voir" des espaces blancs que vous pouvez utiliser set list. Vous désactivez cela avec set nolist. Aussi en mode normal, vous pouvez utiliser ga Pour voir des informations sur le caractère sur votre curseur.

ÉditerJe me rends compte que vous voudrez peut-être insérer l'onglet au début de la ligne. Mon script inserte l'espace au début et à l'onglet ailleurs.

Si vous voulez vraiment un onglet chaque fois que vous appuyez sur la clé de l'onglet, vous pouvez simplement utiliser ceci:

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

Mais je ne vois pas l'intérêt, avec cette version, vous ne pourrez jamais vous mettre manuellement à partir du mode INSERT.

Une façon de le faire est

  1. : Définissez SW = 4 (ou ce que vous voulez)
  2. : définir TS = 46 (ou un grand nombre)

Ensuite, AutoIndente n'inservera pas des onglets à moins que vous n'atteignez 46 espaces, auquel cas vous pouvez mettre un nombre plus élevé.

Faites un glisser à ce sujet, c'est que si quelqu'un d'autre utilise des onglets, alors vous devez réinitialiser TS pour être d'accord avec le fichier que vous modifiez. D'un autre côté, il rendra les onglets immédiatement évidents, ce qui peut également être souhaitable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top