Настройка пропуска знаков препинания при движении вперед и назад слов - PullRequest
5 голосов
/ 30 июня 2011

Когда я использую vim, я обычно не хочу переходить к знаку препинания, когда нажимаю w или b , чтобы идти вперед или назад. Так что мне интересно, есть ли настройка или что-то, чтобы изменить эту функциональность?

например. Если у меня есть код вроде

object.method (args)

и мой курсор находится в [o] в "объекте", тогда я хочу, чтобы w переместился в [m] в "методе", а другой w чтобы перейти в [a] в "args". Я не хочу, чтобы он приземлился на [.] Или [(]. Если я когда-либо хотел перейти к знаку препинания, я всегда использовал f или F прыгнуть прямо к нему. Я никогда не хотел переходить к знаку препинания, когда я перебираю слова, и я просто понял, что это действительно беспокоит меня.

Ответы [ 2 ]

4 голосов
/ 30 июня 2011

Я тоже нахожу, что мне хотелось бы, чтобы движение было более инклюзивным, чем 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 и W; это просто кажется более полезным при кодировании. Разумеется, вы можете назначить команды тем клавишам, которые вы считаете полезными или более подходящими.

2 голосов
/ 30 июня 2011

Даже существует риск создания сценария для чего-то встроенного (например, Я сделал в прошлый раз ), вот небольшая функция, которая может помочь в достижении это.

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

По сути, он выполняет стандарт w и повторяет его если символ под курсором не является символом слова (не стесняйтесь изменить этот шаблон.

Если вы добавите это и небольшую карту в вашу .vimrc :

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

Это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...