Архив рубрики «vim»

vim: внешние фильтры

29.04.2010

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

Выполнение внешней команды на диапазоне:

  1. :{диапазон} ! {команда}

При этом на STDIN команды подается содержимое диапазона, а затем диапазон заменяется выводом STDOUT команды.

Несколько примеров.

Форматирование всего исходного текста на perl с помощью perltidy:

  1. :% ! perltidy -es=4 -t -st

Отфильтровать с помощью команды grep все строки, содержащие символ "#" из строк 14-24:

  1. :14,24 ! grep -v "\#"

vim: сортировка

20.04.2010

Сортировать в vim очень просто:

  1. :{диапазон}sort

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

  1. :'<,'>

Или для сортировки всего файла:

  1. :%sort

Сортировка в обратном порядке:

  1. :%sort!

Сортировка в прямом порядке, удаляя все дубликаты:

  1. :%sort -u

Также для сортировки можно использовать внешние утилиты, например стандартный юниксовый sort:

  1. :%!sort --numeric-sort --reverse

Ну и как обычно, читаем маны:

  1. :help :sort

vim: избавляемся от dos-овых концов строк (\r\n -> \n)

02.09.2009
  1. Если vim распознал dos-овые концы строк, и не показывает ^M,
    1. :set ff=unix
    2. :w

    Документацию по поводу опции fileformat почитать можно в разделе usr_23:

    1. :help usr_23
  2. Если vim автоматически не распознал DOS line ends, то в конце строк будут символы ^M. Удалить их можно простой заменой:
    1. :%s/^M//g

    Символ ^M при этом вводится как Ctrl-V Ctrl-M.

Unix: Поиск и замена во многих файлах одновременно

09.02.2009

Задача: найти все файлы содержащие OLDTEXT, и заменить OLDTEXT на NEWTEXT.

UPD2:Решение, предложенное ocehb:

  1. grep -rl OLDTEXT . | grep -Ev '(~|.o|.a)$' | grep -Ev '/.svn/' | xargs perl -i -pe "s/OLD_TEXT/NEW_TEXT/g;"

UPD1:Вариант без vim:

  1. grep -HR OLDTEXT ./ | awk '{print $1}' | sed 's/:.*$//' | grep -v '~' | sort | uniq | xargs perl -i -pe "s/OLD_TEXT/NEW_TEXT/g;"

Изначально предложенное решение с vim:

  1. grep -HR OLDTEXT ./ | awk '{print $1}' | sed 's/:.*$//' | grep -v '~' | sort | uniq | xargs vim -p

В открывшемся окне vim командуем:

  1. :tabdo %s/OLDTEXT/NEWTEXT/g

(заменить OLDTEXT на NEWTEXT во всех вкладках)

  1. :xa

(записать изменения во всех вкладках)
либо

  1. :qa!

(отменить изменения во всех вкладках)

Ссылки по теме:

  1. VIM FAQ
  2. Save all open buffers at once
  3. Сохранение файла без прав на запись в vim используя sudo
  4. [SLUG] Vim. Search and replace in multiple files

vim + paste: no indent

17.11.2008

При вставке через буфер обмена, vim автоматически табуляцией делает отбивку (indent). Это приводит к тому, что код теряет форматирование, выстраиваясь "лесенкой":

  1. MinSpareServers 5
  2.   MaxSpareServers 10
  3.   StartServers 10
  4.   MaxClients 500
  5.   MaxRequestsPerChild 3000
  6. Timeout 150
  7.   KeepAlive off
  8.   HostnameLookups off

Чтобы избежать ненужного форматирования, можно использовать пару параметров paste/nopaste:

  1. :set paste

... вставлям текст ...

  1. :set nopaste

vim tabs

01.10.2008

Открыть сразу несколько файлов в tab'ах в vim можно так:

~$ vim -p `find -type f -name '*.rb' -print0 | xargs -0 file -i | grep -v 'utf-8' | awk '{print $1}' | sed 's/://'`

(пример от Харитона, открываем в vim все ruby-файлы в кодировке, отличной от utf-8)
Здесь важен ключ -p: открыть файлы в табах.

Vim откроет столько буферов, сколько нашлось файлов, но не более tabpagemax, по умолчанию 10. Изменить количество табов можно в ~/.vimrc так:

set tabpagemax=15

При превышении tabpagemax новые табы не создаются, но навигировать по файлам все равно можно командами :next и :last.

Переключаться между табами можно командами: :tabnext, :tabprevious, :tablast, :tabfirst. Можно замапить из на горячие клавиши. Можно пользоваться горячими клавишами <C-PgUp> and <C-PgDown>.

Ещё полезное:
:tabn[ew] - открыть новый таб
:tabe[dit] [++opt] [+cmd] {file} - открыть файл в новом табе (типа :edit)
:tabf[ind] [++opt] [+cmd] {file} - найти файл в path и открыть в новом табе (типа :find)
CTRL-W gf - редактировать файл с именем, находящимся под курсором, в новом табе
CTRL-W gF - редактировать файл с именем, находящимся под курсором, в новом табе. Отмотать на строку которая указана после имени файла
:tabc[lose][!] - закрыть таб
:tabo[nly][!] - закрыть все табы кроме активного
:tabn[ext] (gt, <C-PageDown>) - переключиться на следующий таб
:tabp[revious] (:tabN[ext], gT) - на предыдущий таб
:tabr[ewind] (:tabfir[st]) - на первый таб
:tabl[ast] - на последний
:tabs - список табов
:tabm[ove] [N] - переместить текущий таб на место сразу за N-ым
:tabd[o] {cmd} - выполнить команду на каждом из табов (:tabdo %s/foo/bar/g)

Подробнее здесь - :help tabpage

Еще интересная фишка. Если переместить курсор на имя файла и нажать gf (go-to-file), то откроется альтернативный буфер с содержимым указанного файла. Старый файл как-бы пропадет из поля зрения. Однако на него можно быстро переключиться командой C-^, так же и обратно. Так удобно редактировать 2 файла одновременно.

По поводу полезных маппингов:
http://www.bygonesky.com/Programming/Settings/Vim/carlos.vim.html, смотреть начиная со 125-й строки.

vim: old-skool h0tkeyz

23.09.2008
  1.  
  2. " F2 = Save file
  3. map <silent> <f2> :write<cr>
  4. imap <silent> <f2> <esc>:write<cr>
  5.  
  6. " F10 = Exit without save
  7. map <silent> <f10> :quit<cr>
  8. imap <silent> <f10> <esc>:q<cr>
  9.  

VIM + Perl : .vimrc, perl-support

16.09.2008

Мой .vimrc + плагины (perl, tt2).

Для комфортной разработки на Perl рекомендуется также плагин perl-support .