Я сделал это с помощью функции. Я тестировал, но, возможно, в каком-то конкретном случае вам придется исправить какие-то ошибки. Попробуйте добавить это в свой 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
для просмотра информации о персонаже, на котором находится ваш курсор.
Изменить Я понимаю, что вы можете вставить табуляцию в начале строки. Мой сценарий вставляет пробел в начале и табуляцию в любом другом месте.
Если вам действительно нужна вкладка каждый раз, когда вы нажимаете клавишу табуляции, вы можете просто использовать это:
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