Есть ли способ эмулировать функцию расширенного выделения в Vim в ReSharper? - PullRequest
7 голосов
/ 18 апреля 2009

ReSharper имеет замечательную функцию, называемую «расширение выделения»: нажимая CTRL+W (я думаю, что это значение по умолчанию), вы выбираете все больше и больше из текущего местоположения каретки. Сначала это слово, затем все больше и больше слов, строка, внутренний, а затем внешний блок строк (например, блок if), затем функция и т. Д. *

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

Я только начал изучать все тонкости vim, и у меня недостаточно опыта, чтобы увидеть, как нечто подобное может быть реализовано в Vim (хотя я предполагаю, что это возможно). Итак, мой вопрос предназначен для гуру Vim там: это можно сделать и как?

Обновление: немного фоновой истории. Я говорил со своим бывшим боссом о всех преимуществах Вима, и он думает, что это все здорово. Его единственный вопрос / проблема был: имеет ли он "расширенный выбор"? Мой вопрос до сих пор был нет . Итак, если кто-то знает ответ, я наконец-то выиграю дискуссию: P (и, возможно, создам новый конвертер Vim :-))

Ответы [ 5 ]

3 голосов
/ 18 апреля 2009

Я быстро решил эту проблему. Это не работает как есть. Не стесняйтесь вносить изменения и публиковать их на вики-сайте vim или в виде плагина, если вы его уточнили.

есть вероятность, что вы захотите составить список g: resharp_list для каждого языка (например, один для парантезированных языков и т. Д.)

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

"resharp emulator
"TODO this needs a marker
"also c-w is bad mapping as it has a lag with all the other-
"window mappings
"
let g:resharp_index = 0

let g:resharp_select =  ['iw', 'is', 'ip', 'ggVG']

func! ResharpSelect()
    if g:resharp_index >= len (g:resharp_select)
        let g:resharp_index = 0
    endif

    exe "norm \<esc>v" . g:resharp_select[g:resharp_index]
    let g:resharp_index = g:resharp_index + 1
endfun

nnoremap <c-w>  :call ResharpSelect()<cr>
vnoremap <c-w>  :call ResharpSelect()<cr>

"Something to reset on timeout. TODO this doesn't work
au CursorHold :let g:resharp_index = 0<cr>
2 голосов
/ 18 апреля 2009

Если вы говорите о Vim (и вы должны быть :-), вы можете начать помечать текст командой v, тогда у вас есть все стандартные команды перемещения курсора (и, как вы знаете, лот из них), что расширит выделение, а также переместит курсор.

Тогда вы просто делаете с выбранным текстом все, что хотите.

См. здесь для подробностей.

2 голосов
/ 18 апреля 2009

Нужно написать функцию, которая будет сохранять текущий выбор, затем пробовать все более широкие выборки, пока новый выбор не превысит сохраненный или выделит весь текст. Некоторые возможные варианты:

  • viW - выберите слово
  • vis - выберите предложение
  • vip - выберите пункт
  • viB - выделить текст в самых внутренних скобках
  • v2iB - выделить текст в следующих самых внутренних скобках
  • ggVG - выделить весь текст
2 голосов
/ 18 апреля 2009

Ответ - да. В визуальном режиме вы можете использовать все обычные методы навигации, а также некоторые дополнительные.

Некоторые из моих любимых? Сначала нажмите v в обычном режиме, чтобы перейти в визуальный режим, затем нажмите:

  1. iw - для выбора внутреннего слова. Отлично подходит для выбора слова, исключая окружающие скобки или кавычки
  2. w - нажмите несколько раз, чтобы выбрать каждое последующее слово.
  3. b - выбор словесных обратных слов
  4. ^ - выбрать все от текущей позиции до начала текста в строке
  5. $ - выбрать все от текущей позиции до конца строки

Я уверен, что другие здесь тоже могут добавить в этот список. Да, и не забывайте, что в режиме Visual Block C-v вы можете попробовать его в vim с помощью приведенных выше команд, он работает в двух измерениях: -)

1 голос
/ 11 июня 2011

Я думаю, что Джереми Уолл движется в правильном направлении. И чтобы немного продвинуться в этом направлении, вы можете взглянуть на сценарий «round.vim »Тима Попа. Хорошее описание доступно на github . Или, если хотите, получите его с vim.org . Это, вероятно, поможет вам сделать некоторые вещи, которые вы хотели бы сделать, хотя, похоже, в нем нет функции, скажем, простого выбора внутри тега. Дайте мне знать, если я ошибаюсь.

В конечном счете, вам действительно нужна иерархия вложенных текстовых объектов. Вы должны читать текстовые объекты, если вы этого не сделали. Хороший обзор здесь . Обратите внимание, что вы можете захватить несколько объектов за один раз, используя счетчики, или сделать это итеративно (попробуйте vawasap}}} из обычного режима).

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

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

... НО, я только что нашел в этом посте , что вы можете изменить это поведение с помощью o. Круто!

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

В любом случае, мне было бы любопытно посмотреть, придет ли кто-нибудь еще более общее решение!

...