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


74

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

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

foo bar
baz
qux
quuux baz

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

foo bar
baz
quuux baz

어떻게해야합니까?

답변:


87

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" }
]

2
언젠가 이것을 패키지로 게시하고 싶지 않습니까?
slhck

1
@slhck 누군가 (적절한 속성으로) 이미 했으므로 NovicePhysicist의 답변을 참조하십시오. 코드에서 읽은 내용 에서이 답변에 비해 상당히 개선되었습니다.
다니엘 벡

쿨, 나는 그것을 몰랐다!
slhck

SublimeText에서 멋진 색상을 제공하는 테마는 무엇입니까? 아니면 그냥 창 색을 바꾸고 있습니까?
pal4life

1
@ pal4life : Solarized (Light) 라고 합니다. Sublime Text도 함께 제공됩니다. 그래도 대안을 설치했을 수 있으므로 색상이 정확하게 일치하지 않을 수 있습니다. 스크린 샷은 OS X에 있으므로 창 경계와 제목 표시 줄이 나타납니다.
Daniel Beck

83

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

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

2
이것은 가장 간단한 해결책입니다. 브라보!
gillytech

감사합니다! 가능한 한 많이 다른 플러그인을 설치 / 학습하지 않아도됩니다. Alt + F3은 근육 메모리에 있으므로 위의 솔루션은 실제로 그렇게 멀지 않습니다.
Olof Bjarnason

3 단계와 4 단계를 단일 단계 (Ctrl + L)로 바꿀 수 있습니다.
Andres Riofrio

1
좋은 간단한 해결책! 3 단계를 Ctrl-L에서 Home, Shift-End로 대체하므로 발생 사이에 빈 줄이 없습니다.
jslap

4
이것은 나의 삶을 더 좋게 변화시켰다. 다시는 같은 것이 없습니다.
Shawson

49

이제 라인 필터링을 위한 플러그인 이 있습니다 : https://github.com/davidpeckham/FilterLines
문자열 또는 정규식을 기준으로 필터링 및 코드 폴딩을 허용합니다.


David Peckham의 Sublime Text Filter 플러그인


4
이 플러그인을 설치했습니다-작업에 적합합니다. 기존 파일을 가져 와서 필터 구문을 입력하고 결과를 새 탭에 넣습니다.
Nick

4
동의, 지금까지 나는 텍스트 편집기에서 이런 종류의 기능을 갖는 꿈을 꾸었다.
Michael12345

1
이 플러그인은 정말 대단합니다!
DEVID

동료가 emacs에 대한 "Keep Lines"에 대해 언급하고 그것이 얼마나 유용한 지 언급했기 때문에 여기에 왔습니다. 이 플러그인이 필요한지조차 몰랐습니다.
brandon927

14

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를 누르세요 .

이것은 훌륭한 명령 목록입니다!
chustar

슈퍼이지만 붙여 넣은 후 빈 줄을 제거하는 방법이 있습니까?
Sergey Senkov

1
트윗 담아 가기 (1) Ctrl + F를 눌러 찾기 서랍을 엽니 다. (2) 정규식 일치가 활성화되어 있는지 확인하십시오 (Alt + R로 전환). (3) "\ n \ n +"를 입력하십시오 (두 개 이상의 연속적인 줄 바꿈과 일치). (4) Alt + Enter를 눌러 모든 경기를 다중 선택하십시오. (5) 모든 경기를 하나의 줄 바꿈으로 바꾸려면 Enter 키를 누르십시오.
Andres Riofrio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.