Detect existing key binding before creating one Planned maintenance scheduled April 17/18,...
Why is my conclusion inconsistent with the van't Hoff equation?
Can a non-EU citizen traveling with me come with me through the EU passport line?
51k Euros annually for a family of 4 in Berlin: Is it enough?
How to deal with a team lead who never gives me credit?
Fundamental Solution of the Pell Equation
How to run gsettings for another user Ubuntu 18.04.2 LTS
Why light coming from distant stars is not discreet?
Dating a Former Employee
The logistics of corpse disposal
How to tell that you are a giant?
At the end of Thor: Ragnarok why don't the Asgardians turn and head for the Bifrost as per their original plan?
Why am I getting the error "non-boolean type specified in a context where a condition is expected" for this request?
How to call a function with default parameter through a pointer to function that is the return of another function?
Overriding an object in memory with placement new
Using et al. for a last / senior author rather than for a first author
2001: A Space Odyssey's use of the song "Daisy Bell" (Bicycle Built for Two); life imitates art or vice-versa?
How come Sam didn't become Lord of Horn Hill?
What's the purpose of writing one's academic biography in the third person?
What does an IRS interview request entail when called in to verify expenses for a sole proprietor small business?
What would be the ideal power source for a cybernetic eye?
Do I really need recursive chmod to restrict access to a folder?
Can an alien society believe that their star system is the universe?
What is a non-alternating simple group with big order, but relatively few conjugacy classes?
How widely used is the term Treppenwitz? Is it something that most Germans know?
Detect existing key binding before creating one
Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)
Announcing the arrival of Valued Associate #679: Cesar Manara
Unicorn Meta Zoo #1: Why another podcast?Figure out which plugin is responsible for a key bindingKey binding for enter key in insert modeIs there a one-key command to insert before the first character of the line?How do you undefine existing functions and key maps?Getting tab and windows movement with one key combinationVim default key bindingKey binding conflict of paste and rectangular blocks selectKey binding to select the current paragraphHow to limit a key binding to a single keyExiting and entering insert mode again with key-binding
A plugin I've recently started maintaining currently checks to see if any bindings exist to its functions before creating the default ones. This makes it easy to setup custom bindings and not have to do anything about the default ones.
if !hasmapto('<Plug>MyFunction', 'n')
nmap <buffer> <Leader>f <Plug>MyFunction
endif
What this doesn't do is keep these default bindings from clobbering existing mappings. How can I detect if, say, there is an existing normal mode mapping for <leader>f
before clobbering it with the plugin's default mapping.
key-bindings vimscript leader
add a comment |
A plugin I've recently started maintaining currently checks to see if any bindings exist to its functions before creating the default ones. This makes it easy to setup custom bindings and not have to do anything about the default ones.
if !hasmapto('<Plug>MyFunction', 'n')
nmap <buffer> <Leader>f <Plug>MyFunction
endif
What this doesn't do is keep these default bindings from clobbering existing mappings. How can I detect if, say, there is an existing normal mode mapping for <leader>f
before clobbering it with the plugin's default mapping.
key-bindings vimscript leader
Related question (from the opposite end of the stick): How can I prevent plugins from overwriting my key mappings?
– Caleb
19 hours ago
add a comment |
A plugin I've recently started maintaining currently checks to see if any bindings exist to its functions before creating the default ones. This makes it easy to setup custom bindings and not have to do anything about the default ones.
if !hasmapto('<Plug>MyFunction', 'n')
nmap <buffer> <Leader>f <Plug>MyFunction
endif
What this doesn't do is keep these default bindings from clobbering existing mappings. How can I detect if, say, there is an existing normal mode mapping for <leader>f
before clobbering it with the plugin's default mapping.
key-bindings vimscript leader
A plugin I've recently started maintaining currently checks to see if any bindings exist to its functions before creating the default ones. This makes it easy to setup custom bindings and not have to do anything about the default ones.
if !hasmapto('<Plug>MyFunction', 'n')
nmap <buffer> <Leader>f <Plug>MyFunction
endif
What this doesn't do is keep these default bindings from clobbering existing mappings. How can I detect if, say, there is an existing normal mode mapping for <leader>f
before clobbering it with the plugin's default mapping.
key-bindings vimscript leader
key-bindings vimscript leader
edited 19 hours ago
Caleb
asked 20 hours ago
CalebCaleb
96211125
96211125
Related question (from the opposite end of the stick): How can I prevent plugins from overwriting my key mappings?
– Caleb
19 hours ago
add a comment |
Related question (from the opposite end of the stick): How can I prevent plugins from overwriting my key mappings?
– Caleb
19 hours ago
Related question (from the opposite end of the stick): How can I prevent plugins from overwriting my key mappings?
– Caleb
19 hours ago
Related question (from the opposite end of the stick): How can I prevent plugins from overwriting my key mappings?
– Caleb
19 hours ago
add a comment |
2 Answers
2
active
oldest
votes
You can use the mapcheck()
function to check if the user mapped a key to something:
:echo json_encode(mapcheck('<F1>', 'n'))
""
:echo mapcheck('<F11>', 'n')
:set cursorcolumn!<CR>:set cursorcolumn?<CR>
So in your mapping, you can do:
if !hasmapto('<Plug>MyFunction', 'n') && mapcheck('<Leader>f', 'n') is# ''
nmap <buffer> <Leader>f <Plug>MyFunction
endif
Personally, I'm not completely convinced this is actually a good approach though. While it does prevent overriding user mappings, it's also very "magic" and may be surprising.
An approach that I often use is to make a single setting to disable all mappings:
if get(g:, 'myplugin_map_keys', 1)
nmap <buffer> <Leader>f <Plug>MyFunction
endif
This way users have a reasonable set of mappings by default, but can disable mappings and do their own thing if they want something custom.
Another option is to map from a variable:
exe printf('nmap <buffer> %s <Plug>MyFunction',
get(g:, 'myplugin_map_foo', '<Leader>f')
This way users can set their own keys for a specific mapping, without having to remap everything.
I don't think there is "one right way". Aside from personal preference, it also depends on the kind of plugin you're working on. For some plugins a key mapping is just an "extra bonus", whereas it's critical for others. Some plugins map just one or two keys, others dozens or even hundreds.
For smaller plugins with just one or two mappings, the first method will usually be better; for larger plugins with a lot of mappings, the second is often better. Of course, you can also do both.
Thanks. Using this I searched around for other implementations and am now wondering why you used... is# ''
instead of... == ''
. Can you clarify that bit?
– Caleb
19 hours ago
2
@Calebis
is the "strict comparison", similar to===
in JavaScript and PHP.0 == ''
is1
, which is often not what you want, but0 is ''
is0
. The#
is to explicitly match case (otherwiseignorecase
setting is used). Neither are strictly needed here, but it's just a habit I've picked up after I ran in to a few bugs with==
, and I think everyone should probably be using it (just like everyone is using===
). Also see:help expr4
.
– Martin Tournoij♦
19 hours ago
add a comment |
silent! {map} <unique> {lhs} {rhs}
Works too. The <unique>
modifier issues an error if there is already a mapping for the left-hand side, which silent swallows.
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "599"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fvi.stackexchange.com%2fquestions%2f19597%2fdetect-existing-key-binding-before-creating-one%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
You can use the mapcheck()
function to check if the user mapped a key to something:
:echo json_encode(mapcheck('<F1>', 'n'))
""
:echo mapcheck('<F11>', 'n')
:set cursorcolumn!<CR>:set cursorcolumn?<CR>
So in your mapping, you can do:
if !hasmapto('<Plug>MyFunction', 'n') && mapcheck('<Leader>f', 'n') is# ''
nmap <buffer> <Leader>f <Plug>MyFunction
endif
Personally, I'm not completely convinced this is actually a good approach though. While it does prevent overriding user mappings, it's also very "magic" and may be surprising.
An approach that I often use is to make a single setting to disable all mappings:
if get(g:, 'myplugin_map_keys', 1)
nmap <buffer> <Leader>f <Plug>MyFunction
endif
This way users have a reasonable set of mappings by default, but can disable mappings and do their own thing if they want something custom.
Another option is to map from a variable:
exe printf('nmap <buffer> %s <Plug>MyFunction',
get(g:, 'myplugin_map_foo', '<Leader>f')
This way users can set their own keys for a specific mapping, without having to remap everything.
I don't think there is "one right way". Aside from personal preference, it also depends on the kind of plugin you're working on. For some plugins a key mapping is just an "extra bonus", whereas it's critical for others. Some plugins map just one or two keys, others dozens or even hundreds.
For smaller plugins with just one or two mappings, the first method will usually be better; for larger plugins with a lot of mappings, the second is often better. Of course, you can also do both.
Thanks. Using this I searched around for other implementations and am now wondering why you used... is# ''
instead of... == ''
. Can you clarify that bit?
– Caleb
19 hours ago
2
@Calebis
is the "strict comparison", similar to===
in JavaScript and PHP.0 == ''
is1
, which is often not what you want, but0 is ''
is0
. The#
is to explicitly match case (otherwiseignorecase
setting is used). Neither are strictly needed here, but it's just a habit I've picked up after I ran in to a few bugs with==
, and I think everyone should probably be using it (just like everyone is using===
). Also see:help expr4
.
– Martin Tournoij♦
19 hours ago
add a comment |
You can use the mapcheck()
function to check if the user mapped a key to something:
:echo json_encode(mapcheck('<F1>', 'n'))
""
:echo mapcheck('<F11>', 'n')
:set cursorcolumn!<CR>:set cursorcolumn?<CR>
So in your mapping, you can do:
if !hasmapto('<Plug>MyFunction', 'n') && mapcheck('<Leader>f', 'n') is# ''
nmap <buffer> <Leader>f <Plug>MyFunction
endif
Personally, I'm not completely convinced this is actually a good approach though. While it does prevent overriding user mappings, it's also very "magic" and may be surprising.
An approach that I often use is to make a single setting to disable all mappings:
if get(g:, 'myplugin_map_keys', 1)
nmap <buffer> <Leader>f <Plug>MyFunction
endif
This way users have a reasonable set of mappings by default, but can disable mappings and do their own thing if they want something custom.
Another option is to map from a variable:
exe printf('nmap <buffer> %s <Plug>MyFunction',
get(g:, 'myplugin_map_foo', '<Leader>f')
This way users can set their own keys for a specific mapping, without having to remap everything.
I don't think there is "one right way". Aside from personal preference, it also depends on the kind of plugin you're working on. For some plugins a key mapping is just an "extra bonus", whereas it's critical for others. Some plugins map just one or two keys, others dozens or even hundreds.
For smaller plugins with just one or two mappings, the first method will usually be better; for larger plugins with a lot of mappings, the second is often better. Of course, you can also do both.
Thanks. Using this I searched around for other implementations and am now wondering why you used... is# ''
instead of... == ''
. Can you clarify that bit?
– Caleb
19 hours ago
2
@Calebis
is the "strict comparison", similar to===
in JavaScript and PHP.0 == ''
is1
, which is often not what you want, but0 is ''
is0
. The#
is to explicitly match case (otherwiseignorecase
setting is used). Neither are strictly needed here, but it's just a habit I've picked up after I ran in to a few bugs with==
, and I think everyone should probably be using it (just like everyone is using===
). Also see:help expr4
.
– Martin Tournoij♦
19 hours ago
add a comment |
You can use the mapcheck()
function to check if the user mapped a key to something:
:echo json_encode(mapcheck('<F1>', 'n'))
""
:echo mapcheck('<F11>', 'n')
:set cursorcolumn!<CR>:set cursorcolumn?<CR>
So in your mapping, you can do:
if !hasmapto('<Plug>MyFunction', 'n') && mapcheck('<Leader>f', 'n') is# ''
nmap <buffer> <Leader>f <Plug>MyFunction
endif
Personally, I'm not completely convinced this is actually a good approach though. While it does prevent overriding user mappings, it's also very "magic" and may be surprising.
An approach that I often use is to make a single setting to disable all mappings:
if get(g:, 'myplugin_map_keys', 1)
nmap <buffer> <Leader>f <Plug>MyFunction
endif
This way users have a reasonable set of mappings by default, but can disable mappings and do their own thing if they want something custom.
Another option is to map from a variable:
exe printf('nmap <buffer> %s <Plug>MyFunction',
get(g:, 'myplugin_map_foo', '<Leader>f')
This way users can set their own keys for a specific mapping, without having to remap everything.
I don't think there is "one right way". Aside from personal preference, it also depends on the kind of plugin you're working on. For some plugins a key mapping is just an "extra bonus", whereas it's critical for others. Some plugins map just one or two keys, others dozens or even hundreds.
For smaller plugins with just one or two mappings, the first method will usually be better; for larger plugins with a lot of mappings, the second is often better. Of course, you can also do both.
You can use the mapcheck()
function to check if the user mapped a key to something:
:echo json_encode(mapcheck('<F1>', 'n'))
""
:echo mapcheck('<F11>', 'n')
:set cursorcolumn!<CR>:set cursorcolumn?<CR>
So in your mapping, you can do:
if !hasmapto('<Plug>MyFunction', 'n') && mapcheck('<Leader>f', 'n') is# ''
nmap <buffer> <Leader>f <Plug>MyFunction
endif
Personally, I'm not completely convinced this is actually a good approach though. While it does prevent overriding user mappings, it's also very "magic" and may be surprising.
An approach that I often use is to make a single setting to disable all mappings:
if get(g:, 'myplugin_map_keys', 1)
nmap <buffer> <Leader>f <Plug>MyFunction
endif
This way users have a reasonable set of mappings by default, but can disable mappings and do their own thing if they want something custom.
Another option is to map from a variable:
exe printf('nmap <buffer> %s <Plug>MyFunction',
get(g:, 'myplugin_map_foo', '<Leader>f')
This way users can set their own keys for a specific mapping, without having to remap everything.
I don't think there is "one right way". Aside from personal preference, it also depends on the kind of plugin you're working on. For some plugins a key mapping is just an "extra bonus", whereas it's critical for others. Some plugins map just one or two keys, others dozens or even hundreds.
For smaller plugins with just one or two mappings, the first method will usually be better; for larger plugins with a lot of mappings, the second is often better. Of course, you can also do both.
answered 19 hours ago
Martin Tournoij♦Martin Tournoij
35.9k14111185
35.9k14111185
Thanks. Using this I searched around for other implementations and am now wondering why you used... is# ''
instead of... == ''
. Can you clarify that bit?
– Caleb
19 hours ago
2
@Calebis
is the "strict comparison", similar to===
in JavaScript and PHP.0 == ''
is1
, which is often not what you want, but0 is ''
is0
. The#
is to explicitly match case (otherwiseignorecase
setting is used). Neither are strictly needed here, but it's just a habit I've picked up after I ran in to a few bugs with==
, and I think everyone should probably be using it (just like everyone is using===
). Also see:help expr4
.
– Martin Tournoij♦
19 hours ago
add a comment |
Thanks. Using this I searched around for other implementations and am now wondering why you used... is# ''
instead of... == ''
. Can you clarify that bit?
– Caleb
19 hours ago
2
@Calebis
is the "strict comparison", similar to===
in JavaScript and PHP.0 == ''
is1
, which is often not what you want, but0 is ''
is0
. The#
is to explicitly match case (otherwiseignorecase
setting is used). Neither are strictly needed here, but it's just a habit I've picked up after I ran in to a few bugs with==
, and I think everyone should probably be using it (just like everyone is using===
). Also see:help expr4
.
– Martin Tournoij♦
19 hours ago
Thanks. Using this I searched around for other implementations and am now wondering why you used
... is# ''
instead of ... == ''
. Can you clarify that bit?– Caleb
19 hours ago
Thanks. Using this I searched around for other implementations and am now wondering why you used
... is# ''
instead of ... == ''
. Can you clarify that bit?– Caleb
19 hours ago
2
2
@Caleb
is
is the "strict comparison", similar to ===
in JavaScript and PHP. 0 == ''
is 1
, which is often not what you want, but 0 is ''
is 0
. The #
is to explicitly match case (otherwise ignorecase
setting is used). Neither are strictly needed here, but it's just a habit I've picked up after I ran in to a few bugs with ==
, and I think everyone should probably be using it (just like everyone is using ===
). Also see :help expr4
.– Martin Tournoij♦
19 hours ago
@Caleb
is
is the "strict comparison", similar to ===
in JavaScript and PHP. 0 == ''
is 1
, which is often not what you want, but 0 is ''
is 0
. The #
is to explicitly match case (otherwise ignorecase
setting is used). Neither are strictly needed here, but it's just a habit I've picked up after I ran in to a few bugs with ==
, and I think everyone should probably be using it (just like everyone is using ===
). Also see :help expr4
.– Martin Tournoij♦
19 hours ago
add a comment |
silent! {map} <unique> {lhs} {rhs}
Works too. The <unique>
modifier issues an error if there is already a mapping for the left-hand side, which silent swallows.
add a comment |
silent! {map} <unique> {lhs} {rhs}
Works too. The <unique>
modifier issues an error if there is already a mapping for the left-hand side, which silent swallows.
add a comment |
silent! {map} <unique> {lhs} {rhs}
Works too. The <unique>
modifier issues an error if there is already a mapping for the left-hand side, which silent swallows.
silent! {map} <unique> {lhs} {rhs}
Works too. The <unique>
modifier issues an error if there is already a mapping for the left-hand side, which silent swallows.
answered 13 hours ago
D. Ben KnobleD. Ben Knoble
2,4381520
2,4381520
add a comment |
add a comment |
Thanks for contributing an answer to Vi and Vim Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fvi.stackexchange.com%2fquestions%2f19597%2fdetect-existing-key-binding-before-creating-one%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Related question (from the opposite end of the stick): How can I prevent plugins from overwriting my key mappings?
– Caleb
19 hours ago