Skip to content

Commit

Permalink
feat: add os.copyToClipboardCmd to allow for a custom command
Browse files Browse the repository at this point in the history
Issue #1055

test: CopyPatchToClipboard (temporary commit for review)
  • Loading branch information
redstreet authored and jesseduffield committed Jul 29, 2023
1 parent 7e9f669 commit 52eef6c
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 50 deletions.
15 changes: 15 additions & 0 deletions docs/Config.md
Original file line number Diff line number Diff line change
Expand Up @@ -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: ''
Expand Down Expand Up @@ -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`
Expand Down
7 changes: 7 additions & 0 deletions pkg/commands/oscommands/os.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down
3 changes: 3 additions & 0 deletions pkg/config/user_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
44 changes: 44 additions & 0 deletions pkg/integration/tests/misc/copy_to_clipboard.go
Original file line number Diff line number Diff line change
@@ -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"))
},
})
49 changes: 0 additions & 49 deletions pkg/integration/tests/patch_building/copy_patch_to_clipboard.go

This file was deleted.

2 changes: 1 addition & 1 deletion pkg/integration/tests/test_list.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ var tests = []*components.IntegrationTest{
patch_building.Apply,
patch_building.ApplyInReverse,
patch_building.ApplyInReverseWithConflict,
patch_building.CopyPatchToClipboard,
patch_building.CopyToClipboard,
patch_building.MoveToEarlierCommit,

Check failure on line 146 in pkg/integration/tests/test_list.go

View workflow job for this annotation

GitHub Actions / ci - ubuntu-latest

undefined: patch_building.CopyToClipboard

Check failure on line 146 in pkg/integration/tests/test_list.go

View workflow job for this annotation

GitHub Actions / ci - windows-latest

undefined: patch_building.CopyToClipboard

Check failure on line 146 in pkg/integration/tests/test_list.go

View workflow job for this annotation

GitHub Actions / Integration Tests - git 2.20.0

undefined: patch_building.CopyToClipboard

Check failure on line 146 in pkg/integration/tests/test_list.go

View workflow job for this annotation

GitHub Actions / Integration Tests - git 2.22.5

undefined: patch_building.CopyToClipboard

Check failure on line 146 in pkg/integration/tests/test_list.go

View workflow job for this annotation

GitHub Actions / Integration Tests - git 2.23.0

undefined: patch_building.CopyToClipboard

Check failure on line 146 in pkg/integration/tests/test_list.go

View workflow job for this annotation

GitHub Actions / Integration Tests - git 2.25.1

undefined: patch_building.CopyToClipboard

Check failure on line 146 in pkg/integration/tests/test_list.go

View workflow job for this annotation

GitHub Actions / Integration Tests - git 2.30.8

undefined: patch_building.CopyToClipboard

Check failure on line 146 in pkg/integration/tests/test_list.go

View workflow job for this annotation

GitHub Actions / Integration Tests - git latest

undefined: patch_building.CopyToClipboard

Check failure on line 146 in pkg/integration/tests/test_list.go

View workflow job for this annotation

GitHub Actions / build

undefined: patch_building.CopyToClipboard

Check failure on line 146 in pkg/integration/tests/test_list.go

View workflow job for this annotation

GitHub Actions / lint

undefined: patch_building.CopyToClipboard (typecheck)

Check failure on line 146 in pkg/integration/tests/test_list.go

View workflow job for this annotation

GitHub Actions / lint

undefined: patch_building.CopyToClipboard (typecheck)
patch_building.MoveToEarlierCommitNoKeepEmpty,
patch_building.MoveToIndex,
Expand Down

0 comments on commit 52eef6c

Please sign in to comment.