Какво се очаква от проектите

Проекта ще ви отнеме известно време от сесията, и ще е половината от оценката. Ето малко повече детайли за съдържанието и оценяването.

Съдържание

Ще се приемат разнообразни идеи за проекти. В идеалния случай (но не е задължително), ще е нещо, което на вас ви е интересно и което искате да направите за себе си, било то за проба или за употреба. Очаква се проекта да е някакъв плъгин за Vim. Окей е голяма част от кода да е във външно приложение, написано на какъвто и да е език, но искам да има интеграция с Vim. Повече за външни приложения, по-надолу.

Не е нужно проекта ви да решава проблем на 100% -- ако пишете дърво за файловата система, няма нужда да имате пълния комплект функционалности на NERDTree или Netrw. Ако пишете рефакторинг плъгин, ок е да се фокусирате върху 2-3 filetype-a, и не е нужно да се справяте с абсолютно всички казуси. По време на защитата, обяснете какво прави, обяснете какво не, няма да ви оценявам на "завършеност", искам да видя, че сте помислили и сте го докарали до нещо употребяемо.

Оценяване

Ще награждавам точки по следния начин:

  • 30т за функционалност: Проекта прави каквото сте казали, че ще прави. Плъгина е организиран по начините, които съм описвал (или ще опиша) на лекция откъм структура, настройки, (поне минимална) документация.
  • 30т за употреба на Vim: Можете да навигирате кода на проекта си във Vim и да го обясните. Когато ви заръчам да направите някоя промяна, можете да използвате Vim за да я направите. Няма нужда да сте бързи, но искам да видя, че сте способни да използвате поне базовите ефективни движения, както съм обяснил в лекция 1: базови движения. Ще смъквам точки ако видя (примерно):
    • употреба на мишка
    • употреба на стрелкички за навигация
    • стоене и навигиране в insert mode вместо в normal mode

На изпита ще минем и през семестриалните упражнения и може да ви накарам да направите 1-2 пред мен. Може да упражните стари такива в секция "Свободни упражнения".

Напомням и каква е скалата за оценяване за крайна оценка, упражнения (не повече от 60т) + проект (60т) + бонус точки от участие и други неща:

  • 105т: 6
  • 90т: 5
  • 75т: 4
  • 60т: 3
Напомням и че проекта е задължителен за оценка. Дори да имате 61 точки, това не ви дава автоматична тройка. Първо трябва да ми предложите проект, да го одобря, и да го защитите.

Срокове

Очаквам да си изберете проект до началото на сесията и да го обявите в discord, в канала #projects, заедно с факултетния си номер. Разкажете какво ще направите, и какви конкретни функционалности ще вкарате.

Ще разгледам предложенията и може би ще кажа "супер, звучи добре", а може и да кажа "добре, но добави X и/или Y". Може и да ви предупредя, че това изглежда твърде голямо за проект и има риск да ви дойде множко.

При всички положения, ако не сте избрали проект до началото на сесията, ще приема, че сте решили да не довършвате курса този семестър – няма проблеми с това. Можете да дойдете септември и ще ви запазя точките от упражнения, или да дойдете догодина и да си направите отново упражненията. Ако знаете, че ще ви отнеме повече време да изберете проект по някаква причина, пишете, може би ще измислим нещо. Но ако в началото на сесията още не сте решили, може да ви е трудно да го довършите до края.

Откъм дата за изпита, ще се опитвам да получа най-късната възможна дата, за да имате време да бутате проекта лека-полека. Това обикновено ще е последната неделя след официалния край на сесията.

Идеи

Тук ще споделя няколко категории проекти, които се надявам да ви дадат идея какво да си направите. Окей е да си харесате някой съществуващ плъгин и да кажете "искам да направя това по мой си начин", но имайте предвид, че наистина трябва да си го направите с ваши усилия, а не просто да копирате код и да преименувате променливите (защото това последното е плагиатство и се наказва с късане :)). В идеалния случай, дори да направите нещо, което вече съществува, ще измислите собствена вариация, която ви харесва (има десетки statusline плъгини и всичките имат различна архитектура).

Категория: Проста функционалност с приложения за различни езици

Във видеото на лекция 8 (Регекси 2) съм разказал повече. Базовата идея е да измислите някаква трансформация на код, която има различни варианти за различни езици. Примерно, трансформиране на многоредов код на няколко реда, или превключване на различни форми на едно парче код, или извличане на променливи/функции/класове.

В такъв плъгин, спокойно може да имате сравнително прости решения на индивидуални проблеми и да ги комбинирате в някаква схема, която сравнително лесно се разширява. Може да е "конфигурирайте 3 регекса за определен filetype и ще работи за него", може да е "напишете vimscript (или друг език?) функция, която да имплементира решението".

Откъм размер, окей е да имате примерно 3-4 трансформации за по 3-4 различни filetype-а. В зависимост от това колко сложни са, може би ще е окей да имплементирате по-малко, може би ще е добре да имплементирате повече. Важно е да видя, че тези функционалности пасват на някаква централна идея, а не са просто "виж какви функции имам във vimrc-то си".

  • Мои такива плъгини, които са твърде големи, но са точно в тази категория: splitjoin, switch, sideways.
  • По-малки, които също имат filetype-specific компоненти, но повече "централна" логика: whatif, deleft, dsf (като размер, бих приел нещо такова).
  • Чужди плъгини горе-долу в тая категория: altr, projectionist, context
  • Разни LSP сървъри или IDE-та понякога могат да ви дадат добри идеи за "code actions", примерно rust-analyzer. Някои неща ще са невъзможни без информация от компилатор, други вероятно могат да се имплементират даже по-добре с достатъчно количество регекси :).

Категория: Една главна интересна функционалност

Това е малко обща категория, но е тук като контраст с горното. Може да си направите една централна функционалност, която да прави нещо интересно. Дърво на файловата система може да изглежда сложно, но стига да се ограничите до базова навигация и дребни модификации, тотално правимо е за проект. Плъгин за снипети също може да е мега сложен, но фундаменталната идея "като се натисне tab виж какво има зад курсора и го разпъни", е тривиална -- оттам нататък въпроса е какво ще измислите откъм мапинги, скачане по placeholder-и, динамично съдържание...

Категория: Инструменти за текст

Не е необходимо да пишете програмистки инструменти. Може да се концентрирате върху проект, който да подобрява писането на бележки, документация, мейли... Vim е програмистки редактор, но също така е мощен текстов редактор. Няколко примери:

  • Фокусирано писане: goyo
  • Инструменти за по-удобно писане на текст: pencil
  • Лично wiki с организирани файлове, линкове между тях: vimwiki, wiki.vim
  • Календар, в който като натиснете Enter на дата, ви отваря "diary" файл за този ден: calendar-vim
  • TODO плъгин с приоритети, команди, търсене из архиви... vim-tasks
  • Създаване на таблици и диаграми: vim-boxdraw, vim-table-mode

Категория: Интеграция с външно приложение

Казах, че спокойно може да си напишете кода на друг език, стига да се интегрира добре с Vim. Това ви дава доста свобода, но и означава, че ще трябва да комуникирате между Vim и някакъв външен инструмент. Лекция 9 говори доста за тия неща -- system, job_start. LSP интеграция също влиза в тая категория, макар аз лично да намирам такова нещо за kind of скучно. Ето някои идеи с променливо количество конкретност:

  • Log viewer, който чете асинхронно някакви логове и позволява филтриране, търсене, syntax highlighting, или може би даже spawn-ва процеси, дефинирани в Procfile като foreman или множеството му алтернативи
  • Чат с други хора, чат с ботове, collaborative editing
  • Music player като ncmpcpp, който представлява UI за MPD (music player daemon) или може би извиква друга външна програма за свирене на музиката
  • Клиент към съществуваща програма с някакво API като spotify, slack, twitter (макар че за последното сигурно не си заслужава да платите 100 долара на месец)
  • Нещо подобно на id3, gnugo, afterimage...

Категория: Навигация на проект

От лекция 11 нататък все говорим за работа с проекти. Може да си напишете инструменти за по-удобна работа с Rails, Next.js, Laravel, Phoenix, някакви джаварски или C++-ки неща. Сред лекциите съм оставил няколко идеи...

  • LSP сървър и/или клиент, който се концентрира върху 3-4 базови неща
  • Fuzzy finding може по-скоро да се използва като компонент от нещо друго, но нищо не ви пречи да си напишете ограничен клонинг на telescope или fuzzyy.
  • Навигация на проекти като някой от моите плъгини: rustbucket, ember_tools, rails_extra...
  • Употреба и манипулация на quickfix прозореца -- bookmarks, бележки, запазване на quickfix във файл за по-нататъшно зареждане...
  • Генериране на ctags или употребата на тагове за нещо смислено (в комбинация с fuzzy finding, completion...)

Категория: Игра

Vim не е направен за игри, но при достатъчно желание, всичко е gaming платформа. Имате +sound за издаване на звуци, имате височина и ширина на терминала и възможност да позиционирате символи.

Със сигурност не бих го препоръчал, защото има потенциала да се окаже сложно, но ако има желание, ще се намери начин. Нещо като typing tutor може да е особено пасваща идея, но има и други примери: killersheep, code break, blackjack...

В случай на нерешителност

Ако не можете да изберете, помислете си за посоки и питайте. Може да ви дам идеи или вдъхновение. Ако дори нямате посока, пуснете си Random Number Generator за да изберете посока – всичко е правимо, само ви трябва начална точка и време.