导航时如何将前导空格视为 Vim 中的制表符?

How to treat leading spaces as tabs in Vim when navigating?

基本上我有以下 PSR-2 代码合规性设置:

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
set smarttab

PSR-2 要求缩进为 4 spaces。很好,但我习惯了真正的制表符而不是 spaces,所以如果我在一行的开头,我向右移动,而不是移动到第一个缩进字符,它会移动到一个space 一次。

有没有办法让vim对这些前导space的处理方式相同,即对第一个非space字符"jump"在正常模式和插入模式下导航时?

我知道我可以使用 ^ 将光标放在第一个非白色 space 字符上,但我不习惯,而且它不如简单导航那么方便。

将下面的内容放入你的 vimrc

function! s:super_left()
  return getline('.')[:col('.')] =~ '^\s\+$' ? 'w' : 'l'
endfunction
augroup SuperLeft
  au!
  autocmd FileType php nnoremap <expr> l <sid>super_left()
augroup END

我认为你最好习惯使用 vims 更强大的移动命令,例如 ^

话虽这么说,但这是您可以实现目标的一种方法。

nnoremap <right> :silent call SkipSpace()<cr>
function! SkipSpace()
  let curcol = col('.')
  execute "normal ^"
  let hatcol = col('.')

  if curcol >= hatcol
    " move one space right
    let newcol = curcol + 1
  elseif curcol + 4 > hatcol
    " move to the start of the next word if it is less than 4 spaces away
    let newcol = hatcol
  else 
    " move 4 spaces right
    let newcol = curcol + 4
  endif

  execute "normal " . newcol . "|"

endfunction

P.S。如果想找点乐子,请查看 :help |