Hinzufügen der nächsten Übereinstimmung in Notepad ++ (wie Strg + D in Sublime Text)

13

Ich suche nach einer Möglichkeit, die folgenden Funktionen im Open Source Notepad ++ zu nutzen.

Wenn Sie in SublimeText Ctrl+ drücken D(Mac: cmd+ Dglaube ich), geschieht Folgendes :

  • Wenn keine Auswahl vorhanden ist, wird die Cursorposition erweitert, um dieses Wort auszuwählen.
  • Andernfalls wird auch das nächste Vorkommen dieses Wortes ausgewählt (ohne dass ein Such-Popup geöffnet werden muss).

Sie haben dann eine Mehrfachauswahl von Wörtern, die Sie ändern können, und Sie haben tatsächlich jede dieser Stellen gesehen (im Gegensatz zu einem Auswahlmenü).

Gibt es eine Möglichkeit, dies in Notepad ++ zu tun (möglicherweise mit Hilfe von Autohotkey)?

Optional: In Sublime können Sie jedes dieser Ctrl+ Dmit Ctrl+ rückgängig machen Uund ein Vorkommen mit Ctrl+ überspringen K.

ben
quelle

Antworten:

2

Ich habe diesen Thread auf der Notepad ++ Community Seite gefunden:

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

Sie verwenden das Python-Skript-Plugin , um diese Funktionalität mit dem folgenden Skript zu erstellen:

# 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
quelle
Auch wenn dieses Skript ziemlich seltsam ist, ist dies der richtige Weg, wenn jemand eine Mehrfachauswahl benötigt und nicht in den Scintilla-Quellcode eintauchen möchte.
polkovnikov.ph
1

Sie können einfach auf drücken F3, um die Suche fortzusetzen.

Christian Seiler
quelle
Ja, aber Sie müssen vorher die Tastenkombination Strg + F verwenden. Es ist der einzige Nachteil, ich denke, es ist die beste Lösung.
Jack,
-1

Ja, die Funktion "Auswählen und Weitersuchen" ist in Notepad ++ verfügbar.

Die Tastenkombination dafür ist.

Ctrl + F3

Und um das vorherige Vorkommen auszuwählen, ist es.

Ctrl+ Shift+F3

Sie können es unter dem Menü Suchen auschecken.

Ayan
quelle
Vielen Dank für die Antwort, aber ich habe ausdrücklich darum gebeten, dass Sie dann eine Mehrfachauswahl für diese Wörter haben (als ob Sie auf jede weitere Auswahl bei gedrückter Strg-Taste geklickt hätten). Beispiel: Sie haben das Wort float, Sie drücken die Tastenkombination, jetzt wird das zweite Vorkommen von floatzur Mehrfachauswahl hinzugefügt. Sie können dann doubleeingeben, um die beiden Vorkommen zu ersetzen (und den Rest der Datei unverändert zu lassen)
ben
Ich bin mir nicht sicher, ob so etwas in Notepad ++ verfügbar ist. Aber ich werde Sie wissen lassen, ob ich darauf stoße oder einen Weg finde, dies zu tun.
Ayan
Leider wählen Strg + F3 nur dieselben Wörter aus, Sie können jedoch nicht alle gleichzeitig bearbeiten.
Manuel Di Iorio
@ManuelDiIorio Dafür müssen Sie die Ersetzungsfunktion verwenden. Es befindet sich unter Suchen, oder Sie können einfach Strg + H drücken.
Ayan
Nun, ich habe das MultiEditing-Feature in Notepad ++ gefunden und es gefällt mir!
Manuel Di Iorio