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

导航时如何将前导空格视为Vim中的制表符?,vim,Vim,基本上,我有以下符合PSR-2规范的设置: set tabstop=4 set shiftwidth=4 set softtabstop=4 set expandtab set smarttab PSR-2要求缩进为4个空格。这很好,但我习惯于使用真正的制表符而不是空格,所以如果我在一行的开头,我向右移动,而不是移动到第一个缩进字符,它一次移动一个空格 有没有办法让vim以相同的方式处理这些前导空格,即在正常模式和插入模式下导航时“跳转”到第一个非空格字符 我知道我可以使用^将光标放在第一个非

基本上,我有以下符合PSR-2规范的设置:

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
set smarttab
PSR-2要求缩进为4个空格。这很好,但我习惯于使用真正的制表符而不是空格,所以如果我在一行的开头,我向右移动,而不是移动到第一个缩进字符,它一次移动一个空格

有没有办法让vim以相同的方式处理这些前导空格,即在正常模式和插入模式下导航时“跳转”到第一个非空格字符


我知道我可以使用
^
将光标放在第一个非空白字符上,但我不习惯这样做,而且它不像简单的导航那样方便。

将下面的内容放入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
函数!s:超级左()
返回getline('.')[:col('.')]=~'^\s\+$'?'w':“l”
端功能
奥群超左
哎呀!
autocmd文件类型php nnoremap l super_left()
螺旋端

我认为您最好习惯使用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
nnoremap:silent call SkipSpace()
功能!SkipSpace()
设curcol=col('.'))
执行“正常^”
设hatcol=col('.'))
如果curcol>=hatcol
“向右移动一个空格
设newcol=curcol+1
elseif curcol+4>hatcol
“如果距离下一个单词的开头少于4个空格,则移动到该单词的开头
让newcol=hatcol
其他的
“向右移动4个空格
设newcol=curcol+4
恩迪夫
执行“normal”.newcol.。|”
端功能


注意:为了好玩,请查看
:help |

vim
有几个运动快捷键。例如,您可以点击
w
移动到行中的第一个单词。有关更多信息,请参阅谷歌
vim motion