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