3

「ai」を有効にすると、vim は先頭のスペースをタブストップで埋めます。「et」でスペースだけで埋めることができます。スペースとタブストップが混在する C ファイルは好きではありません。

私のvimrc:

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

ただし、makefile などで、キーボードで「TAB」を押したときにタブストップを入力する必要がある場合があります。「autocmd FileType」コマンドは良くありません。vimrc にすべてのファイル タイプを追加することはできません。

私が欲しいのは簡単です:

  1. 先行領域をスペースで埋める自動インデント。
  2. キーボードで「TAB」を押したとき、スペースではなくタブストップ入力(「et」はありません)

どうやってするの?

4

3 に答える 3

1
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>

エキスパンドタブの設定は無視されます。

于 2011-05-04T04:39:41.947 に答える
0

関数を使用してそれを行いました。私はそれをテストしましたが、特定のケースでは、いくつかのバグを修正する必要があるかもしれません。これを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 以外に変更しても、値がハードコードされているため、2 つではなく 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

しかし、このバージョンでは、挿入モードから手動でインデントすることはできません。

于 2011-05-04T04:27:18.560 に答える