summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRed S <redstreet@users.noreply.github.com>2023-07-16 08:57:02 +0000
committerJesse Duffield <jessedduffield@gmail.com>2023-07-29 19:09:59 +1000
commitd7f84aed8a228fa6316803b5e766886e7aa96647 (patch)
treeff08137964e8ba7dcdcbc42b2113c15c756b8f53
parent7e9f66942119d8ce6b00fee61554f7947d2d5f56 (diff)
feat: add os.copyToClipboardCmd to allow for a custom command
Issue #1055 test: CopyPatchToClipboard (temporary commit for review)
-rw-r--r--docs/Config.md15
-rw-r--r--pkg/commands/oscommands/os.go7
-rw-r--r--pkg/config/user_config.go3
-rw-r--r--pkg/integration/tests/misc/copy_to_clipboard.go44
-rw-r--r--pkg/integration/tests/patch_building/copy_patch_to_clipboard.go49
-rw-r--r--pkg/integration/tests/test_list.go2
6 files changed, 70 insertions, 50 deletions
diff --git a/docs/Config.md b/docs/Config.md
index 04e19881d..1ba8720e6 100644
--- a/docs/Config.md
+++ b/docs/Config.md
@@ -106,6 +106,7 @@ git:
parseEmoji: false
diffContextSize: 3 # how many lines of context are shown around a change in diffs
os:
+ copyToClipboardCmd: '' # See 'Custom Command for Copying to Clipboard' section
editPreset: '' # see 'Configuring File Editing' section
edit: ''
editAtLine: ''
@@ -278,6 +279,20 @@ os:
open: 'open {{filename}}'
```
+### Custom Command for Copying to Clipboard
+```yaml
+os:
+ copyToClipboardCmd: ''
+```
+Specify an external command to invoke when copying to clipboard is requested. `{{text}` will be replaced by text to be copied. Default is to copy to system clipboard.
+
+If you are working on a terminal that supports OSC52, the following command will let you take advantage of it:
+```
+os:
+ copyToClipboardCmd: printf "\033]52;c;$(printf {{text}} | base64)\a" > /dev/tty
+```
+
+
### Configuring File Editing
There are two commands for opening files, `o` for "open" and `e` for "edit". `o`
diff --git a/pkg/commands/oscommands/os.go b/pkg/commands/oscommands/os.go
index 78dad7a8e..3e305a96f 100644
--- a/pkg/commands/oscommands/os.go
+++ b/pkg/commands/oscommands/os.go
@@ -267,6 +267,13 @@ func (c *OSCommand) CopyToClipboard(str string) error {
escaped := strings.Replace(str, "\n", "\\n", -1)
truncated := utils.TruncateWithEllipsis(escaped, 40)
c.LogCommand(fmt.Sprintf("Copying '%s' to clipboard", truncated), false)
+ if c.UserConfig.OS.CopyToClipboardCmd != "" {
+ cmdStr := utils.ResolvePlaceholderString(c.UserConfig.OS.CopyToClipboardCmd, map[string]string{
+ "text": c.Cmd.Quote(str),
+ })
+ return c.Cmd.NewShell(cmdStr).Run()
+ }
+
return clipboard.WriteAll(str)
}
diff --git a/pkg/config/user_config.go b/pkg/config/user_config.go
index 0ad6a316f..422dde372 100644
--- a/pkg/config/user_config.go
+++ b/pkg/config/user_config.go
@@ -346,6 +346,9 @@ type OSConfig struct {
// OpenLinkCommand is the command for opening a link
// Deprecated: use OpenLink instead.
OpenLinkCommand string `yaml:"openLinkCommand,omitempty"`
+
+ // CopyToClipboardCmd is the command for copying to clipboard
+ CopyToClipboardCmd string `yaml:"copyToClipboardCmd,omitempty"`
}
type CustomCommandAfterHook struct {
diff --git a/pkg/integration/tests/misc/copy_to_clipboard.go b/pkg/integration/tests/misc/copy_to_clipboard.go
new file mode 100644
index 000000000..48fae8136
--- /dev/null
+++ b/pkg/integration/tests/misc/copy_to_clipboard.go
@@ -0,0 +1,44 @@
+package misc
+
+import (
+ "github.com/jesseduffield/lazygit/pkg/config"
+ . "github.com/jesseduffield/lazygit/pkg/integration/components"
+)
+
+// We're emulating the clipboard by writing to a file called clipboard
+
+var CopyToClipboard = NewIntegrationTest(NewIntegrationTestArgs{
+ Description: "Copy a branch name to the clipboard using custom clipboard command template",
+ ExtraCmdArgs: []string{},
+ Skip: false,
+ SetupConfig: func(config *config.AppConfig) {
+ config.UserConfig.OS.CopyToClipboardCmd = "echo {{text}} > clipboard"
+ },
+
+ SetupRepo: func(shell *Shell) {
+ shell.NewBranch("branch-a")
+ },
+
+ Run: func(t *TestDriver, keys config.KeybindingConfig) {
+ t.Views().Branches().
+ Focus().
+ Lines(
+ Contains("branch-a").IsSelected(),
+ ).
+ Press(keys.Universal.CopyToClipboard)
+
+ t.Views().Files().
+ Focus()
+
+ t.GlobalPress(keys.Files.RefreshFiles)
+
+ // Expect to see the clipboard file with contents
+ t.Views().Files().
+ IsFocused().
+ Lines(
+ Contains("clipboard").IsSelected(),
+ )
+
+ t.Views().Main().Content(Contains("branch-a"))
+ },
+})
diff --git a/pkg/integration/tests/patch_building/copy_patch_to_clipboard.go b/pkg/integration/tests/patch_building/copy_patch_to_clipboard.go
deleted file mode 100644
index 18c0cae09..000000000
--- a/pkg/integration/tests/patch_building/copy_patch_to_clipboard.go
+++ /dev/null
@@ -1,49 +0,0 @@
-package patch_building
-
-import (
- "github.com/jesseduffield/lazygit/pkg/config"
- . "github.com/jesseduffield/lazygit/pkg/integration/components"
-)
-
-var CopyPatchToClipboard = NewIntegrationTest(NewIntegrationTestArgs{
- Description: "Create a patch from the commits and copy the patch to clipbaord.",
- ExtraCmdArgs: []string{},
- Skip: true, // skipping because CI doesn't have clipboard functionality
- SetupConfig: func(config *config.AppConfig) {},
- SetupRepo: func(shell *Shell) {
- shell.NewBranch("branch-a")
- shell.CreateFileAndAdd("file1", "first line\n")
- shell.Commit("first commit")
-
- shell.NewBranch("branch-b")
- shell.UpdateFileAndAdd("file1", "first line\nsecond line\n")
- shell.Commit("update")
-
- shell.Checkout("branch-a")
- },
- Run: func(t *TestDriver, keys config.KeybindingConfig) {
- t.Views().Branches().
- Focus().
- Lines(
- Contains("branch-a").IsSelected(),
- Contains("branch-b"),
- ).
- Press(keys.Universal.NextItem).
- PressEnter().
- PressEnter()
- t.Views().
- CommitFiles().
- Lines(
- Contains("M file1").IsSelected(),
- ).
- PressPrimaryAction()
-
- t.Views().Information().Content(Contains("Building patch"))
-
- t.Common().SelectPatchOption(Contains("copy patch to clipboard"))
-
- t.ExpectToast(Contains("Patch copied to clipboard"))
-
- t.ExpectClipboard(Contains("diff --git a/file1 b/file1"))
- },
-})
diff --git a/pkg/integration/tests/test_list.go b/pkg/integration/tests/test_list.go
index af0ac1c5b..60b8376f6 100644
--- a/pkg/integration/tests/test_list.go
+++ b/pkg/integration/tests/test_list.go
@@ -137,12 +137,12 @@ var tests = []*components.IntegrationTest{
interactive_rebase.SwapInRebaseWithConflictAndEdit,
interactive_rebase.SwapWithConflict,
misc.ConfirmOnQuit,
+ misc.CopyToClipboard,
misc.InitialOpen,
misc.RecentReposOnLaunch,
patch_building.Apply,
patch_building.ApplyInReverse,
patch_building.ApplyInReverseWithConflict,
- patch_building.CopyPatchToClipboard,
patch_building.MoveToEarlierCommit,
patch_building.MoveToEarlierCommitNoKeepEmpty,
patch_building.MoveToIndex,