{"id":13572616,"url":"https://github.com/goldfeld/vim-seek","last_synced_at":"2026-03-17T11:34:28.071Z","repository":{"id":6594839,"uuid":"7837700","full_name":"goldfeld/vim-seek","owner":"goldfeld","description":"Seek makes navigating long lines effortless, acting like f but taking two characters.","archived":false,"fork":false,"pushed_at":"2014-10-05T08:02:32.000Z","size":280,"stargazers_count":468,"open_issues_count":8,"forks_count":20,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-12-30T08:46:09.760Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"VimL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/goldfeld.png","metadata":{"files":{"readme":"README.org","changelog":"History.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-01-26T12:52:31.000Z","updated_at":"2025-10-14T22:50:06.000Z","dependencies_parsed_at":"2022-09-13T02:11:13.053Z","dependency_job_id":null,"html_url":"https://github.com/goldfeld/vim-seek","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/goldfeld/vim-seek","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/goldfeld%2Fvim-seek","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/goldfeld%2Fvim-seek/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/goldfeld%2Fvim-seek/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/goldfeld%2Fvim-seek/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/goldfeld","download_url":"https://codeload.github.com/goldfeld/vim-seek/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/goldfeld%2Fvim-seek/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30622761,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-17T11:26:08.186Z","status":"ssl_error","status_checked_at":"2026-03-17T11:24:37.311Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T14:01:28.408Z","updated_at":"2026-03-17T11:34:28.028Z","avatar_url":"https://github.com/goldfeld.png","language":"VimL","readme":"* vim-seek\n\nSeek is a Vim plugin with the simpleminded goal of making long-line\nnavigation effortless, mostly acting like Vim's f but taking two\ncharacters instead.\n\n** Introduction\n\nThis plugin introduces the /seek/ motion, summoned with =s= by\ndefault. Instead of *one* character like =f=, it expects *two*\ncharacters to be typed. This greatly reduces the possible matches\nwithin the line and mostly allows you to get anywhere in a line with\njust three keystrokes. Limiting movement to the current line, much\nlike =f= does, is a usability consideration, making seek predictable,\nprecise and solving a defined problem: it's a motion for within the\nline, not cross-line. If there's no match, your cursor doesn't go\nanywhere. Otherwise, the cursor is left off at the first character\ntyped, so if you seek to \"th\" your cursor will now be at \"t\". The\nforward seek motion is complemented by =S=, which seeks backwards.\n\nThere are other unique features, notably leaps (see /Leaping motions/\nsection), but if you're looking for something more featureful,\nincluding extending movement across lines and even doing some of what\nEasyMotion does, you should look for /vim-sneak/, which fortunately\npicked up from my inactivity on vim-seek development, though also\nprobably because vim-seek has been quite opinionated from the\nbeginning.\n\n** Motivation\n\nThe idea was borne out of frustration with getting at arbitrary points\nin longer lines, especially ones where navigating by word—on top of\nneeding precise counts—gets mangled by symbols. It also filled a great\nneed for faster navigation and editing of prose. The motion =f= often\nmisfires by taking you to an earlier spot than where you aimed, and a\nfull =/= search is too cumbersome, needing an extra =\u003cEnter\u003e= and\nleaving a highlight, and worst of all, might accidentally take you far\naway from the current line. Seek only works within the line (that's a\nfeature.)\n\n** What about substitute?\n\nVim, by default, maps the =s= key to substitute. That it is the\nperfect mnemonic to seek is a fortunate coincidence, but the choice\nwas made because substitute (without a count) is an often inefficient\ncommand, being—ironically—easily substituted by others. Seek doesn't\ntake a count by default, so whenever you supply a count to =s= it will\nmap to the substitute command. However, if you don't use the\nsubstitute commmand at all, you can add =let g:seek_subst_disable = 1=\nto your =.vimrc= in order to allow counts for actual seeks.\n\nThe single character substitution can be accomplished with either =1s=\nor =cl=. And =S=, which is remapped to seek backwards, is completely\nsubstituted by =cc=.\n\nHowever, if you don't want to give up substitute, you can scroll down\nto the /Customization/ section.\n\n** I already use EasyMotion..\n\nSeek solves a different problem, and both are powerful tools.\nEasyMotion is great for navigating across lines and around the\nfile. But within the line, seek has more speed, for a very important\nreason: with seek you already know the keys you need to type before\nyou even type =s=. Using EasyMotion there's a split second delay for\nit to generate the targets and another for your brain to process\nthem. With seek you just type three quick keystrokes; you already know\nwhat to type.\n\n** Advanced\n\nAdditional motions are provided as operator-pending only. That is,\nthey only work when used after =d=, =c= or =y=, and not by themselves.\n\nThe motion =x= is to seek what =t= is to =f=. Standing for 'cut short\n\\[of the target\\]', it acts up to the first character typed, but\ndoesn't include it. This is in contrast to =s= itself, which does\ninclude the first character typed—to keep it consistent with =f=\nbehavior—but not the second character.\n\n*** Leaping motions\n\nMy personal favorites, =r= (remote leap) and =p= (presential leap) act\non the next word containing the characters typed. They're the\nequivalent of =iw=, but =r= snipes the target word from a distance,\nand =p= leaps to the target and stays there. So you can use =yrth= to\nyank the next word containing \"th\" without leaving your position (in\nreality Vim goes there and leaps back, fast enough that you don't\nsee), and that's useful for pasting it to where you are. Or you can\ntype =code= to leap to the next word with \"de\", deleting around it\n(aw) and leaving you in insert mode.\n\nSo whereas =r= and =p= use the inner word text object, the respective\n=u= and =o= are the equivalent outer word =aw=.\n\nTo enable the leaping mappings you need to add the following to your\nvimrc: =let g:seek_enable_jumps = 1=. They don't work in diff mode by\ndefault, because the mode uses =dp= and =do= for other purposes, but\nyou can override this by also adding =let g:seek_enable_jumps_in_diff\n= 1= to your vimrc.\n\nAs expected, all these advanced mappings are complemented by their\ncapital letter versions, which operate backwards.\n\n*** Customization\n\nYou can customize any of the keys that seek binds by adding lines such\nas the following to your vimrc. All the alternative keys shown below\nare just examples of customization, you can bind whichever keys you\nwant.\n\nChange s and S:\n\n#+begin_src VimL\nlet g:SeekKey = '\u003cSpace\u003e'\n// note: \u003cS-Space\u003e doesn't work in terminal vim.\nlet g:SeekBackKey = '\u003cS-Space\u003e'=\n#+end_src\n\nChange x and X:\n\n#+begin_src VimL\nlet g:SeekCutShortKey = '-'\nlet g:SeekBackCutShortKey = '+'\n#+end_src\n\nChange p and P:\n\n#+begin_src VimL\nlet g:seekJumpPresentialInnerKey = '\u003cLeader\u003ep'\nlet g:seekBackJumpPresentialInnerKey = '\u003cLeader\u003eP'\n#+end_src\n\nChange r and R:\n\n#+begin_src VimL\nlet g:seekJumpRemoteInnerKey = '\u003cLeader\u003er'\nlet g:seekBackJumpRemoteInnerKey = '\u003cLeader\u003eR'\n#+end_src\n\nChange o and O:\n\n#+begin_src VimL\nlet g:seekJumpPresentialAroundKey = '\u003cLeader\u003eo'\nlet g:seekBackJumpPresentialAroundKey = '\u003cLeader\u003eO'\n#+end_src\n\nChange u and U\n\n#+begin_src VimL\nlet g:seekJumpRemoteAroundKey = '\u003cLeader\u003eu'\nlet g:seekBackJumpPresentialInnerKey = '\u003cLeader\u003eU'\n#+end_src\n\nOr you can use a shorthand version to redefine all seek keys:\n\n#+begin_src VimL\nlet g:SeekKeys = '\u003cSpace\u003e \u003cS-Space\u003e - + \u003cLeader\u003ep \u003cLeader\u003eP' \u003cLeader\u003er \u003cLeader\u003eR \u003cLeader\u003eo \u003cLeader\u003eO \u003cLeader\u003eu \u003cLeader\u003eU\n#+end_src\n\nThough it must always follow the order, you can simply use the\ndefaults for keys you don't want to change, and you can truncate the\nstring to leave the remaining unchanged:\n\n#+begin_src VimL\nlet g:SeekKeys = 's S - +' // will not change jump keys.\n#+end_src\n\n** Planned next\n\n- Create a doc file moving customization help out of this readme;\n- Repeat the last seek with =;= and =,= (same keys used for =f= and =t=);\n- (Optional) Respect user's =ignorecase= and =smartcase= settings, so\n  that you can seek to a capital letter by typing the lowercase\n  character;\n- Condensed jump mappings to allow you to use just one of =r= or =p=\n  (or yet another key) for all jump motions, whereby you define which\n  you want to be remote and which presential (e.g. =c= lends itself\n  more to being presential, =y= to be remote, while =d= has good use\n  of both).\n","funding_links":[],"categories":["Vim Script"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoldfeld%2Fvim-seek","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgoldfeld%2Fvim-seek","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoldfeld%2Fvim-seek/lists"}