Макрос/команда для построения диапазона слов в обоих направлениях?

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

Я вполне доволен возможностью быстро удалить/стереть/изменить/и т. д. диапазон текста, начиная с курсора.

Но, похоже, нет хорошего способа быстро, но точно перемещаться по фактическому курсору так, как я считаю оптимальным:

Учтите, что при редактировании кода (при редактировании прозы это не проблема) вы имеете дело с тяжелым синтаксисом с '"[{(< символами, распределенными между пробелами (я отказался от вкладок в пользу всех пробелов для гибкости, но это не влияет на это). Это означает, что любой полезный способ перехода между символами, не являющимися словами, будет пропускать границы кода, между которыми часто необходимо выполнять операции редактирования.

Таким образом, хотя b, e, w и их смещенные (обратные движения) аналоги (и никогда не используемые мной ge/gE) в определенной степени полезны, они не обеспечивают полезной детализации для обнуления.

Вот моя идея: загадочная клавиша X как расширение f и t с поиском вперед (и их аналогов F и T с поиском назад), который принимает два аргумента нажатия клавиши, а не один:

что, учитывая это начальное состояние, когда курсор находится на символе n во второй строке:

watch: {
  files: ['<%= jshint.files %>'],
} //   Cursor Here ^

Я могу ввести Xjs, и это будет искать слева от курсора первое j, искать справа от курсора первое s и выполнять операцию в этом диапазоне.

например cXjsfoo выходов

watch: {
  files: ['<%= foo %>'],
}

cXjtbaz дает (иногда эквивалентно ciwbaz, но точнее, так как iw зависит от iskeyword!)

watch: {
  files: ['<%= baz.files %>'],
}

dX%% выдергивает %= baz.files % (это невозможно даже с surround.vim, так как % не распознается как совпадающая пара, и я бы не хотел, чтобы она обязательно рассматривалась как одна):

watch: {
  files: ['<>'],
}

и так далее.

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

Да, технически не так уж сложно просто сделать F%df%, но dX%% просто имеет больше смысла в моей голове, и в результате F%df% для меня на самом деле никогда не бывает быстрее, чем, например. hhhhhhhdf%. Далее учтите, что X можно было бы легко привязать к одной клавише, поэтому в этом случае мы фактически сохраняем два нажатия клавиши.

Я знаю, что могу сделать это с помощью привязки клавиш в винтажном режиме Sublime Text; он достаточно мощный. Но как насчет Вима? Является ли это возможным?


person Steven Lu    schedule 15.08.2013    source источник
comment
С другой стороны, я замечаю, что в большинстве случаев я испытываю тягу к этому типу функций, когда имею дело со списками параметров и их надоедливыми запятыми. Возможно, действительно хороший плагин для редактирования списка параметров также поможет.   -  person Steven Lu    schedule 15.08.2013


Ответы (2)


onoremap <silent> X :<C-u>execute 'normal! vlF' . nr2char(getchar()) . 'of' . nr2char(getchar())<CR>
vnoremap <silent> X :<C-u>execute 'normal! vlF' . nr2char(getchar()) . 'of' . nr2char(getchar())<CR>

<C-u> очищает командную строку (в случае, если '<,'> было автоматически вставлено); Затем execute 'normal!' оценивает следующее выражение и выполняет его как обычную команду:

'vlF' . nr2char(getchar()) . 'of' . nr2char(getchar())

Это ожидает следующие 2 ключа (например, js) и объединяет их в vlFjofs, в результате чего текстовый объект охватывает от предыдущего j до следующего s. l перед F необходим в случае, если ваш курсор в настоящее время находится на первом введенном символе.

person Nikita Kouevda    schedule 15.08.2013

Я не совсем уверен в актуальности того, что вы спрашиваете. Со всеми примерами в вашем вопросе легко справиться, используя то, что уже есть в Vim.

1-й пример ([x] отмечает позицию курсора):

    watch: {
      files: ['<%= jshi[n]t.files %>'],
    }

    ciWfoo

    watch: {
      files: ['<%= fo[o] %>'],
    }

2-й пример:

    watch: {
      files: ['<%= jshi[n]t.files %>'],
    }

    ciwbaz

    watch: {
      files: ['<%= ba[z].files %>'],
    }

3-й пример:

    watch: {
      files: ['<%= ba[z].files %>'],
    }

    di<

    watch: {
      files: ['<[>]'],
    }

Создание новых текстовых объектов действительно весело и полезно, но убедитесь, что вы не слишком много думаете об этом.

person romainl    schedule 15.08.2013