태그 보관물: sublime-text-2

sublime-text-2

Sublime Text 2에서 문자열을 포함하는 줄에 대해 파일을 어떻게 필터링합니까? 문자열이 포함되어 있습니다. 다음 파일을

Sublime Text 2에서 편집중인 파일을 필터링하고 싶습니다. 가능한 경우 정규 표현식을 포함하여 특정 문자열이 포함되어 있습니다.

다음 파일을 고려하십시오.

foo bar
baz
qux
quuux baz

에 대해 필터링 ba하면 결과는 다음과 같아야합니다.

foo bar
baz
quuux baz

어떻게해야합니까?



답변

Sublime Text 2는 Python API 가 포함 된 확장 가능한 편집기입니다 . 새 명령 ( 플러그인 )을 작성하고 UI에서 사용 가능하게 할 수 있습니다.

기본 필터링 TextCommand 플러그인 추가

Sublime Text 2에서 Tools»New Plugin을 선택 하고 다음 텍스트를 입력하십시오.

import sublime, sublime_plugin

def filter(v, e, needle):
    # get non-empty selections
    regions = [s for s in v.sel() if not s.empty()]

    # if there's no non-empty selection, filter the whole document
    if len(regions) == 0:
        regions = [ sublime.Region(0, v.size()) ]

    for region in reversed(regions):
        lines = v.split_by_newlines(region)

        for line in reversed(lines):
            if not needle in v.substr(line):
                v.erase(e, v.full_line(line))

class FilterCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        def done(needle):
            e = self.view.begin_edit()
            filter(self.view, e, needle)
            self.view.end_edit(e)

        cb = sublime.get_clipboard()
        sublime.active_window().show_input_panel("Filter file for lines containing: ", cb, done, None, None)

다른 이름으로 저장 filter.py에서~/Library/Application Support/Sublime Text 2/Packages/User

UI와 통합

이 플러그인을 편집 메뉴에 추가하려면 기본 설정…»패키지 찾아보기를 선택 하고 User폴더를 엽니 다 . 라는 파일 Main.sublime-menu이 없으면 작성하십시오. 해당 파일에 다음 텍스트를 추가하거나 설정하십시오.

[
    {
        "id": "edit",
        "children":
        [
            {"id": "wrap"},
            { "command": "filter" }
        ]
    }
]

filter명령 바로 아래에 명령 호출 이 삽입됩니다 (실제로 플러그인 호출의 경우 filter변환되고 메뉴 레이블의 경우 필터 로 변환 됨 ) . 그 이유에 대한 자세한 설명은 여기 11 단계를 참조하십시오 .FilterCommand().run(…)wrap

키보드 단축키를 지정하려면 Default (OSX).sublime-keymapOS X 에서 파일 을 열고 편집 하거나 다른 시스템에 해당 하는 파일 을 편집 하고 다음을 입력하십시오.

[
    {
        "keys": ["ctrl+shift+f"], "command": "filter"
    }
]

F명령에 바로 가기가 할당됩니다 .


명령을 명령 팔레트 에 표시하려면 폴더 Default.sublime-commands에서 이름이 지정된 파일을 작성 하거나 기존 파일을 편집해야 User합니다. 구문은 방금 편집 한 메뉴 파일과 유사합니다.

[
    { "caption": "Filter Lines in File", "command": "filter" }
]

여러 항목 (중괄호로 묶음)은 쉼표로 구분해야합니다.

 동작 및 UI 통합 스크린 샷

이 명령은 구현 된대로 선택 필드에 입력 된 하위 문자열에 대해 선택의 일부인 모든 행 (선택한 부분이 아닌 전체 행) 또는 선택이없는 경우 전체 버퍼를 필터링합니다 ( 명령이 트리거 된 후 기본값은 — 아마도 쓸모없는 여러 줄 — 클립 보드입니다. 예를 들어 정규 표현식을 지원하거나 특정 표현식과 일치 하지 않는 행만 남겨 두도록 쉽게 확장 할 수 있습니다 .

메뉴 아이템

메뉴의 명령

명령 팔레트 항목

명령 팔레트에 다른 레이블이있는 명령

편집자

파일을 필터링 할 텍스트를 입력하는 사용자

명령 실행 후 결과

정규식에 대한 지원 추가

정규식에 대한 지원을 추가하려면 대신 다음 스크립트와 스 니펫을 사용하십시오.

filter.py:

import sublime, sublime_plugin, re

def matches(needle, haystack, is_re):
    if is_re:
        return re.match(needle, haystack)
    else:
        return (needle in haystack)

def filter(v, e, needle, is_re = False):
    # get non-empty selections
    regions = [s for s in v.sel() if not s.empty()]

    # if there's no non-empty selection, filter the whole document
    if len(regions) == 0:
        regions = [ sublime.Region(0, v.size()) ]

    for region in reversed(regions):
        lines = v.split_by_newlines(region)

        for line in reversed(lines):

            if not matches(needle, v.substr(line), is_re):
                v.erase(e, v.full_line(line))

class FilterCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        def done(needle):
            e = self.view.begin_edit()
            filter(self.view, e, needle)
            self.view.end_edit(e)

        cb = sublime.get_clipboard()
        sublime.active_window().show_input_panel("Filter file for lines containing: ", cb, done, None, None)

class FilterUsingRegularExpressionCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        def done(needle):
            e = self.view.begin_edit()
            filter(self.view, e, needle, True)
            self.view.end_edit(e)

        cb = sublime.get_clipboard()
        sublime.active_window().show_input_panel("Filter file for lines matching: ", cb, done, None, None)

Main.sublime-menu:

[
    {
        "id": "edit",
        "children":
        [
            {"id": "wrap"},
            { "command": "filter" },
            { "command": "filter_using_regular_expression" }
        ]
    }
]

Default (OSX).sublime-keymap:

[
    {
        "keys": ["ctrl+shift+f"], "command": "filter"
    },
    {
        "keys": ["ctrl+shift+option+f"], "command": "filter_using_regular_expression"
    }
]

두 번째 플러그인 명령 인 정규 표현식사용한 필터가 필터 메뉴 항목 아래에 추가됩니다 .

Default.sublime-commands:

[
    { "caption": "Filter Lines in File", "command": "filter" },
    { "caption": "Filter Lines in File Using Regular Expression", "command": "filter_using_regular_expression" }
]


답변

거기에 또한 가난한 사람의 라인 필터링 알고리즘 (또는 게으른입니까?)

  1. 관심있는 문자열을 선택하십시오
  2. 모든 경우에 다중 커서 모드로 이동하려면 Alt+ F3를 누르십시오.
  3. 히트 Control+ L(모든 커서 라인에) 전체 라인을 선택
  4. 다른 버퍼에 복사하여 붙여 넣기

답변

이제 라인 필터링을 위한 플러그인 이 있습니다 : https://github.com/davidpeckham/FilterLines

문자열 또는 정규식을 기준으로 필터링 및 코드 폴딩을 허용합니다.

David Peckham의 Sublime Text Filter 플러그인


답변

Sublime의 내장 기능을 사용하여 일치하는 정규 표현식을 포함하지 않고 3 ~ 7 개의 키 스트로크로이를 수행 할 수 있습니다.

1 단계 : 일치하는 모든 줄을 다중 선택

옵션 1 : 부분 문자열을 포함하는 모든 줄을 다중 선택하려면

  1. 관심있는 문자열을 선택하십시오.
  2. 모든 발생을 다중 선택하려면 Alt+ F3를 누르십시오 .
  3. Ctrl+ L(선택 영역을 행으로 확장)를 누르십시오 .

옵션 2 : 정규 표현식과 일치하는 모든 줄을 다중 선택하려면

  1. 히트 Ctrl+ F찾기 서랍을 엽니 다.
  2. 정규식 일치가 활성화되어 있는지 확인하십시오 ( Alt+ R로 전환).
  3. 정규식을 입력하십시오.
  4. 모든 경기를 다중 선택하려면 Alt+ Enter를 누르십시오 .
  5. Ctrl+ L(선택 영역을 행으로 확장)를 누르십시오 .

2 단계 : 그 라인으로 무언가를하세요

옵션 1 : 선택 되지 않은 모든 줄을 제거하려면

  1. 히트 Ctrl+ C복사합니다.
  2. 히트 Ctrl+ A모두를 선택합니다.
  3. 선택을 일치하는 줄로 바꾸려면 Ctrl+ V를 누르십시오 .

옵션 2 : 모든 라인을 제거하려면 된다 선택

  1. Ctrl+ Shift+ K(줄 삭제)를 누르 십시오.

옵션 3 : 선택한 줄을 새 파일로 추출

  1. 히트 Ctrl+ C복사합니다.
  2. 히트 Ctrl+ N새 파일을 엽니 다.
  3. 붙여 넣으려면 Ctrl+ V를 누르세요 .

답변