मैं उदात्त पाठ 2 में स्ट्रिंग वाली लाइनों के लिए फ़ाइल कैसे फ़िल्टर कर सकता हूं?


74

यदि मैं नियमित अभिव्यक्ति सहित संभव हो तो लाइनों के लिए उदात्त पाठ 2 में संपादन कर रही फ़ाइल को फ़िल्टर करना चाहता हूं।

निम्नलिखित फ़ाइल पर विचार करें:

foo bar
baz
qux
quuux baz

जब फ़िल्टर किया जाता है ba, तो परिणाम होना चाहिए:

foo bar
baz
quuux baz

मैं उसे कैसे कर सकता हूँ?

जवाबों:


87

उदात्त पाठ 2 पायथन एपीआई के साथ एक एक्स्टेंसिबल संपादक है । आप नए कमांड बना सकते हैं (जिसे प्लगइन्स कहा जाता है ) और उन्हें यूआई से उपलब्ध करा सकते हैं।

बुनियादी छानने TextCommand प्लगइन जोड़ना

उदात्त पाठ 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

UI के साथ एकीकरण

इस प्लगइन को एडिट मेनू में जोड़ने के लिए , प्राथमिकताएँ चुनें ... »पैकेज ब्राउज़ करें और Userफ़ोल्डर खोलें । यदि कोई फ़ाइल Main.sublime-menuमौजूद नहीं है, तो इसे बनाएं। उस फ़ाइल में निम्न पाठ जोड़ें या सेट करें:

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

यह दर्ज करेंगे filterकमांड कॉल (अनिवार्य रूप से, filterकरने के लिए तब्दील हो जाता है FilterCommand().run(…)प्लगइन कॉल और के लिए फ़िल्टर मेनू लेबल के लिए) बस नीचे दिए गए wrapआदेश। अधिक विस्तृत विवरण के लिए चरण 11 यहां देखें कि वह क्यों है।

कीबोर्ड शॉर्टकट असाइन करने के लिए, Default (OSX).sublime-keymapOS 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" }
]

2
क्या आप इसे एक दिन पैकेज के रूप में प्रकाशित नहीं करना चाहते हैं?
slhck

1
@ सलहॉक किसी ने पहले से ही (उचित आरोपण के साथ), नोवाइसफिजिसिस्ट का जवाब देखें। मैंने जो कुछ कोड में पढ़ा, उससे इस उत्तर के साथ-साथ काफी सुधार हुआ।
डैनियल बेक

अच्छा है, मैं ध्यान नहीं दिया!
slhck

वह विषय क्या है जो आपके पास SublimeText के साथ है जो कि अच्छे रंग देता है? या यह सिर्फ खिड़की का रंग बदल रहा है?
pal4life

1
@ pal4life: इसे सोलराइज्ड (लाइट) कहा जाता है । मुझे लगता है कि उदात्त पाठ भी इसके साथ जहाज। हो सकता है कि मैंने एक विकल्प स्थापित किया हो, लेकिन रंग बिल्कुल मेल नहीं खा सकते हैं। स्क्रीनशॉट ओएस एक्स पर हैं, इसलिए जहां विंडो बॉर्डर और टाइटल बार है।
डैनियल बेक

83

एक गरीब आदमी की लाइन फ़िल्टरिंग एल्गोरिथ्म (या क्या यह आलसी है?):

  1. ब्याज की स्ट्रिंग का चयन करें
  2. सभी घटनाओं पर मल्टी-कर्सर मोड में जाने के लिए Alt+ मारोF3
  3. मारो Control+ L(हर कर्सर लाइन पर) पूरी पंक्ति का चयन करने के
  4. किसी अन्य बफ़र को कॉपी-पेस्ट चयन

2
यह बहुत सरल उपाय है। वाहवाही!
गिलीटेक 22

धन्यवाद! मैं अधिक से अधिक के लिए एक और प्लगइन स्थापित / सीखने के लिए नहीं होना पसंद करता हूं - Alt + F3 मेरी मांसपेशी मेमोरी में है इसलिए उपरोक्त समाधान वास्तव में मेरे लिए बहुत दूर नहीं है।
ओलॉफ बंजरसन

आप चरण 3 और 4 को एक ही चरण से बदल सकते हैं: Ctrl + L।
एंड्रेस रिओप्रियो

1
अच्छा सरल उपाय! मैं चरण 3 को Ctrl-L से होम, शिफ्ट-एंड में बदल दूंगा ताकि घटनाओं के बीच कोई खाली रेखा न रहे।
13

4
इससे मेरी जिंदगी बेहतर के लिए बदल गई। फिर कभी कुछ नहीं होगा।
शॉसन

49

अब फ़िल्टरिंग लाइनों के लिए एक प्लगइन है : https://github.com/davidpeckham/FilterLines
यह स्ट्रिंग और नियमित अभिव्यक्तियों के आधार पर फ़िल्टरिंग और कोड तह की अनुमति देता है।


डेविड पेखम द्वारा उदात्त पाठ फ़िल्टर प्लगइन


4
बस इस प्लगइन को स्थापित किया है - कार्य के लिए सही। एक मौजूदा फ़ाइल लेता है, आपको एक फ़िल्टर वाक्यांश दर्ज करने देता है और परिणामों को एक नए टैब में डालता है।
निक

4
सहमत, अब तक मैंने केवल अपने पाठ संपादक में इस तरह की कार्यक्षमता होने का सपना देखा है।
माइकल12345

1
यह प्लगइन वास्तव में बहुत बढ़िया है!
Devid

यहाँ आया क्योंकि एक सहकर्मी ने emacs के लिए "कीप लाइन्स" के बारे में कुछ उल्लेख किया और यह कितना उपयोगी है। मुझे यह भी नहीं पता था कि मुझे इस प्लगइन की ज़रूरत थी, बिल्कुल प्यार!
ब्रैंडन 927

14

आप 3 से 7 कुंजी स्ट्रोक में ऐसा करने के लिए Sublime की अंतर्निहित क्षमताओं का उपयोग कर सकते हैं (मिलान करने के लिए रेगेक्स शामिल नहीं है)।

चरण 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पेस्ट करने के लिए।

यह आदेशों की एक उत्कृष्ट सूची है!
चस्टार

सुपर, लेकिन क्या पेस्ट के बाद खाली लाइनों को हटाने का कोई तरीका है?
सर्गेई सेनकोव

1
@SergeySenkov ज़रूर! (1) Find दराज खोलने के लिए Ctrl + F दबाएं। (2) सुनिश्चित करें कि नियमित अभिव्यक्ति मिलान सक्षम है (Alt + R टॉगल करने के लिए)। (3) "\ n \ n +" में टाइप करें (दो या दो से अधिक नए सिरे से मेल खाता है)। (4) सभी मैचों को बहु-चयन करने के लिए Alt + Enter को हिट करें। (5) सभी मैचों को एक ही नई पंक्ति के साथ बदलने के लिए एंटर दबाएं।
एंड्रेस रिओप्रियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.