VIM: استدعاء أمر ex (تعيين) من الدالة؟
سؤال
رسم فارغًا على هذا ، ولم يكن 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