Можно ли переместить курсор на следующий экземпляр определенного слова?

#visual-studio-code #vscode-extensions

Вопрос:

Мне нужно запустить VSCode через некоторый XML, который по крайней мере на 90% генерируется автоматически. Есть несколько вещей, которые автоматическая генерация не может определить самостоятельно и требует ручного вмешательства при ручном редактировании, когда на каждой записи будет сгенерирован определенный фрагмент текста.

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

Например, нажмите F17, чтобы перейти к следующему экземпляру «FIXME» в текущем документе.

Я просмотрел по меньшей мере дюжину расширений и не нашел ничего, что соответствовало бы моим потребностям, а встроенный actions.find не поддерживает параметры. actions.findWithSelection требуется, чтобы текст был выделен, так что это тоже не сработает.

Есть какие-нибудь идеи? У кого-то наверняка была такая же потребность в этом в какой-то момент. По крайней мере, я не могу рассматривать это как редкую потребность.

Ответ №1:

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

 {
  "key": "alt r",
  "command": "findInCurrentFile",
  "args": {
    "find": "FIXME",
    // "replace": "DONE",
    "restrictFind": "nextMoveCursor"
  }
}
 

или

 
{
  "key": "alt r",
  "command": "findInCurrentFile",
  "args": {
    // "find": "FIXME",        // no find necessary !!
    // "replace": "DONE",
    "restrictFind": "nextMoveCursor"
  }
},
 

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

Во втором примере будет использоваться слово под курсором, и, следовательно, требуется, чтобы вы начинали FIXME , например, со слова.

Первая демонстрация (со значением поиска):

переместите курсор к следующему пункту поиска

Вторая демонстрация (без поиска, обратите внимание, что при поиске используются слова под курсором):

переместите курсор на следующий без поиска

Расширение может сделать гораздо больше. По ссылке выше приведено много примеров.

 {
  "key": "alt r",
  "command": "findInCurrentFile",
  "args": {
    "find": "FIXME",
    // "replace": "DONE",
    "restrictFind": "nextSelect"
  }
}
 

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

выберите следующее вхождение



Я думаю, что это расширение (которое я написал) — это то, что вы ищете: перейдите и выберите.

Пример привязки клавиш (без дополнительного выбора фразы):

 {
    "key": "alt r",                       // whatever keybinding you wish
    "command": "jump-and-select.jumpForward",
    "args": {
            "text": "FIXME",
            // "restrictSearch": "document",
    }
},
 

найти демо-версию расширения

[Если вы действительно хотели найти все совпадения и при необходимости заменить их заранее определенным регулярным выражением найти/заменить, см. раздел Поиск и преобразование.]

Ответ №2:

Вы, скорее всего, ищете Переместить Последний выбор В Следующий Поиск соответствия ( editor.action.moveSelectionToNextFindMatch ), по умолчанию привязанный к ctrl k ctrl d. Противоположное направление ( editor.action.moveSelectionToPreviousFindMatch ) не имеет привязки по умолчанию.

Лично я использую Ctrl Shift vertical arrowsих для этого, и поверьте мне на слово, я использую их все время. keybindings.json отрывок:

   {
    "command": "editor.action.moveSelectionToPreviousFindMatch",
    "key": "ctrl shift up",
    "when": "editorFocus"
  },
  {
    "command": "editor.action.moveSelectionToNextFindMatch",
    "key": "ctrl shift down",
    "when": "editorFocus"
  },

 

Действительно, эти имена команд совершенно невозможно найти в палитре команд, когда вы просто хотите «перейти к следующему вхождению слова или выделению под курсором». Это за пределами понимания, как они получили такие запутанные имена.


Поздравляю с первым вопросом, кстати!

Комментарии:

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

2. ДА. Но, по крайней мере, первый вызов с пустым выделением молча «расширяет выделение», поэтому с помощью простого ярлыка вам нужно просто вызвать его дважды, чтобы фактически перейти к следующему вхождению. Я думаю, что это вполне терпимо и дает вам точную обратную связь о том, куда вы собираетесь перейти.