vim - установить автоматический отступ, чтобы заполнить пробел или пробел - PullRequest
3 голосов
/ 04 мая 2011

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

Мой vimrc:

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 04 мая 2011
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>

Он игнорирует настройку расширения.

0 голосов
/ 19 февраля 2014

Один из способов сделать это -

  1. : установить sw = 4 (или что угодно)
  2. : установить ts = 46 (или какое-то большое число)

Тогда при автоматическом отступе вкладки не будут вставлены, если вы не наберете 46 пробелов, и в этом случае вы можете ввести большее число.

Только перетащите это, если кто-то еще использует вкладки, тогда вам нужносбросить TS, чтобы согласиться с файлом, который вы редактируете.С другой стороны, это сразу сделает вкладки очевидными, что также может быть желательным.

0 голосов
/ 04 мая 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

Но я не вижу смысла, с этой версией вы никогда не сможете сделать отступ вручную из режима вставки.

...