Encoding in statusbar (gedit plugin) - Dokumentum karakter kódolásának megjelenítése az állapotsorban

A probléma: A gedit egy elég okos általános szövegszerkesztő, viszont nem jelzi ki az aktív fájl karakter kódolását.

Sokszor előfordul, hogy különböző kódolású állományokkal kell dolgozni. Alapértelmezetten a szerkesztő autómatikusan fel tudja ismerni a kódolást a fájl megnyitásakor, és ha ez mégsem sikerülne, akkor kézzel ki tudjuk választani, hogy milyen kódolással nyissa meg az adott állományt. Mentéskor (save as...) szintén meg tudjuk adni, hogy milyen sor-végződéssel (CR/LF) és kódolással szeretnénk menteni az adott fájlt.

Két kapcsolódó funkciót hiányoltam: Egyrészt szerettem volna valamilyen visszajelzést kapni arról, hogy a megnyitott fájt milyen kódolással nyitotta meg a szerkesztő - automatikus felismerés esetén ez kiemelten fontos. Másrészt szükség lehet arra, hogy egyszerűen megváltoztassuk az éppen használt karakter kódolást. Itt nem az állomány konvertálásáról beszélek, hanem arról, hogy miként jeleníti meg a szövegszerkesztő a betöltött fájl karaktereit.

A második probléma egy ismert hiányosság amire más már készített olyan gedit-bővítményt, ami egy menüpont alatt felsorolja a karakter kódolásokat, és ha ráböksz, a kiválasztott kódolással újratölti az aktív dokumentumot. Ez megoldja a probléma egyik felét...

Sajnos még mindig nem kapunk vizuális visszajelzést az aktuális karakter kódolásról, így hát némi howto után billentyűzetet ragadtam... Cél egy olyan plugin létrehozása, ami az állapotsorban jelzi az éppen aktív fülön használt karakter kódolást.

Frissítés

A Gedit3-ra váltás miatt teljesen át kellett írnom a bővítményt. A kezdeti quick and dirty változatot úgy fejlesztettem tovább, hogy az a signálok megfelelő használata útján csak akkor hívja meg a GUI frissítő logikát, amikor az tényleg szükséges.

Telepítés

gedit 2

A bővítmény két fájlból áll: egy leíróból (encoding-in-statusbar.gedit-plugin) és magából a python forrásból (encoding-in-statusbar.py). Ezeket kell belepottyantani a ~/.gnome2/gedit/plugins mappába, majd elindítani a szövegszerkesztőt, és Edit / Preferences / Plugins alatt engélyezni a bővítményt.

gedit 3

A verzióváltás során a gedit belső architektúrája jelentősen megváltzott, így a legtöbb gedit2 bővítmény használhatatlanná vált. A leírót (encoding-in-statusbar.plugin) és a python forrást (encoding-in-statusbar.py) az új verziónál a ~/.local/share/gedit/plugins mappába kell pottyantani, majd elindítani a szövegszerkesztőt, és szintén az Edit / Preferences / Plugins alatt engélyezni a bővítményt.

Forrás

gedit 2


#
# Encoding in statusbar (gedit plugin) - Display document encoding in statusbar
# 
# Copyright 2011 Tibor Bősze <tibor.boesze@gmail.com>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

import gtk
import gedit

class EncodingInStatusBarWindowHelper:
    def __init__(self, plugin, window):
        self._window = window
        self._plugin = plugin
        self._frame = gtk.Frame()
        self._label = gtk.Label()
        self._frame.add(self._label)
        self.update_ui()
        window.get_statusbar().pack_end(self._frame, False, False)
        self._frame.show_all()

    def deactivate(self):
        gtk.HBox.remove(self._window.get_statusbar(), self._frame)
        self._window = None
        self._plugin = None
        self._frame = None
        self._label = None

    def update_ui(self):
        doc = self._window.get_active_document()
        if doc:
            self._label.set_text(doc.get_encoding().to_string())
        else:
            self._label.set_text('(no encoding)');

class EncodingInStatusBarPlugin(gedit.Plugin):
    def __init__(self):
        super(gedit.Plugin, self).__init__()
        self._instances = {}

    def activate(self, window):
        self._instances[window] = EncodingInStatusBarWindowHelper(self, window)

    def deactivate(self, window):
        self._instances[window].deactivate()
        del self._instances[window]

    def update_ui(self, window):
        self._instances[window].update_ui()

[Gedit Plugin]
Loader=python
Module=encoding-in-statusbar
IAge=2
Name=Encoding in statusbar
Description=Display document encoding in statusbar
Authors=Tibor Bősze <tibor.boesze@gmail.com>
Copyright=Copyright © 2011 Tibor Bősze <tibor.boesze@gmail.com>
Website=http://lithium.io7.org/~shanq/bitsnbytes/encoding-in-statusbar.html
Icon=gucharmap
Version=0.1

gedit 3


# -*- coding: UTF-8 -*-
#
# Encoding in statusbar (gedit plugin) - Display document encoding in statusbar
# 
# Copyright 2012 Tibor Bősze <tibor.boesze@gmail.com>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

from gi.repository import GObject, Gtk, Gedit

class EncodingInStatusbar(GObject.Object, Gedit.WindowActivatable):
    __gtype_name__ = "EncodingInStatusbar"
    window = GObject.property(type=Gedit.Window)
   
    def __init__(self):
        GObject.Object.__init__(self)
        
    def do_activate(self):
        self._label = Gtk.Label()
        self.window.get_statusbar().pack_end(self._label, False, False, 5)
        self._label.show()
        handlers = []        
        handlers.append(self.window.connect("active_tab_changed", self._on_active_tab_change))
        handlers.append(self.window.connect("active_tab_state_changed", self._on_active_tab_state_change))
        self.window.set_data(self.__gtype_name__, handlers);
        self._update_via_doc(self.window.get_active_document())

    def do_deactivate(self):
        Gtk.Container.remove(self.window.get_statusbar(), self._label)
        del self._label
        for handler in self.window.get_data(self.__gtype_name__):
            self.window.disconnect(handler)

    def do_update_state(self):
        pass

    def _update_via_doc(self, doc):
        if doc:
            self._label.set_text(doc.get_encoding().to_string())            
        else:
            self._label.set_text('(no encoding)');

    def _on_active_tab_change(self, window, tab):
        self._update_via_doc(tab.get_document())

    def _on_active_tab_state_change(self, window):
        if Gedit.TabState.STATE_NORMAL == window.get_active_tab().get_state():
            self._update_via_doc(self.window.get_active_document())


[Plugin]
Loader=python
Module=encoding-in-statusbar
IAge=3
Name=Encoding in statusbar
Description=Display document encoding in statusbar
Authors=Tibor Bősze <tibor.boesze@gmail.com>
Copyright=Copyright © 2012 Tibor Bősze <tibor.boesze@gmail.com>
Website=http://lithium.io7.org/~shanq/bitsnbytes/encoding-in-statusbar.html
Icon=gucharmap
Version=0.3
© 2003-2020 lithium.io7.org
Erre a weblapra a Creative Commons Nevezd meg! - Így add tovább! 3.0 Unported Licensz vonatkozik.