惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
AI
AI
T
Threatpost
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cybersecurity and Infrastructure Security Agency CISA
Scott Helme
Scott Helme
AWS News Blog
AWS News Blog
P
Privacy & Cybersecurity Law Blog
G
GRAHAM CLULEY
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
CERT Recently Published Vulnerability Notes
Cyberwarzone
Cyberwarzone
NISL@THU
NISL@THU
P
Privacy International News Feed
Schneier on Security
Schneier on Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
SecWiki News
SecWiki News
T
Tor Project blog
W
WeLiveSecurity
Security Archives - TechRepublic
Security Archives - TechRepublic
Spread Privacy
Spread Privacy
H
Hacker News: Front Page
Latest news
Latest news
C
Cyber Attacks, Cyber Crime and Cyber Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Troy Hunt's Blog
Cisco Talos Blog
Cisco Talos Blog
人人都是产品经理
人人都是产品经理
腾讯CDC
博客园 - 【当耐特】
Engineering at Meta
Engineering at Meta
The Hacker News
The Hacker News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
PCI Perspectives
PCI Perspectives
罗磊的独立博客
阮一峰的网络日志
阮一峰的网络日志
N
News and Events Feed by Topic
The Cloudflare Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
TaoSecurity Blog
TaoSecurity Blog
博客园 - 叶小钗
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Threat Research - Cisco Blogs
量子位
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
美团技术团队
D
Docker
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Tenable Blog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
С Vim удобно программировать (часть I)
Oldchip · 2026-04-23 · via Все публикации подряд на Хабре

Уровень сложностиСредний

Время на прочтение6 мин

Охват и читатели994

Туториал

Но это требует некоторой доводки.

Автор решил устроить себе среду разработки на Vim, простую, с поддержкой нескольких языков и многофайловых проектов. Просканировал интернет, но такое, чтобы всё полностью устраивало, не нашлось. Одно казалось громоздким, другое - трудно управляемым, в третьем недоставало функциональности. В итоге сделал сам. Рассказываю всем желающим, что получилось (оговорюсь сразу, по-моему, очень даже неплохо!).

Статья состоит из трех частей. В первой описываются настройки, необходимые для работы скриптов, а также настройки, просто делающие Vim более удобным.

Вторая часть посвящена настройке запуска программ из Vim. Она, в свою очередь, состоит из двух частей: первая описывает запуск на исполнение одиночного файла, вторая - многофайловый проект.

В третьей части описывается простой пример использования данной разработки, там же я немного коснулся работы с Git (с учетом нашей специфики).

Все плагины и скрипты написаны автором и могут использоваться всеми желающими по своему усмотрению. Автор надеется на осознанное применение всего, что есть в статье, и отказывается нести какую-либо ответственность за последствия применения кем бы то ни было и где бы то ни было приведенных в статье настроек и программного кода. Для чтения статьи требуется некоторое знакомство с Linux, Vim, Vimscript и Bash. Также, если будете читать в третьей части о Git, нужно иметь о нём представление.

Проект на GitVerse:

https://gitverse.ru/shodanovich/replvim/content/master

  1. Базовые настройки Vim.

    В этой части статьи описаны базовые настройки Vim, которые находятся в его конфиге ~/.vimrc. Часть настроек необходима для работы скриптов и плагинов, другая (необязательная) просто делает редактор удобнее.

    1. Запуск Vim в режиме вставки.

Это первое, что я сделал. Чтобы не путать педали. По умолчанию Vim запускается в так называемом нормальном режиме, в котором сосредоточено всё управление и, чтобы начать работать, то есть перейти в режим вставки, надо нажимать еще клавишу, что меня, признаться, напрягает. Поэтому настроил запуск в режиме вставки и перенес нужное мне управление в этот режим (как это сделано в большинстве других редакторов). Чтобы это реализовать, потребуется добавить в файл конфигурации ~/.bashrc (это конфиг для bash) строчки:

# запуск vim в режиме вставки
alias vim="vim -c 'startinsert'"

Первая строка - комментарий, вторая говорит системе: если команда - vim, то запускать то, что справа от знака равенства, т. е. Vim в режиме вставки.
Чтобы два раза не открывать конфиг, добавим в него еще строку

export PATH="$PATH:~/.local/bin"

Это будет путь для запуска скрипта на Bash, создающего проект для редактирования в Vim (об этом речь во второй части).

Чтобы изменения в ~/.bashrc вступили в силу, перезагружаемся или запускаем команду

$ source ~/.bashrc
  1. 2. Установки.

    Как уже говорилось, ~/.vimrc - это конфиг для Vim, определяющий его настройки. Чтобы не загромождать статью, полностью я его здесь не привожу (Полностью ~/vimrc можно посмотреть или скачать с GitVerse по ссылке во вступлении). Опишу установки, необходимые для правильной работы скриптов.

filetype plugin indent on

Благодаря этой опции Vim сможет определить тип файла, настроить автоотступы, запустить скрипты и плагины.

syntax on

Определение синтаксиса и раскраска текста

  1. 3. Сопоставления.

    Написаны они так, чтобы
    - командовать редактором в основном из режима вставки и
    - не отходить далеко от оригинальных команд Vim.
    Это мой произвольный выбор. Читатель может применить свои буквосочетания.
    Разберём некоторые сопоставления.

    " удалить строку
    inoremap <C-d> <Esc>ddi

Расшифровываем слово “inoremap” справа налево: “map” - сопоставление, “nore” - без рекурсии (везде это вставляю, чтобы Vim не запутался), “i” - режим вставки. Далее, <C-d> - это одновременное нажатие Ctrl+d. Этому нажатию сопоставляется последовательность команд - <Esc> - переход в нормальный режим; dd - удаление текущей строки; i - переход обратно в режим вставки. Как видите, синтаксис нехитрый.

Продолжаем разбирать маппинг. Выделение фрагмента и работа с ним:

" Ctrl-v - режим визуальный посимвольный
inoremap <C-v> <Esc>v
" удаление того, что выделено, с переходом в режим вставки
" (далее по Ctrl-p можем вставить фрагмент в другом месте; получится перенос)

vnoremap <Del> <Del>i
" копирование выделенного фрагмента с переходом в режим вставки
" (далее по Ctrl-p можем вставить фрагмент)
vnoremap y yi

vnoremap - это сопоставление в визуальном режиме; есть ещё nnoremap - сопоставление в нормальном режиме, и мы его также будем использовать.

" очистить строку
inoremap <C-d> <Esc>ddi
" удалить до конца строки по Ctrl-стрелка вправо
inoremap <C-Right> <Esc><Right>d$i " $ здесь - перейти в конец строки
" удалить до конца слова
inoremap <C-S-Right> <Esc>dei

Аналогично можно сделать сопоставление - удаление от текущего символа до начала строки или слова. Оставляю это читателю для самостоятельной работы.

" Ctrl-y копируем строку в буфер
inoremap <C-y> <Esc>yyi
" Вставка строки (блока) из буфера с переходом в режим вставки
inoremap <C-p> <Esc>pi
" запись всех табов
inoremap <C-w> <Esc>:wa<Enter>i
" выход из редактора (из всех табов)
inoremap <C-q> <Esc>:qa<Enter>

В данной порции кода всё понятно благодаря комментариям. Последние два сопоставления удобно использовать, если редактируется несколько файлов в разных вкладках, для сохранения изменений и выхода из редактора.

" Отмена
inoremap <C-u> <Esc>ui

Можно отменить до 1000 последних действий; если этого недостаточно, откорректируйте строку

set history=1000

"Ctrl-f поиск из режима вставки
inoremap <C-f> <Esc>/

Эта команда не возвращает нас в режим вставки автоматически. Дальнейшее управление поиском осуществляем из нормального режима (n - искать далее, p - искать предыдущее). В режим вставки переходим вручную (i).

Если вы с помощью сопоставления не переопределили стандартную команду, то она продолжает действовать, и ей можно пользоваться. Например, я часто использую автодополнение Ctrl-n (Есть еще Ctrl-p, но у меня эта команда переопределена для вставки из буфера обмена).

  1. 3. Полезные мелочи.

    1. 3. 1. Комментарии

    Для вставки комментариев на каком-либо языке воспользуемся двумя сопоставлениями.

    "Переход в визуальный блочный режим
    inoremap <C-b> <Esc><C-v>
    " Вставляем комментарий и переходим в режим вставки
    vnoremap <Ins> <Esc>:source ~/.vim/ftplugin/comment.vim<Enter>i

    Последовательность действий: устанавливаем курсор на первый символ блока, переходим в визуальный блочный режим (C-b) и выделяем стрелками или фигурными скобками строки для комментария. Нажимаем Ins, и срабатывает скрипт ~/.vim/ftplugin/comment.vim,который мы сейчас разберем.

" ~/.vim/ftplugin/comment.vim
" Знак комментария в выделенном блоке
if !exists("b:current_syntax")
echoe "Данный синтаксис не обрабатывается"
finish
endif

let start_line = line("'<")
let end_line = line("'>")

for nom_line in range(start_line, end_line)
execute nom_line
if b:current_syntax == 'ruby' || b:current_syntax == 'python'
normal I#
elseif b:current_syntax == 'asm' || b:current_syntax == 'vim'
normal I"
elseif b:current_syntax == 'java'
normal I//
endif
endfor

Вначале смотрим, определился ли синтаксис (наличие переменной b:current_syntax). Если синтаксис не определился, выходим из скрипта с ошибкой "Данный синтаксис не обрабатывается". Далее определяем первую (line("'<")) и последнюю (line("'>"))строку блока. В цикле устанавливаем курсор на очередную строку блока (execute nom_line) и проверяем синтаксис текущей строки. В зависимости от языка пишем в начале строки нужный символ комментария. Например, для Java - //.
Код элементарный, и читатель, если не найдет здесь комментариев для языка, на котором работает, может легко его модифицировать.

Для отмены комментария переходим снова в визуальный блочный режим, выделяем закомментированные строки и нажимаем Del:

vnoremap <Del> <Del>i

  1. 3. 2. Сокращения

    Смысл сокращений в том, чтобы закодировать длинные или часто повторяющиеся строки текста с помощью какого-то буквосочетания. Затем в тексте мы можем набрать это своё сочетание и получить в редактируемом файле нужную строку.

    Разбираем плагин ~/.vim/plugin/abbrev.vim.

autocmd FileType java iabbrev main public static void main(String[] args) {
autocmd FileType java iabbrev ppp System.out.print
autocmd FileType ruby iabbrev get get '/' do end

Он, как и все плагины из каталога ~/.vim/plugin, срабатывает каждый раз при старте редактора; это как бы продолжение ~/vimrc.
Для пример разберем первую строку плагина.
autocmd FileType java - обработка события "Тип файла java". В этом случае срабатывает сокращение в режиме вставки (iabbrev) и слово main заменяется на строку public static void main(String[] args) {
В редакторе, чтобы это сокращение сработало, набираем main+пробел (или Enter).

Продолжение следует.