设置为在向前和向后移动单词时跳过标点符号

时间:2011-06-29 21:50:04

标签: vim

当我使用vim时,当我按 w b 前进或后退时,我通常不会想要移动到标点符号。所以我想知道是否有设置或改变此功能的东西?

e.g。如果我有一些像

这样的代码
  

object.method(args)

我的光标位于“对象”中的[o],然后我希望 w 移动到“方法”中的[m],另一个 w 转到“args”中的[a]。我不希望它落在[。]或[(]上。如果我想要移动到标点符号,我总是使用 f F < / strong>直接跳到它。当我通过单词时,我从未亲自想要移动到标点符号,我只是意识到这真的让我烦恼。

2 个答案:

答案 0 :(得分:4)

我也发现我想要一个更具包容性的动作w,但不像W那样具有包容性。特别是,我想要一个只考虑以字母数字字符开头的标记为重要的运动。

所以我想出了以下内容:

" <SPACE>   : forward to next word beginning with alphanumeric char
" <S-SPACE> : backward to prev word beginning with alphanumeric char
" <C-SPACE> : same as above (as <S-SPACE> not available in console Vim
" <BS>      : back to prev word ending with alphanumeric char
function! <SID>GotoPattern(pattern, dir) range
    let g:_saved_search_reg = @/
    let l:flags = "We"
    if a:dir == "b"
        let l:flags .= "b"
    endif
    for i in range(v:count1)
        call search(a:pattern, l:flags)
    endfor
    let @/ = g:_saved_search_reg
endfunction
nnoremap <silent> <SPACE> :<C-U>call <SID>GotoPattern('\(^\\|\<\)[A-Za-z0-9_]', 'f')<CR>
vnoremap <silent> <SPACE> :<C-U>let g:_saved_search_reg=@/<CR>gv/\(^\\|\<\)[A-Za-z0-9_]<CR>:<C-U>let @/=g:_saved_search_reg<CR>gv
nnoremap <silent> <S-SPACE> :<C-U>call <SID>GotoPattern('\(^\\|\<\)[A-Za-z0-9_]', 'b')<CR>
vnoremap <silent> <S-SPACE> :<C-U>let g:_saved_search_reg=@/<CR>gv?\(^\\|\<\)[A-Za-z0-9_]<CR>:<C-U>let @/=g:_saved_search_reg<CR>gv
nnoremap <silent> <BS> :call <SID>GotoPattern('[A-Za-z0-9_]\(\>\\|$\)', 'b')<CR>
vnoremap <silent> <BS> :<C-U>let g:_saved_search_reg=@/<CR>gv?[A-Za-z0-9_]\(\>\\|$\)<CR>:<C-U>let @/=g:_saved_search_reg<CR>gv

" Redundant mapping of <C-SPACE> to <S-SPACE> so that
" above mappings are available in console Vim.
"noremap <C-@> <C-B>
if has("gui_running")
    map <silent> <C-Space> <S-SPACE>
else
    if has("unix")
        map <Nul> <S-SPACE>
    else
        map <C-@> <S-SPACE>
    endif
endif

我已经有很长一段时间了,我发现我使用<SPACE> / <C-SPACE>动作所以远远超过w和{{ 1}};它在编码时似乎更有用。当然,您可以将命令映射到您认为有用或更合适的任何键。

答案 1 :(得分:2)

即使冒着为内置(like I did last time)创建脚本的风险,这里有一个小功能可能有助于完成 此

function! JumpToNextWord()
    normal w
    while strpart(getline('.'), col('.')-1, 1) !~ '\w'
        normal w
    endwhile
endfunction

基本上,它的作用是执行标准 w 并重复它 如果光标下的字符不是单词字符(请随意 改变这种模式。

如果您在 .vimrc 中添加了一个小地图:

nnoremap <silent> ,w :call JumpToNextWord()<CR>

它应该有用。