سؤال

رسم فارغًا على هذا ، ولم يكن Google مفيدًا.

تريد أن تجعل وظيفة مثل هذه:

function JakPaste()
        let tmp = :set paste?
        if tmp == "paste"
                set nopaste
        else
                set paste
        endif
endfunction

map <F2> :call JakPaste()<CR>

ومع ذلك، هذا لا يعمل. لقد عزلت الخط المكسور:

function JakPaste()
        let tmp = set paste?
endfunction

map <F2> :call JakPaste()<CR>

الضغط على نتائج F2 في هذا الخطأ:

Error detected while processing function JakPaste:
line    1:
E121: Undefined variable: set
E15: Invalid expression:  set paste?
Hit ENTER or type command to continue

كيف يمكنني الاتصال بأمر سابق (تعيين) من وظيفة VIM؟

هذه يبدو ذا صلة إلى حد ما ولكن ما زلت لا أحصل عليه.

هل كانت مفيدة؟

المحلول

السبب في أن هذا لا ينجح هو أنك تحاول تشغيل أمر في تعبير - هذه أشياء مختلفة. ال ? البناء الذي استخدمته فقط يسبب VIM صدى قيمة الخيار ؛ هذا ليس هو نفسه وظيفة إرجاع القيمة. لتوضيح: المشكلة ليست أنك تتصل بأمر سابق من وظيفة - كل سطر آخر من الوظيفة هو أمر سابق - إنه يمكنك الاتصال بالأمر السابق في تعبير.

ولكن هذه ليست الطريقة الصحيحة لتنفيذ المهمة التي تحاول هنا. إليكم أقصر طريقة ، بفضل تعليق رامون:

set paste!

الآن ، إذا كنت بحاجة إلى شيء أكثر ذكاءً من مجرد عكس منطقية ، فيمكنك استخدامها & لتحويل اسم الخيار إلى متغير قابل للاستخدام. فيما يلي طريقتان لاستخدام ذلك:

" still a function, good for taking extra action (here, printing notification)"
function TogglePaste()
    if (&paste)
        set nopaste
        echo "paste off"
    else
        set paste
        echo "paste on"
    endif
endfunction

" just set the variable directly"
let &paste = !&paste
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top