From 389e9617a93b217fe148dcdd69a4a0955058c5d3 Mon Sep 17 00:00:00 2001 From: graelo Date: Tue, 26 Oct 2021 09:25:29 +0200 Subject: [PATCH] refactor: quoted-tick -> quoted-backtick --- README.md | 25 +++++++++++++------------ copyrat.tmux | 2 +- images/copyrat-output.png | Bin 108309 -> 91269 bytes src/textbuf/mod.rs | 2 +- src/textbuf/regexes.rs | 2 +- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index bfea4fe..74f091c 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ press the caps version of the key hint (for instance E instead of e), or first toggle the destination buffer with the space key and press the hint with no caps. -You can also use the n and p (or Up and +You can also use the n and N (or Up and Down) keys to move focus across the highlighted spans. Press y to yank the focused span into the tmux buffer, or press Y to yank it into the system clipboard. @@ -51,7 +51,7 @@ go back to the first span. ### Matched patterns and default key-bindings tmux-copyrat can match one or more pre-defined (named) patterns, but you can -add your own too. +add your own too (see [CONFIGURATION.md]). The default configuration provided in the [`copyrat.tmux`](copyrat.tmux) plugin file provides the following key-bindings. Because they all start with @@ -72,7 +72,7 @@ should type prefix + t + u. | P | Hex numbers and pointer addresses | `pointer-address` | | | strings inside single quotes | `quoted-single` | | | strings inside double quotes | `quoted-double` | -| | strings inside backticks | `quoted-tick` | +| | strings inside backticks | `quoted-backtick` | | q | strings inside single/double/backticks | | | u | URLs | `url` | | U | UUIDs | `uuid` | @@ -81,16 +81,12 @@ should type prefix + t + u. | 6 | IPv6 addresses | `6` | | space | All patterns | | -If you want additional patterns, you can provide them via the -`--custom-pattern` command line option (short option: `-X`), see -[CONFIGURATION.md]. - ## The `copyrat` companion executable The central binary of this crate is `tmux-copyrat`, however there is also the -`copyrat` executable. It simply provides the same functionality, without any -tmux dependency or integration. +`copyrat` executable which provides the same functionality minus any tmux +dependency or integration and instead reads from stdin. You can use `copyrat` to search a span of text that you provide to stdin. @@ -98,8 +94,8 @@ For instance here is a bunch of text, with dates and git hashes which you can search with copyrat. ```console -$ echo -n '* e006b06 - (12 days ago = 2021-03-04T12:23:34) e006b06 e006b06 swapper: Make quotes\n/usr/local/bin/git\n\nlorem\n/usr/local/bin\nlorem\n/usr/local/bin/git\n* e006b06 - (12 days ago = 2021-03-04T12:23:34) e006b06 e006b06 swapper: Make quotes' \ - | ./target/release/copyrat -r --unique-hint -s bold -X '(loca)' -x sha datetime +$ echo -n '* e006b06 - (12 days ago = 2021-03-04T12:23:34) e006b06 e006b06 swapper: Make quotes\n/usr/local/bin/git\n\nlorem\n/usr/local/bin\nlorem\nThe error was `Error no such file`\n/usr/local/bin/git' \ + | ./target/release/copyrat -r --unique-hint -s bold -X '(loca)' -x sha datetime quoted-backtick ``` You will see the following in your terminal @@ -107,7 +103,12 @@ You will see the following in your terminal ![[copyrat-output.png](images/copyrat-output.png)](images/copyrat-output.png) You may have noticed that all identical spans share the same _hint_, this is -due to the `-unique-hint` option (`-u`). The hints are in bold text, due to the `--hint-style bold` option (`-s`). +due to the `-unique-hint` option (`-u`). The hints are in bold text, due to the +`--hint-style bold` option (`-s`). Hints start from the bottom, due to the +`--reverse` option (`-r`). A custom pattern was provided for matching any +"loca", due to the `--custom-regex-pattern` option (`-X`). The sha, datetime +and content inside backticks were highlighted due to the `--named-pattern` +option (`-x`). ## Tmux compatibility diff --git a/copyrat.tmux b/copyrat.tmux index 98cdfa6..68d131f 100755 --- a/copyrat.tmux +++ b/copyrat.tmux @@ -98,7 +98,7 @@ setup_pattern_binding "p" "--pattern-name path" # prefix + t + P searches for hex numbers: 0xbedead setup_pattern_binding "P" "--pattern-name pointer-address" # prefix + t + q searches for strings inside single|double|backticks -setup_pattern_binding "q" "-x quoted-single -x quoted-double -x quoted-tick" +setup_pattern_binding "q" "-x quoted-single -x quoted-double -x quoted-backtick" # prefix + t + u searches for URLs setup_pattern_binding "u" "--pattern-name url" # prefix + t + U searches for UUIDs diff --git a/images/copyrat-output.png b/images/copyrat-output.png index f6d34f6069b323459ee3a0d0058e6a2900c269a7..2b8d0201bd7e03945db10f59926d9115fdce3d4d 100644 GIT binary patch delta 88066 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