diff options
author | Red S <redstreet@users.noreply.github.com> | 2023-07-16 08:57:02 +0000 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2023-07-29 19:09:59 +1000 |
commit | d7f84aed8a228fa6316803b5e766886e7aa96647 (patch) | |
tree | ff08137964e8ba7dcdcbc42b2113c15c756b8f53 | |
parent | 7e9f66942119d8ce6b00fee61554f7947d2d5f56 (diff) |
feat: add os.copyToClipboardCmd to allow for a custom command
Issue #1055
test: CopyPatchToClipboard (temporary commit for review)
-rw-r--r-- | docs/Config.md | 15 | ||||
-rw-r--r-- | pkg/commands/oscommands/os.go | 7 | ||||
-rw-r--r-- | pkg/config/user_config.go | 3 | ||||
-rw-r--r-- | pkg/integration/tests/misc/copy_to_clipboard.go | 44 | ||||
-rw-r--r-- | pkg/integration/tests/patch_building/copy_patch_to_clipboard.go | 49 | ||||
-rw-r--r-- | pkg/integration/tests/test_list.go | 2 |
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, |