თხუთმეტი წლის წინ Lisp კოდის Vim-ში წერა უცნაური თავგადასავალი იყო. არ არსებობდა კარგი დანამატები Vim-ისთვის, რომლებიც დაეხმარებოდნენ Lisp s-გამოსახულებების სტრუქტურულ რედაქტირებას ან ინტერაქტიული პროგრამირების საშუალებას მისცემდნენ Lisp Read-Eval-Print-Loop (REPL) ან გამართვის საშუალების რედაქტორში ჩაშენებით. მას შემდეგ სიტუაცია გაცილებით გაუმჯობესდა. ბოლო ათი წლის განმავლობაში, ჩვენ ვნახეთ ორი Vim დანამატის, Slimv-ისა და Vlime-ის აქტიური განვითარება. Slimv ახლა 10 წელზე მეტი ხნისაა. Vlime უფრო ახალია და ამჟამად 3 წელზე ნაკლები ხნისაა. ორივე მხარს უჭერს ინტერაქტიულ პროგრამირებას Lisp-ში.

ამ სტატიაში განვიხილავ და შევადარებ როგორც Slimv-ს, ასევე Vlime-ს. გაჩვენებთ, როგორ დავიწყოთ მუშაობა ორივე დანამატთან და წარმოგიდგენთ მათ ძირითად ფუნქციებს. თუმცა, ყველაფერს არ დავფარავ. ეს არ არის გაკვეთილი. გაკვეთილებისთვის იხილეთ ლიტერატურის განყოფილება.

თუ მხოლოდ ორი დანამატის შედარებას ან სწრაფ რეკომენდაციას ეძებთ, გადადით პირდაპირ Slimv-ისა და Vlime-ის შედარების ან სწრაფი რეკომენდაციის განყოფილებაზე.

სანამ Slimv-სა და Vlime-ზე მუშაობას დავიწყებთ, კარგი იქნება, მოკლედ გადავხედოთ ამ დანამატების ისტორიას. ეს დანამატები უზრუნველყოფენ Lisp-ის განვითარების გარემოს Vim-ისთვის, ამიტომ მათი ისტორია Lisp-ით იწყება.

Lisp არის პროგრამირების ენების ოჯახი გამორჩეული, სრულად ფრჩხილებში მოქცეული პრეფიქსური ნოტაციით. ის საკმაოდ განსხვავდება დღევანდელი სხვა პოპულარული პროგრამირების ენებისგან, როგორიცაა C, Python, Ruby და ა.შ. მისი ჰომოიკონური ბუნება და მისი ძლიერი მაკრო სისტემა, რომელსაც შეუძლია Lisp-ის თვითნებური გამოსახულებების გარდაქმნა, მას ისეთ მოქნილ, მრავალმხრივ, გაფართოებად და ინტროსპექტიულ ენად აქცევს, რომ Lisp-ის აღმწერ სტატიებში ხშირად გვხვდება სიტყვა „განმანათლებლობა“. მაგალითად, იხილეთ შემდეგი სტატიები:

Lisp სხვადასხვაგვარად იყო აღწერილი გამოთვლითი ტექნიკის ისტორიაში სხვადასხვა გამოჩენილი პიროვნების მიერ. ალან კეიმ Lisp ცნობილია, რომ აღწერა, როგორც:

ჯონ ფოდერარომ Lisp-ის შესახებ დაწერა:

ერიკ ს. რეიმონდმა Lisp-ის სწავლით მიღებული განმანათლებლობა გამოხატა თავის ცნობილ სტატიაში, სახელწოდებით How To Become A Hacker:

რენდალ მუნრომ, XKCD ვებკომიქსის შემქმნელმა, Lisp-ს ორი კომიქსის ზოლი მიუძღვნა:

1958 წელს ჯონ მაკკარტის მიერ შემუშავებული Lisp დღეს გამოყენებული პროგრამირების ენებიდან მეორე უძველესია. მხოლოდ Fortran არის მასზე ძველი, ერთი წლით. დღესდღეობით პოპულარული Lisp დიალექტები მოიცავს Common Lisp-ს, Scheme-სა და Clojure-ს. ამ სტატიის უმეტესი ნაწილი Common Lisp-ზე იქნება ორიენტირებული. Scheme და Clojure მოკლედ იქნება განხილული სტატიის ბოლოს.

ბევრი Lisp პროგრამისტი Lisp კოდის წერაზე ფიქრისას მაშინვე Emacs-ს იხსენებს. Emacs არის ტექსტური რედაქტორების ოჯახი. Emacs რედაქტორი თავად, როგორც წესი, Lisp-ის დიალექტშია დანერგილი. არსებობს Emacs-ის რეჟიმი სახელწოდებით SLIME, რომელიც უზრუნველყოფს Lisp-ში პროგრამირების შესანიშნავ მხარდაჭერას. SLIME ნიშნავს Superior Lisp Interaction Mode for Emacs-ს. პირველად გამოვიდა 2003 წლის აგვისტოში, SLIME შეიქმნა ერიკ მარსდენის მიერ და შემდეგ შემდგომში განვითარდა ლუკ გორის და ჰელმუტ ელერის მიერ. ის გთავაზობთ Read-Eval-Print-Loop (REPL)-ს, ინტეგრირებულ გამართვას და გამოსახულებების ინტერაქტიულ შეფასებას, რაც ყველაფერი ხელმისაწვდომია რედაქტორში. არსებობს რამდენიმე მოხერხებული კლავიატურის მალსახმობი მიმდინარე ბუფერში კოდის ნაწილების ან მთლიანი კოდის კომპილირებისა და შეფასებისთვის.

SLIME მუშაობს Swank TCP სერვერის გაშვებით. Swank არის უკანა სერვერული პროგრამა, დაწერილი Common Lisp-ში, რომელიც უსმენს სოკეტს, რათა მიიღოს SLIME ბრძანებები Emacs-დან და შეასრულოს ისინი. SLIME იმდენად სასარგებლოა, რომ ბევრი Lisp პროგრამისტისთვის, რომლებიც Lisp კოდს Emacs-ში წერენ, ის შეუცვლელად ითვლება.

არსებობს თუ არა რაიმე SLIME-ის მსგავსი Vim-ისთვის? დიახ, არსებობს ორი პოპულარული ვარიანტი:

  • Slimv: ნიშნავს Superior Lisp Interaction Mode for Vim-ს. ეს არის Vim-ის დანამატი, შექმნილი ტამას კოვაჩის მიერ, რომელიც პირველად გამოვიდა 2009 წლის იანვარში.
  • Vlime: ეს არის Vim-ის დანამატი, შექმნილი კეი ზ-ის მიერ, რომელიც პირველად გამოვიდა 2017 წლის მაისში. ის ბევრად უფრო ახალია ვიდრე Slimv. Vlime Slimv-ზე რვა წლით უმცროსია.

ორივე დანამატი იყენებს კლიენტ-სერვერულ არქიტექტურას, ისევე როგორც SLIME Emacs-ში. ორივე დანამატი ეყრდნობა Swank სერვერის გაშვებას. სინამდვილეში, Slimv-ს მოყვება Swank-ის ოდნავ შეცვლილი ვერსია, რათა მან შეძლოს მისი გაშვება და მასთან დაკავშირება გამოსახულებების შესაფასებლად. Vlime არ აერთიანებს Swank სერვერს თავის თავში, მაგრამ ის უზრუნველყოფს გარსს, რომელიც ავტომატურად ჩამოტვირთავს Swank სერვერს საჭიროების შემთხვევაში.

როდესაც თხუთმეტი წლის წინ Vim-ის გამოყენება დავიწყე, ჩვენ უბრალოდ ვტვირთავდით Vim-ის დანამატს და ვაკოპირებდით/ვამოწმებდით მას ~/.vim დირექტორიაში. დღესდღეობით, არსებობს Vim-ის დანამატების მართვის რამდენიმე ინსტრუმენტი, როგორიცაა Pathogen, Vundle, vim-plug და ა.შ. არ ვაპირებ რომელიმეს გამოყენებას, რადგან არ ვიცი, რომელს იყენებთ და არ მინდა თითოეულისთვის ნაბიჯების დაწერა.

სინამდვილეში, მე არასდროს გამომიყენებია Vim-ის დანამატების მენეჯერი. Vim 7-მდე, მე ვქმნიდი ~/.vim/bundle დირექტორიას, შემდეგ ვაკოპირებდი თითოეულ დანამატს მის საკუთარ დირექტორიაში და ვამატებდი დანამატის დირექტორიის გზას Vim-ის runtimepath ოფციაში.

Vim 8-ს აქვს პაკეტების მშობლიური მხარდაჭერა, რაც ამარტივებს დანამატების ინსტალაციას და ჩატვირთვას. Vim 8-ით, ჩვენ შეგვიძლია თითოეული დანამატი დავაკოპიროთ მის საკუთარ დირექტორიაში ~/.vim/pack/plugins/start-ში და ისინი ავტომატურად იტვირთება Vim-ის გაშვებისას. ამ გზაში დირექტორიის სახელი plugins მხოლოდ მაგალითია. ეს შეიძლება იყოს ნებისმიერი თვითნებური სახელი და Vim მაინც კარგად ჩატვირთავს დანამატებს.

ამ სტატიაში, მე გამოვიყენებ Vim 8-ის მშობლიურ მხარდაჭერას პაკეტებისთვის Vim-ის დანამატების დასაყენებლად. ერთადერთი გამონაკლისი იქნება Vlime-ის ინსტალაცია. Vlime-ის ზედა დონის დირექტორია არ არის დანამატის დირექტორია. დანამატის დირექტორია მოთავსებულია ქვე-დირექტორიაში სახელწოდებით vim. ეს არ შეესაბამება Vim პაკეტში დანამატების დირექტორიის სტრუქტურას. ამიტომ, ამ სტატიაში, მე Vlime-ს ძველებურად დავაყენებ, დავაკოპირებ მას ~/.vim/bundle-ში და შემდეგ დავამატებ მისი დანამატის დირექტორიის გზას Vim-ის runtimepath ოფციაში.

ვინაიდან ეს სტატია მოიცავს პროგრამული უზრუნველყოფის რამდენიმე ფენას, აქ დაწერილი ზოგიერთი რამ შესაძლოა მომავალში არ იყოს აქტუალური, რადგან ეს სხვადასხვა პროგრამული უზრუნველყოფა დროთა განმავლობაში იცვლება და ვითარდება. ამიტომ, ამ განყოფილებაში, მე ჩამოვწერ სხვადასხვა პროგრამული ინსტრუმენტების ვერსიებს, რომლებიც გამოვიყენე ამ სტატიის წერისას. აი ისინი:

თქვენ ალბათ დაგჭირდებათ ზემოთ მოცემული ინსტრუმენტების მხოლოდ მცირე ნაწილი, იმისდა მიხედვით, თუ რომელ განყოფილებებს მიჰყვებით ამ სტატიაში. უბრალოდ აირჩიეთ ის განყოფილებები, რომელთა გამოცდაც გსურთ და მიჰყევით მათში მოცემულ ნაბიჯებს. ისინი გაგაცნობთ იმ ინსტრუმენტების ინსტალაციის პროცედურას, რომლებიც შეესაბამება თქვენს მიერ არჩეულ განყოფილებებს. მიუხედავად იმისა, თუ რომელ განყოფილებებს აირჩევთ, გირჩევთ, აუცილებლად გაიაროთ ქვემოთ მოცემული სამი „დაწყება“ ქვეგანყოფილება. ეს ქვეგანყოფილებები დეტალურად განიხილავს ზოგიერთ წინაპირობას, როგორიცაა tmux-ის მხარდაჭერა, Paredit, Python ინტერფეისის მხარდაჭერა Vim-ში და ა.შ., რომლებიც არ არის დაფარული სხვა განყოფილებებში.

Debian-ის არჩევანი შესაძლოა უცნაურად მოგეჩვენოთ. მინდა, რომ ამ სტატიაში განხილული ბრძანებები და ნაბიჯები ადვილად განმეორებადი იყოს თავისუფალ და ღია კოდის ოპერაციულ სისტემაში. Debian ჩემი ფავორიტია. ის, რაც Debian-ზე მუშაობს, ადვილად განმეორებადია Ubuntu-ზე და სხვა წარმოებულებზე, ხშირად ნაბიჯების შეცვლის გარეშე. მჯერა, რომ არ იქნება ძალიან რთული Debian-ისთვის მოცემული ნაბიჯების თარგმნა სხვა ოპერაციულ სისტემაზე სამუშაო ნაბიჯებად.

გაითვალისწინეთ, რომ Quicklisp (Vlime-ის წინაპირობა) ამ სტატიის წერის დროს ჯერ კიდევ ბეტა პროგრამული უზრუნველყოფაა. Quicklisp-ის ინსტალაციის რეალური ნაბიჯები შესაძლოა შეიცვალოს მომავალში. Quicklisp-ის ინსტალაციის ყველაზე განახლებული ინსტრუქციებისთვის იხილეთ https://www.quicklisp.org/.

Slimv-ის დაყენება და გამოყენება:

  • დააინსტალირეთ ინსტრუმენტები, რომლებიც საჭიროა Common Lisp-ის განვითარების გარემოს დასაყენებლად Slimv-ით, ამ ბრძანების გამოყენებით:

Debian-ში ნაგულისხმევი Vim არის vim.basic, რომელსაც უზრუნველყოფს vim პაკეტი და არ აქვს Python ინტერფეისის მხარდაჭერა. Slimv დაწერილია Vim სკრიპტში, Lisp-სა და Python 3-ში, ამიტომ მას სჭირდება Vim პაკეტი, რომელსაც აქვს Python ინტერფეისის მხარდაჭერა. ერთ-ერთი ასეთი პაკეტია vim-nox, რომელიც უზრუნველყოფს vim.nox ბრძანებას. მისი ინსტალაცია ავტომატურად განაახლებს vim ბრძანებას vim.nox-ის გასაშვებად. კიდევ ერთი ასეთი პაკეტია vim-gtk, რომელიც დამატებით უზრუნველყოფს GUI მხარდაჭერას. გრაფიკული Vim, ცნობილი როგორც GVim, შეიძლება გაეშვას gvim ბრძანებით. ის მუშაობს დესკტოპის გარემოში. ამ სტატიის მიზნებისთვის, მე დავრჩები vim-nox-ზე, რადგან ის მსუბუქია. Slimv-ისთვის განკუთვნილი ყველა ნაბიჯი თანაბრად კარგად იმუშავებს vim-gtk-ზე, MacVim-ზე და GVim-ზე.

tmux-ის ინსტალაცია არჩევითია. Slimv-ს შეუძლია Swank სერვერის ავტომატურად გაშვება, თუ Vim მუშაობს tmux-ში, GNU Screen-ში ან დესკტოპის გარემოში, ასე რომ, თუ უკვე იყენებთ GNU Screen-ს, არ გჭირდებათ tmux-ის ინსტალაცია. ასევე, თუ Slimv-ს დესკტოპის გარემოში აწარმოებთ, არც tmux-ის და არც GNU Screen-ის ინსტალაცია ნამდვილად არ გჭირდებათ, თუმცა შეგიძლიათ, თუ გსურთ Swank-ის გაშვება ცალკე tmux ან GNU Screen ფანჯარაში, ვიდრე ცალკე ტერმინალის ფანჯარაში. ამ სტატიაში, მე ვივარაუდებ, რომ Vim მუშაობს tmux-ში.

თუ Slimv-ს ტერმინალში აპირებთ გაშვებას დესკტოპის გარემოს, tmux-ის ან GNU Screen-ის გარეშე, Swank სერვერი ხელით უნდა გაეშვას. ქვემოთ მოცემული მე-4 პუნქტი განმარტავს, თუ როგორ უნდა გააკეთოთ ეს.

Slimv-ის ინსტალაცია საკმაოდ მარტივია. აი, ერთი გზა ამის გასაკეთებლად:

სულ ეს არის! Slimv დაყენებულია. ეს ასე მარტივია. ზემოთ მოცემული ბრძანებები აჩვენებს, თუ როგორ უნდა დააყენოთ Slimv მხოლოდ ორი shell ბრძანებით. ასევე შეგიძლიათ გამოიყენოთ Vim-ის დანამატების მენეჯერი Slimv-ის დასაყენებლად, მაგრამ ამას აქ არ განვიხილავ.

tmux-ის გაშვება (არჩევითი)

ეს არჩევითი ნაბიჯია. Slimv მხარს უჭერს Swank სერვერის ავტომატურ გაშვებას, თუ Vim-ს აწარმოებთ tmux-ში, GNU Screen-ში ან დესკტოპის გარემოში. tmux-ის გასაშვებად, შეიყვანეთ ეს ბრძანება:

თუ იყენებთ GNU Screen-ს ან დესკტოპის გარემოს, არ გჭირდებათ tmux-ის გაშვება.

თუ არ იყენებთ tmux-ს, GNU Screen-ს ან დესკტოპის გარემოს, მაშინ Swank სერვერი ხელით უნდა გაუშვათ, როგორც ეს შემდეგ პუნქტშია განმარტებული.

Swank სერვერის ხელით გაშვება (საჭიროა მხოლოდ ზოგიერთ შემთხვევაში)

ეს ნაბიჯი აუცილებელია მხოლოდ იმ შემთხვევაში, თუ არ იყენებთ tmux-ს, GNU Screen-ს ან დესკტოპის გარემოს. შემდეგი ბრძანება გვიჩვენებს, თუ როგორ უნდა გაუშვათ Swank სერვერი ხელით:

თუ იყენებთ tmux-ს, GNU Screen-ს ან დესკტოპის გარემოს, Slimv-ს შეუძლია Swank სერვერის ავტომატურად გაშვება საჭიროების შემთხვევაში და არ გჭირდებათ ამ ნაბიჯის შესრულება.

Lisp წყაროს კოდის ფაილის შექმნა

შექმენით ახალი Lisp წყაროს კოდის ფაილი, მაგალითად, foo.lisp ამ ბრძანებით:

Swank სერვერთან დაკავშირება

Swank სერვერთან დასაკავშირებლად, ნორმალურ რეჟიმში შეიყვანეთ შემდეგი ბრძანება:

,c

თუ Vim მუშაობს tmux-ში, GNU Screen-ში ან დესკტოპის გარემოში, Slimv ავტომატურად გაუშვებს Swank სერვერს და დაუკავშირდება მას.

მას შემდეგ, რაც Slimv წარმატებით დაუკავშირდება Swank-ს, Vim-ის ფანჯარა ორად გაიყოფა და ახალ გაყოფილ ფანჯარაში გამოჩნდება შემდეგი მოთხოვნა:

ეს არის ინტეგრირებული REPL. ის ახლა ცოცხალია და მზად არის ინტერაქტიული პროგრამირებისთვის.

აქ ვვარაუდობთ, რომ Slimv იყენებს ნაგულისხმევ Slimv leader key-ს ,. თუ თქვენ გადაფარეთ Vim leader key, მაშინ Slimv leader key შეიძლება იყოს იგივე, რაც Vim leader key. შეიყვანეთ ბრძანება :echo g:slimv_leader Vim-ის ბრძანების ხაზის რეჟიმში, რათა იპოვოთ Slimv-ის მიერ გამოყენებული leader key.

კოდის შეყვანა

ჩაწერეთ კოდი ახალი ფაილის ბუფერში. ამისათვის, ჯერ აკრიფეთ i ჩასმის რეჟიმში შესასვლელად და ჩაწერეთ ეს კოდი:

აკრიფეთ esc ნორმალურ რეჟიმში დასაბრუნებლად.

მიმდინარე გამოსახულების შეფასება

კურსორის ქვეშ არსებული მიმდინარე გამოსახულების შესაფასებლად, ნორმალურ რეჟიმში შეიყვანეთ შემდეგი ბრძანება:

,e

როგორც მიმდინარე გამოსახულება, ასევე მისი შედეგი უნდა გამოჩნდეს REPL ფანჯარაში.

REPL-ის ინტერაქტიული გამოყენება

REPL ინტერაქტიულია. აკრიფეთ ctrl+ww REPL ფანჯარაზე გადასასვლელად. შემდეგ აკრიფეთ i ჩასმის რეჟიმში შესასვლელად და ჩაწერეთ ეს კოდი:

აკრიფეთ enter გამოსახულების შესაფასებლად, ისევე როგორც რეალურ REPL-ში გააკეთებდით. …