- Вопрос или проблема
- этот скрипт реализует расширенную функциональность редактирования с мультикурсором
- Ответ или решение
- Шаги для добавления функции многовыборки в Notepad++
- Шаг 1: Установите плагин NppExec
- Шаг 2: Добавьте скрипты для каждой горячей клавиши
- Шаг 3: Создайте меню для каждого скрипта
- Шаг 4: Назначьте горячие клавиши для новых меню
- Дополнительные замечания
Вопрос или проблема
Я ищу способ использовать следующую функциональность в открытом исходном коде 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++. Для установки выполните следующие шаги:
- Откройте Notepad++.
- Перейдите в меню
Плагины
>Плагины Admin
. - В строке поиска введите
NppExec
. - Установите галочку рядом с NppExec и нажмите кнопку
Install
. После установки потребуется перезапустить Notepad++.
Шаг 2: Добавьте скрипты для каждой горячей клавиши
Теперь, когда NppExec установлен, необходимо добавить скрипты для выполнения функций многовыборки. С помощью следующих скриптов вы сможете добавлять многовыборку и пропускать повторяющиеся слова.
Скрипты:
-
Добавить следующий выбор (Ctrl + D):
NPP_CONSOLE 0 sci_sendmsg 2690 // SCI_TARGETWHOLEDOCUMENT sci_sendmsg SCI_SETSEARCHFLAGS 0 sci_sendmsg 2688 // SCI_MULTIPLESELECTADDNEXT
-
Добавить следующий выбор (целиком) (Shift + Ctrl + D):
NPP_CONSOLE 0 sci_sendmsg 2690 // SCI_TARGETWHOLEDOCUMENT sci_sendmsg SCI_SETSEARCHFLAGS SCFIND_WHOLEWORD sci_sendmsg 2688 // SCI_MULTIPLESELECTADDNEXT
-
Добавить каждый выбор (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
-
Отменить последний выбор (Ctrl + U):
NPP_CONSOLE 0 sci_sendmsg SCI_GETSELECTIONS set n ~ $(MSG_RESULT) - 1 sci_sendmsg SCI_DROPSELECTIONN $(n)
-
Пропустить повторяющийся выбор (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)
-
Пропустить целиком (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: Создайте меню для каждого скрипта
После того как все скрипты сохранены, их необходимо добавить в меню плагина:
- Перейдите в меню
Plugins
>NppExec
>Advanced Options
. - В левой части выберите нужный скрипт и нажмите
Add/Modify
, чтобы добавить его в список меню. - Убедитесь, что опция
Place in the Macros Submenu
выбрана (если вы хотите видеть в подменю макросов). - Нажмите
OK
, а затем перезапустите Notepad++.
Шаг 4: Назначьте горячие клавиши для новых меню
Теперь, когда скрипты добавлены в меню, задайте им горячие клавиши:
- Перейдите в
Настройки
>Карта сочетаний
. - Выберите вкладку
Plugin Commands
и найдите ваши новые команды. - Для каждой команды выберите её и нажмите
Modify
, выберите сочетания клавиш, которые хотите использовать. - Сохраните изменения.
Дополнительные замечания
- Убедитесь, что выбранные вами сочетания клавиш не конфликтуют с уже существующими.
- Если вы хотите откатить изменения, вы можете легко удалить или изменить назначение горячих клавиш для ваших скриптов, используя вышеупомянутые методы.
Следуя этим шагам, вы сможете настроить многовыборку в Notepad++, которая позволит вам редактировать множество вхождений одновременно, повышая вашу продуктивность и удобство работы.