{"action":"closed","number":170,"pull_request":{"url":"https://api.github.com/repos/saulpw/visidata/pulls/170","id":201475825,"node_id":"MDExOlB1bGxSZXF1ZXN0MjAxNDc1ODI1","html_url":"https://github.com/saulpw/visidata/pull/170","diff_url":"https://github.com/saulpw/visidata/pull/170.diff","patch_url":"https://github.com/saulpw/visidata/pull/170.patch","issue_url":"https://api.github.com/repos/saulpw/visidata/issues/170","number":170,"state":"closed","locked":false,"title":"[commands] Commands, options and keybindings overhaul","user":{"login":"anjakefala","id":7489659,"node_id":"MDQ6VXNlcjc0ODk2NTk=","avatar_url":"https://avatars1.githubusercontent.com/u/7489659?v=4","gravatar_id":"","url":"https://api.github.com/users/anjakefala","html_url":"https://github.com/anjakefala","followers_url":"https://api.github.com/users/anjakefala/followers","following_url":"https://api.github.com/users/anjakefala/following{/other_user}","gists_url":"https://api.github.com/users/anjakefala/gists{/gist_id}","starred_url":"https://api.github.com/users/anjakefala/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anjakefala/subscriptions","organizations_url":"https://api.github.com/users/anjakefala/orgs","repos_url":"https://api.github.com/users/anjakefala/repos","events_url":"https://api.github.com/users/anjakefala/events{/privacy}","received_events_url":"https://api.github.com/users/anjakefala/received_events","type":"User","site_admin":false},"body":"**Settings architecture**\r\n\r\nThe first component of this PR is that the API for setting a keybinding, option and creating a command have been refined.\r\n\r\nThe notes associated with this change have been written up [here](https://github.com/saulpw/visidata/blob/commands/dev/design/169-settings.md).\r\n\r\nThis permits the layering of settings: there are global, sheet-specific and instance level options/keybindings. \r\n\r\n**Longnames**\r\n\r\nThe longnames are a major VisiData API.  They will be used for remapping keybindings to a specific behaviour. The cmdlog will use longnames instead of keystrokes by default, which will make .vd scripts more shareable/publishable.  As more commands are added, some will be used infrequently enough that they are unbound and only executed with exec-command (^A). \r\n\r\nIn this PR,  longnames have been settled on, with the goal being that at least 90% of them will be consistent from version to version, thus minimising user friction.\r\n\r\nThe following are the design notes for the longnames:\r\n\r\n1) two-three words max if possible, should be short and fit on a keymap (verb - object - input)\r\n\r\n2) command classes should be unique in their first 3 chars and ideally mostly in their first 2.\r\n\r\n3) command longnames should be intuitively understandable, or at least not jargony\r\n\r\n4) longnames should evoke interface, when possible\r\n\r\nThe following is the (current) longname glossary:\r\n- syscopy: copy to system clipboard\r\n- sysopen: open with $EDITOR or other external program.  'launch'?\r\n- cells: this column, selected rows (or all rows if none selected)\r\n- expr: python expression\r\n- regex: python regex\r\n- all: all sheets or all visible columns\r\n- col: cursorCol (will be marked in sheet)\r\n- cols: all visible columns\r\n- subst: regex A/B\r\n- capture: regex match A(B) yielding capture groups\r\n- dup: push copy of sheet\r\n- searchr: search reverse\r\n- go: move the cursor\r\n- scroll: change the visible screen area without changing the cursor\r\n- select: all or selected\r\n- fill: (from fill null cells)\r\n- dive: conceptual -> go deeper\r\n- slide: move row/column\r\n- show: displays on status\r\n- cancel-: kill thread/async process\r\n- setcol: set selected cells in this column\r\n- addcol: add new column to this sheet\r\n- search: on default with regex\r\n- aggregate: set an aggregator\r\n- delete: cuts and moves to clipboard\r\n\r\n","created_at":"2018-07-15T01:10:46Z","updated_at":"2018-07-15T02:17:01Z","closed_at":"2018-07-15T02:17:01Z","merged_at":"2018-07-15T02:17:01Z","merge_commit_sha":"f897941cde3d4ccc2e73a68cb9de4a91173b1cb9","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/saulpw/visidata/pulls/170/commits","review_comments_url":"https://api.github.com/repos/saulpw/visidata/pulls/170/comments","review_comment_url":"https://api.github.com/repos/saulpw/visidata/pulls/comments{/number}","comments_url":"https://api.github.com/repos/saulpw/visidata/issues/170/comments","statuses_url":"https://api.github.com/repos/saulpw/visidata/statuses/071f36d917c7924b1e56d4378901755351d3b0ac","head":{"label":"saulpw:commands","ref":"commands","sha":"071f36d917c7924b1e56d4378901755351d3b0ac","user":{"login":"saulpw","id":236498,"node_id":"MDQ6VXNlcjIzNjQ5OA==","avatar_url":"https://avatars2.githubusercontent.com/u/236498?v=4","gravatar_id":"","url":"https://api.github.com/users/saulpw","html_url":"https://github.com/saulpw","followers_url":"https://api.github.com/users/saulpw/followers","following_url":"https://api.github.com/users/saulpw/following{/other_user}","gists_url":"https://api.github.com/users/saulpw/gists{/gist_id}","starred_url":"https://api.github.com/users/saulpw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/saulpw/subscriptions","organizations_url":"https://api.github.com/users/saulpw/orgs","repos_url":"https://api.github.com/users/saulpw/repos","events_url":"https://api.github.com/users/saulpw/events{/privacy}","received_events_url":"https://api.github.com/users/saulpw/received_events","type":"User","site_admin":false},"repo":{"id":72070681,"node_id":"MDEwOlJlcG9zaXRvcnk3MjA3MDY4MQ==","name":"visidata","full_name":"saulpw/visidata","owner":{"login":"saulpw","id":236498,"node_id":"MDQ6VXNlcjIzNjQ5OA==","avatar_url":"https://avatars2.githubusercontent.com/u/236498?v=4","gravatar_id":"","url":"https://api.github.com/users/saulpw","html_url":"https://github.com/saulpw","followers_url":"https://api.github.com/users/saulpw/followers","following_url":"https://api.github.com/users/saulpw/following{/other_user}","gists_url":"https://api.github.com/users/saulpw/gists{/gist_id}","starred_url":"https://api.github.com/users/saulpw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/saulpw/subscriptions","organizations_url":"https://api.github.com/users/saulpw/orgs","repos_url":"https://api.github.com/users/saulpw/repos","events_url":"https://api.github.com/users/saulpw/events{/privacy}","received_events_url":"https://api.github.com/users/saulpw/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/saulpw/visidata","description":"A terminal spreadsheet multitool for discovering and arranging data","fork":false,"url":"https://api.github.com/repos/saulpw/visidata","forks_url":"https://api.github.com/repos/saulpw/visidata/forks","keys_url":"https://api.github.com/repos/saulpw/visidata/keys{/key_id}","collaborators_url":"https://api.github.com/repos/saulpw/visidata/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/saulpw/visidata/teams","hooks_url":"https://api.github.com/repos/saulpw/visidata/hooks","issue_events_url":"https://api.github.com/repos/saulpw/visidata/issues/events{/number}","events_url":"https://api.github.com/repos/saulpw/visidata/events","assignees_url":"https://api.github.com/repos/saulpw/visidata/assignees{/user}","branches_url":"https://api.github.com/repos/saulpw/visidata/branches{/branch}","tags_url":"https://api.github.com/repos/saulpw/visidata/tags","blobs_url":"https://api.github.com/repos/saulpw/visidata/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/saulpw/visidata/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/saulpw/visidata/git/refs{/sha}","trees_url":"https://api.github.com/repos/saulpw/visidata/git/trees{/sha}","statuses_url":"https://api.github.com/repos/saulpw/visidata/statuses/{sha}","languages_url":"https://api.github.com/repos/saulpw/visidata/languages","stargazers_url":"https://api.github.com/repos/saulpw/visidata/stargazers","contributors_url":"https://api.github.com/repos/saulpw/visidata/contributors","subscribers_url":"https://api.github.com/repos/saulpw/visidata/subscribers","subscription_url":"https://api.github.com/repos/saulpw/visidata/subscription","commits_url":"https://api.github.com/repos/saulpw/visidata/commits{/sha}","git_commits_url":"https://api.github.com/repos/saulpw/visidata/git/commits{/sha}","comments_url":"https://api.github.com/repos/saulpw/visidata/comments{/number}","issue_comment_url":"https://api.github.com/repos/saulpw/visidata/issues/comments{/number}","contents_url":"https://api.github.com/repos/saulpw/visidata/contents/{+path}","compare_url":"https://api.github.com/repos/saulpw/visidata/compare/{base}...{head}","merges_url":"https://api.github.com/repos/saulpw/visidata/merges","archive_url":"https://api.github.com/repos/saulpw/visidata/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/saulpw/visidata/downloads","issues_url":"https://api.github.com/repos/saulpw/visidata/issues{/number}","pulls_url":"https://api.github.com/repos/saulpw/visidata/pulls{/number}","milestones_url":"https://api.github.com/repos/saulpw/visidata/milestones{/number}","notifications_url":"https://api.github.com/repos/saulpw/visidata/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/saulpw/visidata/labels{/name}","releases_url":"https://api.github.com/repos/saulpw/visidata/releases{/id}","deployments_url":"https://api.github.com/repos/saulpw/visidata/deployments","created_at":"2016-10-27T04:21:00Z","updated_at":"2018-07-14T23:16:19Z","pushed_at":"2018-07-15T02:17:01Z","git_url":"git://github.com/saulpw/visidata.git","ssh_url":"git@github.com:saulpw/visidata.git","clone_url":"https://github.com/saulpw/visidata.git","svn_url":"https://github.com/saulpw/visidata","homepage":"http://visidata.org","size":11960,"stargazers_count":1872,"watchers_count":1872,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":69,"mirror_url":null,"archived":false,"open_issues_count":12,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":69,"open_issues":12,"watchers":1872,"default_branch":"stable"}},"base":{"label":"saulpw:develop","ref":"develop","sha":"8208dfdb6090c4cc244a8d3eecb464c8c775c8f3","user":{"login":"saulpw","id":236498,"node_id":"MDQ6VXNlcjIzNjQ5OA==","avatar_url":"https://avatars2.githubusercontent.com/u/236498?v=4","gravatar_id":"","url":"https://api.github.com/users/saulpw","html_url":"https://github.com/saulpw","followers_url":"https://api.github.com/users/saulpw/followers","following_url":"https://api.github.com/users/saulpw/following{/other_user}","gists_url":"https://api.github.com/users/saulpw/gists{/gist_id}","starred_url":"https://api.github.com/users/saulpw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/saulpw/subscriptions","organizations_url":"https://api.github.com/users/saulpw/orgs","repos_url":"https://api.github.com/users/saulpw/repos","events_url":"https://api.github.com/users/saulpw/events{/privacy}","received_events_url":"https://api.github.com/users/saulpw/received_events","type":"User","site_admin":false},"repo":{"id":72070681,"node_id":"MDEwOlJlcG9zaXRvcnk3MjA3MDY4MQ==","name":"visidata","full_name":"saulpw/visidata","owner":{"login":"saulpw","id":236498,"node_id":"MDQ6VXNlcjIzNjQ5OA==","avatar_url":"https://avatars2.githubusercontent.com/u/236498?v=4","gravatar_id":"","url":"https://api.github.com/users/saulpw","html_url":"https://github.com/saulpw","followers_url":"https://api.github.com/users/saulpw/followers","following_url":"https://api.github.com/users/saulpw/following{/other_user}","gists_url":"https://api.github.com/users/saulpw/gists{/gist_id}","starred_url":"https://api.github.com/users/saulpw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/saulpw/subscriptions","organizations_url":"https://api.github.com/users/saulpw/orgs","repos_url":"https://api.github.com/users/saulpw/repos","events_url":"https://api.github.com/users/saulpw/events{/privacy}","received_events_url":"https://api.github.com/users/saulpw/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/saulpw/visidata","description":"A terminal spreadsheet multitool for discovering and arranging data","fork":false,"url":"https://api.github.com/repos/saulpw/visidata","forks_url":"https://api.github.com/repos/saulpw/visidata/forks","keys_url":"https://api.github.com/repos/saulpw/visidata/keys{/key_id}","collaborators_url":"https://api.github.com/repos/saulpw/visidata/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/saulpw/visidata/teams","hooks_url":"https://api.github.com/repos/saulpw/visidata/hooks","issue_events_url":"https://api.github.com/repos/saulpw/visidata/issues/events{/number}","events_url":"https://api.github.com/repos/saulpw/visidata/events","assignees_url":"https://api.github.com/repos/saulpw/visidata/assignees{/user}","branches_url":"https://api.github.com/repos/saulpw/visidata/branches{/branch}","tags_url":"https://api.github.com/repos/saulpw/visidata/tags","blobs_url":"https://api.github.com/repos/saulpw/visidata/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/saulpw/visidata/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/saulpw/visidata/git/refs{/sha}","trees_url":"https://api.github.com/repos/saulpw/visidata/git/trees{/sha}","statuses_url":"https://api.github.com/repos/saulpw/visidata/statuses/{sha}","languages_url":"https://api.github.com/repos/saulpw/visidata/languages","stargazers_url":"https://api.github.com/repos/saulpw/visidata/stargazers","contributors_url":"https://api.github.com/repos/saulpw/visidata/contributors","subscribers_url":"https://api.github.com/repos/saulpw/visidata/subscribers","subscription_url":"https://api.github.com/repos/saulpw/visidata/subscription","commits_url":"https://api.github.com/repos/saulpw/visidata/commits{/sha}","git_commits_url":"https://api.github.com/repos/saulpw/visidata/git/commits{/sha}","comments_url":"https://api.github.com/repos/saulpw/visidata/comments{/number}","issue_comment_url":"https://api.github.com/repos/saulpw/visidata/issues/comments{/number}","contents_url":"https://api.github.com/repos/saulpw/visidata/contents/{+path}","compare_url":"https://api.github.com/repos/saulpw/visidata/compare/{base}...{head}","merges_url":"https://api.github.com/repos/saulpw/visidata/merges","archive_url":"https://api.github.com/repos/saulpw/visidata/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/saulpw/visidata/downloads","issues_url":"https://api.github.com/repos/saulpw/visidata/issues{/number}","pulls_url":"https://api.github.com/repos/saulpw/visidata/pulls{/number}","milestones_url":"https://api.github.com/repos/saulpw/visidata/milestones{/number}","notifications_url":"https://api.github.com/repos/saulpw/visidata/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/saulpw/visidata/labels{/name}","releases_url":"https://api.github.com/repos/saulpw/visidata/releases{/id}","deployments_url":"https://api.github.com/repos/saulpw/visidata/deployments","created_at":"2016-10-27T04:21:00Z","updated_at":"2018-07-14T23:16:19Z","pushed_at":"2018-07-15T02:17:01Z","git_url":"git://github.com/saulpw/visidata.git","ssh_url":"git@github.com:saulpw/visidata.git","clone_url":"https://github.com/saulpw/visidata.git","svn_url":"https://github.com/saulpw/visidata","homepage":"http://visidata.org","size":11960,"stargazers_count":1872,"watchers_count":1872,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":69,"mirror_url":null,"archived":false,"open_issues_count":12,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0","node_id":"MDc6TGljZW5zZTk="},"forks":69,"open_issues":12,"watchers":1872,"default_branch":"stable"}},"_links":{"self":{"href":"https://api.github.com/repos/saulpw/visidata/pulls/170"},"html":{"href":"https://github.com/saulpw/visidata/pull/170"},"issue":{"href":"https://api.github.com/repos/saulpw/visidata/issues/170"},"comments":{"href":"https://api.github.com/repos/saulpw/visidata/issues/170/comments"},"review_comments":{"href":"https://api.github.com/repos/saulpw/visidata/pulls/170/comments"},"review_comment":{"href":"https://api.github.com/repos/saulpw/visidata/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/saulpw/visidata/pulls/170/commits"},"statuses":{"href":"https://api.github.com/repos/saulpw/visidata/statuses/071f36d917c7924b1e56d4378901755351d3b0ac"}},"author_association":"COLLABORATOR","merged":true,"mergeable":null,"rebaseable":null,"mergeable_state":"unknown","merged_by":{"login":"anjakefala","id":7489659,"node_id":"MDQ6VXNlcjc0ODk2NTk=","avatar_url":"https://avatars1.githubusercontent.com/u/7489659?v=4","gravatar_id":"","url":"https://api.github.com/users/anjakefala","html_url":"https://github.com/anjakefala","followers_url":"https://api.github.com/users/anjakefala/followers","following_url":"https://api.github.com/users/anjakefala/following{/other_user}","gists_url":"https://api.github.com/users/anjakefala/gists{/gist_id}","starred_url":"https://api.github.com/users/anjakefala/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anjakefala/subscriptions","organizations_url":"https://api.github.com/users/anjakefala/orgs","repos_url":"https://api.github.com/users/anjakefala/repos","events_url":"https://api.github.com/users/anjakefala/events{/privacy}","received_events_url":"https://api.github.com/users/anjakefala/received_events","type":"User","site_admin":false},"comments":1,"review_comments":0,"maintainer_can_modify":false,"commits":42,"additions":755,"deletions":677,"changed_files":40}}
{"actor":{"display_login":"anjakefala"}}