Gedit」タグアーカイブ

gnome-text-editor: snippets

gnome-text-editor には謎の設定がある。

dconf

コードスニペットの有効を切り替える設定だと思うんですけど。
F1 でのヘルプにも公式サイトにも説明が無い、いったい何なんだコレ?
試しに Gedit のスニペットファイルを同様にコピーしても動かない。

ぶっちゃけ筆者を含めて今でもほとんどの人が Gedit を使っていると思うけど。
Gedit は GTK3 だしメンテも消極的、数年前の Python2 と同じ状況。
こっちでもスニペットが使えるならいいかげんに切り替え候補にはなる。
ということで使い方を自力で調べてみる。

gio open /usr/share/gtksourceview-5/snippets

default

こんなディレクトリがあった。
licenses.snippets を Gedit とかで開いてみよう。

<?xml version="1.0" encoding="UTF-8"?>
<snippets _group="Licenses">
  <snippet _name="GPLv3 or later" trigger="gpl3" _description="File header with GPLv3+ license">
    <tooltip position="1" text="The name of the file belongs here"/>
    <tooltip position="2" text="The name of the author belongs here"/>
    <tooltip position="3" text="The email address of the author belongs here"/>
    <text languages="python;python3;"><![CDATA[# ${1:$TM_FILENAME}

あぁなるほど、こんな XML を書けば適用できるのね。
というかデフォルトでは GPL3 等のライセンスしか登録されていないってか。

とにかくデフォルトのを試す、最初の設定を true に設定しておくのを忘れずに。
python ファイルを gnome-text-editor で開く、gpl3 と打ち込み [Tab] キーを叩く。

tabkey

XML の指定が違うだけでスニペットの使い方は Gedit と同じですね。
後は名前 [Tab] 日付 [Tab] メールアドレス [Tab] で完成っと。
使い方が解ったところで追加のスニペットを登録してみる。

<?xml version="1.0" encoding="utf-8"?>
<snippets _group="Shebang">
  <snippet _name="Insert Shebang" trigger="sh" _description="pass">
    <text languages="python;python3"><![CDATA[#!/usr/bin/env python3
$0]]></text>
    <text languages="js"><![CDATA[#!/usr/bin/gjs
$0]]></text>
    <text languages="sh"><![CDATA[#!/bin/sh
$0]]></text>
  </snippet>
</snippets>

sh をトリガーにしてシバンを流し込む例。
シェバングなんて読んでは駄目ですよ、末尾の g は発音しないと中学で(以下略
コレに snippets の拡張子を付け以下に保存、ディレクトリは自分で作成。

~/.local/share/gtksourceview-5/snippets

set

後は py や sh ファイルを開いて sh と打ち込み [Tab] キーを。
こんな感じでスニペットを追加登録できるようです、チトめんどいぞ。

ところでシバンといえば。
そもそも Fedora 38 な現在 /usr/bin/python は Python3 へのリンクなんです。

link

なので今では python に 3 指定は不要なんです、ただ Gedit を使う限りは必要。
このシバンが無いと Gedit は Python2 と認識してしまう困った奴なんです。
3 指定無しで match case 文を書けば色分けされないことがすぐ解るよ。
gnome-text-editor なら 3 指定は不要なんですけど。
それがそろそろ気になってきた、ということでこんなことやってます。

いや筆者は macOS で sublime text を購入しているので Linux でも使えるんだけど。
なるべくならデフォルト (GTK4) の UI を使いたいよねって。

Gedit: fstring Highlighting

Gedit が Ctrl+Q で終了する、あれ?
今まではドキュメントを全部閉じてからでないと終了できなかったはず。
面倒だから Ctrl+W の連続押しをずっと使ってきたんだが、いつからだ?

NEWS ? master ? GNOME / gedit ? GitLab

書いていない、もしかして今まではバグだったとかだろうか。
Ctrl+F9 が Wayland では Ctrl を認識しないのは変わっていないけど。
てか GNOME 同梱から外れたのに開発は続いているみたい、GTK3 のまま。
まあいいや、今度から Ctrl+Q を使おう。

せっかくなので Gedit 小ネタ。

Gedit で Python を書いていて不満なこと。
fstring が色分けされない、いやこれは。

/usr/share/gtksourceview-4/language-specs/python3.lang

に認識する定義を書き込めば反映されるんですけど。
gnome-text-editor は色分けされるのでコレ用をそのまま反映させたい。
GTK3(GtkSource 4) と GTK4(GtkSource 5) で違うけど仕様は同じみたいですし。
GtkSource 4 の LanguageManager がドコを参照しているか調べる。

#!/usr/bin/env python3

import gi
gi.require_version('GtkSource', '4')

from gi.repository import GtkSource

man = GtkSource.LanguageManager.get_default()
print(man.props.search_path)

path

~/.local/share/gtksourceview-4/language-specs

が一番最初の参照先になる、$PATH と同じ UNIX お馴染みな仕様。
ココに GtkSource 5 用の python3.lang をコピーすればいいはず。

mkdir ~/.local/share/gtksourceview-4
cd ~/.local/share/gtksourceview-4
mkdir language-specs
cp /usr/share/gtksourceview-5/language-specs/python3.lang language-specs/

gedit

よしコレで fstring のストレスは無くなったぞい。
他の gnome-text-editor との色違いも同じ手段で同じにできるよ。

いや、本当はプラグインでやろうと思ったんだけど。
GtkSource.LanguageManager.set_search_path() がエラーになるのよね何故か。

editorconfig Gedit 41

「秀丸エディタ」が10年以上ぶりのメジャーバージョンアップ ?v9.00が正式版に – 窓の杜

Windows は会社でしか使わなくなって何年もたつので今頃知ったけど。
editorconfig って何だろう、モードラインよりイイのか?

チーム開発に効く環境構築術 | 第1回 EditorConfigのススメ | CodeGrid

モードラインじゃダメなのか?って感じだな。
あぁ VSCode というゴミクソエディタがモードラインを使えないからか。

EditorConfig

対応エディタって、よく見たら全部単なるプラグインじゃん。
Gedit のプラグインもあるのでチビッと試してみるか。

GitHub – editorconfig/editorconfig-gedit: EditorConfig plugin for Gedit

Gedit 41 だけど Gedit 3 用で動くだろう。
でもいきなり Installation が間違っています。

editorconfig.plugin
editorconfig_gedit3.py
editorconfig_plugin

editorconfig-core-py の中にある editorconfig
ディレクトリのコピーが必要でした。

editconfig

それと以下を書き換えする必要がありました。

editorconfig.plugin にて Loader=python3 に書き換え。
Loader=python のままでは Python2 を呼び出そうとする。

editorconfig_plugin/gedit3.py にて。
document.get_location は Gedit 40 から使えなくなっています。

#location = document.get_location()
location = document.get_file().get_location()

後は設定で有効にして .editorconfig を書いて。
筆者は Tab 設定を Python ガイドラインな半角スペース 4 つにしているので。

root = true

[*]
indent_style = tab
indent_size = 8

おぉ反映されるようになりました。
たださ。

// ex: noet ts=8

モードラインなら最終行にコレ書くだけでまったく同じことができるんだよね。
Gedit なら最初からプラグイン入っているし Atom にもプラグインあるし。

いや筆者はモードラインも拡張子が無いスクリプトに ft 指定するだけなんだが。
ただ Gedit も Atom もファイル判別が優秀すぎて滅多に必要が無いんだなこれが。

てかコレ別ファイルに記述なのでファイルタイプ指定ができないし。
拡張子が必ずある Windows 専用ですね。

Gedit 40 Plugin

Gedit v40 は何も変わっていないように見えるが実は凄い進化をしていた。
ファイルをいくつ開いていても Ctrl+Q で終了できるようになっていた。
いや昔はそうだったような、記憶があいまいだけど。
とにかく最近は Ctrl+W で全部閉じた後に自身を Ctrl+W で閉じる必要があった。

地味に面倒くさかったのでこれは嬉しい。
Mac の Finder もこうしてくれないかなぁ、同じなんだが。

ところで。

筆者は自作 Gedit プラグインを公開していますけど。
repeat_line と a_href_picture の2つが v40 で動かなかった。
gir の指定を変更しなきゃなのかな。

gir3

3.0 のままじゃん。

gedit/meson.build ? master ? GNOME / gedit ? GitLab

本体は GTK3 のままで GtkSourceView4 になったってことみたい。
そりゃ IArg=3 指定のままプラグインは動いて当然だった。
よく考えたらプラグインで措定している Gtk も 3.0 のままだね。

repeat_line の不具合は簡単。
<Super> や Up|Down を set_accels_for_action 指定できなくなった。
困ったけどしかたがない、Ctrl+Alt+u Ctrl+Alt+d に変更しよう。

ついでにバグ修正、上記を実験している時に原因を発見したので。
行末でこのプラグインを動かしたら変な所にカーソルが飛ぶんだけど。
LF の後に流し込みをすると cursor_position も移動しちゃうのね。

# Check cursol position is LF?
is_lf = buf.get_iter_at_offset(buf.props.cursor_position).get_char() == '\n'

でカーソル位置が LF だった場合は自力で移動をしないことで回避。
最初に作った時はこんな処理いらなかったはずだけどなぁ。

a_href_picture のほうは結構困った。
「get_uri_for_display なんてメソッド無いよ?」
と怒られるんだけど公式サイトは以前のまま、解説が何も存在しない。
しかたがないので python の dir を使って自力で漁った。

doc = self.window.get_active_document()
#path = doc.get_uri_for_display() # under 3.38
#print(dir(doc)) # check method name
efile = doc.get_file()       # Gedit File Object
gfile = efile.get_location() # GFile
path = gfile.get_path()      # location string

無駄な処理をしている気がするけど今はこの手段しか見つからない。
そういえば GTK3 の最初期もこんなことをやったなぁ。
端末から gedit を立ち上げればこの stdout は出力できる。

修正はできたけどコレだけじゃ寂しいな。
そうだ html_escape にアンエスケープ機能の追加でも。
Python の html モジュールを使うだけ、2分で完成。
後は完全に GTK4 になった時に弄くるだろうしでそのまま。

しかし何故プラグインだけは古いバージョンの公開を続けているのか?
ページ内容が寂しかったという理由だけど今は公開数も増えたし。
最新版と一つ前だけ公開に変更しよう。

Gedit2 や Windows 版も今はもういいかなって。
Ubuntu は Gedit 3.12 にメニューバーを付けた前科を忘れないぞ。

Gedit 及び Eye of Gnome プラグイン – Paepoi

ということで Gedit version 40 版プラグイン公開しました。
関係ないけど EoG プラグインの画像が凄く古かったので差し替えた。

Open Terminal in Atom and Gedit

macOS 上の Atom で Terminal.app を一発で開きたい。
もちろん編集中ファイルの位置をカレントディレクトリにして。
Gedit, VScode には最初からその機能があったけど Atom には無いのね。

早速拡張をインス、、、、、なんてしないよ。
拡張のインストールネタをやっている輩は何もアプリが作れない人だけです(暴言)
プログラミングの実力は経験値だけなのに他人が作ったものに頼っている時点でねぇ。

それと Atom ウインドウ内部で開くターミナルを勧めている輩は何だよ。
debug 目的なんだから別プロセスにしなきゃ困るだろ、と思うんだが。
って、それは別の話ということで。

Atom は Node.js 製なので child_process.exec が使える。
Gjs, jjs, JXA, Node.js – L’Isola di Niente
後はカレントディレクトリを得る手段さえ解ればアッサリ作れるはず。

いや、coffeescript という Atom の拡張以外の使い道が思いつかない言語が。。。。。
世の中にはレールなんとか以外の使い道がゼロの言語を推すみたいな人もいるけどさ。
面倒だ、既存拡張のソースを見てしまえ!

GitHub – blueimp/atom-open-terminal-here: Open the Terminal (Mac OS X, Linux) or Command Prompt (Windows) in the given directory via context menu or keyboard shortcut in the Atom text editor.

index.coffee を見る。
child_process.exec は coffeescript ではこう書けばいいのか。
atom.workspace.getActivePaneItem() から辿って編集中パスが得られるようだ。
x-terminal-emulator って何かと調べたらサル専用ディストリだけじゃん。
サルブンツ以外の Linux 使いは結局自分で作らないといけなかったわwwwww

そういえばテンプレートリテラルは coffeescript ではどう描くの?
Template literals in Coffeescript (Example)
ダブルクォートとシャープって何よ、JS と同じバッククォートとドルでいいじゃん。
従うしかないけーが、ダブルクォートのエスケープめんどいな。

Atom を Gedit のように使う – L’Isola di Niente
これに追記する。

init.coffee

atom.commands.add 'atom-text-editor', 'editor:open-terminal', ->
    path = atom.workspace.getActivePaneItem()?.buffer?.file?.path
    dirname = require('path').dirname(path)
    require('child_process').exec "open -a Terminal \"#{dirname}\""

keymap.cson

'atom-workspace atom-text-editor:not([mini])':
    #etc...
    'alt-cmd-t': 'editor:open-terminal'

command+option+T で Terminal.app を開く機能追加おしまい。
ほとんどコピペだけどこの手段が解ってしまえば応用もできるし書き方も覚えた。
経験値はこんなことの積み重ねです。

ちなみに筆者は自前拡張呼び出しは command+option+* に統一している。
Gedit では Ctrl+Alt+* と同じように統一している。
Gedit 及び Eye of Gnome プラグイン – L’Isola di Niente
そうでもしないと自分で指定したはずのキーを結構忘れるんですよコレが。
拡張を沢山インストールって人は他人が決めたキーを全部覚えるのだろうか?

おまけ。

Gedit にこの機能は最初からあるけど 3.32 は起動すると stderr を吐く。
端末から gnome-terminal と打って起動すれば同じ stderr を吐くのが解る。
ということで標準の外部ツールを書き換えしましょう。

#!/bin/sh

gnome-terminal --working-directory=$GEDIT_CURRENT_DOCUMENT_DIR > /dev/null 2>&1 &

Ctrl+Alt+T にして入出力はすべて無しに。
これで stderr の赤い出力が出なくなるのでボトムパネルも開かなくなります。