Отговори (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>
Ще игнорира настройката за разширяване на раздела.
Направих го с помощта на функция. Тествах го, но може би в някой конкретен случай ще трябва да коригирате някои грешки. Опитайте да добавите това към вашия 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
Но не виждам смисъл, с тази версия никога няма да можете да правите отстъп ръчно от режим на вмъкване.
Един от начините да го направите е
- :set sw=4 (или каквото искате)
- :set ts=46 (или някакво голямо число)
Тогава автоматичният отстъп няма да вмъква раздели, освен ако не достигнете 46 интервала, в който случай можете да поставите по-голям брой.
Единственото плъзгане за това е, че ако някой друг използва раздели, тогава трябва да нулирате ts, за да се съгласите с файла, който редактирате. От друга страна, това ще направи разделите веднага очевидни, което също може да бъде желателно.