ฉันต้องการกรองไฟล์ที่ฉันกำลังแก้ไขใน Sublime Text 2 สำหรับบรรทัดมีสตริงที่แน่นอนถ้าเป็นไปได้รวมถึงนิพจน์ทั่วไป
พิจารณาไฟล์ต่อไปนี้:
foo bar
baz
qux
quuux baz
เมื่อกรองba
แล้วผลลัพธ์ควรเป็น:
foo bar
baz
quuux baz
ฉันจะทำสิ่งนั้นได้อย่างไร
ฉันต้องการกรองไฟล์ที่ฉันกำลังแก้ไขใน Sublime Text 2 สำหรับบรรทัดมีสตริงที่แน่นอนถ้าเป็นไปได้รวมถึงนิพจน์ทั่วไป
พิจารณาไฟล์ต่อไปนี้:
foo bar
baz
qux
quuux baz
เมื่อกรองba
แล้วผลลัพธ์ควรเป็น:
foo bar
baz
quuux baz
ฉันจะทำสิ่งนั้นได้อย่างไร
คำตอบ:
Sublime Text 2 เป็นบรรณาธิการขยายกับงูหลาม API คุณสามารถสร้างคำสั่งใหม่ (เรียกว่าปลั๊กอิน ) และทำให้พร้อมใช้งานจาก UI
ใน Sublime Text 2 เลือกเครื่องมือ»ปลั๊กอินใหม่และป้อนข้อความต่อไปนี้:
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
จะถูกเปลี่ยนเป็นFilterCommand().run(…)
สำหรับการเรียกใช้ปลั๊กอินและตัวกรองสำหรับป้ายชื่อเมนู) ใต้wrap
คำสั่ง ดูขั้นตอนที่ 11 ที่นี่สำหรับคำอธิบายโดยละเอียดเพิ่มเติมว่าทำไม
หากต้องการกำหนดแป้นพิมพ์ลัดให้เปิดและแก้ไขไฟล์Default (OSX).sublime-keymap
ใน OS X หรือเทียบเท่าสำหรับระบบอื่นแล้วป้อนข้อมูลต่อไปนี้:
[
{
"keys": ["ctrl+shift+f"], "command": "filter"
}
]
สิ่งนี้จะกำหนดทางลัด⌃⇧Fให้กับคำสั่งนี้
ในการทำให้คำสั่งปรากฏในCommands Paletteคุณจะต้องสร้างไฟล์ชื่อ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 ครั้ง (ไม่รวม regex ที่จะจับคู่)
ตัวเลือก 1: การเลือกหลายบรรทัดทั้งหมดที่มีซับสตริง
ตัวเลือกที่ 2: เพื่อเลือกหลายบรรทัดทั้งหมดที่ตรงกับ regexp
ตัวเลือกที่ 1: การกำจัดทุกบรรทัดที่ไม่ได้เลือก
ตัวเลือกที่ 2: เพื่อกำจัดทุกสายที่จะเลือก
ตัวเลือก 3: เพื่อแยกบรรทัดที่เลือกไปยังไฟล์ใหม่