Loading ...
Sorry, an error occurred while loading the content.

RE: color scheme switcher

Expand Messages
  • Halim, Salman
    I uploaded a script a while ago to allow different filetypes/buffers to have their own colorschemes. I have another one that sets a randomly chosen color
    Message 1 of 13 , Jul 5 11:52 AM
    • 0 Attachment
      I uploaded a script a while ago to allow different filetypes/buffers to
      have their own colorschemes. I have another one that sets a randomly
      chosen color scheme from the available list. I'm sure it would be
      pretty easy to read the entire list into a variable and rotate, though I
      prefer the unpredictability of the randomizer myself. (The randomizer
      uses Dr. Chip's Rndm plugin.)

      You can easily get the list of color schemes via globpath or some such;
      retrieve the current scheme name from a variable, find the one
      immediately after it in the globbed list and set it, storing this new
      scheme name in the variable. If you get to the every end (there is no
      'next' scheme), just pick the first one.

      Salman.

      > -----Original Message-----
      > From: Steve Felt [mailto:steve@...]
      > Sent: Tuesday, July 05, 2005 1:59 PM
      > To: David Rennalls
      > Cc: vim mailing list
      > Subject: Re: color scheme switcher
      >
      > On Tue, 2005-07-05 at 11:25, David Rennalls wrote:
      > > On 7/5/05, Steve Felt <steve@...> wrote:
      > > > Could a button be mapped to rotate through installed
      > color schemes?
      > Is
      > > > vim aware of the files in ~/.vim, ~/.vim/colors etc?
      > > >
      > > > If so, I guess it would be trivial (for someone more
      > capable in vim
      > > > scripting than I am) to create a function which changes the
      > colorscheme
      > > > to the next colorscheme and wraps at the end?
      > > >
      > > > My-oh-my, this would be neeeato. As I'm learning
      > scripting, I'd be
      > > > thrilled with examples/suggestions that might help me to
      > write this
      > > > script... if it hasn't been written already.
      > > >
      > > > --
      > > >
      > > > -steve
      > >
      > > It's not exactly what you had in mind, but this might interest you..
      > >
      > > Colors Sampler Pack : [full update] All the color schemes on
      > > vim.sf.net (now with organized menu)
      > > http://www.vim.org/scripts/script.php?script_id=625
      > >
      > > - David
      >
      > Actually, this pack of 140 color schemes is the impetus for
      > my question!
      > :-)
      >
      > --
      > Steve Felt <steve@...>
      > CirclePix.com
      >
    • Scott C
      ... steve: *if* you have a python enabled gvim, the following will cycle through the colorschemes saved in favs.txt (you ll have to fix the linebreaks): #
      Message 2 of 13 , Jul 5 12:26 PM
      • 0 Attachment
        --- Steve Felt <steve@...> wrote:

        > On Tue, 2005-07-05 at 11:25, David Rennalls wrote:
        > > On 7/5/05, Steve Felt <steve@...> wrote:
        > > > Could a button be mapped to rotate through
        > installed color schemes?
        > Is
        > > > vim aware of the files in ~/.vim, ~/.vim/colors
        > etc?
        > > >
        > > > If so, I guess it would be trivial (for someone
        > more capable in vim
        > > > scripting than I am) to create a function which
        > changes the
        > colorscheme
        > > > to the next colorscheme and wraps at the end?
        > > >
        > > > My-oh-my, this would be neeeato. As I'm learning
        > scripting, I'd be
        > > > thrilled with examples/suggestions that might
        > help me to write this
        > > > script... if it hasn't been written already.
        > > >
        > > > --
        > > >
        > > > -steve
        > >
        > > It's not exactly what you had in mind, but this
        > might interest you..
        > >
        > > Colors Sampler Pack : [full update] All the color
        > schemes on
        > > vim.sf.net (now with organized menu)
        > >
        > http://www.vim.org/scripts/script.php?script_id=625
        > >
        > > - David
        >
        > Actually, this pack of 140 color schemes is the
        > impetus for my question!
        > :-)
        >
        > --
        > Steve Felt <steve@...>
        > CirclePix.com
        >

        steve:

        *if* you have a python enabled gvim, the following
        will cycle through the colorschemes saved in
        "favs.txt" (you'll have to fix the linebreaks):

        # 30 Mar 2002
        # scott
        #
        # this script cycles through all colorschemes listed
        # (without the .vim extension) in a module specified
        on
        # line 22
        #
        import os
        import string
        import sys
        import vim

        cnt = 0 #
        counter
        c_list = [] # color
        list

        ############################################################
        ##
        ##
        ## note: the following open will need to be
        customized ##
        ## per installation
        ##
        ##
        ##
        ############################################################
        f = open("c:/vim/vimfiles/colors/favs.txt", "r")
        c_list = f.readlines()
        f.close()

        d_list = []
        for i in range(len(c_list)):
        d_list.append(string.rstrip(c_list[i]))

        # at this point we have an array of colorschemes in
        d_list
        cnt = len(d_list)

        if cnt < 1:
        print "there are no colorschemes installed"
        sys.exit(1) # this
        exit needs to be tested...

        try:
        curr_color = vim.eval("colors_name") #
        doesn't work when not defined
        except vim.error:
        curr_color = "none"

        # let's say we got here with a color - let's move to
        the next one

        n = 0
        for i in range(0, cnt):
        if curr_color == d_list[i]:
        n = i + 1
        break

        if n == cnt:
        n = 0

        vim.command("colorscheme %s" % d_list[n])

        <end paste>

        hth,

        scott




        ____________________________________________________
        Yahoo! Sports
        Rekindle the Rivalries. Sign up for Fantasy Football
        http://football.fantasysports.yahoo.com
      • Tim Chase
        ... Why, of course! This is vim :) nnoremap :exec colorscheme .substitute(expand($VIMRUNTIME. /colors/*.vim ),
        Message 3 of 13 , Jul 5 12:31 PM
        • 0 Attachment
          > Could a button be mapped to rotate through installed color
          > schemes? Is vim aware of the files in ~/.vim, ~/.vim/colors
          > etc?

          Why, of course! This is vim :)

          nnoremap <f4> :exec "colorscheme
          ".substitute(expand($VIMRUNTIME."/colors/*.vim"),
          '.*[/\\]'.colors_name.'\.vim\c[[:cntrl:]]*[^[:cntrl:]]*[/\\]\([^.]*\).*',
          '\1', 'g')<cr>

          Note 1: this is all one line.
          Note 2: though you may not be able to see it, there's a space
          after that last "<cr>" making it "<cr> " so that it dismisses the
          "press return to continue" sort of prompt that comes up.

          It doesn't wrap, and it doesn't do any initialization, so you'll
          have to prime it by setting your colorscheme to the first one in
          the list by doing

          :colorscheme <tab>

          where you actually hit <tab> there. This should snag the first
          one it finds. Once it hits the end of the list, it will just
          keep that one. Not very exciting.

          I did this on Win32 vim, which only has one color location.
          However, a little manipulation should be able to build a
          combination of multiple locations...changing the

          expand($VIMRUNTIME."/colors/*.vim")

          to be something like

          expand($VIMRUNTIME."/colors/*.vim")."\n".expand($OTHER_PATH...)

          If you need that monstrosity broken down, let me know and I'll
          try and shed a little light on it :)

          -tim
        • Scott LaBounty
          Tim, I just tried this out with Window XP and I get E185: Cannot find color scheme C:/Program Files/vim/vim63/colors/blue.vim . If I go ahead and just do a
          Message 4 of 13 , Jul 5 1:08 PM
          • 0 Attachment
            Tim,

            I just tried this out with Window XP and I get "E185: Cannot find color
            scheme C:/Program Files/vim/vim63/colors/blue.vim". If I go ahead and
            just do a "colorscheme blue then following that the switch will work.
            Any thoughts?

            Scott LaBounty
            Nexa Technologies, Inc.

            Tim Chase wrote:

            >> Could a button be mapped to rotate through installed color
            >> schemes? Is vim aware of the files in ~/.vim, ~/.vim/colors
            >> etc?
            >
            >
            > Why, of course! This is vim :)
            >
            > nnoremap <f4> :exec "colorscheme
            > ".substitute(expand($VIMRUNTIME."/colors/*.vim"),
            > '.*[/\\]'.colors_name.'\.vim\c[[:cntrl:]]*[^[:cntrl:]]*[/\\]\([^.]*\).*',
            > '\1', 'g')<cr>
            >
            > Note 1: this is all one line.
            > Note 2: though you may not be able to see it, there's a space after
            > that last "<cr>" making it "<cr> " so that it dismisses the "press
            > return to continue" sort of prompt that comes up.
            >
            > It doesn't wrap, and it doesn't do any initialization, so you'll have
            > to prime it by setting your colorscheme to the first one in the list
            > by doing
            >
            > :colorscheme <tab>
            >
            > where you actually hit <tab> there. This should snag the first one it
            > finds. Once it hits the end of the list, it will just keep that one.
            > Not very exciting.
            >
            > I did this on Win32 vim, which only has one color location. However, a
            > little manipulation should be able to build a combination of multiple
            > locations...changing the
            >
            > expand($VIMRUNTIME."/colors/*.vim")
            >
            > to be something like
            >
            > expand($VIMRUNTIME."/colors/*.vim")."\n".expand($OTHER_PATH...)
            >
            > If you need that monstrosity broken down, let me know and I'll try and
            > shed a little light on it :)
            >
            > -tim
            >
            >
            >
            >
            >
            >
            >
          • Tim Chase
            ... I did find that when it hit the last one in the list, I got this error back when there were no more to try. I think it may actually be trying to set the
            Message 5 of 13 , Jul 5 1:25 PM
            • 0 Attachment
              > I just tried this out with Window XP and I get "E185: Cannot find color
              > scheme C:/Program Files/vim/vim63/colors/blue.vim". If I go ahead and
              > just do a "colorscheme blue then following that the switch will work.
              > Any thoughts?

              This may be an artifact of the caveat:

              >> It doesn't wrap, and it doesn't do any initialization,

              I did find that when it hit the last one in the list, I got this
              error back when there were no more to try. I think it may
              actually be trying to set the colorscheme to a multi-line string.
              Haven't played with it that far. However, if you prime it the
              first time (which usually ends up being "blue"), you should be
              able to walk through all the colors pretty easily.

              To fix it, you may be able to wrap the whole bloody substitute()
              expression in yet another subsitute() expression, something to
              the effect

              substitute(substitute(...),'[^[:cntrl:]]*[/\\]\([^.]*\).vim\c.*','\1','')

              making the whole lot:

              nnoremap <f4> :exec "colorscheme
              ".substitute(substitute(expand($VIMRUNTIME."/colors/*.vim"),
              '.*[/\\]'.colors_name.'\.vim\c[[:cntrl:]]*[^[:cntrl:]]*[/\\]\([^.]*\).*',
              '\1', 'g'), '[^[:cntrl:]]*[/\\]\([^.]*\).vim\c.*','\1','')<cr><cr>

              which seemed to work for me to get rid of that and solve the
              wrapping problem. I also found that I could change that
              invisible trailing space to a 2nd <cr> and it was just as happy.

              Anybody else having a rough day focusing on doing *real* work? :*)

              -tim
            • Scott LaBounty
              Tim, What? I m supposed to read the whole thing not just copy the important bits???? OK, the latest looks great! Scott P.S. Real work, what a concept. I may
              Message 6 of 13 , Jul 5 1:31 PM
              • 0 Attachment
                Tim,

                What? I'm supposed to read the whole thing not just copy the important
                bits???? OK, the latest looks great!

                Scott

                P.S. Real work, what a concept. I may have to try it later today or
                tomorrow. Thursday at the latest.

                Tim Chase wrote:

                >> I just tried this out with Window XP and I get "E185: Cannot find
                >> color scheme C:/Program Files/vim/vim63/colors/blue.vim". If I go
                >> ahead and just do a "colorscheme blue then following that the switch
                >> will work. Any thoughts?
                >
                >
                > This may be an artifact of the caveat:
                >
                >>> It doesn't wrap, and it doesn't do any initialization,
                >>
                >
                > I did find that when it hit the last one in the list, I got this error
                > back when there were no more to try. I think it may actually be
                > trying to set the colorscheme to a multi-line string. Haven't played
                > with it that far. However, if you prime it the first time (which
                > usually ends up being "blue"), you should be able to walk through all
                > the colors pretty easily.
                >
                > To fix it, you may be able to wrap the whole bloody substitute()
                > expression in yet another subsitute() expression, something to the effect
                >
                > substitute(substitute(...),'[^[:cntrl:]]*[/\\]\([^.]*\).vim\c.*','\1','')
                >
                > making the whole lot:
                >
                > nnoremap <f4> :exec "colorscheme
                > ".substitute(substitute(expand($VIMRUNTIME."/colors/*.vim"),
                > '.*[/\\]'.colors_name.'\.vim\c[[:cntrl:]]*[^[:cntrl:]]*[/\\]\([^.]*\).*',
                > '\1', 'g'), '[^[:cntrl:]]*[/\\]\([^.]*\).vim\c.*','\1','')<cr><cr>
                >
                > which seemed to work for me to get rid of that and solve the wrapping
                > problem. I also found that I could change that invisible trailing
                > space to a 2nd <cr> and it was just as happy.
                >
                > Anybody else having a rough day focusing on doing *real* work? :*)
                >
                > -tim
                >
                >
                >
                >
                >
                >
                >
              • Tim Chase
                ... I suppose great is in the eye of the beholder...it looks like a frightful mess to me :) Reminds me a lot of Perl code...not bad when I was writing it,
                Message 7 of 13 , Jul 5 1:52 PM
                • 0 Attachment
                  > OK, the latest looks great!

                  I suppose "great" is in the eye of the beholder...it looks like a
                  frightful mess to me :) Reminds me a lot of Perl code...not bad
                  when I was writing it, but I'm not sure I'd like to try and
                  revisit it tomorrow and figure out what it's doing. :)

                  -tim
                • tlink
                  ... Not exactly what you were asking for but ColorSchemeExplorer could be of some help here. Name Of File: csExplorer.vim Description: Color Scheme
                  Message 8 of 13 , Jul 6 12:36 AM
                  • 0 Attachment
                    Steve Felt wrote:
                    > Could a button be mapped to rotate through installed color schemes? Is
                    > vim aware of the files in ~/.vim, ~/.vim/colors etc?

                    Not exactly what you were asking for but ColorSchemeExplorer could be of
                    some help here.

                    " Name Of File: csExplorer.vim
                    " Description: Color Scheme Explorer Vim Plugin
                    " Maintainer: Jeff Lanzarotta (delux256-vim at yahoo dot com)
                    " Last Changed: Thursday, 09 June 2005
                    " Version: 7.0.1
                    " Usage: Normally, this file should reside in the plugins
                    " directory and be automatically sourced. If not, you must
                    " manually source this file using ':source csExplorer.vim'.
                    "
                    " You may use the default command of
                    "
                    " ":ColorSchemeExplorer" - Opens ColorSchemeExplorer
                    "
                    " For more help see supplied documentation.
                    " History: See supplied documentation.

                    Cheers,
                    Thomas.
                  • Steve Felt
                    ... Wow -- that s one crazy line, but it works great! Anyone else including this in their .vimrc (or _vimrc, .gvimrc etc) make sure tim s color scheme
                    Message 9 of 13 , Jul 6 7:32 AM
                    • 0 Attachment
                      On Tue, 2005-07-05 at 14:25, Tim Chase wrote:
                      > > I just tried this out with Window XP and I get "E185: Cannot find color
                      > > scheme C:/Program Files/vim/vim63/colors/blue.vim". If I go ahead and
                      > > just do a "colorscheme blue then following that the switch will work.
                      > > Any thoughts?
                      >
                      > This may be an artifact of the caveat:
                      >
                      > >> It doesn't wrap, and it doesn't do any initialization,
                      >
                      > I did find that when it hit the last one in the list, I got this
                      > error back when there were no more to try. I think it may
                      > actually be trying to set the colorscheme to a multi-line string.
                      > Haven't played with it that far. However, if you prime it the
                      > first time (which usually ends up being "blue"), you should be
                      > able to walk through all the colors pretty easily.
                      >
                      > To fix it, you may be able to wrap the whole bloody substitute()
                      > expression in yet another subsitute() expression, something to
                      > the effect
                      >
                      > substitute(substitute(...),'[^[:cntrl:]]*[/\\]\([^.]*\).vim\c.*','\1','')
                      >
                      > making the whole lot:
                      >
                      > nnoremap <f4> :exec "colorscheme
                      > ".substitute(substitute(expand($VIMRUNTIME."/colors/*.vim"),
                      > '.*[/\\]'.colors_name.'\.vim\c[[:cntrl:]]*[^[:cntrl:]]*[/\\]\([^.]*\).*',
                      > '\1', 'g'), '[^[:cntrl:]]*[/\\]\([^.]*\).vim\c.*','\1','')<cr><cr>
                      >
                      > which seemed to work for me to get rid of that and solve the
                      > wrapping problem. I also found that I could change that
                      > invisible trailing space to a 2nd <cr> and it was just as happy.
                      >
                      > Anybody else having a rough day focusing on doing *real* work? :*)
                      >
                      > -tim
                      >
                      >

                      Wow -- that's one crazy line, but it works great!

                      Anyone else including this in their .vimrc (or _vimrc, .gvimrc etc) make
                      sure tim's color scheme switch/switcher solution is all on one line.

                      Thanks!!

                      --
                      Steve Felt <steve@...>
                      CirclePix.com
                    • Tim Chase
                      ... Glad it solves what ails ya :) In case you want to tweak or understand it, I ll try and break it down into less cryptic pieces. The root of it is a mapping
                      Message 10 of 13 , Jul 6 8:17 AM
                      • 0 Attachment
                        >>nnoremap <f4> :exec "colorscheme
                        >>".substitute(substitute(expand($VIMRUNTIME."/colors/*.vim"),
                        >>'.*[/\\]'.colors_name.'\.vim\c[[:cntrl:]]*[^[:cntrl:]]*[/\\]\([^.]*\).*',
                        >>'\1', 'g'), '[^[:cntrl:]]*[/\\]\([^.]*\).vim\c.*','\1','')<cr><cr>
                        >
                        > Wow -- that's one crazy line, but it works great!

                        Glad it solves what ails ya :)

                        In case you want to tweak or understand it, I'll try and break it
                        down into less cryptic pieces.

                        The root of it is a mapping which executes "colorscheme <stuff>"

                        The <stuff> is found by getting a list of the files; finding your
                        current colorscheme in that list; then finding the next one in
                        the list to pass back to the previous bit.

                        To get the list of files, the mapping uses the expand() function.
                        This is a simple version that simply hits one directory. Multiple
                        directories might be doable with a little tweaking by appending
                        multiple calls to the expand() function together, and placing
                        some delimiter (char 0x0A seems to be what expand() uses).

                        To get the *next* name, we look for the current name:

                        ...[/\\]'.colors_name.'\.vim\c'

                        which should take into account path separators (either forward or
                        back-slash), followed by the current color-scheme name, followed
                        by ".vim" (case-insensitive "\c").

                        Because the expand() call separates the lines with a control
                        character (0x0A, IIUC) we then slurp up those control characters,
                        and then all non-control-characters up to a forward/back-slash.
                        We then tag the stuff that follows, up to a period. We then slurp
                        up and discard the (case-insensitive) ".vim" and anything that
                        follows. We now have the next color-scheme name tagged, so we
                        replace the whole lot with the tagged stuff.

                        This is good. However, we then encounter the problem raised
                        earlier--that when you're on the last colorscheme, the whole
                        substitute() fails to find the "next" one because it's at the end
                        of the list, so it doesn't change anything. Thus, you get back
                        the original results of the expand() call. This chokes the
                        "colorscheme <stuff>" statement. So we simply strip off the path,
                        the ".vim" and anything that follows, leaving just the first
                        colorscheme in the list.

                        The first <cr> then runs the whole lot, and the second <cr>
                        dismisses the "Press <enter> to continue" message.

                        ...and Bob's your uncle :)

                        -tim
                      Your message has been successfully submitted and would be delivered to recipients shortly.