답변:
Sublime Text 2는 Python API 가 포함 된 확장 가능한 편집기입니다 . 새 명령 ( 플러그인 )을 작성하고 UI에서 사용 가능하게 할 수 있습니다.
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
이 플러그인을 편집 메뉴에 추가하려면 기본 설정…»패키지 찾아보기를 선택 하고 User
폴더를 엽니 다 . 라는 파일 Main.sublime-menu
이 없으면 작성하십시오. 해당 파일에 다음 텍스트를 추가하거나 설정하십시오.
[
{
"id": "edit",
"children":
[
{"id": "wrap"},
{ "command": "filter" }
]
}
]
filter
명령 바로 아래에 명령 호출 이 삽입됩니다 (실제로 플러그인 호출의 경우 filter
변환되고 메뉴 레이블의 경우 필터 로 변환 됨 ) . 그 이유에 대한 자세한 설명은 여기 11 단계를 참조하십시오 .FilterCommand().run(…)
wrap
키보드 단축키를 지정하려면 Default (OSX).sublime-keymap
OS X 에서 파일 을 열고 편집 하거나 다른 시스템에 해당 하는 파일 을 편집 하고 다음을 입력하십시오.
[
{
"keys": ["ctrl+shift+f"], "command": "filter"
}
]
이 ⌃⇧F명령에 바로 가기가 할당됩니다 .
명령을 명령 팔레트 에 표시하려면 폴더 Default.sublime-commands
에서 이름이 지정된 파일을 작성 하거나 기존 파일을 편집해야 User
합니다. 구문은 방금 편집 한 메뉴 파일과 유사합니다.
[
{ "caption": "Filter Lines in File", "command": "filter" }
]
여러 항목 (중괄호로 묶음)은 쉼표로 구분해야합니다.
이 명령은 구현 된대로 선택 필드에 입력 된 하위 문자열에 대해 선택의 일부인 모든 행 (선택한 부분이 아닌 전체 행) 또는 선택이없는 경우 전체 버퍼를 필터링합니다 ( 명령이 트리거 된 후 기본값은 — 아마도 쓸모없는 여러 줄 — 클립 보드입니다. 예를 들어 정규 표현식을 지원하거나 특정 표현식과 일치 하지 않는 행만 남겨 두도록 쉽게 확장 할 수 있습니다 .
정규식에 대한 지원을 추가하려면 대신 다음 스크립트와 스 니펫을 사용하십시오.
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" }
]
거기에 또한 가난한 사람의 라인 필터링 알고리즘 (또는 게으른입니까?)
이제 라인 필터링을 위한 플러그인 이 있습니다 : https://github.com/davidpeckham/FilterLines
문자열 또는 정규식을 기준으로 필터링 및 코드 폴딩을 허용합니다.
Sublime의 내장 기능을 사용하여 일치하는 정규 표현식을 포함하지 않고 3 ~ 7 개의 키 스트로크로이를 수행 할 수 있습니다.
옵션 1 : 부분 문자열을 포함하는 모든 줄을 다중 선택하려면
옵션 2 : 정규 표현식과 일치하는 모든 줄을 다중 선택하려면
옵션 1 : 선택 되지 않은 모든 줄을 제거하려면
옵션 2 : 모든 라인을 제거하려면 된다 선택
옵션 3 : 선택한 줄을 새 파일로 추출