Autor Zpráva
imploder
Profil
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
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
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
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
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

Vaše odpověď

Mohlo by se hodit

Pokuste se již v titulku uvést název programu související s tématem.

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: