Документация по ОС FreeBSD Пятница, 29.03.2024, 12:32
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Shell [40]

Главная » Статьи » Программирование » Shell

Переводы — Возвращение к Vim - Часть 1 [2010]
Я программист. Я работаю с текстовыми файлами по 6-12 часов в сутки, поэтому выбор текстого редактора для меня критичен. Если смена редактора увеличит эффективность моей работы хотя бы на 10%, значит я сэкономлю время и займусь чем-нибудь приятным.

Я не куплюсь на аргументы "90% времени ты думаешь, и только 10% - пишешь, поэтому редактор не имеет значения". Даже если утверждение верно, выводы - нет.

Если я думаю 10 минут, а потом начинаю писать, то хочу набирать текст как можно быстрее, чтобы вернуться к обдумыванию кода. Любое время, которое я трачу на набор текста — это перерыв, который я хочу сократить и думать дальше.

Недавно я стал использовать Vim как основной редактор. Я нашел много полезных постов вблогах, которые люди писали про Vim, и надеюсь, что этот пост тоже будет кому-то полезным.

Обо мне

Я пользовался исключительно Vim примерно с 2002 по 2005 год. Я никогда особо не читал о нем и использовал его, в основном, как всем известный nano.

В 2006 я решил, что пора что-то менять. Я хотел редактор, который "вписывается" в OS X. Некоторое время я пробовал SubEthaEdit, и это было круто. Совместное редактирование было отточено больше, чем в любом другом редакторе, который я когда-либо видел, хотя я его и применял не очень много.

Каким бы не был крутым SubEthaEdit, я всегда чувствовал, что есть еще лучше. Потом я нашелTextMate.

В то время я думал, что TextMate превосходен (и он действительно был таким). Он выглядел как приложения Mac. Изучить было очень просто (все команды для работы с текстом в OS X просто работали). А еще для него были расширения.

Изредка я все еще использовал Vim (например, когда нужно было что-то сделать, а в наличии была только машина с Windows), но в основном я был ребенком TextMate.

После четырех лет пользования TextMate-ом я решил что пришло время для еще одной перемены. Разработка на TextMate застопорилась, когда TextMate Forever (будущий TextMate 2) застопорился в разработке. Я задумался о Vim (и начал читать блоги других людей об опыте перехода на него) и решил дать ему еще один шанс.

Несколько месяцев назад я купил книгу Learning the vi and Vim Editors и, отказавшись от всех редакторов, начал разбираться с Vim, как основным. С того времени я не оглядывался назад.

Почему я перешел на TextMate

Как я уже говорил, я перешел на TextMate по нескольким причинам.

Прежде всего: он выглядит и работает как любое приложение OS X. Вы можете перетянуть файлы на иконку, чтобы открыть их, он поддерживает все стандартные команды OS X по работе с текстом, и выглядит так, как будто вписан в OS X. Я не знаю существовал ли MacVim в то время, но если и был, то я о нем ничего не знал.

Это важно. Усилия, необходимые для перехода на новый редактор, резко сократятся, если он будет поддерживать все плюшки операционной системы, которыми вы пользуетесь каждый день.

У него также есть энергичное сообщество людей, которые пишут расширения, так что TextMate поддерживал почти все, в чем я нуждался.

Почему я вернулся к Vim

Я вернулся к Vim по ряду причин.

Во-первых: Я начал читать, что могут редакторы, и многие нужные возможности, скорее всего, в ближайшее время, в TextMate ждать не стоило. Главным образом это касалось разделения окон. Я видел, как это работает, и сейчас, когда я использую эту функцию, я не могу представить, как можно обойтись без неё.

Другая причина — система контроля версий. С недавнего времени я храню свои конфиги в репозитории Mercurial, благодаря чему их легко переносить на новые машины. Vim использует конфигурацию из двух простых источников: простой файл ~/.vimrc и папка ~/.vim, где находятся текстовые файлы.

Текстовые конфиги и плагины Vim очень хорошо сочетаются с системой контроля версий. К ним удобно применять diff, в отличии от множества папок расширений в TextMate и ужасного XML.

Сообщество Vim существует значительно дольше, чем сообщество TextMate, так что доступен значительно более широкий набор плагинов, пакетов и файлов подсветки синтаксиса.

Люди любят работать с Vim и по другой причине: он работает везде. Да, это замечательно, что мой любимый редактор доступен, когда я подключаюсь к машине по SSH, но, если я не могу этого сделать, то не беда. Я почти всегда редактирую файлы на моей машине и затем загружаю автоматически при помощи скрипта (или как-нибудь иначе), так что редактирование на сервере редко бывает необходимо.

Основные отличия

На мой взгляд, Vim и TextMate сильно отличаются. Для чего-то большего, чем просто редактирование текста, в TextMate применяются, в основном, клавиатурные комбинации (использующие Shift, Ctrl, Cmd и Alt). С той же целью Vim использует идею "модального редактирования".

Философия TextMate, в основном, такая же, как в любом нормальном приложении OS X. Я уже говорил, что действуя как в ОС, уменьшается барьер вхождения в текстовый редактор. Так почему же я предпочёл философию Vim?

Сначала я должен дополнить: я не против того, чтобы изучать функции такого важного для меня приложения как текстовый редактор. Да, не напрягаться — это здорово, но я готов напрячься, если это сэкономит время в дальнейшем.

Назовем мою проблему с философией TextMate одним словом: "непрозрачность".

Если я хочу определить новую команду в плагине (или кто-то другой уже сделал это), нет уверенности, что я не перезапишу какую-нибудь другую команду, которую знают мои пальцы, но не помнит голова.

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

Режим вставки Vim означает, что, когда я редактирую текст, я использую обычные способы передвижения по тексту OS X, которые я знаю и люблю. Когда же я хочу сделать что-то особое, я вхожу в "нормальный" режим и не беспокоюсь о неизвестных командах (это можно сделать при помощи клавиши Vim "leader" ).

"Чувство" Vim

Нормальный режим в Vim имеет свое уникальное "чувство", которое я не видел ни в одном другом текстовом редакторе (хотя может E изменит это). Я слышал разные описания, и, думаю, никакая аналогия полностью не объяснит это, а вместе получается понятнее.

"Язык" редактирования текста

Чтобы понять команды нормального режима Vim надо думать о них, как о языке. У вас есть "глаголы" и "существительные". К примеру: команда "изменить" ("change" - c) будет глаголом, а "слово" ("word" - w) — существительным. Вы можете комбинировать их чтобы сформировать предложения, которые расскажут о том, что вы хотите сделать с текстом.

Самое замечательное в том, что, выучив новый глагол (как "удалить" ("delete" - d)), вы можете сразу применять его к существительным, которые знаете, и наоборот.

У Vim также есть "наречия", такие как "внутри" ("inside" - i) или "вокруг" ("around" - a), которые позволяют вам сочинять предложения "изменить внутри скобок" ("change inside parenthesis" - ci( или cib). Однажды выучив одно из них, вы можете сразу применять их ко всем глаголам и существительным, которые уже знаете.

Физика текста

Второй способ описать чувство Vim - это "физика". Это ещё менее конкретное описание, но, думаю, что оно будет полезно.

Если я бросаю в воздух шар для боулинга, он полетит так же, как и сэндвич с индейкой. Но вот эффект при приземлении может сильно отличаться при одинаковом действии.

Операторы/действия/глаголы Vim действуют так же. Эффект от daw сильно отличается от эффекта da{, но их можно понять при помощи простого принципа: da<что-то> удалит то, что находится около этого (delete around <что-то>).

"Программируйте" редактирование

Последнее, что я слышал о редактировании в Vim, было: "кажется, что ты программируешь текст".

Эту аналогию часто можно услышать от программистов (что очевидно), и, думаю, это не только их мнение.

Первое: базовые команды редактирования Vim могут быть похожи на вызовы функций. daw может быть представлена как запуск функции delete(type='word', around=True). Я не думаю таким образом (мне больше нравится пользоваться языковыми и физическими аналогиями), но другие поступают именно так.

Я не воспринимаю базовые команды vim как программирование и замечаю некоторые его аспекты в других областях. Например, я назначу на leader команду в моём файле ~/.vimrc:

nnoremap <leader>1 yypVr=

Я представляю это, как назначение на <leader>1 функции, которая выполнит следующие действия:
  • Скопировать текущую строку.
  • Вставить ниже (и затем переместиться на вставленную версию).
  • Выбрать скопированную строку.
  • Заменить все символы на =.
Другим более очевидным аспектом "программирования" Vim является создание макросов. Макросы — что-то вроде маленьких функций, которые вы создаёте для помощи в редактировании файла. Вы можете определять их, исполнять и даже редактировать их вставляя, изменяя и копируя.

Начало

Когда я вернулся к Vim, то сделал пару вещей, которые помогли мне в переходе.

Первое: я купил Learning the vi and Vim Editors и прочитал ее от корки до корки. Из этой книги я немного узнал историю Vim и научился основным командам редактирования в нем.

Также я просмотрел subreddit, в поисках хороших постов о переходе в блогах. Опыт тех, кто писал об этом, очень помог.

И наконец, самое главное: я перешел резко. Vim запускается на чем угодно, поэтому нет причин не сделать этого. В любой порядочной ОС есть версия Vim, в которой режим вставки "просто работает" для этой ОС (как gvim или MacVim), так что современный порог вхождения достаточно низок. 

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

Делаем Vim удобней

Один из недостатков Vim в том, что для удобства его нужно долго настраивать. По умолчанию в нем включена обратная совместимость с vi (т.е. с программной старше большинства современных студентов), которая не особо нужна.

Вот несколько вещей, которые я сделал, чтобы сделать Vim более удобным.

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

Важные строки в .vimrc

Я не буду объяснять каждую строку в моем ~/.vimrc, но вот несколько строк, без которых я просто не могу обойтись.

Первое, пару строк, которые должны быть у каждого:

filetype off
call pathogen#runtime_append_all_bundles()
filetype plugin indent on
set nocompatible
set modelines=0

Строки с filetype и call загружают Pathogen (подробнее о нем в описании расширений). Чтобы понять, почему тут первая строка с filetype смотрите документацию к Pathogen.

set nocompatible избавляет от всего хлама, который делает Vim совместимым с vi. 2010 год на дворе — хватит поддерживать совместимость в ущерб функциональности.

Кусок с modelines предотвращает некоторые дыры в безопасности, имеющие отношение к modelines в файлах. Я никогда не пользовался modelines, поэтому я не нуждаюсь в этой функциональности.

Потом я устанавливаю настройки табуляции:


set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab

Мне нравится, когда табы раскрываются в 4 пробела. Чтобы больше узнать об этих опциях, посмотрите этот Vimcast

Следующие пару параметров просто сделают вашу работу удобней:

set encoding=utf-8
set scrolloff=3
set autoindent
set showmode
set showcmd
set hidden
set wildmenu
set wildmode=list:longest
set visualbell
set cursorline
set ttyfast
set ruler
set backspace=indent,eol,start
set laststatus=2
set relativenumber
set undofile

Каждая из этих строк предназначена, в основном, для того, чтобы заставить Vim вести себя нормальным образом. Интересны последние две строки, обе используют функции, которые появились в Vim 7.3.

relativenumber изменяет столбец с номерами строк таким образом, чтоб он отображал номера строк, относительно текущей строки, вместо абсолютного номера строки.

Меня почти никогда не волнует номер строки, на которой я сейчас нахожусь (и если мне надо, я всегда могу увидеть его в статусной строке), поэтому я не скучаю по нормальной нумерации строк. Меня волнует как далеко находится нужная линия, потому что это говорит мне какое число нужно использовать в таких командах как d<ЧИСЛО>d. 

undofile указывает Vim, что нужно создавать файлы <FILENAME>.un~, когда вы редактируете файл. Эти файлы содержат информацию для отмены выполненных действий, так что вы сможете отменять действия даже после того как закроете и откроете файл.

Следующим я меняю клавишу :

let mapleader = ","

Мне проще набирать , чем \. Я использую leader-комманды постоянно, поэтому ее стоит сменить.

Следующее что я делаю, это ручной поиск/перемещение:

nnoremap / /\v
vnoremap / /\v
set ignorecase
set smartcase
set gdefault
set incsearch
set showmatch
set hlsearch
nnoremap <leader><space> :noh<cr>
nnoremap <tab> %
vnoremap <tab> %

Первые две строки исправляют сломанную по-умолчанию обработку регулярных выражений, автоматически вставляющую \v перед каждой строкой которую вы ищете. Это выключает в Vim сумасшедшие regex-символы и поиск использует нормальные. Я уже знаю Perl/Python-совместимое форматирование регулярных выражений, зачем мне учить другую схему?

ignorecase и smartcase вместе позволяют Vim использовать умный поиск. Если вы ищете строку, которая состоит только из прописных букв, то поиск будет регистро-независимым, но если один или больше символов в строке заглавные, то искать будет с учетом регистра. Чаще всего это то, что нужно.

gdefault применяет замены к строкам. К примеру, вместо: %s/foo/bar/g вы пишете просто:%s/foo/bar/. Это почти всегда соответствует желаемому (когда вы последний раз хотели заменить только первое вхождение слова в строке?). Для использования старого способа просто снова добавьте g.

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

Привязка <leader><space> позволяет легко очистить результаты поиска, набрав ,<space>. Это позволяет избавится от отвлекающей подсветки, когда нужное уже нашлось. 

Последние две строки позволяют клавишей Tab искать пары скобок. Я использую это для переключения. Нажимать <tab> в сто раз проще, чем набирать %.

Следующая часть заставляет Vim правильно обрабатывать длинные строки:

set wrap
set textwidth=79
set formatoptions=qrn1
set colorcolumn=85

Эти строки управляют моими настройками переноса строк и выделяют цветом столбец с 85 символом (длинная строка становится заметней).

Чтобы узнать больше смотрите :help fo-table и Vimcast по soft wrapping и hard wrapping.

Это должно понравится тем, кто перешел с TextMate:

set list
set listchars=tab:▸\ ,eol:¬

Это вынуждает Vim показывать непечатаемые символы так же, как их показывает TextMate. Возможно, вам понадобится настроить свою цветовую схему, чтобы они не сильно отвлекали. Этот Vimcast содержит больше информации.

Новые пользователи Vim захотят использовать следующие строки, чтобы научиться работать правильно:

nnoremap <up> <nop>
nnoremap <down> <nop>
nnoremap <left> <nop>
nnoremap <right> <nop>
inoremap <up> <nop>
inoremap <down> <nop>
inoremap <left> <nop>
inoremap <right> <nop>
nnoremap j gj
nnoremap k gk

Это отключит клавиши стрелочек в нормальном режиме, чтобы вы приучились пользоваться hjkl. Поверьте мне, вы хотите научиться использовать hjkl. Долгая игра в Nethack также помогает.

Они также отключают стрелочки в режиме вставки, чтобы заставить вас переходить в нормальный режим, как только вы заканчиваете вставлять текст. Это "правильный путь" при работе с редактором. 

Также это заставляет j и k делать то, что вы ждете от них, а не работать в каком-то архаичном "движение по строкам файла, вместо строк экрана" стиле.

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

inoremap <F1> <ESC>
nnoremap <F1> <ESC>
vnoremap <F1> <ESC>

Мне нравится чтобы ; делало то же, что и : — это избавит еще от одного нажатия клавиши, когда я хочу сохранить файл:

nnoremap ; :

Я не переназначаю : на ; потому что это, кажется, мешает куче плагинов.

Наконец, мне очень нравится в TextMate функция "сохранить при потере фокуса". Я не припомню случая, когда я не хотел сохранить файл, после переключения на другое окно (особенно с контролем версий и бесконечным undo в Vim):

au FocusLost * :wa

Это самые важные куски моего ~/.vimrc. Дальше я раскажу о раздолье для настроек, которым в Vim является клавиша <leader>.

Это первая часть перевода.
Оригинал
Переведено при помощи сервиса translated.by инициативной группой переводчиков welinux при участии пользователей  settler Shtsh Zereal blackraven.


Источник: http://welinux.ru/post/4428/
Категория: Shell | Добавил: oleg (24.11.2010) | Автор: settler
Просмотров: 872 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024