Autor | Zpráva | ||
---|---|---|---|
imploder Profil |
#1 · Zasláno: 20. 8. 2009, 10:46:45 · Upravil/a: imploder
V poslední době jsem si zvykl používat na editaci souborů gvim. U HTML a CSS jsem ale narazil oproti jiným editorům (např. PSPad) na problém: jak vkládat a měnit barvy. Zkusil jsem rozšíření colorsel.vim - vypadá takhle:
ale je celkem naprd, protože když ho vyvolám nad HEX kódem barvy, tak se podle něj nenastaví, a posuvníky nejdou ovládat myší. Ví někdo o lepším řešení - aby to z gvimu vytáhlo barvu, ukázalo, umožnilo změnit a pak změněnou do gvimu vrátilo, jak to funguje u jiných editorů ? |
||
TomášK Profil |
#2 · Zasláno: 20. 8. 2009, 16:06:36 · Upravil/a: TomášK
Podám to i s příběhem :) Problém mě zaujal, usoudil jsem, že něco takového by bylo docela užitečné. Ten plugin jsem zkusil a považuju ho za nepoužitelný. Dřív jsem čas od času nahlédnul do zdrojáku nějakého pluginu, ale zatím jsem nic vlastního nevytvořil, usoudil jsem, že ja na čase to změnit a zbastlil jsem s pomocí googlu za dvě hodiny skript, který mi po stisknutí <c-a> nad slovem označujícím barvu "#ffaa00", "#fa0", "red" otevře gnome-color-chooser nastavený na danou barvu a po vybrání nahradí stávající slovo hex kódem vybrané barvy.
Nepochybně by to šlo udělat lépe - neumím třeba přímo ve skriptu vzít označené slovo, tak to řeším oklikou přes mapování, ale u mě to funguje (pouze v gvimu, ve vimu to nezavře dialog). Snad to budepoužitelné. Netuším, co všechno to potřebuje - na mém ubuntu to fungovalo bez instalace něčeho dalšího, pod windows bych tomu moc nevěřil :) Tento zdrojový kód mám v ~/.vim/ftplugin/css.vim: function! ColorChooser(color) python << endpython import vim import gtk, sys color = vim.eval("a:color") def tohex(c): #Convert to hex string #little hack to fix bug s = ['#',hex(int(c[0]*256))[2:].zfill(2),hex(int(c[1]*256))[2:].zfill(2),hex(int(c[2]*256))[2:].zfill(2)] for item in enumerate(s): if item[1]=='100': s[item[0]]='ff' return ''.join(s) csd = gtk.ColorSelectionDialog('Gnome Color Chooser') cs = csd.colorsel cs.set_has_opacity_control(True) cs.set_current_alpha(65536) cs.set_current_color(gtk.gdk.color_parse(color)) if csd.run()!=gtk.RESPONSE_OK: print 'No color selected.' else: csd.destroy() c = cs.get_current_color() hexcolor = tohex((c.red/65536.0, c.green/65536.0, c.blue/65536.0)) vim.command("return '%s'" % hexcolor) # return from the Vim function! endpython endfunction map <c-a> <esc>BvEdi<c-r>=ColorChooser(@*)<cr><esc> A inspiraci jsem čerpal především odtud: http://www.ibm.com/developerworks/linux/library/l-vim-script-1/ - základy skriptování ve vimu http://orestis.gr/blog/2008/08/10/scripting-vim-with-python/ - návod jak psát vim skripty v pythonu http://foo-projects.org/pipermail/xfce/2005-February/012866.html - python skript na otevření color chooseru |
||
imploder Profil |
#3 · Zasláno: 22. 8. 2009, 13:57:34 · Upravil/a: imploder
TomášK
Díky moc, hodně mi to pomohlo. Sice mi tvůj skript bez úprav nechtěl parsovat barvy (vadil mu myslím středník za barvou), ale je to dobrý základ. Dal jsem to do kupy takže by to mělo bezproblémově fungovat: function! ColorChooser() python << endpython import vim import gtk, sys def tohex(c): #Convert to hex string #little hack to fix bug s = ['#',hex(int(c[0]*256))[2:].zfill(2),hex(int(c[1]*256))[2:].zfill(2),hex(int(c[2]*256))[2:].zfill(2)] for item in enumerate(s): if item[1]=='100': s[item[0]]='ff' return ''.join(s).upper() print 'Choosing color...' csd = gtk.ColorSelectionDialog('Gnome Color Chooser') cs = csd.colorsel cs.set_has_opacity_control(False) cs.set_current_alpha(65536) cs.set_has_palette(True) vim.command("let save_cursor = getpos('.')") # save cursor position vim.command("let l:save_z = @z") # backup register z vim.command(':normal ebh"zy2w') color = vim.eval("@z") vim.command("let @z = l:save_z") # restore register z try: parsed_color = gtk.gdk.color_parse(color) except (ValueError, TypeError): # not on a valid hexcode -> inserting new one cs.set_current_color(gtk.gdk.color_parse("#000")) vim.command("call setpos('.', save_cursor)") # restore cursor position parsed_ok = False else: # changing the hexcode under cursor cs.set_current_color(parsed_color) parsed_ok = True if csd.run()==gtk.RESPONSE_OK: c = cs.get_current_color() hexcolor = tohex((c.red/65536.0, c.green/65536.0, c.blue/65536.0)) if parsed_ok: # changing hexcode under cursor -> delete old hexcode vim.command(":normal d2w") vim.command(":normal i%s" % hexcolor) csd.destroy() # clear status bar vim.command(":redraw") print "" endpython endfunction :map <F2> :call ColorChooser()<enter> (na <c-a> je lepší nemapovat, vim ho už na něco používá) Až přestane stávkovat server pygtk.org, tak tam chci ještě dodělat, aby při vkládání nové barvy (když kurzor není na hex-kódu) se místo #000000 nastavila poslední vybraná. Ten Color Chooser umí zjistil předchozí vybranou barvu, takže by to mělo jít. Na Mintu (takové "obohacené" Ubuntu) mi to taky jelo bez nutnosti něco instalovat. Ani balík gnome-color-chooser, co jsem ho původně kvůli tomu nainstalova, není potřeba - je to jenom shoda jmen, jakési gnomí nastavovátko co s tím nesouvisí. Ten "Color Chooser" je součástí toolkitu GTK, takže by to asi mělo jet tam, kde je GTK (tj. skoro každý linuxový desktop) a vim s pythonem - i na windows (nezkoušel jsem). |
||
TomášK Profil |
#4 · Zasláno: 22. 8. 2009, 21:06:24 · Upravil/a: TomášK
Jsem rád, že to uchytilo, předpokládal jsem, že to bude chtít upravit. Parsování barvy má ještě mouchy - tentokrát nefunguje pro barvy zapsané slovem ('red', 'blue' apod.), i když parsovátko je umí (http://www.pygtk.org/docs/pygtk/class-gdkcolor.html). Asi by to chtělo nějakou podmínku, která rozliší, jestli jde o hex kód nebo ne. Ostatní doplnění vypadá dobře :)
Minulou barvu by si šlo pamatovat i v nějaké proměnné vimu, pokud by to dialog neuměl. <c-a> vím, že něco je a i občas používám, předpokládal jsem, že si to každý upraví k obrazu svému. Mám trochu s hledáním ještě nevyužitých kombinací, často zjistím, že ona kombinace už někde na něco je. F2, jak jsem ke svému překvapení zjistil, je ještě volná jako jediná z funkčních kláves. Ale možná si to na mé klávesnici zaslouží i lepší mapování, uvidím, až zas budu upravovat css. |
||
imploder Profil |
#5 · Zasláno: 24. 8. 2009, 01:16:28
Přidal jsem parsování barev podle jmen (tak, jak to dělá to parsovátko - není to přímo HTML/CSS, ale jména barev v X11 - podobné, ale některé barvy tam oproti CSS nejsou nebo se liší). Taky další věci:
:: možnost nabírání nebo i pamatování barvy pomocí výběru X11 (ve windows by to měla být schránka) - nakonec jsem to vyřešil takhle, widget sice poslední barvu vyvolat umí, ale při dalším spuštění okna si ji nepamatuje, nejspíš by musel být celou dobu nahraný v paměti - nějak "rezidentně", pokud to vůbec ve Vimu jde - byla by to ale zbytečnost :: oprava chyby - už se nemrví nepojmenovaný registr (ten totiž ukazuje vždycky na poslední použitý, tedy v tomto případě 'z' - to jsem nevěděl) :: nastavení úpravou zdrojáku :: překlad do češtiny a španělštiny Už mi to připadá bezproblémově použitelné, jenom je problém v terminálovém Vimu (ne gVimu), že okno se nechce zavřít. Novou verzi jsem nahrál na vim online: http://vim.sourceforge.net/scripts/script.php?script_id=2756 |
||
Časová prodleva: 15 let
|
0