1 |
Hi! |
2 |
|
3 |
On Fri, May 13, 2005 at 07:46:58PM +0400, Ivanov Maxim wrote: |
4 |
> Есть ли курс молодого бойца по vim? все говорят что жутко удобен, а я |
5 |
> оттуда только выйти могу =) |
6 |
|
7 |
Да, знакомая ситуация. Я когда-то себя с трудом заставил-таки с vim |
8 |
разобраться... и не пожалел! Такая цаца!! :) BTW, я не пытаюсь начать |
9 |
флейм Vim VS EMACS, я просто говорю что МНЕ нравится Vim, причём весьма! :) |
10 |
|
11 |
Кстати, раз уж поднялась такая тема, может обменяемся инфой кто чего |
12 |
интересного в Vim нарыл и настроил себе..? Новичкам тоже полезно будет. |
13 |
|
14 |
Я использую плагины (вытянутые с vim.org): |
15 |
feraltogglecommentify - (рас)комментирование текста |
16 |
foldutil - создание fold-ов вручную по regexp |
17 |
transvim - подключение англ-рус словаря |
18 |
vimspell - проверка правописания англ/рус |
19 |
Некоторые плагины патчил сам, патчи авторам практически все отсылал, так |
20 |
что не знаю, может уже на vim.org версии этих плагинов с моими патчами. |
21 |
В любом случае, если кому мои патчи понадобятся - я их сюда могу |
22 |
запостить отдельно. |
23 |
Ещё весьма любопытный плагин - vimDebug, позволяет сделать из Vim что-то |
24 |
очень напоминающее DOC-овский TurboDebugger, только для разных языков, |
25 |
perl, например. :) Но его довести до ума пока руки не дошли. |
26 |
|
27 |
Ну и самое главное - мой ~/.vimrc: |
28 |
---cut--- |
29 |
" Summary: |
30 |
" * Разные настройки |
31 |
" * Проверка правописания |
32 |
" * MySQL-ные cловари |
33 |
" * За|Рас-комментирование # <C-c> <M-3> |
34 |
" * Переключение между файлами <Tab>, <S-Tab> |
35 |
" * Дописывание слов (INSERT) <Tab>, <S-Tab> |
36 |
" * Сохранение <F2> |
37 |
" * Вкл/Выкл вставку as-is <F4> |
38 |
" * Перекодирование между KOI<->WIN<->DOS <F6> |
39 |
" * Регулярные выражения perl (поиск) <F7>, <S-F7> |
40 |
" * Проверка на ошибки perl-скрипта <F8>, <F9> |
41 |
" * Выход (если файл записан) <F10> |
42 |
" * Подсветка синтаксиса |
43 |
" * Подсветка синтаксиса для perl |
44 |
" * Почта |
45 |
" * Настройка типов файлов для подсветки |
46 |
" * Transparent editing of gpg encrypted files |
47 |
" * Аббревиатура: вставка даты/времени. |
48 |
" TODO perldoc для модулей и функций по <F1> |
49 |
" TODO Проверка правописания: |
50 |
" - пофиксить тормоза при вставке большого куска текста |
51 |
" - сделать одновременную поддержку и русского и английского |
52 |
" TODO Выделение текста через Shift+Arrows в NORMAL и INSERT -режимах. |
53 |
" - Shift+ArrowLeft / Right Select text, by character |
54 |
" - Shift+ArrowUp / Down Select text, by line up / down |
55 |
" - Shift+Home / End Select text, to beginning / end of line |
56 |
" - Shift+PageUp / PageDown Select text, to top / bottom of screen |
57 |
" - Ctrl+Shift+ArrowLeft / Right Select text, by word left / right |
58 |
" - Ctrl+Shift+ArrowUp / Down Move to top / bottom of selection |
59 |
" - Ctrl+Shift+Home / End Select text, to beginning / end of document |
60 |
" TODO Ctrl+Up/Down скроллирование текста без смещения курсора. |
61 |
" TODO Работа с tags по Alt+Arrows |
62 |
" TODO Визуальный отладчик через perl -d |
63 |
|
64 |
"set t_ve=[?25h[?18;240;255c " white on black |
65 |
"set t_ve=[?25h[?18;48;255c " white on red |
66 |
"set t_ve=[?25h[?18;95;255c " black on green |
67 |
"set t_ve=[?25h[?17;95;255c " black on green |
68 |
""" Разные настройки (все переменные комментировать лень, так что - :help) |
69 |
set nobackup |
70 |
set shiftwidth=4 |
71 |
set tabstop=8 |
72 |
set softtabstop=4 |
73 |
set nohlsearch |
74 |
set incsearch |
75 |
set nowrap |
76 |
set lcs=eol:$,extends:~ |
77 |
set sidescroll=1 |
78 |
set wildmenu |
79 |
set langmap=йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХ ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ;qwertyuiop[]asdfghjkl\;'zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<> |
80 |
set showcmd |
81 |
set formatoptions=croql |
82 |
set comments-=:% |
83 |
" Есть два варианта indent-а: 'filetype' и 'smart', включать можно один из них |
84 |
" filetype indent on |
85 |
set smartindent |
86 |
" Во избежание потенциальных проблем с безопасностью |
87 |
set modelines=0 |
88 |
" Поиск tags везде где дотянусь! |
89 |
set tags=tags,./tags,./.tmp/tags,./.lib/.tmp/tags,./../.tmp/tags,./../.lib/.tmp/tags,./../../.lib/.tmp/tags |
90 |
|
91 |
""" Проверка правописания (нужен PLUGIN vimspell + мои патчи) |
92 |
"let spell_auto_type = "mail,text,none,note" |
93 |
let spell_auto_type = "mail" |
94 |
let spell_executable = "aspell" |
95 |
let spell_language_list = "english,russian" |
96 |
let spell_markup_ft = ",html,php,xhtml,dtml,tex,mail,note," |
97 |
" эти переменные будут правильно работать только вместе с vimspell-enru.patch ! |
98 |
let spell_russian_iskeyword = "@,48-57,_,192-255,^a-z,^A-Z" |
99 |
let spell_english_iskeyword = "@,48-57,_,192-255,^192-255" |
100 |
|
101 |
|
102 |
|
103 |
""" MySQL-ные cловари (нужен PLUGIN transvim + мои патчи) |
104 |
let g:trv_grep = "asdfDict" |
105 |
let g:trv_grepOptions = " -t 'English->Russian' -t 'Russian->English' -- " |
106 |
let g:trv_dictionary = "" |
107 |
|
108 |
|
109 |
|
110 |
""" Настройка кнопок для plugin/feraltogglecommentify.vim |
111 |
nmap # <Plug>FtcTc |
112 |
vmap # <Plug>FtcTc |
113 |
nmap 3 :CC<CR>j |
114 |
vmap 3 :CC<CR>j |
115 |
imap 3 <esc>:CC<CR>ji |
116 |
"nmap <M-#> :UC<CR>j |
117 |
"vmap <M-#> :UC<CR>j |
118 |
"imap <M-#> <esc>:UC<CR>ji |
119 |
imap <C-c> <esc><Plug>FtcDLAC i |
120 |
|
121 |
|
122 |
|
123 |
""" Одновременная работа с несколькими файлами (buffer-ы) |
124 |
set hidden |
125 |
nnoremap <Tab> :bnext<CR> |
126 |
nnoremap <S-Tab> :bprevious<CR> |
127 |
|
128 |
|
129 |
|
130 |
""" Дописывание текущего слова по <Tab> (<Shift>+<Tab> для перебора вариантов |
131 |
""" в обратном порядке). |
132 |
function! InsertTabWrapper(direction) |
133 |
let col = col('.') - 1 |
134 |
if !col || getline('.')[col - 1] !~ '\k' |
135 |
return "\<tab>" |
136 |
elseif "backward" == a:direction |
137 |
return "\<c-p>" |
138 |
else |
139 |
return "\<c-n>" |
140 |
endif |
141 |
endfunction |
142 |
|
143 |
imap <Esc>[Z <S-Tab> |
144 |
inoremap <Tab> <c-r>=InsertTabWrapper("backward")<cr> |
145 |
inoremap <S-Tab> <c-r>=InsertTabWrapper("forward")<cr> |
146 |
|
147 |
|
148 |
|
149 |
""" Сохранение <F2> |
150 |
nmap <F2> :w<CR> |
151 |
vmap <F2> <ESC>:w<CR> |
152 |
imap <F2> <ESC>:w<CR>i<Right> |
153 |
cmap <F2> <Esc><Esc>:w<CR> |
154 |
|
155 |
|
156 |
|
157 |
""" Вкл/Выкл вставку as-is <F4> |
158 |
set pastetoggle=<F4> |
159 |
|
160 |
|
161 |
|
162 |
""" Перекодирование файла между русскими кодировками. Кодировки выбираются |
163 |
""" через меню. Вызов меню по <F6>. |
164 |
set wcm=<Tab> |
165 |
menu Encoding.Win->Koi :%!recode WIN KOI -<CR> |
166 |
menu Encoding.Koi->Win :%!recode KOI WIN -<CR> |
167 |
menu Encoding.Dos->Koi :%!recode DOS KOI -<CR> |
168 |
menu Encoding.Koi->Dos :%!recode KOI DOS -<CR> |
169 |
menu Encoding.Win->Dos :%!recode WIN DOS -<CR> |
170 |
menu Encoding.Dos->Win :%!recode DOS WIN -<CR> |
171 |
map <F6> :emenu Encoding.<TAB> |
172 |
|
173 |
|
174 |
|
175 |
""" Поиск в текущем окне по perl-овскому регулярному выражению. |
176 |
""" Выражение вводится в виде /regexhere/si или !regexhere! и т.п. |
177 |
""" В выражении можно использовать $t как сокращение для [^>]*>\s* |
178 |
""" Для того, чтобы помимо установки курсора на начало совпадения текст |
179 |
""" совпадения был выделен цветом нужно раскомментировать VIM::DoCommand() |
180 |
""" и настроить цвет в строке 'hi perlre ...' |
181 |
""" Для поиска от курсора нажать <F7>. Для повторного поиска <F7><Enter>. |
182 |
hi perlre ctermbg=white ctermfg=blue |
183 |
function! PerlSearch() |
184 |
perl <<EOF |
185 |
sub getxy { |
186 |
(my $s=substr($_[0],0,$_[1]))=~/.*\n/s; |
187 |
(1+($s=~tr/\n//), $_[1]-$+[0]) |
188 |
} |
189 |
sub re_start_end { |
190 |
my $buf=join("\n",$curbuf->Get(1..$curbuf->Count())); |
191 |
my($y,$x)=$curwin->Cursor(); |
192 |
$y--; $x++; |
193 |
$buf=~/(?:.*\n){$y}.{$x}/g; |
194 |
return unless $buf=~/($_[0])/g; |
195 |
my ($s,$e)=($-[0],$+[0]-1); |
196 |
$e-- if substr($buf,$e,1) eq "\n"; |
197 |
getxy($buf,$s), getxy($buf,$e) |
198 |
} |
199 |
$PerlSearch::regex = VIM::Eval('input("=~ ","'."\Q$PerlSearch::regex\E".'")'); |
200 |
my $t = qr/[^>]*>\s*/; |
201 |
return VIM::Msg("No matches found","Error") |
202 |
unless my @c = re_start_end(eval 'qr'.$PerlSearch::regex); |
203 |
#VIM::DoCommand('match perlre /\%'.$c[0].'l\%'.($c[1]+1).'c\_.*'. |
204 |
# '\%'.$c[2].'l\%'.($c[3]+2).'c/'); |
205 |
@PerlSearch::c = @c; |
206 |
$curwin->Cursor($c[0],$c[1]); |
207 |
EOF |
208 |
endfunction |
209 |
nnoremap <F7> :call PerlSearch()<cr> |
210 |
|
211 |
" Передвижение курсора между началом совпадения perl-овского регулярного |
212 |
" выражения и концом совпадения (Shift+F7) |
213 |
function! PerlSearchSE() |
214 |
perl <<EOF |
215 |
@PerlSearch::c = @PerlSearch::c[2,3,0,1]; |
216 |
$curwin->Cursor($PerlSearch::c[0],$PerlSearch::c[1]); |
217 |
EOF |
218 |
endfunction |
219 |
nnoremap <S-F7> :call PerlSearchSE()<cr> |
220 |
|
221 |
|
222 |
|
223 |
""" Проверка на ошибки perl-скрипта <F9> (все окна vi записываются на диск) |
224 |
""" Переход к следующей ошибке <F8> |
225 |
set makeprg=$VIMRUNTIME/tools/efm_perl.pl\ -c\ %\ $* |
226 |
set errorformat=%f:%l:%m |
227 |
set autowrite |
228 |
nnoremap <F9> :make<cr> |
229 |
nnoremap <F8> :cnext<cr> |
230 |
|
231 |
|
232 |
|
233 |
""" Выход (если файл записан) <F10> |
234 |
nmap <F10> :qa<CR> |
235 |
vmap <F10> <Esc>:qa<CR> |
236 |
imap <F10> <Esc>:qa<CR> |
237 |
cmap <F10> <Esc><Esc>:qa<CR> |
238 |
|
239 |
|
240 |
|
241 |
""" Подсветка синтаксиса |
242 |
hi Normal ctermbg=4 cterm=NONE ctermfg=7 |
243 |
" hi Comment ctermbg=NONE cterm=NONE ctermfg=6 |
244 |
hi Comment ctermbg=0 cterm=NONE ctermfg=6 |
245 |
hi Constant ctermbg=NONE cterm=bold ctermfg=3 |
246 |
hi Special ctermbg=NONE cterm=bold ctermfg=5 |
247 |
hi Identifier ctermbg=NONE cterm=bold ctermfg=2 |
248 |
hi Statement ctermbg=NONE cterm=bold ctermfg=7 |
249 |
hi PreProc ctermbg=0 cterm=bold ctermfg=5 |
250 |
" hi Type |
251 |
" hi Ignore |
252 |
" hi Error |
253 |
" hi Todo |
254 |
hi NonText ctermbg=NONE cterm=NONE ctermfg=6 |
255 |
hi Underlined cterm=NONE ctermfg=7 |
256 |
|
257 |
|
258 |
|
259 |
""" Подсветка синтаксиса для perl |
260 |
" кавычки подсвечивать не как строку, а как if, while, ... |
261 |
let perl_string_as_statement=1 |
262 |
" подсвечивать имя пакета |
263 |
let perl_want_scope_in_variables=1 |
264 |
" @{ $qwe{asd}[123] } |
265 |
let perl_extended_vars=1 |
266 |
" метод подсвечивать как обычную функцию, а не как продолжение переменной |
267 |
hi perlMethod ctermfg=gray |
268 |
" ключи хешей подсвечивать как переменные, а не как строки |
269 |
hi! def link perlVarSimpleMemberName perlIdentifier |
270 |
" имена пакетов более блеклые |
271 |
hi perlType ctermfg=darkgreen |
272 |
|
273 |
|
274 |
|
275 |
""" Почта |
276 |
" при вводе письма перейти сразу на вторую пустую строку и в режим вставки |
277 |
au BufRead /tmp/mutt* /^$/|/^$/|set fo=tcrq|startinsert |
278 |
|
279 |
|
280 |
|
281 |
""" Выбор типа подсветки для 'странных' файлов по имени или первой строчке |
282 |
au BufNewFile,BufRead *.note set ft=note |
283 |
au BufNewFile,BufRead *.txt set ft=note |
284 |
au BufNewFile,BufRead *TODO* set ft=note |
285 |
au BufNewFile,BufRead *TechSpec* set ft=note |
286 |
au BufNewFile,BufRead *BUG* set ft=note |
287 |
au BufNewFile,BufRead *.opera/cache* set ft=html |
288 |
au BufNewFile,BufRead *.htmlt set ft=html |
289 |
au BufNewFile,BufRead *.html-* set ft=html |
290 |
" для *.t можно сразу ставить ft=perl, но для примера все сделано сложнее :-) |
291 |
au BufNewFile,BufRead *.t call FTCheck_cf() |
292 |
fun! FTCheck_cf() |
293 |
let line = getline(1) |
294 |
if line =~ '/perl' |
295 |
set ft=perl |
296 |
endif |
297 |
endfun |
298 |
|
299 |
|
300 |
|
301 |
" Transparent editing of gpg encrypted files. |
302 |
" By Wouter Hanegraaff <wouter@××××.net> |
303 |
" Folding permanence added by me. |
304 |
augroup encrypted |
305 |
au! |
306 |
|
307 |
" First make sure nothing is written to ~/.viminfo while editing |
308 |
" an encrypted file. |
309 |
autocmd BufReadPre,FileReadPre *.gpg set viminfo= |
310 |
" We don't want a swap file, as it writes unencrypted data to disk |
311 |
autocmd BufReadPre,FileReadPre *.gpg set noswapfile |
312 |
" Switch to binary mode to read the encrypted file |
313 |
autocmd BufReadPre,FileReadPre *.gpg set bin |
314 |
autocmd BufReadPre,FileReadPre *.gpg let ch_save = &ch|set ch=2 |
315 |
autocmd BufReadPost,FileReadPost *.gpg '[,']!gpg --decrypt 2> /dev/null |
316 |
" Switch to normal mode for editing |
317 |
autocmd BufReadPost,FileReadPost *.gpg set nobin |
318 |
autocmd BufReadPost,FileReadPost *.gpg let &ch = ch_save|unlet ch_save |
319 |
autocmd BufReadPost,FileReadPost *.gpg execute ":doautocmd BufReadPost " . expand("%:r") |
320 |
|
321 |
" Save&Restore folding |
322 |
autocmd BufReadPost,FileReadPost *.gpg loadview |
323 |
autocmd BufWritePre,FileWritePre *.gpg mkview |
324 |
|
325 |
" Convert all text to encrypted text before writing |
326 |
autocmd BufWritePre,FileWritePre *.gpg '[,']!gpg --default-recipient-self -ae 2>/dev/null |
327 |
" Undo the encryption so we are back in the normal text, directly |
328 |
" after the file has been written. |
329 |
autocmd BufWritePost,FileWritePost *.gpg u |
330 |
|
331 |
autocmd BufWritePost,FileWritePost *.gpg loadview |
332 |
augroup END |
333 |
|
334 |
|
335 |
|
336 |
" Вставлять дату/время. |
337 |
abbr DATE <c-r>=strftime("%d/%m/%y %H:%M:%S")<CR> |
338 |
abbr DATEen <Esc>:let lc_time_=v:lc_time<CR>:language time C<CR>i<c-r>=strftime("%a %b %d %X %Z %Y")<CR><Esc>:execute "language time " . lc_time_<CR>:unlet lc_time_<CR>a |
339 |
func Eatchar(pat) |
340 |
let c = nr2char(getchar()) |
341 |
return (c =~ a:pat) ? '' : c |
342 |
endfunc |
343 |
au BufNewFile,BufRead *.html call HTML_Abbr() |
344 |
fun! HTML_Abbr() |
345 |
iabbr <buffer> <A <A HREF=""></A><Left><Left><Left><Left><Left><Left><C-R>=Eatchar('\s')<CR> |
346 |
endfun |
347 |
|
348 |
""" Пример определения шаблона для нового файла |
349 |
" au BufNewFile *.pl 0r ~/.skeleton.pl |
350 |
|
351 |
|
352 |
|
353 |
" эти настройки нужны для того, чтобы работало быстрое открывание |
354 |
" perl-модулей при нажатии чего-то на строке типа 'use POWER::lib;' |
355 |
" но это должно делаться как-то автоматом, может через filetype indent on ? |
356 |
|
357 |
" include=\<\(use|require\)\s* |
358 |
" includeexpr=substitute(substitute(v:fname,'::','/','g'),'$','.pm','') |
359 |
" iskeyword=48-57,_,A-Z,a-z,: |
360 |
" define=[^A-Za-z_] |
361 |
|
362 |
|
363 |
" Пример использования perl: |
364 |
" |
365 |
" First, a customizable word count |
366 |
" :perl $count = 0 |
367 |
" :perldo $count += split /[;_<> ]/, $_ |
368 |
" :perl VIM::Msg($count) |
369 |
" |
370 |
" Then, a special sorting routine, getting text from the editor's current |
371 |
" buffer and writing back to it: |
372 |
" :perl @lines = sort {$a <=> $b} $curbuf->Get(1 .. 15) |
373 |
" :perl $curbuf->Set(1, @lines) |
374 |
" |
375 |
" Or, in short, |
376 |
" :perl $curbuf->Set(1, sort {$a <=> $b} $curbuf->Get(1 .. 15)) |
377 |
|
378 |
|
379 |
" сворачивать perl-процедуры (подглюкивает на моих клозурах) |
380 |
" let perl_fold=1 |
381 |
---cut--- |
382 |
|
383 |
Упоминающаяся в .vimrc прога "asdfDict" это мой скрипт для поиска слов в |
384 |
агнл/рус базе MySQL, могу запостить если кому любопытно, но transvim |
385 |
рассчитан на работу с любыми словарями - хоть через grep - RTFM, в общем. |
386 |
|
387 |
-- |
388 |
WBR, Alex. |
389 |
|
390 |
-- |
391 |
gentoo-user-ru@g.o mailing list |