[Desktop] [JT] Re: консольный текстовый редактор

Michael Shigorin =?iso-8859-1?q?mike_=CE=C1_osdn=2Eorg=2Eua?=
Вс Июн 3 21:22:07 MSD 2007


On Sun, Jun 03, 2007 at 07:23:37PM +0300, Yura Kalinichenko wrote:
> > Тут сложная ситуация: если человеку сразу подсунуть mc или
> > joe, он обычно остаётся удовлетворён их возможностями даже
> > тогда, когда из-за плеча прекрасно видно огромные потери
> > времени при их использовании (в смысле когда оно у человека
> > уже стоит дорого).
> Миш, не обижай мой любимый joe, ставя его в один ряд с mcedit.

Э... согласен, поспешил стукнуть "отправить", не перечитав
получившуюся сумму.

> Не знаю уж у кого и когда из-за плеча ты видел потери времени
> при его использовании, но IMHO это возможно в одном из случаев:

Тут подразумевался как раз mcedit у _очень_ опытных разработчиков 
в количестве навскидку трёх...

> в конце концов - приведи аргументы: интересно было бы услышать
> - какая функциональность, имеющаяся, скажем, в vim - по твоему
> мнению отсутствует в joe.

См. аттач -- если покажешь, как такое сделать на joe, получишь
такой же удобный интерфейс к add_changelog в любимом редакторе
:-)

(мопед не мой, но активно пользуюсь, положив в ~/.vim/ftplugin/)

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

-- 
 ---- WBR, Michael Shigorin <mike на altlinux.ru>
  ------ Linux.Kiev http://www.linux.kiev.ua/
----------- следующая часть -----------
" Plugin to update the %changelog section of RPM spec files
" This is a combination of ideas and code from
" spec.vim by Gustavo Niemeyer <niemeyer на conectiva.com>
" spec_ftplugin.vim by Guillaume Rousse <rousse на ccr.jussieu.fr>
" and Sir Raorn <raorn на altlinux.ru>
" add_changelog utility by Dmitry V. Levin <ldv на altlinux.ru>
" Filename: spec_alt.vim
" Version: 0.0.1

if exists("b:did_altchangelog_ftplugin") | finish | endif

let b:did_altchangelog_ftplugin = 1

if !exists("no_plugin_maps") && !exists("no_spec_maps")
	if !hasmapto("<Plug>SpecAltChangelog")
		map <buffer> <LocalLeader>ac <Plug>SpecAltChangelog
	endif
endif

noremap <buffer> <unique> <script> <Plug>SpecAltChangelog :call <SID>SpecAltChangelog()<CR>

" Useful settings
setlocal makeprg=rpm\ -ba\ %
setlocal errorformat=error:\ line\ %l:\ %m
 
" Helper functions
function <SID>Date()
    let savelang = v:lc_time
    execute "language time C"
    let date = strftime("%a %b %d %Y")
    execute "language time " . savelang
    return date
endfunction

if !exists("*s:GetFirstLocation")
        " Return location of first line matching
	" the given pattern after the given line
        " Return -1 if not found at the end of the file
        function s:GetFirstLocation(from, pattern)
                let linenb = a:from
                while (linenb <= line("$"))
                        let linenb = linenb + 1
                        let linestr = getline(linenb)
                        if (linestr =~ a:pattern)
                                return linenb
                        endif
                endwhile
                return -1
        endfunction
endif

" Main function
if !exists("*s:SpecAltChangelog")
	function s:SpecAltChangelog()
		let line = 0
		let packager = system("rpm --eval %packager")
		" get rid of this !#&* trailing <NL>
		let packager = strpart(packager, 0, strlen(packager)-1)
		if packager == "%packager"
		          echomsg "Configuration error: undefined packager"
			  " Correct? Really exit?
			  exit
		endif
		let date = <SID>Date()
		let svr = system("rpm -q --qf '%|SERIAL?{%{SERIAL}:}|%{VERSION}-%{RELEASE}\n' --specfile ".expand("%")." |head -1")
		let svr = strpart(svr, 0, strlen(svr)-1)
		let full = "* ".date." ".packager." ".svr
		let chgline = <SID>GetFirstLocation(0, '^%changelog')
		if (chgline == -1)
			let option = confirm("Can't find %changelog. Create one? ","&End of file\n&Here\n&Cancel",3)
			if (option == 1)
				call append(line("$"),"")
				call append(line("$"),"%changelog")
				execute line("$")
				let chgline = line(".")
			elseif (option == 2)
				call append(line("."),"%changelog")
				normal j
				let chgline = line(".")
			endif
		endif
		if (chgline != -1)
			let insert_line = 0
			" TODO
			" echo "$spec: version \"$oldver\" unchanged, skipping"
			" like add_changelog do this
			" 
			" empty line just after chgline may break this
			" 
			" Really compare whole line, or only packager+svr?
			" The best variant - do this configurable
			if (getline(chgline+1) != full)
				call append(chgline, full)
				call append(chgline+1,"- ")
				call append(chgline+2,"")
				let insert_line = chgline+2
			else
				let line = chgline
				if !exists("g:spec_chglog_prepend")
					while !(getline(line+2) =~ '^\( *\|\*.*\)$')
						let line = line+1
					endwhile
				endif
				call append(line+1,"- ")
				let insert_line = line+2
			endif
			execute insert_line
			startinsert!
		endif
	endfunction
endif



Подробная информация о списке рассылки Desktop