डिफ़ॉल्ट स्थिति रेखा का प्रारूप क्या है?


14

मैंने यहां vim स्टेटसलाइन को कैसे अपडेट किया जाए, इसके बारे में पढ़ा । और मैं इसे सफलतापूर्वक अपडेट करने में सक्षम हूं।

लेकिन, मैं डिफ़ॉल्ट विम स्टेटस के प्रारूप को बनाए रखना चाहूंगा और बस इसमें कुछ और जानकारी जोड़ सकता हूं जैसे फ़ाइल-आकार, फ़ाइल-प्रकार, आदि।

डिफ़ॉल्ट डिफ़ॉल्ट स्थिति लाइन है:

   <file-name>                              line_num,col_num        %file

मैं निम्नलिखित कैसे कर सकता हूं?

  1. मैं फ़ाइल-नाम के बाद जानकारी जोड़ना चाहूंगा
  2. स्टेटसलाइन का वर्तमान प्रारूप :set statuslineप्रदर्शित करें ( कुछ नहीं दिखाता है)

मैंने कोशिश की:

set statusline+=%y

लेकिन यह संपूर्ण स्थिति को ओवरराइट करता है और केवल फ़ाइल-प्रकार ( %y) प्रदर्शित करता है ।

कोई संकेत?


2
यदि आप Vim में रुचि रखते हैं, तो Vi और Vim चेकआउट करें !
मूरू

जवाबों:


15

जैसे @ मुरु ने कहा, डिफ़ॉल्ट स्थिति रेखा का ठीक-ठीक अनुकरण करना संभव नहीं लगता, जब statuslineइसे प्रस्तुत करने के लिए कोड के रूप में सेट किया जाता है जो उन चीजों को करता है जिन्हें statuslineसेटिंग में निर्दिष्ट नहीं किया जा सकता है । हालांकि, बहुत करीब आना संभव है। rulerसक्षम होने पर डिफ़ॉल्ट स्थिति लाइन दिखने के तरीके का एक उचित अनुमान है:

:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)

मुख्य अंतर लाइन और कॉलम संख्या की स्थिति है। यदि डिफॉल्ट स्पेसिंग लॉजिक का अनुकरण करना संभव है, तो मैं इसे करने का एक तरीका नहीं निकाल पाया। शायद यह आपके उद्देश्यों के लिए पर्याप्त होगा।

मैं .vimrcशासक के साथ एक सामान्य vim स्थिति रेखा की तरह दिखता है के बीच में सिंथेटिक स्टेटस लाइन जानकारी रखने के लिए अपने आप में इसका एक विभाजित संस्करण का उपयोग करता हूं :

" start of default statusline
set statusline=%f\ %h%w%m%r\ 
" NOTE: preceding line has a trailing space character

" Syntastic statusline
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

" end of default statusline (with ruler)
set statusline+=%=%(%l,%c%V\ %=\ %P%)

7

कोड किसी खाली स्थिति स्ट्रिंग के लिए कोई मूल्य निर्धारित नहीं करता है, लेकिन बस कुछ चूक का उपयोग करके कार्य करता है। देखें src/screen.c, कार्य करेंwin_redr_status() । दिखाए गए आइटम संकलित सुविधाओं पर आधारित हैं, इसलिए सटीक स्थिति रेखा के पुनर्निर्माण के लिए किसी को संकलित सुविधाओं को देखना होगा। इसमें दिए गए उदाहरण की स्थिति का उपयोग करना सरल हो सकता है :h statusline:

Examples:
Emulate standard status line with 'ruler' set 
  :set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

चौड़ाई (14) के बाद डॉट प्रतीक ( %-14.(%l,%c%V%)? ) का क्या अर्थ है ?
शामोके

5

tl; डॉ

:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P

हालाँकि मेरे सुझाए गए समाधान अन्य उत्तरों से बहुत भिन्न नहीं हैं, फिर भी मैं एक अधिक विस्तृत विवरण साझा करना चाहूंगा।

मूल व्यवहार

सबसे पहले, आइए जानें vimकि स्थिति रेखा कैसे खींचती है। कार्यों जिम्मेदार हैं win_redr_status()और win_redr_ruler()

vimबफर लेता है नाम , एक कहते हैं अंतरिक्ष अगर कोई झंडे का पालन कर रहे हैं (जैसे [Help], [Preview], [+], [RO])। फिर यह झंडे जोड़ता है

आम तौर पर यह शासक के लिए 18 चरित्र कोशिकाओं को आवंटित करता है। यदि बफ़र नाम वाला भाग उपलब्ध स्थान के लिए उपयुक्त नहीं है, तो इसे बाईं ओर से vim काट दिया जाता है और <शुरुआत में जोड़ा जाता है।

यदि कीमैप के लिए जगह है , तो इसे अंत में जोड़ता है (दाएं संरेखित)।

अब, शासक। यह <row>,<col>-<virtcol> हिस्सा और रिश्तेदार स्थिति (दाएं गठबंधन) के होते हैं।

वहाँ भी एक प्रतिबंध यह है कि बफर नाम के साथ हिस्सा कम से कम रखना चाहिए है आधा की चौड़ाई

उपाय

अब डॉक्स द्वारा सुझाए गए मान को लेते हैं :

:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

कहाँ पे

%< - where to truncate the line if too long
%f - buffer name (path to a file, or something)
%h - help flag
%m - modified flag
%r - readonly flag
%= - separater between the left (buffer name) and the right (ruler) parts
%-14.(...%) - minimum field width == 14
%l - line
%c - column
%V - virtual column
%P - percentage

इसलिए, पहले %<छोड़ा जा सकता है, क्योंकि डिफ़ॉल्ट बफ़र नाम को शुरुआत में छोटा कर दिया जाता है। फिर, यह पूर्वावलोकन ध्वज ( %w) को याद कर रहा है । इसके अलावा, जब विंडो 18 * 2वर्णों से कम चौड़ी होती है, तो दाहिना भाग स्थिति रेखा के आधे से अधिक भाग लेता है।

इसलिए, कम से कम हम इसे %<जोड़ सकते हैं %w:

:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P

हम आगे जा सकते हैं और सुनिश्चित कर सकते हैं कि दाहिना हिस्सा स्थिति रेखा के आधे से अधिक भाग न ले:

set statusline=%!MyStatusLine()
function! MyStatusLine()
    let l:w = min([14,winwidth(0)/2-3])
    return '%f %h%w%m%r%=%-' . l:w . '.(%l,%c%V%) %P'
endfunction

फिर हम इसे उन सुविधाओं पर निर्भर कर सकते हैं जिनके साथ संकलित कियाvim गया था ।

if has("quickfix")
    ...
endif

लेकिन मैं कहूंगा कि यह व्यावहारिक नहीं है, और पिछले समाधान सबसे इरादों और उद्देश्यों के लिए पर्याप्त होगा। हालांकि, यदि अंतिम समाधान आपके लिए काम नहीं करता है, तो मुझे बताएं कि क्या गलत है, और मैं एक बेहतर के साथ आने की कोशिश करूंगा।


लारेंस गोंसाल्वेस द्वारा सुझाए गए समाधान के साथ समस्या यह है कि अगर कोई झंडे नहीं हैं, तो बाएं और दाएं हिस्सों के बीच दो स्थान हैं:

:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.