|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Artem Chuprina 2:5020/400 11 Apr 2003 12:32:05 To : Dmitry Pyzhov Subject : Re: vim + fido quoting -------------------------------------------------------------------------------- Здравствуй, Dmitry Pyzhov. DP> Как вим научить понимать фидошный квотинг? Чтоб при разбитии строки на две DP> в новой автоматом прописывались инициалы, а при слиянии - удалялись... DP> Короче - чтоб редактирование было как в голделе :) Если к gvim ещё и цвето- DP> выделение фидошное можно прикрутить, то вообще здорово. ==== 8< [.vim/ftplugin/mail.vim] ==== if exists("b:did_ftplugin") finish endif source $VIMRUNTIME/ftplugin/mail.vim setlocal textwidth=78 formatoptions=tcrqn2 function! CiteOriginal (...) abort if a:0 && match(a:1, '\<keep_headers\>') != -1 let keep_headers = 1 endif let word_char = '[[:alnum:]]' let non_word_char = '[^[:alnum:]]' let quote_element = word_char . '\{1,9}>' let &comments = "n:>" let l = 1 let is_followup = 0 let is_reply = 0 let newsgroup = '' " skip our header while strlen(getline(l)) let line = getline(l) if line =~? '^references:' let is_followup = 1 elseif line =~? '^in-reply-to:' let is_reply = 1 elseif line =~? '^\(x-\)\=newsgroups:' let newsgroup = matchstr(line,'\S\+$') endif let l = l+1 endwhile let l = l+1 while (l<=line('$') && !strlen(getline(l))) let l = l+1 endwhile " analyze and handle original header let body_start = l let b:from_name = '' let b:to_name = '' let b:from_addr = '' let b:initials = '' let citing=0 if (getline(body_start) =~ '^[A-Za-z-]\+:') let citing=1 exe body_start while strlen(getline(l)) let line = getline(l) if ! strlen(b:from_addr) \&& line =~? '^from:.*<\S\+@[A-Za-z0-9.-]\+>' let b:from_addr = matchstr(line,'<\S\+@[A-Za-z0-9.-]\+>') let b:from_addr = strpart(b:from_addr,1,strlen(b:from_addr)-2) let b:from_name = matchstr(line,':[^<]\+') let b:from_name = strpart(b:from_name, \matchend(b:from_name,'^:\s*["'."'".']\='), \strlen(b:from_name)) let b:from_name = strpart(b:from_name,0, \match(b:from_name,'["'."'".']\=\s*$')) elseif ! strlen(b:from_addr) \&& line =~? '^from:\s*\S\+@[A-Za-z0-9.-]\+\s*(.*)' let b:from_addr = matchstr(line,'\S\+@[A-Za-z0-9.-]\+') let b:from_name = matchstr(line,'(.*)') let b:from_name = strpart(b:from_name,1,strlen(b:from_name)-2) elseif ! strlen(b:to_name) \&& line =~? '^\(x-comment-\)\=to:.*<\S\+@[A-Za-z0-9.-]\+>' let b:to_name = matchstr(line,':[^<]\+') let b:to_name = strpart(b:to_name, \matchend(b:to_name,'^:\s*["'."'".']\='), \strlen(b:to_name)) let b:to_name = strpart(b:to_name,0, \match(b:to_name,'["'."'".']\=\s*$')) elseif ! strlen(b:to_name) && \line =~? '^\(x-comment-\)\=to:\s*\S\+@[A-Za-z0-9.-]\+\s*(.*)' let b:to_name = matchstr(line,'(.*)') let b:to_name = strpart(b:to_name,1,strlen(b:to_name)-2) endif let l = l+1 endwhile let b:initials = substitute(b:from_name,'.\{-}\<\(.\).\{-}\>','\1','g') let b:initials = substitute(b:initials,non_word_char.'*','','g') if !strlen(b:initials) let b:initials = matchstr(b:from_addr,'^'.word_char.'*') endif let body_header_end = l endif let l = line('$') while l >= body_start let line = getline(l) if citing if line == '-- ' execute l.',$d s' let l = l-1 continue elseif line =~ '^[ \t>]*'.quote_element let line = substitute(line,'>','>>','') else let line = b:initials.'> '.line endif call setline(l,line) endif let line_len = strlen(line) let prefix = matchstr(line,'^[ \t>]*'.quote_element) while strlen(prefix) let line = strpart(line,strlen(prefix),line_len) let prefix = substitute(prefix,'^[ \t>]*','','') if match(&comments,':'.prefix.'\($\|,\)') < 0 let &comments = &comments.',n:'.prefix endif let prefix = matchstr(line,'^[ \t>]*'.quote_element) endwhile if citing && line =~ '^\s*$' call setline(l,'') endif let l = l-1 endwhile if exists("body_header_end") && (!exists("keep_headers") || !keep_headers) execute body_start.','.body_header_end.' d h' endif if citing if strlen(b:from_name) call append(body_start-1,'') call append(body_start-1,'Здравствуй, '.b:from_name.'.') endif call append(line('$'),'') call append(line('$'),'-- ') $r ~/.signature exec body_start+2 else exec body_start-2 endif normal zb endfunction ==== >8 [.vim/ftplugin/mail.vim] ==== Оно, правда, делает несколько больше, чем надо... Hо не я же буду выкусывать лишнее для _тебя_? А что ты понимаешь под фидошным цветовыделением? Свое почтовое у него работает весьма неплохо, если б еще не идиотская манера голого деда делать цитате горизонтальный отступ. Лечится исправлением соответствующего места в системном mail.vim на syn match mailQuoted1 "^\s*\([[:alpha:]]\+>\|[]|}>]\).*$" syn match mailQuoted2 "^\(\s*\([[:alpha:]]\+>\|[]|}>]\)\)\{2}.*$" syn match mailQuoted3 "^\(\s*\([[:alpha:]]\+>\|[]|}>]\)\)\{3}.*$" syn match mailQuoted4 "^\(\s*\([[:alpha:]]\+>\|[]|}>]\)\)\{4}.*$" syn match mailQuoted5 "^\(\s*\([[:alpha:]]\+>\|[]|}>]\)\)\{5}.*$" syn match mailQuoted6 "^\(\s*\([[:alpha:]]\+>\|[]|}>]\)\)\{6}.*$" -- Artem Chuprina RFC2822: <ran@ran.pp.ru>, FIDO: 2:5020/122.256, ICQ: 13038757 --- ifmail v.2.15dev4 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/1147790ad4e80.html, оценка из 5, голосов 10
|