Gentoo Archives: gentoo-user-ru

From: Alex Efros <powerman@×××××××.ua>
To: gentoo-user-ru@l.g.o
Subject: Re: [OBORONA-SPAM] [gentoo-user-ru] vim
Date: Fri, 13 May 2005 16:48:03
Message-Id: 20050513164758.GB28873@home.power
In Reply to: [gentoo-user-ru] vim by Ivanov Maxim
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

Replies

Subject Author
Re: [OBORONA-SPAM] [gentoo-user-ru] vim "Alex P. Burlutsky" <stosem@××××××.ru>
Re: [OBORONA-SPAM] [gentoo-user-ru] vim Alex Efros <powerman@×××××××.ua>