সাব্লাইম টেক্সট 2 এ স্ট্রিং যুক্ত রেখার জন্য আমি কীভাবে একটি ফাইল ফিল্টার করতে পারি?


74

আমি সাব্লাইম টেক্সট 2 এ সম্পাদনা করছি এমন একটি ফাইল ফিল্টার করতে চাই যেখানে লাইনগুলির জন্য একটি নির্দিষ্ট স্ট্রিং থাকে, যদি সম্ভব হয় নিয়মিত এক্সপ্রেশন সহ।

নিম্নলিখিত ফাইলটি বিবেচনা করুন:

foo bar
baz
qux
quuux baz

যখন ফিল্টার করা হয় ba, ফলাফলটি হওয়া উচিত:

foo bar
baz
quuux baz

আমি এটা কিভাবে করবো?

উত্তর:


87

সাব্লাইম টেক্সট 2 পাইথন এপিআই সহ একটি এক্সটেনসিবল সম্পাদক । আপনি নতুন কমান্ড তৈরি করতে পারেন (যাকে প্লাগইন বলা হয় ) এবং এটি ইউআই থেকে উপলব্ধ করতে পারেন।

বেসিক ফিল্টারিং পাঠ্যকম্যান্ড প্লাগইন যুক্ত করা হচ্ছে

সাব্লাইম টেক্সট 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 রূপান্তরিত হয় ) কমান্ডের ঠিক নীচে । এটি কেন রয়েছে তার আরও বিশদ বিবরণের জন্য এখানে 11 তম পদক্ষেপ দেখুন ।FilterCommand().run(…)wrap

একটি কীবোর্ড শর্টকাট বরাদ্দ করতে, Default (OSX).sublime-keymapওএস এক্স, বা অন্যান্য সিস্টেমের সমতুল্য ফাইলটি খুলুন এবং সম্পাদনা করুন এবং নিম্নলিখিতটি প্রবেশ করুন:

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

এটি Fএই কমান্ডের শর্টকাট বরাদ্দ করবে ।


কমান্ডস প্যালেটে কমান্ডটি প্রদর্শন করতে , আপনাকে ফোল্ডারে একটি ফাইল Default.sublime-commands(বা বিদ্যমান একটি সম্পাদনা করুন) তৈরি করতে হবে User। সিনট্যাক্সটি আপনি সদ্য সম্পাদিত মেনু ফাইলের মতো is

[
    { "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
আপনি কি একদিন প্যাকেজ হিসাবে প্রকাশ করতে চান না?

1
@ এসএলএইচএইচকে ইতিমধ্যে কেউ করেছেন (যথাযথ অ্যাট্রিবিউশন সহ), নোভিসফিসিসির উত্তর দেখুন। আমি কোডটিতে যা পড়েছি তা থেকে উত্তরের সাথে এই উত্তরটিও বেশ খানিকটা উন্নত হয়েছিল।
ড্যানিয়েল বেক

কুল, আমি খেয়াল করিনি!
slhck

সাব্লাইমেক্সট সহ আপনার কী থিমটি রয়েছে যা সেই সুন্দর রঙ দেয়? বা এটি কি কেবল উইন্ডো রঙ পরিবর্তন করছে?
পল লাইফ

1
@ পাল 4 লাইফ: একে সোলারাইজড (হালকা) বলা হয় । আমি মনে করি সাব্লাইম টেক্সট এটি দিয়েও জাহাজে। আমি যদিও কোনও বিকল্প ইনস্টল করেছি, তাই রঙগুলি ঠিক মেলে না। স্ক্রিনশটগুলি ওএস এক্সে রয়েছে, সুতরাং উইন্ডো সীমানা এবং শিরোনাম দণ্ডটি কোথা থেকে এসেছে।
ড্যানিয়েল অঙ্গুলিনির্দেশ

83

একটি দরিদ্র লোকের লাইন ফিল্টারিং অ্যালগরিদমও রয়েছে (বা এটি অলস?):

  1. আগ্রহের স্ট্রিং নির্বাচন করুন
  2. হিট Alt+ + F3সব ঘটনার উপর বহু-কার্সার মোড ঢোকা
  3. পুরো লাইনটি নির্বাচন করতে Control+ চাপুন L(প্রতিটি কার্সার লাইনে)
  4. অন্য বাফারে নির্বাচন অনুলিপি করুন Copy

2
এটি বেশ সহজ সমাধান। বলিহারি!
গিলিটেক

ধন্যবাদ! আমি যতটা সম্ভব অন্য একটি প্লাগইন ইনস্টল / শিখতে না পছন্দ করি - Alt + F3 আমার পেশী মেমরিতে থাকে তাই উপরের সমাধানটি আসলে আমার পক্ষে এতটা কার্যকর নয়।
অলিফ বর্জনসন

আপনি একক পদক্ষেপের সাথে 3 এবং 4 পদক্ষেপ প্রতিস্থাপন করতে পারেন: Ctrl + L।
আন্দ্রেস রিওফ্রিও

1
খুব সহজ সমাধান! আমি সিটিআরএল-এল থেকে হোম, শিফট-এন্ডে পদক্ষেপ 3 প্রতিস্থাপন করব তাই উপস্থিতিগুলির মধ্যে কোনও খালি লাইন নেই।
jslap

4
এটি আমার জীবনকে আরও উন্নত করে দিয়েছে। আর কিছুই আর আগের মতো হবে না।
শাওসন

49

ফিল্টারিং লাইনগুলির জন্য এখন একটি প্লাগইন রয়েছে: https://github.com/davidpeckham/FilterLines
এটি স্ট্রিং বা নিয়মিত অভিব্যক্তির উপর ভিত্তি করে ফিল্টারিং এবং কোড ভাঁজকে অনুমতি দেয়।


ডেভিড পেচাম কর্তৃক সাব্লাইম টেক্সট ফিল্টার প্লাগইন


4
সবেমাত্র এই প্লাগইনটি ইনস্টল করেছেন - কাজের জন্য পারফেক্ট। একটি বিদ্যমান ফাইল নেয়, আপনাকে একটি ফিল্টার বাক্য লিখতে দেয় এবং ফলাফলগুলি একটি নতুন ট্যাবে রাখে।
নিক

4
সম্মত, এখনও অবধি আমি আমার পাঠ্য সম্পাদকটিতে এই ধরণের কার্যকারিতাটি কেবলমাত্র দেখেছি।
মাইকেল 12345

1
এই প্লাগইন সত্যিই দুর্দান্ত!
ডেভিড

এখানে এসেছিলেন কারণ সহকর্মী ইমাসের জন্য "লাইনে রাখুন" এবং এটি কতটা কার্যকর তা সম্পর্কে কিছু উল্লেখ করেছিলেন। এমনকি আমি জানতাম না যে আমার এই প্লাগইনটি দরকার, একেবারে পছন্দ!
ব্র্যান্ডন 927

14

আপনি সাব্লাইমের অন্তর্নির্মিত ক্ষমতাগুলি এটি করতে 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

সুপার, তবে পেস্টের পরে ফাঁকা লাইনগুলি সরানোর কোনও উপায় আছে?
সের্গেই সেনকভ

1
নিবন্ধন করুন (1) অনুসন্ধান ড্রয়ারটি খুলতে Ctrl + F চাপুন Hit (২) নিয়মিত এক্সপ্রেশন ম্যাচ সক্ষম হয়েছে তা নিশ্চিত করুন (টগল করতে Alt + আর)। (3) "\ n \ n +" টাইপ করুন (দুই বা ততোধিক নতুন লাইন মেলে)। (4) সমস্ত মিলগুলিকে মাল্টি-সিলেক্ট করতে Alt + এন্টার চাপুন। (5) একক নিউলাইন দিয়ে সমস্ত ম্যাচ প্রতিস্থাপন করতে এন্টার টিপুন।
আন্দ্রেস রিওফ্রিও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.