vim - установить автоматический отступ, чтобы заполнить начальное пространство пробелом или табуляцией

Кажется, если мы включим «ai», vim заполнит начальное пространство табуляцией. Я могу заполнить его только пробелом с помощью «et». Мне не нравится файл C, смешанный с пробелом и табуляцией.

Мой вимрк:

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

Однако в некоторых случаях мне нужно вводить табуляцию, когда я нажимаю «TAB» на клавиатуре, например, в make-файле и некоторых других. Команда autocmd FileType не годится: я не могу добавить все типы файлов в vimrc.

Я хочу просто:

  1. автоотступ для заполнения ведущей области пробелом;
  2. при нажатии «TAB» на клавиатуре ввод табуляции, а не пробел (поэтому нет «et»)

Как это сделать?


person pengguang001    schedule 04.05.2011    source источник
comment
Плагин типа файла Makefile уже отключает расширение вкладки локально.   -  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>

Он будет игнорировать настройку expandtab.

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 для просмотра информации о персонаже, на котором находится ваш курсор.

Изменить Я понимаю, что вы можете вставить табуляцию в начале строки. Мой сценарий вставляет пробел в начале и табуляцию в любом другом месте.

Если вам действительно нужна вкладка каждый раз, когда вы нажимаете клавишу табуляции, вы можете просто использовать это:

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
после размышления мне нравится решение ioremap от ZyX. Также см.: vim.wikia.com/wiki/Indenting_source_code для более полного обсуждения автоматического отступа исходного кода. . - person russtman; 19.02.2014