Dodaj wybierz następne dopasowanie w Notepad ++ (jak Ctrl + D w Sublime Text)

13

Poszukuję sposobu na użycie następującej funkcji w Notepad ++ o otwartym kodzie źródłowym.

W SublimeText, jeśli naciśniesz Ctrl+ D(mac: cmd+ Dmyślę), dzieje się tak:

  • Jeśli nie ma wyboru, pozycja kursora jest rozszerzana, aby wybrać to słowo.
  • W przeciwnym razie wybierane jest również następne wystąpienie tego słowa (bez konieczności otwierania wyskakującego okienka wyszukiwania).

Następnie możesz wybrać wiele słów, które możesz zmienić, i rzeczywiście widziałeś każde z tych miejsc (w przeciwieństwie do zaznaczania wszystkich).

Czy można to zrobić w Notepad ++ (może przy pomocy Autohotkey)?

Opcjonalnie: w Sublime możesz również cofnąć każdy z tych Ctrl+ Dza pomocą Ctrl+ Ui pominąć wystąpienie za pomocą Ctrl+ K.

ben
źródło

Odpowiedzi:

2

Znalazłem ten wątek na stronie społeczności Notepad ++:

https://notepad-plus-plus.org/community/topic/11360/multi-selection-and-multi-edit

Korzystają z wtyczki skryptu Python, aby utworzyć tę funkcjonalność za pomocą następującego skryptu:

# this script implements the enhanced multi cursor edit functionality

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=replace,  1=before,  2=afterwards\n'
        area_options = ' a=all, b=bookmarks, s=selected, v=visible'
        expected_results = [x+y for x in ['0','1','2'] for y in ['a','b','s','v']]

        result = notepad.prompt(mode_options + area_options, 'Choose the desired option', '0a')
        while result not in expected_results: 
            if result is None:
                return
            result = notepad.prompt(mode_options + area_options, 'Choose the desired option', '0a')

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

        if chosen_mode == '0': # replace whole string version
            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': # insert before selected string version
            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': # insert after selected string version
            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)


        # now add the current selection
        editor.addSelection(_current_word_start_pos, _current_word_end_pos)

Main()
editor.endUndoAction()
Tony Brix
źródło
Chociaż ten skrypt jest dość dziwny, jest to odpowiedni sposób, jeśli ktoś potrzebuje selekcji wielokrotnej i nie chce nurkować w kodzie źródłowym Scintilla.
polkovnikov.ph
1

Możesz po prostu nacisnąć, F3aby kontynuować wyszukiwanie.

Christian Seiler
źródło
Tak, ale musisz to zrobić, naciskając Ctrl + F. To jedyny minus, myślę, że to najlepsze obejście.
Jack '
-1

Tak, funkcja „Wybierz i znajdź następny” jest dostępna w Notepad ++.

Kluczową kombinacją tego jest.

Ctrl + F3

I aby wybrać poprzednie wystąpienie, jest to.

Ctrl+ Shift+F3

Możesz to sprawdzić w menu Szukaj .

Ayan
źródło
Dziękuję za odpowiedź, ale konkretnie poprosiłem, abyś mógł następnie dokonać wielokrotnego wyboru tych słów (tak jakbyś kliknął klawisz Ctrl i kliknął każdy dodatkowy wybór). Przykład: masz słowo float, naciskasz kombinację klawiszy, teraz drugie wystąpienie floatjest dodawane do wyboru wielokrotnego. Następnie możesz wpisać, doubleaby zastąpić dwa wystąpienia (i zachować resztę pliku bez zmian)
ben
Nie jestem pewien, czy coś takiego jest dostępne w Notepad ++. Ale dam ci znać, jeśli natknę się na to lub znajdę sposób, aby to zrobić.
Ayan
Niestety Ctrl + F3 zaznaczają tylko te same słowa, ale nie można edytować ich wszystkich jednocześnie.
Manuel Di Iorio,
@ManuelDiIorio, dlatego musisz użyć funkcji zamiany. Jest w trakcie wyszukiwania lub możesz po prostu nacisnąć Ctrl + H.
Ayan
Cóż, znalazłem funkcję MultiEditing w Notatniku ++ i podoba mi się!
Manuel Di Iorio,