Hi, sorry for being offline for a week. I had to make an unplanned journey...
Now I am busy in doing all that stuff, which had to wait a week and is now crying "URGENT!" at me. Please give me some time for it -- after that I will respond more directly to your help. Have a nice sunday and thank you very much for all your help and response ! VIM! mcc Andy Wokula <[email protected]> [09-07-02 17:27]: > > [email protected] schrieb: > > Charlie Kester <[email protected]> [09-07-01 04:50]: > >> On Tue 30 Jun 2009 at 19:31:41 PDT [email protected] wrote: > >>> > >>> > >>> Hi, > >>> > >>> I want to make from this input (example): > >>> > >>> a d f g h > >>> b c d e f > >>> g h i > >>> a i > >>> b f g j > >>> > >>> this output > >>> > >>> > >>> a d f g h > >>> b c d e f > >>> g h i > >>> a i > >>> b f g j > >>> > >>> > >>> is there any vim script, which does this for me? > >>> I am working under Linux and vim (console). > >>> > >> What are the constraints? > >> > >> Will the input lines always be pre-sorted, as in your example? I.e., > >> will you ever have a row like "b d a f"? If so, should the > >> "tabulerization" sort it? > >> > >> Will each element always be one character wide and no wider? > >> > >> In your example, for each character between a and j, there is at least > >> one row containing it. Will you need to handle cases where one or more > >> elements in the range are not represented? I.e., should the result > >> contain empty columns? > >> > >> > >> > > Oh ... uuuuhhh ... hrrrmm > > > > Yes, the input was incomplete, sorry. > > > > I will try to complete it: > > > > "a b c" stands for three words that is each character is one word. > > Separation is done by blanks (\s) of a unknown count, anything else > > is part of a word. Or in other words: "a=2.5 Anoth"er"(word)!=23/8:l" are > > two words. > > The words are presorted. > > There are no empty columns. > > > > Hope, that is more complete as my first attempt... > > hey, try this one: > > com! -range Tabularize <line1>,<line2>call Tabularize() > > func! Tabularize() range abort > let wdict = Tabul_GetWDict(getline(a:firstline, a:lastline)) > let ordered_words = Tabul_Sort(keys(wdict)) > let virtcols = Tabul_GetColumnOffsets(ordered_words) > for lnum in range(a:firstline, a:lastline) > let words = Tabul_GetWords(getline(lnum)) > call setline(lnum, Tabul_MkTabLine(Tabul_Sort(words), virtcols)) > endfor > endfunc > > " return a tabularized line: > func! Tabul_MkTabLine(ordered_words, virtcols) > " ok a bit redundant: both ordered_words and virtcols include > " information about order > let words = copy(a:ordered_words) > let nwords = len(words) > if nwords < 2 > return nwords == 1 ? words[0] : "" > endif > let idx = 0 > let nextword = words[0] > let indent = repeat(" ", a:virtcols[nextword]-1) > while idx < nwords-1 > let word = nextword > let nextword = words[idx+1] > let fmt = printf("%%-%ds", > \ a:virtcols[nextword] - a:virtcols[word]) > let words[idx] = printf(fmt, word) > let idx += 1 > endwhile > return indent. join(words, "") > endfunc > > " for given list of strings: extract the words into a wdict (= set of > " words) > func! Tabul_GetWDict(lines) > let wd = {} > for line in a:lines > for word in Tabul_GetWords(line) > let wd[word] = 1 > endfor > endfor > return wd > endfunc > > " return words ordered: > func! Tabul_Sort(words) > return sort(a:words) > endfunc > > " extract the words from a string as a list > func! Tabul_GetWords(str) > return split(a:str) > endfunc > > " assign virtual columns (in the window) for each word in ordered_wlist > func! Tabul_GetColumnOffsets(ordered_wlist) > let gap = 1 " least number of spaces between words > let off = 1 " leftmost virtcol() > let offsets = {} > for word in a:ordered_wlist > let offsets[word] = off > let off += strlen(word) + gap > endfor > return offsets > endfunc > > " vim:set tw=72 et sw=2 sts=2: > > > > > extra functions for sorting and extracting words from the text ... > should be quite easy to find the positions in the code where > to make changes ... > > -- > Andy > > -- Please don't send me any Word- or Powerpoint-Attachments unless it's absolutely neccessary. - Send simply Text. See http://www.gnu.org/philosophy/no-word-attachments.html In a world without fences and walls nobody needs gates and windows. --~--~---------~--~----~------------~-------~--~----~ You received this message from the "vim_use" maillist. For more information, visit http://www.vim.org/maillist.php -~----------~----~----~----~------~----~------~--~---
