Pull to refresh

Comments 28

Да уж… Vim был бы отличной операционной системой, если бы в нем был текстовый редактор
Ну, судя по таким постам, Вим скоро его догонит.
Не раньше, чем кто‐то научит его работать с несколькими нитями и получит нормальное API для различных вещей. Что будет очень и очень нескоро.

Сейчас его при некоторой удаче можно уронить стандартной функциональностью: изменением размера окна (gvim, не vim) и клиент‐серверным взаимодействием. Как это нормально исправить непонятно: слишком много глобальных переменных.
Нити? Последний раз я видел эту терминологию в известном трактате Терренса Чана, где он еще сокеты гнёздами называл. Я не имею желания придраться, просто хочется узнать, почему именно нити, а не потоки?
Думаю, Терренс Чан всё же называл сокеты sockets, а потоки — threads. А дальше уже на вкус переводчика.
Можно потоки и фибры, а можно — нити и волокна. И в последнем варианте сразу ясно, что из чего состоит.
Прошу прощения. Конечно я имел в виду перевод. И все же, на мой взгляд, потоки и волокна звучат традиционнее нитей и фибр. Но это моё мнение, никому не навязываю.
Термин «нити» обычно используют люди, которым приходится работать одновременно и с нитями и с потоками: потоки это streams, например fstream, stringstream и т.д., а нити это threads.
if exists('vim_reddit_module')
finish
endif

Переменная должна быть глобальной — g:vim_reddit_module
Иначе это не страхует от повторной загрузки плагина.
да, опечатка — благодарю за находку)
Ошибки не было — нечего исправлять, см. коммент ниже. Я, кстати, использую для страховки локальные для скрипта переменные (s:): если кому‐то надо отключить конкретное дополнение, то для этого есть менеджеры путей (pathogen) или дополнений (VAM, Vundle, …), а засорять глобальную область видимости тем, что не является абсолютно необходимым я не люблю. Тем более, что отключение загрузки можно легко добавить в мой framework в виде одной глобальной переменной на все дополнения со списком отключённых, а не пачки по одной переменной на дополнение, если кому‐то потребуется.

Кстати, в vim-7.4a можно не трогать sys.path. Только модуль надо класть не в plugin/, а в python2/, python3/ или pythonx/ (для второй, третьей и обеих версий Python соответственно).
s: использовать точно плохо, т.к. кто-то может по ошибке положить скрипт в два места (в plugins/ и bundle/.../ например)
У меня при этом будет куча ошибок и кому‐то придётся удалить скрипт из одного места: framework предполагает регистрацию всех внешних интерфейсов, а также принципиальное неиспользование function! и command! (именно с восклицательными знаками, а не неиспользование вообще). Такое поведение гораздо лучше, чем притворяться, что ошибок нет, а потом узнавать, что дополнение было обновлено в одном месте, а загружается из другого.

При использовании только событий кучи ошибок может и не быть, но необходимо будет хотя бы одно предупреждение о том, что файл с таким именем уже загружен. (Под именем следует полагать часть полного пути файла без runtimepath и .vim и с компонентами пути, разделёнными /, независимо от используемой ОС. Например, plugin/aurum.)
По опыту сидения в issue tracker’е powerline, который может быть установлен (и зачастую устанавливается) в два места: в систему с помощью pip и в .vim/bundle, могу сказать, что замалчивание такой ошибки (которое здесь (в powerline) происходит), приводит к появлению кучи народа именно с проблемой обновлённого только в одном месте powerline. Если вы ожидаете, что ваше дополнение будет положено в два места, ни в коем случае не используйте такой простой guard, по крайней мере, в одиночку. Ни s:, ни g:. У меня вылезают ошибки, но за счёт frawor — то есть guard уже не используется в одиночку.

С g:, если вы заботитесь о такой ситуации, надо сохранять expand('<sfile>') в переменную и проверять соответствие при запуске (то есть, сначала if exists(), внутри if expand('sfile') isnot# g:… с сообщением об ошибке).

Впрочем, я не видел реальных пользователей с такой проблемой.
Она и так глобальная. Локальные для файла переменные начинаются с s:. И страхуют от загрузки файла, поскольку эта область видимости не очищается. Без префикса переменные локальны только внутри функции, а finish внутри функции не работает.

There are several name spaces for variables. Which one is to be used is
specified by what is prepended:

(nothing) In a function: local to a function; otherwise: global


vimhelp.appspot.com/eval.txt.html#internal-variables
«Vim пишет код за Вас…» — это действительно так? как с ним работать?
в остальном статья осталась непонятной. что же делает ваш плагин? зачем он нужен?
Возможно, статья получилась немного сумубрной, но в ней описано все, что я хотел сказать. Плагин в данном случае не есть самоцель — через него я просто демонстрирую (и разбираюсь сам), как реализовать в vim нужную фичу на python.
Если же вам непонятно в буквальном смысле, что делает этот плагин — он отображает посты из reddit на странице редактора. Это маленькая приятность, которую я давно хотел для себя сделать. Собственно, поэтому он и нужен — в первую очередь, мне)
Спасибо, что вы выкладываете в свободный доступ все, что вам удалось реализовать и рассказываете об этом сообществу.
Сочтите дальнейшее как конструктивную критику и желание получить качественно поданный материал.

1.Вместо кричащих заголовков «Vim пишет код за Вас…» читателю/пользователю было бы интереснее узнать, что же реально делает ваш плагин.
2.Вместо картинки из мультфильма стоило бы скриншотами показать, как было и как стало. Или, что лучше, сделать видео на ютьюбе.
3.Установка и мелочи — под кат. (Не всем же это надо, и не все будут это устанавливать. Пожалейте чужое время)
4.Поменьше метафор и аллегорий. Приятнее читать, когда все просто и ясно. Мы же не художественную литературу читаем.

Спасибо.
5.Если это нужно только и в первую очередь вам, то может не стоит лишний раз хвастаться и выкладывать «очередной суперполезный плагин» на хабр? или, что лучше, сделать «сей скромный трактат» читаемым и полезным?

Спасибо.
UFO just landed and posted this here
UFO just landed and posted this here
>"(подобрать соответсвующее сравнение)"

Штопор?
А я наивный… думал что тут реально что-то крутое будет, что перевернет мое представление о текстовом редакторе и покажет как он за меня пишет нужный мне код. Эх
Я думал о каком‐то очередном конкуренте snipmate/XPtemplate/… Тысячи их, но остальные далеко не так известны.
Кстати, если я не ошибаюсь, у вас каждый раз при вызове :Reddit в sys.path добавляется путь. Зачем?

И ещё: я не вижу, где вы создаёте новый буфер.

Вообще, если требуется показать какие‐либо данные я всегда использую не команду, а событие BufReadCmd и псевдо‐протокол (к примеру,
augroup Reddit
    autocmd! BufReadCmd reddit:// :call Reddit()
augroup END
) + ещё, возможно, FileReadCmd: на случай, если хочется использовать :read reddit://. Теоретически это даст возможность восстановления таких буферов при загрузке сессий. Правда, я не использую последние.

А всю подсветку правильно было бы убрать в syntax/reddit.vim и использовать set ft=reddit. Не надо писать велосипеды для обработки выключенного синтаксиса. И не надо бояться множества мелких файлов.
Кстати, если я не ошибаюсь, у вас каждый раз при вызове :Reddit в sys.path добавляется путь. Зачем?

Это недосмотр — конечно, надо добавлять только при запуске плагина.

И ещё: я не вижу, где вы создаёте новый буфер.

Я использую текущий буфер — просто очищаю его и заполняю заново. Возможно это не самый лучший путь, скорее это — первое, что пришло в голову и было реализовано.

А всю подсветку правильно было бы убрать в syntax/reddit.vim и использовать set ft=reddit. Не надо писать велосипеды для обработки выключенного синтаксиса. И не надо бояться множества мелких файлов.

Согласен. Судя по всему, мне придется внести еще кучу мелких и не очень исправлений, т.к. в создании плагинов к Vim я очевидный новичок. Благодарю за замечания — они чрезвычайно полезны для меня)
Я использую текущий буфер — просто очищаю его и заполняю заново. Возможно это не самый лучший путь, скорее это — первое, что пришло в голову и было реализовано.
Использование текущего буфера — это то, что вы должны делать с BufReadCmd. При использовании команды надо его всё же создавать, иначе область применения команды ограничиться либо командой‐обвязкой, которая его‐таки создаст (и добавит ненужный уровень вложенности), либо запуском через vim +Reddit. То есть можно просто взять вашу функцию и мой код с BufReadCmd и оставить так.

Кстати: у BufReadCmd есть ещё преимущества: можно взять и написать tabedit reddit:// и не париться созданием кучи команд на все случаи: когда пользователь захочет видеть посты из reddit в новой вкладке, новом окне сверху/слева/справа/снизу, в текущем окне и т.д.
Sign up to leave a comment.

Articles