筆者は macOS で Visual Studio Code を使っている。
しかし Fedora では Gedit を使い続けている。
Fedora でも併用しようと考えたけど結局 Gedit しか使わない。
しかし Visual Studio Code には便利すぎる機能がある。
opthon(alt)+shift+down で行の複製ができる、これが超スバラシイ。
fn+left
shift+fn+right
command+c
fn+right
return
command+v
とやっていたことを一発だ、よく使うんだな行の複製って。
ちなみに fn の所は TextEdit.app 同様に command でもいい。
筆者は US 配列なので fn のほうが楽だということで。
てか mac の日本語キーボードは何故 fn が右なのか、マジで糞。
US 配列を店頭でも普通に買えるようにしてくれないかなぁ。
それは今は関係なくて。
Gedit でも同じことがやりたいぞ。
ということで Plugin を探し、、、じゃなくて作る!
何年ぶりの新規プラグイン作りだろう、ワクワク。
#-*- coding:utf-8 -*-
# Gedit repeat plugin version 3.22.0
# Copyright © 2018 sasakima-nao <sasakimanao@gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; _endher version 2 of the License, or
# (at your option) any later version.
import gi, os
gi.require_version("Gtk", "3.0")
gi.require_version("Gedit", "3.0")
gi.require_version("Peas", "1.0")
from gi.repository import GObject, Gedit, Gtk, Gio, GLib
class RepeatLineAppActivatable(GObject.Object, Gedit.AppActivatable):
"""
Set GMenu and Accelerator
"""
app = GObject.Property(type=Gedit.App)
def __init__(self):
GObject.Object.__init__(self)
def do_activate(self):
# "<Alt><Shift>Down" Not Work
self.app.add_accelerator("<Alt><Shift>d", "win.repeatline", None)
self.menu_ext = self.extend_menu("tools-section")
item = Gio.MenuItem.new("Repeat Line", "win.repeatline")
self.menu_ext.append_menu_item(item)
def do_deactivate(self):
self.app.remove_accelerator("win.repeatline", None)
class RepeatLinePlugin(GObject.Object, Gedit.WindowActivatable):
__gtype_name__ = "RepeatLinePlugin"
window = GObject.Property(type=Gedit.Window)
def __init__(self):
GObject.Object.__init__(self)
def do_activate(self):
self.action = Gio.SimpleAction.new("repeatline", None)
self.action.connect('activate', self.on_repeatline_activate)
self.window.add_action(self.action)
def do_deactivate(self):
self.window.remove_action("repeatline")
def do_update_state(self):
self.action.set_enabled(self.window.get_active_document() != None)
def on_repeatline_activate(self, action, param):
view = self.window.get_active_view()
buf = view.get_buffer()
_start_ = buf.get_start_iter()
_end_ = buf.get_end_iter()
spos = buf.props.cursor_position
epos = spos
it = buf.get_iter_at_offset(spos - 1)
line = None
while 1:
# search line start position
if it.equal(_start_) or it.get_char() == "\n":
line = it.copy()
it = buf.get_iter_at_offset(epos)
break
spos -= 1
it = buf.get_iter_at_offset(spos)
while 1:
# search line end position
if it.equal(_end_) or it.get_char() == "\n":
s = line.get_text(it)
if line.equal(_start_):
s = "\n" + s
buf.insert(it, s, -1)
break;
epos += 1
it = buf.get_iter_at_offset(epos)
作ってみた。
残念ながら Alt+Shift+Down は無視された。
Alt+Shift+D でいいやもう。
os.getenv(GEDIT_CURRENT_LINE)
が使えると思ったけどこれはプラグインからは参照できないのね。
しかたがないので GtkTextIter で地味に \n 位置を探すことに。
先頭と最後は \n が無いけどこんな処理でイケた。
何をやっているかは GtkTextBuffer のドキュメントで。
とりあえずこれで Gedit でも同様なことができるぞい。
探せば既にあるかもだけど、プログラミングは経験値だよと一言。