Добавить выбор следующего совпадения в Notepad++ (как Ctrl + D в Sublime Text)

Вопрос или проблема

Я ищу способ использовать следующую функциональность в открытом исходном коде Notepad++.

В SublimeText, если вы нажмете Ctrl + D (на Mac: cmd + D, я думаю), произойдет следующее:

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

В результате у вас будет мультивыбор слов, которые вы можете изменить, и вы фактически видели каждое из этих мест (в отличие от выбора всего).

Можно ли это сделать в Notepad++ (может быть, с помощью Autohotkey)?

Дополнительно: в Sublime вы также можете отменить каждое из этих Ctrl + D с помощью Ctrl + U и пропустить вхождение с помощью Ctrl + K.

Я выбрал, что считаю самым простым и прямым методом из ссылки Тони Брикса (спасибо, Тони). Это использует плагин NppExec для выполнения фрагментов кода, чтобы добавить каждую горячую клавишу.

Примечание: Есть плагин для NP++, называющийся BetterMultiSelection, но я не смог заставить его работать до того, как перешел дальше, может быть, стоит посмотреть.

Сводные шаги для добавления мультивыбора на следующий матч в NP++

Установите плагин NppExec – требуется перезагрузка NPP
Добавьте скрипт / фрагмент для каждой горячей клавиши, которую вы хотите
Создайте элементы меню для каждого скрипта – требуется перезагрузка NPP
Назначьте элементам меню сочетание клавиш / горячую клавишу

Шаг 1: установите плагин NppExec
Этот плагин позволяет вам запускать скрипты N++ напрямую через консоль. Для тех, кто не знаком и спешит, вы можете установить плагин NppExec, выбрав. Для получения дополнительной информации вот ссылка на README плагина NppExec на GitHub.

Плагины > Администратор плагинов в меню
Поиск NppExec
☑ Установите галочку и нажмите Установить (вам потребуется перезапустить Notepad++)

Шаг 2: добавьте фрагменты для каждой горячей клавиши, которую вы хотите
Ниже приведенные скрипты дают NP++ функциональность многоредактирования как в VSCode с двумя различными сочетаниями клавиш для addNext и skip.

ОСТОРОЖНО С КОНФЛИКТАМИ: Ctrl + D уже был в использовании, так что вам также может понадобиться быть осторожным с этим. Либо уберите конфликты, либо измените предоставленные горячие клавиши в соответствии с вашей средой. Для сопоставлений клавиш перейдите в Настройки > Диспетчер сочетаний клавиш.

addNext Ctrl+D
NPP_CONSOLE 0
sci_sendmsg 2690 // SCI_TARGETWHOLEDOCUMENT
sci_sendmsg SCI_SETSEARCHFLAGS 0
sci_sendmsg 2688 // SCI_MULTIPLESELECTADDNEXT

addNextWholeWord Shift+Ctrl+D
NPP_CONSOLE 0
sci_sendmsg 2690 // SCI_TARGETWHOLEDOCUMENT
sci_sendmsg SCI_SETSEARCHFLAGS SCFIND_WHOLEWORD
sci_sendmsg 2688 // SCI_MULTIPLESELECTADDNEXT

addEach Shift+Ctrl+L
NPP_CONSOLE 0
sci_sendmsg 2690 // SCI_TARGETWHOLEDOCUMENT
sci_sendmsg SCI_GETSELECTIONEMPTY
if $(MSG_RESULT) == 1 then
sci_sendmsg SCI_SETSEARCHFLAGS SCFIND_WHOLEWORD
else
sci_sendmsg SCI_SETSEARCHFLAGS 0
endif
sci_sendmsg 2689 // SCI_MULTIPLESELECTADDEACH
sci_sendmsg 2689 // SCI_MULTIPLESELECTADDEACH

undoAddNext Ctrl+U
NPP_CONSOLE 0
sci_sendmsg SCI_GETSELECTIONS
set n ~ $(MSG_RESULT) – 1
sci_sendmsg SCI_DROPSELECTIONN $(n)

skip Alt+Ctrl+D
NPP_CONSOLE 0
sci_sendmsg SCI_SETSEARCHFLAGS SCFIND_NONE
sci_sendmsg 2688 // SCI_MULTIPLESELECTADDNEXT
sci_sendmsg SCI_GETSELECTIONS
set n ~ $(MSG_RESULT) – 2
sci_sendmsg SCI_DROPSELECTIONN $(n)

skipWholeWord Alt+Shift+Ctrl+D
NPP_CONSOLE 0
sci_sendmsg SCI_SETSEARCHFLAGS SCFIND_NONE
sci_sendmsg 2688 // SCI_MULTIPLESELECTADDNEXT
sci_sendmsg SCI_GETSELECTIONS
set n ~ $(MSG_RESULT) – 2
sci_sendmsg SCI_DROPSELECTIONN $(n)

скрипты и комментарии через bitagoras от 2020-05-04 – src
Чтобы сохранить вышеприведенные скрипты / фрагменты из консоли

F6 или… Из меню Плагины > NppExec > Выполнить
Вставьте ОДИН из коротких "скриптов" выше в окно Выполнить, которое появится
(По желанию, но рекомендуется) протестируйте, нажав кнопку ОК
Снова нажмите F6; "скрипт" с предыдущего раза был сохранен и отображается в окне
Нажмите Сохранить и дайте имя (предложения выше каждого скрипта)
нажмите ОК

СОВЕТ ПО СКОРОСТИ: вам нужно будет повторить эти шаги для каждого скрипта, который вы хотите использовать. Если вы не хотите сначала протестировать один, гораздо быстрее сохранить все скрипты перед переходом к следующему шагу.

вышеуказанные шаги обобщены от пользователя Алана Килборна от 2020-05-21 src
Шаг 3: создайте элементы меню для каждого скрипта
Когда один или несколько скриптов названы и сохранены, их необходимо добавить в меню, чтобы можно было назначить сочетание клавиш.

СОВЕТ ПО СКОРОСТИ: Повторите для всех добавленных скриптов перед нажатием ОК, чтобы избежать множественных перезагрузок (если вы не хотите сначала протестировать один).

Из меню Плагины > NppExec > Расширенные параметры.
В нижнем левом углу используйте выпадающее меню Ассоциированный скрипт, чтобы выбрать скрипт
нажмите Добавить/Изменить, чтобы добавить его в список Элементов меню в верхнем левом углу, обратите внимание, включен ли ☑ пункт Поместить в подс меню Макросов (вам это понадобится позже).

После того, как элементы меню были добавлены… нажмите ОК, чтобы применить эти изменения, затем перезагрузите Notepad++.
Шаг 4: назначьте элементам меню сочетание клавиш / горячую клавишу

После перезагрузки и начиная с основного меню, перейдите в Настройки > Диспетчер сочетаний клавиш > вкладка Команды плагина
Фильтруйте по NppExec и прокрутите вниз, пока не увидите имена новых скриптов.
Нажмите на скрипт, для которого вы хотите назначить сочетание клавиш, нажмите Изменить и выберите соответствующую комбинацию Ctrl, Alt, Shift и выбранной клавиши.

Повторите процедуру Изменить для всех скриптов, для которых вы хотите назначить сочетание клавиш.
шага 3 & 4, обобщены из последующего комментария Питера Джонса – src.
Назад / как отменить ошибки
Чтобы проверить или подтвердить свой список добавленных скриптов

если чекбокс макроса был включен, перейдите в меню Макросы
если чекбокс был отключен, перейдите в Плагины > NppExec

Если вы допустили ошибку и / или решили удалить скрипт

Перейдите в Плагины > NppExec > Расширенные параметры
и выберите элемент, который хотите удалить, нажмите кнопку Удалить и выйдите из меню
Нажмите F6
выберите скрипт, который хотите удалить из выпадающего списка
нажмите Сохранить, чтобы выбрать вариант удаления …неинтуитивный шаг
нажмите кнопку Удалить

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

V8.6 добавил эту функцию https://github.com/notepad-plus-plus/notepad-plus-plus/issues/14509

Ответ до версии 8.6:
Я нашел эту тему на странице сообщества Notepad++:
https://notepad-plus-plus.org/community/topic/11360/multi-selection-and-multi-edit
Они используют плагин python script для создания этой функциональности со следующим скриптом:

этот скрипт реализует расширенную функциональность редактирования с мультикурсором

def default_positions():
return 0, editor.getLength()

def get_pos_of_bookmarks():
npp_bookmark_marker_id_number = 24
npp_bookmark_marker_mask = 1 << npp_bookmark_marker_id_number
_start_position, _end_position = default_positions()

line_nbr = editor.markerNext(_start_position, npp_bookmark_marker_mask)
if line_nbr != -1:
    _start_position = editor.positionFromLine(line_nbr)
    line_nbr = editor.markerNext(line_nbr + 1, npp_bookmark_marker_mask)
    if line_nbr != -1:
        _end_position = editor.getLineEndPosition(line_nbr)
return _start_position, _end_position

def get_pos_of_visible_lines():
first_visible_line = editor.getFirstVisibleLine()
_start_position = editor.positionFromLine(first_visible_line)
lines_visible = editor.linesOnScreen()
last_visible_line = editor.docLineFromVisible(first_visible_line+lines_visible)
_end_position = editor.getLineEndPosition(last_visible_line)
return _start_position, _end_position

def get_pos_of_selections():
_start_position, _end_position = default_positions()
if editor.getSelections() == 2:
_start_position = editor.getSelectionNStart(0)
_end_position = editor.getSelectionNEnd(1)
return _start_position, _end_position

area_dict = {‘a’:default_positions,
‘b’:get_pos_of_bookmarks,
‘s’:get_pos_of_selections,
‘v’:get_pos_of_visible_lines}

editor.beginUndoAction()

def Main():
_text = editor.getTextRange(editor.getSelectionNStart(0), editor.getSelectionNEnd(0))
if len(_text) != 0:

    _current_position = editor.getCurrentPos()
    _current_line = editor.lineFromPosition(_current_position)
    _current_word_start_pos = editor.getLineSelStartPosition(_current_line)
    _current_word_end_pos = editor.getLineSelEndPosition(_current_line)

    find_flag = 2 # 0=DEFAULT, 2=WHOLEWORD 4=MATCHCASE 6=WHOLEWORD | MATCHCASE
    mode_options=" 0=заменить,  1=перед,  2=после\n"
    area_options=" a=все, b=закладки, s=выбранные, v=видимые"
    expected_results = [x+y for x in ['0','1','2'] for y in ['a','b','s','v']]

    result = notepad.prompt(mode_options + area_options, 'Выберите желаемый вариант', '0a')
    while result not in expected_results: 
        if result is None:
            return
        result = notepad.prompt(mode_options + area_options, 'Выберите желаемый вариант', '0a')

    chosen_mode, chosen_area = result
    area_start_position, area_end_position = area_dict[chosen_area]()

    if chosen_mode == '0': # заменить строку целиком
        editor.setEmptySelection(_current_position)       
        position_tuple = editor.findText(find_flag, area_start_position, area_end_position, _text)

        while position_tuple is not None:
            if _current_position not in position_tuple:
                editor.addSelection(*position_tuple)
            position_tuple = editor.findText(find_flag, position_tuple[1], area_end_position, _text)

    elif chosen_mode == '1': # вставить перед выбранной строкой
        editor.setEmptySelection(_current_word_start_pos)
        position_tuple = editor.findText(find_flag, area_start_position, area_end_position, _text)

        while position_tuple is not None: 
            startpos, endpos = position_tuple
            if startpos != _current_position and endpos != _current_position:
                editor.addSelection(startpos, startpos)
            else:
                _current_word_start_pos, _current_word_end_pos = startpos, startpos
            position_tuple = editor.findText(find_flag, endpos, area_end_position, _text)

    elif chosen_mode == '2': # вставить после выбранной строки
        editor.setEmptySelection(_current_word_end_pos)
        position_tuple = editor.findText(find_flag, area_start_position, area_end_position, _text)

        while position_tuple is not None: 
            startpos, endpos = position_tuple
            if startpos != _current_position and endpos != _current_position:
                editor.addSelection(endpos, endpos)
            else:
                _current_word_start_pos, _current_word_end_pos = endpos, endpos
            position_tuple = editor.findText(find_flag, endpos, area_end_position, _text)

    # теперь добавим текущее выделение
    editor.addSelection(_current_word_start_pos, _current_word_end_pos)

Main()
editor.endUndoAction()

Вы можете просто нажать F3, чтобы продолжить поиск.

Да, функция "Выбрать и найти следующее" есть в Notepad++.

Сочетание клавиш для этого – Ctrl + F3.

А чтобы выбрать предыдущее вхождение, это – Ctrl + Shift + F3.

Вы можете проверить это в меню Поиск.

Теперь вы можете использовать Поиск > Найти (эфемерный) Следующий для этой функции. Значение по умолчанию для горячей клавиши – CtrlAltF3.

Ответ или решение

Чтобы реализовать функцию многовыборки в Notepad++, аналогичную функции Ctrl + D в Sublime Text, можно воспользоваться плагином NppExec и скриптами. Данная методика позволит вам выбирать повторяющиеся слова или фразы без необходимости открывать диалог поиска, а также добавлять горячие клавиши для выполнения этих операций.

Шаги для добавления функции многовыборки в Notepad++

Шаг 1: Установите плагин NppExec

Плагин NppExec позволяет запускать скрипты и команды непосредственно из Notepad++. Для установки выполните следующие шаги:

  1. Откройте Notepad++.
  2. Перейдите в меню Плагины > Плагины Admin.
  3. В строке поиска введите NppExec.
  4. Установите галочку рядом с NppExec и нажмите кнопку Install. После установки потребуется перезапустить Notepad++.

Шаг 2: Добавьте скрипты для каждой горячей клавиши

Теперь, когда NppExec установлен, необходимо добавить скрипты для выполнения функций многовыборки. С помощью следующих скриптов вы сможете добавлять многовыборку и пропускать повторяющиеся слова.

Скрипты:
  1. Добавить следующий выбор (Ctrl + D):

    NPP_CONSOLE 0
    sci_sendmsg 2690  // SCI_TARGETWHOLEDOCUMENT
    sci_sendmsg SCI_SETSEARCHFLAGS 0
    sci_sendmsg 2688  // SCI_MULTIPLESELECTADDNEXT
  2. Добавить следующий выбор (целиком) (Shift + Ctrl + D):

    NPP_CONSOLE 0
    sci_sendmsg 2690  // SCI_TARGETWHOLEDOCUMENT
    sci_sendmsg SCI_SETSEARCHFLAGS SCFIND_WHOLEWORD
    sci_sendmsg 2688  // SCI_MULTIPLESELECTADDNEXT
  3. Добавить каждый выбор (Shift + Ctrl + L):

    NPP_CONSOLE 0
    sci_sendmsg 2690  // SCI_TARGETWHOLEDOCUMENT
    sci_sendmsg SCI_GETSELECTIONEMPTY
    if $(MSG_RESULT) == 1 then
        sci_sendmsg SCI_SETSEARCHFLAGS SCFIND_WHOLEWORD
    else
        sci_sendmsg SCI_SETSEARCHFLAGS 0
    endif
    sci_sendmsg 2689  // SCI_MULTIPLESELECTADDEACH
    sci_sendmsg 2689  // SCI_MULTIPLESELECTADDEACH
  4. Отменить последний выбор (Ctrl + U):

    NPP_CONSOLE 0
    sci_sendmsg SCI_GETSELECTIONS
    set n ~ $(MSG_RESULT) - 1
    sci_sendmsg SCI_DROPSELECTIONN $(n)
  5. Пропустить повторяющийся выбор (Alt + Ctrl + D):

    NPP_CONSOLE 0
    sci_sendmsg SCI_SETSEARCHFLAGS SCFIND_NONE
    sci_sendmsg 2688  // SCI_MULTIPLESELECTADDNEXT
    sci_sendmsg SCI_GETSELECTIONS
    set n ~ $(MSG_RESULT) - 2
    sci_sendmsg SCI_DROPSELECTIONN $(n)
  6. Пропустить целиком (Alt + Shift + Ctrl + D):

    NPP_CONSOLE 0
    sci_sendmsg SCI_SETSEARCHFLAGS SCFIND_NONE
    sci_sendmsg 2688  // SCI_MULTIPLESELECTADDNEXT
    sci_sendmsg SCI_GETSELECTIONS
    set n ~ $(MSG_RESULT) - 2
    sci_sendmsg SCI_DROPSELECTIONN $(n)

Для сохранения этих скриптов выполните следующие действия:

  • Нажмите F6 или перейдите в меню Plugins > NppExec > Execute.
  • Вставьте один из скриптов в открывшееся окно.
  • Нажмите OK, чтобы протестировать.
  • Повторите для всех скриптов.

Шаг 3: Создайте меню для каждого скрипта

После того как все скрипты сохранены, их необходимо добавить в меню плагина:

  1. Перейдите в меню Plugins > NppExec > Advanced Options.
  2. В левой части выберите нужный скрипт и нажмите Add/Modify, чтобы добавить его в список меню.
  3. Убедитесь, что опция Place in the Macros Submenu выбрана (если вы хотите видеть в подменю макросов).
  4. Нажмите OK, а затем перезапустите Notepad++.

Шаг 4: Назначьте горячие клавиши для новых меню

Теперь, когда скрипты добавлены в меню, задайте им горячие клавиши:

  1. Перейдите в Настройки > Карта сочетаний.
  2. Выберите вкладку Plugin Commands и найдите ваши новые команды.
  3. Для каждой команды выберите её и нажмите Modify, выберите сочетания клавиш, которые хотите использовать.
  4. Сохраните изменения.

Дополнительные замечания

  • Убедитесь, что выбранные вами сочетания клавиш не конфликтуют с уже существующими.
  • Если вы хотите откатить изменения, вы можете легко удалить или изменить назначение горячих клавиш для ваших скриптов, используя вышеупомянутые методы.

Следуя этим шагам, вы сможете настроить многовыборку в Notepad++, которая позволит вам редактировать множество вхождений одновременно, повышая вашу продуктивность и удобство работы.

Оцените материал
Добавить комментарий

Капча загружается...