WedX - журнал о программировании и компьютерных науках

Настройка пропуска знаков препинания при перемещении слов вперед и назад

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

например Если у меня есть какой-то код, например

объект.метод(аргументы)

и мой курсор находится на [o] в «объекте», тогда я хочу, чтобы w переместился на [m] в «метод», а другой w переместился на [а] в «аргументах». Я не хочу, чтобы он попадал на [.] или [(]. Если я когда-либо хотел перейти к знаку пунктуации, я всегда использовал f или F< /strong>, чтобы перейти прямо к нему Лично я никогда не хотел переходить на знак препинания, когда я перемещаюсь по словам, и я только что понял, что это действительно меня беспокоит.

vim
29.06.2011

  • Я не знаю, есть ли лучшее решение, но если вы не против изменить содержимое @/, вы всегда можете ввести /\<\w. Или создайте карту для этого, если вы часто его используете. 30.06.2011
  • См. stackoverflow.com/q/225266/469210. 30.06.2011
  • @Сидилл: да, конечно! Я не внимательно прочитал вопрос. Теперь я вижу, что ОП хочет перейти к [m], а не просто пропустить [.]. Я удалил свой ответ на данный момент. Я отвечаю здесь, потому что не уверен, что мой ответ на удаленный ответ дойдет до вас. 30.06.2011
  • @yoda, ну вот и дошло! Возвращаясь к вопросу, я не могу себе представить другого пути (кроме /). Возможно, если потеря содержимого @/ является проблемой, его можно сохранить в другой регистр, но мне интересно, не будет ли это довольно дорогой операцией. В любом случае, я надеюсь, что Vim скоро получит несколько регистров поиска. Это просто вопрос поиска другого бесплатного персонажа для использования :-) 30.06.2011
  • @yoda: мне только что пришла в голову еще одна идея. Что, если бы была команда вроде _/ для поиска, но не для включения шаблона в регистр @/? Хм, если в Vim этого нет, то это, безусловно, интересно исследовать и создать возможный патч. 30.06.2011
  • @sidyll: мне нравится ваше решение для перемещения с помощью /\<\w, но одна неприятность заключается в том, что оно выделяет все слова, к которым оно будет перемещаться, когда у вас включено выделение. 30.06.2011
  • @йода, я согласен. Способ поиска без сохранения результатов поиска или включения выделения, безусловно, требует тщательного изучения. Что касается этого вопроса, я думаю, что небольшая функция, которую я разместил, должна работать. 30.06.2011
  • @borrible: изменение ключевого слова, к сожалению, не решит вопрос. Это может только заставить w вести себя как W. 01.07.2011

Ответы:


1

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

29.06.2011
  • Спасибо @Джит. Это отлично работает в небольшом тесте. Мне было интересно, не могли бы вы написать дополнительное сопоставление, которое работает как «e», чтобы перейти к концу слов, но только с учетом буквенно-цифровых символов. 01.07.2011
  • @Tub: чем это отображение будет отличаться от <SPACE>e ? 01.07.2011

  • 2

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

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

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

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

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

    Он должен работать.

    29.06.2011
  • @Sidyll: Ссылка прямо на ваш предыдущий ответ, так как людям не придется его искать. Вы также получите голоса, если им будет легче найти :) 30.06.2011
  • Спасибо @yoda, я обновил его, чтобы он соответствовал ответу, а не вопросу. Этот ответ был позором, но я решил оставить его там :-) 30.06.2011
  • Привет, Сидилл, мне нравится это решение. Интересно, сможете ли вы заставить его работать в визуальном режиме (чтобы можно было расширить визуальный выбор). 30.06.2011
  • Спасибо @Джит. Ваше решение гораздо более продвинутое и интересное. Что касается визуального режима, то тут сложнее :-) Понятия не имею. 30.06.2011
  • @sidyll: проще всегда лучше, если работает! Вот почему мне нравится ваше решение. Но, к сожалению, поддержка визуального режима очень важна для любого движения, если оно должно быть частью экосистемы Vim. Я посмотрю, смогу ли я заставить ваш подход работать в визуальном режиме. 30.06.2011
  • Спасибо @Jeet, и да, визуальный режим тоже важен. Хорошо, если вы придумали решение, добавьте его в свой ответ! 01.07.2011
  • Мне нравится это решение. Однако существует бесконечный цикл, если буфер пуст. Так что надо быть осторожным :) 27.02.2017
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    © 2024 wedx.ru, WedX - журнал о программировании и компьютерных науках
    Для любых предложений по сайту: wedx@cp9.ru