Ajouter sélectionner la correspondance suivante dans Notepad ++ (comme Ctrl + D dans Sublime Text)


13

Je cherche un moyen d'utiliser les fonctionnalités suivantes dans le bloc-notes open source ++.

Dans SublimeText, si vous appuyez sur Ctrl+ D(mac: cmd+ Dje pense), cela se produit:

  • S'il n'y a pas de sélection, la position du curseur est développée pour sélectionner ce mot.
  • Sinon, la prochaine occurrence de ce mot est également sélectionnée (sans avoir besoin d'ouvrir une fenêtre de recherche).

Vous avez alors une multi-sélection de mots que vous pouvez changer, et vous avez en fait vu chacun de ces endroits (par opposition à un tout sélectionner).

Existe-t-il un moyen de le faire dans Notepad ++ (peut-être avec l'aide d'Autohotkey)?

Facultatif: dans Sublime, vous pouvez également annuler chacun de ces Ctrl+ Davec Ctrl+ Uet ignorer une occurrence avec Ctrl+ K.

Réponses:


2

J'ai trouvé ce fil sur la page de la communauté Notepad ++:

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

Ils utilisent le plugin de script python pour créer cette fonctionnalité avec le script suivant:

# 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()

Même si ce script est assez étrange, c'est la voie à suivre si quelqu'un a besoin d'une multisélection et ne veut pas plonger dans le code source de Scintilla.
polkovnikov.ph

1

Vous pouvez simplement appuyer sur F3pour continuer la recherche.


Oui, mais vous devez utiliser Ctrl + F avant de le faire. C'est le seul inconvénient, je pense que c'est la meilleure solution.
Jack '13

-1

Oui, la fonctionnalité «Sélectionner et rechercher ensuite» est présente dans Notepad ++.

La combinaison de touches pour cela est.

Ctrl + F3

Et pour sélectionner l'occurrence précédente, c'est.

Ctrl+ Shift+F3

Vous pouvez le vérifier dans le menu Rechercher .


Merci pour la réponse mais j'ai spécifiquement demandé que vous ayez ensuite une multi-sélection sur ces mots (comme si vous ctrl-double-cliquiez sur chaque sélection supplémentaire). Exemple: vous avez le mot float, vous appuyez sur la combinaison de touches maintenant la deuxième occurrence de floatest ajoutée à la sélection multiple. Vous pouvez ensuite taper doublepour remplacer les deux occurrences (et garder le reste du fichier inchangé)
ben

Je ne sais pas si quelque chose comme ça est disponible dans Notepad ++. Mais je vous ferai savoir si je le rencontre ou si je trouve un moyen de le faire.
Ayan

Malheureusement, Ctrl + F3 ne sélectionne que tous les mêmes mots, mais vous ne pouvez pas tous les modifier en même temps.
Manuel Di Iorio

@ManuelDiIorio pour cela, vous devez utiliser la fonctionnalité de remplacement. Son sous recherche ou vous pouvez simplement appuyer sur Ctrl + H.
Ayan

Eh bien, j'ai trouvé la fonctionnalité MultiEditing dans notepad ++ et j'aime ça!
Manuel Di Iorio
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.