Re: command entry suggestion

From: mitchell <mforal.n....at.gmail.com>
Date: Thu, 17 Jun 2010 15:37:03 -0700 (PDT)

Hi,

I have committed a new command_entry.lua with abbreviated commands
thanks to Jay. For now this is only available for the anticipated
Textadept 3 series, not 2.x. You may use Jay's code here for 2.x.

Thanks Jay!

Mitchell

On Jun 6, 11:01 pm, mitchell <mforal.n....at.gmail.com> wrote:
> I'm going to take a good look at this when I get the chance. Thanks
> for all your hard work! It will be a welcome addition when it's
> complete.
>
> Mitchell
>
> On Jun 6, 8:17 am, Jay <robert.jay.go....at.gmail.com> wrote:
>
> > Done, got all the features ready now. Only haven't properly
> > modularized it yet.  Right now I placed this into my ~/.textadept
> > folder so it overrides the original file due to USERHOME coming before
> > HOME in lua's path.
>
> > Anyways it's usable now so here it is:
> > ----command_entry.lua
> > -- Copyright 2007-2009 Mitchell Foral mitchell<att>caladbolg.net. See
> > LICENSE.
>
> > local util = {}
>
> > local textadept = _G.textadept
> > local locale = _G.locale
> > local type = _G.type
> > local rawget = _G.rawget
> > local rawset = _G.rawset
> > local select = _G.select
> > local ipairs = _G.ipairs
> > local tostring = _G.tostring
> > local unpack = _G.unpack
>
> > util.print = function(...)
> >         if select("#",...) > 1 then
> >                 local t = {}
> >                 for i,v in ipairs({...}) do
> >                         t[i]=tostring(v)
> >                 end
> >                 textadept.print(unpack(t))
> >         else
> >                 textadept.print(tostring(...))
> >         end
> > end
>
> > util.printf = function(text,...)
> >         textadept.print(tostring(text):format(...))
> > end
>
> > util.append = function (text,...)
> >         buffer:append_text(tostring(text):format(...))
> > end
>
> > util.insertf = function (text,...)
> >         buffer:insert_text(buffer.current_pos, tostring(text):format(...))
> > end
>
> > util.insert = function (...)
> >         if select("#",...) > 1 then
> >                 local t = {}
> >                 for i,v in ipairs({...}) do
> >                         t[i]=tostring(v)
> >                 end
> >                 buffer:insert_text(buffer.current_pos,table.concat(t," "))
> >         else
> >                 buffer:insert_text(buffer.current_pos, tostring(...))
> >         end
> > end
>
> > util.shell = function(text,...)
> >         return
> > textadept.iconv(_G.io.popen(text:format(...)):read("*all"),"UTF-8",_CHARSET)
> > end
>
> > util = setmetatable(util,{
> > __index = function(e,k)
> >         -- most operations are buffer shortcut
> >         local v = buffer[k]
> >         if type(v) ~= "nil" then
> >                 if type(v)=="function" then
> >                         v = function(...)
> >                                 buffer[k](buffer,...)
> >                         end
> >                 end
> >         else -- or bindings to textadept
> >                 v = textadept[k] or rawget(_G,k) -- if nothing was found default to
> > global
> >                 if type(textadept[k])=="table" and type(rawget(_G,k))=="table" then--
> > then merge tables
> >                         v = {} --temprary merge table
> >                         for _1,_2 in pairs(textadept[k]) do
> >                                 v[_1]=_2
> >                         end
> >                         for _1,_2 in pairs(rawget(_G,k)) do
> >                                 v[_1]=_2
> >                         end
> >                 end
> >         end
> >         --e[k] = v --memoize the key (don't memoize the key so newindex will
> > work correctly)
> >         return v
> > end,
> > __newindex = function(e,k,v)
> >         -- most operations are buffer shortcut
> >         local old = buffer[k]
> >         if type(old) ~= "nil" then
> >                 buffer[k] = v --replace current
> >                 return
> >         end
> >         old = textadept[k]
> >         if type(old) ~= "nil" then
> >                 textadept[k] = v --replace current
> >                 return
> >         end
> >         rawset(e,k,v)
> > end,
>
> > })
>
> > textadept.events.add_handler('command_entry_command',
> >   function(command) -- execute a Luacommand
> >     local f, err = loadstring(command)
> >     if err then error(err) end
> >     textadept.command_entry.focus() -- toggle focus to hide
> >     setfenv(f,util)
> >         f()
> >   end)
>
> > textadept.events.add_handler('command_entry_keypress',
> >   function(code)
> >     local ce = textadept.command_entry
> >     if code == 0xff1b then -- escape
> >       ce.focus() -- toggle focus to hide
> >       return true
> >     elseif code == 0xff09 then -- tab
> >       local substring = ce.entry_text:match('[%w_.:]+$') or ''
> >       local path, o, prefix = substring:match('^([%w_.:]-)([.:]?)
> > ([%w_]*)$')
> >           local f,err = loadstring('return ('..path..')')
> >           if type(f) == "function" then
> >                 setfenv(f,util)
> >           end
> >       local ret, tbl = pcall(f)
> >           local cmpls = {}
> >       if not ret then
> >             --tbl = getfenv(0)
> >         for k in pairs(buffer) do
> >                   if type(k) == 'string' and k:find('^'..prefix) then
> >                         cmpls[#cmpls + 1] = k
> >                   end
> >                 end
> >                 for f in pairs(textadept.buffer_functions) do
> >                   if f:find('^'..prefix) then cmpls[#cmpls + 1] = f end
> >                 end
> >                 for p in pairs(textadept.buffer_properties) do
> >                   if p:find('^'..prefix) then cmpls[#cmpls + 1] = p end
> >                 end
> >                 for k in pairs(textadept) do
> >                   if type(k) == 'string' and k:find('^'..prefix) then
> >                         cmpls[#cmpls + 1] = k
> >                   end
> >                 end
> >                 for k in pairs(_G) do
> >                   if type(k) == 'string' and k:find('^'..prefix) then
> >                         cmpls[#cmpls + 1] = k
> >                   end
> >             end
> >           else
> >         if type(tbl) ~= 'table' then return end
> >         for k in pairs(tbl) do
> >           if type(k) == 'string' and k:find('^'..prefix) then
> >             cmpls[#cmpls + 1] = k
> >           end
> >         end
> >         if path == 'buffer' then
> >           if o == ':' then
> >             for f in pairs(textadept.buffer_functions) do
> >               if f:find('^'..prefix) then cmpls[#cmpls + 1] = f end
> >             end
> >           else
> >             for p in pairs(textadept.buffer_properties) do
> >               if p:find('^'..prefix) then cmpls[#cmpls + 1] = p end
> >             end
> >           end
> >         end
> >           end
> >       table.sort(cmpls)
> >       ce.show_completions(cmpls)
> >       return true
> >     end
> >   end)
>
> > On Jun 5, 12:20 am, Jay <robert.jay.go....at.gmail.com> wrote:
>
> > > just had some time now to get back to this, fixed the namespace
> > > clashing for io and keys and suggested, next is to get tab completion
> > > ready and modularize it. Hope to have it ready for testing this
> > > weekend.
>
> > > On May 17, 10:23 pm, mitchell <mforal.n....at.gmail.com> wrote:
>
> > > > Jay,
>
> > > > On May 17, 6:13 am, Jay <robert.jay.go....at.gmail.com> wrote:
>
> > > > > Unfortunately tab-completion doesn't work yet with the new system.
> > > > > Will need to change it I guess. Where is the code for it?
>
> > > > It's in the keypress handler for the 'tab' key (it's commented). I
> > > > think you'd only have to grab the current word text and see if it
> > > > exists in each global table you have a shortcut for.
>
> > > > Mitchell
>
> > > > > -Jay
>
> > > > > On May 11, 1:42 am, mitchell <mforal.n....at.gmail.com> wrote:
>
> > > > > > Jay,
>
> > > > > > On May 8, 5:43 am, Jay <robert.jay.go....at.gmail.com> wrote:
>
> > > > > > > Mitchell,
>
> > > > > > > That is a great idea indeed! I'll add the to the environment's
> > > > > > > metatable for keys and io to get the values from the right tables. Ok
> > > > > > > now that the prototype is basically ready. what would be the right
> > > > > > > place to put it? Should I extend command_entry? Or add a module (if so
> > > > > > > any good names)? Also I'd like to make it easy for users to add their
> > > > > > > own functions to the environment table (my currently called "utils"
> > > > > > > table). What design you think would be the most "textadept"ish?
> > > > > > > Something like key_commands that looks for a user file after setting
> > > > > > > the base functions?
>
> > > > > > I recommend providing it as a separate module right now (that can be
> > > > > > "require"d from ~/.textadept/init.lua). After testing, it will likely
> > > > > > go into ext/command_entry.lua and check a user file for extra
> > > > > > extensions because I think it would be really useful as a core
> > > > > > extension.
>
> > > > > > Out of curiousity, does the existing tab-completion work for your
> > > > > > code?
>
> > > > > > Mitchell
>
> > > > > > > -Jay
>
> > > > > > > On May 8, 11:51 am, mitchell <mforal.n....at.gmail.com> wrote:
>
> > > > > > > > On May 7, 10:43 pm, mitchell <mforal.n....at.gmail.com> wrote:
>
> > > > > > > > > Jay,
>
> > > > > > > > > On May 6, 8:34 am, Jay <robert.jay.go....at.gmail.com> wrote:
>
> > > > > > > > > > Finished, sort of.
>
> > > > > > > > > > I got the 'use_tabs = 1'  feature working by adding a __newindex to
> > > > > > > > > > the environment's metatable.
> > > > > > > > > > And luckily there are no clashes between 'textadept' and 'buffer',
> > > > > > > > > > woot!
>
> > > > > > > > > > however there are two
>
> ...
>
Received on Thu 17 Jun 2010 - 18:37:03 EDT

This archive was generated by hypermail 2.2.0 : Thu 08 Mar 2012 - 11:44:20 EST