2025, Oct 22 14:46

Neovim में Python के लिए Treesitter expression folding स्टार्टअप पर ऑटो लागू करने का समाधान

जानें क्यों Neovim में Python के लिए Treesitter folding स्टार्टअप पर नहीं चलता, और BufReadPost व vim.schedule से zx ट्रिगर कर ऑटो-फोल्डिंग सक्षम करें.

Python बफ़र तो खुलते हैं, लेकिन फोल्ड तभी लागू होते हैं जब आप हाथ से zx दबाते हैं. यही सेटअप इंडेंट-आधारित फोल्डिंग या Lua जैसे दूसरे फ़ाइल प्रकारों में सामान्य रूप से काम करता है. यदि आप Neovim में Treesitter-समर्थित expression folding का उपयोग कर रहे हैं और यह व्यवहार केवल Python फ़ाइलों में दिख रहा है, तो आगे कारण और समाधान दिया है.

समस्या दिखाने वाला न्यूनतम सेटअप

नीचे दिया गया कॉन्फ़िगरेशन Treesitter के ज़रिए expression folding सक्षम करता है. इसे लगाने पर Python फ़ाइलें पूरी तरह अनफोल्ड होकर लोड होती हैं, जब तक कि आप फोल्डिंग को खुद से ट्रिगर न करें.

local o = vim.opt
o.foldcolumn = "1"
o.foldlevel = 1
o.foldtext = ""
o.foldmethod = "expr"
o.foldexpr = "nvim_treesitter#foldexpr()"

यह हो क्या रहा है

फोल्डिंग एक्सप्रेशन nvim_treesitter#foldexpr() Treesitter के सिंटैक्स ट्री पर निर्भर करता है. जब कोई Python बफ़र पहली बार खुलता है, तो संभव है कि Treesitter पार्सर और उसका ट्री अभी तैयार न हो. चूँकि फोल्डिंग एक्सप्रेशन ट्री बनने से पहले चल जाता है, इसलिए फोल्ड करने के लिए कुछ होता ही नहीं और बफ़र अनफोल्डेड दिखता है. बाद में zx दबाने पर यह काम कर जाता है, क्योंकि तब तक ट्री बन चुका होता है.

यह व्यवहार Treesitter के आरंभ होने के समय-क्रम से जुड़ा है. पार्सर इंस्टॉल और ठीक-ठाक है, कोई Python-विशिष्ट ऑटोकमांड बाधा नहीं डाल रहा, और अतिरिक्त Python प्लगइन्स भी शामिल नहीं हैं. Python और, मान लीजिए, Lua या इंडेंट-आधारित फोल्डिंग के बीच दिखता अंतर असल में इस बात से आता है कि सिंटैक्स ट्री कब उपलब्ध होता है.

समाधान: Treesitter के आरंभ होने के बाद फोल्ड लागू करें

फोल्ड लागू करना तब तक टालें, जब तक Neovim का इवेंट लूप निष्क्रिय न हो जाए—यानी बफ़र पढ़ लिया गया हो और प्लगइन्स आरंभ हो चुके हों. फोल्ड रिफ्रेश को शेड्यूल करने से यह सुनिश्चित होता है कि फोल्ड एक्सप्रेशन चलने के समय सिंटैक्स ट्री मौजूद हो.

-- समूह एक एकल, बदले जा सकने वाले नियमों का सेट सुनिश्चित करता है
local grp = vim.api.nvim_create_augroup("ts_fold_apply_py", { clear = true })
vim.api.nvim_create_autocmd("BufReadPost", {
  pattern = "*.py",
  desc = "Reapply folds for Python after Treesitter is ready (scheduled)",
  callback = function()
    vim.schedule(function()
      vim.cmd("normal! zx")
    end)
  end,
  group = grp,
})

यह क्यों मायने रखता है

विश्वसनीय प्रारंभिक फोल्डिंग से फ़ाइल खुलते ही दृश्य आपकी सेटिंग्स के अनुरूप रहता है. आपको अतिरिक्त कीस्ट्रोक से बचत होती है और expression-आधारित फोल्डिंग तुरंत Treesitter संरचना को दर्शाती है—खासकर बड़ी Python फ़ाइलों में, जहाँ आप शुरुआत से ही अर्थपूर्ण फोल्ड की अपेक्षा करते हैं.

मुख्य बातें

यदि Python बफ़र्स में Treesitter expression folding अपने आप लागू नहीं हो रही, तो पार्सर के पूरा होने तक fold refresh को टाल दें. इवेंट लूप के idle होते ही zx चलाने के लिए BufReadPost और vim.schedule का उपयोग करें. इस सेटअप के बाद, जैसे ही सिंटैक्स ट्री मौजूद होगा, आपके कॉन्फ़िगर किए गए फोल्ड लागू हो जाएंगे.

यह लेख StackOverflow के प्रश्न (Kyle F. Hartzenberg द्वारा) और Kyle F. Hartzenberg के उत्तर पर आधारित है।