LINUX.ORG.RU

История изменений

Исправление Hoodoo, (текущая версия) :

Я использую awesome и раньше использовал три раскладки.

Решил для себя проблему так: awesome смотрит, какое окно активно, если это не емакс, то зовёт setxkbmap. Если емакс, то зовёт емаксклиент.

Для того, чтобы это работало, емакс должен работать в режиме сервера и выводить имя буфера в имя окна.

Таким образом раскладки везде переключаются по ctrl+\

Сейчас раскладки осталось две, потому что я открыл для себя compose ıęüğ ололо

Овёс:

-- Store keyboard layout for each window, show flags etc.
-- In my config, it goes into screen definition

    kbdcfg = {}
    kbdcfg.state = {}
    kbdcfg.cmd = "setxkbmap"
    kbdcfg.layout = {
       { "pl", "", "PL", 'nil', "poland" },
       { "ru", "", "RU", '\\"russian-computer\\"', "russia" }  
       -- { "tr", "", "TR", '\\"turkish-postfix\\"', "turkey" }
    } 
    kbdcfg.current = 1  -- pl is our default layout
    kbdcfg.widget = wibox.widget.textbox()
    kbdcfg.widget:set_text(" " .. kbdcfg.layout[kbdcfg.current][3] .. " ")

    -- Set keyboard layout with a command and update the widget
    kbdcfg.set = function (k)
       kbdcfg.state[client.focus.window] = k
       local t = kbdcfg.layout[k]
       kbdcfg.widget:set_text(" " .. t[3] .. " ")
       -- kbdcfg.flag(t[5])
       os.execute( kbdcfg.cmd .. " " .. t[1] .. " " ..t[2] )
    end
    
    -- Lookup the layout seen in this window the last time
    kbdcfg.restore = function ()
       local t = kbdcfg.state[client.focus.window] or 1
       kbdcfg.set(t)
    end
    
    kbdcfg.flag = function (flag)
       naughty.notify({ icon = "/home/hoodoo/.config/awesome/resources/flags/" .. flag .. ".png", icon_size = 140 })
    end
        
    -- Just cycle through all the layouts by one, call the switch function
    kbdcfg.cycle = function ()
       kbdcfg.current = kbdcfg.current % #(kbdcfg.layout) + 1
       kbdcfg.smartswitch(kbdcfg.current)
    end
    
    -- Distinct between Emacs and all the rest, if it's emacs then set input method instead of switch command
    kbdcfg.smartswitch = function (n)
       local layout_description = kbdcfg.layout[n]
       if client.focus.class == 'Emacs' then
	  os.execute( "emacsclient -e " .. '"' .. '(with-current-buffer \\"' .. client.focus.name .. '\\" (set-input-method ' .. layout_description[4] .. '))"' )
       else
	  kbdcfg.set(n)
       end
    end

-- This goes into keys definition
   -- Defined for all variants of the \ button - in Turkish Q there's a comma there, meh
   awful.key({ "Control"         }, "backslash", kbdcfg.cycle ),
   -- awful.key({ "Control"         }, "comma", kbdcfg.cycle ),

Емакс:

(setq frame-title-format '("%b"))

На caps повешен compose. Ушёл от турецкого инпута в емаксе, потому что тогда получается два разных способа ввода - в емаксе и во всём остальном. А turkish-postfix работает очень похоже на compose.

Исходная версия Hoodoo, :

Я использую awesome и раньше использовал три раскладки.

Решил для себя проблему так: awesome смотрит, какое окно активно, если это не емакс, то зовёт setxkbmap. Если емакс, то зовёт емаксклиент.

Для того, чтобы это работало, емакс должен работать в режиме сервера и выводить имя буфера в имя окна.

Таким образом раскладки везде переключаются по ctrl+\

Сейчас раскладки осталось две, потому что я открыл для себя compose ıęüğ ололо

Овёс:

-- Store keyboard layout for each window, show flags etc.
-- In my config, it goes into screen definition

    kbdcfg = {}
    kbdcfg.state = {}
    kbdcfg.cmd = "setxkbmap"
    kbdcfg.layout = {
       { "pl", "", "PL", 'nil', "poland" },
       { "ru", "", "RU", '\\"russian-computer\\"', "russia" }  
       -- { "tr", "", "TR", '\\"turkish-postfix\\"', "turkey" }
    } 
    kbdcfg.current = 1  -- pl is our default layout
    kbdcfg.widget = wibox.widget.textbox()
    kbdcfg.widget:set_text(" " .. kbdcfg.layout[kbdcfg.current][3] .. " ")

    -- Set keyboard layout with a command and update the widget
    kbdcfg.set = function (k)
       kbdcfg.state[client.focus.window] = k
       local t = kbdcfg.layout[k]
       kbdcfg.widget:set_text(" " .. t[3] .. " ")
       -- kbdcfg.flag(t[5])
       os.execute( kbdcfg.cmd .. " " .. t[1] .. " " ..t[2] )
    end
    
    -- Lookup the layout seen in this window the last time
    kbdcfg.restore = function ()
       local t = kbdcfg.state[client.focus.window] or 1
       kbdcfg.set(t)
    end
    
    kbdcfg.flag = function (flag)
       naughty.notify({ icon = "/home/hoodoo/.config/awesome/resources/flags/" .. flag .. ".png", icon_size = 140 })
    end
        
    -- Just cycle through all the layouts by one, call the switch function
    kbdcfg.cycle = function ()
       kbdcfg.current = kbdcfg.current % #(kbdcfg.layout) + 1
       kbdcfg.smartswitch(kbdcfg.current)
    end
    
    -- Distinct between Emacs and all the rest, if it's emacs then set input method instead of switch command
    kbdcfg.smartswitch = function (n)
       local layout_description = kbdcfg.layout[n]
       if client.focus.class == 'Emacs' then
	  os.execute( "emacsclient -e " .. '"' .. '(with-current-buffer \\"' .. client.focus.name .. '\\" (set-input-method ' .. layout_description[4] .. '))"' )
       else
	  kbdcfg.set(n)
       end
    end

-- This goes into keys definition
   -- Defined for all variants of the \ button - in Turkish Q there's a comma there, meh
   awful.key({ "Control"         }, "backslash", kbdcfg.cycle ),
   -- awful.key({ "Control"         }, "comma", kbdcfg.cycle ),

Емакс:

(setq frame-title-format '("%b"))