git: a4e552651ca5 - main - editors/ad: Adaptable text editor

From: Robert Clausecker <fuz_at_FreeBSD.org>
Date: Sun, 06 Oct 2024 11:50:10 UTC
The branch main has been updated by fuz:

URL: https://cgit.FreeBSD.org/ports/commit/?id=a4e552651ca542b651d153c21a2e06801959cfe2

commit a4e552651ca542b651d153c21a2e06801959cfe2
Author:     Robert Clausecker <fuz@FreeBSD.org>
AuthorDate: 2024-10-04 14:00:32 +0000
Commit:     Robert Clausecker <fuz@FreeBSD.org>
CommitDate: 2024-10-06 11:49:20 +0000

    editors/ad: Adaptable text editor
    
    ad (pronounced A.D.) is an attempt at combining a modal editing
    interface of likes of vi and kakoune with the approach to extensibility
    of Plan9's Acme.  Inside of ad text is something you can execute as
    well as edit.
    
    It is primarily intended as playground for experimenting with
    implementing various text editor features and currently is not at all
    optimised or feature complete enough for use as your main text editor.
    
    ad is aiming to be a hybrid of the pieces of various editors that I find
    most useful:
    
     - vim style modal editing to allow for convenient key bindings
     - convenient text navigation and selection from vim/kakoune
     - mini-buffer based user defined minor modes from emacs
     - sam/acme style editing commands for larger editing actions
     - acme style extension through exposing editor state and functionality
       for external client programs.
     - support for mouse based navigation and selection but not requiring
       that as the main way of using the editor like in acme.  That's fine
       for desktop but most of the time I'm working with a laptop which
       makes that far too clunky.
    
    ad is not trying to replace vim (or kakoune, or emacs) in terms of being
    a massively hackable editor.  Rather it is trying to follow the
    philosophy of acme in being an integrating development environment
    (rather than integrated).  By which I mean that the aim is to provide a
    comfortable editing environment to work in that supports direct
    interaction with external tools and programs from the outside rather
    than pulling everything in.
    
    WWW: https://crates.io/crates/ad-editor
---
 editors/Makefile                   |   1 +
 editors/ad/Makefile                |  24 +++++
 editors/ad/Makefile.crates         |  87 ++++++++++++++++++
 editors/ad/distinfo                | 177 +++++++++++++++++++++++++++++++++++++
 editors/ad/files/patch-src_util.rs |  20 +++++
 editors/ad/pkg-descr               |  30 +++++++
 6 files changed, 339 insertions(+)

diff --git a/editors/Makefile b/editors/Makefile
index f4faa7a859a2..556ca00fa303 100644
--- a/editors/Makefile
+++ b/editors/Makefile
@@ -3,6 +3,7 @@
     SUBDIR += 2bsd-vi
     SUBDIR += abiword
     SUBDIR += abiword-docs
+    SUBDIR += ad
     SUBDIR += aee
     SUBDIR += aewan
     SUBDIR += amp
diff --git a/editors/ad/Makefile b/editors/ad/Makefile
new file mode 100644
index 000000000000..6d2804df5d0e
--- /dev/null
+++ b/editors/ad/Makefile
@@ -0,0 +1,24 @@
+PORTNAME=	ad
+DISTVERSION=	0.1.2
+CATEGORIES=	editors
+
+MAINTAINER=	fuz@FreeBSD.org
+COMMENT=	Adaptable text editor
+WWW=		https://crates.io/crates/ad-editor
+
+LICENSE=	MIT
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+RUN_DEPENDS=	xclip:x11/xclip
+
+USES=		cargo
+USE_GITHUB=	yes
+GH_ACCOUNT=	sminez
+
+PLIST_FILES=	bin/ad \
+		share/man/man1/ad.1.gz
+
+post-install:
+	${INSTALL_MAN} ${WRKSRC}/doc/man/ad.1 ${STAGEDIR}${PREFIX}/share/man/man1/
+
+.include <bsd.port.mk>
diff --git a/editors/ad/Makefile.crates b/editors/ad/Makefile.crates
new file mode 100644
index 000000000000..cecd24132350
--- /dev/null
+++ b/editors/ad/Makefile.crates
@@ -0,0 +1,87 @@
+CARGO_CRATES=	aho-corasick-1.1.3 \
+		anes-0.1.6 \
+		anstyle-1.0.8 \
+		autocfg-1.3.0 \
+		bitflags-2.6.0 \
+		bumpalo-3.16.0 \
+		cast-0.3.0 \
+		cfg-if-1.0.0 \
+		ciborium-0.2.2 \
+		ciborium-io-0.2.2 \
+		ciborium-ll-0.2.2 \
+		clap-4.5.17 \
+		clap_builder-4.5.17 \
+		clap_lex-0.7.2 \
+		criterion-0.5.1 \
+		criterion-plot-0.5.0 \
+		crossbeam-deque-0.8.5 \
+		crossbeam-epoch-0.9.18 \
+		crossbeam-utils-0.8.20 \
+		crunchy-0.2.2 \
+		either-1.13.0 \
+		half-2.4.1 \
+		hermit-abi-0.4.0 \
+		is-terminal-0.4.13 \
+		itertools-0.10.5 \
+		itoa-1.0.11 \
+		js-sys-0.3.70 \
+		lazy_static-1.5.0 \
+		libc-0.2.158 \
+		log-0.4.22 \
+		memchr-2.7.4 \
+		nu-ansi-term-0.46.0 \
+		num-traits-0.2.19 \
+		once_cell-1.19.0 \
+		oorandom-11.1.4 \
+		overload-0.1.1 \
+		pin-project-lite-0.2.14 \
+		plotters-0.3.7 \
+		plotters-backend-0.3.7 \
+		plotters-svg-0.3.7 \
+		proc-macro2-1.0.86 \
+		quote-1.0.37 \
+		rayon-1.10.0 \
+		rayon-core-1.12.1 \
+		regex-1.10.6 \
+		regex-automata-0.4.7 \
+		regex-syntax-0.8.4 \
+		ryu-1.0.18 \
+		same-file-1.0.6 \
+		serde-1.0.210 \
+		serde_derive-1.0.210 \
+		serde_json-1.0.128 \
+		sharded-slab-0.1.7 \
+		simple_test_case-1.2.0 \
+		smallvec-1.13.2 \
+		syn-2.0.77 \
+		thread_local-1.1.8 \
+		tinytemplate-1.2.1 \
+		tracing-0.1.40 \
+		tracing-attributes-0.1.27 \
+		tracing-core-0.1.32 \
+		tracing-log-0.2.0 \
+		tracing-subscriber-0.3.18 \
+		unicode-ident-1.0.13 \
+		valuable-0.1.0 \
+		walkdir-2.5.0 \
+		wasm-bindgen-0.2.93 \
+		wasm-bindgen-backend-0.2.93 \
+		wasm-bindgen-macro-0.2.93 \
+		wasm-bindgen-macro-support-0.2.93 \
+		wasm-bindgen-shared-0.2.93 \
+		web-sys-0.3.70 \
+		winapi-0.3.9 \
+		winapi-i686-pc-windows-gnu-0.4.0 \
+		winapi-util-0.1.9 \
+		winapi-x86_64-pc-windows-gnu-0.4.0 \
+		windows-sys-0.52.0 \
+		windows-sys-0.59.0 \
+		windows-targets-0.52.6 \
+		windows_aarch64_gnullvm-0.52.6 \
+		windows_aarch64_msvc-0.52.6 \
+		windows_i686_gnu-0.52.6 \
+		windows_i686_gnullvm-0.52.6 \
+		windows_i686_msvc-0.52.6 \
+		windows_x86_64_gnu-0.52.6 \
+		windows_x86_64_gnullvm-0.52.6 \
+		windows_x86_64_msvc-0.52.6
diff --git a/editors/ad/distinfo b/editors/ad/distinfo
new file mode 100644
index 000000000000..a2bd489cdc8a
--- /dev/null
+++ b/editors/ad/distinfo
@@ -0,0 +1,177 @@
+TIMESTAMP = 1728049546
+SHA256 (rust/crates/aho-corasick-1.1.3.crate) = 8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916
+SIZE (rust/crates/aho-corasick-1.1.3.crate) = 183311
+SHA256 (rust/crates/anes-0.1.6.crate) = 4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299
+SIZE (rust/crates/anes-0.1.6.crate) = 23857
+SHA256 (rust/crates/anstyle-1.0.8.crate) = 1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1
+SIZE (rust/crates/anstyle-1.0.8.crate) = 15771
+SHA256 (rust/crates/autocfg-1.3.0.crate) = 0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0
+SIZE (rust/crates/autocfg-1.3.0.crate) = 16524
+SHA256 (rust/crates/bitflags-2.6.0.crate) = b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de
+SIZE (rust/crates/bitflags-2.6.0.crate) = 45357
+SHA256 (rust/crates/bumpalo-3.16.0.crate) = 79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c
+SIZE (rust/crates/bumpalo-3.16.0.crate) = 85677
+SHA256 (rust/crates/cast-0.3.0.crate) = 37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5
+SIZE (rust/crates/cast-0.3.0.crate) = 11452
+SHA256 (rust/crates/cfg-if-1.0.0.crate) = baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd
+SIZE (rust/crates/cfg-if-1.0.0.crate) = 7934
+SHA256 (rust/crates/ciborium-0.2.2.crate) = 42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e
+SIZE (rust/crates/ciborium-0.2.2.crate) = 35611
+SHA256 (rust/crates/ciborium-io-0.2.2.crate) = 05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757
+SIZE (rust/crates/ciborium-io-0.2.2.crate) = 6697
+SHA256 (rust/crates/ciborium-ll-0.2.2.crate) = 57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9
+SIZE (rust/crates/ciborium-ll-0.2.2.crate) = 14695
+SHA256 (rust/crates/clap-4.5.17.crate) = 3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac
+SIZE (rust/crates/clap-4.5.17.crate) = 56802
+SHA256 (rust/crates/clap_builder-4.5.17.crate) = 8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73
+SIZE (rust/crates/clap_builder-4.5.17.crate) = 163559
+SHA256 (rust/crates/clap_lex-0.7.2.crate) = 1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97
+SIZE (rust/crates/clap_lex-0.7.2.crate) = 12805
+SHA256 (rust/crates/criterion-0.5.1.crate) = f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f
+SIZE (rust/crates/criterion-0.5.1.crate) = 110088
+SHA256 (rust/crates/criterion-plot-0.5.0.crate) = 6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1
+SIZE (rust/crates/criterion-plot-0.5.0.crate) = 22706
+SHA256 (rust/crates/crossbeam-deque-0.8.5.crate) = 613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d
+SIZE (rust/crates/crossbeam-deque-0.8.5.crate) = 21726
+SHA256 (rust/crates/crossbeam-epoch-0.9.18.crate) = 5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e
+SIZE (rust/crates/crossbeam-epoch-0.9.18.crate) = 46875
+SHA256 (rust/crates/crossbeam-utils-0.8.20.crate) = 22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80
+SIZE (rust/crates/crossbeam-utils-0.8.20.crate) = 42487
+SHA256 (rust/crates/crunchy-0.2.2.crate) = 7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7
+SIZE (rust/crates/crunchy-0.2.2.crate) = 2995
+SHA256 (rust/crates/either-1.13.0.crate) = 60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0
+SIZE (rust/crates/either-1.13.0.crate) = 19169
+SHA256 (rust/crates/half-2.4.1.crate) = 6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888
+SIZE (rust/crates/half-2.4.1.crate) = 50892
+SHA256 (rust/crates/hermit-abi-0.4.0.crate) = fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc
+SIZE (rust/crates/hermit-abi-0.4.0.crate) = 16310
+SHA256 (rust/crates/is-terminal-0.4.13.crate) = 261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b
+SIZE (rust/crates/is-terminal-0.4.13.crate) = 7665
+SHA256 (rust/crates/itertools-0.10.5.crate) = b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473
+SIZE (rust/crates/itertools-0.10.5.crate) = 115354
+SHA256 (rust/crates/itoa-1.0.11.crate) = 49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b
+SIZE (rust/crates/itoa-1.0.11.crate) = 10563
+SHA256 (rust/crates/js-sys-0.3.70.crate) = 1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a
+SIZE (rust/crates/js-sys-0.3.70.crate) = 53863
+SHA256 (rust/crates/lazy_static-1.5.0.crate) = bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe
+SIZE (rust/crates/lazy_static-1.5.0.crate) = 14025
+SHA256 (rust/crates/libc-0.2.158.crate) = d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439
+SIZE (rust/crates/libc-0.2.158.crate) = 751340
+SHA256 (rust/crates/log-0.4.22.crate) = a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24
+SIZE (rust/crates/log-0.4.22.crate) = 44027
+SHA256 (rust/crates/memchr-2.7.4.crate) = 78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3
+SIZE (rust/crates/memchr-2.7.4.crate) = 96670
+SHA256 (rust/crates/nu-ansi-term-0.46.0.crate) = 77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84
+SIZE (rust/crates/nu-ansi-term-0.46.0.crate) = 24311
+SHA256 (rust/crates/num-traits-0.2.19.crate) = 071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841
+SIZE (rust/crates/num-traits-0.2.19.crate) = 51631
+SHA256 (rust/crates/once_cell-1.19.0.crate) = 3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92
+SIZE (rust/crates/once_cell-1.19.0.crate) = 33046
+SHA256 (rust/crates/oorandom-11.1.4.crate) = b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9
+SIZE (rust/crates/oorandom-11.1.4.crate) = 10201
+SHA256 (rust/crates/overload-0.1.1.crate) = b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39
+SIZE (rust/crates/overload-0.1.1.crate) = 24439
+SHA256 (rust/crates/pin-project-lite-0.2.14.crate) = bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02
+SIZE (rust/crates/pin-project-lite-0.2.14.crate) = 28817
+SHA256 (rust/crates/plotters-0.3.7.crate) = 5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747
+SIZE (rust/crates/plotters-0.3.7.crate) = 149031
+SHA256 (rust/crates/plotters-backend-0.3.7.crate) = df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a
+SIZE (rust/crates/plotters-backend-0.3.7.crate) = 13709
+SHA256 (rust/crates/plotters-svg-0.3.7.crate) = 51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670
+SIZE (rust/crates/plotters-svg-0.3.7.crate) = 6715
+SHA256 (rust/crates/proc-macro2-1.0.86.crate) = 5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77
+SIZE (rust/crates/proc-macro2-1.0.86.crate) = 48958
+SHA256 (rust/crates/quote-1.0.37.crate) = b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af
+SIZE (rust/crates/quote-1.0.37.crate) = 28558
+SHA256 (rust/crates/rayon-1.10.0.crate) = b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa
+SIZE (rust/crates/rayon-1.10.0.crate) = 180155
+SHA256 (rust/crates/rayon-core-1.12.1.crate) = 1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2
+SIZE (rust/crates/rayon-core-1.12.1.crate) = 70701
+SHA256 (rust/crates/regex-1.10.6.crate) = 4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619
+SIZE (rust/crates/regex-1.10.6.crate) = 253894
+SHA256 (rust/crates/regex-automata-0.4.7.crate) = 38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df
+SIZE (rust/crates/regex-automata-0.4.7.crate) = 617582
+SHA256 (rust/crates/regex-syntax-0.8.4.crate) = 7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b
+SIZE (rust/crates/regex-syntax-0.8.4.crate) = 347577
+SHA256 (rust/crates/ryu-1.0.18.crate) = f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f
+SIZE (rust/crates/ryu-1.0.18.crate) = 47713
+SHA256 (rust/crates/same-file-1.0.6.crate) = 93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502
+SIZE (rust/crates/same-file-1.0.6.crate) = 10183
+SHA256 (rust/crates/serde-1.0.210.crate) = c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a
+SIZE (rust/crates/serde-1.0.210.crate) = 78338
+SHA256 (rust/crates/serde_derive-1.0.210.crate) = 243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f
+SIZE (rust/crates/serde_derive-1.0.210.crate) = 56020
+SHA256 (rust/crates/serde_json-1.0.128.crate) = 6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8
+SIZE (rust/crates/serde_json-1.0.128.crate) = 149520
+SHA256 (rust/crates/sharded-slab-0.1.7.crate) = f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6
+SIZE (rust/crates/sharded-slab-0.1.7.crate) = 58227
+SHA256 (rust/crates/simple_test_case-1.2.0.crate) = 5d0649fa40b80dcacda1cabd018fd47b6b0c7fbbda6e1c3f658a6c4d5926500a
+SIZE (rust/crates/simple_test_case-1.2.0.crate) = 9956
+SHA256 (rust/crates/smallvec-1.13.2.crate) = 3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67
+SIZE (rust/crates/smallvec-1.13.2.crate) = 35216
+SHA256 (rust/crates/syn-2.0.77.crate) = 9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed
+SIZE (rust/crates/syn-2.0.77.crate) = 268784
+SHA256 (rust/crates/thread_local-1.1.8.crate) = 8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c
+SIZE (rust/crates/thread_local-1.1.8.crate) = 13962
+SHA256 (rust/crates/tinytemplate-1.2.1.crate) = be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc
+SIZE (rust/crates/tinytemplate-1.2.1.crate) = 26490
+SHA256 (rust/crates/tracing-0.1.40.crate) = c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef
+SIZE (rust/crates/tracing-0.1.40.crate) = 79459
+SHA256 (rust/crates/tracing-attributes-0.1.27.crate) = 34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7
+SIZE (rust/crates/tracing-attributes-0.1.27.crate) = 32241
+SHA256 (rust/crates/tracing-core-0.1.32.crate) = c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54
+SIZE (rust/crates/tracing-core-0.1.32.crate) = 61221
+SHA256 (rust/crates/tracing-log-0.2.0.crate) = ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3
+SIZE (rust/crates/tracing-log-0.2.0.crate) = 17561
+SHA256 (rust/crates/tracing-subscriber-0.3.18.crate) = ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b
+SIZE (rust/crates/tracing-subscriber-0.3.18.crate) = 196312
+SHA256 (rust/crates/unicode-ident-1.0.13.crate) = e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe
+SIZE (rust/crates/unicode-ident-1.0.13.crate) = 43279
+SHA256 (rust/crates/valuable-0.1.0.crate) = 830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d
+SIZE (rust/crates/valuable-0.1.0.crate) = 27718
+SHA256 (rust/crates/walkdir-2.5.0.crate) = 29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b
+SIZE (rust/crates/walkdir-2.5.0.crate) = 23951
+SHA256 (rust/crates/wasm-bindgen-0.2.93.crate) = a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5
+SIZE (rust/crates/wasm-bindgen-0.2.93.crate) = 43769
+SHA256 (rust/crates/wasm-bindgen-backend-0.2.93.crate) = 9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b
+SIZE (rust/crates/wasm-bindgen-backend-0.2.93.crate) = 30344
+SHA256 (rust/crates/wasm-bindgen-macro-0.2.93.crate) = 585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf
+SIZE (rust/crates/wasm-bindgen-macro-0.2.93.crate) = 6822
+SHA256 (rust/crates/wasm-bindgen-macro-support-0.2.93.crate) = afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836
+SIZE (rust/crates/wasm-bindgen-macro-support-0.2.93.crate) = 20642
+SHA256 (rust/crates/wasm-bindgen-shared-0.2.93.crate) = c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484
+SIZE (rust/crates/wasm-bindgen-shared-0.2.93.crate) = 7527
+SHA256 (rust/crates/web-sys-0.3.70.crate) = 26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0
+SIZE (rust/crates/web-sys-0.3.70.crate) = 615438
+SHA256 (rust/crates/winapi-0.3.9.crate) = 5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419
+SIZE (rust/crates/winapi-0.3.9.crate) = 1200382
+SHA256 (rust/crates/winapi-i686-pc-windows-gnu-0.4.0.crate) = ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6
+SIZE (rust/crates/winapi-i686-pc-windows-gnu-0.4.0.crate) = 2918815
+SHA256 (rust/crates/winapi-util-0.1.9.crate) = cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb
+SIZE (rust/crates/winapi-util-0.1.9.crate) = 12464
+SHA256 (rust/crates/winapi-x86_64-pc-windows-gnu-0.4.0.crate) = 712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f
+SIZE (rust/crates/winapi-x86_64-pc-windows-gnu-0.4.0.crate) = 2947998
+SHA256 (rust/crates/windows-sys-0.52.0.crate) = 282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d
+SIZE (rust/crates/windows-sys-0.52.0.crate) = 2576877
+SHA256 (rust/crates/windows-sys-0.59.0.crate) = 1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b
+SIZE (rust/crates/windows-sys-0.59.0.crate) = 2387323
+SHA256 (rust/crates/windows-targets-0.52.6.crate) = 9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973
+SIZE (rust/crates/windows-targets-0.52.6.crate) = 6403
+SHA256 (rust/crates/windows_aarch64_gnullvm-0.52.6.crate) = 32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3
+SIZE (rust/crates/windows_aarch64_gnullvm-0.52.6.crate) = 435718
+SHA256 (rust/crates/windows_aarch64_msvc-0.52.6.crate) = 09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469
+SIZE (rust/crates/windows_aarch64_msvc-0.52.6.crate) = 832615
+SHA256 (rust/crates/windows_i686_gnu-0.52.6.crate) = 8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b
+SIZE (rust/crates/windows_i686_gnu-0.52.6.crate) = 880402
+SHA256 (rust/crates/windows_i686_gnullvm-0.52.6.crate) = 0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66
+SIZE (rust/crates/windows_i686_gnullvm-0.52.6.crate) = 475940
+SHA256 (rust/crates/windows_i686_msvc-0.52.6.crate) = 240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66
+SIZE (rust/crates/windows_i686_msvc-0.52.6.crate) = 901163
+SHA256 (rust/crates/windows_x86_64_gnu-0.52.6.crate) = 147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78
+SIZE (rust/crates/windows_x86_64_gnu-0.52.6.crate) = 836363
+SHA256 (rust/crates/windows_x86_64_gnullvm-0.52.6.crate) = 24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d
+SIZE (rust/crates/windows_x86_64_gnullvm-0.52.6.crate) = 435707
+SHA256 (rust/crates/windows_x86_64_msvc-0.52.6.crate) = 589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec
+SIZE (rust/crates/windows_x86_64_msvc-0.52.6.crate) = 832564
+SHA256 (sminez-ad-0.1.2_GH0.tar.gz) = 859b45bcde3fe4b4aeb93bd8a9a059963552763082b72d0f37ded808e693c782
+SIZE (sminez-ad-0.1.2_GH0.tar.gz) = 476497
diff --git a/editors/ad/files/patch-src_util.rs b/editors/ad/files/patch-src_util.rs
new file mode 100644
index 000000000000..6cb43d5d1a5b
--- /dev/null
+++ b/editors/ad/files/patch-src_util.rs
@@ -0,0 +1,20 @@
+--- src/util.rs.orig	2024-10-04 13:50:39 UTC
++++ src/util.rs
+@@ -12,7 +12,7 @@ use std::{
+     thread::spawn,
+ };
+ 
+-#[cfg(target_os = "linux")]
++#[cfg(any(target_os = "linux", target_os = "freebsd"))]
+ /// Set the current system clipboard state using xclip.
+ pub fn set_clipboard(s: &str) -> io::Result<()> {
+     let mut child = Command::new("xclip")
+@@ -23,7 +23,7 @@ pub fn set_clipboard(s: &str) -> io::Result<()> {
+     child.stdin.take().unwrap().write_all(s.as_bytes())
+ }
+ 
+-#[cfg(target_os = "linux")]
++#[cfg(any(target_os = "linux", target_os = "freebsd"))]
+ /// Read the current system clipboard state using xclip.
+ pub fn read_clipboard() -> io::Result<String> {
+     let output = Command::new("xclip")
diff --git a/editors/ad/pkg-descr b/editors/ad/pkg-descr
new file mode 100644
index 000000000000..a01ac1c64815
--- /dev/null
+++ b/editors/ad/pkg-descr
@@ -0,0 +1,30 @@
+ad (pronounced A.D.) is an attempt at combining a modal editing
+interface of likes of vi and kakoune with the approach to extensibility
+of Plan9's Acme.  Inside of ad text is something you can execute as
+well as edit.
+
+It is primarily intended as playground for experimenting with
+implementing various text editor features and currently is not at all
+optimised or feature complete enough for use as your main text editor.
+
+ad is aiming to be a hybrid of the pieces of various editors that I find
+most useful:
+
+ - vim style modal editing to allow for convenient key bindings
+ - convenient text navigation and selection from vim/kakoune
+ - mini-buffer based user defined minor modes from emacs
+ - sam/acme style editing commands for larger editing actions
+ - acme style extension through exposing editor state and functionality
+   for external client programs.
+ - support for mouse based navigation and selection but not requiring
+   that as the main way of using the editor like in acme.  That's fine
+   for desktop but most of the time I'm working with a laptop which
+   makes that far too clunky.
+
+ad is not trying to replace vim (or kakoune, or emacs) in terms of being
+a massively hackable editor.  Rather it is trying to follow the
+philosophy of acme in being an integrating development environment
+(rather than integrated).  By which I mean that the aim is to provide a
+comfortable editing environment to work in that supports direct
+interaction with external tools and programs from the outside rather
+than pulling everything in.