Thêm chọn đối sánh tiếp theo trong Notepad ++ (như Ctrl + D trong Văn bản cao siêu)


13

Tôi đang tìm cách sử dụng chức năng sau trong Notepad ++ nguồn mở.

Trong SublimeText nếu bạn nhấn Ctrl+ D(mac: cmd+ DTôi nghĩ) điều này xảy ra:

  • Nếu không có lựa chọn thì vị trí con trỏ được mở rộng để chọn từ đó.
  • Mặt khác, từ tiếp theo của từ đó cũng được chọn (không cần phải mở cửa sổ bật lên tìm kiếm).

Sau đó, bạn có nhiều lựa chọn từ bạn có thể thay đổi và bạn thực sự đã thấy từng địa điểm này (trái ngược với lựa chọn tất cả).

Có cách nào có thể được thực hiện trong Notepad ++ (có thể với sự trợ giúp của Autohotkey) không?

Tùy chọn: Trong Sublime, bạn cũng có thể hoàn tác từng Ctrl+ + này Dvới Ctrl+ Uvà bỏ qua một lần xuất hiện với Ctrl+ K.

Câu trả lời:


2

Tôi tìm thấy chủ đề này trên trang Cộng đồng Notepad ++:

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

Họ đang sử dụng plugin script python để tạo chức năng này với đoạn script sau:

# 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ặc dù kịch bản này khá kỳ lạ, đây là cách để đi nếu ai đó cần đa lựa chọn và không muốn đi sâu vào mã nguồn Scintilla.
polkovnikov.ph

1

Bạn chỉ có thể nhấn F3để tiếp tục tìm kiếm.


Có, nhưng bạn cần sử dụng Ctrl + F trước khi thực hiện. Đó là nhược điểm duy nhất, tôi nghĩ đó là cách giải quyết tốt nhất.
Jack '

-1

Có, tính năng "Chọn và Tìm tiếp theo" có trong Notepad ++.

Sự kết hợp chính cho điều này là.

Ctrl + F3

Và để chọn sự xuất hiện trước đó.

Ctrl+ Shift+F3

Bạn có thể kiểm tra nó trong menu Tìm kiếm .


Cảm ơn câu trả lời nhưng tôi đặc biệt yêu cầu bạn sau đó có nhiều lựa chọn cho những từ đó (như thể bạn ctrl-doubleclicky trên mỗi lựa chọn bổ sung). Ví dụ: Bạn có từ float, bạn nhấn tổ hợp phím bây giờ lần thứ hai floatđược thêm vào đa lựa chọn. Sau đó, bạn có thể nhập doubleđể thay thế hai lần xuất hiện (và giữ phần còn lại của tệp không thay đổi)
ben

Tôi không chắc liệu một cái gì đó như thế có sẵn trong Notepad ++. Nhưng tôi sẽ cho bạn biết nếu tôi đi qua nó hoặc tìm cách để làm như vậy.
Ayan

Thật không may, Ctrl + F3 chỉ chọn tất cả các từ giống nhau, nhưng bạn không thể chỉnh sửa tất cả các từ đó cùng một lúc.
Manuel Di Iorio

@ManuelDiIorio cho rằng bạn cần sử dụng chức năng thay thế. Trong phần Tìm kiếm hoặc bạn chỉ cần nhấn Ctrl + H.
Ayan

Vâng, tôi đã tìm thấy tính năng MultiEditing trong notepad ++ và tôi thích nó!
Manuel Di Iorio
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.