เพิ่มตัวเลือกถัดไปที่ตรงกันใน Notepad ++ (เช่น Ctrl + D ใน Sublime Text)


13

ฉันกำลังค้นหาวิธีที่จะใช้ฟังก์ชันการทำงานต่อไปนี้ในโอเพนซอร์ส Notepad ++

ใน SublimeText หากคุณกดCtrl+ D(mac: cmd+ Dฉันคิดว่า) สิ่งนี้จะเกิดขึ้น:

  • หากไม่มีการเลือกตำแหน่งเคอร์เซอร์จะถูกขยายเพื่อเลือกคำนั้น
  • มิฉะนั้นจะมีการเลือกการปรากฎครั้งถัดไปของคำนั้น (โดยไม่จำเป็นต้องเปิด search-popup)

จากนั้นคุณจะมีคำที่หลากหลายให้เลือกซึ่งคุณสามารถเปลี่ยนได้และคุณได้เห็นสถานที่เหล่านี้จริง ๆ แล้ว (ตรงข้ามกับที่เลือกทั้งหมด)

มีวิธีใดบ้างที่สามารถทำได้ใน Notepad ++ (อาจด้วยความช่วยเหลือของ Autohotkey)?

บังคับ: ใน Sublime คุณยังสามารถยกเลิกแต่ละเหล่านี้Ctrl+ D's กับCtrl+ Uและข้าม occurance กับ+CtrlK

คำตอบ:


2

ฉันพบกระทู้นี้ในหน้าชุมชน Notepad ++:

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

พวกเขากำลังใช้ปลั๊กอินสคริปต์หลามเพื่อสร้างฟังก์ชันนี้ด้วยสคริปต์ต่อไปนี้:

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

แม้ว่าสคริปต์นี้จะค่อนข้างแปลก แต่นี่เป็นวิธีที่จะไปหากมีคนต้องการตัวเลือกหลายตัวและไม่ต้องการดำดิ่งลงในซอร์สโค้ดของ Scintilla
polkovnikov.ph

1

คุณสามารถกดF3เพื่อค้นหาต่อไป


ใช่ แต่คุณต้องใช้ Ctrl + F ก่อนที่จะทำ มันเป็นข้อเสียเดียวที่ฉันคิดว่ามันเป็นวิธีแก้ปัญหาที่ดีที่สุด
แจ็ค '

-1

ใช่คุณสมบัติ "เลือกและค้นหาถัดไป" มีอยู่ใน Notepad ++

ชุดค่าผสมที่สำคัญสำหรับสิ่งนี้คือ

Ctrl + F3

และเพื่อเลือกเหตุการณ์ที่เกิดขึ้นก่อนหน้านี้มันเป็น

Ctrl+ Shift+F3

คุณสามารถตรวจสอบได้จากเมนูค้นหา


ขอบคุณสำหรับคำตอบ แต่ฉันถามคุณโดยเฉพาะว่าคุณมีตัวเลือกมากมายสำหรับคำเหล่านั้น ตัวอย่าง: คุณมีคำว่าfloatคุณกดปุ่มรวมกันในขณะนี้การเพิ่มครั้งที่สองของfloatจะถูกเพิ่มลงในการเลือกหลายรายการ จากนั้นคุณสามารถพิมพ์doubleเพื่อแทนที่การเกิดขึ้นสองครั้ง (และทำให้ส่วนที่เหลือของไฟล์ไม่เปลี่ยนแปลง)
Ben

ฉันไม่แน่ใจว่าสิ่งที่มีอยู่ใน Notepad ++ แต่ฉันจะบอกให้คุณรู้ว่าฉันเจอหรือไม่
Ayan

น่าเสียดาย Ctrl + F3 เลือกคำเดียวกันทั้งหมด แต่คุณไม่สามารถแก้ไขทั้งหมดในเวลาเดียวกัน
Manuel Di Iorio

@ManuelDiIorio เพื่อที่คุณจะต้องใช้ฟังก์ชั่นการแทนที่ ภายใต้การค้นหาหรือคุณสามารถกด Ctrl + H.
Ayan

ฉันพบคุณสมบัติ MultiEditing ใน notepad ++ และฉันชอบมัน!
Manuel Di Iorio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.