Agregar seleccione la siguiente coincidencia en Notepad ++ (como Ctrl + D en Sublime Text)

13

Estoy buscando una manera de usar la siguiente funcionalidad en el código abierto Notepad ++.

En SublimeText si presiona Ctrl+ D(mac: cmd+ Dcreo) esto sucede:

  • Si no hay selección, la posición del cursor se expande para seleccionar esa palabra.
  • De lo contrario, la próxima aparición de esa palabra también se selecciona (sin la necesidad de abrir una ventana emergente de búsqueda).

Luego tiene una selección múltiple de palabras que puede cambiar, y en realidad ha visto cada uno de estos lugares (en lugar de seleccionar todo).

¿Hay alguna forma de que esto se pueda hacer en Notepad ++ (tal vez con la ayuda de Autohotkey)?

Opcional: en Sublime también puede deshacer cada uno de estos Ctrl+ Dcon Ctrl+ Uy omitir una ocurrencia con Ctrl+ K.

ben
fuente

Respuestas:

2

Encontré este hilo en la página de la comunidad Notepad ++:

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

Están utilizando el complemento de secuencia de comandos de Python para crear esta funcionalidad con la siguiente secuencia de comandos:

# 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
fuente
Aunque este script es bastante extraño, este es el camino a seguir si alguien necesita una selección múltiple y no desea sumergirse en el código fuente de Scintilla.
polkovnikov.ph
1

Puede presionar F3para continuar buscando.

Christian Seiler
fuente
Sí, pero debes usar Ctrl + F antes de hacerlo. Es el único inconveniente, creo que es la mejor solución.
Jack '
-1

Sí, la función "Seleccionar y buscar siguiente" está en Notepad ++.

La combinación de teclas para esto es.

Ctrl + F3

Y para seleccionar la ocurrencia anterior es.

Ctrl+ Shift+F3

Puede consultarlo en el menú Buscar .

Ayan
fuente
Gracias por la respuesta, pero le pedí específicamente que luego tuviera una selección múltiple en esas palabras (como si hiciera doble clic en cada selección adicional). Ejemplo: tiene la palabra float, presiona la combinación de teclas ahora floatse agrega la segunda aparición de la selección múltiple. Luego puede escribir doublepara reemplazar las dos ocurrencias (y mantener el resto del archivo sin cambios)
ben
No estoy seguro de si algo así está disponible en Notepad ++. Pero le haré saber si me encuentro con él o si encuentro la manera de hacerlo.
Ayan
Desafortunadamente, Ctrl + F3 solo selecciona las mismas palabras, pero no puede editarlas todas al mismo tiempo.
Manuel Di Iorio
@ManuelDiIorio para eso necesitas usar la funcionalidad de reemplazo. Está debajo de Buscar o simplemente puede presionar Ctrl + H.
Ayan
Bueno, encontré la función MultiEditing en notepad ++ y me gusta.
Manuel Di Iorio