За бъдеща справка: в тази публикация имате два въпроса, които са ортогонални - така че трябваше да направите две различни публикации (и ако искахте, бихте могли да свържете от една публикация към друга, ако е необходимо, но не мисля, че би се изисква в този случай).

person pengguang001    schedule 04.05.2011    source източник
comment
Плъгинът Makefile filetype вече деактивира разширения раздел локално.   -  person ZyX    schedule 04.05.2011


Отговори (3)


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

Прави същото като отговора на @Lynch, ако го прочетох правилно.

Можете също да използвате <C-v><Tab>: това ще вмъкне <Tab> без да извиква каквито и да било съпоставяния и игнорира expandtab, освен ако не сте преназначили <C-v> или <C-v><Tab> по някаква причина.

Ако искате просто да вмъкнете раздела, направете

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

Ще игнорира настройката за разширяване на раздела.

person ZyX    schedule 04.05.2011

Направих го с помощта на функция. Тествах го, но може би в някой конкретен случай ще трябва да коригирате някои грешки. Опитайте да добавите това към вашия 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

По принцип той пренасочва вашия ключ във визуален режим към функцията Inserttab(). Също така имайте предвид, че ако промените ts за нещо различно от 4, той пак ще извежда 4 интервала вместо два, защото стойността е твърдо кодирана.

Също така не съм много запознат със скриптовете на vim, но мисля, че всички използвани променливи ще бъдат глобални, което е лошо нещо.

Забравих да спомена, че за да "видите" белите полета можете да използвате set list. Деактивирате това с set nolist. Също така в нормален режим можете да използвате ga, за да видите информация за знака, върху който е курсорът.

Редактиране Разбирам, че може да искате да вмъкнете табулатор в началото на реда. Моят скрипт вмъква интервал в началото и табулатор навсякъде другаде.

Ако наистина искате раздел всеки път, когато натиснете клавиша tab, можете просто да използвате това:

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

Но не виждам смисъл, с тази версия никога няма да можете да правите отстъп ръчно от режим на вмъкване.

person Lynch    schedule 04.05.2011
comment
О, наистина е трудно. Мисля, че може да има лесно решение. - person pengguang001; 04.05.2011
comment
Това, което е досадно, е автоматичното вмъкване на раздела в отстъпа. Мразя това. Ако деактивирам автоматичния отстъп, просто премахна 'et', ще стигна до моята цел. ^^ - person pengguang001; 04.05.2011

Един от начините да го направите е

  1. :set sw=4 (или каквото искате)
  2. :set ts=46 (или някакво голямо число)

Тогава автоматичният отстъп няма да вмъква раздели, освен ако не достигнете 46 интервала, в който случай можете да поставите по-голям брой.

Единственото плъзгане за това е, че ако някой друг използва раздели, тогава трябва да нулирате ts, за да се съгласите с файла, който редактирате. От друга страна, това ще направи разделите веднага очевидни, което също може да бъде желателно.

person russtman    schedule 19.02.2014
comment
като се замисля, харесвам inoremap решението на ZyX. Вижте също: vim.wikia.com/wiki/Indenting_source_code за по-пълна дискусия относно автоматичното отстъпване на изходния код . - person russtman; 19.02.2014